/* ============================================================
   ZELLIJ STUDIO — COUCHE PARTAGÉE « ÉDITORIAL IMMERSIF »
   ------------------------------------------------------------
   Le vocabulaire visuel de la nouvelle page d'accueil, extrait
   pour être réutilisé par TOUTES les pages du site.
   Source : Experiments/Refonte_ERA_2026-07-27/styles.css

   Écrit une seule fois → les 22 articles (puis les 12 pages
   principales) héritent du même hero immersif, du même rythme
   clair/sombre, des mêmes révélations au scroll.

   Chargé après styles.css et tokens.css.
   ============================================================ */

/* ------------------------------------------------------------
   1 · SOCLE — le scroll est piloté par Lenis (voir zellij-motion.js).
   scroll-behavior:smooth et Lenis se contredisent : le CSS ne
   reprend la main que si Lenis est absent (classe .no-lenis).
   ------------------------------------------------------------ */
html {
  scroll-behavior: auto;
  overflow-anchor: none;
}

html.no-lenis {
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html.no-lenis {
    scroll-behavior: auto;
  }
}

html.lenis,
html.lenis body {
  height: auto;
}

.lenis.lenis-smooth {
  scroll-behavior: auto !important;
}

body {
  font-family: var(--sans);
  color: var(--ink);
  background: var(--paper);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* Grain : la texture papier de l'accueil, sur tout le site. */
.grain {
  position: fixed;
  z-index: 80;
  inset: -50%;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.72' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  opacity: 0.045;
  pointer-events: none;
  animation: grain 9s steps(8) infinite;
}

@keyframes grain {
  0%,
  100% { transform: translate(0, 0); }
  25% { transform: translate(-2%, 3%); }
  50% { transform: translate(3%, -2%); }
  75% { transform: translate(-3%, -3%); }
}

@media (prefers-reduced-motion: reduce) {
  .grain { animation: none; }
}

/* ------------------------------------------------------------
   2 · RÉVÉLATIONS AU SCROLL
   Le texte se pose, il n'apparaît pas d'un coup.

   16/08/2026 · MOTION-PORT-HOME — correction de direction de Latifa :
   « je ne demande pas une nouvelle interprétation, je veux la même
   mécanique que l'accueil ». Ce bloc est désormais un COPIER EXACT de
   `.rev` dans `Experiments/Refonte_ERA_2026-07-27/accueil.css` — même
   décalage (30px), même flou de départ (7px), et surtout : PAS de
   `transition` CSS ici. L'animation vient de `zellij-motion.js`, qui
   anime ces mêmes propriétés avec GSAP (`ScrollTrigger.batch`, easing
   `power3.out`, durée 1,2s, stagger 90ms — les valeurs exactes de
   l'accueil). Une transition CSS en plus se serait battue avec le
   tween JS ; l'accueil n'en a pas, cette page non plus.
   Le flou reste sur mobile : l'accueil n'a AUCUNE exception mobile, et
   Latifa a dit explicitement que le mobile doit avoir « le même niveau
   de douceur ». L'ancien retrait du flou sous 900px (pensé pour la
   batterie) est donc annulé — ce n'était pas ce qu'elle demandait. */
.rev {
  opacity: 0;
  transform: translateY(30px);
  filter: blur(7px);
  will-change: opacity, transform, filter;
}

/* 🚨 26/08/2026 — LA CAUSE DE « c'est déclaré fait mais ça ne bouge pas ».
   Cette règle disait `opacity:1; transform:none; filter:none;`.
   `zellij-motion.js` posait la classe `vu` JUSTE AVANT d'appeler
   `gsap.to(...)`. Or un tween `to` lit son état de DÉPART dans le style
   calculé : la classe venait de le passer à l'état d'ARRIVÉE. GSAP animait
   donc de 1 vers 1, de `none` vers `none` — durée 1,2 s, résultat nul.
   Le bloc apparaissait d'un coup, alors que le code, les classes, les
   valeurs et les easings étaient bien ceux de l'accueil : c'est pour ça
   que chaque audit précédent concluait « conforme ».
   Preuve : sur https://zellijstudio.fr/ressources/, 0 des 6 `.rev`
   testables passaient par une opacité intermédiaire ; en neutralisant
   cette seule règle, 6 sur 6 s'animaient.
   L'accueil n'a JAMAIS eu cette règle (`accueil.css`) : c'est exactement
   l'écart. `vu` reste un MARQUEUR D'ÉTAT pour le script, rien d'autre.
   ⚠️ Ne jamais y remettre de déclaration visuelle : ce serait reproduire
   le bug à l'identique. L'état d'arrivée appartient à GSAP, qui le laisse
   en style inline à la fin du tween. */
.rev.vu {
  will-change: auto;
}

.no-motion .rev,
.no-js .rev {
  opacity: 1;
  transform: none;
  filter: none;
}

/* ------------------------------------------------------------
   2 bis · TITRES QUI SE DÉROULENT LIGNE PAR LIGNE
   26/08/2026 — c'est LE geste signature de l'accueil, et il
   n'existait que là. Copie de `.split-words` dans
   `Experiments/Refonte_ERA_2026-07-27/accueil.css` (l. 104-107).

   Le mot est un masque (`overflow:hidden`), son contenu part
   sous le masque et remonte. Ligne par ligne, pas mot à mot :
   mot à mot fait « machine à écrire », ligne par ligne se
   déroule calmement — c'est le choix tranché sur l'accueil.

   ⚠️ La classe `.split-words` n'est JAMAIS écrite dans le HTML
   des pages du build : c'est `zellij-motion.js` qui la pose, et
   seulement s'il a GSAP sous la main. Sans JS, sans GSAP, en
   `prefers-reduced-motion` : la classe n'existe pas, donc aucun
   titre ne peut rester masqué. Garde-fou par construction.

   Seul écart assumé avec l'accueil : les 0,16 em de respiration
   sous le masque, compensés par une marge négative (donc zéro
   effet sur la mise en page). L'accueil n'en a pas besoin, ses
   titres sont calibrés ; ici les titres viennent de 80 pages aux
   interlignes variés, et sans cette marge les jambages (g, p, y)
   se font couper par le masque. */
.split-words .w {
  display: inline-block;
  overflow: hidden;
  vertical-align: top;
  padding-bottom: 0.16em;
  margin-bottom: -0.16em;
}

.split-words .w > span {
  display: inline-block;
  transform: translateY(110%);
  will-change: transform;
}

.no-motion .split-words .w > span,
.no-js .split-words .w > span {
  transform: none;
}

@media print {
  .rev {
    opacity: 1;
    transform: none;
    filter: none;
    transition: none;
  }

  .split-words .w { overflow: visible; }
  .split-words .w > span { transform: none; }
}

/* ------------------------------------------------------------
   3 · TYPOGRAPHIE ÉDITORIALE — le « display » de l'accueil
   ------------------------------------------------------------ */
.eyebrow {
  font-family: var(--sans);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  /* --accent = la couleur de rubrique de LA page. Doré si non précisée.
     C'est le petit signal qui donne son univers à chaque page sans
     sortir du système commun. */
  color: color-mix(in srgb, var(--accent, var(--gold)) 55%, #241722);   /* 08/10 : l'accent reste lisible (AA) sur fond clair */
}

/* 🚨 TOUS LES TITRES SERIF DU SITE PASSENT PAR ICI.
   Latifa, 30/07 : « toute la page Kit, le serif n'est pas épaissi, revois
   toute la page ». Et elle a LU « 16 pages » là où le site écrit « 46 » —
   à cette graisse, le 4 du Bodoni passe pour un 1. Sur la page produit,
   ce n'est plus un détail de goût.

   Deux causes empilées, les deux corrigées le 30/07 :
   1. `assets/fonts/fonts.css` déclarait `font-weight:400 600`, ce qui
      **clampe** l'axe variable. Les fichiers, eux, vont jusqu'à 900
      (mesuré au canvas). Passé à `400 900`.
   2. Ici, la graisse était écrite dans `font-variation-settings` sous la
      forme `"wght" 600`. ⚠️ Un `wght` posé là **écrase `font-weight`** :
      toute tentative d'épaissir ailleurs restait sans effet, sans erreur
      et sans conflit visible. On ne garde donc dans
      `font-variation-settings` que l'axe optique, et la graisse repasse
      par `font-weight`, où le reste du CSS peut la corriger.

   🚨 30/07 (soir) — LA POLICE A CHANGE, et ces deux corrections n'etaient
   que des pansements. Le probleme n'etait ni la plage de font-face ni le
   `wght` mal place : c'etait la FAMILLE. Bodoni Moda est une Didone, ses
   delies sont des cheveux par construction, et epaissir creuse l'ecart au
   lieu de le combler. Newsreader le remplace (voir `fonts.css`).

   Consequence directe : le bridage de l'axe optique disparait. Il n'existait
   que pour empecher le Bodoni d'affiner ses delies en grandissant. Newsreader
   n'a pas ce defaut, et son axe optique s'arrete a 72 : on laisse donc
   `font-optical-sizing` faire son travail automatiquement, ce qui reste juste
   a toutes les tailles au lieu d'etre regle pour une seule.
   ⚠️ Ne remettre ni `"wght"` ni `"opsz"` dans `font-variation-settings` : le
   premier ecrase `font-weight` en silence, le second refige ce qu'on vient de
   liberer. La graisse se pilote par `font-weight`, et nulle part ailleurs.
   ⚠️ Newsreader plafonne a 800. Demander 900 serait clampe sans erreur. */
.page-hero h1,
.article-body h2,
.article-related h2,
.faq-block h2,
.article-body h3,
.section-heading h2,
.featured-product h2,
.format-grid h2,
.sales-cta h2,
.admin-kit-copy h2,
.proof-result h3,
.contents-grid h3,
.value-grid h3,
.proof-card h3 {
  font-family: var(--serif);
  font-weight: 700;
  letter-spacing: -0.015em;
}

/* ------------------------------------------------------------
   4 · HERO IMMERSIF — une image par sujet
   L'image arrive de la page (`--hero-img`), la mise en scène est
   ici : plein cadre, voile prune, titre en Bodoni clair, indice
   de défilement. C'est le hero de l'accueil, à l'échelle article.
   ------------------------------------------------------------ */
/* styles.css cible `.page-hero.blog-page` (2 classes) : il faut la même
   force ici, sinon l'ancien fond horizontal gagne — et l'ancienne image
   se télécharge pour rien derrière la nouvelle. */
.page-hero,
.page-hero.blog-page,
.page-hero.blog-page.ressources-hero,
.page-hero.contenus-hero,
.page-hero.studio-hero,
.page-hero.portfolio-hero,
.page-hero.admin-hero {
  position: relative;
  display: flex;
  /* Le texte etait colle en bas (`flex-end`) : il s'ecrasait sur la
     partie chargee des photos pendant que le haut du mur restait vide.
     Pose en haut, il occupe la zone calme et degage ~200 px d'image sous
     lui — la composition pour laquelle ces photos ont ete choisies.
     `flex-start` s'appuie sur le padding-top (nav + marge) : c'est le
     plus haut possible sans venir toucher le fil d'Ariane. */
  align-items: flex-start;
  overflow: hidden;
  min-height: min(88svh, 780px);
  padding: calc(var(--navh) + clamp(60px, 12vh, 130px))
    clamp(20px, 4vw, 56px) clamp(48px, 9vh, 96px);
  border-bottom: 0;
  background-color: var(--plum-deep);
  background-image: none;
}

.page-hero::before {
  position: absolute;
  z-index: 0;
  inset: 0;
  background-image: var(--hero-img, url("/assets/hero-kit-fondatrice-clean.jpg"));
  background-position: var(--hero-position, center);
  background-size: cover;
  content: "";
  transform: scale(1.06);
  transition: transform 1.6s var(--ease);
}

.page-hero.pret::before {
  transform: scale(1);
}

/* Voile vertical : le titre est en bas, donc l'ombre est en bas.
   L'ancien voile de styles.css était horizontal (pensé desktop) et
   laissait le titre illisible sur téléphone. */
.page-hero::after {
  position: absolute;
  z-index: 1;
  inset: 0;
  /* ⚠️ Ce voile creusait à 0.12 vers 32 % de hauteur — pensé pour un titre
     posé tout en bas (l'accueil). Or sur les pages à texte long le bloc
     remonte : mesuré sur /commencer/, le titre occupe 30 %→54 %, donc
     pile dans le creux. D'où des titres blancs illisibles sur les zones
     claires de la photo. Le voile protège maintenant tout le bas. */
  background:
    linear-gradient(
      180deg,
      rgba(34, 20, 32, 0.46) 0%,
      rgba(34, 20, 32, 0.38) 18%,
      rgba(34, 20, 32, 0.56) 42%,
      rgba(34, 20, 32, 0.78) 70%,
      rgba(34, 20, 32, 0.92) 100%
    );
  content: "";
  pointer-events: none;
}

.page-hero-inner {
  position: relative;
  z-index: 2;
  max-width: min(var(--wrap), 100%);
  margin: 0 auto;
  width: 100%;
  color: var(--paper);
}

/* Sur une photo, la lisibilité passe avant la couleur de rubrique : le
   surtitre était beige (#e9d9c7) et se noyait dans les tons clairs.
   La rubrique reste signalée partout ailleurs (filets, cadres, encadrés). */
.page-hero .eyebrow {
  color: #ffffff;
  text-shadow:
    0 1px 18px rgba(24, 13, 22, 0.6),
    0 1px 3px rgba(24, 13, 22, 0.5);
}

.breadcrumb,
.article-breadcrumb {
  text-shadow: 0 1px 10px rgba(24, 13, 22, 0.6);
}

.page-hero h1 {
  max-width: 22ch;
  margin-top: 16px;
  /* Blanc éclatant, pas le blanc cassé du papier : sur une photo, le
     titre doit trancher. */
  color: #ffffff;
  font-size: clamp(2.5rem, 5.6vw, 4.9rem);
  /* 30/07 : 400 sur une photo, c'est le cas le PIRE — les delies du Bodoni
     disparaissent dans les zones claires de l'image. 700 maintenant que
     `fonts.css` ne bride plus l'axe (il declarait `400 600`). */
  font-weight: 700;
  line-height: 1.04;
  /* Deux ombres : une large qui assombrit le fond derrière la lettre,
     une courte et serrée qui en redessine le bord. C'est la seconde qui
     rend le texte net sur les zones claires de la photo. */
  text-shadow:
    0 2px 30px rgba(24, 13, 22, 0.55),
    0 1px 4px rgba(24, 13, 22, 0.5);
}

.page-hero p:not(.eyebrow) {
  max-width: 46ch;
  margin-top: 22px;
  /* Était #f0e6ee (rosé pâle) : trop proche des tons clairs de la photo.
     Blanc franc + ombre, comme le titre. */
  color: #ffffff;
  font-family: var(--sans);
  font-size: clamp(1rem, 1.35vw, 1.2rem);
  line-height: 1.7;
  text-shadow: 0 1px 12px rgba(24, 13, 22, 0.55);
}

/* Fil d'Ariane : posé sur le hero, pas au-dessus. */
.breadcrumb,
.article-breadcrumb {
  position: absolute;
  z-index: 3;
  top: calc(var(--navh) + 18px);
  left: 0;
  width: 100%;
  padding: 0 clamp(20px, 4vw, 56px);
  color: #d9c9d6;
  font-size: 12.5px;
  letter-spacing: 0.04em;
}

.breadcrumb a,
.article-breadcrumb a {
  color: #e9d9c7;
  text-decoration: none;
}

/* Indice de défilement, comme sur l'accueil. */
.scrollcue {
  position: absolute;
  z-index: 3;
  right: clamp(20px, 4vw, 56px);
  bottom: clamp(30px, 5vh, 54px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  color: #e4d6e0;
  font-size: 10.5px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
}

.scrollcue i {
  width: 1px;
  height: 46px;
  background: linear-gradient(180deg, #e4d6e0, transparent);
  animation: cue 2.2s var(--ease) infinite;
}

@keyframes cue {
  0% { opacity: 0; transform: scaleY(0); transform-origin: top; }
  40% { opacity: 1; transform: scaleY(1); transform-origin: top; }
  100% { opacity: 0; transform: scaleY(1); transform-origin: bottom; }
}

@media (prefers-reduced-motion: reduce) {
  .scrollcue i { animation: none; }
  .page-hero::before { transform: none; transition: none; }
}

@media (max-width: 720px) {
  .scrollcue { display: none; }

  /* 🚨 CORRIGE LE 30/07 — cette regle ne s'appliquait PAS aux articles.
     Latifa : « des fois il y a de trop grands ecarts de vide inexplique,
     comme s'il manquait quelque chose ». Mesure sur /ressources/ en 390 px :
     hero de 743 px pour 464 px de contenu, soit 279 px de vide SOUS le texte.

     Cause : la regle desktop est ecrite sur une LISTE de selecteurs qui
     contient `.page-hero.blog-page` — DEUX classes. Celle-ci n'en avait
     qu'une. Sur toutes les pages en `blog-page` (les 21 articles, les 5
     rubriques et l'index des ressources), la version desktop gagnait donc
     malgre la media-query : hauteur de 88svh ET contenu colle en haut.
     Les pages commerciales, elles, obeissaient — d'ou un defaut qui
     n'apparaissait que par endroits, « des fois ».

     On reprend la meme force de selecteur, comme partout ailleurs dans ce
     fichier (piege 5). Et `center` plutot que `flex-end` : le texte cesse
     de s'ecraser sur la partie chargee des photos, et le vide restant se
     repartit haut/bas au lieu de s'accumuler en bas. */
  .page-hero,
  .page-hero.blog-page,
  .page-hero.blog-page.ressources-hero,
  .page-hero.contenus-hero,
  .page-hero.studio-hero,
  .page-hero.portfolio-hero,
  .page-hero.admin-hero,
  .page-hero.kit-sales-hero,
  .page-hero.ressources-hero {
    align-items: center;
    min-height: min(78svh, 620px);
    padding-top: calc(var(--navh) + clamp(34px, 7vh, 64px));
    padding-bottom: clamp(34px, 6vh, 64px);
  }

  .page-hero::before {
    background-position: var(--hero-position-mobile, var(--hero-position, center));
  }
}

/* ------------------------------------------------------------
   5 · CORPS D'ARTICLE — le « chapitre clair » de l'accueil
   ------------------------------------------------------------ */
.article-shell {
  position: relative;
  max-width: var(--wrap);
  margin: 0 auto;
  padding: clamp(64px, 11vh, 130px) clamp(20px, 4vw, 56px)
    clamp(70px, 12vh, 150px);
  background: var(--paper);
}

.article-meta {
  color: color-mix(in srgb, var(--accent, var(--gold)) 55%, #241722);   /* 08/10 : l'accent reste lisible (AA) sur fond clair */
  font-family: var(--sans);
  font-size: clamp(0.98rem, 1.4vw, 1.14rem);
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

/* 30/07 — Cette ligne est devenue un LIEN vers la rubrique de l'article
   (avant : des mots-cles sans accents, ecrits a la main dans 24 fichiers ;
   voir `_data/cocon.js`). Un lien de 11.5 px fait une cible de 14 px de
   haut : intouchable au doigt, et « les effets doivent marcher au doigt »
   est une regle du chantier. On lui donne une vraie zone tactile.
   Le soulignement natif tombe : a cette taille et avec 0.2em de lettrage,
   il coupe les jambages. Un filet sous le texte le remplace, decolle. */
.article-meta a {
  display: inline-flex;
  align-items: center;
  min-height: 52px;
  color: inherit;
  text-decoration-thickness: 1px;
  /* Le texte est en capitales : aucun jambage a couper, mais a 0.2em de
     lettrage un trait collé au texte l'alourdit. On le decolle. */
  text-underline-offset: 5px;
}

.article-body {
  margin-top: clamp(26px, 4vh, 44px);
  color: var(--ink-soft);
  font-size: clamp(1rem, 1.1vw, 1.09rem);
}

.article-body > p,
.article-body > ul,
.article-body > ol {
  max-width: var(--largeur-texte);
}

.article-body p,
.article-body li {
  color: var(--ink-soft);
  line-height: 1.78;
}

.article-body li + li {
  margin-top: 0.5em;
}

/* 30/07 (soir) — GRAISSE RELEVEE AVEC LE CHANGEMENT DE POLICE.
   Ces titres etaient a 400. Ils echappaient aux deux passes d'epaississement
   precedentes parce que ces regles-ci arrivent APRES le bloc « GRAISSE DES
   TITRES » en fin de fichier : a specificite egale ou superieure, c'est la
   derniere qui gagne. On ne l'a vu qu'en relevant la graisse CALCULEE de
   chaque titre de chaque page dans le navigateur — 213 titres etaient
   concernes, sur 22 pages. Relire le CSS ne suffisait pas.
   ⚠️ Si un titre parait encore maigre, chercher la DERNIERE regle qui le vise,
   pas la premiere. */
/* Titres de section : l'accent italique bordeaux de l'accueil. */
.article-body h2 {
  max-width: 26ch;
  margin-top: clamp(60px, 9vh, 108px);
  margin-bottom: 18px;
  color: var(--ink);
  font-size: clamp(1.95rem, 3.1vw, 3rem);
  font-weight: 700;
  line-height: 1.1;
}

.article-body h2 em,
.article-body h2 i {
  color: var(--bordeaux);
  font-style: italic;
}

/* Un filet doré discret ouvre chaque section : c'est le repère de
   chapitre de l'accueil, réduit à l'échelle d'un article. */
.article-body h2::before {
  display: block;
  width: 46px;
  height: 1px;
  margin-bottom: 26px;
  background: var(--accent, var(--gold));
  content: "";
}

/* 🚨 LES « VIDES INEXPLIQUES » DU GLOSSAIRE — corrige le 30/07.
   Latifa : « des fois il y a de trop grands ecarts de vide inexplique, comme
   s'il manquait quelque chose ». Vu sur le glossaire.

   Cause : l'ecart de CHAPITRE de `.article-body h2/h3` s'appliquait a des
   titres qui ne sont pas des chapitres mais des en-tetes de CARTE.
   Mesure en 390 px : le titre « Les fondations de la marque » portait
   `margin-top: 76px` dans une carte dont le padding-haut fait 22px, et les
   12 titres de definitions portaient 42px alors que leur carte a DEJA 40px
   de padding et 40px de marge. Soit ~82px entre le filet et le mot.
   14 titres concernes sur la seule page du glossaire.

   Les cartes gardent leur propre respiration (marge + padding + filet) :
   on ne retire QUE le surplus herite. Le filet dore `::before` reste, c'est
   le repere de rubrique.

   Deux classes contre une, volontairement : le style des cartes vit dans le
   `styles.css` de PROD, qu'on ne modifie pas (piege 4). On reprend la main
   sans dependre de l'ordre des fichiers. */
.article-body .glossary-sommaire-head h2,
.article-body .glossary-term-head h2,
.article-body .glossary-term-head h3 {
  margin-top: 0;
}

.article-body h3 {
  max-width: 30ch;
  margin-top: clamp(38px, 5vh, 56px);
  margin-bottom: 12px;
  color: var(--bordeaux);
  font-size: clamp(1.35rem, 1.9vw, 1.75rem);
  font-weight: 700;
  line-height: 1.22;
}

.article-body strong {
  color: var(--ink);
  font-weight: 600;
}

.article-body a:not(.button) {
  color: var(--bordeaux);
  font-weight: 600;
  text-decoration: none;
  border-bottom: 1px solid rgba(123, 44, 63, 0.28);
  transition: border-color var(--duree) var(--ease);
}

.article-body a:not(.button):hover {
  border-bottom-color: var(--bordeaux);
}

/* Encadré : la carte douce de l'accueil. */
.article-note {
  max-width: var(--largeur-texte);
  margin: clamp(34px, 5vh, 52px) 0;
  padding: clamp(24px, 3vw, 34px);
  border: 1px solid rgba(161, 138, 88, 0.34);
  border-left: 3px solid var(--accent, var(--gold));
  border-radius: var(--rayon);
  /* Le fond n'est plus un beige fixe : c'est un voile de la couleur de
     RUBRIQUE de la page. Chaque page garde ainsi son univers, et le fond
     du site reste blanc. La 1re ligne est le repli des vieux navigateurs. */
  background: #f7f5f7;
  background: color-mix(in srgb, var(--accent, var(--gold)) 7%, #ffffff);
  color: var(--ink);
}

.article-note p {
  color: var(--ink);
}

/* ------------------------------------------------------------
   6 · BANDE SOMBRE D'APPEL — la bascule d'ambiance de l'accueil,
   pleine largeur, qui coupe la lecture au bon moment.
   ------------------------------------------------------------ */
/* ⚠️ Piège de spécificité, corrigé le 29/07.
   Ce bloc sort de sa colonne pour occuper toute la largeur. La recette
   classique est `left:50%` compensé par `margin-left:-50vw`. Or le CSS de
   prod contient `.questions-section .article-cta { margin-left:auto }` :
   DEUX classes contre une, il gagnait. La compensation sautait, `left:50%`
   restait, et le bloc partait 195 px hors de l'écran (vu sur /commencer/).
   On reprend la main avec la même force, et sans dépendre de `left`. */
.article-cta,
.questions-section .article-cta {
  position: relative;
  left: 0;
  width: auto;
  max-width: 42rem;
  margin: clamp(56px, 8vh, 88px) auto 0;
  padding: clamp(24px, 4vw, 34px);
  border: 1px solid rgba(36, 23, 34, 0.1);
  border-radius: var(--rayon-grand);
  background:
    linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(247, 241, 235, 0.94));
  color: var(--ink);
  text-align: left;
  box-shadow: 0 18px 40px rgba(36, 23, 34, 0.05);
}

/* 🚨 Le titre etait INVISIBLE sur les 24 pages d'articles — vu par Latifa
   au telephone le 30/07 : « on dirait qu'il n'y a pas de texte ».
   Cause : aucune regle ne visait `.article-cta h2`. Le titre retombait donc
   sur la balise nue de `styles.css` (prod), `h2 { color: var(--bordeaux-dark) }`,
   soit rgb(36,23,34) — pose sur `--plum-deep` rgb(34,20,32).
   Contraste MESURE : 1.03:1. Le texte etait la, simplement peint en sombre
   sur du sombre. C'est le piege 5 dans sa forme la plus discrete : la balise
   nue ne declenche aucun conflit visible au diagnostic, elle repeint.
   Meme force de selecteur que le bloc au-dessus, pour la meme raison. */
.article-cta h2,
.questions-section .article-cta h2 {
  max-width: 18ch;
  margin: 0 0 14px;
  color: var(--ink);
  font-size: clamp(1.45rem, 2.8vw, 2rem);
  line-height: 1.14;
  font-weight: 700;
}

/* Le filet de chapitre (`.article-body h2::before`) heritait ici alors que le
   bloc est CENTRE : il se posait tout a gauche, comme un trait oublie. On le
   recentre au lieu de le supprimer — il garde le repere visuel de l'accueil. */
.article-cta h2::before,
.questions-section .article-cta h2::before {
  margin-right: 0;
  margin-left: 0;
  background: var(--gold);
}

.article-cta p {
  max-width: 38ch;
  margin: 0 0 22px;
  color: var(--ink-soft);
  font-family: var(--body);
  font-size: clamp(1rem, 1.5vw, 1.14rem);
  font-weight: 400;
  font-style: normal;
  line-height: 1.65;
}

.article-cta .button,
.article-cta a.button.primary {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 15px 32px;
  border: 1px solid rgba(36, 23, 34, 0.08);
  border-radius: var(--rayon-pilule);
  background: var(--plum-deep);
  color: var(--paper);
  font-family: var(--sans);
  font-size: 14.5px;
  font-weight: 600;
  transition: transform var(--duree) var(--ease), background var(--duree);
}

.article-cta .button:hover {
  transform: translateY(-2px);
  background: #2d1d2a;
}

.article-suite {
  display: grid;
  gap: 18px;
  margin-top: 34px;
  margin-bottom: 44px;
  padding: 24px;
  border: 1px solid rgba(36, 23, 34, 0.1);
  border-radius: var(--rayon-grand);
  background:
    linear-gradient(135deg, rgba(255, 255, 255, 0.96), rgba(247, 241, 235, 0.96));
  box-shadow: 0 20px 40px rgba(36, 23, 34, 0.06);
}

.article-suite__step {
  margin: 0 0 8px;
  color: var(--ink-soft);
  font-family: var(--sans);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.article-suite h2 {
  margin: 0 0 12px;
  font-size: clamp(1.35rem, 2.3vw, 1.85rem);
}

.article-suite h2::before {
  display: none;
}

.article-suite p:last-child {
  margin-bottom: 0;
}

.article-suite__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.article-suite__actions .button.secondary,
.journey-card .button.secondary {
  border-color: rgba(36, 23, 34, 0.14);
  background: transparent;
  color: var(--ink);
}

/* ------------------------------------------------------------
   7 · FAQ — dépliants sobres
   ------------------------------------------------------------ */
.faq-block {
  max-width: 66ch;
  margin-top: clamp(60px, 9vh, 100px);
}

.faq-block h2 {
  margin-bottom: 26px;
}

.faq-block details {
  padding: 20px 0;
  border-bottom: 1px solid rgba(36, 23, 34, 0.12);
}

.faq-block summary {
  /* toute la rangée répond au doigt, pas seulement la ligne de texte */
  padding-block: 20px;
  margin-block: -20px;
  cursor: pointer;
  color: var(--ink);
  font-family: var(--serif);
  font-size: clamp(1.05rem, 1.4vw, 1.24rem);
  font-weight: 600;
  list-style: none;
}

.faq-block summary::-webkit-details-marker {
  display: none;
}

.faq-block summary::after {
  float: right;
  margin-left: 16px;
  color: color-mix(in srgb, var(--accent, var(--gold)) 55%, #241722);   /* 08/10 : l'accent reste lisible (AA) sur fond clair */
  content: "+";
  font-family: var(--sans);
  transition: transform var(--duree) var(--ease);
}

.faq-block details[open] summary::after {
  content: "–";
}

.faq-block details p {
  margin-top: 12px;
  color: var(--ink-soft);
}

/* ------------------------------------------------------------
   8 · « LIRE AUSSI » — les cartes de l'accueil
   ------------------------------------------------------------ */
.article-related {
  margin-top: clamp(70px, 11vh, 130px);
}

.article-related h2 {
  margin-bottom: 30px;
  color: var(--ink);
  font-size: clamp(1.7rem, 2.4vw, 2.3rem);
  font-weight: 700;
}

.article-related h2::before {
  display: block;
  width: 46px;
  height: 1px;
  margin-bottom: 24px;
  background: var(--accent, var(--gold));
  content: "";
}

.article-related ul {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr));
  gap: clamp(16px, 2.2vw, 28px);
  margin: 0;
  padding: 0;
  list-style: none;
}

.article-related li {
  margin: 0;
}

.article-related li a {
  display: flex;
  align-items: flex-end;
  min-height: 148px;
  padding: 26px;
  border: 1px solid rgba(36, 23, 34, 0.1);
  border-radius: var(--rayon-grand);
  background: #fff;
  color: var(--ink);
  font-family: var(--serif);
  font-size: 1.22rem;
  font-weight: 600;
  line-height: 1.28;
  text-decoration: none;
  transition:
    transform var(--duree) var(--ease),
    box-shadow var(--duree) var(--ease),
    border-color var(--duree) var(--ease);
}

.article-related li a::after {
  margin-left: auto;
  padding-left: 14px;
  color: var(--bordeaux);
  content: "→";
  font-family: var(--sans);
  font-size: 1rem;
}

.article-related li a:hover {
  transform: translateY(-6px);
  border-color: rgba(123, 44, 63, 0.32);
  box-shadow: 0 40px 60px -42px rgba(36, 23, 34, 0.32);
}

/* ------------------------------------------------------------
   9 · BARRE DE LECTURE — sait où on en est dans l'article.
   Plus utile qu'un rail de sections sur un texte long.
   ------------------------------------------------------------ */
.lecture-progress {
  position: fixed;
  z-index: 70;
  top: 0;
  left: 0;
  width: 100%;
  height: 3px;
  background: transparent;
  pointer-events: none;
}

.lecture-progress i {
  display: block;
  width: var(--avancement, 0%);
  height: 100%;
  background: linear-gradient(90deg, var(--gold), var(--bordeaux));
}

/* ------------------------------------------------------------
   10 · EN-TÊTE — transparente sur le hero, givrée au scroll.
   ------------------------------------------------------------ */
.site-header {
  position: fixed;
  z-index: 60;
  top: 0;
  left: 0;
  width: 100%;
  height: var(--navh);
  padding: 0 clamp(18px, 3vw, 44px);
  border: 0;
  background: transparent;
  box-shadow: none;
  transition: background var(--duree-longue), box-shadow var(--duree-longue);
}

/* La barre de navigation reste une ligne de décision, pas une grille qui se
   tasse. Au bureau, les deux colonnes latérales s'équilibrent pour centrer les
   cinq entrées dans la fenêtre. Avant la collision, le menu complet prend le
   relais : aucun libellé ne passe à la ligne, et le CTA Kits déjà présent dans
   la navigation ne concurrence pas le parcours. */
@media (min-width: 1200px) {
  .site-header {
    grid-template-columns: minmax(0, 1fr) max-content minmax(0, 1fr);
    column-gap: clamp(18px, 2vw, 32px);
  }

  .site-header .brand {
    justify-self: start;
  }

  .site-nav {
    justify-self: center;
    flex: 0 0 auto;
    flex-wrap: nowrap;
    gap: clamp(22px, 2.3vw, 34px) !important;
    white-space: nowrap;
  }

  .site-nav a {
    flex: 0 0 auto;
  }

  .site-header .header-actions {
    justify-self: end;
    flex-wrap: nowrap;
  }
}

@media (max-width: 1199px) {
  .site-header {
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 16px;
  }

  .site-header .brand img {
    height: 42px;
  }

  .site-nav,
  .header-cta {
    display: none;
  }
}

.site-header.defile {
  background: rgba(252, 250, 246, 0.9);
  backdrop-filter: blur(14px);
  box-shadow: 0 1px 0 rgba(36, 23, 34, 0.08);
}

/* Au-dessus du hero (donc sur fond sombre), les libellés passent en clair. */
.site-header:not(.defile) .site-nav a,
.site-header:not(.defile) .menu-toggle {
  color: var(--paper);
}

/* L'état courant, ajouté le 11/08 avec la navigation canonique : le CSS
   prévoyait déjà `aria-current` sur l'en-tête transparent, mais rien une fois
   l'en-tête défilé. `aria-current` le dit aux lecteurs d'écran ; ce trait le dit
   à qui voit. Un soulignement plutôt qu'une couleur seule : lisible même pour
   qui distingue mal les teintes. */
.site-header.defile .site-nav a[aria-current="page"] {
  text-decoration: underline;
  text-decoration-thickness: 1.5px;
  text-underline-offset: .42em;
  text-decoration-color: var(--rose);
}

.site-header .site-nav a {
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  letter-spacing: 0.04em;
}

/* ------------------------------------------------------------
   11 · PIED DE PAGE — le prune profond de l'accueil.
   ------------------------------------------------------------ */
footer {
  position: relative;
  padding: clamp(60px, 9vh, 92px) clamp(20px, 4vw, 56px)
    clamp(34px, 5vh, 52px);
  background: var(--plum-deep);
  color: #cdbbc9;
  text-align: center;
}

footer > p {
  max-width: 34ch;
  margin: 18px auto 26px;
  color: #e7ddef;
  font-family: var(--serif);
  font-size: clamp(1.05rem, 1.6vw, 1.3rem);
  font-style: italic;
  line-height: 1.4;
}

.footer-contact {
  display: inline-block;
  margin-bottom: 8px;
  color: #e7ddef;
  font-size: 14px;
  text-decoration: underline;
  text-decoration-color: rgba(231, 221, 239, 0.46);
  text-underline-offset: 4px;
}

.footer-contact:hover,
.footer-contact:focus-visible {
  color: #ffffff;
  text-decoration-color: currentColor;
}

footer .social-links,
footer .footer-links {
  display: flex;
  flex-wrap: wrap;
  gap: 10px clamp(16px, 2.4vw, 30px);
  justify-content: center;
  margin-top: 18px;
}

footer a {
  color: #cdbbc9;
  font-family: var(--sans);
  font-size: 14px;
  text-decoration: none;
  transition: color var(--duree);
}

footer a:hover {
  color: var(--rose);
}

footer .footer-legal {
  margin-top: 26px;
  padding-top: 22px;
  border-top: 1px solid rgba(217, 169, 180, 0.16);
}

footer .footer-legal a {
  font-size: 12.5px;
  letter-spacing: 0.05em;
  opacity: 0.75;
}

/* ------------------------------------------------------------
   12 · BOUTON « REMONTER »
   ------------------------------------------------------------ */
.scroll-top {
  border: 0;
  background: var(--bordeaux);
  color: #fff;
  box-shadow: 0 18px 34px -18px rgba(36, 23, 34, 0.6);
  transition: transform var(--duree) var(--ease), background var(--duree);
}

.scroll-top:hover {
  transform: translateY(-3px);
  background: var(--bordeaux-dark);
}

/* ------------------------------------------------------------
   13 · DESKTOP — la gouttière de droite devient une marge vivante.
   Le texte garde sa longueur de ligne lisible, les titres
   respirent plus large : c'est la mise en page éditoriale.
   ------------------------------------------------------------ */
@media (min-width: 1100px) {
  .article-body > p,
  .article-body > ul,
  .article-body > ol,
  .article-note {
    margin-left: clamp(0px, 6vw, 96px);
  }

  .article-body h2,
  .article-body h3 {
    margin-left: 0;
  }
}

/* ------------------------------------------------------------
   14 · LOGO — blanc au-dessus du hero, couleur ensuite.
   Sans ça, le logo prune/olive disparaît sur une photo claire.
   ------------------------------------------------------------ */
.site-header .brand {
  position: relative;
  display: inline-flex;
  align-items: center;
}

.site-header .brand img {
  transition: opacity var(--duree) var(--ease);
}

.site-header .brand .l-white {
  position: absolute;
  top: 0;
  left: 0;
}

.site-header:not(.defile) .brand .l-color,
.site-header.defile .brand .l-white {
  opacity: 0;
}

/* ------------------------------------------------------------
   15 · NAV AU-DESSUS DU HERO — contraste.
   styles.css verrouille la couleur des liens avec `!important`
   (ligne 2991 : `color: var(--ink) !important`). Sur une photo,
   ces liens deviennent illisibles : il faut la même force pour
   reprendre la main, et seulement quand l'en-tête est sur l'image.
   ------------------------------------------------------------ */
.site-header:not(.defile) .site-nav a {
  color: #f3ecf1 !important;
  text-shadow: 0 1px 14px rgba(24, 13, 22, 0.55);
}

.site-header:not(.defile) .site-nav a:hover,
.site-header:not(.defile) .site-nav a:focus-visible,
.site-header:not(.defile) .site-nav a[aria-current="page"] {
  color: #fff !important;
  border-bottom-color: var(--rose);
}

.site-header:not(.defile) .menu-toggle {
  color: #f3ecf1;
  text-shadow: 0 1px 14px rgba(24, 13, 22, 0.55);
}

/* ============================================================
   BEIGES RÉSIDUELS DU CSS DE PROD
   ------------------------------------------------------------
   Décision du 28/07/2026 : « pas de beige, fond blanc pur ».
   Le fond général passe par --paper, donc il suit tout seul.
   Restent quelques `#fffdf8` écrits EN DUR dans styles.css, que
   les tokens ne peuvent pas atteindre. On les neutralise ici
   plutôt que de retoucher les 4 912 lignes du CSS de prod :
   ce fichier-ci est chargé après, et c'est lui qui part au
   déploiement. styles.css, lui, n'y va pas.
   ============================================================ */

.newsletter-form input[type="text"],
.newsletter-form input[type="email"],
.newsletter-form textarea {
  background: var(--paper);
}

.newsletter-form textarea {
  min-height: 10rem;
  resize: vertical;
}

/* Fond de vignette (les visuels d'aperçu se chargent en différé). */
.preview-grid img {
  background: var(--paper);
}

/* ------------------------------------------------------------
   LES APERCUS DU KIT, A LA PLACE DU MOCKUP — 30/07/2026
   ------------------------------------------------------------
   Latifa : « enleve cette image et remplace-la par les apercus du Kit qu'il y a
   en bas, leur place est la et pas en bas. »
   Le bloc d'achat garde donc sa grille a deux colonnes (texte | visuel), mais
   la colonne de droite montre maintenant QUATRE pages reelles au lieu d'un
   mockup unique. Sur un ecran de telephone `.featured-product` retombe a une
   colonne : les quatre aperçus prennent alors toute la largeur, et un 2x2
   reste lisible sans qu'on ait a zoomer.
   La legende de chaque page vient sous l'image : c'est elle qui dit ce que la
   cliente y decide. Sans legende, quatre pages beiges se ressemblent.
   ------------------------------------------------------------ */
.product-previews {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(12px, 1.6vw, 20px);
  margin: 0;
}

.product-previews figure {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 0;
}

.product-previews img {
  width: 100%;
  height: auto;
  border: 1px solid rgba(36, 23, 34, 0.1);
  border-radius: 6px;
  background: var(--paper);
  box-shadow: 0 14px 34px rgba(48, 32, 26, 0.1);
}

.product-previews figcaption {
  color: var(--olive-dark);
  font-family: var(--sans);
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  line-height: 1.25;
  text-transform: uppercase;
}

/* ------------------------------------------------------------
   « FORMAT ET UTILISATION » — fond prune, 30/07/2026
   ------------------------------------------------------------
   Latifa : « change la couleur de son fond rosâtre et mets-la en prune, le même
   que celui déjà présent dans certains encadrés. »
   Le fond était un dégradé bordeaux 6 % + doré 8 % sur `--warm` : à l'écran ça
   donnait un rose délavé qui ne ressemblait à rien d'autre sur le site. Le
   `--plum-deep` est celui des blocs d'appel des articles et du pied de page :
   la section rejoint donc une famille existante au lieu d'inventer une teinte.

   ⚠️ Un fond sombre oblige à REPRENDRE LES COULEURS DE TEXTE. Le H2 héritait de
   `var(--bordeaux)` : posé sur du prune, il aurait donné 1,3:1 — exactement le
   bug du 30/07 sur `.article-cta h2`, où le titre était devenu invisible.
   Contrastes mesurés ici : titre 15,8:1, texte 9,1:1, sur-titre doré 5,4:1.

   Les 4 pastilles sont parties (elles répétaient ce que dit déjà la liste
   au-dessus du prix), donc la grille n'a plus qu'une colonne : on la borne en
   largeur, sinon le paragraphe s'étire sur toute la page et devient pénible.
   ------------------------------------------------------------ */
.kit-format {
  border-top: 0;
  border-bottom: 0;
  background: var(--plum-deep);
  color: var(--paper);
}

.kit-format .format-grid {
  display: block;
  max-width: 46rem;
}

.kit-format h2 {
  color: var(--paper);
}

.kit-format p:not(.eyebrow) {
  color: #cdbbc9;
}

.kit-format .eyebrow {
  color: var(--gold);
}

/* Carte du popup « freebie » (le PDF offert). */
.freebie-popup-card {
  background: var(--paper);
}

/* ============================================================
   INDEX /ressources/ — « la ligne active pilote le visuel »
   ------------------------------------------------------------
   Prototype validé par Latifa le 28/07/2026, reversé ici.
   Principe : UN seul mécanisme, DEUX déclencheurs.
   Au doigt, c'est le DÉFILEMENT qui désigne la ligne active
   (le visuel est collé en haut et ne quitte pas l'écran).
   À la souris, c'est le survol. Pas d'effet réservé au desktop.
   Les classes sont préfixées `res-` : styles.css de prod ne les
   connaît pas, donc aucune collision possible.
   ============================================================ */

.res-visuel {
  position: sticky;
  /* L'en-tête du site est fixe : sans ce décalage, le visuel se colle
     dessous et l'image est coupée par la barre. --navh seule ne suffit
     pas (l'en-tête mesurée fait 16 px de plus) : on reprend le même
     `+ 18px` que le fil d'Ariane, qui, lui, tombe juste. */
  top: calc(var(--navh) + 18px);
  z-index: 2;
  background: var(--paper);
  padding: 8px 0 18px;
}

.res-panneau {
  --c: var(--sauge);
  height: 34vh;
  min-height: 220px;
  padding: 10px;
  border-radius: 4px;
  background: var(--c);
  transition: background var(--duree-longue) var(--ease);
}

.res-cadre {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  border-radius: 2px;
}

.res-cadre img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  clip-path: inset(100% 0 0 0);
  transform: scale(1.06);
  transition:
    opacity 240ms var(--ease),
    clip-path var(--duree-longue) var(--ease),
    transform 1400ms var(--ease);
}

.res-cadre img.montre {
  opacity: 1;
  clip-path: inset(0 0 0 0);
  transform: scale(1);
}

/* ------------------------------------------------------------
   LE PARCOURS DANS LE HERO DE /ressources/  — 30/07
   ------------------------------------------------------------
   Latifa : « le texte en dessous doit etre mis en valeur, ca donne les
   etapes a accomplir, essentiel pour etre bien guidee, donc ca doit etre
   visible et beau ». Le paragraphe n'avait aucun style propre : il
   heritait du texte courant, sur une photo, et il ANNONCAIT un ordre
   sans jamais le montrer.

   Ici : le texte prend une vraie taille de chapeau, et les 5 etapes
   deviennent visibles, numerotees, dans la couleur de leur rubrique.

   Choix mobile-first, sa regle : ca DOIT marcher au doigt. Donc pas de
   defilement horizontal (qui cacherait des etapes), mais un retour a la
   ligne — les 5 etapes sont toutes visibles d'un coup. Chaque etape est
   un vrai lien, avec une hauteur de touche confortable.
   ------------------------------------------------------------ */
.ressources-lede {
  max-width: 44ch;
  margin-top: 18px;
  font-size: clamp(1.05rem, 1.9vw, 1.35rem);
  line-height: 1.6;
  /* Sur photo, la lisibilite passe avant tout — meme raison que le
     surtitre et le fil d'Ariane un peu plus haut dans ce fichier. */
  text-shadow:
    0 1px 18px rgba(24, 13, 22, 0.6),
    0 1px 3px rgba(24, 13, 22, 0.5);
}

/* 30/07 — Latifa, apres avoir vu la 1re version : « les bulles 5 rubriques
   dans l'ordre doivent etre une en dessous de l'autre et bien centrees ».
   J'avais mis un retour a la ligne, ce qui produisait 2 colonnes inegales
   (2 · 2 · 1) : ca ne se lit plus comme un ORDRE, et c'est justement l'ordre
   qui compte ici. Une colonne, centree, et chaque bulle a la meme largeur
   pour que la suite se lise comme un escalier. */
.res-parcours {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 9px;
  margin: 26px auto 0;
  padding: 0;
  list-style: none;
}

.res-parcours li {
  width: 100%;
  max-width: 20rem;
}

.res-parcours a {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 9px;
  /* 12px vertical : la zone de touche depasse 44 px avec la hauteur de
     ligne. Sur telephone, une etape doit s'attraper sans viser. */
  padding: 12px 15px;
  border: 1px solid rgba(255, 255, 255, 0.28);
  border-radius: var(--rayon-pilule);
  color: #ffffff;
  text-decoration: none;
  transition: border-color var(--duree) var(--ease), background var(--duree);
}

.res-parcours a:hover,
.res-parcours a:focus-visible {
  border-color: var(--c);
  background: rgba(255, 255, 255, 0.12);
}

/* Le numero etait peint dans la couleur de la rubrique. Mesure sur la photo :
   l'olive tombait a 0.11 de luminance et le bordeaux a 0.064 — illisibles.
   C'est la lecon deja apprise juste au-dessus pour le surtitre du hero :
   SUR UNE PHOTO, LA LISIBILITE PASSE AVANT LA COULEUR DE RUBRIQUE.
   Le numero repasse donc en blanc, et la couleur se dit par la pastille
   qui le precede — visible sans avoir a etre lue. */
.res-parcours__num {
  display: inline-flex;
  align-items: baseline;
  gap: 7px;
  color: rgba(255, 255, 255, 0.82);
  font-family: var(--sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.16em;
}

.res-parcours__num::before {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--c);
  /* Un liseré clair : sur les zones sombres de la photo, une pastille
     olive ou bordeaux disparaitrait tout autant que le texte. */
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.55);
  content: "";
}

.res-parcours__nom {
  font-family: var(--serif);
  font-size: clamp(1rem, 1.5vw, 1.15rem);
  font-weight: 700;
}

.journey-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
  gap: clamp(18px, 2.6vw, 30px);
  margin-bottom: clamp(42px, 7vw, 72px);
}

.journey-card {
  display: grid;
  gap: 16px;
  padding: clamp(24px, 3vw, 34px);
  border: 1px solid rgba(36, 23, 34, 0.1);
  border-radius: var(--rayon-grand);
  background:
    linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(247, 241, 235, 0.92));
  box-shadow: 0 20px 40px rgba(36, 23, 34, 0.05);
}

.journey-card h3 {
  margin: 0;
  font-size: clamp(1.55rem, 2vw, 2rem);
}

.journey-card p {
  margin: 0;
}

.journey-card ol {
  display: grid;
  gap: 12px;
  margin: 0;
  padding-left: 22px;
}

.journey-card li::marker {
  color: var(--bordeaux);
  font-family: var(--sans);
  font-weight: 700;
}

.journey-card a {
  color: var(--ink);
}

.journey-card .button {
  justify-self: start;
  margin-top: 8px;
}

.res-liste {
  margin: 0;
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--line);
}

.res-ligne {
  position: relative;
  border-bottom: 1px solid var(--line);
}

.res-ligne a {
  display: block;
  padding: 20px 0 20px 20px;
  color: inherit;
  text-decoration: none;
  transition: opacity var(--duree, 280ms) var(--ease);
}

/* Le filet de couleur qui marque la ligne active. */
.res-ligne a::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 4px;
  background: var(--c);
  transform: scaleY(0);
  transform-origin: 50% 0;
  transition: transform var(--duree-longue) var(--ease);
}

.res-ligne.est-actif a::before {
  transform: scaleY(1);
}

/* Les lignes non actives reculent, elles ne disparaissent pas. */
.res-liste.attenue .res-ligne:not(.est-actif) a {
  opacity: 0.86;   /* 08/10 : 0,62 donnait 3:1 ; 0,86 garde le contraste AA */
}

.res-meta {
  margin: 0 0 8px;
  color: color-mix(in srgb, var(--c) 34%, #241722);   /* 09/10 : AA y compris pour le rose sur le papier clair (3,96:1 à 50 %) */
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* ------------------------------------------------------------
   30/07 — CES TITRES SONT DES LIENS, ET RIEN NE LE DISAIT
   ------------------------------------------------------------
   Une lectrice, le 30/07 : « je n'avais pas compris que les titres en gras
   etaient des redirections vers des articles ». Elle avait raison :
   `.res-ligne a` est en `text-decoration: none` avec `color: inherit`, donc le
   titre ressemblait a du texte. Le seul indice — le filet de couleur — n'arrive
   qu'au survol, ce qui ne veut rien dire au doigt.
   La fleche est donc VISIBLE AU REPOS, dans la couleur de la rubrique. Elle
   avance de 4 px au survol et au toucher, mais l'affordance ne depend pas de ce
   mouvement : c'est la regle « les effets doivent marcher au doigt ».
   Choisi plutot qu'un soulignement : sur 7 titres serif de 28 px, souligner
   alourdit toute la page ; une fleche se lit sans peser.
   ------------------------------------------------------------ */
.res-titre {
  margin: 0;
  font-family: var(--serif);
  font-size: clamp(23px, 5.4vw, 28px);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.15;
}

.res-titre::after {
  content: " \2192";
  display: inline;
  margin-left: 0.3em;
  color: var(--c);
  font-family: var(--sans);
  font-weight: 700;
  white-space: nowrap;
}

.res-ligne a:hover .res-titre::after,
.res-ligne a:focus-visible .res-titre::after,
.res-ligne a:active .res-titre::after {
  margin-left: 0.55em;
}

@media (prefers-reduced-motion: no-preference) {
  .res-titre::after {
    transition: margin-left var(--duree, 280ms) var(--ease);
  }
}

/* Le nom de l'etape suivante, dans « Continuer ailleurs ». Il dit ou on va,
   pas seulement quoi : c'est la reponse au « on revient au point de depart ». */
.res-voisines__etape {
  display: block;
  margin-top: 2px;
  color: var(--c);
  font-family: var(--sans);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

/* Le résumé est CONSERVÉ (rien n'est retiré au texte de la page),
   mais borné à 2 lignes : la liste reste parcourable au pouce. */
.res-resume {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  margin: 8px 0 0;
  color: var(--ink-soft);
  font-size: 15px;
  line-height: 1.5;
}

.res-numero {
  display: none;
}

/* --- Grand écran : même effet, déclenché par la souris.
       Le visuel passe simplement dans la colonne de droite. --- */
@media (min-width: 1000px) {
  .res-corps {
    display: grid;
    grid-template-columns: 1fr minmax(280px, 34%);
    gap: 56px;
    align-items: start;
  }

  .res-visuel {
    grid-row: 1;
    grid-column: 2;
    top: calc(var(--navh) + 24px);
    padding: 0;
  }

  .res-liste {
    grid-row: 1;
    grid-column: 1;
  }

  .res-panneau {
    height: auto;
    aspect-ratio: 4 / 5;
    padding: 14px;
  }

  .res-ligne a {
    display: grid;
    grid-template-columns: 56px 1fr;
    gap: 20px;
    align-items: baseline;
    padding: 26px 0 26px 24px;
  }

  .res-numero {
    display: block;
    color: var(--c);
    font-family: var(--serif);
    font-size: 19px;
    font-weight: 600;
  }

  .res-titre {
    font-size: clamp(25px, 3vw, 36px);
    line-height: 1.1;
  }

  .res-resume {
    -webkit-line-clamp: 3;
    max-width: 56ch;
  }
}

@media (prefers-reduced-motion: reduce) {
  .res-cadre img {
    clip-path: none !important;
    transform: none !important;
  }
}

/* --- Le glossaire : ce n'est pas un article, c'est un outil qui
       grandit. Il sort donc de la liste et prend un bloc à lui. --- */
.res-glossaire {
  display: block;
  overflow: hidden;
  margin-top: 48px;
  border-radius: 4px;
  background: var(--plum);
  color: #fff;
  text-decoration: none;
}

.res-glossaire__image {
  margin: 0;
  overflow: hidden;
  aspect-ratio: 16 / 10;
}

.res-glossaire__image img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 1200ms var(--ease);
}

.res-glossaire:hover .res-glossaire__image img {
  transform: scale(1.04);
}

.res-glossaire__texte {
  padding: 26px 22px 30px;
}

.res-glossaire__meta {
  margin: 0 0 10px;
  color: var(--rose);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* Deux classes, pas une : `styles.css` de prod colore les h3 en bordeaux
   avec cette force-là. Sur le fond prune, le bordeaux devenait illisible. */
.res-glossaire .res-glossaire__titre {
  color: #ffffff;
}

.res-glossaire__titre {
  margin: 0;
  font-family: var(--serif);
  font-size: clamp(26px, 6vw, 34px);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.1;
}

.res-glossaire__intro {
  max-width: 46ch;
  margin: 14px 0 0;
  color: rgba(255, 255, 255, 0.78);
}

.res-glossaire__lien {
  display: inline-block;
  margin-top: 20px;
  padding-bottom: 4px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.45);
  font-size: 15px;
  transition: border-color var(--duree, 280ms) var(--ease);
}

.res-glossaire:hover .res-glossaire__lien {
  border-color: #fff;
}

@media (min-width: 1000px) {
  .res-glossaire {
    display: grid;
    grid-template-columns: 1fr 1fr;
    align-items: stretch;
    margin-top: 72px;
  }

  .res-glossaire__image {
    height: 100%;
    aspect-ratio: auto;
  }

  .res-glossaire__texte {
    align-self: center;
    padding: 56px 52px;
  }
}

/* ============================================================
   RÉSEAUX SOCIAUX — le vrai logo, plus le nom
   ------------------------------------------------------------
   Les SVG sont intégrés dans la page (voir `_includes/icones-sociales.njk`)
   et prennent la couleur du texte : ils restent lisibles sur le footer
   sombre. Aucun appel réseau.
   Ici, le PIED DE PAGE seulement : les mêmes icônes dans le menu sont
   habillées par `css/site-menu.css`, avec tout le reste du menu.
   ============================================================ */
.social-links a {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.social-links svg {
  flex: none;
  /* L'icône s'aligne sur la hauteur de la lettre, pas sur la ligne :
     sinon elle flotte au-dessus du mot. */
  width: 1.15em;
  height: 1.15em;
  opacity: 0.92;
  transition: opacity var(--duree, 280ms) var(--ease);
}

.social-links a:hover svg,
.social-links a:focus-visible svg {
  opacity: 1;
}

/* ============================================================
   FOOTER — lisibilité des liens
   ------------------------------------------------------------
   Ils étaient en --bordeaux (#7b2c3f) sur le prune #221420 :
   contraste mesuré 1.91, alors que le minimum lisible est 4.5.
   Sur un fond sombre, la couleur de marque ne peut pas servir au
   texte : elle sert au survol et aux à-plats. Le texte, lui, est
   clair. (Les pastilles de réseaux sont déjà à 9.08 : elles ont
   un fond clair, on n'y touche pas.)
   ============================================================ */
footer .footer-links a {
  color: #e7ddef;
  transition: color var(--duree, 280ms) var(--ease);
}

footer .footer-links a:hover,
footer .footer-links a:focus-visible {
  color: #ffffff;
  text-decoration: underline;
  text-underline-offset: 4px;
}

footer .footer-legal a {
  color: #c3b3c4;
}

footer .footer-legal a:hover,
footer .footer-legal a:focus-visible {
  color: #ffffff;
}

/* ============================================================
   SECTIONS SOMBRES (.section.dark) — texte clair
   ------------------------------------------------------------
   La prod pose `.dark { background: var(--bordeaux-dark) }` mais ne
   dit RIEN de la couleur du texte : il héritait donc de l'encre du
   body (#241722) et se retrouvait presque noir sur bordeaux —
   contraste ~1.6 quand il en faut 4.5. Repéré par Latifa sur
   « Lire le guide complet » (/studio/).
   Les boutons gardent leur propre habillage : on les exclut.
   ============================================================ */
.section.dark {
  color: #f0e6ee;
}

.section.dark h2,
.section.dark h3,
.section.dark h4,
.section.dark .eyebrow,
.section.dark strong {
  color: #ffffff;
}

.section.dark p,
.section.dark li {
  color: #f0e6ee;
}

.section.dark a:not(.button) {
  color: #ffffff;
  text-decoration: underline;
  text-decoration-color: rgba(255, 255, 255, 0.5);
  text-underline-offset: 4px;
  transition: text-decoration-color var(--duree, 280ms) var(--ease);
}

.section.dark a:not(.button):hover,
.section.dark a:not(.button):focus-visible {
  text-decoration-color: #ffffff;
}

/* ============================================================
   UNE PAGE PAR RUBRIQUE
   ------------------------------------------------------------
   Deux ajouts seulement, tout le reste réutilise les classes
   `res-` déjà validées le 28/07 :
     .res-portes        → l'index : 5 portes au lieu de 21 lignes,
                          donc chaque porte peut respirer.
     .res-liste--pleine → la page de rubrique : la même liste, mais
                          sans visuel collé à côté (les articles d'une
                          rubrique partagent une seule image).
     .res-voisines      → le maillage d'une rubrique vers les autres.
   ============================================================ */

/* --- L'index : 5 portes. Moins d'entrées = plus de place. --- */
.res-portes .res-ligne a {
  padding-top: 26px;
  padding-bottom: 26px;
}

.res-portes .res-titre {
  font-size: clamp(28px, 7vw, 34px);
}

/* Le nombre de ressources passe devant le nom : c'est une promesse
   de contenu, pas une étiquette de classement. */
.res-portes .res-meta {
  font-size: 12px;
  letter-spacing: 0.16em;
}

.res-portes .res-resume {
  -webkit-line-clamp: 3;
}

@media (min-width: 1000px) {
  .res-portes .res-ligne a {
    padding-top: 34px;
    padding-bottom: 34px;
  }

  .res-portes .res-titre {
    font-size: clamp(32px, 3.4vw, 44px);
  }
}

/* --- La page de rubrique : la liste occupe toute la largeur. --- */
.res-liste--pleine {
  margin-top: 8px;
}

@media (min-width: 1000px) {
  .res-liste--pleine .res-resume {
    max-width: 72ch;
  }
}

/* --- « Continuer ailleurs » : d'une rubrique aux autres, sans
       repasser par l'index. C'est ce lien horizontal qui tient le
       cocon ensemble ; sans lui chaque rubrique serait un cul-de-sac. --- */
/* ⚠️ Collision de prod, piège n°5 : `styles.css` style TOUS les `nav`
   (flex, puis grille à 3 colonnes en mobile) et TOUS les `nav a`
   (pastille bordeaux pleine, texte centré). Ce bloc est un vrai `<nav>`
   — c'est de la navigation, on garde la balise — donc il faut
   neutraliser l'héritage explicitement, pas l'éviter en changeant la
   balise. Chaque propriété remise ici correspond à une propriété que
   la prod imposait. */
nav.res-voisines {
  display: block;
  gap: 0;
  margin-top: 64px;
  padding-top: 32px;
  border-top: 1px solid var(--line);
}

.res-voisines__titre {
  margin: 0 0 20px;
  color: var(--ink-soft);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.res-voisines__liste {
  display: grid;
  gap: 12px;
}

.res-voisines .res-voisines__liste a {
  display: block;
  min-height: 0;
  padding: 16px 18px;
  border: 1px solid var(--line);
  border-left: 3px solid var(--c);
  border-radius: 3px;
  background: var(--paper);
  color: var(--ink);
  font-size: inherit;
  font-weight: 400;
  text-align: left;
  text-decoration: none;
  transition:
    border-color var(--duree, 280ms) var(--ease),
    transform var(--duree, 280ms) var(--ease);
}

/* Au doigt comme à la souris : l'état actif est le même geste. */
.res-voisines .res-voisines__liste a:hover,
.res-voisines .res-voisines__liste a:focus-visible,
.res-voisines .res-voisines__liste a:active {
  border-color: var(--c);
  background: var(--paper);
  transform: translateX(3px);
}

.res-voisines__nom {
  display: block;
  font-family: var(--serif);
  font-size: 20px;
  font-weight: 600;
  line-height: 1.2;
}

.res-voisines__note {
  display: block;
  margin-top: 4px;
  color: var(--ink-soft);
  font-size: 14.5px;
  line-height: 1.45;
}

@media (min-width: 800px) {
  .res-voisines__liste {
    grid-template-columns: repeat(2, 1fr);
    gap: 14px;
  }
}

/* ============================================================
   MENU DU SITE — DÉMÉNAGÉ (29/07/2026)
   ------------------------------------------------------------
   Les règles du menu vivaient ici ET dans `accueil.css`. Les deux
   copies ont divergé : celle-ci avait perdu la neutralisation des
   styles de prod, et le menu des pages internes sortait en
   pastilles bordeaux sur 3 colonnes.
   Tout est désormais dans `css/site-menu.css`, chargé après ce
   fichier par `base.njk` ET par l'accueil. Ne rien remettre ici.
   ============================================================ */

/* ============================================================
   CONSENTEMENT — discret au téléphone, sans réduire le choix
   ------------------------------------------------------------
   La carte héritée de la production prenait près d'un tiers de l'écran.
   Le texte et les deux décisions restent entiers et équivalents ; seul
   l'encombrement est ramené à une taille compatible avec une lecture au
   pouce. Ces règles sont ici (couche source) car `styles.css` est une
   référence en lecture seule.
   ============================================================ */
@media (max-width: 600px) {
  .cookie-consent {
    right: 12px;
    bottom: 12px;
    gap: 12px;
    width: calc(100vw - 24px);
    max-height: calc(100svh - 24px);
    padding: 14px 16px;
    overflow-y: auto;
  }

  .cookie-consent__copy {
    gap: 4px;
  }

  .cookie-consent__title {
    font-size: 1.1rem;
  }

  .cookie-consent p:not(.cookie-consent__title) {
    font-size: 0.875rem;
    line-height: 1.4;
  }

  .cookie-consent__actions {
    gap: 8px;
  }

  .cookie-consent__actions .button {
    min-height: 44px;
    padding: 9px 10px;
    font-size: 0.9rem;
  }
}

/* Titre de niveau 1 requis pour le parcours après achat : le visuel hero
   porte déjà ce message à l'écran, donc ce libellé est réservé aux lecteurs
   d'écran afin de ne pas le dupliquer visuellement. */
.zellij-visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.welcome-note a {
  color: inherit;
  font-weight: 700;
  text-decoration-thickness: 1.5px;
  text-underline-offset: 3px;
}

/* Carte après achat : l'image porte le merci, la page garde les informations
   utiles (téléchargement, contact, suite). Sa proportion verticale demande un
   cadre distinct de l'ancien visuel panoramique, sinon elle rétrécit trop sur
   desktop ou prend tout l'écran sur téléphone. */
.welcome-hero--card {
  padding: calc(var(--navh) + clamp(18px, 3.5vw, 48px)) clamp(14px, 4vw, 48px) clamp(18px, 3.5vw, 48px);
  background: var(--warm);
}

.welcome-hero--card .welcome-hero__image {
  width: min(84vw, 44rem);
  max-width: 100%;
  aspect-ratio: 1122 / 1402;
  border-radius: 2px;
  box-shadow: 0 22px 54px rgba(48, 32, 26, 0.16);
}

.welcome-opening {
  background: var(--paper);
  padding: clamp(40px, 6vw, 80px) clamp(20px, 5vw, 80px);
  text-align: center;
}

.welcome-opening > div {
  max-width: 42rem;
  margin: 0 auto;
}

.welcome-opening .eyebrow {
  font-size: clamp(1rem, 1.5vw, 1.18rem);
  letter-spacing: 0.18em;
}

.welcome-opening h2 {
  margin: 10px 0 14px;
  font-size: clamp(2rem, 4vw, 3.4rem);
}

.welcome-opening p:last-child {
  margin: 0;
  color: var(--muted);
  font-size: clamp(1rem, 1.6vw, 1.08rem);
  line-height: 1.65;
}

/* La page après achat commence par un visuel très clair : l'en-tête ne doit
   donc ni le traverser ni le brouiller. Il devient un repère opaque dès le
   premier pixel, avec le logo et les liens dans leur version couleur. */
body.post-purchase .site-header {
  background: rgba(252, 250, 246, 0.98);
  backdrop-filter: none;
  box-shadow: 0 1px 0 rgba(36, 23, 34, 0.08);
}

body.post-purchase .site-header .brand .l-color {
  opacity: 1;
}

body.post-purchase .site-header .brand .l-white {
  opacity: 0;
}

body.post-purchase .site-header .site-nav a,
body.post-purchase .site-header .menu-toggle {
  color: var(--ink) !important;
  text-shadow: none;
}

@media (max-width: 767px) {
  .welcome-hero--card .welcome-hero__image {
    width: 100%;
  }
}

/* ============================================================
   RECHERCHE — une porte éditoriale, pas une loupe générique.
   ------------------------------------------------------------
   Le moteur et l'index restent les mêmes. Seul le langage visuel
   rejoint le menu : mot clair, lignes fines, aucun pictogramme
   décoratif ni carte arrondie hors de la DA.
   ============================================================ */
.nav-search-trigger {
  min-height: 34px;
  margin: 0 !important;
  padding: 4px 0 !important;
  border: 0 !important;
  border-bottom: 1px solid currentColor !important;
  border-radius: 0 !important;
  background: transparent !important;
  color: var(--bordeaux-dark) !important;
  cursor: pointer;
  font-family: var(--sans);
  font-size: 0.7rem;
  font-weight: 650;
  letter-spacing: 0.14em;
  line-height: 1;
  text-transform: uppercase;
}

.site-header:not(.defile) .nav-search-trigger {
  color: #f3ecf1 !important;
  text-shadow: 0 1px 14px rgba(24, 13, 22, 0.55);
}

.nav-search-trigger:hover,
.nav-search-trigger:focus-visible {
  background: transparent !important;
  color: var(--olive) !important;
}

.site-header:not(.defile) .nav-search-trigger:hover,
.site-header:not(.defile) .nav-search-trigger:focus-visible {
  color: #fff !important;
}

.search-overlay {
  z-index: 210;
  align-items: flex-start;
  padding: clamp(18px, 12vh, 132px) 16px;
  background: rgba(27, 17, 28, 0.78);
  backdrop-filter: blur(6px);
}

.search-modal {
  max-width: 720px;
  max-height: min(78svh, 720px);
  border-top: 1px solid rgba(243, 236, 241, 0.42);
  border-bottom: 1px solid rgba(243, 236, 241, 0.42);
  border-radius: 0;
  background: #2b1b2e;
  box-shadow: 0 24px 70px rgba(13, 7, 14, 0.34);
}

.search-modal-head {
  justify-content: space-between;
  gap: 20px;
  padding: 18px clamp(20px, 4vw, 38px);
  border-color: rgba(243, 236, 241, 0.2);
}

.search-modal-kicker,
.search-field label {
  margin: 0;
  color: #dfd2dc;
  font-family: var(--sans);
  font-size: 0.7rem;
  font-weight: 650;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.search-close,
.search-clear {
  min-height: 32px;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: #f3ecf1;
  cursor: pointer;
  font-family: var(--sans);
  font-size: 0.7rem;
  font-weight: 650;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.search-close {
  padding: 4px 0;
  border-bottom: 1px solid currentColor;
}

.search-clear {
  padding: 4px 0 4px 12px;
  color: #dfd2dc;
}

.search-close:hover,
.search-close:focus-visible,
.search-clear:hover,
.search-clear:focus-visible {
  background: transparent;
  color: #fff;
}

.search-field {
  padding: clamp(24px, 5vw, 42px) clamp(20px, 4vw, 38px) 10px;
}

.search-field-control {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 12px;
  border-bottom: 1px solid rgba(243, 236, 241, 0.54);
}

.search-modal .search-input {
  min-width: 0;
  padding: 10px 0 14px;
  border: 0;
  border-radius: 0;
  color: #fff;
  background: transparent;
  font-family: var(--serif);
  font-size: clamp(1.35rem, 3vw, 2.1rem);
  line-height: 1.1;
}

.search-modal .search-input::placeholder {
  color: rgba(243, 236, 241, 0.6);
}

.search-modal .search-input:focus {
  outline: none;
}

.search-field-control:focus-within {
  border-color: #fff;
}

.search-hint {
  margin: 12px 0 0;
  color: rgba(223, 210, 220, 0.78);
  font-size: 0.85rem;
  line-height: 1.5;
}

.search-modal .search-results {
  padding: 16px clamp(20px, 4vw, 38px) clamp(24px, 5vw, 42px);
}

.search-modal .search-results-list {
  gap: 0;
  border-top: 1px solid rgba(243, 236, 241, 0.2);
}

.search-modal .search-results-list li {
  border-bottom: 1px solid rgba(243, 236, 241, 0.2);
}

.search-modal .search-results-list a {
  padding: 16px 0;
  border-radius: 0;
  color: #f3ecf1;
}

.search-modal .search-results-list a:hover,
.search-modal .search-results-list a:focus-visible {
  padding-left: 10px;
  background: transparent;
}

.search-modal .search-result-type,
.search-modal .search-result-excerpt,
.search-modal .search-empty,
.search-modal .search-status,
.search-modal .search-error {
  color: rgba(223, 210, 220, 0.84);
}

.search-modal .search-results-list strong {
  color: #fff;
}

.search-status,
.search-error {
  margin: 0;
  padding: 8px 0;
  font-size: 0.95rem;
  line-height: 1.6;
}

.search-error {
  display: grid;
  gap: 14px;
}

.search-retry {
  width: fit-content;
  min-height: 32px;
  padding: 0;
  border: 0;
  border-bottom: 1px solid currentColor;
  background: transparent;
  color: #fff;
  cursor: pointer;
  font-family: var(--sans);
  font-size: 0.72rem;
  font-weight: 650;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.search-retry:hover,
.search-retry:focus-visible {
  color: var(--olive-soft);
}

.search-inline .search-input {
  padding: 14px 0;
  border: 0;
  border-bottom: 1px solid var(--ink);
  border-radius: 0;
  background: transparent;
  color: var(--ink);
  font-family: var(--serif);
  font-size: clamp(1.25rem, 3vw, 1.8rem);
}

.search-inline .search-input:focus {
  outline: 2px solid var(--olive);
  outline-offset: 5px;
}

@media (max-width: 560px) {
  .site-header .header-actions {
    gap: 10px;
  }

  .nav-search-trigger {
    font-size: 0.68rem;
    letter-spacing: 0.1em;
  }

  .search-overlay {
    padding: 12px;
  }

  .search-modal {
    max-height: calc(100svh - 24px);
  }

  .search-modal-head,
  .search-field {
    padding-right: 18px;
    padding-left: 18px;
  }

  .search-modal .search-results {
    padding-right: 18px;
    padding-left: 18px;
  }
}

/* ------------------------------------------------------------------
   TITRES SUR FOND SOMBRE — corrige le 29/07
   Latifa : « c'est pas les bonnes couleurs, c'est trop sombre, on
   comprend rien ». Elle regardait /studio/ : des titres bordeaux sur
   un fond prune.

   Cause : `styles.css` (le CSS historique de la prod) fixe
   `h2 { color: var(--bordeaux-dark) }` et `h3 { color: var(--bordeaux) }`
   au niveau de la BALISE. Une section sombre a beau declarer
   `color: var(--paper)`, cette couleur ne descend jamais aux titres :
   l'heritage ne s'applique que faute de regle ciblant l'element.

   Le probleme est donc systemique, pas propre a une page : toute
   section sombre, presente ou future, l'aurait. On le corrige ici,
   une fois, pour tout le site.
   ------------------------------------------------------------------ */
.studio-possibilities h2,
.studio-possibilities h3,
.chapter-dark h2,
.chapter-dark h3,
.dark-coupon h2,
.dark-coupon h3,
[data-navdark] h2,
[data-navdark] h3 {
  color: var(--paper);
}

/* ------------------------------------------------------------------
   GRAISSE DES TITRES — corrige le 29/07
   Latifa : « les lettres sont encore trop fines, tu devrais epaissir
   la ou cette police d'ecriture est dans tout le site ».

   Le Bodoni Moda est une Didone : ses deliés sont extremement fins par
   construction. A la graisse 500 de `styles.css`, ces deliés
   disparaissent a l'ecran — le titre parait delave, et sur un
   telephone en pleine lumiere il devient penible a lire.

   500 -> 600 sur les titres, et les sur-titres passent de 600 a 700 :
   ils sont petits et tres espaces, c'est la ou le manque de matiere se
   voit le plus. On ne touche pas a la taille, seulement a l'epaisseur.

   30/07 — 600 ne suffisait pas, et pour une raison qu'on ne voyait pas :
   `fonts.css` declarait `font-weight:400 600`, ce qui **clampait** l'axe
   variable. On croyait etre au plafond de la police alors qu'on etait au
   plafond de la declaration. Corrige (`400 900`), donc 700 ici.
   ⚠️ Ce bloc arrive APRES la section 3 dans le fichier et vise les balises
   nues : a specificite egale, c'est lui qui gagne. Toute graisse de titre
   se change donc ICI, pas en section 3 — sinon la modification n'a
   aucun effet et on cherche pendant une heure.
   ------------------------------------------------------------------ */
h1, h2, h3,
.freebie-title,
.section-heading h2 {
  font-weight: 700;
}

/* Le guide gratuit suit le même ordre de lecture que le Kit Fondatrice :
   titre, couverture réelle, explication et action. La couverture n'est plus
   une affiche isolée au-dessus du formulaire. */
.freebie-panel {
  display: block;
  max-width: 760px;
}

.freebie-product {
  display: grid;
  grid-template-columns: minmax(210px, 280px) minmax(0, 1fr);
  gap: clamp(28px, 4vw, 56px);
  align-items: start;
  margin-top: 30px;
}

.freebie-cover {
  width: auto;
  margin: 0;
  border-radius: 16px;
  overflow: hidden;
  box-shadow: 0 38px 64px -42px rgba(36, 23, 34, 0.6);
}

.freebie-cover img {
  display: block;
  width: 100%;
  height: auto;
  margin: 0;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}

.freebie-details > p:first-child {
  margin-top: 0;
}

@media (max-width: 679px) {
  .freebie-product {
    grid-template-columns: 1fr;
    gap: 26px;
  }

  .freebie-cover {
    width: min(100%, 285px);
    margin-inline: auto;
  }
}

.eyebrow,
.tag {
  font-weight: 700;
}

/* ------------------------------------------------------------
   LE TITRE DU GUIDE GRATUIT — famille remise dans le systeme
   ------------------------------------------------------------
   `styles.css` fixe `.freebie-title` en « Cormorant Garamond », une police
   qui n'est PAS auto-hebergee : elle n'a jamais ete servie, le titre tombait
   donc en Georgia depuis toujours. Releve le 30/07 en listant les familles
   reellement calculees page par page.
   C'est le SEUL endroit du site public ou `styles.css` code une police en dur.
   Les autres (7 fois Bodoni Moda, 6 fois DM Sans, 4 autres Cormorant) visent
   toutes `.content-studio-*` / `.studio-*` — l'outil interne, pas le site.
   ------------------------------------------------------------ */
.freebie-title,
.freebie-popup-card .freebie-title,
.freebie-copy .freebie-title {
  font-family: var(--serif);
  font-weight: 700;
}

/* ------------------------------------------------------------
   LES MONTANTS EN INSTRUMENT SANS — decide par Latifa le 30/07
   ------------------------------------------------------------
   Le « € » du Bodoni a grande taille est un trait fin a cote de
   chiffres pleins : illisible. Ce n'est pas la graisse (deja a 700,
   axe libere depuis 16164d6), c'est le dessin du glyphe dans une
   Didone. Elle a tranche : tout le montant passe au sans.
   Meme specificite que la regle de styles.css (1 classe + 1 balise),
   et zellij-ui.css charge APRES : c'est celle-ci qui gagne.
   ------------------------------------------------------------ */
.price-panel strong {
  font-family: var(--sans);
  font-weight: 700;
  font-size: 2.5rem;
  letter-spacing: -0.02em;
}

/* Offre du Kit : le prix réduit et son code forment une seule décision d'achat.
   Le prix de référence reste visible, sans concurrencer les 19 € ni repousser
   le bouton à la fin de la page. */
.price-panel--offer {
  max-width: 28rem;
}

.price-offer-label {
  color: var(--bordeaux);
  font-size: 0.78rem;
  font-weight: 800;
  letter-spacing: 0.11em;
  text-transform: uppercase;
}

.price-comparison {
  display: flex;
  align-items: baseline;
  gap: 12px;
  margin-top: 4px;
}

.price-comparison del {
  color: var(--ink-soft);
  font-family: var(--sans);
  font-size: 1.2rem;
  font-weight: 700;
  text-decoration-thickness: 2px;
}

.price-panel--offer .price-comparison strong {
  color: var(--bordeaux);
  font-size: clamp(2.7rem, 6vw, 3.5rem);
  line-height: 1;
}

.price-panel--offer .price-benefit {
  margin: 8px 0 0;
  color: var(--ink);
  font-size: 0.96rem;
  font-weight: 600;
}

.price-panel--offer .coupon-box {
  border-color: rgba(123, 44, 63, 0.28);
  background: rgba(123, 44, 63, 0.045);
}

.price-cta {
  width: 100%;
  margin-top: 18px;
  justify-content: center;
}

.price-cta span {
  color: var(--paper);
  font-weight: 800;
}

.price-reassurance {
  margin: 10px 0 0;
  color: var(--ink-soft);
  font-size: 0.8rem;
  text-align: center;
}

/* La page Les Kits se lit comme une collection de carnets : chaque moment
   affiche le kit et sa première ressource gratuite au même endroit. */
.kits-library {
  position: relative;
  overflow: hidden;
  background:
    radial-gradient(circle at 8% 10%, rgba(91, 97, 53, 0.26), transparent 28rem),
    radial-gradient(circle at 94% 90%, rgba(91, 97, 53, 0.16), transparent 26rem),
    linear-gradient(135deg, #e8e9df 0%, #f7f7f2 52%, #e0e2d3 100%);
}

.kits-library-grid {
  display: grid;
  align-items: start;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(18px, 3vw, 34px);
  max-width: 1180px;
  margin: 0 auto;
}

.kit-shelf {
  position: relative;
  display: grid;
  grid-template-columns: minmax(142px, 0.58fr) minmax(0, 1fr);
  gap: clamp(22px, 3vw, 40px);
  min-height: 0;
  padding: clamp(18px, 2.8vw, 30px);
  border: 1px solid rgba(91, 97, 53, 0.28);
  border-radius: 2px 2px 28px 2px;
  background: rgba(255, 255, 252, 0.86);
  box-shadow: 0 22px 46px rgba(59, 64, 35, 0.12);
}

.kit-shelf--administratif {
  border-radius: 2px 2px 2px 28px;
  background: linear-gradient(145deg, rgba(236, 238, 224, 0.96), rgba(252, 252, 247, 0.9));
}

.kit-shelf__visual {
  align-self: start;
  margin: 0;
  overflow: hidden;
  border: 1px solid rgba(91, 97, 53, 0.18);
  box-shadow: 0 20px 36px rgba(59, 64, 35, 0.17);
}

.kit-shelf__visual img {
  display: block;
  width: 100%;
  height: auto;
}

.kit-shelf__content {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.kit-shelf__number {
  margin: 2px 0 24px;
  color: rgba(91, 97, 53, 0.22);
  font-family: var(--serif);
  font-size: clamp(4.5rem, 10vw, 7rem);
  font-variant-numeric: lining-nums;
  line-height: 0.7;
}

.kit-shelf__eyebrow {
  margin: 0 0 10px;
  color: var(--olive);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.kit-shelf h3 {
  margin: 0;
  color: var(--olive-dark);
  font-size: clamp(2rem, 3.5vw, 3rem);
}

.kit-shelf__lede {
  margin: 16px 0 26px;
  font-size: 1.04rem;
}

.kit-shelf__details {
  display: grid;
  gap: 12px;
  margin: 0;
}

.kit-shelf__details div {
  display: grid;
  grid-template-columns: minmax(108px, 0.45fr) 1fr;
  gap: 16px;
  padding-top: 12px;
  border-top: 1px solid rgba(91, 97, 53, 0.18);
}

.kit-shelf__details dt {
  color: var(--ink-soft);
  font-size: 0.78rem;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.kit-shelf__details dd {
  margin: 0;
  font-size: 0.94rem;
}

.kit-shelf__actions {
  display: grid;
  gap: 14px;
  align-items: start;
  margin-top: auto;
  padding-top: 34px;
}

.kit-shelf__actions .button {
  justify-self: start;
}

.kit-shelf__freebie {
  display: grid;
  grid-template-columns: minmax(84px, 0.44fr) minmax(0, 1fr);
  gap: 12px;
  align-items: center;
  padding: 17px 18px;
  border: 1px solid rgba(91, 97, 53, 0.52);
  background: #dde1c9;
  color: var(--olive-dark);
  text-decoration: none;
  transition: transform var(--duree, 280ms) var(--ease), background var(--duree, 280ms) var(--ease);
}

.kit-shelf__freebie-cover {
  display: block;
  width: 100%;
  max-width: 132px;
  height: auto;
  justify-self: center;
  border: 1px solid rgba(91, 97, 53, 0.25);
  box-shadow: 0 9px 18px rgba(59, 64, 35, 0.16);
}

.kit-shelf__freebie-copy {
  display: grid;
  gap: 4px;
}

.kit-shelf__freebie:hover,
.kit-shelf__freebie:focus-visible {
  background: #cdd2ae;
  transform: translateY(-2px);
}

.kit-shelf__freebie-label {
  font-size: 0.7rem;
  font-weight: 800;
  letter-spacing: 0.15em;
  text-transform: uppercase;
}

.kit-shelf__freebie strong {
  font-family: var(--serif);
  font-size: clamp(1.25rem, 2vw, 1.6rem);
  line-height: 1.1;
}

.kit-shelf__freebie-copy > span:last-child {
  font-size: 0.86rem;
  line-height: 1.45;
}

@media (max-width: 760px) {
  .kits-library-grid {
    grid-template-columns: 1fr;
  }

  .kit-shelf {
    grid-template-columns: minmax(108px, 0.42fr) minmax(0, 1fr);
    gap: 18px;
    padding: 18px;
  }

  .kit-shelf__number {
    margin-bottom: 18px;
  }

  .kit-shelf__freebie {
    grid-template-columns: minmax(72px, 0.38fr) minmax(0, 1fr);
    gap: 10px;
    padding: 14px;
  }
}

@media (max-width: 470px) {
  .kit-shelf {
    grid-template-columns: 1fr;
  }

  .kit-shelf__visual {
    width: min(52%, 178px);
  }

  .kit-shelf__freebie {
    grid-template-columns: 86px minmax(0, 1fr);
  }
}

/* ============================================================
   AIDE AU CHOIX — /kits/  (11/08/2026)
   ------------------------------------------------------------
   La page annonçait « choisis le carnet » puis n'offrait aucun
   critère : la cliente devait deviner. Deux cas, une question
   chacun, formulés de son point de vue et pas du catalogue.
   Volontairement sobre : ce bloc arbitre, il ne vend pas — s'il
   ressemblait aux cartes produit, il entrerait en concurrence
   avec elles au lieu de les départager.
   ============================================================ */
.bifurcation-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(18px, 3vw, 34px);
  max-width: 1180px;
  margin: 0 auto;
}
.bifurcation-cas {
  padding: clamp(22px, 3vw, 32px);
  border: 1px solid rgba(36, 23, 34, 0.14);
  border-radius: 16px;
  background: #fff;
}
.bifurcation-cas__question {
  font-family: var(--font-titre, "Newsreader", Georgia, serif);
  font-size: clamp(18px, 2.1vw, 22px);
  line-height: 1.32;
  margin: 0 0 14px;
}
.bifurcation-cas__reponse {
  margin: 0;
  font-size: 15px;
  line-height: 1.6;
  color: var(--ink-soft, #5b4b55);
}
.bifurcation-cas__reponse a {
  font-weight: 600;
  color: var(--bordeaux, #7b2c3f);
  text-decoration: underline;
  text-underline-offset: 3px;
}
/* Mobile : une colonne. Deux cas côte à côte sur 375 px obligeraient
   à comparer deux colonnes de 150 px — on lit l'un, puis l'autre. */
@media (max-width: 767px) {
  .bifurcation-grid { grid-template-columns: 1fr; }
}

/* ============================================================
   APERÇU DE L'INTÉRIEUR D'UN KIT — 11/08/2026
   ------------------------------------------------------------
   La page du Kit Administratif décrivait 50 pages sans en montrer
   une seule. Ce bloc affiche de VRAIES pages du fichier vendu.

   Mobile d'abord, et au doigt : les pages défilent horizontalement
   avec un point d'accroche par page, plutôt que d'empiler trois
   images hautes qu'il faudrait dépasser au scroll. Sur grand écran,
   les trois tiennent côte à côte et le défilement disparaît.
   ============================================================ */
.kit-apercu { margin: clamp(24px, 4vw, 40px) 0 0; }

/* ⚠️ Le rail de défilement et la légende sont DEUX boîtes distinctes.
   Quand la légende vivait dans la grille en `grid-auto-flow: column`, son
   `grid-column: 1 / -1` visait des colonnes explicites qui n'existent pas :
   elle se plaçait à côté des pages et les écrasait contre le bord droit. */
.kit-apercu-rail {
  display: grid;
  grid-auto-flow: column;
  /* 78 % : la page tient presque tout l'écran — en dessous, le sommaire
     n'est plus lisible du tout — et la suivante dépasse assez pour qu'on
     comprenne qu'il y en a d'autres. Mesuré : à 210 px on ne lisait rien. */
  grid-auto-columns: 78%;
  gap: clamp(12px, 3vw, 22px);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
  padding-bottom: 14px;
  /* la barre de défilement reste discrète mais visible : elle dit
     qu'il y a autre chose à droite */
  scrollbar-width: thin;
}
.kit-apercu-rail a {
  display: block;
  scroll-snap-align: center;
  border-radius: 10px;
  overflow: hidden;
  transition: transform .35s cubic-bezier(.22,1,.36,1);
}
.kit-apercu-rail a:hover { transform: translateY(-3px); }
.kit-apercu-rail img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: 10px;
  border: 1px solid rgba(36, 23, 34, 0.10);
  /* une page de papier posée sur la page du site */
  box-shadow: 0 18px 34px -26px rgba(36, 23, 34, 0.55);
  background: #fff;
}
.kit-apercu figcaption {
  font-size: 13px;
  line-height: 1.55;
  color: var(--ink-soft, #5b4b55);
  padding-top: 4px;
  max-width: 62ch;
}

@media (min-width: 900px) {
  .kit-apercu-rail {
    grid-auto-flow: initial;
    grid-template-columns: repeat(3, 1fr);
    overflow-x: visible;
    scroll-snap-type: none;
    padding-bottom: 0;
  }
}

@media (prefers-reduced-motion: reduce) {
  .kit-apercu-rail a { transition: none; }
}

/* ============================================================
   LES FICHES PRODUIT — habillage du gabarit unique · 11/08/2026
   ------------------------------------------------------------
   Un seul jeu de règles pour les deux kits, comme il n'y a qu'un
   seul gabarit. Si une fiche a besoin d'une exception, c'est le
   gabarit qu'il faut discuter, pas ajouter une règle ici.
   ============================================================ */

/* Le prix sous le bouton : il dit CE QU'IL EST — un prix de lancement.
   Jamais de prix barré : voir la note dans `fiche.njk`. */
.fiche-prix-note {
  margin: 14px 0 0;
  font-size: 13.5px;
  letter-spacing: .01em;
  opacity: .82;
}

/* Les parties du kit : une liste numérotée qui se lit comme un sommaire,
   parce que c'en est un. Le numéro est décoratif, le titre porte le sens. */
.fiche-parties {
  list-style: none;
  margin: 0;
  padding: 0;
  counter-reset: partie;
}
.fiche-parties li {
  counter-increment: partie;
  display: grid;
  grid-template-columns: 2.1rem 1fr;
  gap: 4px 12px;
  padding: 14px 0;
  border-bottom: 1px solid rgba(36, 23, 34, 0.10);
}
.fiche-parties li::before {
  content: counter(partie, upper-roman);
  grid-row: 1 / span 2;
  font-family: var(--serif, "Newsreader", Georgia, serif);
  font-size: 15px;
  color: var(--accent, #7b2c3f);
  opacity: .75;
  padding-top: 2px;
}
.fiche-parties li b {
  font-family: var(--serif, "Newsreader", Georgia, serif);
  font-weight: 500;
  font-size: 18px;
}
.fiche-parties li span { font-size: 14.5px; opacity: .78; line-height: 1.55; }

/* La marche à suivre : trois gestes, pas un mode d'emploi. */
.fiche-etapes {
  list-style: none;
  margin: 0;
  padding: 0;
  counter-reset: etape;
  display: grid;
  gap: 12px;
}
.fiche-etapes li {
  counter-increment: etape;
  position: relative;
  padding-left: 42px;
  font-size: 15.5px;
  line-height: 1.6;
}
.fiche-etapes li::before {
  content: counter(etape);
  position: absolute;
  left: 0;
  top: -1px;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-size: 13px;
  font-weight: 600;
  color: #fff;
  background: var(--accent, #7b2c3f);
}

/* Les questions : `<details>` natif. Aucun script, ça marche au doigt,
   au clavier et au lecteur d'écran sans qu'on ait rien à écrire. */
.fiche-question {
  border-bottom: 1px solid rgba(36, 23, 34, 0.10);
  padding: 4px 0;
}
.fiche-question summary {
  cursor: pointer;
  list-style: none;
  padding: 15px 34px 15px 0;
  position: relative;
  font-family: var(--serif, "Newsreader", Georgia, serif);
  font-size: 17.5px;
  line-height: 1.35;
}
.fiche-question summary::-webkit-details-marker { display: none; }
.fiche-question summary::after {
  content: "+";
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 20px;
  color: var(--accent, #7b2c3f);
  transition: transform .3s ease;
}
.fiche-question[open] summary::after { content: "–"; }
.fiche-question p { margin: 0 0 16px; font-size: 15px; line-height: 1.65; opacity: .85; }

/* Pour aller plus loin : des liens, et ce qu'on y trouve. C'est ce bloc
   qui remplace les paragraphes qui réexpliquaient d'autres pages. */
.fiche-liens { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
.fiche-liens li {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 12px;
  padding: 13px 0;
  border-bottom: 1px solid rgba(36, 23, 34, 0.10);
}
.fiche-liens a {
  font-family: var(--serif, "Newsreader", Georgia, serif);
  font-size: 18px;
  color: var(--accent, #7b2c3f);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color .3s;
}
.fiche-liens a:hover { border-bottom-color: currentColor; }
.fiche-liens span { font-size: 14px; opacity: .72; }

/* Le rappel d'achat : dernier bloc, toujours. Une fiche produit ne se
   termine jamais par un lien qui fait sortir. */
.fiche-fin { text-align: center; }
.fiche-fin .section-inner { display: grid; justify-items: center; gap: 14px; }
.fiche-fin-prix {
  font-family: var(--serif, "Newsreader", Georgia, serif);
  font-size: clamp(34px, 6vw, 46px);
  line-height: 1;
  margin: 0;
  color: var(--accent, #7b2c3f);
}
.fiche-fin-prix span {
  display: block;
  font-family: var(--sans, "Instrument Sans", system-ui, sans-serif);
  font-size: 13.5px;
  color: var(--ink-soft, #5b4b55);
  margin-top: 10px;
  letter-spacing: .01em;
}
.fiche-rassurance { font-size: 13px; opacity: .7; max-width: 46ch; margin: 0; }

/* Avis : collecte privée et modérée. Aucun score agrégé n'est affiché tant
   qu'aucun avis réel n'a été relu. */
.fiche-avis-inner { max-width: 720px; }
.fiche-avis-form { margin-top: 24px; display: grid; gap: 18px; }
.fiche-avis-fields { display: grid; gap: 16px; }
.fiche-avis-form p { margin: 0; }
.fiche-avis-form label, .fiche-avis-rating legend { display: block; margin-bottom: 7px; font-size: 14px; font-weight: 600; color: var(--ink, #241720); }
.fiche-avis-form input:not([type="radio"]), .fiche-avis-form textarea { box-sizing: border-box; display: block; width: 100%; border: 1px solid rgba(36, 23, 34, .22); border-radius: 4px; background: rgba(255,255,255,.72); color: var(--ink, #241720); font: inherit; line-height: 1.5; padding: 11px 12px; }
.fiche-avis-form textarea { resize: vertical; min-height: 9rem; }
.fiche-avis-form input:focus, .fiche-avis-form textarea:focus { outline: 3px solid color-mix(in srgb, var(--accent, #7b2c3f) 32%, transparent); outline-offset: 2px; border-color: var(--accent, #7b2c3f); }
.fiche-avis-rating { margin: 0; padding: 0; border: 0; }
.fiche-avis-rating > div { display: inline-flex; flex-direction: row-reverse; gap: 4px; }
.fiche-avis-rating input { position: absolute; inline-size: 1px; block-size: 1px; opacity: 0; }
.fiche-avis-rating label { margin: 0; color: #b5aa9c; cursor: pointer; font-size: 27px; line-height: 1; }
.fiche-avis-rating label:hover, .fiche-avis-rating label:hover ~ label, .fiche-avis-rating input:checked ~ label { color: var(--gold, #a18a58); }
.fiche-avis-rating input:focus-visible + label { outline: 2px solid var(--accent, #7b2c3f); outline-offset: 3px; }
.fiche-avis-confidentialite, .fiche-avis-message { color: var(--ink-soft, #5b4b55); font-size: 13px; line-height: 1.55; }
.fiche-avis-message { min-height: 1.55em; }
.fiche-avis-piege { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

@media (min-width: 680px) { .fiche-avis-fields { grid-template-columns: 1fr 1fr; } }

@media (max-width: 679px) {
  .fiche-parties li { grid-template-columns: 1.7rem 1fr; }
  .fiche-fin .section-inner { justify-items: stretch; }
  .fiche-fin .button { width: 100%; justify-content: center; }
}

/* ============================================================
   LES RESSOURCES GRATUITES — 11/08/2026
   ------------------------------------------------------------
   Deux ressources sur une page, chacune avec sa couverture, son
   formulaire et ses aperçus. Mobile d'abord : la couverture passe
   au-dessus du formulaire, elle n'entre pas en concurrence avec lui.
   ============================================================ */
.gratuit-corps {
  display: grid;
  gap: clamp(20px, 4vw, 40px);
  align-items: start;
}
.gratuit-visuel { margin: 0; }
.gratuit-visuel img {
  display: block;
  width: 100%;
  max-width: 320px;
  height: auto;
  margin-inline: auto;
  border-radius: 10px;
  border: 1px solid rgba(36, 23, 34, 0.10);
  box-shadow: 0 18px 34px -26px rgba(36, 23, 34, 0.55);
  background: #fff;
}
.gratuit-texte > p:first-child {
  font-family: var(--serif, "Newsreader", Georgia, serif);
  font-size: clamp(18px, 2.4vw, 21px);
  line-height: 1.45;
  margin-top: 0;
}
/* Le renvoi vers le kit que la ressource prolonge : discret, mais présent.
   C'est lui qui referme le maillage — chaque fiche kit renvoie ici en retour. */
.gratuit-suite {
  margin: clamp(20px, 3vw, 30px) 0 0;
  padding-top: 18px;
  border-top: 1px solid rgba(36, 23, 34, 0.12);
  font-size: 14.5px;
  color: var(--ink-soft, #5b4b55);
}
.gratuit-suite a { color: var(--accent, #7b2c3f); font-weight: 600; }

@media (min-width: 860px) {
  /* La couverture tient sa colonne, le formulaire prend le reste. */
  .gratuit-corps { grid-template-columns: minmax(200px, 300px) 1fr; }
  .gratuit-visuel img { max-width: none; }
}

/* ---------- 12/08 (23h) — Badge de confiance fiches kits ------
   J+1 de la feuille de route audit : le badge « Paiement sécurisé
   via Payhip » devient VISUEL (cadenas + pastille), pas une ligne
   de texte noyée. Posé sous le CTA du hero des fiches produit. */
.badge-confiance {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  margin: 16px 0 0;
  padding: 9px 16px;
  border: 1px solid color-mix(in srgb, var(--accent, #a18a58) 42%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--accent, #a18a58) 8%, transparent);
  color: var(--plum, #371f31);
  font-size: 13.5px;
  line-height: 1.35;
}
.badge-confiance svg {
  flex: none;
  color: var(--accent, #a18a58);
}
.badge-confiance b {
  font-weight: 600;
}


/* ------------------------------------------------------------
   08/10/2026 — LIEN DE LANGUE (FR / EN)
   Il n'avait aucun style : il héritait de l'encre sombre de l'en-tête, donc 1,02:1
   (invisible) sur l'en-tête transparent au-dessus d'une photo. Il suit maintenant
   les deux états de l'en-tête, comme le bouton « Chercher » voisin.
   ------------------------------------------------------------ */
.lang-switch {
  display: inline-flex;
  align-items: center;
  min-height: 34px;
  padding: 4px 6px;
  color: var(--bordeaux-dark);
  font-family: var(--sans);
  font-size: 0.72rem;
  font-weight: 650;
  letter-spacing: 0.14em;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.35em;
  text-transform: uppercase;
}

.site-header:not(.defile) .lang-switch {
  color: #f3ecf1;
  text-shadow: 0 1px 14px rgba(24, 13, 22, 0.55);
}

.lang-switch:hover,
.lang-switch:focus-visible {
  color: var(--olive);
}

.site-header:not(.defile) .lang-switch:hover,
.site-header:not(.defile) .lang-switch:focus-visible {
  color: #fff;
}

/* listes de liens des fiches (« Pour aller plus loin ») : au doigt, chaque ligne fait au moins 44 px de haut */
@media (max-width: 860px), (pointer: coarse) {
  .fiche-liens a { display: inline-block; padding-block: 8px; }
}
