/* =========================================================================
   doMind — www.domind.ch — VERSION 3 « papier »
   Prototype de direction artistique : plus chaleureuse, plus organique,
   plus humaine. Référence d'ambiance : therapyin.london (fond papier,
   collage, marques dessinées à la main, formes très arrondies).

   Le parti pris central, et il est arbitré, pas subi :
   la page alterne DEUX registres.

   · les sections de RÉCIT (hero, constat, obstacles, piliers, pour qui,
     contact) portent le papier, le grain, les inclinaisons, les traits
     tracés à la main. C'est là qu'on parle de personnes ;
   · les sections de PREUVE (science, champ clinique, institutions,
     recherche) refusent tout cela : lignes droites, aucun décor, aucune
     rotation. C'est là qu'on parle à un chef de service.

   La classe `.sobre` marque le second registre. Ne pas la retirer d'une
   section sans se demander à qui cette section s'adresse.

   Aucune dépendance externe : ni police, ni script, ni CDN. Aucun cookie.
   ========================================================================= */

/* ---------- 0. Polices — auto-hébergées, aucune requête tierce ----------
   Reprises telles quelles de la version 2 : deux fichiers variables sous
   licence SIL OFL. Le serif n'existe qu'en italique, et c'est voulu —
   il ne sert qu'à la voix (citations, mots mis en avant dans les titres),
   jamais au texte courant. */
@font-face {
  font-family: 'Inter Tight';
  src: url('/assets/fonts/inter-tight-var.woff2') format('woff2');
  font-weight: 400 800;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Source Serif 4';
  src: url('/assets/fonts/source-serif-4-italic-var.woff2') format('woff2');
  font-weight: 400 600;
  font-style: italic;
  font-display: swap;
}
/* Repli aux métriques ajustées : le texte ne saute pas au moment du swap. */
@font-face {
  font-family: 'Inter Tight repli';
  src: local('Arial'), local('Helvetica Neue'), local('Helvetica');
  size-adjust: 105.3%;
  ascent-override: 92%;
  descent-override: 22.9%;
  line-gap-override: 0%;
}

/* =========================================================================
   1. Jetons
   Deux familles, et la distinction commande le mode sombre :
   · les jetons de MARQUE (--teal, --ocre, --pale…) ne bougent jamais ;
   · les jetons SÉMANTIQUES (--page, --surface, --texte…) sont redéfinis
     par thème. Ce sont eux, et eux seuls, que les règles utilisent.
   ========================================================================= */
:root {
  /* --- marque, invariable --- */
  --teal:        #4A86A0;   /* bleu-canard du Brand Kit */
  --teal-fonce:  #2C566C;
  --teal-nuit:   #17323F;   /* le navy réchauffé : moins bleu, plus profond */
  --teal-abysse: #102530;
  --pale:        #A9CDDE;
  --pale-doux:   #DCEAF1;
  --ocre:        #D99A55;   /* aplats, filets, traits dessinés */
  --ocre-texte:  #8A6200;   /* petit texte : l'or clair ne tient pas le 4,5:1 */
  /* Les CHIFFRES — romains des piliers, nombres du constat, numéros des
     cartes science. Un doré nettement plus chaud que --ocre-texte, donc
     plus proche de l'accent des dessins, et qui tient 3,8:1 sur le
     papier : conforme aux grands caractères. Volontairement distinct de
     --ocre-texte, qui reste seul admis pour le petit texte d'interface
     (pastilles de surtitre, sélecteur de langue) où 4,5:1 s'impose. */
  --ocre-chiffre: #A9691F;
  --encre:       #1E272C;
  --encre-douce: #56605F;

  /* --- sémantique, thème clair ---
     Le fond n'est plus blanc mais un papier chaud. Tout le reste en
     découle : les cartes remontent en clair au lieu de descendre en gris,
     et les bordures se réchauffent pour ne pas trancher. */
  --page:          #F3EEE4;
  --surface:       #FCFAF5;   /* cartes, encarts : plus clair que la page */
  --surface-alt:   #EAE3D6;   /* bandes tièdes */
  --surface-nuit:  #17323F;
  --surface-abysse:#102530;
  --sur-nuit:      #F5F1E8;
  --texte:         #1E272C;
  --texte-doux:    #56605F;
  --texte-lien:    #2C566C;
  --texte-lien-actif: #1B3C4C;
  --bordure:       #D9CFBD;
  --bordure-douce: #E5DDCE;
  --teinte:        #E7EEF1;   /* encarts bleutés, très lavés */
  --teinte-chaude: #F6E8D6;   /* encarts ocre */
  --ombre:         rgba(70, 55, 35, .14);
  --ombre-portee:  rgba(70, 55, 35, .10);
  --grain-force:   .5;

  /* Habillage d'une photographie : ne s'inverse pas avec le thème. */
  --voile-photo:     rgba(243, 238, 228, .58);
  --texte-sur-photo: #1E272C;

  --font-sans: "Inter Tight", "Inter Tight repli", -apple-system,
               BlinkMacSystemFont, "Helvetica Neue", "Segoe UI", Roboto,
               Arial, sans-serif;
  --font-serif: "Source Serif 4", Georgia, "Iowan Old Style",
                "Times New Roman", serif;

  --wrap:   1160px;
  --gutter: clamp(20px, 5vw, 48px);
  --section-y-top: clamp(40px, 5vw, 88px);
  --section-y-bot: clamp(40px, 5vw, 88px);

  /* Rayons. La version 2 assumait 0px (« parti pris typographique
     suisse »). Ce parti pris est ici explicitement abandonné : c'est le
     levier le plus économique pour passer de clinique à chaleureux. */
  --r1:   14px;
  --r2:   26px;
  --r3:   44px;
  --pill: 999px;
  /* Rayon « à main levée » : les quatre coins diffèrent. Réservé aux
     cartes de récit — jamais dans les sections sobres, où il ferait
     décoratif au mauvais endroit. */
  --r-main: 40px 16px 38px 20px;

  /* Réglages de confort, pilotés par le panneau d'accessibilité.
     Valeurs neutres par défaut : sans JavaScript, rien ne change. */
  --echelle-texte: 1;
  --interligne:    1.62;
  --interlettre:   0em;
  --intermot:      0em;
}

/* ---------- 1bis. Thème sombre ----------
   Ce n'est pas une inversion : c'est le même papier vu de nuit. Les
   surfaces virent au brun-nuit chaud et non au gris bleu, sinon toute la
   chaleur gagnée en clair disparaît dès qu'on bascule.
   Le sélecteur `:not([data-theme="clair"])` est indispensable — sans lui,
   un visiteur en système sombre ne pourrait plus forcer le thème clair. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="clair"]) {
    --page:          #1A1714;
    --surface:       #241F1A;
    --surface-alt:   #201B17;
    --surface-nuit:  #14262F;
    --surface-abysse:#0D1C24;
    --sur-nuit:      #F0EADF;
    --texte:         #EFE8DC;
    --texte-doux:    #B5AB9C;
    --texte-lien:    #9CC8DC;
    --texte-lien-actif: #C4E0EE;
    --bordure:       #3A332B;
    --bordure-douce: #2E2822;
    --teinte:        #1D2A31;
    --teinte-chaude: #2B2318;
    --ombre:         rgba(0, 0, 0, .5);
    --ombre-portee:  rgba(0, 0, 0, .42);
    --grain-force:   .22;
    /* l'or foncé disparaîtrait sur fond sombre : c'est l'or clair qui
       porte le texte, l'inverse exact du thème clair */
    --ocre-texte:    #E8B876;
    --ocre-chiffre:  #E8B876;
    --voile-photo:     rgba(26, 23, 20, .68);
    --texte-sur-photo: #EFE8DC;
  }
}
:root[data-theme="sombre"] {
  --page:          #1A1714;
  --surface:       #241F1A;
  --surface-alt:   #201B17;
  --surface-nuit:  #14262F;
  --surface-abysse:#0D1C24;
  --sur-nuit:      #F0EADF;
  --texte:         #EFE8DC;
  --texte-doux:    #B5AB9C;
  --texte-lien:    #9CC8DC;
  --texte-lien-actif: #C4E0EE;
  --bordure:       #3A332B;
  --bordure-douce: #2E2822;
  --teinte:        #1D2A31;
  --teinte-chaude: #2B2318;
  --ombre:         rgba(0, 0, 0, .5);
  --ombre-portee:  rgba(0, 0, 0, .42);
  --grain-force:   .22;
  --ocre-texte:    #E8B876;
  --ocre-chiffre:  #E8B876;
  --voile-photo:     rgba(26, 23, 20, .68);
  --texte-sur-photo: #EFE8DC;
}

/* ---------- 1ter. Réglages de confort de lecture ---------- */
:root[data-taille="grand"]      { --echelle-texte: 1.12; }
:root[data-taille="tres-grand"] { --echelle-texte: 1.25; }
/* Valeurs de WCAG 1.4.12 « Text Spacing » : la norme exige de les
   supporter sans perte de contenu ; ici on les propose directement. */
:root[data-espacement="large"] {
  --interligne:  1.85;
  --interlettre: .045em;
  --intermot:    .12em;
}

/* =========================================================================
   2. Base
   ========================================================================= */
*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0;
  font-family: var(--font-sans);
  /* calc() et non une valeur fixe : le panneau d'accessibilité agit sur
     --echelle-texte, et tout le reste étant en rem/em, la page entière
     suit sans qu'aucune autre règle ait à être touchée. */
  /* §G.3 : corps 17→19 px — argument d'accessibilité assumé, cohérent
     avec le panneau de réglages. L'échelle du panneau multiplie toujours. */
  font-size: calc(clamp(1.0625rem, 1rem + .4vw, 1.1875rem) * var(--echelle-texte));
  line-height: var(--interligne);
  letter-spacing: var(--interlettre);
  word-spacing: var(--intermot);
  color: var(--texte);
  background: var(--page);
  -webkit-font-smoothing: antialiased;
  text-wrap: pretty;
  /* les pièces hors-champ débordent volontairement du cadre (§A′) */
  overflow-x: clip;
}

/* Grain de papier sur toute la page.
   Une turbulence SVG en couche fixe, posée en `multiply` : elle assombrit
   légèrement et irrégulièrement, comme une fibre. `pointer-events: none` :
   elle n'existe que pour l'œil. En thème sombre son opacité tombe de plus
   de moitié — le même grain sur fond noir se lit comme du bruit vidéo. */
body::before {
  content: "";
  position: fixed; inset: 0; z-index: 1;
  pointer-events: none;
  opacity: var(--grain-force);
  mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23g)' opacity='.32'/%3E%3C/svg%3E");
}
/* Tout le contenu passe au-dessus du grain. Un seul point d'entrée : si
   un élément se retrouvait sous la couche, c'est ici qu'il faut regarder. */
body > * { position: relative; z-index: 2; }

h1, h2, h3, h4 { margin: 0; line-height: 1.14; font-weight: 800; letter-spacing: -0.02em; }
p { margin: 0 0 1.05em; }
p:last-child { margin-bottom: 0; }
ul { margin: 0; padding: 0; list-style: none; }
img, svg { max-width: 100%; }
img { height: auto; }

/* `balance` égalise les longueurs de ligne — coûteux, donc réservé aux
   titres et blocs courts. `pretty` (hérité de body) ne corrige que la
   dernière ligne, ce qu'il faut pour du texte courant. */
h1, h2, h3, h4, .lede, .tool-item p, .pillar p, .card p { text-wrap: balance; }
.nomenclature li, .sources li, .ref { text-wrap: wrap; }

a { color: var(--texte-lien); text-underline-offset: 3px; text-decoration-thickness: 1px; }
a:hover { color: var(--texte-lien-actif); }

:focus-visible { outline: 3px solid var(--teal); outline-offset: 3px; }
.on-dark :focus-visible, .site-footer :focus-visible { outline-color: var(--pale); }

.wrap { width: 100%; max-width: var(--wrap); margin-inline: auto; padding-inline: var(--gutter); }

.skip-link {
  position: absolute; left: 12px; top: -100px; z-index: 200;
  background: var(--surface); color: var(--texte-lien);
  padding: 12px 20px; font-weight: 700; border-radius: var(--pill);
  transition: top .15s ease;
}
.skip-link:focus { top: 12px; }

/* =========================================================================
   3. Le vocabulaire « fait main »
   Trois objets seulement, réutilisés partout. En ajouter un quatrième
   demande de se poser la question : est-ce que ça dit quelque chose, ou
   est-ce que c'est de la décoration ?
   ========================================================================= */

/* 3a. Le trait tracé sous un mot.
   Deux passes de crayon légèrement décalées — une seule courbe lit comme
   un soulignement vectoriel, deux lisent comme un geste. Le SVG déborde
   volontairement du mot, et `overflow: visible` le laisse dépasser. */
.souligne { position: relative; display: inline-block; }
.souligne > svg {
  position: absolute; left: -3%; bottom: -.30em;
  width: 106%; height: .46em; overflow: visible;
  color: var(--ocre); pointer-events: none;
}
.on-dark .souligne > svg { color: var(--pale); }

/* 3b. Le ruban adhésif. Un rectangle translucide en travers d'un coin :
   c'est ce qui fait lire une image comme posée et non comme intégrée. */
.scotch { position: relative; }
.scotch::after {
  content: ""; position: absolute; z-index: 3;
  top: -14px; left: 50%;
  width: clamp(74px, 9vw, 118px); height: 30px;
  translate: -50% 0; rotate: -3.5deg;
  background: linear-gradient(160deg, rgba(217,154,85,.45), rgba(217,154,85,.28));
  border-left: 1px solid rgba(255,255,255,.35);
  border-right: 1px solid rgba(255,255,255,.2);
  pointer-events: none;
}
.scotch--gauche::after { left: 14%; rotate: -8deg; }

/* 3c. L'inclinaison. Trois valeurs seulement, choisies pour rester en
   deçà du seuil où l'œil lit « bug de mise en page ». Neutralisées sous
   700 px : sur une colonne unique, des blocs de guingois se chevauchent
   et coûtent de la place. */
.tilt-a { rotate: -1.1deg; }
.tilt-b { rotate:  1.4deg; }
.tilt-c { rotate: -0.6deg; }
@media (max-width: 700px) {
  .tilt-a, .tilt-b, .tilt-c { rotate: none; }
}

/* =========================================================================
   3bis. Les illustrations à l'encre (série livrée le 05.08)
   Un SVG inline par pièce, deux calques :
   · .croquis__trait  — l'encre : suit le thème (encre le jour, pâle la
     nuit). C'est la raison pour laquelle ces SVG sont INLINE et non en
     <img> : un fichier externe ne verrait pas les variables de la page ;
   · .croquis__accent — l'ocre : stable dans les deux thèmes, comme tous
     les ocres de la marque.
   La vectorisation d'un trait produit des contours REMPLIS : c'est fill
   qu'on pilote ici, jamais stroke.
   ========================================================================= */
.croquis { display: block; width: 100%; height: auto; }
.croquis__trait  { fill: var(--texte); }
.croquis__accent { fill: var(--ocre); }
.on-dark .croquis__trait, .section--nuit .croquis__trait { fill: var(--pale); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="clair"]) .croquis__trait { fill: var(--pale); }
}
:root[data-theme="sombre"] .croquis__trait { fill: var(--pale); }

/* Zone d'illustration en tête de carte (les trois obstacles). Alignée au
   bas : les pièces ont des proportions très différentes (le fichier est
   presque carré, les bâtiments sont panoramiques), la ligne de sol
   commune est ce qui les fait cohabiter. */
.card__croquis {
  height: clamp(110px, 13vw, 150px);
  margin-bottom: 1.2rem;
  display: flex; align-items: flex-end;
  /* centrées dans la carte (retour propriétaire du 05.08) ; la ligne de
     sol commune reste portée par l'alignement bas */
  justify-content: center;
}
.card__croquis .croquis { width: auto; max-width: 100%; max-height: 100%; }

/* Illustrations en HORS-CHAMP (corrections 3ᵉ passe, §A′ — remplace les
   « marges » de la 2ᵉ passe, dont les 160–300 px produisaient des
   timbres-poste : le trait au pinceau a besoin d'échelle, à 200 px il
   meurt). Le principe : des pièces grandes (360–640 px), croquées par le
   bord de l'écran, posées DERRIÈRE le plan de contenu (z-index 0 contre
   1 pour le .wrap).

   · le côté suit la zone vide réelle de la section, pas une alternance
     mécanique ;
   · pleine opacité dans une zone vide ; le traitement --fantome (0.4)
     est réservé au passage sous du contenu — deux sections MAXIMUM sur
     la page (aujourd'hui : une seule, la table du contact) ;
   · < 1200 px : disparition pure. Le hors-champ ne coûte jamais de place
     au flux, les SVG sont aria-hidden — rien n'est perdu. */
@media (min-width: 1200px) {
  .horschamp {
    position: absolute; z-index: 0;
    width: clamp(360px, 34vw, 640px);
    top: clamp(40px, 6vw, 110px);
    pointer-events: none;
  }
  .horschamp--droite { right: clamp(-160px, -8vw, -60px); }
  .horschamp--gauche { left:  clamp(-160px, -8vw, -60px); }
  /* variante « croquée » : ~10 % de la pièce sort du cadre (retour
     propriétaire — 35 % en cachait trop) */
  .horschamp--croque { right: calc(clamp(360px, 34vw, 640px) * -0.1); }
  /* variante « entière » : la pièce reste dans le cadre, plus petite —
     demandée pour la courbe (une courbe de récupération coupée par le
     bord racontait le contraire de ce qu'elle montre). */
  .horschamp--entier {
    width: clamp(260px, 24vw, 440px);
    right: clamp(20px, 3vw, 64px);
  }
  /* la même, côté gauche (la table du contact) */
  .horschamp--entier.horschamp--gauche {
    left: clamp(20px, 3vw, 64px);
    right: auto;
  }
  /* seul cas autorisé à passer sous du texte */
  .horschamp--fantome { opacity: .4; }
  .section > .wrap, .final > .wrap { position: relative; z-index: 1; }
  /* récit : de travers ; la garantie .sobre redresse, comme partout */
  .horschamp { rotate: -2.5deg; }
  .sobre .horschamp { rotate: none; }
}
@media (max-width: 1199px) { .horschamp { display: none; } }

/* =========================================================================
   4. Éléments de marque et titres
   ========================================================================= */
.brand { display: inline-flex; align-items: center; gap: .6em; text-decoration: none; color: inherit; }
/* :hover reste à `inherit` — sinon la règle générique `a:hover` repeint
   le mot « doMind » et le rend illisible sur les fonds sombres. */
.brand:hover, .brand:focus-visible { color: inherit; opacity: .82; }
.brand { transition: opacity .2s ease; }
.brand__mark { width: 2.35em; height: auto; flex: none;
  /* couleur du mark en currentColor (header et section contact, fonds
     papier) : navy le jour, bleu pâle la nuit. Le footer référence le
     symbole en dégradé et ignore cette couleur. */
  color: var(--texte-lien);
}
.brand__name { font-size: 1.35rem; font-weight: 800; letter-spacing: -0.035em; }

/* Le surtitre. Plus une étiquette technique alignée sur un filet, mais
   une petite pastille : c'est la forme, pas le texte, qui a changé. */
.kicker {
  display: inline-flex; align-items: center; gap: .6em;
  margin: 0 0 1.2rem;
  padding: .42em 1.05em;
  background: var(--teinte-chaude); color: var(--ocre-texte);
  border-radius: var(--pill);
  font-size: .75rem; font-weight: 700; letter-spacing: .12em;
  text-transform: uppercase;
}
.on-dark .kicker { background: rgba(255,255,255,.14); color: var(--pale); }

.section-title { font-size: clamp(1.9rem, 1.15rem + 2.8vw, 3.15rem); }
/* Le mot mis en avant passe au serif italique. C'est le seul usage du
   serif hors citation, et c'est ce qui met de la voix dans un titre sans
   ajouter ni couleur ni graisse. */
.section-title .voix {
  font-family: var(--font-serif); font-style: italic;
  font-weight: 500; letter-spacing: -0.005em;
}
.section-title .soft { color: var(--texte-lien); font-weight: 700; }
.on-dark .section-title .soft { color: var(--pale); }

.lede {
  font-size: clamp(1.125rem, 1.05rem + .5vw, 1.375rem);   /* §G.3 : +1 cran */
  line-height: 1.6; color: var(--texte-doux);
}
.on-dark .lede { color: rgba(255,255,255,.85); }

.subhead {
  font-size: .78rem; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: var(--texte-lien); margin-bottom: 1.4rem;
}
.grid-note { margin-top: 1.3rem; font-size: .95rem; color: var(--texte-doux); }

/* =========================================================================
   5. Boutons — tous en gélule, sans exception
   L'ombre est un aplat décalé vers le bas (0 6px 0) et non un flou : sur
   un fond papier, une ombre floue fait « carte de composant », un aplat
   fait « objet posé ».
   ========================================================================= */
.btn {
  display: inline-flex; align-items: center; gap: .6em;
  padding: .95em 1.75em;
  font-family: inherit; font-size: 1rem; font-weight: 700;
  line-height: 1.2; text-decoration: none;
  border: 2px solid transparent; border-radius: var(--pill);
  cursor: pointer;
  transition: background-color .18s ease, color .18s ease,
              border-color .18s ease, transform .18s ease, box-shadow .18s ease;
}
.btn:hover { transform: translateY(-2px); }

.btn--primary { background: var(--teal-nuit); color: #FFFFFF; box-shadow: 0 5px 0 rgba(23,50,63,.28); }
.btn--primary:hover { background: var(--teal-abysse); color: #FFFFFF; box-shadow: 0 7px 0 rgba(23,50,63,.28); }

.btn--light { background: var(--surface); color: var(--teal-nuit); box-shadow: 0 5px 0 var(--ombre-portee); }
.btn--light:hover { background: #FFFFFF; color: var(--teal-abysse); box-shadow: 0 7px 0 var(--ombre-portee); }

/* Contour épais et rien à l'intérieur : le second choix doit se voir
   comme un second choix, pas comme un bouton fantôme illisible. */
.btn--outline { background: transparent; color: var(--texte-lien); border-color: var(--teal); }
.btn--outline:hover { background: var(--teinte); color: var(--texte-lien-actif); border-color: var(--teal-fonce); }

.btn--ghost { background: transparent; color: #FFFFFF; border-color: rgba(255,255,255,.55); }
.btn--ghost:hover { background: rgba(255,255,255,.14); color: #FFFFFF; border-color: #FFFFFF; }

.btn__arrow { font-size: 1.1em; line-height: 1; transition: transform .2s ease; }
.btn:hover .btn__arrow { transform: translateX(4px); }

/* En thème sombre, le bouton principal ne peut pas rester en --teal-nuit :
   mesuré sur le fond de page nocturne, l'écart entre le bouton et la page
   tombe à 1,2:1 et le seul appel à l'action de la page disparaît dans le
   décor. Il s'inverse donc — clair sur sombre. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="clair"]) .btn--primary {
    background: var(--pale); color: var(--teal-abysse); box-shadow: 0 5px 0 rgba(0,0,0,.45);
  }
  :root:not([data-theme="clair"]) .btn--primary:hover {
    background: #C4E0EE; color: var(--teal-abysse); box-shadow: 0 7px 0 rgba(0,0,0,.45);
  }
}
:root[data-theme="sombre"] .btn--primary {
  background: var(--pale); color: var(--teal-abysse); box-shadow: 0 5px 0 rgba(0,0,0,.45);
}
:root[data-theme="sombre"] .btn--primary:hover {
  background: #C4E0EE; color: var(--teal-abysse); box-shadow: 0 7px 0 rgba(0,0,0,.45);
}

/* =========================================================================
   6. En-tête
   Il n'est plus navy : une barre de papier translucide, qui laisse
   deviner la page derrière elle. C'est le premier signal du changement
   de registre, avant même le titre.
   ========================================================================= */
.site-header {
  position: sticky; top: 0; z-index: 100;
  background: color-mix(in srgb, var(--page) 86%, transparent);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--bordure-douce);
}
/* Repli pour les navigateurs sans color-mix : un fond plein, opaque. */
@supports not (background: color-mix(in srgb, red 50%, blue)) {
  .site-header { background: var(--page); }
}
.site-header__inner {
  display: flex; align-items: center; justify-content: space-between; gap: 1.5rem;
  min-height: 72px; padding-block: .6rem;
}
/* La barre n'est pas de la prose : elle n'a pas à respecter la mesure de
   lecture. Sans cela, le bouton d'accessibilité déborde dans la gouttière. */
.site-header .wrap { max-width: none; }
.site-header .brand__name { font-size: 1.22rem; }
.site-header .brand__mark { width: 2.15em; }
.site-header a:not(.btn) { color: var(--texte); text-decoration: none; }

.nav { display: flex; align-items: center; gap: clamp(.5rem, 1.1vw, 1.15rem); margin-left: auto; }
.nav a {
  position: relative;
  font-size: .875rem; font-weight: 600;
  padding: .4em .1em;
  white-space: nowrap;   /* les libellés espagnols cassaient la barre en deux */
}
/* Le soulignement de survol est un trait posé, pas une bordure : même
   geste que sous les mots des titres, à plus petite échelle. */
.nav a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: .05em; height: 3px;
  border-radius: var(--pill); background: var(--ocre);
  transform: scaleX(0); transform-origin: left;
  transition: transform .2s ease;
}
.nav a:hover::after, .nav a:focus-visible::after, .nav a.is-current::after { transform: scaleX(1); }
.nav .btn { padding: .62em 1.2em; font-size: .875rem; }
.nav .btn::after { display: none; }

.nav-toggle {
  display: none; align-items: center; justify-content: center; gap: .5em;
  min-height: 44px; min-width: 44px;      /* cible tactile confortable */
  background: transparent; border: 1px solid var(--bordure); border-radius: var(--pill);
  color: var(--texte); font: inherit; font-size: .85rem; font-weight: 600;
  padding: .55em 1em; cursor: pointer;
}
.nav-toggle:hover { background: var(--surface); }
.nav-toggle__bars { display: block; width: 17px; height: 9px; position: relative; }
.nav-toggle__bars::before, .nav-toggle__bars::after {
  content: ""; position: absolute; left: 0; right: 0; height: 2px;
  background: currentColor; border-radius: 2px;
}
.nav-toggle__bars::before { top: 0; }
.nav-toggle__bars::after  { bottom: 0; }

/* 1180 px : seuil mesuré, pas deviné. Sept entrées de navigation, et les
   libellés espagnols sont les plus longs des trois langues. */
@media (max-width: 1180px) {
  .has-js .nav-toggle { display: inline-flex; }
  .has-js .nav {
    display: none;
    position: absolute; left: var(--gutter); right: var(--gutter); top: calc(100% + .5rem);
    flex-direction: column; align-items: stretch; gap: 0;
    background: var(--surface);
    border: 1px solid var(--bordure); border-radius: var(--r2);
    box-shadow: 0 20px 46px var(--ombre);
    padding: .75rem 1.25rem 1.4rem;
  }
  .has-js .nav.is-open { display: flex; }
  .nav a { padding: .85em 0; border-bottom: 1px solid var(--bordure-douce); }
  .nav a::after { display: none; }
  .nav a.is-current { color: var(--texte-lien); }
  .nav .btn { margin-top: 1rem; justify-content: center; border-bottom: 0; }
  .site-header__inner { position: relative; }
}

/* =========================================================================
   7. Hero
   Plus de fond navy pleine hauteur, plus de cerveau en constellation
   (le cliché absolu du secteur, et la première chose qu'un lecteur
   attribue à une image générée). À la place : du papier, une photographie
   réelle posée de travers, et un trait sous les mots qui portent la
   promesse.
   ========================================================================= */
.hero { position: relative; overflow: hidden; padding-bottom: clamp(48px, 5vw, 72px); }
/* Le seuil (§E.1) : tout l'écart pilule→mission est porté par le
   padding-bas du hero (48–72 px), la section du constat n'en rajoute pas.
   Sélecteur composé : la règle générique `.section { padding-block }` est
   déclarée APRÈS celle-ci dans la feuille et gagnerait à spécificité
   égale. */
.section.section--seuil { padding-top: 0; padding-bottom: 0; }
/* sections resserrées en tête (retour propriétaire) : piliers, limites,
   pour-qui collaient trop d'air sous la section précédente */
.section--serree-haut { padding-top: clamp(20px, 2.5vw, 36px) !important; }
.hero__inner {
  display: grid; gap: clamp(34px, 4.5vw, 64px);
  grid-template-columns: 1fr;
  align-items: center;
  padding-block: clamp(38px, 5vw, 78px) clamp(34px, 4.5vw, 60px);
}
@media (min-width: 950px) { .hero__inner { grid-template-columns: 1.06fr .94fr; } }

.hero__title {
  font-size: clamp(2.5rem, 1.1rem + 5.9vw, 4.6rem);
  letter-spacing: -0.025em; line-height: 1.06;
}
/* La seconde moitié du titre bascule en serif italique. C'est le cœur du
   changement de ton : le même texte, dit d'une autre voix. */
.hero__title .voix {
  display: block; margin-top: .1em;
  font-family: var(--font-serif); font-style: italic; font-weight: 500;
  letter-spacing: -0.01em; color: var(--texte-lien);
}
.hero__sub {
  margin-top: clamp(22px, 2.8vw, 34px);
  font-size: clamp(1.08rem, 1rem + .5vw, 1.32rem); line-height: 1.55;
  color: var(--texte-doux); max-width: 34ch;
}
.hero__actions { display: flex; flex-wrap: wrap; gap: .9rem; margin-top: clamp(24px, 3vw, 36px); }
.hero__note { margin-top: 1.5rem; font-size: .875rem; color: var(--texte-doux); max-width: 46ch; }

/* La photo : posée, scotchée, légèrement de travers. Le cadre clair large
   est ce qui la fait lire comme un tirage et non comme un bloc d'image —
   c'est lui qui porte l'essentiel de l'effet, pas la rotation. */
.hero__photo {
  margin: 0; position: relative;
  background: var(--surface);
  padding: 14px 14px 62px;
  border-radius: 6px;
  box-shadow: 0 22px 48px var(--ombre);
  rotate: 1.8deg;
}
.hero__photo img {
  display: block; width: 100%; height: clamp(250px, 34vw, 430px);
  object-fit: cover; object-position: 35% 40%;
  border-radius: 3px;
}
/* La légende manuscrite sous le tirage. C'est une phrase qu'aucun
   gabarit ne produit — et c'est là qu'on met de la voix. */
.hero__photo figcaption {
  position: absolute; left: 0; right: 0; bottom: 18px;
  padding-inline: 20px;
  font-family: var(--font-serif); font-style: italic;
  font-size: .95rem; line-height: 1.35; color: var(--texte-doux);
  text-align: center;
}
@media (max-width: 700px) { .hero__photo { rotate: none; } }

/* Le ruban de bas de hero remplace le bandeau tricolore de la version 2.
   Une seule bande, arrondie aux deux bouts, qui ne touche aucun bord. */
.ruban {
  margin-inline: var(--gutter);
  /* §G.1 : la pilule ouvre la feuille ; le bloc mission suit à 48–72 px
     (cible §E.1) — les deux se lisent comme une séquence de seuil */
  margin-bottom: clamp(48px, 5vw, 72px);
  background: var(--teal-nuit); color: #FFFFFF;
  border-radius: var(--pill);
  padding: clamp(16px, 2vw, 22px) clamp(24px, 4vw, 54px);
  display: flex; flex-wrap: wrap; align-items: center;
  justify-content: center; gap: .4rem clamp(14px, 3vw, 38px);
  text-align: center;
}
.ruban__label { font-size: .72rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--pale); }
.ruban__liste { font-size: clamp(.95rem, .9rem + .3vw, 1.15rem); font-weight: 700; letter-spacing: .02em; }

/* =========================================================================
   8. Sections
   ========================================================================= */
.section { padding-block: var(--section-y-top) var(--section-y-bot); position: relative; }
.section--tiede { background: var(--surface-alt); }
.section--nuit  { background: var(--surface-nuit); color: var(--sur-nuit); }
.section--nuit p { color: rgba(255,255,255,.86); }

/* Les sections de preuve. Fond uni, aucune inclinaison, aucun ruban — et
   c'est une garantie, pas une coquetterie : le jour où quelqu'un copiera
   une carte d'une section de récit vers ici, elle se redressera d'elle-même. */
.sobre .tilt-a, .sobre .tilt-b, .sobre .tilt-c { rotate: none; }
.sobre .scotch::after { display: none; }
/* et le rayon à main levée redevient un rayon régulier */
.sobre .billet, .sobre .contact-card, .sobre .pillar--plein { border-radius: var(--r2); }

.section__head { max-width: 46rem; margin-bottom: clamp(30px, 3.4vw, 48px); }
.section__head--wide { max-width: none; }
.section__head .lede { margin-top: 1.15rem; }

/* Lisière courbe entre deux sections : la limite n'est plus une ligne
   droite. Un seul rayon, en haut ; deux donneraient une bulle. */
.section--courbe { border-radius: var(--r3) var(--r3) 0 0; }

/* =========================================================================
   9. Le constat — bandeau photographique
   ========================================================================= */
.bandeau { position: relative; margin: 0 var(--gutter); border-radius: var(--r3); overflow: hidden; }
.bandeau picture, .bandeau img { display: block; width: 100%; }
.bandeau img { height: clamp(300px, 44vw, 540px); object-fit: cover; object-position: 30% 40%; }

.bandeau__texte { padding: clamp(24px, 4vw, 40px); background: var(--surface-alt); }
.bandeau__titre { font-size: clamp(1.45rem, 1rem + 2.1vw, 2.4rem); line-height: 1.2; max-width: 24ch; }

/* `:not(.bandeau--outil)` sur tout ce bloc, et ce n'est pas de la
   prudence : le bandeau produit porte AUSSI la classe `.bandeau`, et sans
   cette exclusion il héritait de la superposition texte-sur-photo — donc
   du voile clair sur sa moitié droite. Sur la seule capture du produit du
   site, cela lavait l'écran de la tablette. */
@media (min-width: 900px) {
  .bandeau:not(.bandeau--outil):not(.bandeau--mission) { display: grid; }
  .bandeau:not(.bandeau--outil):not(.bandeau--mission) picture,
  .bandeau:not(.bandeau--mission) .bandeau__texte { grid-area: 1 / 1; }
  /* Voile de sécurité sur le tiers droit. Ce n'est PAS un correctif : la
     photo actuelle donne déjà 6,8:1 derrière le texte. C'est une assurance
     pour le jour où elle sera remplacée. La rampe doit être terminée avant
     le bord gauche du texte, qui tombe vers 52 % de la largeur. */
  .bandeau:not(.bandeau--outil):not(.bandeau--mission)::after {
    content: ""; position: absolute; inset: 0; pointer-events: none;
    background: linear-gradient(90deg, transparent 32%, var(--voile-photo) 50%, var(--voile-photo) 100%);
  }
  .bandeau:not(.bandeau--mission) .bandeau__texte {
    background: none; position: relative; z-index: 1;
    align-self: center; justify-self: end;
    width: min(44%, 500px);
    margin-right: clamp(24px, 4vw, 56px);
  }
  .bandeau:not(.bandeau--mission) .bandeau__titre { color: var(--texte-sur-photo); }
}

/* Le bandeau-mission : la photo du duo est descendue dans « Pour qui »
   (corrections 05.08 §2), le constat s'ouvre donc sur la phrase seule.
   Bande nuit arrondie, même gabarit extérieur que l'ancien bandeau photo :
   le rythme de la page ne bouge pas. */
.bandeau--mission {
  overflow: visible;
  background: var(--surface-nuit); color: var(--sur-nuit);
  padding: clamp(44px, 6vw, 92px) clamp(28px, 5vw, 72px);
}
.bandeau--mission .bandeau__titre {
  color: var(--sur-nuit);
  font-size: clamp(1.6rem, 1rem + 2.6vw, 2.9rem);
  max-width: 21ch; margin-inline: auto; text-align: center;
}
.bandeau--mission .voix {
  font-family: var(--font-serif); font-style: italic; font-weight: 500;
  color: var(--pale);
}

.constat__suite { padding-block: clamp(32px, 4vw, 56px); }   /* largeur du wrap : aligné sur les autres titres */
/* §G.2 : la mesure de texte reste ≤ 70 ch, sans exception — lectorat avec
   troubles attentionnels. Les conteneurs larges servent la composition,
   jamais les paragraphes. */
.constat__suite > p { max-width: 70ch; }
.constat__suite > * + * { margin-top: clamp(24px, 3vw, 38px); }
.constat__punch { font-size: clamp(1.2rem, 1rem + .8vw, 1.55rem); font-weight: 800; line-height: 1.3; }

/* La citation devient un billet posé sur la page : fond clair, coins
   irréguliers, ombre basse. Le filet vertical de la version 2 disparaît —
   c'était le marqueur « bloc de citation de framework ». */
.billet {
  background: var(--surface);
  border-radius: var(--r-main);
  padding: clamp(28px, 3.4vw, 42px) clamp(28px, 3.6vw, 46px);
  box-shadow: 0 16px 38px var(--ombre-portee);
  font-family: var(--font-serif); font-style: italic;
  font-size: clamp(1.1rem, 1rem + .6vw, 1.38rem); line-height: 1.5;
  color: var(--texte-lien);
  max-width: 46rem;
}
.on-dark .billet { background: rgba(255,255,255,.08); color: var(--pale); }
.billet .ref { margin-top: .8rem; }

/* Le chiffre fort. Encart ocre très lavé ; les nombres prennent la
   couleur d'accent LISIBLE — l'or clair ne tient pas 4,5:1 sur clair. */
.chiffres {
  max-width: 52rem;   /* §G.2 : l'encart suivait les 62rem du parent, ~100 ch */
  background: var(--teinte-chaude);
  border-radius: var(--r2);
  padding: clamp(24px, 2.8vw, 34px) clamp(26px, 3.2vw, 38px);
  font-size: clamp(1.02rem, .96rem + .4vw, 1.18rem); line-height: 1.55;
}
.chiffres b { color: var(--ocre-chiffre); }

/* =========================================================================
   10. Cartes
   ========================================================================= */
.grid { display: grid; gap: clamp(22px, 2.8vw, 34px); }
.grid--3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 265px), 1fr)); }
.grid--2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr)); }
.grid--4 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr)); }

.card {
  background: var(--surface);
  border: 1px solid var(--bordure-douce);
  border-radius: var(--r2);
  padding: clamp(24px, 2.8vw, 34px);
  height: 100%;
  box-shadow: 0 10px 26px var(--ombre-portee);
  /* Le relief au survol est volontairement SANS cursor:pointer — ces
     cartes ne sont pas cliquables, l'effet doit dire « vivant », pas
     « lien ». Neutralisé plus bas si l'utilisateur réduit les animations. */
  transition: translate .24s ease, box-shadow .24s ease, border-color .24s ease;
}
/* `translate` et non `transform` : les cartes inclinées portent déjà une
   `rotate`, et un `transform: translateY()` au survol l'écraserait — la
   carte se redresserait d'un coup en passant la souris dessus. */
.card:hover { translate: 0 -4px; box-shadow: 0 20px 40px var(--ombre); border-color: var(--pale); }
.card__title { font-size: 1.14rem; font-weight: 800; margin-bottom: .6rem; }
.card p { color: var(--texte-doux); font-size: 1.02rem; }

/* Les obstacles : décalés verticalement les uns par rapport aux autres.
   Une rangée de trois cartes parfaitement alignées est exactement la
   silhouette qu'on cherche à éviter. Le décalage tombe sous 820 px, où
   les cartes s'empilent et où il ne produirait que des trous. */
@media (min-width: 820px) {
  .grid--decale > :nth-child(2) { margin-top: clamp(24px, 3.4vw, 52px); }
  .grid--decale > :nth-child(3) { margin-top: clamp(10px, 1.6vw, 24px); }
}

/* Numéro cerclé à la main, en tête de carte. Le cercle est un SVG posé
   derrière le chiffre : un `border-radius: 50%` donnerait un cercle
   parfait, qui ne dit rien. */
.numero {
  position: relative; display: inline-grid; place-items: center;
  width: 64px; height: 58px; margin-bottom: 1.1rem;
}
.numero > svg { position: absolute; inset: 0; width: 100%; height: 100%; color: var(--ocre); }
.numero > span { position: relative; font-size: 1.28rem; font-weight: 800; color: var(--texte); }

/* Piliers : quatre traitements différents pour quatre cartes. C'est
   l'inverse exact d'une grille 2×2 homogène. */
.pillar { position: relative; }
.pillar__num {
  display: block; margin-bottom: .8rem;
  font-family: var(--font-serif); font-style: italic;
  font-size: 1.7rem; font-weight: 600; line-height: 1;
  color: var(--ocre-chiffre);
}
.pillar__title { font-size: 1.18rem; font-weight: 800; margin-bottom: .6rem; }
.pillar p { font-size: 1.02rem; }
.pillar--plein {
  background: var(--teal-nuit); border-color: var(--teal-nuit); color: #FFFFFF;
  border-radius: var(--r-main);
}
.pillar--plein p { color: rgba(255,255,255,.9); }
.pillar--plein .pillar__num { color: var(--ocre); }
.pillar--ocre { background: var(--teinte-chaude); border-color: transparent; }
.pillar--bleu { background: var(--teinte); border-color: transparent; }
.pillar--nu   { background: transparent; box-shadow: none; border: 2px dashed var(--bordure); }
.pillar--nu:hover { border-color: var(--teal); box-shadow: none; }

/* Le pivot : une bulle qui part du bord gauche de l'écran et s'y termine
   en demi-cercle. La forme dit le mouvement. */
.pivot {
  margin-top: clamp(38px, 4.4vw, 60px);
  margin-right: clamp(16px, 7vw, 130px);
  /* Ocre et non bleu-canard, et c'est une contrainte de contraste, pas un
     goût : du blanc sur `--teal` donne 3,1:1, tout juste le minimum des
     grands caractères et rien de plus. L'encre sur l'ocre donne 7,4:1, et
     la paire chaud/froid avec le pivot miroir se lit mieux. */
  background: var(--ocre); color: var(--encre);
  border-radius: 0 var(--pill) var(--pill) 0;
  padding-block: clamp(26px, 3.2vw, 44px);
  overflow: hidden;
}
.pivot p {
  font-size: clamp(1.25rem, 1rem + 1.2vw, 1.9rem); font-weight: 800;
  line-height: 1.25; letter-spacing: -0.015em; max-width: 24ch;
}
.pivot--miroir {
  margin-right: 0; margin-left: clamp(16px, 7vw, 130px);
  border-radius: var(--pill) 0 0 var(--pill);
  background: var(--teal-nuit); color: #FFFFFF;
}
.pivot--miroir p { margin-left: auto; text-align: right; max-width: 30ch; }

/* Apparition de gauche à droite. clip-path plutôt que scaleX : le texte
   et la coupe arrondie ne se déforment pas, ils se dévoilent. */
.has-js .reveal.pivot {
  opacity: 1; translate: none;
  clip-path: inset(0 100% 0 0);
  transition: clip-path .85s cubic-bezier(.22, .61, .36, 1);
}
.has-js .reveal.pivot.is-visible { clip-path: inset(0 0 0 0); }
.has-js .reveal.pivot p { opacity: 0; transition: opacity .45s ease .3s; }
.has-js .reveal.pivot.is-visible p { opacity: 1; }
.has-js .reveal.pivot--miroir { clip-path: inset(0 0 0 100%); }
.has-js .reveal.pivot--miroir.is-visible { clip-path: inset(0 0 0 0); }

/* =========================================================================
   11. L'outil — section nuit
   ========================================================================= */
/* Asymétrie deux tiers / un tiers, puis l'inverse : une grille 2×2
   régulière donnerait à cette section la même silhouette qu'aux autres. */
.tool__grid { display: grid; gap: clamp(24px, 3vw, 44px); grid-template-columns: 1fr; }
@media (min-width: 900px) {
  .tool__grid { grid-template-columns: repeat(3, 1fr); }
  .tool__grid > :nth-child(1) { grid-column: span 2; }
  .tool__grid > :nth-child(4) { grid-column: span 2; }
}
.tool-item { padding-top: 1.5rem; border-top: 2px solid rgba(169,205,222,.45); transition: border-color .22s ease; }
.tool-item:hover { border-top-color: var(--ocre); }
.tool-item__title { font-size: 1.12rem; font-weight: 800; margin-bottom: .55rem; }
.tool-item p { color: rgba(255,255,255,.84); font-size: 1.02rem; }

/* Le bandeau produit : contrairement au bandeau du constat, rien n'est
   posé sur la photo et la légende passe dessous. Les deux jouent des
   rôles différents — l'un affirme, l'autre explique — et doivent se
   distinguer. C'est ce qui casse la répétition de gabarit.

   Le plafond de largeur n'est pas cosmétique : en 100vw sans limite, la
   boîte atteint un rapport de 3,9:1 et `cover` rogne le socle de la
   tablette. Vérifié à dix largeurs de 375 à 2560 px. */
/* `width` + `margin-inline: auto` plutôt que la marge en gouttière du
   bandeau de base : il faut à la fois l'inset (sinon la photo touche les
   bords de l'écran et perd le coin arrondi qui fait tout le langage de
   cette version) ET le centrage une fois le plafond de 1680 px atteint. */
.bandeau--outil {
  margin: clamp(30px, 3.8vw, 52px) auto;
  width: calc(100% - 2 * var(--gutter));
  max-width: 1680px;
}
.bandeau--outil img { height: clamp(320px, 42vw, 620px); object-position: 54% 88%; }
.bandeau--outil__legende {
  max-width: 62ch; margin: 1.3rem auto 0; padding-inline: var(--gutter);
  font-family: var(--font-serif); font-style: italic;
  font-size: .98rem; line-height: 1.5; color: var(--pale); text-align: center;
}

/* Les chiffres : trois gélules côte à côte. Le décompte animé de la
   version 2 est supprimé — c'était un trope de gabarit 2019-2021, et
   l'effet lui-même datait la page. Les valeurs restent en dur. */
.stats { display: flex; flex-wrap: wrap; gap: clamp(12px, 1.6vw, 20px); margin-top: clamp(46px, 5vw, 72px); }
.stats > div {
  flex: 1 1 190px; text-align: center;
  padding: clamp(22px, 2.8vw, 34px) 1rem;
  border-radius: var(--pill);
}
.stats .s1 { background: rgba(255,255,255,.1); color: #FFFFFF; }
/* --encre figé, et non --texte : le fond est l'or de marque, qui ne
   bascule pas avec le thème. Un texte thématique deviendrait clair sur
   clair en mode sombre (mesuré sur la v2 : 2,0:1). */
.stats .s2 { background: var(--ocre); color: var(--encre); }
.stats .s3 { background: var(--pale); color: var(--teal-nuit); }
.stats .n {
  display: block; font-size: clamp(2rem, 1.2rem + 3.2vw, 3.2rem);
  font-weight: 800; line-height: 1; letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums;
}
.stats .l { display: block; margin-top: .55rem; font-size: .72rem; font-weight: 700; letter-spacing: .18em; text-transform: uppercase; }
.stats .s1 .l { color: var(--pale); }

/* =========================================================================
   12. La science — registre sobre
   Aucune inclinaison, aucun ruban, aucun trait dessiné. Ici on parle à
   quelqu'un qui lit des articles.
   ========================================================================= */
.carrousel { position: relative; }
/* Le défilement est natif : pas de transformation JavaScript, donc la
   piste reste utilisable au doigt, à la molette et au clavier même si le
   script ne s'exécute pas. */
.carrousel__piste {
  display: grid; grid-auto-flow: column;
  grid-auto-columns: min(86%, 380px);
  gap: clamp(16px, 2vw, 26px);
  overflow-x: auto; overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  padding: 6px 6px 1.2rem; margin: -6px -6px 0;
  list-style: none;
}
.carrousel__piste:focus-visible { outline: 3px solid var(--teal); outline-offset: 2px; }

.preuve {
  scroll-snap-align: start;
  display: flex; flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--bordure-douce);
  border-radius: var(--r1);          /* rayon sobre : pas le rayon à main levée */
  padding: clamp(24px, 2.8vw, 32px);
  transition: box-shadow .22s ease, border-color .22s ease;
}
.preuve:hover { box-shadow: 0 14px 30px var(--ombre-portee); border-color: var(--pale); }
/* `.preuve .preuve__num` et non `.preuve__num` seul : la règle générique
   `.preuve p` plus bas est plus spécifique et repeindrait le numéro. */
.preuve .preuve__num {
  font-size: .82rem; font-weight: 700; letter-spacing: .14em;
  color: var(--ocre-chiffre); margin-bottom: .8rem;
}
.preuve__titre { font-size: clamp(1.02rem, .96rem + .35vw, 1.16rem); font-weight: 800; line-height: 1.25; margin-bottom: .7rem; }
.preuve p { color: var(--texte-doux); font-size: 1.02rem; }

/* Références bibliographiques en serif italique : le traitement classique
   de la citation, et la raison pour laquelle aucune fonte sans italique
   n'est embarquée. */
.ref {
  display: block;
  font-family: var(--font-serif); font-style: italic;
  font-size: .86rem; line-height: 1.5; color: var(--texte-lien);
}
.ref a { color: inherit; text-decoration-thickness: 1px; }
.ref a:hover { color: var(--texte-lien-actif); }
.preuve .ref { margin-top: auto; padding-top: 1.1rem; }
.ext { display: inline-block; margin-left: .3em; font-style: normal; font-size: .9em; }

.carrousel__cmd {
  display: none;                        /* affiché seulement si JS + débordement */
  align-items: center; justify-content: space-between; gap: 1.2rem;
  margin-top: clamp(14px, 1.8vw, 22px);
}
.has-js .carrousel.est-defilable .carrousel__cmd { display: flex; }
.carrousel__points { display: flex; gap: .45rem; }
.carrousel__point {
  width: 26px; height: 4px; border-radius: var(--pill);
  background: var(--bordure); border: 0; padding: 0;
  transition: background-color .2s ease;
}
.carrousel__point[aria-current="true"] { background: var(--ocre); }
.carrousel__fleches { display: flex; gap: .5rem; }
.carrousel__btn {
  width: 44px; height: 44px; flex: none;      /* cible tactile AA */
  display: grid; place-items: center;
  font: inherit; font-size: 1.1rem; line-height: 1;
  color: var(--texte-lien); background: var(--surface);
  border: 1px solid var(--bordure); border-radius: var(--pill);
  cursor: pointer;
  transition: background-color .2s ease, border-color .2s ease;
}
.carrousel__btn:hover:not(:disabled) { background: var(--teinte); border-color: var(--teal); }
.carrousel__btn:disabled { opacity: .35; cursor: default; }

/* CTA en cours de page : le lecteur sort d'ici au pic de conviction. */
.cta-milieu {
  display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 1.4rem;
  margin-top: clamp(34px, 4vw, 54px);
  padding-top: clamp(28px, 3.2vw, 40px);
  border-top: 1px solid var(--bordure);
}
.cta-milieu__note { font-size: .95rem; color: var(--texte-doux); }

/* =========================================================================
   13. Ce que doMind ne fait pas
   Section volontairement dépouillée. Dire ce qu'un produit ne fait pas est
   ce qui le rend crédible, et aucun texte généré ne le fait spontanément :
   c'est la page qu'il ne faut surtout pas décorer.
   ========================================================================= */
.limites { background: var(--teinte); }
.limites__inner { max-width: 58rem; }
.limites__liste { margin: clamp(26px, 3vw, 40px) 0 0; }
.limites__liste dt {
  font-size: clamp(1.05rem, .98rem + .45vw, 1.24rem); font-weight: 800;
  line-height: 1.3; margin-top: clamp(24px, 2.8vw, 34px);
  padding-top: clamp(20px, 2.4vw, 28px);
  border-top: 2px solid var(--ocre);
}
.limites__liste dt:first-child { margin-top: 0; }
.limites__liste dd { margin: .6rem 0 0; color: var(--texte-doux); max-width: 62ch; }
.donnees-cadre p { max-width: 70ch; }

.donnees-cadre {
  margin-top: clamp(30px, 3.6vw, 48px);
  background: var(--surface);
  border-radius: var(--r2);
  padding: clamp(26px, 3vw, 38px);
}
.donnees-cadre__titre { font-size: clamp(1.2rem, 1rem + 1vw, 1.6rem); font-weight: 800; line-height: 1.2; margin-bottom: .9rem; }
.donnees-cadre__liste { margin-top: .9rem; }
.donnees-cadre__liste li {
  position: relative; padding-left: 1.3rem; margin-bottom: .5rem;
  color: var(--texte-doux); font-size: .975rem;
}
.donnees-cadre__liste li::before {
  content: ""; position: absolute; left: 0; top: .58em;
  width: 7px; height: 7px; border-radius: 50%; background: var(--ocre);
}

/* =========================================================================
   14. Champ clinique — nomenclature, registre sobre
   Une liste dense en colonnes, pas des cartes : le contenu est une
   nomenclature, pas quatre arguments de vente.
   ========================================================================= */
.nomenclature { columns: 2; column-gap: clamp(28px, 4vw, 64px); }
@media (min-width: 1000px) { .nomenclature { columns: 3; } }
@media (max-width: 620px)  { .nomenclature { columns: 1; } }
.nomenclature h3 {
  font-size: .78rem; font-weight: 700; letter-spacing: .15em; text-transform: uppercase;
  color: var(--texte-lien);
  margin: 0 0 .7rem; padding-top: .6rem;
  border-top: 2px solid var(--ocre);
  break-after: avoid;
}
.nomenclature > h3 + ul { break-before: avoid; }
.nomenclature ul { margin: 0 0 clamp(22px, 2.6vw, 34px); break-inside: avoid; }
.nomenclature li {
  font-size: .985rem; line-height: 1.45; font-weight: 600;
  padding-block: .32rem;
  border-bottom: 1px solid var(--bordure-douce);
}

.settings {
  margin-top: clamp(30px, 3.6vw, 46px);
  background: var(--teal-nuit); color: #FFFFFF;
  border-radius: var(--r2);
  padding: clamp(26px, 3vw, 38px);
}
.settings__title { font-size: 1.08rem; font-weight: 800; margin-bottom: .7rem; }
.settings p { color: rgba(255,255,255,.88); max-width: 70ch; }
.settings b { color: var(--pale); }

/* =========================================================================
   15. Pour qui
   ========================================================================= */
.role { padding-top: 1.4rem; border-top: 3px solid var(--teal); transition: border-color .22s ease; }
.role:hover { border-top-color: var(--ocre); }
.role__title { font-size: 1.06rem; font-weight: 800; margin-bottom: .5rem; }
.role p { color: var(--texte-doux); font-size: 1.02rem; }

/* « Autour du patient » : le polaroid du domicile est descendu ici depuis
   le hero (corrections 2ᵉ passe, §B.2) — il vit à côté des deux cartes,
   près de « Le patient lui-même ». Il reprend l'habillage .hero__photo
   (cadre clair, légende serif) ; seule la hauteur d'image est resserrée
   pour une colonne. Contrairement à l'ancienne photo décorative de la
   colonne des métiers, celle-ci porte une légende : elle reste donc
   VISIBLE sur mobile, en pleine largeur sous les cartes. */
.autour { display: grid; gap: clamp(22px, 2.8vw, 34px); grid-template-columns: 1fr; }
@media (min-width: 900px) {
  .autour { grid-template-columns: minmax(260px, 340px) 1fr 1fr; align-items: start; }
}
.autour__photo img { height: clamp(220px, 24vw, 300px); }
@media (max-width: 899px) {
  .autour__photo { order: 3; max-width: 480px; }
}

/* =========================================================================
   16. Institutions et recherche — registre sobre
   ========================================================================= */
.institutions__inner { display: grid; gap: clamp(28px, 4vw, 56px); grid-template-columns: 1fr; align-items: center; }
@media (min-width: 900px) { .institutions__inner { grid-template-columns: 1.05fr 1fr; } }
.institutions__intro { font-weight: 700; margin-bottom: .9rem; }
.checklist li { position: relative; padding-left: 2rem; margin-bottom: .9rem; color: rgba(255,255,255,.9); }
.checklist li::before {
  content: ""; position: absolute; left: 0; top: .42em;
  width: 12px; height: 7px;
  border-left: 2px solid var(--pale); border-bottom: 2px solid var(--pale);
  transform: rotate(-45deg);
}
.recherche__inner { max-width: 58rem; }
/* Mesure des paragraphes : sans elle, le texte courant file sur toute la
   largeur de l'inner et passe SOUS la courbe hors-champ (§A′ : seule la
   clinique et le contact ont droit au fantôme). 46rem le garde à
   distance de la pièce à 1280 px — et c'est une meilleure mesure de
   lecture de toute façon. */
.recherche__inner p { max-width: 46rem; }
.recherche .lede { margin-top: 1.1rem; }
.recherche__appel { margin-top: clamp(20px, 2.4vw, 30px); font-size: clamp(1.1rem, 1rem + .6vw, 1.38rem); font-weight: 700; }

/* =========================================================================
   17. Contact
   La version 2 posait cette section sur une photographie très assombrie,
   voilée de navy. Ici elle revient au papier : c'est la dernière chose que
   le visiteur voit, et l'endroit où la page doit être la plus accueillante,
   pas la plus solennelle.
   ========================================================================= */
/* PAS d'overflow:hidden ici — il ferait de .final un CONTENEUR DE
   DÉFILEMENT, et les timelines view() des pièces qu'il contient (le
   soulignement d'« accompagné », la tasse de la table) se mesureraient
   alors par rapport à lui, qui ne défile jamais : progression figée.
   C'était LA cause des « ça ne répond pas au scroll » dans le contact.
   Le débord latéral est déjà contenu par le clip du body. */
.final { background: var(--surface-alt); position: relative; }
.final__inner { padding-block: clamp(56px, 7vw, 104px); }
.final__grid { display: grid; gap: clamp(34px, 4.5vw, 68px); grid-template-columns: 1fr; align-items: start; }
@media (min-width: 900px) { .final__grid { grid-template-columns: 1.02fr .98fr; } }

.final__mission {
  font-family: var(--font-serif); font-style: italic;
  font-size: clamp(1.1rem, 1rem + .5vw, 1.34rem);
  color: var(--texte-lien); max-width: 32ch;
}
.final__question {
  margin-top: clamp(20px, 2.4vw, 30px);
  font-size: clamp(1.65rem, 1rem + 2.5vw, 2.8rem); font-weight: 800;
  line-height: 1.12; letter-spacing: -0.025em; max-width: 17ch;
}
.final__lead { margin-top: clamp(20px, 2.4vw, 28px); color: var(--texte-doux); max-width: 38ch; }
.final__direct { margin-top: 1.2rem; font-weight: 700; line-height: 1.9; }

/* La carte de contact est un billet posé, pas un encadré : mêmes coins
   irréguliers que la citation du constat, même ombre basse. */
.contact-card {
  background: var(--surface);
  border-radius: var(--r-main);
  padding: clamp(26px, 3vw, 38px);
  box-shadow: 0 20px 44px var(--ombre-portee);
}
.contact-card__title { font-size: 1.16rem; font-weight: 800; margin-bottom: 1.3rem; }
.contact-form .field { margin: 0 0 1rem; display: flex; flex-direction: column; gap: .4rem; }
.contact-form label { font-size: .82rem; font-weight: 700; letter-spacing: .04em; color: var(--texte-doux); }
.contact-form input,
.contact-form select,
.contact-form textarea {
  font: inherit; font-size: .97rem;
  color: var(--texte); background: var(--page);
  border: 1px solid var(--bordure); border-radius: var(--r1);
  padding: .75em .9em; width: 100%;
}
.contact-form textarea { resize: vertical; min-height: 6em; }
.contact-form input::placeholder, .contact-form textarea::placeholder { color: var(--texte-doux); opacity: .8; }
.contact-form input:focus-visible,
.contact-form select:focus-visible,
.contact-form textarea:focus-visible { outline: 3px solid var(--teal); outline-offset: 2px; }
.contact-form .btn { margin-top: .5rem; }
.contact-form__note { margin-top: 1.1rem; font-size: .82rem; line-height: 1.55; color: var(--texte-doux); }
.contact-form__note.is-error { color: #9A3412; font-weight: 600; }

.final__logo {
  margin-top: clamp(40px, 4.8vw, 64px); padding-top: clamp(28px, 3.2vw, 40px);
  border-top: 1px solid var(--bordure);
  display: flex; justify-content: center;
}
.final__logo .brand__mark { width: 3.4em; }

/* Barre d'appel à l'action, mobile uniquement. Apparaît une fois le hero
   dépassé, disparaît sur la section contact pour ne pas doubler le
   formulaire qui s'y trouve. Masquée si JavaScript est absent. */
.cta-collant { display: none; }
@media (max-width: 899px) {
  .has-js .cta-collant.est-visible {
    display: block;
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 90;
    padding: .7rem var(--gutter) calc(.7rem + env(safe-area-inset-bottom));
    background: var(--page);
    border-top: 1px solid var(--bordure);
  }
  .cta-collant .btn { width: 100%; justify-content: center; }
}

/* =========================================================================
   18. Notes et sources
   ========================================================================= */
/* WCAG 2.2 — SC 2.5.8 Target Size (minimum) : une cible pointable doit
   faire 24 × 24 px. Sur un produit destiné à des patients avec troubles
   moteurs et visuo-spatiaux, ce n'est pas négociable. */
.fn {
  display: inline-block;
  min-width: 24px; min-height: 24px; padding: 0 .35em;
  font-size: .68em; font-weight: 700; line-height: 1;
  vertical-align: super; text-decoration: none; text-align: center;
}
.on-dark .fn, .section--nuit .fn, .settings .fn { color: var(--pale); }

.sources { background: var(--page); border-top: 1px solid var(--bordure); }
.sources__inner { padding-block: clamp(36px, 4vw, 56px); }
.sources h2 {
  font-size: .78rem; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: var(--texte-lien); margin-bottom: 1.1rem;
}
.sources ol { margin: 0; padding-left: 1.4rem; }
.sources li { font-size: .83rem; line-height: 1.65; color: var(--texte-doux); margin-bottom: .5rem; }
/* Les flèches de retour sont aussi des cibles pointables (SC 2.5.8). */
.sources li > a[href^="#r"] {
  display: inline-block; min-width: 24px; min-height: 24px;
  padding: 0 .3em; line-height: 24px; text-align: center; vertical-align: middle;
}
.sources i { font-family: var(--font-serif); font-style: italic; font-size: 1.06em; }
.sources li:target { background: var(--teinte-chaude); }

/* =========================================================================
   18bis. Pages utilitaires (mentions, données, 404) — DA papier
   La tête de page n'est plus navy : une bande tiède arrondie, comme les
   sections de la page d'accueil. Le contenu garde une mesure de lecture
   stricte : ce sont des pages qu'on lit, pas qu'on parcourt.
   ========================================================================= */
.page-head { background: var(--surface-alt); border-radius: 0 0 var(--r3) var(--r3); }
.page-head__inner { padding-block: clamp(46px, 6vw, 84px); }
.page-head h1 { font-size: clamp(1.9rem, 1.2rem + 2.6vw, 3rem); }
.page-head p { margin-top: 1rem; color: var(--texte-doux); max-width: 56ch; }

.prose { padding-block: clamp(48px, 6vw, 82px); max-width: 68ch; }
.prose h2 {
  font-size: clamp(1.2rem, 1.05rem + .7vw, 1.5rem);
  margin-top: 2.6rem; margin-bottom: .9rem; padding-top: 1.5rem;
  border-top: 2px solid var(--ocre);
}
.prose h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.prose h3 { font-size: 1.02rem; margin-top: 1.7rem; margin-bottom: .5rem; }
.prose ul { margin: 0 0 1.05em; padding-left: 1.3rem; list-style: disc; }
.prose ul li { margin-bottom: .45rem; }
.prose dl { margin: 0 0 1.05em; }
.prose dt { font-weight: 700; margin-top: .9rem; }
.prose dd { margin: .15rem 0 0; color: var(--texte-doux); }
.prose i, .prose em { font-family: var(--font-serif); font-style: italic; font-size: 1.06em; }
.prose .note {
  background: var(--teinte); border-radius: var(--r1);
  padding: 1rem 1.2rem; font-size: .95rem;
}
.prose .updated { font-size: .85rem; color: var(--texte-doux); }
.prose address { font-style: normal; margin: 0 0 1.05em; }
/* Mention à compléter avant mise en ligne — volontairement voyante. */
.todo {
  background: var(--teinte-chaude); border: 2px dashed var(--ocre-texte);
  color: var(--ocre-texte); border-radius: var(--r1);
  padding: 1rem 1.2rem; font-size: .95rem; font-weight: 600;
}

/* =========================================================================
   19. Pied de page
   ========================================================================= */
.site-footer { background: var(--surface-abysse); color: rgba(255,255,255,.78); }
.site-footer a { color: #FFFFFF; }
.site-footer__inner {
  padding-block: clamp(36px, 4vw, 56px);
  display: flex; flex-wrap: wrap; gap: 1.6rem 2.4rem;
  align-items: center; justify-content: space-between;
}
.site-footer .brand { color: #FFFFFF; }
.site-footer .brand__name { font-size: 1.12rem; }
.site-footer nav ul { display: flex; flex-wrap: wrap; gap: 1.4rem; }
/* padding vertical : porte la hauteur de cible à 24 px sans rien changer
   au rendu visuel */
.site-footer nav a { font-size: .9rem; text-decoration: none; display: inline-block; padding-block: 3px; }
.site-footer nav a:hover { text-decoration: underline; }
.site-footer__legal { width: 100%; font-size: .8rem; color: rgba(255,255,255,.55); padding-bottom: clamp(24px, 3vw, 36px); }

/* =========================================================================
   20. Panneau d'accessibilité et sélecteur de langue
   Sans JavaScript le bouton n'apparaît pas, et le site suit alors la
   préférence système via `prefers-color-scheme`. Rien n'est perdu.
   ========================================================================= */
.a11y { position: relative; }
.a11y__bouton {
  display: inline-flex; align-items: center; justify-content: center; gap: .5em;
  min-height: 44px; min-width: 44px; padding: .5em .9em;
  font: inherit; font-size: .85rem; font-weight: 600;
  color: var(--texte); background: transparent;
  border: 1px solid var(--bordure); border-radius: var(--pill);
  cursor: pointer;
}
.a11y__bouton:hover { background: var(--surface); }
.a11y__bouton svg { width: 18px; height: 18px; flex: none; }
@media (max-width: 1299px) {
  .a11y__bouton-texte { position: absolute; width: 1px; height: 1px;
    overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
}
.a11y__panneau {
  position: absolute; right: 0; top: calc(100% + .55rem); z-index: 120;
  width: min(19rem, calc(100vw - 2rem));
  padding: 1.2rem;
  background: var(--surface); color: var(--texte);
  border: 1px solid var(--bordure); border-radius: var(--r2);
  box-shadow: 0 18px 44px var(--ombre);
  text-align: left;
}
.a11y__panneau[hidden] { display: none; }
.a11y__groupe + .a11y__groupe { margin-top: 1.1rem; }
.a11y__legende {
  display: block; margin-bottom: .5rem;
  font-size: .72rem; font-weight: 700; letter-spacing: .14em;
  text-transform: uppercase; color: var(--texte-doux);
}
.a11y__choix { display: flex; gap: .35rem; flex-wrap: wrap; }
.a11y__choix button {
  flex: 1 1 auto; min-height: 40px; padding: .45em .7em;
  font: inherit; font-size: .875rem; font-weight: 600;
  color: var(--texte); background: var(--page);
  border: 1px solid var(--bordure); border-radius: var(--pill);
  cursor: pointer;
}
.a11y__choix button:hover { border-color: var(--teal); }
.a11y__choix button[aria-pressed="true"] { background: var(--teal-nuit); border-color: var(--teal-nuit); color: #FFFFFF; }
.a11y__note { margin-top: 1rem; font-size: .78rem; line-height: 1.5; color: var(--texte-doux); }

.langues { display: flex; align-items: center; gap: .15rem; }
.langues a, .langues span {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 40px; min-height: 40px; padding: 0 .4em;
  font-size: .8rem; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; text-decoration: none;
  color: var(--texte); border-radius: var(--pill);
}
/* l'abbr sert d'étiquette accessible (« Français »), mais son
   soulignement pointillé par défaut fait sale dans un sélecteur */
.langues abbr { text-decoration: none; border: 0; cursor: inherit; }
.langues a { opacity: .55; }
.langues a:hover { opacity: 1; background: var(--surface); color: var(--texte); }
/* langues annoncées mais pas encore en ligne : visibles, inertes */
.langues__avenir { opacity: .35; cursor: default; }
.langues [aria-current="true"] { opacity: 1; background: var(--teinte-chaude); color: var(--ocre-texte); }

/* =========================================================================
   21. Apparition au défilement
   Deux éléments sur toute la page, et c'est une règle, pas une
   observation : la version 1 en comptait 41, et un fondu généralisé au
   défilement est le marqueur visuel le plus immédiat du site fait à la
   chaîne. Les deux retenus sont les pivots, dont l'animation `clip-path`
   dit quelque chose (le mouvement de bascule).
   ========================================================================= */
.has-js .reveal { opacity: 0; translate: 0 18px; transition: opacity .55s ease, translate .55s ease; }
.has-js .reveal.is-visible { opacity: 1; translate: 0 0; }

/* =========================================================================
   22. Respect de « réduire les animations »
   Un seul endroit qui neutralise tout le mouvement du site.
   ========================================================================= */
@media (prefers-reduced-motion: reduce) {
  .has-js .reveal { opacity: 1; translate: none; }
  .has-js .reveal.pivot { clip-path: none; }
  .has-js .reveal.pivot p { opacity: 1; transition: none; }
  .has-js .reveal, .card, .tool-item, .role, .btn, .btn__arrow,
  .preuve, .carrousel__btn, .carrousel__point, .nav a::after {
    transition: none !important;
  }
  .card:hover { translate: none; }
  .btn:hover { transform: none; }
  .btn:hover .btn__arrow { transform: none; }
}

/* =========================================================================
   23. Le thème sombre demande une retouche d'images
   ========================================================================= */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="clair"]) .bandeau img,
  :root:not([data-theme="clair"]) .hero__photo img { filter: brightness(.86); }
}
:root[data-theme="sombre"] .bandeau img,
:root[data-theme="sombre"] .hero__photo img { filter: brightness(.86); }

/* =========================================================================
   24. Impression
   ========================================================================= */
@media print {
  body::before { display: none !important; }   /* le grain mangerait l'encre */
  .site-header, .nav, .nav-toggle, .skip-link, .cta-collant, .cta-milieu,
  .souligne > svg { display: none !important; }
  .scotch::after { display: none !important; }
  body { color: #000; background: #fff; font-size: 11pt; }
  .section--nuit, .final, .site-footer, .limites, .section--tiede,
  .pivot, .settings, .pillar--plein, .ruban {
    background: #fff !important; color: #000 !important;
  }
  .section--nuit p, .pivot p, .settings p, .pillar--plein p,
  .checklist li, .bandeau--outil__legende { color: #000 !important; }
  .tilt-a, .tilt-b, .tilt-c, .hero__photo { rotate: none !important; }
  .card, .preuve, .billet, .contact-card { box-shadow: none !important; border: 1px solid #999 !important; }
  /* le bandeau : le titre passe sous la photo au lieu de la recouvrir */
  .bandeau { display: block !important; margin: 0 !important; }
  .bandeau::after { display: none !important; }
  .bandeau img { height: auto !important; max-height: 90mm; }
  .bandeau__texte { position: static !important; width: auto !important; margin: 0 !important; padding: 8pt 0 0 !important; background: none !important; }
  .section { padding-block: 18pt; }
  /* le carrousel se déplie : les quatre preuves doivent être imprimées */
  .carrousel__piste { display: block !important; overflow: visible !important; padding: 0 !important; margin: 0 !important; }
  .carrousel__cmd { display: none !important; }
  .preuve { break-inside: avoid; margin-bottom: 10pt; }
  .has-js .reveal { opacity: 1 !important; translate: none !important; clip-path: none !important; }
  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: .8em; }
}

/* =========================================================================
   25. §G.1 — Le rideau
   Le hero (tirage scotché) est collant sous l'en-tête ; la séquence
   pilule + bloc mission monte le recouvrir comme une nouvelle feuille de
   papier. Zéro JavaScript. La feuille (.feuille) enveloppe tout ce qui
   suit le hero : il lui faut un fond opaque, sinon le hero transparaît
   à travers les sections sans fond propre.
   ========================================================================= */
@media (min-width: 900px) {
  .hero { position: sticky; top: 0; z-index: 0; }
  .feuille {
    position: relative; z-index: 1;
    background: var(--page);
    border-radius: clamp(28px, 3vw, 44px) clamp(28px, 3vw, 44px) 0 0;
    box-shadow: 0 -18px 40px rgba(70, 55, 35, .12);   /* vend l'illusion */
    /* la courbe du bord ne doit pas rogner les pièces hors-champ : pas
       d'overflow ici — c'est body{overflow-x:clip} qui gère le débord */
  }
  /* le pied de page est statique : sans plan explicite, il passerait
     SOUS le hero collant en fin de course */
  .site-footer { position: relative; z-index: 1; }
  /* Aucun air au-dessus de la capsule (retour propriétaire) : c'est ELLE
     qui remonte sur le hero. Elle prend donc toute la largeur et porte
     le rayon haut de la feuille — leurs deux courbes coïncident, aucun
     liseré crème ne dépasse derrière. */
  .feuille { padding-top: 0; }
  .feuille > .section--seuil > .ruban {
    margin-inline: 0;
    border-radius: clamp(28px, 3vw, 44px) clamp(28px, 3vw, 44px) 0 0;
  }
}

/* =========================================================================
   26. §G.6 — La grille des preuves (remplace le carrousel, arbitrage §C.2)
   Décalage statique des colonnes : 90 % de l'effet, zéro risque pour un
   lectorat à troubles attentionnels. Le CSS du carrousel reste plus haut,
   inerte — le retirer attendra une passe de ménage dédiée.
   ========================================================================= */
.preuves-grille { display: grid; grid-template-columns: 1fr; gap: clamp(16px, 2vw, 26px); }
@media (min-width: 760px) {
  .preuves-grille { grid-template-columns: 1fr 1fr; }
  .preuves-grille > :nth-child(even) { margin-top: clamp(24px, 4vw, 64px); }
}


/* =========================================================================
   28. §G.5 — Trois dessins progressifs, pas un de plus
   Les SVG vectorisés sont des contours remplis, un fill ne se « dessine »
   pas : les trois moments sont fabriqués exprès. Tout le reste de la page
   reste immobile.
   ========================================================================= */
/* 1. Le soulignement du hero : un vrai tracé, qui s'écrit à l'arrivée. */
.souligne-anim path {
  stroke: #D99A55; stroke-width: 11; stroke-linecap: round;
  stroke-dasharray: 1; stroke-dashoffset: 1;   /* pathLength="1" sur le path */
  animation: ecrire .9s ease-out .45s forwards;
}
@keyframes ecrire { to { stroke-dashoffset: 0; } }

/* 3. Les accents ocre « prennent » à l'entrée de la pièce : la tasse, le
   sable du sablier, la carte du fichier se colorent une fois posés.
   Gate .has-js : sans script, tout est peint d'emblée. */
.has-js .croquis .croquis__accent { transition: opacity .5s ease .18s; }
.has-js .croquis:not(.est-vu):not(.croquis--scrolle):not(.croquis--dessine) .croquis__accent { opacity: 0; }

/* kill-switch : les trois moments s'éteignent, images pleines, immobiles */
@media (prefers-reduced-motion: reduce) {
  .souligne-anim path { animation: none; stroke-dashoffset: 0; }
  .courbe-trace { animation: none !important; transition: none !important; stroke-dashoffset: 0 !important; }
  .has-js .croquis .croquis__accent { transition: none; opacity: 1 !important; }
}

/* =========================================================================
   29. §H — Plan d'emploi des accents manuscrits
   Chaque marque a UN emploi et un seul : une marque répétée partout
   redevient une puce. Un accent maximum par écran de défilement, tous
   aria-hidden, ocre dur #D99A55 (stable dans les deux thèmes). En
   section sobre, seule la coche a droit de cité — c'est du contenu.
   ========================================================================= */
/* fleche : de la rangée des obstacles vers la question pivot */
.fleche-pivot { display: none; }
@media (min-width: 1200px) {
  .fleche-pivot {
    display: block; position: absolute; z-index: 2;
    width: clamp(120px, 11vw, 190px);
    right: 14%; margin-top: -128px;   /* remontée : moins de vide sous les cartes */
    /* la pointe de la marque originale regarde à droite : 130° horaires
       la font plonger vers la question, en bas à gauche */
    transform: rotate(130deg);
    pointer-events: none;
  }
}
/* asterisque : en grand, à gauche de l'écran, 20 pour cent hors cadre —
   la réserve se voit de loin. Sobre : droit. */
.asterisque-grand { display: none; }
@media (min-width: 1200px) {
  .asterisque-grand {
    display: block; position: absolute; z-index: 0;
    top: clamp(30px, 4vw, 70px);
    width: clamp(220px, 19vw, 330px);
    left: calc(clamp(220px, 19vw, 330px) * -0.2);   /* 20 pour cent dehors */
    pointer-events: none;
  }
}
/* coche : la puce manuscrite de la checklist des institutions.
   Ocre sur navy ≈ 4,7:1 — suffisant pour un élément graphique. */
.institutions .checklist li::before {
  border: 0; transform: none;
  width: 1.05em; height: 1.05em; top: .18em;
  background: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 322 287%22 class=%22croquis%22 aria-hidden=%22true%22 focusable=%22false%22%3E   %3Cpath fill=%22%23D99A55%22 fill-rule=%22evenodd%22 d=%22M100.0,253.5C98.8,253.8 96.2,254.3 95.0,253.5C93.8,252.7 94.5,249.5 93.0,248.8C91.5,248.1 88.1,249.8 86.0,249.1C83.9,248.5 81.7,246.7 80.6,245.0C79.5,243.3 80.4,240.8 79.5,239.0C78.6,237.2 83.1,247.5 75.5,234.0C67.9,220.5 40.9,171.2 33.9,158.0C26.9,144.8 33.2,156.5 33.5,155.0C33.8,153.5 34.1,150.8 35.5,149.0C36.9,147.2 39.9,145.2 42.0,144.5C44.1,143.8 45.5,143.3 48.0,144.5C50.5,145.7 55.2,150.7 57.0,151.5C58.8,152.3 58.2,149.6 59.0,149.5C59.8,149.4 59.4,147.4 62.0,150.7C64.6,153.9 71.6,165.1 74.5,169.0C77.4,172.9 75.4,167.9 79.4,174.0C83.3,180.1 92.3,204.0 98.0,205.5C103.7,207.0 107.5,191.2 113.7,183.0C120.0,174.8 126.8,166.0 135.6,156.0C144.4,146.0 154.6,135.2 166.7,123.0C178.8,110.8 197.3,92.4 208.0,82.5C218.7,72.6 226.5,66.8 231.0,63.6C235.5,60.5 231.0,65.9 235.0,63.5C239.0,61.1 249.8,52.8 255.0,49.5C260.2,46.2 265.5,43.1 266.0,43.6C266.5,44.0 258.7,50.7 257.7,52.0C256.7,53.3 255.1,54.3 260.0,51.3C264.9,48.2 282.2,36.0 287.0,33.6C291.8,31.2 291.0,34.5 288.5,37.0C286.0,39.5 278.4,43.3 272.0,48.5C265.6,53.7 254.0,64.4 250.1,68.0C246.3,71.6 246.7,72.0 249.0,70.4C251.3,68.8 260.9,60.7 264.0,58.5C267.1,56.3 270.8,53.9 267.7,57.0C264.6,60.1 249.4,73.3 245.5,77.0C241.6,80.7 244.5,78.5 244.5,79.0C244.5,79.5 245.6,79.3 245.4,80.0C245.1,80.7 244.1,81.8 242.9,83.0C241.7,84.2 239.1,87.0 238.0,87.5C236.9,88.0 236.6,85.6 236.0,86.2C235.4,86.8 236.7,88.2 234.4,91.0C232.0,93.8 224.4,101.4 222.0,103.2C219.6,105.0 220.7,101.8 220.0,101.8C219.3,101.8 219.4,101.3 217.6,103.0C215.9,104.7 210.1,110.9 209.5,112.0C208.9,113.1 213.2,109.7 214.0,109.5C214.8,109.3 216.9,108.2 214.4,111.0C211.9,113.8 201.6,124.6 199.0,126.5C196.4,128.4 200.1,122.2 199.0,122.6C197.9,123.0 193.5,127.7 192.5,129.0C191.5,130.3 192.0,130.6 193.0,130.2C194.0,129.9 205.1,118.9 198.5,127.0C191.9,135.1 163.3,167.2 153.5,179.0C143.7,190.8 141.8,194.5 139.5,198.0C137.2,201.5 143.1,194.4 139.5,200.0C135.9,205.6 121.3,227.2 118.0,231.5C114.7,235.8 119.4,227.1 119.5,226.0C119.6,224.9 119.6,223.7 118.5,225.0C117.4,226.3 113.8,231.5 112.8,234.0C111.7,236.5 112.8,238.5 112.4,240.0C112.1,241.5 111.1,242.3 110.5,243.0C109.9,243.7 109.6,244.3 109.0,244.2C108.4,244.1 108.1,241.2 107.0,242.5C105.9,243.8 103.7,250.2 102.5,252.0C101.3,253.8 101.2,253.2 100.0,253.5Z%22/%3E %3C/svg%3E ") no-repeat center / contain;
}

/* =========================================================================
   30. Retours propriétaire (05.08, soir) — liés au défilement
   ========================================================================= */
/* Le grand check des piliers : la coche, posée en grand dans le coin
   haut-droit de la section. Récit : de travers. */
.coche-piliers { display: none; }
@media (min-width: 1200px) {
  .coche-piliers {
    display: block; position: absolute; z-index: 0;
    top: clamp(24px, 3vw, 48px); right: clamp(-40px, -2vw, -16px);
    width: clamp(200px, 18vw, 320px);
    rotate: -4deg;
    pointer-events: none;
  }
}

/* La flèche des obstacles se révèle au fil du défilement : c'est un
   contour REMPLI (vectorisé), un stroke ne peut pas s'y dessiner — le
   dévoilement se fait au clip-path, du haut vers le bas, dans le sens du
   geste. Piloté par la position de scroll (réversible), repli
   IntersectionObserver en un coup, statique sans JavaScript. */
@keyframes devoiler { from { clip-path: inset(0 0 100% 0); } to { clip-path: inset(0 0 -10% 0); } }
@supports (animation-timeline: view()) {
  .fleche-pivot {
    animation: devoiler linear both;
    animation-timeline: view();
    animation-range: entry 20% cover 50%;   /* un peu plus tard, complète au centre */
  }
}
@supports not (animation-timeline: view()) {
  .has-js .fleche-pivot { clip-path: inset(0 0 100% 0); transition: clip-path .9s ease-out; }
  .has-js .fleche-pivot.est-vu { clip-path: inset(0 0 -10% 0); }
}

@media (prefers-reduced-motion: reduce) {
  .fleche-pivot { animation: none !important; transition: none !important; clip-path: none !important; }
}

/* =========================================================================
   31. Retour propriétaire — continuité uniforme des fonds
   De la feuille aux sources, UNE seule couleur de fond (le papier) ; le
   contenu vit sur des cartes. Les aplats pleine largeur (nuit) deviennent
   des cartes plus étroites qui laissent respirer le papier sur les côtés.
   ========================================================================= */
.section--tiede, .limites, .final, .sources { background: transparent; }
.sources { border-top: 1px solid var(--bordure-douce); }

/* les sections nuit s'insèrent en carte : plus étroites que l'écran */
.section--nuit {
  margin-inline: var(--gutter);
  border-radius: var(--r3) !important;   /* prime sur --courbe (haut seul) */
}
/* leurs raccords « courbe » n'ont plus de sens sur fond uniforme */
.section--courbe { margin-top: 0; }

/* la carte de contenu générique : pour les blocs qui vivaient à même un
   fond de couleur (nomenclature du champ clinique, liste des limites) */
.carte-section {
  background: var(--surface);
  border: 1px solid var(--bordure-douce);
  border-radius: var(--r2);
  padding: clamp(24px, 3vw, 40px);
  box-shadow: 0 10px 26px var(--ombre-portee);
}

/* =========================================================================
   32. Dessins pilotés par le défilement — v3 du mécanisme (couches)
   v1 : timeline sur les <path> internes — Chrome ne l'accroche pas.
   v2 : propriété enregistrée --avancee sur la racine, consommée par les
   enfants — l'invalidation ne suit pas non plus chez l'utilisateur.
   v3 : ce qui est PROUVÉ (la flèche) — animer la racine <svg> elle-même.
   Chaque pièce animée est donc découpée en deux couches empilées : le
   trait (statique) et l'accent (une seconde <svg>, animée à sa racine :
   opacité, balayage clip-path, ou dashoffset hérité).
   ========================================================================= */
.couche-accent {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  pointer-events: none;
}
@keyframes balayer { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 -2% 0 0); } }
/* la tasse ne se balaie pas latéralement : elle se REMPLIT, du bas vers
   le haut, comme un liquide — c'est le retrait de l'inset HAUT qui fait
   monter le niveau */
@keyframes remplir { from { clip-path: inset(100% 0 0 0); } to { clip-path: inset(-2% 0 0 0); } }
@keyframes prendre-op { from { opacity: 0; } to { opacity: 1; } }
/* stroke-dashoffset est une propriété HÉRITÉE : animée sur la racine,
   elle atteint le path (qui ne définit que dasharray) */
@keyframes ecrire-trait { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }
.souligne-scroll path { stroke: #D99A55; stroke-width: 11; stroke-linecap: round; fill: none; stroke-dasharray: 1; }
/* « accompagné » : dynamique — le trait S'ÉCRIT en 0,9 s à l'entrée dans
   le viewport (IntersectionObserver pose .est-vu), même geste que le
   hero. Sans JavaScript : statique, visible. */
@keyframes ecrire-gauche { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }

@supports (animation-timeline: view()) {
  /* le soulignement d'« accompagné » : asservi au défilement — il se
     dévoile de gauche à droite en descendant, se rembobine en remontant.
     Balayage clip-path sur la RACINE (les timelines n'accrochent pas aux
     éléments internes d'un SVG). */
  .souligne-scroll {
    animation: balayer linear both;
    animation-timeline: view();
    animation-range: entry 30% cover 70%;
  }
  .croquis--scrolle {
    /* remplissage et non fondu : pendant un fondu, l'ocre translucide se
       salit sur l'encre du dessous — le remplissage révèle la tasse dans
       sa couleur pleine, pixel par pixel */
    animation: remplir linear both;
    animation-timeline: view();
    animation-range: entry 0% cover 55%;    /* démarre dès l'entrée, plein
       quand la pièce passe le centre de l'écran : `.final` est la dernière
       section, la page manque de course pour finir plus tard. */
  }
  .croquis--dessine {
    animation: balayer linear both;
    animation-timeline: view();
    animation-range: entry 20% cover 65%;
  }
  .croquis--trace {
    animation: balayer linear both;
    animation-timeline: view();
    animation-range: entry 25% cover 60%;
  }
}
@supports not (animation-timeline: view()) {
  .has-js .souligne-scroll:not(.est-vu) path { stroke-dashoffset: 1; }
  .souligne-scroll.est-vu path { animation: ecrire-gauche .9s ease-out .15s both; }
  .has-js .croquis--scrolle:not(.est-vu) { clip-path: inset(100% 0 0 0); }
  .has-js .croquis--scrolle { transition: clip-path 2.2s ease; }
  .has-js .croquis--dessine:not(.est-vu), .has-js .croquis--trace:not(.est-vu) { clip-path: inset(0 100% 0 0); }
  .has-js .croquis--dessine, .has-js .croquis--trace { transition: clip-path 1.2s ease-out .2s; }
}
@media (prefers-reduced-motion: reduce) {
  .souligne-scroll, .croquis--scrolle, .croquis--dessine, .croquis--trace {
    animation: none !important; transition: none !important;
    clip-path: none !important; opacity: 1 !important; stroke-dashoffset: 0 !important;
  }
}

/* =========================================================================
   33. Retours propriétaire (suite)
   ========================================================================= */
/* « Ce que doMind ne fait pas » : trois cartes bleu clair, ombre au
   survol (héritée de .card:hover). */
.carte-limite { background: var(--teinte); border-color: transparent; }
/* bandes horizontales empilées (retour propriétaire) : une carte par
   ligne, titre à gauche, texte à droite */
.limites .grid--3 { grid-template-columns: 1fr; }
@media (min-width: 700px) {
  .carte-limite { display: grid; grid-template-columns: minmax(190px, 250px) 1fr;
                  column-gap: clamp(20px, 3vw, 40px); align-items: start; }
  .carte-limite h3 { margin-bottom: 0; }
}
.carte-limite h3 { font-size: 1.14rem; font-weight: 800; margin-bottom: .6rem; }

/* Le constat : la colonne s'élargit (marges réduites) et l'encart des
   chiffres passe à droite, en seconde colonne, bleu clair. */
/* aligné sur « Trois obstacles » : le wrap standard reprend la main
   (le max-width:none faisait démarrer le bloc 60 px trop à gauche) */
@media (min-width: 900px) {
  .constat__suite {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(280px, 340px);   /* encart étroit → haut */
    column-gap: clamp(28px, 4vw, 64px);
    align-items: start;
  }
  .constat__suite > * { grid-column: 1; }
  .constat__suite > .chiffres {
    grid-column: 2; grid-row: 1 / span 3;
    /* ni flex ni grid SUR le <p> : les deux blockifient chaque enfant
       élément (<b>, <a>) en item séparé et déchirent la phrase. Le <p>
       reste un bloc normal ; c'est LUI qu'on centre dans sa zone. */
    align-self: center; margin-top: 0;
  }
}
.chiffres { background: var(--teinte); max-width: none; }

/* =========================================================================
   34. Carrousel des preuves, façon « exemple » : carte active au centre,
   voisines qui dépassent des deux côtés, points dessous.
   ========================================================================= */
/* pleine largeur de page (retour propriétaire) : le carrousel s'évade
   du wrap — technique du débord centré, contenue par le clip du body */
.carrousel--preuves {
  width: 100vw;
  margin-inline: calc(50% - 50vw);
}
.carrousel--preuves { --carte: min(30vw, 380px); }
.carrousel--preuves .carrousel__piste {
  /* cartes plus petites, hauteur alignée sur le PLUS GRAND texte :
     l'étirement flex (align-items par défaut) donne à toutes la hauteur
     de la plus fournie — plus de vide en pied de carte. L'écart entre
     cartes est calculé pour que la rangée touche les deux bords quand
     une carte du milieu est centrée : g = 50vw − 1,5 × largeur. */
  display: flex;
  scroll-snap-type: x mandatory;
  padding-inline: calc(50vw - var(--carte) / 2);
}
.carrousel--preuves .preuve {
  flex: 0 0 var(--carte);
  /* rapprochées : chaque carte mord de 10 pour cent sur la suivante —
     l'éventail (z-index du script) et l'estompage font lire les couches */
  margin-inline-end: calc(var(--carte) * -0.1);
  position: relative;
}
@media (max-width: 760px) {
  .carrousel--preuves { --carte: 78vw; }
}
.carrousel--preuves .preuve:last-child { margin-inline-end: 0; }
/* les cartes recouvertes reculent : leur contenu s'estompe pour que les
   bribes de texte qui dépassent se lisent comme des couches, pas comme
   des phrases coupées */
.carrousel--preuves .preuve > * { transition: opacity .3s ease; }
.carrousel--preuves .preuve:not(.est-centrale) > * { opacity: .45; }
.carrousel--preuves .preuve {
  scroll-snap-align: center;
  background: var(--teinte);
  border-color: transparent;
  transition: background-color .3s ease, box-shadow .3s ease, translate .3s ease;
}
.carrousel--preuves .preuve.est-centrale {
  background: var(--surface);
  translate: 0 -6px;
  box-shadow: 0 18px 38px var(--ombre);
}
.carrousel--preuves .carrousel__cmd { justify-content: center; }
@media (prefers-reduced-motion: reduce) {
  .carrousel--preuves .preuve { transition: none; translate: none; }
}

/* =========================================================================
   35. Piles raster — « cartes » et « table »
   Ces deux pièces reviennent au DESSIN FOURNI plutôt qu'à la
   vectorisation maison : celle-ci perdait les aplats blancs (les cartes
   se traversaient) et fabriquait des masses noires parasites sous la
   table. Deux couches empilées, détourées depuis la source (voir
   outils/couches_raster.py) :
     · accent (l'ocre seul) DESSOUS, pour rester animable au défilement ;
     · encre (trait + aplats blancs, ocre troué) DESSUS.
   Le z-index est explicite : sans lui, la couche absolue passerait
   au-dessus du flux et l'ocre recouvrirait son propre contour.
   ========================================================================= */
.croquis-pile { position: relative; }
.croquis-pile__accent {
  position: absolute; inset: 0; z-index: 0; display: block;
}
.croquis-pile__encre { position: relative; z-index: 1; display: block; }
.croquis-pile picture img { display: block; width: 100%; height: auto; }

/* Thème sombre : l'inversion de la seule couche d'encre donne exactement
   la lecture attendue — trait pâle, aplats sombres. L'ocre, lui, n'est
   pas inversé : il reste l'ocre de marque dans les deux thèmes. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="clair"]) .croquis-pile__encre { filter: invert(1); }
}
:root[data-theme="sombre"] .croquis-pile__encre { filter: invert(1); }

/* =========================================================================
   36. « Pour qui » — le tirage du visuel 4, à droite du bloc de titre
   ========================================================================= */
.pourqui__tete {
  display: grid; grid-template-columns: 1fr;
  gap: clamp(28px, 4vw, 56px);
  align-items: center;
  margin-bottom: clamp(30px, 3.4vw, 48px);
}
@media (min-width: 950px) {
  .pourqui__tete { grid-template-columns: 1.1fr .9fr; }
}
.pourqui__tete .section__head { margin-bottom: 0; }
.pourqui__photo { rotate: 1.2deg; }
.pourqui__photo img { height: clamp(230px, 26vw, 330px); object-position: 50% 45%; }
@media (max-width: 700px) { .pourqui__photo { rotate: none; max-width: 480px; } }

/* =========================================================================
   37. Pages Ressources (BRIEF_RESSOURCES.md)
   -------------------------------------------------------------------------
   Trois objets seulement, et uniquement parce que la v4 n'avait aucun
   équivalent : un fil d'Ariane, la liste d'entrées du hub, la liste de
   sources numérotée. Tout le reste de ces pages réutilise l'existant —
   .page-head, .prose, .billet, .ref, .cta-milieu, .horschamp — comme le
   demande le brief §3.2.
   ========================================================================= */

/* Fil d'Ariane. Discret par construction : c'est un repère de position,
   pas un chemin qu'on invite à parcourir. */
.fil {
  font-size: .9rem; color: var(--texte-doux);
  margin-bottom: clamp(14px, 1.6vw, 22px);
}
.fil a { color: inherit; }
.fil a:hover { color: var(--texte-lien); }
.fil span { margin-inline: .4em; opacity: .55; }

/* Les entrées du hub, en cartes : un dessin, la question entière, une
   phrase d'appel. Le libellé du lien EST la question (brief §4) — pas de
   « en savoir plus », qui ne dit ni où l'on va ni pourquoi. */
.cartes-ress {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: clamp(20px, 2.4vw, 30px);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
}
/* Deux colonnes et non `auto-fit` au-delà : à quatre entrées, l'ajustement
   automatique donnait une rangée de trois puis une carte seule, ce qui se
   lit comme un oubli. Un carré 2 x 2 se lit comme un ensemble. */
@media (min-width: 880px) { .cartes-ress { grid-template-columns: repeat(2, 1fr); } }
.carte-ress { display: flex; }
/* Toute la carte est cliquable, et c'est UN seul lien : deux zones
   cliquables pour une même destination doublent la tabulation sans rien
   apporter. */
.carte-ress__lien {
  display: flex; flex-direction: column; width: 100%;
  background: var(--surface);
  border: 1px solid var(--bordure-douce);
  border-radius: var(--r2);
  padding: clamp(20px, 2.2vw, 28px);
  text-decoration: none; color: inherit;
  transition: box-shadow .22s ease, border-color .22s ease, transform .22s ease;
}
.carte-ress__lien:hover, .carte-ress__lien:focus-visible {
  box-shadow: 0 14px 30px var(--ombre-portee);
  border-color: var(--pale);
  transform: translateY(-2px);
}
@media (prefers-reduced-motion: reduce) { .carte-ress__lien { transition: none; }
  .carte-ress__lien:hover { transform: none; } }
/* Boîte CARRÉE, parce que les dessins le sont devenus : les variantes de
   `assets/img/carre/` partagent toutes le viewBox `0 0 1000 1000`, sujet
   centré à 8 % de marge (outils/carrer_croquis.py). La régularité de la
   rangée vient de là et non d'ici — en CSS, une hauteur fixe cadre la
   boîte du fichier, jamais le sujet. */
.carte-ress__visuel {
  display: grid; place-items: center;
  width: clamp(120px, 12vw, 156px);
  aspect-ratio: 1;
  margin-bottom: clamp(14px, 1.6vw, 20px);
}
.carte-ress__visuel svg { width: 100%; height: 100%; }
.carte-ress__titre {
  font-size: clamp(1.05rem, .98rem + .4vw, 1.22rem);
  line-height: 1.28; margin: 0 0 .55rem;
}
.carte-ress__lien:hover .carte-ress__titre { color: var(--texte-lien); }
.carte-ress__accroche { display: block; color: var(--texte-doux); font-size: 1rem; }

/* La capsule repliable des sources. <details> natif : pas de script,
   état annoncé aux lecteurs d'écran, ouvrable au clavier — et si les
   scripts sont bloqués, les sources restent atteignables.
   Bleu nuit et pleine largeur du wrap : sur une page de preuve, le bloc
   des sources est un objet à part, pas la fin du texte courant. */
.capsule {
  background: var(--surface-nuit); color: var(--sur-nuit);
  border-radius: var(--pill);
  margin-block: clamp(30px, 3.4vw, 46px);
}
.capsule[open] { border-radius: var(--r2); }
.capsule__tete {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: clamp(18px, 2vw, 26px) clamp(24px, 3vw, 40px);
  cursor: pointer; list-style: none;
  font-weight: 800; font-size: clamp(1.05rem, .98rem + .4vw, 1.22rem);
  /* SC 2.5.8 : la tête sert de cible tactile, elle doit rester
     confortablement au-dessus de 24 px. */
  min-height: 44px;
  border-radius: inherit;
}
.capsule__tete::-webkit-details-marker { display: none; }
.capsule__titre { font-size: inherit; font-weight: inherit; margin: 0; }
.capsule__tete:hover { color: var(--pale); }
/* Le chevron est dessiné en CSS et non posé en balise : le modèle de
   contenu de <summary> admet UN élément de titre, ou du contenu de
   phrasé — pas un titre PLUS un span. Le titre étant devenu un <h2>
   (navigation par titres au lecteur d'écran), la flèche doit sortir du
   flux de contenu. */
.capsule__tete::after {
  content: ""; flex: none;
  width: 11px; height: 11px;
  border-right: 2.4px solid currentColor;
  border-bottom: 2.4px solid currentColor;
  rotate: 45deg; translate: 0 -3px;
  transition: rotate .22s ease, translate .22s ease;
}
.capsule[open] .capsule__tete::after { rotate: 225deg; translate: 0 3px; }
@media (prefers-reduced-motion: reduce) { .capsule__tete::after { transition: none; } }
.capsule__corps {
  padding: clamp(20px, 2.2vw, 28px) clamp(24px, 3vw, 40px) clamp(24px, 2.8vw, 34px);
  border-top: 1px solid rgba(255,255,255,.14);
  /* Le texte des références reste à mesure lisible même si le bloc, lui,
     prend toute la largeur. */
  max-width: 78ch;
}
.capsule__corps p { color: rgba(255,255,255,.82); }
/* Les liens DOI en bleu pâle : le bleu-canard des liens du site donne
   1,4:1 sur le bleu nuit. Le pâle donne 8:1. */
.capsule a { color: var(--pale); }
.capsule a:hover { color: #FFFFFF; }
.capsule .sources-liste li { color: var(--sur-nuit); }

/* La note de méthode qui ferme le hub : pleine largeur, en petit, mais
   en deux colonnes au-delà de 900 px — une ligne de 120 caractères ne se
   lit pas, même en petit corps. */
.note-methode {
  margin-top: clamp(34px, 4vw, 56px);
  padding-top: clamp(22px, 2.4vw, 30px);
  border-top: 1px solid var(--bordure-douce);
  font-size: .92rem; line-height: 1.6; color: var(--texte-doux);
}
.note-methode p { margin: 0 0 .9em; }
@media (min-width: 900px) {
  .note-methode { columns: 2; column-gap: clamp(34px, 4vw, 64px); }
  .note-methode p { break-inside: avoid; }
}
.mention-legale { font-size: .88rem; color: var(--texte-doux); font-style: italic; }

/* Liste de sources numérotée. Le DOI est sur sa propre ligne : une URL
   longue coupée au milieu d'une phrase est illisible. */
.sources-liste { padding-left: 1.4rem; }
.sources-liste li { margin-bottom: .85rem; line-height: 1.5; }
.sources-liste a { font-size: .94rem; word-break: break-word; }

/* =========================================================================
   38. Page /l-outil/ — l'explorateur (BRIEF_PAGE_OUTIL.md)
   -------------------------------------------------------------------------
   Registre SOBRE : pas de scotch, pas d'inclinaison. Le risque de cette
   page est l'allure de panneau d'administration ; tout ce qui suit vise
   à l'éviter — pas de cases, pas de facettes, pas de compteurs.
   ========================================================================= */


.axe__grille { display: grid; gap: clamp(26px, 3vw, 44px); }
@media (min-width: 900px) {
  .axe__grille { grid-template-columns: minmax(240px, 320px) 1fr; align-items: start; }
}

/* --- la colonne de gauche --------------------------------------------- */
.entrees { display: grid; gap: 2px; }
.entree {
  display: block; width: 100%; text-align: left;
  /* Densifié (§2.2) : 44 px de haut au lieu de ~74, pour voir douze entrées
     au lieu de six. C'est une EXCEPTION assumée à l'échelle typographique
     du site — un panneau dense n'est pas du texte courant, et cette page
     s'adresse à des professionnels de santé. Ce n'est pas une régression :
     ne pas « corriger » vers l'échelle générale. Le minimum de 44 px de la
     SC 2.5.8 reste tenu, et le panneau d'accessibilité agrandit toujours. */
  min-height: 44px; padding: .5em .85em; font-size: .97rem; line-height: 1.3;
  font: inherit; font-weight: 600; color: var(--texte);
  background: transparent; border: 0; border-radius: var(--r1);
  cursor: pointer;
  transition: background-color .16s ease, opacity .16s ease, color .16s ease;
}
.entree:hover { background: var(--teinte); }
.entree[aria-current="true"] {
  background: var(--surface-nuit); color: var(--sur-nuit); font-weight: 800;
}
/* L'estompage de la lentille passe par l'OPACITÉ SEULE : jamais
   display:none, jamais aria-hidden. Un domaine estompé reste cliquable,
   focusable et lu par un lecteur d'écran — on hiérarchise, on n'enlève
   rien. Le focus ramène l'opacité pleine, sinon la cible disparaît sous
   les doigts de qui navigue au clavier. */
@media (prefers-reduced-motion: reduce) { .entree { transition: none; } }

/* --- la fiche : un visuel en haut, le texte en bas (§3.1) ------------------ */
.fiche {
  background: var(--surface);
  border: 1px solid var(--bordure-douce);
  border-radius: var(--r2);
  /* densifié (§2.2) : un panneau n'est pas du texte courant */
  padding: clamp(16px, 1.6vw, 22px);
  display: flex; flex-direction: column; gap: clamp(12px, 1.4vw, 18px);
}
/* §4 — le fondu des visuels. Pas de pellicule empilée : les fiches sont
   déjà exclusives, et passer de `display: none` à visible RELANCE une
   animation CSS. Un fondu de 280 ms suffit donc, sans une ligne de
   JavaScript ni onze copies du même dessin dans le DOM.
   Neutralisé sous mouvement réduit : bascule instantanée, pas
   d'atténuation. */
@keyframes fiche-apparait { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: no-preference) {
  .has-js .fiche:not([hidden]) { animation: fiche-apparait .28s ease both; }
}

/* Sans JS, les 81 fiches s'affichent les unes sous les autres : c'est long
   mais complet. Avec JS, seule l'active reste. */
.fiche + .fiche { margin-top: clamp(20px, 2.4vw, 30px); }
.has-js .fiche[hidden] { display: none; }

/* Le visuel domine : capture sur l'onglet Domaine, croquis en grand sur
   Pathologie et Type, qui n'ont pas de capture (§3.2). */
/* Le visuel est dimensionné par son RATIO, pas par la place restante.
   Premier essai en `flex: 1 1 auto` : le texte le comprimait jusqu'à zéro
   sur les fiches denses, `min-height: 0` autorisant l'écrasement complet.
   Un 16:10 pleine largeur occupe naturellement la majorité de la colonne
   (~440 px pour 705 de large), ce que demande le §3.1, et le plafond
   `46vh` l'empêche de tout manger sur un écran haut. */
.fiche__visuel { margin: 0; flex: none; }
.fiche__visuel picture { display: block; }
.fiche__visuel--capture img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 16 / 10;        /* place réservée : aucun décalage le jour
     où les vrais visuels remplacent les placeholders */
  max-height: 38vh;   /* ~60 % de la colonne, la cible du §3.1 */
  object-fit: cover;
  border-radius: var(--r1); border: 1px solid var(--bordure-douce);
}
.fiche__visuel figcaption {
  flex: none; margin-top: .5rem; font-size: .88rem; color: var(--texte-doux);
}
/* Pathologie et Type n'ont pas de capture : le croquis du domaine parent
   monte à sa place. Hauteur bornée, sinon un dessin carré occuperait toute
   la colonne. */
.fiche__visuel--croquis {
  /* La hauteur est posée dans une variable et RÉUTILISÉE par la pile, au
     lieu d'un `height: 100%` : dans une colonne qui défile, ce pourcentage
     ne se résolvait pas et le dessin reprenait sa taille naturelle — 560 px
     au lieu de 216, mais seulement sur l'onglet Type, celui dont la
     colonne dépasse. Une valeur explicite ne dépend de rien. */
  --h-croquis: clamp(150px, 24vh, 260px);
  display: grid; place-items: center;
  height: var(--h-croquis);
}
/* Le dessin est carré : on le borne par la HAUTEUR disponible, sinon une
   colonne large l'étirerait au-delà du cadre. */
/* Le dessin est carré : il se borne par la HAUTEUR de la case, sinon une
   colonne large l'étirerait au-delà du cadre. `width` reste NON déclarée —
   avec une hauteur définie et un `aspect-ratio`, le navigateur la déduit ;
   écrire `width: auto` dans une case centrée la renvoie au contenu, et le
   calcul devient circulaire (la pile mesurait 547 px au lieu de 216). */
.fiche__visuel--croquis .croquis-pile {
  display: block; height: var(--h-croquis); aspect-ratio: 1;
}
.fiche__visuel--croquis .croquis-pile picture,
.fiche__visuel--croquis .croquis-pile picture img {
  width: 100%; height: 100%; object-fit: contain;
}

.fiche__corps { flex: 0 0 auto; }
.fiche__entete { display: flex; align-items: center; gap: .8rem; }
.fiche__titre { font-size: 1.25rem; margin: 0; flex: 1 1 auto; }
/* Le croquis ne descend à côté du titre que si une capture occupe déjà le
   haut : jamais deux fois le même dessin dans la même fiche. */
.fiche__vignette { flex: none; width: 48px; display: block; }
/* Les visuels de domaine sont des piles raster à deux couches : la pile
   doit être un bloc pour que la couche d'accent, posée en absolu, ait une
   boîte de référence. */
.fiche__vignette .croquis-pile { display: block; width: 100%; }
.fiche__surtitre { margin: .25rem 0 0; font-size: .92rem; color: var(--texte-doux); }
.fiche__desc {
  color: var(--texte-doux); max-width: 74ch;
  font-size: 1rem; line-height: 1.45; margin: .5rem 0 0;
}

/* Métadonnées en ligne (§3.3) : empilées, elles mangeaient toute la
   hauteur. `dt` et `dd` sur la même ligne, pastilles serrées. */
.fiche__meta {
  display: grid; gap: .3rem .9rem; margin: .9rem 0 0;
  padding-top: .8rem; border-top: 1px solid var(--bordure-douce);
  font-size: .95rem;
}
@media (min-width: 560px) {
  .fiche__meta { grid-template-columns: max-content 1fr; align-items: baseline; }
}
.fiche__meta dt {
  font-size: .74rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ocre-texte); margin: 0; white-space: nowrap;
}
.fiche__meta dd { margin: 0; color: var(--texte); line-height: 1.4; }
/* La ligne des références est l'argument le plus fort de la page : elle se
   lit en plein texte, pas en petit gris. */
.fiche__refs { font-weight: 600; }

/* --- §5 : sous 900 px ------------------------------------------------------
   Le viewport-height ne tient pas sur mobile — barres d'interface
   escamotables, clavier virtuel. La hauteur redevient `auto`, la page
   défile normalement, et les colonnes s'empilent : liste au-dessus, fiche
   en dessous. La liste se replie en bande horizontale défilante plutôt
   qu'en `<select>` — on vient justement de retirer un select de cette page,
   et une bande garde les groupes lisibles. */
@media (max-width: 899px) {
  .has-js .axe__liste {
    display: flex; gap: 6px; overflow-x: auto;
    scroll-snap-type: x proximity;
    padding-bottom: 8px; margin-bottom: clamp(16px, 2vw, 24px);
  }
  .has-js .axe__liste .groupe { align-self: center; margin: 0 .2rem 0 .6rem; flex: none; }
  .has-js .axe__liste .groupe:first-child { margin-left: 0; }
  .has-js .axe__liste .entrees { display: flex; gap: 6px; }
  .has-js .axe__liste .entree {
    white-space: nowrap; scroll-snap-align: start;
    border: 1px solid var(--bordure-douce); border-radius: var(--pill);
  }
  .fiche__visuel--croquis { max-height: 34vh; }
  /* La rangée de filtres doit défiler DANS son cadre : sans min-width:0,
     la piste flex impose sa largeur au parent et c'est toute la page qui
     défile horizontalement — les filtres semblaient « coupés ». */
  .axe__grille, .axe { min-width: 0; }
  .has-js .axe__liste { min-width: 0; max-width: 100%; }
}


/* --- section configuration ------------------------------------------------ */
.config { display: grid; gap: clamp(26px, 3vw, 48px); align-items: center; }
@media (min-width: 900px) { .config { grid-template-columns: 1fr 1fr; } }
.config__texte p { max-width: 62ch; }
/* Deux variantes du même exercice, empilées : la preuve du texte d'à côté.
   Registre sobre — pas d'inclinaison ici. */
.config__capture { margin: 0; display: grid; gap: clamp(14px, 1.6vw, 22px); }
.config__capture img { width: 100%; height: auto; }
.config__capture figcaption { font-size: .88rem; color: var(--texte-doux); }

/* --- les trois onglets (BRIEF_OUTIL_ONGLETS) -----------------------------
   Trois portes vers le même catalogue. Sans JavaScript ils ne piloteraient
   rien : ils sont alors masqués et les trois axes s'affichent à la suite,
   chacun précédé de son titre. */
/* Hauteur de la barre d'en-tête collante, seule constante mesurée du
   calcul de plein écran. */
:root { --h-header: 84px; }
@media (max-width: 760px) { :root { --h-header: 72px; } }

@media (min-width: 900px) {
  #explorateur { padding-block: clamp(18px, 2vw, 30px) clamp(24px, 2.6vw, 36px); }
}

.onglets { display: none; }
.has-js .onglets {
  display: flex; flex-wrap: wrap; gap: 4px;
  /* le paragraphe d'introduction a été retiré : c'est le titre qui
     précède directement les onglets, il lui faut de l'air au-dessus */
  margin: clamp(16px, 1.8vw, 24px) 0 clamp(14px, 1.6vw, 20px);
  flex: none;
  border-bottom: 1px solid var(--bordure-douce);
}
.onglet {
  min-height: 44px; padding: .62em 1.1em;          /* SC 2.5.8 */
  font: inherit; font-weight: 700; color: var(--texte-doux);
  background: transparent; border: 0;
  border-bottom: 3px solid transparent; margin-bottom: -1px;
  cursor: pointer;
  transition: color .16s ease, border-color .16s ease;
}
.onglet:hover { color: var(--texte); }
.onglet[aria-selected="true"] { color: var(--texte); border-bottom-color: var(--ocre); }
@media (prefers-reduced-motion: reduce) { .onglet { transition: none; } }

/* Sans JS les trois axes se suivent ; avec JS seul l'axe actif reste. */
.axe + .axe { margin-top: clamp(40px, 5vw, 72px); }
/* ...et cette marge doit être ANNULÉE quand le script prend la main :
   `display: none` ne retire pas un élément de la fratrie, donc `.axe +
   .axe` s'appliquait encore aux deuxième et troisième axes. Pathologie et
   Type ouvraient sur 64 px de vide sous les onglets, pas Domaine. */
.has-js .axe + .axe { margin-top: 0; }
.has-js .axe[hidden] { display: none; }
.has-js .axe__titre { display: none; }   /* l'onglet le porte déjà */
.axe__titre { font-size: clamp(1.15rem, 1.05rem + .5vw, 1.4rem); margin: 0 0 1.2rem;
              font-weight: 800; }

/* --- §2.1 : le plein écran ------------------------------------------------
   La page était un DOCUMENT contenant un widget ; il faut un WIDGET qui
   occupe l'écran. La section prend une hauteur de vue, et ce sont les deux
   colonnes qui défilent, pas la page.

   `min-height: 0` est la ligne la plus importante de ce bloc : sans elle,
   un enfant de grille ou de flexbox refuse de rétrécir sous sa taille de
   contenu, les colonnes s'étirent, et c'est de nouveau la page qui bouge.

   La hauteur est répartie en flux plutôt que calculée à coups de
   soustractions : le titre et les onglets prennent ce qu'il leur faut, la
   grille prend le reste. Aucun nombre magique à retoucher si l'un des deux
   change de taille. Les 56 px retirés laissent dépasser le bloc suivant
   (§6) — sans ce débord, rien ne dit qu'il y a une suite. */
@media (min-width: 900px) {
  #explorateur > .wrap {
    display: flex; flex-direction: column;
    height: calc(100svh - var(--h-header) - 56px);
    min-height: 520px;
  }
  /* La chaîne doit être CONTINUE : `.wrap` → `.explorateur` → `.axe` →
     `.axe__grille`. Il suffit qu'un maillon oublie `min-height: 0` pour
     que tout le bloc reprenne sa hauteur de contenu — c'est ce qui est
     arrivé au premier essai, `.explorateur` ayant été sauté. */
  .has-js .explorateur { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
  .has-js .axe { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
  .has-js .axe__grille { flex: 1 1 auto; min-height: 0; }
  /* `minmax(0, 1fr)` et non la rangée implicite `auto` : une rangée `auto`
     se dimensionne sur son contenu maximal, donc elle DÉBORDE une grille
     de hauteur définie au lieu de s'y plier. C'est le pendant, côté
     grille, du `min-height: 0` des boîtes flexibles. */
  .axe__grille {
    grid-template-rows: minmax(0, 1fr);
    /* `align-items: start` sert quand la hauteur est libre ; en plein
       écran il fait dimensionner les colonnes sur leur contenu, et elles
       débordent la rangée. Il faut qu'elles s'étirent pour que le
       `overflow-y: auto` ait quelque chose à contraindre. */
    align-items: stretch;
  }
  .axe__grille > * { min-height: 0; }
  .axe__liste, .axe__fiches {
    overflow-y: auto;
    overscroll-behavior: contain;   /* le défilement ne déborde pas sur la page */
  }
  /* Barre de défilement LAISSÉE VISIBLE dans la liste : c'est elle qui dit
     « il y en a beaucoup », surtout sur l'onglet des 48 types. */
  .axe__liste { padding-right: 8px; }
  .axe__fiches { padding-right: 4px; }
  /* `min-height` et non `height` : une fiche courte remplit la colonne,
     une fiche dense la dépasse et c'est la colonne qui défile. */
  .fiche { min-height: 100%; }
}
.groupe {
  margin: clamp(16px, 1.8vw, 22px) 0 .4rem;
  font-size: .78rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ocre-texte);
}
.groupe:first-child { margin-top: 0; }

.fiche__surtitre {
  margin: -.2rem 0 .7rem; font-size: .95rem; color: var(--texte-doux);
}

/* Les pastilles de navigation croisée : le cœur du dispositif, elles
   montrent que le catalogue est un graphe et non trois listes.
   Livrées en <span> inertes, le script les promeut en <button>. */
.pastille {
  display: inline-block; margin: 0 .18em .3em 0;
  padding: .26em .7em;
  font-size: .93rem; line-height: 1.35;
  background: var(--teinte); color: var(--texte);
  border: 1px solid transparent; border-radius: var(--pill);
}
button.pastille {
  cursor: pointer; font-family: inherit;
  min-height: 32px;
  transition: background-color .16s ease, border-color .16s ease;
}
button.pastille:hover { background: var(--surface-nuit); color: var(--sur-nuit); }
@media (prefers-reduced-motion: reduce) { button.pastille { transition: none; } }

/* Réservé aux lecteurs d'écran : annonce le changement de fiche. */
.sr-seul {
  position: absolute; width: 1px; height: 1px; margin: -1px;
  padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}

/* --- la grille de vignettes et la fiche au clic ---------------------------
   Colonne droite : on ne voit que les visuels. Le libellé ne s'affiche
   qu'au survol ou au focus — mais il reste dans le document, donc lu par
   les lecteurs d'écran et trouvable par la recherche du navigateur.
   Sur écran tactile, où le survol n'existe pas, rien n'est perdu :
   toucher une vignette ouvre la fiche. */
.grille {
  display: grid; gap: clamp(10px, 1.2vw, 16px);
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 180px), 1fr));
  margin: 0; padding: 0; list-style: none;
}
.tuile {
  position: relative; display: block; width: 100%;
  aspect-ratio: 16 / 10;   /* une série d'écrans, pas une planche d'icônes */
  padding: 0;
  font: inherit; color: inherit; text-align: left;
  background: var(--surface);
  border: 1px solid var(--bordure-douce); border-radius: var(--r1);
  cursor: pointer; overflow: hidden;
  transition: border-color .16s ease, box-shadow .16s ease;
}
.tuile:hover, .tuile:focus-visible {
  border-color: var(--pale); box-shadow: 0 10px 24px var(--ombre-portee);
}
.tuile__visuel, .tuile__visuel picture { display: block; width: 100%; height: 100%; }
.tuile__visuel img { display: block; width: 100%; height: 100%; object-fit: cover; }

/* Le panneau d'information : posé PAR-DESSUS le visuel, pas à côté — la
   vignette garde sa taille, la grille ne bouge pas au survol. */
.tuile__info {
  position: absolute; inset: 0;
  /* `z-index` explicite : les deux couches de la pile raster portent le
     leur, elles passeraient sinon PAR-DESSUS ce panneau pourtant posé en
     absolu. */
  z-index: 2;
  display: flex; flex-direction: column; justify-content: flex-end; gap: .15rem;
  padding: clamp(10px, 1.1vw, 14px);
  /* Bandeau dégradé plutôt qu'aplat plein : le dessin reste reconnaissable
     sous le libellé, et c'est lui qu'on est venu voir. */
  background: linear-gradient(to top,
              rgba(23, 50, 63, .97) 0%, rgba(23, 50, 63, .92) 46%, rgba(23, 50, 63, 0) 100%);
  color: var(--sur-nuit);
  opacity: 0; transition: opacity .16s ease;
}
.tuile:hover .tuile__info,
.tuile:focus .tuile__info,
.tuile:focus-visible .tuile__info { opacity: 1; }
.tuile__titre { font-weight: 700; font-size: .95rem; line-height: 1.25; }
.tuile__sur { font-size: .82rem; color: var(--pale); }
@media (prefers-reduced-motion: reduce) {
  .tuile, .tuile__info { transition: none; }
}

/* La fiche se pose PAR-DESSUS la grille au lieu de la remplacer : l'écran
   choisi s'agrandit devant les autres, qui restent perceptibles derrière.
   C'est ce que demande la propriétaire, et c'est aussi ce qui garde le
   contexte — on voit d'où l'on vient. */
@media (min-width: 900px) {
  .axe__droite { position: relative; min-height: 0; display: flex; flex-direction: column; }
  .grille { overflow-y: auto; overscroll-behavior: contain; flex: 1 1 auto; min-height: 0;
            align-content: start; padding-right: 4px; }
  .has-js .axe__fiches {
    position: absolute; inset: 0; z-index: 6;
    overflow-y: auto; overscroll-behavior: contain;
    /* NI cadre, NI arrondi, NI ombre : ce n'est pas une fenêtre qui
       s'ouvre, c'est le même plan. Un voile clair suffit à détacher
       l'écran choisi et à garder le texte lisible ; les vignettes restent
       perceptibles autour. */
    padding: 0;
    background: color-mix(in srgb, var(--page) 88%, transparent);
  }
}
@supports not (background: color-mix(in srgb, red, blue)) {
  .has-js .axe__fiches { background: var(--page); }
}

/* Dans le panneau superposé, la fiche perd son habit de carte : plus de
   fond, plus de bordure, plus de rayon. Le visuel est simplement plus
   grand et centré au-dessus des vignettes, l'information dessous. */
.has-js .axe__fiches .fiche {
  background: transparent; border: 0; border-radius: 0;
  padding: 0; min-height: 0;
  max-width: 620px; margin-inline: auto;
}
.has-js .axe__fiches .fiche__visuel--capture img {
  max-height: none; border: 0;
  box-shadow: 0 18px 40px var(--ombre-portee);   /* il flotte, il n'est pas encadré */
}
.has-js .axe__fiches .fiche__visuel--croquis { --h-croquis: clamp(180px, 30vh, 320px); }
/* Un aplat crème sous le TEXTE seulement : posé sur le voile, sur des
   vignettes floues derrière, la lecture souffrait. Le visuel, lui, reste
   libre — c'est lui qu'on est venu voir, il n'a pas besoin d'un socle.
   Toujours ni bordure ni cadre : c'est un fond, pas un contour. */
.has-js .axe__fiches .fiche { gap: 0; }
.has-js .axe__fiches .fiche__visuel figcaption {
  background: var(--surface); color: var(--texte-doux);
  margin: 0; padding: clamp(14px, 1.6vw, 20px) clamp(16px, 1.8vw, 24px) 0;
  border-radius: var(--r1) var(--r1) 0 0;
}
.has-js .axe__fiches .fiche__corps {
  text-align: left;
  background: var(--surface);
  padding: clamp(14px, 1.6vw, 20px) clamp(16px, 1.8vw, 24px) clamp(16px, 1.8vw, 24px);
  border-radius: 0 0 var(--r1) var(--r1);
}
/* Sans légende au-dessus (pathologie, type), le bloc arrondit ses quatre
   coins et se décolle du visuel. */
.has-js .axe__fiches .fiche__visuel--croquis + .fiche__corps {
  margin-top: clamp(10px, 1.2vw, 16px); border-radius: var(--r1);
}

/* Le retour se fait discret : un lien, pas un bouton encadré. */
.has-js .axe__fiches .retour {
  border: 0; padding-inline: 0; background: transparent;
}
.has-js .axe__fiches .retour:hover { text-decoration: underline; }
.has-js .grille[hidden], .has-js .axe__fiches[hidden] { display: none; }
/* Sous 900 px le panneau revient dans le flux : la grille passerait alors
   AU-DESSUS de la fiche ouverte. On la retire là, et là seulement. */
@media (max-width: 899px) {
  .has-js .axe.est-ouverte .grille { display: none; }
}

.retour-ligne { margin: 0 0 clamp(12px, 1.4vw, 18px); }
.retour {
  min-height: 44px; padding: .45em .9em;         /* SC 2.5.8 */
  font: inherit; font-size: .93rem; font-weight: 600; color: var(--texte-lien);
  background: transparent; border: 1px solid var(--bordure-douce);
  border-radius: var(--pill); cursor: pointer;
}
.retour:hover { border-color: var(--pale); color: var(--texte-lien-actif); }
/* Sans JavaScript il n'y a pas de grille à laquelle revenir : les fiches
   sont déjà toutes affichées. */
.retour-ligne { display: none; }
.has-js .retour-ligne { display: block; }

/* --- les capsules de la fiche --------------------------------------------
   Plus légères que la capsule navy des pages Ressources : ici elles se
   répètent trois ou quatre fois par fiche, un aplat sombre les rendrait
   plus lourdes que le texte qu'elles portent. */
.repli { border-top: 1px solid var(--bordure-douce); }
.repli:first-of-type { margin-top: .9rem; }
.repli__tete {
  display: flex; align-items: center; gap: .5rem;
  min-height: 44px; padding: .5rem 0;            /* SC 2.5.8 */
  cursor: pointer; list-style: none;
  font-size: .74rem; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ocre-texte);
}
.repli__tete::-webkit-details-marker { display: none; }
.repli__tete::after {
  content: ""; width: 8px; height: 8px; flex: none;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  rotate: 45deg; translate: 0 -2px;
  transition: rotate .16s ease, translate .16s ease;
}
.repli[open] .repli__tete::after { rotate: 225deg; translate: 0 2px; }
@media (prefers-reduced-motion: reduce) { .repli__tete::after { transition: none; } }
.repli__corps { padding-bottom: .8rem; font-size: .95rem; line-height: 1.45; }
/* Le gras de `--fort` est RETIRÉ. Il datait des capsules empilées sur fond
   crème, où il servait de hiérarchie. Dans un bandeau à trois colonnes,
   chaque colonne a déjà son intertitre ocre : le gras ne hiérarchise plus
   rien, il alourdit. La classe reste posée dans le HTML — elle ne peint
   plus, mais elle dit encore quels blocs comptent le plus. */

/* --- l'explorateur dans un cadre sombre ----------------------------------
   Listes et visuels vivent désormais dans un même bloc bleu nuit. Deux
   conséquences qu'il faut traiter ensemble, sinon la moitié du contenu
   devient illisible : le texte passe en clair, et l'ocre de TEXTE
   (#8A6200, prévu pour le papier) cède la place à l'ocre de marque
   #D99A55, qui donne 5,6:1 sur ce fond. */
.axe__grille {
  background: var(--surface-nuit); color: var(--sur-nuit);
  border-radius: var(--r2);
  padding: clamp(14px, 1.6vw, 24px);
}
.axe__grille .groupe { color: var(--ocre); }
.axe__grille .entree { color: var(--sur-nuit); }
.axe__grille .entree:hover { background: rgba(255, 255, 255, .10); }
/* L'entrée active s'inverse : sur un cadre déjà nuit, le pavé navy
   d'origine se serait confondu avec le fond. */
.axe__grille .entree[aria-current="true"] {
  background: var(--sur-nuit); color: var(--surface-nuit);
}
.axe__grille .entree:focus-visible { outline-color: var(--pale); }

/* Le voile de la fiche suit le cadre : un voile crème sur fond nuit
   aurait rouvert l'effet « fenêtre » qu'on vient d'enlever. */
@media (min-width: 900px) {
  .has-js .axe__grille .axe__fiches {
    background: color-mix(in srgb, var(--surface-nuit) 90%, transparent);
  }
}
@supports not (background: color-mix(in srgb, red, blue)) {
  .has-js .axe__grille .axe__fiches { background: var(--surface-nuit); }
}
/* Le cadre passe le texte en clair, et cette couleur DESCEND jusque dans
   les blocs crème de la fiche : le titre et le corps des capsules, qui
   n'ont pas de couleur propre, s'y effaçaient. On rend l'encre là où le
   fond redevient clair. */
.axe__grille .fiche__corps { color: var(--texte); }
.axe__grille .fiche__titre { color: var(--texte); }

.axe__grille .retour { color: var(--pale); }
.axe__grille .retour:hover { color: #FFFFFF; }

/* La bande horizontale du repli mobile, sur fond sombre. */
@media (max-width: 899px) {
  .has-js .axe__grille .axe__liste .entree { border-color: rgba(255, 255, 255, .22); }
}

/* --- le même cadre, au thème sombre ---------------------------------------
   La page vire au brun-nuit : un cadre nuit s'y fondrait. C'est donc le
   cadre qui devient le papier — l'inverse exact du thème clair. Les
   valeurs claires sont posées en DUR : les jetons sémantiques basculent
   avec le thème et livreraient ici les couleurs de nuit. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="clair"]) .axe__grille { background: #F3EEE4; color: #1E272C; }
  :root:not([data-theme="clair"]) .axe__grille .groupe { color: #8A6200; }
  :root:not([data-theme="clair"]) .axe__grille .entree { color: #17323F; }
  :root:not([data-theme="clair"]) .axe__grille .entree[aria-current="true"] { background: #17323F; color: #F5F1E8; }
  :root:not([data-theme="clair"]) .axe__grille .entree:focus-visible { outline-color: #17323F; }
  :root:not([data-theme="clair"]) .axe__grille .retour { color: #2C566C; }
  :root:not([data-theme="clair"]) .axe__grille .retour:hover { color: #17323F; }
  :root:not([data-theme="clair"]) .axe__grille .fiche__corps,
  :root:not([data-theme="clair"]) .axe__grille .fiche__titre { color: #1E272C; }
  :root:not([data-theme="clair"]) .axe__grille .fiche__surtitre { color: #56605F; }
  :root:not([data-theme="clair"]) .has-js .axe__grille .axe__fiches .fiche { background: #FCFAF5; }
  @media (min-width: 900px) {
    :root:not([data-theme="clair"]) .has-js .axe__grille .axe__fiches {
      background: color-mix(in srgb, #F3EEE4 90%, transparent);
    }
  }
  @media (max-width: 899px) {
    :root:not([data-theme="clair"]) .has-js .axe__grille .axe__liste .entree { border-color: rgba(30, 39, 44, .22); }
  }
}
:root[data-theme="sombre"] .axe__grille { background: #F3EEE4; color: #1E272C; }
:root[data-theme="sombre"] .axe__grille .groupe { color: #8A6200; }
:root[data-theme="sombre"] .axe__grille .entree { color: #17323F; }
:root[data-theme="sombre"] .axe__grille .entree[aria-current="true"] { background: #17323F; color: #F5F1E8; }
:root[data-theme="sombre"] .axe__grille .entree:focus-visible { outline-color: #17323F; }
:root[data-theme="sombre"] .axe__grille .retour { color: #2C566C; }
:root[data-theme="sombre"] .axe__grille .retour:hover { color: #17323F; }
:root[data-theme="sombre"] .axe__grille .fiche__corps,
:root[data-theme="sombre"] .axe__grille .fiche__titre { color: #1E272C; }
:root[data-theme="sombre"] .axe__grille .fiche__surtitre { color: #56605F; }
:root[data-theme="sombre"] .has-js .axe__grille .axe__fiches .fiche { background: #FCFAF5; }
@media (min-width: 900px) {
  :root[data-theme="sombre"] .has-js .axe__grille .axe__fiches {
    background: color-mix(in srgb, #F3EEE4 90%, transparent);
  }
}
@media (max-width: 899px) {
  :root[data-theme="sombre"] .has-js .axe__grille .axe__liste .entree { border-color: rgba(30, 39, 44, .22); }
}

/* ==========================================================================
   §39 — LA FICHE EN CAPSULES ET CARTES POSÉES
   --------------------------------------------------------------------------
   Reprise de la référence apportée par la propriétaire (template BenBox),
   dont on ne garde QUE la mécanique de composition — pas la palette ni la
   typographie, qui appartiennent à un registre publicitaire incompatible
   avec une page destinée à des cliniciens.

   Six gestes, dans l'ordre de la demande : titre en capsule, visuel nu,
   cartes imbriquées dessous, ombre portée légère, alignement volontairement
   imparfait, et une colonne de gauche qui reste aérée par contraste.
   ========================================================================== */

/* --- 1. Le titre est une capsule ------------------------------------------
   Elle porte sa PROPRE paire de couleurs et ne dépend donc plus du fond
   sous elle : la même capsule tient sur le crème d'une fiche en flux et
   sur le nuit du panneau superposé. C'est ce qui rend caduque la
   correction de couleur du §38 — l'ocre ne descend plus par héritage, il
   est posé ici avec son fond. */
.fiche__entete { align-items: center; gap: .7rem; }
.fiche__titre {
  flex: 0 1 auto;
  background: var(--ocre); color: var(--surface-nuit);
  padding: .34em .95em; border-radius: var(--pill);
  font-size: 1.12rem; line-height: 1.3;
  box-shadow: 0 2px 8px var(--ombre-portee);
}
.axe__grille .fiche__titre { color: var(--surface-nuit); }
.fiche__surtitre { margin-top: .5rem; }

/* --- 2. Le visuel principal est nu ----------------------------------------
   La légende quitte la figure et descend dans le corps : plus aucun texte
   accroché sous l'image. Réglage de repli — si une figcaption réapparaît
   un jour dans le HTML, elle ne doit pas récupérer l'ancien socle crème. */
.has-js .axe__fiches .fiche__visuel figcaption {
  background: none; padding: 0; border-radius: 0; margin-top: .5rem;
}
.fiche__legende {
  margin: 0 0 .6rem; font-size: .88rem; color: var(--texte-doux);
}

/* --- 3. Le corps est une carte, les capsules des cartes dans la carte -----
   Le filet supérieur qui séparait les replis disparaît : deux cartes
   voisines se distinguent déjà par leur fond, un trait de plus n'ajoute
   que du bruit. Le fond `--page` sous le `--surface` du corps fait la
   profondeur — un cran, pas deux. */
.repli {
  border-top: 0;
  background: var(--page);
  border: 1px solid var(--bordure-douce);
  border-radius: var(--r1);
  padding: .1rem .85rem;
  box-shadow: 0 1px 3px var(--ombre-portee);
}
.repli + .repli { margin-top: .5rem; }
.repli:first-of-type { margin-top: 1rem; }
.repli__corps { padding-bottom: .75rem; }

/* --- 4 et 5. L'ombre légère, et l'alignement volontairement imparfait -----
   L'amplitude du décalage reste sous 16 px : au-delà, on ne lit plus un
   décalage voulu mais un défaut de gabarit. Elle est en `clamp` donc nulle
   sur petit écran, où la largeur disponible ne permet aucun jeu. */
.repli:nth-of-type(odd)  { margin-right: clamp(0px, 1.4vw, 16px); }
.repli:nth-of-type(even) { margin-left:  clamp(0px, 1.4vw, 16px); }
.fiche__entete { margin-left: clamp(0px, 1vw, 12px); }

/* Dans le panneau superposé, le corps se décolle franchement du visuel et
   arrondit ses quatre coins : il n'est plus la moitié basse d'un bloc
   collé à l'image, mais une carte posée en dessous. */
.has-js .axe__fiches .fiche { gap: clamp(10px, 1.2vw, 16px); }
.has-js .axe__fiches .fiche__corps {
  border-radius: var(--r1);
  box-shadow: 0 10px 30px var(--ombre-portee);
  margin-right: clamp(0px, 1.2vw, 14px);
}
.has-js .axe__fiches .fiche__entete { margin-bottom: 0; }

/* --- 6. La colonne de gauche reste aérée ----------------------------------
   Le contraste demandé est un contraste de DENSITÉ, pas de couleur : à
   droite des cartes empilées et ombrées, à gauche une liste qui respire.
   Le gras uniforme tombe — il ne reste que sur l'entrée active, qui n'a
   plus besoin de rivaliser avec ses voisines pour se voir. */
.axe__grille .entrees { gap: 5px; }
.axe__grille .entree { font-weight: 500; }
.axe__grille .entree[aria-current="true"] { font-weight: 700; }
.axe__grille .groupe { letter-spacing: .08em; }

/* Le visuel se borne par la HAUTEUR disponible, via sa largeur — un
   `max-height` déformerait la boîte, dont le ratio 16:10 est ce qui garantit
   qu'aucune capture n'est rognée. Sans ce plafond, l'image seule remplissait
   tout le panneau et la carte de texte passait sous la ligne de flottaison,
   sans rien pour signaler qu'elle existe. Il en reste maintenant un bandeau
   visible : c'est l'invitation à faire défiler. */
.has-js .axe__fiches .fiche__visuel--capture {
  max-width: min(100%, 58vh); margin-inline: auto;
}

/* Le surtitre a suivi le titre HORS de la carte crème : il se retrouve donc
   posé sur le voile nuit, où le gris de texte doux (#56605F) tombait à
   1,9:1. Il prend la couleur pâle du cadre — 8,4:1 — mais UNIQUEMENT dans
   le panneau superposé : sans JavaScript la fiche garde son fond crème, et
   le pâle y serait tout aussi illisible dans l'autre sens. */
.has-js .axe__fiches .fiche__surtitre { color: var(--pale); }

/* ==========================================================================
   §40 — RETOUCHES PROPRIÉTAIRE : LISTE DENSE, GRILLE DÉCALÉE, GRANDE CARTE
   --------------------------------------------------------------------------
   Ce bloc DÉFAIT plusieurs réglages du §39, qui n'a pas survécu à l'essai.
   Ne pas « rétablir » ce qui suit vers l'état précédent : chaque annulation
   est un arbitrage tenu, pas un oubli.
   ========================================================================== */

/* --- la colonne de gauche : ni capsule, ni gras, et resserrée ------------- */
/* L'entrée active perdait sa capsule crème : sur un cadre déjà sombre, un
   pavé clair pesait plus lourd que tout le reste de la liste. Elle se
   marque au bleu pâle (8,0:1) DOUBLÉ d'un filet ocre — la couleur seule ne
   doit pas porter l'information. */
.axe__grille .entree[aria-current="true"] {
  background: transparent; color: var(--pale); font-weight: 500;
  box-shadow: inset 3px 0 0 var(--ocre);
}
.axe__grille .entree:hover { background: rgba(245, 241, 232, .07); }
/* Resserrement demandé : l'interligne tombe de 1,3 à 1,15 et la hauteur
   minimale de 44 à 34 px. La SC 2.5.8 exige 24 px — on reste au-dessus,
   mais la marge confortable du reste du site n'est plus tenue ICI.
   C'est un arbitrage propriétaire, sur une page de professionnels et sur
   des cibles alignées verticalement (donc sans voisin latéral à manquer). */
.axe__grille .entrees { gap: 0; }
.axe__grille .entree {
  min-height: 34px; padding: .28em .8em; line-height: 1.15;
}

/* --- la grille : trois colonnes DÉCALÉES ---------------------------------
   Les visuels ne doivent plus s'aligner à l'horizontale. Le décalage est
   porté par la colonne, pas par la vignette : `nth-child(3n)` reste juste
   quel que soit le nombre d'éléments, là où une alternance ligne à ligne
   se déphaserait au premier ajout. Neutralisé sous 900 px, où la grille
   n'a plus trois colonnes. */
@media (min-width: 900px) {
  .grille > li:nth-child(3n - 1) { margin-top: 26px; }
  .grille > li:nth-child(3n)     { margin-top: 13px; }
}

/* --- la vignette : le cadre dessiné au plus près -------------------------
   Le ratio suit maintenant le TRAIT du cadre (1024 x 740), rogné au pixel
   sur le dessin. Plus de `cover` : il rognerait ce qu'on vient de cadrer.
   Le fond papier comble le reste, le cadre y flotte. */
/* Plus de carte sous le dessin : le cadre dessiné EST la vignette. Un fond
   et une bordure y ajoutaient un second cadre, concentrique au premier, ce
   qui est exactement ce que « au plus près » demandait de supprimer. Le
   survol se marque alors par une ombre seule. */
.tuile {
  aspect-ratio: 1024 / 740;
  background: transparent; border-color: transparent; border-radius: 0;
}
.tuile:hover, .tuile:focus-visible { border-color: transparent; }
.tuile__visuel img { object-fit: contain; }

/* Le survol n'assombrit plus la vignette d'un dégradé : le titre s'y pose
   en capsule, comme celui de la fiche. Le voile papier léger sert seulement
   à décoller la capsule du dessin. */
.tuile__info {
  display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: .35rem;
  background: color-mix(in srgb, var(--page) 74%, transparent);
}
@supports not (background: color-mix(in srgb, red, blue)) {
  .tuile__info { background: rgba(243, 238, 228, .82); }
}
.tuile__titre {
  background: var(--ocre); color: var(--surface-nuit);
  padding: .3em .85em; border-radius: var(--pill);
  font-size: .9rem; font-weight: 700; line-height: 1.2;
  box-shadow: 0 2px 8px var(--ombre-portee);
}
.tuile__sur {
  background: var(--surface-nuit); color: var(--sur-nuit);
  padding: .2em .7em; border-radius: var(--pill);
  font-size: .7rem; letter-spacing: .05em;
}

/* --- la croix de fermeture ----------------------------------------------- */
.fermer {
  position: absolute; top: 0; right: 0; z-index: 8;
  width: 44px; height: 44px;                     /* SC 2.5.8, plein format */
  display: grid; place-items: center;
  font: inherit; font-size: 1.6rem; line-height: 1;
  color: var(--sur-nuit); background: var(--surface-nuit);
  border: 1px solid rgba(245, 241, 232, .28);
  border-radius: var(--pill); cursor: pointer;
}
.fermer:hover { background: var(--ocre); color: var(--surface-nuit); border-color: transparent; }
/* Sans JavaScript il n'y a pas de grille à laquelle revenir : les fiches
   sont déjà toutes affichées, la croix ne fermerait rien. */
.fermer { display: none; }
.has-js .fermer { display: grid; }

/* --- la grande carte ------------------------------------------------------
   « Le tout visible à l'écran » : c'est une CONTRAINTE DE HAUTEUR, et elle
   se tient en mettant le texte et les capsules côte à côte sous le visuel
   plutôt que l'un sous l'autre. Le panneau ne défile plus. */
@media (min-width: 900px) {
  .has-js .axe__fiches { overflow: hidden; }
  .has-js .axe__fiches .fiche {
    max-width: min(100%, 900px);
    height: 100%; display: flex; flex-direction: column;
    gap: clamp(8px, 1vw, 14px);
  }
  /* Le visuel prend la place qui reste, et se borne par sa hauteur : c'est
     lui qui cède, pas le texte — un paragraphe tronqué ne se rattrape pas,
     une image un peu plus petite se lit encore. */
  .has-js .axe__fiches .fiche__visuel--capture {
    flex: 1 1 auto; min-height: 0; max-width: none;
    display: grid; place-items: center;
  }
  .has-js .axe__fiches .fiche__visuel--capture picture,
  .has-js .axe__fiches .fiche__visuel--capture img {
    height: 100%; width: auto; max-width: 100%;
    aspect-ratio: 1024 / 740; object-fit: contain;
  }
  .has-js .axe__fiches .fiche__visuel--croquis {
    flex: 1 1 auto; min-height: 0; height: auto; --h-croquis: 100%;
  }
  .has-js .axe__fiches .fiche__visuel--croquis .croquis-pile { height: 100%; }
  /* Les deux cartes intégrées, côte à côte. */
  .has-js .axe__fiches .fiche__corps {
    flex: 0 0 auto; margin-right: 0;
    display: grid; grid-template-columns: 1fr 1fr;
    gap: clamp(10px, 1.2vw, 16px); align-items: start;
    background: transparent; box-shadow: none; padding: 0;
  }
  .has-js .axe__fiches .fiche__texte,
  .has-js .axe__fiches .fiche__replis {
    background: var(--surface); border-radius: var(--r1);
    padding: clamp(12px, 1.2vw, 16px);
    box-shadow: 0 8px 24px var(--ombre-portee);
    max-height: 30vh; overflow-y: auto;
  }
  .has-js .axe__fiches .fiche__texte { margin-top: 10px; }   /* décalé, comme la grille */
  .has-js .axe__fiches .fiche__desc { margin-top: 0; }
  /* Dans la carte de droite les capsules sont déjà l'objet : elles perdent
     leur fond propre, qui ferait une troisième épaisseur pour rien. */
  .has-js .axe__fiches .fiche__replis .repli {
    background: var(--page); margin-inline: 0;
  }
  .has-js .axe__fiches .fiche__replis .repli:first-of-type { margin-top: 0; }
  .has-js .axe__fiches .fiche__entete { margin-left: 0; }
}
/* Le titre en capsule est CENTRÉ au-dessus du visuel. */
.has-js .axe__fiches .fiche__entete { justify-content: center; }
.has-js .axe__fiches .fiche__surtitre { text-align: center; }

/* Le visuel débordait sous les deux cartes : `height: 100%` sur une image
   posée dans une case de grille centrée ne se résout pas — la case est en
   `auto`, la hauteur y est circulaire, et l'image reprenait sa taille
   naturelle. On la sort du flux : dans une boîte flex de hauteur définie,
   `position: absolute` a une référence, elle. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--capture {
    position: relative; display: block;
  }
  .has-js .axe__fiches .fiche__visuel--capture picture { position: absolute; inset: 0; }
  .has-js .axe__fiches .fiche__visuel--capture img {
    width: 100%; height: 100%; aspect-ratio: auto; object-fit: contain;
  }
  /* Et les deux cartes se bornent à 42 % de la fiche : sans plafond, un
     texte long les faisait grandir jusqu'à chasser le visuel. Le texte qui
     dépasse défile DANS sa carte, ce qui garde la fiche entière à l'écran —
     c'est la contrainte demandée. */
  .has-js .axe__fiches .fiche__corps { max-height: 42%; }
  .has-js .axe__fiches .fiche__texte,
  .has-js .axe__fiches .fiche__replis { max-height: 100%; }
}

/* Le visuel mesurait ZÉRO de large : `margin-inline: auto`, hérité du
   panneau centré, ANNULE l'étirement d'un élément flex sur son axe
   transversal — et comme la figure ne contenait plus que du positionné
   absolu, sa largeur de contenu valait 0. La marge auto n'a plus lieu
   d'être ici : c'est la fiche entière qui est centrée, pas la figure. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--capture { margin-inline: 0; }
}

/* Le <picture> restait calé à GAUCHE et large de 221 px : avec une hauteur
   définie ET un `aspect-ratio`, la largeur est CALCULÉE par le ratio, et
   l'inset droit devient sur-contraint donc ignoré. Il faut donc annuler le
   ratio ici et poser les deux dimensions — c'est `object-fit` sur l'image
   qui préserve les proportions, plus la boîte. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--capture picture {
    width: 100%; height: 100%; aspect-ratio: auto; max-width: none;
  }
  .has-js .axe__fiches .fiche__corps { max-height: 40%; }
}

/* Les trois capsules ne tenaient pas dans la carte de droite : leur pile
   demande ~165 px et le plafond n'en donnait que 152 sur un écran de
   720 px. Le plafond devient `min(46%, 230px)` — une part sur écran court,
   une valeur fixe dès qu'il y a de la place, le visuel gardant tout le
   reste. Et les capsules se resserrent : la tête garde ses 44 px de cible,
   c'est l'espacement autour qui cède. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__corps { max-height: min(46%, 230px); }
  .has-js .axe__fiches .fiche__replis { padding: 10px; }
  .has-js .axe__fiches .fiche__replis .repli { padding: 0 .7rem; }
  .has-js .axe__fiches .fiche__replis .repli + .repli { margin-top: 6px; }
}

/* Même défaut que pour la capture, et c'est exactement celui que le §38
   documentait déjà : `--h-croquis: 100%` posé sur un parent en hauteur
   AUTO ne se résout pas, et le dessin reprenait ses 560 px naturels
   par-dessus les deux cartes. On sort la pile du flux, comme l'image. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--croquis {
    display: block; position: relative;
    flex: 1 1 auto; min-height: 0; height: auto;
  }
  .has-js .axe__fiches .fiche__visuel--croquis .croquis-pile {
    position: absolute; inset: 0; width: 100%; height: 100%; aspect-ratio: auto;
  }
  .has-js .axe__fiches .fiche__visuel--croquis .croquis-pile picture,
  .has-js .axe__fiches .fiche__visuel--croquis .croquis-pile img {
    width: 100%; height: 100%; object-fit: contain;
  }
}

/* RÉGRESSION GRAVE, corrigée ici : `.has-js .axe__fiches .fiche { display:
   flex }` a la MÊME spécificité que `.has-js .fiche[hidden] { display:
   none }` et, venant après, l'emportait. Les 22 (ou 48) fiches d'un axe
   redevenaient toutes visibles, empilées, et celle qu'on venait d'ouvrir se
   retrouvait mille pixels plus bas — hors du panneau, qui la rognait. À
   l'écran, on croyait la fiche vide. Le masquage doit donc être réaffirmé
   APRÈS toute règle qui repose `display` sur `.fiche`. */
.has-js .axe__fiches .fiche[hidden] { display: none; }

/* Sur une fenêtre courte (720 px de haut, le panneau n'en fait alors que
   381), le visuel se retrouvait écrasé à 29 px : le titre, le surtitre et
   les deux cartes consomment l'essentiel. Il reçoit donc un plancher, et
   le panneau retrouve le droit de défiler QUAND il ne peut pas tout tenir.
   « Tout visible à l'écran » est ainsi honoré partout où c'est possible,
   et là où ça ne l'est pas c'est le défilement qui cède, pas le visuel. */
@media (min-width: 900px) {
  .has-js .axe__fiches { overflow-y: auto; overflow-x: hidden; }
  .has-js .axe__fiches .fiche { height: auto; min-height: 100%; }
  .has-js .axe__fiches .fiche__visuel { min-height: clamp(120px, 24vh, 280px); }
}

/* La vignette n'ayant plus de fond, son ombre portée dessinait le RECTANGLE
   invisible autour du dessin — un cadre fantôme, exactement ce qu'on venait
   d'enlever. L'ombre passe sur l'image elle-même, où elle épouse le tracé. */
.tuile:hover, .tuile:focus-visible { box-shadow: none; }
.tuile__visuel img { transition: filter .16s ease; }
.tuile:hover .tuile__visuel img,
.tuile:focus-visible .tuile__visuel img {
  filter: drop-shadow(0 8px 18px rgba(70, 55, 35, .38));
}
@media (prefers-reduced-motion: reduce) { .tuile__visuel img { transition: none; } }

/* ==========================================================================
   §41 — LA GRANDE CARTE : IMAGE, TEXTE, LOGO, CAPSULES
   --------------------------------------------------------------------------
   Troisième passage propriétaire, d'après la carte sombre de la référence.
   Le croquis ne sert PLUS de visuel principal sur les onglets Pathologie et
   Type : les trois axes montrent la capture, et le croquis redescend dans
   sa propre petite carte. La fiche garde ainsi la même silhouette partout.
   ========================================================================== */

/* --- le survol des listes revient au bleu lavé --------------------------- */
.axe__grille .entree:hover { background: var(--teinte); color: var(--surface-nuit); }

/* --- la grille se resserre ----------------------------------------------- */
.grille { gap: clamp(6px, .7vw, 10px); }
@media (min-width: 900px) {
  .grille > li:nth-child(3n - 1) { margin-top: 14px; }
  .grille > li:nth-child(3n)     { margin-top: 7px; }
}

/* --- le fond du panneau devient OPAQUE -----------------------------------
   Les vignettes qui transparaissaient derrière la fiche donnaient à chaque
   carte un fond différent selon ce qui passait dessous. L'uniformité
   demandée, c'est un aplat. */
.has-js .axe__fiches,
.has-js .axe__grille .axe__fiches { background: var(--surface-nuit); }

/* --- trois cartes sous l'image ------------------------------------------- */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__corps {
    grid-template-columns: minmax(0, 1.5fr) auto minmax(0, 1.2fr);
  }
  .has-js .axe__fiches .fiche__texte { margin-top: 0; }
  /* Texte condensé : la carte est un résumé, pas du texte courant. */
  .has-js .axe__fiches .fiche__desc,
  .has-js .axe__fiches .fiche__legende { font-size: .88rem; line-height: 1.35; }
  .has-js .axe__fiches .fiche__desc { max-width: none; }
}
/* La carte du logo : carrée, juste assez large pour le dessin. */
.fiche__logo {
  background: var(--surface); border-radius: var(--r1);
  padding: 10px; box-shadow: 0 8px 24px var(--ombre-portee);
  display: grid; place-items: center;
}
.fiche__logo .croquis-pile { display: block; width: clamp(56px, 6vw, 84px); }
.fiche__logo .croquis-pile img { width: 100%; height: auto; }
/* Sans JavaScript la fiche s'affiche en pleine page : les trois blocs s'y
   empilent, et le logo n'a pas à occuper une colonne entière. */
.fiche__logo { justify-self: start; }

/* Le plafond posé sur les cartes les faisait rogner par le bas dès qu'une
   fiche portait quatre capsules ou une « Précautions » dépliée. C'est
   l'IMAGE qui doit céder, pas le texte : les cartes prennent la hauteur
   qu'il leur faut, le visuel absorbe le reste et s'arrête à son plancher.
   Au-delà, et alors seulement, le panneau défile. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__corps { max-height: none; }
  .has-js .axe__fiches .fiche__texte,
  .has-js .axe__fiches .fiche__replis { max-height: none; overflow: visible; }
}

/* L'image ne cédait toujours pas : en repassant la fiche en `height: auto`
   (pour autoriser le défilement), on lui a retiré la hauteur DÉFINIE dont
   l'algorithme flex a besoin pour répartir — sans elle il n'y a ni espace
   libre ni excédent, chaque bloc prend sa taille de contenu et le tout
   déborde. La hauteur redevient définie ; c'est le débordement des enfants,
   et non celui de la boîte, qui alimente le défilement du panneau. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche { height: 100%; min-height: 0; }
  .has-js .axe__fiches .fiche__visuel { min-height: clamp(110px, 18vh, 220px); }
}

/* Dernier réglage de la répartition : `flex: 1 1 auto` prend la taille du
   CONTENU comme base, et la base d'une image dimensionnée par son ratio est
   grande — le visuel réclamait donc plus que la place libre et poussait les
   cartes hors du panneau. Base zéro : le visuel reçoit exactement ce qui
   reste, ni plus ni moins. La somme est alors égale à la hauteur du
   panneau par construction, et le défilement ne se déclenche que si la
   part restante tombe sous le plancher du visuel. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel { flex: 1 1 0; }
}

/* Les 30 px de débordement constants n'avaient rien à voir avec la
   répartition flex : `.fiche + .fiche { margin-top: 30px }` s'applique à la
   fiche VISIBLE dès qu'une fiche la précède dans le DOM — que celle-ci soit
   en `display: none` ou non, le sélecteur ne regarde que l'ordre. La fiche
   ouverte démarrait donc 30 px trop bas. C'est le même piège que
   `.axe + .axe`, corrigé au lot des onglets. */
.has-js .axe__fiches .fiche + .fiche { margin-top: 0; }

/* Le bleu lavé du survol est posé en DUR et non via `--teinte` : ce jeton
   bascule au thème sombre (#1D2A31), or le cadre de l'explorateur reste
   nuit dans les deux thèmes. Le survol y serait devenu invisible. */
.axe__grille .entree:hover { background: #E7EEF1; color: #17323F; }

/* ==========================================================================
   §42 — LA FICHE COMPOSÉE COMME LA RÉFÉRENCE
   --------------------------------------------------------------------------
   Reprise de la composition de la carte sombre : une carte extérieure qui
   contient tout, une barre haute (marque à gauche, mention à droite), une
   image en grand, une rangée d'encarts colorés, puis une liste en pied.
   La PALETTE reste la nôtre — navy, ocre, crème, bleu pâle — et il n'y a
   pas de titre géant : c'est une fiche clinique, pas une affiche.
   ========================================================================== */
@media (min-width: 900px) {
  /* La carte extérieure : un cran plus sombre que le cadre, pour se
     détacher de lui comme la carte de la référence se détache de sa page. */
  .has-js .axe__fiches .fiche {
    background: #0E212B;
    border-radius: var(--r2);
    padding: clamp(12px, 1.3vw, 20px);
    gap: clamp(8px, 1vw, 14px);
  }

  /* Barre haute : le titre à gauche, la mention à droite, sur une ligne. */
  .has-js .axe__fiches .fiche__entete {
    display: flex; justify-content: space-between; align-items: center;
    gap: 1rem; margin-left: 0;
  }
  .has-js .axe__fiches .fiche__surtitre {
    margin: 0; text-align: right; font-size: .82rem;
  }

  /* L'image occupe le haut, pleine largeur de la carte. */
  .has-js .axe__fiches .fiche__visuel--capture {
    border-radius: var(--r1); overflow: hidden; background: var(--surface);
  }

  /* La rangée d'encarts : le texte en ocre, le logo, la nature de la fiche. */
  .has-js .axe__fiches .fiche__corps {
    grid-template-columns: minmax(0, 1fr) auto auto;
    align-items: stretch; gap: clamp(8px, 1vw, 14px);
  }
  .has-js .axe__fiches .fiche__texte {
    background: var(--ocre); color: var(--surface-nuit);
    box-shadow: none; margin-top: 0;
    display: flex; flex-direction: column; justify-content: center;
  }
  .has-js .axe__fiches .fiche__texte .fiche__desc,
  .has-js .axe__fiches .fiche__texte .fiche__legende {
    color: var(--surface-nuit); font-weight: 600;
  }
  .has-js .axe__fiches .fiche__logo { box-shadow: none; }
  .has-js .axe__fiches .fiche__genre {
    display: grid; place-items: center; margin: 0;
    background: var(--pale); color: var(--surface-nuit);
    border-radius: var(--r1); padding: 0 clamp(10px, 1.2vw, 16px);
    font-size: .74rem; font-weight: 700;
    letter-spacing: .08em; text-transform: uppercase;
    writing-mode: vertical-rl; rotate: 180deg;   /* comme le « 2025 » : étroit */
  }

  /* Le pied : une seule carte sombre, les capsules en lignes. Elles perdent
     leur fond propre — sur un aplat déjà sombre, trois pavés clairs
     reconstruiraient l'empilement qu'on vient de simplifier. */
  .has-js .axe__fiches .fiche__replis {
    background: #16303D; border-radius: var(--r1);
    padding: clamp(6px, .8vw, 12px) clamp(10px, 1.2vw, 16px);
    box-shadow: none;
  }
  .has-js .axe__fiches .fiche__replis .repli {
    background: transparent; border: 0; border-radius: 0;
    box-shadow: none; margin: 0; padding: 0;
  }
  .has-js .axe__fiches .fiche__replis .repli + .repli {
    margin-top: 0; border-top: 1px solid rgba(245, 241, 232, .14);
  }
  .has-js .axe__fiches .fiche__replis .repli__tete { color: var(--ocre); }
  .has-js .axe__fiches .fiche__replis .repli__corps { color: var(--sur-nuit); }
  .has-js .axe__fiches .fiche__replis .pastille {
    color: var(--sur-nuit); border-color: rgba(245, 241, 232, .3);
  }
}

/* Le socle crème sous l'image laissait deux grandes bandes blanches de part
   et d'autre : la boîte est plus large que le ratio de la capture, et
   `contain` centre le dessin sans étirer le fond. Le dessin flotte donc
   directement sur la carte — son propre intérieur est déjà blanc, il n'a
   pas besoin d'un second fond derrière lui. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--capture { background: transparent; }
}

/* ==========================================================================
   §43 — VISUEL PLEINE LARGEUR, CAPSULE POSÉE DESSUS, UNE SEULE RANGÉE
   ========================================================================== */
@media (min-width: 900px) {
  /* La fiche devient le repère de position de la capsule. */
  .has-js .axe__fiches .fiche { position: relative; }

  /* Le visuel occupe TOUTE la largeur. Le recadrage est assumé : à cette
     largeur, le ratio du cadre dessiné demanderait plus de hauteur que le
     panneau n'en a. `cover` rogne donc le haut et le bas du trait — c'est
     le prix du plein cadre, et il disparaîtra le jour où les captures
     seront fournies dans un format plus large. */
  .has-js .axe__fiches .fiche__visuel--capture {
    border-radius: var(--r1); overflow: hidden;
  }
  .has-js .axe__fiches .fiche__visuel--capture img { object-fit: cover; }

  /* La capsule du titre se pose SUR l'image, en haut à droite, et plus
     petite. Décalée de 52 px pour laisser passer la croix de fermeture,
     qui occupe déjà cet angle. */
  .has-js .axe__fiches .fiche__entete {
    position: absolute; z-index: 3;
    top: clamp(18px, 2vw, 28px); right: clamp(58px, 5vw, 70px);
    margin: 0; display: block; width: auto;
  }
  .has-js .axe__fiches .fiche__titre {
    font-size: .95rem; padding: .28em .8em;
    box-shadow: 0 3px 12px rgba(14, 33, 43, .5);
  }

  /* Une seule rangée sous l'image : texte étroit, icône carrée, capsules. */
  .has-js .axe__fiches .fiche__corps {
    grid-template-columns: minmax(0, .85fr) auto minmax(0, 1.5fr);
  }
  /* Le texte n'est plus gras : l'aplat ocre suffit à le distinguer. */
  .has-js .axe__fiches .fiche__texte .fiche__desc,
  .has-js .axe__fiches .fiche__texte .fiche__legende { font-weight: 400; }
  /* Le surtitre a rejoint la carte de texte, la barre haute ayant disparu. */
  .has-js .axe__fiches .fiche__texte .fiche__surtitre {
    margin: 0 0 .35rem; text-align: left; color: var(--surface-nuit);
    font-size: .72rem; font-weight: 700;
    letter-spacing: .06em; text-transform: uppercase;
  }
  /* L'icône dans une carte CARRÉE. */
  .has-js .axe__fiches .fiche__logo { aspect-ratio: 1; height: 100%; }
  .has-js .axe__fiches .fiche__replis { align-self: stretch; }
}

/* La carte du logo, en `height: 100%` + `aspect-ratio: 1`, prenait pour
   côté la hauteur de la RANGÉE — soit 250 px de large, ce qui écrasait la
   colonne de texte à un mot par ligne. Le carré se fixe sur sa largeur, et
   la rangée reçoit un plafond pour rendre sa hauteur au visuel. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__corps {
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1.35fr);
    max-height: 250px;
  }
  .has-js .axe__fiches .fiche__logo {
    width: clamp(96px, 9vw, 132px); aspect-ratio: 1; height: auto;
    align-self: start;
  }
  .has-js .axe__fiches .fiche__texte,
  .has-js .axe__fiches .fiche__replis { max-height: 250px; overflow-y: auto; }
}

/* Arbitrage entre le plein cadre et le rognage : la rangée passe de 250 à
   210 px, ce qui rend 40 px au visuel et ramène le rognage vertical de
   21 % à ~12 %. En dessous, la carte des capsules devrait défiler dès
   qu'une « Précautions » est dépliée — on préfère un dessin un peu rogné à
   une consigne clinique masquée. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__corps,
  .has-js .axe__fiches .fiche__texte,
  .has-js .axe__fiches .fiche__replis { max-height: 210px; }
}

/* La carte de texte perdait sa PREMIÈRE ligne autant que la dernière :
   `justify-content: center` sur un contenu plus haut que la boîte déborde
   des DEUX côtés, et le débordement par le haut est inatteignable au
   défilement. Le centrage ne vaut que si ça rentre — ici, on aligne en
   haut. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__texte { justify-content: flex-start; }
}

/* ==========================================================================
   §44 — CARTE BEIGE, PLUS ÉTROITE, VISUEL COMPLET
   --------------------------------------------------------------------------
   La carte se rétrécit jusqu'à ce que le cadre dessiné tienne ENTIER dans
   la hauteur disponible : à ~540 px de large, son ratio de 1,384 demande
   ~390 px de haut, ce que le panneau laisse une fois la rangée posée. Le
   recadrage du lot précédent disparaît donc — `contain` remplace `cover`,
   et il n'y a plus rien à rogner.
   ========================================================================== */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche {
    max-width: min(100%, 600px);
    background: var(--page);          /* beige */
  }
  .has-js .axe__fiches .fiche__visuel--capture img { object-fit: contain; }

  /* La capsule passe en haut à GAUCHE : la croix occupe l'angle droit, il
     n'y a plus besoin de la décaler pour l'éviter. */
  .has-js .axe__fiches .fiche__entete {
    left: clamp(18px, 2vw, 28px); right: auto;
  }

  /* La carte des capsules se resserre. */
  .has-js .axe__fiches .fiche__corps {
    grid-template-columns: minmax(0, 1.15fr) auto minmax(0, .95fr);
  }
  .has-js .axe__fiches .fiche__logo { width: clamp(80px, 7vw, 104px); }

  /* Sur beige, la carte du logo doit se détacher : elle passe au crème le
     plus clair, avec un filet. */
  .has-js .axe__fiches .fiche__logo {
    background: var(--surface); border: 1px solid var(--bordure-douce);
  }
}

/* ==========================================================================
   §45 — L'ICÔNE SOUS LA CAPSULE, CARTE AU PLUS ÉTROIT
   ========================================================================== */
@media (min-width: 900px) {
  /* Le groupe de tête devient une colonne : capsule, puis icône dessous. */
  .has-js .axe__fiches .fiche__entete {
    display: flex; flex-direction: column; align-items: flex-start;
    gap: clamp(6px, .7vw, 10px);
  }
  /* L'icône est maintenant posée SUR l'image : elle a besoin de sa propre
     ombre pour s'en détacher, là où sur le beige un filet suffisait. */
  .has-js .axe__fiches .fiche__entete .fiche__logo {
    width: clamp(52px, 5vw, 68px); padding: 7px;
    box-shadow: 0 3px 12px rgba(14, 33, 43, .35);
  }

  /* La carte se réduit au plus étroit que la rangée tolère : les deux
     cartes côte à côte demandent ~200 px chacune — en dessous, « Références
     internationales » se coupe en trois lignes et la description devient
     une colonne d'un mot. Le visuel suit : 460 px de large pour 332 de
     haut, toujours entier. */
  .has-js .axe__fiches .fiche { max-width: min(100%, 500px); }
  .has-js .axe__fiches .fiche__corps {
    grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
  }
}

/* En rétrécissant la carte, le visuel a cessé d'être borné par la HAUTEUR
   pour l'être par la LARGEUR : sa boîte gardait 394 px alors que l'image
   n'en occupait plus que 334, laissant 60 px de vide au-dessus et en
   dessous. La boîte prend donc le ratio de l'image et rend cette hauteur à
   la rangée — ce qui suffit à résorber le débordement du texte. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--capture {
    flex: 0 0 auto; aspect-ratio: 1024 / 740; height: auto; min-height: 0;
  }
  .has-js .axe__fiches .fiche__corps,
  .has-js .axe__fiches .fiche__texte,
  .has-js .axe__fiches .fiche__replis { max-height: 260px; }
}

/* L'icône reprend SON FORMAT D'AVANT — 80 à 104 px et sa marge intérieure
   de 10 px — en gardant sa nouvelle place sous la capsule. Elle avait été
   réduite à 68 px en passant sur l'image, par prudence ; c'était une
   prudence de trop. L'ombre reste, discrète : le filet seul suffisait sur
   le beige, pas sur une capture. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__entete .fiche__logo {
    width: clamp(80px, 7vw, 104px); padding: 10px;
    box-shadow: 0 3px 10px rgba(14, 33, 43, .22);
  }
}

/* ==========================================================================
   §46 — LA CAPSULE ET L'ICÔNE À CÔTÉ DU VISUEL
   --------------------------------------------------------------------------
   Elles quittent la superposition et redescendent dans le flux, en colonne
   à gauche de l'image. La carte s'élargit d'autant : ~104 px de colonne
   plus la gouttière. Bénéfice au passage — l'icône ne masque plus le coin
   supérieur gauche de la capture.
   ========================================================================== */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche {
    max-width: min(100%, 660px);
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    grid-template-rows: auto auto;
    grid-template-areas: "tete visuel" "corps corps";
    align-content: start;
  }
  .has-js .axe__fiches .fiche__entete {
    grid-area: tete; position: static;
    align-self: start; justify-content: flex-start;
  }
  .has-js .axe__fiches .fiche__visuel--capture { grid-area: visuel; }
  .has-js .axe__fiches .fiche__corps { grid-area: corps; }
  /* Hors de l'image, l'icône n'a plus besoin de s'en détacher : elle
     retrouve son filet seul, comme sur le beige. */
  .has-js .axe__fiches .fiche__entete .fiche__logo { box-shadow: none; }
  .has-js .axe__fiches .fiche__titre { box-shadow: 0 2px 8px var(--ombre-portee); }
}

/* Les deux bandes se lisaient comme deux COLONNES : la capsule, l'icône et
   la carte de texte partagent le même bord gauche, le visuel et les
   capsules le même bord droit — l'œil groupe alors verticalement. On casse
   cette lecture : la gouttière entre les bandes devient nettement plus
   large que celle entre les colonnes, et un filet marque la césure. Le
   haut (visuel + capsule + icône) forme dès lors un bloc, le bas un autre. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche {
    column-gap: clamp(10px, 1.2vw, 16px);
    row-gap: clamp(16px, 2vw, 24px);
  }
  .has-js .axe__fiches .fiche__corps {
    border-top: 1px solid var(--bordure-douce);
    padding-top: clamp(14px, 1.6vw, 20px);
  }
}

/* ==========================================================================
   §47 — LE VISUEL REVIENT DANS LE FLUX
   --------------------------------------------------------------------------
   L'image passait PAR-DESSUS le texte et les listes. Le montage en cause :
   le <picture> était en `position: absolute; inset: 0`, hérité de l'époque
   où le visuel devait remplir une case de hauteur imposée. Dans la grille,
   la case n'a plus de hauteur propre — le contenu absolu ne compte pas — et
   la rangée se calait donc sur le `min-height`, pendant que l'image, elle,
   se déployait à son ratio. D'où le débordement, variable selon la hauteur
   de la fenêtre : invisible sur un grand écran, flagrant sur un écran court.

   Le remède est de supprimer la mécanique, pas de la rafistoler : plus rien
   n'est positionné, la figure prend simplement la hauteur de son image.
   Une image dans le flux ne peut recouvrir personne.
   ========================================================================== */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--capture {
    position: static; display: block; aspect-ratio: auto;
    height: auto; min-height: 0; max-height: none; align-self: start;
    overflow: hidden; border-radius: var(--r1);
  }
  .has-js .axe__fiches .fiche__visuel--capture picture,
  .has-js .axe__fiches .fiche__visuel--capture img {
    position: static; display: block;
    width: 100%; height: auto; max-width: 100%; max-height: none;
    aspect-ratio: auto; object-fit: contain;
  }
}

/* La vraie cause, mesurée : la fiche avait une hauteur IMPOSÉE (100 % du
   panneau) et ses deux rangées `auto` se partageaient cette hauteur — 136 px
   pour le visuel, alors que l'image en demandait 377. La rangée du haut
   était donc trop courte, l'image débordait dessous, et les cartes opaques
   du bas se peignaient par-dessus. Sur une grande fenêtre la rangée était
   assez haute et rien ne se voyait : le défaut ne sortait que sur un écran
   court, ce qui explique qu'il ait échappé aux vérifications précédentes.

   On rend donc sa hauteur naturelle à la fiche. Elle occupe ce qu'il lui
   faut, et c'est le panneau qui défile quand la fenêtre est trop basse —
   un défilement est réparable d'un coup de molette, un recouvrement non. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche { height: auto; min-height: 0; }
  .has-js .axe__fiches .fiche__corps,
  .has-js .axe__fiches .fiche__texte,
  .has-js .axe__fiches .fiche__replis { max-height: none; overflow: visible; }
  /* L'image reste bornée pour ne pas monopoliser une fenêtre haute. */
  .has-js .axe__fiches .fiche__visuel--capture img {
    max-height: 44vh; width: auto; max-width: 100%; margin-inline: auto;
  }
}

/* ==========================================================================
   §48 — TROIS ÉTAGES : BANDEAU, TEXTE + VISUEL, LISTES EN LIGNE
   --------------------------------------------------------------------------
   Essai d'une autre composition, demandée telle quelle :
     1. la capsule du titre en bandeau, toute la largeur ;
     2. un tiers pour le texte, deux tiers pour le visuel ;
     3. les listes dépliables côte à côte.
   L'icône du domaine rejoint la colonne de texte, faute de ligne à elle.
   ========================================================================== */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche {
    max-width: min(100%, 840px);
    grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
    grid-template-rows: auto auto auto;
    grid-template-areas: "tete tete" "texte visuel" "listes listes";
  }
  /* 1 — le bandeau. La capsule s'étire au lieu de se caler à gauche : elle
     n'est plus une étiquette posée dans un coin mais l'en-tête de la fiche. */
  .has-js .axe__fiches .fiche__entete { grid-area: tete; display: block; }
  .has-js .axe__fiches .fiche__titre {
    display: block; width: 100%; text-align: center;
    border-radius: var(--r1); padding: .5em .9em;
  }
  /* 2 — un tiers, deux tiers. Le corps n'est plus un conteneur : ses deux
     enfants prennent chacun leur case dans la grille de la fiche. */
  .has-js .axe__fiches .fiche__corps { display: contents; }
  .has-js .axe__fiches .fiche__texte {
    grid-area: texte; max-height: none; border-top: 0; padding-top: 0;
  }
  .has-js .axe__fiches .fiche__visuel--capture { grid-area: visuel; }
  .has-js .axe__fiches .fiche__texte .fiche__logo {
    width: clamp(56px, 5vw, 72px); margin: 0 0 .6rem;
  }
  /* 3 — les listes en ligne. `auto-fill` plutôt qu'un « 3 » figé : l'onglet
     Type en compte QUATRE, et un compte en dur les aurait débordées. */
  .has-js .axe__fiches .fiche__replis {
    grid-area: listes; max-height: none;
    display: grid; gap: clamp(6px, .8vw, 12px);
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 180px), 1fr));
    align-items: start;
    border-top: 1px solid var(--bordure-douce);
    padding-top: clamp(12px, 1.4vw, 18px);
  }
  .has-js .axe__fiches .fiche__replis .repli { border-top: 0; }
  .has-js .axe__fiches .fiche__replis .repli + .repli { border-top: 0; }
}

/* Le bandeau de tête se partage : la capsule à gauche, ramenée à la largeur
   de son texte, l'icône à droite. Cette dernière garde 52 px de dégagement
   — la croix de fermeture occupe déjà cet angle, et rien ne doit passer
   dessous. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__entete {
    display: flex; align-items: center; justify-content: space-between;
    gap: 1rem;
  }
  .has-js .axe__fiches .fiche__titre {
    display: inline-block; width: auto; text-align: left;
    border-radius: var(--pill); padding: .34em .95em;
  }
  .has-js .axe__fiches .fiche__entete .fiche__logo {
    width: clamp(56px, 5vw, 72px); margin: 0 52px 0 0; flex: none;
  }
}

/* `flex-direction: column`, posé au lot où l'icône passait SOUS la capsule,
   survivait à la nouvelle règle : redéclarer `display: flex` ne réinitialise
   pas la direction. D'où une capsule et une icône toujours empilées malgré
   un `space-between` qui, en colonne, écarte verticalement. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__entete { flex-direction: row; align-items: center; }
}

/* L'icône du domaine sort de la fiche : elle mangeait le bandeau sans rien
   apporter que la capsule ne dise déjà. La capsule reprend donc toute la
   largeur, en en-tête plein.

   Conséquence à connaître : plus aucun croquis n'est référencé par
   /l-outil/ — les fichiers `croquis-domaine-*` restent en place mais ne
   sont plus chargés, et la page perd ~54 Ko de balisage. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__entete { display: block; }
  .has-js .axe__fiches .fiche__titre {
    display: block; width: 100%; text-align: center;
    border-radius: var(--r1); padding: .5em .9em;
  }
}

/* Resserrement général de la fiche : gouttières, marges intérieures et
   césure du pied. Rien ne descend sous 8 px — en dessous, les trois blocs
   cessent de se lire comme distincts et la fiche redevient un pavé. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche {
    padding: clamp(10px, 1.1vw, 16px);
    row-gap: clamp(8px, 1vw, 12px);
    column-gap: clamp(8px, 1vw, 12px);
  }
  .has-js .axe__fiches .fiche__titre { padding: .4em .9em; }
  .has-js .axe__fiches .fiche__texte { padding: clamp(10px, 1.1vw, 14px); }
  .has-js .axe__fiches .fiche__replis {
    padding: clamp(8px, 1vw, 12px) clamp(10px, 1.1vw, 14px);
    gap: clamp(4px, .6vw, 8px);
  }
}

/* Les pastilles étaient ILLISIBLES dans une liste dépliée : elles gardent
   leur fond bleu très lavé (`--teinte`, prévu pour le papier) tandis que le
   §42 leur avait donné une encre CLAIRE, adaptée au reste de la carte
   sombre. Crème sur bleu pâle : ~1,2:1.

   Elles reprennent l'encre foncée, qui donne 12:1 sur ce fond. Corollaire à
   ne pas oublier : le survol inverse le couple (navy plein, texte crème), il
   faut donc le redire ici, sinon il hériterait de l'encre foncée et
   deviendrait illisible à son tour. */
.has-js .axe__fiches .fiche__replis .pastille {
  background: var(--teinte); color: var(--texte);
  border-color: transparent;
}
.has-js .axe__fiches .fiche__replis button.pastille:hover,
.has-js .axe__fiches .fiche__replis button.pastille:focus-visible {
  background: var(--surface-nuit); color: var(--sur-nuit);
}

/* Dans les listes dépliées, les pastilles reviennent à un alignement à
   GAUCHE et à un corps plus petit. Le centrage ne se voyait que sur celles
   qui passent à la ligne — « Catégorisation sémantique », « Maladie
   d'Alzheimer — stade léger » — et cassait le bord gauche de la colonne.
   La hauteur minimale de 32 px est conservée : c'est la cible de pointage,
   elle ne suit pas le corps du texte. */
.has-js .axe__fiches .fiche__replis .pastille {
  text-align: left; font-size: .84rem; padding: .24em .66em;
}

/* Le texte défile quand il dépasse la hauteur du visuel.
   Le point délicat : dans une grille, la hauteur d'une rangée est celle de
   son PLUS GRAND contenu — tant que le texte y contribue, il fait grandir
   la rangée au lieu de défiler, et le plafonner à « la hauteur du visuel »
   n'est pas exprimable, cette hauteur n'existant qu'une fois la rangée
   calculée. On retire donc le texte du calcul : sorti du flux, il ne
   contribue plus, la rangée se cale sur le seul visuel, et le texte défile
   à l'intérieur de la place ainsi définie. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__texte { position: relative; padding: 0; }
  .has-js .axe__fiches .fiche__defile {
    position: absolute; inset: 0; overflow-y: auto;
    padding: clamp(10px, 1.1vw, 14px);
    scrollbar-width: thin;
  }
}

/* Le titre et les onglets sur une SEULE ligne : « L'outil » puis « par
   domaine » se lisent d'un trait, et la page récupère la hauteur que le
   titre prenait à lui seul. Alignement sur la LIGNE DE BASE, pas au centre :
   le titre et les onglets n'ont pas le même corps, et un centrage ferait
   flotter les onglets au-dessus du pied du titre. */
.explorateur__tete {
  display: flex; align-items: baseline; flex-wrap: wrap;
  gap: 0 clamp(16px, 2vw, 32px);
}
.explorateur__tete .section-title { margin: 0; }
.explorateur__tete .onglets { flex: 1 1 auto; margin-top: 0; }

/* ==========================================================================
   §49 — DEUX ENCARTS DANS LA COLONNE DE TEXTE
   --------------------------------------------------------------------------
   Les deux paragraphes ne disent pas la même chose : le premier décrit un
   EXERCICE, le second décrit le DOMAINE. Confondus dans un même aplat, on
   les lit comme un seul propos. Ils se séparent donc en deux encarts, et
   la couleur porte la distinction :
     — bleu lavé   (--teinte)        : l'exercice, comme le visuel au-dessus ;
     — ocre lavé   (--teinte-chaude) : le domaine, registre de la marque.
   La carte qui les contient perd son fond : ce sont les encarts qui
   portent la couleur, pas leur boîte.
   ========================================================================== */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__texte {
    background: transparent; box-shadow: none;
  }
  .has-js .axe__fiches .fiche__defile {
    display: flex; flex-direction: column; gap: clamp(6px, .8vw, 10px);
    padding: 0;
  }
  .has-js .axe__fiches .fiche__legende,
  .has-js .axe__fiches .fiche__desc {
    margin: 0; color: var(--texte);
    border-radius: var(--r1);
    padding: clamp(10px, 1.1vw, 14px);
    font-size: .88rem; line-height: 1.4;
  }
  .has-js .axe__fiches .fiche__legende { background: var(--teinte); }
  .has-js .axe__fiches .fiche__desc { background: var(--teinte-chaude); }
  /* Le surtitre n'appartient à aucun des deux : il reste une étiquette
     posée au-dessus, sur le beige de la fiche. */
  .has-js .axe__fiches .fiche__surtitre {
    color: var(--texte-doux); margin: 0 0 .1rem;
  }
}

/* L'encart de l'exercice passe au bleu de l'entrée SÉLECTIONNÉE (--pale) :
   plus soutenu que le bleu lavé, il se détache mieux de l'ocre voisin, et
   il fait écho à l'élément choisi dans la liste — même bleu, même statut
   « voici ce que vous avez ouvert ». */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__legende { background: var(--pale); }
}

/* L'écran animé se pose EXACTEMENT sur l'image figée, qui lui sert d'appui :
   même boîte, mêmes coins. L'image reste dessous et reprend la main si la
   lecture est refusée, si le mouvement est réduit, ou sans JavaScript. */
.fiche__visuel--capture { position: relative; }
.fiche__visuel--capture video {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: contain;
  border-radius: inherit;
}

/* Le `position: relative` ci-dessus ne prenait pas : le §47 pose
   `position: static` sur le même élément avec TROIS classes de
   spécificité, et une règle plus faible ne l'emporte pas, quel que soit
   l'ordre. On rétablit donc au même niveau de spécificité. Sans ça, la
   vidéo se cale sur la fiche entière et recouvre la carte. */
@media (min-width: 900px) {
  .has-js .axe__fiches .fiche__visuel--capture { position: relative; }
}

/* Le décalage des colonnes gonflait les rangées. En grille, la MARGE d'un
   élément entre dans le calcul de sa piste : `margin-top: 14px` ne
   déplaçait pas la vignette, il ajoutait 14 px à la hauteur de la rangée.
   D'où un écart vertical bien plus large que l'horizontal alors que la
   gouttière était la même des deux côtés.

   `translate` ne touche pas à la mise en page : le décalage reste, les
   rangées retrouvent leur hauteur, et l'écart devient identique dans les
   deux sens. La réserve en bas rattrape ce que la dernière rangée déborde,
   puisqu'un déplacement visuel ne pousse plus rien. */
@media (min-width: 900px) {
  .grille { padding-bottom: 14px; }
  .grille > li:nth-child(3n - 1) { margin-top: 0; translate: 0 14px; }
  .grille > li:nth-child(3n)     { margin-top: 0; translate: 0 7px; }
}
@media (prefers-reduced-motion: reduce) { .grille > li { transition: none; } }

/* Le passage de la section « L'outil » vers la page dédiée. Centré et
   détaché des chiffres qui le précèdent : c'est une sortie de section, pas
   une quatrième statistique. */
.tool-suite { margin: clamp(24px, 3vw, 40px) 0 0; text-align: center; }

/* Le passage vers la page se veut visible : au-delà de l'aplat plein, il
   gagne un cran de corps et une ombre, comme les autres appels à l'action
   de premier plan. */
.tool-suite .btn { font-size: 1.02rem; padding: .85em 1.5em; box-shadow: 0 8px 22px var(--ombre-portee); }

/* Quatre chiffres au lieu de trois : la quatrième pastille reprend le
   crème des cartes, seule teinte de la palette encore libre après le
   blanc voilé, l'ocre et le bleu pâle. Encre foncée dessus — c'est un fond
   clair dans les deux thèmes, la carte étant figée comme les trois autres.
   La base passe de 190 à 150 px : à quatre, 190 forçait un retour à la
   ligne dès 1100 px de large. */
.stats > div { flex: 1 1 150px; }
.stats .s4 { background: var(--surface-fige, #FCFAF5); color: var(--encre); }

/* Téléphone : trois retouches issues du feedback relecteur du 11.08.
   1) Les onglets tenaient sur deux lignes : ils deviennent une rangée qui
      défile, comme les filtres. 2) La galerie en colonne unique faisait
      ~11 000 px sur l'onglet types : deux colonnes la divisent par deux,
      les cadres dessinés restent lisibles à ~160 px. */
@media (max-width: 600px) {
  .has-js .onglets { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 4px; }
  .has-js .onglet { flex: none; white-space: nowrap; }
  .grille { grid-template-columns: repeat(2, 1fr); }
}
