/* ==========================================================================
   K.R HOMÉNERGIE — Feuille de styles unique
   Site statique HTML/CSS/JS vanilla — mobile-first
   --------------------------------------------------------------------------
   DIRECTION ARTISTIQUE — « grille suisse éditoriale, tenue chaude »

   Quatre règles structurent tout le fichier. Les enfreindre ramène le site
   vers l'esthétique de gabarit dont il cherche à sortir :

     1. AUCUN ARRONDI. Il n'existe pas de --radius. Angles vifs partout.
     2. AUCUNE OMBRE PORTÉE. La profondeur se fait avec des filets de 1px
        et des aplats, jamais avec du flou.
     3. RIEN N'EST CENTRÉ par défaut. Mise en page asymétrique, sur une
        grille que l'on laisse voir.
     4. LES FONDS SONT CHAUDS. Papier crème, sable, filets beige — jamais
        de blanc pur ni de gris bleuté. C'est ce qui empêche la rigueur de
        la grille de virer au froid.

   Survols par INVERSION (l'aplat et le texte échangent leurs couleurs),
   jamais par élévation.

   PAS DE PHOTOGRAPHIE POUR L'INSTANT. Là où viendront les images, le site
   pose des PANNEAUX GRAPHIQUES (section 05) : aplat de couleur + trame
   dessinée en CSS. Ils se suffisent à eux-mêmes et se remplacent un par un
   par de vraies photos — voir le mode d'emploi en tête de la section 05.
   --------------------------------------------------------------------------
   SOMMAIRE
   01. Variables et UNIVERS DE PAGE
   02. Reset & bases
   03. Typographie
   04. Grille, bandes et filets
   05. Panneaux graphiques (à la place des photos)
   06. Boutons et liens
   07. En-tête, navigation, progression de lecture
   08. Barre d'action mobile
   09. Hero
   10. Index des prestations
   11. Arguments
   12. Bandeau marques
   13. Subventions
   14. Processus
   15. Réalisations (préparé, non affiché en v1)
   16. Formulaire
   17. Pages intérieures et dispositions particulières
   18. Pied de page
   19. Mouvement : révélations et transitions
   20. Accessibilité & mouvement réduit
   ========================================================================== */


/* ==========================================================================
   01. VARIABLES ET UNIVERS DE PAGE
   --------------------------------------------------------------------------
   Deux couches de couleur.

   • LA MARQUE, identique sur tout le site : le bleu nuit --ink, le vert
     --accent / --accent-ink, les papiers chauds. C'est ce qui fait tenir
     l'ensemble comme un seul site.

   • L'UNIVERS DE PAGE, porté par quatre variables --amb-* redéfinies selon
     l'attribut data-univers du <body>. Elles ne colorent que l'ambiance :
     aplats sombres, bandes claires, trames et filets d'accent. Les boutons
     d'action restent verts partout — le repère d'action ne change jamais.

   Pour créer un univers : ajouter un bloc body[data-univers="…"] ci-dessous
   et vérifier les quatre contrastes (blanc sur --amb-deep, --amb-light sur
   --amb-deep, --amb sur --amb-wash, --ink sur --amb-wash).
   ========================================================================== */

:root {

  /* ---------- OPTION 1 — Bleu profond + vert énergie (ACTIVE) ------------ */
  --ink:            #0F2B46;   /* bleu nuit : titres, aplats, filets forts */
  --ink-deep:       #081726;
  --ink-soft:       #4E5A66;   /* texte secondaire (6,8:1 sur papier)      */
  --paper:          #FCFAF6;   /* papier crème — jamais de blanc pur       */
  --paper-alt:      #F4EFE6;   /* sable                                    */
  --paper-tint:     #EBE3D6;   /* sable soutenu                            */
  --rule:           #DCD3C4;   /* filets beige (et non gris)               */
  --accent:         #3DA35D;   /* vert du brief : trames, signaux          */
  --accent-ink:     #2A733F;   /* vert de texte et de bouton (AA 5,1:1)    */
  --accent-deep:    #1F5A31;   /* survol                                   */
  --accent-light:   #9BDCB2;
  --sand-light:     #E4D9C4;
  --on-ink:         #FFFFFF;
  --on-ink-soft:    rgba(255, 255, 255, 0.76);
  --rule-on-ink:    rgba(255, 255, 255, 0.22);

  /* Compatibilité : anciens noms, au cas où un fragment y ferait référence */
  --color-primary:       var(--ink);
  --color-accent:        var(--accent);
  --color-accent-strong: var(--accent-ink);
  --color-bg:            var(--paper);
  --color-text:          var(--ink);

  /* ---------- OPTION 2 — Bleu pétrole + orange soleil --------------------
     Décommenter ce bloc ET commenter les valeurs de l'OPTION 1.

  --ink:            #175873;
  --ink-deep:       #0C3A4D;
  --ink-soft:       #4C5C66;
  --paper:          #FCFAF8;
  --paper-alt:      #F4EFE8;
  --paper-tint:     #EBE2D6;
  --rule:           #DCD3C6;
  --accent:         #F28C28;
  --accent-ink:     #A85708;
  --accent-deep:    #8A4705;
  --accent-light:   #FFC489;
  --sand-light:     #F0DCC0;
  */

  /* ---------- OPTION 3 — Anthracite + vert vif ---------------------------
     Décommenter ce bloc ET commenter les valeurs de l'OPTION 1.

  --ink:            #2B2B2B;
  --ink-deep:       #141414;
  --ink-soft:       #56544E;
  --paper:          #FBFAF7;
  --paper-alt:      #F2F0E9;
  --paper-tint:     #E7E4DA;
  --rule:           #D8D4C8;
  --accent:         #8BC34A;
  --accent-ink:     #4A741C;
  --accent-deep:    #395A14;
  --accent-light:   #C5E39A;
  --sand-light:     #E6E0CE;
  */

  /* ---------- Typographie ------------------------------------------------
     Archivo : grotesque à largeur variable. L'axe wdth resserre les grands
     titres sans recourir à une seconde fonte.                            */
  --font: "Archivo", "Helvetica Neue", Helvetica, Arial, sans-serif;

  --fs-display: clamp(2.5rem, 6.2vw, 5rem);
  --fs-mega:    clamp(3rem, 11vw, 9rem);   /* titres pleine largeur */
  --fs-h2:      clamp(1.875rem, 3.8vw, 3.125rem);
  --fs-h3:      clamp(1.25rem, 1.6vw, 1.5rem);
  --fs-h4:      clamp(1.0625rem, 1vw, 1.1875rem);
  --fs-lead:    clamp(1.125rem, 1.25vw, 1.375rem);
  --fs-body:    1.0625rem;
  --fs-sm:      1rem;
  --fs-xs:      0.875rem;
  --fs-label:   0.75rem;

  /* ---------- Espacements ------------------------------------------------ */
  --sp-1: 0.25rem;  --sp-2: 0.5rem;   --sp-3: 0.75rem;
  --sp-4: 1rem;     --sp-5: 1.5rem;   --sp-6: 2rem;
  --sp-7: 2.75rem;  --sp-8: 4rem;     --sp-9: 6rem;

  --band-y: clamp(3.5rem, 7vw, 7rem);

  /* ---------- Structure --------------------------------------------------- */
  --wrap: 1440px;
  --gutter: clamp(1.25rem, 4.5vw, 4rem);
  --measure: 62ch;
  --header-h: 72px;

  --t: 200ms cubic-bezier(0.2, 0, 0.1, 1);
  --t-slow: 620ms cubic-bezier(0.16, 1, 0.3, 1);
}

/* ---- UNIVERS PAR DÉFAUT (accueil, contact, mentions légales) ------------ */
body {
  --amb-deep:  #0F2B46;   /* aplat sombre de la page   */
  --amb:       #2A733F;   /* accent d'ambiance          */
  --amb-light: #9BDCB2;   /* accent clair sur l'aplat   */
  --amb-wash:  #F4EFE6;   /* bande claire alternée      */
}

/* ---- Pompes à chaleur : terre cuite, registre de la chaleur ------------- */
body[data-univers="pac"] {
  --amb-deep:  #45231A;
  --amb:       #9E4620;
  --amb-light: #F0B99A;
  --amb-wash:  #F8EDE5;
}

/* ---- Photovoltaïque : or et olive profond, registre solaire ------------- */
body[data-univers="pv"] {
  --amb-deep:  #33290E;
  --amb:       #7E6110;
  --amb-light: #EDC96A;
  --amb-wash:  #F8F1DC;
}

/* ---- Sanitaire : sarcelle, registre de l'eau --------------------------- */
body[data-univers="sanitaire"] {
  --amb-deep:  #123F47;
  --amb:       #14606E;
  --amb-light: #9AD4DC;
  --amb-wash:  #EAF2F3;
}

/* ---- Subventions : vert forêt, registre du vivant ---------------------- */
body[data-univers="subventions"] {
  --amb-deep:  #1C4634;
  --amb:       #2A733F;
  --amb-light: #9BDCB2;
  --amb-wash:  #EDF2EA;
}

/* ---- À propos : terre et sable, registre humain ------------------------ */
body[data-univers="apropos"] {
  --amb-deep:  #3A3226;
  --amb:       #75592C;
  --amb-light: #E0CFA8;
  --amb-wash:  #F5F0E4;
}


/* ==========================================================================
   02. RESET & BASES
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 1rem);
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  font-family: var(--font);
  font-size: var(--fs-body);
  line-height: 1.65;
  color: var(--ink);
  background-color: var(--paper);
  font-variant-numeric: tabular-nums;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* 60 px pour la barre d'appel, plus la zone réservée par le système sur
   les iPhone à encoche (0 ailleurs). Sans viewport-fit=cover dans la
   balise viewport, env() renvoie 0 et la réserve ne s'applique pas. */
@media (max-width: 767px) {
  body { padding-bottom: calc(60px + env(safe-area-inset-bottom, 0px)); }
}

img, svg, picture { display: block; max-width: 100%; height: auto; }

a { color: inherit; }

ul, ol { padding-left: 1.1rem; }

::selection { background-color: var(--ink); color: var(--on-ink); }

/* Aucun média ne doit pouvoir élargir la page. `overflow-x: hidden` sur
   <body> masquerait le symptôme ; cette règle traite la cause. */
img, svg, video, iframe, table, pre { max-width: 100%; }


/* ==========================================================================
   03. TYPOGRAPHIE
   ========================================================================== */

h1, h2, h3, h4 {
  margin: 0;
  color: var(--ink);
  font-weight: 700;
  text-wrap: balance;
  /* « photovoltaïque » en très grande taille dépasse la largeur d'un
     écran de 320 px : on autorise la césure plutôt que le débordement.
     hyphens s'appuie sur lang="fr-CH", déclaré sur <html>. */
  overflow-wrap: break-word;
  hyphens: auto;
}

.display, h1 {
  font-size: var(--fs-display);
  font-stretch: 96%;
  line-height: 1.04;
  letter-spacing: -0.025em;
}

/* Titre pleine largeur, employé en ouverture de page intérieure */
.mega {
  font-size: var(--fs-mega);
  overflow-wrap: break-word;
  hyphens: auto;
  font-stretch: 88%;
  font-weight: 700;
  line-height: 0.92;
  letter-spacing: -0.04em;
  text-wrap: balance;
}

h2 { font-size: var(--fs-h2); font-stretch: 98%; line-height: 1.1; letter-spacing: -0.022em; }
h3 { font-size: var(--fs-h3); line-height: 1.3; letter-spacing: -0.012em; font-weight: 600; }
h4 { font-size: var(--fs-h4); line-height: 1.3; letter-spacing: -0.01em; font-weight: 600; }

p { margin: 0 0 1em; max-width: var(--measure); }
p:last-child { margin-bottom: 0; }

strong { font-weight: 600; }

.lead { font-size: var(--fs-lead); line-height: 1.5; color: var(--ink-soft); max-width: 46ch; }

.muted { color: var(--ink-soft); }

.label {
  display: block;
  font-size: var(--fs-label);
  font-weight: 600;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--ink-soft);
  line-height: 1.2;
}

.label--accent { color: var(--amb); }
.label--on-ink { color: var(--amb-light); }

/* Numéro d'ordre : 01, 02, 03… */
.index {
  display: block;
  font-size: var(--fs-label);
  font-weight: 600;
  letter-spacing: 0.1em;
  color: var(--amb);
  line-height: 1.2;
}

.index--on-ink { color: var(--amb-light); }

/* Citation en grand, pour aérer une page dense */
.pull {
  margin: 0;
  font-size: clamp(1.375rem, 2.6vw, 2rem);
  font-weight: 600;
  font-stretch: 98%;
  line-height: 1.25;
  letter-spacing: -0.02em;
  color: var(--ink);
  max-width: 24ch;
}

.pull::before {
  content: "";
  display: block;
  width: 2.5rem;
  height: 3px;
  margin-bottom: var(--sp-5);
  background-color: var(--amb);
}


/* ==========================================================================
   04. GRILLE, BANDES ET FILETS
   ========================================================================== */

.wrap {
  width: 100%;
  max-width: var(--wrap);
  margin-inline: auto;
  /* En paysage sur iPhone, l'encoche mord sur le bord de l'écran :
     la gouttière s'élargit d'autant, et ne change pas ailleurs. */
  padding-left: calc(var(--gutter) + env(safe-area-inset-left, 0px));
  padding-right: calc(var(--gutter) + env(safe-area-inset-right, 0px));
}

.wrap--narrow { max-width: 980px; }

.band { padding-block: var(--band-y); border-top: 1px solid var(--rule); }

.band--flush { padding-block: 0; }
.band--tight { padding-block: clamp(2rem, 3.5vw, 3rem); }
.band--alt   { background-color: var(--amb-wash); }

/* Aplat sombre — prend la teinte de l'univers de la page */
.band--deep {
  background-color: var(--amb-deep);
  color: var(--on-ink-soft);
  border-top-color: var(--amb-deep);
}

.band--deep h2, .band--deep h3, .band--deep h4, .band--deep strong { color: var(--on-ink); }
.band--deep .label { color: var(--amb-light); }
.band--deep a:not(.btn) { color: var(--amb-light); }
.band--deep a:not(.btn):hover { color: var(--on-ink); }

/* Bleu nuit imposé, quel que soit l'univers : sert aux points de bascule
   qui doivent rester identiques partout (appel à l'action de fin de page). */
.band--ink {
  background-color: var(--ink);
  border-top-color: var(--ink);
}

/* ---- En-tête de bande -------------------------------------------------- */
.band__head {
  display: grid;
  gap: var(--sp-4);
  margin-bottom: var(--sp-7);
  padding-bottom: var(--sp-5);
  border-bottom: 1px solid var(--rule);
}

.band--deep .band__head { border-bottom-color: var(--rule-on-ink); }

@media (min-width: 900px) {
  .band__head { grid-template-columns: 12.5rem 1fr; gap: var(--sp-6); align-items: end; }
}

.band__meta { display: flex; align-items: baseline; gap: var(--sp-3); }

@media (min-width: 900px) {
  .band__meta { flex-direction: column; gap: var(--sp-2); padding-bottom: 0.35rem; }
}

.band__intro { margin-top: var(--sp-4); max-width: 52ch; color: var(--ink-soft); }
.band--deep .band__intro { color: var(--on-ink-soft); }

/* ---- Colonnes séparées par des filets ---------------------------------- */
.cols { display: grid; border-top: 1px solid var(--rule); }
.cols > * { padding: var(--sp-5) 0; border-bottom: 1px solid var(--rule); }

@media (min-width: 700px) {
  .cols--2 { grid-template-columns: repeat(2, 1fr); }
  .cols--2 > * { padding: var(--sp-6) var(--sp-6) var(--sp-6) 0; }
  .cols--2 > * + * { padding-left: var(--sp-6); border-left: 1px solid var(--rule); }
}

@media (min-width: 900px) {
  .cols--3 { grid-template-columns: repeat(3, 1fr); }
  .cols--4 { grid-template-columns: repeat(4, 1fr); }
  .cols--3 > *, .cols--4 > * { padding: var(--sp-6) var(--sp-5) var(--sp-6) 0; }
  .cols--3 > * + *, .cols--4 > * + * { padding-left: var(--sp-5); border-left: 1px solid var(--rule); }
}

/* ---- Palier tablette ---------------------------------------------------
   Entre 700 et 900 px, les grilles de trois et quatre colonnes passaient
   directement à une seule : sur un iPad en portrait, près de 700 px de
   large restaient inutilisés sous chaque bloc. Deux colonnes y tiennent
   confortablement (environ 330 px chacune). */
@media (min-width: 700px) and (max-width: 899px) {
  .cols--3,
  .cols--4 { grid-template-columns: repeat(2, 1fr); }

  .cols--3 > *,
  .cols--4 > * { padding: var(--sp-6) var(--sp-5) var(--sp-6) 0; border-left: 0; }

  /* Le filet vertical ne sépare que la seconde colonne de chaque rangée */
  .cols--3 > *:nth-child(even),
  .cols--4 > *:nth-child(even) {
    padding-left: var(--sp-5);
    border-left: 1px solid var(--rule);
  }

  .band--deep .cols--3 > *:nth-child(even),
  .band--deep .cols--4 > *:nth-child(even) { border-left-color: var(--rule-on-ink); }
}

.band--deep .cols, .band--deep .cols > * { border-color: var(--rule-on-ink); }

/* Colonnes décalées verticalement — casse l'alignement au cordeau */
@media (min-width: 900px) {
  .cols--stagger > *:nth-child(even) { transform: translateY(2.5rem); }
  .cols--stagger { padding-bottom: 2.5rem; }
}

/* ---- Duos asymétriques -------------------------------------------------- */
.duo { display: grid; gap: var(--sp-7); align-items: start; }

@media (min-width: 900px) {
  .duo { grid-template-columns: 1fr 1fr; gap: var(--sp-8); }
  .duo--wide-left  { grid-template-columns: 1.25fr 1fr; }
  .duo--wide-right { grid-template-columns: 1fr 1.25fr; }
  .duo--aside      { grid-template-columns: 18rem 1fr; gap: var(--sp-9); }

  /* Duo inversé : l'image passe à gauche, le texte à droite — uniquement
     à l'écran large. L'ordre du HTML reste texte puis image, si bien qu'en
     colonne (mobile, lecteur d'écran) on lit toujours le texte d'abord. */
  .duo--mirror > *:first-child { order: 2; }
  .duo--mirror > *:last-child  { order: 1; }

  /* Les deux colonnes démarrent à la même hauteur. Avec un centrage
     vertical, une image plus courte que le texte se retrouvait décrochée
     vers le bas, laissant un grand vide au-dessus d'elle. */
  .duo--mirror {
    align-items: start;
    /* La colonne de gauche accueille l'image : on lui donne l'avantage.
       À largeur égale, une photographie 16:9 paraît minuscule à côté d'un
       bloc de texte qui, lui, se déploie en hauteur. */
    grid-template-columns: 1.35fr 1fr;
  }
  .duo--mirror .figure { align-self: start; }
  .duo--center     { align-items: center; }
}

.visually-hidden {
  position: absolute; width: 1px; height: 1px;
  margin: -1px; padding: 0; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%);
  white-space: nowrap; border: 0;
}

.skip-link {
  position: absolute; top: -100px; left: 0; z-index: 200;
  padding: var(--sp-3) var(--sp-5);
  background: var(--ink); color: var(--on-ink);
  text-decoration: none; font-size: var(--fs-sm); font-weight: 600;
}

.skip-link:focus { top: 0; }


/* ==========================================================================
   05. PANNEAUX GRAPHIQUES — à la place des photographies
   --------------------------------------------------------------------------
   Aucune photo n'est disponible pour l'instant. Plutôt que des cadres gris
   en attente, le site pose des aplats trames en CSS : ils sont finis, ils
   tiennent debout seuls, et ils portent la couleur de l'univers de page.

   POUR PASSER À DE VRAIES PHOTOS, une par une :
     <div class="plate plate--rays"></div>
   devient
     <img class="plate" src="../assets/img/ma-photo.webp"
          alt="Description en français" width="…" height="…" loading="lazy">
   La classe .plate porte déjà le format et le recadrage ; le reste du HTML
   ne bouge pas. Les trames sont purement décoratives : elles ne portent
   aucune information et n'ont donc pas d'équivalent textuel à prévoir.
   ========================================================================== */

.plate {
  position: relative;
  overflow: hidden;
  background-color: var(--amb-deep);
  width: 100%;
  object-fit: cover;   /* utile dès qu'une <img> prend la classe */
}

.plate--3-2  { aspect-ratio: 3 / 2; }
.plate--1-1  { aspect-ratio: 1 / 1; }
.plate--3-4  { aspect-ratio: 3 / 4; }
/* Trame diagonale — registre technique, employée par défaut */
.plate--lines::before {
  content: "";
  position: absolute;
  inset: -20%;
  background-image: repeating-linear-gradient(
    115deg,
    transparent 0 22px,
    rgba(255, 255, 255, 0.09) 22px 23px
  );
}

/* Rayons — registre solaire (photovoltaïque) */
.plate--rays::before {
  content: "";
  position: absolute;
  inset: -30% -10% auto -10%;
  height: 150%;
  background-image: repeating-conic-gradient(
    from 200deg at 50% 115%,
    rgba(255, 255, 255, 0.10) 0deg 1.2deg,
    transparent 1.2deg 7deg
  );
}

/* Ondes concentriques — registre de la chaleur (pompes à chaleur) */
.plate--waves::before {
  content: "";
  position: absolute;
  inset: -40%;
  background-image: repeating-radial-gradient(
    circle at 28% 78%,
    transparent 0 26px,
    rgba(255, 255, 255, 0.10) 26px 28px
  );
}

/* Strates horizontales — registre de l'eau (sanitaire) */
.plate--strata::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: repeating-linear-gradient(
    to bottom,
    transparent 0 14px,
    rgba(255, 255, 255, 0.07) 14px 15px
  );
}

/* Quadrillage — registre du document (subventions, mentions) */
.plate--grid::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.08) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.08) 1px, transparent 1px);
  background-size: 46px 46px;
}

/* Une <img class="plate"> remplace le panneau : mêmes format et recadrage,
   sans la trame (les images remplacées n'ont pas de pseudo-éléments). */
img.plate { display: block; object-fit: cover; }

/* Photo à l'intérieur d'un panneau, avec du contenu par-dessus */
.plate > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}

/* Contenu posé sur le panneau */
.plate__inner {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  height: 100%;
  padding: var(--sp-6);
  color: var(--on-ink);
}

@media (min-width: 900px) { .plate__inner { padding: var(--sp-7); } }

/* Sigle géant en filigrane dans un panneau */
.plate__mark {
  position: absolute;
  right: -0.06em;
  bottom: -0.24em;
  z-index: 1;
  margin: 0;
  font-size: clamp(7rem, 17vw, 15rem);
  font-weight: 700;
  font-stretch: 84%;
  line-height: 0.8;
  letter-spacing: -0.05em;
  color: transparent;
  -webkit-text-stroke: 1px rgba(255, 255, 255, 0.22);
  pointer-events: none;
  user-select: none;
}

@supports not (-webkit-text-stroke: 1px currentColor) {
  .plate__mark { color: rgba(255, 255, 255, 0.12); }
}

/* ==========================================================================
   05 bis. FIGURES — l'espace propre des photographies
   --------------------------------------------------------------------------
   RÈGLE : une photographie n'est JAMAIS posée en arrière-plan sous un voile,
   et n'est JAMAIS recadrée de force dans un cadre qui ne lui correspond pas.

   Une photo derrière un voile opaque n'est plus une photo, c'est un aplat
   sali ; et une image panoramique écrasée dans une colonne haute perd son
   sujet. Les deux ont été essayés, les deux ont été rejetés.

   FORMAT RETENU : LE CARRÉ, de taille contenue.

   Les bandeaux pleine largeur ont été essayés puis abandonnés : une photo
   étalée sur toute la largeur d'un écran occupe des centaines de pixels de
   haut et écrase le reste de la page. Le carré, lui, garde une emprise
   constante quelle que soit la taille de l'écran, et se place naturellement
   en regard d'un texte.
   ========================================================================== */

.figure {
  /* ⬅️  LA TAILLE DES IMAGES SE RÈGLE ICI, et uniquement ici. */
  --figure-size: clamp(200px, 30vw, 340px);
  margin: 0;
  position: relative;
  width: 100%;
  max-width: var(--figure-size);
  overflow: hidden;
}

.figure img {
  display: block;
  width: 100%;
  aspect-ratio: 1 / 1;      /* carré, quel que soit le format d'origine */
  object-fit: cover;
  object-position: center;
}

/* Carré un peu plus grand, en ouverture de page */
.figure--hero { --figure-size: clamp(220px, 34vw, 400px); }

/* Deux photographies empilées dans la MÊME colonne d'un duo.
   Indispensable : sans ce conteneur, la grille à deux colonnes renvoie la
   seconde image à la ligne suivante, sous le texte, et les deux se
   retrouvent décalées de part et d'autre d'un vide. */
.figure-stack {
  align-self: start;
  width: 100%;
  max-width: 72%;
}

.figure-stack .figure { max-width: none; width: 100%; }

/* ⚠️  Sans cette règle, les images de la pile héritent du carré défini plus
   haut pour .figure et se retrouvent amputées. Le 4:3 correspond au cadrage
   réel des photographies utilisées. */
.figure-stack .figure img { aspect-ratio: 4 / 3; }

@media (max-width: 899px) { .figure-stack { max-width: 100%; } }

/* Photo en regard d'un texte : elle occupe toute sa colonne et se cale en
   haut, au même niveau que la première ligne du texte voisin. Sans cela
   elle se retrouvait sous la liste, isolée dans un grand vide. */
.figure--column {
  --figure-size: none;
  max-width: none;
  align-self: start;
}

.figure--column img { aspect-ratio: 4 / 3; object-fit: cover; }

/* Bande de section — la photographie occupe la largeur du contenu.
   Réservée aux images réellement panoramiques : une source carrée y perd
   trop de son sujet, et une source de faible résolution y devient floue. */
.figure--band {
  --figure-size: none;
  max-width: none;
}

.figure--band img {
  aspect-ratio: 16 / 9;
  max-height: clamp(200px, 30vw, 380px);
  object-fit: cover;
}

/* Format large — pour les images dont le sujet ne supporte pas le carré.
   L'étiquette énergétique en est le cas type : recadrée en carré, son
   échelle A-G est amputée et l'image perd son sens. */
.figure--wide { --figure-size: clamp(260px, 40vw, 420px); }
.figure--wide img { aspect-ratio: 16 / 9; }

/* Une figure placée directement dans un duo occupe toute sa colonne.
   Sans cela elle restait bridée à sa largeur maximale et paraissait
   minuscule en regard d'un texte qui, lui, remplit la sienne. */
.duo > .figure { --figure-size: none; max-width: none; width: 100%; }

/* Dans une colonne de lecture, l'image se cale sur la mesure du texte —
   ni bridée à 420 px, où elle paraissait dérisoire, ni étalée sur toute la
   colonne, où elle occupait la moitié de l'écran en hauteur.
   640 px de large donnent 360 px de haut en 16:9 : l'image reste lisible
   et le texte qui suit demeure visible sans défiler. */
.prose > .figure,
.prose + .figure { --figure-size: none; max-width: 40rem; width: 100%; }

/* Ratio d'origine préservé : à réserver aux images dont le sujet occupe
   tout le cadre et ne supporte aucun recadrage. */
.figure--native { --figure-size: none; }
.figure--native img { aspect-ratio: auto; height: auto; object-fit: fill; }

/* Filet de rappel sous l'image, dans la couleur de l'univers */
.figure--ruled::after {
  content: "";
  display: block;
  height: 3px;
  background-color: var(--amb);
}

/* Débord jusqu'au bord droit de l'écran (conteneur centré) */
/* ==========================================================================
   06. BOUTONS ET LIENS
   --------------------------------------------------------------------------
   Le bouton d'action est VERT sur toutes les pages, quel que soit l'univers :
   c'est le repère d'action du site, il ne doit pas changer de sens d'une
   page à l'autre.
   ========================================================================== */

.btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-6);
  min-height: 54px;
  padding: var(--sp-3) var(--sp-5);
  border: 1px solid var(--accent-ink);
  background-color: transparent;
  color: var(--on-ink);
  font-family: inherit;
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1.2;
  text-decoration: none;
  cursor: pointer;
  overflow: hidden;
  isolation: isolate;
  max-width: 100%;          /* « Vérifier mes droits aux subventions »
                               débordait d'un écran de 320 px */
  text-align: left;
  transition: color var(--t), border-color var(--t);
}

/* Sur les très petits écrans, l'écart entre le libellé et la flèche est
   réduit et le libellé peut passer à la ligne plutôt que déborder. */
@media (max-width: 480px) {
  .btn {
    gap: var(--sp-3);
    padding-inline: var(--sp-4);
    font-size: var(--fs-xs);
  }
}

/* Le remplissage glisse depuis la gauche au survol : inversion animée,
   sans aucun déplacement du bouton lui-même. */
.btn::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background-color: var(--accent-ink);
  transform-origin: left;
  transition: transform var(--t-slow);
}

.btn svg { flex-shrink: 0; transition: transform var(--t); }
.btn:hover svg { transform: translateX(5px); }

.btn--primary:hover { color: var(--accent-deep); }
.btn--primary:hover::before { transform: scaleX(0); transform-origin: right; }

/* Contour sombre sur fond clair */
.btn--secondary {
  border-color: var(--ink);
  color: var(--ink);
}

.btn--secondary::before { background-color: var(--ink); transform: scaleX(0); }
.btn--secondary:hover { color: var(--on-ink); }
.btn--secondary:hover::before { transform: scaleX(1); }

/* Sur aplat sombre. Le contour est à 0,45 d'opacité et non 0,22 comme les
   filets décoratifs : c'est un contour de composant, il lui faut 3:1 (ici
   4,1:1). Ne pas l'aligner sur --rule-on-ink. */
.btn--ghost {
  border-color: rgba(255, 255, 255, 0.45);
  color: var(--on-ink);
}

.btn--ghost::before { background-color: var(--on-ink); transform: scaleX(0); }
.btn--ghost:hover { color: var(--amb-deep); border-color: var(--on-ink); }
.btn--ghost:hover::before { transform: scaleX(1); }

.btn--block { width: 100%; }

.btn--sm { min-height: 44px; padding: var(--sp-2) var(--sp-4); gap: var(--sp-4); font-size: var(--fs-xs); }

.actions { display: flex; flex-direction: column; gap: var(--sp-3); align-items: stretch; }

@media (min-width: 560px) {
  .actions { flex-direction: row; align-items: center; gap: var(--sp-5); }
}

/* Lien fléché : soulignement qui se déplie de la gauche */
.arrow-link {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-3);
  padding-bottom: 3px;
  font-size: var(--fs-sm);
  font-weight: 600;
  text-decoration: none;
  color: var(--ink);
  background-image: linear-gradient(var(--amb), var(--amb));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 0% 2px;
  transition: background-size var(--t-slow), color var(--t);
}

.arrow-link svg { transition: transform var(--t); }

.arrow-link:hover, a:hover .arrow-link { background-size: 100% 2px; color: var(--amb); }
.arrow-link:hover svg, a:hover .arrow-link svg { transform: translateX(5px); }

.band--deep .arrow-link { color: var(--on-ink); background-image: linear-gradient(var(--amb-light), var(--amb-light)); }
.band--deep .arrow-link:hover { color: var(--amb-light); }

.tel-inline {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-3);
  font-size: var(--fs-sm);
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
  transition: color var(--t);
}

.tel-inline:hover { color: var(--amb); }
.band--deep .tel-inline:hover { color: var(--amb-light); }


/* ==========================================================================
   07. EN-TÊTE, NAVIGATION, PROGRESSION DE LECTURE
   ========================================================================== */

.header {
  position: sticky;
  top: 0;
  z-index: 100;
  background-color: var(--paper);
  border-bottom: 1px solid var(--rule);
  transition: transform var(--t-slow), background-color var(--t);
}

/* L'en-tête s'efface en descendant, revient dès qu'on remonte : la lecture
   gagne de la hauteur d'écran sans jamais perdre l'accès à la navigation. */
.header.is-hidden { transform: translateY(-101%); }

.header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  min-height: var(--header-h);
}

/* Progression de lecture, collée sous l'en-tête */
.progress {
  position: absolute;
  left: 0; right: 0; bottom: -1px;
  height: 2px;
  background-color: transparent;
  pointer-events: none;
}

.progress__bar {
  display: block;
  height: 100%;
  width: 0;
  background-color: var(--amb);
  transition: width 90ms linear;
}

/* ---- Logotype provisoire ----------------------------------------------
   Pour le logo définitif : remplacer le contenu de <a class="logo"> par une
   <img>. Les règles .logo__* deviennent alors inutiles.                  */
.logo {
  display: inline-flex;
  align-items: baseline;
  gap: 0.45rem;
  text-decoration: none;
  color: var(--ink);
  flex-shrink: 0;
}

.logo__name {
  font-size: 1.0625rem;
  font-weight: 700;
  font-stretch: 92%;
  letter-spacing: -0.02em;
  text-transform: uppercase;
  white-space: nowrap;
}

.logo__dot {
  width: 7px; height: 7px;
  background-color: var(--accent);
  flex-shrink: 0;
  align-self: center;
  transition: transform var(--t);
}

.logo:hover .logo__dot { transform: scale(1.6); }

.nav-toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-3);
  height: 44px;               /* seuil tactile : ne pas descendre en dessous */
  padding: 0 var(--sp-4);
  border: 1px solid var(--ink);
  background-color: transparent;
  color: var(--ink);
  font-family: inherit;
  font-size: var(--fs-label);
  font-weight: 600;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color var(--t), color var(--t);
}

.nav-toggle:hover { background-color: var(--ink); color: var(--on-ink); }

.nav-toggle__bars { display: grid; gap: 4px; width: 16px; }

.nav-toggle__bars span {
  display: block; height: 1.5px;
  background-color: currentColor;
  transition: transform var(--t), opacity var(--t);
}

.nav-toggle[aria-expanded="true"] .nav-toggle__bars span:nth-child(1) { transform: translateY(5.5px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] .nav-toggle__bars span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] .nav-toggle__bars span:nth-child(3) { transform: translateY(-5.5px) rotate(-45deg); }

.nav-toggle__label--close { display: none; }
.nav-toggle[aria-expanded="true"] .nav-toggle__label--open { display: none; }
.nav-toggle[aria-expanded="true"] .nav-toggle__label--close { display: inline; }

/* ---- Navigation --------------------------------------------------------
   Mobile : panneau plein écran. Les liens entrent en cascade — le menu se
   déplie comme un sommaire, il ne s'affiche pas d'un bloc.               */
.nav {
  position: fixed;
  inset: var(--header-h) 0 0;
  z-index: 99;
  display: none;
  padding: var(--sp-6) var(--gutter) var(--sp-8);
  background-color: var(--paper);
  overflow-y: auto;
  overscroll-behavior: contain;
}

.nav.is-open { display: block; }

.nav__list { list-style: none; margin: 0 0 var(--sp-6); padding: 0; border-top: 1px solid var(--rule); }

.nav__link {
  display: flex;
  align-items: baseline;
  gap: var(--sp-4);
  padding: var(--sp-4) 0;
  border-bottom: 1px solid var(--rule);
  font-size: clamp(1.375rem, 5vw, 1.75rem);
  font-weight: 600;
  font-stretch: 96%;
  letter-spacing: -0.02em;
  text-decoration: none;
  color: var(--ink);
  transition: color var(--t), padding-left var(--t);
}

.nav__link::before {
  content: attr(data-index);
  font-size: var(--fs-label);
  font-weight: 600;
  letter-spacing: 0.1em;
  color: var(--amb);
  flex-shrink: 0;
  width: 2.25rem;
}

.nav__link:hover { padding-left: var(--sp-3); color: var(--amb); }
.nav__link[aria-current="page"] { color: var(--amb); }

.nav__foot { display: grid; gap: var(--sp-4); }

/* Cascade d'entrée des liens du menu mobile */
.js .nav.is-open .nav__list li {
  animation: nav-in 420ms cubic-bezier(0.16, 1, 0.3, 1) backwards;
  animation-delay: calc(var(--i, 0) * 45ms);
}

@keyframes nav-in {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: none; }
}

@media (min-width: 1080px) {
  .nav-toggle { display: none; }

  .nav {
    position: static; display: flex; align-items: center;
    gap: var(--sp-6); padding: 0; background: none; overflow: visible;
  }

  .nav__list { display: flex; align-items: center; gap: clamp(1rem, 2vw, 2rem); margin: 0; border-top: 0; }

  .nav__link {
    display: block;
    padding: var(--sp-2) 0;
    border-bottom: 0;
    font-size: var(--fs-sm);
    font-weight: 500;
    letter-spacing: 0;
    background-image: linear-gradient(var(--amb), var(--amb));
    background-repeat: no-repeat;
    background-position: 0 100%;
    background-size: 0% 2px;
    transition: background-size var(--t-slow), color var(--t);
  }

  .nav__link::before { content: none; }
  .nav__link:hover { padding-left: 0; background-size: 100% 2px; }
  .nav__link[aria-current="page"] { background-size: 100% 2px; color: var(--ink); font-weight: 600; }

  .nav__foot { display: flex; align-items: center; gap: var(--sp-5); }
  .nav__foot .tel-inline { display: none; }
}

@media (min-width: 1280px) { .nav__foot .tel-inline { display: inline-flex; } }


/* ==========================================================================
   08. BARRE D'ACTION MOBILE
   ========================================================================== */

.mobile-bar {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 95;
  display: grid;
  grid-template-columns: 1fr 1fr;
  border-top: 1px solid var(--ink);
  /* La barre système de l'iPhone recouvrirait sinon les deux boutons */
  padding-bottom: env(safe-area-inset-bottom, 0px);
}

.mobile-bar__item {
  display: flex; align-items: center; justify-content: center;
  gap: var(--sp-2);
  min-height: 59px;
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  text-decoration: none;
  background-color: var(--paper);
  color: var(--ink);
}

.mobile-bar__item--call { background-color: var(--accent-ink); color: var(--on-ink); }

@media (min-width: 768px) { .mobile-bar { display: none; } }


/* ==========================================================================
   09. HERO
   ========================================================================== */

.hero { border-top: 0; }

/* ---- Photographie en arrière-plan --------------------------------------
   Seul endroit du site où une photo passe derrière du texte. Le voile
   ci-dessous n'est donc pas décoratif : il conditionne la lisibilité du
   titre. Il est dégradé — très couvrant à gauche, où se trouve le texte,
   plus transparent à droite, où la photo respire.                       */
.hero { position: relative; isolation: isolate; }

.hero__bg { position: absolute; inset: 0; z-index: -2; overflow: hidden; }

.hero__bg img { width: 100%; height: 100%; object-fit: cover; object-position: center 60%; }

.hero__bg::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    100deg,
    rgba(9, 26, 43, 0.95) 0%,
    rgba(9, 26, 43, 0.90) 42%,
    rgba(9, 26, 43, 0.62) 78%,
    rgba(9, 26, 43, 0.48) 100%
  );
}

/* Sur mobile la colonne occupe toute la largeur : le voile doit couvrir
   partout, il n'y a plus de zone « libre » à droite. */
@media (max-width: 999px) {
  .hero__bg::after {
    background: linear-gradient(180deg, rgba(9, 26, 43, 0.93), rgba(9, 26, 43, 0.88));
  }
}

.hero__intro { padding-block: clamp(3rem, 6vw, 5.5rem) clamp(2.5rem, 4vw, 3.5rem); }

@media (min-width: 1000px) {
  .hero__intro { max-width: 60%; }
}

.hero__panel { display: flex; flex-direction: column; justify-content: center; }

/* Le hero passe en texte clair sur la photographie */
.hero h1 { color: var(--on-ink); }
.hero .hero__text { color: rgba(255, 255, 255, 0.88); border-top-color: rgba(255, 255, 255, 0.24); }
.hero .index { color: var(--accent-light); }
.hero .label { color: rgba(255, 255, 255, 0.78); }
.hero__index::after { background-color: rgba(255, 255, 255, 0.24); }
.hero .tel-inline { color: var(--on-ink); }
.hero .tel-inline:hover { color: var(--accent-light); }

.hero__facts { border-top-color: rgba(255, 255, 255, 0.24); }
.hero__facts li { color: rgba(255, 255, 255, 0.88); border-bottom-color: rgba(255, 255, 255, 0.18); }

@media (min-width: 800px) {
  .hero__facts li + li { border-left-color: rgba(255, 255, 255, 0.18); }
}

.hero__index { display: flex; align-items: center; gap: var(--sp-4); margin-bottom: var(--sp-6); }

.hero__index::after {
  content: "";
  flex: 1; height: 1px; max-width: 8rem;
  background-color: var(--rule);
}

.hero h1 { margin-bottom: var(--sp-6); }

/* Le segment mis en valeur : filet d'accent qui se déplie au chargement */
.hero h1 em {
  font-style: normal;
  position: relative;
  white-space: nowrap;
}

.hero h1 em::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0.04em;
  height: 0.1em;
  background-color: var(--accent);
  transform-origin: left;
}

.js .hero h1 em::after {
  transform: scaleX(0);
  animation: underline-in 900ms cubic-bezier(0.16, 1, 0.3, 1) 700ms forwards;
}

@keyframes underline-in { to { transform: scaleX(1); } }

.hero__text {
  max-width: 46ch;
  margin-bottom: var(--sp-7);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--rule);
  font-size: var(--fs-lead);
  line-height: 1.5;
  color: var(--ink-soft);
}

/* ---- Bandeau de faits sous le hero ------------------------------------- */
.hero__facts { display: grid; list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--rule); }

.hero__facts li {
  display: flex; align-items: baseline; gap: var(--sp-4);
  padding: var(--sp-4) 0;
  border-bottom: 1px solid var(--rule);
  font-size: var(--fs-sm);
}

@media (min-width: 800px) {
  .hero__facts { grid-template-columns: repeat(3, 1fr); }
  .hero__facts li { padding: var(--sp-5) var(--sp-5) var(--sp-5) 0; border-bottom: 0; }
  .hero__facts li + li { padding-left: var(--sp-5); border-left: 1px solid var(--rule); }
}


/* ==========================================================================
   10. INDEX DES PRESTATIONS
   --------------------------------------------------------------------------
   Ce ne sont pas des cartes : trois entrées d'un index, séparées par des
   filets. Au survol, un aplat monte depuis le bas — le bloc ne bouge pas.
   ========================================================================== */

.entry {
  position: relative;
  isolation: isolate;
  display: flex;
  flex-direction: column;
}

@media (min-width: 900px) { .entry { margin-inline: calc(-1 * var(--sp-4)); padding-inline: var(--sp-4); } }

.entry::before {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  z-index: -1;
  height: 0;
  background-color: var(--amb-wash);
  transition: height var(--t-slow);
}

.entry:hover::before, .entry:focus-within::before { height: 100%; }

.entry__link { text-decoration: none; color: inherit; }
.entry__link::after { content: ""; position: absolute; inset: 0; }

/* Version photographique : le cadre est fixe, seule l'image respire. */
.entry__media {
  position: relative;
  aspect-ratio: 1 / 1;
  margin-bottom: var(--sp-5);
  overflow: hidden;
  background-color: var(--paper-tint);
}

.entry__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
}

.entry:hover .entry__media img,
.entry:focus-within .entry__media img { transform: scale(1.04); }

.entry__head {
  display: flex; align-items: baseline; gap: var(--sp-4);
  padding-bottom: var(--sp-3);
  margin-bottom: var(--sp-4);
  border-bottom: 1px solid var(--rule);
}

.entry__head .index { flex-shrink: 0; }

.entry p { font-size: var(--fs-sm); color: var(--ink-soft); margin-bottom: var(--sp-5); }

.entry__foot { margin-top: auto; }


/* ==========================================================================
   11. ARGUMENTS
   ========================================================================== */

.arg__icon { color: var(--amb); margin-bottom: var(--sp-5); transition: transform var(--t-slow); }

.arg:hover .arg__icon { transform: translateY(-4px); }

.band--deep .arg__icon { color: var(--amb-light); }

.arg h3 { margin-bottom: var(--sp-3); padding-top: var(--sp-3); border-top: 1px solid var(--rule); }

.band--deep .arg h3 { border-top-color: var(--rule-on-ink); }

.arg p { font-size: var(--fs-sm); color: var(--ink-soft); }
.band--deep .arg p { color: var(--on-ink-soft); }


/* ==========================================================================
   12. BANDEAU MARQUES
   ========================================================================== */

.brands { padding-block: 0; border-top: 1px solid var(--rule); border-bottom: 1px solid var(--rule); }

.brands__head { display: flex; align-items: center; gap: var(--sp-4); padding-block: var(--sp-5); }

.brands__head h2 { font-size: var(--fs-h4); font-weight: 600; letter-spacing: 0; font-stretch: 100%; }

.marquee {
  overflow: hidden;
  border-top: 1px solid var(--rule);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}

.marquee__track { display: flex; width: max-content; animation: marquee 34s linear infinite; }

.marquee:hover .marquee__track,
.marquee:focus-within .marquee__track { animation-play-state: paused; }

.marquee__group { display: flex; align-items: center; flex-shrink: 0; }

.marquee__item {
  display: flex; align-items: center; justify-content: center;
  height: 96px;
  padding-inline: clamp(2rem, 5vw, 4.5rem);
  border-right: 1px solid var(--rule);
  font-size: clamp(1rem, 1.6vw, 1.375rem);
  font-weight: 600;
  font-stretch: 96%;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--ink);
  transition: color var(--t);
}

.marquee__item:hover { color: var(--amb); }

/* Logos officiels des fabricants. Hauteur normalisée et opacité identique
   pour toutes les marques : le brief impose un traitement visuel
   strictement égal — ne jamais en agrandir ni en mettre une en avant.

   ⚠️  mix-blend-mode NEUTRALISE LE FOND BLANC de trois des fichiers
   (Panasonic, Mitsubishi Electric, Bosch), qui formerait sinon un
   rectangle blanc sur le papier crème. En mode « multiply », le blanc
   devient transparent et les couleurs de marque sont préservées — le fond
   du site étant très clair, la teinte des logos n'est pas altérée de
   façon perceptible. Ne retirer cette règle que si tous les fichiers sont
   fournis détourés. */
.marquee__item img {
  height: 34px;
  width: auto;
  max-width: none;
  opacity: 0.82;
  mix-blend-mode: multiply;
  transition: opacity var(--t);
}

.marquee__item:hover img { opacity: 1; }

@keyframes marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}


/* ==========================================================================
   12 bis. VÉRIFICATEUR D'ÉLIGIBILITÉ
   --------------------------------------------------------------------------
   Le composant de conversion du site (assets/js/eligibilite.js). Traité
   comme un objet à part : encadré plein, aplat sombre, il tranche
   volontairement avec le reste de la page pour se signaler comme un outil.
   ========================================================================== */

/* Masqué tant que JavaScript n'a rien construit : sans lui, c'est le
   <noscript> voisin qui prend le relais (invitation à appeler). */
.quiz { display: none; }

.js .quiz {
  position: relative;
  background-color: var(--amb-deep);
  color: var(--on-ink-soft);
  padding: var(--sp-6);
  min-height: 30rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

@media (min-width: 700px) { .js .quiz { padding: var(--sp-8); } }

.quiz h3, .quiz h4 { color: var(--on-ink); }

/* Barre d'avancement */
.quiz__bar {
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background-color: rgba(255, 255, 255, 0.14);
}

.quiz__bar span {
  display: block;
  height: 100%;
  background-color: var(--amb-light);
  transition: width var(--t-slow);
}

.quiz__step { margin-bottom: var(--sp-5); }
.quiz__step .index { color: var(--amb-light); }

/* Rappel du canton choisi dans le répertoire */
.quiz__chosen {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--sp-3);
  margin: calc(-1 * var(--sp-3)) 0 var(--sp-5);
  padding-bottom: var(--sp-4);
  border-bottom: 1px solid rgba(255, 255, 255, 0.22);
  font-size: var(--fs-sm);
}

.quiz__chosen strong { color: var(--amb-light); }

.quiz__change {
  border: 0;
  background: none;
  padding: 0;
  cursor: pointer;
  font-family: inherit;
  font-size: var(--fs-xs);
  color: var(--on-ink-soft);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.quiz__change:hover { color: var(--on-ink); }

.quiz__set { border: 0; margin: 0; padding: 0; min-width: 0; }

.quiz__legend {
  padding: 0;
  margin-bottom: var(--sp-3);
  font-size: clamp(1.375rem, 2.6vw, 2rem);
  font-weight: 700;
  font-stretch: 98%;
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--on-ink);
}

.quiz__legend:focus { outline: none; }

.quiz__help { font-size: var(--fs-sm); margin-bottom: var(--sp-6); max-width: 48ch; }

/* ---- Options ------------------------------------------------------------
   Le survol remplit depuis la gauche, comme les boutons du site. */
.quiz__options { display: grid; gap: var(--sp-3); }

@media (min-width: 640px) { .quiz__options { grid-template-columns: repeat(2, 1fr); } }

.quiz__opt {
  position: relative;
  isolation: isolate;
  display: block;
  width: 100%;
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid rgba(255, 255, 255, 0.45);
  background: transparent;
  color: var(--on-ink);
  font-family: inherit;
  font-size: var(--fs-sm);
  font-weight: 500;
  text-align: left;
  cursor: pointer;
  overflow: hidden;
  transition: color var(--t), border-color var(--t);
}

.quiz__opt::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background-color: var(--on-ink);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--t-slow);
}

.quiz__opt:hover { color: var(--amb-deep); border-color: var(--on-ink); }
.quiz__opt:hover::before { transform: scaleX(1); }

/* Sélectionné (choix multiple) */
.quiz__opt.is-on {
  border-color: var(--amb-light);
  color: var(--amb-deep);
  font-weight: 600;
}

.quiz__opt.is-on::before { background-color: var(--amb-light); transform: scaleX(1); }

/* ---- Grille des cantons ------------------------------------------------- */
.quiz__cantons {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr));
  gap: 1px;
  background-color: rgba(255, 255, 255, 0.18);
  border: 1px solid rgba(255, 255, 255, 0.18);
  max-height: 22rem;
  overflow-y: auto;
}

.quiz__canton {
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
  min-height: 44px;           /* seuil tactile */
  padding: var(--sp-3) var(--sp-4);
  border: 0;
  background-color: var(--amb-deep);
  color: var(--on-ink-soft);
  font-family: inherit;
  font-size: var(--fs-xs);
  text-align: left;
  cursor: pointer;
  transition: background-color var(--t), color var(--t);
}

.quiz__canton:hover { background-color: var(--on-ink); color: var(--amb-deep); }

.quiz__canton-code {
  font-weight: 700;
  font-size: var(--fs-label);
  letter-spacing: 0.08em;
  color: var(--amb-light);
  flex-shrink: 0;
  width: 1.6rem;
}

.quiz__canton:hover .quiz__canton-code { color: var(--amb-deep); }

.quiz__canton-nom { line-height: 1.25; }

.quiz__nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  margin-top: var(--sp-6);
}

.quiz__back {
  border: 0;
  background: none;
  padding: 0;
  cursor: pointer;
  color: var(--on-ink);
  font-family: inherit;
  background-image: linear-gradient(var(--amb-light), var(--amb-light));
}

.quiz__next:disabled { opacity: 0.4; cursor: not-allowed; }
.quiz__next:disabled:hover::before { transform: scaleX(1); }

/* ---- Résultat ----------------------------------------------------------- */
.quiz__title {
  font-size: clamp(1.375rem, 2.4vw, 1.875rem);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.15;
  margin-bottom: var(--sp-4);
}

.quiz__title:focus { outline: none; }

.quiz__intro { font-size: var(--fs-xs); margin-bottom: var(--sp-6); max-width: 60ch; }

.findings { list-style: none; margin: 0 0 var(--sp-6); padding: 0; display: grid; gap: 1px; }

.finding {
  display: flex;
  gap: var(--sp-4);
  padding: var(--sp-5) 0;
  border-top: 1px solid rgba(255, 255, 255, 0.18);
}

.finding h4 { font-size: var(--fs-h4); margin-bottom: var(--sp-2); }
.finding p { font-size: var(--fs-sm); margin: 0; max-width: 62ch; }

/* Pastille de statut : carrée, comme le reste du site */
.finding__mark {
  flex-shrink: 0;
  width: 10px; height: 10px;
  margin-top: 0.5em;
  background-color: var(--amb-light);
}

.finding--oui .finding__mark    { background-color: #6FCF97; }
.finding--peut .finding__mark   { background-color: #E4D9C4; }
.finding--non .finding__mark    { background-color: rgba(255, 255, 255, 0.35); }
.finding--alerte .finding__mark { background-color: #F0B99A; }

/* Une alerte doit se voir : elle signale un risque de perdre l'aide */
.finding--alerte {
  background-color: rgba(255, 255, 255, 0.07);
  padding-inline: var(--sp-4);
  border-top-color: #F0B99A;
}

.quiz__end { border-top: 1px solid rgba(255, 255, 255, 0.18); padding-top: var(--sp-6); }
.quiz__end-text { font-size: var(--fs-sm); margin-bottom: var(--sp-5); max-width: 58ch; }
.quiz__end .actions { margin-bottom: var(--sp-5); }

.quiz__restart {
  border: 0; background: none; padding: 0; cursor: pointer;
  color: var(--on-ink-soft); font-family: inherit; font-size: var(--fs-xs);
  background-image: linear-gradient(var(--amb-light), var(--amb-light));
}

/* Repli sans JavaScript */
.quiz__noscript { padding: var(--sp-6); background-color: var(--amb-wash); border-left: 2px solid var(--amb); }


/* ==========================================================================
   12 ter. RÉPERTOIRE DES CANTONS
   --------------------------------------------------------------------------
   Les 26 cantons sont écrits dans le HTML (et non générés en JavaScript) :
   ils doivent être indexables. Chacun mène au vérificateur.
   ========================================================================== */

.cantons {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
  gap: 1px;
  background-color: var(--rule);
  border: 1px solid var(--rule);
  list-style: none;
  margin: 0;
  padding: 0;
}

.cantons a {
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
  height: 100%;
  padding: var(--sp-4);
  background-color: var(--paper);
  text-decoration: none;
  font-size: var(--fs-xs);
  transition: background-color var(--t), color var(--t);
}

.cantons a:hover { background-color: var(--amb-deep); color: var(--on-ink); }

.cantons b {
  font-weight: 700;
  font-size: var(--fs-label);
  letter-spacing: 0.08em;
  color: var(--amb);
  flex-shrink: 0;
  width: 1.7rem;
}

.cantons a:hover b { color: var(--amb-light); }

/* Cantons où l'entreprise intervient le plus souvent */
.cantons li.is-priority a { background-color: var(--amb-wash); font-weight: 600; }


/* ==========================================================================
   13. SUBVENTIONS
   ========================================================================== */

.subsidy-note { padding: var(--sp-5) 0 var(--sp-5) var(--sp-5); border-left: 2px solid var(--amb); }

.subsidy-note h3 { margin-bottom: var(--sp-3); }

.subsidy-note p { font-size: var(--fs-sm); color: var(--ink-soft); margin-bottom: var(--sp-5); }

.band--deep .subsidy-note { border-left-color: var(--amb-light); }
.band--deep .subsidy-note p { color: var(--on-ink-soft); }


/* ==========================================================================
   14. PROCESSUS
   ========================================================================== */

.steps { counter-reset: step; list-style: none; margin: 0; padding: 0; display: grid; border-top: 1px solid var(--rule); }

.steps > li { position: relative; padding: var(--sp-5) 0; border-bottom: 1px solid var(--rule); }

@media (min-width: 640px) { .steps { grid-template-columns: repeat(2, 1fr); } }

@media (min-width: 1024px) {
  .steps { grid-template-columns: repeat(4, 1fr); }
  .steps > li { padding: var(--sp-6) var(--sp-5) var(--sp-6) 0; }
  .steps > li + li { padding-left: var(--sp-5); border-left: 1px solid var(--rule); }
}

.step::before {
  counter-increment: step;
  content: "0" counter(step);
  display: block;
  margin-bottom: var(--sp-4);
  font-size: clamp(2.75rem, 4.2vw, 3.75rem);
  font-weight: 700;
  font-stretch: 90%;
  letter-spacing: -0.04em;
  line-height: 1;
  color: transparent;
  -webkit-text-stroke: 1px var(--amb);
  transition: color var(--t-slow);
}

/* Le numéro se remplit quand l'étape entre à l'écran */
.step.is-in::before { color: var(--amb); -webkit-text-stroke-color: transparent; }

@supports not (-webkit-text-stroke: 1px currentColor) {
  .step::before { color: var(--amb); }
}

.step h3 { margin-bottom: var(--sp-3); }
.step p { font-size: var(--fs-sm); color: var(--ink-soft); }

.band--deep .steps, .band--deep .steps > li { border-color: var(--rule-on-ink); }
.band--deep .step p { color: var(--on-ink-soft); }
.band--deep .step::before { -webkit-text-stroke-color: var(--amb-light); }
.band--deep .step.is-in::before { color: var(--amb-light); }


/* ==========================================================================
   15. RÉALISATIONS — préparé, NON AFFICHÉ EN V1
   --------------------------------------------------------------------------
   Le bloc HTML est en commentaire dans index.html, après le processus.
   Ces styles attendent de vraies photos de chantier.
   ========================================================================== */

.projects { display: grid; gap: 1px; background-color: var(--rule); }

@media (min-width: 700px)  { .projects { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .projects { grid-template-columns: repeat(3, 1fr); } }

.project { background-color: var(--paper); }
.project img { aspect-ratio: 4 / 3; width: 100%; object-fit: cover; }
.project__caption { padding: var(--sp-5) var(--sp-5) var(--sp-6); }


/* ==========================================================================
   16. FORMULAIRE
   --------------------------------------------------------------------------
   Champs réduits à une ligne soulignée. Le filet est en encre pleine :
   très au-dessus du minimum de 3:1 exigé pour un contour de champ.
   ========================================================================== */

.form { max-width: 40rem; }

.form__row { display: grid; gap: var(--sp-5); }

@media (min-width: 620px) { .form__row--split { grid-template-columns: 1fr 1fr; gap: var(--sp-6); } }

.form__field { position: relative; margin-bottom: var(--sp-6); }

.form__label {
  display: block;
  margin-bottom: var(--sp-2);
  font-size: var(--fs-label);
  font-weight: 600;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--ink-soft);
  transition: color var(--t);
}

.form__field:focus-within .form__label { color: var(--amb); }

.form__required { color: var(--amb); }

.form__control {
  display: block;
  width: 100%;
  min-height: 46px;
  padding: var(--sp-2) 0;
  border: 0;
  border-bottom: 1px solid var(--ink);
  border-radius: 0;
  background-color: transparent;
  font-family: inherit;
  font-size: var(--fs-lead);
  color: var(--ink);
  -webkit-appearance: none;
          appearance: none;
}

/* Gris chaud : le formulaire apparaît sur papier crème comme sur sable.
   #6A655C tient l'AA sur les deux fonds (5,6:1 et 5,1:1). */
.form__control::placeholder { color: #6A655C; }

.form__control:focus { outline: none; }

/* Filet d'accent qui se déplie sous le champ actif */
.form__field::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 2px;
  background-color: var(--amb);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--t-slow);
}

.form__field:focus-within::after { transform: scaleX(1); }

textarea.form__control { min-height: 7rem; resize: vertical; line-height: 1.5; font-size: var(--fs-body); }

select.form__control {
  cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%230F2B46' stroke-width='2' stroke-linecap='square'%3E%3Cpath d='m5 8 7 7 7-7'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 2px center;
  padding-right: var(--sp-6);
}

.form__control[aria-invalid="true"] { border-bottom-color: #A5291C; border-bottom-width: 2px; }

.form__error { display: none; margin-top: var(--sp-2); font-size: var(--fs-xs); font-weight: 500; color: #A5291C; }
.form__error.is-visible { display: block; }

.form__hint { margin-top: var(--sp-2); font-size: var(--fs-xs); color: var(--ink-soft); }

.form__foot { margin-top: var(--sp-7); }

.form__legal { margin-top: var(--sp-4); font-size: var(--fs-xs); color: var(--ink-soft); max-width: 52ch; }

/* Honeypot : hors écran plutôt que display:none — certains robots ignorent
   volontairement les champs masqués de cette manière. */
.form__hp { position: absolute !important; left: -9999px !important; width: 1px; height: 1px; overflow: hidden; }

.form__status {
  display: none;
  margin-top: var(--sp-5);
  padding: var(--sp-4) var(--sp-5);
  border-left: 2px solid var(--ink);
  background-color: var(--amb-wash);
  font-size: var(--fs-sm);
}

.form__status.is-visible { display: block; animation: fade-up 420ms cubic-bezier(0.16, 1, 0.3, 1); }

.form__status--success { border-left-color: var(--accent-ink); }
.form__status--error   { border-left-color: #A5291C; }

/* Sur aplat sombre (page contact) */
/* 0,55 et non 0,22 : le champ n'est identifiable que par son filet, qui
   doit donc atteindre 3:1 (ici 5,4:1). Le texte indicatif tient l'AA. */
.band--deep .form__control { border-bottom-color: rgba(255, 255, 255, 0.55); color: var(--on-ink); }
.band--deep .form__control::placeholder { color: rgba(255, 255, 255, 0.65); }
.band--deep .form__label { color: var(--on-ink-soft); }
.band--deep .form__field:focus-within .form__label { color: var(--amb-light); }
.band--deep .form__field::after { background-color: var(--amb-light); }
.band--deep .form__hint, .band--deep .form__legal { color: var(--on-ink-soft); }
.band--deep .form__status { background-color: rgba(255, 255, 255, 0.08); color: var(--on-ink); }
.band--deep select.form__control {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23FFFFFF' stroke-width='2' stroke-linecap='square'%3E%3Cpath d='m5 8 7 7 7-7'/%3E%3C/svg%3E");
}
.band--deep .form__control option { color: var(--ink); }

/* ---- Coordonnées ------------------------------------------------------- */
.contact-list { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--rule); }

.contact-list > li { border-bottom: 1px solid var(--rule); }

.contact-list a, .contact-list div {
  display: block;
  padding: var(--sp-5) 0;
  text-decoration: none;
  color: inherit;
  transition: padding-left var(--t), color var(--t);
}

.contact-list a:hover { padding-left: var(--sp-3); color: var(--amb); }

.contact-list .label { margin-bottom: var(--sp-2); }

.contact-list__value {
  display: block;
  font-size: var(--fs-h3);
  font-weight: 600;
  font-stretch: 96%;
  letter-spacing: -0.02em;
  word-break: break-word;
}

.contact-list__note { display: block; margin-top: var(--sp-2); font-size: var(--fs-xs); color: var(--ink-soft); }

.band--deep .contact-list, .band--deep .contact-list > li { border-color: var(--rule-on-ink); }
.band--deep .contact-list__note { color: var(--on-ink-soft); }
.band--deep .contact-list a:hover { color: var(--amb-light); }


/* ==========================================================================
   17. PAGES INTÉRIEURES ET DISPOSITIONS PARTICULIÈRES
   --------------------------------------------------------------------------
   Chaque page a sa composition d'ouverture. Elles ne se distinguent pas
   seulement par la couleur : la place du titre, la présence d'un panneau,
   la largeur de la colonne de lecture changent d'une page à l'autre.
   ========================================================================== */

.breadcrumb { padding-block: var(--sp-4); font-size: var(--fs-xs); color: var(--ink-soft); }

.breadcrumb ol { display: flex; flex-wrap: wrap; gap: var(--sp-3); list-style: none; margin: 0; padding: 0; }

.breadcrumb li::after { content: "/"; margin-left: var(--sp-3); color: var(--rule); }
.breadcrumb li:last-child::after { content: none; }
.breadcrumb a { color: inherit; text-decoration: none; }
.breadcrumb a:hover { color: var(--amb); }
.breadcrumb [aria-current="page"] { color: var(--ink); }

.band--deep .breadcrumb,
.band--deep .breadcrumb a,
.band--deep .breadcrumb li::after { color: var(--on-ink-soft); }
.band--deep .breadcrumb [aria-current="page"] { color: var(--on-ink); }

/* ⚠️  Les ouvertures de page (.opener) sont des aplats sombres SANS la
   classe .band--deep : la règle ci-dessus ne les couvrait pas, et le fil
   d'Ariane y descendait à 1,6:1 — illisible. La couleur claire doit donc
   être appliquée explicitement, en excluant .opener--paper qui, lui, est
   sur fond clair. */
.opener:not(.opener--paper) .breadcrumb,
.opener:not(.opener--paper) .breadcrumb a,
.opener:not(.opener--paper) .breadcrumb li::after { color: rgba(255, 255, 255, 0.82); }

.opener:not(.opener--paper) .breadcrumb [aria-current="page"] { color: var(--on-ink); }
.opener:not(.opener--paper) .breadcrumb a:hover { color: var(--amb-light); }

/* Sur l'ouverture éditoriale (fond papier), l'accent d'univers au survol */
.opener--paper .breadcrumb a:hover { color: var(--amb); }

/* ---- A. Ouverture « affiche » : titre géant sur aplat de couleur -------
   Employée par les pages services. Le titre occupe toute la largeur ; la
   trame de l'univers court derrière.                                     */
.opener {
  position: relative;
  isolation: isolate;
  padding-block: 0;
  border-top: 0;
  background-color: var(--amb-deep);
  color: var(--on-ink-soft);
  overflow: hidden;
}

.opener__inner { position: relative; z-index: 2; padding-block: clamp(2rem, 4vw, 3.5rem) clamp(3rem, 6vw, 5.5rem); }

.opener .mega { color: var(--on-ink); margin-block: clamp(1.5rem, 3vw, 2.5rem); }

.opener__meta {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-3) var(--sp-5);
  padding-bottom: var(--sp-4);
  border-bottom: 1px solid var(--rule-on-ink);
}

.opener__foot {
  display: grid;
  gap: var(--sp-6);
  padding-top: var(--sp-6);
  border-top: 1px solid var(--rule-on-ink);
}

@media (min-width: 900px) { .opener__foot { grid-template-columns: 1.1fr 1fr; align-items: end; } }

.opener__text { font-size: var(--fs-lead); line-height: 1.5; max-width: 44ch; }

/* Fond de l'ouverture : aplat de couleur + trame dessinée.
   PAS DE PHOTOGRAPHIE ICI. Un titre blanc suppose un voile très couvrant,
   qui ne laisse plus rien voir de l'image : la photo est donc affichée
   juste en dessous, dans une figure à sa taille (voir section 05 bis). */
.opener__bg { position: absolute; inset: 0; z-index: 0; overflow: hidden; }

/* ---- B. Ouverture « éditoriale » : titre sur papier, filet d'accent ----
   Employée par la page subventions et les mentions légales.             */
.opener--paper {
  background-color: var(--paper);
  color: var(--ink);
  border-bottom: 1px solid var(--rule);
}

.opener--paper .mega { color: var(--ink); }
.opener--paper .opener__meta, .opener--paper .opener__foot { border-color: var(--rule); }
.opener--paper .opener__text { color: var(--ink-soft); }
.opener--paper .label { color: var(--amb); }

/* ---- C. Ouverture « portrait » : colonne étroite, registre intime ------
   Employée par la page à propos.                                        */
.opener--intimate .opener__inner { max-width: 46rem; }
.opener--intimate .mega { font-size: clamp(2.5rem, 7vw, 5rem); }

/* ---- Sommaire latéral collant (page subventions) ----------------------- */
.aside-nav { border-top: 1px solid var(--rule); padding-top: var(--sp-4); }

@media (min-width: 1000px) { .aside-nav { position: sticky; top: calc(var(--header-h) + 2rem); } }

.aside-nav ol { list-style: none; margin: 0; padding: 0; counter-reset: toc; }

.aside-nav li { border-bottom: 1px solid var(--rule); }

.aside-nav a {
  display: flex; gap: var(--sp-4);
  padding: var(--sp-3) 0;
  font-size: var(--fs-sm);
  text-decoration: none;
  transition: padding-left var(--t), color var(--t);
}

.aside-nav a::before {
  counter-increment: toc;
  content: "0" counter(toc);
  color: var(--amb);
  font-weight: 600;
  font-size: var(--fs-label);
  letter-spacing: 0.1em;
  padding-top: 0.25em;
}

.aside-nav a:hover { padding-left: var(--sp-3); color: var(--amb); }

/* Section en cours de lecture, mise en évidence par le JS */
.aside-nav a.is-current { color: var(--amb); font-weight: 600; }

/* ---- Corps rédactionnel ------------------------------------------------ */
.prose { max-width: var(--measure); }

.prose h2 {
  margin-top: var(--sp-8);
  margin-bottom: var(--sp-4);
  padding-top: var(--sp-4);
  border-top: 1px solid var(--rule);
  font-size: var(--fs-h3);
  font-stretch: 100%;
  letter-spacing: -0.012em;
}

.prose h2:first-child { margin-top: 0; }
.prose h3 { margin-top: var(--sp-6); margin-bottom: var(--sp-3); }
.prose ul, .prose ol { margin: 0 0 1em; }
.prose li { margin-bottom: var(--sp-2); }

/* ---- Liste à coches ----------------------------------------------------- */
.checks { list-style: none; padding: 0; margin: 0; border-top: 1px solid var(--rule); }

.checks li {
  display: flex; align-items: flex-start; gap: var(--sp-4);
  padding: var(--sp-4) 0;
  border-bottom: 1px solid var(--rule);
  font-size: var(--fs-sm);
  transition: padding-left var(--t);
}

.checks li:hover { padding-left: var(--sp-3); }

.checks svg { flex-shrink: 0; margin-top: 4px; color: var(--amb); }

.band--deep .checks, .band--deep .checks li { border-color: var(--rule-on-ink); }
.band--deep .checks svg { color: var(--amb-light); }

/* ---- Contenu à venir ---------------------------------------------------
   Volontairement très visible : ne doit jamais atteindre la production. */
.todo {
  margin: var(--sp-5) 0;
  padding: var(--sp-5);
  border: 1px solid #C9A227;
  border-left-width: 3px;
  background-color: #FBF3DF;
  color: #5C4708;
  font-size: var(--fs-sm);
  max-width: var(--measure);
}

.todo__tag {
  display: inline-block;
  margin-bottom: var(--sp-3);
  padding: 3px var(--sp-3);
  background-color: #C9A227;
  color: #2E2200;
  font-size: var(--fs-label);
  font-weight: 700;
  letter-spacing: 0.11em;
  text-transform: uppercase;
}

.todo p { max-width: none; }
.todo ul { margin: var(--sp-3) 0 0; }

.pending { color: var(--ink-soft); box-shadow: inset 0 -1px 0 #C9A227; }

/* ---- FAQ ---------------------------------------------------------------- */
.faq { max-width: var(--measure); border-top: 1px solid var(--rule); }

.faq__item { border-bottom: 1px solid var(--rule); }

.faq__q {
  display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-5);
  padding: var(--sp-4) 0;
  font-size: var(--fs-h4);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
  transition: color var(--t), padding-left var(--t);
}

.faq__q::-webkit-details-marker { display: none; }

.faq__q:hover { color: var(--amb); padding-left: var(--sp-3); }

/* Signe + qui devient − : deux barres croisées dessinées en dégradés */
.faq__q::after {
  content: "";
  flex-shrink: 0;
  width: 13px; height: 13px;
  margin-top: 0.35em;
  background:
    linear-gradient(var(--amb), var(--amb)) center / 100% 1.5px no-repeat,
    linear-gradient(var(--amb), var(--amb)) center / 1.5px 100% no-repeat;
  transition: transform var(--t-slow);
}

.faq__item[open] .faq__q::after {
  background: linear-gradient(var(--amb), var(--amb)) center / 100% 1.5px no-repeat;
  transform: rotate(180deg);
}

.faq__a { padding-bottom: var(--sp-5); font-size: var(--fs-sm); color: var(--ink-soft); max-width: 58ch; }

.faq__item[open] .faq__a { animation: fade-up 380ms cubic-bezier(0.16, 1, 0.3, 1); }

/* ==========================================================================
   18. PIED DE PAGE
   ========================================================================== */

.footer { background-color: var(--ink); color: var(--on-ink-soft); font-size: var(--fs-sm); }

.footer a { color: inherit; text-decoration: none; transition: color var(--t); }
.footer a:hover { color: var(--on-ink); }

.footer__brand {
  display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between;
  gap: var(--sp-5);
  padding-block: var(--sp-7);
  border-bottom: 1px solid var(--rule-on-ink);
}

.footer__wordmark {
  font-size: clamp(1.75rem, 5vw, 3.5rem);
  font-weight: 700;
  font-stretch: 92%;
  letter-spacing: -0.035em;
  line-height: 1;
  text-transform: uppercase;
  color: var(--on-ink);
}

.footer__wordmark span { color: var(--accent-light); }

.footer__claim { max-width: 34ch; font-size: var(--fs-sm); }

.footer__cols { display: grid; gap: var(--sp-6); padding-block: var(--sp-7); }

@media (min-width: 760px) { .footer__cols { grid-template-columns: repeat(3, 1fr); gap: var(--sp-8); } }

.footer__title {
  margin-bottom: var(--sp-4);
  padding-bottom: var(--sp-3);
  border-bottom: 1px solid var(--rule-on-ink);
  font-size: var(--fs-label);
  font-weight: 600;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--on-ink);
}

.footer__list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-3); }

.footer__list a { display: inline-block; }
.footer__list a:hover { padding-left: 4px; }

.footer__big { display: block; font-size: var(--fs-h3); font-weight: 600; font-stretch: 96%; letter-spacing: -0.02em; color: var(--on-ink); }

/* Adresse : mention légale, jamais mise en avant */
.footer__address { font-style: normal; margin-top: var(--sp-5); font-size: var(--fs-xs); line-height: 1.6; color: rgba(255, 255, 255, 0.55); }

.footer__social { display: flex; gap: var(--sp-3); margin-top: var(--sp-5); }

.social-link {
  display: grid; place-items: center;
  width: 44px; height: 44px;  /* seuil tactile */
  border: 1px solid var(--rule-on-ink);
  transition: background-color var(--t), color var(--t);
}

.social-link:hover { background-color: var(--on-ink); color: var(--ink); }

.footer__social[hidden] { display: none; }

.footer__bottom {
  display: flex; flex-direction: column; gap: var(--sp-3);
  padding-block: var(--sp-5);
  border-top: 1px solid var(--rule-on-ink);
  font-size: var(--fs-xs);
  color: rgba(255, 255, 255, 0.6);
}

@media (min-width: 760px) { .footer__bottom { flex-direction: row; align-items: center; justify-content: space-between; } }


/* ==========================================================================
   19. MOUVEMENT : RÉVÉLATIONS ET TRANSITIONS
   --------------------------------------------------------------------------
   Toutes les règles de cette section sont conditionnées par la classe .js
   posée sur <html> par config.js. Sans JavaScript, rien n'est masqué : le
   contenu s'affiche normalement, il ne s'anime simplement pas.

   Les délais en cascade se pilotent depuis le HTML avec --i :
       <li style="--i:2">   →   2 × 70 ms de retard
   ========================================================================== */

.js [data-reveal] {
  opacity: 0;
  transform: translateY(1.75rem);
  transition: opacity 760ms cubic-bezier(0.16, 1, 0.3, 1),
              transform 760ms cubic-bezier(0.16, 1, 0.3, 1);
  transition-delay: calc(var(--i, 0) * 70ms);
}

.js [data-reveal].is-in { opacity: 1; transform: none; }

/* Variante : glissement latéral, pour les colonnes de côté */
.js [data-reveal="side"] { transform: translateX(-1.5rem); }

/* Variante : le panneau graphique se dévoile par un volet qui remonte */
.js [data-reveal="lines"] { opacity: 1; transform: none; }

.js [data-reveal="plate"] { opacity: 1; transform: none; clip-path: inset(100% 0 0 0); transition: clip-path 900ms cubic-bezier(0.16, 1, 0.3, 1); }
.js [data-reveal="plate"].is-in { clip-path: inset(0 0 0 0); }

@keyframes fade-up {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}

/* ---- Titres révélés ligne par ligne ------------------------------------
   Chaque ligne est enfermée dans un masque et remonte depuis le bas, avec
   un décalage. C'est le mouvement le plus visible du site : réservé aux
   grands titres, il perdrait tout effet s'il était appliqué partout.
   Le découpage en lignes est fait par main.js (§04 ter).             */
.line-mask { display: block; overflow: hidden; }

.line-mask > span {
  display: block;
  transform: translateY(105%);
  transition: transform 900ms cubic-bezier(0.16, 1, 0.3, 1);
  transition-delay: calc(var(--l, 0) * 90ms);
}

.is-in .line-mask > span,
.line-mask.is-in > span { transform: none; }

/* ---- Parallaxe du fond de hero -----------------------------------------
   Animation pilotée par le défilement, sans JavaScript. Ignorée par les
   navigateurs qui ne gèrent pas animation-timeline : l'image reste alors
   simplement fixe, ce qui est un repli parfaitement acceptable.      */
@supports (animation-timeline: view()) {
  .hero__bg img {
    animation: parallax linear both;
    animation-timeline: view();
    animation-range: entry 0% exit 100%;
  }
}

@keyframes parallax {
  from { transform: scale(1.12) translateY(-2.5%); }
  to   { transform: scale(1.12) translateY(2.5%); }
}

/* ---- Ligne de progression du processus ---------------------------------
   Un trait relie les quatre étapes et se remplit à mesure que la section
   défile : le visiteur voit littéralement le parcours avancer.       */
@media (min-width: 1024px) {
  .steps { position: relative; }

  .steps::before {
    content: "";
    position: absolute;
    top: 2rem;
    left: 0;
    height: 2px;
    width: 100%;
    background-color: var(--rule);
  }

  .steps::after {
    content: "";
    position: absolute;
    top: 2rem;
    left: 0;
    height: 2px;
    width: 100%;
    background-color: var(--amb);
    transform-origin: left;
    transform: scaleX(0);
  }

  .js .steps.is-in::after {
    transform: scaleX(1);
    transition: transform 1400ms cubic-bezier(0.16, 1, 0.3, 1) 200ms;
  }

  .band--deep .steps::before { background-color: var(--rule-on-ink); }
  .band--deep .steps::after { background-color: var(--amb-light); }
}

/* ---- Bandeau de texte défilant -----------------------------------------
   Rythme la page entre deux sections denses. Purement décoratif : le texte
   est répété et le second exemplaire masqué aux lecteurs d'écran.    */
.ticker {
  overflow: hidden;
  padding-block: var(--sp-5);
  border-block: 1px solid var(--rule);
  background-color: var(--amb-deep);
}

.ticker__track {
  display: flex;
  width: max-content;
  animation: marquee 42s linear infinite;
}

.ticker__group {
  display: flex;
  align-items: center;
  gap: clamp(1.5rem, 4vw, 3.5rem);
  padding-right: clamp(1.5rem, 4vw, 3.5rem);
  flex-shrink: 0;
}

.ticker__item {
  font-size: clamp(1.5rem, 3.4vw, 2.75rem);
  font-weight: 700;
  font-stretch: 92%;
  letter-spacing: -0.02em;
  color: var(--on-ink);
  white-space: nowrap;
}

.ticker__item--ghost {
  color: transparent;
  -webkit-text-stroke: 1px rgba(255, 255, 255, 0.45);
}

@supports not (-webkit-text-stroke: 1px currentColor) {
  .ticker__item--ghost { color: rgba(255, 255, 255, 0.45); }
}

.ticker__dot {
  width: 9px;
  height: 9px;
  background-color: var(--amb-light);
  flex-shrink: 0;
}

/* Transitions entre pages — ignorées par les navigateurs qui ne les
   gèrent pas, aucune dégradation. */
@view-transition { navigation: auto; }


/* ==========================================================================
   20. ACCESSIBILITÉ & MOUVEMENT RÉDUIT
   ========================================================================== */

:focus-visible { outline: 2px solid var(--amb); outline-offset: 3px; }

.band--deep :focus-visible,
.opener :focus-visible,
.footer :focus-visible { outline-color: var(--on-ink); }

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

  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }

  /* Aucune révélation : tout est visible d'emblée */
  .js [data-reveal],
  .js [data-reveal="side"],
  .js [data-reveal="plate"],
  .js [data-reveal="lines"] { opacity: 1; transform: none; clip-path: none; }
  .line-mask > span { transform: none; }

  /* Le bandeau marques devient une liste statique */
  .marquee__track { animation: none; width: 100%; flex-wrap: wrap; }
  .marquee__group[aria-hidden="true"] { display: none; }
  .marquee { -webkit-mask-image: none; mask-image: none; }
  .entry:hover .entry__media img { transform: none; }
  .header.is-hidden { transform: none; }
}

@media print {
  .header, .nav, .mobile-bar, .brands, .form { display: none; }
  .plate:not(:has(> img)) { display: none; }   /* trames décoratives seules */
  body { background: #FFF; color: #000; padding-bottom: 0; }
  .band--deep, .opener, .footer { background: #FFF !important; color: #000 !important; }
  .band--deep h2, .opener .mega { color: #000 !important; }
  a::after { content: " (" attr(href) ")"; font-size: 0.8em; }
}
