/* =====================================================================
   desle.immo · assets/v2/site.css · fondation visuelle v2 (16/10/2026)
   Une seule feuille pour les pages migrées vers v2 (l'accueil d'abord).
   Les autres pages gardent assets/shared/site.css : n'y rien changer.
   Charte gardée : Ink #101418, Paper #F4F5F8, Lagon #159E91 (accent
   unique), gris #5E6470, filets .12 / .18, Space Grotesk + IBM Plex Mono,
   rayon 2 px. Polices : assets/shared/fonts.css, chargée à part.
   Lagon sur papier = 3,0:1 : réservé aux grands titres, filets, icônes.
   Le petit texte reste en Ink (16,9:1) ou en gris (5,4:1).
   Tout ce qui bouge est sous prefers-reduced-motion: no-preference et
   html.js ; sans JS ou en mouvement réduit, l'état final est visible.
   Ordre : jetons · base · typo · gabarit · header · sous-menu · menu ·
   langues · section/eyebrow/croix · grille · visuels/pictos · boutons ·
   liens · pastilles · chiffres · marquee · hero · carte · frise ·
   portrait · faits · appel · FAQ · formulaire · rappel · pied · barre
   mobile · rail · chorégraphie · secours d'affichage · tactile.
   ===================================================================== */

@view-transition{navigation:auto}
@property --di-angle{syntax:'<angle>';inherits:false;initial-value:0deg}

/* ── Jetons ───────────────────────────────────────────────────────── */
:root{
  --ink:#101418;
  --paper:#F4F5F8;
  --lagon:#159E91;
  --gray:#5E6470;
  --hair:rgba(16,20,24,.12);
  --hair-strong:rgba(16,20,24,.18);
  --blanc:#FFFFFF;
  /* rôles : redéfinis localement par .di-encre (bloc Ink) */
  --fond:var(--paper);
  --fond-survol:#FAFBFC;
  --texte:var(--ink);
  --sourd:var(--gray);
  --filet:var(--hair);
  --filet-fort:var(--hair-strong);
  --croix:rgba(16,20,24,.42);
  --accent:var(--lagon);
  --voile:rgba(244,245,248,.86);
  /* polices */
  --font:'Space Grotesk',-apple-system,system-ui,'Segoe UI',Roboto,sans-serif;
  --mono:'IBM Plex Mono',ui-monospace,Consolas,'Courier New',monospace;
  /* forme et mouvement */
  --radius:2px;
  --ease:cubic-bezier(.16,1,.3,1);
  --ease-trace:cubic-bezier(.76,0,.24,1);
  /* gabarit */
  --header-h:60px;
  --eyebrow-h:38px;
  --rail-l:56px;        /* colonne du rail (règle graduée + nom vertical) */
  --rail-gap:14px;      /* entre l'index des sections et la colonne du rail */
  --rail-index:160px;   /* largeur FIXE de l'index (≥ 1200 px) : une étiquette trop longue est tronquée (ellipse), jamais élargie ;
                           plus de remesure JS, donc le même bord droit du contenu sur toutes les pages et pas de CLS */
  --reserve-d:var(--rail-l);   /* réserve à droite du contenu quand le rail est là */
  --gouttiere:16px;
  --wrap:1200px;
  /* échelle typographique fluide */
  --fs-h1:clamp(2.375rem,1.2rem + 3.1vw,3.875rem);
  --fs-h2:clamp(1.875rem,1.2rem + 2.3vw,3rem);
  --fs-h2-xl:clamp(2rem,1.25rem + 2.9vw,3.5rem);
  --fs-h3:clamp(1.25rem,1.1rem + .55vw,1.625rem);
  --fs-lead:clamp(1.0625rem,.98rem + .4vw,1.25rem);
  --fs-corps:1.0625rem;
  --fs-mono:11px;       /* étiquettes mono : 11 px sur mobile (plancher), 12 px sur bureau (≥ 960 px) */
  color-scheme:light;
}
@media (min-width:720px){:root{--gouttiere:32px}}
@media (min-width:960px){:root{--gouttiere:40px;--header-h:64px;--fs-mono:12px}}
/* ≥ 1200 px, l'index des sections du rail est affiché : la réserve l'inclut (largeur fixe), plus 24 px d'air */
@media (min-width:1200px){:root{--reserve-d:calc(var(--rail-l) + var(--rail-gap) + var(--rail-index) + 24px)}}

/* bloc Ink (estimation) : mêmes composants, rôles inversés */
.di-encre{
  --fond:var(--ink);
  --fond-survol:#161B21;
  --texte:var(--paper);
  --sourd:#A3A9B4;
  --filet:rgba(244,245,248,.14);
  --filet-fort:rgba(244,245,248,.26);
  --croix:rgba(244,245,248,.5);
  --voile:rgba(16,20,24,.86);
}

/* ── Base ─────────────────────────────────────────────────────────── */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-padding-top:var(--header-h)}
/* pas de scroll-behavior:smooth global : il rendait doux (et interruptible par les
   sections content-visibility qui se redimensionnent) tout défilement programmé,
   y compris scrollTo(0,0). Les ancres de la page sont adoucies par choreo.js (d). */
body{margin:0;min-height:100vh;min-height:100dvh;padding-top:var(--header-h);background:var(--paper);color:var(--ink);font:400 var(--fs-corps)/1.55 var(--font);overflow-x:clip;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
a{color:inherit;text-decoration:none}
h1,h2,h3,h4,p,ul,ol,dl,dd,figure,blockquote{margin:0}
ul,ol{padding:0;list-style:none}
b,strong{font-weight:600}
img,svg,video,canvas{display:block;max-width:100%}
img{height:auto}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
input,select,textarea{font:inherit;font-size:max(16px,1rem);color:inherit}
:focus-visible{outline:2px solid var(--texte);outline-offset:3px}
::selection{background:var(--lagon);color:var(--blanc)}
[hidden]{display:none!important}
.di-vh{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}
.di-saut{position:fixed;left:8px;top:-80px;z-index:600;padding:12px 16px;background:var(--ink);color:var(--paper);font:500 .9375rem/1 var(--font);border-radius:var(--radius)}
.di-saut:focus{top:8px}

/* ── Typo : Space Grotesk 600 titres, Plex Mono étiquettes ─────────── */
.di-mono{font-family:var(--mono);font-size:var(--fs-mono);font-weight:400;line-height:1.45;letter-spacing:.12em;text-transform:uppercase;font-variant-numeric:tabular-nums}
.di-sourd{color:var(--sourd)}
.di-h1{font-family:var(--font);font-size:var(--fs-h1);font-weight:600;line-height:1.02;letter-spacing:-.035em;color:var(--texte)}
.di-h1 .di-ligne{display:block;text-wrap:balance}
.di-h2{font-family:var(--font);font-size:var(--fs-h2);font-weight:600;line-height:1.06;letter-spacing:-.03em;color:var(--texte);text-wrap:balance}
.di-h2--xl{font-size:var(--fs-h2-xl);line-height:1.04;letter-spacing:-.035em}
.di-h3{font-family:var(--font);font-size:var(--fs-h3);font-weight:600;line-height:1.18;letter-spacing:-.02em;color:var(--texte);text-wrap:balance}
.di-accent{color:var(--accent)}
.di-lead{font-size:var(--fs-lead);line-height:1.6;color:var(--sourd);max-width:50ch;text-wrap:pretty}
.di-texte{font-size:1rem;line-height:1.62;color:var(--sourd);text-wrap:pretty}
.di-texte + .di-texte{margin-top:1em}

/* ── Gabarit : colonne centrée ; à droite, la réserve du rail ────────
   960–1199 px : rail seul (règle + nom vertical), réserve = --rail-l.
   ≥ 1200 px : + index des sections empilé à droite (façon ArtCraft),
   réserve = rail + écart + index + air. Le header ne réserve que la
   colonne du rail : l'index commence sous lui. */
.di-wrap{position:relative;width:min(var(--wrap),100% - 2 * var(--gouttiere));margin-inline:auto}
.di-page{display:block}
@media (min-width:960px){
  /* La réserve du rail est posée d'EMBLÉE, sans condition : le :has() « 3e section » d'avant attendait que
     le HTML arrive jusque-là ; un premier rendu qui le précédait faisait glisser tout le contenu de
     254 px (CLS aléatoire). Seule exception, une page de moins de 3 sections titrées (donc sans rail) :
     <main class="di-page di-sans-rail"> (mentions légales). */
  .di-page,.di-pied{padding-right:var(--reserve-d)}
  .di-header__in{padding-right:calc(var(--gouttiere) + var(--rail-l))}
  :root:has(main.di-sans-rail) .di-page,:root:has(main.di-sans-rail) .di-pied{padding-right:0}
  :root:has(main.di-sans-rail) .di-header__in{padding-right:var(--gouttiere)}
}

/* ── Header : nav à plat ≥ 960 px, burger dessous ──────────────────── */
.di-header{position:fixed;top:0;left:0;right:0;z-index:60;isolation:isolate;height:var(--header-h);background:var(--voile);-webkit-backdrop-filter:saturate(1.2) blur(12px);backdrop-filter:saturate(1.2) blur(12px);border-bottom:1px solid var(--hair);color:var(--ink)}
.di-header__in{height:100%;display:flex;align-items:center;gap:8px;padding:0 var(--gouttiere)}
.di-logo{display:inline-flex;align-items:center;min-height:44px;font:600 19px/1 var(--font);letter-spacing:-.02em;color:var(--ink);white-space:nowrap}
.di-logo span{color:var(--lagon)}
.di-header__vide{flex:1}
.di-nav{display:none}
@media (min-width:960px){.di-nav{display:block;margin-left:20px}}
.di-nav > ul{display:flex;align-items:center;gap:2px}
.di-nav a,.di-nav__sous > button{display:inline-flex;align-items:center;gap:6px;min-height:40px;padding:0 10px;font-family:var(--mono);font-size:var(--fs-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--gray);border-radius:var(--radius);transition:background-color .25s,color .25s}
@media (hover:hover){.di-nav a:hover,.di-nav__sous > button:hover{color:var(--ink)}}
.di-nav a[aria-current],.di-nav__sous.is-actif > button{background:var(--ink);color:var(--paper)}
@media (hover:hover){.di-nav a[aria-current]:hover,.di-nav__sous.is-actif > button:hover{color:var(--paper)}}
/* CTA masqué sous 360 px : le burger reste dans la fenêtre à 320 px (le CTA est aussi dans le menu).
   Sélecteur à 2 classes : .di-btn (plus bas) posait display:inline-flex et gagnait sur ce masquage. */
.di-header .di-header__cta{display:none}
@media (min-width:360px){.di-header .di-header__cta{display:inline-flex}}
@media (min-width:960px){.di-header .di-burger{display:none}}
@media (min-width:960px) and (max-width:1099px){.di-nav a,.di-nav__sous > button{padding:0 7px;letter-spacing:.08em}}

/* sous-menu Communes : clic, Échap, clic dehors (choreo.js) ; survol en CSS */
.di-nav__sous{position:relative}
.di-nav__sous > button svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .25s var(--ease)}
.di-nav__sous.is-ouvert > button svg{transform:rotate(180deg)}
.di-nav__liste{display:none;position:absolute;left:0;top:100%;min-width:300px;padding-top:12px;z-index:5;isolation:isolate}
/* filets PLEINS (mélange Ink 12 % sur papier) : avec var(--hair), translucide, les lettres du h1 passaient entre les liens */
.di-nav__liste ul{display:grid;gap:1px;padding:1px;background:#D7D9DD;background:color-mix(in srgb,var(--ink) 12%,var(--paper));border-radius:var(--radius)}
.di-nav .di-nav__liste a{display:flex;width:100%;min-height:44px;padding:0 14px;background:var(--paper);border-radius:0;color:var(--ink);font:500 .9375rem/1.2 var(--font);letter-spacing:0;text-transform:none}
@media (hover:hover){.di-nav .di-nav__liste a:hover{background:var(--blanc)}}
.di-nav .di-nav__liste a[aria-current]{background:var(--ink);color:var(--paper)}
.di-nav__sous.is-ouvert .di-nav__liste{display:block}
@media (hover:hover){.di-nav__sous:hover .di-nav__liste{display:block}}
html:not(.di-choreo) .di-nav__sous:focus-within .di-nav__liste{display:block}

/* bouton icône (burger, fermer) */
.di-icone{display:inline-grid;place-items:center;width:44px;height:44px;flex:none;border:1px solid var(--hair);border-radius:var(--radius);color:var(--ink);touch-action:manipulation;transition:border-color .25s,background-color .25s,scale .12s}
.di-icone:active{scale:.94}
.di-icone svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
@media (hover:hover){.di-icone:hover{border-color:var(--hair-strong);background:var(--blanc)}}

/* ── Menu burger : popover natif plein écran (pages puis sections) ── */
.di-menu{display:none;position:fixed;inset:0;width:100%;max-width:none;height:100vh;height:100dvh;max-height:none;margin:0;padding:0;border:0;background:var(--paper);color:var(--ink);overflow-y:auto;overscroll-behavior:contain;flex-direction:column}
.di-menu:popover-open{display:flex}
.di-menu.is-ouvert{display:flex;z-index:300}
.di-menu::backdrop{background:transparent}
@media (prefers-reduced-motion:no-preference){.di-menu:popover-open{animation:di-menu-entre .35s var(--ease)}}
@keyframes di-menu-entre{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.di-menu__haut{flex:none;height:var(--header-h);display:flex;align-items:center;justify-content:space-between;padding:0 var(--gouttiere);border-bottom:1px solid var(--hair)}
.di-menu__corps{flex:1;display:grid;align-content:start;gap:32px;padding:24px var(--gouttiere) calc(28px + env(safe-area-inset-bottom,0px))}
.di-menu__nav{display:grid;gap:10px;align-content:start}
.di-menu__nav > .di-pastille{justify-self:start;margin-top:12px}
.di-menu__nav > .di-pastille:first-child{margin-top:0}
.di-menu__pages{border-top:1px solid var(--hair)}
.di-menu__pages a{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:52px;padding:0 4px;border-bottom:1px solid var(--hair);font:600 clamp(1.375rem,1.1rem + 1.3vw,1.875rem)/1.1 var(--font);letter-spacing:-.025em}
.di-menu__pages--sous a{min-height:46px;padding-left:22px;font-size:1.0625rem;font-weight:500;letter-spacing:-.01em}
.di-menu__pages a[aria-current],.di-menu__sections a.is-actif{background:var(--ink);color:var(--paper);padding-inline:10px}
.di-menu__pages--sous a[aria-current]{padding-left:22px}
.di-menu__sections{display:grid;gap:10px;align-content:start}
.di-menu__sections > .di-pastille{justify-self:start}
.di-menu__sections ol{border-top:1px solid var(--hair)}
.di-menu__sections a{display:flex;align-items:center;gap:14px;min-height:48px;padding:0 4px;border-bottom:1px solid var(--hair);color:var(--gray)}
.di-menu__sections a .di-mono{color:var(--gray)}
.di-menu__sections a.is-actif .di-mono{color:inherit}
.di-menu__pied{display:flex;flex-wrap:wrap;align-items:center;gap:8px 20px}
.di-menu__pied a:not(.di-btn){display:inline-flex;align-items:center;min-height:44px;font:500 13px/1 var(--mono);letter-spacing:.04em;color:var(--ink)}
html.di-menu-ouvert{overflow:hidden}
@media (min-width:720px){
  .di-menu__corps{grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);column-gap:56px}
  .di-menu__pied{grid-column:1 / -1}
}

/* ── Sélecteur de langue (dormant par défaut, voir chrome.js) ──────── */
.di-langs{display:flex;align-items:center;margin-right:6px;font-family:var(--mono);font-size:12px;letter-spacing:.08em}
.di-langs button{min-height:44px;padding:0;margin:0;max-width:0;overflow:hidden;opacity:0;pointer-events:none;white-space:nowrap;color:var(--gray);transition:max-width .4s var(--ease),margin .4s var(--ease),opacity .28s ease,color .22s ease}
@media (hover:hover){.di-langs button:hover{color:var(--ink)}}
.di-langs[data-open="false"] button[aria-pressed="true"]{max-width:3.5em;opacity:1;pointer-events:auto;color:var(--ink)}
.di-langs[data-open="false"] button[aria-pressed="true"]::after{content:"";display:inline-block;width:4px;height:4px;margin-left:6px;vertical-align:middle;background:var(--lagon)}
.di-langs[data-open="true"] button{max-width:3.5em;opacity:1;margin-left:12px;pointer-events:auto}
.di-langs[data-open="true"] button:first-child{margin-left:0}
.di-langs[data-open="true"] button[aria-pressed="true"]{color:var(--ink)}

/* ── Section chorégraphiée : guides, eyebrow collant, croix ───────── */
.di-section{position:relative;background:var(--fond);color:var(--texte)}
.di-section__corps{position:relative;z-index:1;padding:clamp(48px,7vw,104px) 0 clamp(56px,8vw,120px)}
.di-guides{position:absolute;inset:0;pointer-events:none;z-index:0}
.di-guide{position:absolute;top:0;bottom:0;width:1px;background:var(--filet);transform-origin:top}
.di-guide--g{left:0}
.di-guide--d{right:0}
/* sections sous le pli : rendu différé ; hauteur estimée par --cv-h (bureau) et --cv-h-m (< 960 px) */
.di-section:not(.di-hero){content-visibility:auto;contain-intrinsic-size:auto var(--cv-h,1000px)}
@media (max-width:959px){.di-section:not(.di-hero){contain-intrinsic-size:auto var(--cv-h-m,var(--cv-h,1200px))}}

.di-eyebrow{position:sticky;top:var(--header-h);z-index:20;background:var(--voile);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}
.di-eyebrow__filet{position:absolute;left:0;right:0;height:1px;background:var(--filet);transform-origin:left;pointer-events:none}
.di-eyebrow__filet--h{top:0}
.di-eyebrow__filet--b{bottom:0}
.di-eyebrow__ligne{display:flex;align-items:center;justify-content:space-between;gap:20px;height:var(--eyebrow-h);color:var(--sourd)}
.di-eyebrow__g{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--texte)}
.di-eyebrow__g b{font-weight:500}
.di-eyebrow__g b::before{content:"";display:inline-block;width:6px;height:6px;margin-right:10px;vertical-align:1px;background:var(--accent)}
.di-eyebrow__d{white-space:nowrap}
@media (max-width:719px){.di-eyebrow__d{display:none}}
@media (max-width:419px){.di-eyebrow__g{letter-spacing:.07em}}

/* croix 11 × 11 px aux intersections de filets */
.di-croix{position:absolute;width:11px;height:11px;z-index:3;pointer-events:none}
.di-croix::before,.di-croix::after{content:"";position:absolute;background:var(--croix)}
.di-croix::before{left:0;right:0;top:5px;height:1px}
.di-croix::after{top:0;bottom:0;left:5px;width:1px}
.di-croix--hg{left:-5px;top:-5px}
.di-croix--hd{right:-5px;top:-5px}
.di-croix--bg{left:-5px;bottom:-5px}
.di-croix--bd{right:-5px;bottom:-5px}

.di-tete{display:grid;gap:20px;max-width:54rem;margin-bottom:clamp(36px,5vw,60px)}
.di-tete .di-lead{max-width:60ch}

/* ── Grille jointive : gap 1 px = filet, coins 2 px, pas d'ombre ──── */
.di-cadre{position:relative;container-type:inline-size}
.di-cadre + .di-cadre{margin-top:clamp(32px,4vw,56px)}
.di-grille{display:grid;grid-template-columns:minmax(0,1fr);gap:1px;padding:1px;background:var(--filet);border-radius:var(--radius);overflow:clip}
.di-cellule{position:relative;display:flex;flex-direction:column;min-width:0;background:var(--fond);color:var(--texte);transition:background-color .3s}
@media (hover:hover){a.di-cellule:hover,.di-cellule--survol:hover{background:var(--fond-survol)}}
.di-cellule--toute{grid-column:1 / -1}
.di-pad{padding:clamp(22px,2.8vw,36px)}
.di-pad > * + *{margin-top:14px}
.di-pad > .di-cellule__bas{margin-top:auto;padding-top:22px}
.di-pad:has(> .di-cellule__bas){display:flex;flex-direction:column;flex:1}
.di-num{display:flex;align-items:center;gap:10px;font:500 12px/1 var(--mono);letter-spacing:.12em;color:var(--texte)}
.di-num::after{content:"";flex:1;height:1px;background:var(--filet)}
.di-grille--4{grid-template-columns:repeat(2,minmax(0,1fr))}
@container (min-width:600px){
  .di-grille--2,.di-grille--3{grid-template-columns:repeat(2,minmax(0,1fr))}
  .di-grille--3 > :last-child:nth-child(odd):not(.di-cellule--toute){grid-column:1 / -1}
  .di-grille--3 > :last-child:nth-child(odd):not(.di-cellule--toute) .di-visuel{aspect-ratio:21 / 8}
  .di-grille--3 > :last-child:nth-child(odd):not(.di-cellule--toute) .di-visuel--photo{aspect-ratio:auto}
  .di-grille--4{grid-template-columns:repeat(4,minmax(0,1fr))}
}
/* cellule photo étalée sur deux colonnes (600–899 px) : recadrage panoramique */
@container (min-width:600px) and (max-width:899.98px){
  .di-grille--3 > :last-child:nth-child(odd):not(.di-cellule--toute) .di-visuel--photo > img{aspect-ratio:21 / 9}
}
@container (min-width:900px){
  .di-grille--3{grid-template-columns:repeat(3,minmax(0,1fr))}
  .di-grille--3 > :last-child:nth-child(odd):not(.di-cellule--toute){grid-column:auto}
  .di-grille--3 > :last-child:nth-child(odd):not(.di-cellule--toute) .di-visuel{aspect-ratio:4 / 3}
  .di-grille--3 > :last-child:nth-child(odd):not(.di-cellule--toute) .di-visuel--photo{aspect-ratio:auto}
}

/* ── Visuels : emplacement d'image (IA plus tard), picto en attendant ─ */
.di-visuel{position:relative;display:grid;place-items:center;aspect-ratio:4 / 3;margin:0;overflow:hidden;background-color:var(--fond);background-image:radial-gradient(var(--filet-fort) 1px,transparent 1.4px);background-size:18px 18px;background-position:9px 9px;border-bottom:1px solid var(--filet)}
.di-visuel > img,.di-visuel > picture,.di-visuel > picture > img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.di-visuel .di-picto{position:relative;z-index:1;width:min(46%,180px);height:auto}
.di-visuel figcaption{position:absolute;left:12px;right:12px;bottom:10px;z-index:2;display:flex;justify-content:space-between;gap:12px;color:var(--sourd)}
.di-visuel--carre{aspect-ratio:1}
/* variante photo : le ratio vient des attributs width/height de l'<img> (3:4),
   le picto se dessine dans un cartouche, la légende passe en pastille en haut */
.di-visuel--photo{display:block;aspect-ratio:auto;background-image:none}
.di-visuel.di-visuel--photo > img{position:relative;inset:auto;display:block;width:100%;height:auto;object-fit:cover}
.di-visuel__picto{position:absolute;right:12px;bottom:12px;z-index:2;display:grid;place-items:center;width:76px;height:76px;background:var(--fond);border:1px solid var(--filet);border-radius:var(--radius)}
.di-visuel .di-visuel__picto .di-picto{width:56px;height:56px;stroke-width:2.1}
.di-visuel--photo figcaption{left:12px;right:auto;top:12px;bottom:auto;padding:6px 9px;background:var(--fond);border:1px solid var(--filet);border-radius:var(--radius);color:var(--texte)}

/* pictos au trait : un seul trait d'accent (.di-picto__a) par picto */
.di-picto{display:block;fill:none;stroke:var(--texte);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;overflow:visible}
.di-picto .di-picto__a{stroke:var(--accent)}
.di-picto--s{width:52px;height:52px;stroke-width:2.2}
.di-picto--m{width:72px;height:72px;stroke-width:1.9}

/* ── Icônes Lucide (lucide.dev, ISC) : tools/icones.mjs → svg.di-icone ──
   Seule famille d'icônes du site (pictos dessinés main retirés le 17/10). Trait 1,5
   dans la grille 24 et couleur currentColor portés par le <svg> : Ink sur papier,
   Lagon sur fond Ink. Le bouton icône du header s'appelle aussi .di-icone (burger,
   fermer) : svg.di-icone annule ses styles de bouton (cadre, fond, survol, appui).
   Tailles : 1,25em par défaut (texte, bouton), --l 32 px (cellules, jalons), --xl 48 px
   (cartouche photo, têtes d'étape), --visuel (emplacement d'image : grand format,
   trait affiné pour garder environ 3 px à l'écran). Tracé : choreo.js (data-draw-svg). */
svg.di-icone{display:inline-block;width:1.25em;height:1.25em;flex:none;vertical-align:middle;border:0;border-radius:0;background:none;color:inherit;overflow:visible}
svg.di-icone:active{scale:none}
@media (hover:hover){svg.di-icone:hover{background:none}}
svg.di-icone--l{width:32px;height:32px}
svg.di-icone--xl{width:48px;height:48px}
svg.di-icone--visuel{position:relative;z-index:1;width:min(46%,180px);height:auto;stroke-width:.45}
svg.di-icone--sourd{color:var(--sourd)}
.di-pad > svg.di-icone{display:block}
.di-encre svg.di-icone{color:var(--accent)}

/* ── Boutons : carrés, rayon 2 px, cible ≥ 44 px ──────────────────── */
.di-btns{display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px}
.di-btn{position:relative;isolation:isolate;display:inline-flex;align-items:center;justify-content:center;gap:12px;min-height:52px;padding:0 26px;border:1px solid var(--ink);border-radius:var(--radius);background:var(--ink);color:var(--paper);font:500 1rem/1 var(--font);white-space:nowrap;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:background-color .25s,color .25s,border-color .25s,scale .12s ease}
.di-btn:active{scale:.97}
.di-btn__fleche{display:inline-block;transition:transform .3s var(--ease)}
/* survol (souris seulement) : inversion, la flèche glisse */
@media (hover:hover){
  .di-btn:hover{background:transparent;color:var(--ink)}
  .di-btn:hover .di-btn__fleche{transform:translateX(4px)}
}
.di-btn--petit{min-height:40px;padding:0 14px;gap:8px;font-size:.875rem}
.di-btn--fantome{background:transparent;color:var(--texte);border-color:var(--filet-fort)}
@media (hover:hover){.di-btn--fantome:hover{background:var(--texte);color:var(--fond);border-color:var(--texte)}}
/* sur fond Ink : bouton papier, survol Lagon (Ink sur Lagon = 5,6:1) */
.di-btn--clair{background:var(--paper);border-color:var(--paper);color:var(--ink)}
@media (hover:hover){.di-btn--clair:hover{background:var(--lagon);border-color:var(--lagon);color:var(--ink)}}
.di-btn--bloc{width:100%}
/* CTA principal (un seul par page) : anneau conique Lagon, discret */
.di-btn--cta::before{content:"";position:absolute;inset:-5px;z-index:-1;border-radius:calc(var(--radius) + 3px);padding:1.5px;background:conic-gradient(from var(--di-angle),rgba(21,158,145,0) 0deg,var(--lagon) 60deg,rgba(21,158,145,0) 130deg,rgba(21,158,145,0) 180deg,var(--lagon) 240deg,rgba(21,158,145,0) 310deg);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;pointer-events:none}
@media (prefers-reduced-motion:no-preference){.di-btn--cta::before{animation:di-tourne 12s linear infinite}}
@keyframes di-tourne{to{--di-angle:360deg}}

/* ── Liens : souligné (texte) et lien mono « ↗ » ─────────────────── */
.di-souligne{position:relative;display:inline-flex;align-items:center;gap:8px;min-height:44px;font-weight:500;color:var(--texte)}
.di-souligne::before,.di-souligne::after{content:"";position:absolute;left:0;right:0;bottom:9px;height:1px;transform-origin:left}
.di-souligne::before{background:var(--filet-fort)}
.di-souligne::after{background:var(--accent);transform:scaleX(0);transition:transform .45s var(--ease-trace)}
@media (hover:hover){.di-souligne:hover::after{transform:none}}
.di-souligne:focus-visible::after{transform:none}
.di-lien{display:inline-flex;align-items:center;gap:10px;min-height:44px;font:500 12px/1.3 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--texte)}
.di-lien__fl{display:inline-grid;place-items:center;flex:none;width:24px;height:24px;border:1px solid var(--filet-fort);border-radius:var(--radius);font-size:12px;letter-spacing:0;transition:transform .3s var(--ease),background-color .3s,color .3s,border-color .3s}
@media (hover:hover){
  .di-lien:hover .di-lien__fl,a.di-cellule:hover .di-lien__fl{background:var(--texte);border-color:var(--texte);color:var(--fond);transform:translate(2px,-2px)}
}

/* ── Pastilles mono majuscules ────────────────────────────────────── */
.di-pastille{display:inline-flex;align-items:center;gap:8px;min-height:28px;padding:4px 10px;border:1px solid var(--filet-fort);border-radius:var(--radius);font:500 var(--fs-mono)/1.2 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--texte);white-space:nowrap;font-variant-numeric:tabular-nums}
.di-pastille::before{content:"";flex:none;width:6px;height:6px;background:var(--accent)}
.di-pastille--nu::before{display:none}
.di-pastilles{display:flex;flex-wrap:wrap;gap:8px}

/* ── Chiffres (compteurs [data-compte]) ───────────────────────────── */
.di-chiffre{display:grid;align-content:space-between;gap:18px;min-height:128px;padding:clamp(18px,2.4vw,26px)}
.di-chiffre__n{font:500 clamp(1.75rem,1.4rem + 1.4vw,3rem)/1 var(--mono);font-size:clamp(1.75rem,4.4cqi,3rem);letter-spacing:-.05em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--texte)}
.di-chiffre__n--mot{font:600 clamp(1.625rem,1.25rem + 1.5vw,2.5rem)/1 var(--font);font-size:clamp(1.625rem,3.8cqi,2.5rem);letter-spacing:-.03em}
.di-chiffre__l{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;color:var(--sourd)}
.di-chiffre__l .di-lien__fl{margin-top:-4px;color:var(--texte)}

/* ── Bandeau défilant (marquee) des communes ───────────────────────
   choreo.js copie .di-marquee__piste juste après elle et pose
   --marquee-duree ; l'animation (0 → -50 %) est sur le parent. ────── */
.di-marquee{position:relative;display:block;overflow:hidden;border-block:1px solid var(--hair);background:var(--paper);-webkit-mask:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent);mask:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent)}
.di-marquee__defile{display:flex;width:max-content}
.di-marquee__piste{display:flex;flex:none;align-items:center;margin:0;padding:0;list-style:none}
.di-marquee__piste li{display:flex;align-items:center;flex:none}
.di-marquee__piste a{display:inline-flex;align-items:center;min-height:64px;padding:0 22px;font:600 clamp(1.125rem,.95rem + .7vw,1.5rem)/1 var(--font);letter-spacing:-.02em;color:var(--ink);white-space:nowrap}
@media (hover:hover){.di-marquee__piste a:hover{text-decoration:underline;text-decoration-color:var(--lagon);text-decoration-thickness:2px;text-underline-offset:6px}}
.di-marquee__sep{color:var(--lagon);font-size:11px;line-height:1}
@media (prefers-reduced-motion:no-preference){
  .di-marquee__defile:has(> [data-marquee-clone]){animation:di-marquee var(--marquee-duree,60s) linear infinite}
  .di-marquee:hover .di-marquee__defile,.di-marquee:focus-within .di-marquee__defile{animation-play-state:paused}
}
@media (prefers-reduced-motion:reduce){
  .di-marquee{overflow-x:auto;-webkit-mask:none;mask:none}
  .di-marquee__defile{animation:none!important}
}
@keyframes di-marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* ── 00 Hero : titre pleine largeur, puis texte (5/12) | carte (7/12),
   puis la bande de chiffres. La zone est large (89 × 41 km) : ratio
   ≈ 2,12, la carte prend donc la colonne la plus large. ────────────── */
.di-hero .di-section__corps{padding-top:clamp(36px,6vw,80px);padding-bottom:clamp(48px,6vw,88px)}
.di-hero__grille{display:grid;grid-template-columns:minmax(0,1fr);grid-template-areas:"titre" "texte" "carte" "chiffres";gap:36px clamp(32px,4vw,56px)}
.di-hero__titre{grid-area:titre}
.di-hero__texte{grid-area:texte;display:grid;gap:28px;align-content:start}
.di-hero__carte{grid-area:carte}
.di-hero__chiffres{grid-area:chiffres}
/* liens secondaires : une seule ligne, chaque lien insécable ; sous 480 px, une colonne propre */
.di-hero__liens{display:flex;flex-wrap:wrap;gap:0 14px}
.di-hero__liens a{white-space:nowrap}
@media (max-width:479.98px){.di-hero__liens{flex-direction:column;align-items:flex-start;gap:0}}
@media (min-width:1080px){
  /* colonne du texte ≥ 456 px : les trois liens secondaires (≈ 425 px + 2 × 14 px) tiennent sur une ligne */
  .di-hero__grille{grid-template-columns:minmax(456px,5.5fr) minmax(0,6.5fr);grid-template-areas:"titre titre" "texte carte" "chiffres chiffres";row-gap:28px;align-items:center}
  .di-hero__cadre{padding:clamp(8px,.9vw,14px)}
}
/* accueil : hero resserré (marges, h1 plafonné à 54 px, bandeau de chiffres plus bas de plafond) pour que
   les quatre chiffres entrent dans l'écran à 1440 × 900 et 1280 × 800 */
#accueil .di-section__corps{padding-top:clamp(28px,3.2vw,44px);padding-bottom:clamp(40px,5vw,72px)}
#accueil .di-hero__titre{font-size:clamp(2.375rem,1.2rem + 3.1vw,3.375rem)}
@media (min-width:1080px){#accueil .di-hero__chiffres .di-chiffre{min-height:100px;gap:12px}}

/* ── Carte filaire (module assets/v2/carte-wapi.*) : place réservée ─
   carte-wapi.css (chargée après) fait foi ; ce repli garde la même
   hauteur si le module manque (ratio réel de la zone, 1028 × 484,7). */
.di-hero__carte{position:relative;margin:0}
.di-hero__cadre{position:relative;padding:clamp(10px,1.4vw,18px);border:1px solid var(--hair);border-radius:var(--radius);background:var(--paper)}
.di-carte{position:relative;display:block;width:100%;aspect-ratio:var(--di-carte-ratio,2.121);background:var(--paper)}
.di-carte:empty{background-image:radial-gradient(var(--hair) 1px,transparent 1.4px);background-size:18px 18px;background-position:9px 9px}
.di-hero__legende{display:flex;justify-content:space-between;gap:12px;padding:10px 2px 0;color:var(--gray)}

/* ── Frise du temps (.di-frise, choreo.js) ───────────────────────────
   Trait tracé au défilement (jusqu'à 62 % de l'écran), jalons allumés
   au passage, compteurs mono. Verticale partout. */
.di-frise{--fr-pad:clamp(16px,3vw,40px);--fr-q:0px;--fr-r:32px;--fr-n:clamp(1.375rem,1.05rem + 1.3vw,2rem);position:relative;padding:clamp(28px,3.6vw,48px) var(--fr-pad) 4px}
.di-frise__trait{position:absolute;left:calc(var(--fr-pad) + var(--fr-q) + var(--fr-r) / 2);top:calc(clamp(28px,3.6vw,48px) + var(--fr-n) / 2);bottom:48px;width:1px;margin-left:-.5px;background:var(--filet-fort);pointer-events:none}
.di-frise__plein{position:absolute;inset:0;display:block;background:var(--accent);transform-origin:top}
.di-frise__tete{position:absolute;left:-4px;top:-4px;display:block;width:9px;height:9px;background:var(--accent);box-shadow:0 0 0 4px rgba(21,158,145,.16);opacity:0;transition:opacity .4s}
.di-frise__liste{display:grid}
.di-frise__item{position:relative;display:grid;grid-template-columns:var(--fr-r) minmax(0,1fr);column-gap:14px;padding-bottom:clamp(32px,3.8vw,52px)}
.di-frise__noeud{grid-column:1;grid-row:1;justify-self:center;position:relative;z-index:1;width:13px;height:13px;margin-top:calc(var(--fr-n) / 2 - 6.5px);border:1px solid var(--accent);background:var(--accent);transform:rotate(45deg);transition:background-color .3s,border-color .3s}
.di-frise__item--fin .di-frise__noeud{display:grid;place-items:center;width:22px;height:22px;margin-top:calc(var(--fr-n) / 2 - 11px);border-radius:50%;background:var(--fond);transform:none}
.di-frise__noeud svg{width:12px;height:12px;fill:none;stroke:var(--accent);stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}
.di-frise__noeud svg path{stroke-dasharray:1;stroke-dashoffset:0}
.di-frise__quand{grid-column:2;grid-row:1;display:grid;gap:8px;align-content:start;justify-items:start}
.di-frise__n{font:500 var(--fr-n)/1 var(--mono);letter-spacing:-.02em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--texte)}
.di-frise__l{color:var(--sourd)}
.di-frise__quoi{grid-column:2;grid-row:2;display:grid;gap:12px;justify-items:start;max-width:38rem;margin-top:18px;transition:opacity .6s var(--ease),transform .6s var(--ease)}
@container (min-width:760px){
  .di-frise{--fr-q:17rem;--fr-r:64px}
  .di-frise__item{grid-template-columns:var(--fr-q) var(--fr-r) minmax(0,1fr);column-gap:0}
  .di-frise__quand{grid-column:1;justify-items:end;text-align:right;padding-right:6px}
  .di-frise__noeud{grid-column:2}
  .di-frise__quoi{grid-column:3;grid-row:1;margin-top:0;padding-left:6px}
}

/* ── Portrait réel ────────────────────────────────────────────────── */
.di-portrait{position:relative;margin:0;aspect-ratio:4 / 5;overflow:hidden;background:var(--paper)}
.di-portrait::before{content:"";position:absolute;left:0;right:0;top:0;height:2px;z-index:2;background:var(--lagon);transform-origin:left}
.di-portrait img{width:100%;height:100%;object-fit:cover;object-position:50% 20%}
.di-portrait figcaption{position:absolute;left:0;right:0;bottom:0;z-index:2;padding:34px 18px 14px;color:var(--blanc);background:linear-gradient(to top,rgba(16,20,24,.68),rgba(16,20,24,0))}
.di-portrait figcaption::before{content:"";display:inline-block;width:6px;height:6px;margin-right:10px;vertical-align:1px;background:var(--lagon)}

/* ── Faits (liste de chiffres sous un texte) ──────────────────────── */
.di-faits{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border-top:1px solid var(--filet)}
.di-faits > div{display:flex;flex-direction:column;gap:8px;padding:18px 16px 18px 0;border-bottom:1px solid var(--filet)}
.di-faits > div + div{padding-left:16px;border-left:1px solid var(--filet)}
.di-faits dt{order:2;color:var(--sourd)}
.di-faits dd{order:1;font:500 clamp(1.5rem,1.2rem + 1.2vw,2.125rem)/1 var(--mono);letter-spacing:-.04em;font-variant-numeric:tabular-nums;color:var(--texte);white-space:nowrap}
.di-faits dd.di-faits__mot{font:600 clamp(1.25rem,1.05rem + .8vw,1.625rem)/1.1 var(--font);letter-spacing:-.02em;white-space:normal}

/* gabarits de sections */
.di-duo{display:grid;grid-template-columns:minmax(0,1fr);gap:clamp(32px,5vw,72px);align-items:center}
@media (min-width:860px){.di-duo{grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr)}}
.di-duo__texte{display:grid;gap:24px;align-content:start}
.di-colonnes{display:grid;gap:18px}
@container (min-width:760px){.di-colonnes{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:clamp(28px,4vw,56px)}.di-colonnes .di-texte + .di-texte{margin-top:0}}

/* ── Bloc d'appel (estimation, fond Ink) ──────────────────────────── */
.di-appel{display:grid;grid-template-columns:minmax(0,1fr);gap:clamp(32px,5vw,64px);align-items:center}
/* 720–959 px : texte | visuel plafonné à 320 px (en colonne unique le visuel prenait toute
   la largeur, ≈ 700 px de côté, et laissait un grand vide) ; < 720 px : plafonné à 420 px */
@media (min-width:720px) and (max-width:959.98px){.di-appel:has(> .di-visuel){grid-template-columns:minmax(0,1fr) minmax(0,clamp(240px,34vw,320px))}}
@media (max-width:719.98px){.di-appel .di-visuel{max-width:420px}}
@media (min-width:960px){.di-appel{grid-template-columns:minmax(0,1.55fr) minmax(0,1fr)}}
.di-appel__texte{display:grid;gap:26px;align-content:start}
.di-appel .di-h2{max-width:20ch}
.di-appel__note{font:400 12px/1.5 var(--mono);letter-spacing:.06em;color:var(--sourd)}
.di-appel .di-visuel{border:1px solid var(--filet);border-radius:var(--radius)}

/* ── FAQ vivante : numéro mono, chevron, réponse dépliée (::details-content) ─ */
.di-faq{interpolate-size:allow-keywords;border-top:1px solid var(--filet)}
.di-faq details{border-bottom:1px solid var(--filet)}
.di-faq summary{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:14px;min-height:56px;padding:18px 0;cursor:pointer;list-style:none;font:600 1.125rem/1.3 var(--font);letter-spacing:-.01em}
.di-faq summary::-webkit-details-marker{display:none}
.di-faq__n{font:500 13px/1.45 var(--mono);letter-spacing:.06em;padding-top:2px;color:var(--sourd);font-variant-numeric:tabular-nums}
.di-faq__chevron{width:18px;height:18px;margin-top:3px;fill:none;stroke:var(--texte);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .35s var(--ease)}
.di-faq details[open] .di-faq__chevron{transform:rotate(180deg)}
.di-faq details[open] .di-faq__n{color:var(--texte)}
.di-faq details > :not(summary){padding:0 32px 22px 42px;color:var(--sourd);line-height:1.62}
@media (prefers-reduced-motion:no-preference){
  .di-faq details::details-content{block-size:0;overflow:clip;transition:block-size .45s var(--ease),content-visibility .45s allow-discrete}
  .di-faq details[open]::details-content{block-size:auto}
}

/* ── Formulaire ───────────────────────────────────────────────────── */
.di-form{display:grid;gap:18px}
.di-champ{display:grid;gap:8px}
.di-champ label,.di-champ legend{font:500 var(--fs-mono)/1.4 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--texte)}
.di-champ input,.di-champ select,.di-champ textarea{width:100%;min-height:52px;padding:12px 14px;border:1px solid var(--filet-fort);border-radius:var(--radius);background:var(--blanc);color:var(--ink);transition:border-color .2s,box-shadow .2s}
.di-champ textarea{min-height:140px;resize:vertical}
.di-champ input:focus-visible,.di-champ select:focus-visible,.di-champ textarea:focus-visible{outline:none;border-color:var(--ink);box-shadow:0 0 0 3px rgba(21,158,145,.28)}
.di-champ__aide{font-size:.875rem;color:var(--sourd)}
.di-champ--erreur input,.di-champ--erreur select,.di-champ--erreur textarea{border-color:#B42318}
.di-champ__erreur{font-size:.875rem;color:#B42318}
.di-choix{display:flex;align-items:center;gap:12px;min-height:44px;cursor:pointer}
.di-choix input{width:20px;height:20px;min-height:0;margin:0;accent-color:var(--ink)}

/* ── « Je vous rappelle sous 24 h » : <div data-rappel></div> rempli par chrome.js ─
   Conçu pour un bloc Ink (papier sur Ink, filets clairs) ; ses couleurs suivent les rôles
   --texte / --sourd / --filet-fort, donc il tient aussi sur papier. Champ et bouton 48 px.
   Contrat et textes : assets/v2/LISEZMOI.md. */
.di-rappel{display:block;width:100%;max-width:30rem;container-type:inline-size}
.di-rappel__form{position:relative;display:grid;gap:14px;padding:clamp(18px,2.6vw,26px);border:1px solid var(--filet-fort);border-radius:var(--radius);color:var(--texte)}
.di-rappel__form::before{content:"";position:absolute;left:-1px;top:-1px;width:44px;height:2px;background:var(--accent)}
.di-rappel__champs{display:grid;gap:14px}
.di-rappel__label{font:600 1.125rem/1.3 var(--font);letter-spacing:-.01em;text-wrap:balance}
.di-rappel__ligne{display:grid;gap:10px}
@container (min-width:400px){.di-rappel__ligne{grid-template-columns:minmax(0,1fr) auto}}
.di-rappel__tel{width:100%;min-height:48px;padding:0 14px;border:1px solid var(--filet-fort);border-radius:var(--radius);background:var(--paper);color:var(--ink);transition:border-color .2s,box-shadow .2s}
.di-rappel__tel::placeholder{color:var(--gray);opacity:1}
.di-rappel__tel:focus-visible{outline-offset:2px;border-color:var(--lagon)}
.di-rappel__tel[aria-invalid="true"]{border-color:#B42318;box-shadow:0 0 0 2px rgba(180,35,24,.35)}
.di-encre .di-rappel__tel[aria-invalid="true"]{border-color:#FFB4A8;box-shadow:0 0 0 2px rgba(255,180,168,.4)}
.di-rappel .di-btn{min-height:48px;padding:0 20px}
.di-rappel__consent{align-items:flex-start;gap:12px;padding-block:2px;font-size:.875rem;line-height:1.5;color:var(--sourd)}
.di-rappel__consent input{flex:none;width:22px;height:22px;margin:1px 0 0;accent-color:var(--lagon)}
.di-rappel__consent a{color:var(--texte);text-decoration:underline;text-decoration-color:var(--lagon);text-decoration-thickness:1.5px;text-underline-offset:3px}
.di-rappel__piege{position:absolute!important;left:-9999px!important;width:1px;height:1px;opacity:0}
.di-rappel__statut{margin:0;font-weight:500;line-height:1.5;color:var(--texte)}
.di-rappel__statut:empty{display:none}
.di-rappel__statut:focus{outline:none}
.di-rappel__statut a{text-decoration:underline;text-underline-offset:3px}
.di-rappel__statut[data-ton="erreur"]{color:#B42318}
.di-encre .di-rappel__statut[data-ton="erreur"]{color:#FFB4A8}
.di-rappel__statut[data-ton="ok"]{display:flex;align-items:center;gap:12px}
.di-rappel__ico{width:22px;height:22px;flex:none;fill:none;stroke:var(--accent);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.di-rappel[data-etat="ok"] .di-rappel__champs{display:none}

/* ── Pied de page : signature, grille à filets, communes, mentions ── */
.di-pied{position:relative;background:var(--paper);color:var(--ink);border-top:1px solid var(--hair)}
.di-pied__in{padding:clamp(44px,6vw,80px) 0 0}
.di-pied__signature{display:grid;gap:18px;align-items:end;padding-bottom:clamp(28px,4vw,44px)}
@media (min-width:860px){.di-pied__signature{grid-template-columns:minmax(0,1fr) auto}}
.di-pied__logo{font:600 clamp(2.25rem,1.5rem + 3vw,4rem)/.95 var(--font);letter-spacing:-.045em}
.di-pied__logo span{color:var(--lagon)}
.di-pied__tag{max-width:46ch;margin-top:14px;color:var(--gray);font-size:1rem;line-height:1.55;text-wrap:pretty}
.di-pied__grille{grid-template-columns:minmax(0,1fr)}
@container (min-width:560px){.di-pied__grille{grid-template-columns:repeat(2,minmax(0,1fr))}}
@container (min-width:960px){.di-pied__grille{grid-template-columns:repeat(4,minmax(0,1fr))}}
.di-pied__col{padding:22px clamp(18px,2vw,26px) 24px}
.di-pied h2{margin-bottom:10px;font:500 var(--fs-mono)/1.45 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--gray)}
/* page qui finit par un bloc Ink : pas de rangée signature + bouton (chrome.js), seulement les colonnes */
.di-pied--court .di-pied__in{padding-top:clamp(28px,4vw,48px)}
/* colonnes en <details> : ouvertes et inertes dès 720 px (rendu inchangé), repliées dessous (chrome.js, synchroniserPied) */
.di-pied__det > summary{display:flex;align-items:center;justify-content:space-between;gap:12px;list-style:none;cursor:default;-webkit-tap-highlight-color:transparent}
.di-pied__det > summary::-webkit-details-marker{display:none}
.di-pied__chev{display:none;width:16px;height:16px;flex:none;fill:none;stroke:var(--gray);stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round;transition:transform .3s var(--ease)}
.di-pied__det[open] > summary .di-pied__chev{transform:rotate(180deg)}
@media (min-width:720px){.di-pied__det > summary{pointer-events:none}}
@media (max-width:719.98px){
  .di-pied__col{padding:0 18px}
  .di-pied__det > summary{min-height:52px;cursor:pointer}
  .di-pied__det > summary h2{margin:0}
  .di-pied__det[open]{padding-bottom:16px}
  .di-pied__chev{display:block}
}
.di-pied li a,.di-pied li > span{display:inline-flex;align-items:center;min-height:34px;font-size:.9375rem;line-height:1.3;color:var(--ink)}
.di-pied li > span{color:var(--gray)}
@media (hover:hover){.di-pied a:not(.di-btn):hover{text-decoration:underline;text-decoration-color:var(--lagon);text-decoration-thickness:1px;text-underline-offset:4px}}
.di-pied__ipi{margin-top:12px;font-size:.8125rem;line-height:1.55;color:var(--gray);text-wrap:pretty}
.di-pied__ipi a{color:var(--ink);text-decoration:underline;text-decoration-color:var(--hair-strong);text-underline-offset:3px}
.di-pied__sig{display:flex;align-items:center;gap:12px;margin-top:18px;padding-top:16px;border-top:1px solid var(--hair)}
.di-pied__sig img{width:48px;height:48px;flex:none}
.di-pied__sig b{display:block;font-weight:600;font-size:.9375rem}
.di-pied__sig span{display:block;font-size:.8125rem;color:var(--gray)}
.di-pied__col .di-btn{margin-top:16px}
/* index des communes : repli sous 640 px (les liens restent dans le DOM) */
.di-pied__index{margin-top:clamp(28px,4vw,44px)}
.di-pied__indexhead{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:12px}
.di-pied__indexhead h2{margin:0}
.di-pied__toggle{display:none;align-items:center;gap:8px;min-height:44px;padding:0 12px;border:1px solid var(--hair-strong);border-radius:var(--radius);font:500 11px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase}
.di-pied__toggle svg{width:11px;height:7px;transition:transform .3s var(--ease)}
.di-pied__index[data-open="true"] .di-pied__toggle svg{transform:rotate(180deg)}
.di-pied__zone{padding:18px clamp(18px,2vw,26px) 20px}
.di-pied__zone h3{margin-bottom:8px;font:500 var(--fs-mono)/1.45 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--gray)}
.di-pied__communes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:16px}
.di-pied__communes a{display:inline-flex;align-items:center;min-height:32px;font-size:.875rem;color:var(--ink)}
@media (max-width:639px){
  .di-pied__toggle{display:inline-flex}
  .di-pied__index[data-open="false"] .di-pied__zones{display:none}
}
.di-pied__bas{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 24px;padding:22px 0 calc(28px + env(safe-area-inset-bottom,0px));color:var(--gray)}

/* ── Barre « Appeler / Estimer » (chrome.js) : sous 960 px, fixe en bas, deux cibles de 48 px.
   Apparaît après un écran de défilement ; masquée sur un bloc Ink, sur le pied, sur /estimation/ et
   /contact/ (non injectée). Cachée = hors écran + visibility:hidden (pas de focus au clavier). ──── */
.di-barre{position:fixed;left:0;right:0;bottom:0;z-index:45;display:none;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:8px var(--gouttiere);padding-bottom:calc(8px + env(safe-area-inset-bottom,0px));background:var(--voile);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-top:1px solid var(--hair);visibility:hidden;transform:translateY(105%);transition:transform .5s var(--ease-trace),visibility 0s linear .5s}
.di-barre.is-on{visibility:visible;transform:none;transition-delay:0s}
@media (max-width:959.98px){.di-barre{display:grid}}
.di-barre a{display:flex;align-items:center;justify-content:center;gap:10px;min-height:48px;padding:0 12px;border:1px solid var(--ink);border-radius:var(--radius);font:500 1rem/1 var(--font);white-space:nowrap;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:scale .12s ease}
.di-barre a:active{scale:.97}
.di-barre__tel{background:var(--ink);color:var(--paper)}
.di-barre__estim{background:transparent;color:var(--ink)}
.di-barre__ico{width:20px;height:20px;flex:none;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}

/* ── Rail de droite (construit par choreo.js, masqué < 960 px) ────── */
.di-rail{display:none}
@media (min-width:960px){.di-rail{display:block;position:fixed;top:0;right:0;bottom:0;width:var(--rail-l);z-index:30;pointer-events:none}}
.di-rail__ligne{position:absolute;left:0;top:0;bottom:0;width:1px;background:var(--hair);transform-origin:top}
.di-rail__cadre{position:absolute;inset:0;overflow:hidden}
.di-rail__regle{position:absolute;top:0;left:0;right:0;will-change:transform;background-image:repeating-linear-gradient(to bottom,rgba(16,20,24,.32) 0 1px,transparent 1px 100px),repeating-linear-gradient(to bottom,var(--gray) 0 1px,transparent 1px 500px);background-size:7px 100%,13px 100%;background-repeat:no-repeat;background-position:1px 0,1px 0}
.di-rail__num{position:absolute;left:17px;font:400 11px/1 var(--mono);color:var(--ink);opacity:.55;transform:translateY(-50%);font-variant-numeric:tabular-nums}
.di-rail__index{position:absolute;right:calc(100% + var(--rail-gap));top:calc(var(--header-h) + 120px);width:var(--rail-index);pointer-events:auto;transition:transform .35s var(--ease)}
.di-rail__index li{position:relative;height:20px;transition:height .35s var(--ease)}
@media (max-width:1199px){.di-rail__index{display:none}}
.di-rail__index a{display:block;position:relative;height:100%}
.di-rail__m,.di-rail__s{position:absolute;right:0;top:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);transition:opacity .35s var(--ease),transform .35s var(--ease)}
.di-rail__m{font:400 var(--fs-mono)/20px var(--mono);letter-spacing:.1em;text-transform:uppercase;opacity:.5}
.di-rail__s{font:600 18px/30px var(--font);letter-spacing:-.02em;opacity:0;transform:translateY(8px)}
.di-rail__index li.is-actif{height:30px}
.di-rail__index li.is-actif .di-rail__m{opacity:0;transform:translateY(-8px)}
.di-rail__index li.is-actif .di-rail__s{opacity:1;transform:none}
@media (hover:hover){.di-rail__index a:hover .di-rail__m{opacity:.9}}
.di-rail__nom{position:absolute;right:0;width:26px;top:50%;height:300px;margin-top:-150px;overflow:hidden}
.di-rail__vn{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;writing-mode:vertical-rl;white-space:nowrap;font:400 var(--fs-mono)/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--ink);opacity:0;transform:translateY(48px);transition:opacity .35s var(--ease),transform .35s var(--ease)}
.di-rail__vn.is-cur{opacity:.5;transform:none}
.di-rail__vn.is-sort{opacity:0;transform:translateY(-48px)}
.di-rail__nom[data-sens="haut"] .di-rail__vn:not(.is-cur):not(.is-sort){transform:translateY(-48px)}
.di-rail__nom[data-sens="haut"] .di-rail__vn.is-sort{transform:translateY(48px)}
@media (prefers-reduced-motion:no-preference){
  .di-rail .di-rail__ligne{transform:scaleY(0)}
  .di-rail .di-rail__index,.di-rail .di-rail__regle{opacity:0}
  .di-rail.is-on .di-rail__ligne{transform:none;transition:transform .9s var(--ease)}
  .di-rail.is-on .di-rail__index,.di-rail.is-on .di-rail__regle{opacity:1;transition:opacity .6s var(--ease) .3s,transform .35s var(--ease)}
}
@media (prefers-reduced-motion:reduce){.di-rail__index,.di-rail__index li,.di-rail__m,.di-rail__s,.di-rail__vn{transition:none!important}}

/* ── Chorégraphie : états initiaux seulement avec JS (html.js), joués
   par .is-in sur la section ; ordre filets → croix → eyebrow →
   révélations ; délai porté par --d (posé par choreo.js) ──────────── */
@media (prefers-reduced-motion:no-preference){
  html.js [data-choreo] [data-draw-rule]{transform:scaleX(0)}
  html.js [data-choreo] [data-draw-rule][data-axe="y"]{transform:scaleY(0)}
  html.js [data-choreo] [data-draw-tick]{opacity:0;transform:scale(.6)}
  html.js [data-choreo] [data-draw-eyebrow]{opacity:0;clip-path:inset(0 100% 0 0)}
  html.js [data-choreo] [data-reveal]:not(:is(h1,h1 *,.di-hero figure.di-visuel--photo)){opacity:0;transform:translateY(18px)}
  html.js [data-choreo] .di-portrait::before{transform:scaleX(0)}
  html.js [data-choreo] .di-portrait img{transform:scale(1.06)}
  html.js [data-choreo].is-in [data-draw-rule]{transform:none;transition:transform .7s var(--ease) var(--d,0ms)}
  html.js [data-choreo].is-in [data-draw-tick]{opacity:1;transform:none;transition:opacity .25s var(--ease) var(--d,0ms),transform .25s var(--ease) var(--d,0ms)}
  html.js [data-choreo].is-in [data-draw-eyebrow]{opacity:1;clip-path:inset(0 0 0 0);transition:clip-path .6s var(--ease) var(--d,0ms),opacity .3s linear var(--d,0ms)}
  html.js [data-choreo].is-in [data-reveal]:not(:is(h1,h1 *,.di-hero figure.di-visuel--photo)){opacity:1;transform:none;transition:opacity .65s var(--ease) var(--d,0ms),transform .65s var(--ease) var(--d,0ms)}
  /* h1 et photo du hero (candidats au LCP) : jamais à opacity:0 en attendant le JS. Entrée en CSS pur dès le
     premier rendu, 0,6 s : départ à 40 % d'opacité, le texte se lit dès la première image ; lignes du h1
     décalées de 70 ms. choreo.js n'y touche pas. */
  h1[data-reveal],h1 [data-reveal]{animation:di-h1-entree .6s var(--ease) both}
  .di-hero figure.di-visuel--photo[data-reveal]{animation:di-h1-entree .6s var(--ease) .1s both}
  h1 [data-reveal]:nth-child(2){animation-delay:70ms}
  h1 [data-reveal]:nth-child(3){animation-delay:140ms}
  h1 [data-reveal]:nth-child(n+4){animation-delay:210ms}
  html.js [data-choreo].is-in .di-portrait::before{transform:none;transition:transform .9s var(--ease-trace) .5s}
  html.js [data-choreo].is-in .di-portrait img{transform:none;transition:transform 1.6s var(--ease) .2s}

  /* photos des visuels : fondu + légère montée à l'entrée dans l'écran. html.di-visuels
     n'est posée par choreo.js qu'une fois l'observateur en place (sinon tout reste visible). */
  html.di-visuels .di-visuel--photo > img{opacity:0;transform:translateY(16px) scale(1.02)}
  html.di-visuels .di-visuel--photo.is-vu > img{opacity:1;transform:none;transition:opacity .9s var(--ease) .1s,transform 1.3s var(--ease) .1s}
  /* photo du hero (au-dessus de la ligne de flottaison, candidate au LCP) : pas de fondu d'image, elle s'affiche
     dès qu'elle est décodée (le cadre entre en CSS pur, voir plus bas) */
  html.di-visuels .di-hero .di-visuel--photo > img{opacity:1;transform:none}

  /* pictos [data-draw-svg] : choreo.js mesure chaque trait (--len) puis pose .is-trace */
  html.js .di-picto .di-trace{stroke-dasharray:var(--len) var(--len);stroke-dashoffset:var(--len)}
  html.js .di-picto.is-trace .di-trace{stroke-dashoffset:0;transition:stroke-dashoffset 1.15s var(--ease-trace) var(--d,0ms)}
  /* icônes Lucide [data-draw-svg] : même tracé, mesuré par choreo.js */
  html.js svg.di-icone .di-trace{stroke-dasharray:var(--len) var(--len);stroke-dashoffset:var(--len)}
  html.js svg.di-icone.is-trace .di-trace{stroke-dashoffset:0;transition:stroke-dashoffset 1.15s var(--ease-trace) var(--d,0ms)}

  /* frise : trait au défilement, jalons éteints tant qu'ils ne sont pas atteints */
  html.di-choreo .di-frise.is-vivant .di-frise__plein{transform:scaleY(0)}
  html.di-choreo .di-frise.is-vivant:not(.is-fini) .di-frise__tete{opacity:1}
  html.di-choreo .di-frise.is-vivant .di-frise__item:not(.is-allume) .di-frise__noeud{border-color:var(--filet-fort);background:var(--fond)}
  html.di-choreo .di-frise.is-vivant .di-frise__item:not(.is-allume) .di-frise__noeud svg path{stroke-dashoffset:1}
  html.di-choreo .di-frise.is-vivant .di-frise__item:not(.is-allume) .di-frise__n{color:var(--sourd)}
  html.di-choreo .di-frise.is-vivant .di-frise__item:not(.is-allume) .di-frise__quoi{opacity:.38;transform:translateX(6px)}
  html.di-choreo .di-frise.is-vivant .di-frise__item.is-allume .di-frise__noeud{animation:di-noeud .8s var(--ease)}
  html.di-choreo .di-frise.is-vivant .di-frise__noeud svg path{transition:stroke-dashoffset .5s var(--ease) .15s}
  html.di-choreo .di-frise.is-vivant .di-frise__n{transition:color .4s}
}
@keyframes di-h1-entree{from{opacity:.4;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes di-noeud{0%{box-shadow:0 0 0 0 rgba(21,158,145,.5)}100%{box-shadow:0 0 0 14px rgba(21,158,145,0)}}
/* mobile : révélations par la timeline de défilement (CSS seul), repli IntersectionObserver */
@supports (animation-timeline:view()){
  @media (prefers-reduced-motion:no-preference) and (max-width:959px){
    html.js [data-choreo] [data-reveal]:not(:is(h1,h1 *,.di-hero figure.di-visuel--photo)){opacity:1;transform:none;transition:none;animation:di-apparait linear both;animation-timeline:view();animation-range:entry 0% entry 40%}
  }
}
@keyframes di-apparait{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}

/* ── Secours d'affichage ───────────────────────────────────────────────
   Si le rendu ou IntersectionObserver est bloqué (vie privée, économie d'énergie, volet
   caché), choreo.js ne joue rien et les états initiaux ci-dessus cacheraient la page.
   Tant que html.di-anime manque (posée par choreo.js dès la 1re réponse d'un observateur),
   chaque élément caché reçoit, 3,5 s après le départ, une animation de 1 ms qui force
   l'état final (fill forwards ; l'animation l'emporte sur .is-in, dont elle a les valeurs
   finales). Quand tout marche, .di-anime arrive en moins d'une seconde et ces règles ne
   s'appliquent plus ; avant la fin du délai elles ne posent aucune valeur : la
   chorégraphie normale (.is-in, transitions, délais --d) n'est jamais touchée. */
@keyframes di-secours{to{opacity:1;transform:none}}
@keyframes di-secours-oeil{to{opacity:1;clip-path:inset(0 0 0 0)}}
@keyframes di-secours-trait{to{stroke-dashoffset:0}}
@media (prefers-reduced-motion:no-preference){
  html.js:not(.di-anime) [data-choreo] [data-draw-rule],
  html.js:not(.di-anime) [data-choreo] [data-draw-tick],
  html.js:not(.di-anime) [data-choreo] [data-reveal]:not(:is(h1,h1 *,.di-hero figure.di-visuel--photo)),
  html.js:not(.di-anime) [data-choreo] .di-portrait::before,
  html.di-visuels:not(.di-anime) .di-visuel--photo:not(.is-vu) > img{animation:di-secours 1ms linear 3.5s 1 forwards}
  html.js:not(.di-anime) [data-choreo] [data-draw-eyebrow]{animation:di-secours-oeil 1ms linear 3.5s 1 forwards}
  html.js:not(.di-anime) .di-picto:not(.is-trace) .di-trace{animation:di-secours-trait 1ms linear 3.5s 1 forwards}
  html.js:not(.di-anime) svg.di-icone:not(.is-trace) .di-trace{animation:di-secours-trait 1ms linear 3.5s 1 forwards}
}
/* mobile avec timeline de défilement : le reveal par défilement est gardé, le secours s'y ajoute */
@supports (animation-timeline:view()){
  @media (prefers-reduced-motion:no-preference) and (max-width:959.98px){
    html.js:not(.di-anime) [data-choreo] [data-reveal]:not(:is(h1,h1 *,.di-hero figure.di-visuel--photo)){animation:di-apparait linear both,di-secours 1ms linear 3.5s 1 forwards;animation-timeline:view(),auto;animation-range:entry 0% entry 40%,normal}
  }
}
/* ceinture : en mouvement réduit, rien ne bouge, tout est dans son état final */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;transition-delay:0ms!important;scroll-behavior:auto!important}
}

/* ── Cibles tactiles ≥ 44 px, écran tactile seulement ────────────────
   Sous (pointer: coarse) uniquement : le rendu PC ne bouge pas. */
@media (pointer:coarse){
  .di-btn--petit{min-height:44px}
  .di-nav a,.di-nav__sous > button{min-height:44px}
  .di-pied li a,.di-pied li > span{min-height:44px}
  .di-pied__communes a{min-height:44px}
  .di-pied__bas a{display:inline-flex;align-items:center;min-height:44px}
  .di-menu__sections a{min-height:52px}
  main p a:not([class]){padding-block:12px}
}
