/* ═══════════════════════════════════════════════════════════════════════
   NICOLETTA ELECTRICITE — feuille de styles
   Contrat : DESIGN.md. Thème CLAIR. Motif signature : la ligne de crête.
   Les 3 palettes de la Phase 1bis vivent en variables : changer de
   direction = changer `data-dir` sur <html>, rien d'autre.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Palette — direction C « Poste avancé », choisie par Mourad le 2026-08-05.
   Les directions A et B sont écartées et ne reviennent pas (DESIGN.md §9). ── */
:root {
  --ink:        #0F2438;   /* bleu nuit alpin : titres, header, bandeaux d aplat */
  --ink-soft:   #173953;   /* survol des aplats ink */
  --accent:     #B87333;   /* cuivre — GRAPHIQUE seulement : crête, filets, survols */
  --accent-txt: #8F5722;   /* cuivre assombri — TEXTE de petit corps (eyebrow, liens) :
                              le cuivre clair ne passe pas AA sous 18 px */
  --accent-d:   #9C5F27;
  --accent-ink: #C9853F;   /* cuivre ÉCLAIRCI — texte de petit corps sur fond --ink.
                              Symétrique de --accent-txt : sur fond sombre il faut
                              monter, pas descendre. --accent brut n'y donne que
                              4,16 (AA exige 4,5 sous 18 px) ; celui-ci donne 5,2. */
  --paper:      #F5F7F9;
  --card:       #FFFFFF;
  --line:       #D8DFE6;
  --muted:      #5A6B7B;
}

:root {
  --fs-display: clamp(38px, 5.4vw, 84px);
  --fs-h2:      clamp(28px, 3.2vw, 46px);
  --fs-h3:      clamp(20px, 1.8vw, 26px);
  --fs-lead:    clamp(18px, 1.5vw, 21px);
  --radius:     4px;
  --radius-ui:  8px;
  --gap:        clamp(16px, 3vw, 32px);
  --maxw:       1240px;
  --pad:        clamp(16px, 4vw, 40px);
  --sec:        clamp(48px, 6vw, 96px);
}

/* ── Base ─────────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
  margin: 0;
  font-family: 'Work Sans', system-ui, -apple-system, sans-serif;
  font-size: 17px; line-height: 1.62;
  color: var(--ink); background: var(--paper);
  -webkit-font-smoothing: antialiased;
}
img, svg { max-width: 100%; display: block; }
img { height: auto; }
a { color: inherit; }
/* Work Sans est chargée en 400/500/600 : sans cette règle, un <b>/<strong> de
   texte courant demande 700, que le navigateur SYNTHÉTISE (faux gras baveux).
   600 est déjà la graisse d'emphase du site — même rendu, zéro octet en plus. */
b, strong { font-weight: 600; }
h1, h2, h3, h4 {
  font-family: 'Schibsted Grotesk', system-ui, sans-serif;
  margin: 0; letter-spacing: -.02em; text-wrap: balance; line-height: 1.08;
}
p { margin: 0; text-wrap: pretty; }
ul, ol { margin: 0; padding: 0; }
.tnum { font-feature-settings: 'tnum'; }
.wrap { max-width: var(--maxw); margin-inline: auto; padding-inline: var(--pad); }
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
:focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; }
/* ⛔ Pas de left:-9999px : ça crée un débordement horizontal réel, que le sweep
   du harnais mesure. Masquage par clip, qui n'occupe aucune place. */
.skip {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.skip:focus {
  position: fixed; left: 0; top: 0; z-index: 200; width: auto; height: auto;
  clip: auto; clip-path: none; background: var(--ink); color: #fff;
  padding: 12px 18px; border-radius: 0 0 var(--radius-ui) 0;
}

/* ── Boutons ──────────────────────────────────────────────────────────── */
.btn {
  /* ⛔ font-family: un <button class="btn"> n'hérite PAS de la police du body
     (défaut UA = Arial) : sans cette ligne, le bouton d'envoi du formulaire de
     contact sortait en Arial à côté de liens .btn identiques en Work Sans. */
  display: inline-block; text-decoration: none; font-family: inherit; font-weight: 600; font-size: 16px;
  padding: 15px 26px; border-radius: var(--radius-ui); border: 1px solid transparent;
  background: var(--ink); color: #fff; cursor: pointer; text-align: center;
  min-height: 44px;
  transition: background-color .18s ease-out, transform .12s ease-out;
}
.btn:hover { background: var(--ink-soft); }
.btn:active { transform: scale(.96); }
.btn--accent { background: var(--accent-d); }
.btn--accent:hover { background: #85501f; }
/* ⛔ Jamais deux boutons jumeaux : le téléphone est une ligne typographiée. */
.tel-line {
  font-weight: 600; font-size: 19px; text-decoration: none; white-space: nowrap;
  border-bottom: 2px solid var(--accent); padding-bottom: 2px;
  display: inline-block; min-height: 30px;
}

/* ── Motif signature : la ligne de crête ──────────────────────────────── */
.crest { display: block; }
.crest path { stroke: var(--accent); stroke-width: 3; fill: none; stroke-linejoin: bevel; }
.crest--sep { width: 100%; height: 18px; margin: var(--sec) 0 0; }
.crest--under { width: 230px; height: 30px; margin-top: 18px; }
@media (prefers-reduced-motion: no-preference) {
  .crest--under path { stroke-dasharray: 420; stroke-dashoffset: 420; animation: crest-draw .5s ease-out .15s forwards; }
}
@keyframes crest-draw { to { stroke-dashoffset: 0; } }

/* ── Header ───────────────────────────────────────────────────────────── */
.head { position: sticky; top: 0; z-index: 50; background: var(--ink); color: #fff; }
.head__bar {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 20px;
  min-height: 84px; max-width: var(--maxw); margin-inline: auto; padding-inline: var(--pad);
}
.head__word {
  font-family: 'Schibsted Grotesk', sans-serif; font-weight: 700; font-size: 19px;
  letter-spacing: .06em; text-align: center; text-decoration: none; line-height: 1.15; white-space: nowrap;
}
.head__word small {
  display: block; font-family: 'Work Sans', sans-serif; font-weight: 500; font-size: 10.5px;
  letter-spacing: .22em; color: var(--accent-ink); margin-top: 3px;
}
.nav a { color: #C7D4DF; }
.nav a:hover, .nav a[aria-current="page"] { color: #fff; }
.dd__btn { color: #C7D4DF; }
.dd__btn:hover, .dd[data-open="true"] .dd__btn { color: #fff; }
.head__tel { color: #fff; border-left-color: rgba(255,255,255,.22); }
.burger { background: transparent; border-color: rgba(255,255,255,.28); }
.burger span, .burger span::before, .burger span::after { background: #fff; }
.head__cta { background: var(--accent-d); }
.head__cta:hover { background: #85501f; }
.head__logo { max-height: 56px; width: auto; margin-inline: auto; }
.head__left { display: flex; align-items: center; gap: 14px; }
.head__right { display: flex; align-items: center; justify-content: flex-end; gap: 14px; }
.head__cta { display: none; }
.nav { display: flex; gap: 26px; align-items: center; font-size: 15px; font-weight: 500; list-style: none; }
.nav--right { justify-content: flex-end; }
.nav a {
  text-decoration: none; padding: 8px 0; border-bottom: 2px solid transparent;
  transition: border-color .18s ease-out, color .18s ease-out;
}
.nav a:hover, .nav a[aria-current="page"] { border-bottom-color: var(--accent); }
.head__tel {
  font-weight: 600; font-size: 15px; text-decoration: none; white-space: nowrap;
  border-left: 1px solid var(--line); padding-left: 20px; min-height: 44px;
  display: inline-flex; align-items: center;
}

/* Déroulant « Prestations » — passerelle DESCENDANTE, zéro vide de survol */
.dd { position: relative; }
.dd__btn {
  font: inherit; font-weight: 500; color: inherit; background: none; border: 0; cursor: pointer;
  padding: 8px 0; border-bottom: 2px solid transparent; display: inline-flex; align-items: center; gap: 7px;
  min-height: 44px;
  transition: border-color .18s ease-out;
}
.dd[data-open="true"] .dd__btn, .dd__btn:hover { border-bottom-color: var(--accent); }
.dd__btn::after {
  content: ""; width: 6px; height: 6px; border-right: 1.6px solid currentColor;
  border-bottom: 1.6px solid currentColor; transform: rotate(45deg) translate(-2px, -2px);
  transition: transform .16s ease-out;
}
.dd[data-open="true"] .dd__btn::after { transform: rotate(-135deg) translate(-3px, -3px); }
.dd__panel {
  position: absolute; top: calc(100% + 14px); left: -14px; min-width: 290px; z-index: 60;
  background: var(--card); border: 1px solid var(--line); border-radius: var(--radius-ui);
  box-shadow: 0 1px 2px rgba(0,0,0,.05), 0 14px 32px rgba(0,0,0,.13);
  padding: 8px; list-style: none;
  opacity: 0; visibility: hidden; transform: translateY(-4px);
  transition: opacity .16s ease-out, transform .16s ease-out, visibility .16s;
}
/* La passerelle appartient au PANNEAU : elle remonte couvrir le vide,
   donc le pointeur reste dans le sous-arbre pendant toute la descente. */
.dd__panel::before { content: ""; position: absolute; left: 0; right: 0; top: -16px; height: 16px; }
.dd[data-open="true"] .dd__panel { opacity: 1; visibility: visible; transform: translateY(0); }
/* ⛔ Le panneau est CLAIR alors que le header est foncé : sans cette règle les
   liens héritaient du gris clair de .nav a et tombaient à 1,51 de contraste sur
   fond blanc. Un audit qui ne mesure que l'état au repos ne voit jamais ça. */
.dd__panel a {
  display: block; padding: 11px 14px; border-radius: var(--radius); text-decoration: none;
  font-size: 15.5px; border-bottom: 0; color: var(--ink);
  transition: background-color .16s ease-out;
}
.dd__panel a:hover { color: var(--ink); }
.dd__panel a:hover { background: var(--paper); }
.dd__panel a span { display: block; font-size: 13.5px; color: var(--muted); margin-top: 2px; }

/* Burger + tiroir mobile — le tiroir reste enfant du header, sous lui dans
   l'ordre d'empilement (piège « burger enfermé par le header sticky »). */
.burger {
  display: none; width: 46px; height: 46px; border: 1px solid var(--line); border-radius: var(--radius-ui);
  background: var(--card); cursor: pointer; padding: 0; margin-right: 2px;
  align-items: center; justify-content: center;
}
.burger span { display: block; width: 20px; height: 2px; background: var(--ink); position: relative; }
.burger span::before, .burger span::after {
  content: ""; position: absolute; left: 0; width: 20px; height: 2px; background: var(--ink);
}
.burger span::before { top: -6px; } .burger span::after { top: 6px; }
.drawer { display: none; }

/* ── Sections & têtes de section ──────────────────────────────────────── */
.section { padding-block: var(--sec); }
.section--card { background: var(--card); }
.section--ink { background: var(--ink); color: #fff; }
/* ⛔ .lead manquait dans cette liste : var(--muted) (#5A6B7B) est calibrée pour
   les fonds CLAIRS, et restait appliquée au corps de texte des sections foncées
   → contraste 2.88 pour 4.5 exigé en AA. Même teinte que les voisins déjà
   traités (#BCC8D0), qui remonte à ~8.4. */
.section--ink .sec-head p, .section--ink .muted, .section--ink .lead { color: #BCC8D0; }
.eyebrow {
  font-size: 12px; letter-spacing: .2em; text-transform: uppercase; color: var(--muted);
  font-weight: 600; margin-bottom: 14px;
}
.section--ink .eyebrow { color: var(--accent-ink); }
/* Titre à gauche, chapô décalé en haut à droite : casse l'empilement centré. */
.sec-head > * { min-width: 0; }
.sec-head {
  display: grid; grid-template-columns: 1.15fr 1fr; gap: clamp(20px, 3vw, 48px);
  align-items: start; margin-bottom: clamp(26px, 3.4vw, 46px);
}
.sec-head h2 { font-size: var(--fs-h2); }
.sec-head p { font-size: var(--fs-lead); color: var(--muted); padding-top: 8px; }
.lead { font-size: var(--fs-lead); color: var(--muted); }

/* ── Liste-tableau des prestations (remplace la grille de 4 cartes) ───── */
.svclist { list-style: none; }
.svclist li:first-child .svc-row { border-top: 3px solid var(--accent); }
.svc-row {
  display: grid; align-items: center; gap: clamp(16px, 2.4vw, 34px);
  padding-block: clamp(16px, 2vw, 26px); border-top: 1px solid var(--line);
  text-decoration: none; color: inherit; transition: transform .18s ease-out;
}
.svc-row:hover { transform: translateX(6px); }
.svc-row:hover h3 { color: var(--accent-txt); }
.svc-row h3 { font-size: clamp(21px, 2.8vw, 40px); font-weight: 600; }
.svc-row p { font-size: 16px; color: var(--muted); margin-top: 6px; }
.svc-row__more {
  display: inline-block; margin-top: 8px; font-size: 13px; letter-spacing: .14em;
  text-transform: uppercase; font-weight: 600; color: var(--accent-txt);
}
.svc-row__thumb { overflow: hidden; border-radius: var(--radius); }
.svc-row__thumb img {
  width: 100%; aspect-ratio: 4/3; object-fit: cover;
  outline: 1px solid rgba(0,0,0,.09); outline-offset: -1px;
}
/* Largeurs INÉGALES : ce qui empêche de lire « une grille de 4 ». */
.svc-row--w1 { grid-template-columns: 1fr 300px; }
.svc-row--w2 { grid-template-columns: 1fr 200px; }
.svc-row--w3 { grid-template-columns: 1fr 258px; }
.svc-row--w4 { grid-template-columns: 1fr 232px; }

/* ── Zone d'intervention : le profil de crête ─────────────────────────── */
.zone { position: relative; }
/* ⛔ Ne JAMAIS remettre de `height` sur .zone__profil. Une hauteur fixe y a
   survécu à une refonte du bloc (le SVG portait autrefois ses <text>) : en
   dessous de 860 px les communes repassent en flux normal, le conteneur les
   gardait à 150 px et la liste débordait de 190 px PAR-DESSUS le paragraphe
   « Également… ». Invisible au rapport DOM (overflow: visible, aucun scroll).
   Le conteneur épouse le SVG, dont la hauteur est portée par .zone__ridge. */
.zone__reste { margin-top: 20px; font-size: 15.5px; color: var(--muted); }
.zone__reste b { color: var(--ink); font-weight: 600; }

/* ── Bandeau CTA asymétrique (⛔ jamais centré + 2 boutons) ────────────── */
.ctaband { background: var(--ink); color: #fff; }
.ctaband__inner {
  display: grid; grid-template-columns: 1.5fr 1fr; gap: clamp(24px, 4vw, 64px); min-width: 0;
  align-items: center; padding-block: clamp(40px, 5vw, 72px);
}
.ctaband h2 { font-size: var(--fs-h2); }
.ctaband p { color: #BCC8D0; margin-top: 14px; font-size: var(--fs-lead); }
.ctaband__acts { display: flex; flex-direction: column; gap: 16px; align-items: flex-start; }
.ctaband .tel-line { color: #fff; }

/* ── Blocs de faits / citations (pages service, à-propos) ─────────────── */
/* Même règle que .points : le filet appartient à la cellule, pas au fond de la
   grille — sinon 4 cellules sur 3 colonnes (vers 900 px) laissent un aplat
   gris orphelin sur le 4e emplacement. */
.facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); gap: 2px; background: transparent; }
.facts > div { min-width: 0; overflow-wrap: anywhere; }
.facts > div { background: var(--card); padding: clamp(20px, 2.4vw, 30px); box-shadow: 0 0 0 1px var(--line); }
.facts > div:nth-child(odd) { background: var(--paper); }   /* aplat : signal §5bis */
.facts dt { font-size: 12px; letter-spacing: .18em; text-transform: uppercase; color: var(--muted); font-weight: 600; }
.facts dd { margin: 8px 0 0; font-family: 'Schibsted Grotesk', sans-serif; font-size: clamp(26px, 2.8vw, 42px); font-weight: 600; }
.facts dd small { display: block; font-family: 'Work Sans', sans-serif; font-size: 15px; font-weight: 400; color: var(--muted); margin-top: 6px; }
/* ⛔ Un numéro de téléphone ne se coupe jamais. Au corps des faits (jusqu'à
   42 px) « 06 07 93 98 93 » ne tenait pas dans une colonne de 290 px et
   repartait à la ligne sur les deux derniers chiffres — sur la page Contact,
   c'est-à-dire à l'endroit exact où on le lit pour appeler. */
.facts dd .tnum { white-space: nowrap; font-size: clamp(22px, 2.1vw, 30px); display: inline-block; }

.quotes { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr)); gap: clamp(16px, 2vw, 24px); }
.quote { min-width: 0; }
.quote { border-left: 3px solid var(--accent); padding: 4px 0 4px 20px; }
.quote q { display: block; font-family: 'Schibsted Grotesk', sans-serif; font-size: clamp(19px, 1.7vw, 23px); font-weight: 600; font-style: normal; }
.quote p { margin-top: 10px; color: var(--muted); font-size: 16px; }

/* ── Blocs légaux : filet d'accent + aplat alterné (signaux 3 et 4 du §5bis) ── */
.legal { display: grid; gap: clamp(18px, 2.4vw, 28px); max-width: 78ch; }
.legal > section {
  border-left: 3px solid var(--accent);
  padding: clamp(16px, 2vw, 24px) clamp(16px, 2vw, 26px);
  background: var(--card);
}
.legal > section:nth-child(even) { background: transparent; border-left-color: var(--line); }
.legal h2 { font-size: var(--fs-h3); }
.legal p { margin-top: 12px; }
.legal p + p { margin-top: 10px; }

/* ── Formulaire ───────────────────────────────────────────────────────── */
/* Un <input> a une largeur min-content propre (attribut `size` implicite) : sans
   min-width:0 il refuse de se comprimer et fait déborder sa colonne de grille. */
.form { display: grid; gap: 16px; min-width: 0; }
.form__row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; min-width: 0; }
.field { display: grid; gap: 6px; min-width: 0; }
.field input, .field select, .field textarea { min-width: 0; width: 100%; max-width: 100%; }
.field label { font-size: 14px; font-weight: 600; }
.field input, .field select, .field textarea {
  font: inherit; font-size: 16px; padding: 13px 14px; border: 1px solid var(--line);
  border-radius: var(--radius-ui); background: var(--card); color: var(--ink); min-height: 46px;
  transition: border-color .16s ease-out;
}
.field input:focus, .field select:focus, .field textarea:focus { border-color: var(--accent); }
.field textarea { min-height: 130px; resize: vertical; }
.form__state { background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius-ui); padding: 14px 16px; font-size: 15px; }

/* ── Média : image + texte, sans carte arrondie ombrée (interdit 5/9) ──── */
.media { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(24px, 4vw, 56px); align-items: center; }
.media > * { min-width: 0; }
.media--wide { grid-template-columns: 1.4fr 1fr; }
.media img { border-radius: var(--radius); outline: 1px solid rgba(0,0,0,.09); outline-offset: -1px; }
.fullbleed { position: relative; min-height: clamp(280px, 40vh, 440px); overflow: hidden; }
.fullbleed img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }

/* ── Footer CLAIR (⛔ le corpus est 9/9 en footer sombre) ──────────────── */
.foot { background: var(--card); border-top: 1px solid var(--line); }
.foot__crest { width: 100%; height: 40px; opacity: .35; }
.foot__crest path { stroke: var(--accent); stroke-width: 3; fill: none; stroke-linejoin: bevel; }
.foot__nap {
  display: flex; flex-wrap: wrap; gap: 10px 40px; align-items: baseline;
  padding-block: 26px; border-bottom: 1px solid var(--line); font-size: 15.5px; color: var(--muted);
}
.foot__nap b { color: var(--ink); font-weight: 600; }
.foot__nap a { text-decoration: none; }
.foot__nap a:hover { color: var(--accent-txt); }
.foot__links { display: flex; flex-wrap: wrap; gap: 12px 28px; padding-block: 22px; font-size: 15px; list-style: none; }
.foot__links a { text-decoration: none; }
.foot__links a:hover { color: var(--accent-txt); }
/* Wordmark en TRÈS GRAND en pied de page (doctrine logo-client §3) */
.foot__word {
  font-family: 'Schibsted Grotesk', sans-serif; font-weight: 700;
  font-size: clamp(30px, 7.4vw, 96px); letter-spacing: -.03em; line-height: .95;
  padding-block: clamp(20px, 3vw, 40px) clamp(24px, 3vw, 40px); color: var(--ink);
}
.foot__logo { max-width: min(420px, 80%); margin-block: clamp(20px, 3vw, 40px); }
.foot__legal { border-top: 1px solid var(--line); padding-block: 18px; font-size: 13.5px; color: var(--muted); }

/* ── Responsive ───────────────────────────────────────────────────────── */
@media (max-width: 1000px) {
  .sec-head { grid-template-columns: 1fr; }
  .ctaband__inner { grid-template-columns: 1fr; }
  .media, .media--wide { grid-template-columns: 1fr; }
  .svc-row--w1, .svc-row--w2, .svc-row--w3, .svc-row--w4 { grid-template-columns: 1fr 180px; }
}
@media (max-width: 860px) {
  .head__bar { grid-template-columns: 1fr auto; min-height: 68px; padding-inline: 16px; }
  .head__left { display: none; }
  .nav, .head__tel { display: none; }
  .burger { display: flex; }
  .head__cta { display: inline-block; }
  .head__word { text-align: left; font-size: 16px; justify-self: start; }
  .head__word small { letter-spacing: .16em; font-size: 9.5px; }
  .head__logo { max-height: 44px; margin-inline: 0; }
  .head__cta { font-size: 14px; padding: 11px 15px; }
  .drawer {
    display: block; position: absolute; top: 100%; left: 0; right: 0;
    background: var(--card); border-bottom: 1px solid var(--line);
    box-shadow: 0 16px 30px rgba(0,0,0,.14);
    max-height: 0; overflow: hidden; visibility: hidden;
    transition: max-height .22s ease-out, visibility .22s;
  }
  .drawer[data-open="true"] { max-height: 78vh; overflow-y: auto; visibility: visible; }
  .drawer ul { list-style: none; padding: 8px 16px 20px; }
  /* ⛔ `color` OBLIGATOIRE ici. Le tiroir est un enfant de .head, qui porte
     color:#fff pour le bandeau bleu nuit — mais le tiroir, lui, est sur fond
     blanc. Sans cette ligne, « Accueil », « À propos » et « Contact » sortaient
     en BLANC SUR BLANC : trois lignes vides dans le seul menu du mobile. Les
     autres liens s'en sortaient par accident (.sub en --muted, le téléphone en
     --accent-txt, le devis sur aplat ink), d'où un panneau qui « s'ouvre »
     correctement pour le harnais et reste amputé pour l'utilisateur. */
  .drawer a {
    display: block; padding: 14px 4px; text-decoration: none; font-size: 17px; font-weight: 500;
    border-bottom: 1px solid var(--line); min-height: 44px; color: var(--ink);
  }
  .drawer .sub a { padding-left: 18px; font-size: 15.5px; font-weight: 400; color: var(--muted); }
  .drawer .drawer__tel { font-weight: 600; color: var(--accent-txt); border-bottom: 0; padding-top: 18px; font-size: 20px; }
  .drawer .drawer__devis {
    border-bottom: 0; margin-top: 10px; background: var(--ink); color: #fff;
    text-align: center; border-radius: var(--radius-ui); font-weight: 600;
  }
  .form__row { grid-template-columns: 1fr; }
  .svc-row--w1, .svc-row--w2, .svc-row--w3, .svc-row--w4 { grid-template-columns: 1fr; }
  .svc-row__thumb { order: -1; max-width: 340px; }
  .svc-row:hover { transform: none; }
}
/* Le header mobile ne tient pas à trois éléments sous 430 px : le bouton devis
   sort, il reste le wordmark et le burger. Le devis reste atteignable dans le
   tiroir et juste sous le hero, donc rien n'est perdu côté conversion. */
@media (max-width: 560px) {
  .head__cta { padding: 10px 13px; font-size: 13.5px; }
  .head__word { font-size: 15px; }
  .head__word small { font-size: 9px; letter-spacing: .12em; }
}
@media (max-width: 430px) {
  .head__cta { display: none; }
  .head__word { font-size: 15.5px; }
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
  .svc-row:hover { transform: none; }
}

/* ═══════════════════════════════════════════════════════════════════════
   DIRECTION C — « Poste avancé » (choisie 2026-08-05, DESIGN.md §9)
   Le texte n'est JAMAIS posé sur la photo : il vit dans un panneau clair
   ancré en bas à droite, qui déborde hors grille.
   ═══════════════════════════════════════════════════════════════════════ */

/* Ligne de crête en bordure basse du header — motif signature, présent sur
   toutes les pages. ⛔ Ce n'est pas un schéma technique : c'est de la
   géographie, comme une carte de zone (design-artisan-btp §7). */
.head__crest { position: absolute; left: 0; right: 0; bottom: -1px; height: 14px; overflow: hidden; line-height: 0; }
.head__crest svg { width: 100%; height: 14px; }
.head__crest path { stroke: var(--accent); stroke-width: 3; fill: none; stroke-linejoin: bevel; }
.head { position: sticky; }

/* ── Hero immersif ─────────────────────────────────────────────────────── */
.hero { position: relative; min-height: clamp(430px, 72vh, 660px); display: flex; align-items: flex-end; }
.hero__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 42%; }
/* ⛔ `max-width: var(--maxw)` seul recollait le panneau au bord de l'écran dès
   que la fenêtre passait sous 1240 px (padding-right: 0 + justify-content:
   flex-end) : marge droite mesurée à 0 px de 861 à 1240 px. Et à 1440 px il
   s'arrêtait PILE sur la grille, donc il n'en débordait pas non plus.
   Le rail déborde de 56 px hors grille tant que la fenêtre le permet, et
   garde toujours --pad de marge au bord. */
.hero__panelwrap {
  position: relative; width: 100%;
  max-width: min(100% - var(--pad) * 2, calc(var(--maxw) + 56px));
  margin-inline: auto;
  padding: clamp(80px, 12vh, 140px) 0 clamp(22px, 3vw, 40px) var(--pad);
  display: flex; justify-content: flex-end;
}
.hero__panel {
  background: var(--paper); padding: clamp(24px, 2.8vw, 40px) clamp(22px, 2.6vw, 38px);
  max-width: min(580px, 100%); border-radius: var(--radius-ui) 0 0 var(--radius-ui);
  box-shadow: 0 1px 2px rgba(15,36,56,.10), 0 14px 34px rgba(15,36,56,.20);
}
.hero__panel h1 { font-size: clamp(26px, 2.9vw, 42px); }
.hero__panel .lead { margin-top: 14px; }
.hero__acts { margin-top: 22px; display: flex; flex-wrap: wrap; align-items: center; gap: 14px 22px; }
/* Réglette de zone en pied de hero */
.hero__rail { background: var(--ink); color: #C3D0DB; font-size: 14.5px; }
.hero__rail .inner {
  max-width: var(--maxw); margin-inline: auto; padding: 13px var(--pad);
  display: flex; flex-wrap: wrap; gap: 8px 22px; align-items: baseline;
}
.hero__rail b { color: #fff; font-weight: 600; }

/* Variante d'en-tête des pages intérieures : même grammaire, plus basse. */
.hero--page { min-height: clamp(300px, 46vh, 440px); }
.hero--page .hero__panel { max-width: min(620px, 100%); }
.hero--page .hero__panel h1 { font-size: clamp(25px, 2.6vw, 38px); }

/* ── Bloc de faits : aplat alterné + gros corps (signaux 2 et 3, §5 bis) ── */
.section--ink .facts { background: transparent; }
.section--ink .facts > div { background: var(--ink); box-shadow: 0 0 0 1px rgba(255,255,255,.14); }
.section--ink .facts > div:nth-child(odd) { background: var(--ink-soft); }
.section--ink .facts dt { color: #9FB2C2; }
.section--ink .facts dd { color: #fff; }
.section--ink .facts dd small { color: #BCC8D0; }

/* ── Liste de points couverts (pages service) ──────────────────────────────
   ⛔ Les filets viennent des CELLULES, jamais du fond du conteneur. Avec
   `background: var(--line)` sur la grille, une dernière rangée incomplète
   (6 cellules sur 4 colonnes) laissait voir l'aplat gris du conteneur sur
   deux emplacements : un rectangle vide de 586 px de large qui se lit comme
   un bloc cassé. Le halo de 1 px de chaque cellule rejoint celui de sa
   voisine à travers le gap de 2 px — filet continu, et rien dans les vides. */
.points { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); gap: 2px; background: transparent; }
.points li { min-width: 0; }
.points li { list-style: none; background: var(--card); padding: clamp(18px, 2vw, 26px); box-shadow: 0 0 0 1px var(--line); }
.points li:nth-child(even) { background: var(--paper); }
.points li b { display: block; font-family: 'Schibsted Grotesk', sans-serif; font-size: clamp(19px, 1.7vw, 23px); font-weight: 600; }
.points li span { display: block; margin-top: 7px; color: var(--muted); font-size: 15.5px; }

/* ── Questions-réponses ouvertes (⛔ jamais un accordéon : 3/9 dans le corpus) ── */
.qr { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr)); gap: clamp(20px, 2.6vw, 36px); }
.qr > div { min-width: 0; }
.qr > div { border-top: 3px solid var(--accent); padding-top: 18px; }
.qr h3 { font-size: clamp(18px, 1.5vw, 21px); }
.qr p { margin-top: 10px; color: var(--muted); }

/* ── Cross-sell entre pages service ────────────────────────────────────── */
.cross { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); gap: clamp(16px, 2vw, 24px); }
.cross a { min-width: 0; overflow-wrap: anywhere; }
.cross a {
  display: block; text-decoration: none; background: var(--card); border: 1px solid var(--line);
  border-left: 3px solid var(--accent); border-radius: var(--radius); padding: clamp(18px, 2vw, 24px);
  transition: transform .18s ease-out, border-color .18s ease-out;
}
.cross a:hover { transform: translateY(-3px); }
.cross a b { display: block; font-family: 'Schibsted Grotesk', sans-serif; font-size: var(--fs-h3); font-weight: 600; }
.cross a span { display: block; margin-top: 6px; color: var(--muted); font-size: 15.5px; }

@media (max-width: 860px) {
  .hero { min-height: clamp(400px, 62vh, 520px); }
  .hero__panelwrap { padding-left: var(--pad); padding-right: var(--pad); padding-top: clamp(140px, 26vh, 240px); }
  .hero__panel { max-width: 100%; border-radius: var(--radius-ui); }
  .hero--page { min-height: clamp(280px, 42vh, 380px); }
  .hero--page .hero__panelwrap { padding-top: clamp(110px, 20vh, 180px); }
}

/* ── Zone : les communes posées LE LONG du profil de crête ──────────────────
   ⛔ Anti-convergence : le corpus électricien a déjà brûlé le nuage de
   pastilles, la liste en 2 colonnes à filets et la carte à cercles
   concentriques (DESIGN.md §2). Ici les communes sont à des HAUTEURS
   différentes, comme des cotes d'altitude sur un profil. */
.zone__profil { position: relative; margin-top: 8px; }
.zone__ridge { width: 100%; height: clamp(150px, 19vw, 240px); }
.zone__ridge path { stroke: var(--accent); stroke-width: 3; fill: none; stroke-linejoin: bevel; }
.zone__pts { position: absolute; inset: 0; list-style: none; }
.zone__pts li { position: absolute; left: var(--x); top: var(--y); transform: translate(-50%, -100%); }
.zone__pts span {
  display: block; white-space: nowrap; font-size: clamp(12px, 1.05vw, 15px); font-weight: 600;
  background: var(--paper); padding: 3px 9px; border-radius: 4px; border: 1px solid var(--line);
}
.zone__pts li::after {
  content: ""; position: absolute; left: 50%; top: 100%; width: 1px; height: 14px;
  background: var(--line); transform: translateX(-50%);
}
.section--card .zone__pts span { background: var(--card); }

@media (max-width: 860px) {
  /* Le profil se redresse : chaque commune garde sa hauteur propre sous forme
     de retrait, l'idée de cote d'altitude survit sans texte illisible. */
  .zone__ridge { height: 80px; }
  .zone__pts { position: static; display: grid; gap: 6px; margin-top: 18px; }
  .zone__pts li { position: static; transform: none; margin-left: calc(var(--y) * .55); }
  .zone__pts li::after { display: none; }
  .zone__pts span { display: inline-block; }
}

/* ── Bloc de prose : filet d'accent + premier paragraphe porté ──────────────
   Ce n'est pas un bloc d'arguments, mais le gate check-blocs-nus a raison
   de refuser 3 cellules égales de texte nu : on pose un signal (§5 bis). */
.prose { max-width: 74ch; border-left: 3px solid var(--accent); padding-left: clamp(18px, 2.2vw, 30px); }
.prose p { margin-top: 18px; }
.prose p:first-child { margin-top: 0; font-size: var(--fs-lead); }
.prose p:not(:first-child) { color: var(--muted); }

/* ── Bande photo de la zone d'intervention ─────────────────────────────────
   Le hameau sous crête calcaire des Alpes du Sud : c'est le paysage réel de
   Péone, et c'est ce qui ancre l'angle « maisons de montagne » du site. */
.zone__bande { margin: 0 0 clamp(20px, 2.6vw, 34px); border-radius: var(--radius); overflow: hidden; }
.zone__bande img {
  width: 100%; aspect-ratio: 21/7; object-fit: cover; object-position: center 55%;
  outline: 1px solid rgba(0,0,0,.09); outline-offset: -1px;
}
@media (max-width: 700px) { .zone__bande img { aspect-ratio: 16/9; } }

/* ── Bandeau CTA : photo de fond + voile, texte blanc par-dessus ───────────
   Le voile monte à .82 côté texte : aucun texte ne se pose sur une photo nue. */
.ctaband { position: relative; isolation: isolate; overflow: hidden; }
.ctaband__fond {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  object-position: center 60%; z-index: -2;
}
.ctaband::before {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(100deg, rgba(15,36,56,.94) 0%, rgba(15,36,56,.88) 46%, rgba(15,36,56,.62) 100%);
}
@media (max-width: 1000px) {
  .ctaband::before { background: rgba(15,36,56,.90); }
}
