/* Design system Synaps — les composants.
   Chacun est repris d'un élément de synaps.re (fichier source en tête de
   bloc) et renommé pour servir partout. Le balisage de chacun est dans
   docs/composants.md, et tous sont montrés dans exemples/index.html.
   Demande tokens.css et base.css avant lui. */

/* =========================================================================
   Boutons — boutons.css
   Deux boutons, pas un de plus. Pas d'icône (sauf le logo WhatsApp, en
   vert), pas d'ombre, rien qui se soulève. Même hauteur (46 px) et, côte à
   côte, même largeur (16 rem au moins).
   Principal : aplat orange, un chevron qui devient flèche au survol (la
   seule chose qui bouge). Secondaire : « ghost », filet et texte encre,
   qui passent à l'orange au survol, sans flèche.
   <a class="cta" href="#rdv"><span class="cta__label">Prendre rendez-vous</span><span class="cta__arrow" aria-hidden="true"></span></a>
   <a class="cta-ghost" href="#offres">Voir les offres</a>
   ========================================================================= */
.cta,
.cta-ghost {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  box-sizing: border-box;
  min-width: 16rem;
  height: 46px;
  padding: 0 20px;
  border-radius: var(--rayon-bouton);
  font-family: inherit;   /* un <button> ne reprend pas la police d'office */
  font-size: var(--taille-bouton);
  font-weight: 600;
  letter-spacing: -0.005em;
  line-height: 1;
  white-space: nowrap;
  text-decoration: none;
  box-shadow: none;
  cursor: pointer;
  transition: color var(--duree-etat) ease, border-color var(--duree-etat) ease;
}
.cta { border: 1px solid var(--orange); background: var(--orange); color: var(--blanc); }
.cta:hover { color: var(--blanc); }
.cta__label { display: inline-flex; align-items: center; }
/* la flèche de Stripe, dessinée en CSS : un chevron au repos ; au survol il
   avance de 3 px et une hampe apparaît derrière lui */
.cta__arrow { position: relative; display: inline-block; width: 13px; height: 10px; font-size: 0; }
.cta__arrow::before,
.cta__arrow::after {
  content: "";
  position: absolute;
  inset: 0;
  background: currentColor;
  -webkit-mask: var(--fleche-trait) center / 10px 10px no-repeat;
  mask: var(--fleche-trait) center / 10px 10px no-repeat;
  transition: transform var(--duree-etat) ease, opacity var(--duree-etat) ease;
}
.cta__arrow::after {
  --fleche-trait: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M1.5 1.5 5 5 1.5 8.5' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
.cta__arrow::before {
  --fleche-trait: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M1 5h6.8' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E");
  opacity: 0;
}
.cta:hover .cta__arrow::after { transform: translateX(3px); }
.cta:hover .cta__arrow::before { opacity: 1; }

.cta-ghost { border: 1px solid var(--filet-bouton); background: transparent; color: var(--ink); }
.cta-ghost:hover { border-color: var(--orange); color: var(--accent-text); }
.cta-ghost svg { display: none; }
/* le logo WhatsApp, seule icône admise, en vert */
.cta-ghost:is([href*="wa.me"], [href*="whatsapp"]) svg {
  display: block; width: 18px; height: 18px; flex: 0 0 auto;
  fill: none; color: var(--whatsapp); stroke: currentColor;
}
/* sur fond sombre */
.sombre .cta-ghost { border-color: var(--filet-bouton-sombre); color: var(--paper); }
.sombre .cta-ghost:hover { border-color: var(--paper); color: var(--paper); }

.cta:focus-visible,
.cta-ghost:focus-visible { outline: 2px solid var(--orange); outline-offset: 3px; }
.cta:disabled, .cta-ghost:disabled { opacity: 0.6; cursor: default; }

/* une rangée de boutons ; au téléphone, l'un sous l'autre, à leur largeur
   (jamais toute la largeur de l'écran) */
.actions { display: flex; flex-wrap: wrap; align-items: stretch; gap: var(--ecart-boutons); }
.actions--centre { justify-content: center; }
/* sous un titre ou un texte (sous-bloc, bannière), les boutons à 24 px */
.sous-bloc__tete .actions,
.banniere .actions { margin-top: 24px; }
@media (max-width: 640px) {
  .actions { flex-direction: column; align-items: flex-start; }
  .actions--centre { align-items: center; }
}

/* le lien qui mène plus loin : texte orange gras, la flèche avance */
.lien-suite { display: inline-block; padding: 12px 0; margin: -12px 0; font-size: 15px; font-weight: 700; color: var(--accent-text); text-decoration: none; }
.lien-suite span { display: inline-block; transition: transform var(--duree-etat) ease; }
.lien-suite:hover { color: var(--accent-text); }
.lien-suite:hover span { transform: translateX(3px); }

/* =========================================================================
   Lien en bloc — deux-heures.css (.dh-ia__pheno, « la porte vers Phénomène »)
   Un lien, pas une illustration : fond orange très pâle, SANS filet (ce sont
   les illustrations qui ont un filet), une image ronde, le texte, une flèche
   dans un rond orange plein ; toute la ligne se clique.
   <a class="lien-bloc" href="/phenomene"><img class="lien-bloc__image" src="…" alt=""><span class="lien-bloc__texte"><b>Pas le temps d'y penser ? Branchez Phénomène.</b><span>…</span></span><span class="lien-bloc__fleche" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M6 12h12M13 7l5 5-5 5"/></svg></span></a>
   ========================================================================= */
.lien-bloc { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 16px; padding: 16px 18px; border-radius: var(--rayon-panneau); background: color-mix(in srgb, var(--orange) 9%, var(--paper)); color: var(--ink); text-decoration: none; transition: background-color var(--duree-etat) ease; }
.lien-bloc:hover { background: color-mix(in srgb, var(--orange) 16%, var(--paper)); }
.lien-bloc:focus-visible { outline: 2px solid var(--orange); outline-offset: 3px; }
.lien-bloc__image { width: 48px; height: 48px; border-radius: 50%; object-fit: cover; }
.lien-bloc__texte { display: flex; flex-direction: column; gap: 4px; font-size: 15px; line-height: 1.45; }
.lien-bloc__texte b { font-size: 16px; }
.lien-bloc__fleche { width: 36px; height: 36px; display: grid; place-items: center; border-radius: 50%; background: var(--orange); color: var(--paper); transition: transform var(--duree-etat) ease; }
.lien-bloc__fleche svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.lien-bloc:hover .lien-bloc__fleche { transform: translateX(3px); }
@media (max-width: 760px) {
  .lien-bloc { align-items: start; gap: 12px; padding: 16px; }
  .lien-bloc__image { width: 40px; height: 40px; }
  .lien-bloc__fleche { align-self: center; }
}

/* =========================================================================
   Barre de contact flottante — boutons.css, styles.css (.flottant, .barre-contact)
   Au téléphone seulement (≤ 760 px), jamais sur ordinateur (Loïc, 26/10).
   Cachée tant que les boutons du haut de page sont à l'écran et quand la
   prise de rendez-vous est visible ; un script pose alors
   .barre-contact--visible et elle monte du bas. Les deux boutons du site,
   avec une ombre douce et fixe ; au téléphone, à parts égales.
   <div class="barre-contact"><a class="cta" href="#rendez-vous">…</a><a class="cta-ghost" href="tel:+262…">Appeler</a></div>
   ========================================================================= */
.barre-contact {
  position: fixed;
  right: clamp(14px, 2.5vw, 28px);
  bottom: clamp(14px, 2.5vw, 28px);
  z-index: var(--plan-flottant);   /* sous la bannière des cookies */
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  max-width: calc(100vw - 2 * clamp(14px, 2.5vw, 28px));
  transform: translateY(calc(100% + 40px));
  visibility: hidden;
  transition: transform 260ms cubic-bezier(0.33, 1, 0.68, 1), visibility 0s linear 260ms;
}
.barre-contact--visible { transform: none; visibility: visible; transition: transform 260ms cubic-bezier(0.33, 1, 0.68, 1); }
.barre-contact :is(.cta, .cta-ghost) { min-width: 9.5rem; box-shadow: var(--ombre-flottante); }
.barre-contact .cta-ghost { background: var(--paper); }
@media (max-width: 640px) {
  .barre-contact { left: 12px; right: 12px; bottom: 12px; max-width: none; gap: 8px; }
  .barre-contact :is(.cta, .cta-ghost) { flex: 1 1 0; height: 40px; min-width: 0; padding: 0 10px; font-size: 14px; }
}
@media (min-width: 761px) { .barre-contact { display: none; } }
/* pendant qu'on remplit un formulaire, elle s'efface : elle couvrait « Confirmer le rendez-vous » */
body:has(form:focus-within, .rdv__formulaire:focus-within) .barre-contact { opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.2s ease, visibility 0s linear 0.2s; }
@media (prefers-reduced-motion: reduce) { .barre-contact, .barre-contact--visible { transition: none; } }
@media print { .barre-contact { display: none; } }

/* =========================================================================
   Carte (bento) — carte.css, Carte.astro
   Une carte claire, un filet de 1 px, 10 px de rayon, AUCUNE ombre. En
   haut, le titre (et un prix) à gauche, un carré d'icône à droite ; en
   dessous, un visuel qui prend la place qui reste. Chaque carte a son
   propre visuel, riche et animé ; peu de cartes, mais pleines.
   ========================================================================= */
.carte {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: clamp(440px, 46vw, 780px);
  padding: 0;
  margin: 0;
  border: 1px solid var(--filet-carte);
  border-radius: var(--rayon-carte);
  overflow: hidden;
  background: var(--surface-carte);
  color: inherit;
  font: inherit;
  text-align: left;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
}
a.carte, button.carte { cursor: pointer; }
.carte:focus-visible { outline: 2px solid var(--orange); outline-offset: 4px; }
.carte--chaude { background: var(--degrade-carte-chaude); }   /* un éclairage chaud, discret, en bas à gauche */
/* la carte des avis, seule carte en couleur : haut clair, orange en bas ; le
   dégradé part du bord de la carte, sinon il se répète sous la bordure (un
   liseré orange en haut) */
.carte--orangee { background: var(--degrade-carte-orangee); background-origin: border-box; background-repeat: no-repeat; }
/* une carte dont la miniature animée fait tout le travail (démo d'un
   produit) : ni filet ni éclairage, et sa scène ne suit pas le pointeur ; la
   démo a sa propre perspective, légère (Loïc, 28/10) */
.carte--nue { border-color: transparent; background: var(--surface-carte); }
.carte--nue .carte__scene { transform: none; }
.carte__tete {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 14px;
  padding: var(--pad-carte);
}
.carte__titres { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.carte__titre {
  margin: 0;
  font-family: var(--title-font);
  font-size: var(--taille-carte);
  font-weight: 800;
  letter-spacing: -0.025em;
  line-height: 1.05;
  color: var(--ink);
}
/* la phrase grise sous le titre, au lieu d'un prix (/votre-site) ; sur
   l'accueil, la ligne sous le titre reste orange (.carte__prix), même quand
   c'est une phrase (« 49 €, une fois. Livré en 24 h. ») */
.carte__texte { margin: 0; max-width: 44ch; font-size: clamp(14px, 1.05vw, 16px); font-weight: 400; line-height: 1.45; color: var(--ink-78); }
.carte__prix { font-size: clamp(14px, 1.05vw, 16px); font-weight: 700; color: var(--accent-text); }
.carte__icone {
  flex: none;
  width: 36px;
  height: 36px;
  display: grid;
  place-items: center;
  overflow: hidden;
  border: 1px solid var(--filet-icone);
  border-radius: var(--rayon-carte);
  background: var(--paper);
  color: var(--ink);
  transition: background var(--duree-etat) ease, color var(--duree-etat) ease;
}
.carte__icone svg { width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.carte__icone g { transition: transform var(--duree-survol) var(--ease-sortie); }
/* au téléphone (pas de survol), ou si l'on a demandé moins d'animations, le
   script pose .carte--active quand la carte est bien à l'écran (plus de 55 %
   visible) : tout ce qui se joue au survol s'y joue aussi. Chaque visuel
   écrit ses états avec .carte:is(:hover, .carte--active), jamais :hover seul. */
.carte:is(:hover, :focus-visible, .carte--active) .carte__icone { background: var(--ink); color: var(--paper); }
/* l'icône dit ce qui va se passer : les deux flèches s'écartent (la carte
   s'ouvre en grand), ou la flèche file et revient (on change de page) */
.carte:is(:hover, :focus-visible) .carte__icone .ic-agrandir-a { transform: translate(2px, -2px); }
.carte:is(:hover, :focus-visible) .carte__icone .ic-agrandir-b { transform: translate(-2px, 2px); }
.carte:is(:hover, :focus-visible) .carte__icone .ic-fleche { animation: carte-file 0.6s cubic-bezier(0.5, 0, 0.2, 1) both; }
@keyframes carte-file { 0% { transform: none; } 45% { transform: translateX(22px); } 46% { transform: translateX(-22px); } 100% { transform: none; } }
.carte__visuel { position: relative; flex: 1 1 auto; display: block; min-height: 0; perspective: 1100px; overflow: hidden; }
/* la scène du visuel s'incline vers le pointeur (--x, --y entre -0,5 et 0,5,
   posées par un script : 3,5° au plus) ; ses couches se séparent au survol */
.carte__scene {
  position: absolute;
  inset: 0;
  transform-style: preserve-3d;
  transform: rotateX(calc(var(--y, 0) * -6deg)) rotateY(calc(var(--x, 0) * 7deg));
  transition: transform var(--duree-entree) var(--ease-sortie);
}
.carte__scene > * { position: absolute; box-sizing: border-box; backface-visibility: hidden; outline: 1px solid transparent; transition: transform var(--duree-scene) var(--ease-sortie), opacity var(--duree-entree) ease; }
/* un reflet qui balaie un aplat orange au survol */
.reflet { position: absolute; inset: 0; background: var(--degrade-reflet); background-size: 250% 100%; background-position: 130% 0; pointer-events: none; }
.carte:is(:hover, .carte--active) .reflet { animation: reflet-balaie 1.4s var(--ease-balaie) 0.15s both; }
@keyframes reflet-balaie { from { background-position: 130% 0; } to { background-position: -30% 0; } }

/* le bento : trois colonnes, une carte large (2/3) puis une étroite (1/3),
   puis l'inverse ; une colonne sous 900 px */
.bento { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gouttiere); }
.bento > .carte--large { grid-column: span 2; }
/* la deuxième rangée, plus basse que la première, comme chez Stripe :
   .carte--basse sur ses deux cartes (accueil-sections.css) */
@media (min-width: 901px) {
  .bento > .carte--basse { min-height: clamp(420px, 33vw, 480px); }
}
@media (max-width: 900px) {
  .bento { grid-template-columns: 1fr; }
  .bento > .carte--large { grid-column: auto; }
  .carte { min-height: clamp(380px, 100vw, 460px); }
}
/* « Voir d'autres réalisations » : les cartes en plus (.bento__plus) restent
   cachées jusqu'au clic, puis montent en fondu ; le script pose .bento--tout
   sur le bento, passe aria-expanded à true et retire le bouton
   <div class="bento__suite"><button class="cta-ghost" type="button" aria-controls="…" aria-expanded="false">Voir d'autres réalisations</button></div> */
.bento:not(.bento--tout) > .bento__plus { display: none; }
.bento--tout > .bento__plus { animation: monte var(--duree-entree) var(--ease-sortie) both; }
.bento__suite { display: flex; justify-content: center; margin-top: 28px; }

/* au téléphone (≤ 760 px), une rangée de cartes défile au doigt, sans
   défilement automatique ; au-dessus, la grille reste : <div class="bento defile-doigt"> */
@media (max-width: 760px) {
  .defile-doigt {
    display: flex;
    gap: 12px;
    margin: 0 calc(-1 * var(--pad-x));
    padding: 0 var(--pad-x) 6px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-padding: 0 var(--pad-x);
    scrollbar-width: none;
  }
  .defile-doigt::-webkit-scrollbar { display: none; }
  .defile-doigt > * { flex: 0 0 84%; scroll-snap-align: start; }
  .defile-doigt > .carte { min-height: 0; height: 380px; }
  /* dans un panneau, la rangée va jusqu'au bord du panneau, pas de la page */
  .panneau .defile-doigt { margin: 0 -18px; padding: 0 18px 6px; scroll-padding: 0 18px; }
}
@media (max-width: 420px) {
  .panneau .defile-doigt { margin: 0 -12px; padding: 0 12px 6px; scroll-padding: 0 12px; }
  .panneau .defile-doigt > * { flex-basis: 90%; }
}

/* le nuage de points derrière le visuel d'une carte (carte.css, .dh-nuage) :
   dessiné par effets/nuages.js, qui l'accélère au survol ou avec
   .carte--active. <canvas class="nuage" data-nuage="anneau"></canvas> */
.nuage { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }

/* la carte de réalisation (accueil-sections.css, .as-cas) : la capture du
   site, arrondie, et devant elle sa version téléphone dans le téléphone de
   verre ; au survol (ou à l'écran au téléphone, .carte--active), la capture
   s'avance et zoome de 5 %, le téléphone se soulève et pivote de 2°. Trois
   par rangée ; au téléphone, la rangée défile au doigt (.defile-doigt, 380 px).
   <div class="bento bento--trois defile-doigt">
     <button class="carte carte--realisation" type="button">…<span class="carte__visuel" aria-hidden="true"><span class="carte__scene">
       <span class="capture"><img src="…" alt=""></span>
       <span class="telephone"><span class="telephone__cadre"></span><span class="telephone__ecran"><img src="…" alt=""></span></span>
     </span></span></button>…</div> */
.bento--trois > .carte { min-height: clamp(380px, 28vw, 450px); }
.carte--realisation .carte__visuel { container-type: size; }
.capture { position: absolute; inset: 0 clamp(18px, 2vw, 28px) clamp(18px, 2vw, 28px); display: block; overflow: hidden; border-radius: var(--rayon-image); background: var(--surface-image); box-shadow: 0 0 0 1px rgba(20, 17, 15, 0.06), 0 22px 40px -24px rgba(90, 40, 20, 0.5); }
.capture img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform var(--duree-scene) var(--ease-sortie); }
/* la largeur du téléphone suit la plus petite des deux dimensions de
   l'aperçu : ses proportions d'iPhone tiennent quelle que soit la carte */
.carte--realisation .telephone { position: absolute; right: 6cqw; bottom: -5cqh; width: min(30cqw, 33cqh); }
.carte--realisation:is(:hover, .carte--active) .capture { transform: translateZ(10px); }
.carte--realisation:is(:hover, .carte--active) .telephone { transform: translate3d(-4px, -16px, 60px) rotate(2deg); }
.carte--realisation:is(:hover, .carte--active) .capture img { transform: scale(1.05); }

/* =========================================================================
   Onglets — accueil-sections.css (« Vous en êtes où ? »)
   Des cartes côte à côte, chacune avec sa petite illustration, qui s'anime
   quand elle est choisie ; un trait orange de 3 px sous la carte choisie ;
   ce qui n'est pas choisi passe en gris. Seul le panneau choisi s'affiche.
   Au téléphone : les onglets défilent au doigt, le choisi au milieu.
   ========================================================================= */
.onglets { display: grid; grid-template-columns: repeat(var(--nb, 3), minmax(0, 1fr)); gap: 12px; margin: 0 0 18px; }
.onglet {
  position: relative;
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas: "dessin dessin" "num titre" "ligne ligne";
  align-items: baseline;
  gap: 6px 10px;
  padding: clamp(16px, 1.6vw, 22px);
  border: 1px solid var(--filet-onglet);
  border-radius: var(--rayon-carte);
  background: var(--surface-carte);
  color: var(--ink);
  font: inherit;
  text-align: left;
  cursor: pointer;
  overflow: hidden;
  box-shadow: inset 0 0 0 0 var(--orange);
  transition: border-color 0.25s ease, background 0.25s ease, box-shadow 0.3s ease;
}
.onglet:hover { border-color: var(--orange-filet-survol); }
.onglet[aria-selected="true"], .onglet--actif {
  border-color: var(--orange-filet);
  background: var(--degrade-onglet);
  box-shadow: inset 0 -3px 0 0 var(--orange);   /* le trait suit l'arrondi */
}
.onglet:focus-visible { outline: 2px solid var(--orange); outline-offset: 3px; }
.onglet__dessin { grid-area: dessin; position: relative; display: block; height: clamp(116px, 9vw, 128px); margin: -4px -4px 10px; transition: filter 0.4s ease; }
.onglet__num { grid-area: num; font-family: var(--title-font); font-size: 15px; font-weight: 700; color: var(--accent-text); }
.onglet__titre { grid-area: titre; font-family: var(--title-font); font-size: var(--taille-onglet); font-weight: 700; letter-spacing: -0.015em; line-height: 1.15; }
.onglet__ligne { grid-area: ligne; font-size: 15px; line-height: 1.45; color: var(--ink-60); }
.onglet:not([aria-selected="true"]):not(.onglet--actif) .onglet__dessin { filter: grayscale(1) contrast(0.92); }
.onglet:not([aria-selected="true"]):not(.onglet--actif) :is(.onglet__titre, .onglet__num) { color: rgba(20, 17, 15, 0.62); }
.onglet:not([aria-selected="true"]):not(.onglet--actif):hover .onglet__dessin { filter: grayscale(0.4); }

.panneau {
  position: relative;
  padding: clamp(24px, 3vw, 44px);
  border: 1px solid var(--orange-filet);
  border-radius: var(--rayon-panneau);
  background: var(--degrade-panneau);
}
.panneau--entre { animation: panneau-entre 0.5s var(--ease-sortie) both; }
@keyframes panneau-entre { from { opacity: 0; transform: translateY(10px); } }
/* dans un panneau, le titre prend les colonnes 1 à 7 : ses deux boutons
   tiennent sur une ligne quand la place le permet */
.panneau .sous-bloc__tete > :first-child { grid-column: 1 / span 7; }
@media (max-width: 760px) {
  .onglets {
    display: flex;
    gap: 10px;
    margin: 0 calc(-1 * var(--pad-x)) 4px;
    padding: 2px var(--pad-x) 16px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-padding: 0 var(--pad-x);
    scrollbar-width: none;
  }
  .onglets::-webkit-scrollbar { display: none; }
  .onglet { flex: 0 0 80%; padding: 10px 12px 14px; scroll-snap-align: center; }
  .onglet__titre { font-size: 18px; white-space: nowrap; }
  .onglet__ligne { font-size: 14px; }
  .panneau { padding: 22px 18px; overflow: hidden; }
  /* dans un panneau, un bouton au texte long passe à la ligne au lieu de déborder du cadre */
  .panneau :is(.cta, .cta-ghost) { min-width: 0; max-width: 100%; height: auto; min-height: 46px; padding: 11px 18px; white-space: normal; text-align: center; line-height: 1.25; }
}
@media (max-width: 420px) { .onglet { flex-basis: 86%; } .panneau { padding: 18px 12px; } }

/* =========================================================================
   Questions (FAQ) — accueil-sections.css
   Des rangées qui se déplient (<details>), un « + » dans un carré orange
   pâle, qui devient « − » sur orange plein. Trois colonnes, une par thème.
   ========================================================================= */
.question { border-bottom: 1px solid var(--rule); }
.question summary {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 24px;
  padding: 16px 0;
  font-family: var(--title-font);
  font-size: var(--taille-question);
  font-weight: 700;
  letter-spacing: -0.01em;
  cursor: pointer;
  list-style: none;
}
.question summary::-webkit-details-marker { display: none; }
.question summary::after {
  content: "+";
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--rayon-bouton);
  background: var(--orange-voile);
  color: var(--accent-text);
  font-family: inherit;
  font-size: 22px;
  font-weight: 400;
  line-height: 1;
  transition: transform 0.4s var(--ease-sortie), background 0.3s ease, color 0.3s ease;
}
.question summary:hover::after { background: var(--orange-voile-survol); }
.question[open] summary::after,
.question[open] summary:hover::after { content: "−"; transform: rotate(180deg); background: var(--accent-text); color: var(--blanc); }
.question p { margin: 0 0 26px; max-width: 70ch; font-size: 17px; line-height: 1.6; color: var(--ink-60); }
/* la réponse dans son enveloppe : un script la fait glisser à l'ouverture
   et à la fermeture (docs/composants.md), au lieu de sauter
   <details class="question"><summary>…</summary><div class="question__corps"><p>…</p></div></details> */
.question__corps { overflow: hidden; }
/* les questions montent l'une après l'autre quand elles arrivent à l'écran */
.question { animation: question-monte 0.7s var(--ease-sortie) both; animation-timeline: view(); animation-range: entry 0% entry 60%; }
@keyframes question-monte { from { opacity: 0; transform: translateY(18px); } }

.faq-grille { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(24px, 3vw, 48px); }
.faq-theme { margin: 0 0 6px; padding-bottom: 12px; border-bottom: 1px solid var(--ink); font-family: var(--body-font); font-size: 14px; font-weight: 700; letter-spacing: 0.01em; color: var(--accent-text); }
.faq-grille .question summary { padding: 14px 0; font-size: clamp(16px, 1.15vw, 18px); line-height: 1.3; }
.faq-grille .question summary::after { width: 30px; height: 30px; font-size: 18px; }
.faq-grille .question p { margin-bottom: 18px; font-size: 15px; line-height: 1.55; }
@media (max-width: 900px) { .faq-grille { grid-template-columns: 1fr; gap: 28px; } }

/* =========================================================================
   Bannière — accueil-sections.css (« Avant, un site, c'était des semaines… »)
   Un grand encart clair : le texte à gauche, un visuel à droite.
   ========================================================================= */
.banniere {
  position: relative;
  isolation: isolate;
  display: grid;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  align-items: center;
  gap: clamp(28px, 4vw, 64px);
  padding: clamp(28px, 4vw, 56px);
  border: 1px solid var(--filet-doux);
  border-radius: var(--rayon-carte);
  background: var(--surface-claire);
  color: var(--ink);
  overflow: hidden;
}
.banniere p { margin: 0 0 14px; max-width: 52ch; font-size: clamp(16px, 1.15vw, 18px); line-height: 1.55; color: rgba(20, 17, 15, 0.74); }
/* la phrase qui conclut le texte de la bannière, en encre : <p class="fort"> */
.banniere .fort { font-weight: 700; color: var(--ink); }
.banniere__visuel { display: flex; justify-content: center; }
@media (max-width: 900px) {
  .banniere { grid-template-columns: 1fr; }
  /* une colonne : le bouton au milieu, comme le visuel dessous (aussi sous 640 px) */
  .banniere .actions { justify-content: center; align-items: center; }
}

/* la section claire, d'un bord à l'autre de l'écran :
   <section class="section section-claire"> */
.section-claire {
  position: relative;
  isolation: isolate;
  background: var(--surface-claire);
  box-shadow: 0 0 0 100vmax var(--surface-claire);
  clip-path: inset(0 -100vmax);
  border-top: 1px solid var(--filet-doux);
  border-bottom: 1px solid var(--filet-doux);
  /* l'écart de section aussi sous le contenu, dans le clair, avant le filet du bas */
  padding-bottom: var(--marge-section);
}

/* le ruban rayé (effets/ruban-raye.js, qui cherche canvas.as-ruban), sous le
   contenu d'une bannière ou d'une section claire
   <canvas class="as-ruban" data-ruban="banniere" aria-hidden="true"></canvas> */
.as-ruban { position: absolute; inset: 0; z-index: -1; display: block; width: 100%; height: 100%; pointer-events: none; }
/* dans une section claire, il couvre toute la largeur de l'écran */
.section-claire > .as-ruban { left: calc(50% - 50vw); width: 100vw; }
/* les boutons ghost restent lisibles s'ils croisent le ruban */
.banniere .cta-ghost,
.section-claire .cta-ghost { background: var(--surface-claire); }

/* le ruban de fils (effets/ondes.js) ; avec data-dans, en fond du bloc qui
   le reçoit, d'un bord à l'autre de l'écran */
.ondes { display: block; pointer-events: none; }
.ondes[data-dans] { position: absolute; top: 0; bottom: 0; left: calc(50% - 50vw); z-index: -1; width: 100vw; height: 100%; }
:has(> .ondes[data-dans]) { position: relative; isolation: isolate; }

/* =========================================================================
   Sous-bloc — accueil-sections.css
   Un filet en haut ; le titre à gauche (colonnes 1 à 5), le texte à droite
   (8 à 12) ; au téléphone, titre, texte puis boutons.
   ========================================================================= */
.sous-bloc { padding: var(--marge-sous-bloc) 0; border-top: 1px solid var(--rule); }
.sous-bloc__tete { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--gouttiere); align-items: start; margin-bottom: var(--marge-titre); }
.sous-bloc__tete > :first-child { grid-column: 1 / span 5; }
.sous-bloc__tete > .texte { grid-column: 8 / -1; max-width: none; }
@media (max-width: 900px) {
  .sous-bloc__tete { display: flex; flex-direction: column; gap: 16px; }
  /* au téléphone : titre, texte, puis boutons, comme chez Stripe */
  .sous-bloc__tete > div:first-child { display: contents; }
  .sous-bloc__tete > div:first-child .actions { order: 1; margin-top: 4px; }
}

/* =========================================================================
   Tuiles — accueil-sections.css
   Trois colonnes ; le titre en gras ouvre la phrase, le texte la continue
   en gris, sur la même ligne.
   ========================================================================= */
.tuiles { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: var(--gouttiere); row-gap: 40px; margin: 0; padding: 0; list-style: none; }
.tuile { padding-right: 32px; }
.tuile__titre { display: inline; margin: 0; font-family: var(--body-font); font-size: var(--taille-corps); font-weight: 700; line-height: 1.55; color: var(--ink); }
.tuile__titre::after { content: " "; }
.tuile p { display: inline; margin: 0; font-size: var(--taille-corps); line-height: 1.55; color: var(--ink-60); }
/* la phrase mise en avant sous les tuiles : sur toute la largeur, centrée, en grand
   <li class="tuile tuile--citation"><p><b>Ça ne sent pas l'IA.</b> Phénomène écrit avec vos mots.</p></li> */
.tuile--citation { grid-column: 1 / -1; justify-self: center; max-width: 820px; margin-top: clamp(24px, 4vw, 56px); padding: 0; text-align: center; }
.tuile--citation p { display: block; font-family: var(--title-font); font-size: var(--taille-phrase); line-height: 1.3; font-weight: 600; color: var(--ink-60); }
.tuile--citation b { color: var(--ink); }
@media (max-width: 1024px) { .tuiles { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .tuiles { grid-template-columns: 1fr; row-gap: 24px; } .tuile { padding-right: 0; } }

/* =========================================================================
   Étiquettes, pastilles, liste à coches
   ========================================================================= */
/* une étiquette : un module, une prestation (accueil-sections.css, .etude__badges) */
.etiquettes { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
.etiquette { display: inline-block; padding: 5px 10px; border: 1px solid var(--rule); border-radius: var(--rayon-champ); background: rgba(255, 255, 255, 0.6); font-size: var(--taille-etiquette); font-weight: 600; color: var(--ink); }
/* une pastille sombre, pour un fait court (« En ligne en 24 h ») */
.pastille { display: inline-block; padding: 3px 8px; border-radius: var(--rayon-pastille); background: var(--ink); color: var(--paper); font-size: 11px; font-weight: 700; white-space: nowrap; }
.pastille--orange { background: var(--orange); color: var(--blanc); }
/* la mention « Tout nouveau », seule en guise de titre d'une section de
   nouveautés (Loïc, 28/10) : un aplat rouge orangé (blanc dessus à plus de
   4,5:1), une lueur, un reflet qui la traverse toutes les 4 s, une étoile qui scintille
   <h2 class="titre-nouveau"><span class="nouveau"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 2l2.2 6.6L21 11l-6.8 2.4L12 20l-2.2-6.6L3 11l6.8-2.4z"/></svg>Tout nouveau</span></h2> */
.titre-nouveau { margin: 0 0 clamp(16px, 2vw, 24px); font-family: var(--title-font); font-size: clamp(15px, 1.15vw, 18px); line-height: 1; }
.nouveau { position: relative; display: inline-flex; align-items: center; gap: 0.45em; padding: 0.6em 0.95em 0.55em; overflow: hidden; border-radius: 7px; background: linear-gradient(100deg, #C9261A 0%, #D63A16 100%); box-shadow: 0 6px 18px -6px rgba(214, 58, 22, 0.75), 0 0 0 1px rgba(255, 255, 255, 0.18) inset; color: var(--blanc); font-weight: 800; letter-spacing: 0.02em; white-space: nowrap; }
.nouveau svg { width: 1.05em; height: 1.05em; fill: currentColor; }
.nouveau::after { content: ""; position: absolute; inset: 0; background: var(--degrade-reflet); background-size: 250% 100%; background-position: 130% 0; pointer-events: none; }
@media (prefers-reduced-motion: no-preference) {
  .nouveau::after { animation: nouveau-eclat 4s cubic-bezier(0.45, 0, 0.25, 1) 0.8s infinite; }
  .nouveau svg { animation: nouveau-scintille 2s ease-in-out infinite; }
}
@keyframes nouveau-eclat { 0% { background-position: 130% 0; } 30%, 100% { background-position: -30% 0; } }
@keyframes nouveau-scintille { 0%, 100% { opacity: 1; scale: 1; } 50% { opacity: 0.7; scale: 0.8; } }
/* une pastille claire qui regroupe des logos (les réseaux de Phénomène) */
.pastille-claire { display: inline-flex; gap: 8px; padding: 7px 9px; border: 1px solid var(--filet-carte); border-radius: var(--rayon-pastille); background: var(--paper); }

/* une liste à coches : une pastille orange avec la coche papier (CarteModale) */
.liste-coches { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.liste-coches li { position: relative; padding-left: 30px; font-size: 16px; line-height: 1.45; }
.liste-coches li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.15em;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: var(--orange) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 12.5l4 4 8-9' fill='none' stroke='%23F4F1E9' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 13px no-repeat;
}

/* des points courts sous la phrase d'un bloc : le début en gras, une petite
   puce carrée orange ; pas un pavé de texte (Loïc, 28/10)
   <ul class="points"><li><b>Plus ou moins qu'avant</b>, d'un coup d'œil.</li></ul> */
.points { display: flex; flex-direction: column; gap: 10px; margin: 0; padding: 0; list-style: none; }
.points li { position: relative; padding-left: 22px; font-size: var(--taille-corps); line-height: 1.45; color: var(--ink-60); }
.points li::before { content: ""; position: absolute; left: 2px; top: 0.55em; width: 8px; height: 8px; border-radius: 2px; background: var(--orange); }
.points b { color: var(--ink); font-weight: 700; }

/* =========================================================================
   Notification et bulle — deux-heures.css, accueil-stripe.css
   De petites interfaces posées dans un visuel. La notification (.notif) n'a
   pas d'ombre : papier, filet --rule, 10 px de rayon (deux-heures.css,
   .dh-notif). La bulle porte une ombre douce et neutre (accueil-stripe.css,
   .ac-bulle) ; l'interface blanche (.interface) porte --ombre-interface,
   douce et chaude.
   ========================================================================= */
.notif { display: inline-flex; align-items: center; gap: 8px; padding: clamp(8px, 0.7vw, 12px) clamp(11px, 0.9vw, 15px) clamp(8px, 0.7vw, 12px) clamp(8px, 0.7vw, 12px); border: 1px solid var(--rule); border-radius: var(--rayon-carte); background: var(--paper); white-space: nowrap; }
.notif__icone { width: 24px; height: 24px; display: grid; place-items: center; border-radius: var(--rayon-champ); background: var(--orange); color: var(--paper); font-style: normal; font-size: 13px; font-weight: 700; }
.notif__texte { display: flex; flex-direction: column; }
.notif__texte b { font-size: clamp(11.5px, 1vw, 16px); }
.notif__texte small { font-size: clamp(10px, 0.85vw, 14px); color: var(--ink-40); }
/* la notification qui surgit dans une carte (deux-heures.css, .dh-notif) :
   cachée au repos, elle glisse de 16 px depuis son bord au survol, ou quand
   la carte est à l'écran au téléphone ; la seconde suit 0,15 s après
   <span class="notif notif--surgit">…</span><span class="notif notif--surgit notif--droite">…</span> */
.notif--surgit { opacity: 0; transform: translateX(-16px); transition: opacity 0.4s ease, transform 0.7s var(--ease-sortie); }
.notif--surgit.notif--droite { transform: translateX(16px); }
.carte:is(:hover, .carte--active) .notif--surgit { opacity: 1; transform: none; }
.carte:is(:hover, .carte--active) .notif--surgit ~ .notif--surgit { transition-delay: 0.15s; }

.bulle {
  align-self: flex-start;
  max-width: 88%;
  padding: 11px 15px;
  border: 1px solid var(--filet-doux);
  border-radius: 20px 20px 20px 6px;
  background: var(--surface-bulle);
  box-shadow: 0 1px 2px rgba(20, 17, 15, 0.04), 0 8px 20px -12px rgba(20, 17, 15, 0.22);
  font-size: 15px;
  line-height: 1.35;
}
.bulle small { display: block; margin-top: 4px; font-size: 12px; color: var(--ink-60); }
.bulle--envoyee { align-self: flex-end; border-radius: 20px 20px 6px 20px; background: var(--blanc); }

/* une petite interface blanche (fenêtre, agenda, devis) dans une illustration */
.interface { border-radius: var(--rayon-image); background: var(--blanc); box-shadow: var(--ombre-interface); overflow: hidden; }

/* =========================================================================
   Verre — deux-heures.css (.dh-ptel, .dh-fen)
   Le cadre d'un téléphone ou d'une fenêtre de navigateur : un blanc
   translucide, un filet de lumière sur le bord, un bord régulier. Pas de
   noir, pas d'encoche, pas de backdrop-filter : c'est le fond, déjà flou ou
   coloré, qui se voit au travers.
   ========================================================================= */
.verre { border-radius: var(--rayon-fenetre); background: var(--verre-fond); box-shadow: var(--verre-bord); }

/* la fenêtre de navigateur en verre (deux-heures.css, .dh-fen) : la barre et
   le cadre translucides, seule la page dedans est blanche ; mesures en cqi
   <span class="verre navigateur"><span class="navigateur__barre"><i></i><i></i><i></i><span class="navigateur__url">aurore-randonnees.re</span></span><span class="navigateur__page">…</span></span> */
.navigateur { container-type: inline-size; display: flex; flex-direction: column; padding: 0 1.3cqi 1.3cqi; overflow: hidden; }
.navigateur__barre { display: flex; align-items: center; gap: 0.9cqi; padding: 1.6cqi 0.8cqi; }
.navigateur__barre i { width: 1.4cqi; height: 1.4cqi; border-radius: 50%; background: #D9DCE1; }
.navigateur__url { display: flex; align-items: center; justify-content: center; gap: 4px; width: 50%; margin-left: 12%; padding: 0.6cqi 2cqi; border: 1px solid rgba(255, 255, 255, 0.8); border-radius: var(--rayon-pastille); background: rgba(255, 255, 255, 0.55); font-size: 1.7cqi; color: #6B7280; }
.navigateur__page { position: relative; border-radius: 9px; background: var(--blanc); box-shadow: 0 0 0 1px rgba(20, 17, 15, 0.06); }
.carte:is(:hover, .carte--active) .navigateur { transform: translateZ(30px) translateY(-6px); }

/* le téléphone : vraies proportions d'iPhone (428 × 868), quel que soit
   son conteneur ; tout est en cqi (1 cqi = 4,28 px du gabarit)
   <div class="telephone"><div class="telephone__cadre"></div><div class="telephone__ecran">…</div></div> */
.telephone { position: relative; display: block; aspect-ratio: 428 / 868; container-type: inline-size; }
.telephone__cadre {
  position: absolute;
  inset: 0;
  border-radius: 15.89cqi;
  background: linear-gradient(160deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0.08) 38%, rgba(255, 255, 255, 0.03) 70%, rgba(255, 255, 255, 0.22) 100%);
  box-shadow:
    inset 0 0 0 0.3cqi rgba(255, 255, 255, 0.9),
    inset 0 0.5cqi 0.9cqi rgba(255, 255, 255, 0.8),
    0 0 0 0.25cqi rgba(20, 17, 15, 0.07),
    0 2cqi 6cqi -2cqi rgba(20, 17, 15, 0.12);
}
.telephone__ecran {
  position: absolute;
  inset: 3.04cqi;
  border-radius: 12.85cqi;
  overflow: hidden;
  clip-path: inset(0 round 12.85cqi);
  background: var(--blanc);
  box-shadow: 0 0 0 0.25cqi rgba(20, 17, 15, 0.08);
}
.telephone__ecran img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: 50% 0; }
/* l'en-tête d'une interface dans le téléphone : une pastille de verre qui
   flotte ; le contenu défile derrière elle */
.telephone__entete {
  position: absolute;
  top: 4cqi;
  left: 4cqi;
  right: 4cqi;
  z-index: 2;
  display: flex;
  align-items: center;
  gap: 2.5cqi;
  padding: 2.5cqi 4cqi;
  border-radius: var(--rayon-pastille);
  background: rgba(255, 255, 255, 0.55);
  border: 1px solid rgba(255, 255, 255, 0.8);
  box-shadow: 0 1cqi 4cqi -1cqi rgba(20, 17, 15, 0.12);
  font-size: 3.6cqi;
  font-weight: 700;
}

/* =========================================================================
   Fenêtre (modale) — CarteModale.astro
   Une carte qui s'ouvre en grand : elle monte de 200 px en fondu, sur un
   voile papier et des lueurs orange en bas de l'écran.
   <dialog class="fenetre"><span class="fenetre__depart" tabindex="-1" autofocus></span><div class="fenetre__lueur"></div><div class="fenetre__panneau">
     <div class="fenetre__poignee"><span></span></div>
     <button class="fenetre__fermer" aria-label="Fermer">…</button>
     <div class="fenetre__defile"><div class="fenetre__contenu">…</div></div>
   </div></dialog>
   Le script ajoute .fenetre--ouverte juste après showModal(), et
   .fenetre--fermee avant close() (attendre 0,3 s) ; il pose .fenetre-fige
   sur <html> tant qu'elle est ouverte.
   ========================================================================= */
.fenetre {
  --voir: 1;   /* 1 à l'ouverture, puis 0 entre 700 et 2 000 px de défilement (script) : les lueurs s'effacent */
  --lueurs:
    radial-gradient(50vw 60vw at 16vw 148vh, rgba(195, 65, 17, calc(var(--voir) * 0.5)) 24%, transparent 100%),
    radial-gradient(28vw 30vw at 24vw 125vh, rgba(195, 65, 17, calc(var(--voir) * 0.5)), transparent 100%),
    radial-gradient(33vw 32vw at 78vw 117vh, rgba(222, 74, 21, calc(var(--voir) * 0.55)) 27%, transparent 100%),
    radial-gradient(21vw 19vw at 88vw 109vh, rgba(222, 74, 21, calc(var(--voir) * 0.55)), transparent 100%);
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--ink);
  overflow-x: hidden;
  overflow-y: auto;
  overscroll-behavior: contain;
}
.fenetre:not([open]) { display: none; }
.fenetre::backdrop { background: rgba(236, 231, 219, 0); transition: background 0.4s ease; }
.fenetre.fenetre--ouverte::backdrop { background: var(--fond-fenetre); }
.fenetre__lueur { position: fixed; inset: 0; pointer-events: none; opacity: 0; background: var(--lueurs); transition: opacity 0.7s ease; }
.fenetre--ouverte .fenetre__lueur { opacity: 1; }
.fenetre__panneau {
  position: relative;
  width: min(var(--largeur-fenetre), calc(100% - 2 * clamp(16px, 4vw, 64px)));
  margin: 90px auto;
  background: var(--paper);
  border: 1px solid var(--filet-onglet);
  border-radius: var(--rayon-fenetre);
  box-shadow: var(--ombre-fenetre);
  opacity: 0;
  transform: translateY(200px);
  transition: opacity 0.25s ease, transform 0.7s var(--ease-sortie);
}
.fenetre--ouverte .fenetre__panneau { opacity: 1; transform: none; }
.fenetre--fermee .fenetre__panneau { transition: opacity 0.22s ease, transform 0.3s var(--ease-fermeture); transform: translateY(120px); opacity: 0; }
.fenetre__fermer {
  position: absolute;
  top: 24px;
  right: 24px;
  z-index: 3;
  width: 40px;
  height: 40px;
  display: grid;
  place-items: center;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(20, 17, 15, 0.06);
  color: var(--ink);
  cursor: pointer;
}
.fenetre__fermer svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; }
.fenetre__fermer:hover { background: rgba(20, 17, 15, 0.12); }
.fenetre__contenu { padding: 88px 88px 128px; display: flex; flex-direction: column; gap: 120px; }
.fenetre__titre { margin: 0; font-family: var(--title-font); font-size: var(--taille-fenetre); font-weight: 800; letter-spacing: -0.03em; line-height: 1.02; }

/* l'en-tête d'une fenêtre : le titre, une phrase et les boutons à gauche, la
   liste à coches à droite ; sur une colonne sous 1 000 px
   <div class="fenetre__haut"><div class="fenetre__intro"><h2 class="fenetre__titre" id="f1-titre">…</h2><p>…</p><div class="actions">…</div></div><ul class="liste-coches">…</ul></div> */
.fenetre__haut { display: grid; grid-template-columns: minmax(0, 600fr) minmax(0, 424fr); gap: 16px; justify-content: space-between; align-items: start; }
.fenetre__intro { display: flex; flex-direction: column; gap: 24px; max-width: 600px; }
.fenetre__intro p { margin: 0; font-size: clamp(17px, 1.3vw, 19px); line-height: 1.5; }
.fenetre__intro .actions { margin-top: 8px; }
.fenetre__haut > .liste-coches { margin-top: 14px; padding-left: clamp(0px, 4vw, 56px); }

/* un bloc titré dans une fenêtre : le titre, le texte, puis ce qu'on veut
   dessous. --deux : le texte et une image côte à côte. --inverse : l'image
   passe à gauche, un bloc sur deux (28/10).
   <section class="fenetre-bloc fenetre-bloc--deux"><div class="fenetre-bloc__texte"><h3>…</h3><p>…</p><ul class="points">…</ul></div><div class="illu">…</div></section> */
.fenetre-bloc { display: flex; flex-direction: column; gap: 40px; }
.fenetre-bloc h3 { margin: 0; font-family: var(--title-font); font-size: var(--taille-fenetre-bloc); font-weight: 800; letter-spacing: -0.02em; line-height: 1.1; }
.fenetre-bloc__texte { display: flex; flex-direction: column; gap: 16px; max-width: 62ch; }
.fenetre-bloc__texte p { margin: 0; font-size: 17px; line-height: 1.55; }
.fenetre-bloc--deux { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 56px; align-items: center; }
@media (min-width: 761px) { .fenetre-bloc--inverse > :last-child { order: -1; } }

/* des étapes numérotées : trois colonnes, le numéro dans un carré cerclé d'orange
   <ol class="etapes"><li><b>Un premier appel pour cadrer vos besoins.</b>…</li>…</ol> */
.etapes { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px; counter-reset: etape; }
.etapes li { display: flex; flex-direction: column; gap: 12px; counter-increment: etape; font-size: 16px; line-height: 1.5; }
.etapes li::before { content: counter(etape); width: 40px; height: 40px; display: grid; place-items: center; border: 1.5px solid var(--orange); border-radius: var(--rayon-image); color: var(--accent-text); font-weight: 700; }
.etapes b { font-size: 17px; }

/* un encart : une offre à part, avec son bouton ; fond teinté, sans filet
   encre, pour ne pas passer pour une illustration
   <div class="encart"><span class="encart__icone"><svg …/></span><div class="encart__texte"><b>…</b><span>…</span></div><a class="cta" …>…</a></div> */
.encart { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 20px; padding: 22px 24px; border-radius: var(--rayon-panneau); background: color-mix(in srgb, var(--orange) 9%, var(--paper)); }
.encart__icone { width: 44px; height: 44px; display: grid; place-items: center; border-radius: 50%; background: var(--orange); color: var(--paper); }
.encart__icone svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.encart__texte { display: flex; flex-direction: column; gap: 4px; font-size: 16px; line-height: 1.5; }
.encart__texte b { font-size: 17px; }

/* la fin d'une fenêtre : un trait, puis une phrase et le bouton au centre, et une petite note
   <hr class="fenetre-trait"><div class="fenetre-pied"><h3>Votre site, toujours à jour.</h3><div class="actions actions--centre">…</div><p class="fenetre-petit">…</p></div> */
.fenetre-trait { margin: 0; border: 0; border-top: 1.5px solid var(--filet-carte); }
.fenetre-pied { display: flex; flex-direction: column; align-items: center; gap: 28px; text-align: center; }
.fenetre-pied h3 { margin: 0; font-family: var(--title-font); font-size: var(--taille-fenetre-bloc); font-weight: 800; letter-spacing: -0.02em; line-height: 1.1; }
.fenetre-petit { margin: 0; max-width: 70ch; font-size: var(--taille-etiquette); line-height: 1.5; color: var(--ink-40); }

/* un panneau de visuel : on croit voir le fond de l'écran au travers */
.fenetre__visuel { min-height: 420px; border-radius: var(--rayon-panneau); overflow: hidden; display: grid; place-items: center; background: var(--lueurs), var(--surface-voile); background-attachment: fixed; }
/* deux panneaux de visuel côte à côte ; --large-etroit : le large, puis l'étroit */
.fenetre__visuels { display: grid; grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); gap: 16px; }
.fenetre__visuels--large-etroit { grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr); }
/* trois cartes de preuve : un visuel sur le fond « transparent » de la fenêtre, puis une phrase */
.preuves { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.preuve { margin: 0; display: flex; flex-direction: column; border: 1px solid var(--filet-onglet); border-radius: var(--rayon-panneau); overflow: hidden; background: var(--paper); }
.preuve__visuel { position: relative; height: 220px; display: grid; place-items: center; padding: 20px; border-bottom: 1px solid var(--filet-doux); background: var(--lueurs), var(--surface-voile); background-attachment: fixed; }
.preuve figcaption { padding: 20px 22px 24px; font-size: 16px; line-height: 1.5; }
/* un avis en grand, au centre */
.temoignage { margin: 0; display: flex; flex-direction: column; align-items: center; gap: 20px; text-align: center; }
.temoignage blockquote { margin: 0; max-width: 34ch; font-family: var(--title-font); font-size: clamp(24px, 2.4vw, 34px); font-weight: 800; letter-spacing: -0.02em; line-height: 1.2; }
.temoignage figcaption { font-size: 15px; }

/* le panneau d'une illustration dans une fenêtre : un papier un peu plus
   sombre et une lueur douce, en haut ou sur un côté, jamais en bas. La
   lumière change d'un panneau à l'autre (.illu--l1 à --l6), toujours dans
   les orangés et le papier (28/10). */
.illu { --illu-lueur: radial-gradient(70% 80% at 100% 0%, rgba(242, 180, 140, 0.42), transparent 70%); position: relative; display: grid; gap: 14px; margin: 0; padding: clamp(16px, 3vw, 36px); border-radius: var(--rayon-fenetre); background: var(--illu-lueur), var(--surface-voile); }
.illu--l1 { --illu-lueur: radial-gradient(70% 80% at 100% 0%, rgba(242, 180, 140, 0.48), transparent 70%); }
.illu--l2 { --illu-lueur: radial-gradient(65% 75% at 0% 0%, rgba(240, 160, 90, 0.34), transparent 70%); background-color: #EEE7DA; }
.illu--l3 { --illu-lueur: radial-gradient(55% 70% at 100% 45%, rgba(238, 150, 60, 0.28), transparent 72%); background-color: #EDE5DC; }
.illu--l4 { --illu-lueur: radial-gradient(60% 75% at 0% 35%, rgba(242, 180, 140, 0.4), transparent 72%); background-color: #EBE5D8; }
.illu--l5 { --illu-lueur: radial-gradient(75% 60% at 50% 0%, rgba(222, 74, 21, 0.2), transparent 72%); background-color: #EFE6DA; }
.illu--l6 { --illu-lueur: radial-gradient(50% 60% at 0% 0%, rgba(242, 180, 140, 0.4), transparent 70%), radial-gradient(45% 55% at 100% 10%, rgba(232, 120, 50, 0.2), transparent 70%); }

.fenetre__poignee { display: none; }
/* le point où va le focus à l'ouverture (autofocus), fixe en haut de
   l'écran. Sur la croix, Safari faisait défiler la page de 366 px pour la
   centrer : la feuille partait du milieu de l'écran, et la croix prenait un
   cercle de focus (vidéo iPhone de Loïc, 27/10/2026).
   <span class="fenetre__depart" tabindex="-1" autofocus></span>, premier enfant du <dialog> */
.fenetre__depart { position: fixed; top: 0; left: 0; width: 1px; height: 1px; overflow: hidden; outline: none; pointer-events: none; }
/* pendant qu'une fenêtre est ouverte, la page ne bouge pas dessous (le
   script pose .fenetre-fige sur <html>). Le body y lâche son overflow-x:
   hidden (base.css) : sinon il devient un conteneur de défilement, la barre
   collante disparaît et la page se remet en page pendant que la feuille
   monte (vidéo iPhone de Loïc, 27/10/2026). */
html.fenetre-fige { overflow: hidden; }
html.fenetre-fige body { overflow-x: visible; }

/* tablette (≤ 1 000 px) : le contenu se resserre, l'en-tête passe sur une colonne */
@media (max-width: 1000px) {
  .fenetre__contenu { padding: 72px 48px 104px; gap: 96px; }
  .fenetre__haut { grid-template-columns: 1fr; gap: 32px; }
  .fenetre__haut > .liste-coches { margin: 0; padding: 0; }
  .preuves { grid-template-columns: 1fr; }
}
/* au téléphone : une feuille qui monte du bas, comme chez Stripe, avec sa
   poignée ; le contenu défile dans .fenetre__defile */
@media (max-width: 760px) {
  .fenetre { overflow: hidden; }
  .fenetre__lueur { display: none; }
  .fenetre__visuel { min-height: 260px; background: var(--surface-voile); }
  .preuve__visuel { background: var(--surface-voile); }
  .fenetre__visuels, .fenetre__visuels--large-etroit { grid-template-columns: 1fr; }
  .fenetre-bloc--deux { grid-template-columns: 1fr; gap: 32px; }
  .illu { padding: 14px; }
  .etapes { grid-template-columns: 1fr; gap: 28px; }
  .encart { grid-template-columns: auto minmax(0, 1fr); align-items: start; padding: 18px; }
  .encart .cta { grid-column: 1 / -1; }
  .fenetre__panneau {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    top: 42px;
    width: auto;
    margin: 0;
    display: flex;
    flex-direction: column;
    border: 0;
    border-top: 1px solid var(--filet-onglet);
    border-radius: 20px 20px 0 0;
    box-shadow: none;
    overflow: hidden;
    opacity: 1;
    transform: translateY(100%);
    transition: transform 0.45s cubic-bezier(0.2, 0.8, 0.2, 1);
  }
  /* la feuille suit le doigt (--tire, posée par le script) ; pendant qu'on tire, pas de transition */
  .fenetre--ouverte .fenetre__panneau { transform: translateY(var(--tire, 0px)); }
  .fenetre--tiree .fenetre__panneau { transition: none; }
  .fenetre--fermee .fenetre__panneau { transform: translateY(100%); opacity: 1; transition: transform 0.38s var(--ease-fermeture); }
  /* on tire la poignée vers le bas pour fermer */
  .fenetre__poignee { display: flex; justify-content: center; position: absolute; top: 0; left: 0; right: 0; z-index: 4; height: 28px; padding-top: 10px; background: linear-gradient(var(--paper) 40%, transparent); touch-action: none; cursor: grab; }
  .fenetre__poignee span { width: 32px; height: 4px; border-radius: 2px; background: rgba(20, 17, 15, 0.22); }
  .fenetre__defile { flex: 1 1 auto; overflow-y: auto; overscroll-behavior: contain; }
  .fenetre__fermer { top: 16px; right: 16px; width: 34px; height: 34px; z-index: 5; }
  .fenetre__contenu { padding: 48px 24px 72px; gap: 72px; }
  .fenetre__titre { padding-right: 40px; font-size: 30px; }
}

/* =========================================================================
   Formulaires — le module de rendez-vous de la refonte (styles.css, .rdv__*)
   Champ blanc, 10 px de rayon, texte à 16 px (Safari sur iPhone ne zoome
   pas), trait orange et halo au focus ; rouge, pareil, en cas d'erreur.
   ========================================================================= */
.champ { display: grid; gap: 6px; }
.champ__label { font-size: 14px; font-weight: 600; }
.entree {
  width: 100%;
  padding: 12px 14px;
  border: 1px solid var(--filet-champ);
  border-radius: var(--rayon-carte);
  background: var(--blanc);
  font: inherit;
  font-size: 16px;
  color: inherit;
  box-shadow: 0 1px 2px rgba(20, 17, 15, 0.04);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.entree::placeholder { color: rgba(20, 17, 15, 0.58); }
.entree:focus { border-color: var(--orange); outline: none; box-shadow: 0 0 0 1px var(--orange), 0 0 0 5px rgba(195, 65, 17, 0.16); }
.entree[aria-invalid="true"] { border-color: var(--erreur); box-shadow: 0 0 0 1px var(--erreur), 0 0 0 5px rgba(179, 38, 30, 0.14); }
textarea.entree { resize: vertical; min-height: 5em; }
.option { display: flex; align-items: flex-start; gap: 10px; padding: 14px; border: 1px solid var(--filet-icone); border-radius: var(--rayon-panneau); background: var(--blanc); font-size: 15px; line-height: 1.35; cursor: pointer; transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease; }
.option:hover { border-color: rgba(195, 65, 17, 0.5); }
.option:has(:checked) { border-color: var(--orange); background: rgba(195, 65, 17, 0.05); box-shadow: 0 0 0 1px var(--orange); }
.option input { accent-color: var(--orange); margin: 2px 0 0; }
.puce { padding: 0.35em 0.8em; border: 1px solid var(--filet-icone); border-radius: var(--rayon-pastille); background: transparent; color: inherit; font: inherit; font-size: 0.9em; cursor: pointer; }
.puce:hover { border-color: var(--orange); color: var(--accent-text); }
.puce[aria-pressed="true"] { background: var(--orange); border-color: var(--orange); color: var(--blanc); }
.erreur { display: flex; align-items: center; gap: 7px; font-size: 14px; font-weight: 600; color: var(--erreur); }
/* la phrase commence par une pastille rouge « ! » (pas la couleur seule) ;
   sous son champ, dans un .formulaire, elle se colle au champ */
.erreur::before { content: "!"; flex: none; width: 17px; height: 17px; display: grid; place-items: center; border-radius: 50%; background: var(--erreur); color: var(--blanc); font-size: 12px; font-weight: 800; line-height: 1; }

/* le code reçu par mail ou par SMS (Loïc, 30/10/2026 : « un input dédié aux
   OTP […] ça valide automatiquement une fois que c'est fait »). Un seul vrai
   champ, invisible, posé sur six cases dessinées : le collage, le code
   proposé par le téléphone (autocomplete="one-time-code") et l'effacement
   marchent comme dans un champ ordinaire. Les cases n'apparaissent qu'avec
   effets/saisie-code.js (.saisie-code--pret) ; sans script, c'est un .entree.
   Le dessin est celui de la démo de l'Input OTP de shadcn/ui, mesurée le
   30/10/2026 (Loïc : « exactement » celle-là) : six cases de 32 px jointes
   en une rangée, chiffres à 14 px, filet gris clair, coins de 10 px aux deux
   bouts, sans fond ni ombre ; la case à remplir prend un filet et un anneau
   de 3 px à moitié transparent, ici en orange, et un curseur fin qui
   clignote. Le sixième chiffre envoie le formulaire ; le champ passe à
   moitié transparent pendant la vérification.
   <span class="saisie-code"><input class="entree saisie-code__entree" name="code" inputmode="numeric" autocomplete="one-time-code" pattern="[0-9 ]{6,7}" maxlength="7" required></span> */
.saisie-code { position: relative; display: block; width: fit-content; max-width: 100%; }
.saisie-code__cases { display: none; }
/* sans le script : un champ de code, pas un champ de texte (chiffres espacés) */
.saisie-code:not(.saisie-code--pret) .saisie-code__entree { width: 12em; letter-spacing: 0.3em; font-variant-numeric: tabular-nums; }
.saisie-code--pret .saisie-code__cases { display: flex; align-items: center; gap: 8px; transition: opacity var(--duree-etat) ease; }
.saisie-code__groupe { display: flex; align-items: center; }
.saisie-code__case {
  position: relative;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--filet-icone);
  border-left-width: 0;
  background: transparent;
  font-family: var(--body-font);
  font-size: 14px;
  font-weight: 400;
  font-variant-numeric: tabular-nums;
  line-height: 1;
  color: var(--ink);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
/* un seul filet entre deux cases : chaque case a le sien en haut, en bas et
   à droite, la première aussi à gauche ; coins arrondis aux deux bouts */
.saisie-code__case:first-child { border-left-width: 1px; border-radius: var(--rayon-carte) 0 0 var(--rayon-carte); }
.saisie-code__case:last-child { border-radius: 0 var(--rayon-carte) var(--rayon-carte) 0; }
/* le vrai champ couvre les cases : on tape, on colle, on touche n'importe
   quelle case, c'est lui qui reçoit ; son texte et son curseur ne se voient
   pas (16 px : Safari sur iPhone ne zoome pas) */
.saisie-code--pret .saisie-code__entree {
  position: absolute;
  inset: 0;
  z-index: 2;
  width: 100%;
  height: 100%;
  padding: 0;
  border: 0;
  background: transparent;
  box-shadow: none;
  font-size: 16px;
  color: transparent;
  -webkit-text-fill-color: transparent;
  caret-color: transparent;
  cursor: text;
  transition: none;
}
/* le jaune du remplissage automatique ne paraît pas. Seulement sur ce
   champ-là : posée sur tout le champ, cette transition gardait son fond
   blanc des jours durant quand le script ajoutait .saisie-code--pret, et le
   blanc couvrait les cases (Zen, 30/10/2026) */
.saisie-code--pret .saisie-code__entree:-webkit-autofill { transition: background-color 600000s 0s; }
.saisie-code--pret .saisie-code__entree::selection { background: transparent; }
.saisie-code--pret .saisie-code__entree:focus { box-shadow: none; }
/* la case à remplir : au-dessus de ses voisines, filet orange et anneau de
   3 px à moitié transparent ; un curseur de 1 × 16 px qui clignote (1 s) */
.saisie-code__case--ici { z-index: 1; border-color: var(--orange); box-shadow: 0 0 0 3px rgba(195, 65, 17, 0.5); }
.saisie-code__case--ici:empty::after { content: ""; width: 1px; height: 16px; background: var(--ink); animation: saisie-code-curseur 1s ease-out infinite; }
@keyframes saisie-code-curseur { 0%, 70%, 100% { opacity: 1; } 20%, 50% { opacity: 0; } }
/* le mauvais code : filets rouges, la phrase .erreur dessous ; dès qu'on
   retape, le script retire aria-invalid */
.saisie-code:has([aria-invalid="true"]) .saisie-code__case { border-color: var(--erreur); }
.saisie-code:has([aria-invalid="true"]) .saisie-code__case--ici { box-shadow: 0 0 0 3px rgba(179, 38, 30, 0.2); }
/* six chiffres : on vérifie, le champ passe à moitié transparent */
.saisie-code--envoi .saisie-code__cases { opacity: 0.5; }
.saisie-code--envoi .saisie-code__entree { cursor: progress; }
@media (prefers-reduced-motion: reduce) {
  .saisie-code__case--ici:empty::after { animation: none; }
}
@media (forced-colors: active) {
  .saisie-code__case { border-color: CanvasText; }
  .saisie-code__case--ici { outline: 2px solid Highlight; }
}

/* le formulaire : une colonne de 560 px au plus, 18 px entre les champs ;
   le bouton qui envoie est un .cta à sa largeur, jamais pleine largeur, même
   au téléphone ; l'erreur de saisie se colle à son champ
   (styles.css, .rdv__formulaire, .rdv__envoyer, .rdv__erreur)
   <form class="formulaire">…<p class="erreur">…</p>…<button class="cta" type="submit">…</button></form> */
.formulaire { display: grid; gap: 18px; max-width: 560px; }
.formulaire > .cta { justify-self: start; }
.formulaire > .erreur { margin-top: -8px; }
/* le choix déjà fait, rappelé en haut d'un formulaire (un créneau) : un
   encart orange pâle, l'icône à gauche : <p class="rappel">Mardi 4 novembre, 10 h 30</p> */
.rappel { position: relative; margin: 0; padding: 14px 16px 14px 48px; border-radius: var(--rayon-panneau); background: rgba(195, 65, 17, 0.08); font-size: 15px; line-height: 1.45; }
.rappel::before { content: ""; position: absolute; left: 16px; top: 15px; width: 20px; height: 20px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23C34111' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4.5' width='18' height='16.5' rx='2'/%3E%3Cpath d='M16 2.5v4M8 2.5v4M3 10h18'/%3E%3C/svg%3E") center / contain no-repeat; }
/* le message sous un formulaire : chargement, envoi ; une erreur du serveur
   dans un encart rouge pâle (une erreur de saisie, elle, va sous son champ)
   <p class="statut statut--erreur">…</p> */
.statut { margin: 18px 0 0; font-size: 14px; color: rgba(20, 17, 15, 0.62); }
.statut--erreur { padding: 12px 14px; border-radius: var(--rayon-carte); background: rgba(179, 38, 30, 0.07); color: var(--erreur); font-weight: 600; }
/* la confirmation : une coche orange, un titre, la suite
   <div class="succes"><h3 class="succes__titre">…</h3><p>…</p></div> */
.succes { display: grid; gap: 10px; max-width: 560px; font-size: 15px; }
.succes::before { content: ""; width: 48px; height: 48px; margin-bottom: 6px; border-radius: 50%; background: var(--orange) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 12.5l4 4 8-9' fill='none' stroke='%23fff' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 26px no-repeat; box-shadow: 0 8px 18px -8px rgba(195, 65, 17, 0.8); }
.succes__titre { margin: 0; font-family: var(--title-font); font-size: 26px; font-weight: 800; letter-spacing: -0.02em; }
/* rien à montrer (aucun créneau, liste vide) : styles.css, .rdv__vide */
.etat-vide { margin: 0; padding: 24px; border-radius: var(--rayon-panneau); background: rgba(20, 17, 15, 0.04); color: rgba(20, 17, 15, 0.7); }
/* le pot de miel d'un formulaire : un champ que seuls les robots remplissent.
   Hors de l'écran, jamais display: none (certains robots le respectent) ni
   visibility: hidden (certains navigateurs ne le remplissent pas) ;
   tabindex="-1" le retire du parcours au clavier.
   <input class="pot-de-miel" name="site" tabindex="-1"> */
.pot-de-miel { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; margin: 0; }

/* =========================================================================
   Carte de réservation — styles.css (.rdv-bloc, .rdv-carte), RendezVous.astro
   L'action principale d'une page : une carte BLANCHE, filet gris, 12 px de
   rayon, une ombre légère (la seule carte qui en porte une, Loïc 26/10).
   À gauche ce qu'on réserve (avec qui, combien de temps, comment, ce qui
   suit) ; à droite le module de rendez-vous. Centrée, 980 px au plus, sous
   un .titre-section--centre. C'est la place qui décide, pas l'écran : sous
   900 px de carte, les infos passent en tête, en une ligne et trois pastilles.
   <div class="reservation"><div class="reservation__carte">
     <div class="reservation__infos">
       <img class="reservation__photo" src="loic-avatar.webp" width="128" height="128" alt="">
       <p class="reservation__qui">Loïc Torres · Synaps</p>
       <p class="reservation__titre">Premier appel, sans engagement</p>
       <ul class="reservation__meta"><li><svg viewBox="0 0 24 24" aria-hidden="true">…</svg>30 minutes</li>…</ul>
     </div>
     <div class="reservation__module"><div class="rdv" data-rdv="https://rdv.synaps.re">
       <a class="rdv__repli cta" href="https://rdv.synaps.re/"><span class="cta__label">Prendre rendez-vous</span><span class="cta__arrow" aria-hidden="true"></span></a>
     </div></div>
   </div></div>
   ========================================================================= */
.reservation { container: reservation / inline-size; max-width: 980px; margin: 0 auto; color: var(--ink); }
.reservation__carte {
  display: grid;
  grid-template-columns: minmax(0, 260px) minmax(0, 1fr);
  background: var(--blanc);
  border: 1px solid var(--filet-onglet);
  border-radius: var(--rayon-panneau);
  box-shadow: var(--ombre-carte-action);
  overflow: clip;   /* pas un bloc qui défile : le focus n'y décale rien */
}
.reservation__infos { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; padding: 30px 28px; border-right: 1px solid var(--filet-doux); background: var(--surface-reservation); }
.reservation__photo { width: 56px; height: 56px; margin-bottom: 4px; border-radius: 50%; object-fit: cover; box-shadow: 0 0 0 3px var(--blanc), 0 0 0 4px var(--filet-onglet); }
.reservation__qui { margin: 0; font-size: 14px; font-weight: 600; color: rgba(20, 17, 15, 0.66); }
.reservation__titre { margin: 0 0 8px; font-family: var(--title-font); font-size: 24px; font-weight: 800; letter-spacing: -0.02em; line-height: 1.12; color: var(--ink); }
.reservation__meta { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; font-size: 15px; font-weight: 600; line-height: 1.35; color: rgba(20, 17, 15, 0.78); }
.reservation__meta li { display: flex; align-items: flex-start; gap: 10px; }
.reservation__meta svg { flex: none; width: 18px; height: 18px; margin-top: 1px; fill: none; stroke: var(--accent-text); stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; }
.reservation__module { min-width: 0; padding: 30px 28px 26px; }
@container reservation (max-width: 900px) {
  .reservation__carte { grid-template-columns: minmax(0, 1fr); }
  .reservation__infos { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 14px; row-gap: 4px; align-items: center; padding: 22px 28px; border-right: 0; border-bottom: 1px solid var(--filet-doux); }
  .reservation__photo { grid-row: 1 / span 2; width: 48px; height: 48px; margin: 0; }
  .reservation__qui { font-size: 13px; }
  .reservation__titre { margin: 0; font-size: 21px; }
  .reservation__meta { grid-column: 1 / -1; flex-direction: row; flex-wrap: wrap; gap: 8px; margin-top: 12px; font-size: 13px; }
  .reservation__meta li { align-items: center; gap: 6px; padding: 6px 10px; border: 1px solid var(--filet-onglet); border-radius: var(--rayon-pastille); background: var(--blanc); }
  .reservation__meta svg { width: 15px; height: 15px; margin: 0; }
}
@container reservation (max-width: 600px) {
  .reservation__infos { padding: 20px; }
  .reservation__titre { font-size: 19px; }
  .reservation__module { padding: 22px 18px 20px; }
}
/* sans requêtes de conteneur (Safari avant 16) : la carte s'empile */
@supports not (container-type: inline-size) {
  @media (max-width: 760px) {
    .reservation__carte { grid-template-columns: minmax(0, 1fr); }
    .reservation__infos { border-right: 0; border-bottom: 1px solid var(--filet-doux); }
  }
}

/* le module : la brique de rdv.synaps.re, qui ne se modifie pas ; on règle
   ses variables et ses classes. Les jours libres teintés d'orange, les
   autres effacés ; un seul plein orange à la fois : le jour choisi, puis le
   bouton qui confirme. Textes à 4,5:1 au moins, bords de champ à 3:1. */
.reservation .rdv {
  container-name: rdv;
  --rdv-accent: var(--orange);
  --rdv-accent-texte: var(--blanc);
  --rdv-texte: var(--ink);
  --rdv-texte-doux: rgba(20, 17, 15, 0.62);   /* 5,2:1 */
  --rdv-trait: var(--rule);
  --rdv-fond-case: rgba(195, 65, 17, 0.09);
  --rdv-jour-libre: var(--orange-sur-teinte);
  --rdv-bord-champ: var(--filet-champ);
  --rdv-rayon: var(--rayon-carte);
  --rdv-erreur: var(--erreur);
  --rdv-largeur-calendrier: 330px;
  font-size: 15px;
}
.reservation .rdv__colonnes { gap: 36px; }
/* les deux temps, nommés au-dessus de chaque colonne */
.reservation :is(.rdv__calendrier, .rdv__creneaux)::before { content: "Choisissez un jour"; display: block; margin-bottom: 14px; font-size: 12px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--rdv-texte-doux); }
.reservation .rdv__creneaux::before { content: "Puis une heure"; }
.reservation .rdv__nav { margin-bottom: 10px; }
.reservation .rdv__mois { font-size: 17px; font-weight: 700; }
.reservation .rdv__fleche { width: 36px; height: 36px; display: grid; place-items: center; border: 0; border-radius: 50%; background: transparent; color: var(--ink); font-size: 22px; transition: background-color 0.15s ease; }
.reservation .rdv__fleche:not(:disabled):hover { background: rgba(20, 17, 15, 0.06); }
.reservation .rdv__fleche:disabled { opacity: 0.22; }
.reservation .rdv__grille { gap: 6px; }
.reservation .rdv__entete { font-size: 12px; font-weight: 600; letter-spacing: 0.06em; color: var(--rdv-texte-doux); }
.reservation .rdv__case { border: 0; border-radius: var(--rayon-carte); font-size: 15px; color: rgba(20, 17, 15, 0.36); }
.reservation .rdv__case--dispo { background: var(--rdv-fond-case); color: var(--rdv-jour-libre); font-weight: 700; transition: background-color 0.15s ease, box-shadow 0.15s ease; }
.reservation .rdv__case--dispo:hover { background: rgba(195, 65, 17, 0.13); box-shadow: inset 0 0 0 1.5px var(--orange); }
.reservation .rdv__case--choisi,
.reservation .rdv__case--choisi:hover { background: var(--orange); color: var(--blanc); box-shadow: 0 6px 14px -6px rgba(195, 65, 17, 0.75); }
/* les heures du jour choisi ; le jour sans la majuscule au mois que la brique lui donne */
.reservation .rdv__jour { margin: 0 0 10px; padding: 6px 0; font-size: 17px; font-weight: 700; line-height: 24px; text-transform: none; }
.reservation .rdv__jour::first-letter { text-transform: uppercase; }
.reservation .rdv__heures { grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 8px; }
.reservation .rdv__heure { min-height: 46px; padding: 0.55em 0.4em; border: 1px solid var(--filet-icone); border-radius: var(--rayon-carte); background: var(--blanc); color: var(--ink); font-size: 15px; font-weight: 600; box-shadow: 0 1px 2px rgba(20, 17, 15, 0.04); transition: border-color 0.15s ease, color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease; }
.reservation .rdv__heure:hover { border-color: var(--orange); color: var(--rdv-jour-libre); background: rgba(195, 65, 17, 0.05); box-shadow: 0 4px 12px -6px rgba(195, 65, 17, 0.5); transform: translateY(-1px); }
/* le fuseau, en petit */
.reservation .rdv__pied { margin-top: 22px; padding-top: 16px; border-top: 1px solid var(--filet-doux); font-size: 13px; }
.reservation .rdv__fuseau { padding: 4px 8px; border: 1px solid var(--rdv-bord-champ); border-radius: var(--rayon-image); background: var(--blanc); color: var(--ink); }
.reservation .rdv__vide { margin: 0; padding: 24px; border-radius: var(--rayon-panneau); background: rgba(20, 17, 15, 0.04); color: rgba(20, 17, 15, 0.7); }
/* pendant le chargement, la place du calendrier est gardée : la page ne saute pas quand il arrive */
.reservation .rdv:has(> .rdv__corps:empty) { display: grid; min-height: 458px; }
.reservation .rdv:has(> .rdv__corps:empty) > * { grid-area: 1 / 1; }
.reservation .rdv:has(> .rdv__corps:empty) > .rdv__statut { margin: 0; align-self: center; justify-self: center; }
@container reservation (max-width: 600px) { .reservation .rdv:has(> .rdv__corps:empty) { min-height: 730px; } }
/* la place décide : entre 520 et 640 px, le mois tient à côté des heures ;
   plus étroit, les heures vont par trois dessous */
@container rdv (min-width: 520px) and (max-width: 640px) { .reservation .rdv__colonnes { grid-template-columns: minmax(0, 300px) minmax(0, 1fr); gap: 28px; } }
@container rdv (max-width: 519px) {
  .reservation .rdv__calendrier { max-width: 400px; }
  .reservation .rdv__heures { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .reservation .rdv__formats { grid-template-columns: minmax(0, 1fr); }
}

/* le formulaire de la brique : le créneau rappelé, deux choix côte à côte,
   des champs blancs (comme .entree), un seul bouton plein. « Confirmer » et
   le lien de repli deviennent des .cta et l'erreur de saisie s'écrit sous
   son champ grâce à src/ac/scripts/rdv-aide.js du site, à reprendre tel quel.
   Ce script ne ramène le formulaire dans l'écran que dans un .rdv-bloc, et
   mesure la barre du haut par .topbar : posez aussi class="rdv-bloc" sur
   .reservation et class="topbar" sur .barre (ces deux classes n'ont pas de
   style ici). Sinon, après le choix d'une heure, le formulaire reste
   au-dessus de l'écran ou passe sous la barre. */
.reservation .rdv__formulaire { max-width: 560px; gap: 18px; }
.reservation .rdv__retour { min-height: 32px; font-size: 14px; color: var(--rdv-texte-doux); }
.reservation .rdv__retour:hover { color: var(--rdv-jour-libre); }
.reservation .rdv__resume { position: relative; padding: 14px 16px 14px 48px; border-radius: var(--rayon-panneau); background: rgba(195, 65, 17, 0.08); font-size: 15px; line-height: 1.45; }
.reservation .rdv__resume::before { content: ""; position: absolute; left: 16px; top: 15px; width: 20px; height: 20px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23C34111' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4.5' width='18' height='16.5' rx='2'/%3E%3Cpath d='M16 2.5v4M8 2.5v4M3 10h18'/%3E%3C/svg%3E") center / contain no-repeat; }
.reservation .rdv__formats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.reservation .rdv__formats legend { margin-bottom: 10px; padding: 0; }
.reservation .rdv__option { align-items: flex-start; padding: 14px; border: 1px solid var(--filet-icone); border-radius: var(--rayon-panneau); background: var(--blanc); font-size: 15px; line-height: 1.35; transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease; }
.reservation .rdv__option:hover { border-color: rgba(195, 65, 17, 0.5); }
.reservation .rdv__option:has(:checked) { border-color: var(--orange); background: rgba(195, 65, 17, 0.05); box-shadow: 0 0 0 1px var(--orange); }
.reservation .rdv__radio { margin-top: 2px; }
.reservation .rdv__label { font-size: 14px; font-weight: 600; }
.reservation .rdv__entree { padding: 12px 14px; border: 1px solid var(--rdv-bord-champ); border-radius: var(--rayon-carte); background: var(--blanc); font-size: 16px; box-shadow: 0 1px 2px rgba(20, 17, 15, 0.04); transition: border-color 0.15s ease, box-shadow 0.15s ease; }
.reservation .rdv__entree::placeholder { color: rgba(20, 17, 15, 0.58); }
.reservation .rdv__entree:focus { border-color: var(--orange); box-shadow: 0 0 0 1px var(--orange), 0 0 0 5px rgba(195, 65, 17, 0.16); }
.reservation .rdv__entree[aria-invalid="true"] { border-color: var(--erreur); box-shadow: 0 0 0 1px var(--erreur), 0 0 0 5px rgba(179, 38, 30, 0.14); }
.reservation .rdv__erreur { display: flex; align-items: center; gap: 7px; margin: -8px 0 0; font-size: 14px; font-weight: 600; color: var(--erreur); }
.reservation .rdv__erreur::before { content: "!"; flex: none; width: 17px; height: 17px; display: grid; place-items: center; border-radius: 50%; background: var(--erreur); color: var(--blanc); font-size: 12px; font-weight: 800; line-height: 1; }
.reservation .rdv__envoyer { justify-self: start; }   /* pas pleine largeur, même au téléphone */
/* le message sous le module : chargement, envoi, ou erreur du serveur dans
   un encart rouge pâle ; une erreur de saisie va sous son champ, et ce
   message ne sert plus qu'aux lecteurs d'écran */
.reservation .rdv__statut { margin-top: 18px; font-size: 14px; }
.reservation .rdv__statut--erreur { padding: 12px 14px; border-radius: var(--rayon-carte); background: rgba(179, 38, 30, 0.07); font-weight: 600; }
.reservation .rdv--erreur-champ > .rdv__statut { position: absolute; width: 1px; height: 1px; margin: 0; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
/* la confirmation : une coche, le créneau, la suite */
.reservation .rdv__succes { gap: 10px; max-width: 560px; font-size: 15px; }
.reservation .rdv__succes::before { content: ""; width: 48px; height: 48px; margin-bottom: 6px; border-radius: 50%; background: var(--orange) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 12.5l4 4 8-9' fill='none' stroke='%23fff' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 26px no-repeat; box-shadow: 0 8px 18px -8px rgba(195, 65, 17, 0.8); }
.reservation .rdv__titre-succes { font-family: var(--title-font); font-size: 26px; font-weight: 800; letter-spacing: -0.02em; }
/* en couleurs forcées, le jour choisi prend la sélection du système, les jours libres un bord */
@media (forced-colors: active) {
  .reservation .rdv__case--dispo { border: 1px solid ButtonText; }
  .reservation .rdv__case--choisi { forced-color-adjust: none; border: 2px solid Highlight; background: Highlight; color: HighlightText; }
  .reservation .rdv__entree[aria-invalid="true"] { border-width: 2px; }
}
@media (prefers-reduced-motion: reduce) { .reservation .rdv__heure { transition: none; transform: none !important; } }

/* =========================================================================
   Tableau — accueil-sections.css (.cm-tableau)
   ========================================================================= */
.tableau { width: 100%; border-collapse: collapse; font-size: 15px; line-height: 1.45; color: rgba(20, 17, 15, 0.78); }
.tableau th, .tableau td { padding: 14px 16px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--filet-onglet); }
.tableau thead th { font-size: 14px; font-weight: 700; color: var(--ink); border-bottom-color: rgba(20, 17, 15, 0.4); }
.tableau tbody th { font-weight: 700; color: var(--ink); }
/* la colonne mise en avant (celle de Synaps) */
.tableau .tableau__nous { color: var(--ink); font-weight: 700; background: rgba(233, 120, 79, 0.12); }
/* dans une fenêtre, au téléphone, le tableau devient une liste : le critère,
   puis une ligne par colonne (data-col sur chaque case), la nôtre en dernier, surlignée
   <table class="tableau tableau--liste">… <td data-col="Une agence">…</td><td class="tableau__nous" data-col="Synaps">…</td> */
@media (max-width: 760px) {
  .tableau--liste, .tableau--liste tbody, .tableau--liste tr, .tableau--liste th, .tableau--liste td { display: block; width: auto; }
  .tableau--liste thead { display: none; }
  .tableau--liste tr { padding: 18px 0; border-bottom: 1.5px solid var(--filet-onglet); }
  .tableau--liste th, .tableau--liste td { padding: 6px 12px; border: 0; }
  .tableau--liste tbody th { padding: 0 0 8px; font-size: 16px; }
  .tableau--liste td::before { content: attr(data-col) " · "; font-weight: 700; }
  .tableau--liste .tableau__nous { margin-top: 6px; border-radius: var(--rayon-image); }
}

/* =========================================================================
   Chiffres clés — styles.css (.etude__faits, l'étude de cas dans la fenêtre)
   Quatre faits entre deux filets encre de 1 px, séparés par un filet fin ;
   deux par deux au téléphone. Filets fins, aucune ombre.
   <dl class="faits"><div><dt>Mise en ligne</dt><dd>24 h</dd></div>…</dl>
   ========================================================================= */
.faits { display: grid; grid-template-columns: repeat(4, 1fr); margin: 36px 0 0; border-top: 1px solid var(--ink); border-bottom: 1px solid var(--ink); }
.faits > div { padding: 16px 12px 16px 0; }
.faits > div + div { padding-left: 16px; border-left: 1px solid var(--rule); }
.faits dt { font-size: 13px; color: var(--ink-55); }
.faits dd { margin: 4px 0 0; font-family: var(--title-font); font-weight: 600; font-size: 26px; line-height: 1.1; white-space: nowrap; }
@media (max-width: 640px) {
  .faits { grid-template-columns: 1fr 1fr; }
  .faits > div:nth-child(3) { padding-left: 0; border-left: 0; border-top: 1px solid var(--rule); }
  .faits > div:nth-child(4) { border-top: 1px solid var(--rule); }
}

/* =========================================================================
   Haut de page — accueil-stripe.css (.ac-hero)
   La zone des rubans (effets/rubans.js) : elle remonte sous la barre
   transparente, et sa hauteur donne la forme de l'éventail.
   ========================================================================= */
.heros {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  align-items: center;
  gap: var(--gap-lg);
  /* dans le cadre de 1 560 px, comme sur synaps.re (il est dans .shell) */
  width: 100%;
  max-width: var(--largeur-cadre);
  margin: calc(-1 * var(--topbar-h)) auto 0;
  min-height: min(100svh, 940px);
  padding: calc(var(--topbar-h) + clamp(32px, 4vw, 72px)) var(--pad-x) clamp(32px, 4vw, 72px);
  box-sizing: border-box;
  overflow-x: visible;
  overflow-y: clip;
}
/* un filet sous le haut de page, sur toute la largeur de l'écran (Loïc, 26/10) */
.heros::after { content: ""; position: absolute; left: 50%; bottom: 0; width: 100vw; height: 1px; transform: translateX(-50%); background: var(--rule); pointer-events: none; }
.heros__texte { position: relative; display: flex; flex-direction: column; gap: clamp(22px, 2.4vw, 36px); max-width: 720px; }
.heros .actions { margin: 0; }
@media (max-width: 760px) {
  .heros { grid-template-columns: 1fr; min-height: 0; padding-top: calc(var(--topbar-h) + 28px); gap: 8px; }
  /* les boutons l'un sous l'autre, à leur largeur, et le texte resserré à
     gauche : les rubans descendent le long du bord droit (Loïc, 26/10) */
  .heros .actions { flex-direction: column; align-items: flex-start; align-self: flex-start; }
  .heros .chapeau { max-width: min(30ch, 72vw); }
  .heros .note { max-width: 62vw; }
}

/* =========================================================================
   Barre du haut — styles.css, accueil-stripe.css
   Collante ; transparente tant qu'on est en haut d'une page à rubans (le
   script ajoute .barre--pleine dès qu'on descend).
   ========================================================================= */
.barre {
  position: sticky;
  top: 0;
  z-index: var(--plan-barre);
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  /* sur synaps.re la barre est dans le cadre de 1 560 px (.shell) : sur un
     grand écran, la marque et le lien de droite restent alignés sur la
     colonne de contenu ; le fond, lui, couvre toute la largeur */
  --barre-marge: clamp(20px, 3vw, 48px);
  padding: clamp(14px, 1.4vw, 22px) max(var(--barre-marge), calc(50% - var(--largeur-cadre) / 2 + var(--barre-marge)));
  background: var(--paper);
  border-bottom: 1px solid var(--rule);
  transition: background-color 0.25s ease, border-color 0.25s ease;
}
.barre--transparente:not(.barre--pleine) { background: transparent; border-bottom-color: transparent; }
.barre__nav { display: flex; align-items: baseline; gap: clamp(10px, 1.4vw, 22px); min-width: 0; }
.barre__lien { font-size: 11px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink); text-decoration: none; white-space: nowrap; }
.barre__lien:hover, .barre__lien[aria-current="page"] { color: var(--accent-text); }
.barre__etiquette { font-size: 10.5px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-55); }
@media (max-width: 640px) { .barre__etiquette { display: none; } }
/* le bouton de la barre (« 49 € → ») : un lien en capitales, orange, plus
   gras que la navigation ; à l'encre tant que la barre est transparente */
.barre__cta { font-size: 11px; font-weight: 800; letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent-text); text-decoration: none; }
.barre--transparente:not(.barre--pleine) .barre__cta { color: var(--ink); }
/* la marque ramène à l'accueil, orange au survol ; sur l'accueil (on y est),
   c'est un <span>, pas un lien */
a.marque:hover { color: var(--accent-text); }

/* =========================================================================
   Logos des clients — accueil-stripe.css
   Une rangée de cellules égales, en gris, fondus dans le papier.
   ========================================================================= */
.logos { list-style: none; margin: 0; padding: 0; width: 100%; display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); justify-items: center; align-items: center; row-gap: 20px; }
.logos img { display: block; height: 34px; width: auto; filter: grayscale(1) contrast(1.1); opacity: 0.75; mix-blend-mode: multiply; }
@media (max-width: 760px) { .logos { grid-template-columns: repeat(3, minmax(0, 1fr)); } .logos img { height: 26px; } }

/* =========================================================================
   Pied de page — styles.css
   ========================================================================= */
/* le pied reste dans le cadre de 1 560 px, comme sur synaps.re (il est dans .shell) */
.pied { box-sizing: border-box; width: 100%; max-width: var(--largeur-cadre); margin-left: auto; margin-right: auto; padding: 0 var(--pad-x) clamp(96px, 10vw, 176px); }
/* au-dessus de la ligne légale, les conditions en clair (accueil, abonnement)
   <p class="pied__label">Conditions, en clair</p>
   <div class="pied__conditions"><p class="pied__condition">…</p>…</div> */
.pied__label { margin: 0 0 18px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-50); }
.pied__conditions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(14px, 2vw, 40px); margin-bottom: var(--gap-lg); }
.pied__condition { margin: 0; padding-top: 12px; border-top: 1px solid var(--rule); font-size: 13.5px; line-height: 1.55; font-weight: 500; color: var(--ink-78); }
@media (max-width: 900px) { .pied__conditions { grid-template-columns: minmax(0, 1fr); } }   /* 839 px sur le site, ramené au point de rupture des grilles */
.pied__base { padding-top: 20px; border-top: 1px solid var(--rule); display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 10px; }
.pied .marque { font-size: clamp(13px, 1.1vw, 16px); }
/* les liens de la ligne légale gardent le lien de base : orange, soulignés,
   encre au survol ; seul le bouton Cookies prend la couleur de la ligne */
.pied__legal { font-size: 12px; line-height: 1.5; font-weight: 500; color: var(--ink-60); }
/* rouvrir la bannière de cookies est une action, donc un <button>, qui se
   lit comme le reste de la ligne : <button class="pied__cookies" data-consent-open>Cookies</button> */
.pied__cookies { font: inherit; color: inherit; background: none; border: 0; padding: 0; text-decoration: underline; cursor: pointer; }

/* =========================================================================
   Apparition à l'écran — une animation démarre quand l'élément entre dans
   l'écran, jamais avant. Un navigateur qui ne connaît pas
   animation-timeline (Firefox, donc Zen) la joue une fois au chargement :
   pour une animation qui compte, déclenchez-la avec un IntersectionObserver
   (une classe posée à l'entrée dans l'écran), un seul code pour tous.
   ========================================================================= */
.monte { animation: monte var(--duree-entree) var(--ease-sortie) both; animation-timeline: view(); animation-range: entry 0% entry 60%; }
@keyframes monte { from { opacity: 0; transform: translateY(12px); } }

@media (prefers-reduced-motion: reduce) {
  .question, .monte, .panneau--entre, .bento__plus { animation: none !important; }
  .carte__icone g, .cta__arrow::before, .cta__arrow::after { transition: none; }
}
