/*
Theme Name: Béton SW Estampé
Theme URI: https://www.betonsw.com/
Author: Béton SW Estampé
Author URI: https://www.betonsw.com/
Description: Thème sur mesure pour Béton SW Estampé — béton estampé, dalles, patios et finition de plancher sur la Rive-Sud. Site vitrine une page, sombre et cinématographique, optimisé pour le mobile et la performance.
Version: 1.99.10
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: betonsw
Tags: one-page, business, custom-colors, translation-ready
*/

/* Polices auto-hébergées — fusionnées ici : une seule feuille bloquante au lieu de deux. */
/* Polices auto-hébergées (plus aucun appel à Google Fonts).
   Sous-ensemble latin — couvre tous les accents du français. */

@font-face{font-family:"Archivo";font-style:normal;font-weight:700;font-display:swap;
  src:url("assets/fonts/archivo-latin-700-normal.woff2") format("woff2")}
@font-face{font-family:"Archivo";font-style:normal;font-weight:800;font-display:swap;
  src:url("assets/fonts/archivo-latin-800-normal.woff2") format("woff2")}
@font-face{font-family:"Archivo";font-style:normal;font-weight:900;font-display:swap;
  src:url("assets/fonts/archivo-latin-900-normal.woff2") format("woff2")}

@font-face{font-family:"Inter";font-style:normal;font-weight:400;font-display:swap;
  src:url("assets/fonts/inter-latin-400-normal.woff2") format("woff2")}
@font-face{font-family:"Inter";font-style:normal;font-weight:500;font-display:swap;
  src:url("assets/fonts/inter-latin-500-normal.woff2") format("woff2")}
@font-face{font-family:"Inter";font-style:normal;font-weight:600;font-display:swap;
  src:url("assets/fonts/inter-latin-600-normal.woff2") format("woff2")}

@font-face{font-family:"Space Mono";font-style:normal;font-weight:400;font-display:swap;
  src:url("assets/fonts/space-mono-latin-400-normal.woff2") format("woff2")}
@font-face{font-family:"Space Mono";font-style:normal;font-weight:700;font-display:swap;
  src:url("assets/fonts/space-mono-latin-700-normal.woff2") format("woff2")}

/* Doublures métriques : la police système est redimensionnée pour occuper
   exactement la place de la vraie police. Le texte peint immédiatement
   (font-display:swap) SANS décaler la page quand la woff2 arrive.
   Valeurs calculées depuis les fichiers de police eux-mêmes. */
@font-face{font-family:"Archivo Fallback";src:local("Arial Bold"),local("Arial");
  size-adjust:113.71%;ascent-override:77.22%;descent-override:18.47%;line-gap-override:0%}
@font-face{font-family:"Inter Fallback";src:local("Arial");
  size-adjust:103.37%;ascent-override:93.72%;descent-override:23.33%;line-gap-override:0%}
@font-face{font-family:"Space Mono Fallback";src:local("Courier New");
  size-adjust:101.98%;ascent-override:109.82%;descent-override:35.4%;line-gap-override:0%}



:root{
    --graphite:#121116;
    --slab:#191820;
    --slab-2:#221f28;
    --concrete:#8f897f;   /* 4,68:1 minimum sur tous les fonds du thème (WCAG AA) */
    --limestone:#d2ccc1;
    --fog:#efece6;
    --oxide:#c1823c;
    --oxide-bright:#dc9b4c;
    --glow:rgba(193,130,60,.16);
    --line:rgba(210,204,193,.13);
    --line-strong:rgba(210,204,193,.26);
    --maxw:1500px;   /* 1240 laissait environ 340 px de vide de chaque côté sur un écran de 1920 */
    --ease:cubic-bezier(.19,1,.22,1);
    --ease-out:cubic-bezier(.22,.61,.36,1);
  }
  *{box-sizing:border-box;margin:0;padding:0}
:root{
    /* On gère le mode sombre nous-mêmes : ceci désactive « Auto Dark Theme »
       de Chrome Android (Messenger, Instagram, Facebook — tous des WebView Chrome),
       qui inverse les couleurs des pages qui ne le déclarent pas. */
    color-scheme:only dark;   /* « only » = interdit au navigateur d'appliquer son propre assombrissement */
  }
  html{scroll-behavior:smooth;scrollbar-gutter:stable}
  /* pendant la coulée : la page reste au héro, sans saut de largeur au dévoilement */
  html.betonsw-pouring{overflow:hidden}
  body{
    background:var(--graphite);
    color:var(--fog);
    font-family:"Inter","Inter Fallback",system-ui,sans-serif;
    font-size:17px;line-height:1.6;
    -webkit-font-smoothing:antialiased;
    overflow-x:hidden;
  }
  /* "Wet pour" field — cloud mottling only. No arcs, no seams: the two large
     layers are stretched to cover the viewport, so they never tile. CSS-only. */
  .field{
    position:fixed;inset:0;z-index:-1;pointer-events:none;
    background-color:#131217;
    background-image:
      url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 1000' preserveAspectRatio='none'%3E%3Cfilter id='n' x='0' y='0' width='100%' height='100%'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.005' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%' height='100%' filter='url(%23n)' opacity='0.34'/%3E%3C/svg%3E"),
      url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 1000' preserveAspectRatio='none'%3E%3Cfilter id='n' x='0' y='0' width='100%' height='100%'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.014' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%' height='100%' filter='url(%23n)' opacity='0.24'/%3E%3C/svg%3E"),
      url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 300 300' preserveAspectRatio='none'%3E%3Cfilter id='n' x='0' y='0' width='100%' height='100%'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%' height='100%' filter='url(%23n)' opacity='0.22'/%3E%3C/svg%3E");
    background-size:100% 100%,100% 100%,300px 300px;
    background-position:center,center,0 0;
    background-repeat:no-repeat,no-repeat,repeat;
    background-blend-mode:soft-light,soft-light,overlay;
    /* Master dial: lower = quieter background. */
    opacity:.72;
  }
  /* Banded sections stay translucent so the pour reads through them. */
  .proof,.contact{background:rgba(23,21,27,.72)}
  .marquee{background:rgba(23,21,27,.8)}
  a{color:inherit;text-decoration:none}
  img{display:block;max-width:100%}
  .wrap{max-width:var(--maxw);margin:0 auto;padding:0 30px}
  .mono{font-family:"Space Mono","Space Mono Fallback",monospace;letter-spacing:.04em}
  h1,h2,h3{font-family:"Archivo","Archivo Fallback",sans-serif;line-height:1.02;letter-spacing:-.02em}

  .eyebrow{
    font-family:"Space Mono","Space Mono Fallback",monospace;font-size:12px;letter-spacing:.3em;
    text-transform:uppercase;color:var(--oxide-bright);
    display:inline-flex;align-items:center;gap:13px;
  }
  .eyebrow::before{content:"";width:30px;height:1px;background:var(--oxide);display:inline-block}

  /* ---------- Scroll progress ---------- */
  .progress{position:fixed;top:0;left:0;height:2px;width:100%;transform:scaleX(0);transform-origin:0 50%;will-change:transform;z-index:100;background:linear-gradient(90deg,var(--oxide),var(--oxide-bright));box-shadow:0 0 12px rgba(220,155,76,.5)}

  /* ---------- Header ---------- */
  header{
    position:fixed;top:0;left:0;right:0;z-index:80;
    display:flex;align-items:center;justify-content:space-between;
    padding:20px 30px;
    transition:background .5s var(--ease-out),border-color .5s var(--ease-out),padding .5s var(--ease-out);
    border-bottom:1px solid transparent;
    transform:translateY(-100%);animation:dropIn .9s .2s var(--ease) forwards;
  }
  @keyframes dropIn{to{transform:none}}
  header.scrolled{background:rgba(16,15,19,.78);backdrop-filter:blur(10px) saturate(1.3);border-bottom:1px solid var(--line);padding:13px 30px}
  .brand{display:flex;flex-direction:column;line-height:1}
  .brand b{font-family:"Archivo","Archivo Fallback";font-weight:900;font-size:21px;letter-spacing:-.01em}
  .brand span{font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.24em;color:var(--concrete);text-transform:uppercase;margin-top:4px}
  /* La signature du logo reste fixe. Une lueur qui pulse en continu réclame l'œil
     sans rien lui apprendre — et le regard finit par lire ça comme un bandeau publicitaire. */
  header .brand span{color:var(--oxide-bright);opacity:.82}
  nav{display:flex;align-items:center;gap:32px}
  .nav-links{display:flex;align-items:center;gap:32px}
  nav a.link{font-size:20px;font-weight:600;color:#fff;opacity:1;position:relative;transition:color .2s}
  nav a.link::after{content:"";position:absolute;left:0;bottom:-6px;width:0;height:2px;background:var(--oxide-bright);transition:width .3s var(--ease)}
  nav a.link:hover{color:var(--oxide-bright)}
  nav a.link:hover::after{width:100%}
  .callbtn{
    font-family:"Space Mono","Space Mono Fallback";font-size:15px;font-weight:700;letter-spacing:.02em;
    background:var(--oxide);color:#151318;padding:14px 22px;border-radius:2px;
    display:inline-flex;align-items:center;gap:9px;overflow:hidden;position:relative;
    transition:transform .25s var(--ease),box-shadow .25s;
  }
  .callbtn:hover{transform:translateY(-2px);box-shadow:0 10px 30px -8px rgba(193,130,60,.6)}
  .callbtn svg{width:17px;height:17px}
  /* Écrans courts : le héro cesse d'imposer une pleine hauteur et se contente de respirer. */
  @media (max-height:700px) and (max-width:900px){
    .hero{min-height:auto;padding-top:84px}
    .hero-inner{padding-bottom:44px}
    .hero h1{font-size:clamp(2rem,7.6vw,3.2rem);margin:16px 0 18px}
    .hero p.lede{font-size:.98rem}
    .hero-cta{margin-top:24px;gap:12px}
  }
  @media (max-width:400px){
    .hero h1{font-size:2rem}
    .hero-cta{gap:10px}
    .hero-cta a{width:100%;justify-content:center}
  }

  /* ---------- Menu mobile ---------- */
  .navtoggle{display:none;position:relative;z-index:2;width:46px;height:42px;border:1px solid var(--line-strong);
    border-radius:2px;background:rgba(16,15,19,.5);cursor:pointer;padding:0;transition:border-color .3s,background .3s}
  .navtoggle:hover,.navtoggle:focus-visible{border-color:var(--oxide)}
  .nb{position:absolute;left:50%;width:19px;height:1.5px;background:var(--fog);border-radius:2px;
    transform:translateX(-50%);transition:transform .42s var(--ease),opacity .25s,width .42s var(--ease),background .3s}
  .nb1{top:14px}
  .nb2{top:20.5px;width:13px}
  .nb3{top:27px}
  header.nav-open .navtoggle{border-color:var(--oxide);background:rgba(193,130,60,.14)}
  header.nav-open .nb{background:var(--oxide-bright)}
  header.nav-open .nb1{transform:translateX(-50%) translateY(6.5px) rotate(45deg)}
  header.nav-open .nb2{opacity:0;width:0}
  header.nav-open .nb3{transform:translateX(-50%) translateY(-6.5px) rotate(-45deg)}

  .navpanel{position:fixed;inset:0;z-index:79;visibility:hidden;pointer-events:none;
    background:rgba(14,13,18,.97);backdrop-filter:blur(14px);
    clip-path:circle(0% at calc(100% - 52px) 42px);
    transition:clip-path .62s var(--ease),visibility 0s linear .62s}
  .navpanel.open{visibility:visible;pointer-events:auto;
    clip-path:circle(150% at calc(100% - 52px) 42px);transition:clip-path .62s var(--ease),visibility 0s}
  .np-inner{height:100%;display:flex;flex-direction:column;justify-content:flex-start;gap:26px;padding:100px 30px 40px;max-width:600px;
    overflow-y:auto;-webkit-overflow-scrolling:touch}
  /* Les marges automatiques font tout le travail : le surtitre reste collé en
     haut, le pied en bas, et les liens se centrent dans l'espace restant. Un
     « justify-content:center » ne saurait pas faire les trois à la fois — et
     quand le contenu déborde, une marge auto retombe à zéro d'elle-même, là où
     un centrage rognerait le haut du menu. */
  .np-links{display:flex;flex-direction:column;margin-top:auto;margin-bottom:auto}
  .np-links a{display:block;padding:16px 0;border-bottom:1px solid var(--line);
    opacity:0;transform:translateY(14px);transition:opacity .4s var(--ease-out),transform .5s var(--ease),color .25s}
  .navpanel.open .np-links a{opacity:1;transform:none;transition-delay:calc(var(--i) * 55ms + 120ms)}
  .np-t{font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:clamp(1.9rem,8.4vw,2.8rem);letter-spacing:-.025em;color:var(--fog)}
  .np-links a:active .np-t,.np-links a:hover .np-t{color:var(--oxide-bright)}
  .np-foot{display:flex;flex-direction:column;align-items:center;text-align:center;gap:8px;opacity:0;transform:translateY(10px);
    transition:opacity .4s var(--ease-out) .5s,transform .5s var(--ease) .5s}
  .navpanel.open .np-foot{opacity:1;transform:none}
  .np-call{font-family:"Archivo","Archivo Fallback";font-weight:900;font-size:1.7rem;letter-spacing:-.02em;color:var(--oxide-bright)}
  .np-mail{color:var(--limestone);font-size:.95rem}
  .np-rbq{font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.16em;color:var(--concrete)}
  body.nav-locked{overflow:hidden}

  /* Six liens à 16,5 px tiennent large, mais se serrent avant la bascule
     burger. On resserre l'écart plutôt que de laisser le menu toucher le bouton. */
  @media (max-width:1150px){
    .nav-links{gap:20px}
    nav a.link{font-size:17px}
  }
  /* Le burger apparaît à 1000 px et non 900 : en dessous, six liens agrandis
     touchent la marque. Mieux vaut le menu plein écran, dont les entrées font
     2,8 rem, qu'un en-tête comprimé à 15 px. */
  @media (max-width:1000px){
    .nav-links{display:none}
    .navtoggle{display:block}
    nav{gap:14px}
    header{padding:14px 18px}
    .brand b{font-size:18px}
    .brand span{font-size:9px;letter-spacing:.2em}
    .callbtn{padding:11px 14px}
  }
  @media (max-width:480px){
    .tstrip{grid-template-columns:repeat(4,1fr)}      /* 8 swatches are unreadable on a phone */
  }
  @media (max-width:420px){
    .callbtn{padding:11px;gap:0}
    .np-inner{padding:96px 22px 32px}
  }

  /* Six entrées plus le pied de menu dépassent d'un écran court : mesuré à
     940 px de contenu pour 720 px de haut. Ce bloc vient APRÈS toutes les règles
     de base du panneau — à spécificité égale c'est la dernière qui gagne, et
     placé plus haut il était silencieusement écrasé. */
  @media (max-height:820px){
    .np-inner{gap:12px;padding-block:34px 30px}
    .np-links a{padding:8px 0}
    .np-t{font-size:clamp(1.45rem,6vw,1.9rem)}
    .np-foot{gap:5px}
    .np-call{font-size:1.35rem}
  }
  /* Dernier palier : sous 660 px de haut, six entrées plus le pied ne tiennent
     plus. Un menu qui défile est un menu dont on ignore la fin — on resserre
     encore plutôt que de compter sur le doigt du visiteur. */
  @media (max-height:660px){
    .np-inner{gap:9px;padding-block:26px 22px}
    .np-links a{padding:5px 0}
    .np-t{font-size:clamp(1.25rem,5.2vw,1.55rem)}
    .np-call{font-size:1.15rem}
    .np-mail{font-size:.86rem}
  }
  /* Téléphone en paysage : 390 px de haut pour six entrées empilées plus le
     pied, c'est impossible. Deux colonnes ramènent les liens à trois rangées et
     le pied revient dans le cadre, sans défilement. */
  @media (max-height:480px){
    .np-links{display:grid;grid-template-columns:1fr 1fr;column-gap:28px;
      margin-top:auto;margin-bottom:auto}
    .np-inner{gap:7px;padding-block:18px 14px}
    .np-links a{padding:4px 0}
    .np-t{font-size:1.2rem}
    .np-foot{gap:3px}
    .np-call{font-size:1rem}
    .np-mail{font-size:.8rem}
  }
  @media (prefers-reduced-motion:reduce){
    .navpanel{transition:none;clip-path:none;opacity:0}
    .navpanel.open{opacity:1}
    .np-links a,.np-foot{transition:none;opacity:1;transform:none}
  }

  /* ---------- Hero ---------- */
  .hero{position:relative;min-height:100svh;display:flex;align-items:flex-end;overflow:hidden;
    padding-top:96px}   /* la hauteur de l'en-tête fixe : le contenu ne peut plus passer dessous */
  .hero-media{position:absolute;inset:-14% 0 -14%;z-index:0;opacity:0;transform:scale(1.08);transition:opacity 1.6s var(--ease-out),transform 2.4s var(--ease);will-change:transform}
  body.loaded .hero-media,html.betonsw-nopour .hero-media{opacity:1;transform:scale(1)}
  /* Once loaded, scroll takes over: footage drifts slower than the page. */
  body.loaded .hero-media.px,html.betonsw-nopour .hero-media.px{transition:opacity 1.6s var(--ease-out);transform:translate3d(0,calc(var(--p,0)*14%),0) scale(calc(1 + var(--p,0)*.14))}
  .hero-inner.px{transform:translate3d(0,calc(var(--p,0)*-90px),0);opacity:calc(1 - var(--p,0)*1.05);will-change:transform,opacity}
  .viewfinder.px,.hud.px{opacity:calc(1 - var(--p,0)*1.6)}
  body.loaded .hero-media,html.betonsw-nopour .hero-media{opacity:1;transform:scale(1)}
  .hero-media img,.hero-media video{width:100%;height:100%;object-fit:cover;object-position:center 42%;filter:contrast(1.05) saturate(1.06) brightness(.82)}
  /* La première image de la vidéo, en fond : elle est peinte tout de suite et
     reste si la vidéo ne démarre jamais (économie d'énergie, autoplay bloqué). */
  .hero-media{background-size:cover;background-position:center 42%;background-repeat:no-repeat}
  /* ---------- Héro en photos ---------- */
  /* Les images sont empilées au même endroit ; seule celle qui porte .on est
     visible. Sans JavaScript, la première reste affichée et le héro tient
     debout tout seul — c'est pour ça qu'elles sont dans le HTML et pas créées
     par le script. */
  .hero-media.shots .shot{position:absolute;inset:0;width:100%;height:100%;opacity:0;
    transition:opacity .9s var(--ease-out);will-change:opacity}
  .hero-media.shots .shot.on{opacity:1}
  /* Les bandes de la « pose par dalles » : reconstruites en JavaScript, elles
     rejouent l'image en tranches verticales décalées. */
  .hero-media.shots .lame{position:absolute;top:0;bottom:0;background-size:cover;background-position:center 42%;
    filter:contrast(1.05) saturate(1.06) brightness(.82)}

  .shot-cap{position:absolute;left:30px;bottom:30px;z-index:5;display:flex;align-items:baseline;gap:13px;
    font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.2em;text-transform:uppercase;
    opacity:0;transition:opacity 1s var(--ease-out) 1.5s}
  body.loaded .shot-cap,html.betonsw-nopour .shot-cap{opacity:1}
  .shot-cap .sc-n{color:var(--oxide-bright)}
  .shot-cap .sc-t{color:var(--concrete)}

  .shot-nav{position:absolute;right:30px;bottom:30px;z-index:5;display:flex;gap:9px;
    opacity:0;transition:opacity 1s var(--ease-out) 1.5s}
  body.loaded .shot-nav,html.betonsw-nopour .shot-nav{opacity:1}
  .sd{width:26px;height:2px;padding:0;border:0;background:var(--line-strong);cursor:pointer;
    transition:background .3s}
  .sd[aria-selected="true"]{background:var(--oxide-bright)}
  .sd:hover{background:var(--limestone)}
  .sd:focus-visible{outline:2px solid var(--oxide);outline-offset:4px}

  @media (max-width:860px){
    .shot-cap{left:20px;bottom:22px;font-size:9px;letter-spacing:.16em}
    .shot-nav{right:20px;bottom:22px}
    .sd{width:20px}
  }

  .hero-media::before{content:"";position:absolute;inset:0;
    filter:contrast(1.05) saturate(1.06) brightness(.82);pointer-events:none}
  /* La vidéo n'apparaît qu'une fois qu'elle joue vraiment — sinon iOS affiche
     son bouton « play » par-dessus le poster. */
  .hero-media video{opacity:0;transition:opacity .7s var(--ease-out)}
  .hero-media.playing video{opacity:1}
  .hero-media.novideo video{display:none}
  /* filtre de couleur éditable (Béton SW → Héro) : posé dans .hero-media, il suit le parallaxe */
  .hero-media .hero-tint{position:absolute;inset:0;pointer-events:none}
  .hero-media::after{
    content:"";position:absolute;inset:0;
    background:
      linear-gradient(180deg,rgba(16,15,19,.6) 0%,rgba(16,15,19,.08) 34%,rgba(16,15,19,.6) 70%,var(--graphite) 100%),
      radial-gradient(130% 90% at 15% 92%,rgba(16,15,19,.78),transparent 58%);
  }
  .hero-glow{position:absolute;z-index:1;width:60vw;height:60vw;left:-10vw;bottom:-20vw;border-radius:50%;
    background:radial-gradient(circle,var(--glow),transparent 60%);filter:blur(30px);animation:drift 18s ease-in-out infinite alternate}
  @keyframes drift{to{transform:translate(12vw,-8vw) scale(1.15)}}

  .hero-inner{position:relative;z-index:3;width:100%;padding-bottom:72px;min-width:0}
  .hero .eyebrow,.hero .lede,.hero-cta{opacity:0;transform:translateY(24px);transition:opacity .9s var(--ease-out),transform .9s var(--ease-out)}
  body.loaded .hero .eyebrow,html.betonsw-nopour .hero .eyebrow{opacity:1;transform:none;transition-delay:.5s}
  body.loaded .hero .lede,html.betonsw-nopour .hero .lede{opacity:1;transform:none;transition-delay:.95s}
  body.loaded .hero-cta,html.betonsw-nopour .hero-cta{opacity:1;transform:none;transition-delay:1.1s}
  .hero h1{font-weight:800;font-size:clamp(3rem,8.4vw,7.4rem);max-width:15ch;margin:24px 0 28px;text-wrap:balance}
  .ln{display:block;overflow:hidden;padding-bottom:.04em}
  .ln>span{display:block;transform:translateY(115%);transition:transform 1.1s var(--ease)}
  body.loaded .ln:nth-child(1)>span,html.betonsw-nopour .ln:nth-child(1)>span{transform:none;transition-delay:.35s}
  body.loaded .ln:nth-child(2)>span,html.betonsw-nopour .ln:nth-child(2)>span{transform:none;transition-delay:.5s}
  /* Le dégradé porte déjà l'accent : la faire clignoter la faisait osciller entre
     62 % et 100 % d'opacité en boucle — le titre principal du site respirait comme une enseigne. */
  .hero h1 em{font-style:normal;background:linear-gradient(120deg,var(--oxide-bright),#eabf7e);-webkit-background-clip:text;background-clip:text;color:transparent}
  .hero p.lede{max-width:50ch;font-size:clamp(1rem,1.6vw,1.24rem);color:var(--limestone)}
  .hero-cta{display:flex;flex-wrap:wrap;gap:16px;align-items:center;margin-top:36px}
  .btn-ghost{
    font-family:"Space Mono","Space Mono Fallback";font-size:14px;font-weight:700;border:1px solid var(--line-strong);
    color:var(--fog);padding:14px 22px;border-radius:2px;display:inline-flex;align-items:center;gap:10px;
    transition:border-color .25s,background .25s,transform .25s;
  }
  .btn-ghost:hover{border-color:var(--oxide);background:rgba(193,130,60,.08);transform:translateY(-2px)}

  .viewfinder{position:absolute;inset:12px 22px 22px 22px;z-index:2;pointer-events:none;opacity:0;transition:opacity 1s var(--ease-out) 1.2s}
  body.loaded .viewfinder,html.betonsw-nopour .viewfinder{opacity:1}
  .vf-tick{position:absolute;width:44px;height:44px;border:2px solid rgba(239,236,230,.5)}
  .vf-tl{top:0;left:0;border-right:none;border-bottom:none}
  .vf-tr{top:0;right:0;border-left:none;border-bottom:none}
  .vf-bl{bottom:0;left:0;border-right:none;border-top:none}
  .vf-br{bottom:0;right:0;border-left:none;border-top:none}
  .hud{position:absolute;z-index:4;top:104px;right:30px;text-align:right;font-family:"Space Mono","Space Mono Fallback";
    font-size:13px;letter-spacing:.14em;color:rgba(239,236,230,.68);line-height:1.9;text-transform:uppercase;
    opacity:0;transition:opacity 1s 1.3s}
  body.loaded .hud,html.betonsw-nopour .hud{opacity:1}
  .hud .rec{color:var(--oxide-bright)}
  /* Le témoin REC garde sa pulsation — c'est le vocabulaire du viseur — mais en
     fondu lent plutôt qu'en stroboscope : steps(1) à 1,6 s accrochait l'œil en périphérie. */
  .hud .rec::before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--oxide-bright);margin-right:7px;vertical-align:middle;animation:blink 3.4s ease-in-out infinite}
  @keyframes blink{0%,100%{opacity:1}50%{opacity:.38}}


  /* ---------- Marquee ---------- */
  .marquee{border-top:1px solid var(--line);border-bottom:1px solid var(--line);overflow:hidden;padding:20px 0;background:var(--slab)}
  .mq-track{display:flex;gap:0;white-space:nowrap;width:max-content;animation:mq 34s linear infinite;font-family:"Space Mono","Space Mono Fallback";font-size:14px;letter-spacing:.16em;text-transform:uppercase;color:var(--limestone)}
  /* Espacement en marge SUR l'element, et non en « gap » de flexbox : un gap
     ne s'applique pas apres le dernier enfant, et le translateX(-50%) de la
     boucle tomberait alors a un demi-espace a cote. */
  .mq-track span{display:inline-flex;align-items:center;margin-right:70px}
  @keyframes mq{to{transform:translateX(-50%)}}

  /* ---------- Sections ---------- */
  .sec-pad{padding:120px 0}
  .sechead{display:flex;justify-content:space-between;align-items:flex-end;gap:30px;margin-bottom:60px;flex-wrap:wrap}
  .sechead h2{font-weight:800;font-size:clamp(2.1rem,4.6vw,3.6rem);max-width:18ch;line-height:1.06}
  .sechead h2 em,.about-h em{font-style:normal;color:var(--oxide-bright)}
  /* Produits & services : le titre reste d'un seul blanc. Le jaune est
     descendu d'un cran, sur les trois catégories, où il sert de repère. */
  .services .sechead h2 em{color:#fff}
  /* these three read badly broken over two lines — keep them on one */
  @media (min-width:1100px){
    .why .sechead h2,.patterns .sechead h2,.colors .sechead h2,.gallery .sechead h2,.services .sechead h2,.contact .sechead h2{
      max-width:none;white-space:nowrap;font-size:clamp(1.8rem,3vw,3.1rem)}
  }
  .sechead .idx{font-family:"Space Mono","Space Mono Fallback";font-size:14px;font-weight:700;letter-spacing:.16em;color:var(--limestone);position:relative;padding-top:14px}
  .sechead .idx::before{content:"";position:absolute;top:0;right:0;width:46px;height:1px;background:var(--oxide)}

  .about{position:relative;overflow:hidden}
  /* Le titre vit dans la colonne de gauche : son haut et celui de la fiche
     technique partent de la même ligne. */
  .about-h{font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:clamp(2rem,3.6vw,3.1rem);letter-spacing:-.015em;
    line-height:1.06;margin-bottom:30px;max-width:18ch}
  .about-side{display:flex;flex-direction:column;align-items:flex-end;gap:16px}
  .about-side .idx{font-family:"Space Mono","Space Mono Fallback";font-size:12px;letter-spacing:.2em;color:var(--concrete);
    position:relative;padding-top:14px}
  .about-side .idx::before{content:"";position:absolute;top:0;right:0;width:46px;height:1px;background:var(--oxide)}
  .about-side .specs{width:100%}
  .sec-glow{position:absolute;width:44vw;height:44vw;border-radius:50%;background:radial-gradient(circle,var(--glow),transparent 62%);filter:blur(40px);z-index:0;pointer-events:none;top:-10vw;right:-12vw}
  .about-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:72px;align-items:start;position:relative;z-index:1}
  .about-grid p{color:var(--limestone);font-size:1.13rem;margin-bottom:22px}
  .quote{border-left:2px solid var(--oxide);padding-left:24px;margin-top:36px}
  .quote blockquote{font-family:"Archivo","Archivo Fallback";font-weight:700;font-size:1.55rem;line-height:1.2;letter-spacing:-.01em}
  .quote cite{font-style:normal;font-family:"Space Mono","Space Mono Fallback";font-size:12px;letter-spacing:.14em;color:var(--concrete);text-transform:uppercase;display:block;margin-top:14px}
  /* Fiche technique — présentée comme une vraie fiche : en-tête, filets de conduite,
     repères de coin, valeurs en chiffres tabulaires. */
  .specs{position:relative;border:1px solid var(--line);border-radius:3px;background:rgba(25,24,32,.6);
    backdrop-filter:blur(3px);box-shadow:inset 0 1px 0 rgba(255,255,255,.03),0 24px 50px -30px rgba(0,0,0,.9)}
  .specs-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;
    padding:14px 24px;border-bottom:1px solid var(--line-strong);background:rgba(255,255,255,.018)}
  .sh-t{font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.24em;text-transform:uppercase;color:var(--oxide-bright)}
  .sh-c{font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.18em;color:var(--concrete)}
  .specrow{position:relative;display:grid;grid-template-columns:132px 1fr;align-items:baseline;gap:24px;
    padding:15px 24px;border-bottom:1px solid var(--line);font-family:"Space Mono","Space Mono Fallback";font-size:12.5px;transition:background .3s}
  .specrow:last-of-type{border-bottom:none}
  .specrow::before{content:"";position:absolute;left:0;top:-1px;bottom:-1px;width:2px;background:var(--oxide);
    transform:scaleY(0);transform-origin:center;transition:transform .35s var(--ease)}
  .specrow:hover{background:rgba(255,255,255,.022)}
  .specrow:hover::before{transform:scaleY(1)}
  .sk{color:var(--concrete);letter-spacing:.1em;text-transform:uppercase;font-size:11px;transition:color .3s}
  .specrow:hover .sk{color:var(--oxide-bright)}
  .sv{color:var(--fog);text-align:right;line-height:1.55;font-variant-numeric:tabular-nums;letter-spacing:.02em}
  /* repères de coin, comme le viseur du héro */
  .stick{position:absolute;width:9px;height:9px;pointer-events:none;opacity:.7}
  .stick.tl{top:-1px;left:-1px;border-top:1px solid var(--oxide);border-left:1px solid var(--oxide)}
  .stick.tr{top:-1px;right:-1px;border-top:1px solid var(--oxide);border-right:1px solid var(--oxide)}
  .stick.bl{bottom:-1px;left:-1px;border-bottom:1px solid var(--oxide);border-left:1px solid var(--oxide)}
  .stick.br{bottom:-1px;right:-1px;border-bottom:1px solid var(--oxide);border-right:1px solid var(--oxide)}
  @media(max-width:640px){
    .specrow{grid-template-columns:104px 1fr;gap:14px;padding:14px 18px;font-size:11.5px}
  }
  @media(max-width:520px){
    .specrow{grid-template-columns:1fr;gap:4px}
      .sv{text-align:left}
  }
  .process{background:transparent}
  /* Procédé — the slab builds itself, layer by layer, as you move through the steps. */
  .proc-build{display:grid;grid-template-columns:.9fr 1.1fr;gap:44px;align-items:center}
  .bsteps{display:flex;flex-direction:column}
  .bs{display:flex;gap:18px;align-items:flex-start;text-align:left;width:100%;background:none;border:0;
    border-top:1px solid var(--line);padding:20px 6px;cursor:pointer;font-family:inherit;outline:none;
    transition:background .35s,padding-left .35s var(--ease)}
  .bs:last-child{border-bottom:1px solid var(--line)}
  .bs:hover,.bs.on,.bs:focus-visible{background:linear-gradient(90deg,rgba(193,130,60,.08),transparent 75%);padding-left:14px}
  .bn{font-family:"Space Mono","Space Mono Fallback";font-size:12px;color:var(--concrete);flex:none;margin-top:5px;transition:color .3s}
  .bs.on .bn{color:var(--oxide-bright)}
  .bt{display:block;min-width:0}
  .bh{display:block;font-family:"Archivo","Archivo Fallback";font-weight:700;font-size:1.18rem;letter-spacing:-.01em;color:var(--limestone);transition:color .3s}
  .bs.on .bh{color:var(--oxide-bright)}
  .bp{display:block;color:var(--concrete);font-size:.9rem;line-height:1.5;max-height:0;opacity:0;overflow:hidden;
    transition:max-height .45s var(--ease),opacity .4s,margin-top .4s}
  .bs.on .bp{max-height:80px;opacity:1;margin-top:7px}
  .slab{border:1px solid var(--line);border-radius:8px;background:rgba(11,10,14,.42);backdrop-filter:blur(2px);padding:22px 18px}
  .slab svg{width:100%;height:auto;display:block}
  .lay{opacity:0;transform:translateY(14px);transition:opacity .5s var(--ease),transform .6s var(--ease)}
  .lay.show{opacity:1;transform:none}
  /* readable labels, parked clear of the drawing with leader lines */
  .llab{font-family:"Inter","Inter Fallback",system-ui,sans-serif;font-size:13px;font-weight:500;letter-spacing:.005em;fill:var(--limestone);dominant-baseline:middle}
  .llab.oxide{fill:var(--oxide-bright)}
  .lead{fill:none;stroke:var(--line-strong);stroke-width:1}
  .lead.oxide{stroke:var(--oxide)}
  @media(max-width:900px){
    .proc-build{grid-template-columns:1fr;gap:26px}
    .slab{padding:14px;order:-1}
  }
  @media (prefers-reduced-motion:reduce){.lay{opacity:1!important;transform:none!important}}
  /* ---------- Joints de contrôle : le trait de scie entre les sections ---------- */
  .joint{position:relative;z-index:3;height:3px;pointer-events:none;
    background:linear-gradient(180deg,rgba(0,0,0,.78),rgba(255,255,255,.05));
    box-shadow:0 1px 0 rgba(255,255,255,.03)}

  /* ---------- Signature: coulée, curseur, rail ---------- */
  /* La coulée est écartée dès <head> (mobile, réduction de mouvement, option) :
     le voile n'est jamais peint et les états d'entrée s'appliquent d'emblée. */
  html.betonsw-nopour .loader{display:none}
  .loader{position:fixed;inset:0;z-index:200;background:#15141a;overflow:hidden;
    transition:opacity .4s ease;transform-origin:50% 50%;
    /* failsafe: if the script never runs, CSS retires the loader on its own */
    animation:betonsw-loader-failsafe .1s linear 6s forwards}
  @keyframes betonsw-loader-failsafe{to{opacity:0;visibility:hidden;pointer-events:none}}
  .loader.done{opacity:0;visibility:hidden;pointer-events:none;
    transition:opacity .4s ease,visibility 0s linear .4s;animation:none}
  .loader canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
  /* ---------- Curseur en croix (ordinateur seulement) ----------
     Même dessin qu'avant — deux traits et un losange — mais trois défauts corrigés :

     1. La boîte passe de 24 à 25 px, donc impaire. Les traits se posaient à
        11,5 px, c'est-à-dire à cheval sur deux pixels : le navigateur les rendait
        en deux colonnes grises au lieu d'une ligne nette. À 12 px sur une boîte
        de 25, le trait tombe pile sur la colonne du pointeur.
     2. Les traits se croisaient en plein milieu et bouchaient le point qu'ils
        sont censés désigner. Ils sont maintenant interrompus au centre, comme
        sur un vrai réticule : c'est le vide qui pointe.
     3. Le losange débordait. Un carré de 20 px tourné à 45° mesure 28 px de
        diagonale — il sortait donc de la boîte de 24 et dépassait les traits.
        Réduit, ses pointes s'arrêtent juste avant les extrémités.

     L'ombre portée n'ajoute rien au dessin : elle empêche seulement le trait
     d'un pixel de disparaître sur les photos claires de béton. */
  .cur{position:fixed;left:0;top:0;z-index:150;width:25px;height:25px;pointer-events:none;opacity:0;
    transform:translate3d(-999px,-999px,0);transition:opacity .2s;
    filter:drop-shadow(0 0 1.5px rgba(0,0,0,.6))}
  body.cur-on .cur{opacity:1}
  .cur b,.cur s{position:absolute;text-decoration:none}
  .cur b{left:12px;top:0;width:1px;height:25px;
    background:linear-gradient(to bottom,var(--oxide-bright) 0 9px,transparent 9px 16px,var(--oxide-bright) 16px 25px)}
  .cur s{top:12px;left:0;height:1px;width:25px;
    background:linear-gradient(to right,var(--oxide-bright) 0 9px,transparent 9px 16px,var(--oxide-bright) 16px 25px)}
  .cur u{position:absolute;inset:5px;border:1px solid rgba(220,155,76,.42);transform:rotate(45deg)}
  body.cur-on,body.cur-on a,body.cur-on button,body.cur-on .sw,body.cur-on .pat,body.cur-on .tcard{cursor:none}
  /* La croix vaut aussi sur le formulaire. Le thème rendait la main au curseur
     système sur les champs — ce qui cassait l'effet précisément là où le visiteur
     s'attarde le plus longtemps. La croix a un centre net, la saisie reste
     précise. Le pointeur système revient de toute façon sur écran tactile, et
     si l'effet est décoché dans Béton SW → Effets. */
  body.cur-on input,body.cur-on textarea,body.cur-on select,body.cur-on label{cursor:none}
  /* `.contact button[type="submit"]` est plus spécifique que `body.cur-on button` :
     sans cette règle, le bouton d'envoi restait le seul à afficher la main système. */
  body.cur-on .contact button[type="submit"],
  body.cur-on .contact button[type="submit"].sending{cursor:none}
  /* section rail */
  /* align-items explicite : .rail est un <nav>, et la règle générique nav{align-items:center}
     centrait chaque entrée. Comme chacune est large comme son libellé, « Réalisations »
     débordait de 16 px à gauche des autres. */
  .rail{position:fixed;left:22px;top:50%;transform:translateY(-50%);z-index:50;display:none;flex-direction:column;align-items:flex-start;gap:2px}
  .rl{display:flex;align-items:center;gap:11px;padding:7px 0;color:var(--concrete);transition:color .3s}
  /* Le retrait suit la longueur du trait, pour que l'ecart reste le meme dans
     les deux etats. Fige a 24px, le trait actif (26px) passait PAR-DESSUS le
     chiffre : -2px d'ecart au lieu des 11px du repos. Les 11px retenus sont
     ceux qui separent deja le chiffre du libelle — meme respiration partout. */
  .rn{font-family:"Space Mono","Space Mono Fallback";font-size:10px;position:relative;padding-left:24px;
    transition:padding-left .35s var(--ease)}
  .rn::before{content:"";position:absolute;left:0;top:50%;width:13px;height:1px;background:currentColor;
    transition:width .35s var(--ease),background .35s}
  .rl i{font-style:normal;font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.04em;opacity:0;transform:translateX(-6px);
    transition:opacity .3s,transform .3s;white-space:nowrap}
  .rl.on{color:var(--oxide-bright)}
  .rl.on .rn{padding-left:37px}          /* 37 - 26 = 11, comme au repos : 24 - 13 */
  .rl.on .rn::before{width:26px;background:var(--oxide)}
  .rl.on i,.rl:hover i{opacity:1;transform:none}
  .rl:hover{color:var(--limestone)}
  @media (min-width:1500px){.rail{display:flex}}
  @media (hover:none),(pointer:coarse){.cur{display:none}body.cur-on *{cursor:auto!important}}
  @media (prefers-reduced-motion:reduce){.loader{display:none}}

  /* ---------- Motifs ---------- */
  .pat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
  .pat{position:relative;overflow:hidden;border-radius:6px;aspect-ratio:4/3;background:var(--slab-2);
    border:1px solid var(--line);cursor:pointer;outline:none;transition:border-color .4s;
    --rest:grayscale(.2) brightness(.88)}
  .pat img{width:100%;height:100%;object-fit:cover;display:block;filter:var(--rest);
    transition:transform 1s var(--ease),filter .95s var(--ease-out)}
  .pat:hover,.pat:focus-visible{border-color:rgba(220,155,76,.5)}
  /* Arrivée (C + E) : le cadre ne bouge jamais — la photo monte dans son cadre
     et passe de flou à net. Le reveal générique est neutralisé pour la carte. */
  .pat.reveal{opacity:1;transform:none;transition:border-color .4s}
  .pat.reveal img{transform:translateY(100%) scale(1.04);filter:blur(16px) var(--rest)}
  .pat.reveal.in img{transform:none;filter:blur(0) var(--rest)}
  .pat.reveal.in:hover img,.pat.reveal.in:focus-visible img{transform:scale(1.05);filter:blur(0) grayscale(0) brightness(1) saturate(1.05)}
  .pat::after{content:"";position:absolute;inset:0;pointer-events:none;box-shadow:inset 0 0 0 1px rgba(220,155,76,0);transition:box-shadow .4s}
  .pat:hover::after,.pat:focus-visible::after{box-shadow:inset 0 0 0 1px rgba(220,155,76,.45)}
  .pat-label{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:20px;display:flex;
    justify-content:space-between;align-items:flex-end;gap:12px;
    background:linear-gradient(180deg,transparent,rgba(16,15,19,.9));pointer-events:none}
  .pat-label h3{font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:1.28rem;letter-spacing:-.01em;transition:color .4s}
  .pat:hover .pat-label h3,.pat:focus-visible .pat-label h3{color:var(--oxide-bright)}
  .pat-label .n{font-family:"Space Mono","Space Mono Fallback";font-size:11px;letter-spacing:.1em;color:var(--oxide-bright);flex:none}
  .pat .stamp{position:absolute;top:14px;left:14px;z-index:3;font-family:"Space Mono","Space Mono Fallback";font-size:10.5px;
    letter-spacing:.2em;text-transform:uppercase;color:var(--fog);background:rgba(16,15,19,.66);
    border:1px solid rgba(220,155,76,.55);padding:5px 10px;border-radius:2px;box-shadow:0 2px 10px rgba(0,0,0,.35);
    opacity:0;transform:translateY(-6px);transition:opacity .4s,transform .4s}
  .pat:hover .stamp,.pat:focus-visible .stamp{opacity:1;transform:none}
  /* Téléphones : on garde la montée, on retire le flou — six photos floutées,
     c'est le seul effet qui saccade sur un mobile milieu de gamme. */
  @media (max-width:900px){
    .pat.reveal img{filter:var(--rest)}
    .pat.reveal.in img{filter:var(--rest)}
  }
  @media (prefers-reduced-motion:reduce){
    .pat.reveal img,.pat.reveal.in img{transform:none;filter:var(--rest)}
  }
  /* Touch devices have no hover — show the motif revealed. */
  @media (hover:none){
    .pat{--rest:grayscale(0) brightness(.98) saturate(1.05)}
    .pat .stamp{opacity:1;transform:none}
    .pat::after{box-shadow:inset 0 0 0 1px rgba(220,155,76,.28)}
    .pat:active img{transform:scale(1.04)}
  }

  /* ---------- Preuve / statistiques ---------- */

  /* margin-top, et non padding : .proof porte un fond (ligne 104), donc du
     rembourrage ne fait qu'agrandir la boite sans jamais decoller son bord
     haut du bandeau. Seule une marge laisse voir la texture de fond au-dessus. */
  /* La marge est sur le joint, pas sur la section : ainsi le trait descend
     AVEC la boite et se pose sur son bord haut. Posee sur .proof, elle
     laissait le joint colle au bandeau, 72 px plus haut. */
  .joint-air{margin-top:72px}
  .proof{padding:62px 0}
  .proof-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:30px}
  .stat{position:relative;padding-left:20px}
  .stat::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;background:var(--oxide);opacity:.55}
  .stat b{display:block;font-family:"Archivo","Archivo Fallback";font-weight:900;font-size:clamp(2.2rem,3.8vw,3.2rem);
    letter-spacing:-.025em;line-height:1;color:var(--fog)}
  .stat span{display:block;margin-top:10px;font-family:"Space Mono","Space Mono Fallback";font-size:10.5px;letter-spacing:.18em;
    text-transform:uppercase;color:var(--concrete)}

  /* ---------- Politique de confidentialité (fenêtre) ---------- */
  .pmodal{position:fixed;inset:0;z-index:140;background:rgba(9,8,11,.82);
    display:flex;align-items:center;justify-content:center;padding:24px;
    opacity:0;pointer-events:none;transition:opacity .3s var(--ease-out)}
  .pmodal.open{opacity:1;pointer-events:auto}
  .pmodal-inner{display:flex;flex-direction:column;width:min(820px,100%);max-height:86svh;
    background:var(--slab);border:1px solid var(--line-strong);border-radius:8px;overflow:hidden;
    transform:translateY(14px) scale(.99);transition:transform .35s var(--ease-out)}
  .pmodal.open .pmodal-inner{transform:none}
  .pmodal-bar{flex:none;display:flex;align-items:center;gap:16px;padding:16px 18px;
    border-bottom:1px solid var(--line);background:var(--slab-2)}
  .pmodal-title{flex:1;font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:1.02rem;letter-spacing:-.01em;color:var(--fog)}
  .pmodal-tools{display:flex;align-items:center;gap:8px}
  .pmodal-btn{font-family:"Space Mono","Space Mono Fallback";font-size:11px;letter-spacing:.12em;text-transform:uppercase;
    color:var(--limestone);background:none;border:1px solid var(--line-strong);border-radius:3px;
    padding:8px 12px;cursor:pointer;transition:border-color .2s,color .2s}
  .pmodal-btn:hover{border-color:var(--oxide);color:var(--oxide-bright)}
  .pmodal-x{width:36px;padding:8px 0;text-align:center}
  .pmodal-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:26px 30px 34px;
    overscroll-behavior:contain}
  .pmodal-date{font-family:"Space Mono","Space Mono Fallback";font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;
    color:var(--concrete);margin:0 0 24px;padding-bottom:18px;border-bottom:1px solid var(--line)}
  .pmodal-body h2:first-of-type{margin-top:0}
  body.pmodal-open{overflow:hidden}
  @media (max-width:680px){
    .pmodal{padding:0}
    .pmodal-inner{max-height:100svh;height:100svh;border:0;border-radius:0;width:100%}
    .pmodal-body{padding:22px 20px 40px}
    .pmodal-bar{padding:14px}
    .pmodal-title{font-size:.92rem}
    .pmodal-btn{font-size:10px;padding:7px 9px}
  }
  @media (prefers-reduced-motion:reduce){
    .pmodal,.pmodal-inner{transition:none}
  }


  /* Sans coulée (mobile, réduction de mouvement) : les entrées du héros se
     font en un clin d'œil — la mise en scène lente appartient au desktop. */
  html.betonsw-nopour .hero-media,html.betonsw-nopour .hero .eyebrow,html.betonsw-nopour .hero .lede,
  html.betonsw-nopour .hero-cta,html.betonsw-nopour .ln>span,html.betonsw-nopour .viewfinder,
  html.betonsw-nopour .hud{transition-delay:0s!important;transition-duration:.45s!important}

  /* ---------- Pages légales ---------- */
  /* La signature Béton SW en tête de la politique — cliquable, retour à l'accueil. */
  .legal-brand{display:inline-flex;align-items:center;gap:14px;margin-bottom:22px;
    text-decoration:none;transition:opacity .25s}
  .legal-brand:hover{opacity:.78}
  .legal-brand img{height:52px;width:auto;display:block}
  .legal-brand .lb-txt{display:flex;flex-direction:column;gap:3px}
  .legal-brand b{font-family:"Archivo","Archivo Fallback";font-weight:900;font-size:1.25rem;letter-spacing:-.02em;
    color:var(--fog);line-height:1}
  .legal-brand i{font-family:"Space Mono","Space Mono Fallback";font-style:normal;font-size:9.5px;letter-spacing:.18em;
    text-transform:uppercase;color:var(--concrete);line-height:1}
  .pmodal-body .legal-brand{margin-bottom:18px}
  .pmodal-body .legal-brand img{height:44px}
  .pmodal-body .legal-brand b{font-size:1.1rem}
  @media (max-width:680px){
    .legal-brand img{height:44px}
    .legal-brand b{font-size:1.08rem}
  }
  .wrap-narrow{max-width:800px}
  .legal{padding-top:150px}
  .legal-h{font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:clamp(2rem,4.4vw,3.2rem);line-height:1.08;margin:14px 0 10px}
  .legal-date{font-family:"Space Mono","Space Mono Fallback";font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--concrete);margin-bottom:44px;padding-bottom:24px;border-bottom:1px solid var(--line)}
  .legal-body{color:var(--limestone);line-height:1.75}
  .legal-body h2{font-family:"Archivo","Archivo Fallback";font-weight:700;font-size:1.28rem;color:var(--fog);margin:44px 0 14px;letter-spacing:-.01em}
  .legal-body p{margin:0 0 16px}
  .legal-body ul{margin:0 0 18px;padding-left:20px}
  .legal-body li{margin-bottom:9px}
  .legal-body strong{color:var(--fog);font-weight:600}
  .legal-body a{color:var(--oxide-bright);text-decoration:underline;text-decoration-color:rgba(220,155,76,.4);text-underline-offset:3px}
  .legal-body a:hover{text-decoration-color:var(--oxide-bright)}
  .legal-back{margin-top:56px;padding-top:26px;border-top:1px solid var(--line)}
  .legal-back a{font-family:"Space Mono","Space Mono Fallback";font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--concrete)}
  .legal-back a:hover{color:var(--oxide-bright)}
  .foot a{color:var(--concrete);text-decoration:underline;text-decoration-color:var(--line-strong);text-underline-offset:2px}
  .foot a:hover{color:var(--oxide-bright)}

  /* ---------- 404 ---------- */
  .e404{min-height:78svh;align-items:center;padding-top:120px;padding-bottom:80px}
  .e404 .hero-inner{position:relative;opacity:1;transform:none}
  .e404 h1{font-size:clamp(2.4rem,7vw,5rem)}
  .e404 .lede{max-width:52ch}
  .e404-links{display:flex;flex-wrap:wrap;gap:10px 26px;margin-top:44px;padding-top:26px;border-top:1px solid var(--line)}
  .e404-links a{font-family:"Space Mono","Space Mono Fallback";font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--concrete);transition:color .25s}
  .e404-links a:hover{color:var(--oxide-bright)}

  /* ---------- Contact ---------- */
  .contact{position:relative;overflow:clip}
  .cta-grid{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:start}
  .cta-grid h2{font-weight:800;font-size:clamp(2.6rem,5vw,4.2rem);line-height:1.04;margin-top:18px;max-width:12ch}
  .cta-grid h2 em{font-style:normal;color:var(--oxide-bright)}
  .cinfo{margin-top:24px}
  .big{display:inline-block;font-family:"Archivo","Archivo Fallback";font-weight:900;font-size:clamp(1.9rem,3.4vw,2.7rem);
    letter-spacing:-.025em;color:var(--oxide-bright);margin-bottom:24px;transition:color .3s}
  .big:hover{color:var(--fog)}
  .line{display:grid;grid-template-columns:110px 1fr;gap:18px;align-items:baseline;
    padding:16px 0;border-top:1px solid var(--line)}
  .line:last-child{border-bottom:1px solid var(--line)}
  .line a,.line span:last-child{color:var(--limestone);line-height:1.5;font-size:.97rem}
  .line a{transition:color .25s}
  .line a:hover{color:var(--oxide-bright)}
  /* Adresse : sans repère visuel, personne ne devine que c'est un lien —
     épingle + soulignement, et z-index pour qu'aucun calque ne l'intercepte.
     L'épingle est sortie du texte (dans la gouttière) : l'adresse commence donc
     exactement à la même verticale que le courriel au-dessus. */
  .line .maps{position:relative;z-index:2;display:inline-block;
    text-decoration:underline;text-decoration-color:rgba(220,155,76,.45);text-underline-offset:3px;
    text-decoration-thickness:1px;padding:2px 0}
  .line .maps svg{position:absolute;left:-23px;top:6px;width:14px;height:14px;color:var(--oxide);transition:color .25s}
  .line .maps:hover{color:var(--oxide-bright);text-decoration-color:var(--oxide-bright)}
  .line .maps:hover svg{color:var(--oxide-bright)}
  .k{font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--concrete)}
  /* form */
  .contact form{background:var(--slab-2);border:1px solid var(--line);border-radius:7px;padding:30px}
  .contact label{display:block;font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.18em;text-transform:uppercase;
    color:var(--concrete);margin:18px 0 8px}
  .contact label:first-of-type{margin-top:0}
  .contact input,.contact textarea{width:100%;background:rgba(16,15,19,.6);border:1px solid var(--line-strong);
    border-radius:3px;padding:14px 15px;color:var(--fog);font-family:"Inter","Inter Fallback",system-ui,sans-serif;font-size:1rem;
    transition:border-color .25s,background .25s;outline:none}
  .contact input::placeholder,.contact textarea::placeholder{color:#8a8378}
  .contact input:focus,.contact textarea:focus{border-color:var(--oxide);background:rgba(16,15,19,.85)}
  .contact textarea{min-height:130px;resize:vertical;line-height:1.55}
  .contact button[type="submit"]{width:100%;margin-top:24px;font-family:"Space Mono","Space Mono Fallback";font-size:12px;font-weight:700;
    letter-spacing:.16em;text-transform:uppercase;color:#151318;background:var(--oxide);border:0;border-radius:3px;
    padding:17px 20px;cursor:pointer;transition:background .25s,transform .25s var(--ease)}
  .contact button[type="submit"]:hover{background:var(--oxide-bright);transform:translateY(-2px)}

  /* Pendant l'envoi : une coulée claire traverse le bouton, une fois par seconde.
     Le geste vient du métier — c'est la même idée que le loader, en beaucoup plus
     sobre. Elle s'arrête dès que la réponse arrive : rien ne tourne dans le vide. */
  .contact button[type="submit"]:disabled{opacity:1}          /* pas de grisé du navigateur */
  .contact button[type="submit"].sending{position:relative;overflow:hidden;cursor:progress;transform:none}
  .contact button[type="submit"].sending:hover{transform:none;background:var(--oxide)}
  .contact button[type="submit"].sending::after{
    content:"";position:absolute;inset:0;pointer-events:none;
    background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.34) 50%,transparent 100%);
    transform:translateX(-100%);
    animation:coulee-bouton 1.05s var(--ease) infinite;
  }
  @keyframes coulee-bouton{to{transform:translateX(100%)}}
  @media(max-width:820px){
    .joint-air{margin-top:44px}
    .proof{padding:44px 0}
    .proof-grid{grid-template-columns:repeat(2,1fr);gap:34px 26px}
    .contact form{padding:20px}
    .line{grid-template-columns:1fr;gap:5px}
    /* une seule colonne : plus de gouttière, l'épingle rentre dans le texte */
    .line .maps{padding-left:21px}
    .line .maps svg{left:0}
  }

  /* ---------- Réalisations ---------- */
  .reels{display:flex;flex-direction:column;gap:14px;margin-bottom:40px}
  .reel{overflow:hidden;position:relative;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
  /* will-change : la bande fait ~10 000 px de large — sans cette promotion GPU,
     certains navigateurs la re-rastérisent au CPU pendant le défilement (saccades). */
  /* La piste fait 12 406 px ; la moitié parcourue en une durée donne la
     vitesse. 62 s = 100 px/s (trop vif depuis que les vignettes font 400 px),
     90 s = 69 px/s, 180 s = 34 px/s — l'allure retenue, posée. */
  .reel-track{display:flex;gap:14px;width:max-content;animation:reel 180s linear infinite;will-change:transform}
  .reel-track.rev{animation-direction:reverse}
  .reel:hover .reel-track{animation-play-state:paused}
  @keyframes reel{to{transform:translateX(-50%)}}
  /* Largeur FIXE, et non déduite du ratio de l'image. Sans elle, une vignette
     qui finit de charger change de largeur au milieu du défilement : la piste
     s'allonge, le translateX(-50%) vise une cible mouvante, et la bande saute. */
  .reel-item{flex:none;display:block;width:400px;height:300px;border-radius:5px;overflow:hidden;background:var(--slab-2);cursor:zoom-in;
    border:1px solid transparent;transition:border-color .35s}
  .reel-item:hover{border-color:rgba(220,155,76,.45)}
  .reel-item img{height:100%;width:100%;object-fit:cover;display:block;filter:brightness(.9) saturate(1.04);transition:transform .7s var(--ease),filter .5s}
  /* item dimensionné par aspect-ratio : l'image remplit la boîte réservée */
  .reel-item.sz img{width:100%;object-fit:cover}
  .reel-item:hover img{transform:scale(1.06);filter:brightness(1.05) saturate(1.1)}
  .more-wrap{display:flex;justify-content:center;margin-top:38px}
  .more-btn{font-family:"Space Mono","Space Mono Fallback";font-size:16px;letter-spacing:.1em;text-transform:uppercase;font-weight:700;
    color:#151318;background:var(--oxide-bright);border:2px solid var(--oxide-bright);border-radius:3px;
    padding:22px 44px;min-height:60px;cursor:pointer;box-shadow:0 12px 32px -14px rgba(220,155,76,.75);
    transition:border-color .3s,background .3s,color .3s,transform .25s}
  .more-btn:hover{background:#fff;border-color:#fff;color:#151318;transform:translateY(-2px)}

  /* ---------- Full-screen gallery viewer ---------- */
  .lb{position:fixed;inset:0;z-index:120;background:#09080b;
    display:flex;flex-direction:column;opacity:0;pointer-events:none;transition:opacity .35s var(--ease-out)}
  /* pendant que la galerie est ouverte : les boucles derrière (bandeau + carrousels) sont mises en pause */
  body.lb-open .mq-track,body.lb-open .reel-track{animation-play-state:paused!important}
  .lb.open{opacity:1;pointer-events:auto}
  .lb-bar{flex:none;display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px;padding:14px 20px;border-bottom:1px solid var(--line)}
  .lb-brand{flex:none;font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:1rem;letter-spacing:-.01em}
  /* La legende cede avant les boutons : elle se tronque plutot que de les pousser hors du cadre. */
  .lb .cap{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    font-family:"Space Mono","Space Mono Fallback";font-size:12px;letter-spacing:.16em;color:var(--concrete)}
  .lb-tools{flex:0 1 auto;min-width:0;margin-left:auto;display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}
  .lb-btn{font-family:"Space Mono","Space Mono Fallback";font-size:14px;letter-spacing:.1em;text-transform:uppercase;font-weight:700;color:var(--fog);
    background:none;border:2px solid var(--line-strong);border-radius:3px;padding:14px 20px;min-height:48px;cursor:pointer;transition:.25s}
  .lb-btn:hover{border-color:var(--oxide-bright);color:var(--oxide-bright)}
  .lb-btn.on{background:var(--oxide);border-color:var(--oxide);color:#151318;font-weight:700}
  .lb-x{background:var(--oxide-bright);border-color:var(--oxide-bright);color:#151318}
  .lb-x:hover{background:#fff;border-color:#fff;color:#151318}
  .lb-stage{position:relative;flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:20px}
  .lb-stage img{max-width:100%;max-height:100%;object-fit:contain;border-radius:4px;
    box-shadow:0 40px 90px -24px rgba(0,0,0,.85);opacity:0;transform:scale(.97);
    transition:opacity .3s,transform .45s var(--ease-out)}
  .lb.open .lb-stage img.ready{opacity:1;transform:none}
  .lb .nav{position:absolute;top:50%;transform:translateY(-50%);width:50px;height:50px;border:1px solid var(--line-strong);
    background:rgba(0,0,0,.42);color:var(--fog);border-radius:3px;font-size:22px;cursor:pointer;z-index:2;transition:.25s}
  .lb .nav:hover{border-color:var(--oxide);background:rgba(193,130,60,.14)}
  .lb .prev{left:20px}.lb .next{right:20px}
  .lb-film{flex:none;display:flex;gap:8px;padding:12px 16px;overflow-x:auto;border-top:1px solid var(--line);scroll-behavior:smooth}
  .lb-film::-webkit-scrollbar{height:3px}.lb-film::-webkit-scrollbar-thumb{background:var(--oxide)}
  .lb-film img{flex:none;height:64px;width:88px;object-fit:cover;border-radius:3px;cursor:pointer;
    opacity:.42;border:1px solid transparent;transition:opacity .25s,border-color .25s}
  .lb-film img:hover{opacity:.8}
  .lb-film img.on{opacity:1;border-color:var(--oxide)}
  .lb-grid{position:absolute;top:76px;left:0;right:0;bottom:0;z-index:3;overflow:auto;padding:18px;
    background:rgba(9,8,11,.99);display:flex;flex-wrap:wrap;align-content:flex-start;gap:9px}
  .lb-grid[hidden]{display:none}
  .lb-grid img{height:180px;flex:1 1 240px;min-width:130px;width:auto;object-fit:cover;border-radius:3px;cursor:zoom-in;
    border:1px solid transparent;transition:border-color .25s,filter .25s;background:var(--slab-2);filter:brightness(.9)}
  .lb-grid img:hover{filter:brightness(1.05)}

  /* ---------- Couleurs ---------- */
  .col-src{display:inline-block;font-family:"Space Mono","Space Mono Fallback";font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--oxide-bright)}
  .col-tease{display:grid;grid-template-columns:1fr 1fr;gap:18px}
  .tcard{border:1px solid var(--line);border-radius:7px;background:var(--slab-2);padding:26px;cursor:pointer;outline:none;
    transition:border-color .4s,transform .4s var(--ease)}
  .tcard:hover,.tcard:focus-visible{border-color:rgba(220,155,76,.5);transform:translateY(-4px)}
  .tcard h3{font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:1.5rem;letter-spacing:-.01em;margin:9px 0 7px;transition:color .35s}
  .tcard:hover h3,.tcard:focus-visible h3{color:var(--oxide-bright)}
  .tcard p{color:var(--concrete);font-size:.92rem;line-height:1.45;max-width:46ch}
  .tstrip{display:grid;grid-template-columns:repeat(8,1fr);gap:6px;margin:18px 0 16px}
  .tstrip span{aspect-ratio:1;border-radius:3px;background-size:cover;background-position:center;
    border:1px solid rgba(255,255,255,.08);transition:transform .4s var(--ease)}
  .tcard:hover .tstrip span{transform:translateY(-2px)}
  .tcard .chip{display:inline-block;font-family:"Space Mono","Space Mono Fallback";font-size:10.5px;font-weight:700;letter-spacing:.14em;
    text-transform:uppercase;color:var(--oxide-bright)}
  .tcard .chip b{display:inline-block;transition:transform .35s var(--ease)}
  .tcard:hover .chip b{transform:translateX(5px)}
  /* colour browser */
  .cbr{position:fixed;inset:0;z-index:125;background:#09080b;
    display:flex;flex-direction:column;opacity:0;pointer-events:none;transition:opacity .35s var(--ease-out)}
  .cbr.open{opacity:1;pointer-events:auto}
  .cbr-bar{flex:none;display:flex;align-items:baseline;gap:16px;padding:14px 20px;border-bottom:1px solid var(--line);flex-wrap:wrap}
  .cbr-title{font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:1.05rem;letter-spacing:-.01em}
  .cbr-src{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    font-family:"Space Mono","Space Mono Fallback";font-size:11px;letter-spacing:.14em;color:var(--concrete)}
  .cbr-tools{flex:0 1 auto;min-width:0;margin-left:auto;display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}
  .cbr-btn{font-family:"Space Mono","Space Mono Fallback";font-size:13.5px;letter-spacing:.1em;text-transform:uppercase;font-weight:700;color:var(--fog);
    background:none;border:2px solid var(--line-strong);border-radius:3px;padding:13px 18px;min-height:46px;cursor:pointer;transition:.25s}
  .cbr-btn:hover{border-color:var(--oxide-bright);color:var(--oxide-bright)}
  .cbr-x{background:var(--oxide-bright);border-color:var(--oxide-bright);color:#151318}
  .cbr-x:hover{background:#fff;border-color:#fff;color:#151318}
  .cbr-body{flex:1;overflow:auto;padding:20px 20px 44px}
  .cbr-inner{max-width:1180px;margin:0 auto}
  .cbr-note{font-family:"Space Mono","Space Mono Fallback";font-size:9.5px;letter-spacing:.06em;color:var(--concrete);line-height:1.65;margin:0 0 20px;max-width:96ch}
  /* swatches — shown at (or below) their true size in Interstar's chart */
  .sw-grid{display:grid;gap:12px;justify-items:center}
  .sw-grid[data-set="beton"]{grid-template-columns:repeat(auto-fill,minmax(83px,1fr))}
  .sw-grid[data-set="beton"] .sw{max-width:83px}
  .sw-grid[data-set="release"]{grid-template-columns:repeat(auto-fill,minmax(171px,1fr));gap:16px}
  .sw-grid[data-set="release"] .sw{max-width:171px}
  .sw{position:relative;width:100%}
  .sw-chip{display:block;position:relative;aspect-ratio:5/6;border-radius:4px;overflow:hidden;background:var(--c);
    border:1px solid rgba(255,255,255,.09);transition:transform .3s var(--ease),box-shadow .3s}
  .sw-grid[data-set="release"] .sw-chip{aspect-ratio:4/3}
  .sw-chip img{width:100%;height:100%;object-fit:cover;display:block}
  .sw:hover .sw-chip{transform:translateY(-3px);box-shadow:0 10px 20px -10px rgba(0,0,0,.8),0 0 0 1px var(--oxide-bright)}
  .sw b{display:block;font-family:"Space Mono","Space Mono Fallback";font-size:8.5px;letter-spacing:.04em;color:var(--oxide-bright);margin-top:6px}
  .sw i{display:block;font-style:normal;font-size:.7rem;color:var(--limestone);line-height:1.2;margin-top:1px}
  .sw:hover i{color:var(--fog)}
  .sw-dose{position:absolute;left:4px;top:4px;font-family:"Space Mono","Space Mono Fallback";font-size:8px;color:var(--fog);
    background:rgba(16,15,19,.72);border:1px solid rgba(220,155,76,.35);border-radius:2px;padding:1px 4px;opacity:0;transition:opacity .25s}
  .sw:hover .sw-dose{opacity:1}
  /* Une section par famille : le titre « sticky » ne dépasse jamais de la sienne,
     donc les titres ne s'empilent plus les uns sur les autres. */
  .sw-fam-group{margin-top:26px}
  /* :first-child ne correspondait jamais — le premier enfant de .cbr-inner est
     la note, pas un groupe. D'où un espace en trop tout en haut de la liste. */
  .sw-fam-group:first-of-type{margin-top:0}
  /* Le titre de famille ne bouge pas : il reste à sa place et défile avec ses
     échantillons, comme un simple séparateur. (Il était « sticky » : il se
     décollait, se figeait en haut de la fenêtre et passait par-dessus les
     échantillons, qui se retrouvaient coupés.) */
  .sw-fam{font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--limestone);
    margin:0 0 11px;padding:0 0 9px;border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:baseline}
  .sw-fam em{font-style:normal;color:var(--concrete);letter-spacing:.1em;text-transform:none}
  @media (max-width:1000px){.reel-item{width:320px;height:240px}}
  @media (max-width:860px){.reel-item{width:260px;height:195px}}
  @media (max-width:820px){
    .col-tease{grid-template-columns:1fr;gap:14px}
    .sw-grid{gap:9px}
    .sw-grid[data-set="release"]{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}
    .cbr-bar{padding:11px 14px;gap:10px}.cbr-body{padding:16px 14px 30px}
  }
  @media (max-width:680px){
    .lb-bar{padding:11px 14px;gap:10px}
    .lb-brand{display:none}
    /* Les deux commandes prennent toute la largeur et se partagent la ligne :
       impossible qu'une d'elles sorte du cadre, quel que soit son libellé.
       « Retour à la photo » est plus long que « Toutes les photos », donc le
       débordement n'arrivait qu'une fois la grille ouverte. */
    .lb-tools{flex:1 1 100%;width:100%}
    .lb-btn{flex:1 1 0;min-width:0;padding:13px 8px;font-size:12px;letter-spacing:.06em}
    .lb .nav{width:40px;height:40px;font-size:18px}
    .lb .prev{left:8px}.lb .next{right:8px}
    .lb-film img{height:48px;width:66px}
    .lb-grid{gap:6px;top:64px}
    .lb-grid img{height:112px;flex-basis:150px;min-width:92px}
    .reel-item{width:220px;height:165px}
  }
  .why-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
  .why-card{background:var(--graphite);padding:46px 42px;position:relative;overflow:hidden;transition:background .4s var(--ease-out)}
  .why-card:hover{background:var(--slab)}
  .why-card .edge{position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--oxide);transform:scaleY(0);transform-origin:top;transition:transform .55s var(--ease)}
  .why-card:hover .edge{transform:scaleY(1)}
  .why-card h3{font-family:"Archivo","Archivo Fallback";font-weight:700;font-size:1.5rem;letter-spacing:-.01em;margin-bottom:14px}
  .why-card p{color:var(--limestone);font-size:1.03rem;line-height:1.55}
  @media(max-width:680px){.why-grid{grid-template-columns:1fr}.why-card{padding:38px 26px}}
  /* SERVICES SPLIT */
  /* Produits & services — trois métiers, pas huit cartes. Aucun effet : de la hiérarchie. */
  .svc-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);
    border:1px solid var(--line);border-radius:2px;overflow:hidden}
  .svc-col{background:rgba(19,18,23,.55);padding:40px 32px 44px}
  /* the group header is a different voice from the services under it */
  .svc-col h3{font-family:"Archivo","Archivo Fallback";font-weight:900;font-size:1.72rem;letter-spacing:-.025em;line-height:1.05;
    color:var(--oxide-bright);padding-bottom:16px;position:relative}
  .svc-col h3::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:3px;background:var(--oxide-bright)}
  .svc-lede{color:var(--concrete);font-size:.86rem;margin-top:14px;line-height:1.55;max-width:32ch}
  .svc-col ul{list-style:none;margin-top:34px}
  .svc-col li{padding:18px 0;border-top:1px solid var(--line);transition:color .3s}
  .svc-col li b{display:block;font-family:"Archivo","Archivo Fallback";font-weight:700;font-size:1.04rem;letter-spacing:-.01em;
    color:var(--limestone);transition:color .3s}
  .svc-col li em{display:block;font-style:normal;font-size:.85rem;color:var(--concrete);margin-top:6px;line-height:1.55}
  .svc-col li:hover b{color:var(--oxide-bright)}
  @media(max-width:1000px){.svc-cols{grid-template-columns:1fr}.svc-col{padding:32px 24px 36px}}
  /* Service detail modal (tap-to-expand) */
  .svc-modal{position:fixed;inset:0;z-index:130;background:rgba(9,8,11,.94);backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;padding:20px;opacity:0;pointer-events:none;transition:opacity .3s var(--ease-out)}
  .svc-modal.open{opacity:1;pointer-events:auto}
  .svc-modal-inner{position:relative;width:min(560px,100%);max-height:88svh;overflow:auto;-webkit-overflow-scrolling:touch;background:var(--slab-2);border:1px solid var(--line-strong);border-radius:6px;transform:translateY(16px) scale(.985);transition:transform .35s var(--ease-out)}
  .svc-modal.open .svc-modal-inner{transform:none}
  .svc-modal-media{position:relative;aspect-ratio:4/3;background:var(--graphite);overflow:hidden}
  .svc-modal-media.contain{aspect-ratio:auto;max-height:62svh;background:#0e0d11}
  .svc-modal-media.contain img{object-fit:contain;height:auto;max-height:62svh}
  .svc-modal-media.contain::after{display:none}
  .svc-modal-media img{width:100%;height:100%;object-fit:cover;display:block}
  .svc-modal-media::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 58%,rgba(16,15,19,.55));pointer-events:none}
  .svc-modal-body{padding:22px 22px 26px}
  .svc-modal-idx{font-family:"Space Mono","Space Mono Fallback";font-size:12px;letter-spacing:.2em;color:var(--oxide-bright)}
  .svc-modal-title{font-family:"Archivo","Archivo Fallback";font-weight:800;font-size:1.5rem;line-height:1.12;letter-spacing:-.01em;margin:8px 0 12px;color:var(--fog)}
  .svc-modal-desc{font-size:1rem;line-height:1.55;color:var(--limestone)}
  .svc-modal-cta{display:inline-block;margin-top:20px;font-family:"Space Mono","Space Mono Fallback";font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--oxide-bright);border-bottom:1px solid var(--oxide);padding-bottom:3px}
  .svc-modal-cta.alt{margin-left:20px;color:var(--limestone);border-bottom-color:var(--line-strong)}
  .svc-modal-cta.alt:hover{color:var(--oxide-bright);border-bottom-color:var(--oxide)}
  .svc-modal-cta.alt[hidden]{display:none}
  .svc-modal-x{position:absolute;top:12px;right:12px;z-index:4;width:42px;height:42px;border:1px solid var(--line-strong);background:rgba(0,0,0,.4);color:var(--fog);border-radius:3px;font-size:16px;cursor:pointer;transition:border-color .2s,background .2s}
  .svc-modal-x:hover{border-color:var(--oxide);background:rgba(193,130,60,.14)}

  footer{border-top:1px solid var(--line);padding:48px 0}
  .foot{display:flex;justify-content:space-between;align-items:center;gap:24px;flex-wrap:wrap;font-size:13px;color:var(--concrete)}

  .reveal{opacity:0;transform:translateY(26px);transition:opacity .85s var(--ease-out),transform .85s var(--ease-out),clip-path 1.05s var(--ease)}
  .reveal.in{opacity:1;transform:none}

  /* Wipe-mask reveal: content unveils left→right behind a moving edge. */

  /* Section headings rise out of their own baseline. */
  .sechead.reveal h2{clip-path:inset(0 0 100% 0);transform:translateY(12px);transition:clip-path 1s var(--ease) .05s,transform 1s var(--ease) .05s}
  .sechead.reveal.in h2{clip-path:inset(0 0 -14% 0);transform:none}
  .sechead.reveal .idx{opacity:0;transition:opacity .8s var(--ease-out) .32s}
  .sechead.reveal.in .idx{opacity:1}

  /* .why-card owns a background transition — keep it while adding the reveal. */
  .why-card.reveal{transition:opacity .85s var(--ease-out),transform .85s var(--ease-out),background .4s var(--ease-out)}

  /* Staggered cascades — children arrive in sequence, not as one slab. */
  .proof-grid .stat:nth-child(2){transition-delay:.08s}
  .proof-grid .stat:nth-child(3){transition-delay:.16s}
  .proof-grid .stat:nth-child(4){transition-delay:.24s}
  .why-grid .why-card:nth-child(2){transition-delay:.09s}
  .why-grid .why-card:nth-child(3){transition-delay:.18s}
  .why-grid .why-card:nth-child(4){transition-delay:.27s}
  .pat-grid .pat:nth-child(2).in img{transition-delay:.08s}
  .pat-grid .pat:nth-child(3).in img{transition-delay:.16s}
  .pat-grid .pat:nth-child(4).in img{transition-delay:.24s}
  .pat-grid .pat:nth-child(5).in img{transition-delay:.32s}
  .pat-grid .pat:nth-child(6).in img{transition-delay:.4s}


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

  @media (max-width:1000px){
    .about-grid,.cta-grid{grid-template-columns:1fr;gap:46px}
    .about-h{font-size:clamp(1.9rem,7vw,2.6rem);max-width:none;margin-bottom:24px}
    .about-side{align-items:stretch}
    .about-side .idx{align-self:flex-start;text-align:left}
    .about-side .idx::before{right:auto;left:0}
    .pat-grid{grid-template-columns:repeat(2,1fr)}
  }
  @media (max-width:680px){
    body{font-size:16px}
    .wrap{padding:0 20px}
    header{padding:16px 20px}
    header.scrolled{padding:12px 20px}
    .hud,.viewfinder{display:none}
    .hero{padding-top:76px}
    .hero h1{font-size:clamp(2.2rem,9vw,7.4rem);max-width:18ch}
    .hero-inner{padding-bottom:52px}
    .sec-pad{padding:80px 0}
    .pat-grid{grid-template-columns:repeat(2,1fr);gap:12px}
    .pat{aspect-ratio:1/1}
    .pat .stamp{top:10px;left:10px;font-size:9px;padding:4px 7px}
    .pat-label{padding:12px;flex-direction:column;align-items:flex-start;gap:3px}
    .pat-label h3{font-size:1rem;line-height:1.15}
    .pat-label .n{font-size:10px}
    .callbtn span.lbl{display:none}
    .callbtn{padding:12px 14px}
  }
  /* ---------- Performance & mobile ---------- */
  /* Pause looping animations while their section is off-screen (saves CPU/battery). */
  .anim-paused .mq-track,.anim-paused .reel-track{animation-play-state:paused!important}
  /* Let the browser skip layout/paint/decoding of off-screen gallery tiles. */

  .reel-item{content-visibility:auto;contain-intrinsic-size:400px 300px}
  /* Isolate heavy sections so their repaints don't invalidate the rest of the page. */
  .gallery,.patterns,.colors,.contact{contain:layout paint}
  @media (max-width:860px){
    /* Trim the least-visible backdrop blur on small screens. */
    /* mobile : le flou d'arrière-plan coûte cher à chaque image défilée — fond opaque à la place */
    header.scrolled{backdrop-filter:none;background:rgba(16,15,19,.96)}
    .reel-item{contain-intrinsic-size:260px 195px}
  }

  @media (prefers-reduced-motion:reduce){
    *{animation:none!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
    .reveal,.hero .eyebrow,.hero .lede,.hero-cta,.ln>span,.hero-media,.viewfinder,.hud,.sechead.reveal .idx{opacity:1!important;transform:none!important}
    .reveal,.sechead.reveal h2{clip-path:none!important}
    header{transform:none!important}
    .hero-media.px,.hero-inner.px{transform:none!important;opacity:1!important}
    .viewfinder.px,.hud.px{opacity:1!important}
  }

  /* Contact form status notices (WordPress) */
  .form-note{font-family:"Inter","Inter Fallback";font-size:.92rem;line-height:1.45;padding:12px 14px;border-radius:3px;border:1px solid var(--line-strong)}
  .form-note.ok{color:#c4e7cd;border-color:rgba(120,200,140,.4);background:rgba(80,160,100,.10)}
  .form-note.err{color:#f0c6b4;border-color:rgba(220,120,90,.45);background:rgba(200,90,60,.10)}
  /* Le message posé sous le bouton a besoin d'air : collé, il se lisait comme
     une deuxième moitié du bouton plutôt que comme une réponse. */
  .form-note.js{margin-top:18px}

.hp{position:absolute!important;left:-9999px!important;width:1px;height:1px;overflow:hidden}

  /* ---------- Photos jointes au formulaire ---------- */
  /* Le <input type=file> natif est impossible à habiller et n'a la même allure
     dans aucun navigateur. On le sort du flux visuel (sans le cacher au clavier
     ni aux lecteurs d'écran) et c'est son <label> qui devient le bouton. */
  .filefield{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
  .filefield input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
  .filebtn{
    font-family:"Space Mono","Space Mono Fallback";font-size:13px;font-weight:700;letter-spacing:.02em;
    border:1px solid var(--line-strong);color:var(--fog);padding:12px 19px;border-radius:2px;
    display:inline-flex;align-items:center;gap:9px;cursor:pointer;
    transition:border-color .25s,background .25s,color .25s;
  }
  .filebtn::before{content:"＋";font-size:15px;line-height:1;color:var(--oxide)}
  .filebtn:hover{border-color:var(--oxide);background:rgba(193,130,60,.08)}
  /* le focus vit sur l'input masqué : on le rend visible sur le bouton */
  .filefield input[type=file]:focus-visible + .filebtn{border-color:var(--oxide-bright);outline:2px solid var(--oxide);outline-offset:2px}
  .filelist{font-size:12.5px;line-height:1.5;color:var(--concrete);min-width:0;flex:1}
  .filelist.has{color:var(--limestone)}
  .filelist .bad{display:block;color:#f0c6b4}

  /* Vignettes des photos choisies — le visiteur doit voir ce qu'il envoie et
     pouvoir se raviser sur une seule photo, sans refaire toute sa sélection. */
  .filegrid{list-style:none;margin:14px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:10px}
  .filegrid:empty{margin:0}
  .filegrid li{position:relative;width:76px;height:76px;border:1px solid var(--line-strong);border-radius:2px;overflow:hidden;background:var(--slab-2)}
  .filegrid img{width:100%;height:100%;object-fit:cover;display:block}
  /* Aperçu impossible (HEIC hors Safari) : une pastille au lieu d'une image cassée. */
  .filegrid .ph-fallback{
    width:100%;height:100%;display:flex;align-items:center;justify-content:center;
    font-family:"Space Mono","Space Mono Fallback";font-size:11px;letter-spacing:.1em;
    color:var(--concrete);background:var(--slab-2);
  }
  .filegrid .rm{
    position:absolute;top:3px;right:3px;width:22px;height:22px;padding:0;
    display:flex;align-items:center;justify-content:center;
    border:0;border-radius:2px;cursor:pointer;
    background:rgba(16,15,19,.82);color:var(--fog);
    font-family:"Space Mono","Space Mono Fallback";font-size:13px;line-height:1;
    transition:background .2s,color .2s;
  }
  .filegrid .rm:hover,.filegrid .rm:focus-visible{background:var(--oxide);color:#151318}
  .filegrid .nm{
    position:absolute;left:0;right:0;bottom:0;padding:3px 5px;
    background:linear-gradient(transparent,rgba(16,15,19,.92));
    font-size:9.5px;line-height:1.3;color:var(--limestone);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .form-hint{margin-top:9px;font-size:11.5px;line-height:1.55;color:var(--concrete)}
  label .opt{font-family:"Space Mono","Space Mono Fallback";font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--concrete);margin-left:8px}

  /* reCAPTCHA : on masque le badge flottant de Google (il couvre le coin de
     l'écran) — Google l'autorise à condition d'afficher la mention ci-dessous. */
  .grecaptcha-badge{visibility:hidden}
  .form-legal{margin-top:16px;font-size:11.5px;line-height:1.55;color:var(--concrete)}
  .form-legal a{color:var(--limestone);text-decoration:underline;text-decoration-color:var(--line-strong);text-underline-offset:2px;transition:color .25s}
  .form-legal a:hover{color:var(--oxide-bright)}
  .recaptcha-note{margin-top:10px;font-size:11px;line-height:1.5;color:var(--concrete)}
  .recaptcha-note a{color:var(--limestone);text-decoration:underline;text-decoration-color:var(--line-strong);text-underline-offset:2px}
  .recaptcha-note a:hover{color:var(--oxide-bright)}
