/* Outfit et Inter sont chargés via <link rel="stylesheet"> dans le <head> des
   pages HTML. Un @import ici bloquerait le rendu (chaîne CSS → CSS → police). */

/* =============================================================================
   DASHYZ — Feuille de style unique
   Direction artistique « GLACIER ÉMERAUDE »

   L'univers vient d'une seule image : une carrosserie vert émeraude métallisé
   posée sur un lac gelé, sous un ciel de nuit. Trois matières en sortent, et
   tout le site ne joue que de celles-là :

     · l'ÉMERAUDE     — la peinture. Lumière, accent, aurore. Jamais du texte
                        courant : c'est la couleur qui désigne.
     · le GRAPHITE    — la nuit et l'asphalte. Toutes les surfaces.
     · la GLACE       — le lac. Le texte, les bordures, les fractures, le chrome.

   Une quatrième, l'AMBRE du phare, n'apparaît que deux fois sur toute la page :
   le halo du héros et le marqueur « à compléter ». Une couleur chaude qui sert
   partout ne sert plus à rien.

   Site vitrine — HTML/CSS/JS purs, aucune dépendance hors Google Fonts.

   SOMMAIRE
   1.  Tokens (:root)
   2.  Reset moderne
   3.  Typographie de base
   4.  Primitives (container, section, kicker, grid, card, btn, badge, icon,
       reveal, sr-only, skip-link, placeholder)
   5.  Décors — aurore, grain, arêtes chromées
   6.  En-tête (bandeau d'annonce, header en pastille de verre, nav, burger)
   7.  Héros (vidéo de fond, scrim, socle de chiffres)
   8.  Bande de confiance (marquee)
   9.  Défis → Solutions
   10. Offres + tableau comparatif
   11. Secteurs
   12. Bande de chiffres clés
   13. Systèmes
   14. Méthodologie (onglets + timeline)
   15. Témoignages
   16. Garanties
   17. Ressources
   18. CTA final
   19. Footer + bouton WhatsApp flottant
   20. Formulaire de contact
   21. Utilitaires
   22. Responsive — mobile first : 480 / 768 / 1024 / 1280
   23. Mouvement réduit, contraste forcé et impression
   ============================================================================= */


/* =============================================================================
   1. TOKENS
   ============================================================================= */

:root {

  /* --- SURFACES ------------------------------------------------------------
     Cinq profondeurs de nuit. L'écart entre deux niveaux voisins est faible
     par choix : sur un fond sombre, c'est la bordure claire qui découpe les
     plans, pas l'écart de fond. Empiler des gris trop contrastés fabrique
     des « boîtes », pas de la profondeur. */
  --void:      #050908;   /* le plus profond — pied de page, socles */
  --graphite:  #0B1210;   /* fond de page */
  --night:     #0E1714;   /* sections alternées */
  --slate:     #131F1A;   /* cartes */
  --slate-2:   #18271F;   /* cartes survolées, champs de formulaire */
  --ridge:     #22332B;   /* bordures pleines */

  /* --- ÉMERAUDE — la carrosserie ------------------------------------------
     Les quatre teintes de marque (700/500/300/200) sont conservées à
     l'identique : c'est l'identité Dashyz, reprise de l'application. Les
     autres sont des extensions calculées pour le fond sombre. */
  --em-950:  #0A1F16;
  --em-900:  #16342A;   /* marque */
  --em-800:  #1B4433;
  --em-700:  #1F6E4F;   /* marque — accent */
  --em-600:  #2C8360;
  --em-500:  #2F8D66;   /* marque */
  --em-400:  #46B085;
  --em-300:  #62B594;   /* marque */
  --em-200:  #A7D8C1;   /* marque */
  --em-100:  #D7EDE3;

  /* --- GLACE --------------------------------------------------------------- */
  --ice-050: #F2F7F5;
  --ice-100: #E8F0ED;
  --ice-200: #C9D8D3;
  --ice-300: #A3B8B2;

  /* --- CHROME et PHARE ------------------------------------------------------ */
  --chrome-hi: rgba(255, 255, 255, .10);   /* arête supérieure des surfaces */
  --amber:     #E9B57C;
  --amber-lt:  #F3D6B4;

  /* --- TEXTE ---------------------------------------------------------------
     Quatre niveaux, et un seul rôle chacun. Aucun ne descend sous 4,5:1 sur
     --graphite, sauf --fg-4 qui n'habille jamais du texte. */
  --fg:    #E8F0ED;                       /* 15,9:1 — titres et corps */
  --fg-2:  rgba(232, 240, 237, .72);      /*  8,0:1 — corps secondaire */
  --fg-3:  rgba(232, 240, 237, .56);      /*  5,4:1 — méta, légendes */
  --fg-4:  rgba(232, 240, 237, .30);      /*  décor seul : filets, séparateurs */

  /* Texte sur fond clair (tuiles de logos, boutons ivoire) */
  --fg-inv: #08110E;

  /* --- VERRE ---------------------------------------------------------------
     Le vocabulaire du modèle : surfaces translucides, arête claire au-dessus,
     flou d'arrière-plan. C'est ce qui fait tenir une carte sur une image. */
  --glass:     rgba(255, 255, 255, .040);
  --glass-2:   rgba(255, 255, 255, .065);
  --glass-bd:  rgba(255, 255, 255, .085);
  --glass-bd-2:rgba(255, 255, 255, .150);
  --blur:      18px;

  /* --- ACCENTS DÉRIVÉS ------------------------------------------------------ */
  --em-soft:   rgba(47, 141, 102, .12);
  --em-soft-2: rgba(47, 141, 102, .22);
  --em-line:   rgba(98, 181, 148, .30);
  --focus:     #A7D8C1;

  /* Marqueur de contenu à compléter — l'ambre du phare, second et dernier
     emploi. Impossible à manquer sans casser la page. (Les alphas sont écrits
     en dur : `rgba()` n'accepte pas de variable dans ses canaux.) */
  --ph-bg: rgba(233, 181, 124, .13);
  --ph-bd: rgba(233, 181, 124, .55);
  --ph-fg: var(--amber-lt);

  /* WhatsApp (couleur de marque tierce, non négociable) */
  --wa:   #25D366;
  --wa-h: #1EBE5A;

  /* --- TYPOGRAPHIE ---------------------------------------------------------
     Outfit pour l'affichage : géométrique, large, resserrable très fort sans
     se fermer — la lecture « ingénierie » que l'image appelle.
     Inter pour tout le reste. */
  --ff:         'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  --ff-display: 'Outfit', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

  --fs-display: clamp(2.5rem, 5.6vw, 4.75rem);    /* h1 du héros seulement */
  --fs-h1:      clamp(2.15rem, 4.4vw, 3.5rem);
  --fs-h2:      clamp(1.85rem, 3.3vw, 2.875rem);
  --fs-h3:      1.3125rem;
  --fs-h4:      1.0625rem;
  --fs-body:    1.0625rem;
  --fs-sm:      .9375rem;
  --fs-xs:      .8125rem;
  --fs-kicker:  .75rem;

  --lh-body:  1.7;
  --lh-title: 1.08;
  --ls-display: -.038em;   /* Outfit supporte un resserrage très marqué */
  --ls-title:   -.028em;
  --ls-kicker:  .16em;

  /* --- ESPACEMENT (échelle 4 px) ------------------------------------------- */
  --sp-1: 4px;   --sp-2: 8px;   --sp-3: 12px;  --sp-4: 16px;
  --sp-5: 24px;  --sp-6: 32px;  --sp-7: 48px;  --sp-8: 64px;
  --sp-9: 96px;  --sp-10: 128px;

  /* --- RAYONS ---------------------------------------------------------------
     Le modèle travaille en grands rayons : 26 px pour une carte, 48 px pour un
     bloc de héros, 999 px pour tout ce qui se clique. On garde cette échelle. */
  --r-xs:   8px;
  --r-sm:   12px;
  --r:      16px;
  --r-lg:   22px;
  --r-xl:   28px;
  --r-2xl:  40px;
  --r-full: 999px;

  /* --- PROFONDEUR -----------------------------------------------------------
     Sur fond sombre une ombre portée ne se voit pas : ce qui crée le relief,
     c'est l'arête claire au-dessus de la surface. Chaque niveau combine donc
     un liseré interne et une ombre large et très douce. */
  --sh-1: inset 0 1px 0 var(--chrome-hi), 0 2px 6px rgba(0, 0, 0, .34);
  --sh-2: inset 0 1px 0 var(--chrome-hi), 0 14px 34px -14px rgba(0, 0, 0, .70);
  --sh-3: inset 0 1px 0 var(--chrome-hi), 0 34px 70px -22px rgba(0, 0, 0, .82);

  /* --- MOUVEMENT ------------------------------------------------------------ */
  --t:      240ms cubic-bezier(.4, 0, .2, 1);
  --t-fast: 160ms cubic-bezier(.4, 0, .2, 1);
  --t-slow: 640ms cubic-bezier(.16, 1, .3, 1);
  --ease-out: cubic-bezier(.16, 1, .3, 1);

  /* --- MATIÈRES -------------------------------------------------------------
     Le grain casse le banding des grands dégradés : sans lui, un fond sombre
     étiré sur 900 px affiche des bandes visibles sur la plupart des écrans. */
  --grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E");

  /* --- GABARIT --------------------------------------------------------------- */
  /* --- Habillage du héros épinglé -------------------------------------------
     Écrits par main.js §10 au rythme du défilement. Les valeurs ci-dessous
     sont celles du premier écran : sans JavaScript, le héros reste donc
     lisible et immobile, ce qui est exactement le bon comportement. */
  --hero-foot: 96px;   /* respiration au pied de la scene */
  --hero-fade: 1;      /* opacité du bloc de titre */
  --hero-rise: 0px;    /* son élévation */
  --hero-dim:  0;      /* extinction de la scène en fin de course */

  --container: 1240px;
  --gutter: 22px;
  --header-h: 76px;
  /* Hauteur réellement occupée par l'en-tête flottant (sa marge + sa pastille).
     C'est cette valeur, et pas `--header-h`, que le héros remonte pour passer
     dessous : se tromper de quelques pixels ici décale toute la page. */
  --header-block: 74px;
}



/* =============================================================================
   2. RESET MODERNE
   ============================================================================= */

*,
*::before,
*::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* Compense l'en-tête collant pour toutes les ancres */
  scroll-padding-top: calc(var(--header-h) + 28px);
  background: var(--graphite);
  color-scheme: dark;
}

body,
h1, h2, h3, h4, h5, h6,
p, figure, blockquote, dl, dd,
ul, ol { margin: 0; }

ul[class],
ol[class] {
  padding: 0;
  list-style: none;
}

body {
  min-height: 100vh;
  font-family: var(--ff);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--fg);
  /* TRANSPARENT, et c'est essentiel : le fond de page est la vidéo (§5 bis),
     posée en `position: fixed` derrière tout le document. Un fond opaque ici
     la masquerait entièrement. La couleur de repli est portée par <html>, qui
     la propage au canevas — elle reste donc visible si la vidéo est absente,
     refusée ou en échec. */
  background: var(--graphite);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
  /* Chiffres à chasse fixe : évite que les compteurs animés fassent
     sautiller la mise en page à chaque incrément. */
  font-variant-numeric: tabular-nums lining-nums;
}

/* Le grain de la page entière, posé une seule fois, non cliquable.

   Volontairement SANS `mix-blend-mode`. Une couche fixe qui couvre l'écran et
   se mélange à ce qu'il y a dessous oblige le navigateur à recomposer toute la
   page à chaque image de défilement — c'était la première cause de saccade du
   héros. Un simple aplat très peu opaque rend presque la même chose pour un
   coût nul. Le grain mélangé subsiste sur le héros seul (`.hero__grain`), où
   la surface est petite et ne défile pas. */
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 9;
  pointer-events: none;
  background-image: var(--grain);
  opacity: .022;
}

/* --- Garde-fous anti-chevauchement et anti-débordement ---------------------
   Un mot très long (URL, e-mail, nom composé) ne doit jamais sortir de son
   conteneur ni pousser une colonne au-delà de la largeur de l'écran. */
p, li, h1, h2, h3, h4, dt, dd, td, th, label, blockquote, figcaption, span {
  overflow-wrap: break-word;
}

/* Équilibre des titres sur plusieurs lignes (évite le mot orphelin) et
   des paragraphes (évite la dernière ligne d'un seul mot). */
h1, h2, h3, h4 { text-wrap: balance; }
p { text-wrap: pretty; }

img,
picture,
video,
svg {
  max-width: 100%;
  display: block;
}

img { height: auto; }

input,
button,
textarea,
select {
  font: inherit;
  color: inherit;
}

button { background: none; border: 0; }

a { color: inherit; }

hr {
  border: 0;
  border-top: 1px solid var(--ridge);
  margin: var(--sp-7) 0;
}

/* Barre de défilement accordée au fond, sinon elle troue la page en blanc. */
* {
  scrollbar-color: var(--ridge) transparent;
  scrollbar-width: thin;
}
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: var(--void); }
::-webkit-scrollbar-thumb {
  background: var(--ridge);
  border-radius: var(--r-full);
  border: 2px solid var(--void);
}
::-webkit-scrollbar-thumb:hover { background: var(--em-800); }

::selection {
  background: var(--em-500);
  color: var(--ice-050);
}

/* --- Focus ---------------------------------------------------------------
   Un seul anneau pour tout le site : la glace, jamais l'émeraude. Sur fond
   sombre, l'émeraude sur un bouton émeraude serait invisible. */
:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 3px;
  border-radius: var(--r-xs);
}
:focus:not(:focus-visible) { outline: none; }

/* Sur les tuiles claires (logos clients, boutons ivoire), l'anneau bascule. */
.logo-ph--real :focus-visible,
.btn--white:focus-visible,
.btn--secondary:focus-visible {
  outline-color: var(--em-700);
}



/* =============================================================================
   3. TYPOGRAPHIE DE BASE
   ============================================================================= */

h1, h2, h3, h4 {
  font-family: var(--ff-display);
  font-weight: 600;
  line-height: var(--lh-title);
  letter-spacing: var(--ls-title);
  color: var(--fg);
}

h1 { font-size: var(--fs-h1); }
h2 { font-size: var(--fs-h2); }
h3 { font-size: var(--fs-h3); line-height: 1.28; letter-spacing: -.018em; }
h4 { font-size: var(--fs-h4); line-height: 1.4; letter-spacing: -.012em; font-weight: 600; }

strong, b { font-weight: 600; color: var(--fg); }

sup { font-size: .68em; vertical-align: super; line-height: 0; }

/* --- Prose (mentions légales) --------------------------------------------- */
.prose {
  max-width: 74ch;
  color: var(--fg-2);
}

.prose > h2 {
  margin-top: var(--sp-8);
  padding-top: var(--sp-6);
  border-top: 1px solid var(--ridge);
  margin-bottom: var(--sp-4);
  font-size: 1.75rem;
}

.prose > h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }

.prose > h3 {
  margin-top: var(--sp-6);
  margin-bottom: var(--sp-3);
  color: var(--em-200);
}

.prose > p { margin-bottom: var(--sp-4); }
.prose > p:last-child { margin-bottom: 0; }

.prose strong { color: var(--fg); }

.prose ul,
.prose ol {
  margin: 0 0 var(--sp-4);
  padding-left: 1.35em;
  list-style: disc;
}

.prose ol { list-style: decimal; }
.prose li::marker { color: var(--em-400); }
.prose li + li { margin-top: var(--sp-2); }

.prose .card { margin-bottom: var(--sp-5); }
.prose .card dl { display: grid; gap: var(--sp-1); }

/* Liens de texte courant : soulignés, jamais « couleur seule ». */
.prose a:not([class]),
.section p a:not([class]) {
  color: var(--em-200);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color var(--t-fast);
}
.prose a:not([class]):hover,
.section p a:not([class]):hover { color: var(--em-100); }



/* =============================================================================
   4. PRIMITIVES
   ============================================================================= */

.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

/* --- Sections -------------------------------------------------------------
   Trois profondeurs seulement. `--muted` et `--dark` existaient dans la
   version claire ; on les garde pour ne rien casser côté HTML, mais ils
   désignent maintenant des nuits différentes, pas un clair et un foncé. */
/* --- La densité des voiles -------------------------------------------------
   Toutes les sections sont VOILÉES, jamais opaques : la vidéo court derrière
   tout le site et doit rester perceptible. L'opacité de chaque voile est
   dictée par la densité de lecture, et par rien d'autre :

     · beaucoup de texte courant  → voile dense, la vidéo n'est plus qu'une
       présence (défis, offres, secteurs, systèmes, ressources, mentions) ;
     · peu de texte, gros calibre → voile léger, la vidéo respire vraiment
       (chiffres clés, appel final, en-têtes de page) ;
     · le héros                   → aucun voile de section, la vidéo est nue.

   Les cartes posent une seconde couche par-dessus (`.card`, `.offer`…) : c'est
   elle qui garantit le contraste du corps de texte. Le voile de section ne
   protège que les chapeaux, qui sont en gros calibre. */
.section {
  position: relative;
  padding-block: clamp(var(--sp-8), 8vw, var(--sp-10));
  background: var(--graphite);
}

.section--muted { background: var(--night); }

/* `--dark` désigne maintenant les FENÊTRES : les bandes où l'on ouvre sur la
   vidéo au lieu de la couvrir. Le nom vient de la version claire du site ; on
   le garde pour ne pas avoir à toucher les trois pages. */
.section--dark {
  background: var(--void);
  color: var(--fg);
}

/* Filet de séparation : une arête de glace, pas un trait gris.
   Les deux bandes qui portent déjà leur propre décor (§5) en sont exclues :
   elles n'ont qu'un `::before` chacune, et il leur sert aux fractures. */
.section:not(.stats-band):not(.cta-final)::before {
  content: "";
  position: absolute;
  inset-inline: 0;
  top: 0;
  height: 1px;
  background: linear-gradient(90deg,
      transparent,
      var(--glass-bd) 18%,
      var(--em-line) 50%,
      var(--glass-bd) 82%,
      transparent);
  pointer-events: none;
}

/* --- Chapeaux ------------------------------------------------------------- */
.section__head {
  max-width: 760px;
  margin: 0 auto clamp(var(--sp-7), 5vw, var(--sp-9));
  text-align: center;
}

.section__head--left {
  margin-inline: 0;
  text-align: left;
}

.kicker {
  display: inline-flex;
  align-items: center;
  gap: .6em;
  margin-bottom: var(--sp-6);
  font-family: var(--ff);
  font-size: var(--fs-kicker);
  font-weight: 600;
  letter-spacing: var(--ls-kicker);
  text-transform: uppercase;
  color: var(--em-300);
}

/* Le tiret d'amorce du kicker — l'arête lumineuse en miniature. */
.kicker::before {
  content: "";
  width: 26px;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--em-400));
  flex: none;
}

.section__head--left .kicker::before { display: none; }

/* `--light` était nécessaire quand le site était clair. Sur fond de nuit
   partout, il n'a plus rien à inverser : on le neutralise sans le retirer,
   pour ne pas avoir à toucher les trois pages. */
.kicker--light { color: var(--em-300); }

.section__title {
  font-family: var(--ff-display);
  font-size: var(--fs-h2);
  font-weight: 600;
  line-height: var(--lh-title);
  letter-spacing: var(--ls-title);
  color: var(--fg);
}

.section__sub {
  max-width: 62ch;
  margin: var(--sp-5) auto 0;
  font-size: 1.0625rem;
  color: var(--fg-2);
}

.section__head--left .section__sub { margin-inline: 0; }

/* --- Grilles --------------------------------------------------------------
   `auto-fit` + `minmax` : les cartes se réorganisent seules, sans point de
   rupture à maintenir. Le nombre dans le nom de classe est un maximum, pas
   une contrainte. */
.grid {
  display: grid;
  gap: var(--sp-5);
  grid-template-columns: 1fr;
}

.grid--2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr)); }
.grid--3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); }
.grid--4 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr)); }

/* --- Cartes de verre ------------------------------------------------------
   La brique de base de tout le site : surface translucide, arête chromée en
   haut, bordure de glace. Trois propriétés, et une carte tient sur n'importe
   quel fond, y compris sur la vidéo. */
.card {
  position: relative;
  padding: clamp(var(--sp-5), 3vw, var(--sp-7));
  border-radius: var(--r-xl);
  /* Translucide, pas opaque : la vidéo doit se deviner jusque dans les cartes.
     À 88 % le corps de texte reste au-dessus de 12:1 quelle que soit l'image
     derrière — c'est cette couche qui porte la garantie de contraste, pas le
     voile de section. */
  background: var(--slate);
  border: 1px solid var(--glass-bd);
  box-shadow: var(--sh-1);
  color: var(--fg-2);
}

.card > :last-child { margin-bottom: 0; }

.card h2,
.card h3,
.card h4 { color: var(--fg); }

.card--hover {
  cursor: default;
  transition:
    transform var(--t) var(--ease-out),
    border-color var(--t),
    background var(--t),
    box-shadow var(--t);
}

.card--hover:hover,
.card--hover:focus-within {
  transform: translateY(-4px);
  background: var(--slate-2);
  border-color: var(--glass-bd-2);
  box-shadow: var(--sh-2);
}

/* Le halo émeraude qui monte au survol — sous la carte, jamais au-dessus. */
.card--hover::after {
  content: "";
  position: absolute;
  inset: -1px;
  border-radius: inherit;
  pointer-events: none;
  opacity: 0;
  transition: opacity var(--t);
  background: radial-gradient(120% 80% at 50% 0%, var(--em-soft), transparent 62%);
}
.card--hover:hover::after,
.card--hover:focus-within::after { opacity: 1; }

/* --- Boutons --------------------------------------------------------------
   Deux niveaux seulement, plus un fantôme. Au-delà, on ne sait plus lequel
   est l'action principale. */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  padding: 13px 24px;
  border: 1px solid transparent;
  border-radius: var(--r-full);
  font-family: var(--ff);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: -.005em;
  line-height: 1.2;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition:
    transform var(--t-fast) var(--ease-out),
    box-shadow var(--t),
    background var(--t),
    border-color var(--t),
    filter var(--t);
}

.btn:active { transform: translateY(1px); }

.btn .icon {
  width: 18px;
  height: 18px;
  flex: none;
}

/* La flèche qui avance au survol. Un seul détail, sur tous les boutons. */
.btn__arrow {
  display: inline-block;
  transition: transform var(--t) var(--ease-out);
}
.btn:hover .btn__arrow { transform: translateX(3px); }

/* Principal — la peinture. Le dégradé descend vers le vert sombre : c'est
   l'extrémité basse qui garantit le contraste du texte blanc (4,65:1). */
.btn--primary {
  background: linear-gradient(180deg, var(--em-600) 0%, #1A5F45 100%);
  color: #FFFFFF;
  border-color: rgba(167, 216, 193, .22);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .16),
    0 10px 26px -10px rgba(47, 141, 102, .70);
}

.btn--primary:hover {
  filter: brightness(1.14);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .2),
    0 16px 36px -12px rgba(47, 141, 102, .85);
}

/* Secondaire et ivoire — le chrome. Même objet, deux noms conservés du HTML. */
.btn--secondary,
.btn--white {
  background: linear-gradient(180deg, #FFFFFF 0%, var(--ice-100) 100%);
  color: var(--fg-inv);
  border-color: rgba(255, 255, 255, .5);
  box-shadow: 0 10px 26px -12px rgba(0, 0, 0, .8);
}

.btn--secondary:hover,
.btn--white:hover {
  background: #FFFFFF;
  box-shadow: 0 16px 34px -12px rgba(232, 240, 237, .34);
}

/* Fantôme — le verre. Sans flou d'arrière-plan : ce bouton est posé sur la
   vidéo du héros, où le flou serait recalculé à chaque image décodée. Un aplat
   sombre translucide garantit en plus la lisibilité du libellé quelle que soit
   l'image derrière — ce qu'un simple voile clair ne fait pas. */
.btn--ghost-light {
  background: rgba(16, 27, 22, .56);
  color: var(--fg);
  border-color: var(--glass-bd-2);
}

.btn--ghost-light:hover {
  background: rgba(24, 39, 31, .74);
  border-color: var(--em-line);
}

.btn--lg {
  padding: 16px 30px;
  font-size: 1rem;
}

.btn--block {
  display: flex;
  width: 100%;
}

/* --- Badges --------------------------------------------------------------- */
.badge {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  padding: 7px 14px;
  border-radius: var(--r-full);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  font-size: var(--fs-xs);
  font-weight: 500;
  line-height: 1.4;
  color: var(--fg-2);
  /* Pas de flou d'arrière-plan : quatre de ces badges sont posés sur la vidéo
     du héros, chacun redemandant un calcul à chaque image décodée. */
}

.badge .icon { width: 15px; height: 15px; color: var(--em-300); }

/* La coche des badges du héros, dessinée en CSS : pas de SVG à charger,
   et elle reste nette à toutes les tailles. */
.badge--check::before {
  content: "";
  width: 15px;
  height: 15px;
  flex: none;
  border-radius: var(--r-full);
  background:
    linear-gradient(140deg, var(--em-400), var(--em-700));
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7.2' fill='%23fff'/%3E%3C/svg%3E") center/contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7.2' fill='%23fff'/%3E%3C/svg%3E") center/contain no-repeat;
  position: relative;
}

.badge--check {
  color: var(--fg);
  position: relative;
}

/* Le V blanc par-dessus la pastille. */
.badge--check::after {
  content: "";
  position: absolute;
  left: 18px;
  top: calc(50% - 4px);
  width: 7px;
  height: 4px;
  border-left: 1.7px solid #FFFFFF;
  border-bottom: 1.7px solid #FFFFFF;
  transform: rotate(-45deg);
  pointer-events: none;
}

/* --- Icônes --------------------------------------------------------------- */
.icon {
  width: 20px;
  height: 20px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* La pastille d'icône : un disque de verre cerclé de chrome, avec une lueur
   émeraude au centre. C'est le motif qui revient sur secteurs, systèmes et
   garanties — un seul objet, trois emplois. */
.icon--box {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  flex: none;
  border-radius: var(--r);
  background:
    radial-gradient(100% 100% at 50% 0%, rgba(70, 176, 133, .22), transparent 70%),
    var(--glass-2);
  border: 1px solid var(--glass-bd-2);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .14);
  color: var(--em-200);
  transition: color var(--t), border-color var(--t), box-shadow var(--t);
}

.icon--box .icon,
.icon--box > svg {
  width: 24px;
  height: 24px;
  stroke: currentColor;
  fill: none;
}

.card--hover:hover .icon--box,
.card--hover:focus-within .icon--box {
  color: var(--em-100);
  border-color: var(--em-line);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .2),
    0 0 26px -6px rgba(47, 141, 102, .6);
}

/* --- Apparition au défilement ---------------------------------------------
   Par défaut le contenu est VISIBLE. Le masquage n'est autorisé que si
   <html> porte `js-reveal`, posée par le script d'amorce du <head> et retirée
   au bout de 3 s si main.js n'a pas confirmé son exécution. Un script bloqué
   ne peut donc jamais laisser une section vide. */
.reveal {
  opacity: 1;
  transform: none;
}

.js-reveal .reveal:not(.is-visible) {
  opacity: 0;
  transform: translate3d(0, 24px, 0);
}

/* Fondu + translation. 620 ms sur une courbe très décélérée : le bloc arrive
   vite puis se pose, au lieu de glisser à vitesse constante. C'est ce freinage
   qui fait la différence entre « ça bouge » et « ça se pose ».
   `translate3d` plutôt que `translateY` : la couche est confiée au
   compositeur, donc aucun repaint pendant l'apparition. */
.js-reveal .reveal {
  transition:
    opacity 620ms var(--ease-out),
    transform 620ms var(--ease-out);
  will-change: opacity, transform;
}

/* Une fois posé, on rend la main au navigateur : laisser `will-change` sur
   des centaines d'éléments réserverait des couches pour rien. */
.js-reveal .reveal.is-visible { will-change: auto; }

/* Décalages en cascade. 70 ms : au-delà, la dernière carte d'une rangée de
   quatre accuse un retard qui se lit comme un temps de chargement. */
.reveal--d1 { transition-delay:  70ms; }
.reveal--d2 { transition-delay: 140ms; }
.reveal--d3 { transition-delay: 210ms; }
.reveal--d4 { transition-delay: 280ms; }
.reveal--d5 { transition-delay: 350ms; }

/* --- Accessibilité --------------------------------------------------------- */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  top: -100px;
  left: var(--gutter);
  z-index: 200;
  padding: 12px 20px;
  border-radius: var(--r-full);
  background: var(--ice-050);
  color: var(--fg-inv);
  font-size: var(--fs-sm);
  font-weight: 600;
  text-decoration: none;
  transition: top var(--t);
}

.skip-link:focus { top: 12px; }

/* --- Marqueur « à compléter » ----------------------------------------------
   L'ambre du phare. Deuxième et dernier emploi d'une couleur chaude sur tout
   le site : impossible de mettre la page en ligne sans le voir. */
.placeholder {
  display: inline;
  padding: 2px 8px;
  border-radius: var(--r-xs);
  background: var(--ph-bg);
  border: 1px dashed var(--ph-bd);
  color: var(--ph-fg);
  font-size: .9em;
  font-weight: 500;
}




/* =============================================================================
   5. DÉCORS — arêtes et fractures
   -----------------------------------------------------------------------------
   Éléments purement décoratifs, tous en `pointer-events: none` et tous posés
   en pseudo-éléments : aucun n'ajoute de nœud au DOM ni de requête.
   ============================================================================= */

/* Aurore de section : une lueur émeraude qui monte du bord supérieur.
   Posée sur les grandes bandes sombres pour qu'elles ne soient pas des
   rectangles noirs les uns sur les autres. */
.stats-band::after,
.cta-final::after,
.footer::before {
  content: "";
  position: absolute;
  inset-inline: 0;
  top: 0;
  height: 340px;
  pointer-events: none;
  background: radial-gradient(80% 100% at 50% 0%, rgba(47, 141, 102, .17), transparent 70%);
}

/* Fractures de glace : un motif de lignes fines en dégradés répétés, très
   faible opacité. Sur les bandes les plus sombres uniquement. */
.stats-band::before,
.cta-final::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: .5;
  background-image:
    linear-gradient(104deg, transparent 49.85%, var(--glass-bd) 50%, transparent 50.15%),
    linear-gradient( 71deg, transparent 29.9%,  var(--glass-bd) 30%, transparent 30.1%),
    linear-gradient(118deg, transparent 74.9%,  var(--glass-bd) 75%, transparent 75.1%);
  background-size: 380px 100%, 620px 100%, 500px 100%;
}



/* =============================================================================
   6. EN-TÊTE
   ============================================================================= */

/* --- Bandeau d'annonce -----------------------------------------------------
   Le seul élément qui traverse la page de bord à bord. Il annonce, il ne
   navigue pas : type discret, hauteur minimale. */
.announce {
  position: relative;
  z-index: 60;
  background: linear-gradient(90deg, var(--em-950), var(--em-900) 50%, var(--em-950));
  border-bottom: 1px solid var(--em-line);
  color: var(--em-100);
  font-size: var(--fs-xs);
}

.announce__inner {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 40px;
  padding-block: 9px;
  text-align: center;
}

.announce p { line-height: 1.45; }

.announce__link {
  margin-left: var(--sp-2);
  color: #FFFFFF;
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
  white-space: nowrap;
  transition: color var(--t-fast);
}

.announce__link:hover { color: var(--em-200); }

/* --- En-tête ---------------------------------------------------------------
   Une pastille de verre flottante, exactement comme la barre du modèle : elle
   ne touche jamais les bords, elle se resserre au défilement. */
.header {
  position: sticky;
  top: 12px;
  z-index: 80;
  margin-top: 12px;
  transition: top var(--t), margin-top var(--t);
}

.header__inner {
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  min-height: 62px;
  padding: 9px 12px 9px 20px;
  border-radius: var(--r-full);
  background: rgba(14, 23, 20, .72);
  border: 1px solid var(--glass-bd);
  box-shadow: var(--sh-1);
  /* Flou volontairement modeste. Un `backdrop-filter` est recalculé à chaque
     image de défilement, et l'en-tête flotte au-dessus d'une vidéo : à 22 px
     de rayon, c'est le poste le plus cher de la page. À 13 px le rendu est
     indiscernable et le défilement redevient net. */
  -webkit-backdrop-filter: blur(13px);
          backdrop-filter: blur(13px);
  transition: background var(--t), border-color var(--t), box-shadow var(--t);
}

.header.is-scrolled .header__inner {
  background: rgba(11, 18, 16, .90);
  border-color: var(--glass-bd-2);
  box-shadow: var(--sh-2);
}

/* Un repli de sécurité : sans `backdrop-filter`, la pastille devient opaque
   au lieu de laisser passer le contenu en transparence illisible. */
@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .header__inner { background: rgba(11, 18, 16, .97); }
}

/* --- Logo ------------------------------------------------------------------ */
.logo {
  display: inline-flex;
  align-items: center;
  gap: 11px;
  flex: none;
  text-decoration: none;
  color: var(--fg);
}

.logo__mark {
  display: inline-flex;
  width: 30px;
  height: 30px;
  flex: none;
  filter: drop-shadow(0 0 12px rgba(47, 141, 102, .45));
  transition: filter var(--t), transform var(--t) var(--ease-out);
}

.logo:hover .logo__mark {
  filter: drop-shadow(0 0 18px rgba(70, 176, 133, .75));
  transform: translateY(-1px);
}

.logo__mark svg { width: 100%; height: 100%; }

.logo__text {
  font-family: var(--ff-display);
  font-size: 1.28rem;
  font-weight: 600;
  letter-spacing: -.03em;
  color: var(--fg);
}

/* --- Navigation ------------------------------------------------------------ */
.nav { margin-left: auto; }

.nav__list {
  display: flex;
  align-items: center;
  gap: 2px;
}

.nav__link {
  position: relative;
  display: inline-block;
  padding: 8px 13px;
  border-radius: var(--r-full);
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--fg-2);
  text-decoration: none;
  white-space: nowrap;
  transition: color var(--t-fast), background var(--t-fast);
}

.nav__link:hover {
  color: var(--fg);
  background: var(--glass);
}

/* Section courante : une pastille émeraude discrète, pas un simple gras —
   la couleur seule ne suffirait pas à un daltonien, la pastille si. */
.nav__link.is-active {
  color: var(--em-200);
  background: var(--em-soft);
}

.header__actions {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex: none;
}

.header__actions .nav__link {
  color: var(--fg-2);
  font-variant-numeric: tabular-nums;
}

.header__actions .btn { padding: 11px 20px; }

/* --- Burger ---------------------------------------------------------------- */
.burger {
  display: none;
  width: 42px;
  height: 42px;
  flex: none;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 5px;
  border-radius: var(--r-full);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  cursor: pointer;
  transition: background var(--t), border-color var(--t);
}

.burger:hover { background: var(--glass-2); border-color: var(--glass-bd-2); }

.burger__bar {
  display: block;
  width: 17px;
  height: 1.6px;
  border-radius: 2px;
  background: var(--fg);
  transition: transform var(--t), opacity var(--t-fast);
}

.burger.is-open .burger__bar:nth-child(1) { transform: translateY(6.6px) rotate(45deg); }
.burger.is-open .burger__bar:nth-child(2) { opacity: 0; }
.burger.is-open .burger__bar:nth-child(3) { transform: translateY(-6.6px) rotate(-45deg); }

.nav-overlay {
  position: fixed;
  inset: 0;
  z-index: 70;
  background: rgba(5, 9, 8, .72);
  -webkit-backdrop-filter: blur(6px);
          backdrop-filter: blur(6px);
}

.nav-overlay[hidden] { display: none; }

body.is-locked { overflow: hidden; }



/* =============================================================================
   7. HÉROS — cadre cinéma épinglé
   -----------------------------------------------------------------------------
   Trois idées, et elles se tiennent :

     · la vidéo n'occupe pas tout l'écran : elle vit dans un BANDEAU 21:9,
       centré, dont les bords fondent dans le noir. C'est ce fondu — et non
       des barres nettes — qui donne la lecture « film » ;
     · `.hero` est une piste de défilement de plusieurs écrans, `.hero__stage`
       y reste collé : la scène ne bouge pas pendant qu'on avance la vidéo ;
     · le titre est centré SUR le bandeau, les chiffres sont ancrés en bas de
       la scène. Séparer les deux est ce qui permet au titre d'être vraiment
       au milieu au lieu d'être poussé vers le haut par la pile.
   ============================================================================= */

/* --- Le conteneur d'épinglage ----------------------------------------------
   La hauteur commande le RYTHME. 460 % de la fenêtre, dont 100 % occupés par
   la scène, laissent 360 % de course pour parcourir les 6 secondes de vidéo :
   une image (24 i/s) tous les ~22 px de défilement. Montez la valeur pour
   ralentir encore, baissez-la pour accélérer. C'est le seul réglage à toucher
   pour changer la vitesse ressentie. */
.hero {
  position: relative;
  height: 460svh;
  margin-top: calc(-1 * var(--header-block));
  background: var(--void);
}

/* --- La scène épinglée ------------------------------------------------------ */
.hero__stage {
  position: sticky;
  top: 0;
  height: 100svh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  isolation: isolate;
  /* Le rembourrage est sur la SCÈNE, pas sur le contenu : le centrage
     vertical s'opère alors dans la zone restante, donc sous l'en-tête
     flottant. Mettre ce rembourrage sur `.hero__inner` recentrerait le bloc
     sur lui-même et le ferait passer derrière l'en-tête. */
  padding-block: calc(var(--header-block) + var(--sp-5)) var(--hero-foot);
}

/* --- Le bandeau cinéma ------------------------------------------------------
   La vidéo n'est plus en plein cadre : `aspect-ratio` lui donne son format et
   elle se centre verticalement. Au-dessus et en dessous, le fond `--void` de
   la scène apparaît — ce sont les bandes.

   `max-height` est un garde-fou pour les écrans très larges : sans lui, un
   21:9 calculé sur 2 500 px de large dépasserait la hauteur de la fenêtre et
   le bandeau redeviendrait plein cadre. */
.hero__media {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  z-index: -3;
  aspect-ratio: 21 / 9;
  max-height: 78svh;
  overflow: hidden;
  /* Image de secours pour les connexions lentes : un SVG de 7 Ko, vectoriel,
     donc net à toutes les définitions et affiché instantanément. Il tient
     l'écran avant que la vidéo n'ait un octet, et reste SEUL si elle est
     absente, refusée, ou si le visiteur a activé l'économie de données.
     (Le second niveau — l'image exacte de départ — est le `poster` du
     <video>, déclaré dans le HTML.) */
  background: var(--void) url("img/hero-poster.svg") center / cover no-repeat;
}

/* Les bords du bandeau FONDENT dans le noir au lieu d'être coupés net. Une
   arête franche ferait « vidéo posée sur une page » ; un dégradé fait
   « projection ». C'est toute la différence entre les deux lectures. */
.hero__media::before,
.hero__media::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  height: 30%;
  pointer-events: none;
  z-index: 1;
}

.hero__media::before {
  top: 0;
  background: linear-gradient(180deg, var(--void) 0%, rgba(5, 9, 8, .62) 38%, transparent 100%);
}

.hero__media::after {
  bottom: 0;
  background: linear-gradient(0deg, var(--void) 0%, rgba(5, 9, 8, .66) 38%, transparent 100%);
}

.hero__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 45%;
  /* Aucun `filter` : la vidéo passe à sa luminosité native et on épargne une
     passe GPU par image décodée. L'accord chromatique est fait par le voile,
     qui est un dégradé statique — coût nul. */
  -webkit-user-drag: none;
  user-select: none;
  backface-visibility: hidden;
}

/* Le voile — UNE seule couche : une ellipse douce centrée sur le texte. C'est
   elle qui garantit le contraste du titre, localement.

   Le dégradé vertical qui traversait toute la scène a été RETIRÉ, et c'est ce
   qui fait exister le cadre cinéma. Il assombrissait le bandeau autant que les
   barres, si bien que les trois zones se confondaient en un seul aplat : on
   avait des bandes sans les voir. La protection verticale est désormais portée
   par le bandeau lui-même (`.hero__media::before/::after`), donc à l'intérieur
   du cadre — les barres restent en `--void` pur, et l'arête se lit. */
.hero__scrim {
  position: absolute;
  inset: 0;
  z-index: -2;
  pointer-events: none;
  background:
    radial-gradient(58% 44% at 50% 48%,
      rgba(5, 9, 8, .52) 0%,
      rgba(5, 9, 8, .30) 60%,
      rgba(5, 9, 8, 0)   100%);
}

/* Le fondu de sortie. En fin d'épinglage, la scène s'éteint vers la couleur de
   la section suivante : le contenu ne « surgit » pas par-dessus une image
   pleine lumière, il émerge d'un noir. `--hero-dim` est piloté par main.js. */
.hero__exit {
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background: var(--void);
  opacity: var(--hero-dim, 0);
}

/* Grain, un peu plus marqué ici : la vidéo compressée bande. Sans
   `mix-blend-mode` — cette couche est posée SUR la vidéo, et un mélange
   obligerait à recomposer la zone à chaque image décodée. */
.hero__grain {
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background-image: var(--grain);
  opacity: .035;
}

/* --- Contenu ---------------------------------------------------------------
   `--hero-fade` et `--hero-rise` sont écrits par main.js §10 au rythme du
   défilement : le bloc s'élève et s'efface pendant qu'on traverse la piste,
   pour que la section suivante prenne sa place sans collision.

   Le bloc ne contient QUE le sur-titre, le titre, le slogan, les preuves et
   les actions. Les chiffres en sont sortis (voir plus bas) : empilés ici, ils
   allongeaient la colonne au point de pousser le titre vers le haut de
   l'écran. C'est exactement ce qu'on corrige en les ancrant en bas. */
.hero__inner {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 900px;
  text-align: center;
  opacity: var(--hero-fade, 1);
  transform: translate3d(0, var(--hero-rise, 0px), 0);
}

/* --- La ligne de preuve -----------------------------------------------------
   Une garantie par programme, séparées d'un point médian. Elle remplace un
   socle de quatre chiffres qui pesait 140 px et finissait par recouvrir les
   boutons : à ce niveau de la page, deux engagements retenus valent mieux que
   quatre chiffres survolés.

   Volontairement discrète — pas de cadre, pas de fond, pas de pastille. Sur un
   héros qui doit respirer, la preuve se murmure. */
.hero__proof {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: var(--sp-3) var(--sp-6);
  margin-top: var(--sp-8);
  font-size: var(--fs-xs);
  letter-spacing: .04em;
  color: rgba(255, 255, 255, .70);
}

.hero__proof span {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-3);
  white-space: nowrap;
}

/* Le séparateur : une pastille émeraude entre les deux engagements, jamais
   avant le premier. */
.hero__proof span + span::before {
  content: "";
  width: 4px;
  height: 4px;
  flex: none;
  border-radius: var(--r-full);
  background: var(--em-400);
}

/* --- Le socle de chiffres (conservé pour les autres pages) ------------------
   Plus utilisé par le héros de l'accueil, qui tient désormais en quatre
   éléments. Les règles restent : elles servent si l'on veut réintroduire un
   instrument de bord ailleurs. */
/* Le centrage passe par `left/right: 0` + `margin-inline: auto`, JAMAIS par
   `translateX(-50%)`. L'animation d'entrée (main.js §11) écrit
   `transform: none` sur cet élément : un centrage porté par `transform`
   serait annulé, et le socle partirait se coller à droite. La propriété
   `transform` est donc laissée libre pour le seul mouvement vertical. */
.hero__stats {
  position: absolute;
  left: 0;
  right: 0;
  bottom: clamp(56px, 7svh, 84px);
  z-index: 1;
  width: min(100% - 2 * var(--gutter), 940px);
  margin-inline: auto;
  transform: translate3d(0, var(--hero-rise, 0px), 0);
  opacity: var(--hero-fade, 1);
}

/* Première image de l'animation d'entrée (§11 de main.js).
   `entry-pending` est posée par le script d'amorce du <head>, qui l'ôte de
   lui-même au bout de 3,5 s si main.js n'a pas pris la main. Sans JavaScript,
   elle n'est jamais posée : la page s'affiche entière. La vidéo est
   volontairement hors de ce masque — c'est la scène, elle est déjà là. */
.entry-pending .hero__inner > * { opacity: 0; }

.hero .kicker {
  justify-content: center;
  color: var(--em-200);
}

.hero h1 {
  max-width: 21ch;
  margin-inline: auto;
  font-family: var(--ff-display);
  font-size: var(--fs-display);
  font-weight: 600;
  line-height: 1.02;
  letter-spacing: var(--ls-display);
  color: #FFFFFF;
  text-wrap: balance;
}

/* La phrase mise en avant : émeraude claire, en italique du modèle remplacée
   par une différence de couleur et de graisse — un italique dans une
   géométrique large se lit mal. */
.hero h1 em {
  font-style: normal;
  font-weight: 500;
  background: linear-gradient(96deg, var(--em-200) 0%, var(--em-400) 52%, var(--em-200) 100%);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
}

/* Repli pour les navigateurs sans `background-clip: text`. */
@supports not ((-webkit-background-clip: text) or (background-clip: text)) {
  .hero h1 em { color: var(--em-200); background: none; }
}

.hero .section__sub {
  max-width: 46ch;
  margin-top: var(--sp-6);
  /* Relevé de .80 à .92 : le voile ayant été allégé pour éclaircir l'image,
     ce paragraphe doit regagner ce que le fond a gagné, sinon il tombe sous
     4,5:1 sur les images les plus lumineuses de la vidéo. */
  color: rgba(255, 255, 255, .92);
  font-size: clamp(1rem, 1.2vw, 1.125rem);
}

.hero__badges {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--sp-3);
  margin-top: var(--sp-6);
}

/* Aplat sombre plutôt que voile clair : le voile a été allégé pour éclaircir
   l'image, et un film blanc à 7 % ne suffirait plus à détacher ces libellés
   des parties lumineuses de la vidéo. */
.hero__badges .badge {
  background: rgba(16, 27, 22, .54);
  border-color: rgba(255, 255, 255, .20);
  color: #FFFFFF;
}

.hero__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--sp-4);
  margin-top: var(--sp-8);
}

/* --- Socle de chiffres ------------------------------------------------------
   Quatre chiffres sur une seule dalle de verre, séparés par des filets et non
   par du vide : c'est un instrument de bord, pas quatre cartes. */
.hero__stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 168px), 1fr));
  border-radius: var(--r-xl);
  /* Pas de `backdrop-filter` ici. Ce socle est large, posé à même la vidéo, et
     son flou serait recalculé à chaque image décodée. Sur un fond aussi
     sombre, un aplat translucide un peu plus dense rend la même chose pour un
     coût nul. Le seul flou d'arrière-plan qui reste sur le héros est celui de
     l'en-tête, dont la surface est petite. */
  background: rgba(18, 30, 25, .58);
  border: 1px solid var(--glass-bd-2);
  box-shadow: var(--sh-2);
  overflow: hidden;
}

.hero__stats .stat {
  padding: var(--sp-4) var(--sp-4);
  border-inline-end: 1px solid var(--glass-bd);
  text-align: center;
}

.hero__stats .stat:last-child { border-inline-end: 0; }

.stat {
  display: flex;
  flex-direction: column-reverse;   /* le chiffre au-dessus de son libellé */
  gap: var(--sp-2);
}

.stat__num {
  font-family: var(--ff-display);
  font-size: clamp(2rem, 3.4vw, 2.75rem);
  font-weight: 600;
  line-height: 1;
  letter-spacing: -.04em;
  color: #FFFFFF;
}

.stat__label {
  font-size: var(--fs-xs);
  line-height: 1.45;
  color: rgba(255, 255, 255, .70);
}

/* --- Indicateur de défilement ---------------------------------------------- */
.hero__cue {
  position: absolute;
  left: 50%;
  bottom: 22px;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  padding: 7px 15px 7px 12px;
  border-radius: var(--r-full);
  /* Même raison que le socle de chiffres : aucun flou d'arrière-plan sur la
     vidéo. */
  background: rgba(18, 30, 25, .55);
  border: 1px solid var(--glass-bd);
  color: rgba(255, 255, 255, .78);
  font-size: var(--fs-xs);
  font-weight: 500;
  text-decoration: none;
  transform: translateX(-50%);
  transition: color var(--t), border-color var(--t), background var(--t);
}

.hero__cue:hover {
  color: #FFFFFF;
  background: var(--glass-2);
  border-color: var(--em-line);
}

.hero__cue span[aria-hidden] {
  display: inline-block;
  animation: cue 2.4s var(--ease-out) infinite;
}

@keyframes cue {
  0%, 62%, 100% { transform: translateY(0); opacity: .75; }
  32%           { transform: translateY(3px); opacity: 1; }
}

/* --- Jauge de progression de lecture ----------------------------------------
   Un filet de 2 px sous l'en-tête. Sur une page de 13 sections, savoir où
   l'on en est vaut mieux qu'un ascenseur de 40 px de haut. */
.progress {
  position: fixed;
  inset-inline: 0;
  top: 0;
  z-index: 90;
  height: 2px;
  pointer-events: none;
  transform-origin: 0 50%;
  transform: scaleX(0);
  background: linear-gradient(90deg, var(--em-700), var(--em-400), var(--em-200));
  will-change: transform;
}


/* --- En-tête des pages secondaires ------------------------------------------
   Contact et mentions légales n'ont pas de vidéo : elles reçoivent le même
   ciel, en version courte. Sans cela, elles s'ouvriraient sur un aplat noir
   et paraîtraient d'un autre site. */
.page-hero {
  position: relative;
  isolation: isolate;
  margin-top: calc(-1 * var(--header-block));
  padding-block: calc(var(--header-block) + var(--sp-9)) clamp(var(--sp-8), 6vw, var(--sp-9));
  background: var(--void);
  overflow: hidden;
}

.page-hero::before {
  content: "";
  position: absolute;
  inset: -30% -10% auto -10%;
  height: 150%;
  z-index: -1;
  pointer-events: none;
  background:
    radial-gradient(44% 46% at 22% 26%, rgba(70, 176, 133, .30), transparent 68%),
    radial-gradient(40% 38% at 82% 8%, rgba(167, 216, 193, .13), transparent 66%);
}

/* Pas d'arête en bas : la section suivante porte déjà la sienne (§4), et deux
   filets accolés se lisent comme un trait de 2 px mal dessiné. */

.page-hero .section__head { margin-bottom: 0; }

.page-hero .section__title { font-size: var(--fs-h1); }



/* =============================================================================
   8. BANDE DE CONFIANCE (MARQUEE)
   ============================================================================= */

.trust {
  padding-block: clamp(var(--sp-7), 5vw, var(--sp-8));
  background: var(--graphite);
}

.trust__label {
  margin-bottom: var(--sp-5);
  font-family: var(--ff);
  font-size: var(--fs-kicker);
  font-weight: 600;
  letter-spacing: var(--ls-kicker);
  text-transform: uppercase;
  text-align: center;
  color: var(--fg-3);
}

.marquee {
  position: relative;
  overflow: hidden;
  padding-block: var(--sp-3);
  /* Les bords s'effacent : le ruban n'a ni début ni fin visible. */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 9%, #000 91%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 9%, #000 91%, transparent);
}

.marquee + .trust__label { margin-top: var(--sp-7); }

.marquee__track {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  width: max-content;
  animation: marquee 58s linear infinite;
}

@keyframes marquee {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}

/* Le défilement NE s'arrête PAS au survol — il s'arrêterait sous le curseur
   d'un visiteur qui lit simplement la page. Il se met en pause uniquement à
   la navigation clavier, sans quoi une tuile serait inatteignable au clavier. */
.marquee:focus-within .marquee__track { animation-play-state: paused; }

.marquee__item { flex: none; }

/* Tuile générique — les technologies opérées, en texte. */
.logo-ph {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 62px;
  min-width: 168px;
  padding-inline: var(--sp-6);
  border-radius: var(--r-full);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  font-family: var(--ff-display);
  font-size: var(--fs-sm);
  font-weight: 500;
  letter-spacing: -.01em;
  color: var(--fg-2);
  white-space: nowrap;
  transition: background var(--t), border-color var(--t), color var(--t);
}

.logo-ph:hover {
  background: var(--glass-2);
  border-color: var(--em-line);
  color: var(--fg);
}

/* Tuile de logo client. Fond ivoire obligatoire : les treize logos sont des
   images en couleur pensées pour le papier blanc. Sur du graphite, la moitié
   d'entre eux — lettrage sombre, contours fins — deviendrait illisible. */
.logo-ph--real {
  height: 96px;
  min-width: 176px;
  padding-inline: var(--sp-5);
  border-radius: var(--r-lg);
  background: var(--ice-050);
  border: 1px solid rgba(255, 255, 255, .14);
  box-shadow: 0 12px 30px -14px rgba(0, 0, 0, .8);
}

.logo-ph--real:hover {
  background: #FFFFFF;
  border-color: var(--em-200);
  box-shadow:
    0 14px 34px -14px rgba(0, 0, 0, .8),
    0 0 0 1px var(--em-line);
}

.logo-ph--real img {
  width: auto;
  max-width: 100%;
  max-height: 62px;
  object-fit: contain;
  /* Aucune désaturation : ce sont de vrais logos, ils gardent leurs couleurs. */
}

/* Repli quand un fichier ne charge pas : le nom du client, proprement
   composé, à la place de l'icône d'image cassée du navigateur. */
.logo-ph--nom {
  font-family: var(--ff-display);
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: -.015em;
  color: var(--fg-inv);
  text-align: center;
  line-height: 1.25;
  white-space: normal;
  padding-inline: var(--sp-4);
}



/* =============================================================================
   9. DÉFIS → SOLUTIONS
   ============================================================================= */

.challenge {
  position: relative;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--sp-5);
  padding: clamp(var(--sp-5), 3vw, var(--sp-7));
  border-radius: var(--r-xl);
  background: var(--slate);
  border: 1px solid var(--glass-bd);
  box-shadow: var(--sh-1);
  overflow: hidden;
}

/* Le numéro : très grand, très effacé. Il rythme, il ne se lit pas. */
.challenge__num {
  font-family: var(--ff-display);
  font-size: 2.5rem;
  font-weight: 600;
  line-height: 1;
  letter-spacing: -.05em;
  color: transparent;
  -webkit-text-stroke: 1px var(--em-line);
  user-select: none;
}

.challenge__body { min-width: 0; }

.challenge__problem h3 {
  margin-bottom: var(--sp-3);
  color: var(--fg);
}

.challenge__problem p { color: var(--fg-3); }

/* La flèche de bascule : un filet vertical qui traverse, avec une pastille
   émeraude au milieu. C'est le moment où le problème devient la solution. */
.challenge__arrow {
  position: relative;
  height: 34px;
  margin-block: var(--sp-5);
  color: transparent;   /* le caractère ↓ du HTML n'est pas affiché */
  user-select: none;
}

.challenge__arrow::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 1px;
  background: linear-gradient(180deg, var(--glass-bd), var(--em-400), var(--glass-bd));
}

.challenge__arrow::after {
  content: "";
  position: absolute;
  left: -2.5px;
  top: 50%;
  width: 6px;
  height: 6px;
  border-radius: var(--r-full);
  background: var(--em-400);
  box-shadow: 0 0 14px 2px rgba(70, 176, 133, .7);
  transform: translateY(-50%);
}

.challenge__solution {
  position: relative;
  padding: var(--sp-5);
  border-radius: var(--r-lg);
  background:
    linear-gradient(150deg, rgba(47, 141, 102, .13), rgba(47, 141, 102, .04));
  border: 1px solid var(--em-line);
}

.challenge__solution h4 {
  margin-bottom: var(--sp-2);
  color: var(--em-100);
}

.challenge__solution p { color: var(--fg-2); }

/* Le halo au survol, cohérent avec `.card--hover`. */
.challenge.card--hover:hover { transform: translateY(-4px); }



/* =============================================================================
   10. OFFRES + TABLEAU COMPARATIF
   ============================================================================= */

.offers {
  display: grid;
  gap: var(--sp-6);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 420px), 1fr));
  align-items: start;
}

.offer {
  position: relative;
  display: flex;
  flex-direction: column;
  padding: clamp(var(--sp-6), 3.4vw, var(--sp-8));
  border-radius: var(--r-2xl);
  background: var(--slate);
  border: 1px solid var(--glass-bd);
  box-shadow: var(--sh-2);
}

/* L'offre mise en avant reçoit une bordure en dégradé — la seule de la page.
   Technique `padding-box / border-box` : elle fonctionne partout, y compris
   là où `border-image` sur un rayon arrondi échoue. */
.offer--featured {
  background:
    linear-gradient(165deg, #18271F 0%, #101B16 100%) padding-box,
    linear-gradient(150deg,
      var(--em-400) 0%,
      var(--em-700) 34%,
      rgba(255, 255, 255, .22) 58%,
      var(--em-500) 100%) border-box;
  border: 1px solid transparent;
  box-shadow: var(--sh-3), 0 0 70px -28px rgba(47, 141, 102, .8);
}

.offer__tag {
  display: inline-flex;
  align-self: flex-start;
  padding: 6px 14px;
  margin-bottom: var(--sp-5);
  border-radius: var(--r-full);
  background: var(--glass-2);
  border: 1px solid var(--glass-bd-2);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--fg-2);
}

.offer--featured .offer__tag {
  background: linear-gradient(180deg, var(--em-600), var(--em-800));
  border-color: var(--em-line);
  color: #FFFFFF;
}

.offer__name {
  font-size: clamp(1.6rem, 2.4vw, 2.125rem);
  margin-bottom: var(--sp-4);
}

.offer__for {
  color: var(--fg-3);
  font-size: var(--fs-sm);
  margin-bottom: var(--sp-5);
}

.offer__promise {
  padding: var(--sp-5);
  margin-bottom: var(--sp-6);
  border-radius: var(--r-lg);
  background: var(--em-soft);
  border: 1px solid var(--em-line);
  color: var(--em-100);
  font-size: 1.0625rem;
}

.offer__promise strong { color: #FFFFFF; }

.offer__list {
  display: grid;
  gap: var(--sp-4);
  margin-bottom: var(--sp-6);
  padding: 0;
  list-style: none;
  counter-reset: offer;
}

.offer__item {
  position: relative;
  padding-left: 34px;
  font-size: var(--fs-sm);
  color: var(--fg-2);
}

.offer__item strong { color: var(--fg); }

/* Une coche pour la liste à puces, un numéro pour la liste ordonnée : la
   distinction sémantique du HTML devient visible. */
ul.offer__list .offer__item::before {
  content: "";
  position: absolute;
  left: 0;
  top: 6px;
  width: 18px;
  height: 18px;
  border-radius: var(--r-full);
  background: var(--em-soft-2);
  border: 1px solid var(--em-line);
}

ul.offer__list .offer__item::after {
  content: "";
  position: absolute;
  left: 5.5px;
  top: 11px;
  width: 7px;
  height: 4px;
  border-left: 1.6px solid var(--em-200);
  border-bottom: 1.6px solid var(--em-200);
  transform: rotate(-45deg);
}

ol.offer__list { counter-reset: offer; }

ol.offer__list .offer__item::before {
  counter-increment: offer;
  content: counter(offer, decimal-leading-zero);
  position: absolute;
  left: 0;
  top: 2px;
  font-family: var(--ff-display);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0;
  color: var(--em-300);
}

/* --- Encadré de garantie ---------------------------------------------------
   L'argument central du site. Il mérite un objet à lui : une plaque de verre
   marquée d'un liseré émeraude sur son flanc gauche. */
.guarantee-box {
  position: relative;
  padding: var(--sp-5) var(--sp-5) var(--sp-5) var(--sp-6);
  margin-bottom: var(--sp-6);
  border-radius: var(--r-lg);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  overflow: hidden;
}

.guarantee-box::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 3px;
  background: linear-gradient(180deg, var(--em-300), var(--em-700));
}

.guarantee-box__title {
  margin-bottom: var(--sp-3);
  font-size: 1rem;
  color: var(--em-100);
}

.guarantee-box p {
  font-size: var(--fs-sm);
  color: var(--fg-2);
}

.guarantee-box p + p { margin-top: var(--sp-3); }

/* --- Conditions ------------------------------------------------------------ */
.offer__terms {
  display: grid;
  gap: var(--sp-3);
  padding-top: var(--sp-5);
  margin-bottom: var(--sp-6);
  border-top: 1px solid var(--ridge);
}

.offer__term {
  position: relative;
  padding-left: 18px;
  font-size: var(--fs-xs);
  line-height: 1.6;
  color: var(--fg-3);
}

.offer__term::before {
  content: "";
  position: absolute;
  left: 0;
  top: 9px;
  width: 5px;
  height: 5px;
  border-radius: var(--r-full);
  background: var(--em-400);
}

.offer__term strong { color: var(--fg-2); }

.offer__foot { margin-top: auto; }

/* --- Tableau comparatif ---------------------------------------------------- */
.compare__wrap {
  overflow-x: auto;
  border-radius: var(--r-xl);
  border: 1px solid var(--glass-bd);
  background: var(--slate);
  box-shadow: var(--sh-1);
  -webkit-overflow-scrolling: touch;
}

.compare {
  width: 100%;
  min-width: 640px;
  border-collapse: collapse;
  font-size: var(--fs-sm);
}

.compare caption { caption-side: top; }

.compare thead th {
  padding: var(--sp-5);
  background: var(--night);
  border-bottom: 1px solid var(--ridge);
  font-family: var(--ff-display);
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: -.015em;
  text-align: left;
  color: var(--fg);
}

.compare tbody th {
  padding: var(--sp-4) var(--sp-5);
  text-align: left;
  font-weight: 500;
  color: var(--fg-3);
  white-space: nowrap;
  border-bottom: 1px solid var(--ridge);
}

.compare td {
  padding: var(--sp-4) var(--sp-5);
  color: var(--fg-2);
  border-bottom: 1px solid var(--ridge);
  vertical-align: top;
}

.compare tbody tr:last-child th,
.compare tbody tr:last-child td { border-bottom: 0; }

.compare tbody tr:nth-child(even) td,
.compare tbody tr:nth-child(even) th { background: rgba(255, 255, 255, .022); }

.compare td[data-state="no"] { color: var(--fg-4); }



/* =============================================================================
   11. SECTEURS
   ============================================================================= */

.sector {
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.sector__title {
  font-size: 1.125rem;
  color: var(--fg);
}

.sector__desc {
  font-size: var(--fs-sm);
  color: var(--fg-3);
}



/* =============================================================================
   12. BANDE DE CHIFFRES CLÉS
   ============================================================================= */

.stats-band {
  position: relative;
  isolation: isolate;
  background: var(--void);
  overflow: hidden;
}

.stats-band > .container { position: relative; z-index: 1; }

.stats-band .grid { gap: var(--sp-6) var(--sp-5); }

.stat--lg {
  position: relative;
  padding: var(--sp-6) var(--sp-5);
  border-radius: var(--r-xl);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  text-align: center;
  transition: border-color var(--t), background var(--t), transform var(--t) var(--ease-out);
}

.stat--lg:hover {
  transform: translateY(-3px);
  background: var(--glass-2);
  border-color: var(--em-line);
}

.stat--lg .stat__num {
  font-size: clamp(2.75rem, 5vw, 4rem);
  background: linear-gradient(170deg, #FFFFFF 0%, var(--em-200) 62%, var(--em-400) 100%);
  -webkit-background-clip: text;
          background-clip: text;
  color: transparent;
}

@supports not ((-webkit-background-clip: text) or (background-clip: text)) {
  .stat--lg .stat__num { color: var(--em-200); background: none; }
}

.stat--lg .stat__label {
  font-size: var(--fs-sm);
  color: var(--fg-3);
  max-width: 26ch;
  margin-inline: auto;
}



/* =============================================================================
   13. SYSTÈMES
   ============================================================================= */

.system {
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.system__title {
  font-size: 1.1875rem;
  color: var(--fg);
}

.system__desc {
  font-size: var(--fs-sm);
  color: var(--fg-3);
  flex: 1;
}

.system__more {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  margin-top: var(--sp-2);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--em-200);
  text-decoration: none;
  transition: color var(--t-fast), gap var(--t-fast);
}

.system__more:hover { color: var(--em-100); gap: 12px; }



/* =============================================================================
   14. MÉTHODOLOGIE (ONGLETS + TIMELINE)
   ============================================================================= */

.method { position: relative; }

.tabs {
  display: inline-flex;
  gap: 4px;
  padding: 5px;
  margin: 0 auto clamp(var(--sp-7), 4vw, var(--sp-8));
  border-radius: var(--r-full);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  -webkit-backdrop-filter: blur(14px);
          backdrop-filter: blur(14px);
}

/* Le groupe d'onglets est centré ; c'est son conteneur qui le centre, pas une
   marge automatique sur un `inline-flex` (qui ne l'aurait pas centré). */
.method .tabs {
  display: flex;
  width: fit-content;
  max-width: 100%;
  flex-wrap: wrap;
  justify-content: center;
}

.tab {
  padding: 11px 24px;
  border-radius: var(--r-full);
  font-family: var(--ff);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--fg-3);
  cursor: pointer;
  white-space: nowrap;
  transition: color var(--t-fast), background var(--t), box-shadow var(--t);
}

.tab:hover { color: var(--fg); }

.tab.is-active {
  background: linear-gradient(180deg, var(--em-600), #1A5F45);
  color: #FFFFFF;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .18),
    0 8px 22px -10px rgba(47, 141, 102, .75);
}

.tabpanel { animation: panel var(--t-slow) both; }

@keyframes panel {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}

/* --- Timeline ---------------------------------------------------------------
   Un rail vertical unique, et sept jalons dessus. Le rail est un dégradé qui
   s'éteint en bas : la dernière étape n'a pas de suite. */
.timeline {
  position: relative;
  display: grid;
  gap: var(--sp-6);
  max-width: 900px;
  margin-inline: auto;
  padding-left: 62px;
  list-style: none;
}

.timeline::before {
  content: "";
  position: absolute;
  left: 25px;
  top: 12px;
  bottom: 40px;
  width: 1px;
  background: linear-gradient(180deg,
      var(--em-400) 0%,
      var(--em-line) 45%,
      transparent 100%);
}

.timeline__step {
  position: relative;
  padding: var(--sp-5) var(--sp-6);
  border-radius: var(--r-lg);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  transition: border-color var(--t), background var(--t), transform var(--t) var(--ease-out);
}

.timeline__step:hover {
  transform: translateX(4px);
  background: var(--glass-2);
  border-color: var(--em-line);
}

.step__num {
  position: absolute;
  left: -62px;
  top: 18px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 34px;
  border-radius: var(--r-full);
  background: var(--graphite);
  border: 1px solid var(--em-line);
  font-family: var(--ff-display);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: .02em;
  color: var(--em-200);
}

.timeline__step:hover .step__num {
  border-color: var(--em-400);
  box-shadow: 0 0 20px -4px rgba(70, 176, 133, .7);
}

.step__title {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-3);
  margin-bottom: var(--sp-2);
  font-size: 1.0625rem;
  color: var(--fg);
}

.step__title .badge {
  padding: 4px 11px;
  font-size: .75rem;
  color: var(--em-200);
  background: var(--em-soft);
  border-color: var(--em-line);
}

.step__desc {
  font-size: var(--fs-sm);
  color: var(--fg-3);
}



/* =============================================================================
   15. TÉMOIGNAGES
   ============================================================================= */

.testimonial {
  display: flex;
  flex-direction: column;
  gap: var(--sp-5);
  padding: clamp(var(--sp-5), 3vw, var(--sp-6));
  border-radius: var(--r-xl);
  background: var(--slate);
  border: 1px solid var(--glass-bd);
  box-shadow: var(--sh-1);
}

/* Le guillemet ouvrant, en très grand et très effacé. */
.testimonial::before {
  content: "\201C";
  font-family: var(--ff-display);
  font-size: 3.5rem;
  line-height: .8;
  color: var(--em-line);
}

.testimonial__quote {
  flex: 1;
  font-size: var(--fs-sm);
  color: var(--fg-2);
}

.testimonial__foot {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding-top: var(--sp-4);
  border-top: 1px solid var(--ridge);
}

.testimonial__name {
  display: block;
  font-weight: 600;
  font-size: var(--fs-sm);
  color: var(--fg);
}

.testimonial__role {
  display: block;
  font-size: var(--fs-xs);
  color: var(--fg-3);
}

.avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  flex: none;
  border-radius: var(--r-full);
  background: linear-gradient(150deg, var(--em-700), var(--em-900));
  border: 1px solid var(--em-line);
  font-family: var(--ff-display);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--em-200);
  overflow: hidden;
}

.avatar img { width: 100%; height: 100%; object-fit: cover; }



/* =============================================================================
   16. GARANTIES
   ============================================================================= */

.guarantee {
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.guarantee__title {
  font-size: 1.1875rem;
  color: var(--fg);
}

.guarantee__desc {
  font-size: var(--fs-sm);
  color: var(--fg-2);
}



/* =============================================================================
   17. RESSOURCES
   ============================================================================= */

.article {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  padding: 0 0 var(--sp-6);
  border-radius: var(--r-xl);
  background: var(--slate);
  border: 1px solid var(--glass-bd);
  box-shadow: var(--sh-1);
  overflow: hidden;
  transition: transform var(--t) var(--ease-out), border-color var(--t), box-shadow var(--t);
}

.article:hover {
  transform: translateY(-4px);
  border-color: var(--glass-bd-2);
  box-shadow: var(--sh-2);
}

.article__media {
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--night);
  border-bottom: 1px solid var(--glass-bd);
}

.article__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Les trois illustrations sont déjà des SVG vert nuit (#1D4536 → #24543F) :
     rien à inverser. On les assombrit juste assez pour qu'elles ne soient pas
     plus claires que la carte qui les porte. */
  filter: brightness(.86) saturate(1.05);
  transition: transform var(--t-slow) var(--ease-out), filter var(--t);
}

.article:hover .article__media img { filter: brightness(1) saturate(1.1); }

.article:hover .article__media img { transform: scale(1.04); }

.article__tag,
.article__title,
.article > p,
.article__link { padding-inline: clamp(var(--sp-5), 3vw, var(--sp-6)); }

.article__tag {
  margin-top: var(--sp-5);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--em-300);
}

.article__title {
  font-size: 1.1875rem;
  color: var(--fg);
}

.article > p {
  font-size: var(--fs-sm);
  color: var(--fg-3);
}

.article__link {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  margin-top: auto;
  padding-top: var(--sp-3);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--em-200);
  text-decoration: none;
  transition: color var(--t-fast), gap var(--t-fast);
}

.article__link:hover { color: var(--em-100); gap: 12px; }



/* =============================================================================
   18. CTA FINAL
   ============================================================================= */

.cta-final {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--void);
}

.cta-final__inner {
  position: relative;
  z-index: 1;
  max-width: 780px;
  text-align: center;
}

.cta-final .kicker { justify-content: center; }

.cta-final .section__title { font-size: var(--fs-h1); }

.cta-final .section__sub { margin-inline: auto; }

.cta-final__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--sp-4);
  margin-top: var(--sp-8);
}

.cta-final .u-muted { text-align: center; }



/* =============================================================================
   19. FOOTER + BOUTON WHATSAPP FLOTTANT
   ============================================================================= */

.footer {
  position: relative;
  isolation: isolate;
  padding-block: clamp(var(--sp-8), 6vw, var(--sp-9)) var(--sp-6);
  background: var(--void);
  border-top: 1px solid var(--ridge);
  color: var(--fg-3);
  font-size: var(--fs-sm);
  overflow: hidden;
}

.footer > .container { position: relative; z-index: 1; }

.footer__grid {
  display: grid;
  gap: var(--sp-7);
  grid-template-columns: minmax(280px, 1.6fr) repeat(auto-fit, minmax(150px, 1fr));
  padding-bottom: var(--sp-7);
  border-bottom: 1px solid var(--ridge);
}

.footer__brand { max-width: 42ch; }

.footer .logo { margin-bottom: var(--sp-4); }

.footer__baseline {
  margin-bottom: var(--sp-3);
  font-family: var(--ff-display);
  font-size: 1.0625rem;
  font-weight: 500;
  letter-spacing: -.02em;
  color: var(--fg);
}

.footer__contact {
  display: grid;
  gap: var(--sp-2);
  margin-top: var(--sp-5);
}

.footer__title {
  margin-bottom: var(--sp-6);
  font-family: var(--ff);
  font-size: var(--fs-kicker);
  font-weight: 600;
  letter-spacing: var(--ls-kicker);
  text-transform: uppercase;
  color: var(--fg);
}

.footer__list {
  display: grid;
  gap: var(--sp-3);
}

.footer__link {
  color: var(--fg-3);
  text-decoration: none;
  transition: color var(--t-fast);
}

.footer__link:hover {
  color: var(--em-200);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.social {
  display: flex;
  gap: var(--sp-3);
  margin-top: var(--sp-5);
}

.social__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: var(--r-full);
  background: var(--glass);
  border: 1px solid var(--glass-bd);
  color: var(--fg-2);
  transition: color var(--t), background var(--t), border-color var(--t), transform var(--t) var(--ease-out);
}

.social__link:hover {
  transform: translateY(-2px);
  color: var(--em-100);
  background: var(--em-soft);
  border-color: var(--em-line);
}

.social__link .icon { width: 18px; height: 18px; }

.footer__bottom {
  display: grid;
  gap: var(--sp-4);
  padding-top: var(--sp-6);
  font-size: var(--fs-xs);
  color: var(--fg-3);
}

.footer__bottom .footer__list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3) var(--sp-5);
}

/* --- WhatsApp -------------------------------------------------------------- */
.wa-float {
  position: fixed;
  right: 20px;
  bottom: 20px;
  z-index: 95;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  border-radius: var(--r-full);
  background: var(--wa);
  color: #FFFFFF;
  box-shadow: 0 12px 30px -8px rgba(37, 211, 102, .55);
  transition: transform var(--t) var(--ease-out), background var(--t), box-shadow var(--t);
}

.wa-float:hover {
  transform: translateY(-3px) scale(1.04);
  background: var(--wa-h);
  box-shadow: 0 18px 40px -10px rgba(37, 211, 102, .7);
}

.wa-float svg { width: 28px; height: 28px; }

/* Le bouton flotte au-dessus du pied de page : on lui réserve sa place. */
.cta-final { padding-bottom: calc(var(--sp-9) + 24px); }
.footer { padding-bottom: calc(var(--sp-6) + 80px); }



/* =============================================================================
   20. FORMULAIRE DE CONTACT
   ============================================================================= */

.contact-grid {
  display: grid;
  gap: var(--sp-6);
  grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr);
  align-items: start;
}

.contact-aside {
  display: grid;
  gap: var(--sp-5);
  position: sticky;
  top: calc(var(--header-h) + 24px);
}

.info-item {
  display: grid;
  gap: 3px;
  padding-block: var(--sp-3);
  border-bottom: 1px solid var(--ridge);
}

.info-item:last-child { border-bottom: 0; }

.info-item__label {
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--fg-3);
}

.info-item__value {
  font-size: var(--fs-sm);
  color: var(--fg);
}

.info-item__value a { color: var(--em-200); }

/* --- Champs ---------------------------------------------------------------- */
.form {
  display: grid;
  gap: var(--sp-5);
  margin-top: var(--sp-6);
}

.form fieldset {
  padding: 0;
  margin: 0;
  border: 0;
}

.form legend { padding: 0; }

.form__row {
  display: grid;
  gap: var(--sp-5);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
}

.form__group { display: grid; gap: var(--sp-2); }

.form__label {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--fg);
}

.form__req { color: var(--em-300); }

.form__input,
.form__select,
.form__textarea {
  width: 100%;
  padding: 13px 16px;
  border-radius: var(--r-sm);
  background: var(--slate-2);
  border: 1px solid var(--glass-bd-2);
  color: var(--fg);
  font-size: 1rem;   /* 16 px : empêche le zoom automatique d'iOS au focus */
  line-height: 1.5;
  transition: border-color var(--t-fast), background var(--t-fast), box-shadow var(--t-fast);
}

.form__input::placeholder,
.form__textarea::placeholder { color: var(--fg-4); }

.form__input:hover,
.form__select:hover,
.form__textarea:hover { border-color: var(--glass-bd-2); background: #1C2C24; }

.form__input:focus,
.form__select:focus,
.form__textarea:focus {
  outline: none;
  border-color: var(--em-400);
  background: #1C2C24;
  box-shadow: 0 0 0 3px var(--em-soft);
}

.form__textarea {
  min-height: 130px;
  resize: vertical;
}

/* La flèche native d'un <select> reste claire sur fond sombre selon les
   navigateurs : on la remplace par la nôtre. */
.form__select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 42px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23A3B8B2' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 18px;
}

/* Les options sont rendues par le système : on force la nuit, sinon elles
   arrivent en blanc sur blanc sous Windows. */
.form__select option {
  background: var(--slate-2);
  color: var(--fg);
}

/* --- Cases et boutons radio ------------------------------------------------- */
.form__group--check {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-3);
  padding: 12px 14px;
  border-radius: var(--r-sm);
  border: 1px solid var(--glass-bd);
  background: var(--glass);
  font-size: var(--fs-sm);
  color: var(--fg-2);
  cursor: pointer;
  transition: border-color var(--t-fast), background var(--t-fast);
}

.form__group--check:hover {
  border-color: var(--em-line);
  background: var(--glass-2);
}

.form__group--check input {
  width: 18px;
  height: 18px;
  flex: none;
  margin-top: 2px;
  accent-color: var(--em-500);
  cursor: pointer;
}

.form__group--check:has(input:checked) {
  border-color: var(--em-400);
  background: var(--em-soft);
  color: var(--fg);
}

.form__hint {
  font-size: var(--fs-xs);
  color: var(--fg-3);
}

/* Les erreurs ne sont jamais « rouge seul » : un pictogramme les précède,
   pour un visiteur qui ne distingue pas les couleurs. */
.form__error {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--fs-xs);
  font-weight: 500;
  color: #FF9E8A;
}

.form__error::before {
  content: "!";
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 15px;
  height: 15px;
  flex: none;
  border-radius: var(--r-full);
  background: #FF9E8A;
  color: var(--fg-inv);
  font-size: 11px;
  font-weight: 700;
  line-height: 1;
}

.form__error[hidden] { display: none; }

[aria-invalid="true"] {
  border-color: #FF9E8A !important;
  box-shadow: 0 0 0 3px rgba(255, 158, 138, .14) !important;
}

.form__status {
  padding: 13px 16px;
  margin-top: var(--sp-4);
  border-radius: var(--r-sm);
  font-size: var(--fs-sm);
  border: 1px solid var(--glass-bd);
  background: var(--glass);
  color: var(--fg-2);
}

.form__status.is-success {
  border-color: var(--em-line);
  background: var(--em-soft);
  color: var(--em-100);
}

.form__status.is-error {
  border-color: rgba(255, 158, 138, .5);
  background: rgba(255, 158, 138, .10);
  color: #FFC4B6;
}

.form__status.is-pending {
  border-color: var(--glass-bd-2);
  color: var(--fg-2);
}

.form__status[hidden] { display: none; }

.form__foot { display: grid; gap: var(--sp-3); }

/* --- Bloc rendez-vous ------------------------------------------------------- */
.calendly-ph {
  display: grid;
  gap: var(--sp-3);
  justify-items: center;
  padding: var(--sp-7) var(--sp-5);
  border-radius: var(--r-lg);
  border: 1px dashed var(--glass-bd-2);
  background: var(--glass);
  text-align: center;
}

.calendly-ph .icon,
.calendly-ph > svg { width: 30px; height: 30px; color: var(--em-300); }

.calendly-ph strong {
  font-family: var(--ff-display);
  font-size: 1.0625rem;
  letter-spacing: -.02em;
  color: var(--fg);
}

.calendly-ph p { font-size: var(--fs-sm); color: var(--fg-3); }



/* =============================================================================
   21. UTILITAIRES
   ============================================================================= */

.u-center { text-align: center; }
.u-left   { text-align: left; }
.u-flex   { display: flex; }
.u-wrap   { flex-wrap: wrap; }
.u-muted  { color: var(--fg-3); font-size: var(--fs-sm); }
.u-nowrap { white-space: nowrap; }
.u-full   { width: 100%; }

.u-mt-4 { margin-top: var(--sp-4); }
.u-mt-6 { margin-top: var(--sp-6); }
.u-mt-7 { margin-top: var(--sp-7); }

/* Empêche une grille en `1fr` de déborder à cause d'un enfant indéformable
   (tableau, image large, mot très long). */
.section > .container,
.hero > .container,
.footer > .container { min-width: 0; }



/* =============================================================================
   22. RESPONSIVE — mobile first : 480 / 768 / 1024 / 1280
   ============================================================================= */

/* --- < 1024 px : la navigation passe en tiroir ------------------------------ */
@media (max-width: 1023px) {

  .burger { display: inline-flex; }

  .nav {
    position: fixed;
    inset: 0 0 0 auto;
    z-index: 75;
    width: min(340px, 86vw);
    margin-left: 0;
    padding: calc(var(--header-h) + var(--sp-7)) var(--sp-6) var(--sp-7);
    background: var(--night);
    border-left: 1px solid var(--ridge);
    box-shadow: -30px 0 70px -20px rgba(0, 0, 0, .9);
    transform: translateX(100%);
    transition: transform var(--t-slow);
    overflow-y: auto;
    overscroll-behavior: contain;
  }

  /* Fermé, le tiroir est simplement poussé hors champ : ses liens restaient
     donc accessibles à la tabulation, et le curseur partait se poser sur un
     menu invisible. isibility les retire vraiment du parcours ; le délai
     de transition la laisse active le temps que le tiroir soit sorti. */
  .nav { visibility: hidden; transition: transform var(--t-slow), visibility 0s linear .5s; }
  .nav.is-open { transform: translateX(0); visibility: visible; transition: transform var(--t-slow), visibility 0s; }

  .nav__list {
    flex-direction: column;
    align-items: stretch;
    gap: var(--sp-1);
  }

  .nav__link {
    display: block;
    padding: 14px 16px;
    border-radius: var(--r-sm);
    font-size: 1.0625rem;
    border-bottom: 1px solid var(--ridge);
  }

  /* Le numéro de téléphone du bandeau d'actions n'a pas sa place à côté du
     burger sur un petit écran : il est déjà dans le pied de page et dans le
     tiroir. */
  .header__actions > .nav__link { display: none; }

  .header__inner { padding-left: 16px; }

  .contact-grid { grid-template-columns: 1fr; }
  .contact-aside { position: static; }
}

/* --- < 768 px --------------------------------------------------------------- */
@media (max-width: 767px) {

  :root {
    --gutter: 18px;
    --header-h: 68px;
    --header-block: 70px;
    --hero-foot: 64px;
  }

  .header { top: 8px; margin-top: 8px; }

  .header__actions .btn {
    padding: 10px 16px;
    font-size: var(--fs-xs);
  }

  /* Piste d'épinglage plus courte : sur mobile, une longue phase où la page
     « ne bouge pas » est mal vécue, et le décodage vidéo y coûte plus cher.
     220 % au lieu de 320 % — la vidéo défile donc plus vite au doigt. */
  /* Piste plus courte qu'en paysage, mais la vitesse reste douce : la
     fenetre etant plus haute, 340 % donnent une course comparable. */
  .hero { height: 340svh; }

  /* Le pied doit valoir --hero-foot, sinon le socle de chiffres n'a pas
     de place reservee et vient recouvrir les boutons. */
  .hero__stage { padding-block: calc(var(--header-block) + var(--sp-4)) var(--hero-foot); }

  /* En portrait, un 21:9 ne ferait qu'un filet de 167 px de haut. Le bandeau
     passe donc en 4:5, servi par la variante verticale de la video. */
  .hero__media {
    aspect-ratio: 4 / 5;
    max-height: 58svh;
  }

  .hero__media::before,
  .hero__media::after { height: 20%; }

  .hero__stats { bottom: clamp(var(--sp-5), 3svh, var(--sp-6)); }

  .hero h1 { max-width: none; }

  /* Les quatre preuves prenaient 161 px sur 844 : trop cher pour un ecran
     de telephone, ou la scene doit tenir titre + promesse + action. Elles
     restent lisibles plus bas dans la page. */
  .hero__badges { display: none; }

  .hero__actions .btn { width: 100%; }

  /* Le socle passe en deux colonnes : quatre chiffres côte à côte sur 360 px
     donneraient des libellés de deux mots par ligne. */
  /* Une rangee unique qui se fait glisser au doigt, plutot qu'une grille
     2x2 de 254 px de haut. Les quatre chiffres restent tous accessibles,
     et la scene retrouve 140 px. */
  .hero__stats {
    grid-auto-flow: column;
    grid-auto-columns: 62%;
    grid-template-columns: none;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    overscroll-behavior-x: contain;
    bottom: clamp(18px, 3svh, 30px);
    scrollbar-width: none;
  }

  .hero__stats::-webkit-scrollbar { display: none; }

  .hero__stats .stat {
    scroll-snap-align: start;
    padding: var(--sp-4) var(--sp-3);
  }

  .hero__cue { display: none; }

  .challenge {
    grid-template-columns: 1fr;
    gap: var(--sp-4);
  }

  .timeline { padding-left: 0; }
  .timeline::before { display: none; }

  .step__num {
    position: static;
    margin-bottom: var(--sp-3);
  }

  .footer__grid { grid-template-columns: 1fr; gap: var(--sp-6); }

  .logo-ph--real { height: 82px; min-width: 148px; }
  .logo-ph--real img { max-height: 52px; }

  .logo-ph { height: 54px; min-width: 138px; }

  .wa-float { right: 14px; bottom: 14px; width: 52px; height: 52px; }
}

/* --- < 480 px --------------------------------------------------------------- */
@media (max-width: 479px) {

  .announce { font-size: .75rem; }
  .announce__link { display: block; margin-left: 0; margin-top: 2px; }

  .logo__text { font-size: 1.125rem; }

  .offer,
  .card,
  .challenge { padding: var(--sp-5); }

  .hero__stats .stat { padding: var(--sp-5) var(--sp-3); }

  .tabs { width: 100%; }
  .tab { flex: 1; padding-inline: var(--sp-3); }
}

/* --- ≥ 1280 px -------------------------------------------------------------- */
@media (min-width: 1280px) {
  .grid--4 { grid-template-columns: repeat(4, 1fr); }
  .grid--3 { grid-template-columns: repeat(3, 1fr); }
}

/* Écrans très larges : la vidéo du héros ne doit pas se retrouver rognée à
   une bande centrale sans lecture possible. */
@media (min-aspect-ratio: 21/9) {
  .hero__video { object-position: 50% 40%; }
}

/* Paysage court (telephone couche) : la scene doit tenir sans que le titre
   chevauche les chiffres. On raccourcit la piste et on allege le bloc. */
@media (max-height: 560px) and (orientation: landscape) {
  .hero { height: 240svh; }
  .hero__stage { padding-block: calc(var(--header-block) + var(--sp-2)) var(--sp-4); }
  .hero__badges,
  .hero__stats { display: none; }
}



/* =============================================================================
   23. MOUVEMENT RÉDUIT, CONTRASTE FORCÉ ET IMPRESSION
   ============================================================================= */

/* --- Le visiteur a demandé moins d'animations ------------------------------
   Tout s'arrête : apparitions, compteurs, marquee, aurore, vidéo. Rien ne
   disparaît pour autant — c'est le mouvement qu'on retire, pas le contenu. */
@media (prefers-reduced-motion: reduce) {

  html { scroll-behavior: auto; }

  *,
  *::before,
  *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }

  .reveal,
  .js-reveal .reveal:not(.is-visible) {
    opacity: 1 !important;
    transform: none !important;
  }

  .marquee__track { animation: none; transform: none; }

  /* Le ruban devient une rangée qui déborde et se fait défiler à la main. */
  .marquee {
    overflow-x: auto;
    -webkit-mask-image: none;
            mask-image: none;
  }
  .marquee__track { width: auto; }

  /* Pas d'epinglage : le heros redevient une section normale, haute d'un
     ecran, et le contenu ne bouge plus. Sans ca, le visiteur traverserait
     320 % de hauteur pour une scene immobile. */
  .hero {
    height: auto;
    min-height: 0;
  }

  .hero__stage {
    position: static;
    height: auto;
    min-height: clamp(560px, 86svh, 860px);
  }

  .hero__inner {
    opacity: 1 !important;
    transform: none !important;
    will-change: auto;
  }

  .hero__exit { opacity: 0 !important; }

  /* Plus d'epinglage : les chiffres reviennent dans le flux, sous les
     actions, au lieu de flotter au pied d'une scene qui ne bouge plus. */
  .hero__stats {
    position: static;
    transform: none !important;
    opacity: 1 !important;
    width: 100%;
    margin-top: var(--sp-8);
  }

  .hero__stage { flex-direction: column; justify-content: center; }

  .hero__media { position: absolute; }
  .hero__cue span[aria-hidden] { animation: none; }
  .progress { display: none; }

  /* L'animation d'entrée ne joue pas : son masque ne doit pas rester. */
  .entry-pending .hero__inner > * { opacity: 1 !important; }
}

/* --- Contraste renforcé ------------------------------------------------------
   Le verre disparaît : les surfaces deviennent pleines et les bordures nettes.
   Un mode contrasté et une transparence à 4 % ne vont pas ensemble. */
@media (prefers-contrast: more) {

  :root {
    --glass:      rgba(255, 255, 255, .10);
    --glass-2:    rgba(255, 255, 255, .14);
    --glass-bd:   rgba(255, 255, 255, .30);
    --glass-bd-2: rgba(255, 255, 255, .45);
    --fg-2: #E8F0ED;
    --fg-3: rgba(232, 240, 237, .82);
  }

  .card,
  .offer,
  .challenge,
  .testimonial,
  .article { background: var(--slate-2); }

  /* Le verre disparait : les voiles deviennent quasi pleins et la video
     n'est plus qu'un souvenir derriere le texte. Un mode contraste et une
     video qui bouge sous les paragraphes ne vont pas ensemble. */
  .hero__scrim {
    background: linear-gradient(180deg, rgba(5, 9, 8, .90), rgba(5, 9, 8, .96));
  }

  /* Les sections sont déjà opaques : rien à renforcer de ce côté. */
}

/* --- Impression -------------------------------------------------------------
   Le site est une nuit ; le papier est blanc. On repart d'un noir sur blanc
   complet plutôt que d'imprimer un aplat sombre sur trois pages. */
@media print {

  :root {
    --fg: #111111;
    --fg-2: #333333;
    --fg-3: #555555;
    --graphite: #FFFFFF;
  }

  body {
    background: #FFFFFF;
    color: #111111;
    font-size: 11pt;
  }

  body::after { display: none; }

  .announce,
  .header,
  .nav-overlay,
  .wa-float,
  .hero__media,
  .hero__scrim,
  .hero__exit,
  .hero__grain,
  .hero__cue,
  .progress,
  .marquee,
  .social,
  .skip-link { display: none !important; }

  .hero,
  .page-hero {
    min-height: auto;
    margin-top: 0;
    padding-block: 0 var(--sp-6);
    background: #FFFFFF;
  }

  .page-hero::before,
  .page-hero::after { display: none; }

  .hero h1,
  .hero h1 em,
  .stat__num,
  .stat--lg .stat__num {
    color: #111111 !important;
    -webkit-text-fill-color: #111111;
    background: none;
  }

  .hero .section__sub,
  .stat__label { color: #333333; }

  .section,
  .section--muted,
  .section--dark,
  .stats-band,
  .cta-final,
  .footer {
    background: #FFFFFF !important;
    color: #111111;
    padding-block: var(--sp-6);
  }

  .card,
  .offer,
  .challenge,
  .testimonial,
  .article,
  .timeline__step,
  .hero__stats,
  .stat--lg,
  .guarantee-box {
    background: #FFFFFF !important;
    border: 1px solid #BBBBBB !important;
    box-shadow: none !important;
    break-inside: avoid;
  }

  .btn { border: 1px solid #111111 !important; background: none !important; color: #111111 !important; }

  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 9pt; color: #666666; }

  .section + .section::before,
  .section--muted::before,
  .section--dark::before,
  .stats-band::before,
  .stats-band::after,
  .cta-final::before,
  .cta-final::after,
  .footer::before { display: none; }
}
