/* Syneloria — styles. Extrait de index.html (CSS externalisé). */
@font-face{font-family:'Fraunces';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/fraunces-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Fraunces';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/fraunces-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Fraunces';font-style:normal;font-weight:500;font-display:swap;src:url(fonts/fraunces-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Fraunces';font-style:normal;font-weight:500;font-display:swap;src:url(fonts/fraunces-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Fraunces';font-style:italic;font-weight:400;font-display:swap;src:url(fonts/fraunces-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Fraunces';font-style:italic;font-weight:400;font-display:swap;src:url(fonts/fraunces-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Fraunces';font-style:italic;font-weight:500;font-display:swap;src:url(fonts/fraunces-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Fraunces';font-style:italic;font-weight:500;font-display:swap;src:url(fonts/fraunces-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/playfair-display-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/playfair-display-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:500;font-display:swap;src:url(fonts/playfair-display-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:500;font-display:swap;src:url(fonts/playfair-display-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:400;font-display:swap;src:url(fonts/playfair-display-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:400;font-display:swap;src:url(fonts/playfair-display-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:500;font-display:swap;src:url(fonts/playfair-display-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:italic;font-weight:500;font-display:swap;src:url(fonts/playfair-display-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:400;font-display:swap;src:url(fonts/cormorant-garamond-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:400;font-display:swap;src:url(fonts/cormorant-garamond-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:500;font-display:swap;src:url(fonts/cormorant-garamond-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:500;font-display:swap;src:url(fonts/cormorant-garamond-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/inter-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/inter-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
:root{
  --ink:#183542;
  --ink-2:#0e2230;
  --cream:#F6F1EA;
  --cream-dim:rgba(246,241,234,.55);
  --ink-dim:rgba(24,53,66,.55);
  --gold:#C9A86A;
  /* « Or poli » pour les boutons : reflet clair en haut → or profond en bas,
     + liseré brillant interne, pour un rendu métallique/brillant plutôt que plat. */
  --gold-grad:       linear-gradient(180deg, #e9ce92 0%, #cdac6e 46%, #b18e4c 100%);
  --gold-grad-hover: linear-gradient(180deg, #f3daa2 0%, #d8bb80 46%, #bd9a58 100%);
  --gold-sheen:      inset 0 1px 0 rgba(255,255,255,.5), inset 0 -2px 3px rgba(120,88,38,.2);
  /* Or « brillant » pour les mots mis en valeur du corps (em) : bords or
     profond → reflet clair au centre (bande de lumière diagonale), appliqué au
     texte via background-clip. Rendu métallique plutôt qu'aplat uni. */
  --gold-text:       linear-gradient(100deg, #b58f52 0%, #cba76a 36%, #ddc488 50%, #cba76a 64%, #b58f52 100%);
  /* Wordmarks « Syneloria » (menu, footer, tagline) : identité du logo,
     reste en Cormorant quelle que soit la police des titres. */
  --serif-title:"Cormorant Garamond", "Times New Roman", serif;
  /* Titres de sections/pages, particules comprises : le canvas échantillonne
     la police CALCULÉE du titre, il suit donc cette variable automatiquement
     (aucune retouche JS nécessaire pour changer de police).
     ── POLICE TRANCHÉE (17/08/2026) : Playfair Display 400 roman ──
        Seules ses graisses 400/500 (roman + italique) sont encore chargées
     par les @font-face en tête de cette feuille ; les candidates de l'essai
     (Prata, DM Serif Display, Bodoni Moda, Space Grotesk, Sora, Outfit, Syne,
     Unbounded, Genos) en ont été retirées. Pour en réessayer une : déposer ses
     woff2 dans fonts/, ajouter ses @font-face en tête de cette feuille, PUIS
     changer la ligne ci-dessous.
        Astuce : --title-style:italic pour rester dans l'esprit du Cormorant.
        Origine : --title-font:var(--serif-title); --title-weight:500; --title-style:italic; */
  --title-font:"Playfair Display", "Cormorant Garamond", serif;
  --title-weight:400;
  --title-style:normal;   /* essayer 'italic' pour un rendu plus proche du thème actuel */
  /* Texte de lecture : serif moderne, plus présente et lisible en petit. */
  --serif:"Fraunces", "Cormorant Garamond", "Times New Roman", serif;
  --sans:"Inter", -apple-system, BlinkMacSystemFont, sans-serif;
  --t-dur: 3000ms;
  --t-ease: cubic-bezier(.78, 0, .22, 1);

  /* ===== Échelle typographique des titres à particules =====
     Un clamp() par cran, couvrant mobile → desktop (aucune surcharge
     responsive à maintenir). Chaque titre est assigné à un cran selon sa
     LIGNE LA PLUS LONGUE — un titre long reste dans un petit cran pour ne
     pas déborder en largeur sur mobile.
       display : Hero « Syneloria » (unique, échantillonné sur le logo SVG)
       lg      : TOUTES les sections (anciens crans xl et compact fusionnés
                 ici ; le repli « compact » d'Engagements sur écran bas a été
                 retiré à l'essai — à réintroduire si la section déborde)     */
  /* Facteur global de taille des TITRES DE SECTION (essai en cours).
     1 = taille d'origine ; 0.9 ≈ 10 % plus petit. Un seul chiffre à régler.
     N'affecte PAS le hero « Syneloria » (voir --title-display ci-dessous). */
  --title-scale: 0.9;
  /* Hero « Syneloria » (logo SVG échantillonné) : sa TAILLE pilote aussi la
     largeur du logo (app.js : ×3.6) → volontairement HORS --title-scale. */
  --title-display: clamp(60px, 14vw, 200px);
  --title-lg:      calc(clamp(32px, 4.7vw, 62px) * var(--title-scale));   /* TOUTES les sections */
}

*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-font-smoothing:antialiased}
/* 100svh (PETIT viewport iOS : barre Safari déployée) avec repli 100vh :
   sur iPhone, 100vh vise le GRAND viewport (barre repliée) — or ces pages
   n'ont pas de scroll natif, la barre ne se replie jamais → les sections
   débordaient sous le bas de l'écran (défaut relevé par Allan). */
html.full-page, html.full-page body{
  height:100vh;
  height:100svh;
  overflow:hidden;
}
body{
  background:var(--ink);
  color:var(--cream);
  font-family:var(--sans);
}
/* SÉLECTION DE TEXTE — surlignage DORÉ, texte encre, partout.
   L'ancienne règle peignait le fond de la sélection en var(--ink) : sur les
   sections claires elle se voyait très bien, mais sur les sections sombres
   (peintes exactement dans cette même encre par le canvas) elle était
   littéralement INVISIBLE — on sélectionnait sans rien voir (constat d'Allan,
   27/08/2026 : « parfois on voit quand ça surligne, d'autres fois non »).
   L'or est le seul ton du site qui tranche à la fois sur l'encre et sur le
   crème, d'où une règle unique plutôt qu'une par tonalité (impossible à tenir :
   le sombre vient tantôt d'une section, tantôt du pied, de l'overlay de menu,
   du canvas…). `color` est REDONNÉ ici à dessein : il rend leur opacité aux
   mots dorés en `background-clip:text` (color:transparent), qui autrement
   disparaissaient sous le surlignage. */
::selection{background:var(--gold);color:var(--ink);-webkit-text-fill-color:var(--ink)}
::-moz-selection{background:var(--gold);color:var(--ink)}
/* Seule exception : les surfaces DÉJÀ dorées (boutons, pastille CONTACT du
   menu). Un surlignage doré sur un fond doré ne se verrait pas davantage que
   l'encre sur l'encre corrigée ci-dessus — on inverse donc le couple. */
.btn-gold::selection, .btn-gold ::selection,
.menu-link--cta::selection, .menu-link--cta ::selection{
  background:var(--ink);
  color:var(--gold);
  -webkit-text-fill-color:var(--gold);
}
.btn-gold::-moz-selection, .btn-gold ::-moz-selection,
.menu-link--cta::-moz-selection, .menu-link--cta ::-moz-selection{
  background:var(--ink);
  color:var(--gold);
}

/* ===== Canvas global fixé ===== */
/* Deux canvas superposés :
   - #c-bg (z1) : dust ambiant + fonds de section peints, DERRIÈRE le contenu.
   - #c    (z5) : titres à particules + halos, DEVANT le contenu.
   Le contenu (.pages, z2) est pris en sandwich entre les deux. */
canvas#c,
canvas#c-bg{
  position:fixed;
  inset:0;
  width:100vw;height:100vh;
  pointer-events:none;
  display:block;
}
canvas#c{z-index:5}
canvas#c-bg{z-index:1}

/* ===== Wrapper qui glisse ===== */
.pages{
  position:relative;
  width:100%;
  z-index:2;
  will-change:transform;
  /* Mode « 60 partout » (app.js, SLIDE_JS) : le glissement est joué par la
     boucle des particules, qui pose transition:none en ligne — cette règle ne
     joue plus qu'en ancien mode (SLIDE_JS = false). --t-dur / --t-ease restent
     la source unique de la durée et de la courbe (lues par app.js). */
  transition:transform var(--t-dur) var(--t-ease);
}
/* En mode JS (full-page), les fonds de section sont peints sur le canvas
   d'arrière-plan → sections transparentes pour laisser voir le dust
   derrière le contenu. Sans JS, les fonds CSS opaques ci-dessous restent
   actifs (le canvas ne tourne pas). */
html.full-page .page{background:transparent}

/* ===== Une page = un écran VISIBLE exact (100svh, repli 100vh — cf. la
   note sur html.full-page) ===== */
.page{
  position:relative;
  width:100%;
  height:100vh;
  height:100svh;
  /* Débordement vertical (contenu plus haut que l'écran, surtout sur écrans
     bas) : on autorise le défilement INTERNE de la section au lieu de couper.
     Les gestionnaires molette/tactile laissent scroller la section puis ne
     changent de section qu'une fois arrivé au bord (voir app.js). */
  overflow-y:auto;
  overflow-x:hidden;
  overscroll-behavior:contain;
  scrollbar-width:none;              /* masque la scrollbar (Firefox) */
  isolation:isolate;
}
.page::-webkit-scrollbar{display:none}   /* masque la scrollbar (WebKit) */
/* Section ENTIÈREMENT hors écran (classe posée par app.js d'après les bornes
   réelles) : toutes ses animations CSS sont mises en pause — nébuleuse de fond,
   carrousel « à propos », bandeau des références, trait « scrollez »… Elles
   reprennent là où elles en étaient dès qu'un pixel de la section revient à
   l'écran (donc pendant tout le glissement) : strictement rien de visible ne
   change. Perf mesurée par Allan (Task Manager Chrome, 16/08/2026) : ces
   animations forçaient une image à 120 Hz en continu, ~7 % de CPU. */
.page.is-offscreen,
.page.is-offscreen::before,
.page.is-offscreen *,
.page.is-offscreen *::before,
.page.is-offscreen *::after{
  animation-play-state:paused !important;
}
/* Défilement interne pour TOUTES les sections (plusieurs posent leur propre
   overflow:hidden → on l'emporte via la spécificité doublée .page.page--x). */
.page.page--dark, .page.page--light, .page.page--statement, .page.page--services,
.page.page--edge, .page.page--trust, .page.page--team, .page.page--cta{
  overflow-y:auto;
  overflow-x:hidden;
}
/* Centrage "safe" : centré si le contenu tient, aligné en haut s'il déborde —
   sinon le haut passerait au-dessus du bord et serait inatteignable au scroll. */
.page.page--dark, .page.page--services, .page.page--edge,
.page.page--trust, .page.page--team{
  justify-content:safe center;
}
.page.page--light, .page.page--statement{
  align-items:safe center;
}
/* Fonds décoratifs (::before) : origine du transform ancrée EN BAS. Datait de
   l'animation « float » (scale ancré en bas → aucun faux débordement sous une
   section devenue défilable) ; les nébuleuses sont FIGÉES depuis le 16/08/2026
   (cf. .page--dark::before), la règle est conservée par prudence, sans effet. */
.page--dark::before, .page--statement::before, .page--edge::before,
.page--trust::before, .page--cta::before{
  transform-origin:50% 100%;
}

/* ===== « Nos réalisations » — grille d'emplacements 16/9 (Vidéos IA) =========
   Cinq cadres 16/9. Le PREMIER porte la vidéo (.real-slot--video) ; les quatre
   autres sont des emplacements VIDES (cadre pointillé crème + pictogramme
   pellicule), à remplir plus tard. Rangée de 5 en desktop, 3 puis 2 en étroit. */
.real-grid{
  display:grid;
  grid-template-columns:repeat(5, 1fr);
  gap:14px;
  width:100%;
  max-width:min(1080px, 100%);
  margin:32px auto 0;
}
.real-slot{
  aspect-ratio:16 / 9;
  border-radius:14px;
  border:1px dashed rgba(246,241,234,.26);
  background:rgba(246,241,234,.045);
  display:flex;
  align-items:center;
  justify-content:center;
  color:rgba(246,241,234,.34);
  overflow:hidden;               /* clippe la vidéo aux coins arrondis */
}
.real-slot svg{ width:26px; height:26px; }
/* Emplacement rempli par la vidéo : cadre plein (plus pointillé), fond encre. */
.real-slot--video{
  border-style:solid;
  border-color:rgba(246,241,234,.14);
  background:var(--ink);
}
.real-video{ width:100%; height:100%; object-fit:cover; display:block; }
/* L'emplacement vidéo est un BOUTON (ouvre le popup) : réinitialisation. */
.real-slot--video{
  position:relative;
  padding:0;
  cursor:pointer;
  appearance:none;
  -webkit-appearance:none;
  font:inherit;
  transition:transform .38s cubic-bezier(.2,.7,.3,1), box-shadow .38s ease, border-color .3s ease;
}
/* Survol : la vignette s'agrandit un peu et se détache ; un scrim la fonce pour
   faire ressortir le bouton play (révélé au survol UNIQUEMENT). */
.real-slot--video:hover,
.real-slot--video:focus-visible{
  transform:scale(1.05);
  z-index:3;
  border-color:rgba(246,241,234,.3);
  box-shadow:0 26px 64px -26px rgba(0,0,0,.62);
}
.real-slot--video::after{                       /* scrim de survol, entre vidéo et play */
  content:"";
  position:absolute;
  inset:0;
  background:radial-gradient(62% 62% at 50% 50%, rgba(9,20,26,.18), rgba(9,20,26,.54));
  opacity:0;
  transition:opacity .35s ease;
  pointer-events:none;
}
.real-slot--video:hover::after,
.real-slot--video:focus-visible::after{ opacity:1; }

/* Bouton « lecture » — caché par défaut, révélé au survol. Verre dépoli, liseré
   doré (charte), triangle crème optiquement recentré. */
.real-play{
  position:absolute;
  inset:0;
  margin:auto;
  z-index:2;
  width:60px;
  height:60px;
  border-radius:50%;
  display:flex;
  align-items:center;
  justify-content:center;
  color:var(--cream);
  /* Disque en dégradé (assez opaque pour être net sur n'importe quelle image),
     liseré doré, halo doux qui le sépare d'un fond clair, et un léger éclat
     interne en haut pour le relief. Le blur est un bonus (navigateurs qui le
     gèrent) — le rendu tient sans lui. */
  background:radial-gradient(circle at 50% 36%, rgba(32,60,74,.94), rgba(9,20,26,.94));
  border:1.5px solid rgba(201,168,106,.92);     /* liseré doré (--gold) */
  box-shadow:
    0 16px 36px -12px rgba(0,0,0,.62),
    0 0 0 7px rgba(9,20,26,.16),
    inset 0 1px 0 rgba(246,241,234,.18);
  -webkit-backdrop-filter:blur(4px);
  backdrop-filter:blur(4px);
  opacity:0;
  transform:scale(.8);
  transition:opacity .3s ease, transform .42s cubic-bezier(.2,.8,.25,1), box-shadow .3s ease;
  pointer-events:none;                          /* le clic passe au bouton */
}
.real-slot--video:hover .real-play,
.real-slot--video:focus-visible .real-play{
  opacity:1;
  transform:scale(1);
}
.real-play svg{
  width:24px;
  height:24px;
  margin-left:3px;                              /* triangle recentré optiquement */
  filter:drop-shadow(0 1px 2px rgba(0,0,0,.5));
}
/* Tactile (pas de survol possible) : le bouton reste visible en permanence. */
@media (hover: none){
  .real-play{ opacity:1; transform:none; }
}
@media (max-width:700px){
  .real-play{ width:48px; height:48px; }
  .real-play svg{ width:19px; height:19px; }
}
/* Confort de mouvement : on garde la révélation (opacité) mais sans agrandissement. */
@media (prefers-reduced-motion: reduce){
  .real-slot--video{ transition:box-shadow .2s ease, border-color .2s ease; }
  .real-slot--video:hover,
  .real-slot--video:focus-visible{ transform:none; }
  .real-play,
  .real-slot--video:hover .real-play,
  .real-slot--video:focus-visible .real-play{ transform:none; transition:opacity .2s ease; }
}
@media (max-width:1023px){ .real-grid{grid-template-columns:repeat(3, 1fr)} }
@media (max-width:700px){ .real-grid{grid-template-columns:repeat(2, 1fr); gap:10px; margin-top:22px} }

/* ===== Popup vidéo (popover natif) ========================================= */
.video-pop{
  position:fixed;
  inset:0;
  margin:auto;                         /* recentre : le reset écrase le margin:auto UA */
  width:min(1080px, 92vw);
  height:max-content;
  max-height:92vh;
  padding:0;
  border:0;
  background:transparent;
  overflow:visible;
  /* Agrandissement vignette → popup (et réduction à la fermeture). --flip-from
     est posée par videos-ia.js (translate+scale depuis la vignette réelle) ;
     `allow-discrete` sur display/overlay garde le popup rendu pendant l'animation
     de fermeture. Fallback gracieux (instantané) sur navigateurs sans support. */
  transform:none;
  opacity:1;
  will-change:transform;
  transition:
    transform .40s cubic-bezier(.2,.75,.25,1),
    opacity .30s ease,
    overlay .40s allow-discrete,
    display .40s allow-discrete;
}
/* État de DÉPART à l'ouverture (@starting-style) et état FERMÉ : réduit et posé
   sur la vignette. */
@starting-style{
  .video-pop:popover-open{ transform:var(--flip-from, scale(.22)); opacity:.35; }
}
.video-pop:not(:popover-open){ transform:var(--flip-from, scale(.22)); opacity:0; }

.video-pop::backdrop{
  background:rgba(9,20,26,.85);
  transition:opacity .34s ease, overlay .34s allow-discrete, display .34s allow-discrete;
}
@starting-style{ .video-pop:popover-open::backdrop{ opacity:0; } }
.video-pop:not(:popover-open)::backdrop{ opacity:0; }

/* Confort de mouvement : simple fondu, pas d'agrandissement. */
@media (prefers-reduced-motion: reduce){
  .video-pop{ transition:opacity .2s ease, overlay .2s allow-discrete, display .2s allow-discrete; }
  @starting-style{ .video-pop:popover-open{ transform:none; opacity:0; } }
  .video-pop:not(:popover-open){ transform:none; }
}
.video-pop-media{
  display:block;
  width:100%;
  aspect-ratio:16 / 9;
  max-height:86vh;
  object-fit:contain;
  border-radius:16px;
  background:#000;
  box-shadow:0 40px 120px -28px rgba(0,0,0,.85);
}
.video-pop-close{
  position:absolute;
  top:12px;
  right:12px;
  width:40px;
  height:40px;
  border-radius:50%;
  border:1px solid rgba(246,241,234,.4);
  background:rgba(9,20,26,.72);
  color:var(--cream);
  cursor:pointer;
  display:flex;
  align-items:center;
  justify-content:center;
  transition:background .25s ease;
}
.video-pop-close:hover{ background:rgba(9,20,26,.95); }
.video-pop-close svg{ width:20px; height:20px; }

/* Page dark (hero) */
.page--dark{
  background:var(--ink);
  color:var(--cream);
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  padding:80px 24px;
}
.page--dark::before{
  content:"";position:absolute;inset:-20% -20% 0 -20%;z-index:0;pointer-events:none;
  background:
    radial-gradient(ellipse at 50% 50%, rgba(201,168,106,.06) 0%, transparent 60%),
    radial-gradient(ellipse at 30% 70%, rgba(246,241,234,.02) 0%, transparent 50%);
}
/* ⚠️ NÉBULEUSES FIGÉES (Allan, 16/08/2026) — ne pas ré-animer. Les cinq fonds
   décoratifs (::before des sections dark/statement/edge/trust/cta) glissaient
   en boucle : `@keyframes float` = translate(-2%,1%) scale(1.04) sur 24 à 30 s,
   soit ~2,5 px/s à 6 % d'opacité — imperceptible. Mais un calque plein écran
   (1,7 fois la fenêtre) qui bouge oblige Chrome à recomposer TOUT l'écran à
   la cadence de l'écran (120 Hz sur ProMotion), en Retina : mesuré par Allan
   dans le Task Manager, la seule nébuleuse de la section visible faisait
   tourner le processus GPU à 37 %. Le halo peint reste tel quel (position du
   0 % de l'ancienne boucle) ; seule sa dérive disparaît. */

/* Page light (intro) */
.page--light{
  background:var(--cream);
  color:var(--ink);
  display:flex;
  align-items:center;
  padding:80px 24px;
}

/* Page dark-statement (manifeste) — fond sombre avec layout en page-inner */
.page--statement{
  background:var(--ink);
  color:var(--cream);
  display:flex;
  align-items:center;
  padding:80px 24px;
  position:relative;
  z-index:1;
  overflow:hidden;
}
.page--statement::before{
  content:"";position:absolute;inset:-20% -20% 0 -20%;z-index:0;pointer-events:none;
  background:
    radial-gradient(ellipse at 65% 40%, rgba(201,168,106,.07) 0%, transparent 55%),
    radial-gradient(ellipse at 20% 80%, rgba(246,241,234,.025) 0%, transparent 50%);
}
.page--statement .particle-title{
  line-height:1.15;   /* titres longs sur 2 lignes : un peu plus d'interligne */
  margin-bottom:56px;
}
/* ===== Emplacements d'images (placeholders prêts à recevoir un <img>) =====
   Lavis abstrait dans la palette + icône discrète. Pour intégrer une vraie
   image : ajouter <img src="…" alt="…"> dans le .media, elle couvre le cadre. */
.media{
  position:relative;
  border-radius:22px;
  overflow:hidden;
  background:
    radial-gradient(120% 90% at 18% 12%, rgba(201,168,106,.18), transparent 55%),
    radial-gradient(110% 85% at 85% 92%, rgba(24,53,66,.12), transparent 60%),
    linear-gradient(160deg, #efe7d9, #e5dac7);
  box-shadow:0 28px 64px -30px rgba(24,53,66,.30);
}
.media::after{
  content:"";position:absolute;inset:0;border-radius:inherit;
  border:1px solid rgba(24,53,66,.08);
  pointer-events:none;
}
.media > svg{
  position:absolute;inset:0;margin:auto;
  width:32px;height:32px;
  color:rgba(24,53,66,.26);
}
.media img{
  position:absolute;inset:0;
  width:100%;height:100%;
  object-fit:cover;
}
/* Cadre or décalé (grand format éditorial) */
.media-wrap{position:relative}
.media-wrap::before{
  content:"";position:absolute;
  top:22px;right:-22px;bottom:-22px;left:22px;
  border:1px solid rgba(201,168,106,.45);
  border-radius:22px;
}

/* Page services (cartes scrollables horizontalement) ==============
   Layout vertical (header au-dessus, ligne de cartes en dessous).
   Les cartes débordent du conteneur centré pour donner l'impression
   qu'elles continuent au-delà du bord droit du viewport et invitent
   au scroll latéral. */
.page--services{
  background:var(--cream);
  color:var(--ink);
  display:flex;
  flex-direction:column;
  justify-content:center;
  padding:60px 0;
  gap:36px;
}
.services-header{
  max-width:1100px;
  margin:0 auto;
  width:100%;
  padding:0 24px;
}
.services-cards{
  display:flex;
  gap:24px;
  overflow-x:auto;
  overflow-y:visible;
  /* flex-shrink:0 : la colonne flex de la section ne doit PAS comprimer cette
     rangée sur les écrans bas — sinon les cartes s'étirent à une hauteur réduite
     et overflow:hidden coupe leur texte. À pleine hauteur, la section déborde et
     devient défilable (justify-content:safe center → contenu atteignable). */
  flex-shrink:0;
  /* Padding vertical généreux : overflow-x:auto force le clipping vertical de
     cette rangée → l'ombre portée des cartes (surtout vers le bas) serait
     rognée. 56px : contient aussi l'ombre AGRANDIE au survol (26+54−20 = 60px,
     moins les 6px de levée de la carte → 54px sous la carte). */
  padding:22px max(24px, calc((100vw - 1100px) / 2 + 24px)) 56px;
  /* Les points de snap doivent respecter le padding visuel, sinon le snap
     mandatory recolle la première carte au bord du viewport. */
  scroll-padding-left:max(24px, calc((100vw - 1100px) / 2 + 24px));
  scroll-snap-type:x mandatory;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
}
.services-cards::-webkit-scrollbar{display:none}
.service-card{
  flex:0 0 372px;
  display:flex;
  flex-direction:column;
  background:rgba(255,255,255,.72);
  border:1px solid rgba(24,53,66,.07);
  border-radius:20px;
  overflow:hidden;
  box-shadow:0 18px 44px -18px rgba(24,53,66,.14);
  scroll-snap-align:start;
}
/* Bandeau image en tête de carte (flush avec les bords) */
.service-media{
  border-radius:0;
  box-shadow:none;
  height:clamp(96px, 14vh, 148px);
  flex:0 0 auto;
}
.service-media::after{
  border:none;
  border-bottom:1px solid rgba(24,53,66,.06);
}
.service-media > svg{width:44px;height:44px;color:#183542;opacity:.30}
.service-card-inner{
  display:flex;
  flex-direction:column;
  flex:1;
  padding:24px 28px 24px;
}
.service-card-title{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:25px;
  color:var(--ink);
  margin-bottom:16px;
}
.service-card-body{
  font-family:var(--serif);
  font-size:15px;
  line-height:1.6;
  color:var(--ink);
  opacity:.82;
  flex:1;
  margin-bottom:24px;
}
.service-card-body p{margin-bottom:.85em}
.service-card-body p:last-child{margin-bottom:0}
.service-card-body em{font-style:normal;color:var(--gold);opacity:1.2}
.service-card-link{
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.24em;
  text-transform:uppercase;
  color:var(--gold);
  text-decoration:none;
  display:inline-flex;
  align-items:center;
  gap:10px;
  align-self:flex-start;
}
.service-card-link::after{
  content:"→";
  font-size:14px;
  transition:transform .3s ease;
}
.service-card-link:hover::after{transform:translateX(4px)}
/* Filet qui se déploie sous le libellé au survol (l'espace de la flèche,
   ~24px, reste hors du filet — elle a déjà son propre mouvement). */
.service-card-link{position:relative}
.service-card-link::before{
  content:"";
  position:absolute;left:0;right:24px;bottom:-4px;height:1px;
  background:currentColor;opacity:.5;
  transform:scaleX(0);transform-origin:left center;
  transition:transform .35s ease;
}
.service-card-link:hover::before{transform:scaleX(1)}
/* Carte « Autres services » : QUATRE destinations au lieu d'une. Les libellés
   sont bien plus longs que « En savoir plus » → typo resserrée (10px/.1em au
   lieu de 11px/.24em) pour tenir sur une ligne dans la colonne, et pile
   verticale à interligne constant. La pile reste collée au BAS de la carte
   (.service-card-body garde flex:1) : le dernier lien s'aligne donc sur le
   lien unique des trois autres cartes, le rythme des cartes est préservé. */
.service-card-links{
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  gap:11px;
}
.service-card-links .service-card-link{
  font-size:10px;
  letter-spacing:.07em;   /* mesuré : le plus long libellé tient en UNE ligne
                             dans la carte la plus étroite du desktop (330px
                             à 1440px, la largeur plancher de la grille) */
  gap:8px;
  line-height:1.35;
}
.service-card{
  transition:transform .45s cubic-bezier(.2,.8,.2,1), border-color .45s, box-shadow .45s;
}
.service-card:hover{
  transform:translateY(-6px);
  border-color:rgba(201,168,106,.45);
  box-shadow:0 26px 54px -20px rgba(24,53,66,.22);
}
/* Le bandeau de tête suit le survol : l'icône et le numéro, encre discrète au
   repos, se réchauffent en or — écho du langage doré des autres cartes. */
.service-media > svg{transition:color .5s, opacity .5s, transform .5s cubic-bezier(.2,.8,.2,1)}
.service-card:hover .service-media > svg{
  color:#C9A86A;
  opacity:.9;
  transform:scale(1.1);
}
.card-num{transition:color .5s}
.service-card:hover .card-num{color:rgba(201,168,106,.8)}

/* ===== Composants partagés des cartes ===== */
.icon-chip{
  width:42px;height:42px;
  border:1px solid rgba(201,168,106,.45);
  border-radius:50%;
  display:flex;
  align-items:center;
  justify-content:center;
  color:var(--gold);
  flex:0 0 auto;
}
.icon-chip svg{width:18px;height:18px}
/* Numéro éditorial, en surimpression du bandeau image */
.card-num{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:32px;
  line-height:1;
  color:rgba(24,53,66,.30);
  position:absolute;
  top:16px;right:20px;
}

/* Cartouche mis en valeur (filet or à gauche, sans boîte) */
.callout{
  border-left:2px solid var(--gold);
  padding:6px 0 6px 24px;
  font-family:var(--serif);
  font-size:16px;
  line-height:1.6;
  color:var(--ink);
}
.callout strong{font-weight:500}
/* Deux affirmations dans un même cartouche (parcours dirigeant) : le reset
   global met toutes les marges à zéro, l'écart doit donc être explicite. */
.callout p + p{margin-top:.9em}

/* Lien DANS une phrase (et non bouton) : le site n'en avait aucun style — un
   lien y était soit un bouton, soit un composant à lui seul. Recette reprise
   de `.form-note a` (or + soulignement décalé), avec le repli clair habituel
   #8d6a30 : sur crème, --gold tombe à 2,0:1. Le trait est atténué au repos et
   se referme au survol — le lien se voit sans trouer la ligne. */
.lien-texte{
  color:var(--gold);
  text-decoration:underline;
  text-decoration-thickness:1px;
  text-decoration-color:rgba(201,168,106,.45);
  text-underline-offset:3px;
  transition:text-decoration-color .3s;
}
.lien-texte:hover{text-decoration-color:var(--gold)}
.page--light .lien-texte{color:#8d6a30;text-decoration-color:rgba(141,106,48,.42)}
.page--light .lien-texte:hover{text-decoration-color:#8d6a30}

/* ===== Contenu des sections : toujours visible, sans animation d'entrée/sortie
   ===== Anciennement une révélation en cascade (fondu + glissé) à l'arrivée sur
   chaque section ; retirée à la demande. Les classes .rv / .d1…d6 restent dans
   le HTML (et servent toujours de repères) mais n'animent plus rien : le
   contenu est présent dès qu'on arrive sur la section. */
html.full-page .rv{
  opacity:1;
  transform:none;
  transition:none;
}

/* ===== Bouton or (CTA) ===== */
.btn-gold{
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.24em;
  text-transform:uppercase;
  color:var(--ink-2);
  text-decoration:none;
  background:var(--gold-grad);
  border:1px solid rgba(160,120,60,.55);
  border-radius:50px;
  padding:16px 34px;
  display:inline-block;
  /* position/overflow : posés par le bloc « reflet balayé » ci-dessous */
  box-shadow:var(--gold-sheen);
  transition:background .4s, transform .4s cubic-bezier(.2,.8,.2,1), box-shadow .4s;
}
.btn-gold:hover{
  background:var(--gold-grad-hover);
  transform:translateY(-2px);
  box-shadow:0 16px 34px -16px rgba(201,168,106,.5), var(--gold-sheen);
}
/* ===== Reflet balayé — LANGAGE COMMUN À TOUS LES BOUTONS =====
   Une bande de lumière traverse le bouton UNE fois à l'entrée du survol (et
   au focus clavier), de gauche à droite ; invisible au repos, l'animation
   ramenant le ::before hors cadre à gauche. Même langage que le balayage
   doré des cartes financements.
   Généralisé le 13/08/2026 (demande d'Allan) : le reflet n'était que sur
   .btn-gold (corps des pages) — TOUS les boutons du site le portent
   désormais, à commencer par le « Contact » du menu.
   ⚠️ Un bouton ajouté plus tard doit être inscrit dans CES deux listes
   (position/overflow, puis ::before) + celle du :hover plus bas, sinon il
   sera le seul à ne pas réagir. Les boutons des OUTILS (.t-btn du
   simulateur / détecteur / prompts) ont leur propre CSS en ligne et un autre
   registre visuel : ils ne sont volontairement pas concernés. */
.btn-gold,
.menu-link--cta,
.menu-overlay a.cta,
.blog-cats a,
.replay{
  position:relative;
  overflow:hidden;   /* contient la bande de lumière */
}
.btn-gold::before,
.menu-link--cta::before,
.menu-overlay a.cta::before,
.blog-cats a::before,
.chat-bulle::before,
.replay::before{
  content:"";
  position:absolute;top:0;bottom:0;left:0;width:36%;
  background:linear-gradient(100deg, rgba(255,253,245,0) 0%, rgba(255,253,245,.45) 50%, rgba(255,253,245,0) 100%);
  transform:translateX(-170%) skewX(-18deg);
  pointer-events:none;
}
/* Pastilles CLAIRES sur fond clair (tri du blog) : une bande blanche ne s'y
   verrait pas — c'est l'or qui balaye, dans la couleur de la marque. */
.blog-cats a::before{
  background:linear-gradient(100deg, rgba(201,168,106,0) 0%, rgba(201,168,106,.38) 50%, rgba(201,168,106,0) 100%);
}
.btn-gold:hover::before,      .btn-gold:focus-visible::before,
.menu-link--cta:hover::before, .menu-link--cta:focus-visible::before,
.menu-overlay a.cta:hover::before, .menu-overlay a.cta:focus-visible::before,
.blog-cats a:hover::before,   .blog-cats a:focus-visible::before,
.chat-bulle:hover::before,    .chat-bulle:focus-visible::before,
.replay:hover::before,        .replay:focus-visible::before{
  animation:btnSheen .85s ease .05s;
}
@keyframes btnSheen{to{transform:translateX(450%) skewX(-18deg)}}
/* Variante pleine, plus grande (CTA principal de fin de page) */
.btn-gold--solid{
  padding:18px 42px;
  box-shadow:0 14px 34px -14px rgba(201,168,106,.45), var(--gold-sheen);
}
.btn-gold--solid:hover{
  box-shadow:0 20px 44px -14px rgba(201,168,106,.55), var(--gold-sheen);
}

/* ===== Page à propos : image éditoriale + lead + piliers en filets ===== */
.about-cols{
  display:grid;
  grid-template-columns:0.82fr 1.18fr;
  gap:clamp(48px, 6vw, 88px);
  align-items:stretch;
}
.about-media{height:100%;min-height:0}
.about-media .media{height:100%;min-height:clamp(360px, 46vh, 460px);overflow:clip}
.about-lead{
  font-family:var(--serif);
  font-size:clamp(18px, 1.6vw, 22px);
  line-height:1.6;
  color:var(--ink);
}
.about-lead em{font-style:normal;color:var(--gold)}
.about-more{
  margin-top:22px;
  font-family:var(--serif);
  font-size:16px;
  line-height:1.62;
  color:var(--ink);
  opacity:.74;
}
.about-more strong{font-weight:500}
/* ===== Carrousel auto des 4 volets, dans la carte dorée =====
   4 slides empilés en absolu ; chacun rejoue la même animation de fondu
   (aboutCycle) décalée d'un quart de cycle → un seul volet visible à la
   fois, enchaînement automatique en boucle. Les puces se synchronisent
   sur les mêmes délais. Le fond doré (.media) est conservé tel quel. */
.about-cycle{position:absolute;inset:0;z-index:1}
.about-slide{
  position:absolute;
  inset:0;
  display:flex;
  flex-direction:column;
  justify-content:center;
  padding:clamp(30px, 3vw, 50px);
  opacity:0;
  animation:aboutCycle 20s infinite;
}
.about-slide:nth-child(1){animation-delay:0s}
.about-slide:nth-child(2){animation-delay:5s}
.about-slide:nth-child(3){animation-delay:10s}
.about-slide:nth-child(4){animation-delay:15s}
@keyframes aboutCycle{
  0%   {opacity:0; transform:translateY(12px)}
  4%   {opacity:1; transform:translateY(0)}
  21%  {opacity:1; transform:translateY(0)}
  25%  {opacity:0; transform:translateY(-12px)}
  100% {opacity:0; transform:translateY(-12px)}
}
.about-slide-num{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(30px, 3.4vw, 46px);
  line-height:1;
  color:var(--gold);
  margin-bottom:18px;
}
.about-slide h3{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(24px, 2.4vw, 33px);
  line-height:1.1;
  color:var(--ink);
  margin-bottom:12px;
}
.about-slide p{
  font-family:var(--serif);
  font-size:clamp(15px, 1.3vw, 17px);
  line-height:1.55;
  color:var(--ink);
  opacity:.78;
  max-width:32ch;
}
.about-dots{
  position:absolute;
  left:clamp(30px, 3vw, 50px);
  bottom:clamp(26px, 2.6vw, 42px);
  display:flex;
  gap:9px;
  z-index:2;
}
/* Perf (16/08/2026) : l'animation interpolait la COULEUR DE FOND (gris ↔ or),
   propriété que Chrome ne sait pas animer sur le compositeur → le fil
   principal était réveillé 120 fois/s (écran ProMotion) pour recalculer le
   style et repeindre 4 points de 7 px, même la section hors écran. Même
   rendu désormais avec un calque or (::after) dont on anime l'OPACITÉ, et
   l'échelle sur la puce : deux propriétés déléguées au GPU. Les instants
   (0 → 21 % or plein, 21 → 25 % fondu, gris ensuite) sont inchangés. */
.about-dots button{
  position:relative;
  width:7px;height:7px;
  padding:0;
  border:0;
  -webkit-appearance:none;
  appearance:none;
  border-radius:50%;
  background:rgba(24,53,66,.2);
  cursor:pointer;
  animation:aboutDotScale 20s infinite;
}
.about-dots button::before{
  content:"";
  position:absolute;inset:-9px -4px;
}
.about-dots button::after{
  content:"";
  position:absolute;inset:0;
  border-radius:50%;
  background:var(--gold);
  opacity:0;
  animation:aboutDotGold 20s infinite;
  animation-delay:inherit;
}
.about-dots button:nth-child(1){animation-delay:0s}
.about-dots button:nth-child(2){animation-delay:5s}
.about-dots button:nth-child(3){animation-delay:10s}
.about-dots button:nth-child(4){animation-delay:15s}
.about-dots button:focus-visible{
  outline:2px solid var(--gold);
  outline-offset:4px;
}
.about-cycle--js .about-slide{
  animation:none;
  opacity:0;
  transform:translateY(12px);
  transition:none;
}
.about-cycle--js .about-slide.is-on{
  opacity:1;
  transform:translateY(0);
  transition:opacity .8s ease, transform .8s ease;
}
.about-cycle--js .about-slide.is-out{
  opacity:0;
  transform:translateY(-12px);
  transition:opacity .8s ease, transform .8s ease;
}
.about-cycle--js ~ .about-dots button{
  animation:none;
  transform:scale(1);
  transition:transform .8s ease;
}
.about-cycle--js ~ .about-dots button::after{
  animation:none;
  opacity:0;
  transition:opacity .8s ease;
}
.about-cycle--js ~ .about-dots button:hover::after{opacity:.4;transition:opacity .25s ease}
.about-cycle--js ~ .about-dots button.is-on{transform:scale(1.3);transition:none}
.about-cycle--js ~ .about-dots button.is-on::after{opacity:1;transition:none}
@keyframes aboutDotScale{
  0%,21%   {transform:scale(1.3)}
  25%,100% {transform:scale(1)}
}
@keyframes aboutDotGold{
  0%,21%   {opacity:1}
  25%,100% {opacity:0}
}

/* ===== Page constat : manifeste centré ===== */
.page--statement .page-inner{
  display:flex;
  flex-direction:column;
  align-items:center;
  text-align:center;
}
.manifesto{max-width:840px}
.manifesto-lead{
  font-family:var(--serif);
  font-size:clamp(18px, 1.9vw, 25px);
  line-height:1.6;
  color:var(--cream);
}
.manifesto-lead em{font-style:normal;color:var(--gold)}
.manifesto-rule{
  width:56px;
  height:1px;
  background:rgba(201,168,106,.6);
  border:none;
  margin:32px auto;
}
.manifesto-note{
  max-width:680px;
  margin:0 auto;
  font-family:var(--serif);
  font-size:clamp(15px, 1.3vw, 17px);
  line-height:1.65;
  color:var(--cream-dim);
}
.manifesto-note strong{color:var(--cream);font-weight:500}
.hero-cta{
  margin-top:60px;   /* = gap visuel wordmark→tagline (voir .tagline) */
  opacity:0;
  animation:tagIn 1.6s cubic-bezier(.2,.8,.2,1) 5.8s forwards;
  z-index:2;
}

/* ===== Rangées de cartes scrollables (masque la scrollbar) ===== */
.hscroll{scrollbar-width:none}
.hscroll::-webkit-scrollbar{display:none}

/* ===== Page engagements (dark, grille 3×2) ===== */
.page--edge{
  background:var(--ink);
  color:var(--cream);
  display:flex;
  flex-direction:column;
  justify-content:center;
  padding:60px 0;
  gap:40px;
  position:relative;
  overflow:hidden;
}
.page--edge::before{
  content:"";position:absolute;inset:-20% -20% 0 -20%;z-index:0;pointer-events:none;
  background:
    radial-gradient(ellipse at 75% 25%, rgba(201,168,106,.06) 0%, transparent 55%),
    radial-gradient(ellipse at 15% 75%, rgba(246,241,234,.02) 0%, transparent 50%);
}
/* NB : pas de position:relative sur les conteneurs intermédiaires des
   .particle-title (edge-head, cta-body…) — computeSlots() lit offsetTop/Left
   du titre en supposant que son offsetParent est la .page elle-même. */
.edge-head{
  max-width:1100px;
  margin:0 auto;
  width:100%;
  padding:0 24px;
}
/* Grille de cartes « verre » douces (langage visuel cohérent avec les cartes
   services / équipe / à-propos, au lieu des anciens filets fins). */
.edge-grid{
  position:relative;
  z-index:1;
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:20px;
  max-width:1160px;
  width:100%;
  margin:0 auto;
  padding:0 24px;
}
/* Largeurs intermédiaires : 3 colonnes trop étroites → 2×3 confortable
   (même logique que la grille équipe ; ≤700px : rangée défilante). */
@media (min-width:701px) and (max-width:1023px){
  .edge-grid{grid-template-columns:repeat(2, 1fr);max-width:820px}
}
.edge-card{
  display:flex;
  flex-direction:column;
  padding:28px 26px 26px;
  border-radius:20px;
  border:1px solid rgba(246,241,234,.09);
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
  transition:transform .5s cubic-bezier(.2,.8,.2,1), border-color .5s, background .5s, box-shadow .5s;
}
.edge-card:hover{
  transform:translateY(-5px);
  border-color:rgba(201,168,106,.5);
  background:linear-gradient(158deg, rgba(201,168,106,.10) 0%, rgba(246,241,234,.02) 62%);
  box-shadow:0 28px 56px -30px rgba(0,0,0,.6);
}
.edge-card .icon-chip{
  width:44px;height:44px;
  margin-bottom:18px;
  border-color:rgba(201,168,106,.45);
  background:rgba(201,168,106,.12);
  transition:background .5s, border-color .5s;
}
.edge-card .icon-chip svg{width:17px;height:17px;transition:transform .5s cubic-bezier(.2,.8,.2,1)}
.edge-card:hover .icon-chip{
  background:rgba(201,168,106,.22);
  border-color:rgba(201,168,106,.7);
}
/* Le glyphe grandit à peine dans sa pastille — la pastille, elle, ne bouge pas. */
.edge-card:hover .icon-chip svg{transform:scale(1.15)}
.edge-card h3{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:20px;
  color:var(--cream);
  margin-bottom:10px;
}
.edge-card p{
  font-family:var(--serif);
  font-size:14.5px;
  line-height:1.58;
  color:var(--cream-dim);
  margin:0;
}

/* ===== Page financements (light, 2 colonnes) ===== */
.page--light.page--funding .particle-title{
  line-height:1.18;   /* titre long sur 2 lignes : un peu plus d'interligne */
  margin-bottom:48px;
}
.split-cols{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:clamp(40px, 4.5vw, 64px);
  align-items:center;
  width:100%;
  max-width:1100px;
  margin:0 auto;
  text-align:left;
}
.split-text{
  display:flex;
  flex-direction:column;
  justify-content:center;
  gap:32px;
}
.split-lead{
  font-family:var(--serif);
  font-size:clamp(17px, 1.5vw, 20px);
  line-height:1.65;
}
.split-lead p + p{margin-top:1em}
.split-cta{align-self:stretch;text-align:center}
.split-text .callout{
  border-left:none;
  padding:22px 24px;
  border-radius:16px;
  border:1px solid rgba(201,168,106,.32);
  background:linear-gradient(160deg, rgba(201,168,106,.10), rgba(201,168,106,.03));
  font-size:15.5px;
  line-height:1.6;
}
.split-cols .sec-copy{max-width:none;margin:0;text-align:left}
/* ===== Page références (dark, citation centrée) ===== */
.page--trust{
  background:var(--ink);
  color:var(--cream);
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  text-align:center;
  padding:70px 24px;
  position:relative;
  overflow:hidden;
}
.page--trust::before{
  content:"";position:absolute;inset:-20% -20% 0 -20%;z-index:0;pointer-events:none;
  background:
    radial-gradient(ellipse at 40% 30%, rgba(201,168,106,.06) 0%, transparent 55%),
    radial-gradient(ellipse at 80% 80%, rgba(246,241,234,.02) 0%, transparent 50%);
}
.page--trust .particle-title{
  margin-bottom:14px;
}
.trust-lead{
  position:relative;z-index:1;
  font-family:var(--serif);
  font-style:italic;
  font-size:clamp(16px, 1.4vw, 19px);
  color:var(--cream-dim);
  margin-bottom:40px;
}
/* Citation encadrée : carte discrète bordée, avec un grand guillemet
   ouvrant en haut à gauche et un fermant en bas à droite. */
.trust-quote{
  position:relative;z-index:1;
  max-width:760px;
  margin:10px auto 0;
  padding:44px 52px 34px;
  background:linear-gradient(165deg, rgba(246,241,234,.05), rgba(246,241,234,.015));
  border:1px solid rgba(246,241,234,.1);
  border-radius:20px;
  box-shadow:inset 0 1px 0 rgba(246,241,234,.06);
  font-family:var(--serif);
  font-style:italic;
  font-weight:400;
  font-size:clamp(16px, 1.65vw, 21px);
  line-height:1.62;
  color:var(--cream);
}
/* Guillemets INLINE, dans le flux du texte cité : le « précède le premier mot,
   le » suit le dernier → ils sont par construction sur la 1ʳᵉ et la DERNIÈRE
   ligne de la citation, collés au texte (centré), à toutes les largeurs. Le
   texte étant centré, un ancrage absolu sur les bords du bloc tombait à côté
   (et chevauchait le texte) dès que la largeur changeait.
   line-height:0 : le glyphe agrandi ne dilate pas l'interligne de sa ligne.
   vertical-align : cale le centre d'encre du glyphe sur celui des minuscules. */
.trust-quote-body{display:block}
.trust-quote-body::before,
.trust-quote-body::after{
  font-family:var(--serif);
  font-style:italic;
  font-size:2em;
  line-height:0;
  color:rgba(201,168,106,.55);
  vertical-align:-.1em;
}
.trust-quote-body::before{content:"«";margin-right:.22em}
.trust-quote-body::after{content:"»";margin-left:.22em}
.trust-quote cite{
  display:block;
  margin-top:22px;
  font-family:var(--sans);
  font-style:normal;
  font-size:11px;
  letter-spacing:.22em;
  text-transform:uppercase;
  color:var(--gold);
}
/* Emplacement réservé : la citation de Nathanaël n'est pas encore écrite
   (accompagnement-ia.php, $citationNath). Cadre pointillé, sans fond ni
   guillemets — il tient la place EXACTE de la vraie citation et ne peut pas
   se lire comme du contenu définitif. À retirer avec le if() le jour où la
   citation arrive. */
.trust-quote--vide{
  background:none;
  border-style:dashed;
  border-color:rgba(246,241,234,.22);
  box-shadow:none;
  color:var(--cream-dim);
}
.trust-quote--vide .trust-quote-body::before,
.trust-quote--vide .trust-quote-body::after{content:none}
/* Bandeau de logos qui défile en continu (marquee) ==================
   Pleine largeur (breakout hors du padding de la section), fondu sur les
   deux bords. La piste contient la liste des références EN DOUBLE : la
   translation de -50% ramène la 2ᵉ moitié pile sur la 1ʳᵉ → boucle sans
   couture. Pause au survol. Chaque .trust-logo porte une pastille
   (initiales) qui sert aussi d'emplacement pour un vrai logo :
   remplacer le <span> par un <img> le jour venu. */
.trust-marquee{
  position:relative;z-index:1;
  width:100vw;
  margin-left:calc(-50vw + 50%);
  margin-top:52px;
  overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
          mask-image:linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
}
.trust-track{
  display:flex;
  width:max-content;
  gap:64px;
  padding-left:64px;
  animation:trustScroll 46s linear infinite;
}
.trust-marquee:hover .trust-track{animation-play-state:paused}
@keyframes trustScroll{
  from{transform:translateX(0)}
  to{transform:translateX(-50%)}
}
/* Item du bandeau : une seule ligne, discret (le contenu fort de la
   section reste la citation et les chiffres). */
.trust-logo{
  display:flex;
  align-items:center;
  gap:12px;
  flex:0 0 auto;
  opacity:.5;
  transition:opacity .4s;
}
.trust-logo:hover{opacity:1}
.trust-logo-mark{
  width:38px;height:38px;
  flex:0 0 auto;
  border:1px solid rgba(201,168,106,.35);
  border-radius:50%;
  display:flex;
  align-items:center;
  justify-content:center;
  overflow:hidden;
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:14px;
  letter-spacing:.02em;
  color:var(--gold);
  background:linear-gradient(160deg, rgba(246,241,234,.05), rgba(246,241,234,.015));
}
.trust-logo-mark img{width:100%;height:100%;object-fit:cover;border-radius:50%}
.trust-logo-text{
  display:flex;
  align-items:baseline;
  gap:9px;
  text-align:left;
}
.trust-logo-name{
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--cream);
  white-space:nowrap;
}
.trust-logo-sector{
  font-family:var(--serif);
  font-style:italic;
  font-size:13.5px;
  color:var(--cream-dim);
  white-space:nowrap;
}
.trust-stats{
  position:relative;z-index:1;
  display:flex;
  align-items:stretch;
  justify-content:center;
  margin-top:44px;
}
.trust-stat{
  display:flex;
  flex-direction:column;
  gap:6px;
  padding:2px 46px;
  border-left:1px solid rgba(246,241,234,.12);
}
.trust-stat:first-child{border-left:none}
.trust-stat b{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(26px, 2.8vw, 38px);
  line-height:1.1;
  color:var(--gold);
}
.trust-stat span{
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.22em;
  text-transform:uppercase;
  color:var(--cream-dim);
}

/* ===== Page équipe (light, 4 colonnes) ===== */
.page--team{
  background:var(--cream);
  color:var(--ink);
  display:flex;
  flex-direction:column;
  justify-content:center;
  padding:60px 0;
  gap:36px;
}
.team-head{
  max-width:1100px;
  margin:0 auto;
  width:100%;
  padding:0 24px;
}
.page--team .particle-title{
  margin-bottom:26px;
}
.team-lead{
  max-width:760px;
  margin-inline:auto;
  text-align:center;
  font-family:var(--serif);
  font-size:clamp(16px, 1.35vw, 19px);
  line-height:1.6;
  color:var(--ink);
  opacity:.85;
}
.team-lead em{font-style:normal;color:var(--gold)}
/* Cartes portrait travaillées : grand emplacement image en tête + contenu. */
.team-grid{
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  gap:26px;
  max-width:1148px;
  width:100%;
  margin:0 auto;
  padding:0 24px;
}
/* Largeurs intermédiaires : 4 colonnes deviennent trop étroites (~250px,
   textes césurés/coupés) → grille 2×2 confortable. La section défile si le
   tout dépasse l'écran (safe center déjà en place). ≤700px : rangée
   défilante (règle mobile plus bas). */
@media (min-width:701px) and (max-width:1279px){
  .team-grid{grid-template-columns:repeat(2, 1fr);max-width:840px}
}
.team-card{
  display:flex;
  flex-direction:column;
  background:rgba(255,255,255,.72);
  border:1px solid rgba(24,53,66,.07);
  border-radius:20px;
  overflow:hidden;
  box-shadow:0 18px 44px -20px rgba(24,53,66,.16);
  transition:transform .45s cubic-bezier(.2,.8,.2,1), border-color .45s, box-shadow .45s;
}
.team-card:hover{
  transform:translateY(-6px);
  border-color:rgba(201,168,106,.45);
  box-shadow:0 30px 60px -24px rgba(24,53,66,.24);
}
/* Portrait : emplacement image (remplacer le <span> par un <img>). */
.team-portrait{
  border-radius:0;
  box-shadow:none;
  width:100%;
  height:clamp(150px, 19vh, 200px);
  flex:0 0 auto;
  overflow:hidden;   /* contient le léger zoom du portrait au survol */
}
/* Au survol de la carte, le portrait s'anime à peine : la photo grandit
   depuis son centre. */
.team-portrait img{transition:transform .6s cubic-bezier(.2,.8,.2,1);transform-origin:center}
.team-card:hover .team-portrait img{transform:scale(1.035)}
.team-portrait::after{border:none;border-bottom:1px solid rgba(24,53,66,.06)}
.team-portrait img{object-position:center}
.team-body{
  display:flex;
  flex-direction:column;
  padding:22px 24px 24px;
}
.team-card h3{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:22px;
  color:var(--ink);
  margin-bottom:8px;
  line-height:1.15;
}
.team-role{
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--gold);
  margin-bottom:14px;
}
.team-body > p:last-child{
  font-family:var(--serif);
  font-size:14.5px;
  line-height:1.55;
  color:var(--ink);
  opacity:.74;
}
.team-note{font-style:italic;font-size:15px;opacity:.9}

/* ===== Page CTA finale (dark) + pied de page ===== */
.page--cta{
  background:var(--ink);
  color:var(--cream);
  display:flex;
  flex-direction:column;
  padding:60px 24px 40px;
  position:relative;
  overflow:hidden;
}
.page--cta::before{
  content:"";position:absolute;inset:-20% -20% 0 -20%;z-index:0;pointer-events:none;
  background:
    radial-gradient(ellipse at 50% 40%, rgba(201,168,106,.07) 0%, transparent 55%),
    radial-gradient(ellipse at 25% 85%, rgba(246,241,234,.02) 0%, transparent 50%);
}
.cta-body{
  flex:1;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  text-align:center;
  /* Au-dessus du ::before décoratif (comme edge-grid/trust-quote) : le contenu
     reste net et cliquable, pas lavé ni bloqué par le dégradé animé. */
  position:relative;
  z-index:1;
  /* Garde-fou : distance minimale entre le contenu (perks) et la bande du
     pied de page quand l'écran est bas et que le mou du flex tombe à zéro. */
  padding-bottom:26px;
}
.page--cta .particle-title{
  margin-bottom:30px;
}
.cta-text{
  max-width:660px;
  font-family:var(--serif);
  font-size:clamp(16px, 1.4vw, 19px);
  line-height:1.62;
  color:var(--cream-dim);
  margin-bottom:44px;
}
.cta-text strong{color:var(--cream);font-weight:500}
.cta-perks{
  display:flex;
  gap:28px;
  margin-top:28px;
}
.cta-perks span{
  display:inline-flex;
  align-items:center;
  gap:10px;
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.22em;
  text-transform:uppercase;
  color:var(--cream-dim);
}
.cta-perks span::before{
  content:"";
  width:4px;height:4px;
  border-radius:50%;
  background:var(--gold);
}
/* Pied de page : bande PLEINE LARGEUR plus sombre (--ink-2), flush au bas de
   la section. Les marges négatives cassent le padding de .page--cta
   (60px 24px 40px) → la bande couvre toute la largeur et touche le bas. Le
   contenu (foot-inner) reste centré à 1100px. Trois colonnes aérées. */
.site-foot{
  position:relative;z-index:1;
  margin:0 -24px -40px;
  padding:38px 24px 34px;
  background:var(--ink-2);
  border-top:1px solid rgba(246,241,234,.08);
}
.foot-inner{
  width:100%;
  max-width:1100px;
  margin:0 auto;
}
.foot-cols{
  display:flex;
  justify-content:space-between;
  align-items:flex-start;
  gap:28px 64px;
  flex-wrap:wrap;
}
.foot-col--brand{max-width:300px}
.foot-brand{
  font-family:var(--serif-title);
  font-style:italic;
  font-size:24px;
  color:var(--cream);
}
.foot-tagline{
  margin-top:8px;
  font-family:var(--serif);
  font-style:italic;
  font-size:14px;
  line-height:1.5;
  color:var(--cream-dim);
}
.foot-label{
  font-family:var(--sans);
  font-size:9.5px;
  letter-spacing:.26em;
  text-transform:uppercase;
  color:var(--gold);
  margin-bottom:14px;
}
.foot-item{
  font-family:var(--sans);
  font-size:12.5px;
  letter-spacing:.02em;
  line-height:1.5;
  color:var(--cream-dim);
}
.foot-item + .foot-item{margin-top:8px}
.foot-item a{
  color:inherit;
  text-decoration:none;
  transition:color .25s;
}
.foot-item a:hover{color:var(--gold)}
.foot-fineprint{
  margin-top:30px;
  padding-top:16px;
  border-top:1px solid rgba(246,241,234,.06);
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.12em;
  color:var(--cream-dim);
  opacity:.7;
  text-align:center;
}
/* Signature (année tenue à jour par transitions.js) : même registre que le
   fine print, en RETRAIT — c'est la ligne la moins importante du pied. */
.foot-sign{
  margin-top:8px;
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.12em;
  color:var(--cream-dim);
  opacity:.55;
  text-align:center;
}
.foot-sign a{color:inherit;text-decoration:none;border-bottom:1px solid rgba(246,241,234,.2);transition:color .3s, border-color .3s}
.foot-sign a:hover{color:var(--gold);border-bottom-color:rgba(201,168,106,.55)}
/* ===== Variante CLAIRE de la section finale (formations uniquement) =====
   Formations a 10 sections : nombre PAIR + intro foncée → l'alternance stricte
   clair/foncé EXIGE une dernière section claire (cf. README §4). Le pied de
   page suit sa section, comme tout composant décliné du site
   (.duo-grid--light, .faq--light) : la bande se détache toujours, mais vers le
   HAUT (voile blanc) au lieu du bas — convention des surfaces claires.
   Le pied N'EST PAS laissé en encre à dessein : app.js cale la couleur de la
   pilule des dots sur le fond à mi-hauteur d'écran (isDarkAt(H*0.5)), or sur
   mobile la pilule est en bas — une bande sombre sous une section claire la
   rendrait invisible.
   ⚠️ CONTRASTES : ne PAS réutiliser tels quels --ink-dim et --gold ici. Le pied
   foncé profite d'un fond très sombre (--ink-2) et atteint 5,3:1 sur le texte,
   7,2:1 sur les libellés dorés ; sur crème les mêmes tons tombent à 3,3:1 et
   2,8:1 — le pied paraissait délavé face aux autres pages. Valeurs recalées
   (mesurées dans le navigateur) : encre à .72 → 5,3:1 (identique au foncé) et
   or profond #8d6a30 → 4,7:1 (l'or vif, ou même le #b58f52 de --gold-text,
   reste trop clair pour des libellés de 9,5px en capitales espacées). */
.page--cta--light{
  /* Repli sans JS : en mode full-page le fond est peint sur le canvas d'après
     data-tone, la section elle-même reste transparente. */
  background:var(--cream);
  color:var(--ink);
  --foot-fg:rgba(24,53,66,.72);
  --foot-gold:#8d6a30;
}
.page--cta--light::before{
  background:
    radial-gradient(ellipse at 50% 40%, rgba(201,168,106,.10) 0%, transparent 55%),
    radial-gradient(ellipse at 25% 85%, rgba(24,53,66,.03) 0%, transparent 50%);
}
.page--cta--light .cta-text{color:var(--foot-fg)}
.page--cta--light .cta-text strong{color:var(--ink)}
.page--cta--light .cta-perks span{color:var(--foot-fg)}
.page--cta--light .cta-perks span::before{background:var(--foot-gold)}
.page--cta--light .site-foot{
  background:rgba(255,255,255,.5);
  border-top-color:rgba(24,53,66,.10);
}
.page--cta--light .foot-brand{color:var(--ink)}
.page--cta--light .foot-tagline,
.page--cta--light .foot-item{color:var(--foot-fg)}
.page--cta--light .foot-label{color:var(--foot-gold)}
.page--cta--light .foot-item a:hover{color:var(--foot-gold)}
.page--cta--light .foot-fineprint{
  /* Le foncé cumule --cream-dim ET opacity .7 (3,3:1 sur --ink-2). Sur crème,
     ce cumul tombe à 2,2:1 → on garde --ink-dim seul, qui retrouve 3,3:1. */
  color:var(--ink-dim);
  opacity:1;
  border-top-color:rgba(24,53,66,.08);
}
.page--cta--light .foot-sign{color:var(--foot-fg);opacity:.75}
.page--cta--light .foot-sign a{border-bottom-color:rgba(24,53,66,.22)}
.page--cta--light .foot-sign a:hover{color:var(--foot-gold);border-bottom-color:rgba(141,106,48,.5)}

/* ===== Particle titles ===== */
.particle-title{
  /* Texte invisible visuellement mais préservé pour le SEO, les lecteurs
     d'écran ET la sélection/copie. `color: transparent` rend les glyphes
     invisibles ; le canvas (z-index 5) dessine les particules par-dessus.
     On élève le titre à z-index 10 pour que le surlignage de sélection
     apparaisse au-dessus des particules quand l'utilisateur sélectionne.
     `text-align: center` aligne les glyphes invisibles avec les particules,
     qui sont rendues centrées par le canvas (sampleElement utilise
     textAlign='center' dans son canvas offscreen, et le placement final
     se base sur offsetLeft+offsetWidth/2 = centre du bloc h1/h2). Sans
     ça, les glyphes du h2 (display:block, full-width) sont à gauche et
     la sélection ne tombe pas sous les particules. */
  color:transparent;
  /* normal (et non nowrap) : les titres LONGS se replient sur plusieurs
     lignes au lieu de déborder — le canvas fait de même (sampleElement
     replie à la largeur de l'élément). Les titres courts, plus étroits que
     leur conteneur, ne se replient jamais. */
  white-space:normal;
  text-align:center;
  position:relative;
  z-index:10;
  /* Typo COMMUNE à tous les titres (accueil, formations, contact, 404).
     Seules vraies exceptions, déclarées dans leurs blocs : le hero
     (.page--dark → cran display), l'interligne des titres longs sur
     2 lignes (statement, funding) et les marges propres aux sections. */
  font-family:var(--title-font);
  font-style:var(--title-style);
  font-weight:var(--title-weight);
  font-size:var(--title-lg);
  letter-spacing:-.01em;
  line-height:1.1;
  display:block;
}
/* Le texte reste transparent même sélectionné : on n'affiche que le fond
   doré, pour donner l'illusion qu'on sélectionne directement les particules.
   Le texte invisible reste copié dans le presse-papiers normalement. */
.particle-title::selection{
  color:transparent;
  background:rgba(201, 168, 106, 0.35);
}
.particle-title::-moz-selection{
  color:transparent;
  background:rgba(201, 168, 106, 0.35);
}
.page--dark .particle-title{   /* hero « Syneloria » uniquement */
  font-size:var(--title-display);
  letter-spacing:-.015em;
  line-height:.95;
}
.page--light .particle-title{
  margin-bottom:56px;
}

/* ===== Hero content ===== */
.tagline{
  /* 8px seulement : la boîte du <h1> (grande hauteur de ligne) déborde déjà
     d'environ 52px sous le wordmark compact → gap visuel wordmark→tagline ≈ 60px,
     égal au gap tagline→bouton (.hero-cta margin-top). */
  margin-top:8px;
  font-family:var(--serif-title);font-style:italic;font-weight:400;
  font-size:clamp(18px, 1.8vw, 24px);
  color:var(--cream-dim);
  letter-spacing:.01em;
  text-align:center;
  opacity:0;
  animation:tagIn 1.8s cubic-bezier(.2,.8,.2,1) 5.2s forwards;
  z-index:2;
}
@keyframes tagIn{
  from{opacity:0;transform:translateY(14px);filter:blur(6px)}
  to{opacity:1;transform:translateY(0);filter:blur(0)}
}

.scroll-hint{
  position:absolute;bottom:40px;left:50%;
  transform:translateX(-50%);
  font-family:var(--sans);
  font-size:10px;letter-spacing:.3em;text-transform:uppercase;
  color:var(--cream-dim);
  display:flex;flex-direction:column;align-items:center;gap:14px;
  opacity:0;animation:fade 1.4s 7.6s forwards;
  z-index:3;
}
.scroll-hint::after{
  content:"";width:1px;height:48px;
  background:rgba(246,241,234,.25);
  animation:scrollLine 2.2s ease-in-out infinite;
  transform-origin:top;
}
@keyframes scrollLine{
  0%,100%{transform:scaleY(0);transform-origin:top}
  50%{transform:scaleY(1)}
}

@keyframes fade{from{opacity:0}to{opacity:1}}

/* ===== Intro content ===== */
.page-inner{
  max-width:1100px;
  margin:0 auto;
  width:100%;
}

/* ===== Page navigation (dots à droite) ===== */
.page-nav{
  position:fixed;
  right:22px;top:50%;
  transform:translateY(-50%);
  /* gap 2px : les boutons font 24px de haut (pas de 26px = ancien 8px + 18px
     de gap) → même rythme visuel qu'avant. */
  display:flex;flex-direction:column;align-items:center;gap:2px;
  z-index:20;
  /* Fine boîte verticale : verre discret (voile quasi invisible + filet +
     flou). Le ton s'ADAPTE au fond réellement derrière (classe .on-light
     posée par app.js, synchronisée par frame comme la couleur du menu) :
     crème sur sections sombres, encre sur sections claires — jamais de
     grosse gélule grise sur le crème. */
  padding:8px 3px;
  border-radius:999px;
  background:rgba(246,241,234,.06);
  border:1px solid rgba(246,241,234,.14);
  -webkit-backdrop-filter:blur(7px);
  backdrop-filter:blur(7px);
  transition:background-color .25s, border-color .25s;
  opacity:0;
  /* Quasi immédiat, même pendant la grande intro (demande d'Allan) : les
     dots sont un repère de navigation, pas un élément de mise en scène. */
  animation:fade .8s .3s forwards;
  /* Invisibles ⇒ non cliquables : .ready est posée par app.js au moment où
     le fondu démarre (les dots deviennent cliquables dès qu'ils apparaissent,
     jamais avant). */
  pointer-events:none;
}
.page-nav.ready{pointer-events:auto}
/* Pages full-page SANS intro (body[data-no-reveal], ex. formations) : le
   chrome apparaît tout de suite, il n'y a pas de reveal à attendre. */
body[data-no-reveal] .site-menu{animation-delay:.15s;animation-duration:.5s}
body[data-no-reveal] .page-nav{animation-delay:.25s;animation-duration:.5s}
/* Sur section claire : voile et filet passent côté encre, très légers. */
.page-nav.on-light{
  background:rgba(24,53,66,.05);
  border-color:rgba(24,53,66,.16);
}
/* Bouton = boîte de layout FIXE 24×24 (aussi zone de clic confortable).
   Le rond visible est peint par ::after et grandit via son inset → la taille
   de la pilule ne bouge plus d'un pixel quand le dot actif change. */
.page-nav button{
  width:24px;height:24px;
  border:none;cursor:pointer;
  background:none;
  padding:0;
  position:relative;
}
.page-nav button::after{
  content:"";position:absolute;
  inset:8px;                          /* rond de 8px dans la boîte de 24px */
  border-radius:50%;
  background:rgba(140,140,140,.4);
  transition:inset .4s cubic-bezier(.2,.8,.2,1), background .4s;
}
/* Survol souris uniquement : sur tactile, :hover « colle » après un tap et
   laisserait une étiquette fantôme sur le dot initialement touché. */
@media (hover: hover){
  .page-nav button:hover::after{background:rgba(180,180,180,.7)}
}
/* Dot actif : agrandi via l'inset du ::after (11px), layout inchangé. */
.page-nav button.active::after{
  background:var(--gold);
  inset:6.5px;
}
/* Infobulle : nom de la section au survol, pastille encre lisible sur
   fond clair comme sombre. */
.page-nav button::before{
  content:attr(data-label);
  position:absolute;
  /* +8px seulement : le bord du rond visible est déjà 8px À L'INTÉRIEUR de la
     boîte du bouton → distance visuelle dot→infobulle inchangée (16px). */
  right:calc(100% + 8px);
  top:50%;
  transform:translateY(-50%) translateX(8px);
  white-space:nowrap;
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--cream);
  background:rgba(14,34,48,.9);
  border:1px solid rgba(201,168,106,.3);
  border-radius:999px;
  padding:7px 14px;
  opacity:0;
  pointer-events:none;
  transition:opacity .3s, transform .3s cubic-bezier(.2,.8,.2,1);
}
.page-nav button:focus-visible::before,
.page-nav button.touch-active::before{
  opacity:1;
  transform:translateY(-50%) translateX(0);
}
@media (hover: hover){
  .page-nav button:hover::before{opacity:1;transform:translateY(-50%) translateX(0)}
}
/* Scrub tactile (mobile) : le dot sous le doigt s'allume et montre son nom.
   Fond seul (pas de changement de taille) → aucun décalage pendant le glissement. */
.page-nav button.touch-active::after{background:var(--gold)}

/* ===== Bannière cookies : SUPPRIMÉE (13/08/2026, route « exemption CNIL »,
   cf. index.php / matomo.js — Matomo anonyme sans consentement). ===== */

/* ===== Replay (caché par défaut, visible sur première page) ===== */
.replay{
  position:fixed;bottom:36px;right:36px;
  background:transparent;border:1px solid rgba(246,241,234,.25);
  color:var(--cream-dim);
  font-family:var(--sans);font-size:10px;letter-spacing:.22em;text-transform:uppercase;
  padding:12px 18px;border-radius:50px;
  cursor:pointer;
  display:inline-flex;align-items:center;gap:10px;
  opacity:0;animation:fade 1.2s 8.2s forwards;
  transition:all .35s, opacity .4s;
  z-index:21;
}
.replay:hover{
  border-color:var(--cream);color:var(--cream);
  background:rgba(246,241,234,.05);
}
.replay svg{width:11px;height:11px}
.replay.hidden{opacity:0;pointer-events:none;animation:none}

/* ===== Lien d'évitement =====
   Hors écran tant qu'il n'a pas le focus, il descend dans la page dès qu'on
   tabule depuis la barre d'adresse. z-index 70 : au-dessus du menu (30/42) ET
   du voile de transition (60), sinon il serait invisible au moment précis où
   quelqu'un arrive sur la page. Registre visuel du site (or poli, capitales
   espacées) mais SANS le reflet balayé des boutons : il ne s'affiche qu'une
   fraction de seconde, une animation n'y serait que du bruit. */
.skip-link{
  position:fixed;
  top:0;left:50%;
  z-index:70;
  transform:translate(-50%,-120%);
  padding:12px 22px;
  border-radius:0 0 12px 12px;
  background:var(--gold-grad);
  color:var(--ink);
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.18em;
  text-transform:uppercase;
  text-decoration:none;
  box-shadow:var(--gold-sheen), 0 10px 28px -10px rgba(0,0,0,.5);
  transition:transform .22s cubic-bezier(.2,.8,.2,1);
}
.skip-link:focus-visible{transform:translate(-50%,0)}
/* La cible ne porte tabindex="-1" que pour recevoir le focus au clic sur le
   lien : pas d'anneau à cet instant (le geste est délibéré), l'élément suivant
   reprend l'indicateur normal. */
#contenu:focus{outline:none}

/* ===== Menu de navigation =====
   Barre fixe au-dessus de tout (z>canvas). La couleur du texte s'adapte à
   la section affichée via la classe .on-light (posée par setActivePage).
   Le logo n'apparaît que hors du hero (le wordmark géant y est déjà).
   Apparition en fondu après le reveal initial, comme les dots. */
.site-menu{
  position:fixed;
  top:0;left:0;right:0;
  z-index:30;
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:16px clamp(24px, 3vw, 44px) 0;
  pointer-events:none;
  color:var(--cream);
  transition:color .25s;   /* rapide : la couleur suit le fond au moment du glissement, sans traîner en gris */
  opacity:0;
  /* Apparaît PENDANT la formation du logo, assez tôt (3,2 s — avancé à la
     demande d'Allan, anciennement 4,2 s). */
  animation:fade 1s 3.2s forwards;
}
.site-menu.on-light{color:var(--ink)}
/* Scrim de tête (pages animées) : le menu flotte sans barre, mais un titre ou
   du texte de section peut monter dans sa zone. Un dégradé « couleur de la
   section → transparent » le back discrètement — invisible sur le fond nu
   (même couleur), visible seulement là où du contenu passe dessous, sans
   réintroduire de barre pleine. Le ton suit .on-light comme la couleur du
   texte. z-index:-1 : derrière les liens du menu, mais au-dessus du canvas
   (le menu est un contexte d'empilement isolé). Exclut .site-menu--page (qui
   a son propre scrim au scroll). Absent sur le hero (wordmark immaculé). */
.site-menu:not(.site-menu--page)::before{
  content:"";
  position:absolute;
  inset:0 0 auto 0;
  /* RESSERRÉ sur la bande du menu (cf. MENU_BAND app.js) : opaque sur la
     rangée des boutons (0→62px) puis court fondu (62→96px). Pas de grande
     nappe qui délaverait un titre simplement PROCHE du menu. */
  height:96px;
  z-index:-1;
  pointer-events:none;
  background:linear-gradient(to bottom, rgba(24,53,66,1) 0%, rgba(24,53,66,1) 64%, rgba(24,53,66,0) 100%);
  /* Masqué par défaut : n'apparaît (en fondu) que quand app.js pose
     .needs-scrim, c.-à-d. quand du contenu entre dans la bande du menu. */
  opacity:0;
  transition:opacity .3s ease, background .35s ease;
}
.site-menu.needs-scrim:not(.site-menu--page)::before{opacity:1}
.site-menu.on-light:not(.site-menu--page)::before{
  background:linear-gradient(to bottom, rgba(246,241,234,1) 0%, rgba(246,241,234,1) 64%, rgba(246,241,234,0) 100%);
}
/* Hero : aucun scrim (wordmark immaculé). content:none retire le pseudo-
   élément net, sans transition ; body[data-home] force la priorité sur la
   règle de base (spécificité supérieure). */
body[data-home] .site-menu.on-hero::before{content:none}
/* Overlay mobile ouvert : la barre passe AU-DESSUS de l'overlay (z-index
   des enfants local au contexte d'empilement de .site-menu) et repasse en
   crème quelle que soit la section derrière. */
.site-menu.menu-open{z-index:42;color:var(--cream)}
/* Les enfants ne redeviennent cliquables qu'une fois le menu visible
   (classe .ready posée par JS) : pas de liens invisibles cliquables. */
.site-menu.ready .menu-brand,
.site-menu.ready .menu-list,
.site-menu.ready .menu-burger{pointer-events:auto}
.menu-brand{
  /* Le VRAI logo (même fichier que le wordmark du hero), peint en
     currentColor via un masque : il suit la couleur adaptative du menu
     frame par frame, exactement comme le texte qu'il remplace. Le texte
     « Syneloria » reste dans le HTML (accessibilité, SEO, copie) mais
     n'est plus peint (font-size:0 — surtout PAS color:transparent, qui
     rendrait currentColor, donc le fond masqué, transparent aussi). */
  display:inline-block;
  width:125px;                 /* ratio du SVG : 573×69 ≈ 8,3:1 → 125×15 */
  height:15px;
  font-size:0;
  /* color explicite : sans elle, le bleu UA par défaut des <a> gagnerait
     sur l'héritage → logo bleu (currentColor en dépend). */
  color:inherit;
  background-color:currentColor;
  -webkit-mask:url('Images/logo-syneloria.svg') no-repeat left center / contain;
  mask:url('Images/logo-syneloria.svg') no-repeat left center / contain;
  text-decoration:none;
  transition:opacity .5s;
}
/* Sur le hero, le wordmark en particules tient lieu de logo */
.site-menu.on-hero .menu-brand{opacity:0;pointer-events:none !important}
.menu-list{
  list-style:none;
  display:flex;
  align-items:center;
  gap:clamp(18px, 2vw, 30px);
}
.menu-link{
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.18em;
  text-transform:uppercase;
  text-decoration:none;
  color:currentColor;
  opacity:.72;
  background:none;border:none;cursor:pointer;
  padding:6px 0;
  display:inline-flex;align-items:center;gap:7px;
  /* PAS de transition sur color : le lien hérite déjà la couleur animée du
     header (.site-menu transitionne color) ; une transition enfant qui course
     celle du parent finit parfois FIGÉE sur une valeur intermédiaire (gris)
     quand .on-light bascule plusieurs fois pendant un morph (bug Chrome). */
  transition:opacity .3s;
}
.menu-link:hover,
.menu-item:focus-within .menu-trigger{opacity:1;color:var(--gold)}

/* Filet fin qui se déploie sous le lien survolé (hors pastille Contact).
   currentColor SANS transition de couleur (cf. piège Chrome ci-dessus) :
   seul le transform est animé, la couleur suit celle du lien telle quelle. */
.menu-list .menu-link:not(.menu-link--cta){position:relative}
.menu-list .menu-link:not(.menu-link--cta)::after{
  content:"";
  position:absolute;left:0;right:0;bottom:0;height:1px;
  background:currentColor;opacity:.55;
  transform:scaleX(0);transform-origin:left center;
  transition:transform .35s ease;
}
/* Déclencheurs de sous-menu : le filet reste déployé tant que le panneau est
   ouvert (survol de l'item entier ou focus), comme la rotation du chevron. */
.menu-list .menu-link:not(.menu-link--cta):hover::after,
.menu-list:not(:focus-within) .menu-item:hover .menu-trigger::after,
.menu-list .menu-item:focus-within .menu-trigger::after,
.menu-list .menu-link.is-current:not(.menu-link--cta)::after{transform:scaleX(1)}
/* Contact : pastille dorée pleine pour le faire ressortir. Le texte reste
   encre foncée quelle que soit la section (ne suit pas currentColor). */
.menu-link--cta{
  opacity:1;
  color:var(--ink-2);
  background:var(--gold-grad);
  border-radius:999px;
  padding:9px 22px;
  box-shadow:var(--gold-sheen);
  transition:background .35s, box-shadow .35s, transform .35s cubic-bezier(.2,.8,.2,1);
}
.menu-link--cta.is-current{
  box-shadow:0 0 0 1px rgba(24,53,66,.35) inset, var(--gold-sheen);
}
.menu-link--cta:hover{
  opacity:1;
  color:var(--ink-2);
  background:var(--gold-grad-hover);
  box-shadow:0 12px 26px -12px rgba(201,168,106,.6), var(--gold-sheen);
  transform:translateY(-1px);
}
.menu-trigger svg{width:9px;height:9px;flex:0 0 auto;transition:transform .3s}
/* Survol : ouvre le chevron SEULEMENT si aucun déclencheur n'est en focus
   (sinon un clic sur l'un + survol de l'autre = deux ouverts, cf. .menu-sub). */
.menu-list:not(:focus-within) .menu-item:hover .menu-trigger svg,
.menu-item:focus-within .menu-trigger svg{transform:rotate(180deg)}
/* Panneau déroulant (crème, lisible sur sections claires ET sombres).
   Le padding-top fait pont entre le déclencheur et le panneau pour que le
   hover ne se coupe pas en traversant l'interstice. */
.menu-item{position:relative}
.menu-sub{
  position:absolute;
  top:100%;left:50%;
  transform:translateX(-50%);
  padding-top:16px;
  opacity:0;visibility:hidden;
  transition:opacity .35s, visibility .35s;
}
/* Ouverture au SURVOL uniquement si rien n'est en focus dans le menu ; sinon
   (un déclencheur cliqué → focus) seul le sous-menu focalisé reste ouvert, et
   survoler l'autre déclencheur ne l'ouvre PAS → jamais deux ouverts. */
.menu-list:not(:focus-within) .menu-item:hover .menu-sub,
.menu-item:focus-within .menu-sub{opacity:1;visibility:visible}
.menu-sub-inner{
  min-width:240px;
  background:var(--cream);
  border:1px solid rgba(24,53,66,.08);
  border-radius:14px;
  padding:10px;
  box-shadow:0 26px 60px -22px rgba(14,34,48,.4);
  display:flex;flex-direction:column;
}
.menu-sub-inner a{
  display:flex;
  align-items:center;
  gap:12px;
  font-family:var(--serif);
  font-style:normal;
  font-size:15.5px;
  color:var(--ink);
  text-decoration:none;
  padding:10px 16px;
  border-radius:9px;
  white-space:nowrap;
  transition:background .3s;
}
.menu-sub-inner a:hover{background:rgba(201,168,106,.16)}
.menu-sub-inner a.is-current{background:rgba(201,168,106,.16)}
/* Icône Lucide dorée devant chaque entrée de sous-menu (boîte fixe → les
   libellés restent alignés quelle que soit la largeur du glyphe). */
.menu-ico{
  width:19px;height:19px;
  flex:0 0 auto;
  color:currentColor;
  opacity:.85;
  transition:opacity .3s;
}
.menu-sub-inner a:hover .menu-ico{opacity:1}
/* Burger (mobile) : deux barres → croix */
.menu-burger{
  display:none;
  background:none;border:none;cursor:pointer;
  width:40px;height:34px;
  position:relative;
  color:currentColor;
  z-index:41;
}
.menu-burger span{
  position:absolute;left:8px;right:8px;height:1.5px;
  background:currentColor;
  transition:transform .4s cubic-bezier(.2,.8,.2,1), top .4s cubic-bezier(.2,.8,.2,1);
}
.menu-burger span:nth-child(1){top:13px}
.menu-burger span:nth-child(2){top:21px}
.menu-burger.open{color:var(--cream)}
.menu-burger.open span:nth-child(1){top:17px;transform:rotate(45deg)}
.menu-burger.open span:nth-child(2){top:17px;transform:rotate(-45deg)}
/* Overlay plein écran (mobile) */
.menu-overlay{
  position:fixed;inset:0;
  z-index:40;
  background:
    radial-gradient(ellipse at 50% 18%, rgba(201,168,106,.09) 0%, transparent 55%),
    var(--ink-2);
  display:flex;
  /* safe center : centré si le menu tient, aligné en HAUT s'il déborde —
     sinon align-items:center rogne le haut (« Accueil » collé/inatteignable
     au-dessus du bord, padding avalé) sur les écrans bas. */
  align-items:safe center;
  justify-content:center;
  overflow-y:auto;
  opacity:0;visibility:hidden;
  /* visibility en 0s RETARDÉE de la durée du fondu : à la fermeture elle bascule
     à la toute fin (le fondu reste visible), à l'ouverture elle bascule
     IMMÉDIATEMENT — c'est ce dernier point qui compte, sinon les liens de
     l'overlay ne sont pas encore focalisables à l'instant où le JS veut y
     poser le focus, et le piège de focus s'ouvre sur du vide (mesuré). */
  transition:opacity .45s, visibility 0s .45s;
}
.menu-overlay.open{opacity:1;visibility:visible;transition:opacity .45s, visibility 0s}
.menu-overlay nav{
  display:flex;flex-direction:column;
  align-items:center;
  /* gap:0 → tout l'espacement est porté par les paddings/margins des rangées,
     sinon il s'additionne au gap et le rythme devient impossible à raisonner. */
  gap:0;
  /* Padding vertical symétrique (le nav est centré : haut == bas). 60 px suffit
     à dégager le burger en haut, et à laisser le bouton Contact au-dessus de la
     barre .page-nav des pages à sections. */
  padding:60px 24px;
  text-align:center;
}
.menu-overlay a{
  font-family:var(--serif);
  font-style:italic;
  font-size:23px;
  color:var(--cream);
  text-decoration:none;
  padding:9px 12px;
  transition:color .3s;
}
.menu-overlay a:hover{color:var(--gold)}
.menu-overlay a.is-current{position:relative}
.menu-overlay a.is-current::before{
  content:"";
  position:absolute;left:0;top:50%;transform:translateY(-50%);
  width:3px;height:3px;border-radius:50%;
  background:var(--gold);
}
.menu-overlay .menu-group{
  margin-top:26px;
  margin-bottom:10px;
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.26em;
  text-transform:uppercase;
  color:var(--gold);
}
/* Sous-entrées : SANS icône sur mobile. Chaque rangée étant centrée
   individuellement, une icône en tête se retrouve à un x différent selon la
   longueur du libellé (jusqu'à 82 px d'écart mesurés) — l'œil cherche une
   colonne qui n'existe pas. On garde donc le seul axe central, et la
   hiérarchie passe par le romain + la taille + la couleur.
   Les icônes restent servies au dropdown desktop (même source PHP). */
.menu-overlay a.sub{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  font-style:normal;
  font-size:16.5px;
  color:var(--cream-dim);
  padding:7px 12px;
}
.menu-overlay a.sub .menu-ico{display:none}
/* Retour au niveau principal (Blog) après une sous-liste : sans ça, 2 px
   séparent « Simulateur d'aides » de « Blog » et Blog/Contact semblent
   appartenir au groupe « Outils ». */
.menu-overlay a.sub + a:not(.sub){margin-top:26px}
/* Contact : même bouton doré que sur la barre desktop, pour redonner au menu
   un point d'arrivée. */
.menu-overlay a.cta{
  margin-top:16px;
  font-family:var(--sans);
  font-style:normal;
  font-size:12px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--ink-2);
  background:var(--gold-grad);
  border-radius:999px;
  padding:13px 30px;
  box-shadow:var(--gold-sheen);
  transition:background .35s, box-shadow .35s;
}
.menu-overlay a.cta:hover{
  color:var(--ink-2);
  background:var(--gold-grad-hover);
  box-shadow:0 12px 26px -12px rgba(201,168,106,.6), var(--gold-sheen);
}
@media (max-width:1139px){
  .menu-list{display:none}
  .menu-burger{display:block}
  .site-menu{padding-top:10px}
  /* Menu réduit au seul burger : le logo de gauche et le dégradé de tête
     (needs-scrim, pleine largeur sous la rangée des boutons) n'ont plus
     d'objet — il n'y a plus de rangée de boutons à protéger. */
  .menu-brand{display:none}
  .site-menu:not(.site-menu--page)::before{content:none}
}
@media (min-width:1140px){
  .menu-overlay{display:none}
}

@media (max-width:700px){
  .tagline{margin-top:32px;font-size:15px;padding:0 12px}
  .scroll-hint{bottom:24px}
  .replay{bottom:20px;right:20px;padding:10px 14px;font-size:9px}
  /* Hero « Syneloria » plus imposant sur mobile (plancher relevé, échelle vw
     dédiée — le desktop garde --title-display inchangé). */
  .page--dark .particle-title{font-size:clamp(72px, 21vw, 96px)}
  /* Tailles de titres : plus de surcharge mobile — l'échelle --title-* est
     responsive (un seul clamp mobile→desktop). On ne garde ici que les
     marges spécifiques au mobile. */
  .page--light{padding:60px 24px}
  .page--light .particle-title{margin-bottom:40px}
  .page--statement{padding:60px 24px}
  /* Titres à longues lignes : taille bornée par la largeur d'écran (sinon
     ils débordent). La densité accrue suffit à les rendre lisibles. */
  .page--statement .particle-title{margin-bottom:36px}
  /* gap 0 : boutons de 24px → pas de 24px (ancien rythme mobile ≈ 22px) */
  .page-nav{right:18px;gap:0}
  .hero-cta{margin-top:36px;padding:13px 26px;font-size:10px}

  /* Services : cartes plus étroites, bandeau image réduit */
  .service-card{flex:0 0 300px;border-radius:16px}
  .service-media{height:96px}
  .service-card-inner{padding:18px 20px 18px}
  .service-card-title{font-size:21px;margin-bottom:12px}
  .service-card-body{font-size:13px;margin-bottom:18px}
  /* Carte étroite (300px − 40 de padding = 260 utiles) : on resserre encore
     la chasse pour garder les quatre libellés sur une ligne chacun. */
  .service-card-links{gap:10px}
  .service-card-links .service-card-link{letter-spacing:.04em}
  .card-num{font-size:26px;top:12px;right:16px}

  /* Engagements : rangée scrollable horizontale — on redonne un cadre
     aux cartes, indispensable pour lire le geste de balayage. */
  .page--edge{padding:48px 0;gap:28px}
  .edge-grid{
    display:flex;
    overflow-x:auto;
    scroll-snap-type:x mandatory;
    scroll-padding-left:24px;
    -webkit-overflow-scrolling:touch;
    gap:16px;
    /* flex-shrink:0 : même protection que services/équipe — la colonne flex
       de la section ne doit pas écraser la rangée sur écran bas (texte coupé) ;
       à pleine hauteur la section devient défilable. */
    flex-shrink:0;
    padding:8px 24px 14px;
  }
  .edge-card{
    flex:0 0 262px;
    scroll-snap-align:start;
    background:linear-gradient(165deg, rgba(246,241,234,.05), rgba(246,241,234,.015));
    border:1px solid rgba(246,241,234,.12);
    border-radius:16px;
    padding:22px 20px 20px;
  }
  .edge-card:hover{border-color:rgba(201,168,106,.4)}
  .edge-card p{font-size:13px}

  /* À propos : colonnes empilées ; texte d'abord, carrousel doré compact ensuite */
  .about-cols{grid-template-columns:1fr;gap:22px}
  .about-media{order:2}
  .about-media .media{min-height:190px}
  .about-lead{font-size:16px}
  .about-more{margin-top:14px;font-size:14px}
  .about-slide{padding:22px 22px}
  .about-slide-num{font-size:26px;margin-bottom:10px}
  .about-slide h3{font-size:21px;margin-bottom:8px}
  .about-slide p{font-size:14px}
  .about-dots{left:22px;bottom:20px}

  /* Constat : manifeste compact */
  .manifesto-lead{font-size:16px}
  .manifesto-rule{margin:22px auto}
  .manifesto-note{font-size:14px}

  /* Financements : colonnes empilées, plus compact, image masquée.
     margin-bottom 34px (au lieu de 18) : le titre 3 lignes touchait
     presque le paragraphe (relevé par Allan sur iPhone). */
  .page--funding{padding:56px 24px}
  .page--light.page--funding .particle-title{margin-bottom:34px}
  .split-cols{grid-template-columns:1fr;gap:18px;max-width:760px}
  .split-text{gap:12px}
  .split-lead{font-size:14px}
  .split-text .callout{padding:13px 16px;font-size:13px}

  /* Références */
  .page--trust{padding:56px 20px}
  .page--trust .particle-title{margin:0 0 10px}
  .trust-lead{margin-bottom:30px}
  .trust-quote{font-size:15px;padding:30px 24px 26px;margin-top:6px}
  /* Guillemets inline : ils suivent la police (em), aucune surcharge nécessaire. */
  .trust-quote cite{font-size:9.5px;margin-top:14px}
  .trust-marquee{margin-top:32px}
  .trust-track{gap:34px;padding-left:34px;animation-duration:34s}
  .trust-logo{gap:9px}
  .trust-logo-mark{width:32px;height:32px;font-size:12px}
  .trust-logo-name{font-size:10px}
  .trust-logo-sector{font-size:12px}
  /* min-width:0 : .trust-stats est un ITEM de la colonne flex .page--trust →
     sans ça il refuse de rétrécir sous sa largeur min-content et déborde du
     couloir de la pilule. flex-wrap : si ça ne tient pas, la 3ᵉ stat passe
     dessous (filets latéraux retirés, sans sens une fois replié). */
  .trust-stats{margin-top:26px;min-width:0;flex-wrap:wrap;row-gap:12px}
  .trust-stat{padding:2px 18px;border-left:none}
  .trust-stat b{font-size:20px}
  .trust-stat span{font-size:8px;letter-spacing:.16em}

  /* Équipe : rangée scrollable horizontale — cartes recadrées pour le swipe */
  .page--team{padding:48px 0;gap:24px}
  .page--team .particle-title{margin-bottom:18px}
  .team-lead{font-size:14px}
  .team-grid{
    display:flex;
    overflow-x:auto;
    scroll-snap-type:x mandatory;
    scroll-padding-left:24px;
    -webkit-overflow-scrolling:touch;
    gap:16px;
    /* flex-shrink:0 : la colonne flex de la section ne doit pas comprimer la
       rangée sur écran bas (cartes écrasées → texte coupé). À pleine hauteur,
       la section devient défilable (safe center). Padding bas élargi : la
       rangée overflow-x:auto rogne sinon l'ombre portée des cartes. */
    flex-shrink:0;
    /* 46px : l'ombre des cartes s'étend 42px sous elles (18px offset + 44px
       blur − 20px spread) — mesuré, sinon elle est rognée de quelques px. */
    padding:16px 24px 46px;
  }
  .team-card{
    flex:0 0 250px;
    scroll-snap-align:start;
    border-radius:16px;
  }
  .team-portrait{height:130px}
  .team-body{padding:18px 18px 18px}
  .team-card h3{font-size:20px}
  .team-body > p:last-child{font-size:13.5px}
  .team-note{font-size:13px}

  /* CTA finale */
  .page--cta{padding:48px 20px 28px}
  .cta-text{font-size:14px;margin-bottom:32px}
  /* Respiration accrue avant la bande sombre du pied de page */
  .cta-body{padding-bottom:34px}
  .site-foot{margin:0 -20px -28px;padding:30px 20px 28px}
  .foot-cols{flex-direction:column;align-items:center;text-align:center;gap:24px}
  .foot-col--brand{max-width:none}
  .foot-brand{font-size:20px}
  .foot-label{margin-bottom:10px}
  .foot-fineprint{margin-top:24px;font-size:9px;letter-spacing:.08em}
}

/* Écrans peu hauts (laptops 768-840px) : resserre les pages denses */
@media (min-width:701px) and (max-height:840px){
  .page--edge{gap:26px}
  .edge-card{padding:20px 22px 18px}
  .edge-card p{font-size:13px}
  .edge-card h3{font-size:17px;margin-bottom:6px}
  .page--team{gap:22px}
  .page--team .particle-title{margin-bottom:16px}
  .team-portrait{height:clamp(130px, 15vh, 160px)}
  .team-body{padding:18px 22px 20px}
  .team-body > p:last-child{font-size:14px}
  .trust-quote{font-size:clamp(16px, 1.6vw, 20px)}
  .trust-marquee{margin-top:34px}
  .trust-stats{margin-top:30px}
  /* À propos : lead et piliers resserrés */
  .about-lead{font-size:17px}
  .about-more{margin-top:16px;font-size:14px}
  .about-media .media{min-height:260px}
  /* Services : bandeau image et corps réduits */
  .page--services{gap:28px;padding:48px 0}
  .service-media{height:clamp(84px, 11vh, 120px)}
  .service-card-inner{padding:20px 24px 20px}
  .service-card-title{font-size:22px;margin-bottom:12px}
  .service-card-body{font-size:13.5px;margin-bottom:18px}
  /* Financements : resserrement vertical */
  .split-text{gap:24px}
  /* Formats (formations, section sur-mesure) : titre + copie + 4 cartes +
     note doivent tenir sans scroll interne sur les laptops peu hauts
     (mesuré : 768px de contenu pour 720px de viewport sans ces règles).
     Scopé au data-slug pour ne pas toucher le rythme des autres sections.
     ⚠️ Spécificité : ce bloc est AVANT les règles de base (.sec
     .particle-title ligne ~2046, .fmt-* ligne ~2130) — à spécificité égale
     elles gagneraient (piège documenté §README). D'où le préfixe
     [data-slug="sur-mesure"] sur CHAQUE règle. */
  .sec[data-slug="sur-mesure"] .particle-title{margin-bottom:28px}
  [data-slug="sur-mesure"] .sec-copy{font-size:15px}
  [data-slug="sur-mesure"] .duo-note{margin-top:16px}
  /* Conférences, section sujets (copie + duo de stats + copie) : mesurée à
     747px de contenu pour 720px de viewport sans ces règles. Mêmes
     précautions de spécificité que ci-dessus. */
  .sec[data-slug="sujets"] .particle-title{margin-bottom:28px}
  [data-slug="sujets"] .sec-copy{font-size:15px}
  [data-slug="sujets"] .stat-duo{margin-top:18px}
  [data-slug="sujets"] .stat-duo-src{margin-top:8px}
  [data-slug="sujets"] .sec-copy--after{margin-top:18px}
  /* Automatisations, section métiers (copie + onglets métiers + outil
     gratuit + bouton) : resserrage pour tenir dans 100vh sur laptops peu
     hauts. Mêmes précautions de spécificité que ci-dessus. */
  .sec[data-slug="metiers"] .particle-title{margin-bottom:28px}
  [data-slug="metiers"] .sec-copy{font-size:15px}
  .sec[data-slug="metiers"] .job-tabs-nav{margin-top:16px}
  .sec[data-slug="metiers"] .job-panels{margin-top:14px}
  .sec[data-slug="metiers"] .gain-list.job-ex,
  .sec[data-slug="metiers"] .job-msg{padding:2px 22px}
  .sec[data-slug="metiers"] .gain-list.job-ex li{padding:8px 0 8px 22px;font-size:14px;line-height:1.45}
  .sec[data-slug="metiers"] .gain-list.job-ex li::before{top:calc(8px + .55em)}
  .sec[data-slug="metiers"] .job-msg{padding:18px 22px}
  [data-slug="metiers"] .sec-copy--after{margin-top:16px}
  [data-slug="metiers"] .fmt-cta{margin-top:14px}
  [data-slug="sur-mesure"] .fmt-grid{margin-top:22px}
  [data-slug="sur-mesure"] .fmt-card{padding:18px 18px 16px}
  [data-slug="sur-mesure"] .fmt-days{margin-bottom:8px}
  [data-slug="sur-mesure"] .fmt-days b{font-size:30px}
  [data-slug="sur-mesure"] .fmt-card h3{font-size:16.5px;margin-bottom:6px}
  [data-slug="sur-mesure"] .fmt-desc{font-size:13px}
}

/* Grands écrans : les 4 cartes services tiennent en entier → grille fixe,
   plus de défilement latéral inutile. En dessous de 1440px on garde la
   rangée scrollable (sinon les cartes deviennent trop étroites et la plus
   longue déborderait en hauteur). */
@media (min-width:1440px){
  .services-cards{
    display:grid;
    grid-template-columns:repeat(4, 1fr);
    gap:24px;
    max-width:1480px;
    margin:0 auto;
    padding:14px 24px 24px;
    overflow:visible;
    scroll-snap-type:none;
  }
  .service-card{flex:none}
}

/* Écrans peu hauts + menu desktop : PLANCHER DE DÉGAGEMENT des sections
   denses. Quand leur contenu déborde, safe center les ancre en haut et le
   titre venait REPOSER dans la bande du menu (76px) → scrim affiché dès
   l'arrivée, sans scroll (remonté par Allan). Avec un padding-top de 96px
   (fin de fondu du scrim), le premier texte démarre sous la zone du menu :
   le scrim ne s'affiche plus qu'en cas de vrai scroll interne. Scopé aux
   largeurs à menu desktop (≥1140px — en dessous, burger seul : ni scrim,
   ni collision) et au seuil « écrans bas » déjà en usage (≤840px).
   ⚠️ Ce bloc doit rester APRÈS les resserrages « écrans peu hauts »
   ci-dessus : .page--services{padding:48px 0} y écraserait sinon le
   plancher (même spécificité, l'ordre tranche). */
@media (min-width:1140px) and (max-height:840px){
  .page--services, .page--edge, .page--trust,
  .page--team, .page--funding, .page--cta{padding-top:96px}
}

@media (prefers-reduced-motion: reduce){
  *{animation-duration:.01s !important;animation-delay:0s !important}
  .pages{transition:none}
  /* Carrousel figé : on affiche les 4 volets empilés en liste dans la carte. */
  .about-media .media{min-height:0;height:auto}
  .about-cycle{position:static;display:flex;flex-direction:column;gap:22px;padding:clamp(30px,3vw,44px)}
  .about-slide{position:static;opacity:1;padding:0;transform:none;animation:none}
  .about-slide-num{margin-bottom:6px}
  .about-dots{display:none}
}

/* ===========================================================================
   COMPOSANTS DES PAGES FULL-PAGE GÉNÉRIQUES (formations…) — sections .sec
   réutilisant .page--statement (sombre) et .page--light (clair).
   =========================================================================== */
/* Titre : marge normalisée sous le titre pour ces sections de contenu */
.sec .particle-title{margin-bottom:38px}
.sec[data-slug="faq"] .particle-title{margin-bottom:calc(.62em + 15px)}
/* Copie de lecture : hérite la couleur de sa section (crème sur sombre,
   encre sur clair), centrée comme le manifeste de l'accueil. */
.sec-copy{
  max-width:760px;
  margin:0 auto;
  font-family:var(--serif);
  font-size:clamp(16px, 1.4vw, 19px);
  line-height:1.65;
  text-align:center;
  opacity:.92;
}
.sec-copy p{margin-bottom:.95em}
.sec-copy p:last-child{margin-bottom:0}
.sec-copy em{font-style:normal;color:var(--gold)}
.sec-copy strong{font-weight:500}
.sec-cta{margin-top:36px;text-align:center}
/* Statistique sourcée (section niveaux) : bloc compact — le chiffre-clé doré
   en grand porte l'info, légende courte à côté, source discrète en dessous.
   Traitement horizontal (au lieu d'un paragraphe centré qui s'étalait sur
   3-4 lignes). Emplacement volontairement isolé pour une édition facile
   (cf. commentaire dans formations.php). */
.stat-line{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:20px;
  max-width:560px;
  margin:22px auto 0;
}
.stat-fig{
  flex:none;
  font-family:var(--serif);
  font-weight:500;
  font-size:clamp(42px, 4.6vw, 58px);
  line-height:.95;
  letter-spacing:-.01em;
  color:var(--gold);
}
.stat-cap{
  max-width:300px;
  font-family:var(--serif);
  font-size:clamp(14px, 1.15vw, 16px);
  line-height:1.4;
  text-align:left;
  color:var(--ink-dim);
}
.stat-src{
  display:block;
  margin-top:5px;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--ink-dim);
  opacity:.65;
}
a.stat-src{
  width:fit-content;
  text-decoration:underline;
  text-decoration-thickness:1px;
  text-underline-offset:3px;
  transition:opacity .3s;
}
a.stat-src:hover, a.stat-src:focus-visible{opacity:1}
/* Sur section sombre, la légende s'éclaircit (héritée pour d'éventuels
   réemplois hors niveaux ; le chiffre reste doré). */
.page--statement .stat-cap,
.page--statement .stat-src{color:var(--cream-dim)}
/* Duo de cartes (Formations / Ateliers) — réutilise le style .edge-card */
.duo-grid{
  display:grid;
  grid-template-columns:repeat(2, 1fr);
  gap:20px;
  max-width:880px;
  margin:36px auto 0;
}
.duo-note{
  max-width:720px;
  margin:24px auto 0;
  font-family:var(--serif);
  font-style:italic;
  font-size:14.5px;
  line-height:1.6;
  text-align:center;
  color:var(--cream-dim);
}
/* Formats de formation (section sur-mesure, formations) : 4 cartes-durées —
   le programme est toujours sur mesure, seule la durée s'ajuste. La carte
   3 jours (format de référence) porte un liseré doré plus marqué + pastille
   posée sur son bord haut. Les ATELIERS ont été retirés de cette section
   (déplacés à terme vers Accompagnement IA, cf. README). */
.fmt-grid{
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  gap:16px;
  max-width:1060px;
  margin:32px auto 0;
  /* .page-inner est un flex column : sans min-width:0, l'enfant serait étiré
     à son max-content au lieu de rester dans le viewport (même piège que
     .duo-grid). */
  min-width:0;
  max-width:min(1060px, 100%);
}
.fmt-card{
  position:relative;
  display:flex;
  flex-direction:column;
  padding:22px 20px 20px;
  border-radius:18px;
  border:1px solid rgba(246,241,234,.09);
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
  text-align:left;
  transition:transform .5s cubic-bezier(.2,.8,.2,1), border-color .5s, background .5s, box-shadow .5s;
}
.fmt-card:hover{
  transform:translateY(-5px);
  border-color:rgba(201,168,106,.5);
  background:linear-gradient(158deg, rgba(201,168,106,.10) 0%, rgba(246,241,234,.02) 62%);
  box-shadow:0 28px 56px -30px rgba(0,0,0,.6);
}
.fmt-days{
  display:flex;
  align-items:baseline;
  gap:7px;
  margin-bottom:10px;
}
.fmt-days b{
  font-family:var(--serif);
  font-weight:500;
  font-size:34px;
  line-height:1;
  color:var(--gold);
}
.fmt-days span{
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--cream-dim);
}
.fmt-card h3{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:17.5px;
  color:var(--cream);
  margin-bottom:8px;
}
.fmt-desc{
  font-family:var(--serif);
  font-size:13.5px;
  line-height:1.5;
  color:var(--cream-dim);
  margin:0;
}
.fmt-card--ref{
  border-color:rgba(201,168,106,.45);
  background:linear-gradient(158deg, rgba(201,168,106,.10) 0%, rgba(246,241,234,.02) 62%);
}
.fmt-ref{
  position:absolute;
  top:-9px;
  left:50%;
  transform:translateX(-50%);
  margin:0;
  padding:3px 10px;
  border-radius:999px;
  border:1px solid rgba(201,168,106,.5);
  background:var(--ink);
  font-family:var(--sans);
  font-size:9.5px;
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--gold);
  white-space:nowrap;
}
/* CTA vers l'accompagnement IA (sous la note « autres prestations ») :
   marge resserrée par rapport au .sec-cta standard (36px) pour que la
   section reste dans 100vh. */
.fmt-cta{margin-top:20px}
/* Gains par métier (section acquis, formations) : 4 mini-scénarios par
   fonction en 2×2 — remplace l'ancienne liste de capacités génériques
   (recalée par Allan). Icône dorée NUE (pas de disque cerclé : « fait
   bouton », cf. cartes financements). Cartes à la ligne, jamais de
   défilement latéral. */
.job-grid{
  display:grid;
  grid-template-columns:repeat(2, 1fr);
  gap:14px;
  margin:30px auto 0;
  min-width:0;
  max-width:min(880px, 100%);
}
.job-card{
  display:flex;
  align-items:flex-start;
  gap:14px;
  text-align:left;
  padding:18px 20px;
  border-radius:16px;
  border:1px solid rgba(246,241,234,.09);
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
}
.job-ico{
  flex:none;
  margin-top:2px;
  color:var(--gold);
}
.job-ico svg{width:20px;height:20px}
.job-card h3{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:16.5px;
  color:var(--cream);
  margin-bottom:5px;
}
.job-card p{
  font-family:var(--serif);
  font-size:13.5px;
  line-height:1.5;
  color:var(--cream-dim);
  margin:0;
}
/* Duo de statistiques sourcées (conférences, section sujets) : deux blocs
   côte à côte, chaque POURCENTAGE AU-DESSUS de sa phrase et le tout centré
   (demande d'Allan — la version chiffre-à-gauche déséquilibrait), source
   commune centrée dessous (le composant .stat-line vient de formations). */
.stat-duo{
  display:flex;
  justify-content:center;
  align-items:flex-start;
  gap:clamp(28px, 4vw, 64px);
  margin:26px auto 0;
}
.stat-duo .stat-line{
  margin:0;
  flex-direction:column;
  align-items:center;
  gap:6px;
  max-width:280px;
}
.stat-duo .stat-cap{text-align:center}
/* Conférences (références) : la colonne centrale « Tous publics » était
   comprimée par ses voisines aux longues légendes (mesuré : 238px contre
   ~440) et son intitulé cassait sur deux lignes — on lui garantit de quoi
   tenir sur une ligne, les voisines cèdent un peu de largeur. */
[data-slug="references"] .trust-stat:nth-child(2){min-width:300px}
/* Sélecteur de métier (automatisations) : PASTILLES au-dessus d'une carte
   (radios masquées + :checked, aucun JS — CSP, même esprit que
   details/popover). Le métier choisi s'affiche dans la carte ; « Vigneron »
   par défaut. La pastille « Autre métier » (bord pointillé) ouvre un renvoi
   vers le Détecteur d'automatisations. NB : version « onglets soudés au
   cadre » testée puis abandonnée (retour d'Allan). */
.job-tabs{position:relative;width:100%}
.job-tabs > input{
  position:absolute;
  width:1px;height:1px;
  opacity:0;
  pointer-events:none;
}
.job-tabs-nav{
  display:flex;
  flex-wrap:wrap;
  justify-content:center;
  gap:10px;
  margin:24px auto 0;
}
.job-tabs-nav label{
  padding:8px 18px;
  border-radius:999px;
  cursor:pointer;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--cream-dim);
  border:1px solid rgba(246,241,234,.18);
  transition:color .4s, border-color .4s, background .4s;
}
.job-tabs-nav label.job-tab-other{border-style:dashed}
.job-tabs-nav label:hover{border-color:rgba(201,168,106,.5);color:var(--cream)}
#jt-vigneron:checked ~ .job-tabs-nav label[for="jt-vigneron"],
#jt-fleuriste:checked  ~ .job-tabs-nav label[for="jt-fleuriste"],
#jt-sante:checked    ~ .job-tabs-nav label[for="jt-sante"],
#jt-traiteur:checked ~ .job-tabs-nav label[for="jt-traiteur"],
#jt-autre:checked    ~ .job-tabs-nav label[for="jt-autre"]{
  color:var(--gold);
  border-color:rgba(201,168,106,.65);
  border-style:solid;
  background:rgba(201,168,106,.1);
}
#jt-vigneron:focus-visible ~ .job-tabs-nav label[for="jt-vigneron"],
#jt-fleuriste:focus-visible  ~ .job-tabs-nav label[for="jt-fleuriste"],
#jt-sante:focus-visible    ~ .job-tabs-nav label[for="jt-sante"],
#jt-traiteur:focus-visible ~ .job-tabs-nav label[for="jt-traiteur"],
#jt-autre:focus-visible    ~ .job-tabs-nav label[for="jt-autre"]{
  outline:2px solid var(--gold);
  outline-offset:2px;
}
/* Carte des exemples (liste) ET carte du renvoi « Autre métier » (message) :
   même cadre. Les 5 panneaux sont EMPILÉS dans la même cellule de grille
   (grid-area:1/1) et masqués par visibility, jamais par display:none. Deux
   raisons : la hauteur du bloc vaut d'office celle du panneau le plus haut,
   donc aucun sursaut au changement de pastille SANS min-height magique à
   réajuster à chaque retouche de texte (l'ancien 198px n'aurait pas tenu les
   exemples longs) ; et visibility sort bien les panneaux cachés de l'arbre
   d'accessibilité et du Ctrl+F, ce que opacity seule ne ferait pas. */
.job-panels{
  display:grid;
  margin:18px auto 0;
  max-width:764px;
}
.gain-list.job-ex,
.job-msg{
  grid-area:1/1;
  margin:0;
  max-width:none;
  visibility:hidden;
  opacity:0;
  transform:translateY(5px);
  transition:opacity .35s ease, transform .35s ease, visibility 0s linear .35s;
  padding:6px 26px;
  border-radius:18px;
  border:1px solid rgba(246,241,234,.10);
  background:linear-gradient(158deg, rgba(246,241,234,.05) 0%, rgba(246,241,234,.012) 62%);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
}
.gain-list.job-ex li{
  display:block;
  position:relative;
  padding:11px 0 11px 22px;
  font-size:14.5px;
  line-height:1.5;
  color:var(--cream-dim);
  text-align:left;
}
.gain-list.job-ex li strong{
  color:var(--cream);
  font-weight:500;
}
.gain-list.job-ex li::before{
  content:"";
  position:absolute;
  left:2px;
  top:calc(11px + .58em);
  width:5px;
  height:5px;
  border-radius:50%;
  background:var(--gold);
}
/* Ligne « Et d'autres encore… » : note discrète, sans puce, mais AVEC le même
   filet de séparation que les exemples (demande d'Allan, 26/08/2026) — elle
   ferme la liste au lieu de flotter dessous. Pas d'opacity de groupe ici : elle
   éteindrait aussi le lien doré vers le Détecteur qu'elle porte. La discrétion
   passe donc par la couleur seule. */
.gain-list.job-ex li.job-etc{
  color:rgba(246,241,234,.42);
  font-style:italic;
}
.gain-list.job-ex li.job-etc::before{background:transparent}
/* Panneau « Autre métier » : message centré + bouton Détecteur. */
.job-msg{
  padding:24px 30px;
  text-align:center;
}
.job-msg p{
  max-width:460px;
  margin:0 auto 20px;
  font-family:var(--serif);
  font-size:15px;
  line-height:1.55;
  color:var(--cream-dim);
}
/* Fondu croisé au changement de pastille (zéro JS, CSP) : seul le panneau élu
   redevient visible, le cadre ne bouge pas d'un pixel puisque la grille garde
   la hauteur du plus haut. */
#jt-vigneron:checked  ~ .job-panels .job-ex--vigneron,
#jt-fleuriste:checked ~ .job-panels .job-ex--fleuriste,
#jt-sante:checked     ~ .job-panels .job-ex--sante,
#jt-traiteur:checked  ~ .job-panels .job-ex--traiteur,
#jt-autre:checked     ~ .job-panels .job-ex--autre{
  visibility:visible;
  opacity:1;
  transform:none;
  transition:opacity .45s ease, transform .45s ease, visibility 0s;
}
.job-ex--autre{display:grid;place-items:center}
/* Variante 1 colonne de la topic-list (items longs dans une carte étroite). */
.topic-list.topic-list--1col{grid-template-columns:1fr;gap:9px}
/* Méthode (automatisations) : 3 étapes ORDONNÉES en cartes claires — ici les
   numéros ont un sens (chaque étape conditionne la suivante), contrairement
   aux cartes financements où ils avaient été retirés (ordre inexistant). */
.steps-grid{
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:16px;
  margin:32px auto 0;
  min-width:0;
  max-width:min(960px, 100%);
}
/* Variante 4 étapes (Sites web) : les 4 étapes ORDONNÉES sur une seule rangée
   (séquence 1→2→3→4 qui se lit d'un trait), pas un 3+1 orphelin. Rangée courte
   → la section se centre symétriquement dans son 100vh comme les autres (un
   2×2 la rendait trop haute et heurtait le plancher de garde sous le menu).
   Responsive : 2×2 en tablette (≤1023px), 1 colonne en mobile (media ≤700px). */
.steps-grid--quad{grid-template-columns:repeat(4, 1fr); max-width:min(1040px, 100%)}
.step-card{
  text-align:left;
  padding:22px 22px 20px;
  border-radius:18px;
  background:rgba(255,255,255,.72);
  border:1px solid rgba(24,53,66,.07);
  box-shadow:0 18px 44px -18px rgba(24,53,66,.12);
}
.step-num{
  display:block;
  font-family:var(--serif);
  font-weight:500;
  font-size:30px;
  line-height:1;
  color:var(--gold);
  margin-bottom:10px;
}
.step-card h3{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:17.5px;
  color:var(--ink);
  margin-bottom:8px;
}
.step-card p{
  font-family:var(--serif);
  font-size:13.5px;
  line-height:1.55;
  color:var(--ink);
  opacity:.78;
  margin:0;
}
/* Tonalité sombre de la carte numérotée — même patron que .pledge-grid--dark
   (le modificateur est porté par la GRILLE, les enfants suivent). Employée par
   la section « portes » d'accompagnement-ia, la seule tonalité où l'or du
   chiffre est lisible : 4,9:1 sur cette carte contre 1,97:1 sur la carte crème
   (mesuré ; c'est le point 28 de l'audit du 20/08/2026). */
.steps-grid--dark .step-card{
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  border-color:rgba(246,241,234,.09);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
}
.steps-grid--dark .step-card h3{color:var(--cream)}
.steps-grid--dark .step-card p{color:var(--cream-dim);opacity:1}
.story{
  list-style:none;
  position:relative;
  z-index:1;
  width:100%;
  max-width:820px;
  margin:26px auto 0;
  padding-left:26px;
  text-align:left;
}
.story::before{
  content:"";
  position:absolute;
  left:4px;top:14px;bottom:14px;
  width:1px;
  background:linear-gradient(180deg, transparent, rgba(201,168,106,.5) 10%, rgba(201,168,106,.5) 90%, transparent);
}
.story li{
  position:relative;
  display:grid;
  grid-template-columns:124px 1fr;
  gap:0 24px;
  align-items:baseline;
  padding:12px 0;
}
.story li::before{
  content:"";
  position:absolute;
  left:-26px;top:20px;
  width:9px;height:9px;
  border-radius:50%;
  border:1px solid var(--gold);
  background:var(--ink);
}
.story b{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:16.5px;
  line-height:1.5;
  color:var(--gold);
  white-space:nowrap;
}
.story p{
  font-family:var(--serif);
  font-size:14.5px;
  line-height:1.6;
  color:var(--cream-dim);
  margin:0;
}
.stat-duo-src{
  margin:10px auto 0;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--ink-dim);
  opacity:.65;
  text-align:center;
  transition:opacity .3s;
}
.stat-duo-src a{
  color:inherit;
  text-decoration:underline;
  text-decoration-thickness:1px;
  text-underline-offset:3px;
}
.stat-duo-src:has(a:hover),
.stat-duo-src:has(a:focus-visible){opacity:1}
/* Liste de sujets sensibles (conférences, carte claire) : puces-points
   dorées discrètes, deux colonnes. */
.topic-list{
  list-style:none;
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:8px 18px;
  margin:2px 0 0;
  padding:0;
  text-align:left;
}
.topic-list li{
  position:relative;
  padding-left:15px;
  font-family:var(--serif);
  font-size:14px;
  line-height:1.45;
  color:var(--ink);
  opacity:.82;
}
.topic-list li::before{
  content:"";
  position:absolute;
  left:0;
  top:.5em;
  width:5px;
  height:5px;
  border-radius:50%;
  background:var(--gold);
}
/* Photos de conférence (conférences, section références) : deux clichés
   côte à côte, hauteur commune, coins arrondis du langage du site. */
.conf-photos{
  display:grid;
  grid-template-columns:repeat(2, 1fr);
  gap:16px;
  margin:28px auto 0;
  min-width:0;
  max-width:min(880px, 100%);
}
.conf-photos img{
  width:100%;
  height:clamp(170px, 24vh, 250px);
  object-fit:cover;
  border-radius:18px;
  border:1px solid rgba(246,241,234,.12);
  display:block;
}
/* Cartes d'avis clients (sections claires) */
.avis-grid{
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:20px;
  max-width:1100px;
  margin:0 auto;
}
.avis-card{
  /* Colonne flex : la citation absorbe la hauteur libre → cite + bouton
     TOUJOURS ancrés en bas de la carte, quelle que soit la longueur du texte. */
  display:flex;
  flex-direction:column;
  background:rgba(255,255,255,.72);
  border:1px solid rgba(24,53,66,.07);
  border-radius:20px;
  padding:26px 28px 22px;
  box-shadow:0 18px 44px -18px rgba(24,53,66,.14);
  text-align:left;
  /* Même survol que les autres cartes claires (services, équipe) : légère
     levée + liseré doré — langage unifié des cartes du site. */
  transition:transform .45s cubic-bezier(.2,.8,.2,1), border-color .45s, box-shadow .45s;
}
.avis-card:hover{
  transform:translateY(-5px);
  border-color:rgba(201,168,106,.4);
  box-shadow:0 26px 54px -22px rgba(24,53,66,.2);
}
/* En-tête de carte : étoiles puis signature (nom · provenance) À LA SUITE —
   les détails entreprise/secteur vivent dans le popup. */
.avis-head{
  display:flex;
  align-items:baseline;
  gap:14px;
  margin-bottom:12px;
}
.avis-stars{color:var(--gold);letter-spacing:.16em;font-size:13px;flex:0 0 auto}
.avis-quote{
  /* flex:1 : absorbe la hauteur libre pour pousser le bouton en bas */
  flex:1 1 auto;
  margin-bottom:16px;
  font-family:var(--serif);
  font-style:italic;
  font-size:15.5px;
  line-height:1.6;
  color:var(--ink);
  opacity:.9;
}
.avis-cite{
  display:block;
  min-height:30px;
  font-family:var(--sans);
  font-style:normal;
  font-size:10px;
  letter-spacing:.12em;
  line-height:1.5;
  text-transform:uppercase;
  color:var(--gold);
}
/* « G » Google en guise de provenance de l'avis (remplace le texte) */
.avis-src{display:inline-block;vertical-align:-2px}
.avis-src svg{display:block;width:12px;height:12px}
/* Bouton d'ouverture du popup : ancré en bas (margin-top:auto), CENTRÉ,
   œil Lucide en tête. Le « tion » final (.avis-more-tail) est masqué
   sous 1024px → « presta » plutôt qu'un libellé sur 2 lignes. */
.avis-more{
  display:flex;
  justify-content:center;
  align-items:center;
  gap:8px;
  margin-top:auto;
  border:none;
  border-top:1px solid rgba(24,53,66,.08);
  padding:12px 0 0;
  background:none;
  cursor:pointer;
  text-align:center;
  font-family:var(--sans);
  font-size:10.5px;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--ink-dim);
  transition:color .25s;
}
.avis-more svg{width:15px;height:15px;flex:0 0 auto;color:var(--gold)}
.avis-more:hover{color:var(--gold)}
/* Popup natif (attribut popover, ouvert par popovertarget — zéro JS, CSP-safe).
   Carte crème centrée en top layer, voile encre flouté, entrée en fondu+levée
   (@starting-style) et sortie animée (display/overlay allow-discrete). */
.avis-pop{
  /* Centrage EXPLICITE : le reset global (margin:0) écrase le margin:auto du
     style UA des popovers — sans ces lignes le popup colle en haut à gauche. */
  position:fixed;
  inset:0;
  margin:auto;
  height:fit-content;
  width:min(480px, calc(100vw - 48px));
  padding:30px 34px 28px;
  border:1px solid rgba(201,168,106,.5);
  border-radius:20px;
  background:linear-gradient(165deg, #fdfbf7 0%, var(--cream) 100%);
  box-shadow:0 40px 90px -30px rgba(14,34,48,.55);
  color:var(--ink);
  opacity:0;
  transform:translateY(16px) scale(.97);
  transition:opacity .35s ease, transform .35s cubic-bezier(.2,.8,.2,1),
             overlay .35s allow-discrete, display .35s allow-discrete;
}
.avis-pop:popover-open{opacity:1;transform:none}
@starting-style{
  .avis-pop:popover-open{opacity:0;transform:translateY(16px) scale(.97)}
}
.avis-pop::backdrop{
  background:rgba(14,34,48,.45);
  -webkit-backdrop-filter:blur(6px);
  backdrop-filter:blur(6px);
  opacity:0;
  transition:opacity .35s ease, overlay .35s allow-discrete, display .35s allow-discrete;
}
.avis-pop:popover-open::backdrop{opacity:1}
@starting-style{
  .avis-pop:popover-open::backdrop{opacity:0}
}
.avis-pop-kicker,
.step-card .step-kicker{
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.3em;
  text-transform:uppercase;
  color:var(--gold);
  margin-bottom:10px;
}
.step-card .step-kicker{color:#8d6a30; opacity:1}
.avis-pop-cite{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:17px;
  color:var(--ink);
  margin-bottom:12px;
}
.avis-pop-text{
  font-family:var(--serif);
  font-size:15px;
  line-height:1.65;
  color:var(--ink);
  opacity:.85;
}
/* Croix de fermeture : le « + » tourné en × (même langage que la FAQ) */
.avis-pop-close{
  position:absolute;
  top:14px;right:14px;
  width:28px;height:28px;
  border-radius:50%;
  border:1px solid rgba(201,168,106,.45);
  background-color:rgba(201,168,106,.1);
  background-image:
    linear-gradient(currentColor, currentColor),
    linear-gradient(currentColor, currentColor);
  background-size:10px 1px, 1px 10px;
  background-position:center;
  background-repeat:no-repeat;
  cursor:pointer;
  color:var(--gold);
  transform:rotate(45deg);
  transition:background-color .3s, border-color .3s;
}
.avis-pop-close:hover{background-color:rgba(201,168,106,.22);border-color:rgba(201,168,106,.7)}
/* FAQ (sections sombres) — accordéon natif EXCLUSIF (<details name="faq">) :
   ouvrir une réponse referme les autres → une seule ouverte à la fois, donc
   jamais de débordement derrière le titre. Zéro JS (CSP-safe). Même surface
   que .pledge-panel : une boîte, des rangées séparées par un filet. */
.faq{
  /* width:100% : .page-inner (align-items:center) ne l'étire pas — sans ça le
     bloc se dimensionne sur son contenu et CHANGE de largeur à l'ouverture
     d'une réponse plus large que les questions. */
  width:100%;
  max-width:720px;
  margin:0 auto;
  text-align:left;
  border-radius:20px;
  overflow:hidden;
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  border:1px solid rgba(246,241,234,.09);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
}
.faq details{position:relative;transition:background .4s}
.faq details + details{border-top:1px solid rgba(246,241,234,.10)}
.faq details[open]{background:rgba(201,168,106,.07)}
.faq details::before{
  content:"";
  position:absolute;
  left:0;top:0;bottom:0;
  width:2px;
  background:var(--gold);
  transform:scaleY(0);
  transform-origin:50% 0;
  transition:transform .45s cubic-bezier(.2,.8,.2,1);
}
.faq details[open]::before{transform:scaleY(1)}
.faq summary{
  cursor:pointer;
  list-style:none;
  display:flex;
  justify-content:space-between;
  align-items:center;
  gap:18px;
  padding:18px 24px;
  font-family:var(--serif);
  font-size:clamp(15px, 1.25vw, 17.5px);
  color:var(--cream);
  transition:color .25s;
}
.faq summary::-webkit-details-marker{display:none}
.faq summary:hover{color:var(--gold)}
.faq details[open] summary{color:var(--gold)}
/* Marqueur + → × : pastille discrète qui s'allume à l'ouverture. C'est un vrai
   contrôle (le clic bascule la réponse) → l'affordance ronde est ici légitime.
   Les deux barres sont DESSINÉES, pas un glyphe : centrées par construction à
   n'importe quel angle de rotation (cf. README). */
.faq summary::after{
  content:"";
  flex:0 0 auto;
  width:26px;height:26px;
  border-radius:50%;
  border:1px solid rgba(201,168,106,.4);
  background-image:
    linear-gradient(currentColor, currentColor),
    linear-gradient(currentColor, currentColor);
  background-size:9px 1px, 1px 9px;
  background-position:center;
  background-repeat:no-repeat;
  color:var(--gold);
  transition:transform .35s cubic-bezier(.2,.8,.2,1), background-color .35s, border-color .35s;
}
.faq details[open] summary::after{
  transform:rotate(135deg);
  background-color:rgba(201,168,106,.16);
  border-color:rgba(201,168,106,.65);
}
.faq .faq-a{
  padding:0 24px 20px;
  font-family:var(--serif);
  font-size:15px;
  line-height:1.65;
  color:var(--cream-dim);
}
/* Animation d'ouverture/fermeture : la hauteur du contenu du <details> est
   interpolée nativement (::details-content + interpolate-size) — dépliage
   fluide dans les deux sens, la réponse arrive en fondu+levée. Navigateurs
   plus anciens : bascule instantanée (dégradation propre), zéro JS. */
html{interpolate-size:allow-keywords}
.faq details::details-content{
  display:block;
  height:0;
  overflow:clip;
  transition:height .45s cubic-bezier(.2,.8,.2,1), content-visibility .45s allow-discrete;
}
.faq details[open]::details-content{height:auto}
.faq .faq-a{opacity:0;transform:translateY(-6px);transition:opacity .25s ease, transform .25s ease}
.faq details[open] .faq-a{
  opacity:1;
  transform:none;
  transition:opacity .4s ease .12s, transform .4s cubic-bezier(.2,.8,.2,1) .12s;
}
/* Variante CLAIRE de la FAQ (sections crème — conférences, automatisations…).
   Exactement la surface de .pledge-panel : voile blanc sur le crème, liseré
   encre très discret, ombre portée basse. L'or vif (#C9A86A) manque de
   contraste sur le crème → on prend l'or profond du dégradé --gold-text
   (#b58f52) pour le texte et le marqueur, l'or vif restant aux fonds. */
.faq--light{
  background:rgba(255,255,255,.72);
  border-color:rgba(24,53,66,.07);
  box-shadow:0 18px 44px -18px rgba(24,53,66,.12);
}
.faq--light details + details{border-top-color:rgba(24,53,66,.08)}
.faq--light details[open]{background:rgba(201,168,106,.10)}
.faq--light summary{color:var(--ink)}
.faq--light summary:hover,
.faq--light details[open] summary{color:#b58f52}
.faq--light summary::after{
  border-color:rgba(181,143,82,.45);
  color:#b58f52;
}
.faq--light details[open] summary::after{
  background-color:rgba(201,168,106,.18);
  border-color:rgba(181,143,82,.7);
}
.faq--light .faq-a{color:var(--ink-dim)}
@media (max-width:700px){
  .faq summary{padding:15px 18px;gap:12px}
  .faq summary::after{width:24px;height:24px}
  .faq .faq-a{padding:0 18px 17px}
}
.credo{
  width:100%;
  max-width:780px;
  margin:0 auto;
  text-align:center;
}
.credo article + article{
  position:relative;
  margin-top:36px;
  padding-top:36px;
}
.credo article + article::before{
  content:"";
  position:absolute;
  top:0;left:50%;
  transform:translateX(-50%);
  width:190px;height:1px;
  background:linear-gradient(90deg, transparent, rgba(201,168,106,.55), transparent);
}
.credo-lead{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(19px, 1.7vw, 23px);
  line-height:1.38;
  color:var(--ink);
  margin:0 0 12px;
}
.credo-note{
  font-family:var(--serif);
  font-size:15.5px;
  line-height:1.65;
  color:var(--ink);
  opacity:.75;
  margin:0;
}
.credo em{font-style:normal;color:var(--gold)}
.pledge-grid{
  list-style:none;
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:18px;
  width:100%;
  max-width:1040px;
  margin:0 auto;
  padding:0;
  text-align:left;
}
.pledge-grid li{
  display:flex;
  flex-direction:column;
  padding:24px 24px 22px;
  border-radius:18px;
  background:rgba(255,255,255,.72);
  border:1px solid rgba(24,53,66,.07);
  box-shadow:0 18px 44px -18px rgba(24,53,66,.12);
}
.pledge-ico{
  display:flex;
  align-items:center;
  justify-content:center;
  width:40px;height:40px;
  margin-bottom:16px;
  border-radius:50%;
  border:1px solid rgba(201,168,106,.45);
  background:rgba(201,168,106,.10);
  color:var(--gold);
}
.pledge-ico svg{width:19px;height:19px}
.pledge-grid strong{
  display:block;
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:17px;
  line-height:1.35;
  color:var(--ink);
  margin-bottom:7px;
}
.pledge-grid p{
  margin:auto 0 0;
  font-family:var(--serif);
  font-size:14px;
  line-height:1.55;
  color:var(--ink);
  opacity:.76;
}
@media (min-width:701px) and (max-width:1099px){
  .pledge-grid{grid-template-columns:repeat(2, 1fr);max-width:700px}
}
.pledge-grid--dark li{
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  border-color:rgba(246,241,234,.09);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
}
.pledge-grid--dark strong{color:var(--cream)}
.pledge-grid--dark p{color:var(--cream-dim);opacity:1}
.pledge-panel{
  list-style:none;
  width:100%;
  margin:0;
  padding:0;
  border-radius:20px;
  overflow:hidden;
  background:rgba(255,255,255,.72);
  border:1px solid rgba(24,53,66,.07);
  box-shadow:0 18px 44px -18px rgba(24,53,66,.12);
}
.pledge-panel li{
  position:relative;
  display:grid;
  grid-template-columns:auto 1fr;
  gap:4px 16px;
  align-items:start;
  padding:20px 24px;
}
.pledge-panel li + li{border-top:1px solid rgba(24,53,66,.08)}
.pledge-panel .pledge-ico{
  grid-row:span 2;
  width:36px;height:36px;
  margin:2px 0 0;
}
.pledge-panel .pledge-ico svg{width:18px;height:18px}
.pledge-panel strong{
  display:block;
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:17px;
  line-height:1.35;
  color:var(--ink);
  margin:0;
}
.pledge-panel p{
  grid-column:2;
  margin:0;
  font-family:var(--serif);
  font-size:14.5px;
  line-height:1.58;
  color:var(--ink);
  opacity:.76;
}
.pledge-panel--dark{
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  border-color:rgba(246,241,234,.09);
  box-shadow:inset 0 1px 0 rgba(246,241,234,.05);
}
.pledge-panel--dark li + li{border-top-color:rgba(246,241,234,.10)}
.pledge-panel--dark strong{color:var(--cream)}
.pledge-panel--dark p{color:var(--cream-dim);opacity:1}
/* Échelle de niveaux (section claire) : trois jalons reliés par un trait doré,
   pastilles de plus en plus « remplies » pour figurer la progression. */
.level-scale{
  position:relative;
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:12px;
  max-width:760px;
  margin:34px auto;
}
.level-scale::before{
  content:"";
  position:absolute;
  top:8px;left:16.66%;right:16.66%;
  height:1px;
  background:linear-gradient(90deg, rgba(201,168,106,.25), var(--gold));
}
.level-step{position:relative;text-align:center;font-family:var(--serif)}
.level-dot{
  position:relative;z-index:1;
  display:block;
  width:17px;height:17px;
  margin:0 auto 12px;
  border-radius:50%;
  border:1px solid var(--gold);
  background:var(--cream);
  box-shadow:inset 0 0 0 3px var(--cream);
}
.level-dot--mid{background:rgba(201,168,106,.45)}
.level-dot--full{background:var(--gold)}
.level-step b{
  display:block;
  font-style:italic;
  font-weight:500;
  font-size:16.5px;
  color:var(--ink);
}
.level-sub{
  display:block;
  margin-top:4px;
  font-family:var(--sans);
  font-size:10.5px;
  letter-spacing:.06em;
  color:var(--ink-dim);
}
/* Variante claire du duo de cartes (sections crème) */
.duo-grid--light .edge-card{
  border-color:rgba(24,53,66,.10);
  background:rgba(255,255,255,.55);
  box-shadow:none;
  text-align:left;
}
.duo-grid--light .edge-card:hover{
  border-color:rgba(201,168,106,.5);
  background:rgba(255,255,255,.8);
  box-shadow:0 18px 40px -22px rgba(24,53,66,.2);
}
.duo-grid--light .edge-card h3{color:var(--ink)}
.duo-grid--light .edge-card p{color:var(--ink);opacity:.78}
.duo-note em{font-style:normal;color:var(--gold)}
.duo-note--light{color:var(--ink-dim)}
/* Listes pièges / réflexes (esprit critique, dans les cartes claires) */
.crit-list{
  list-style:none;
  display:flex;
  flex-direction:column;
  gap:10px;
  font-family:var(--serif);
  font-size:14.5px;
  line-height:1.5;
  color:var(--ink);
}
.crit-list li{
  display:grid;
  grid-template-columns:auto 1fr;
  gap:10px;
  align-items:baseline;
  opacity:.85;
}
.crit-list li::before{
  content:"×";
  font-family:var(--sans);
  font-size:13px;
  color:rgba(24,53,66,.45);
}
.crit-list--ok li::before{content:"✓";color:var(--gold)}
/* Liste d'acquis (section sombre) : liste éditoriale — une ligne par acquis,
   icône Lucide dorée propre à chaque geste, fines lignes de séparation.
   Remplace les pilules-tags (refusées : trop « boutons », trop chargées).
   Aucune translation ni fond au survol — seule l'icône s'avive (discret,
   même patron que la pastille dorée des .pledge-*). */
.gain-list{
  list-style:none;
  max-width:620px;
  margin:26px auto 0;
  text-align:left;
}
.gain-list li{
  display:flex;
  align-items:center;
  gap:16px;
  padding:11px 4px;
  font-family:var(--serif);
  font-size:15.5px;
  color:var(--cream);
}
.gain-list li + li{border-top:1px solid rgba(246,241,234,.08)}
.gain-ico{
  display:flex;
  align-items:center;
  justify-content:center;
  width:32px;height:32px;
  flex:0 0 auto;
  border-radius:50%;
  border:1px solid rgba(201,168,106,.45);
  background:rgba(201,168,106,.10);
  color:var(--gold);
}
.gain-ico svg{width:16px;height:16px}
/* gain-list sur section CLAIRE : le composant est nativement pensé pour les
   sections sombres (texte crème). Sur crème il faut l'encre pour le texte, un
   filet encre discret, et l'or recalé (#8d6a30 ≈ 4,7:1, même valeur que le blog
   et le pied clair) — sinon texte invisible (crème sur crème). */
.page--light .gain-list li{color:var(--ink)}
.page--light .gain-list li + li{border-top-color:rgba(24,53,66,.10)}
.page--light .gain-ico{color:#8d6a30;border-color:rgba(141,106,48,.45);background:rgba(201,168,106,.10)}
.sec-copy--after{margin-top:30px;max-width:640px}
/* Avis : sous 1024px, rangée DÉFILANTE avec snap (3 colonnes trop étroites,
   3 cartes empilées ne tiennent pas dans 100vh) — même patron que duo-grid. */
@media (max-width:1023px){
  .avis-grid{
    display:flex;
    overflow-x:auto;
    scroll-snap-type:x mandatory;
    gap:14px;
  }
  .avis-card{flex:0 0 290px;scroll-snap-align:start;padding:22px 22px 18px}
  .avis-more-tail{display:none}   /* « …presta » sur cartes étroites */
  .avis-more{font-size:10px;letter-spacing:.12em}  /* tient sur une ligne à 290px */
  /* Formats : 4 colonnes trop étroites sous 1024 px → passage en 2×2
     (demande d'Allan : les cartes vont À LA LIGNE, pas de défilement
     latéral). La pastille « Format de référence » déborde de 9px du bord
     haut de sa carte : le gap de 14px suffit, et sans conteneur défilant
     rien ne la coupe. */
  .fmt-grid{
    grid-template-columns:repeat(2, 1fr);
    gap:14px;
    margin-top:22px;
  }
  .fmt-card{padding:20px 18px 18px}
  /* Étapes Sites web : 4 colonnes deviennent étroites sous 1024px → 2×2
     (même logique que les formats ci-dessus). En mobile ≤700px, la règle
     .steps-grid → 1 colonne prend le relais (plus bas dans la feuille). */
  .steps-grid--quad{grid-template-columns:repeat(2, 1fr); max-width:min(680px, 100%)}
}
@media (max-width:700px){
  .sec .particle-title{margin-bottom:26px}
  .sec-copy{font-size:15px}
  /* Échelle compacte : pastille à gauche, textes à droite (3 rangées basses
     au lieu de 3 jalons empilés — la section doit tenir dans 100vh). */
  .level-scale{grid-template-columns:1fr;gap:12px;margin:22px auto;max-width:300px}
  .level-scale::before{display:none}
  .level-step{
    display:grid;
    grid-template-columns:auto 1fr;
    column-gap:12px;
    align-items:center;
    text-align:left;
  }
  .level-dot{grid-row:1 / span 2;margin:0}
  .level-step b{font-size:15px}
  .level-sub{margin-top:1px}
  /* Duo de cartes : rangée DÉFILANTE avec snap (même patron que edge-grid
     sur l'accueil) — deux cartes empilées ne tiennent pas dans l'écran. */
  .duo-grid{
    display:flex;
    overflow-x:auto;
    scroll-snap-type:x mandatory;
    gap:12px;
    margin-top:22px;
  }
  /* text-align:left : les cartes du duo SOMBRE (Formations/Ateliers)
     héritaient le centrage de la section — illisible sur les textes longs
     (carte Formations à ~14 lignes) et incohérent avec le duo CLAIR déjà
     aligné à gauche (.duo-grid--light .edge-card). On aligne tout à gauche
     comme lui, titre compris. */
  .duo-grid .edge-card{flex:0 0 250px;scroll-snap-align:start;padding:20px 20px 18px;text-align:left}
  /* Formats : une carte par ligne (demande d'Allan — pas de défilement
     latéral). La section défile verticalement en interne si besoin, comme
     les autres sections denses. */
  .fmt-grid{grid-template-columns:1fr;gap:12px}
  .fmt-card{padding:18px 18px 16px}
  /* Gains par métier : une carte par ligne, comme les formats. */
  .job-grid{grid-template-columns:1fr;gap:12px;margin-top:22px}
  .job-card{padding:16px 16px}
  /* Conférences : le duo de stats s'empile, les photos aussi (paysage trop
     étroites côte à côte sur 375px), sujets sensibles sur une colonne. */
  .stat-duo{flex-direction:column;align-items:center;gap:16px;margin-top:20px}
  .conf-photos{grid-template-columns:1fr;gap:12px;margin-top:22px}
  .conf-photos img{height:150px}
  .topic-list{grid-template-columns:1fr;gap:7px}
  /* Automatisations : étapes sur une colonne, pastilles de métier resserrées. */
  .steps-grid{grid-template-columns:1fr;gap:12px;margin-top:22px}
  .step-card{padding:18px 18px 16px}
  .credo article + article{margin-top:26px;padding-top:26px}
  .credo article + article::before{width:150px}
  .credo-lead{font-size:17px;margin-bottom:9px}
  .credo-note{font-size:14px}
  .pledge-panel li{padding:13px 16px;gap:2px 12px}
  .pledge-panel .pledge-ico{width:30px;height:30px;margin-top:1px}
  .pledge-panel .pledge-ico svg{width:15px;height:15px}
  .pledge-panel strong{font-size:14.5px}
  .pledge-panel p{font-size:13px;line-height:1.5}
  .pledge-grid{grid-template-columns:1fr;gap:8px}
  .pledge-grid li{display:grid;grid-template-columns:auto 1fr;gap:2px 14px;
                  align-items:start;padding:16px 18px}
  .pledge-ico{width:32px;height:32px;margin-bottom:0;grid-row:span 2}
  .pledge-ico svg{width:16px;height:16px}
  .pledge-grid strong{font-size:15.5px;margin-bottom:0}
  .pledge-grid p{grid-column:2;margin:0;font-size:13.5px}
  .story{margin-top:20px;padding-left:22px}
  .story li{grid-template-columns:1fr;gap:3px;padding:10px 0}
  .story li::before{left:-22px;top:16px}
  .story b{font-size:15px}
  .story p{font-size:13.5px}
  /* Pastilles métiers : plus compactes, elles s'enroulent naturellement. */
  .job-tabs-nav{gap:8px;margin-top:20px}
  .job-tabs-nav label{padding:7px 13px;font-size:10px}
  .gain-list.job-ex, .job-msg{padding:6px 18px}
  .gain-list.job-ex li{font-size:13.5px;line-height:1.45;padding:9px 0 9px 20px}
  .gain-list.job-ex li::before{top:calc(9px + .55em)}
  .job-msg{padding:22px 20px}
  .job-msg p{font-size:14px}
  .duo-note{font-size:13px;margin-top:18px}
  .gain-list{margin-top:20px}
  .gain-list li{font-size:13.5px;padding:9px 2px;gap:12px}
  .gain-ico{width:28px;height:28px}
  .gain-ico svg{width:15px;height:15px}
  .sec-copy--after{margin-top:22px}
}

/* ===========================================================================
   PAGES INTÉRIEURES (contact, mentions légales…) — coquille classique
   scrollable, sans canvas ni navigation par sections. Même langage visuel :
   encre profonde, or, serifs.
   =========================================================================== */
.page-shell{
  min-height:100vh;
  display:flex;
  flex-direction:column;
  background:
    radial-gradient(120% 55% at 50% 0%, rgba(201,168,106,.07) 0%, transparent 60%),
    var(--ink);
  /* Les canvas des titres en particules (plite) débordent volontairement de
     leur encre (marge de vol du vent) : on les clippe au bord de l'écran au
     lieu de créer un défilement horizontal sur mobile. */
  overflow-x:clip;
  /* ⚠️ Contexte d'empilement OBLIGATOIRE pour le champ de poussière ambiant
     (app.js en mode page, canvas `.plite-bg` en z-index:-1). Sans lui, un enfant
     en z-index négatif est peint AVANT le fond du body — or le fond (encre
     ci-dessus, ou crème sur .page-shell--light) est OPAQUE et le recouvrait
     entièrement (bug vécu : « je ne vois aucune particule »). L'isolation fait
     du body un contexte d'empilement → l'ordre devient fond → poussière →
     contenu. N'affecte pas les z-index INTERNES (menu, voile, feuilles des
     outils), tous enfants du body : leur ordre relatif est conservé. */
  isolation:isolate;
}
/* Menu sur page intérieure : visible immédiatement (pas de fondu retardé),
   cliquable sans JS. SANS fond — même transparence que le menu des pages
   animées (demande d'Allan : un seul et même menu partout). */
.site-menu--page{
  animation:none;
  opacity:1;
  pointer-events:auto;
  padding-bottom:14px;
  transition:background .3s ease, -webkit-backdrop-filter .3s ease, backdrop-filter .3s ease;
}
/* Scrim au scroll : dès que la page défile (contenu qui passe SOUS le menu
   transparent), un voile encre flouté réapparaît pour garder le menu lisible
   et éviter la superposition. Classe posée par transitions.js. Universel
   (pas de scroll-timeline), et n'utilise pas `animation` → aucun conflit avec
   html.pt-internal .site-menu{animation:none}. */
.site-menu--page.is-scrolled{
  background:rgba(24,53,66,.82);
  -webkit-backdrop-filter:blur(10px);
  backdrop-filter:blur(10px);
  border-bottom:1px solid rgba(246,241,234,.07);
}
.site-menu--page .menu-burger{pointer-events:auto}

.shell-main{
  flex:1;
  width:100%;
  max-width:1100px;
  margin:0 auto;
  padding:150px 24px 96px;
}
.shell-kicker{
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.3em;
  text-transform:uppercase;
  color:var(--gold);
  margin-bottom:18px;
}
/* Titres des pages défilantes (contact, 404) : la typo commune vient de
   .particle-title (les deux classes sont toujours posées ensemble dans le
   HTML) ; seuls la taille et l'espacement diffèrent. */
.shell-title{
  font-size:clamp(40px, 6vw, 68px);
  margin-bottom:22px;
}
.shell-lead{
  max-width:640px;
  font-family:var(--serif);
  font-size:clamp(16px, 1.4vw, 19px);
  line-height:1.62;
  color:var(--cream-dim);
}
/* Titres en particules des pages intérieures : UN canvas plein écran,
   peint par app.js (mode page) avec l'offset de scroll — les envolées du vent
   ne sont clippées qu'aux bords de l'écran.
   ABSOLU (pas fixe), re-calé chaque frame en translateY(scrollY) par le JS :
   le canvas appartient au contenu défilant, donc le REBOND élastique du Mac
   le translate comme le texte (un canvas fixe restait collé à la fenêtre
   pendant le rebond — Chrome n'expose ce dépassement à aucune API JS). Comme
   le dessin compense avec la MÊME valeur que la translation, les deux
   s'annulent : les titres suivent exactement le contenu, rebond compris. */
.plite-canvas{position:absolute;top:0;left:0;width:100vw;height:100vh;pointer-events:none;z-index:5}
/* Canvas du champ de poussière ambiant (app.js, mode page) : z-index NÉGATIF →
   la poussière passe DERRIÈRE le texte de lecture (le canvas des titres, lui,
   reste à z-index:5, devant). Sa visibilité dépend du contexte d'empilement
   posé sur `.page-shell` (isolation:isolate) — voir le commentaire là-bas. */
.plite-bg{position:absolute;top:0;left:0;width:100vw;height:100vh;pointer-events:none;z-index:-1}
/* .particle-title impose text-align:center ; sur les pages intérieures le
   titre garde l'alignement de sa composition (gauche sur contact, centré
   sur la page d'erreur via son wrapper). */
.page-shell .particle-title{
  text-align:inherit;
}
.shell-hero{margin-bottom:56px}
.shell-hero--center{
  text-align:center;
  margin:10vh auto 0;
  max-width:640px;
}
.shell-hero--center .shell-lead{margin:0 auto}
.shell-actions{margin-top:36px}

/* ----- Contact : formulaire + coordonnées ----- */
.contact-cols{
  display:grid;
  grid-template-columns:1.25fr .75fr;
  gap:clamp(32px, 4vw, 64px);
  align-items:start;
}
.contact-form{
  background:linear-gradient(158deg, rgba(246,241,234,.055) 0%, rgba(246,241,234,.012) 62%);
  border:1px solid rgba(246,241,234,.1);
  border-radius:20px;
  padding:clamp(24px, 3vw, 38px);
}
.form-row{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:18px;
}
.form-field{margin-bottom:18px}
.form-field label{
  display:block;
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--cream-dim);
  margin-bottom:8px;
}
.form-field label b{color:var(--gold);font-weight:400}   /* astérisque requise */
.form-field input,
.form-field select,
.form-field textarea{
  width:100%;
  font-family:var(--sans);
  font-size:14px;
  color:var(--cream);
  background:rgba(255,255,255,.05);
  border:1px solid rgba(246,241,234,.16);
  border-radius:12px;
  padding:13px 16px;
  outline:none;
  transition:border-color .25s, background .25s;
}
.form-field select{
  appearance:none;
  -webkit-appearance:none;
  /* Chevron dessiné en data-URI (CSP img-src data: autorisé) */
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23F6F1EA' stroke-opacity='.55' fill='none' stroke-width='1.3' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right 16px center;
  background-size:10px 6px;
}
.form-field select option{background:var(--ink-2);color:var(--cream)}
.form-field textarea{min-height:150px;resize:vertical}
.form-field input::placeholder,
.form-field textarea::placeholder{color:rgba(246,241,234,.35)}
.form-field input:focus,
.form-field select:focus,
.form-field textarea:focus{
  border-color:rgba(201,168,106,.6);
  background:rgba(255,255,255,.07);
}
/* Honeypot : hors écran (pas display:none, que certains bots détectent) */
.hp-field{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden}
/* Messages (erreurs regroupées / succès) au-dessus du bouton */
.form-alert{
  border:1px solid rgba(201,168,106,.45);
  background:rgba(201,168,106,.1);
  border-radius:12px;
  padding:14px 18px;
  margin-bottom:18px;
  font-family:var(--serif);
  font-size:14.5px;
  line-height:1.55;
  color:var(--cream);
}
.form-alert ul{margin:0;padding-left:18px}
.form-alert li + li{margin-top:4px}
.form-actions{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.form-actions .btn-gold{border:1px solid rgba(160,120,60,.55);cursor:pointer}
/* Note d'information CNIL sous le bouton : finalité des données + lien vers
   la politique de confidentialité. flex:1 : occupe le reste de la rangée et
   passe à la ligne proprement quand la place manque. */
.form-note{
  flex:1 1 220px;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.04em;
  color:var(--cream-dim);
}
.form-note a{
  color:var(--gold);
  text-decoration:underline;
  text-underline-offset:2px;
}
/* Reprise du contexte d'un outil (contact-prefill.js) : posée AU-DESSUS du
   champ message, donc hors de la rangée .form-actions — elle ne doit pas
   hériter du flex:1 ci-dessus, ni se coller au textarea. */
.form-note--prefill{
  flex:none;
  line-height:1.5;
  margin-bottom:8px;
  padding-left:10px;
  border-left:2px solid var(--gold);
}
/* Coordonnées directes (aside) */
.contact-aside{padding-top:6px}
/* Spécificité ≥ .contact-aside p (sinon la règle générique gagnerait le
   font-size et rendrait ces intitulés en 15.5px serif). */
.contact-aside .aside-label{
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.26em;
  text-transform:uppercase;
  color:var(--gold);
  opacity:1;
  margin:0 0 14px;
}
.contact-aside .aside-label:not(:first-child){margin-top:36px}
.contact-aside p{
  font-family:var(--serif);
  font-size:15.5px;
  line-height:1.6;
  color:var(--cream);
  opacity:.88;
}
.contact-aside p + p{margin-top:6px}
.contact-aside a{color:inherit;text-decoration:none;transition:color .25s}
.contact-aside a:hover{color:var(--gold)}
.aside-perks{list-style:none;margin:0;padding:0}
.aside-perks li{
  display:flex;
  align-items:center;
  gap:10px;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--cream-dim);
}
.aside-perks li + li{margin-top:10px}
.aside-perks li::before{
  content:"";
  width:4px;height:4px;border-radius:50%;
  background:var(--gold);
  flex:0 0 auto;
}

/* Pied de page autonome (partial des pages intérieures) : pas de marges
   négatives (elles compensaient le padding de la section CTA de l'accueil). */
.site-foot--page{margin:0;padding:38px 24px 34px}

@media (max-width:900px){
  .contact-cols{grid-template-columns:1fr}
  .contact-aside{order:2}
}
@media (max-width:700px){
  .shell-main{padding:120px 20px 72px}
  .shell-hero{margin-bottom:40px}
  .form-row{grid-template-columns:1fr}
  .site-foot--page{padding:30px 20px 28px}
}

/* ===========================================================================
   BLOG — index (blog.php) et gabarit d'article (article.php).
   Pages défilantes CLAIRES (.page-shell--light) — premières du genre : le
   body passe crème (app.js en mode page choisit seul des particules encre via la
   luminance du body), le menu porte .on-light dès le PHP (menu.php,
   $menuLight), html et le voile de transition restent ENCRE (règle d'or des
   bascules de document), et le pied de page garde sa bande nuit — écho de
   l'alternance clair/foncé du site.
   Cartes VERTICALES à image de couverture (SVG décoratifs de charte dans
   Images/Blog/, remplaçables par de vraies photos via le champ `image` de
   partials/articles.php). Une carte = UN lien entier vers /blog-<slug>.
   =========================================================================== */
.page-shell--light{
  background:
    radial-gradient(120% 55% at 50% 0%, rgba(201,168,106,.10) 0%, transparent 60%),
    var(--cream);
}
/* Menu au scroll sur page claire : le voile encre des pages sombres rendrait
   le texte (encre via .on-light) illisible → scrim crème flouté. */
.site-menu--page.on-light.is-scrolled{
  background:rgba(246,241,234,.86);
  border-bottom:1px solid rgba(24,53,66,.08);
}
/* Petites capitales dorées sur crème : l'or de charte tombe à 2,8:1 → même
   remède MESURÉ que le pied clair de formations (#8d6a30 ≈ 4,7:1). */
.page-shell--light .shell-kicker{color:#8d6a30}
.page-shell--light .shell-lead{color:rgba(24,53,66,.72)}
/* Chapeau de l'index : accroche sur TOUTE la largeur (demande d'Allan —
   le shell-lead générique est plafonné à 640px). */
.blog-hero .shell-lead{max-width:none}
/* Étiquettes de catégories : pastilles de tri sous l'accroche — même langage
   que les pastilles métier d'automatisations, en registre clair. L'active
   est pleine ; « Tous » sans filtre. */
.blog-cats{
  display:flex;
  flex-wrap:wrap;
  gap:10px;
  margin-top:26px;
}
.blog-cats a{
  padding:8px 18px;
  border-radius:999px;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.1em;
  text-transform:uppercase;
  text-decoration:none;
  color:rgba(24,53,66,.62);
  border:1px solid rgba(24,53,66,.18);
  transition:color .4s, border-color .4s, background .4s;
}
.blog-cats a:hover{border-color:rgba(201,168,106,.6);color:var(--ink)}
.blog-cats a.on{
  color:#8d6a30;
  border-color:rgba(201,168,106,.65);
  background:rgba(201,168,106,.12);
}
/* ===== Échange de la grille sans rechargement (blog-filtre.js) =====
   Les cartes en place s'effacent d'un souffle, les nouvelles remontent à leur
   place l'une après l'autre. Registre volontairement DISCRET, calé sur
   jobPanelIn (0,45 s, ~5 px) : on souligne le changement, on ne le met pas en
   scène. L'ancienne grille reste dans le flux pendant la requête (seulement
   rendue transparente) → aucun effondrement de hauteur, donc aucun saut.
   ⚠️ Durée de sortie à garder synchrone avec SORTIE_MS dans blog-filtre.js. */
.blog-grid--sortie,
.blog-vide--sortie{
  opacity:0;
  transform:translateY(4px);
  transition:opacity .17s ease, transform .17s ease;
}
.blog-grid--entree .blog-card,
.blog-vide--entree{
  animation:blogCardIn .42s cubic-bezier(.2,.8,.2,1) both;
}
/* Décalage en cascade, une carte après l'autre (40 ms) — plafonné à la page
   pleine (BLOG_PAR_PAGE = 9) : la dernière démarre à 320 ms, l'ensemble est
   posé avant 0,75 s. */
.blog-grid--entree .blog-card:nth-child(2){animation-delay:.04s}
.blog-grid--entree .blog-card:nth-child(3){animation-delay:.08s}
.blog-grid--entree .blog-card:nth-child(4){animation-delay:.12s}
.blog-grid--entree .blog-card:nth-child(5){animation-delay:.16s}
.blog-grid--entree .blog-card:nth-child(6){animation-delay:.20s}
.blog-grid--entree .blog-card:nth-child(7){animation-delay:.24s}
.blog-grid--entree .blog-card:nth-child(8){animation-delay:.28s}
.blog-grid--entree .blog-card:nth-child(n+9){animation-delay:.32s}
@keyframes blogCardIn{
  from{opacity:0;transform:translateY(6px)}
  to{opacity:1;transform:none}
}
/* Mouvement réduit : l'échange reste instantané et net (blog-filtre.js coupe
   aussi son délai de sortie en lisant la même préférence). */
@media (prefers-reduced-motion: reduce){
  .blog-grid--sortie,
  .blog-vide--sortie{transition:none;opacity:1;transform:none}
  .blog-grid--entree .blog-card,
  .blog-vide--entree{animation:none}
}
/* Catégorie vide + pagination */
.blog-vide{
  font-family:var(--serif);
  font-size:16px;
  color:rgba(24,53,66,.6);
  padding:36px 0;
}
.blog-pagination{
  display:grid;
  grid-template-columns:1fr auto 1fr;
  align-items:baseline;
  gap:18px;
  margin-top:40px;
}
.blog-pagination a{
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.18em;
  text-transform:uppercase;
  text-decoration:none;
  color:#8d6a30;
}
.blog-page-prec::before{content:"← ";}
.blog-page-suiv::after{content:" →";}
.blog-page-suiv{text-align:right}
.blog-page-etat{
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:rgba(24,53,66,.5);
}
/* ----- Index : cartes verticales, couverture 16/9 en tête (flush), corps
   dessous. La carte est un <a> : levée + liseré doré au survol et léger zoom
   de la couverture (l'affordance est voulue — c'est un lien). ----- */
.blog-grid{
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:22px;
}
.blog-card{
  display:flex;
  flex-direction:column;
  border-radius:20px;
  overflow:hidden;   /* couverture flush + zoom clippé */
  background:rgba(255,255,255,.72);
  border:1px solid rgba(24,53,66,.07);
  box-shadow:0 18px 44px -18px rgba(24,53,66,.14);
  text-decoration:none;
  transition:transform .45s cubic-bezier(.2,.8,.2,1), border-color .45s, box-shadow .45s;
}
.blog-card:hover{
  transform:translateY(-6px);
  border-color:rgba(201,168,106,.45);
  box-shadow:0 26px 54px -20px rgba(24,53,66,.22);
}
.blog-cover{
  display:block;
  aspect-ratio:16 / 9;
  overflow:hidden;
  border-bottom:1px solid rgba(24,53,66,.06);
  flex:0 0 auto;
}
.blog-cover img{
  display:block;
  width:100%;
  height:100%;
  object-fit:cover;
  transition:transform .6s cubic-bezier(.2,.8,.2,1);
}
.blog-card:hover .blog-cover img{transform:scale(1.04)}
.blog-card-inner{
  display:flex;
  flex-direction:column;
  flex:1;
  padding:22px 26px;
}
.blog-meta{
  display:flex;
  flex-wrap:wrap;
  align-items:baseline;
  gap:6px 10px;
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.22em;
  text-transform:uppercase;
  color:rgba(24,53,66,.6);
  margin-bottom:14px;
}
.blog-cat{color:#8d6a30}
.blog-card .blog-meta{gap:4px 14px}
.blog-card .blog-meta time{margin-left:auto}
.blog-card h2{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:20px;
  line-height:1.3;
  color:var(--ink);
  margin-bottom:10px;
  transition:color .4s;
}
.blog-card:hover h2{color:#8d6a30}
.blog-excerpt{
  font-family:var(--serif);
  font-size:14.5px;
  line-height:1.6;
  color:rgba(24,53,66,.72);
  margin-bottom:20px;
  flex:1;   /* le « Lire l'article » reste ancré en bas de la carte */
}
/* « Lire l'article » : même langage que les liens de cartes services
   (flèche qui glisse + filet qui se déploie), déclenché par le survol de
   TOUTE la carte puisqu'elle est le lien. */
.blog-read{
  position:relative;
  display:inline-flex;
  align-items:center;
  gap:10px;
  align-self:flex-start;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.24em;
  text-transform:uppercase;
  color:#8d6a30;
}
.blog-read::after{content:"→";font-size:14px;transition:transform .3s ease}
.blog-card:hover .blog-read::after{transform:translateX(4px)}
.blog-read::before{
  content:"";
  position:absolute;left:0;right:24px;bottom:-4px;height:1px;
  background:currentColor;opacity:.5;
  transform:scaleX(0);transform-origin:left center;
  transition:transform .35s ease;
}
.blog-card:hover .blog-read::before{transform:scaleX(1)}
/* Contrôle d'intégrité des articles (développement uniquement) */
.blog-erreurs{
  margin:0 0 24px;
  padding:12px 16px;
  border:1px solid rgba(160,60,60,.45);
  border-radius:10px;
  font-family:var(--sans);
  font-size:12px;
  line-height:1.5;
  color:#8a3232;
}

/* ----- Article : colonne de lecture centrée (760px) ----- */
.art-wrap,
.art-more,
.art-cta{max-width:760px;margin-left:auto;margin-right:auto}
/* Chapeau CENTRÉ : app.js centre les lignes d'un titre multiligne
   (échantillonnage textAlign:center) — une composition à gauche mélangerait
   ligne 1 à gauche et ligne 2 centrée. Tout le chapeau suit. */
.art-hero{margin-bottom:40px;text-align:center}
.art-hero .blog-meta{margin-bottom:18px;justify-content:center}
.art-title{font-size:clamp(32px, 4.4vw, 52px);line-height:1.16}
.art-lead{max-width:600px;margin:0 auto}
/* Couverture de l'article : la même image que la carte, en grand */
.art-cover{
  margin:0 0 40px;
  border-radius:20px;
  overflow:hidden;
  border:1px solid rgba(24,53,66,.08);
  box-shadow:0 24px 60px -30px rgba(24,53,66,.3);
}
.art-cover img{display:block;width:100%;height:auto}
.art-body{
  font-family:var(--serif);
  font-size:clamp(16px, 1.35vw, 18.5px);
  line-height:1.7;
  color:rgba(24,53,66,.88);
}
.art-body p{margin-bottom:1.05em}
.art-body > :last-child{margin-bottom:0}
.art-body h2{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(21px, 1.9vw, 25px);
  line-height:1.3;
  color:var(--ink);
  margin:1.7em 0 .65em;
}
.art-body > h2:first-child{margin-top:0}
.art-body ul{list-style:none;margin:0 0 1.05em;padding:0}
/* ⚠️ SURTOUT PAS display:grid ni display:flex ici — la leçon a coûté deux
   fois dans ce projet (les encarts .avis de la console, puis cette liste).
   En grille, CHAQUE nœud enfant devient un item : sur
   `<li><strong>Titre</strong> : la suite de la phrase</li>`, la <strong> va
   dans la colonne de texte, et LE TEXTE QUI SUIT tombe dans la cellule libre
   d'après — celle de 10 px réservée à la puce. Vu en production sur « Les
   autres tribunes de la série » : un mot par ligne sur douze lignes.
   `li > * {grid-column:2}` ne suffisait pas : un nœud de TEXTE n'est pas un
   élément, aucun sélecteur CSS ne l'atteint.

   La puce est donc posée en ABSOLU et le texte réserve sa place par un
   padding : le contenu du <li> redevient un flux inline normal, où texte et
   éléments se mélangent librement, quel que soit le Markdown écrit dans la
   console. Retrait inchangé au pixel près : 10 px de colonne + 12 px d'écart
   = 22 px de padding. */
.art-body ul li{
  position:relative;
  padding:5px 0 5px 22px;
}
.art-body ul li::before{
  content:"";
  position:absolute;
  left:0;
  top:calc(5px + .62em);   /* le padding du haut + l'ancien décalage de puce */
  width:5px;height:5px;border-radius:50%;
  background:var(--gold);
}
/* Vocabulaire Markdown étendu (Parsedown) : listes numérotées, intertitres
   de 3ᵉ rang, code, filet, images posées dans le corps. */
.art-body ol{margin:0 0 1.05em;padding-left:1.4em}
.art-body ol li{padding:5px 0}
.art-body ol li::marker{color:var(--gold);font-weight:500}
.art-body h3{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(18px, 1.6vw, 21px);
  line-height:1.3;
  color:var(--ink);
  margin:1.5em 0 .55em;
}
.art-body hr{
  border:none;
  width:56px;
  height:1px;
  background:rgba(201,168,106,.6);
  margin:2em auto;
}
.art-body code{
  font:.82em/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
  background:rgba(24,53,66,.07);
  padding:1px 6px;
  border-radius:5px;
}
.art-body pre{
  margin:0 0 1.05em;
  padding:14px 18px;
  border-radius:12px;
  background:rgba(24,53,66,.07);
  overflow-x:auto;
}
.art-body pre code{background:none;padding:0}
.art-body img{
  display:block;
  max-width:100%;
  height:auto;
  border-radius:16px;
  margin:1.4em auto;
  border:1px solid rgba(24,53,66,.08);
}
.art-body blockquote{
  margin:1.4em 0;
  padding:4px 0 4px 24px;
  border-left:2px solid var(--gold);
  font-style:italic;
  color:rgba(24,53,66,.66);
}
/* La couleur vient de la règle dorée plus bas ; ici, la seule graisse. */
.art-body strong, .art-body em{font-weight:500}
.art-body a{
  color:#8d6a30;
  text-decoration:none;
  border-bottom:1px solid rgba(141,106,48,.4);
  transition:border-color .3s;
}
.art-body a:hover{border-bottom-color:#8d6a30}

/* ----- Appareil de bas d'article : sources, lectures complémentaires -------
   Écrit en Markdown derrière une ligne `::: sources` (blog_md_vers_html).
   Demande d'Allan : DISCRET — petit, grisé, italique. Il doit se lire comme
   une note de bas de page, pas comme une section de l'article : d'où le filet
   de séparation, la taille réduite et la couleur qui recule. Tout ce qui vit
   dedans (titres, puces, liens) rentre dans le rang, sinon un `## Sources`
   reviendrait en gros italique de 25 px et la discrétion serait perdue. */
.art-sources{
  margin-top:2.6em;
  padding-top:1.5em;
  border-top:1px solid rgba(24,53,66,.14);
  font-size:.8em;
  font-style:italic;
  line-height:1.65;
  color:rgba(24,53,66,.5);
}
.art-sources > :first-child{margin-top:0}
.art-sources > :last-child{margin-bottom:0}
.art-body .art-sources h2,
.art-body .art-sources h3{
  font-size:1.08em;
  font-weight:500;
  font-style:italic;
  color:rgba(24,53,66,.62);
  margin:1.5em 0 .5em;
}
.art-body .art-sources p{margin-bottom:.7em}
.art-body .art-sources ul{margin-bottom:.7em}
.art-body .art-sources li{padding:2px 0 2px 22px}
/* Puce ramenée au gris du bloc : l'or du corps d'article y crierait. */
.art-body .art-sources li::before{
  background:rgba(24,53,66,.3);
  width:4px;height:4px;
  top:calc(2px + .62em);
}
/* Liens : lisibles et cliquables, mais dans la même retenue que le reste —
   ils ne reprennent leur or qu'au survol. */
.art-body .art-sources a{
  color:inherit;
  border-bottom-color:rgba(24,53,66,.25);
  overflow-wrap:anywhere;   /* les URL nues ne doivent pas déborder */
}
.art-body .art-sources a:hover{color:#8d6a30;border-bottom-color:#8d6a30}
/* Dans le corps, la mise en valeur est DORÉE (dégradé détouré sur le texte).
   Dans les sources, ce serait un cri au milieu d'un bloc qu'on veut discret :
   les deux balises y reviennent à l'encre du bloc. Et l'italique dans un bloc
   déjà italique se compose en romain, comme le veut la règle typographique —
   ce qui sert aux titres de revues. */
.art-body .art-sources em,
.art-body .art-sources strong{
  background:none;
  -webkit-background-clip:border-box;
  background-clip:border-box;
  color:inherit;
  -webkit-text-fill-color:currentColor;
}
.art-body .art-sources em{font-style:normal}
.art-body .art-sources strong{font-weight:600}
/* Signature du rédacteur (gérée en console) : photo + « Par Nom », rattachée
   à la FIN DU TEXTE et alignée à droite. Volontairement minuscule — c'est une
   mention, pas un encadré d'auteur : elle ne doit rien peser face au corps. */
.art-sign{
  display:flex;
  align-items:center;
  justify-content:flex-end;
  gap:12px;
  margin-top:34px;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:rgba(24,53,66,.55);
}
.art-sign-photo{
  flex:none;
  width:40px;
  height:40px;
  border-radius:50%;
  object-fit:cover;
  border:1px solid rgba(24,53,66,.1);
}
.art-sign-nom{color:var(--ink);font-weight:500}
button.art-sign-nom{
  font:inherit;
  letter-spacing:inherit;
  text-transform:inherit;
  background:none;
  border:0;
  border-bottom:1px solid rgba(201,168,106,.6);
  padding:0 0 1px;
  cursor:pointer;
  transition:color .3s, border-color .3s;
}
button.art-sign-nom:hover,
button.art-sign-nom:focus-visible{color:#b58f52;border-color:#b58f52}
.bio-pop{text-align:center}
.bio-pop-photo{
  display:block;
  width:84px;height:84px;
  margin:0 auto 18px;
  border-radius:50%;
  object-fit:cover;
  border:1px solid rgba(201,168,106,.45);
}
.bio-pop .avis-pop-text{text-align:left}
/* Pied d'article : retour à l'index */
.art-foot{
  margin-top:52px;
  padding-top:26px;
  border-top:1px solid rgba(24,53,66,.12);
}
.art-back{
  display:inline-flex;
  align-items:center;
  gap:10px;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.24em;
  text-transform:uppercase;
  color:#8d6a30;
  text-decoration:none;
}
.art-back::before{content:"←";font-size:14px;transition:transform .3s ease}
.art-back:hover::before{transform:translateX(-4px)}
/* Retour en TÊTE d'article : aligné à gauche au-dessus du chapeau centré. */
/* Fil d'Ariane en tête de PAGE (hors colonne de lecture, désormais enfant
   direct de .shell-main) : barre de contexte pleine largeur alignée à gauche,
   détachée du chapeau par un filet. Sa pleine largeur + ce filet la
   distinguent nettement de la ligne méta (catégorie · date · lecture) restée
   centrée dans le chapeau — fin de l'effet « deux lignes qui se ressemblent ».
   Le maillon courant (titre) s'ellipse s'il est trop long. */
.art-breadcrumb{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:8px 10px;
  margin:0 0 44px;
  padding-bottom:20px;
  border-bottom:1px solid rgba(24,53,66,.1);
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.22em;
  text-transform:uppercase;
  color:rgba(24,53,66,.5);
}
.art-breadcrumb a{color:#8d6a30;text-decoration:none;transition:opacity .3s}
.art-breadcrumb a:hover{opacity:.6}
.art-breadcrumb-sep{color:rgba(24,53,66,.3)}
.art-breadcrumb-cur{
  max-width:min(60ch, 100%);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  color:rgba(24,53,66,.45);
}
/* « À lire ensuite » : cartes réduites (pas d'extrait), 2 colonnes */
.art-more{margin-top:64px}
.art-more-label{
  font-family:var(--sans);
  font-size:10px;
  letter-spacing:.3em;
  text-transform:uppercase;
  color:#8d6a30;
  margin-bottom:18px;
}
.blog-grid--suite{grid-template-columns:1fr 1fr}
.blog-card--mini .blog-card-inner{padding:18px 22px}
.blog-card--mini h2{font-size:17.5px;margin-bottom:14px;flex:1}
/* Invitation finale : cartouche ambré (langage du callout financements) */
.art-cta{
  margin-top:64px;
  padding:34px 36px;
  border-radius:20px;
  border:1px solid rgba(201,168,106,.36);
  background:linear-gradient(158deg, rgba(201,168,106,.12), rgba(201,168,106,.03));
  text-align:center;
}
.art-cta p{
  max-width:560px;
  margin:0 auto 24px;
  font-family:var(--serif);
  font-size:16.5px;
  line-height:1.6;
  color:var(--ink);
}

@media (max-width:1000px){
  .blog-grid{grid-template-columns:1fr 1fr}
}
@media (max-width:700px){
  .blog-grid,
  .blog-grid--suite{grid-template-columns:1fr}
  .blog-card-inner{padding:20px 22px}
  .art-cover{margin-bottom:32px}
  .art-foot{margin-top:44px}
  .art-sign{margin-top:30px}
  .art-more,
  .art-cta{margin-top:48px}
  .art-cta{padding:28px 24px}
}

/* ===========================================================================
   COULOIR DE LA PILULE DES DOTS (accueil animé uniquement, html.full-page).
   La pilule est fixed à droite (~54px de couloir + respiration). Dès que la
   marge libre du contenu centré devient plus étroite (< ~1280px), on réserve
   son couloir : le contenu STATIQUE est excentré vers la gauche — la pilule
   ne recouvre jamais rien. Les rangées défilantes (cartes, marquee) passent
   dessous sans rien cacher définitivement : on ne les excentre pas, sauf
   leurs variantes grille (edge/team) qui sont statiques.
   Placé en FIN de feuille : gagne la cascade sur les overrides responsive.
   =========================================================================== */
@media (max-width:1279px){
  /* Sections dont le padding latéral porte le contenu (24px + 64px de couloir) */
  html.full-page .page--light,
  html.full-page .page--statement,
  html.full-page .page--trust{padding-right:88px}
  /* Wrappers centrés des sections à rangées pleine largeur */
  html.full-page .services-header,
  html.full-page .edge-head,
  html.full-page .team-head{padding-right:88px}
  /* Grilles statiques desktop (1160/1148px de large → sous la pilule sinon) */
  html.full-page .edge-grid,
  html.full-page .team-grid{padding-right:88px}
  /* Pied de page de la section CTA : la bande reste pleine largeur,
     son contenu réserve le couloir */
  html.full-page .site-foot .foot-inner{padding-right:64px}
}
@media (max-width:700px){
  /* Pilule plus fine et plus proche du bord (right:18px) → couloir 54px */
  html.full-page .page--light,
  html.full-page .page--statement{padding-right:78px}
  html.full-page .page--trust{padding-right:74px}
  html.full-page .services-header,
  html.full-page .edge-head,
  html.full-page .team-head{padding-right:78px}
  /* En mobile, edge-grid et team-grid redeviennent des rangées DÉFILANTES :
     on restaure leur padding de rangée (pas d'excentrage). */
  html.full-page .edge-grid{padding-right:24px}
  html.full-page .team-grid{padding-right:24px}
  html.full-page .site-foot .foot-inner{padding-right:54px}
}

/* ===========================================================================
   TRANSITIONS ENTRE PAGES — voile d'encre piloté (transitions.js).
   Chaque page charge sous un voile encre+or (même recette que les fonds du
   site — jamais de noir nu) ; transitions.js le lève (html.pt-ready) quand la
   page a réellement peint (load + polices + 2 rAF), et le repose
   (html.pt-leaving) avant de naviguer. z-index 26 : au-dessus du contenu et
   des dots (20/21), SOUS le menu (30) — le menu reste visible en permanence.
   Sans JS : <noscript> masque le voile (cf. head.php).
   =========================================================================== */
/* Pendant la bascule de document, l'écran doit être RIGOUREUSEMENT uniforme :
   tout élément dessiné sur le voile (texte, logo) se re-rend au changement de
   page (rechargement de police → clignotement). Un voile NU est pixel-
   identique des deux côtés — même une frame sautée est de l'encre sur de
   l'encre, invisible par nature. On fixe aussi le fond du document lui-même
   à l'encre : plus AUCUN interstice possible (fond blanc par défaut compris).
   STRATÉGIE « ENCRE UNIE » : le voile est de l'encre PLEINE, sans dégradé —
   comme toutes les couches susceptibles d'être peintes pendant une bascule
   (body, fonds de sections, canvas pas encore peint). Une frame partielle est
   donc INDISTINGUABLE du voile, quoi que le navigateur choisisse de peindre.
   (L'inverse — mettre la lueur partout — laisse toujours une couche plate
   quelque part, d'où les clignotements précédents.) */
html{
  --pt-fond:var(--ink);
  background:var(--pt-fond);
  transition:background .5s ease .08s, scrollbar-color .5s ease .08s;
}
.pt-veil{
  position:fixed;
  inset:0;
  /* AU-DESSUS DE TOUT (menu 30/42, cookie 35, overlay 40) : le voile couvre
     l'écran entier — rien n'est censé rester visible pendant le basculement,
     donc rien ne peut clignoter. Le menu se réinstalle derrière le voile. */
  z-index:60;
  pointer-events:none;
  background:var(--pt-fond);
  opacity:1;
  transition:opacity .5s ease .08s;
}
html.pt-ready .pt-veil{opacity:0}
html.pt-actif:not(.pt-ready){scrollbar-color:var(--pt-fond) var(--pt-fond)}
/* ── Tonalité du voile (Allan, 02/08/2026) ─────────────────────────────────
   Le blog est CLAIR : un voile d'encre entre deux de ses pages jurait. Le
   voile suit donc la coquille — crème sur .page-shell--light (blog, article,
   politique) — et le fond du DOCUMENT suit aussi, sinon la frange encre de
   <html> apparaîtrait le temps d'une frame avant que le body ne peigne.
   ⚠️ RÈGLE D'OR INTACTE : les deux documents doivent afficher le MÊME pixel
   pendant la bascule. C'est pourquoi le voile QUI MONTE prend la couleur de
   la DESTINATION (classes posées au clic par transitions.js), et non celle
   de la page qu'on quitte — sans quoi tout passage clair↔sombre clignoterait.
   Spécificité : `html.pt-to-*` (0,2,1) l'emporte sur `.page-shell--light`
   (0,2,0) et sur `.pt-veil` nu (0,1,0). */
html:where(:has(body.page-shell--light)){--pt-fond:var(--cream)}
html.pt-to-light{--pt-fond:var(--cream)}
html.pt-to-dark{--pt-fond:var(--ink)}
/* Départ (allongé, Allan 12/08/2026) : 140 ms de délai pour laisser la
   dissolution du titre s'amorcer à nu, puis l'encre monte en 0,62 s — écran
   uniforme à 760 ms, la navigation (transitions.js) part à 850 ms. */
html.pt-leaving{transition:background .62s ease .14s, scrollbar-color .62s ease .14s}
html.pt-leaving .pt-veil{opacity:1;transition:opacity .62s ease .14s}
/* Pendant l'envol, le canvas des particules de titres passe AU-DESSUS du
   voile : l'encre monte DERRIÈRE les particules, qui finissent leur sortie
   d'écran à nu au lieu d'être avalées à mi-course. Sans risque pour la
   règle d'or : à ~0,8 s toutes les particules sont éteintes (canvas
   vide), l'écran est 100 % encre à la bascule (850 ms). La poussière
   ambiante et les fonds vivent sur #c-bg (z1), toujours sous le voile.
   Garde reduced-motion : en mouvement réduit le titre lite est statique
   (pas d'envol) et doit rester couvert par l'encre. */
@media (prefers-reduced-motion: no-preference){
  html.pt-leaving canvas#c,
  html.pt-leaving .plite-canvas{z-index:61}
}
/* Arrivée par navigation interne (transitions.js pose html.pt-internal AVANT
   le premier rendu — script bloquant dans le <head>) : le menu — au-dessus du
   voile — ne rejoue AUCUNE entrée, pas même un fondu : il est peint visible
   dès la première frame, comme s'il n'avait jamais quitté l'écran. Comme son
   animation est supprimée, animationstart ne peut plus armer .ready : on
   débloque les pointer-events directement ici pour ce cas. */
html.pt-internal .site-menu{animation:none;opacity:1}
html.pt-internal .site-menu .menu-brand,
html.pt-internal .site-menu .menu-list,
html.pt-internal .site-menu .menu-burger{pointer-events:auto}
/* Navigation interne : TOUT le chrome s'affiche immédiatement (dots,
   tagline, CTA, indice de scroll) — l'arrivée courte des particules est la
   seule mise en scène. Les dots redeviennent cliquables directement en CSS
   (animation:none → aucun animationstart pour poser .ready). Le bouton
   « revoir » garde son fondu (il a un état .hidden à respecter) mais sans
   délai. */
html.pt-internal .page-nav,
html.pt-internal .tagline,
html.pt-internal .hero-cta,
html.pt-internal .hero-toc--home,
html.pt-internal .scroll-hint{animation:none;opacity:1}
html.pt-internal .page-nav{pointer-events:auto}
html.pt-internal .replay{animation-delay:0s;animation-duration:.4s}
@media (prefers-reduced-motion:reduce){
  html,
  html.pt-leaving,
  .pt-veil,
  html.pt-leaving .pt-veil{transition:none}
}

/* ===========================================================================
   ANNONCE « SITE EN CONSTRUCTION » — <dialog> natif, première venue seulement,
   jamais sur l'accueil. Deux temps dans la même boîte : le message, puis le
   remerciement qui prend sa place avant l'effacement.
   =========================================================================== */
.annonce{
  width:min(460px, calc(100vw - 40px));
  max-height:calc(100dvh - 40px);
  margin:auto;
  padding:0;
  border:none;
  border-radius:24px;
  background:transparent;
  overflow:visible;
  opacity:0;
  transform:translateY(14px) scale(.97);
  transition:opacity .5s ease, transform .5s cubic-bezier(.2,.8,.2,1);
}
.annonce::backdrop{
  background:rgba(11,25,34,.72);
  -webkit-backdrop-filter:blur(7px);
  backdrop-filter:blur(7px);
  opacity:0;
  transition:opacity .5s ease;
}
.annonce.est-ouverte{opacity:1;transform:translateY(0) scale(1)}
.annonce.est-ouverte::backdrop{opacity:1}
.annonce.est-fermee{opacity:0;transform:translateY(-8px) scale(.985)}
.annonce.est-fermee::backdrop{opacity:0}

.annonce-corps,
.annonce-merci{
  position:relative;
  border-radius:24px;
  background:linear-gradient(160deg, #f8f3ec 0%, #efe7d9 100%);
  border:1px solid rgba(201,168,106,.42);
  box-shadow:0 40px 90px -34px rgba(11,25,34,.7);
  text-align:center;
}
.annonce-corps{
  padding:42px 40px 36px;
  transition:opacity .35s ease;
}
.annonce-ico{
  width:52px;height:52px;
  margin:0 auto 22px;
  display:flex;align-items:center;justify-content:center;
  border:1px solid rgba(201,168,106,.5);
  border-radius:50%;
  color:var(--gold);
  background:rgba(201,168,106,.08);
}
.annonce-ico svg{width:22px;height:22px}
.annonce-titre{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(21px, 2.4vw, 25px);
  line-height:1.2;
  color:var(--ink);
  margin-bottom:14px;
}
.annonce-texte{
  font-family:var(--serif);
  font-size:15.5px;
  line-height:1.62;
  color:var(--ink);
  opacity:.82;
  max-width:34ch;
  margin:0 auto 28px;
}
.annonce-ok{align-self:center}

.annonce-merci{
  position:absolute;inset:0;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:8px;
  padding:42px 32px;
  opacity:0;
  pointer-events:none;
  transition:opacity .5s ease;
}
.annonce-merci span{
  font-family:var(--serif);
  font-size:16px;
  color:var(--ink);
  opacity:.78;
}
.annonce-merci b{
  font-family:var(--serif);
  font-style:italic;
  font-weight:500;
  font-size:clamp(22px, 2.6vw, 27px);
  background:var(--gold-text);
  -webkit-background-clip:text;
  background-clip:text;
  color:transparent;
  -webkit-box-decoration-break:clone;
  box-decoration-break:clone;
}
.annonce.est-merci .annonce-corps{opacity:0}
.annonce.est-merci .annonce-merci{opacity:1}

@media (max-width:560px){
  .annonce-corps{padding:34px 26px 30px}
  .annonce-ico{width:46px;height:46px;margin-bottom:18px}
  .annonce-texte{font-size:15px;margin-bottom:24px}
}
@media (prefers-reduced-motion: reduce){
  .annonce, .annonce::backdrop, .annonce-corps, .annonce-merci{transition:none}
}

/* ===========================================================================
   MOTS DORÉS DU CORPS (em) — or « brillant » : le dégradé --gold-text est
   peint dans le texte via background-clip. box-decoration-break:clone → chaque
   fragment de ligne reçoit le reflet complet (sheen homogène même quand le
   mot passe à la ligne). Regroupe tous les contextes où un em était doré.
   =========================================================================== */
.service-card-body em,
.about-lead em,
.manifesto-lead em,
.split-lead em,
.annonce-texte em,
.team-lead em,
.sec-copy em,
/* ⚠️ `.art-body strong` EST DANS CETTE LISTE À DESSEIN (demande d'Allan) : dans
   un article, il ne doit pas y avoir DEUX mises en valeur, une dorée et une
   grasse — c'est la même chose. `**mot**` et `*mot*` donnent donc le même doré,
   et la console n'enseigne plus que `**mot**`. Les articles écrits avant, qui
   emploient `*mot*`, restent identiques à eux-mêmes. */
.duo-note em,
.pledge-panel em,
.credo em,
.pledge-grid em,
.story em,
.art-body strong,
.art-body em{
  background:var(--gold-text);
  -webkit-background-clip:text;
  background-clip:text;
  color:transparent;
  -webkit-box-decoration-break:clone;
  box-decoration-break:clone;
}
.split-lead em,
.pledge-panel em,
.annonce-texte em,
.art-body em{font-style:normal}

/* ===========================================================================
   BARRE DE DOTS — MOBILE PORTRAIT : horizontale, EN BAS, pleine largeur.
   Demande d'Allan : au lieu d'occuper le bord droit, la barre occupe le bas
   de l'écran ; elle intègre un bouton texte « Menu » qui REMPLACE le burger
   (masqué ici, sur les pages animées uniquement — html.full-page ; les pages
   défilantes type contact gardent leur burger, elles n'ont pas de dots).
   Le scrub tactile continue d'afficher le nom des sections, dans UNE
   étiquette posée AU-DESSUS de la barre, alignée à gauche (data-scrub-label
   posée par app.js) — les infobulles par dot sont désactivées dans ce mode.
   Le couloir droit des sections est rendu ici (padding-right remis au nu) :
   l'espace réservé passe EN BAS (padding-bottom + remontée des éléments
   ancrés en bas : scroll-hint, replay, bannière cookies).
   =========================================================================== */
.page-nav-menu{display:none}
@media (max-width:700px) and (orientation:portrait){
  html.full-page .menu-burger{display:none}
  .page-nav{
    top:auto;left:12px;right:12px;
    /* env() : respiration au-dessus de la barre système iOS (0 ailleurs) */
    bottom:calc(10px + env(safe-area-inset-bottom, 0px));
    transform:none;
    flex-direction:row;
    /* space-between : les dots (boîtes fixes 24px) se répartissent sur toute
       la largeur, « Menu » ancré au bout — zone de glissé généreuse. */
    justify-content:space-between;
    gap:0;
    padding:4px 8px 4px 10px;
  }
  /* Étiquette de scrub : une seule, AU-DESSUS de la barre, à gauche. */
  .page-nav button::before{display:none}
  .page-nav::after{
    content:attr(data-scrub-label);
    position:absolute;
    bottom:calc(100% + 10px);
    left:2px;
    white-space:nowrap;
    font-family:var(--sans);
    font-size:10px;
    letter-spacing:.18em;
    text-transform:uppercase;
    color:var(--cream);
    background:rgba(14,34,48,.9);
    border:1px solid rgba(201,168,106,.3);
    border-radius:999px;
    padding:7px 14px;
    opacity:0;
    transform:translateY(4px);
    transition:opacity .25s, transform .25s cubic-bezier(.2,.8,.2,1);
    pointer-events:none;
  }
  .page-nav[data-scrub-label]::after{opacity:1;transform:translateY(0)}
  /* Bouton « Menu » : texte micro-typo du site, séparé des dots par un filet.
     Couleur adaptative comme la barre (crème sur sombre, encre sur clair).
     `button.page-nav-menu` : spécificité ≥ `.page-nav button` (0,1,1), sinon
     la boîte fixe 24px des dots gagnerait et rognerait le texte/la zone de
     clic. */
  .page-nav button.page-nav-menu{
    display:block;
    width:auto;height:24px;
    padding:0 4px 0 14px;
    border:none;background:none;cursor:pointer;
    border-left:1px solid rgba(246,241,234,.25);
    border-radius:0;
    font-family:var(--sans);
    font-size:10px;
    letter-spacing:.18em;
    text-transform:uppercase;
    color:var(--cream);
    transition:color .25s, border-color .25s;
    position:relative;
  }
  .page-nav.on-light button.page-nav-menu{
    color:var(--ink);
    border-left-color:rgba(24,53,66,.25);
  }
  .page-nav button.page-nav-menu::before,
  .page-nav button.page-nav-menu::after{content:none}
  /* Overlay ouvert : la barre passe AU-DESSUS (seule affordance de fermeture,
     le burger étant masqué) ; les dots s'estompent et se désactivent le temps
     du menu. Le libellé « Menu » devient une CROIX sans changer d'un pixel
     l'espace du bouton : le texte reste dans le flux (il fixe la largeur)
     mais passe transparent, la croix est peinte par-dessus en pseudo-
     éléments centrés sur la zone du texte. */
  .page-nav.menu-open{
    z-index:42;
    background:rgba(246,241,234,.06);
    border-color:rgba(246,241,234,.14);
  }
  .page-nav.menu-open button.page-nav-menu{
    color:transparent;
    border-left-color:rgba(246,241,234,.25);
  }
  .page-nav.menu-open button.page-nav-menu::before,
  .page-nav.menu-open button.page-nav-menu::after{
    content:"";
    display:block;
    position:absolute;
    /* Centre de la ZONE DE TEXTE : padding 14px à gauche, 4px à droite
       → le milieu du texte est décalé de (14−4)/2 = 5px vers la droite. */
    left:calc(50% + 5px);
    top:50%;
    right:auto;bottom:auto;
    width:13px;height:1.5px;
    /* Neutralise les styles hérités des pseudos de base des boutons de la
       barre (::before = infobulle : pastille, opacity:0 ; ::after = dot :
       inset, rond) — sans ça la croix hérite d'une pastille invisible. */
    padding:0;margin:0;
    border:none;border-radius:1px;
    background:var(--cream);
    opacity:1;
    transition:none;
    transform:translate(-50%,-50%) rotate(45deg);
  }
  .page-nav.menu-open button.page-nav-menu::after{
    transform:translate(-50%,-50%) rotate(-45deg);
  }
  .page-nav button[data-section]{transition:opacity .3s}
  .page-nav.menu-open button[data-section]{pointer-events:none;opacity:.35}

  /* --- Espace réservé : plus de couloir à DROITE, de la place EN BAS. ---
     Neutralise les padding-right du bloc « couloir de la pilule » (la barre
     n'est plus sur le bord droit) et réserve à la place la bande du bas
     (barre ~34px + marge 10px → 64px de padding-bottom). */
  html.full-page .page--light,
  html.full-page .page--statement{padding-right:24px;padding-bottom:64px}
  html.full-page .page--trust{padding-right:20px;padding-bottom:64px}
  html.full-page .services-header,
  html.full-page .edge-head,
  html.full-page .team-head{padding-right:24px}
  html.full-page .site-foot .foot-inner{padding-right:24px}
  /* Sections sans padding latéral porteur : bande du bas quand même. */
  html.full-page .page--edge{padding-bottom:64px}
  html.full-page .page--cta{padding-bottom:64px}
  /* Éléments ancrés en bas de l'écran : remontés au-dessus de la barre. */
  html.full-page .scroll-hint{bottom:72px}
  html.full-page .replay{bottom:64px}
}

/* ============================================================================
   HERO DIFFÉRENCIÉ des pages animées (décision d'Allan, 01/08/2026 —
   maquettes dans _hero-variantes.html, fichier de travail à supprimer après
   le chantier). Trois pièces, cumulées sur les pages PRINCIPALES d'abord
   (formations, conférences, automatisations) :
     - surtitre de service (.hero-kicker, variante A validée) ;
     - nébuleuse peinte, TEINTE ET PLACE PROPRES À CHAQUE PAGE (.hero-nebula,
       variante J8) — un lavis statique, écho des fonds peints de l'accueil ;
     - sommaire de chapitre en pied de hero (.hero-toc, variante J9), liens
       data-goto (gérés par app.js) avec ancre #slug en repli.
   ========================================================================== */
.hero-kicker{
  display:flex;align-items:center;justify-content:center;gap:16px;
  font-family:var(--sans);font-size:11px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--gold);
  margin-bottom:30px;
  position:relative;z-index:2;
}
.hero-kicker::before, .hero-kicker::after{
  content:"";width:44px;height:1px;flex:none;
  background:linear-gradient(90deg, transparent, rgba(201,168,106,.55));
}
.hero-kicker::after{transform:scaleX(-1)}
/* Mobile : resserré et sans filets pour tenir sur UNE ligne (le repli
   laissait le « · » orphelin en bout de ligne). Mesuré : le plus long
   surtitre (« Autres services · Accompagnement IA ») tient à 375 px. */
@media (max-width:560px){
  .hero-kicker{font-size:10px;letter-spacing:.18em;gap:0}
  .hero-kicker::before, .hero-kicker::after{display:none}
}

/* Nébuleuse : div posée en PREMIER enfant de la section hero (sous le
   contenu, au-dessus du fond ; la poussière canvas passe devant → effet de
   profondeur). Une teinte et une place par page — en ajouter une par page
   au fil du déploiement, jamais deux pages identiques. */
.hero-nebula{position:absolute;inset:0;pointer-events:none;z-index:0}
.hero-nebula--formations{background:
  radial-gradient(46% 62% at 78% 38%, rgba(201,168,106,.15) 0%, transparent 68%),
  radial-gradient(30% 44% at 68% 62%, rgba(120,150,165,.12) 0%, transparent 70%),
  radial-gradient(20% 26% at 84% 24%, rgba(246,241,234,.07) 0%, transparent 75%)}
.hero-nebula--conferences{background:
  radial-gradient(48% 64% at 22% 36%, rgba(126,156,178,.17) 0%, transparent 68%),
  radial-gradient(28% 40% at 34% 62%, rgba(201,168,106,.10) 0%, transparent 70%),
  radial-gradient(18% 24% at 14% 22%, rgba(246,241,234,.07) 0%, transparent 75%)}
.hero-nebula--automatisations{background:
  radial-gradient(50% 60% at 76% 70%, rgba(110,152,144,.16) 0%, transparent 68%),
  radial-gradient(30% 42% at 62% 40%, rgba(201,168,106,.09) 0%, transparent 70%),
  radial-gradient(18% 26% at 88% 56%, rgba(246,241,234,.06) 0%, transparent 75%)}
/* Récapitulatif des 8 (teinte · position), toutes distinctes deux à deux :
   formations or/flanc droit · conférences bleu lunaire/flanc gauche ·
   automatisations vert-de-gris/bas droit · chatbots champagne rosé/haut
   centre · accompagnement lavande de nuit/flanc gauche bas · sites-web
   cuivre doux/bas gauche · vidéos argent lunaire/bas centre · à propos
   mauve d'aube/haut gauche. */
.hero-nebula--chatbots{background:
  radial-gradient(44% 56% at 50% 20%, rgba(214,170,132,.15) 0%, transparent 68%),
  radial-gradient(26% 36% at 38% 40%, rgba(126,156,178,.10) 0%, transparent 70%),
  radial-gradient(16% 22% at 62% 14%, rgba(246,241,234,.07) 0%, transparent 75%)}
.hero-nebula--accompagnement{background:
  radial-gradient(46% 60% at 24% 68%, rgba(136,138,180,.16) 0%, transparent 68%),
  radial-gradient(28% 40% at 38% 44%, rgba(201,168,106,.09) 0%, transparent 70%),
  radial-gradient(18% 24% at 14% 82%, rgba(246,241,234,.06) 0%, transparent 75%)}
.hero-nebula--sites-web{background:
  radial-gradient(48% 58% at 30% 78%, rgba(196,124,82,.13) 0%, transparent 68%),
  radial-gradient(28% 38% at 52% 60%, rgba(126,156,178,.09) 0%, transparent 70%),
  radial-gradient(18% 24% at 18% 62%, rgba(246,241,234,.06) 0%, transparent 75%)}
.hero-nebula--videos{background:
  radial-gradient(46% 54% at 54% 82%, rgba(246,241,234,.11) 0%, transparent 68%),
  radial-gradient(30% 40% at 70% 64%, rgba(201,168,106,.08) 0%, transparent 70%),
  radial-gradient(20% 26% at 40% 90%, rgba(126,156,178,.07) 0%, transparent 75%)}
.hero-nebula--apropos{background:
  radial-gradient(46% 58% at 20% 18%, rgba(178,132,158,.15) 0%, transparent 68%),
  radial-gradient(28% 38% at 36% 34%, rgba(201,168,106,.09) 0%, transparent 70%),
  radial-gradient(18% 24% at 10% 30%, rgba(246,241,234,.06) 0%, transparent 75%)}

/* Sommaire de chapitre — UNE SEULE LIGNE (exigence d'Allan). Numéros dorés
   si la place le permet (mesuré à 1280 : la plus longue tient) ; sinon la
   règle de repli est : retirer les numéros et séparer par « · » en
   resserrant. Masqué sous 1280 px (couloir des dots, barre mobile) et sur
   écran bas (le contenu centré s'en approcherait trop). */
.hero-toc{
  position:absolute;left:24px;right:24px;bottom:36px;z-index:2;
  display:flex;justify-content:center;align-items:baseline;gap:30px;
  font-family:var(--sans);font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;
  white-space:nowrap;
}
.hero-toc::before{
  content:"";position:absolute;top:-14px;left:50%;transform:translateX(-50%);
  width:220px;height:1px;
  background:linear-gradient(90deg, transparent, rgba(201,168,106,.4), transparent);
}
.hero-toc-titre{
  position:absolute;left:50%;bottom:100%;transform:translateX(-50%);
  margin-bottom:26px;
  font-family:var(--sans);font-size:9px;letter-spacing:.26em;text-transform:uppercase;
  color:rgba(246,241,234,.42);
  white-space:nowrap;
}
.hero-toc a{
  color:rgba(246,241,234,.55);text-decoration:none;
  display:inline-flex;align-items:baseline;
  transition:color .3s;
}
.hero-toc a:hover{color:var(--cream)}
.hero-toc b{font-weight:400;color:var(--gold);margin-right:8px;letter-spacing:.08em}
/* Paliers de place (règle d'Allan : UNE seule ligne, toujours, et présent
   aussi longtemps que SA ligne tient — deuxième remontée d'Allan : un seuil
   global trop haut le masquait sur les petites fenêtres) :
   - large (≥1140 px) : numéros dorés 01/02… et espacement confortable
     (formations, la plus longue : 995 px mesurés) ;
   - sous 1140 px : les numéros sautent, séparateur « · », espace resserré —
     largeurs MESURÉES : formations 734 px · conférences 481 px ·
     automatisations 398 px ;
   - chaque page garde ensuite son sommaire jusqu'à ce que SA ligne ne
     tienne plus : seule formations doit lâcher avant le plancher (sous
     790 px = 734 + marges) ;
   - plancher commun : sous 700 px de large (la barre des dots passe en bas
     en portrait) ou 700 px de haut, masqué partout.
   ⚠️ Le « · » vit dans un ::before à couleur PROPRE : le survol du lien ne
   doit pas teinter le séparateur qui le précède. */
@media (max-width:1139px){
  .hero-toc{gap:0;font-size:10px;letter-spacing:.1em}
  .hero-toc b{display:none}
  .hero-toc a + a::before{content:"·";color:rgba(201,168,106,.55);margin:0 11px}
}
@media (max-width:789px){[data-slug="formations"] .hero-toc{display:none}}
@media (max-width:700px), (max-height:700px){.hero-toc{display:none}}
.hero-toc--home{
  bottom:36px;
  opacity:0;
  animation:fade 1.4s 8s forwards;
}
@media (max-width:879px){
  .hero-toc--home{font-size:9.5px;letter-spacing:.06em}
  .hero-toc--home a + a::before{margin:0 8px}
}
@media (max-width:735px){.hero-toc--home{display:none}}
.page--dark .scroll-hint{bottom:114px}
.replay{bottom:72px}
@media (max-width:735px), (max-height:700px){
  .page--dark .scroll-hint{bottom:40px}
  .replay{bottom:36px}
}
@media (max-width:700px){
  .page--dark .scroll-hint{bottom:24px}
  .replay{bottom:20px}
}

/* ===========================================================================
   LANCEUR DU CHATBOT (#letsbot) — le widget n'en fournit pas : il attend cet
   élément, s'ancre sur sa position à l'ouverture et le masque tant qu'il est
   ouvert. Registre visuel : encre + filet doré, la même famille que les
   boutons du site (il est d'ailleurs inscrit dans les listes du reflet
   balayé plus haut). Sur les pages animées en mobile portrait, la barre de
   dots occupe le bas de l'écran : le lanceur remonte au-dessus d'elle.
   =========================================================================== */
.chat-bulle{
  position:fixed;
  right:24px;
  bottom:24px;
  z-index:45;
  display:flex;
  align-items:center;
  gap:9px;
  padding:11px 18px 11px 14px;
  border-radius:999px;
  cursor:pointer;
  overflow:hidden;
  font-family:var(--sans);
  font-size:11px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--cream);
  background:linear-gradient(158deg, #1d3f4f 0%, #122c39 100%);
  border:1px solid rgba(201,168,106,.42);
  box-shadow:0 14px 34px -16px rgba(0,0,0,.65), inset 0 1px 0 rgba(246,241,234,.06);
  transition:border-color .4s, box-shadow .4s, transform .4s cubic-bezier(.2,.8,.2,1);
}
.chat-bulle:hover{
  border-color:rgba(201,168,106,.8);
  box-shadow:0 18px 40px -16px rgba(0,0,0,.7), inset 0 1px 0 rgba(246,241,234,.08);
  transform:translateY(-2px);
}
.chat-bulle:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
/* Remontée au-dessus du sommaire du hero — posée par chat-init.js, et
   SEULEMENT quand le sommaire arrive réellement sous la bulle. Le sommaire est
   centré : sur un large écran il ne s'approche pas du bord droit et la bulle
   doit rester en bas, sinon elle flotte au-dessus d'un vide (retour d'Allan,
   27/08/2026). Sur une fenêtre plus étroite, ou sur l'accueil dont les 8
   entrées occupent toute la largeur, il faut au contraire la remonter. D'où
   une mesure, pas un seuil de media query : la largeur du sommaire dépend de
   la page ET de la fenêtre. */
.chat-bulle--haut{bottom:96px}
.chat-bulle-ico{
  display:flex;
  align-items:center;
  justify-content:center;
  width:22px;height:22px;
  flex:0 0 auto;
  color:var(--gold);
}
.chat-bulle-ico svg{width:19px;height:19px}
@media (max-width:700px) and (orientation:portrait){
  /* Barre de dots : bottom = 10px + safe-area, hauteur ~42px. */
  html.full-page .chat-bulle{bottom:calc(64px + env(safe-area-inset-bottom, 0px))}
  .chat-bulle{right:14px;padding:10px 15px 10px 12px}
  .chat-bulle-txt{display:none}
}
@media (prefers-reduced-motion: reduce){
  .chat-bulle{transition:none}
  .chat-bulle:hover{transform:none}
}
