/* ═══════════════════════════════════════════════════════════════════════════
   LEWIN PROD — feuille de style
   Trois registres de ton, dans cet ordre : le papier, le studio, la salle.
   Le gris « studio » est prélevé sur le fond du plan du boîtier, pour que la
   vidéo et la page ne fassent qu'une seule matière.
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
  /* couleurs */
  --papier:      #E7E6E1;   /* le papier — os minéral, légèrement froid */
  --papier-pale: #F2F1EE;   /* surface relevée */
  --studio:      #B5B1AD;   /* le fond de studio, prélevé sur la vidéo */
  --encre:       #14151A;   /* le texte */
  --noir:        #08090C;   /* la salle de projection */
  --sourdine:    #5E5F64;   /* texte secondaire — 5,1:1 sur le papier */
  --accent:      #E1214B;   /* uniquement en filet : point d'état, jauge */

  /* typographie — Melodrama pour les titres, Poppins italique pour le texte
     courant, IBM Plex Mono pour les métadonnées et le timecode.

     Cette variable s'appelait `--display`. Elementor pose `--display: flex` sur
     chacun de ses conteneurs pour piloter leur mise en page : à l'intérieur, la
     variable du site était écrasée et tous les titres demandaient la police
     « flex », qui n'existe pas. Ils tombaient sur la police de secours du
     navigateur. Ne jamais reprendre un nom de variable qu'un tiers peut poser
     sur un ancêtre : --display, --gap, --width, --align-items, --order. */
  --titre-police: "Melodrama", "Didot", "Bodoni MT", Georgia, serif;
  --texte:   "Poppins", -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
  --mono:    "IBM Plex Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;

  /* mesures */
  --marge: clamp(20px, 5vw, 88px);
  --filet: 1px solid rgb(20 21 26 / 0.14);
  --filet-clair: 1px solid rgb(255 255 255 / 0.16);
  --respire: clamp(80px, 12vh, 160px);
}

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

html { scroll-behavior: smooth; }

/* Le fond est declare sur html ET sur body : le theme en pose un sur body, et
   selon l'ordre d'insertion des feuilles il peut passer devant. html sert de
   filet, il est toujours peint sous le body. */
html { background: var(--papier); }

body {
  margin: 0;
  background: var(--papier);
  color: var(--encre);
  font-family: var(--texte);
  font-size: clamp(15px, 0.55vw + 13px, 17px);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* …et une troisième fois, avec du poids. Astra peint son blanc sur le conteneur
   de page — `.ast-page-builder-template` et `.ast-plain-container` sont des
   classes portées par <body>. Une classe (0,1,0) bat `body` seul (0,0,1) quel
   que soit l'ordre des feuilles : sans ces sélecteurs, la page revient au blanc
   du thème et tout le registre « papier » disparaît sous les sections
   transparentes (l'ouverture et les sections claires). */
/* Et le papier n'est pas un aplat : deux voiles très larges — un froid en haut
   à gauche, un chaud en bas à droite — lui donnent l'inégalité d'une matière
   éclairée, sans qu'aucun dégradé ne se lise comme tel. Ils sont posés comme
   couches de fond du body plutôt qu'en pseudo-élément : un `::before` en
   z-index négatif passerait sous le fond du body, qui n'est pas un contexte
   d'empilement. `fixed` garde la lumière en place pendant que la page défile. */
body.ast-page-builder-template,
body.ast-plain-container,
body.ast-separate-container,
body.ast-narrow-container,
body {
  background-color: var(--papier);
  background-image:
    radial-gradient(120% 90% at 12% -8%,  rgb(255 255 255 / 0.55), transparent 62%),
    radial-gradient(110% 80% at 92% 106%, rgb(181 177 173 / 0.40), transparent 58%);
  background-attachment: fixed, fixed;
  background-repeat: no-repeat, no-repeat;
}

/* Le grain. Une trame de bruit à 3,5 % sur toute la page, en `multiply` : elle
   mord le papier et ne fait rien sur les sections noires, où il n'y a plus de
   lumière à retirer. C'est elle qui sépare « un gris clair » de « du papier ».
   Elle se place sous le voile de transition (9000), la visionneuse (9500) et le
   curseur (9999) — un grain par-dessus une vidéo en plein écran serait une
   faute. */
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 8000;
  pointer-events: none;
  opacity: 0.035;
  mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)'/%3E%3C/svg%3E");
  background-size: 160px 160px;
}

/* Le grain n'a rien à faire sur une page imprimée. */
@media print { body::after { display: none; } }

/* Le corps de texte est en Poppins italique. Les éléments de formulaire
   n'héritent pas de la police du document : il faut les nommer explicitement. */
body,
button, input, textarea, select, optgroup {
  font-style: italic;
  font-family: var(--texte);
}

/* L'italique s'arrête au texte courant : les titres en Melodrama et les
   métadonnées en mono reprennent leur dessin droit, hérité de body sinon. */
.titre-geant, .titre-moyen, .titre-bloc,
.tete__nom, .menu a, .site__nom, .livrables__quoi, .piece__titre,
.film__meta h3, .deroule__liste h3, .prose__corps h2,
.faits dd, .contact__gros, .confiance__liste, .defile__lot,
.embed figcaption, .faq__item summary,
.mono, .etiquette, .tc,
.tete__sous, .tete__nav a, .tete__lien-contact, .tri__bouton, .bouton,
.champ__label, .champ__erreur, .devis__etat, .puce span,
.facette__cle, .outil__invite, .scope__legende, .fil ol,
.faits dt, .faits-liste dt, .zone__villes li, .renvoi,
.salle__vide, .perdu__code, .a-completer, .pied__reseaux a,
.faq__item summary::after {
  font-style: normal;
}

/* seule exception : l'emphase dans les grands titres reste en italique */
.titre-geant em { font-style: italic; }

img, video, canvas, iframe { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }

/* Les surfaces que l'on ne dessine pas portent quand même la page :
   sélection, curseur de saisie, barre de défilement, anneau de focus. */

::selection { background: var(--accent); color: #fff; }

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

html {
  scrollbar-width: thin;
  scrollbar-color: rgb(20 21 26 / 0.35) transparent;
}
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: rgb(20 21 26 / 0.3);
  border: 3px solid var(--papier);
  border-radius: 99px;
}
::-webkit-scrollbar-thumb:hover { background: rgb(20 21 26 / 0.5); }

input, textarea { caret-color: var(--accent); }

/* Le thème Astra colore tous les <button> au survol et au focus avec son bleu
   (#045cb4), étranger à cette palette. Ses sélecteurs `button:hover` et
   `button:focus` battent une règle qui ne déclare pas de fond : on déclare
   donc un fond explicite partout où un bouton peut être survolé. */
.piece__declencheur:hover, .piece__declencheur:focus,
.tete__burger:hover, .tete__burger:focus {
  background: none;
  border-color: transparent;
  color: inherit;
}

/* les chiffres qui changent de valeur ne doivent pas faire danser la ligne */
.tc, .faits dd, .deroule__jour { font-variant-numeric: tabular-nums; }

/* ── Typographie ─────────────────────────────────────────────────────────── */

.mono, .etiquette, .tc {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--sourdine);
}

.etiquette { margin: 0 0 clamp(18px, 3vh, 34px); }
.etiquette--clair { color: rgb(255 255 255 / 0.5); }

/* Les titres declarent leur couleur au lieu de l'heriter : un conteneur
   Elementor impose la sienne aux titres, et l'heritage la laissait passer. */
.titre-geant {
  font-family: var(--titre-police);
  font-weight: 400;
  font-size: clamp(3.2rem, 11.5vw, 11.5rem);
  line-height: 0.86;
  letter-spacing: -0.025em;
  margin: 0;
  color: var(--encre);
}
.titre-geant em { font-style: italic; font-weight: 400; }
.titre-geant--clair { color: #fff; }

.titre-moyen {
  font-family: var(--titre-police);
  font-weight: 400;
  font-size: clamp(2.2rem, 5.2vw, 4.6rem);
  line-height: 0.98;
  letter-spacing: -0.02em;
  margin: 0;
  color: var(--encre);
}

/* Titre de bloc : là où un libellé portait une vraie information, il devient
   un titre plutôt qu'une capitale décorative posée au-dessus du contenu. */
.titre-bloc {
  font-family: var(--titre-police);
  font-weight: 400;
  font-size: clamp(1.25rem, 1.6vw, 1.6rem);
  line-height: 1.15;
  letter-spacing: -0.015em;
  margin: 0 0 clamp(20px, 3vh, 34px);
  color: var(--encre);
}
.titre-bloc--clair { color: #fff; }

.chapeau {
  font-size: clamp(1.05rem, 1.1vw + 0.8rem, 1.35rem);
  line-height: 1.5;
  max-width: 46ch;
  margin: 0;
}

/* animation d'entrée : les lignes se lèvent depuis leur propre masque */
/* Le masque doit contenir les jambages. Avec une interligne serrée à 0.86, les
   glyphes descendent de 0.20em sous la boîte de ligne : le « g » de « L'image
   d'abord » était tranché net par l'`overflow: hidden`. On réserve 0.22em, et
   on reprend l'excédent en marge négative pour que l'espacement entre les
   lignes — et sous le titre — ne bouge pas d'un pixel. */
.ligne {
  display: block;
  overflow: hidden;
  padding-bottom: 0.22em;
  margin-bottom: -0.14em;
}
[data-monter] { display: block; }

/* La marge négative de la dernière ligne fusionnerait avec celle de la section
   et lui volerait sa respiration : le titre ferme donc son propre contexte de
   marges. Sans cela, l'ouverture perdait 28 px de hauteur en échange du
   jambage retrouvé. */
.titre-geant, .titre-moyen, .titre-bloc,
body .elementor-heading-title { display: flow-root; }

/* Dans les sections sombres, les titres passent au blanc.
   Les sections noires posent `color: #fff` et tout en hérite — sauf les
   titres, qui déclarent leur propre `color: var(--encre)` : une déclaration
   explicite bat toujours l'héritage. « Ce que ça donne à l'écran » et « Des
   films déjà tournés » s'affichaient donc en encre presque noire sur du noir,
   à un rapport de contraste de 1,09 : illisibles. Le site avait prévu des
   modificateurs `--clair` pour cela, mais il suffit d'un oubli pour perdre un
   titre. On règle la question à la source, section par section, pour que les
   titres ajoutés plus tard depuis Elementor soient couverts d'office. */
.acte   .titre-geant, .acte   .titre-moyen, .acte   .titre-bloc,
.contact .titre-geant, .contact .titre-moyen, .contact .titre-bloc,
.devis  .titre-geant, .devis  .titre-moyen, .devis  .titre-bloc,
.rappel .titre-geant, .rappel .titre-moyen, .rappel .titre-bloc {
  color: #fff;
}

.est-en-chargement [data-monter] { transform: translateY(115%); opacity: 0; }

[data-monter] {
  transform: translateY(0);
  opacity: 1;
  transition: transform 1.1s cubic-bezier(.16,1,.3,1), opacity .9s ease;
  transition-delay: var(--retard, 0ms);
}

/* ── En-tête ─────────────────────────────────────────────────────────────── */

/* L'espace au-dessus du logo est plus large que celui du dessous : l'en-tête
   flotte sur l'image plutôt que d'être collé à l'arête de l'écran, et l'œil
   comprend tout de suite qu'il s'agit d'une barre posée par-dessus la page et
   non du début du contenu. */
.tete {
  position: fixed;
  inset: 0 0 auto;
  z-index: 60;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: clamp(28px, 4.2vh, 48px) var(--marge) 20px;
  mix-blend-mode: difference;
  color: #fff;
  transition: transform .5s cubic-bezier(.16,1,.3,1), opacity .35s ease;
}
.tete.est-rangee {
  transform: translateY(-115%);
  opacity: 0;
}

/* La barre d'administration de WordPress est fixée en haut elle aussi, et passe
   devant : sans ce décalage, elle mange les premiers pixels de l'en-tête dès
   qu'on est connecté — ce qui donne l'impression d'un en-tête tronqué alors
   qu'il est simplement caché dessous. Le visiteur ne voit jamais cette barre,
   la règle ne le concerne pas. */
body.admin-bar .tete { top: 32px; }
@media screen and (max-width: 782px) {
  body.admin-bar .tete { top: 46px; }
}

.tete__marque { display: flex; align-items: baseline; gap: 12px; }
.tete__nom {
  font-family: var(--titre-police);
  font-size: 1.25rem;
  letter-spacing: -0.01em;
}
.tete__sous {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  white-space: nowrap;
  opacity: 0.6;
}

.tete__nav { display: flex; gap: clamp(16px, 2vw, 34px); }
.tete__nav a,
.tete__lien-contact {
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  white-space: nowrap;
  opacity: 0.75;
  transition: opacity .25s ease;
}
.tete__nav a:hover, .tete__lien-contact:hover { opacity: 1; }

.tete__lien-contact { display: flex; align-items: center; gap: 8px; }

.pastille {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 0 rgb(225 33 75 / .55);
  animation: pulse 2.6s ease-out infinite;
}
@keyframes pulse {
  70%  { box-shadow: 0 0 0 7px rgb(225 33 75 / 0); }
  100% { box-shadow: 0 0 0 0 rgb(225 33 75 / 0); }
}

.tete__burger { display: none; }

/* ── Ouverture ───────────────────────────────────────────────────────────── */

.ouverture {
  padding: clamp(120px, 20vh, 210px) var(--marge) var(--respire);
}

.ouverture__haut { margin-bottom: clamp(34px, 5vh, 60px); }

.titre-geant .ligne:nth-child(2) { padding-left: clamp(0px, 12vw, 220px); }

/* le cadre scope : s'ouvre du filet au 2.39:1 */
.scope {
  position: relative;
  margin: 0;
  aspect-ratio: 2.39 / 1;
  overflow: hidden;
  background: var(--encre);
  clip-path: inset(50% 0 50% 0);
  transition: clip-path 1.6s cubic-bezier(.16,1,.3,1) .25s;
}
.scope.est-ouvert { clip-path: inset(0 0 0 0); }

.scope__video {
  width: 100%; height: 100%;
  object-fit: cover;
  transform: scale(1.06);
  transition: transform 2.4s cubic-bezier(.16,1,.3,1) .25s;
}
.scope.est-ouvert .scope__video { transform: scale(1); }

.scope__legende {
  position: absolute;
  inset: auto 0 0 0;
  display: flex;
  justify-content: space-between;
  gap: 16px;
  padding: 14px clamp(14px, 2vw, 26px);
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgb(255 255 255 / 0.85);
  background: linear-gradient(transparent, rgb(8 9 12 / 0.6));
}
.scope__legende .tc { color: var(--accent); font-size: 10px; }

.ouverture__bas {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
  gap: clamp(28px, 5vw, 90px);
  align-items: start;
  margin-top: clamp(38px, 6vh, 70px);
}

.faits {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  margin: 0;
  border-top: var(--filet);
  padding-top: 18px;
}
.faits dt {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--sourdine);
}
.faits dd {
  margin: 6px 0 0;
  font-family: var(--titre-police);
  font-size: clamp(1.6rem, 2.6vw, 2.4rem);
  line-height: 1;
}

/* ── L'outil : le boîtier qui tourne au défilement ───────────────────────── */

.outil {
  position: relative;
  height: 420vh;                 /* la course de défilement du plan */
  background: var(--studio);
}

.outil__scene {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
}

.outil__canvas,
.outil__secours {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.outil__canvas { opacity: 0; transition: opacity .6s ease; }
.outil__canvas.est-pret { opacity: 1; }
.outil__canvas.est-pret + .outil__secours { opacity: 0; }
.outil__secours { transition: opacity .6s ease; }

/* le sol : prolonge la lumière du studio sous le boîtier pour que le texte
   se pose sur une surface claire plutôt que sur le sujet */
.outil__scene::after {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  height: 46%;
  pointer-events: none;
  background: linear-gradient(to top,
    rgb(199 195 191 / 0.78) 0%,
    rgb(197 193 189 / 0.48) 46%,
    rgb(195 191 187 / 0) 100%);
}

.outil__hud,
.facettes,
.rail { z-index: 2; }

.outil__hud {
  position: absolute;
  inset: auto auto clamp(28px, 6vh, 64px) var(--marge);
  max-width: 42ch;
  color: var(--encre);
}
.outil__hud .etiquette { color: rgb(20 21 26 / 0.55); }

.outil__invite {
  margin: 22px 0 0;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgb(20 21 26 / 0.55);
  transition: opacity .5s ease;
}
.outil__invite::before { content: "↓  "; }
.outil__invite.est-masque { opacity: 0; }

.facettes {
  position: absolute;
  inset: auto var(--marge) clamp(28px, 6vh, 64px) auto;
  width: min(34ch, 40vw);
  margin: 0;
  padding: 0;
  list-style: none;
}
.facette {
  position: absolute;
  right: 0;
  bottom: 0;
  width: 100%;
  opacity: 0;
  transform: translateY(14px);
  transition: opacity .55s ease, transform .55s cubic-bezier(.16,1,.3,1);
  pointer-events: none;
}
.facette.est-active { opacity: 1; transform: translateY(0); }

.facette__cle {
  display: block;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 12px;
}
.facette p {
  margin: 0;
  font-size: clamp(0.98rem, 0.6vw + 0.85rem, 1.15rem);
  line-height: 1.5;
  color: var(--encre);
}

.rail {
  position: absolute;
  inset: auto var(--marge) 0 var(--marge);
  height: 1px;
  background: rgb(20 21 26 / 0.18);
}
.rail__jauge {
  display: block;
  height: 100%;
  width: 0%;
  background: var(--accent);
}

/* ── Acte sombre : les films ─────────────────────────────────────────────── */

.acte {
  background: var(--noir);
  color: #fff;
  padding: var(--respire) var(--marge);
}

.acte__tete {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(24px, 4vw, 80px);
  align-items: end;
  padding-bottom: clamp(40px, 6vh, 72px);
}
.acte__tete .etiquette { grid-column: 1 / -1; margin-bottom: 0; }
.acte__note {
  margin: 0;
  max-width: 42ch;
  color: rgb(255 255 255 / 0.6);
}

.films {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(16px, 2.4vw, 40px);
}
.film--large { grid-column: 1 / -1; }

.film__cadre {
  position: relative;
  overflow: hidden;
  background: #101116;
  aspect-ratio: 21 / 9;
}
.film__cadre--haut { aspect-ratio: 4 / 3; }

/* Ce plan-là n'existe qu'en 640×360 : on garde son format d'origine et on
   l'empêche d'être agrandi au-delà, plutôt que de le recadrer en 4/3 et de
   l'étirer — c'est là que le manque de définition se voyait. */
.film__cadre--sd {
  aspect-ratio: 16 / 9;
  align-self: start;
}
.film__cadre--sd video { image-rendering: auto; }
.film__cadre video {
  width: 100%; height: 100%;
  object-fit: cover;
  transform: scale(1.02);
  transition: transform 1.2s cubic-bezier(.16,1,.3,1);
}
.film:hover .film__cadre video { transform: scale(1.06); }

.film__meta {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  padding: 16px 0 0;
  border-top: var(--filet-clair);
  margin-top: 16px;
}
.film__meta h3 {
  font-family: var(--titre-police);
  font-weight: 400;
  font-size: clamp(1.3rem, 1.6vw, 1.8rem);
  margin: 0;
}
.film__meta .mono { color: rgb(255 255 255 / 0.58); }

.complets { padding-top: var(--respire); }
.complets__grille {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(14px, 2vw, 30px);
}
.embed { margin: 0; }
.embed iframe {
  width: 100%;
  aspect-ratio: 16 / 9;
  border: 0;
  background: #101116;
}
.embed figcaption {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  padding-top: 12px;
  margin-top: 12px;
  border-top: var(--filet-clair);
  font-family: var(--titre-police);
  font-size: clamp(1rem, 1.1vw, 1.2rem);
}
.embed figcaption .mono { color: rgb(255 255 255 / 0.58); }

.confiance {
  padding-top: var(--respire);
  border-top: var(--filet-clair);
  margin-top: var(--respire);
}
.confiance__liste {
  display: flex;
  flex-wrap: wrap;
  gap: 10px clamp(24px, 4vw, 60px);
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--titre-police);
  font-size: clamp(1.2rem, 2.4vw, 2.1rem);
  color: rgb(255 255 255 / 0.55);
}

/* ── Sections claires ────────────────────────────────────────────────────── */

.section { padding: var(--respire) var(--marge); }
.section--pale { background: var(--papier-pale); }

.section__tete {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(24px, 4vw, 80px);
  align-items: end;
  padding-bottom: clamp(40px, 6vh, 72px);
}
.section__tete .etiquette { grid-column: 1 / -1; margin-bottom: 0; }
.section__note { margin: 0; max-width: 42ch; color: var(--sourdine); }

/* planche contact — trois portraits, un panoramique, trois portraits */
.planche {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: clamp(12px, 1.8vw, 30px) clamp(12px, 1.6vw, 26px);
}
.planche__item {
  position: relative;
  grid-column: span 4;
  margin: 0;
}
.planche__item--pano { grid-column: span 12; }

.planche__item img {
  width: 100%;
  height: auto;              /* neutralise l'attribut height du HTML */
  aspect-ratio: 3 / 4;
  object-fit: cover;
  transition: transform 1.4s cubic-bezier(.16,1,.3,1);
}
.planche__item--pano img { aspect-ratio: 21 / 9; }

.planche__item > a,
.planche__item picture,
.planche__item span.cadre { display: block; overflow: hidden; }
.planche__item .cadre { display: block; overflow: hidden; }
.planche__item:hover img { transform: scale(1.035); }

.planche__item figcaption { padding-top: 10px; font-size: 10px; }

/* sites */
.sites {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(16px, 2.4vw, 40px);
}
.site { display: block; }
.site__vue {
  display: block;
  overflow: hidden;
  background: var(--papier);
  aspect-ratio: 16 / 10;
  border: var(--filet);
}
.site__vue img {
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: top center;
  transition: transform 1.4s cubic-bezier(.16,1,.3,1);
}
.site:hover .site__vue img { transform: scale(1.03); }

.site__ligne {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 14px;
  flex-wrap: wrap;
  padding-top: 14px;
  margin-top: 14px;
  border-top: var(--filet);
}
.site__nom {
  font-family: var(--titre-police);
  font-size: clamp(1.1rem, 1.4vw, 1.5rem);
}

/* le déroulé */
.deroule {
  padding-top: var(--respire);
  margin-top: var(--respire);
  border-top: var(--filet);
}
.deroule__liste {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(24px, 4vw, 70px);
  margin: 0;
  padding: 0;
  list-style: none;
  counter-reset: none;
}
.deroule__liste li { border-top: 2px solid var(--encre); padding-top: 18px; }
.deroule__jour { display: block; color: var(--accent); margin-bottom: 14px; }
.deroule__liste h3 {
  font-family: var(--titre-police);
  font-weight: 400;
  font-size: clamp(1.3rem, 1.8vw, 1.8rem);
  margin: 0 0 10px;
}
.deroule__liste p { margin: 0; color: var(--sourdine); max-width: 34ch; }

/* ── Contact ─────────────────────────────────────────────────────────────── */

.contact {
  background: var(--noir);
  color: #fff;
  padding: var(--respire) var(--marge);
}
.contact .titre-geant .ligne:nth-child(2) { padding-left: clamp(0px, 12vw, 220px); }

.contact__grille {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(20px, 4vw, 70px);
  margin-top: clamp(40px, 7vh, 80px);
  padding-top: clamp(28px, 4vh, 44px);
  border-top: var(--filet-clair);
}
.contact__gros {
  font-family: var(--titre-police);
  font-size: clamp(1.4rem, 3.2vw, 2.8rem);
  line-height: 1.1;
  background-image: linear-gradient(var(--accent), var(--accent));
  background-size: 0% 1px;
  background-position: 0 100%;
  background-repeat: no-repeat;
  transition: background-size .5s cubic-bezier(.16,1,.3,1);
}
.contact__gros:hover { background-size: 100% 1px; }

.contact__note {
  margin: clamp(34px, 5vh, 56px) 0 0;
  color: rgb(255 255 255 / 0.58);
  max-width: 70ch;
  line-height: 1.9;
}

/* ── Devis ───────────────────────────────────────────────────────────────── */

.devis {
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  gap: clamp(32px, 5vw, 100px);
  align-items: start;
  padding: var(--respire) var(--marge);
  background: #0D0F14;
  border-top: var(--filet-clair);
  color: #fff;
}

.titre-moyen--clair { color: #fff; }

.devis__intro { position: sticky; top: clamp(90px, 14vh, 140px); }
.devis__note {
  margin: clamp(20px, 3vh, 32px) 0 0;
  max-width: 38ch;
  color: rgb(255 255 255 / 0.55);
}

.devis__form { display: grid; gap: clamp(24px, 3.4vh, 40px); }
.devis__paire {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(18px, 2.4vw, 34px);
}

.champ { display: block; min-width: 0; }
.champ--groupe { border: 0; margin: 0; padding: 0; }

.champ__label {
  display: block;
  padding: 0;
  margin-bottom: 12px;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgb(255 255 255 / 0.5);
}

.champ__saisie {
  width: 100%;
  padding: 10px 0 12px;
  background: none;
  border: 0;
  border-bottom: 1px solid rgb(255 255 255 / 0.22);
  border-radius: 0;
  color: #fff;
  font-family: var(--texte);
  font-size: 1.02rem;
  transition: border-color .35s ease;
}
.champ__saisie--long { resize: vertical; min-height: 6.5em; line-height: 1.55; }
.champ__saisie::placeholder { color: rgb(255 255 255 / 0.5); }
.champ__saisie:hover { border-bottom-color: rgb(255 255 255 / 0.4); }
.champ__saisie:focus {
  outline: none;
  border-bottom-color: var(--accent);
}
.champ__saisie:focus-visible { outline: none; }
.champ.est-invalide .champ__saisie { border-bottom-color: var(--accent); }

.champ__erreur {
  margin: 8px 0 0;
  min-height: 1em;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.1em;
  color: var(--accent);
}

/* puces de sélection */
.puces { display: flex; flex-wrap: wrap; gap: 8px; }
.puce { position: relative; cursor: pointer; }
.puce input {
  position: absolute;
  inset: 0;
  opacity: 0;
  cursor: pointer;
}
.puce span {
  display: block;
  padding: 9px 16px;
  border: 1px solid rgb(255 255 255 / 0.22);
  border-radius: 999px;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: rgb(255 255 255 / 0.72);
  transition: border-color .3s ease, color .3s ease, background-color .3s ease;
}
.puce:hover span { border-color: rgb(255 255 255 / 0.5); color: #fff; }
.puce input:checked + span {
  background: #fff;
  border-color: #fff;
  color: var(--noir);
}
.puce input:focus-visible + span { outline: 2px solid var(--accent); outline-offset: 3px; }

/* piège à robots */
.pot-de-miel {
  position: absolute;
  width: 1px; height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.devis__pied {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: clamp(18px, 3vw, 44px);
  flex-wrap: wrap;
  padding-top: clamp(8px, 2vh, 18px);
}

.bouton {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  padding: 16px 30px;
  background: #fff;
  border: 0;
  border-radius: 999px;
  color: var(--noir);
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .35s ease, color .35s ease, transform .5s cubic-bezier(.16,1,.3,1);
}
.bouton:hover { background: var(--accent); color: #fff; }
.bouton__fleche { transition: transform .5s cubic-bezier(.16,1,.3,1); }
.bouton:hover .bouton__fleche { transform: translateX(5px); }
.bouton[disabled] { opacity: .55; cursor: default; }

.devis__mentions {
  margin: 0;
  max-width: 38ch;
  font-size: 0.82rem;
  line-height: 1.55;
  color: rgb(255 255 255 / 0.55);
}

.devis__etat {
  margin: 0;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.1em;
  color: rgb(255 255 255 / 0.6);
}
.devis__etat.est-succes { color: #7BD88F; }
.devis__etat.est-echec { color: var(--accent); }

/* ── Pied ────────────────────────────────────────────────────────────────── */

.pied {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
  padding: 26px var(--marge) 34px;
  background: var(--noir);
  color: rgb(255 255 255 / 0.5);
  border-top: var(--filet-clair);
}
.pied__gauche img { width: 108px; height: auto; opacity: 0.75; }
.pied__reseaux { display: flex; gap: clamp(16px, 2.4vw, 34px); }
.pied__reseaux a {
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: color .25s ease;
}
.pied__reseaux a:hover { color: #fff; }

/* .mono porte la couleur du texte secondaire sur papier : sur le fond noir du
   pied il faut la reprendre, sinon la mention passe sous le seuil de contraste */
.pied .mono { color: rgb(255 255 255 / 0.55); }
.pied__droite { margin: 0; }

/* ── Curseur rond ────────────────────────────────────────────────────────── */
/* Le curseur système est remplacé par un point et un anneau qui le suit avec
   un temps de retard. Le mélange « difference » le garde lisible sur le
   papier comme sur le noir, sans avoir à changer sa couleur. */

.curseur { display: none; }

body.a-curseur .curseur { display: block; }
body.a-curseur,
body.a-curseur * { cursor: none; }

.curseur__anneau,
.curseur__point {
  position: fixed;
  top: 0; left: 0;
  z-index: 9999;
  pointer-events: none;
  border-radius: 50%;
  mix-blend-mode: difference;
  will-change: transform;
}

.curseur__anneau {
  width: 26px; height: 26px;
  margin: -13px 0 0 -13px;
  border: 1px solid #fff;
  transition: width .38s cubic-bezier(.16,1,.3,1),
              height .38s cubic-bezier(.16,1,.3,1),
              margin .38s cubic-bezier(.16,1,.3,1),
              background-color .38s ease,
              opacity .3s ease;
}

.curseur__point {
  width: 4px; height: 4px;
  margin: -2px 0 0 -2px;
  background: #fff;
  transition: opacity .3s ease, transform .3s ease;
}

/* survol d'un élément cliquable */
body.curseur-actif .curseur__anneau {
  width: 48px; height: 48px;
  margin: -24px 0 0 -24px;
  background: #fff;
}
body.curseur-actif .curseur__point { opacity: 0; }

/* pendant l'appui */
body.curseur-presse .curseur__anneau { transform-origin: center; opacity: .55; }

/* ── Défilé des clients ──────────────────────────────────────────────────── */

.defile {
  position: relative;
  overflow: hidden;
  margin-top: clamp(20px, 3vh, 32px);
  /* estompe les deux bords pour que l'entrée et la sortie ne soient pas nettes */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
.defile__piste {
  display: flex;
  width: max-content;
  animation: defiler 38s linear infinite;
}
.defile:hover .defile__piste { animation-play-state: paused; }
.defile__lot {
  display: flex;
  gap: clamp(24px, 4vw, 60px);
  padding-right: clamp(24px, 4vw, 60px);
  margin: 0;
  list-style: none;
  font-family: var(--titre-police);
  font-size: clamp(1.4rem, 2.8vw, 2.4rem);
  color: rgb(255 255 255 / 0.5);
  white-space: nowrap;
}
.defile__lot li { transition: color .4s ease; }
.defile__lot li:hover { color: #fff; }

@keyframes defiler {
  to { transform: translateX(-50%); }
}

/* ── Voile de transition entre les pages ─────────────────────────────────── */

.voile {
  position: fixed;
  inset: 0;
  z-index: 9000;
  background: var(--noir);
  transform: scaleY(0);
  transform-origin: bottom;
  pointer-events: none;
  will-change: transform;
}
.voile.est-entrant {
  transform: scaleY(1);
  transform-origin: bottom;
  transition: transform .55s cubic-bezier(.7,0,.3,1);
}

/* À l'arrivée, le retrait est une animation CSS et non une transition pilotée
   par requestAnimationFrame : dans un onglet ouvert en arrière-plan, rAF ne se
   déclenche pas et le voile restait noir en travers de la page. L'état de repos
   est découvert, donc si l'animation ne joue jamais, rien ne masque le site. */
.voile.est-sortant {
  transform: scaleY(0);
  transform-origin: top;
  animation: voile-sortie .6s cubic-bezier(.16,1,.3,1);
}

@keyframes voile-sortie {
  from { transform: scaleY(1); }
  to   { transform: scaleY(0); }
}

/* ── Révélation au défilement ────────────────────────────────────────────── */

/* lignes de titre masquées, révélées à l'entrée dans le cadre */
/* Même réserve pour les lignes découpées par le script : « Photographe »,
   « Questions fréquentes » ont eux aussi des jambages à loger. */
.ligne-masque {
  display: block;
  overflow: hidden;
  padding-bottom: 0.22em;
  margin-bottom: -0.16em;
}
.ligne-masque > span {
  display: block;
  transform: translateY(110%);
  transition: transform 1s cubic-bezier(.16,1,.3,1);
  transition-delay: var(--retard, 0ms);
}
.est-vu .ligne-masque > span,
.ligne-masque.est-vu > span { transform: translateY(0); }

/* les images de la planche respirent au défilement */
.planche__item .cadre { overflow: hidden; }
.planche__item img { will-change: transform; }

[data-reveler] {
  opacity: 0;
  transform: translateY(26px);
  transition: opacity .9s ease, transform 1s cubic-bezier(.16,1,.3,1);
  transition-delay: var(--retard, 0ms);
}
[data-reveler].est-vu { opacity: 1; transform: none; }

/* ── Pont vers Elementor ─────────────────────────────────────────────────── */
/* Les pages sont construites en widgets Elementor natifs pour rester éditables.
   Elementor enveloppe chaque widget dans deux div et impose ses propres marges :
   on rend ces enveloppes transparentes pour que nos classes, posées sur le
   widget, gouvernent réellement le rendu.

   Toutes les règles de ce pont sont préfixées par `body`. Ce n'est pas une
   coquetterie : depuis Elementor 4, chaque widget apporte sa propre feuille
   (`widget-accordion.min.css`, `widget-heading.min.css`…), mise en file au
   moment du rendu — donc toujours après la nôtre, quoi qu'on fasse. À nombre
   de classes égal, c'est l'ordre qui tranche, et nous perdons. Le `body`
   ajoute un sélecteur de type : nos règles passent devant sans `!important`,
   et sans dépendre de l'ordre de chargement. Toute règle ajoutée ici qui vise
   une classe `.elementor-*` doit être préfixée de la même manière. */

body .elementor-widget-container { margin: 0; padding: 0; }

/* Le titre interne prend la typographie de la classe posée sur le widget.
   Le sélecteur est répété balise par balise parce qu'Astra écrit
   `.elementor-widget-heading h1.elementor-heading-title { line-height: 1.4em }`
   — deux classes et une balise. Une simple `.elementor-heading-title` perdait,
   et les grands titres s'étiraient de 160 px sur l'accueil. */
body .elementor-heading-title,
body .elementor-widget-heading h1.elementor-heading-title,
body .elementor-widget-heading h2.elementor-heading-title,
body .elementor-widget-heading h3.elementor-heading-title,
body .elementor-widget-heading h4.elementor-heading-title,
body .elementor-widget-heading h5.elementor-heading-title,
body .elementor-widget-heading h6.elementor-heading-title {
  font: inherit;
  letter-spacing: inherit;
  line-height: inherit;
  color: inherit;
  margin: 0;
}

/* le texte courant idem, sans marge résiduelle en fin de bloc */
body .elementor-widget-text-editor { color: inherit; }
body .elementor-widget-text-editor p:last-child { margin-bottom: 0; }

/* Nos sections portent déjà leur propre respiration : on remet à zéro la marge
   par défaut des conteneurs Elementor. Un conteneur dont la marge est réglée
   dans l'éditeur reçoit un style en ligne, qui passe devant cette règle — le
   réglage depuis Elementor reste donc opérant. */
.e-con { --padding-block-start: 0; --padding-block-end: 0;
         --padding-inline-start: 0; --padding-inline-end: 0; }
.e-con > .e-con-inner { padding: 0; max-width: none; }
.e-con.lp-chrome { display: block; }

/* Le <main> reconduit en conteneur : un bloc, pas une colonne flex. Il ne fait
   que reprendre le rôle de balisage de l'ancien <main>, sans rien imposer à la
   mise en page des sections qu'il contient. */
.e-con.lp-corps { display: block; }

/* ── Les sections redeviennent des blocs ─────────────────────────────────── */
/* Tout conteneur Elementor naît en `display: flex; flex-direction: column`.
   Nos sections étaient des <section>, des <figure>, des <div> : des blocs. La
   différence n'est pas théorique — en flex les marges ne fusionnent plus, et
   la page gagnait jusqu'à 160 px par section. On rend donc le bloc, nommément,
   à celles dont la feuille ne déclare pas déjà une grille ou un flex.
   Une classe ajoutée ici doit l'être aussi dans le convertisseur, et
   inversement : une section convertie qui n'apparaît dans aucune des deux
   listes s'affichera en flex sans qu'on l'ait demandé. */
.e-con.ouverture, .e-con.ouverture__haut,
.e-con.outil,
.e-con.acte, .e-con.film, .e-con.complets, .e-con.confiance,
.e-con.section, .e-con.deroule, .e-con.deroule__etape,
.e-con.contact, .e-con.devis__intro,
.e-con.metier__tete, .e-con.metier__cadre,
.e-con.livrables, .e-con.livrables__liste,
.e-con.piece, .e-con.zone, .e-con.faq,
.e-con.prose, .e-con.prose__tete, .e-con.prose__corps,
.e-con.salle__tete, .e-con.salle,
.e-con.outil__scene, .e-con.outil__hud, .e-con.facettes, .e-con.facette,
.e-con[data-reveler] {
  display: block;
}

/* Le boîtier, son plan de secours et la jauge sont posés en absolu sur toute la
   scène. Elementor donne `position: relative` à chaque enveloppe de widget :
   ils se calaient donc sur une boîte de 0 px de haut, et le boîtier
   disparaissait purement et simplement. On rend l'enveloppe transparente au
   positionnement pour qu'ils retrouvent la scène.
   À refaire partout où un élément en `position: absolute` reste dans un bloc
   HTML à l'intérieur d'un conteneur converti. */
body .outil__scene > .elementor-widget-html,
body .outil__scene > .elementor-widget-html > .elementor-widget-container {
  position: static;
}

/* Le texte d'invite est devenu l'enveloppe d'un widget, et son texte vit dans
   un <p> à l'intérieur : la flèche doit se poser au début de la ligne, pas sur
   une ligne à elle. La page statique, elle, garde la règle d'origine. */
body .elementor-widget-text-editor.outil__invite::before { content: none; }
body .elementor-widget-text-editor.outil__invite p::before { content: "↓  "; }

/* Et les conteneurs qui doivent rester une grille ou un flex le redisent ici,
   avec `.e-con` devant. Elementor écrit `.e-con { display: flex }` : une seule
   classe, exactement la spécificité de `.planche` ou de `.films`. À égalité,
   c'est l'ordre des feuilles qui tranche — et cet ordre a changé le jour où
   cinq extensions ont été désactivées, faisant tomber toutes les grilles du
   site en flex d'un seul coup. Deux classes, et la question est close.
   La feuille déclare aussi `elementor-frontend` en dépendance : les deux
   mesures se doublent volontairement, celle-ci survivant même si l'autre
   saute. */
.e-con.ouverture__bas, .e-con.acte__tete, .e-con.films,
.e-con.section__tete, .e-con.planche, .e-con.sites,
.e-con.deroule__liste, .e-con.grille, .e-con.livrables__ligne,
.e-con.devis {
  display: grid;
}

/* Un conteneur Elementor naît aussi en `flex-direction: column`. Nos flex à
   nous sont en ligne — un titre et son bouton côte à côte, un titre de film et
   son timecode aux deux bouts. Sans ces deux lignes, ils s'empilent. */
.e-con.film__meta, .e-con.contact__grille, .e-con.rappel {
  display: flex;
  flex-direction: row;
}

/* ── Les grilles retrouvent leurs enfants ────────────────────────────────── */
/* Quand le contenu d'une grille reste en bloc HTML, Elementor l'enferme dans
   deux div : la grille n'a plus qu'un seul enfant, et les sept photos de la
   planche se retrouvaient empilées dans une colonne de 76 px. `display:
   contents` efface ces deux enveloppes de la mise en page — les <figure> et
   les <a> redeviennent les cellules de la grille, avec leurs propres portées
   de colonnes. À étendre à toute grille dont le contenu reste en bloc HTML.

   Réservé au site public : `display: contents` supprime la boîte de l'élément,
   donc sa poignée dans Elementor. Appliquée à l'éditeur, la règle rendait ces
   widgets impossibles à survoler, à sélectionner ou à déplacer. */
body:not(.elementor-editor-active) .planche > .elementor-widget-html,
body:not(.elementor-editor-active) .planche > .elementor-widget-html > .elementor-widget-container,
body:not(.elementor-editor-active) .sites > .elementor-widget-html,
body:not(.elementor-editor-active) .sites > .elementor-widget-html > .elementor-widget-container,
body:not(.elementor-editor-active) .complets__grille > .elementor-widget-html,
body:not(.elementor-editor-active) .complets__grille > .elementor-widget-html > .elementor-widget-container {
  display: contents;
}

/* Dans l'éditeur, le widget garde sa boîte — et prend toute la largeur de la
   grille, pour rester lisible pendant qu'on travaille. */
body.elementor-editor-active .planche > .elementor-widget-html,
body.elementor-editor-active .sites > .elementor-widget-html,
body.elementor-editor-active .complets__grille > .elementor-widget-html {
  grid-column: 1 / -1;
}

/* le bouton natif reprend le dessin du nôtre */
body .bouton .elementor-button {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  padding: 16px 30px;
  background: #fff;
  border: 0;
  border-radius: 999px;
  color: var(--noir);
  font-family: var(--mono);
  font-size: 11px;
  font-style: normal;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  transition: background-color .35s ease, color .35s ease;
}
body .bouton .elementor-button:hover { background: var(--accent); color: #fff; }

/* Dans le HTML d'origine la flèche était un <span aria-hidden> à l'intérieur du
   lien. Le widget natif ne garde que le libellé : on la redessine ici, en
   décoration pure. Elle reste muette pour les lecteurs d'écran, comme avant. */
body .bouton .elementor-button::after {
  content: "→";
  font-family: var(--mono);
  transition: transform .4s cubic-bezier(.16,1,.3,1);
}
body .bouton .elementor-button:hover::after { transform: translateX(4px); }

/* l'accordéon natif reprend le dessin de l'ancienne FAQ : des filets, pas une
   boîte, et un « + » qui bascule en croix à l'ouverture */
body .faq__liste .elementor-accordion { border-top: var(--filet); }
body .faq__liste .elementor-accordion-item { border: 0; border-bottom: var(--filet); }

body .faq__liste .elementor-tab-title {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 24px;
  padding: clamp(20px, 3vh, 28px) 0;
  background: none;
  border: 0;
  font-family: var(--titre-police);
  font-style: normal;
  font-size: clamp(1.1rem, 1.5vw, 1.4rem);
  font-weight: 400;
  line-height: 1.25;
  color: var(--encre);
  transition: color .3s ease;
}
body .faq__liste .elementor-tab-title:hover { color: var(--accent); }
body .faq__liste .elementor-accordion-title { font: inherit; color: inherit; }

/* on remplace l'icône d'Elementor par le signe du système */
body .faq__liste .elementor-accordion-icon svg,
body .faq__liste .elementor-accordion-icon i { display: none; }
body .faq__liste .elementor-accordion-icon {
  order: 2;
  width: auto;
  font-family: var(--mono);
  font-size: 1.1rem;
  color: var(--sourdine);
}
body .faq__liste .elementor-accordion-icon::after {
  content: "+";
  display: inline-block;
  transition: transform .35s cubic-bezier(.16,1,.3,1);
}
body .faq__liste .elementor-tab-title.elementor-active .elementor-accordion-icon::after {
  transform: rotate(45deg);
}

body .faq__liste .elementor-tab-content {
  padding: 0 0 clamp(22px, 3vh, 30px);
  border: 0;
  max-width: 68ch;
  color: var(--sourdine);
}
body .faq__liste .elementor-tab-content p { color: inherit; margin: 0; }

/* les lignes de livrables et les étapes du déroulé sont maintenant
   des conteneurs, plus des <li> */
.livrables__ligne {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr);
  gap: clamp(12px, 3vw, 60px);
  align-items: baseline;
  padding: clamp(20px, 3vh, 30px) 0;
  border-bottom: var(--filet);
}
.livrables__liste { border-top: var(--filet); margin-top: clamp(30px, 5vh, 52px); }

.deroule__liste {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(24px, 4vw, 70px);
  margin: 0;
  padding: 0;
  list-style: none;
}
.deroule__etape { border-top: 2px solid var(--encre); padding-top: 18px; }
body .deroule__etape .elementor-heading-title {
  font-family: var(--titre-police);
  font-size: clamp(1.3rem, 1.8vw, 1.8rem);
  font-style: normal;
  margin-bottom: 10px;
}
.deroule__etape p { color: var(--sourdine); max-width: 34ch; }

/* la grille de preuves : les vignettes sont maintenant des widgets image, et
   le bouton de lecture se dessine en CSS plutôt qu'en balise */
body .piece--film .elementor-widget-image { position: relative; display: block; }
body .piece--film .elementor-widget-image::after {
  content: "▶";
  position: absolute;
  inset: 50% auto auto 50%;
  transform: translate(-50%, -50%);
  width: 56px; height: 56px;
  display: grid;
  place-items: center;
  padding-left: 3px;
  border-radius: 50%;
  background: rgb(255 255 255 / 0.9);
  color: var(--noir);
  font-size: 14px;
  pointer-events: none;
  transition: transform .4s cubic-bezier(.16,1,.3,1), background-color .3s ease;
}
.piece--film:hover .elementor-widget-image::after {
  transform: translate(-50%, -50%) scale(1.12);
  background: #fff;
}
body .piece--film .elementor-widget-image img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  transition: transform 1.3s cubic-bezier(.16,1,.3,1);
}
.piece--film.piece--large .elementor-widget-image img { aspect-ratio: 16 / 9; }
.piece--film:hover .elementor-widget-image img { transform: scale(1.04); }

@media (max-width: 1000px) {
  .livrables__ligne { grid-template-columns: 1fr; gap: 8px; }
  .deroule__liste { grid-template-columns: 1fr; }
}

/* ── Portfolio : la salle ────────────────────────────────────────────────── */

.salle__tete { padding: clamp(120px, 20vh, 200px) var(--marge) clamp(28px, 4vh, 44px); }

.fil { margin-bottom: clamp(20px, 3vh, 34px); }
.fil ol {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--sourdine);
}
.fil li + li::before { content: "/"; margin-right: 10px; opacity: .5; }
.fil a { border-bottom: 1px solid transparent; transition: border-color .3s ease; }
.fil a:hover { border-bottom-color: currentColor; }

.salle__note {
  margin: clamp(26px, 4vh, 44px) 0 0;
  max-width: 46ch;
  font-size: clamp(1rem, 0.8vw + 0.85rem, 1.2rem);
  color: var(--sourdine);
}

.tri {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: clamp(30px, 5vh, 52px);
  padding-top: clamp(24px, 3.5vh, 40px);
  border-top: var(--filet);
}
.tri__bouton {
  display: inline-flex;
  align-items: baseline;
  gap: 9px;
  padding: 10px 18px;
  background: none;
  border: 1px solid rgb(20 21 26 / 0.2);
  border-radius: 999px;
  color: var(--encre);
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: border-color .3s ease, background-color .3s ease, color .3s ease;
}
.tri__bouton:hover,
.tri__bouton:focus-visible {
  background: #fff;
  border-color: var(--encre);
  color: var(--encre);
}
.tri__bouton.est-actif:hover,
.tri__bouton.est-actif:focus-visible {
  background: var(--encre);
  border-color: var(--encre);
  color: var(--papier);
}
.tri__bouton.est-actif { background: var(--encre); border-color: var(--encre); color: var(--papier); }
.tri__nombre { font-size: 10px; opacity: .72; font-variant-numeric: tabular-nums; }

.salle__compte {
  margin: 0;
  padding: 0 var(--marge) clamp(18px, 2.5vh, 26px);
}

.salle { padding: 0 var(--marge) var(--respire); }

.grille {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: clamp(18px, 2.4vw, 40px) clamp(12px, 1.6vw, 26px);
  align-items: start;
}

.piece { grid-column: span 4; margin: 0; }
.piece--large { grid-column: span 8; }
.piece[hidden] { display: none; }

.piece__cadre {
  position: relative;
  display: block;
  overflow: hidden;
  background: rgb(20 21 26 / 0.06);
}
.piece__cadre img,
.piece__cadre video {
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  transition: transform 1.3s cubic-bezier(.16,1,.3,1);
}
.piece--large .piece__cadre img,
.piece--large .piece__cadre video { aspect-ratio: 16 / 9; }
.piece:hover .piece__cadre img,
.piece:hover .piece__cadre video { transform: scale(1.04); }

.piece__declencheur,
.piece__lien {
  display: block;
  width: 100%;
  padding: 0;
  background: none;
  border: 0;
  color: inherit;
  text-align: left;
  cursor: pointer;
}

.piece__jouer {
  position: absolute;
  inset: 50% auto auto 50%;
  transform: translate(-50%, -50%);
  width: 56px; height: 56px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: rgb(255 255 255 / 0.9);
  color: var(--noir);
  font-size: 14px;
  padding-left: 3px;
  transition: transform .4s cubic-bezier(.16,1,.3,1), background-color .3s ease;
}
.piece:hover .piece__jouer { transform: translate(-50%, -50%) scale(1.12); background: #fff; }

.piece__pied {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  padding-top: 12px;
  margin-top: 12px;
  border-top: var(--filet);
}
.piece__titre { font-family: var(--titre-police); font-size: clamp(1rem, 1.1vw, 1.25rem); }

.salle__vide {
  padding: clamp(40px, 8vh, 90px) 0;
  text-align: center;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--sourdine);
}

.rappel {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: clamp(24px, 5vw, 70px);
  flex-wrap: wrap;
  padding: var(--respire) var(--marge);
  background: var(--noir);
  color: #fff;
}

/* ── Pages métier ────────────────────────────────────────────────────────── */

.metier__tete { padding: clamp(120px, 20vh, 200px) var(--marge) clamp(30px, 5vh, 56px); }

.metier__chapeau {
  margin: clamp(28px, 4vh, 48px) 0 0;
  max-width: 52ch;
  font-size: clamp(1.05rem, 1vw + 0.85rem, 1.3rem);
  line-height: 1.55;
  color: var(--sourdine);
}

.metier__cadre {
  position: relative;
  margin: 0 var(--marge);
  overflow: hidden;
  background: var(--encre);
  aspect-ratio: 2.39 / 1;
}
.metier__cadre img,
.metier__cadre video { width: 100%; height: 100%; object-fit: cover; }

/* Livrables : une liste typographique, pas une grille de cartes identiques.
   Chaque ligne est une promesse, séparée par un filet. */
.livrables { padding: var(--respire) var(--marge); }
.livrables__liste {
  margin: clamp(30px, 5vh, 52px) 0 0;
  padding: 0;
  list-style: none;
  border-top: var(--filet);
}
.livrables__liste li {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr);
  gap: clamp(12px, 3vw, 60px);
  align-items: baseline;
  padding: clamp(20px, 3vh, 30px) 0;
  border-bottom: var(--filet);
}
.livrables__quoi {
  font-family: var(--titre-police);
  font-size: clamp(1.15rem, 1.7vw, 1.6rem);
  line-height: 1.15;
}
.livrables__detail { margin: 0; color: var(--sourdine); }

/* Zone d'intervention */
.zone {
  padding: var(--respire) var(--marge);
  background: var(--papier-pale);
}
.zone__texte {
  margin: clamp(24px, 4vh, 40px) 0 0;
  max-width: 62ch;
  color: var(--sourdine);
}
.zone__villes {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 14px;
  margin: clamp(26px, 4vh, 42px) 0 0;
  padding: 0;
  list-style: none;
}
.zone__villes li {
  padding: 8px 16px;
  border: 1px solid rgb(20 21 26 / 0.18);
  border-radius: 999px;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: var(--sourdine);
}

/* Questions fréquentes — accordéon natif, sans script */
.faq { padding: var(--respire) var(--marge); }
body .faq__liste { margin: clamp(30px, 5vh, 52px) 0 0; border-top: var(--filet); }

.faq__item { border-bottom: var(--filet); }
.faq__item summary {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 24px;
  padding: clamp(20px, 3vh, 28px) 0;
  cursor: pointer;
  list-style: none;
  font-family: var(--titre-police);
  font-size: clamp(1.1rem, 1.5vw, 1.4rem);
  line-height: 1.25;
  transition: color .3s ease;
}
.faq__item summary::-webkit-details-marker { display: none; }
.faq__item summary:hover { color: var(--accent); }
.faq__item summary::after {
  content: "+";
  flex: none;
  font-family: var(--mono);
  font-size: 1.1rem;
  color: var(--sourdine);
  transition: transform .35s cubic-bezier(.16,1,.3,1);
}
.faq__item[open] summary::after { transform: rotate(45deg); }
.faq__reponse {
  margin: 0;
  padding: 0 0 clamp(22px, 3vh, 30px);
  max-width: 68ch;
  color: var(--sourdine);
}

/* Renvoi vers la page métier depuis une section de l'accueil */
.renvoi {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: clamp(26px, 4vh, 44px);
  padding-bottom: 3px;
  border-bottom: 1px solid currentColor;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  transition: color .3s ease, gap .35s cubic-bezier(.16,1,.3,1);
}
.renvoi:hover { color: var(--accent); gap: 16px; }
.renvoi--clair { color: rgb(255 255 255 / 0.75); }
.renvoi--clair:hover { color: #fff; }

/* ── Page introuvable ────────────────────────────────────────────────────── */
/* Une barque seule dans un rai de lumière : le sujet dit « vous êtes au large »
   mieux qu'une phrase. Le texte se pose dans la zone sombre du bas. */

.perdu {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 100svh;
  padding: var(--respire) var(--marge) clamp(56px, 10vh, 110px);
  overflow: hidden;
  background: var(--noir);
  color: #fff;
  isolation: isolate;
}

.perdu__fond {
  position: absolute;
  inset: 0;
  z-index: -2;
  width: 100%; height: 100%;
  object-fit: cover;
}

/* le voile garantit la lisibilité du texte quelle que soit l'image dessous */
.perdu::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(to top, rgb(8 9 12 / 0.96) 0%, rgb(8 9 12 / 0.72) 38%, rgb(8 9 12 / 0.3) 70%, rgb(8 9 12 / 0.45) 100%);
}

.perdu__code {
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent);
  margin: 0 0 clamp(18px, 3vh, 30px);
}

.perdu__note {
  margin: clamp(24px, 4vh, 40px) 0 0;
  max-width: 46ch;
  font-size: clamp(1rem, 0.8vw + 0.85rem, 1.2rem);
  line-height: 1.55;
  color: rgb(255 255 255 / 0.72);
}

.perdu__issues {
  display: flex;
  flex-wrap: wrap;
  gap: 14px 20px;
  margin-top: clamp(30px, 5vh, 52px);
}

/* ── Pages de prose (légales) ────────────────────────────────────────────── */

.prose { padding: clamp(120px, 20vh, 190px) var(--marge) var(--respire); }

.prose__tete { max-width: 62ch; }
.prose__intro {
  margin: clamp(24px, 4vh, 40px) 0 0;
  color: var(--sourdine);
  font-size: clamp(1rem, 0.8vw + 0.85rem, 1.15rem);
}

.prose__corps {
  max-width: 68ch;
  margin-top: clamp(44px, 7vh, 80px);
  border-top: var(--filet);
}
.prose__corps section { padding: clamp(30px, 5vh, 52px) 0; border-bottom: var(--filet); }
.prose__corps h2 {
  font-family: var(--titre-police);
  font-weight: 400;
  font-size: clamp(1.3rem, 2vw, 1.8rem);
  line-height: 1.15;
  letter-spacing: -0.015em;
  margin: 0 0 clamp(14px, 2vh, 22px);
}
.prose__corps p { margin: 0 0 1em; color: var(--sourdine); }
.prose__corps p:last-child { margin-bottom: 0; }
.prose__corps a {
  color: var(--encre);
  border-bottom: 1px solid rgb(20 21 26 / 0.3);
  padding-bottom: 1px;
  transition: border-color .3s ease, color .3s ease;
}
.prose__corps a:hover { color: var(--accent); border-bottom-color: var(--accent); }

/* liste de faits : libellé / valeur, alignés sur une colonne */
.faits-liste { margin: 0; }
.faits-liste div {
  display: grid;
  grid-template-columns: minmax(0, 15ch) minmax(0, 1fr);
  gap: 8px 24px;
  padding: 10px 0;
  border-bottom: 1px dotted rgb(20 21 26 / 0.16);
}
.faits-liste div:last-child { border-bottom: 0; }
.faits-liste dt {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--sourdine);
  padding-top: 3px;
}
.faits-liste dd { margin: 0; }

.prose__corps ul { margin: 0 0 1em; padding-left: 1.1em; color: var(--sourdine); }
.prose__corps li { margin-bottom: 0.4em; }

.a-completer {
  display: inline-block;
  padding: 1px 8px;
  border: 1px dashed var(--accent);
  border-radius: 3px;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent);
}

/* ── Visionneuse ─────────────────────────────────────────────────────────── */

.visio {
  position: fixed;
  inset: 0;
  z-index: 9500;
  display: grid;
  place-items: center;
  padding: clamp(48px, 8vh, 90px) clamp(48px, 9vw, 130px);
  background: rgb(8 9 12 / 0.96);
  opacity: 0;
  transition: opacity .4s ease;
}
.visio[hidden] { display: none; }
.visio.est-ouverte { opacity: 1; }

.visio__scene {
  display: grid;
  place-items: center;
  max-width: 100%;
  max-height: 100%;
}
.visio__scene img,
.visio__scene video {
  max-width: 100%;
  max-height: 76vh;
  width: auto;
  height: auto;
  object-fit: contain;
}
.visio__scene iframe {
  width: min(88vw, 1400px);
  aspect-ratio: 16 / 9;
  max-height: 76vh;
  border: 0;
}

.visio__legende {
  position: absolute;
  inset: auto 0 clamp(20px, 4vh, 40px) 0;
  margin: 0;
  text-align: center;
  color: rgb(255 255 255 / 0.6);
}

.visio__fermer,
.visio__fleche {
  position: absolute;
  display: grid;
  place-items: center;
  width: 52px; height: 52px;
  background: none;
  border: 1px solid rgb(255 255 255 / 0.22);
  border-radius: 50%;
  color: #fff;
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
  transition: border-color .3s ease, background-color .3s ease, color .3s ease;
}
.visio__fermer:hover,
.visio__fleche:hover { background: #fff; border-color: #fff; color: var(--noir); }

.visio__fermer { top: clamp(18px, 3vh, 34px); right: clamp(18px, 3vw, 40px); }
.visio__fleche { top: 50%; margin-top: -26px; }
.visio__fleche--gauche { left: clamp(10px, 2vw, 32px); }
.visio__fleche--droite { right: clamp(10px, 2vw, 32px); }

/* ── Adaptations ─────────────────────────────────────────────────────────── */

@media (max-width: 1000px) {
  .tete__nav { display: none; }
  .tete__lien-contact { display: none; }

  .tete__burger {
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    width: 34px; height: 26px;
    padding: 0;
    background: none;
    border: 0;
    cursor: pointer;
  }
  .tete__burger span { display: block; height: 1px; background: #fff; transition: transform .3s ease; }
  .tete__burger[aria-expanded="true"] span:first-child { transform: translateY(3px) rotate(45deg); }
  .tete__burger[aria-expanded="true"] span:last-child  { transform: translateY(-3px) rotate(-45deg); }

  .menu {
    position: fixed;
    inset: 0;
    z-index: 55;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 8px;
    padding: 0 var(--marge);
    background: var(--noir);
  }
  .menu[hidden] { display: none; }
  .menu a {
    font-family: var(--titre-police);
    font-size: clamp(2rem, 9vw, 3.4rem);
    color: #fff;
    padding: 6px 0;
  }

  .devis { grid-template-columns: 1fr; }
  .devis__intro { position: static; }
  .piece { grid-column: span 6; }
  .piece--large { grid-column: span 12; }
  .visio { padding: clamp(56px, 9vh, 90px) clamp(16px, 4vw, 40px); }
  .visio__fleche { top: auto; bottom: clamp(56px, 9vh, 80px); margin-top: 0; }
  .ouverture__bas { grid-template-columns: 1fr; }
  .acte__tete, .section__tete { grid-template-columns: 1fr; align-items: start; }
  .films { grid-template-columns: 1fr; }
  .complets__grille { grid-template-columns: 1fr; }
  .sites { grid-template-columns: 1fr; }
  .deroule__liste { grid-template-columns: 1fr; }
  .planche__item { grid-column: span 6; }
  .planche__item--pano { grid-column: span 12; }

  .outil { height: 300vh; }
  /* en colonne étroite, le texte se range sous le boîtier plutôt qu'à côté */
  .outil__scene {
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    padding: 0 var(--marge) clamp(34px, 7vh, 66px);
  }
  .outil__scene::after { height: 56%; }
  .outil__hud { position: static; inset: auto; max-width: none; }
  .facettes {
    position: relative;
    inset: auto;
    width: auto;
    min-height: 10.5em;
    margin-top: 20px;
  }
  .facette { top: 0; bottom: auto; left: 0; right: 0; width: auto; }
}

@media (max-width: 620px) {
  .scope { aspect-ratio: 4 / 3; }
  .scope__legende { font-size: 9px; gap: 10px; letter-spacing: 0.1em; }
  .scope__legende .tc { font-size: 9px; white-space: nowrap; }
  .titre-geant .ligne:nth-child(2),
  .contact .titre-geant .ligne:nth-child(2) { padding-left: 0; }
  .faits { grid-template-columns: 1fr; gap: 0; }
  .faits > div { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding: 12px 0; border-bottom: var(--filet); }
  .faits dd { margin: 0; }

  .planche__item, .planche__item--pano { grid-column: span 12; }
  .planche__item img { aspect-ratio: 4 / 5; }
  .planche__item--pano img { aspect-ratio: 16 / 9; }

  .piece, .piece--large { grid-column: span 12; }
  .rappel { flex-direction: column; align-items: stretch; }
  .metier__cadre { aspect-ratio: 4 / 3; }
  .livrables__liste li { grid-template-columns: 1fr; gap: 8px; }
  .devis__paire { grid-template-columns: 1fr; }
  .devis__pied { flex-direction: column; align-items: stretch; }
  .bouton { justify-content: center; }
  .outil__hud { inset: auto var(--marge) clamp(96px, 20vh, 150px) var(--marge); }
  .facettes { left: var(--marge); width: auto; }
  .film__cadre, .film__cadre--haut { aspect-ratio: 16 / 10; }
}

/* ── Mouvement réduit ────────────────────────────────────────────────────── */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
  .scope { clip-path: none; }
  .scope__video { transform: none; }
  [data-monter], [data-reveler] { opacity: 1 !important; transform: none !important; }
  .ligne-masque > span { transform: none !important; }
  .defile__piste { animation: none; transform: none; }
  .defile { -webkit-mask-image: none; mask-image: none; }
  .defile__lot { flex-wrap: wrap; white-space: normal; }
  .defile__piste > .defile__lot + .defile__lot { display: none; }
  .voile { display: none; }
  .curseur { display: none !important; }
  body.a-curseur, body.a-curseur * { cursor: auto; }

  /* le boîtier ne tourne plus : il devient une image fixe, et les trois
     facettes se lisent les unes après les autres. */
  .outil { height: auto; }
  .outil__scene {
    position: relative;
    display: block;
    height: auto;
    padding: var(--respire) var(--marge);
  }
  .outil__scene::after { display: none; }
  .outil__canvas { display: none; }
  .outil__secours {
    position: relative;
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 9;
  }
  .outil__hud { position: static; inset: auto; max-width: none; margin-top: 40px; }
  .outil__invite { display: none; }
  .facettes {
    position: static;
    display: grid;
    gap: 26px;
    width: auto;
    min-height: 0;
    margin-top: 34px;
  }
  .facette { position: static; opacity: 1; transform: none; width: auto; }
  .rail { display: none; }
}
