/* ==========================================================================
   Certoly — feuille de style PARTAGÉE de la bannière / header.
   SOURCE UNIQUE : édite ici, ça s’applique à TOUTES les pages qui la lient.
   (Chargée en dernier dans le <head> → fait autorité sur le CSS inline des pages.)
   ========================================================================== */

/* — barre pleine largeur, logo collé à gauche, boîte normalisée (écrase les templates divergents type /pro) — */
header .wrap.nav{max-width:none;padding:12px 34px;height:auto;min-height:0;gap:12px;position:relative}
header .brand{font-size:21px;gap:10px}
header .brand img{width:34px;height:34px;border-radius:9px}
header .hnav{display:none}
/* 881 px et non 860 : entre 860 et 880 la barre de domaines (.catbar) est encore
   masquée par le CSS de page — basculer sur .hnav dès 860 laissait une fenêtre
   sans AUCUN accès à « Certifications ». Les pastilles mobiles tiennent jusqu’à 880. */
@media(min-width:881px){header .hnav{display:flex}}

/* — liens de la bannière (Blog · Pro) — */
header .hnav{gap:24px}
header .hnav a{font-size:15px;font-weight:800;color:var(--muted);text-decoration:none}
header .hnav a:hover,header .hnav a.on{color:var(--white)}

/* — « Laisser un avis » en doré — */
header .hnav-avis-r{font-size:14.5px;font-weight:800;color:var(--gold);white-space:nowrap;text-decoration:none}

/* — Cibles de la bannière desktop : 22-23 px de haut → passe le minimum WCAG 2.5.8
     (24×24 px, niveau AA). Padding vertical uniquement : aucun impact visuel. — */
@media(min-width:881px){
  header .hnav a,header .hnav-avis-r{display:inline-flex;align-items:center;min-height:26px}
}

/* — bouton « Se connecter » (contour) — */
header .hlogin{cursor:pointer;font-family:var(--font);font-weight:800;font-size:14px;color:var(--blue-l);background:transparent;border:1.5px solid rgba(143,178,255,.35);border-radius:12px;padding:8px 16px;text-decoration:none}

/* — bouton « Commencer » (dégradé) — */
header .nav .cta{margin-left:12px;text-decoration:none;font-weight:800;font-size:14.5px;padding:9px 18px;border-radius:12px;color:#fff;background:linear-gradient(160deg,#8FB2FF 0%,#5C86E0 52%,#8F7FE3 100%);box-shadow:inset 0 2px 0 rgba(255,255,255,.3),0 8px 20px -8px rgba(70,100,230,.55)}

/* — groupe de liens serré, collé à droite, aligné — */
header .nav .hnav{margin-left:auto!important;align-items:center}
header .nav .hnav-avis-r,header .nav .hlogin,header .nav .cta{align-self:center}

/* — barre de recherche du header — */
header .nav .hdr-search{flex:1 1 auto;min-width:120px;max-width:500px;margin:0 18px;display:flex;align-items:center;gap:9px;background:var(--navy2);border:1.5px solid var(--line-2,rgba(255,255,255,.14));border-radius:13px;padding:8px 14px}
header .nav .hdr-search:focus-within{border-color:color-mix(in srgb,var(--blue) 55%,transparent);box-shadow:0 0 0 4px rgba(92,134,224,.14)}
header .nav .hdr-search>svg{color:var(--dim,#7A83A8);flex:none}
header .nav .hdr-search input{flex:1;min-width:0;background:transparent;border:0;color:var(--white);font:inherit;font-weight:700;font-size:14.5px;outline:none}
header .nav .hdr-search input::placeholder{color:var(--dim,#7A83A8);font-weight:600}
header .nav .hdr-search input::-webkit-search-cancel-button{filter:invert(.5)}
header .nav .hdr-search ~ .hlogin{margin-left:0}
@media(max-width:860px){header .nav .hdr-search{display:none}}

/* ==========================================================================
   MOBILE (≤ 859 px) — barre compacte, une seule action, cibles ≥ 44 px.
   Repères retenus (veille 07/2026) :
   · NN/g — une nav VISIBLE est trouvée 1,5× plus qu’un menu burger → on ne masque rien.
   · Apple HIG 44 px / Material 48 px / WCAG 2.5.5 → cibles tactiles ≥ 44 px.
   · 16 px = plancher de lisibilité (lecture senior) ET seuil sous lequel iOS
     zoome tout seul au focus d’un champ (désorientant) → tous les champs à 16 px.
   ========================================================================== */
@media(max-width:880px){

  /* les pastilles restent la nav jusqu’à 880 px (voir la note du seuil 881 plus haut) */
  header .mnav{display:flex!important}

  /* — Rangée 1 : logo + 2 actions, sur UNE ligne. Header sticky : 161 px → ~121 px — */
  header .wrap.nav{padding:10px 12px;gap:9px;flex-wrap:nowrap}
  header .brand{font-size:17px;gap:8px}
  header .brand img{width:32px;height:32px}

  /* « Commencer » était display:none sous 559 px : l’action n°1 disparaissait sur
     mobile et il ne restait que « Se connecter ». On inverse. */
  header .nav .cta{display:inline-flex!important;align-items:center;margin-left:auto;
    font-size:15px;padding:0 18px;min-height:46px;border-radius:14px;white-space:nowrap}

  /* « Se connecter » : secondaire, mais c’est le SEUL accès au compte sur la plupart
     des pages vitrine (pas de lien dans leur pied de page) → conservé, en compact.
     « Laisser un avis » part dans la rangée de pastilles, où il est déjà présent. */
  /* Le sélecteur `.hdr-search ~ .hlogin` (plus spécifique) remettait margin-left à 0.
     Sous 860 px la recherche d’en-tête est masquée : plus rien ne poussait les boutons
     à droite, ils restaient collés à gauche avec jusqu’à 505 px de vide sur tablette.
     On répète donc le sélecteur frère pour gagner à spécificité égale. */
  /* même hauteur que « Commencer » (46 px) : deux boutons côte à côte de tailles
     différentes, ça se voit immédiatement — et 46 px sert aussi la cible tactile */
  header .nav .hlogin,
  header .nav .hdr-search ~ .hlogin{margin-left:auto;padding:0 12px;font-size:13px;min-height:46px;
    display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:14px}
  header .nav .cta{margin-left:8px;padding:0 16px}
  header .nav .hnav-avis-r{display:none}

  /* Sous 360 px seulement (vieux iPhone SE) : on garde le logo, on lâche le
     mot-clé texte de la marque. Au-dessus, tout tient — vérifié à 375 px. */
  /* (le resserrage des écrans ≤ 360 px est en bas de ce bloc : à spécificité
     égale, seule la dernière règle du fichier gagne) */

  /* — Rangée 2 : UNE seule ligne de pastilles (plus de retour à la ligne bancal) — */
  header .mnav{flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
    gap:8px;padding:0 16px 10px;scroll-snap-type:x proximity}
  header .mnav::-webkit-scrollbar{display:none}
  /* padding 14 et non 16 : les 4 pastilles réclamaient 370 px, soit plus que les
     360 px réellement disponibles dès qu’une barre de défilement prend 15 px.
     À 14 px elles tiennent en 350 px — de la marge, pas du calcul au ras. */
  header .mnav a{flex:none;scroll-snap-align:start;display:inline-flex;align-items:center;
    min-height:44px;padding:0 14px;font-size:14.5px;border-radius:999px;color:var(--white)}
  header .mnav a:last-child{color:var(--gold)}
  /* « Laisser un avis » dépassait de l’écran et s’affichait « Laisser un av… » :
     du texte coupé en bandeau, ça fait négligé. Libellé court en mobile — le
     texte complet reste dans le DOM (lecteurs d’écran, SEO), seul l’affichage
     change. Les 4 pastilles tiennent alors sans troncature à 375 px. */
  header .mnav a[href*="laisser-un-avis"]{font-size:0}
  header .mnav a[href*="laisser-un-avis"]::after{content:"Avis";font-size:14.5px;font-weight:800}

  /* ancres : ne pas passer sous le header sticky */
  html{scroll-padding-top:130px}

  /* — Lisibilité : plancher ferme sur le contenu (était 12 à 14 px) —
     !important assumé : c’est le rôle de cette feuille (chargée en dernier) et
     les tailles de page sont posées par des sélecteurs de classe qui gagneraient
     sinon (ex. `.hero p{font-size:clamp(15px,4vw,18px)}`).
     Vérifié : aucun p/li ne dépasse 16 px sur mobile → ce plancher ne rétrécit rien. */
  main p{font-size:16px!important;line-height:1.62}
  main li{font-size:15.5px!important;line-height:1.55}
  main b{font-size:15.5px}
  /* petites mentions qui restent volontairement discrètes (hint de swipe, mentions légales) */
  main small,.note,.mini,.disc,.cmp-note,.cmp-swipe{font-size:14px!important}
  .dtile-hook{font-size:14px!important}
  .show-kicker{font-size:13px!important}
  .free-pill{font-size:13.5px!important}
  .hsearch-all{font-size:15px!important}

  /* — Champs à 16 px : supprime le zoom automatique iOS au focus — */
  .hsearch input,.hdr-search input,
  input[type=search],input[type=text],input[type=email],textarea,select{font-size:16px}
  .hsearch-field{padding:5px 5px 5px 14px}
  .hsearch-btn{min-height:48px;padding:0 13px;font-size:15px}
  /* Le placeholder ne tenait qu’à 3 px près. On réduit SON corps uniquement :
     le champ reste à 16 px, donc iOS continue de ne pas zoomer au focus. */
  .hsearch input::placeholder,.hdr-search input::placeholder,
  input[type=search]::placeholder{font-size:14.5px}

  /* — Pied de page : liens de 18 px de haut → cibles confortables —
     mais 9 px de padding gonflaient le pied à 848-1091 px (autant que le contenu
     d’un article !). 7 px = cible de ~34 px : au-dessus du minimum WCAG (24 px),
     sans transformer le pied de page en troisième écran. */
  footer a{display:inline-block;padding:7px 0;font-size:15px}
  footer .fgrid{gap:18px 14px}
  footer .disc{font-size:13px!important;line-height:1.45}
  footer .fbar{gap:10px}
}

/* ==========================================================================
   BARRE DE DOMAINES — garde-fou anti-débordement (desktop)
   Les menus déroulants `.cat-drop` sont masqués par `visibility:hidden`, mais un
   élément ainsi masqué OCCUPE TOUJOURS la place : celui de l’avant-dernier domaine
   (« Sécurité privée ») dépassait de 45 px et provoquait un défilement horizontal
   de toute la page entre ~900 et ~1050 px de large. Le CSS de page ne protégeait
   que le tout dernier (`.cat:last-child`). On étend aux deux derniers : ils
   s’ouvrent vers la gauche, donc ils restent aussi ATTEIGNABLES à la souris.
   ========================================================================== */
.catbar .cat:nth-last-child(-n+2) .cat-drop{left:auto;right:0}

/* ==========================================================================
   CADRE TÉLÉPHONE — correctif global (mobile ET desktop)
   La fausse encoche `.phone::before` était posée à top:10px, c’est-à-dire sur
   le tout premier pixel de la capture : elle recouvrait « Bon après-midi,
   Kenan ⛅ » d’une pastille grise, ce qui se lisait comme un bug d’affichage.
   Les captures d’app n’ont pas de barre d’état — on ajoute donc une vraie
   bande de cadre en haut, dans laquelle l’encoche se loge sans rien masquer.
   ========================================================================== */
.phone{padding-top:20px}
.phone::before{top:5px}
.phone--sm{padding-top:15px}
.phone--sm::before{top:4px}

/* ==========================================================================
   INTERFACE MOBILE (≤ 880 px) — mise en page propre au mobile, pas le desktop
   empilé. Trois principes :
   1. Hiérarchie par le CONTRASTE de tailles, pas par la taille uniforme
      (c’est ce qui faisait « tout est gros »). Échelle : 30 / 23 / 17 / 16 / 13.
   2. Ce qui s’empile à la verticale et coûte des écrans passe en RAIL horizontal
      à défilement (réflexe d’appli : on balaie, on ne scrolle pas 3 écrans).
   3. L’action principale vit dans la ZONE DU POUCE (barre basse), pas en haut.
   Grille de 8 px partout. Les rails débordent volontairement jusqu’aux bords
   (padding du .wrap = 20 px) : le bord coupé signale « ça se balaie ».
   ========================================================================== */
@media(max-width:880px){

  /* ── Échelle typographique ────────────────────────────────────────────── */
  main h1{font-size:30px;line-height:1.12;letter-spacing:-.02em}
  main h2{font-size:23px;line-height:1.22;letter-spacing:-.015em}
  main h3{font-size:17px;line-height:1.3}
  main .sub{font-size:16px;line-height:1.5;opacity:.85}

  /* ── Rythme des sections : grille de 8 ────────────────────────────────── */
  main > section{padding-block:40px}
  main > section > .wrap > h2{margin-bottom:8px}
  main > section > .wrap > .sub{margin-bottom:24px}

  /* ── ZÉRO DÉFILEMENT LATÉRAL ──────────────────────────────────────────
     Les carrousels imposaient de balayer sur le côté et laissaient toujours une
     carte coupée au bord de l’écran — donc « quelque chose qui sort ». Sur
     mobile tout s’empile verticalement : un seul geste, le pouce vers le haut. */
  .m-rail{display:grid;gap:16px;overflow:visible;margin-inline:0;padding:0}
  .m-rail > *{width:auto}

  /* #fonctions : 3 blocs de 800 px empilés (3,3 écrans) → un rail.
     La capture passe de 466 à 230 px : elle illustre, elle ne remplit plus. */
  .m-rail--show{gap:14px}
  .m-rail--show > .show{display:block}
  .m-rail--show .show-media{max-height:230px;overflow:hidden;margin-bottom:16px;
    -webkit-mask-image:linear-gradient(#000 76%,transparent);mask-image:linear-gradient(#000 76%,transparent)}
  .m-rail--show .show-copy{padding:0}

  /* ── Domaines : 9 tuiles en colonne (1106 px) → rail sur 2 rangées ─────
     Motif « étagère » (Spotify/Play Store) : on voit 4 tuiles d’un coup. */
  #certifications .certs{display:grid!important;grid-auto-flow:row;grid-template-columns:1fr;
    gap:10px;overflow:visible;margin-inline:0;padding:0}
  #certifications .certs > .dtile{margin:0;padding:14px}
  /* Dans une tuile de 300 px, le texte n’avait que 170 px (icône 50 + flèche) :
     nom ET accroche passaient sur 2 lignes, et la flèche — centrée — tombait
     pile entre les deux, comme si elle coupait la phrase. La carte entière est
     cliquable : la flèche est décorative, on rend sa place au texte. */
  #certifications .dtile-arrow{display:none}
  #certifications .dtile-ico{width:46px;height:46px;flex:none}
  #certifications .dtile{gap:12px}
  /* NB : le rail est réservé aux tuiles de DOMAINE de la home (#certifications).
     La page catalogue réutilise la classe .certs pour ses 26 fiches complètes :
     là, un rail horizontal serait un contresens — on veut tout parcourir
     verticalement. Elle garde donc sa liste. */

  /* ── Étapes et offres : empilées, pas de balayage ─────────────────────── */
  .steps,.plans{display:grid!important;grid-template-columns:1fr;gap:12px;
    overflow:visible;margin-inline:0;padding:0}
  .steps > .step,.plans > .plan{width:auto;margin:0}

  /* ── Témoignages : 7 cartes en défilement latéral (2081 px) → empilées ──
     On en garde 3 : au-delà, la preuve sociale se répète et coûte 4 écrans. */
  .proof-wrap .tcards,.tcards{display:grid!important;grid-template-columns:1fr!important;
    gap:12px!important;overflow:visible!important;margin-inline:0;padding:0}
  .proof-wrap .tcards > *,.tcards > *{width:auto!important;flex:none!important;min-width:0!important}
  .proof-wrap .tcards > *:nth-child(n+4),.tcards > *:nth-child(n+4){display:none}

  /* ── Comparatif : un tableau ne se lit pas en glissant sur un téléphone ──
     Chaque ligne devient une carte « critère + 3 réponses ». Les libellés de
     colonnes sont injectés par js/site.js (data-col) — sans eux, les valeurs
     seraient orphelines. */
  .cmp-scroll{overflow:visible!important}
  /* `.cmp{min-width:560px}` (CSS de page) gardait le tableau à 560 px dans un
     conteneur de 284 : l’empilage s’appliquait mais les valeurs sortaient à
     droite (« (optio… », « quiz sir… »). On libère la largeur. */
  table.cmp{min-width:0!important;width:100%!important;max-width:100%}
  table.cmp,table.cmp tbody,table.cmp tr,table.cmp td{display:block;width:auto}
  table.cmp thead{display:none}
  table.cmp{border-collapse:separate;border-spacing:0}
  table.cmp tr{border:1px solid var(--line,rgba(255,255,255,.1));border-radius:14px;
    padding:12px 14px;margin-bottom:10px;background:rgba(33,42,77,.4)}
  table.cmp td{border:0!important;padding:0}
  table.cmp td:first-child{font-weight:900;font-size:15.5px;color:var(--white);margin-bottom:6px}
  table.cmp td[data-col]{display:flex;align-items:baseline;justify-content:space-between;gap:14px;
    padding:7px 0;font-size:14.5px;border-top:1px solid rgba(255,255,255,.07)!important;text-align:right}
  table.cmp td[data-col]::before{content:attr(data-col);color:var(--muted);font-weight:700;
    flex:none;max-width:50%;text-align:left}
  .cmp-swipe{display:none}

  /* ── Bandeau de confiance : 4 lignes (332 px) → 2 × 2 ─────────────────── */
  .trustbar{grid-template-columns:1fr 1fr!important;gap:16px 12px;padding:16px}
  .trustbar .tb{flex-direction:column;align-items:flex-start;gap:8px}
  .trustbar .tbx b{font-size:15px}
  .trustbar .tbx span{font-size:12.5px;line-height:1.35}

  /* Le héros de /pro gardait 2 colonnes sous 360 px : son contenu mesurait
     323 px dans un écran de 320 et dépassait de 23 px. Une colonne, toujours. */
  .hero-grid{grid-template-columns:1fr!important}
  .hero-grid > *{min-width:0}

  /* ── Héros : une seule vue d’écran, une seule promesse ────────────────
     Le premier écran disait « 100 % gratuit » DEUX fois (pastille du haut +
     ligne sous la recherche) et posait 5 lignes de texte avant toute action.
     On garde la pastille, on coupe le doublon, on ramène l’accroche à 3 lignes. */
  .hero{padding-top:24px}
  .hero p{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  /* la ligne sous la recherche ne répète plus la promesse (elle dit maintenant
     « tu t’entraînes en 10 secondes ») : on peut la garder, elle apporte une info */
  .hero .hsearch > p{display:block;font-size:12.5px!important;margin-top:10px}
  .hero .hsearch-all{display:inline-block;margin-top:14px}
  .hero .hero-phone{max-height:250px;overflow:hidden;margin-top:8px;
    -webkit-mask-image:linear-gradient(#000 62%,transparent);mask-image:linear-gradient(#000 62%,transparent)}
  .hero .phone-glow{display:none}

  /* ── Catalogue (26 fiches) : des LIGNES qu’on scanne, pas des pavés ─────
     26 fiches de 195 px = 9,8 écrans : on se sent submergé. Sur un catalogue
     on cherche par NOM (AMF, SST…), pas en lisant un paragraphe — le nom
     complet est déjà sous le sigle, et la description reste sur la fiche.
     Fiche : 195 → ~115 px, page : 9,8 → ~4,5 écrans. */
  .cert{padding:14px!important}
  .cert > p{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    overflow:hidden;font-size:15px!important;line-height:1.45;margin:10px 0}
  .cert .ico{width:40px;height:40px;font-size:20px}
  /* « Essayer l’aperçu → » se coupait en deux, la flèche orpheline sur la ligne
     suivante. On garde le libellé d’un bloc : s’il ne tient pas, il passe à la
     ligne ENTIER plutôt que de se casser. */
  .cert .foot{gap:8px 10px;flex-wrap:wrap}
  .cert .go{white-space:nowrap}

  /* ── Catalogue replié PAR CATÉGORIE (mobile) ───────────────────────────
     25 fiches à la suite = un mur. On ne cherche pas « la 14e carte », on
     cherche « une certif de chantier » : 8 familles repliées tiennent en un
     écran, on ouvre la sienne. Le rendu groupé est produit par la page
     (certifications/index.html) qui possède déjà le découpage FAM. */
  .certs.grouped{display:block!important}
  .fam{border:1px solid var(--line,rgba(255,255,255,.1));border-radius:16px;
    background:rgba(33,42,77,.45);margin-bottom:10px;overflow:hidden}
  .fam[open]{border-color:color-mix(in srgb,var(--acc) 45%,transparent)}
  .fam > summary{display:flex;align-items:center;gap:12px;min-height:64px;
    padding:10px 14px;cursor:pointer;list-style:none}
  .fam > summary::-webkit-details-marker{display:none}
  .fam > summary::after{content:"";width:9px;height:9px;margin-left:auto;flex:none;
    border-right:2.5px solid var(--muted,#9AA3C7);border-bottom:2.5px solid var(--muted,#9AA3C7);
    transform:rotate(45deg);transition:transform .2s ease}
  .fam[open] > summary::after{transform:rotate(-135deg)}
  .fam-ico{width:38px;height:38px;flex:none;border-radius:11px;display:grid;place-items:center;
    background:color-mix(in srgb,var(--acc) 18%,transparent);
    border:1px solid color-mix(in srgb,var(--acc) 40%,transparent)}
  .fam-ico svg{width:21px;height:21px;display:block}
  .fam-txt{display:flex;flex-direction:column;min-width:0}
  .fam-txt b{font-size:15.5px;font-weight:900;color:var(--white);line-height:1.25}
  .fam-txt i{font-style:normal;font-size:12.5px;color:var(--muted);margin-top:2px}
  .fam-list{display:grid;gap:10px;padding:0 10px 12px}
  .certs.grouped > .cert.suggest{margin-top:14px}

  /* ── Blog : cartes de 364-415 px → ~250 px ────────────────────────────── */
  .post{padding:16px!important}
  .post > p{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;
    overflow:hidden;margin-bottom:10px}
  .post .pmeta{gap:4px 10px;font-size:12.5px}
  .post .pmeta b{margin-left:auto}
  .post .tag{margin-bottom:8px}

  /* ── FAQ : lignes tapables ────────────────────────────────────────────── */
  .faq summary{min-height:48px;display:flex;align-items:center;font-size:16px}

  /* ── Blocs repliés (comparatif) : 614 px de tableau derrière un bouton ── */
  .m-fold{border:1px solid var(--line,rgba(255,255,255,.1));border-radius:16px;
    background:rgba(33,42,77,.4);overflow:hidden}
  .m-fold > summary{display:flex;align-items:center;justify-content:space-between;
    min-height:52px;padding:0 16px;cursor:pointer;list-style:none;
    font-weight:800;font-size:15.5px;color:var(--blue-l,#8FB2FF)}
  .m-fold > summary::-webkit-details-marker{display:none}
  .m-fold > summary::after{content:"›";font-size:22px;line-height:1;
    transform:rotate(90deg);transition:transform .2s ease}
  .m-fold[open] > summary::after{transform:rotate(-90deg)}
  .m-fold[open] > summary{border-bottom:1px solid var(--line,rgba(255,255,255,.1))}
  .m-fold > *:not(summary){margin-inline:16px}
  .m-fold > .cmp-scroll{margin-top:16px}

  /* ── Barre d’action basse (zone du pouce) ─────────────────────────────
     Injectée par js/site.js. Masquée tant qu’on est dans le héros (le CTA y est
     déjà) et sur le pied de page (pour ne pas recouvrir le CTA final). */
  .m-actionbar{position:fixed;left:0;right:0;bottom:0;z-index:60;
    padding:10px 16px calc(10px + env(safe-area-inset-bottom));
    background:color-mix(in srgb,var(--navy2,#141A33) 88%,transparent);
    backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
    border-top:1px solid var(--line,rgba(255,255,255,.1));
    transform:translateY(110%);transition:transform .28s cubic-bezier(.4,0,.2,1);
    pointer-events:none}
  body.m-bar-on .m-actionbar{transform:none;pointer-events:auto}
  .m-actionbar-cta{display:flex;align-items:center;justify-content:center;gap:6px;
    min-height:52px;border-radius:16px;text-decoration:none;
    font-weight:900;font-size:16px;color:#fff;
    background:linear-gradient(160deg,#8FB2FF 0%,#5C86E0 52%,#8F7FE3 100%);
    box-shadow:inset 0 2px 0 rgba(255,255,255,.3),0 10px 24px -10px rgba(70,100,230,.7)}
  .m-actionbar-cta span{font-weight:700;opacity:.82;font-size:14px}
  body.m-bar-on{padding-bottom:76px}

  /* ── Bannière escamotable au défilement (réflexe d’appli) ─────────────── */
  header{transition:transform .26s cubic-bezier(.4,0,.2,1)}
  header.m-head-off{transform:translateY(-100%)}

  /* ── Écrans étroits (≤ 360 px) — DOIT rester en dernier ────────────────
     Les 4 pastilles réclamaient 370 px : la rangée se mettait à défiler
     latéralement, le dernier glissement qui subsistait. On resserre jusqu’à ce
     que tout tienne. (Placé ici volontairement : ces règles ont la même
     spécificité que celles du dessus, donc seule leur position les fait gagner.) */
  @media(max-width:360px){
    header .brand{font-size:0;gap:0}
    header .mnav{gap:6px;padding-inline:12px}
    header .mnav a{font-size:13.5px;padding:0 11px}
    header .mnav a[href*="laisser-un-avis"]::after{font-size:13.5px}
  }
}

/* ── Téléphone strict (≤ 559 px) : le catalogue devient une liste de lignes.
   La description saute ICI seulement — sur tablette (560-880) il y a la place
   de la garder. Si tu la veux de retour sur téléphone, supprime ce bloc. ── */
@media(max-width:559px){
  .cert > p{display:none}
  .cert{padding:13px!important}
}

/* ==========================================================================
   PALIER TABLETTE (560 → 880 px) — un mobile étiré n’est pas une mise en page.
   Constat mesuré : entre 560 et 880 px le contenu prenait TOUTE la largeur, avec
   des lignes de 77 caractères (le confort de lecture plafonne vers 65-75) et de
   grands vides — c’est le « tout est à gauche » vu sur tablette. On centre une
   colonne de lecture : c’est ce que fait une appli quand l’écran s’élargit.
   ========================================================================== */
@media(min-width:560px) and (max-width:880px){
  main > section > .wrap,.hero .wrap,footer .wrap{max-width:560px;margin-inline:auto}
  /* la barre du haut reste pleine largeur (logo à gauche, actions à droite) */
  header .wrap.nav{max-width:none}
  header .mnav{max-width:560px;margin-inline:auto;padding-inline:0}
  /* le héros peut respirer un peu plus haut sur ces écrans */
  .hero .hero-phone{max-height:300px}

  /* ── Les rails REDEVIENNENT des grilles ────────────────────────────────
     Sur tablette, un carrousel laisse une carte coupée net au bord de l’écran
     (« Transport routi… ») : ça se lit comme un bug, pas comme une invitation à
     balayer. À cette largeur il y a la place de tout afficher — donc on affiche. */
  #certifications .certs{display:grid!important;grid-auto-flow:row;
    grid-template-columns:1fr 1fr;grid-template-rows:none;
    overflow:visible;margin-inline:0;padding-inline:0;gap:12px}
  .steps,.plans{display:grid!important;grid-template-columns:1fr 1fr;
    overflow:visible;margin-inline:0;padding-inline:0;gap:12px}
  .steps > .step,.plans > .plan{flex:none;width:auto}
  .m-rail--show{display:grid;grid-auto-flow:row;overflow:visible;
    margin-inline:0;padding-inline:0;gap:20px}
  .m-rail--show > .show{flex:none;width:auto}
  .m-rail--show .show-media{max-height:280px}
}

/* Rails et replis sont NEUTRES en desktop : `display:contents` efface le
   conteneur, les blocs reprennent exactement leur place d’origine. */
@media(min-width:881px){
  .m-rail,.m-fold{display:contents}
  .m-fold > summary{display:none}
  .m-actionbar{display:none}
}

@media(prefers-reduced-motion:reduce){
  .m-actionbar,header{transition:none}
  .m-rail,.certs,.steps,.plans{scroll-behavior:auto}
}

/* ==========================================================================
   SOBRIÉTÉ — passe « pro » sur le SITE VITRINE (les apps gardent leur énergie)
   Repère Apple : la profondeur vient de bordures fines (hairlines), d’ombres
   NEUTRES très douces et de la clarté du fond — jamais de halo lumineux coloré.
   On retire donc les néons, on garde la marque (le trait doré du héros, les
   dégradés de boutons, les anneaux de focus qui servent à l’accessibilité).
   Chargé en dernier : ces règles écrasent celles des pages sans !important.
   ========================================================================== */

/* — Boutons : plus de halo coloré ni de reflet brillant sur l’arête haute — */
.nav .cta,header .nav .cta,.btn-hero,.pick-btn,.plan-cta,.btn-dl,.m-actionbar-cta{
  box-shadow:0 1px 2px rgba(0,0,0,.28),0 8px 20px -14px rgba(0,0,0,.6);
}
.btn-hero:hover,.pick-btn:hover,.nav .cta:hover,header .nav .cta:hover{
  box-shadow:0 1px 2px rgba(0,0,0,.32),0 10px 24px -14px rgba(0,0,0,.7);
  filter:brightness(1.04);
}

/* — Cartes : ombre neutre + liseré fin, au lieu d’une aura à la couleur du thème — */
.cert:not(.soon):not(.suggest),.dtile:hover,.plan,.post{
  box-shadow:0 1px 0 rgba(255,255,255,.04) inset,0 10px 26px -18px rgba(0,0,0,.65);
}
/* le halo radial en haut des fiches : divisé, il ne fait plus « néon » */
.cert::before{opacity:.28}

/* — Le halo de 420 px derrière le téléphone : supprimé — */
.phone-glow{display:none!important}

/* — Points d’état : une pastille pleine suffit, pas besoin qu’elle rayonne — */
.mega-dot,.cat-drop .dot,.dot{box-shadow:none}

/* — Étoiles scintillantes du héros : discrètes plutôt qu’animées — */
.stars i{animation:none!important;opacity:.30}

/* — Anneaux de focus CONSERVÉS : ce n’est pas de la décoration, c’est ce qui
     rend la navigation au clavier utilisable. — */

@media(prefers-reduced-motion:reduce){.stars i{opacity:.18}}

/* ==========================================================================
   ALIGNEMENT INTER-PAGES — la bannière doit faire EXACTEMENT la même hauteur
   Mesuré : header 114 px partout, 115 px sur /pro. Mêmes polices, mêmes
   paddings, mêmes bordures — mais chaque contrôle y était 0,7 px plus haut :
   la page impose une `line-height` de base différente, qui se propage aux
   boutons. En naviguant, tout le contenu sautait donc d’un pixel.
   On fige la hauteur de ligne des contrôles : elle ne dépend plus de la page.
   ========================================================================== */
header .nav .cta,header .hlogin,header .hnav a,header .hnav-avis-r,
header .nav .hdr-search,header .nav .hdr-search input,header .brand{line-height:1.25}

/* ==========================================================================
   CATALOGUE PAR CATÉGORIES — aussi sur le web (demandé : « c’était bien aussi
   sur format web »). Mêmes volets qu’en mobile ; seule la liste interne passe
   en plusieurs colonnes quand l’écran le permet.
   ========================================================================== */
.certs.grouped{display:block!important}
.fam{border:1px solid var(--line,rgba(255,255,255,.1));border-radius:16px;
  background:rgba(33,42,77,.45);margin-bottom:10px;overflow:hidden}
.fam[open]{border-color:color-mix(in srgb,var(--acc) 45%,transparent)}
.fam > summary{display:flex;align-items:center;gap:12px;min-height:64px;
  padding:10px 16px;cursor:pointer;list-style:none}
.fam > summary::-webkit-details-marker{display:none}
.fam > summary::after{content:"";width:9px;height:9px;margin-left:auto;flex:none;
  border-right:2.5px solid var(--muted,#9AA3C7);border-bottom:2.5px solid var(--muted,#9AA3C7);
  transform:rotate(45deg);transition:transform .2s ease}
.fam[open] > summary::after{transform:rotate(-135deg)}
.fam > summary:hover{background:rgba(255,255,255,.03)}
.fam-ico{width:38px;height:38px;flex:none;border-radius:11px;display:grid;place-items:center;
  background:color-mix(in srgb,var(--acc) 18%,transparent);
  border:1px solid color-mix(in srgb,var(--acc) 40%,transparent)}
.fam-ico svg{width:21px;height:21px;display:block}
.fam-txt{display:flex;flex-direction:column;min-width:0}
.fam-txt b{font-size:15.5px;font-weight:900;color:var(--white);line-height:1.25}
.fam-txt i{font-style:normal;font-size:12.5px;color:var(--muted);margin-top:2px}
.fam-list{display:grid;gap:12px;padding:0 12px 14px}
@media(min-width:881px){
  .fam-list{grid-template-columns:repeat(auto-fill,minmax(268px,1fr));padding:2px 14px 16px}
  .fam > summary{min-height:60px}
}

/* ==========================================================================
   HOME MOBILE — moins de longueur, rien de supprimé (≤ 880 px)
   15,8 écrans : personne n’arrive en bas. Les gros blocs sont repliés par
   js/site.js (titre + accroche restent visibles, on sait ce qu’on ouvre) et
   la home ne montre que 4 domaines, avec un lien vers le catalogue complet —
   qui est maintenant une vue par catégories, bien plus lisible.
   ========================================================================== */
@media(max-width:880px){
  #certifications .certs > .dtile:nth-child(n+5){display:none}
  .m-more{display:flex;align-items:center;justify-content:center;min-height:50px;
    margin-top:12px;border-radius:14px;text-decoration:none;
    font-weight:800;font-size:15px;color:var(--blue-l,#8FB2FF);
    border:1px solid var(--line,rgba(255,255,255,.12));background:rgba(33,42,77,.4)}
}
/* en desktop le lien ajouté n’a pas lieu d’être : les 9 tuiles sont visibles */
@media(min-width:881px){.m-more{display:none}}

/* ==========================================================================
   APERÇU + « voir la suite » — remplace les volets entièrement fermés
   Un volet fermé ne montrait rien : sous « Prêt pour l’examen en 3 étapes »
   il ne restait qu’un bouton. On garde le 1er élément visible (l’aperçu) et
   on révèle le reste au clic — le motif des tuiles de domaines, qui marche.
   ========================================================================== */
@media(max-width:880px){
  /* (le nombre d aperçus est defini plus bas, par palier de largeur :
     une regle unique ici masquait la 2e carte meme quand la grille a 2 colonnes) */
  .m-preview.m-open{gap:12px}
}
/* bouton « voir la suite » — même objet visuel que le lien du catalogue */
.m-more{display:flex;align-items:center;justify-content:center;min-height:50px;width:100%;
  margin-top:12px;border-radius:14px;text-decoration:none;cursor:pointer;
  font-family:inherit;font-weight:800;font-size:15px;color:var(--blue-l,#8FB2FF);
  border:1px solid var(--line,rgba(255,255,255,.12));background:rgba(33,42,77,.4)}
.m-more:hover{background:rgba(255,255,255,.05)}
@media(min-width:881px){.m-more{display:none}}

/* ==========================================================================
   BANNIÈRE — boutons harmonisés
   Constat (image) : « Se connecter » et « Commencer » n’avaient ni la même
   hauteur (39,7 vs 40,5 px) ni le même rythme d’espacement, et « Se connecter »
   passait sur deux lignes quand la place manquait. Même gabarit pour les deux.
   ========================================================================== */
@media(min-width:881px){
  header .nav .hlogin,header .nav .cta{
    min-height:40px;padding:0 18px;border-radius:12px;font-size:14.5px;
    display:inline-flex;align-items:center;justify-content:center;
    white-space:nowrap;line-height:1.25}
  /* Espacement RÉGULIER entre les 3 liens. Piège : « Laisser un avis » n’est pas
     dans .hnav (c’est un frère), donc son écart venait du gap du conteneur (12 px)
     et non du gap de .hnav (22 px) → Blog↔Pro = 22 px mais Pro↔Avis = 16 px.
     On compense : 12 px (conteneur) + 10 px (marge) = 22 px, comme les autres. */
  header .nav .hnav{gap:22px}
  header .nav .hnav-avis-r{margin-left:10px;margin-right:0}
  /* sélecteur frère répété : `.hdr-search ~ .hlogin{margin-left:0}` (0,3,1) gagne
     sinon sur `.nav .hlogin` (0,2,1) — l’écart restait bloqué à 12 px. */
  header .nav .hlogin,
  header .nav .hdr-search ~ .hlogin{margin-left:10px}
  header .nav .cta{margin-left:10px}
}

/* ==========================================================================
   MENU PROFIL — icône + volet déroulant (remplace le bouton « Se connecter »)
   Sobre : liseré fin, ombre neutre, aucun halo. Cible ≥ 40 px.
   ========================================================================== */
.hprof{position:relative;display:inline-flex;align-items:center;margin-left:10px}
.hprof-btn{width:40px;height:40px;flex:none;display:grid;place-items:center;cursor:pointer;
  border-radius:999px;color:var(--blue-l,#8FB2FF);background:transparent;
  border:1.5px solid rgba(143,178,255,.35);font-family:inherit;
  transition:background .15s ease,border-color .15s ease}
.hprof-btn:hover{background:rgba(255,255,255,.06);border-color:rgba(143,178,255,.6)}
.hprof.on .hprof-btn{background:rgba(255,255,255,.08);border-color:rgba(143,178,255,.7)}

.hprof-menu{position:absolute;top:calc(100% + 10px);right:0;z-index:80;
  min-width:268px;padding:8px;border-radius:16px;
  background:var(--navy2,#1B2342);border:1px solid var(--line-2,rgba(255,255,255,.14));
  box-shadow:0 1px 0 rgba(255,255,255,.04) inset,0 18px 44px -20px rgba(0,0,0,.8);
  opacity:0;visibility:hidden;transform:translateY(-6px);
  transition:opacity .16s ease,transform .16s ease,visibility .16s}
.hprof.on .hprof-menu{opacity:1;visibility:visible;transform:none}
.hprof-head{margin:0 0 6px;padding:8px 10px 10px;border-bottom:1px solid var(--line,rgba(255,255,255,.1));
  font-size:14.5px;font-weight:900;color:var(--white)}
.hprof-head span{display:block;margin-top:3px;font-size:12.5px;font-weight:600;color:var(--muted);line-height:1.4}
.hprof-menu a{display:flex;align-items:center;min-height:44px;padding:0 10px;border-radius:10px;
  font-size:14.5px;font-weight:800;color:var(--muted);text-decoration:none}
.hprof-menu a:hover{color:var(--white);background:rgba(255,255,255,.06)}

/* en mobile le volet reste dans l’écran et l’icône garde la taille des boutons */
@media(max-width:880px){
  .hprof{margin-left:auto}
  .hprof-btn{width:46px;height:46px;border-radius:14px}
  .hprof-menu{right:-4px;min-width:min(280px,calc(100vw - 24px))}
}

/* ==========================================================================
   BANNIÈRE MOBILE — la recherche revient occuper le vide
   Constat (capture ~700 px) : logo à gauche, boutons à droite, et un grand
   trou au milieu — les éléments semblaient « espacés pour rien ». La recherche
   d’en-tête était simplement masquée sous 860 px. On la remet :
   · ≥ 560 px : un vrai champ, qui prend la place disponible ;
   · < 560 px : l’icône seule (46 px), qui mène au catalogue et à sa recherche.
   ========================================================================== */
@media(max-width:880px){
  header .nav .hdr-search{display:flex!important;flex:1 1 auto;min-width:0;
    margin:0 8px;padding:0 12px;min-height:46px;border-radius:14px;align-items:center;gap:8px}
  header .nav .hdr-search input{font-size:16px;min-width:0}
  header .nav .hdr-search > svg{flex:none}
  /* le logo ne doit plus pousser : c’est la recherche qui absorbe l’espace */
  header .brand{flex:none}
  header .nav .cta,header .hprof{margin-left:8px}
}
@media(max-width:559px){
  /* pas la place d’un champ : l’icône seule, cible de 46 px */
  header .nav .hdr-search{flex:0 0 46px;width:46px;padding:0;justify-content:center;
    cursor:pointer;margin:0 0 0 auto}
  header .nav .hdr-search input{display:none}
  header .nav .cta{margin-left:8px}
}

/* Écrans ≤ 400 px : la rangée réclamait 362 px pour 360 disponibles (2 px de
   trop dès qu’une barre de défilement mange de la largeur). On resserre le
   rythme plutôt que de laisser la barre déborder. */
@media(max-width:400px){
  header .wrap.nav{gap:8px;padding-inline:10px}
  header .nav .cta{padding:0 14px;margin-left:6px}
  header .hprof{margin-left:6px}
}

/* ==========================================================================
   FIN DE PAGE REPLIÉE (mobile) — index SEO + colonnes du pied de page
   45 % de la home mobile se trouvait APRÈS le contenu principal. Replié ici,
   toujours présent dans le DOM (donc indexable et accessible au clavier).
   ========================================================================== */
@media(max-width:880px){
  .m-fold--sidx{margin-top:6px}
  .f-fold{border-top:1px solid var(--line,rgba(255,255,255,.1))}
  .f-fold > summary{display:flex;align-items:center;justify-content:space-between;
    min-height:48px;cursor:pointer;list-style:none;
    font-size:13px;font-weight:900;letter-spacing:.05em;text-transform:uppercase;
    color:var(--white)}
  .f-fold > summary::-webkit-details-marker{display:none}
  .f-fold > summary::after{content:"";width:8px;height:8px;flex:none;margin-left:12px;
    border-right:2.5px solid var(--muted,#9AA3C7);border-bottom:2.5px solid var(--muted,#9AA3C7);
    transform:rotate(45deg);transition:transform .2s ease}
  .f-fold[open] > summary::after{transform:rotate(-135deg)}
  footer .fgrid{gap:0 14px}
  footer .fgrid > nav{border:0}
  .f-fold > *:not(summary){padding-bottom:6px}
}
/* desktop : les colonnes reprennent leur forme normale */
@media(min-width:881px){
  .f-fold{display:contents}
  .f-fold > summary{display:none}
}

/* ==========================================================================
   PAGES PAR DOMAINE — de la simple liste filtrée à une vraie page d’entrée
   Avant : un titre et la grille. On ajoute ce qui aide à décider — ce que
   contient le domaine, par quoi commencer, et pourquoi s’entraîner ici.
   Sobre : liserés fins, ombres neutres, la couleur du domaine (--c) en accent.
   ========================================================================== */
.dom-stats{display:flex;flex-wrap:wrap;justify-content:center;gap:10px 12px;
  margin:0 auto 22px;max-width:760px}
.dom-stats span{display:flex;flex-direction:column;gap:2px;flex:1 1 200px;
  padding:12px 16px;border-radius:14px;text-align:center;
  border:1px solid var(--line,rgba(255,255,255,.1));background:rgba(33,42,77,.45);
  font-size:13px;color:var(--muted)}
.dom-stats b{font-size:16px;font-weight:900;color:var(--white);letter-spacing:-.01em}

.dom-cta{display:flex;flex-direction:column;align-items:center;gap:8px;margin:0 auto 26px}
.dom-go{display:inline-flex;align-items:center;justify-content:center;min-height:52px;
  padding:0 28px;border-radius:14px;text-decoration:none;font-weight:900;font-size:16px;color:#fff;
  background:linear-gradient(160deg,#8FB2FF 0%,#5C86E0 52%,#8F7FE3 100%);
  box-shadow:0 1px 2px rgba(0,0,0,.28),0 8px 20px -14px rgba(0,0,0,.6)}
.dom-go:hover{filter:brightness(1.04)}
.dom-note{font-size:12.5px;color:var(--dim,#7A83A8);font-weight:700}

/* (.dom-band retirée le 27/07 — le markup n'existe plus dans les 8 pages) */

@media(max-width:880px){
  .dom-stats{gap:8px}
  .dom-stats span{flex:1 1 100%;flex-direction:row;align-items:baseline;justify-content:flex-start;
    gap:8px;text-align:left;padding:11px 14px}
  .dom-go{width:100%}
}

/* ==========================================================================
   TABLES D’ARTICLES — même empilage que le comparatif (mobile)
   Les articles de blog contiennent des tables à 3 colonnes qui glissaient
   latéralement (381 px dans 318). Règle unique désormais : sur téléphone,
   une table devient une pile de cartes « ligne + valeurs légendées ».
   ========================================================================== */
@media(max-width:880px){
  .tblwrap{overflow:visible!important}
  .tblwrap table{min-width:0!important;width:100%!important;max-width:100%;
    border-collapse:separate;border-spacing:0}
  .tblwrap table,.tblwrap tbody,.tblwrap tr,.tblwrap td{display:block;width:auto}
  .tblwrap thead,.tblwrap tr.m-thead{display:none}
  .tblwrap tr{border:1px solid var(--line,rgba(255,255,255,.1));border-radius:14px;
    padding:12px 14px;margin-bottom:10px;background:rgba(33,42,77,.4)}
  .tblwrap td{border:0!important;padding:0}
  .tblwrap td:first-child{font-weight:900;font-size:15.5px;color:var(--white);margin-bottom:6px}
  .tblwrap td[data-col]{display:block;padding:7px 0;font-size:14.5px;
    border-top:1px solid rgba(255,255,255,.07)!important}
  .tblwrap td[data-col]::before{content:attr(data-col);display:block;
    color:var(--muted);font-weight:700;font-size:12.5px;margin-bottom:2px}
}

/* Prix de l’offre : la mention « une seule fois — pas d’abonnement » suivait le
   montant en ligne et se coupait n’importe où (« pas » seul en fin de ligne).
   Elle passe sur sa propre ligne : le montant reste lisible d’un coup d'œil. */
.plan .price small{display:block;margin-top:4px;font-size:13.5px!important;
  font-weight:700;color:var(--muted);line-height:1.4}

/* ==========================================================================
   APERÇUS : autant de cartes que la grille peut en montrer
   La grille passe à 2 colonnes dès 560 px. N’afficher qu’une carte y laissait
   une case vide à côté — ça se lit comme un bug, pas comme un aperçu.
   ========================================================================== */
@media(max-width:559px){ .m-preview > *:nth-child(n+2){display:none} }
@media(min-width:560px) and (max-width:880px){ .m-preview > *:nth-child(n+3){display:none} }
.m-preview.m-open > *{display:revert!important}

/* ==========================================================================
   BANDEAU DE CONFIANCE — 4 icônes de même poids visuel
   Les boîtes faisaient déjà 34×34, mais les dessins n’occupent pas la même
   surface : le point d’interrogation paraissait petit et mal centré. On donne
   à chaque icône un vrai contenant (comme les icônes de domaine) : c’est le
   contenant qui porte la taille, plus le dessin.
   ========================================================================== */
.trustbar .tb .tbi{width:44px;height:44px;flex:none;display:grid;place-items:center;
  border-radius:13px;background:rgba(255,255,255,.05);
  border:1px solid var(--line,rgba(255,255,255,.1))}
.trustbar .tb .tbi svg{width:24px;height:24px;display:block;filter:none}

/* ==========================================================================
   ONGLET COURANT — on doit voir où on est (posé par js/site.js)
   ========================================================================== */
header .hnav a.on,header .hnav-avis-r.on{color:var(--white)}
header .hnav a.on{position:relative}
header .hnav a.on::after{content:"";position:absolute;left:0;right:0;bottom:-6px;height:2px;
  border-radius:2px;background:var(--blue-l,#8FB2FF)}
header .mnav a.on{color:var(--white);
  border-color:color-mix(in srgb,var(--blue) 55%,transparent);
  background:color-mix(in srgb,var(--blue) 20%,transparent)}

/* ==========================================================================
   CATÉGORIES DU CATALOGUE — présence sur grand écran
   Les volets étaient calibrés pour le pouce : sur un écran large ils
   paraissaient étriqués, perdus dans la largeur. On leur donne du corps
   (hauteur, icône, titre) sans changer leur logique.
   ========================================================================== */
@media(min-width:881px){
  .certs.grouped{max-width:900px;margin-inline:auto}
  .fam{border-radius:18px;margin-bottom:12px}
  .fam > summary{min-height:88px;padding:16px 22px;gap:18px}
  .fam-ico{width:52px;height:52px;border-radius:15px}
  .fam-ico svg{width:28px;height:28px}
  .fam-txt b{font-size:19px}
  .fam-txt i{font-size:14px;margin-top:4px}
  .fam > summary::after{width:11px;height:11px;border-width:3px}
  .fam-list{padding:4px 22px 20px}
}

/* ==========================================================================
   PAGE DE DOMAINE — haut de page en 2 colonnes sur grand écran
   Avant : icône, titre, texte, bouton et repères empilés au centre = beaucoup
   de hauteur pour peu d’information. Titre et action à gauche, repères à
   droite : même contenu, environ moitié moins de hauteur.
   En mobile, `.dom-top` reste un simple empilement (aucune règle).
   ========================================================================== */
@media(min-width:881px){
  .dom-top{display:grid;grid-template-columns:1.08fr .92fr;gap:16px 48px;
    align-items:center;max-width:1020px;margin:0 auto 30px}
  .dom-top .dom-hero{grid-column:1;grid-row:1;margin:0;max-width:none;
    align-items:flex-start;text-align:left;gap:14px}
  .dom-top .dom-hero h1,.dom-top .dom-hero .sub,.dom-top .dom-hero .dom-back{text-align:left}
  .dom-top .dom-hero .sub{margin:0}
  .dom-top .dom-cta{grid-column:1;grid-row:2;align-items:flex-start;margin:0}
  /* ⚠️ 27/07 — ce sélecteur (0,2,0) BAT le `.dom-stats{gap:16px}` de plus bas, quelle
     que soit sa position dans la feuille. Le gap y était donc resté à 10 px alors qu'on
     croyait l'avoir élargi. Les deux vont ensemble : si l'un bouge, l'autre aussi. */
  .dom-top .dom-stats{grid-column:2;grid-row:1 / span 2;
    flex-direction:column;flex-wrap:nowrap;gap:16px;margin:0;max-width:none}
  .dom-top .dom-stats span{flex:0 0 auto;flex-direction:row;align-items:baseline;
    justify-content:flex-start;gap:10px;text-align:left;padding:14px 18px}
  .dom-top .dom-stats b{font-size:17px;white-space:nowrap}
  /* l’icône du domaine peut respirer à côté du titre */
  .dom-top .dom-ico{width:64px;height:64px;border-radius:19px}
}

/* ==========================================================================
   RETOURS UI (20/07) — filtres, icônes sans boîte, domaine actif
   ========================================================================== */

/* — Filtres du catalogue : ils étaient restés à l’ancienne échelle (36 px / 13 px)
     alors que tout le reste est passé à 44 px. C’est ça qui faisait « pas à jour ». — */
.f-chip{min-height:44px;padding:0 18px;font-size:14.5px;font-weight:800;
  display:inline-flex;align-items:center;gap:7px;border-radius:999px}
.f-chip .n{font-size:12.5px;font-weight:900;opacity:.75}
.filters{gap:10px;margin-bottom:30px}

/* — Bandeau de confiance : SANS boîte (demandé). Les icônes gardent la même
     taille entre elles, c’est le dessin qui porte, pas un contenant. — */
.trustbar .tb .tbi{width:auto;height:auto;background:none;border:0;
  display:grid;place-items:center;flex:none}
.trustbar .tb .tbi svg{width:30px;height:30px;display:block}

/* — Domaine courant mis en évidence dans la barre des certifications — */
.catbar .cat > a.on,.catbar .cat-all.on{color:var(--white);
  border-bottom-color:var(--fc,var(--blue-l,#8FB2FF))}
.catbar .cat > a.on{font-weight:900}

/* — CTA de domaine : plus de nom de certif dans le libellé (voir js/site.js) — */
.dom-go .sec{font-weight:700;opacity:.85;font-size:14.5px}

/* — Identité visuelle du domaine : la couleur du domaine porte l’accent,
     au lieu du bleu générique commun à toutes les pages. — */
.dom-colore .dom-go{background:linear-gradient(160deg,
  color-mix(in srgb,var(--c,#5C86E0) 78%,#fff 18%) 0%,
  var(--c,#5C86E0) 60%,
  color-mix(in srgb,var(--c,#5C86E0) 72%,#8F7FE3 28%) 100%)}
.dom-colore .dom-stats span{border-color:color-mix(in srgb,var(--c,#5C86E0) 26%,transparent)}
.dom-colore .dom-stats b{color:var(--white)}
.dom-liste{margin:2px 0 0;font-size:13.5px;font-weight:800;letter-spacing:.01em;
  color:color-mix(in srgb,var(--c,#8FB2FF) 62%,#fff 38%)}
@media(max-width:880px){.dom-liste{font-size:13px}}

/* ==========================================================================
   RETOURS UI (20/07, 3e passe)
   ========================================================================== */

/* — Cartes de certification toutes à la MÊME hauteur (les textes ont des
     longueurs différentes : sans cela, une rangée devient irrégulière). — */
.certs,.fam-list{align-items:stretch}
.certs > .cert,.fam-list > .cert{height:100%;display:flex;flex-direction:column}
.cert > p{flex:1 1 auto}
.cert .foot{margin-top:auto}

/* — Icône propre à chaque certification (emoji), dans le contenant teinté du
     domaine : on garde l’unité visuelle sans répéter le même pictogramme. — */
.cert .ico.ico-emoji{font-size:23px;line-height:1;display:grid;place-items:center}

/* — Bloc de tête du domaine : la bande de réassurance remonte à droite, sous
     les repères, pour que le bouton touche directement la liste. — */
@media(min-width:881px){
  .dom-top .dom-band{grid-column:2;grid-row:2;margin:0;grid-template-columns:1fr;gap:8px}
  .dom-top .dom-cta{grid-row:3;grid-column:1}
  .dom-top .dom-stats{grid-row:1;grid-column:2}
  .dom-top .dom-hero{grid-row:1 / span 2}
  .dom-top{align-items:start;gap:14px 48px}
  .dom-top .dom-band > div{padding:11px 14px}
  .dom-top .dom-band b{font-size:13.5px}
  .dom-top .dom-band span{font-size:12.5px}
}

/* — Lisibilité sur les couleurs claires : le texte du bouton bascule en sombre
     quand la couleur du domaine est claire (doré, menthe…). Calculé en JS. — */
.dom-colore .dom-go{color:var(--cta-fg,#fff)}
.dom-colore .dom-go:hover{filter:brightness(1.03)}

/* — « Toutes » n’était pas aligné avec les autres onglets de la barre : il
     n’avait ni la même boîte ni la même bordure basse. — */
.catbar-in .cat-all{display:inline-flex;align-items:center;align-self:stretch;
  padding:0 15px 0 0;margin-right:7px;border-bottom:2px solid transparent;line-height:1}
.catbar-in .cat > a{line-height:1}

/* ==========================================================================
   RETOURS UI (20/07, 4e passe)
   ========================================================================== */

/* — Les CHIFFRES portent l’argument : « 100 % gratuit » était en retrait, le
     nombre plus petit que son libellé. On inverse le rapport de force. — */
.trustbar .tbx b{font-size:16px;line-height:1.15;display:block}
.trustbar .tbx b [data-count]{font-size:27px;font-weight:900;letter-spacing:-.025em;
  font-variant-numeric:tabular-nums;margin-right:3px}
.trustbar .tbx span{margin-top:4px}

/* — Icônes : calibrées sur le poids visuel du chiffre (27 px), pas plus.
     Repère Apple HIG : une icône de ligne se situe entre 20 et 28 pt ;
     au-delà elle prend le pas sur l’information qu’elle accompagne. — */
.trustbar .tb .tbi svg{width:26px;height:26px}

/* — Couleurs claires : plutôt qu’un noir dur sur doré ou menthe, une encre
     sombre TEINTÉE de la couleur du domaine. Contraste tenu, et ça reste
     dans la palette au lieu de casser la carte. — */
.dom-colore .dom-go{color:var(--cta-fg,#fff)}
.dom-clair .dom-go{color:color-mix(in srgb,var(--c) 22%,#131017 78%)}
.dom-clair .dom-go:hover{filter:brightness(1.05)}

/* ==========================================================================
   HARMONIE DES CARTES (20/07, 5e passe)
   ========================================================================== */

/* — Emojis à la MÊME hauteur d’une carte à l’autre. Ils étaient centrés sur le
     bloc titre+sous-titre, dont la hauteur varie de 1 à 3 lignes : l’icône
     tombait 22, 31 ou 41 px sous le haut de la carte. On les cale en haut. — */
.cert .top{align-items:flex-start}
.cert .ico{margin-top:1px}

/* — Toutes les cartes à la même hauteur, y compris d’une RANGÉE à l’autre.
     Une grille CSS dimensionne chaque rangée sur son propre contenu : la
     dernière (souvent incomplète) était plus courte. `grid-auto-rows:1fr`
     impose une hauteur unique à l’ensemble. — */
.certs,.fam-list{grid-auto-rows:1fr}

/* ==========================================================================
   PAGE DE DOMAINE — moins d’écriture (20/07)
   Six encadrés à droite, c’était trop à lire pour une page dont le but est
   d’emmener vers UNE certification. Deux décisions :
   1. les 3 repères deviennent UNE ligne compacte (l’information est chiffrée,
      elle n’a pas besoin d’un encadré chacune) ;
   2. la bande de réassurance disparaît des pages de domaine : elle était
      IDENTIQUE sur les 8 et répète déjà la page d’accueil. Elle reste dans le
      DOM (aucun contenu perdu) — retirer `display:none` la fait revenir.
   ========================================================================== */
.dom-band{display:none}

.dom-stats{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:22px}
.dom-stats span{flex:1 1 auto;flex-direction:row;align-items:baseline;justify-content:center;
  gap:7px;padding:11px 16px;text-align:left;font-size:13px}
.dom-stats b{font-size:16px;white-space:nowrap}

@media(min-width:881px){
  /* colonne de droite : une pile compacte, plus un mur de texte */
  .dom-top{grid-template-columns:1.15fr .85fr}
  /* ⚠️ TROISIÈME déclaration de `.dom-top .dom-stats` dans cette feuille (les autres
     sont ~800 et ~1430). C'est celle-ci qui gagne au-delà de 881 px, et c'est elle qui
     tenait encore le gap à 10 px après qu'on l'ait élargi ailleurs. Quand ce gap bouge,
     il bouge aux TROIS endroits — sinon la correction est invisible sur un écran large. */
  .dom-top .dom-stats{grid-column:2;grid-row:1 / span 2;flex-direction:column;
    align-self:center;gap:16px;margin:0}
  .dom-top .dom-stats span{flex:0 0 auto;justify-content:flex-start;padding:14px 18px;font-size:13.5px}
  .dom-top .dom-cta{grid-row:2;grid-column:1}
  .dom-top .dom-hero{grid-row:1;grid-column:1}
}

/* ==========================================================================
   INDICE DE DÉFILEMENT — on doit savoir qu’il y a une suite
   La vague ferme le héros de façon si nette qu’elle ressemble à un bas de page.
   Un chevron discret, centré sous la vague, lève le doute. Il disparaît dès
   qu’on descend (classe posée par js/site.js), et respecte `reduced-motion`.
   ========================================================================== */
.hero{position:relative}
.hero::after{content:"";position:absolute;left:50%;bottom:14px;width:13px;height:13px;
  margin-left:-7px;pointer-events:none;
  border-right:2.5px solid rgba(255,255,255,.42);
  border-bottom:2.5px solid rgba(255,255,255,.42);
  transform:rotate(45deg);
  animation:m-chev 2.1s ease-in-out infinite;
  transition:opacity .3s ease}
body.m-scrolled .hero::after{opacity:0}
@keyframes m-chev{
  0%,100%{transform:rotate(45deg) translate(0,0);opacity:.5}
  50%    {transform:rotate(45deg) translate(3px,3px);opacity:.95}
}
@media(prefers-reduced-motion:reduce){.hero::after{animation:none;opacity:.55}}
@media(max-width:880px){.hero::after{bottom:8px;width:11px;height:11px;margin-left:-6px}}

/* ==========================================================================
   HIÉRARCHIE DES COULEURS (20/07)
   Constat : le doré servait à la fois de navigation (« Toutes », « Laisser un
   avis ») ET de récompense (Certoly Plus, étoiles, trait du héros). Une couleur
   qui veut tout dire ne dit plus rien — c’est le « il manque un truc ».

   Rôles fixés, un accent dominant :
   · BLEU   = action et navigation (dominant)
   · DORÉ   = récompense et premium UNIQUEMENT (trait du héros, étoiles,
              Certoly Plus, badges de niveau)
   · MENTHE = disponibilité / succès
   · VIOLET = décor (dégradés), jamais seul
   · ROUGE  = alerte
   Le doré est donc retiré de la NAVIGATION — il y perdait son sens.
   ========================================================================== */

/* « Laisser un avis » : un lien de navigation comme les autres */
header .hnav-avis-r{color:var(--muted)}
header .hnav-avis-r:hover,header .hnav-avis-r.on{color:var(--white)}
header .mnav a:last-child{color:var(--white)}
header .mnav a:last-child.on{color:var(--white)}

/* « Toutes » dans la barre des domaines : navigation, donc neutre puis blanc */
.catbar-in .cat-all{color:var(--muted)}
.catbar-in .cat-all:hover,.catbar-in .cat-all.on{color:var(--white)}
.catbar-in .cat-all.on{border-bottom-color:var(--blue-l,#8FB2FF)}

/* En contrepartie, le doré retrouve du poids là où il VEUT dire quelque chose */
.plan.premium .price,.badge.gold,.pill-life{color:var(--gold)}

/* ==========================================================================
   BADGES DE STATUT — le doré revient à la récompense (20/07)
   « BIENTÔT » est un STATUT, pas une récompense : il portait la couleur du
   premium (20 badges sur le catalogue). Il passe en neutre. « DISPONIBLE »
   garde le menthe, qui signale bien la disponibilité.
   ========================================================================== */
.badge.soon{color:var(--muted,#AEB6D9)!important;
  border-color:var(--line-2,rgba(255,255,255,.16))!important;
  background:rgba(255,255,255,.05)!important}
.cert.soon .go{color:var(--blue-l,#8FB2FF)}

/* ==========================================================================
   EMOJIS DES CARTES — cadrage
   La boîte est géométriquement centrée (mesuré : 7,5 px en haut comme en bas),
   mais les glyphes ne remplissent pas leur cadre de la même façon : ceux dits
   « à présentation texte » (☣️, 🏗️, 🛡️…) ont une encre plus petite et paraissent
   plus bas. `line-height:1` supprime l’interligne parasite et resserre le
   centrage ; le reste est une limite des polices emoji, pas du CSS.
   ========================================================================== */
.cert .ico.ico-emoji{line-height:1;font-size:24px;
  display:flex;align-items:center;justify-content:center;
  padding:0;text-align:center}

/* ==========================================================================
   VIGNETTES DE CERTIFICATION — moins de texte, et tout aligné (20/07)
   Deux problèmes liés : le nom officiel complet (« Autorisation d’Intervention
   à Proximité des Réseaux ») prend 1, 2 ou 3 lignes selon la certif, ce qui
   décale la description et le pied de carte d’une vignette à l’autre.
   Et pour quelqu’un qui découvre le site, une vignette qui affiche sigle +
   nom officiel + 4 lignes de description + statut + nombre + action, c’est
   trop : on ne sait plus où regarder.

   Décisions : le nom officiel tient sur UNE ligne (il est en entier sur la
   fiche), la description sur DEUX. Résultat : chaque bloc démarre au même
   endroit sur toutes les cartes, et le regard trouve le sigle immédiatement.
   ========================================================================== */
.cert .full{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;
  overflow:hidden;min-height:1.35em}
.cert > p{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;min-height:2.9em}

/* le sigle reste le point d’entrée du regard */
.cert .name{font-size:19px;letter-spacing:-.015em}

/* — Pied de carte : « Essayer l’aperçu → » passait sur deux lignes et décalait
     le pied de 32 px par rapport aux cartes « S’entraîner → ». Libellé court
     (le texte complet reste dans le DOM pour les lecteurs d’écran), donc une
     seule ligne partout et des pieds alignés. Moins de texte, aussi. — */
.cert.soon .go{font-size:0;white-space:nowrap}
.cert.soon .go::after{content:"Aperçu →";font-size:14px;font-weight:900}
.cert .foot{flex-wrap:nowrap;gap:10px}
.cert .qn{white-space:nowrap}

/* — Dernier écart de 2 px entre les pieds de carte : « DISPONIBLE » a un fond,
     « BIENTÔT » une bordure de 1,5 px — leurs hauteurs différaient d’autant.
     Hauteur imposée : les pieds tombent exactement au même endroit. — */
.badge{display:inline-flex;align-items:center;min-height:28px;box-sizing:border-box}

/* — Bandeau de confiance : j’avais trop poussé. 27 px pour le chiffre écrasait
     la ligne entière ; on redescend à 23, libellé à 15. L’information reste en
     avant sans occuper tout l’espace. — */
.trustbar .tbx b [data-count]{font-size:23px}
.trustbar .tbx b{font-size:15px}
.trustbar .tbx span{font-size:12.5px;margin-top:3px}
.trustbar .tb .tbi svg{width:24px;height:24px}
.trustbar .tb{gap:12px}

/* ==========================================================================
   BANDEAU DE CONFIANCE — un seul accent (20/07)
   Mesuré : les 4 icônes portaient 4 accents (menthe, bleu, violet, doré), ce qui
   contredisait la hiérarchie « un accent dominant ». Quatre couleurs sur une
   même ligne, c’est quatre fois rien.

   En CSS, la propriété `fill` l’emporte sur l’attribut `fill=""` du SVG : on
   peut donc recolorer sans toucher aux tracés. On garde les deux tons d’origine
   (forme + détail crème) — seule la couleur de la FORME est unifiée.
   ========================================================================== */
.trustbar .tbi svg [fill]:not([fill="none"]):not([fill="#FFF3D6"]):not([fill="#141A33"]){
  fill:var(--blue,#5C86E0)
}
.trustbar .tbi svg [stroke]:not([stroke="none"]):not([stroke="#FFF3D6"]){
  stroke:var(--blue,#5C86E0)
}

/* ==========================================================================
   JEU D’ICÔNES DES CERTIFICATIONS (js/icons.js)
   Les emojis sortaient de la direction artistique : détaillés, multicolores,
   brillants, sur un site plat et sombre. Ils sont remplacés par 25 dessins SVG
   dans l’idiome des icônes de famille (_famIco) : grille 24x24, à plat,
   couleur du domaine + crème #FFF3D6.
   ========================================================================== */

/* Autocomplétion de la recherche (home) : .oe portait une taille de POLICE,
   qui ne dimensionne pas un SVG. */
.hsearch-opt .oe{display:grid;place-items:center;width:24px;height:24px}
.hsearch-opt .oe svg{width:22px;height:22px;display:block}

/* Les règles .cert .ico.ico-emoji plus haut dans ce fichier sont désormais MORTES :
   vérifié, la classe ico-emoji n’apparaît plus dans aucun fichier HTML du site.
   Laissées en place (une règle qui ne matche rien ne coûte rien) plutôt que
   supprimées par script au milieu d’une feuille de 65 Ko. */

/* — Pied de vignette : badge + nombre de questions + action réclamaient 278 px dans 235 sur
     les 5 cartes « Disponible » (mesuré à 1280 px, volets ouverts). « S’entraîner → »
     débordait de 14 à 23 px hors de la carte.
     Le pied passe donc à la ligne au lieu de déborder ; l’action reste calée à droite.
     Les hauteurs de rangée restent égales (grid-auto-rows:1fr sur la grille). — */
.cert .foot{flex-wrap:wrap;row-gap:7px}
.cert .foot .go{margin-left:auto}

/* — Loupe du catalogue : c’était un emoji 🔍 (glacé, multicolore) alors que la loupe de la
     bannière, sur la MÊME page, est un SVG plat — deux systèmes graphiques dans un écran.
     Alignée sur le tracé de la bannière. `.searchbar .ic` était dimensionnée en font-size,
     ce qui ne dimensionne pas un SVG. — */
.searchbar .ic{display:grid;place-items:center;color:var(--dim,#7A83A8);opacity:1}
.searchbar .ic svg{display:block;width:18px;height:18px}

/* — Filtres du catalogue : les 3 pastilles réclamaient 370 px pour 350 disponibles à 390 px,
     donc « Bientôt » tombait seule sur une 2e ligne — un orphelin centré qui se lit comme un
     défaut d’alignement. Padding 18 → 14 px (gain 24 px) : les 3 tiennent sur une ligne.
     Borné à 430 px pour ne pas resserrer le desktop, où la place ne manque pas. — */
@media (max-width:430px){
  .filters button, .filters .f{padding-left:14px;padding-right:14px}
}

/* — Accroche du héros : sous 560 px la liste des fonctionnalités est retirée (elle est reprise
     plus bas dans la page) pour que la phrase se TERMINE au lieu d’être coupée en plein mot
     par le clamp à 3 lignes. Retiré de l’affichage, pas du DOM. — */
@media (max-width:559px){ .hero p .p-long{display:none} }


/* ==========================================================================
   CATALOGUE v175 — ce qui est JOUABLE MAINTENANT passe devant
   Avant : les 5 banques complètes étaient noyées parmi 20 aperçus, à l’intérieur
   de 8 volets FERMÉS. Un visiteur cherchant une certification prête ne voyait
   aucun nom sans cliquer. Le filtre « Disponibles » lui-même n’affichait que des
   dossiers fermés.
   ========================================================================== */
.sec-t{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  font-size:20px;font-weight:900;letter-spacing:-.01em;margin:0 0 14px}
.sec-t em{font-style:normal;font-size:13.5px;font-weight:700;color:var(--muted,#AEB6D9)}
.sec-pastille{width:9px;height:9px;border-radius:50%;flex:none;
  background:var(--mint,#7BD8B8);box-shadow:0 0 0 4px color-mix(in srgb,var(--mint,#7BD8B8) 22%,transparent)}
.sec-dispo{margin:0 0 34px}
.sec-soon{margin:0}
.sec-t--soon{color:var(--muted,#AEB6D9);font-size:17px;
  padding-top:22px;border-top:1px solid var(--line,rgba(255,255,255,.09))}

/* La mention « banque non complète » doit être lue AVANT le clic, pas découverte
   dans l’app. Elle remplace l’ancien « 30 q d’aperçu » du pied de carte, qui se
   confondait avec le compteur de questions des banques complètes. */
.apercu-note{margin:0;font-size:12.5px;font-weight:700;
  color:color-mix(in srgb,var(--gold,#EFC983) 78%,var(--muted,#AEB6D9))}

/* ==========================================================================
   PREUVES VÉRIFIABLES (home) — remplace le carrousel de faux témoignages
   Des avis fictifs, même badgés « Exemple », restent des avis fictifs : sur un
   site pré-lancement ils décrédibilisent au lieu de rassurer. Ce qui les
   remplace ne peut pas être mis en doute — un compte de questions calculé
   depuis la banque, le programme réel, la méthode, et une VRAIE question avec
   sa correction et sa source.
   ========================================================================== */
.preuves{display:grid;grid-template-columns:1fr;gap:12px;margin:6px 0 22px}
@media(min-width:760px){.preuves{grid-template-columns:repeat(3,1fr)}}
.pv{background:rgba(33,42,77,.55);border:1px solid var(--line,rgba(255,255,255,.09));
  border-radius:18px;padding:16px 18px;display:flex;flex-direction:column;gap:4px}
.pv-k{font-size:11.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;
  color:var(--dim,#7A83A8)}
.pv b{font-size:21px;font-weight:900;letter-spacing:-.01em;color:var(--white,#F5F6FF)}
.pv-s{font-size:13.5px;color:var(--muted,#AEB6D9);line-height:1.5}

/* L’exemple de question : c’est la preuve la plus forte du lot — le visiteur juge
   la qualité du contenu sur pièce, avant de cliquer. */
.exq{margin:0 0 18px;background:rgba(27,35,66,.6);
  border:1px solid var(--line-2,rgba(255,255,255,.14));border-radius:20px;padding:20px 20px 18px}
.exq figcaption{font-size:11.5px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;
  color:var(--dim,#7A83A8);margin-bottom:12px}
.exq-q{margin:0 0 12px;font-size:16.5px;font-weight:800;color:var(--white,#F5F6FF);line-height:1.45}
.exq-a{margin:0 0 10px;font-size:15px;color:var(--white,#F5F6FF);line-height:1.5}
.exq-ok{display:inline-block;font-size:11px;font-weight:900;letter-spacing:.05em;
  text-transform:uppercase;color:#0f2b22;background:var(--mint,#7BD8B8);
  border-radius:999px;padding:3px 9px;margin-right:8px;vertical-align:1px}
.exq-e{margin:0 0 10px;font-size:14px;color:var(--muted,#AEB6D9);line-height:1.55}
.exq-e b{color:var(--white,#F5F6FF)}
.exq-src{margin:0;font-size:12.5px;color:var(--dim,#7A83A8);font-style:italic}

soulignement centré, couleur de domaine au survol (v176)
   · trait centré SOUS le texte (padding de .cat-all asymétrique → il débordait) ;
   · au survol, le trait prend la COULEUR DU DOMAINE (--fc), pas le bleu ;
   · quand la barre est survolée, le trait ACTIF (bleu) est MASQUÉ → plus de
     « double barre » (bleu de l onglet actif + couleur de l onglet survolé).
   ========================================================================== */
.catbar .cat > a,
.catbar-in .cat-all{ position:relative; border-bottom:0 !important; }
.catbar .cat > a::after,
.catbar-in .cat-all::after{
  content:""; position:absolute; bottom:0; height:2px; border-radius:2px;
  opacity:0; transition:opacity .15s ease;
}
.catbar .cat > a::after{ left:13px; right:13px; background:var(--fc,var(--blue-l,#8FB2FF)); }
.catbar-in .cat-all::after{ left:0; right:15px; background:var(--blue-l,#8FB2FF); }

/* onglet actif : trait visible par défaut */
.catbar .cat > a.on::after,
.catbar-in .cat-all.on::after{ opacity:1; }

/* survol de la barre → on masque TOUS les traits (dont l actif) */
.catbar-in:hover .cat > a::after,
.catbar-in:hover .cat-all::after{ opacity:0; }
/* …puis on ré-affiche UNIQUEMENT celui qu on survole (couleur de son domaine) */
.catbar .cat:hover > a::after,
.catbar .cat:focus-within > a::after,
.catbar-in .cat-all:hover::after{ opacity:1; }

/* — En-tête mobile : « Commencer » en Inter est ~6px plus large qu’en Nunito et débordait à
     375px. On resserre le CTA et le padding de la rangée sous 420px (gain ~14px). — */
@media (max-width:420px){
  header .nav .cta{ padding:0 12px; font-size:13.5px; }
  header .wrap.nav{ padding-left:10px; padding-right:10px; }
}

/* — Très petits écrans (≤360px) : la rangée d’en-tête est intrinsèquement large
     (logo + recherche + profil + Commencer). On rétrécit le logo et les espaces. — */
@media (max-width:360px){
  header .brand{ font-size:17px; gap:7px; }
  header .brand img{ width:30px; height:30px; }
  header .wrap.nav{ gap:6px; padding-left:8px; padding-right:8px; }
  header .nav .cta{ padding:0 10px; font-size:13px; }
}

/* ==========================================================================
   CATALOGUE — vue groupée : les sections doivent occuper TOUTE la largeur
   Régression v175 : #grid reste en `display:grid` (2-3 colonnes) et mes
   <section> « Disponibles maintenant » / « En préparation » devenaient des
   ITEMS de cette grille → les cartes se tassaient à 156px au lieu de ~337px.
   En vue groupée, la grille du conteneur n’a plus lieu d’être : chaque section
   porte sa propre grille interne (.certs / .fam-list).
   ========================================================================== */
#grid.grouped,
.certs.grouped{ display:block !important; }
.sec-dispo .certs{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(min(100%,300px),1fr));
  gap:14px;
}

/* ==========================================================================
   MENU PROFIL — il s’affichait OUVERT en permanence sur toutes les pages
   Le JS (site.js, profileMenu) bascule bien une classe .on, mais aucune règle
   ne la consommait : le panneau restait donc collé sous la barre, ouvert.
   ========================================================================== */
.hprof{ position:relative; }
.hprof-menu{
  position:absolute;
  top:calc(100% + 8px);
  right:0;
  min-width:210px;
  display:none;
  z-index:90;
  background:var(--navy2,#1B2342);
  border:1px solid var(--line-2,rgba(255,255,255,.14));
  border-radius:14px;
  box-shadow:0 24px 54px -22px rgba(0,0,0,.82);
  padding:7px;
}
.hprof.on .hprof-menu{ display:block; }
.hprof-menu a{
  display:block;
  padding:9px 11px;
  border-radius:9px;
  font-size:13.5px;
  font-weight:700;
  color:var(--muted,#AEB6D9);
  text-decoration:none;
}
.hprof-menu a:hover{ color:var(--white,#F5F6FF); background:rgba(255,255,255,.06); }
.hprof-menu .hprof-h{
  padding:6px 11px 8px;
  font-size:10.5px;
  font-weight:900;
  letter-spacing:.06em;
  text-transform:uppercase;
  color:var(--dim,#7A83A8);
}

/* ==========================================================================
   PAGES DE DOMAINE — les 3 blocs n’avaient AUCUN style (générés par JS, jamais
   habillés). Résultat : bouton principal rendu en lien texte souligné, et
   chiffres collés à leur libellé (« 570 questionsrédigées et expliquées »)
   parce que les <b> étaient en display:inline.
   Une seule édition ici couvre les 8 pages de domaine.
   ========================================================================== */

/* Le bouton principal : même pilule dégradée que le CTA du site. */
.dom-go{
  display:inline-flex;
  align-items:center;
  gap:8px;
  padding:12px 22px;
  border-radius:14px;
  font-weight:800;
  font-size:15px;
  color:#fff !important;
  text-decoration:none;
  background:linear-gradient(160deg,#8FB2FF 0%,#5C86E0 52%,#8F7FE3 100%);
  box-shadow:0 10px 26px -12px rgba(70,100,230,.7);
  transition:transform .15s ease,filter .15s ease;
}
.dom-go:hover{ transform:translateY(-2px); filter:brightness(1.06); }
.dom-go:focus-visible{ outline:2px solid var(--blue-l,#8FB2FF); outline-offset:3px; }

/* Repères chiffrés : le <b> passe en bloc → le libellé descend sous le chiffre.
   ⚠️ 27/07 — l'écart était de 10 px pour des blocs de ~200 px de large et 60 de haut :
   proportionnellement, ça se lit comme un bloc unique découpé au trait, pas comme trois
   repères. Porté à 16 px, et le minimum de colonne à 160 px pour qu'un chiffre long
   (« 1 177 questions ») ne force pas un retour à la ligne dans le libellé. */
.dom-stats{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
  gap:16px;
  margin:0 0 18px;
}
.dom-stats > *{
  background:rgba(33,42,77,.5);
  border:1px solid var(--line,rgba(255,255,255,.09));
  border-radius:14px;
  padding:13px 15px;
  font-size:13px;
  color:var(--muted,#AEB6D9);
  line-height:1.4;
}
.dom-stats b{
  display:block;                 /* ← c’est ce qui décolle le chiffre du libellé */
  font-size:19px;
  font-weight:900;
  color:var(--white,#F5F6FF);
  letter-spacing:-.01em;
  margin-bottom:2px;
  font-variant-numeric:tabular-nums;
}

/* ⛔ Ici vivait une seconde déclaration de `.dom-band`, postérieure au
   `display:none` posé le 20/07 — donc elle le contredisait et faisait REVENIR
   la bande que cette décision avait retirée. Personne ne l'a vu pendant une
   semaine. Les deux blocs sont partis le 27/07, avec le markup.
   La leçon : masquer un bloc ne le retire pas, ça le met en sursis. */
@media(max-width:559px){
  .dom-stats{ grid-template-columns:1fr 1fr; gap:12px; }
  .dom-stats > *{ padding:11px 12px; }
  .dom-stats b{ font-size:17px; }
  .dom-go{ width:100%; justify-content:center; }
}

/* ==========================================================================
   BARRE DE DOMAINES — soulignement centré + couleur de domaine au survol
   (réécrit en AJOUT après l’incident de troncature du 20/07 : la version
   précédente remplaçait un bloc par `slice`, ce qui a coupé 55 Ko de CSS.)
   · le border-bottom ne sert plus d’indicateur (padding asymétrique de
     .cat-all → son trait débordait de 15px sous le vide) ;
   · le trait de survol prend la COULEUR DU DOMAINE (--fc), pas le bleu ;
   · pendant le survol de la barre, le trait ACTIF est masqué → fini la
     « double barre » (bleu de l’actif + couleur du survolé).
   ========================================================================== */
.catbar .cat > a,
.catbar-in .cat-all{ position:relative; border-bottom:0 !important; }
.catbar .cat > a::after,
.catbar-in .cat-all::after{
  content:""; position:absolute; bottom:0; height:2px; border-radius:2px;
  opacity:0; transition:opacity .15s ease;
}
.catbar .cat > a::after{ left:13px; right:13px; background:var(--fc,var(--blue-l,#8FB2FF)); }
.catbar-in .cat-all::after{ left:0; right:15px; background:var(--blue-l,#8FB2FF); }

.catbar .cat > a.on::after,
.catbar-in .cat-all.on::after{ opacity:1; }

.catbar-in:hover .cat > a::after,
.catbar-in:hover .cat-all::after{ opacity:0; }

.catbar .cat:hover > a::after,
.catbar .cat:focus-within > a::after,
.catbar-in .cat-all:hover::after{ opacity:1; }

/* ==========================================================================
   FAISCEAU DORÉ RETIRÉ (demande utilisateur — « pas très beau »)
   Réécrit après l’incident de troncature du 20/07.
   Le balisage <em class="beam"> est CONSERVÉ sur les 9 pages : il porte
   désormais le dégradé bleu→violet du titre (voir css/type.css).
   Pour restaurer le trait doré : supprimer ce bloc.
   ========================================================================== */
.beam::after,
h1 em.beam::after{ content:none !important; }

/* ==========================================================================
   ACCÈS DIRECTS sous la recherche du héros — RETIRÉS le 27/07/2026
   La rangée « Prêtes : AMF · SST · Côtier · Élec · AIPR · SSIAP 1 » disait une
   troisième fois ce que le champ de recherche disait au-dessus et le catalogue
   en dessous. Six liens de plus dans le premier écran, pour aucune information
   nouvelle. Le markup et le script qui la remplissait sont retirés de
   site/index.html ; ces règles n'ont donc plus de cible.
   ⚠️ `.hd-lbl` reste stylé dans css/type.css (règle partagée avec .eyebrow,
   .pv-k, .badge…) — ne pas l'y retirer, il sert ailleurs.
   ========================================================================== */

/* — Repères de domaine : le texte vit dans un <span> IMBRIQUÉ, pas dans un enfant direct.
     `.dom-stats > *` ne l’atteignait donc pas, et le span gardait sa largeur intrinsèque
     (225px) → 30px de débordement à 375px. On borne tout ce qui est à l’intérieur. — */
.dom-stats *, .dom-band *{ min-width:0; max-width:100%; }
.dom-stats span, .dom-band span{ display:block; overflow-wrap:anywhere; }

/* — Très petits écrans (≤340px) : la rangée d’en-tête réclamait 5px de plus que l’écran,
     « Commencer » sortait du cadre sur toutes les pages. On raccourcit le libellé (le texte
     complet reste dans le DOM pour les lecteurs d’écran) et on resserre les espaces. — */
@media (max-width:340px){
  header .nav .cta{ padding:0 9px; font-size:12.5px; }
  header .wrap.nav{ gap:5px; padding-left:7px; padding-right:7px; }
  header .brand{ font-size:16px; }
  header .brand img{ width:27px; height:27px; }
}

/* — Bloc de tête des pages de domaine : .dom-hero et .dom-cta ont un grid-row explicite,
     mais .dom-stats et .dom-band n’en avaient AUCUN → placement automatique, les deux
     atterrissaient sur la même rangée de la colonne droite et se CHEVAUCHAIENT de 46px
     (constaté à 936px de large).
     On leur donne leur propre rangée, et on aligne la colonne en haut. — */
@media (min-width:881px){
  .dom-top{ align-items:start; }
  .dom-top .dom-stats{ grid-column:2; grid-row:1; align-self:start; }
  .dom-top .dom-band{ grid-column:2; grid-row:2; align-self:start; margin:0; }
}

/* ==========================================================================
   BARRE DE DOMAINES — défilement horizontal SUPPRIMÉ (25/07/2026)
   ==========================================================================
   Demande explicite : « je trouve ça super chiant, seul le défilement vertical est cool ».
   La version du 24/07 rendait la barre défilante entre 881 et 980 px. C'était traiter le
   symptôme, et deux diagnostics successifs se sont révélés faux avant le bon :

   ✗ « c'est le menu déroulant fermé, large de 250 px » — testé avec `display:none !important` :
     le débordement n'a pas bougé d'un pixel.
   ✗ « il suffit de resserrer les onglets » — ne réglait qu'une largeur précise.
   ✓ LA CAUSE : `.catbar-in::before` affiche l'étiquette « Certifications : », qui est un
     élément de flex à part entière. Elle n'apparaît pas dans la liste des enfants du
     conteneur, d'où des sommes de largeurs qui ne tombaient jamais juste. Elle n'est
     affichée qu'à partir de 920 px et coûte une centaine de pixels — exactement ce qui
     manquait entre 920 et 1100.

   Correctif en deux temps, mesuré à chaque largeur :
     1. l'étiquette disparaît sous 1101 px       → 920 à 1100 réglés
     2. léger resserrage entre 881 et 919 px     → la dernière plage réglée
   Résultat vérifié à 881, 890, 900, 910, 919, 920, 940, 980, 1000, 1100 et 1280 px :
   0 débordement de page, 0 défilement interne, partout.

   ⚠️ `!important` est nécessaire, pas décoratif : les règles de base de `.catbar-in` vivent
   dans le `<style>` inline de chaque page, chargé APRÈS cette feuille. Sans lui, l'inline
   reprend le dessus (piège n°2 du projet).
   ========================================================================== */
@media (max-width:1100px){
  .catbar-in::before{ display:none !important; }
}
@media (min-width:881px) and (max-width:919px){
  .catbar-in{ padding-left:10px !important; padding-right:10px !important; }
  .catbar-in .cat > a{ padding-left:11px !important; padding-right:11px !important; }
  .catbar .cat > a::after{ left:11px !important; right:11px !important; }
  .catbar-in .cat-all{ padding-right:10px !important; margin-right:5px !important; }
}

/* — Très petits écrans : les 5 derniers pixels (25/07/2026) —
   À 320 px (vieil iPhone SE), deux éléments dépassaient encore :
     · la pastille « 100 % gratuit — sans compte », de 11,5 px ;
     · le bouton « Commencer » du bandeau, de 5 px.
   Pour le bouton, la rangée tient EXACTEMENT dans les 305 px utiles (91 + 46 + 46 + 93,
   trois espaces de 5 et 14 de marge intérieure) : il ne manquait que la largeur minimale
   du libellé. On récupère les pixels sur les espacements plutôt que sur le texte, qui
   resterait lisible mais tronqué.
   Vérifié à 320, 330, 340, 360, 375, 390 et 414 px : 0 débordement. */
@media (max-width:359px){
  .free-pill{ padding-left:9px !important; padding-right:9px !important; font-size:11.5px !important; }
}
@media (max-width:339px){
  header .nav{ gap:3px !important; padding-left:5px !important; padding-right:5px !important; }
}

/* — Passage de relais propre entre les deux navigations (25/07/2026) —
   Défaut mesuré ce jour : entre 861 et 880 px, les DEUX navigations s'affichaient en même
   temps. Le `<style>` des pages masque `.catbar` jusqu'à 860 px seulement
   (`@media(max-width:860px)`), alors que cette feuille force les pastilles mobiles jusqu'à
   880 px. Les 20 px d'écart montraient les deux.
   ⚠️ Le commentaire du seuil 881, plus haut dans ce fichier, affirmait que « entre 860 et 880
   la barre de domaines est encore masquée par le CSS de page ». C'était FAUX, et personne ne
   l'avait vérifié. On aligne donc explicitement : la barre attend 881, comme les pastilles. */
@media (max-width:880px){
  .catbar{ display:none !important; }
}


/* ==========================================================================
   ALLER AU CONTENU — 25/07/2026
   Au clavier il fallait franchir 19 cibles avant d’atteindre le contenu.
   Le lien est masqué par la technique de recadrage (et non par display:none,
   qui le sortirait de l’ordre de tabulation) : INVISIBLE tant qu’il n’a pas
   le focus, donc aucun changement d’apparence pour qui utilise la souris.
   ========================================================================== */
.skip-link{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;
  overflow:hidden;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%)}
.skip-link:focus{position:fixed;left:12px;top:12px;z-index:10000;
  width:auto;height:auto;margin:0;padding:11px 18px;overflow:visible;
  clip:auto;clip-path:none;border-radius:12px;
  background:var(--navy2,#252B4A);color:var(--white,#F5F6FF);
  border:2px solid var(--blue-l,#8FB2FF);
  font-family:inherit;font-weight:800;font-size:15px;text-decoration:none;
  box-shadow:0 12px 34px -14px rgba(0,0,0,.75)}
/* la cible ne doit pas afficher de contour quand on lui donne le focus par programme */
#contenu:focus{outline:none}

/* ==========================================================================
   MENU PLEIN ÉCRAN — navigation par métier sous 881 px  (25/07/2026)
   ==========================================================================
   Sous 881 px la barre de domaines disparaît. Jusqu’ici RIEN ne la remplaçait :
   il ne restait que 4 liens génériques, plus aucun accès par métier.

   Le panneau est construit par `site.js` À PARTIR de la barre de domaines
   existante : aucune liste à tenir à jour ici, un domaine ajouté à `.catbar`
   apparaît tout seul dans le menu.

   Animation : glissement depuis la droite, 320 ms, courbe iOS
   `cubic-bezier(.32,.72,0,1)` — départ franc, freinage long. Les rangées
   entrent décalées de 30 ms : c’est ce décalage qu’on lit comme « fini »,
   pas la durée. `prefers-reduced-motion` ramène le tout à un fondu de 120 ms.
   ========================================================================== */

/* — le déclencheur — */
.mm-btn{ display:none; flex:none; width:42px; height:42px; padding:0; margin-left:2px;
  align-items:center; justify-content:center; cursor:pointer;
  background:transparent; border:1px solid var(--line-2,rgba(255,255,255,.14)); border-radius:12px;
  color:var(--white,#F5F6FF); transition:border-color .15s ease, background .15s ease }
.mm-btn:hover{ border-color:var(--gold,#EFC983); background:rgba(255,255,255,.04) }
.mm-bars{ display:block; width:18px }
.mm-bars i{ display:block; height:2px; border-radius:2px; background:currentColor;
  transition:transform .28s cubic-bezier(.32,.72,0,1), opacity .18s ease }
.mm-bars i + i{ margin-top:4px }
.mm-btn[aria-expanded="true"] .mm-bars i:nth-child(1){ transform:translateY(6px) rotate(45deg) }
.mm-btn[aria-expanded="true"] .mm-bars i:nth-child(2){ opacity:0 }
.mm-btn[aria-expanded="true"] .mm-bars i:nth-child(3){ transform:translateY(-6px) rotate(-45deg) }
@media (max-width:880px){ .mm-btn{ display:inline-flex } }

/* — le panneau — */
.mm-panneau{ position:fixed; inset:0; z-index:2000; overflow-y:auto; overscroll-behavior:contain;
  padding:14px 16px calc(26px + env(safe-area-inset-bottom,0px));
  background:linear-gradient(180deg,#171d38,#10142a 62%,#0c1024);
  opacity:0; transform:translateX(100%);
  transition:transform .32s cubic-bezier(.32,.72,0,1), opacity .22s ease }
.mm-panneau.mm-ouvert{ opacity:1; transform:none }
.mm-panneau[hidden]{ display:none }

.mm-tete{ display:flex; align-items:center; justify-content:space-between; margin-bottom:16px }
.mm-titre{ font-size:12px; font-weight:900; letter-spacing:.16em; text-transform:uppercase;
  color:var(--gold,#EFC983) }
.mm-fermer{ width:42px; height:42px; display:grid; place-items:center; cursor:pointer;
  background:transparent; border:1px solid var(--line-2,rgba(255,255,255,.14)); border-radius:12px;
  color:var(--white,#F5F6FF) }
.mm-fermer svg{ width:22px; height:22px }
.mm-fermer:hover{ border-color:var(--gold,#EFC983) }

.mm-liste{ list-style:none; margin:0; padding:0; display:grid; gap:8px }
.mm-item{ opacity:0; transform:translateY(10px);
  transition:opacity .26s ease, transform .3s cubic-bezier(.32,.72,0,1);
  transition-delay:calc(var(--i,0) * 30ms + 60ms) }
.mm-panneau.mm-ouvert .mm-item{ opacity:1; transform:none }
.mm-item > a{ display:flex; align-items:center; gap:13px; min-height:62px; padding:10px 14px;
  border-radius:16px; text-decoration:none;
  background:rgba(245,246,255,.045); border:1px solid var(--line,rgba(255,255,255,.09)) }
.mm-item > a:hover,.mm-item > a:focus-visible{ background:rgba(245,246,255,.075);
  border-color:color-mix(in srgb,var(--fc,#8FB2FF) 45%,transparent) }
.mm-ico{ flex:none; width:44px; height:44px; border-radius:13px; display:grid; place-items:center;
  background:color-mix(in srgb,var(--fc,#8FB2FF) 15%,transparent);
  border:1px solid color-mix(in srgb,var(--fc,#8FB2FF) 32%,transparent) }
.mm-ico svg{ width:26px; height:26px }
.mm-txt{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px }
.mm-txt b{ font-size:16.5px; font-weight:900; color:var(--white,#F5F6FF); line-height:1.2 }
.mm-txt i{ font-style:normal; font-size:12.5px; color:var(--muted,#AEB6D9) }
.mm-fleche{ flex:none; font-size:17px; color:var(--fc,#8FB2FF); opacity:.85 }

.mm-toutes{ display:block; margin-top:14px; padding:14px; border-radius:15px; text-align:center;
  font-weight:900; font-size:15px; text-decoration:none; color:#241a00;
  background:linear-gradient(180deg,#ffe1a0,var(--gold,#EFC983)) }
.mm-pied{ display:flex; flex-wrap:wrap; gap:10px 22px; justify-content:center; margin-top:22px;
  padding-top:18px; border-top:1px solid var(--line,rgba(255,255,255,.09)) }
.mm-pied a{ font-size:13.5px; font-weight:800; color:var(--muted,#AEB6D9); text-decoration:none }
.mm-pied a:hover{ color:var(--white,#F5F6FF) }

@media (prefers-reduced-motion: reduce){
  .mm-panneau{ transform:none; transition:opacity .12s linear }
  .mm-item{ transform:none; transition:opacity .12s linear; transition-delay:0s }
  .mm-bars i{ transition:none }
}

/* — Place pour le déclencheur du menu (25/07/2026) —
   Le burger ajoute 42 px + son espace à la rangée du bandeau. Mesuré : sous 460 px, la
   rangée ne peut plus contenir marque + loupe + profil + burger + bouton, et « Commencer »
   sortait de l'écran de 20 px à 390 px, de 30 px à 360 px.
   On retire la LOUPE, et pas le bouton : elle fait déjà doublon avec le champ de recherche
   du héros (doublon relevé de longue date dans la note de fin de `site.js`), alors que le
   bouton d'action est la seule porte d'entrée visible vers les quiz.
   Vérifié à 320, 360, 375, 390, 414, 430, 450, 460, 470, 500, 560, 620, 700 et 880 px :
   0 débordement partout. */
@media (max-width:459px){
  header .nav .hdr-search{ display:none !important }
}

/* — La rangée de pastilles disparaît quand le menu plein écran est là (25/07/2026) —
   Mesuré à 390 px : le bandeau fait 121 px, dont 54 px pour cette seule rangée — 45 % du
   bandeau, et il est collant, donc 14 % de l'écran mangés en permanence au défilement.
   Or les 4 liens y sont TOUS redondants : Blog, Pro et « Laisser un avis » sont dans le pied
   du panneau, et « Certifications » y a un bouton doré à elle, en plus des 8 métiers.

   ⚠️ Conditionné à `.mm-actif`, posé par `site.js` UNIQUEMENT si le panneau s'est construit.
   Sans JavaScript, ou si le script casse avant, les pastilles restent : le visiteur ne se
   retrouve jamais sans navigation. */
@media (max-width:880px){
  .mm-actif header .mnav{ display:none !important }
}

/* ==========================================================================
   CIBLES TACTILES — 44 px sous le doigt (mesuré le 26/07/2026)
   Mesure à 375 px de large, dans une iframe (le volet n'est jamais figé) :
   59 éléments interactifs sous 44 px sur l'accueil. Ce bloc traite les
   COMPOSANTS PARTAGÉS, donc les 21 pages vitrine à la fois ; la section
   « index du site » est propre à l'accueil et se règle dans son <style>.

   ⚠️ Ce qui n'est PAS corrigé, et pourquoi. Cinq liens sont DANS une phrase
   (« ou parcours le catalogue », « laisser un avis », « Choisir ma
   certification »…). WCAG 2.5.8 les exclut explicitement — les agrandir
   casserait l'interligne du paragraphe pour rien. Le `.skip-link` fait
   1 × 1 px tant qu'il n'a pas le focus : c'est sa raison d'être.

   ⚠️ Seuil à 880 px, celui qui commande déjà le pied de page replié et le
   menu plein écran. Un `pointer:coarse` serait plus juste en théorie, mais
   le mobile se teste ici en redimensionnant la fenêtre, où il ne s'applique
   pas : la règle serait invisible au test comme à l'usage.
   ========================================================================== */
@media(max-width:880px){
  /* (la règle `.hd-chip` qui était ici est partie avec la rangée du héros, le 27/07) */

  /* Liens des colonnes repliées du pied de page — 37 px. */
  .f-fold li a{ display:flex; align-items:center; min-height:44px; }

  /* Bouton du menu — 42 px, à 2 px du compte. */
  .mm-btn{ width:44px; height:44px; }

  /* Le logo est un lien de retour à l'accueil — 32 px de haut.
     ⚠️ `.brand` est déclaré dans le <style> inline des 21 pages, chargé APRÈS
     cette feuille : une règle `.brand` d'ici perdrait. `header .brand` passe
     par la spécificité, et `min-height` n'est déclaré nulle part ailleurs. */
  header .brand{ min-height:44px; }
}

/* ==========================================================================
   PAGE DE DOMAINE — « Voir plus » sous le chapô (27/07/2026)
   Le chapô tient en deux lignes : c'est bien pour qui a déjà décidé, trop court
   pour qui découvre le domaine. Le texte long est dans le DOM dès le départ,
   simplement replié — donc indexable et accessible au clavier même fermé.
   Le texte lui-même vit dans js/certs.js (CERT_DOM_TEXTE), une seule fois pour
   les 8 pages : une description recopiée huit fois dérive, c'est ce qui était
   arrivé aux chiffres.

   ⚠️ `.dom-band` n'existe plus dans le markup. Ses règles restaient déclarées à
   DEUX endroits de cette feuille (un `display:none` du 20/07, puis un bloc plus
   tardif qui le contredisait et la faisait revenir). Les deux sont retirés.
   ========================================================================== */
.dom-plus{
  display:inline-flex; align-items:center; gap:6px;
  margin:10px 0 0; padding:8px 14px;
  background:transparent; cursor:pointer;
  border:1px solid var(--line-2,rgba(255,255,255,.14)); border-radius:999px;
  font:inherit; font-size:13px; font-weight:800; color:var(--blue-l,#8FB2FF);
  transition:border-color .16s ease, background .16s ease, color .16s ease;
}
.dom-plus::after{
  content:""; width:6px; height:6px; flex:none; margin-left:1px;
  border-right:2px solid currentColor; border-bottom:2px solid currentColor;
  transform:translateY(-1px) rotate(45deg); transition:transform .2s ease;
}
.dom-plus[aria-expanded="true"]::after{ transform:translateY(1px) rotate(-135deg); }
.dom-plus:hover{
  color:var(--white,#F5F6FF);
  border-color:color-mix(in srgb,var(--blue,#5C86E0) 55%,transparent);
  background:color-mix(in srgb,var(--blue,#5C86E0) 12%,transparent);
}
.dom-plus:focus-visible{ outline:2px solid var(--blue-l,#8FB2FF); outline-offset:2px; }
.dom-long{
  margin:12px 0 0; max-width:62ch;
  font-size:14.5px; line-height:1.62; color:var(--muted,#AEB6D9);
  max-height:4.9em;                      /* ≈ 3 lignes, puis ça s'estompe */
  overflow:hidden;
  -webkit-mask-image:linear-gradient(180deg,#000 52%,transparent 100%);
          mask-image:linear-gradient(180deg,#000 52%,transparent 100%);
  transition:max-height .3s ease;
}
.dom-long.dom-long--ouvert{
  max-height:60em;
  -webkit-mask-image:none; mask-image:none;
}
/* Sans JS, l'extrait resterait tronqué sans moyen de l'ouvrir : on montre tout. */
.no-js .dom-long{ max-height:none; -webkit-mask-image:none; mask-image:none; }
@media(max-width:880px){
  .dom-plus{ min-height:44px; }          /* même règle des 44 px que le reste du site */
  .dom-long{ font-size:14px; max-height:5.6em; }
}

/* ==========================================================================
   EN-TÊTE — moins froid (27/07/2026)
   Retour : « un peu froid le tout ». Le diagnostic tient en trois points :
   un aplat unique sans profondeur, un filet gris pur, et aucune trace de la
   lumière chaude qui porte toute l'identité (la lanterne du phare, le doré).

   On ne change ni la structure, ni les libellés, ni la hauteur. On ajoute de
   la profondeur (dégradé vertical très court) et UNE trace chaude : le filet
   du bas passe du gris neutre à un doré très dilué, et une lueur ambrée
   traverse le bas de la barre en s'éteignant sur les côtés.

   ⚠️ `header{…}` est déclaré dans le <style> INLINE des 21 pages, chargé APRÈS
   cette feuille : une règle `header` d'ici perdrait. `body > header` passe par
   la spécificité (0,0,2 contre 0,0,1) — c'est le piège n°2 du projet.
   ========================================================================== */
body > header{
  background:
    linear-gradient(180deg, rgba(30,38,72,.90) 0%, rgba(20,26,51,.86) 100%);
  border-bottom-color:rgba(255,243,214,.11);
}
/* 27/07 — la barre doree sous l'en-tete est retiree : elle ajoutait une ligne
   d'accent la ou il n'y a pas d'accent ailleurs. Le degrade vertical et le filet
   legerement chaud suffisent a rechauffer la barre. */
/* le champ de recherche était le point le plus dur de la barre */
body > header .hdr-search input,
body > header .hsearch-field{
  background:rgba(33,42,77,.62);
  border-color:rgba(255,243,214,.13);
}
/* les liens de navigation gagnent un peu de présence sans changer de taille */
body > header .hnav a{ color:color-mix(in srgb, var(--white,#F5F6FF) 62%, var(--muted,#AEB6D9)); }
body > header .hnav a:hover, body > header .hnav a.on{ color:var(--white,#F5F6FF); }

/* ===== 27/07/2026 — deux défauts vus à l'écran ==============================
   1. LA LISTE DE RECHERCHE ÉTAIT DÉCOUPÉE, pas cachée derrière. #hero-pop est
      en position:absolute avec z-index 30, mais son ancêtre .hero porte
      overflow:hidden — aucun z-index ne passe au travers d'un clip. On ouvre
      le hero UNIQUEMENT pendant que la liste est déployée, pour que la
      découpe continue de retenir le décor le reste du temps. Mesuré à 375 et
      à 1280 px : aucun débordement horizontal, hauteur de page inchangée.
   2. LA COLONNE DE DROITE DES PAGES DE DOMAINE. .dom-top .dom-stats est
      déclarée HUIT fois dans cette feuille, dont quatre au-delà de 881 px
      avec des valeurs contradictoires : deux posent grid-row:1 / span 2 et
      align-self:center, deux les annulent avec grid-row:1 et align-self:start.
      La dernière gagnait, d'où 351 px de vide sous les trois cartes. On tranche
      une fois pour toutes, en gardant l'intention exprimée deux fois. */
.hero:has(#hero-pop:not([hidden])){overflow:visible}
@media(min-width:881px){
  .dom-top .dom-stats{grid-column:2;grid-row:1 / span 2;align-self:center;flex-direction:column;flex-wrap:nowrap;gap:16px;margin:0;max-width:none}
}

/* ===== 27/07/2026 — passe d'audit : contrastes et troncatures ===============
   Mesuré page par page et largeur par largeur (375 / 768 / 1146).
   · --dim n'était déclaré NULLE PART : tout le monde tombait sur la valeur de
     repli #7A83A8, qui donne 4,1 sur le fond du site. On le déclare, une fois.
   · les valeurs des cartes de domaine étaient en white-space:nowrap : à 375 px
     « 1 177 questions » se faisait couper. Elles peuvent revenir à la ligne.
   · idem pour le libellé de certification du tableau de bord /pro/. */
:root{--dim:#8E97BC}
@media(max-width:560px){
  .dom-stats b,.dom-top .dom-stats b{white-space:normal}
  .dash-cert{white-space:normal;overflow:visible;text-overflow:clip}
}
