/*
Theme Name: Hello Elementor Child — Montana Parc
Theme URI: https://montanaparc.example
Description: Thème enfant Hello Elementor pour Montana Parc. Polices self-hosted + fondations Elementor v4.
Author: Peppermint
Template: hello-elementor
Version: 1.0.0
Text Domain: hello-elementor-child
*/

/* Fondations — TOKENS DESIGN maquette exposés en variables CSS (:root).
   Les fondations avaient tokenisé couleurs/polices/dimensions en globals Elementor uniquement ;
   le CSS des blocs home s'en sortait via `var(--token, fallback)`. Les templates portés depuis
   la maquette (region/activite/single…) utilisent `var(--token)` NU → il FAUT que ces variables
   existent. On les définit ici, valeurs verbatim maquette (styles.css:1-40). Additif : mêmes
   valeurs que les fallbacks home → aucune régression, et robustesse pour tout futur port. */
:root {
	/* couleurs */
	--petrole: #2C4A52; --petrole-2: #22383F; --petrole-brume: #5B7B82; --encre: var(--petrole-2);
	--corail: #FB6F52; --corail-deep: #EA5638; --corail-pale: #FFC6AC;
	--sable: #E7D5C0; --sable-hover: #ECE3D4; --sable-pale: #F3EFE7;
	--lumiere: #FBFAF6; --lagune: #2E9BB8; --olivier: #9DB89A; --olivier-deep: #5D7A59;
	/* typo */
	--body: 'Hanken Grotesk', system-ui, -apple-system, sans-serif;
	--display: 'Bricolage Grotesque', system-ui, -apple-system, sans-serif; /* ⚠ NE PLUS UTILISER en font-family : Elementor v3 pose --display:flex (layout) sur ses conteneurs → héritage toxique (bug police 'flex' constaté sur le h2 devis, 2026-08-24). Utiliser --font-display. */
	--font-display: 'Bricolage Grotesque', system-ui, -apple-system, sans-serif;
	--fs-display: clamp(48px,7vw,86px); --fs-h1: clamp(36px,5vw,62px); --fs-h2: clamp(28px,3.6vw,44px);
	--fs-h3: clamp(22px,2.4vw,30px); --fs-h4: clamp(19px,2vw,23px); --fs-lead: clamp(16px,1.7vw,18px);
	--fs-body: 16px; --fs-label: 14.5px; --fs-eyebrow: 13px; --fs-meta: 13.5px; --fs-micro: 12px;
	/* dimensions / effets */
	--maxw: 1220px; --gap-grid: 20px; --r-card: 24px; --r-img: 18px;
	--shadow-soft: 0 16px 40px -26px rgba(34,56,63,.5); --shadow-card: 0 30px 70px -30px rgba(34,56,63,.6);
	--hair: 0 0 0 1px rgba(34,56,63,.06);
	--ease: cubic-bezier(.2,.7,.2,1);
}

/* Fondations — POLICE DE CORPS globale (lacune corrigée). Le reset du thème parent
   (hello-elementor/assets/css/reset.css) impose `body{font-family:-apple-system,…}` (spécificité
   0,0,1). Le corps du site (Hanken Grotesk = var --font-body) n'était appliqué que par les widgets
   Elementor qui posent une font-family explicite → tout TEXTE NU atomique (footer, futurs blocs)
   tombait sur la police système. On impose ici la police de corps sur `html body` (spécificité 0,0,2)
   pour battre le reset quel que soit l'ordre de chargement. Correction valable pour tous les blocs. */
html body { font-family: var(--font-body, "Hanken Grotesk"), system-ui, -apple-system, sans-serif; }

/* Fondations — LINE-HEIGHT DE CORPS global (lacune corrigée, même piège). La maquette a
   `body{line-height:1.6}` (styles.css:37) ; le reset Hello impose `body{line-height:1.5}` → tout texte
   HÉRITANT (leads de base, chips, paragraphes sans règle propre) était à 1.5 sur toutes les pages ;
   les composants déclarant 1.6 localement masquaient l'écart. Les line-height explicites restent gagnants. */
html body { line-height: 1.6; }

/* Fondations — COULEUR DE CORPS globale (lacune corrigée, même piège). Maquette `body{color:var(--encre)}`
   (styles.css:37) ; le reset Hello impose #333 → textes hérités légèrement faux partout. */
html body { color: var(--encre, #22383F); }

/* Fondations — TAILLES DE TITRES : retour aux valeurs UA (lacune corrigée, même piège). La maquette
   n'a AUCUNE taille globale de titres (styles.css:39 : famille/couleur/graisse seulement) → un titre
   sans règle de composant rend à la taille UA (ex. h2 = 1.5em = 24px, cas `.why h2`). Le reset Hello
   impose h1 2.5rem…h6 1rem → tout titre non dimensionné était trop grand (latent partout, révélé sur
   oasis-aquatique). `revert` = valeur UA contextuelle ; les composants qui déclarent leur taille
   (var(--fs-h2)…) restent gagnants. */
html h1, html h2, html h3, html h4, html h5, html h6 { font-size: revert; }

/* Fondations — RESET MARGES des pages intérieures (`body.vpage`, toutes les pages maquette sauf
   l'accueil — chantier vpage 2026-07-27). Mime le `*{margin:0}` de la maquette : le reset hello
   (h1..h4 margin-block .5/1rem, p margin-block-end .9rem) fuyait sur tout titre/paragraphe sans
   règle de composant. `body:where(.vpage)` = spécificité (0,0,1) : bat le reset hello (0,0,1, chargé
   avant) par ordre source, mais PERD face à toute règle de composant — y compris à classe nue
   (0,1,0, ex. `.dintro{margin-top:16px}`) et où qu'elle soit dans le fichier. (V1 `body.vpage` à
   (0,1,1), placée dans le bloc landing, écrasait .art-body h2 et .dintro — constaté au chantier.) */
body:where(.vpage) :where(h1,h2,h3,h4,p) { margin: 0; }

/* Fondations — TITRES GLOBAUX (lacune corrigée — GÉNÉRALISATION). La maquette pose h1..h4 GLOBALEMENT
   (styles.css:39 verbatim : display/petrole/balance) ; le portage l'avait scopée `.dpage` → chaque bloc de
   la landing village (et toute future page non-.dpage) retombait sur le `color:inherit` (#333) du reset
   Hello, corrigé à la main 4 fois (esprit/gallery/feature/activités). Spécificité (0,0,1), chargée après le
   reset (source order gagne) ; les composants à titres blancs (.rtile h4, .hinfo h3, .crossv-txt h2,
   .cg-cap h4, .hb-cta h3, .groups h2… = 0,1,1) et les widgets home atomic (classes) restent gagnants —
   même mécanique que la maquette. Marges gérées par les resets scopés (.dpage / body.single-mp_village). */
h1, h2, h3, h4 { font-family: var(--font-display); letter-spacing: -.025em; line-height: 1.04; color: var(--petrole); font-weight: 700; text-wrap: balance; }

/* Fondations — FOND DE PAGE teinté (lacune corrigée, même piège que la police). La maquette a
   `body{background:var(--lumiere)}` (#FBFAF6, crème). Le reset Hello Elementor impose `body{background:#fff}`
   (blanc pur, 0,0,1). On impose la teinte lumière sur `html body` (0,0,2) pour battre le reset. `--lumiere`
   existe déjà (global Elementor e-gv-1891a07). Affecte toutes les pages. */
html body { background: var(--lumiere, #FBFAF6); }

/* Fondations — TYPOGRAPHIE DES TITRES globale (fidélité maquette styles.css:39 :
   h1..h4 { font-family:var(--font-display); font-weight:700; letter-spacing:-.025em; line-height:1.04;
   text-wrap:balance }). Comme la police de corps (§7.16 body), les titres NUS tombaient sur la police
   système/corps → imposée ici globalement (spécificité élément 0,0,1 : les blocs à font-family explicite
   gagnent). La COULEUR reste par bloc (hero blanc, etc.). Non exposé par le Style Schema Elementor v4. */
h1, h2, h3, h4 { font-family: var(--font-display, "Bricolage Grotesque"), sans-serif; font-weight: 700; letter-spacing: -.025em; line-height: 1.04; text-wrap: balance; }

/* Fondations — filet corail du sur-titre (fidélité maquette styles.css:43 :
   .eyebrow::before { content:""; width:26px; height:2px; background:var(--corail) }).
   Un pseudo-élément ne peut pas être porté par une classe globale v4, donc porté ici.
   Solution provisoire ; convertible en e-div-block Elementor si édition builder requise. */
/* Base `.eyebrow` (texte) — maquette styles.css:42. Les fondations n'avaient posé que `::before`
   (le tiret) ; le texte des eyebrows home venait des classes bespoke `.s-*-eyebrow`. Les templates
   portés (region/activite/single) utilisent `.eyebrow` nu → il faut la base. Les eyebrows home
   qui portent aussi `.eyebrow` sont surchargés par leur classe `.s-*-eyebrow` (plus tard) → OK. */
.eyebrow { display: inline-flex; align-items: center; gap: 10px; font-size: var(--fs-eyebrow); font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--corail-deep); }
.eyebrow::before { content: ""; width: 26px; height: 2px; background: var(--corail); flex: 0 0 auto; }

/* Base `.lead` — maquette styles.css:44. Jamais portée globalement : les composants region/hébergement
   la re-déclaraient localement, mais les usages qui s'appuyaient sur la BASE (feature aquatique,
   sl-head/sl-right village…) tombaient sur le style body par défaut. Les overrides scopés
   (.art-body .lead etc., 0,2,0) restent gagnants. */
.lead { font-size: var(--fs-lead); color: var(--petrole-brume); max-width: 54ch; }

/* Bloc final-cta — icônes SVG en CONTOUR (fidélité maquette). Elementor e-svg réécrit
   le <svg> avec fill="currentColor" au rendu, ce qui remplit le path fermé du téléphone
   (silhouette pleine). `fill` n'est pas exposé par le Style Schema v4 → forcé ici en contour.
   Les 3 icônes du bloc (flèches + téléphone) sont des tracés stroke, comme dans la maquette. */
.s-final-cta-card .e-svg-base svg { fill: none; }

/* Boutons .btn / .btn--primary — transitions + états :hover repris de la maquette (styles.css:52-62).
   Portée GLOBALE comme la maquette (`.btn`/`.btn-primary`) → réutilisés par le CTA final ET le header
   (bouton Réserver = mêmes classes globales), aucune duplication. Les :hover ne sont pas portables par
   une classe globale v4 (§7.2). `.ico`/pastille = e-div-block (.e-div-block-base) ; flèche = e-svg.
   --ease = cubic-bezier(.2,.7,.2,1). */
.btn { transition: transform .25s var(--ease), box-shadow .25s, background .25s, color .25s; }
.btn .e-div-block-base { transition: background .35s var(--ease); }
.btn .e-svg-base svg { transition: transform .4s var(--ease); }
/* flèche : rotation -45° au survol */
.btn:hover .e-svg-base svg { transform: rotate(-45deg); }
/* bouton primaire : lévitation + ombre + pastille blanche + flèche corail */
.btn--primary:hover { transform: translateY(-2px); box-shadow: 0 22px 42px -12px rgba(234,86,56,.85); }
.btn--primary:hover .e-div-block-base { background: var(--blanc); }
.btn--primary:hover .e-svg-base svg { color: var(--corail-deep); }
/* bouton OUTLINE — variante réutilisable (maquette .btn-outline styles.css:59-60). Base pill/padding =
   classe globale `btn` ; ici les COULEURS du variant + hover (non portables par une classe globale v4, §7.2).
   Repos : transparent + filet pétrole + texte/flèche pétrole. Survol : fond pétrole, texte/flèche blancs. */
/* spécificité `.btn.btn--outline` (0,2,0) : bat les défauts atomiques (`.e-con`) qui neutralisaient
   le box-shadow. L'outline est toujours `class="btn btn--outline"`, donc ce sélecteur est correct. */
.btn.btn--outline { background: transparent; color: var(--petrole); box-shadow: inset 0 0 0 1.5px rgba(44,74,82,.5); }
.btn.btn--outline .e-svg-base svg { color: var(--petrole); }
.btn.btn--outline:hover { transform: translateY(-2px); background: var(--petrole); color: #fff; }
.btn.btn--outline:hover .e-div-block-base { background: rgba(255,255,255,.22); }
.btn.btn--outline:hover .e-svg-base svg { color: #fff; }
/* bouton ghost sur média (variante sombre autonome) — spécifique au CTA final */
.s-final-cta-card .btn--ghost--on-media:hover { transform: translateY(-2px); background-color: rgba(14,24,28,.5); }
.s-final-cta-card .btn--ghost--on-media:hover .e-div-block-base { background: rgba(255,255,255,.3); }

/* Bloc hero — icônes SVG en contour (pin de localisation ; e-svg force fill=currentColor, cf. §7.3). */
.s-hero .e-svg-base svg { fill: none; }
/* Bloc hero — highlight du H1 « en Côte d'Azur » (maquette .heroD h1 .hl). Le titre e-heading ne
   prend que du texte/inline ; le mot est balisé <strong> et coloré ici (poids inchangé). */
.s-hero-h1 strong { color: var(--corail-pale); font-weight: inherit; }
/* Bloc hero — filet dégradé du dock-hint (maquette .dock-hint::after). Pseudo-élément → thème. */
.s-hero-dock-hint::after { content: ""; flex: 1; height: 1px; background: linear-gradient(90deg, rgba(255,255,255,.4), transparent); }
/* Bloc hero — ombre portée sur le nom des villages (maquette .dbody .nm : text-shadow 0 1px 10px rgba(0,0,0,.4)).
   text-shadow ∉ Style Schema v4 → porté ici, scopé aux 2 cartes. */
.s-hero-card-oasis-nm, .s-hero-card-gassin-nm { text-shadow: 0 1px 10px rgba(0, 0, 0, .4); }

/* ===================== Bloc site/header-main ===================== */
/* Icônes SVG en contour (chevron, flèche ; e-svg force fill=currentColor, §7.3).
   display:block : les e-svg atomiques rendent en inline (vertical-align baseline) → le glyphe tombe
   ~3px sous le centre du texte ; block le recale (la maquette a ses SVG en block). */
.s-hdr .e-svg-base svg { fill: none; display: block; }
/* Liens : héritent la couleur du conteneur (sinon le `a{color}` du thème — corail — l'emporte sur
   l'héritage), sans soulignement. La couleur vient de .s-hdr-links (petrole) / body.home (blanc). */
.s-hdr a { text-decoration: none; }
.s-hdr-links > a { color: inherit; } /* liens DIRECTS de nav (pas les items du sous-menu, qui gardent leur couleur) */
.s-hdr-links > a, .s-hdr-drop-btn, .s-hdr-drop-menu a { white-space: nowrap; }
/* Menu mobile (overlay masqué ; toggle + finition visuelle = passe interactions) : liens en couleur héritée. */
.s-hdr-mobile a { color: inherit; }
/* Placement dans la grille 1fr auto 1fr (le prop justify-self v4 ne s'applique pas → porté ici) :
   identité à gauche, liens centrés, actions à droite. Enfants à largeur naturelle (sinon les items
   sont étirés à largeur égale → « Golfe de St-Tropez » déborde, « Résidentiel » flotte). */
.s-hdr-brand { justify-self: start; }
.s-hdr-links { justify-self: center; justify-content: center; }
/* .e-con force width:100% → justify-self:end sans effet ; on pousse le contenu à droite en interne. */
.s-hdr-right { justify-self: end; justify-content: flex-end; }
.s-hdr-links > *, .s-hdr-right > * { width: auto; flex: 0 0 auto; }
/* Crossfade logo — état SOLIDE (défaut) : logo sombre visible, blanc masqué (maquette .logo .dark/.white). */
.s-hdr-logo-white { opacity: 0; transition: opacity .4s; }
.s-hdr-logo-dark  { opacity: 1; transition: opacity .4s; }
/* Burger : 3 barres via box-shadow (l'e-div-block n'a pas d'enfant ; maquette .burger span). Toggle différé. */
.s-hdr-burger { color: var(--petrole, #2C4A52); background: rgba(44,74,82,.1); position: relative; }
/* Le ::before atomique est en position:absolute (Elementor l'utilise pour une couche overlay) → le
   centrage flex du cercle ne l'affecte pas. On le centre explicitement (les 3 barres = ::before + box-shadow). */
.s-hdr-burger::before { content: ""; position: absolute; inset: 50% auto auto 50%; transform: translate(-50%, -50%); width: 18px; height: 2px; margin: 0; background: currentColor; box-shadow: 0 -6px 0 currentColor, 0 6px 0 currentColor; }
/* Sur-titre mobile & liste : cf. menu mobile (2e temps). */

/* --- État TRANSPARENT (accueil, en HAUT de page) : scopé front-page + `:not(.scrolled)`.
   Au scroll, js/header.js ajoute `.scrolled` sur .s-hdr → ces règles ne s'appliquent plus → retour à
   l'état SOLIDE de base (non redéfini ici). Sur les pages intérieures (non body.home) ces règles ne
   s'appliquent jamais → le scroll n'a aucun effet (reste solide). Transitions : voir plus bas. --- */
body.home .s-hdr:not(.scrolled), body.front-page .s-hdr:not(.scrolled) {
  background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; box-shadow: none;
  padding-top: 24px; padding-bottom: 24px;
}
/* État SOLIDE (pages intérieures + accueil au scroll + village) aligné maquette `.nav--solid` :
   LIGNE 1px (0 flou) au lieu d'une ombre portée, padding 15px, fond .95 ; gap nav = clamp maquette
   (≈21px, ≠ 30px). Doublé `.s-hdr.s-hdr` (0,2,0) pour battre les styles inline atomiques du template #13 ;
   l'override transparent accueil ci-dessus (spécificité sup.) reste prioritaire en haut de page. */
.s-hdr.s-hdr { background: rgba(251,250,246,.95); box-shadow: 0 1px 0 rgba(34,56,63,.07); padding-top: 15px; padding-bottom: 15px; }
.s-hdr .s-hdr-links { gap: clamp(16px,1.4vw,28px); }
body.home .s-hdr:not(.scrolled) .s-hdr-brand-name, body.home .s-hdr:not(.scrolled) .s-hdr-links,
body.front-page .s-hdr:not(.scrolled) .s-hdr-brand-name, body.front-page .s-hdr:not(.scrolled) .s-hdr-links { color: #fff; }
body.home .s-hdr:not(.scrolled) .s-hdr-logo-white, body.front-page .s-hdr:not(.scrolled) .s-hdr-logo-white { opacity: 1; }
body.home .s-hdr:not(.scrolled) .s-hdr-logo-dark,  body.front-page .s-hdr:not(.scrolled) .s-hdr-logo-dark  { opacity: 0; }
body.home .s-hdr:not(.scrolled) .s-hdr-burger, body.front-page .s-hdr:not(.scrolled) .s-hdr-burger { color: #fff; background: rgba(255,255,255,.16); }

/* Transitions de la bascule transparent↔solide (timing maquette : nav .4s, texte .25s, logo .4s). */
.s-hdr { transition: background .4s, box-shadow .4s, padding .4s; }
.s-hdr-brand-name { transition: color .25s; }
.s-hdr-burger { transition: background .4s, color .4s; }

/* ===== LOT 1 — hovers CSS (repris maquette styles.css:80-86) ===== */
/* Liens : souligné corail qui s'étend au survol (0→100%) + opacité .92→1. Corail dans les 2 états. */
/* `> a` : liens DIRECTS de nav uniquement — pas les items du sous-menu (descendants), qui ne
   doivent avoir NI le souligné corail NI l'opacité .92 (juste le fond sable au survol). */
.s-hdr-links > a { padding: 4px 0; opacity: .92; transition: opacity .25s, color .25s; }
.s-hdr-links > a:hover { opacity: 1; }
.s-hdr-links > a::after { content: ""; position: absolute; left: 0; bottom: -2px; width: 0; height: 2px; background: var(--corail, #FB6F52); transition: width .3s var(--ease); }
.s-hdr-links > a:hover::after { width: 100%; }
/* état ACTIF (page courante, aria-current posé par header.js) — trait plein, comme la maquette
   `.nav-links a[aria-current="page"]::after{width:100%}`. */
.s-hdr-links > a[aria-current="page"]::after { width: 100%; }
.s-hdr-links > a[aria-current="page"] { opacity: 1; }
.s-hdr-mobile a[aria-current="page"] { color: var(--corail-deep); } /* maquette .mm-group a[aria-current]{color:corail-deep} */
/* déclencheur du dropdown : trait quand la page courante est dans son sous-menu (aria-current
   "true" posé par header.js — bug signalé dev 2026-08-23 : aucun trait sur groupes/cse) */
.s-hdr-drop-btn { position: relative; }
.s-hdr-drop-btn::after { content: ""; position: absolute; left: 0; bottom: -2px; width: 0; height: 2px; background: var(--corail, #FB6F52); transition: width .3s var(--ease); }
.s-hdr-drop-btn[aria-current="true"]::after { width: 100%; }
.s-hdr-drop-btn[aria-current="true"] { opacity: 1; }
/* Pastille langue : ombre douce au repos, lévitation + ombre carte au survol (styles.css:85-86). */
.s-hdr-lang { box-shadow: 0 16px 40px -26px rgba(34,56,63,.5); transition: transform .25s var(--ease), box-shadow .25s; }
.s-hdr-lang:hover { transform: translateY(-1px); box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); }
/* Dropdown langue desktop (V28) — repris maquette `.langdrop` (styles.css:1154-1164). Wrapper + menu
   construits par js/header.js autour de `.s-hdr-lang`. Placeholder (pas de traduction réelle). Masqué
   ≤900 (la langue passe dans le menu burger, cf. `.s-hdr-mm-langs`). Classes scopées `.s-hdr`. */
.s-hdr .s-hdr-langdrop { position: relative; display: inline-flex; }
.s-hdr .s-hdr-langdrop .s-hdr-lang { cursor: pointer; }  /* maquette .langdrop .lang{cursor:pointer} */
.s-hdr .s-hdr-langdrop .s-hdr-lang-chev { transition: transform .3s var(--ease); }
.s-hdr .s-hdr-langdrop.open .s-hdr-lang-chev { transform: rotate(180deg); }
.s-hdr .s-hdr-langdrop-menu { position: absolute; top: calc(100% + 12px); right: 0; min-width: 134px; background: #fff; border-radius: 14px; box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); padding: 7px; opacity: 0; visibility: hidden; transform: translateY(-6px); transition: opacity .22s var(--ease), transform .22s var(--ease), visibility .22s; z-index: 60; }
.s-hdr .s-hdr-langdrop.open .s-hdr-langdrop-menu { opacity: 1; visibility: visible; transform: none; }
.s-hdr .s-hdr-langdrop-item { display: flex; width: 100%; align-items: center; justify-content: space-between; gap: 10px; padding: 9px 13px; border-radius: 9px; background: none; border: 0; cursor: pointer; font-family: var(--font-body, "Hanken Grotesk"), sans-serif; font-weight: 600; font-size: 14px; color: var(--petrole, #2C4A52); text-align: left; transition: background .2s, color .2s; text-decoration: none; } /* text-decoration : items devenus <a> au câblage Linguise */
.s-hdr .s-hdr-langdrop-item:hover { background: var(--sable-pale, #F3EFE7); }
.s-hdr .s-hdr-langdrop-item.cur { background: var(--sable-pale, #F3EFE7); color: var(--corail-deep, #EA5638); }
.s-hdr .s-hdr-langdrop-item.cur::after { content: "✓"; font-size: 12px; font-weight: 700; }
@media (max-width: 900px) { .s-hdr .s-hdr-langdrop, .s-hdr .s-hdr-lang { display: none; } }

/* ===== Mode « serré » du header (s-hdr--tight, 2026-09-03) =====
   Posé par js/header.js quand la nav DÉBORDE réellement (libellés traduits DE/NL plus longs —
   Linguise, longueur non contrôlable). Reproduit l'état ≤900 (burger + overlay, langues dans
   le menu mobile) AU-DESSUS du breakpoint : mêmes bascules que les variantes tablet des styles
   Elementor locaux (#13/#64). !important : ces styles locaux se chargent après style.css et
   gagnent les égalités (règle projet) — inoffensif, actif uniquement avec la classe. */
.s-hdr.s-hdr--tight .s-hdr-links { display: none !important; }
.s-hdr.s-hdr--tight .s-hdr-langdrop, .s-hdr.s-hdr--tight .s-hdr-lang { display: none !important; }
.s-hdr.s-hdr--tight .s-hdr-burger { display: flex !important; }
.s-hdr.s-hdr--tight .s-hdr-in { grid-template-columns: 1fr auto; }

/* ===== LOT 2b — dropdown « Groupes & CSE » (clic ; maquette styles.css:453-462) ===== */
/* Bouton : opacité comme les liens ; chevron pivote à l'ouverture. */
.s-hdr-drop-btn { opacity: .92; transition: opacity .25s; }
.s-hdr-drop-btn:hover, .s-hdr-drop.open .s-hdr-drop-btn { opacity: 1; }
.s-hdr-drop-chev svg { transition: transform .3s var(--ease); }
.s-hdr-drop.open .s-hdr-drop-chev svg { transform: rotate(180deg); }
/* Sous-menu : carte blanche centrée sous le bouton, fade + slide (override du display:none Elementor via
   opacity/visibility pour permettre la transition). Spécificité `.s-hdr …` pour battre le display:none. */
.s-hdr .s-hdr-drop-menu {
  display: block; position: absolute; inset-block-start: calc(100% + 16px); inset-inline-start: 50%; inset-inline-end: auto;
  min-width: 252px; background: #fff; border-radius: 16px; box-shadow: 0 30px 70px -30px rgba(34,56,63,.6);
  padding: 8px; opacity: 0; visibility: hidden; transform: translate(-50%, -6px);
  transition: opacity .25s var(--ease), transform .25s var(--ease), visibility .25s; z-index: 60;
}
.s-hdr-drop.open .s-hdr-drop-menu { opacity: 1; visibility: visible; transform: translate(-50%, 0); }
/* Items : padding, couleur petrole, sous-titre plus clair, survol sable (maquette .navdrop-menu a / .d). */
/* spécificité `.s-hdr …` pour battre le padding:0 de base (§7.5) sur les items. */
.s-hdr .s-hdr-drop-menu a { padding: 12px 13px; border-radius: 11px; color: var(--petrole, #2C4A52); transition: background .2s; }
.s-hdr .s-hdr-drop-menu a:hover { background: var(--sable-pale, #F3EFE7); }
.s-hdr .s-hdr-drop-menu a > *:last-child { color: var(--petrole-brume, #5B7B82); font-weight: 600; }

/* ===== Responsive barre mobile (maquette media queries ≤900 / ≤560) ===== */
/* ≤900 : liens masqués (variante Elementor). La grille passe de `1fr auto 1fr` à `1fr auto` (maquette
   `.nav-in{grid-template-columns:1fr auto}`) → logo (col1, gauche) | actions (col2, largeur naturelle,
   collées à droite). Sinon la piste centrale vide laisse un `1fr` fantôme qui décale Réserver+burger. */
@media (max-width: 900px) {
  .s-hdr .s-hdr-in { grid-template-columns: 1fr auto; }
}
/* ≤560 : bouton Réserver compacté (maquette `.nav .nav-right .btn-primary{padding:11px 14px 11px 18px;
   font-size:var(--fs-label)}` + ico 22×22, svg 14×14). */
@media (max-width: 560px) {
  /* spécificité .s-hdr … pour battre la classe globale .btn / la valeur de base (chargées après le thème). */
  .s-hdr .s-hdr-cta { padding: 11px 14px 11px 18px; font-size: 14.5px; }
  .s-hdr .s-hdr-cta-ico { width: 22px; min-width: 22px; height: 22px; }
  .s-hdr .s-hdr-cta-ico svg { width: 14px; height: 14px; }
  .s-hdr .s-hdr-right { gap: 10px; } /* maquette .nav-right{gap:10px} (desktop 16) */
}

/* ===== LOT 2c — overlay menu mobile ===== */
/* L'overlay est un frère de .s-hdr (sorti du header, dont le backdrop-filter piégeait le fixed) ;
   position:fixed inset:0 z-80 (Elementor) → couvre le viewport. `display:flex` toujours ; masqué via
   opacity/visibility (fade), révélé par `.open` (JS). pointer-events pour ne rien bloquer au repos. */
.s-hdr-mobile { opacity: 0; visibility: hidden; pointer-events: none; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); transition: opacity .22s var(--ease), visibility .22s; }
.s-hdr-mobile.open { opacity: 1; visibility: visible; pointer-events: auto; }
/* zone centrale scrollable (maquette .mm-scroll{flex:1;overflow-y:auto}) → head en haut, barre en bas. */
.s-hdr-mobile .s-hdr-mm-scroll { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; }

/* ---- Style du contenu (maquette .mm-* ; scopé .s-hdr-mobile pour battre les valeurs de base) ---- */
/* icônes en contour (overlay hors .s-hdr, donc la règle .s-hdr … ne l'atteint pas). */
.s-hdr-mobile .e-svg-base svg { fill: none; }
/* centrage largeur (maquette max-width 560) + espacements par marges (pas de gap uniforme). */
.s-hdr-mobile .s-hdr-mm-scroll { width: 100%; max-width: 560px; margin: 0 auto; gap: 0; }
.s-hdr-mobile .s-hdr-mm-util { margin-top: 18px; }
/* en-tête : nom marque (maquette .mm-brand) + croix ronde. */
.s-hdr-mobile .s-hdr-mm-brand-t { font-family: "Bricolage Grotesque", sans-serif; font-weight: 700; font-size: 19px; letter-spacing: -.02em; color: var(--petrole,#2C4A52); }
.s-hdr-mobile .s-hdr-mm-close { width: 44px; height: 44px; border-radius: 50%; background: rgba(44,74,82,.08); color: var(--petrole,#2C4A52); }
/* sur-titre : filet corail + corail-deep (maquette .mm-eyebrow). */
.s-hdr-mobile .s-hdr-mm-eyebrow { display: flex; align-items: center; gap: 10px; color: var(--corail-deep,#EA5638); margin: 6px 0 12px; }
.s-hdr-mobile .s-hdr-mm-eyebrow::before { content: ""; width: 26px; height: 2px; background: var(--corail,#FB6F52); flex: none; }
/* cartes village : blanc + ombre + radius (maquette .mm-card). */
.s-hdr-mobile .s-hdr-mm-oasis, .s-hdr-mobile .s-hdr-mm-golfe { background: #fff; border-radius: 24px; box-shadow: 0 16px 40px -26px rgba(34,56,63,.5), 0 0 0 1px rgba(34,56,63,.06); padding: 15px 17px; gap: 14px; margin-bottom: 10px; align-items: center; transition: transform .35s var(--ease), box-shadow .35s; }
.s-hdr-mobile .s-hdr-mm-oasis:hover, .s-hdr-mobile .s-hdr-mm-golfe:hover { transform: translateY(-3px); box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); }
.s-hdr-mobile .s-hdr-mm-oasis-nm, .s-hdr-mobile .s-hdr-mm-golfe-nm { font-family: "Bricolage Grotesque", sans-serif; font-weight: 600; font-size: clamp(19px,2vw,23px); color: var(--petrole,#2C4A52); line-height: 1.15; }
.s-hdr-mobile .s-hdr-mm-oasis-nm em, .s-hdr-mobile .s-hdr-mm-golfe-nm em { color: var(--corail,#FB6F52); font-weight: 700; font-size: 13.5px; letter-spacing: 1px; font-style: italic; }
.s-hdr-mobile .s-hdr-mm-oasis-meta, .s-hdr-mobile .s-hdr-mm-golfe-meta { font-size: 13.5px; color: var(--petrole-brume,#5B7B82); }
/* pastille flèche (l'e-svg `go` stylé en rond corail clair). */
.s-hdr-mobile .s-hdr-mm-oasis-go, .s-hdr-mobile .s-hdr-mm-golfe-go { width: 34px; height: 34px; flex: none; border-radius: 50%; background: var(--sable-pale,#F3EFE7); color: var(--corail-deep,#EA5638); display: flex; align-items: center; justify-content: center; }
/* flèche DANS la pastille : 18px (l'e-svg force width:100% → la flèche remplissait le rond 34px ;
   !important + min-width pour battre ce défaut / le min-width parasite §7.5). */
.s-hdr-mobile .s-hdr-mm-oasis-go svg, .s-hdr-mobile .s-hdr-mm-golfe-go svg { width: 18px !important; min-width: 18px; height: 18px !important; }
/* liens : grande police display + séparateurs + chevron (maquette .mm-group a). */
.s-hdr-mobile .s-hdr-mm-links > a { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 13px 0; border-bottom: 1px solid rgba(34,56,63,.08); }
.s-hdr-mobile .s-hdr-mm-links > a:last-child { border-bottom: 0; }
.s-hdr-mobile .s-hdr-mm-links > a > * { font-family: "Bricolage Grotesque", sans-serif; font-weight: 700; font-size: clamp(21px,5.4vw,26px); color: var(--petrole,#2C4A52); }
.s-hdr-mobile .s-hdr-mm-links > a::after { content: ""; width: 22px; height: 22px; flex: none; opacity: .32; background: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%232C4A52'%20stroke-width='2.2'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='m9%2018%206-6-6-6'/%3E%3C/svg%3E") center/contain no-repeat; }
/* langue : label + pills (maquette .mm-langs). */
.s-hdr-mobile .s-hdr-mm-langs { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 16px; }
.s-hdr-mobile .s-hdr-mm-lang-lab { font-size: 12px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--petrole-brume,#5B7B82); margin-right: 4px; }
.s-hdr-mobile .s-hdr-mm-langs > *:not(.s-hdr-mm-lang-lab) { font-size: 14.5px; font-weight: 700; min-height: 40px; padding: 8px 16px; display: inline-flex; align-items: center; border-radius: 999px; background: var(--sable-pale,#F3EFE7); color: var(--petrole,#2C4A52); cursor: pointer; }
/* état actif = classe générique -on posée par header.js selon le préfixe d'URL (câblage Linguise) —
   plus la classe d'identité -fr : le menu mobile n'existe qu'avec JS, pas de fallback à couvrir */
/* état actif : MÊME spécificité (0,3,0) que la règle générique `> *:not(...)` ci-dessus,
   qui la battait à (0,2,0) — pastille active invisible (constat équipe 2026-09-10).
   La variante village (.s-hdr-mm-v .s-hdr-mm-lang.on, 0,3,0) était déjà correcte. */
.s-hdr-mobile .s-hdr-mm-langs > .s-hdr-mm-lang-on { background: var(--corail-deep,#EA5638); color: #fff; }
.s-hdr-mobile .s-hdr-mm-note { font-size: 12px; color: var(--petrole-brume,#5B7B82); margin-top: 14px; }
/* barre bas : sable + sticky, Réserver large + Nous contacter pill blanche (maquette .mm-bar / .mm-contact-btn). */
.s-hdr-mobile .s-hdr-mm-bar { position: sticky; bottom: 0; display: flex; gap: 10px; padding: 14px max(20px, calc((100% - 560px)/2)); background: var(--sable-pale,#F3EFE7); box-shadow: 0 -1px 0 rgba(34,56,63,.1); }
.s-hdr-mobile .s-hdr-mm-cta { flex: 1.35; justify-content: center; min-height: 54px; }
.s-hdr-mobile .s-hdr-mm-contact { flex: 1; min-height: 54px; padding: 0; display: inline-flex; align-items: center; justify-content: center; border-radius: 999px; font-weight: 700; font-size: 14.5px; color: var(--petrole,#2C4A52); background: #fff; box-shadow: 0 0 0 1px rgba(34,56,63,.06); }


/* ===================== Variante VILLAGE du header (maquette nav--v / .vswitch) ===================== */
/* Liens village : plus petits + serrés (maquette .nav--v .nav-links{gap:16;font-size:13.5}). */
.s-hdr-village .s-hdr-links { gap: 16px; }
.s-hdr-village .s-hdr-links > a, .s-hdr-village .s-hdr-links > a > * { font-size: 13.5px; }
/* vswitch — bouton + chevron dans un rond (maquette .vswitch-btn / .chev). Village = toujours solide. */
.s-hdr-vsw-btn { opacity: .92; transition: opacity .25s; }
.s-hdr-vsw-btn:hover, .s-hdr-vsw.open .s-hdr-vsw-btn { opacity: 1; }
.s-hdr-vsw-chev { box-sizing: border-box; width: 26px; height: 26px; padding: 5px; border-radius: 50%; background: rgba(44,74,82,.07); box-shadow: inset 0 0 0 1px rgba(44,74,82,.14); color: var(--petrole,#2C4A52); transition: transform .3s var(--ease); }
.s-hdr-vsw.open .s-hdr-vsw-chev { transform: rotate(180deg); }
.s-hdr-vsw .e-svg-base svg { fill: none; }
/* menu vswitch (maquette .vswitch-menu) : override du display:none Elementor pour la transition. */
.s-hdr-village .s-hdr-vsw-menu { display: block; position: absolute; inset-block-start: calc(100% + 14px); inset-inline-start: 0; min-width: 248px; background: #fff; border-radius: 16px; box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); padding: 8px; opacity: 0; visibility: hidden; transform: translateY(-6px); transition: opacity .25s var(--ease), transform .25s var(--ease), visibility .25s; z-index: 60; }
.s-hdr-vsw.open .s-hdr-vsw-menu { opacity: 1; visibility: visible; transform: none; }
/* items du menu vswitch (maquette .vswitch-menu a) : hover corail-pale, étoile corail à droite, courant sable. */
.s-hdr-village .s-hdr-vsw-menu a { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 13px; border-radius: 11px; color: var(--petrole,#2C4A52); font-weight: 600; font-size: 14.5px; transition: background .2s, color .2s; }
.s-hdr-village .s-hdr-vsw-menu a:hover { background: var(--corail-pale,#FFC6AC); color: var(--corail-deep,#EA5638); }
.s-hdr-vsw-cur { background: var(--sable-pale,#F3EFE7); }
.s-hdr-vsw-1-st, .s-hdr-vsw-2-st { margin-left: auto; color: var(--corail,#FB6F52); font-size: 12px; letter-spacing: 1px; }
.s-hdr-vsw-sep { height: 1px; background: rgba(34,56,63,.1); margin: 7px 6px; }
/* vswitch : label sur une ligne ; en mobile village, on masque le logo (maquette .nav--v .logo-link{display:none}). */
.s-hdr-vsw-lbl { white-space: nowrap; }
@media (max-width: 560px) { .s-hdr-village .s-hdr-logo { display: none; } }
/* vswitch mobile (recette QA A11 + iPhone 16, 2026-10-01) : à 393 px, « Golfe de St-Tropez » (et plus
   encore le nom traduit en DE) ne tenait pas avant « Réserver » ; le label étant nowrap, c'est le chevron
   qui rétrécissait jusqu'à une fine pastille sans flèche. Le chevron garde sa taille (flex-shrink:0) ;
   c'est le NOM qui s'adapte, en mobile seulement (≤ 560 px, logo masqué) : deux lignes au plus (« Golfe de /
   St-Tropez »), police réduite sous 430 px, « … » seulement si deux lignes ne suffisent pas. min-width:0 sur
   les conteneurs flex pour qu'ils puissent céder la place. Desktop inchangé (le nom n'y rétrécit pas). */
.s-hdr-village .s-hdr-vsw-chev { flex: 0 0 26px; min-width: 26px; }
@media (max-width: 560px) {
	.s-hdr-village .s-hdr-vsw, .s-hdr-village .s-hdr-vsw-btn { min-width: 0; }
	.s-hdr-village .s-hdr-vsw-lbl { min-width: 0; overflow: hidden; text-overflow: ellipsis; line-height: 1.1; white-space: normal; text-wrap: balance; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; }
}
@media (max-width: 430px) { .s-hdr-village .s-hdr-vsw-lbl { font-size: 16px; } }
@media (max-width: 374px) { .s-hdr-village .s-hdr-vsw-lbl { font-size: 15px; } }
/* Ombre du header village : filet discret (maquette .nav--solid{box-shadow:0 1px 0 rgba(34,56,63,.07)}),
   pas la grosse ombre du scrolled marque. Spécificité .s-hdr.s-hdr-village pour battre la base. */
.s-hdr.s-hdr-village { box-shadow: 0 1px 0 rgba(34,56,63,.07); }
/* Contenu GOLFE : masque du dropdown RETIRÉ (décision dev 2026-08-24 — nav Golfe complète,
   URLs golfe-… actives dès création des pages). Cf. mp_golfe_nav_map + header-village-scoping.md.
   ⚠ ne JAMAIS écrire de motif étoile-slash dans un commentaire CSS : il le ferme et le texte
   restant devient un sélecteur qui AVALE la règle suivante (bug typo dropdown village). */
/* Dropdown « Groupes & CSE » du header village : 13.5px comme les autres liens village (défaut 16). */
.s-hdr-village .s-hdr-drop-btn, .s-hdr-village .s-hdr-drop-lbl.s-hdr-drop-lbl { font-size: 13.5px; } /* lbl doublé : une feuille Elementor postérieure posait 16px à égalité (signalé dev 2026-08-24) */
/* Logo village : forcer 48×48 (enfant flex direct de hdr-brand → comprimé sinon, §7.11). */
.s-hdr-village .s-hdr-logo { flex: 0 0 auto; width: 48px; min-width: 48px; height: 48px; }
/* Item COURANT du vswitch : fond sable (déjà) + texte corail-deep (maquette .vswitch-menu a.cur{color:corail-deep}).
   Spécificité …a.s-hdr-vsw-cur pour battre la couleur petrole des items. */
.s-hdr-village .s-hdr-vsw-menu a.s-hdr-vsw-cur { color: var(--corail-deep, #EA5638); }
/* Padding vertical du header village : 15px (maquette .nav--solid{padding:15px 0}), scopé village
   uniquement — le marque reste à 12px (solide) / 24px (transparent). */
.s-hdr.s-hdr-village { padding-top: 15px; padding-bottom: 15px; }

/* ============================================================
   FOOTER — bloc site/footer-main (Theme Builder, doc #72)
   Maquette : index.html:425 `.footer` / styles.css:294-317 + MQ 343 (≤900) / 354 (≤560).
   Atomique v4 : styles portés ici, scopés `.s-ftr`.
   Leçons : §7.5 padding parasite neutralisé sur les conteneurs (`.e-con`/e-flexbox/e-div-block),
   §7.11 grille + width:auto sur enfants, §7.14 SVG sizing width+min-width+height + display:block,
   scope descendant, fidélité valeurs maquette (13.5/14/12.5 conservées).
   ============================================================ */
/* IMPORTANT (§7.5/§7.11) : les bases atomiques (.e-con / .e-div-block-base / .e-flexbox-base)
   posent padding + display AVEC une spécificité (0,1,0) chargée APRÈS le thème enfant → toutes
   les règles de layout du footer sont préfixées `.s-ftr ` (0,2,0) pour gagner, racine en `.s-ftr.s-ftr`.
   Les <svg> e-svg ont un style INLINE `width/height:100%` → dimensionner via le wrapper .e-svg-base
   + `!important` sur le svg. Le logo `s-ftr-logo` est porté par le <img> lui-même. */
/* neutralise le padding 10px parasite des conteneurs atomiques (§7.5, via .e-con) */
.s-ftr .e-con { padding: 0; }
/* racine (double classe pour battre le padding parasite du .e-con racine) */
.s-ftr.s-ftr { background: var(--petrole-2, #22383F); color: rgba(255,255,255,.78); padding: 64px 0 28px; display: block; }
.s-ftr .s-ftr-wrap { width: 100%; max-width: var(--maxw, 1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }
/* grille 5 colonnes (§7.11 : la grille porte le layout, pas les enfants) */
.s-ftr .s-ftr-top { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr 1.2fr; gap: 34px; }
/* colonne marque — s-ftr-logo est sur le <img> lui-même */
.s-ftr .s-ftr-brand { display: block; }
.s-ftr .s-ftr-logo { display: block; width: 64px; height: 64px; margin-bottom: 16px; }
.s-ftr .s-ftr-tagline { font-size: 13.5px; max-width: 30ch; line-height: 1.6; }
/* colonnes de liens */
.s-ftr .s-ftr-col { display: block; }
.s-ftr .s-ftr-h { display: block; color: #fff; font-family: var(--font-display, "Bricolage Grotesque"), sans-serif; font-weight: 700; font-size: var(--fs-eyebrow); letter-spacing: .08em; text-transform: uppercase; margin-bottom: 16px; }
.s-ftr .s-ftr-list { display: flex; flex-direction: column; gap: 10px; align-items: flex-start; }
/* line-height 25.6px : reproduit la hauteur de ligne des <li> maquette (25.6px) → avec gap 10 du
   .s-ftr-list = 36px centre-à-centre entre liens (fidèle maquette, WP était trop serré à 21+10). */
.s-ftr .s-ftr-link { display: inline-flex; font-size: 14px; line-height: 25.6px; color: rgba(255,255,255,.78); text-decoration: none; transition: color .25s; }
.s-ftr .s-ftr-link:hover { color: var(--corail-pale, #FFC6AC); }
.s-ftr .s-ftr-link-t { font-size: 14px; color: inherit; }
/* réseaux sociaux */
.s-ftr .s-ftr-socials { display: flex; gap: 10px; margin-top: 18px; }
.s-ftr .s-ftr-social { position: relative; display: block; flex: 0 0 auto; width: 38px; }
.s-ftr .s-ftr-social-btn { flex: 0 0 auto; width: 38px; height: 38px; min-width: 38px; border-radius: 50%; background: rgba(255,255,255,.08); display: flex; align-items: center; justify-content: center; border: 0; padding: 0; cursor: pointer; color: #fff; transition: background .25s; }
.s-ftr .s-ftr-social-btn:hover, .s-ftr .s-ftr-social.open .s-ftr-social-btn { background: var(--corail-deep, #EA5638); }
/* icônes : wrapper .e-svg-base dimensionné + svg forcé (§7.14 : e-svg impose width/height:100% inline) */
.s-ftr .s-ftr-ic { width: 17px; height: 17px; flex: 0 0 auto; display: block; color: #fff; }
.s-ftr .s-ftr-ic svg { width: 17px !important; height: 17px !important; min-width: 17px; display: block; }
.s-ftr .s-ftr-cic { width: 15px; height: 15px; flex: 0 0 auto; margin-top: 3px; display: block; color: var(--corail-pale, #FFC6AC); }
.s-ftr .s-ftr-cic svg { width: 15px !important; height: 15px !important; min-width: 15px; display: block; }
/* fill (§7.3/§7.14) : contour par défaut (map/phone/mail/Instagram = stroke), pleins pour FB/YT */
.s-ftr .e-svg-base svg { fill: none; }
.s-ftr .s-ftr-ic-fb svg, .s-ftr .s-ftr-ic-yt svg { fill: currentColor; }
/* popover social : masqué via opacity/visibility (transition), ouvre vers le HAUT */
.s-ftr .s-ftr-social-pop { position: absolute; bottom: calc(100% + 12px); left: 0; min-width: 178px; background: #fff; border-radius: 14px; padding: 7px; box-shadow: 0 20px 44px -16px rgba(0,0,0,.45); display: flex; flex-direction: column; gap: 1px; opacity: 0; visibility: hidden; transform: translateY(8px); transition: opacity .22s var(--ease), transform .22s var(--ease), visibility .22s; z-index: 30; }
.s-ftr .s-ftr-social.open .s-ftr-social-pop { opacity: 1; visibility: visible; transform: none; }
.s-ftr .s-ftr-pop-h { display: block; font-size: var(--fs-micro); font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--petrole-brume); padding: 7px 12px 5px; }
.s-ftr .s-ftr-pop-link { display: block; padding: 9px 13px; border-radius: 9px; font-size: 14px; font-weight: 600; color: var(--petrole); white-space: nowrap; text-decoration: none; transition: background .2s, color .2s; }
.s-ftr .s-ftr-pop-link:hover { background: var(--sable-pale, #F3EFE7); color: var(--corail-deep, #EA5638); }
.s-ftr .s-ftr-pop-t { color: inherit; font-size: 14px; font-weight: 600; }
/* contact — la ligne pictogramme + texte, commune à l'adresse, au téléphone et à l'email.
   Ces deux règles reprennent EXACTEMENT les valeurs de `.ftr-line` de la maquette Sébastien
   (flex, align-items flex-start, gap 9px, line-height 1.5) : rien à y changer. */
.s-ftr .s-ftr-cline { display: flex; align-items: flex-start; gap: 9px; line-height: 1.5; font-size: 14px; }
.s-ftr .s-ftr-ctext { font-size: 14px; line-height: 1.5; }
/* Les 4 pastilles de langue FR/EN/DE/NL ont été RETIRÉES du footer le 2026-09-21 (décision
   dev, la maquette Sébastien ne les reprend pas). Leurs règles sont supprimées avec elles.
   `js/footer-langues.js` n'est plus chargé — le fichier est conservé : sa logique (lire les
   `<link rel="alternate" hreflang>` publiés par Linguise plutôt que deviner les URLs, et la
   liste `INDISPONIBLES` des langues déclarées mais non servies) sert de base à la passe
   « header en mode serré », inscrite à la checklist go-live. */
/* Bouton « Télécharger la brochure » — colonne Contact, sous les pastilles de langue
   (maquette Sébastien, 2026-09-16). Reprend le traitement des pastilles INACTIVES
   (.s-ftr-lang : pilule, fond blanc à 8 %, 12 px, gras) en y ajoutant une icône, d'où
   inline-flex et gap. `width: auto` est nécessaire : la base atomique V4 pose width:100%
   sur ses conteneurs, ce qui étirerait le bouton sur toute la colonne (piège e-con du
   design-system). Sélecteurs descendants uniquement — le canvas de l'éditeur enveloppe
   chaque widget, un `>` casserait à l'édition. */
/* Pleine largeur de la colonne, contenu centré (demande du 2026-09-16 — la première version
   était à la largeur du contenu). L'espace au-dessus reprend celui des pastilles (18 px). */
.s-ftr .s-ftr-brochure { display: flex; align-items: center; justify-content: center; gap: 9px; width: 100%; margin-top: 18px; padding: 9px 15px; border-radius: 999px; background: rgba(255,255,255,.08); color: #fff; font-size: 12px; font-weight: 700; text-decoration: none; transition: background .18s ease; }
.s-ftr .s-ftr-brochure:hover, .s-ftr .s-ftr-brochure:focus-visible { background: rgba(255,255,255,.16); }
/* Icône à 11 px : calée sur la maquette en RATIO, pas en pixels — la capture reçue est
   zoomée. Son icône occupe ~0,34 de la hauteur du bouton ; 14 px donnait 0,42, trop gros.
   `display: block` est ce qui l'ALIGNE avec le texte : un SVG est `inline` par défaut, donc
   posé sur la baseline, ce qui le décalait de 2 px vers le bas. Le `align-items: center` du
   bouton n'y suffisait pas — Elementor enveloppe chaque widget, si bien que l'enfant flex est
   le wrapper, pas le SVG, et le décalage se produisait À L'INTÉRIEUR du wrapper. */
.s-ftr .s-ftr-brochure-ic { display: flex; align-items: center; width: 11px; height: 11px; flex: 0 0 auto; color: #fff; }
/* Le `<svg>` est DANS le div du widget, et Elementor lui pose `fill="currentColor"` en
   attribut — ce qui remplirait des tracés dessinés au trait. On rétablit donc le contour, et
   `display: block` supprime l'espace de baseline responsable du décalage de 2 px. */
.s-ftr .s-ftr-brochure-ic svg { display: block; fill: none; }
.s-ftr .s-ftr-brochure-t { font-size: 12px; font-weight: 700; color: #fff; }
/* bas de footer */
.s-ftr .s-ftr-bot { margin-top: 48px; padding-top: 22px; border-top: 1px solid rgba(255,255,255,.12); display: flex; justify-content: space-between; gap: 18px; flex-wrap: wrap; font-size: 12.5px; color: rgba(255,255,255,.6); }
/* `.s-ftr-legal` ne porte plus que le copyright : les mentions sont passées d'un paragraphe
   unique à 5 entrées séparées, stylées plus bas sous `.s-ftr-legalbar` (2026-09-21). */

/* ------------------------------------------------------------------
   BANDE CONTACT — refonte Sébastien du 2026-09-21 (maquette/footer/).
   La colonne « Contact » est sortie de la rangée haute (5 → 4 colonnes, valeur portée par le
   STYLE LOCAL de `.ftr-top-nat`, donc éditable) et remplacée par cette bande pleine largeur :
   un bloc par village, puis « nous joindre » (email + brochure).

   ⚠️ Les 21 règles de `maquette/footer/footer.css` écrites en CLASSE SIMPLE perdraient contre
   les bases atomiques (`.e-con` padding 10px + width 100%, `.e-div-block-base` display block,
   `.e-flexbox-base` flex-direction row), qui sont aussi à (0,1,0) mais chargées APRÈS le
   thème. Tout est donc rescopé en `.s-ftr .s-ftr-xxx` — (0,2,0). Aucune valeur de design
   n'est modifiée, seul le scope. Sélecteurs descendants uniquement : le canvas de l'éditeur
   enveloppe chaque widget, un `>` ou un `+` y casserait (§7.6).
   ------------------------------------------------------------------ */
/* `.s-ftr-contact` était le conteneur en colonne de l'ancienne colonne Contact ; il devient
   la bande. La règle est réécrite, pas doublée. */
.s-ftr .s-ftr-contact { margin-top: clamp(34px,3.6vw,50px); padding-top: clamp(26px,2.8vw,34px); border-top: 1px solid rgba(255,255,255,.1); display: grid; grid-template-columns: 1fr 1fr minmax(250px,.9fr); gap: clamp(22px,2.8vw,40px); align-items: start; }
.s-ftr .s-ftr-place { display: flex; flex-direction: column; gap: 7px; }
.s-ftr .s-ftr-place-name { display: block; font-size: var(--fs-micro); font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--corail-pale, #FFC6AC); }
.s-ftr .s-ftr-cline-tel .s-ftr-ctext { white-space: nowrap; font-variant-numeric: tabular-nums; }
.s-ftr .s-ftr-cmail .s-ftr-ctext { word-break: break-word; }
/* le conteneur-lien natif qui enveloppe téléphone et email : il n'apporte aucune géométrie
   propre, seulement l'état de lien. `width: auto` contre la base `.e-con`. */
.s-ftr .s-ftr-clink { display: inline-flex; width: auto; padding: 0; text-decoration: none; color: inherit; transition: color .25s var(--ease); }
.s-ftr a.s-ftr-clink:link, .s-ftr a.s-ftr-clink:visited { color: rgba(255,255,255,.84); text-decoration: none; }
.s-ftr a.s-ftr-clink:hover, .s-ftr a.s-ftr-clink:focus-visible { color: var(--corail-pale, #FFC6AC); text-decoration: none; }
/* colonne « nous joindre » : email puis brochure */
.s-ftr .s-ftr-reach { display: flex; flex-direction: column; align-items: flex-start; gap: 16px; }
/* Dans la bande, la brochure reprend la largeur de son contenu — elle occupait toute la
   colonne Contact, qui n'existe plus. Le reste de son habillage est inchangé (règle plus
   haut) ; on ne redéclare que ce que le nouveau contexte impose. */
.s-ftr .s-ftr-reach .s-ftr-brochure { width: auto; margin-top: 0; padding: 12px 20px; }
/* la maquette met le libellé à `--fs-label` ; l'ancien bouton était à 12 px parce qu'il devait
   s'aligner sur les pastilles de langue, qui n'existent plus. */
.s-ftr .s-ftr-reach .s-ftr-brochure-t { font-size: var(--fs-label); }

/* Sous la tablette, la marque occupe toute la largeur et les 3 colonnes de liens se répartissent
   dessous — comportement de la maquette (`.ftr-brand { grid-column: 1 / -1 }` sous 1080 px).
   Le point de rupture est celui d'Elementor (1024) et non le 1080 de la maquette, pour rester
   aligné sur les variantes du style local qui pilote la grille. */
@media (max-width: 1024px) { .s-ftr .s-ftr-brand { grid-column: 1 / -1; } }

/* barre légale : 5 entrées séparées, à la place du paragraphe unique d'avant. Les libellés
   sans cible en production (« Gérer mes cookies », chantier CMP) restent du texte : on ne
   fabrique pas un lien vers nulle part. */
/* `width: auto` est indispensable : la base `.e-con` pose `width: 100%`, la barre prenait donc
   toute la largeur de `.s-ftr-bot` et poussait le copyright sur une 2e ligne — le `flex-wrap`
   du bas masquait la cause. Mesuré : barre du bas à 81 px de haut au lieu de 40. */
.s-ftr .s-ftr-legalbar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; width: auto; }
.s-ftr .s-ftr-legal-link { display: inline-flex; width: auto; padding: 0; text-decoration: none; }
.s-ftr .s-ftr-legal-t { font-size: 12.5px; color: inherit; }
.s-ftr .s-ftr-sep { display: inline-block; color: rgba(255,255,255,.26); font-size: 12.5px; }
/* Couleur déclarée explicitement : le reset Hello Elementor pose `#c36` sur les liens, piège
   déjà rencontré sur les pastilles de langue et sur l'ancienne barre légale. */
.s-ftr .s-ftr-legalbar a:link, .s-ftr .s-ftr-legalbar a:visited { color: inherit; text-decoration: none; }
.s-ftr .s-ftr-legalbar a:hover, .s-ftr .s-ftr-legalbar a:focus-visible { color: #fff; text-decoration: underline; }
.s-ftr .s-ftr-legal-off { color: rgba(255,255,255,.6); font-size: 12.5px; }

/* responsive : la rangée haute reste pilotée par le style local du document (4 → 2 → 1
   colonne). La bande contact suit la maquette : 3 → 2 colonnes, puis 1. */
@media (max-width: 1080px) {
  .s-ftr .s-ftr-contact { grid-template-columns: 1fr 1fr; }
  .s-ftr .s-ftr-reach { grid-column: 1 / -1; flex-direction: row; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; padding-top: 20px; border-top: 1px solid rgba(255,255,255,.1); }
}
@media (max-width: 700px) {
  .s-ftr .s-ftr-contact { grid-template-columns: 1fr; }
  .s-ftr .s-ftr-reach .s-ftr-brochure { width: 100%; justify-content: center; }
}
@media (max-width: 900px) { .s-ftr .s-ftr-top { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .s-ftr .s-ftr-top { grid-template-columns: 1fr; } }

/* ============================================================
   HERO — animations (bloc home/hero-selector, doc #47 + inline page 65)
   Maquette : index.html:126 `.heroD` / styles.css:102-140,321-322,424-428 + script.js:203-220,245.
   Scopé `.s-hero`, spécificité `.s-hero .X` (bat les bases atomiques Elementor).
   LOT H1 = entrées au chargement · H2 = ken burns fond défaut. (H3 hover / H4 swap / H5 parallaxe suivent.)
   ============================================================ */
/* H1 — entrées au chargement (maquette `.load` + `@keyframes rise`, délais l1..l4). */
@keyframes s-hero-rise { to { opacity: 1; transform: none; } }
.s-hero .s-hero-eyebrow, .s-hero .s-hero-h1, .s-hero .s-hero-sub,
.s-hero .s-hero-dock-hint {
  opacity: 0; transform: translateY(22px);
  animation: s-hero-rise 1s var(--ease, cubic-bezier(.2,.7,.2,1)) forwards;
}
.s-hero .s-hero-eyebrow   { animation-delay: .15s; }  /* l1 */
.s-hero .s-hero-h1        { animation-delay: .35s; }  /* l2 */
.s-hero .s-hero-sub,
.s-hero .s-hero-dock-hint { animation-delay: .55s; }  /* l3 */
/* .s-hero-cards (l4) : entrée SANS transform résiduel — c'est un ANCÊTRE des cartes verre, et un
   transform (même la matrice identité laissée par `animation … forwards → transform:none`) casse le
   backdrop-filter des descendants. On anime DEPUIS l'état décalé vers l'état de base (`backwards`, pas
   `forwards`) : après l'animation, l'élément reprend sa base = AUCUN transform → le verre s'affiche. */
@keyframes s-hero-rise-cards { from { opacity: 0; transform: translateY(22px); } }
.s-hero .s-hero-cards { animation: s-hero-rise-cards 1s var(--ease, cubic-bezier(.2,.7,.2,1)) .78s backwards; }

/* H2/H4 — ken burns + zoom des fonds, GATÉS par `.is-active` (toggle par js/hero.js au swap).
   Deux comportements distincts, fidèles maquette (styles.css:107-109) :
   - fond DÉFAUT : kenburns = zoom OUT scale 1.12 -> 1 (16s), rejoué à chaque (ré)activation
     (le sélecteur .is-active retire/ré-applique l'animation → relance au retour sur défaut) ;
   - fonds VILLAGE : zoom IN doux scale 1 -> 1.04 en 6s à l'activation (transition). */
@keyframes s-hero-kenburns { from { transform: scale(1.12); } to { transform: scale(1); } }
.s-hero .s-hero-bg-default.is-active .s-hero-bg-default-img { animation: s-hero-kenburns 16s ease-out forwards; }
.s-hero .s-hero-bg-oasis-img, .s-hero .s-hero-bg-gassin-img { transform: scale(1); transition: transform 6s ease-out; }
.s-hero .s-hero-bg-oasis.is-active .s-hero-bg-oasis-img,
.s-hero .s-hero-bg-gassin.is-active .s-hero-bg-gassin-img { transform: scale(1.04); }

/* H3 — hover des cartes (maquette .dcard:hover, .dgo, .cta ; styles.css:121-140).
   `.s-hero-dgo` = CTA « Voir le village » ajouté au markup (masqué au repos, révélé au survol).
   Classe partagée `.s-hero-card` (oasis+gassin). Spécificité `.s-hero .X` pour battre les styles d'élément. */
.s-hero .s-hero-card { transition: background .4s, opacity .4s, box-shadow .4s, transform .4s; cursor: pointer; }
/* #2 verre dépoli : la base atomique ne posait que blur(22px) ; ajout de saturate(1.4) (maquette .dcard). */
.s-hero .s-hero-card { -webkit-backdrop-filter: blur(22px) saturate(1.4); backdrop-filter: blur(22px) saturate(1.4); }
.s-hero .s-hero-card [class$="-thumb-img"] { transition: transform .9s var(--ease); }
.s-hero .s-hero-card:hover [class$="-thumb-img"] { transform: scale(1.05); }
.s-hero .s-hero-card:hover { background: rgba(255,255,255,.22); box-shadow: 0 32px 64px -26px rgba(0,0,0,.8); transform: translateY(-3px); }
/* atténuation de l'autre carte au survol (maquette .cards:hover .dcard:not(:hover)) */
.s-hero .s-hero-cards:hover .s-hero-card:not(:hover) { opacity: .58; }
/* CTA révélé (maquette .dgo : max-height 0 -> 60 + opacity + margin-top) */
/* padding:0 : neutralise le padding parasite §7.5 du conteneur atomique — sinon le dgo garde ~20px de
   hauteur même replié (décale le CTA à droite + fausse le centrage vertical du bloc texte, cf. #1/#4a). */
.s-hero .s-hero-dgo { max-height: 0; opacity: 0; overflow: hidden; padding: 0; transition: max-height .5s var(--ease), opacity .4s var(--ease), margin-top .45s var(--ease); }
/* #4b : étoiles en line-height 1 (maquette .dbody .st{line-height:1}) — sinon 24px ajoutait ~6px sous
   les étoiles, gonflant l'espace étoiles↔CTA. */
.s-hero .s-hero-card-oasis-st, .s-hero .s-hero-card-gassin-st { line-height: 1; }
.s-hero .s-hero-card:hover .s-hero-dgo { max-height: 60px; opacity: 1; margin-top: 14px; }
/* pastille CTA corail (maquette .dock .cta) */
/* width:auto : `.e-con` atomique impose width:100% (§7.5) → le CTA s'étirait ; auto = il épouse le texte.
   white-space:nowrap : « Voir le village » sur une ligne (sinon le label s'enroule dans la carte étroite en mobile). */
.s-hero .s-hero-dgo-cta { display: inline-flex; width: auto; align-items: center; gap: 10px; white-space: nowrap; font-weight: 700; font-size: 14px; border-radius: 999px; padding: 11px 12px 11px 20px; background: var(--corail-deep, #EA5638); color: #fff; }
.s-hero .s-hero-dgo-label { color: #fff; font-weight: 700; font-size: 14px; white-space: nowrap; }
.s-hero .s-hero-dgo-ic { flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%; background: rgba(255,255,255,.22); display: flex; align-items: center; justify-content: center; transition: background .35s var(--ease); color: #fff; }
/* dimensionner le WRAPPER e-svg (.e-svg-base) et non seulement le <svg> : sinon le wrapper garde une
   hauteur ~65px et la flèche se place en haut, hors du cercle (même piège §7.14 que les icônes footer). */
.s-hero .s-hero-dgo-svg { width: 15px; height: 15px; flex: 0 0 auto; display: flex; align-items: center; justify-content: center; }
.s-hero .s-hero-dgo-svg svg { width: 15px !important; height: 15px !important; min-width: 15px; display: block; fill: none; stroke: currentColor; transition: transform .4s var(--ease); }
.s-hero .s-hero-card:hover .s-hero-dgo-ic { background: #fff; color: var(--corail-deep, #EA5638); }
.s-hero .s-hero-card:hover .s-hero-dgo-svg svg { transform: rotate(-45deg); }
/* mobile ≤900 : pas de hover tactile → CTA visible en permanence (maquette styles.css:333,348). */
@media (max-width: 900px) { .s-hero .s-hero-dgo { max-height: 80px; opacity: 1; margin-top: 12px; } }

/* H4 — swap du fond : crossfade opacity (maquette .bg{transition:opacity 1s}). Le toggle d'opacité
   est piloté par js/hero.js (inline style) ; la transition vit ici. */
.s-hero .s-hero-bgs > * { transition: opacity 1s var(--ease); }
/* H5 — parallaxe : le scale du conteneur des fonds est piloté par js/hero.js. On garantit le clip. */
.s-hero { overflow: hidden; }
.s-hero .s-hero-bgs { will-change: transform; }

/* Accessibilité — respect de prefers-reduced-motion (maquette styles.css:426-428). */
@media (prefers-reduced-motion: reduce) {
  .s-hero .s-hero-eyebrow, .s-hero .s-hero-h1, .s-hero .s-hero-sub,
  .s-hero .s-hero-dock-hint, .s-hero .s-hero-cards {
    opacity: 1 !important; transform: none !important; animation: none !important;
  }
  .s-hero .s-hero-bg-default.is-active .s-hero-bg-default-img,
  .s-hero .s-hero-bg-oasis-img, .s-hero .s-hero-bg-gassin-img,
  .s-hero .s-hero-bg-oasis.is-active .s-hero-bg-oasis-img,
  .s-hero .s-hero-bg-gassin.is-active .s-hero-bg-gassin-img { animation: none !important; transform: none !important; transition: none !important; }
}

/* ============================================================
   MENU MOBILE — visage VILLAGE (doc 64, overlay .s-hdr-mobile.s-hdr-mm-v)
   Maquette V28 : script.js isVillage + styles.css:367-424. Construit EN DUR (dette dynamique).
   Scopé `.s-hdr-mm-v` (marqueur sur le conteneur) → n'affecte pas l'overlay marque. Infra
   open/close/scroll-lock/focus-trap = LOT 2c (partagé). Nouveau : logo head, carte « Vous êtes
   ici » + accordéon (grid-template-rows), badge, chevron, liens village.
   ============================================================ */
/* §7.5 : neutralise le padding parasite (10px) des conteneurs atomiques qui ne doivent PAS en avoir
   (audit getComputedStyle). Les conteneurs à padding voulu (head/scroll/card/switch/link/bar/cta) le
   redéclarent avec la même spécificité ci-dessous → ils gagnent (ordre source). */
.s-hdr-mm-v .s-hdr-mm-logo, .s-hdr-mm-v .s-hdr-mm-ct, .s-hdr-mm-v .s-hdr-mm-nm,
.s-hdr-mm-v .s-hdr-mm-go, .s-hdr-mm-v .s-hdr-mm-chev, .s-hdr-mm-v .s-hdr-mm-links,
.s-hdr-mm-v .s-hdr-mm-util, .s-hdr-mm-v .s-hdr-mm-langs, .s-hdr-mm-v .s-hdr-mm-cta-ico { padding: 0; }
.s-hdr-mm-v .s-hdr-mm-head { position: sticky; top: 0; z-index: 2; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 16px max(20px, calc((100% - 560px)/2)); background: rgba(251,250,246,.985); transition: box-shadow .25s; }
.s-hdr-mm-v .s-hdr-mm-head.scrolled { box-shadow: 0 1px 0 rgba(34,56,63,.1); }
.s-hdr-mm-v .s-hdr-mm-logo { display: flex; }
.s-hdr-mm-v .s-hdr-mm-logo-img { width: 46px; height: 46px; object-fit: contain; }
.s-hdr-mm-v .s-hdr-mm-close { width: 44px; height: 44px; flex: 0 0 auto; border-radius: 50%; border: 0; background: rgba(44,74,82,.08); color: var(--petrole,#2C4A52); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background .25s; padding: 0; }
.s-hdr-mm-v .s-hdr-mm-close:hover { background: rgba(44,74,82,.16); }
.s-hdr-mm-v .s-hdr-mm-close-svg { width: 20px; height: 20px; flex: 0 0 auto; display: flex; }
.s-hdr-mm-v .s-hdr-mm-close-svg svg { width: 20px !important; height: 20px !important; stroke: currentColor; fill: none; }
.s-hdr-mm-v .s-hdr-mm-scroll { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 6px 22px 28px; display: flex; flex-direction: column; width: 100%; max-width: 560px; margin: 0 auto; }
/* cartes (switch + destinations) */
.s-hdr-mm-v .s-hdr-mm-card { display: flex; align-items: center; gap: 14px; background: #fff; border-radius: var(--r-card,24px); box-shadow: 0 16px 40px -26px rgba(34,56,63,.5), 0 0 0 1px rgba(34,56,63,.06); padding: 15px 17px; margin-bottom: 10px; text-decoration: none; width: 100%; text-align: left; border: 0; cursor: pointer; transition: transform .35s var(--ease), box-shadow .35s var(--ease); }
.s-hdr-mm-v a.s-hdr-mm-card:hover { transform: translateY(-3px); box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); }
.s-hdr-mm-v .s-hdr-mm-ct { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.s-hdr-mm-v .s-hdr-mm-nm { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; font-family: var(--font-display,"Bricolage Grotesque"),sans-serif; font-weight: 600; font-size: var(--fs-h4); color: var(--petrole,#2C4A52); line-height: 1.15; }
.s-hdr-mm-v .s-hdr-mm-nm-t { font-family: var(--font-display,"Bricolage Grotesque"),sans-serif; font-weight: 600; }
.s-hdr-mm-v .s-hdr-mm-st { font-size: var(--fs-meta); color: var(--corail,#FB6F52); letter-spacing: 1px; font-weight: 700; }
.s-hdr-mm-v .s-hdr-mm-meta { font-size: var(--fs-meta); color: var(--petrole-brume,#5B7B82); }
.s-hdr-mm-v .s-hdr-mm-go { width: 34px; height: 34px; flex: 0 0 auto; border-radius: 50%; background: var(--sable-pale,#F3EFE7); color: var(--corail-deep,#EA5638); display: flex; align-items: center; justify-content: center; transition: background .3s var(--ease), color .3s var(--ease); }
.s-hdr-mm-v .s-hdr-mm-go-svg { width: 18px; height: 18px; flex: 0 0 auto; display: flex; }
.s-hdr-mm-v .s-hdr-mm-go-svg svg { width: 18px !important; height: 18px !important; stroke: currentColor; stroke-width: 2.2; fill: none; }
.s-hdr-mm-v a.s-hdr-mm-card:hover .s-hdr-mm-go { background: var(--corail-deep,#EA5638); color: #fff; }
/* badge « Vous êtes ici » + chevron du switch */
.s-hdr-mm-v .s-hdr-mm-badge { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .02em; padding: 4px 10px; border-radius: 999px; background: var(--petrole-brume,#5B7B82); color: #fff; white-space: nowrap; }
.s-hdr-mm-v .s-hdr-mm-badge.here { background: var(--corail-deep,#EA5638); }
.s-hdr-mm-v .s-hdr-mm-chev { width: 30px; height: 30px; flex: 0 0 auto; border-radius: 50%; background: var(--sable-pale,#F3EFE7); color: var(--petrole,#2C4A52); display: flex; align-items: center; justify-content: center; transition: transform .3s var(--ease); }
.s-hdr-mm-v .s-hdr-mm-chev-svg { width: 17px; height: 17px; flex: 0 0 auto; display: flex; }
.s-hdr-mm-v .s-hdr-mm-chev-svg svg { width: 17px !important; height: 17px !important; stroke: currentColor; stroke-width: 2.4; fill: none; }
.s-hdr-mm-v .s-hdr-mm-switch-btn[aria-expanded="true"] .s-hdr-mm-chev { transform: rotate(180deg); }
/* accordéon « changer de village » (grid-template-rows 0fr→1fr) */
/* padding:0 (§7.5) sur les 2 conteneurs de l'accordéon : sinon le padding parasite (10px ×2 ×2 = 40px)
   empêche le repli à 0 (la technique grid-rows exige un conteneur interne sans padding/marge/bordure). */
.s-hdr-mm-v .s-hdr-mm-disclose { display: grid; grid-template-rows: 0fr; padding: 0; transition: grid-template-rows .35s var(--ease); }
.s-hdr-mm-v .s-hdr-mm-disclose.open { grid-template-rows: 1fr; }
.s-hdr-mm-v .s-hdr-mm-disclose-in { overflow: hidden; min-height: 0; padding: 0; }
/* liens village à plat (chevron ::after) */
.s-hdr-mm-v .s-hdr-mm-links { display: flex; flex-direction: column; }
.s-hdr-mm-v .s-hdr-mm-link { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 13px 0; border-bottom: 1px solid rgba(34,56,63,.08); text-decoration: none; transition: color .2s, padding-left .25s var(--ease); }
.s-hdr-mm-v .s-hdr-mm-link:last-child { border-bottom: 0; }
.s-hdr-mm-v .s-hdr-mm-link-t { font-family: var(--font-display,"Bricolage Grotesque"),sans-serif; font-weight: 700; font-size: clamp(21px,5.4vw,26px); color: var(--petrole,#2C4A52); }
.s-hdr-mm-v .s-hdr-mm-link::after { content: ""; width: 22px; height: 22px; flex: 0 0 auto; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232C4A52' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") center/contain no-repeat; opacity: .32; transition: opacity .2s, transform .25s var(--ease); }
.s-hdr-mm-v .s-hdr-mm-link:hover { padding-left: 6px; }
.s-hdr-mm-v .s-hdr-mm-link:hover .s-hdr-mm-link-t { color: var(--corail-deep,#EA5638); }
.s-hdr-mm-v .s-hdr-mm-link:hover::after { opacity: .7; transform: translateX(3px); }
/* utilitaires : langue + mention */
.s-hdr-mm-v .s-hdr-mm-util { margin-top: 18px; }
.s-hdr-mm-v .s-hdr-mm-langs { display: flex; align-items: center; gap: 8px; margin-top: 16px; flex-wrap: wrap; }
.s-hdr-mm-v .s-hdr-mm-lang-lab { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--petrole-brume,#5B7B82); margin-right: 4px; }
.s-hdr-mm-v .s-hdr-mm-lang { font-size: var(--fs-label); font-weight: 700; min-height: 40px; padding: 8px 16px; display: inline-flex; align-items: center; border-radius: 999px; background: var(--sable-pale,#F3EFE7); color: var(--petrole,#2C4A52); cursor: pointer; transition: background .2s, color .2s; }
.s-hdr-mm-v .s-hdr-mm-lang.on { background: var(--corail-deep,#EA5638); color: #fff; }
.s-hdr-mm-v .s-hdr-mm-disclaimer { font-size: var(--fs-micro); color: var(--petrole-brume,#5B7B82); margin-top: 14px; }
/* barre bas : Réserver (classes globales btn) + Nous contacter */
.s-hdr-mm-v .s-hdr-mm-bar { position: sticky; bottom: 0; z-index: 2; display: flex; gap: 10px; padding: 14px max(20px, calc((100% - 560px)/2)) calc(14px + env(safe-area-inset-bottom)); background: var(--sable-pale,#F3EFE7); box-shadow: 0 -1px 0 rgba(34,56,63,.1); }
.s-hdr-mm-v .s-hdr-mm-cta { flex: 1.35; justify-content: center; min-height: 54px; }
/* flèche Réserver : fond TRANSPARENT au repos (maquette .btn .ico{background:transparent}), pastille
   blanche seulement au survol. (Corrige la confusion avec le style .dock .cta .ic du hero qui a un fond.) */
.s-hdr-mm-v .s-hdr-mm-cta-ico { width: 26px; height: 26px; flex: 0 0 auto; border-radius: 50%; background: transparent; color: #fff; display: flex; align-items: center; justify-content: center; transition: background .35s var(--ease), color .35s var(--ease); }
.s-hdr-mm-v .s-hdr-mm-cta:hover .s-hdr-mm-cta-ico { background: #fff; color: var(--corail-deep, #EA5638); }
.s-hdr-mm-v .s-hdr-mm-cta-arrow { width: 15px; height: 15px; flex: 0 0 auto; display: flex; }
.s-hdr-mm-v .s-hdr-mm-cta-arrow svg { width: 15px !important; height: 15px !important; stroke: currentColor; fill: none; }
.s-hdr-mm-v .s-hdr-mm-contact { flex: 1; min-height: 54px; display: inline-flex; align-items: center; justify-content: center; border-radius: 999px; font-weight: 700; font-size: var(--fs-label); color: var(--petrole,#2C4A52); background: #fff; box-shadow: 0 0 0 1px rgba(34,56,63,.06); text-decoration: none; transition: transform .25s var(--ease), box-shadow .25s, background .25s, color .25s; }
.s-hdr-mm-v .s-hdr-mm-contact:hover { transform: translateY(-2px); box-shadow: 0 16px 40px -26px rgba(34,56,63,.5); background: var(--petrole,#2C4A52); color: #fff; }

/* ============================================================
   EXPERIENCE — bloc home/experience (page 65 ; collage « scatter »)
   Maquette : index.html:164 / styles.css:197-210 + responsive 337-341.
   Collage absolu = CSS thème custom (§7.2). Tout scopé `.s-exp` (spécificité 0,2,0 pour battre les
   défauts atomiques : width:100%, position, min-width). §7.5 préventif en tête.
   ============================================================ */
/* §7.5 préventif : padding parasite neutralisé d'emblée sur TOUS les conteneurs du bloc (0,2,0).
   ⚠️ NE PAS utiliser `:not(.btn)` : `:not()` ajoute la spécificité de son argument → le reset passe à
   (0,3,0) et écrase les règles (0,2,0) qui reposent un padding voulu (wrap, fllab). On garde le blanket
   et on RÉ-AJOUTE explicitement le padding du bouton plus bas (même spécificité, après → gagne). */
.s-exp .e-con { padding: 0; }
/* section + wrap */
/* section : padding vertical maquette (.section{padding:clamp(64,9vw,120) 0} + override bas de l'inline
   style=padding-bottom:clamp(24,3vw,48)). Double classe pour battre le padding parasite du .e-con racine. */
.s-exp.s-exp { display: block; padding: clamp(64px,9vw,120px) 0 clamp(24px,3vw,48px); }
.s-exp .s-exp-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }
/* canevas collage (position:relative, hauteur fixe maquette 840px) */
.s-exp .s-exp-scatter { position: relative; height: 840px; max-width: 1080px; margin: 0 auto; }
/* bloc texte centré au milieu du collage */
.s-exp .s-exp-ctext { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); width: min(450px,82%); text-align: center; z-index: 5; }
.s-exp .s-exp-eyebrow { display: inline-flex; align-items: center; justify-content: center; gap: 10px; font-size: var(--fs-eyebrow); font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--corail-deep); }
.s-exp .s-exp-eyebrow::before { content: ""; width: 26px; height: 2px; background: var(--corail); flex: 0 0 auto; }
.s-exp .s-exp-h2 { font-size: var(--fs-h2); color: var(--petrole); }
.s-exp .s-exp-p { margin: 14px 0 22px; color: var(--petrole-brume); font-size: 16px; }
/* bouton : ré-ajout du padding (écrasé par le blanket .e-con reset), + ico 26px et flèche 16px
   (wrapper e-svg §7.14 : sinon l'ico grossit à ~65px et la flèche se décale au-dessus du texte). */
.s-exp .s-exp-btn { width: auto; margin: 0 auto; padding: 13px 16px 13px 24px; white-space: nowrap; }
.s-exp .s-exp-btn-t { white-space: nowrap; }
.s-exp .s-exp-btn-ico { width: 26px; height: 26px; min-width: 26px; flex: 0 0 auto; display: flex; align-items: center; justify-content: center; border-radius: 50%; }
.s-exp .s-exp-btn-arrow { width: 16px; height: 16px; flex: 0 0 auto; display: flex; }
/* vignettes — position:absolute, positions/tailles/rotations EN DUR (maquette) */
.s-exp .s-exp-fl { position: absolute; z-index: 2; }
.s-exp .s-exp-fl-1 { left: 0;    top: 44px;  width: 230px; height: 290px; transform: rotate(-3deg); }
.s-exp .s-exp-fl-2 { left: 356px; top: -6px;  width: 182px; height: 120px; transform: rotate(-1.5deg); }
.s-exp .s-exp-fl-3 { left: 600px; top: -12px; width: 166px; height: 124px; transform: rotate(2deg); }
.s-exp .s-exp-fl-4 { left: 862px; top: 18px;  width: 206px; height: 168px; transform: rotate(2.5deg); }
.s-exp .s-exp-fl-5 { left: 22px;  top: 382px; width: 198px; height: 198px; transform: rotate(2deg); }
.s-exp .s-exp-fl-6 { left: 856px; top: 386px; width: 222px; height: 288px; transform: rotate(-2.5deg); }
.s-exp .s-exp-fl-7 { left: 78px;  top: 626px; width: 190px; height: 150px; transform: rotate(-2deg); }
.s-exp .s-exp-fl-8 { left: 430px; top: 660px; width: 206px; height: 152px; transform: rotate(2deg); }
.s-exp .s-exp-fl-9 { left: 704px; top: 644px; width: 188px; height: 150px; transform: rotate(-2deg); }
/* photo : overflow:hidden UNIQUEMENT ici (pas sur .s-exp-fl, qui porte le label débordant, cf. vigilance #3) */
.s-exp .s-exp-ph { position: absolute; inset: 0; border-radius: 18px; overflow: hidden; box-shadow: 0 16px 40px -26px rgba(34,56,63,.5); transition: box-shadow .5s; }
.s-exp .s-exp-ph-img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease); }
.s-exp .s-exp-fl:hover { z-index: 7; }
.s-exp .s-exp-fl:hover .s-exp-ph { box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); }
.s-exp .s-exp-fl:hover .s-exp-ph-img { transform: scale(1.05); }
/* étiquette (pastille + libellé), débordant le coin de la vignette (−13px) */
/* width:fit-content : la base atomique impose width:100% (§7.5) → la pastille s'étirait à la largeur de
   la vignette au lieu d'épouser le texte. fit-content = elle s'arrête après le contenu (fidèle maquette). */
.s-exp .s-exp-fllab { position: absolute; z-index: 8; width: fit-content; background: #fff; border-radius: 999px; box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); padding: 7px 13px; font-size: 11.5px; font-weight: 700; color: var(--petrole); display: inline-flex; align-items: center; gap: 7px; white-space: nowrap; }
.s-exp .s-exp-lab-bl { left: 12px; bottom: -13px; }
.s-exp .s-exp-lab-br { right: 12px; bottom: -13px; }
.s-exp .s-exp-lab-tl { left: 12px; top: -13px; }
.s-exp .s-exp-lab-tr { right: 12px; top: -13px; }
/* min-width:7px : la base atomique impose min-width:30px (§7.5) → sans ça la pastille est un ovale 30×7. */
.s-exp .s-exp-dot { width: 7px; height: 7px; min-width: 7px; border-radius: 50%; flex: 0 0 auto; }
.s-exp .s-exp-dot-lagune { background: var(--lagune); }
.s-exp .s-exp-dot-olivier { background: var(--olivier); }
.s-exp .s-exp-dot-corail { background: var(--corail); }
.s-exp .s-exp-dot-ambre { background: var(--ambre); }
/* flèche du bouton (§7.14) */
.s-exp .s-exp-btn-arrow svg { width: 16px !important; height: 16px !important; fill: none; stroke: currentColor; }
/* responsive ≤900 : le collage absolu s'effondre en grille 2 colonnes (maquette styles.css:337-341) */
@media (max-width: 900px) {
  .s-exp .s-exp-scatter { height: auto; display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
  .s-exp .s-exp-ctext { position: static; transform: none; grid-column: 1 / -1; width: auto; margin: 6px 0; }
  .s-exp .s-exp-fl { position: relative !important; inset: auto !important; width: auto !important; height: 200px !important; transform: none !important; }
  .s-exp .s-exp-fllab { top: auto; bottom: 12px; left: 12px; right: auto; }
}

/* ============================================================
   REASSURANCE — bloc home/reassurance (page 65 ; grille « atouts »)
   Maquette : index.html:187 / styles.css:178-185 + responsive 334 (≤900) / 352 (≤560).
   Scopé `.s-reassur`. §7.5 préventif d'emblée. Cartes #fff sur body --lumiere (crème).
   ============================================================ */
/* §7.5 préventif : padding parasite neutralisé (PAS de :not, piège spécificité 0,3,0). */
.s-reassur .e-con { padding: 0; }
/* section : padding vertical maquette (.section{clamp(64,9vw,120) 0} + inline padding-top clamp(8,2vw,24)).
   Double classe pour battre le padding parasite du .e-con racine. */
.s-reassur.s-reassur { display: block; padding: clamp(8px,2vw,24px) 0 clamp(64px,9vw,120px); }
.s-reassur .s-reassur-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }
/* grille 3 colonnes */
.s-reassur .s-reassur-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: var(--gap-grid,20px); }
/* carte : blanc, radius 20, ombre douce, lévitation au hover */
.s-reassur .s-reassur-card { background: #fff; border-radius: 20px; padding: 26px 24px; box-shadow: 0 16px 40px -26px rgba(34,56,63,.5); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.s-reassur .s-reassur-card:hover { transform: translateY(-5px); box-shadow: 0 30px 70px -30px rgba(34,56,63,.6); }
/* carré d'icône 48px — min-width forcé (§7.5 : base atomique min-width:30px déformerait). Bascule au hover. */
.s-reassur .s-reassur-ic { width: 48px; height: 48px; min-width: 48px; border-radius: 14px; background: var(--sable-pale,#F3EFE7); color: var(--petrole,#2C4A52); display: flex; align-items: center; justify-content: center; margin-bottom: 16px; transition: background .35s var(--ease), color .35s; }
/* wrapper e-svg dimensionné (§7.14) + fill:none (les 6 icônes sont en stroke:currentColor → couleur héritée du parent). */
.s-reassur .s-reassur-ic-svg { width: 24px; height: 24px; flex: 0 0 auto; display: flex; }
.s-reassur .s-reassur-ic-svg svg { width: 24px !important; height: 24px !important; fill: none; stroke: currentColor; display: block; }
.s-reassur .s-reassur-card:hover .s-reassur-ic { background: var(--corail-deep,#EA5638); color: #fff; }
/* titre + texte */
.s-reassur .s-reassur-h4 { color: var(--petrole,#2C4A52); font-size: 16.5px; letter-spacing: -.01em; }
.s-reassur .s-reassur-p { font-size: 13px; color: var(--petrole-brume,#5B7B82); margin-top: 7px; line-height: 1.5; }
/* responsive : 3 → 2 col (≤900) → 1 col (≤560) */
@media (max-width: 900px) { .s-reassur .s-reassur-grid { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 560px) { .s-reassur .s-reassur-grid { grid-template-columns: 1fr; } }

/* ===================== home/hebergements-teaser (s-hbt) + composant carte (s-hcard) ===================== */
/* §7.5 préventif : neutralise padding + width:100% parasites ; ré-ajout explicite ensuite (scopé .s-hbt = spécificité 0,2,0). */
.s-hbt .e-con { padding: 0; width: auto; }
.s-hbt .e-div-block-base { min-width: 0; }
.s-hbt p { margin: 0; }

/* section (fond sable-pale = .section.alt) + wrap. `.s-hbt.s-hbt` (classe doublée = 0,2,0) bat les
   règles atomiques .e-con (padding logique + display:var(--font-display)) ; display:block pour que le wrap
   remplisse la largeur (pattern éprouvé s-exp). */
.s-hbt.s-hbt { display: block; padding: clamp(64px,9vw,120px) 0; background: var(--sable-pale,#F3EFE7); }
.s-hbt .s-hbt-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }

/* chapeau */
.s-hbt .s-hbt-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 28px; flex-wrap: wrap; margin-bottom: 42px; }
.s-hbt .s-hbt-head .eyebrow { margin: 0 0 16px; }
.s-hbt .s-hbt-h2 { font-size: var(--fs-h2); max-width: 18ch; }
.s-hbt .s-hbt-lead { font-size: var(--fs-lead); color: var(--petrole-brume,#5B7B82); max-width: 54ch; margin-top: 4px; }

/* grille auto-fit 3 → 2 → 1 (par largeur, comme la maquette) */
.s-hbt .s-hbt-grid { display: grid; grid-template-columns: repeat(auto-fit,minmax(280px,1fr)); gap: var(--gap-grid,20px); }

/* CTA (réutilise .btn .btn--outline global ; ré-ajout padding .btn car neutralisé par le reset) */
.s-hbt .s-hbt-cta { display: flex; justify-content: center; margin-top: clamp(16px,2.2vw,26px); }
.s-hbt .btn { padding: 13px 16px 13px 24px; }
.s-hbt .s-hbt-cta-ico { width: 26px; height: 26px; min-width: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: transparent; }
.s-hbt .s-hbt-cta-ico-svg { width: 16px; height: 16px; flex: 0 0 auto; display: flex; }
.s-hbt .s-hbt-cta-ico-svg svg { width: 16px !important; height: 16px !important; fill: none; stroke: currentColor; display: block; }

/* ---- carte s-hcard (composant réutilisable : teaser + future archive) ---- */
.s-hbt .s-hcard { position: relative; display: block; width: auto; aspect-ratio: 5/6; border-radius: var(--r-card,24px); overflow: hidden; box-shadow: var(--shadow-soft,0 16px 40px -26px rgba(34,56,63,.5)); isolation: isolate; text-decoration: none; color: #fff; transition: transform .45s var(--ease), box-shadow .45s; }
.s-hbt .s-hcard:hover { transform: translateY(-7px); box-shadow: var(--shadow-card,0 30px 70px -30px rgba(34,56,63,.6)); }

/* image plein cadre + zoom au hover (la classe est sur le <img> lui-même : e-image-base s-hcard-img) */
.s-hbt .s-hcard-img { position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .8s var(--ease); }
.s-hbt .s-hcard:hover .s-hcard-img { transform: scale(1.06); }

/* scrim dégradé */
.s-hbt .s-hcard-scrim { position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgba(16,27,32,.30) 0%, rgba(16,27,32,0) 30%, rgba(16,27,32,.06) 50%, rgba(14,24,28,.85) 100%); }

/* pastille village (haut) — ⚠️ §7.13/§7.17 : backdrop-filter retombe pendant le hover (transform ancêtre) ; fidèle maquette, fond blanc 92% reste lisible. */
.s-hbt .s-hcard-top { position: absolute; top: 15px; left: 15px; right: 15px; display: flex; justify-content: flex-end; z-index: 2; }
.s-hbt .s-hcard-vpill { width: fit-content; display: inline-flex; align-items: center; gap: 6px; background: rgba(255,255,255,.92); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); color: var(--petrole,#2C4A52); font-weight: 700; font-size: 12.5px; padding: 7px 13px; border-radius: 999px; }
.s-hbt .s-hcard-st { color: var(--corail,#FB6F52); letter-spacing: 1px; }

/* infos (bas) */
.s-hbt .s-hcard-info { position: absolute; left: 17px; right: 17px; bottom: 17px; width: auto; z-index: 2; color: #fff; padding-right: 56px; }
.s-hbt .s-hcard-h3 { color: #fff; font-size: var(--fs-h3); line-height: 1.08; text-shadow: 0 1px 12px rgba(0,0,0,.5); }
.s-hbt .s-hcard-specs { display: flex; align-items: center; flex-wrap: wrap; gap: 9px; margin-top: 9px; font-size: 13px; font-weight: 600; color: rgba(255,255,255,.96); text-shadow: 0 1px 8px rgba(0,0,0,.5); }
.s-hbt .s-hcard-mi { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.s-hbt .s-hcard-mi-svg { width: 15px; height: 15px; flex: 0 0 auto; display: flex; }
.s-hbt .s-hcard-mi-svg svg { width: 15px !important; height: 15px !important; fill: none; stroke: currentColor; display: block; }
.s-hbt .s-hcard-dot { width: 3px; height: 3px; min-width: 3px; border-radius: 50%; background: rgba(255,255,255,.65); flex: 0 0 auto; }

/* équipements */
.s-hbt .s-hcard-equip { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 13px; }
.s-hbt .s-hcard-chip { width: 34px; height: 34px; min-width: 34px; border-radius: 50%; background: rgba(255,255,255,.17); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); box-shadow: inset 0 0 0 1px rgba(255,255,255,.40); display: flex; align-items: center; justify-content: center; color: #fff; }
.s-hbt .s-hcard-chip-svg { width: 17px; height: 17px; flex: 0 0 auto; display: flex; }
.s-hbt .s-hcard-chip-svg svg { width: 17px !important; height: 17px !important; fill: none; stroke: currentColor; display: block; }

/* pastille flèche (décorative, coin bas-droit) + bascule au hover */
.s-hbt .s-hcard-circ { position: absolute; right: 17px; bottom: 17px; z-index: 3; width: 46px; height: 46px; min-width: 46px; border-radius: 50%; background: #fff; color: var(--petrole,#2C4A52); display: flex; align-items: center; justify-content: center; transition: background .35s var(--ease), color .35s; }
.s-hbt .s-hcard-circ-svg { width: 18px; height: 18px; flex: 0 0 auto; display: flex; }
.s-hbt .s-hcard-circ-svg svg { width: 18px !important; height: 18px !important; fill: none; stroke: currentColor; display: block; transition: transform .4s var(--ease); }
.s-hbt .s-hcard:hover .s-hcard-circ { background: var(--corail-deep,#EA5638); color: #fff; }
.s-hbt .s-hcard:hover .s-hcard-circ-svg svg { transform: rotate(-45deg); }

/* ===================== home/region-teaser (s-rgt) + composant tuile (s-rtile) ===================== */
/* §7.5 préventif : reset padding + width parasites ; ré-ajout explicite (scopé 0,2,0). */
.s-rgt .e-con { padding: 0; width: auto; }
.s-rgt .e-div-block-base { min-width: 0; }
.s-rgt p { margin: 0; }

/* section (fond crème = .section sans .alt) : padding-bottom réduit. `.s-rgt.s-rgt` (0,2,0) + block. */
.s-rgt.s-rgt { display: block; padding: clamp(64px,9vw,120px) 0 clamp(24px,3.5vw,48px); }
.s-rgt .s-rgt-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }

/* chapeau */
.s-rgt .s-rgt-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 28px; flex-wrap: wrap; margin-bottom: 42px; }
.s-rgt .s-rgt-head .eyebrow { margin: 0 0 16px; }
.s-rgt .s-rgt-h2 { font-size: var(--fs-h2); max-width: 18ch; }
.s-rgt .s-rgt-lead { font-size: var(--fs-lead); color: var(--petrole-brume,#5B7B82); max-width: 54ch; margin-top: 4px; }

/* grille 4 → 2 (≤900) → 1 (≤560) */
.s-rgt .s-rgt-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: var(--gap-grid,20px); }

/* CTA (réutilise .btn .btn--outline ; lien e-flexbox → arbre correct ; wrapper e-svg dimensionné §7.14) */
.s-rgt .s-rgt-cta { display: flex; justify-content: center; margin-top: clamp(16px,2.2vw,26px); }
.s-rgt .btn { padding: 13px 16px 13px 24px; }
.s-rgt .s-rgt-cta-ico { width: 26px; height: 26px; min-width: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: transparent; }
.s-rgt .s-rgt-cta-ico-svg { width: 16px; height: 16px; flex: 0 0 auto; display: flex; }
.s-rgt .s-rgt-cta-ico-svg svg { width: 16px !important; height: 16px !important; fill: none; stroke: currentColor; display: block; }

/* ---- tuile s-rtile (composant réutilisable : teaser + future page région) — NON cliquable (fidèle) ---- */
.s-rgt .s-rtile { position: relative; width: auto; aspect-ratio: 3/4; border-radius: var(--r-card,24px); overflow: hidden; box-shadow: var(--shadow-soft,0 16px 40px -26px rgba(34,56,63,.5)); isolation: isolate; transition: transform .45s var(--ease), box-shadow .45s var(--ease); }
.s-rgt .s-rtile:hover { transform: translateY(-5px); box-shadow: var(--shadow-card,0 30px 70px -30px rgba(34,56,63,.6)); }

/* image plein cadre + zoom hover (classe sur le <img> e-image-base) */
.s-rgt .s-rtile-img { position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .8s var(--ease); }
.s-rgt .s-rtile:hover .s-rtile-img { transform: scale(1.08); }

/* overlay dégradé */
.s-rgt .s-rtile-ov { position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgba(16,27,32,.26) 0%, rgba(16,27,32,0) 34%, rgba(16,27,32,.05) 54%, rgba(14,24,28,.86) 100%); }

/* contenu (bas) */
.s-rgt .s-rtile-rc { position: absolute; left: 18px; right: 18px; bottom: 18px; width: auto; z-index: 2; color: #fff; padding-right: 42px; }
.s-rgt .s-rtile-h4 { color: #fff; font-size: var(--fs-h4); line-height: 1.1; text-shadow: 0 1px 12px rgba(0,0,0,.5); }
.s-rgt .s-rtile-rd { display: flex; align-items: center; gap: 6px; margin-top: 7px; font-size: 12.5px; font-weight: 600; color: rgba(255,255,255,.92); text-shadow: 0 1px 8px rgba(0,0,0,.5); }
.s-rgt .s-rtile-rd-svg { width: 14px; height: 14px; flex: 0 0 auto; display: flex; }
.s-rgt .s-rtile-rd-svg svg { width: 14px !important; height: 14px !important; fill: none; stroke: currentColor; display: block; }

/* badge hover décoratif — repris VERBATIM de la maquette (styles.css:243-244), data-URI flèche ↗ */
.s-rgt .s-rtile::after { content: ""; position: absolute; right: 15px; bottom: 15px; z-index: 3; width: 40px; height: 40px; border-radius: 50%; background-color: var(--corail-deep,#EA5638); background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23fff'%20stroke-width='2.4'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M7%2017%2017%207M9%207h8v8'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: center; background-size: 17px; box-shadow: 0 8px 20px -8px rgba(234,86,56,.7); opacity: 0; transform: translateY(8px) scale(.86); transition: opacity .4s var(--ease), transform .45s var(--ease); }
.s-rgt .s-rtile:hover::after { opacity: 1; transform: none; }

@media (max-width: 900px) { .s-rgt .s-rgt-grid { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 560px) { .s-rgt .s-rgt-grid { grid-template-columns: 1fr; } }

/* ===================== reveal (passe 2 anims) — filet reduced-motion ===================== */
/* Équivalent de la maquette (styles.css:427 `.reveal{opacity:1!important;transform:none!important}`) :
   le JS reveal (js/experience.js) return déjà tôt en reduced-motion ; ce filet CSS garantit l'état
   visible sans transform résiduel. Scopé aux CONTENEURS reveal (chapeaux/CTA + grilles) — PAS aux
   cartes/tuiles, dont le transform:hover (lift) doit rester actif (fidèle maquette). */
@media (prefers-reduced-motion: reduce) {
  .s-hbt-head, .s-hbt-cta, .s-rgt-head, .s-rgt-cta,
  .s-reassur-grid, .s-hbt-grid, .s-rgt-grid, .js-reveal-grid,
  .s-grt-banner, .s-tst-head, .s-tst-grid, .s-resid-banner,
  .s-faq-head, .s-faq-list {
    opacity: 1 !important; transform: none !important;
  }
}

/* ===================== home/groupes-teaser (s-grt) — bannière promo unique ===================== */
/* §7.5 préventif : reset padding + width parasites ; ré-ajout explicite (scopé 0,2,0). */
.s-grt .e-con { padding: 0; width: auto; }
.s-grt .e-div-block-base { min-width: 0; }
.s-grt p { margin: 0; }

/* section (.section.alt neutralisé transparent) : padding-top réduit, bottom = base. `.s-grt.s-grt` (0,2,0) + block. */
.s-grt.s-grt { display: block; padding: clamp(8px,1.5vw,20px) 0 clamp(64px,9vw,120px); background: transparent; }
.s-grt .s-grt-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }

/* bannière : image de fond + overlay + contenu (aucun hover — statique, fidèle maquette) */
.s-grt .s-grt-banner { position: relative; display: flex; min-height: 340px; width: 100%; border-radius: var(--r-card,24px); overflow: hidden; isolation: isolate; }
.s-grt .s-grt-img { position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.s-grt .s-grt-ov { position: absolute; inset: 0; z-index: 1; background: linear-gradient(100deg, rgba(34,56,63,.94) 0%, rgba(34,56,63,.78) 42%, rgba(34,56,63,.35) 100%); }
.s-grt .s-grt-in { position: relative; z-index: 2; width: auto; max-width: 60ch; padding: clamp(38px,6vw,72px); color: #fff; }

/* eyebrow local (corail-pale) + titre + texte */
.s-grt .eyebrow { color: var(--corail-pale,#FFC6AC); margin: 0; }
.s-grt .s-grt-h2 { color: #fff; font-size: var(--fs-h2); margin: 16px 0 14px; }
.s-grt .s-grt-p { color: rgba(255,255,255,.9); font-size: 16px; margin-bottom: 26px; max-width: 46ch; }

/* CTA btn--primary (lien e-flexbox) — pastille flèche dimensionnée (§7.14) ; hover via .btn--primary thème */
.s-grt .btn { padding: 13px 16px 13px 24px; }
.s-grt .s-grt-cta-ico { width: 26px; height: 26px; min-width: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center; }
.s-grt .s-grt-cta-ico-svg { width: 16px; height: 16px; flex: 0 0 auto; display: flex; }
.s-grt .s-grt-cta-ico-svg svg { width: 16px !important; height: 16px !important; fill: none; stroke: currentColor; display: block; }

/* ===================== home/testimonials (s-tst) + composant carte avis (s-tcard) ===================== */
/* §7.5 préventif : reset padding + width parasites ; ré-ajout explicite (scopé 0,2,0). */
.s-tst .e-con { padding: 0; width: auto; }
.s-tst .e-div-block-base { min-width: 0; }
.s-tst p { margin: 0; }

/* section (.section.alt = sable-pale). `.s-tst.s-tst` (0,2,0) + block. */
.s-tst.s-tst { display: block; padding: clamp(64px,9vw,120px) 0; background: var(--sable-pale,#F3EFE7); }
.s-tst .s-tst-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }

/* chapeau : titre à gauche + note agrégée à droite (wrap en étroit) */
.s-tst .s-tst-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 28px; flex-wrap: wrap; margin-bottom: 42px; }
.s-tst .s-tst-head .eyebrow { margin: 0 0 16px; }
.s-tst .s-tst-h2 { font-size: var(--fs-h2); max-width: 18ch; }

/* note agrégée */
.s-tst .s-tst-agg { display: flex; align-items: center; gap: 18px; }
.s-tst .s-tst-agg-score { display: flex; align-items: baseline; font-family: var(--font-display,'Bricolage Grotesque',sans-serif); font-weight: 700; font-size: clamp(46px,5.4vw,62px); color: var(--petrole,#2C4A52); line-height: .85; }
.s-tst .s-tst-agg-unit { font-size: .38em; color: var(--petrole-brume,#5B7B82); font-weight: 600; }
.s-tst .s-tst-agg-stars { color: var(--corail,#FB6F52); letter-spacing: 2px; font-size: 16px; }
.s-tst .s-tst-agg-sub { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 4px; font-size: 13.5px; color: var(--petrole-brume,#5B7B82); }
.s-tst .s-tst-agg-sub-b { color: var(--petrole,#2C4A52); font-weight: 700; }
.s-tst .s-tst-agg-badge { display: inline-flex; align-items: center; gap: 5px; width: fit-content; margin-top: 8px; padding: 4px 10px 4px 8px; border-radius: 999px; font-size: 11px; font-weight: 700; color: var(--olivier-deep,#5D7A59); background: rgba(157,184,154,.16); }
.s-tst .s-tst-agg-badge-svg { width: 13px; height: 13px; flex: 0 0 auto; display: flex; }
.s-tst .s-tst-agg-badge-svg svg { width: 13px !important; height: 13px !important; fill: none; stroke: currentColor; display: block; }

/* grille auto-fit 3 → 2 → 1 */
.s-tst .s-tst-grid { display: grid; grid-template-columns: repeat(auto-fit,minmax(290px,1fr)); gap: var(--gap-grid,20px); }

/* ---- carte avis s-tcard (composant réutilisable — futur répéteur ACF) — NON cliquable ---- */
.s-tst .s-tcard { position: relative; overflow: hidden; background: #fff; border-radius: var(--r-card,24px); padding: 28px 28px 26px; box-shadow: var(--shadow-soft,0 16px 40px -26px rgba(34,56,63,.5)); display: flex; flex-direction: column; gap: 15px; transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.s-tst .s-tcard:hover { transform: translateY(-5px); box-shadow: var(--shadow-card,0 30px 70px -30px rgba(34,56,63,.6)); }
.s-tst .s-tcard-qmark { position: absolute; top: 6px; right: 20px; z-index: 0; font-family: var(--font-display,'Bricolage Grotesque',sans-serif); font-weight: 700; font-size: 104px; line-height: 1; color: var(--sable,#E7D5C0); opacity: .55; pointer-events: none; }
.s-tst .s-tcard-qtop, .s-tst .s-tcard-quote, .s-tst .s-tcard-who { position: relative; z-index: 1; }
.s-tst .s-tcard-qtop { display: flex; align-items: center; gap: 11px; }
.s-tst .s-tcard-stars { color: var(--corail,#FB6F52); letter-spacing: 2px; font-size: 15px; }
.s-tst .s-tcard-quote { font-size: 17px; color: var(--encre,#22383F); line-height: 1.62; flex: 1; }
.s-tst .s-tcard-who { display: flex; align-items: center; gap: 13px; }
.s-tst .s-tcard-av { width: 46px; height: 46px; min-width: 46px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 700; font-family: var(--font-display,'Bricolage Grotesque',sans-serif); font-size: 17px; }
.s-tst .s-tcard-av--corail { background: var(--corail-deep,#EA5638); }
.s-tst .s-tcard-av--lagune { background: var(--lagune,#2E9BB8); }
.s-tst .s-tcard-av--olivier { background: var(--olivier-deep,#5D7A59); }
.s-tst .s-tcard-nm { font-weight: 700; color: var(--petrole,#2C4A52); font-size: 14.5px; }
.s-tst .s-tcard-ct { font-size: 12.5px; color: var(--petrole-brume,#5B7B82); }

/* ===================== home/residentiel-teaser (s-resid) — bannière split 2 col + parallaxe ===================== */
/* §7.5 préventif : reset padding + width parasites ; ré-ajout explicite (scopé 0,2,0). */
.s-resid .e-con { padding: 0; width: auto; }
.s-resid .e-div-block-base { min-width: 0; }
.s-resid p { margin: 0; }

/* section (.section sans .alt → crème body). `.s-resid.s-resid` (0,2,0) + block. */
.s-resid.s-resid { display: block; padding: clamp(64px,9vw,120px) 0; }
.s-resid .s-resid-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }

/* bannière split (grille 2 col image/texte) — carte sable-pale, aucun hover (statique) */
.s-resid .s-resid-banner { display: grid; grid-template-columns: 1.08fr 1fr; width: 100%; background: var(--sable-pale,#F3EFE7); border-radius: var(--r-card,24px); overflow: hidden; box-shadow: var(--shadow-soft,0 16px 40px -26px rgba(34,56,63,.5)); }

/* photo (colonne gauche) — image parallaxée (classe sur le <img> e-image-base) */
.s-resid .s-resid-ph { position: relative; min-height: 340px; }
.s-resid .s-resid-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }

/* texte (colonne droite) */
.s-resid .s-resid-txt { padding: clamp(32px,4vw,56px) clamp(40px,5vw,72px); align-self: center; }
.s-resid .s-resid-txt .eyebrow { margin: 0; }
.s-resid .s-resid-h2 { font-size: var(--fs-h2); max-width: 16ch; margin-top: 14px; }
.s-resid .s-resid-p { margin-top: 14px; color: var(--petrole-brume,#5B7B82); font-size: 16px; max-width: 44ch; }

/* CTA btn--primary (lien e-flexbox) — pastille flèche §7.14 ; hover via .btn--primary thème */
.s-resid .btn { margin-top: 24px; padding: 13px 16px 13px 24px; }
.s-resid .s-resid-cta-ico { width: 26px; height: 26px; min-width: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center; }
.s-resid .s-resid-cta-ico-svg { width: 16px; height: 16px; flex: 0 0 auto; display: flex; }
.s-resid .s-resid-cta-ico-svg svg { width: 16px !important; height: 16px !important; fill: none; stroke: currentColor; display: block; }

/* responsive ≤900 : empilement (image au-dessus, texte dessous), photo min-height 240 */
@media (max-width: 900px) {
  .s-resid .s-resid-banner { grid-template-columns: 1fr; }
  .s-resid .s-resid-ph { min-height: 240px; }
}

/* ===================== shared/faq-accordion (s-faq) — instance accueil ===================== */
/* §7.5 préventif : reset padding + width parasites ; ré-ajout explicite (scopé 0,2,0). */
.s-faq .e-con { padding: 0; width: auto; }
.s-faq .e-div-block-base { min-width: 0; }
.s-faq p { margin: 0; }

/* section (.section.alt = sable-pale). `.s-faq.s-faq` (0,2,0) + block. */
.s-faq.s-faq { display: block; padding: clamp(64px,9vw,120px) 0; background: var(--sable-pale,#F3EFE7); }
.s-faq .s-faq-wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; }

/* chapeau centré */
.s-faq .s-faq-head { display: flex; justify-content: center; text-align: center; margin-bottom: 42px; }
.s-faq .s-faq-head-txt { margin: 0 auto; }
.s-faq .s-faq-head .eyebrow { justify-content: center; margin: 0 0 16px; }
.s-faq .s-faq-h2 { font-size: var(--fs-h2); }

/* liste (centrée, max 840) */
.s-faq .s-faq-list { width: auto; max-width: 840px; margin: 0 auto; }
.s-faq .s-faq-item { background: #fff; border-radius: 16px; margin-bottom: 14px; overflow: hidden; box-shadow: var(--shadow-soft,0 16px 40px -26px rgba(34,56,63,.5)); }

/* question (bouton) */
.s-faq .s-faq-q { width: 100%; text-align: left; background: none; border: 0; cursor: pointer; color: var(--petrole,#2C4A52); display: flex; justify-content: space-between; align-items: center; gap: 18px; padding: 23px 26px; white-space: normal; line-height: normal; transition: padding-left .25s var(--ease), color .25s var(--ease); }
.s-faq .s-faq-q-t { font-family: var(--font-display,'Bricolage Grotesque',sans-serif); font-weight: 700; font-size: 18px; color: var(--petrole,#2C4A52); text-align: left; }
.s-faq .s-faq-q:hover { padding-left: 22px; }

/* icône +/− (CSS pur) */
.s-faq .s-faq-pm { flex: none; width: 30px; height: 30px; min-width: 30px; border-radius: 50%; background: var(--sable-pale,#F3EFE7); position: relative; transition: background .3s var(--ease); }
.s-faq .s-faq-pm::before, .s-faq .s-faq-pm::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--petrole,#2C4A52); border-radius: 2px; transition: opacity .3s var(--ease), background .3s var(--ease); }
.s-faq .s-faq-pm::before { width: 13px; height: 2.4px; transform: translate(-50%,-50%); }
.s-faq .s-faq-pm::after { width: 2.4px; height: 13px; transform: translate(-50%,-50%); }
@media (hover: hover) {
  .s-faq .s-faq-q:hover .s-faq-pm { background: var(--corail-deep,#EA5638); }
  .s-faq .s-faq-q:hover .s-faq-pm::before, .s-faq .s-faq-q:hover .s-faq-pm::after { background: #fff; }
}
.s-faq .s-faq-item.open .s-faq-pm { background: var(--corail-deep,#EA5638); }
.s-faq .s-faq-item.open .s-faq-pm::before { background: #fff; }
.s-faq .s-faq-item.open .s-faq-pm::after { opacity: 0; }

/* réponse — accordéon §7.18 (grid-rows 0fr→1fr ; inner overflow:hidden + padding vertical conditionnel) */
.s-faq .s-faq-a { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .38s var(--ease); }
.s-faq .s-faq-item.open .s-faq-a { grid-template-rows: 1fr; }
.s-faq .s-faq-a-p { overflow: hidden; min-height: 0; padding: 0 26px; color: var(--petrole-brume,#5B7B82); font-size: 15px; line-height: 1.65; } /* max-width 64ch retiré (2026-08-21) : pleine largeur de carte, écart maquette assumé */
.s-faq .s-faq-item.open .s-faq-a-p { padding-bottom: 22px; }
.s-faq .s-faq-a-p a { color: var(--corail-deep,#EA5638); font-weight: 700; }

/* ============================================================
   region/listing — Page /la-region/ (listing POI dynamique)
   Port verbatim maquette styles.css. Classes maquette natives réutilisables
   sur les pages intérieures (région, activités, single article). Réf. region.html.
   ============================================================ */

/* Base titres maquette (global `h1,h2,h3,h4` — styles.css) SCOPÉE `.dpage` (n'affecte pas accueil
   atomic ni chrome Theme Builder). Placée AVANT les règles composant : `.rtile h4`/`.hb-cta h3`/… (0,1,1,
   plus bas dans le fichier) regagnent le tie de spécificité → gardent leur couleur (#fff). Fournit
   couleur/police par défaut aux titres non stylés explicitement (ex. `.sec-head h2`). */
.dpage h1, .dpage h2, .dpage h3, .dpage h4 { margin: 0; font-family: var(--font-display); letter-spacing: -.025em; line-height: 1.04; color: var(--petrole); font-weight: 700; text-wrap: balance; }

/* fil d'ariane */
.bcrumb { font-size: 13px; color: var(--petrole-brume); padding: 6px 0 22px; }
.bcrumb a { color: var(--petrole-brume); }
.bcrumb a:hover { color: var(--corail-deep); }
.bcrumb b { color: var(--petrole); font-weight: 600; }

/* hero listing */
/* max-width 760→920 (correctif 2026-09-08) : le titre du hub tenait sur 3 lignes à 1440 avec
   le « : » orphelin en tête de ligne ; le lead garde son propre cap 54ch, les autres pages
   à .lac-head ont des titres courts (aucun impact). */
.lac-head { max-width: 920px; margin-bottom: clamp(22px,2.8vw,32px); }
.lac-head .eyebrow { margin-bottom: 14px; }
.lac-head h1 { margin: 0; font-size: var(--fs-h1); color: var(--petrole); line-height: 1.04; letter-spacing: -.03em; } /* margin 0 : le h1 nu de [mp_archive_title] n'a pas la base atomique du e-heading (correctif 2026-09-08) */
.lac-head .lead { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; max-width: 54ch; }
/* description de terme sous le H1 d'archive (mp_archive_desc, wrap <p> de term_description) —
   même œil que .lead (archives de terme alignées sur le hub, correctif 2026-09-08) */
.lac-head .arch-desc { margin-top: 14px; max-width: 54ch; }
.lac-head .arch-desc p { font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; }
/* archives de terme : blanc sous la grille avant la bande CTA sable — même respiration que le
   hub (padding .section = clamp(64,9vw,120)) ; sur le hub la section suivante est blanche, ici
   la bande .alt collait aux tuiles (correctif 2026-09-08). Scopé body archive : hub inchangé. */
body.tax-mp_categorie_poi #lacGrid { margin-bottom: clamp(64px,9vw,120px); }

/* barre onglets + compteur */
.lac-bar { display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; margin-bottom: clamp(20px,2.4vw,30px); }
.lac-bar .acts-tabs { margin-bottom: 0; justify-content: flex-start; }
.lac-count { font-size: 14px; font-weight: 600; color: var(--petrole-brume); white-space: nowrap; }
.lac-count b { font-family: var(--font-display); color: var(--petrole); font-size: 16.5px; }

/* onglets (pills) */
.acts-tabs { display: flex; gap: 11px; flex-wrap: wrap; justify-content: center; margin-bottom: 32px; }
.acts-tab { background: var(--sable-pale); color: var(--petrole); border: 0; cursor: pointer; font-family: var(--body); font-weight: 700; font-size: 12.5px; letter-spacing: .06em; text-transform: uppercase; padding: 12px 22px; border-radius: 999px; transition: .25s var(--ease); will-change: transform; }
.acts-tab:hover { background: var(--sable-hover); color: var(--petrole); }
.acts-tab.active { background: var(--sable); color: var(--petrole); box-shadow: var(--shadow-soft); }
.acts-tab:active { transform: scale(.96); }
@media (max-width: 600px) { .acts-tabs { flex-wrap: nowrap; justify-content: flex-start; overflow-x: auto; scrollbar-width: none; margin-left: -24px; margin-right: -24px; padding: 0 24px 4px; } .acts-tabs::-webkit-scrollbar { display: none; } .acts-tab { flex: 0 0 auto; } }

/* grille + état vide */
.lac-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: var(--gap-grid); }
.lac-empty { display: none; padding: 48px 20px; text-align: center; color: var(--petrole-brume); font-size: 16px; }
@media (max-width: 1080px) { .lac-grid { grid-template-columns: repeat(3,1fr); } }
@media (max-width: 720px) { .lac-grid { grid-template-columns: repeat(2,1fr); gap: 14px; } }

/* carte rtile (base + couche micro-interactions) */
.rtile { position: relative; border-radius: var(--r-card); overflow: hidden; aspect-ratio: 3/4; box-shadow: var(--shadow-soft); isolation: isolate; transition: transform .45s var(--ease), box-shadow .45s var(--ease); }
.rtile:hover { transform: translateY(-5px); box-shadow: var(--shadow-card); }
.rtile > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease); }
.rtile:hover > img { transform: scale(1.08); }
.rtile .tov { position: absolute; inset: 0; background: linear-gradient(180deg,rgba(16,27,32,.26) 0%,rgba(16,27,32,0) 34%,rgba(16,27,32,.05) 54%,rgba(14,24,28,.86) 100%); }
.rtile .rc { position: absolute; left: 18px; right: 18px; bottom: 18px; z-index: 2; color: #fff; padding-right: 42px; }
.rtile h4 { color: #fff; font-size: var(--fs-h4); line-height: 1.1; text-shadow: 0 1px 12px rgba(0,0,0,.5); }
.rtile .rd { font-size: 12.5px; font-weight: 600; color: rgba(255,255,255,.92); margin-top: 7px; display: flex; align-items: center; gap: 6px; text-shadow: 0 1px 8px rgba(0,0,0,.5); }
.rtile .rd svg { width: 14px; height: 14px; }
.rtile::after { content: ""; position: absolute; right: 15px; bottom: 15px; z-index: 3; width: 40px; height: 40px; border-radius: 50%; background-color: var(--corail-deep); background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23fff'%20stroke-width='2.4'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M7%2017%2017%207M9%207h8v8'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: center; background-size: 17px; box-shadow: 0 8px 20px -8px rgba(234,86,56,.7); opacity: 0; transform: translateY(8px) scale(.86); transition: opacity .4s var(--ease), transform .45s var(--ease); }
.rtile:hover::after { opacity: 1; transform: none; }

/* article GEO/SEO */
.art-body { max-width: 720px; margin: clamp(34px,4vw,52px) auto 0; }
.art-body > * + * { margin-top: 22px; }
.art-body.art-body > * + * { margin-top: 22px; } /* variante atomique (audit 2026-08-23) : les bases e-paragraph/e-heading posent margin:0 à égalité et chargent après */
/* utilitaires L4 (styles inline des articles SEO convertis en atomique — 2026-08-23) */
.art-body.art-center { margin: 0 auto; }
.art-body.art-sep { margin-top: clamp(46px,6vw,80px); padding-top: clamp(40px,5vw,60px); border-top: 1px solid rgba(34,56,63,.1); }
.art-body p { color: var(--petrole-brume); font-size: 16.5px; line-height: 1.78; }
.art-body .lead { font-size: clamp(18px,2vw,21px); color: var(--petrole); font-weight: 500; line-height: 1.6; max-width: 54ch; }
.art-body h2 { font-size: var(--fs-h3); color: var(--petrole); line-height: 1.12; margin-top: clamp(34px,4vw,48px); }
.art-body h3 { font-size: var(--fs-h4); color: var(--petrole); margin-top: 30px; }
.art-body a.ln { color: var(--corail-deep); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1.5px; }
.art-body a.ln:hover { color: var(--corail); }
/* — wysiwyg `description` du single lieu (correctif 2026-09-08) : le HTML repris de prod est SANS
   classes (ul/a/strong nus) — mêmes styles que les composants maquette (.art-list / a.ln), scopés au
   conteneur du champ en (0,4,0) pour battre le kit Elementor et les bases atomiques. — */
.art-body.art-body.art-body.art-body ul:not([class]) { list-style: none; margin: 22px 0 0; padding: 0; display: flex; flex-direction: column; gap: 11px; }
.art-body.art-body.art-body.art-body ul:not([class]) li { position: relative; margin: 0; padding-left: 30px; color: var(--petrole-brume); font-size: 16px; line-height: 1.6; }
.art-body.art-body.art-body.art-body ul:not([class]) li::before { content: ""; position: absolute; left: 3px; top: 8px; width: 9px; height: 9px; border-radius: 50%; background: var(--corail); } /* point corail maquette (.art-list li::before) — pseudo-élément, pas d'image */
.art-body.art-body.art-body.art-body a:not(.btn):not(.ln) { color: var(--corail-deep); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1.5px; }
.art-body.art-body.art-body.art-body a:not(.btn):not(.ln):hover { color: var(--corail); }
.art-body.art-body.art-body.art-body strong, .art-body.art-body.art-body.art-body b { color: var(--petrole); }

/* en-tête de section (FAQ centrée) */
.sec-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 28px; flex-wrap: wrap; margin-bottom: 42px; }
/* ré-affirmation (0,2,0) pour les sec-head NATIFS (e-con base display:block chargée après le thème) —
   placée AVANT .ct-faq .sec-head et autres surcharges contextuelles (ordre source). */
.wrap .sec-head, .vcon .sec-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 28px; flex-wrap: wrap; margin-bottom: 42px; }
.sec-head h2 { font-size: var(--fs-h2); max-width: 18ch; }
.sec-head .eyebrow { margin-bottom: 16px; }

/* FAQ maquette native (.faq / .faq-item / .faq-q / .pm / .faq-a) — composant pages intérieures */
.faq { max-width: 840px; margin: 0 auto; width: 100%; } /* width:100% : `.wrap.wrap` est flex-column → marges auto rétréciraient l'item à son contenu */
.faq-item { background: #fff; border-radius: 16px; margin-bottom: 14px; overflow: hidden; box-shadow: var(--shadow-soft); }
.faq-q { width: 100%; text-align: left; background: none; border: 0; cursor: pointer; display: flex; justify-content: space-between; align-items: center; gap: 18px; padding: 23px 26px; font-family: var(--font-display); font-weight: 700; font-size: 18px; color: var(--petrole); white-space: normal; line-height: normal; transition: padding-left .25s var(--ease), color .25s var(--ease); }
.faq-q .pm { flex: none; width: 30px; height: 30px; border-radius: 50%; background: var(--sable-pale); position: relative; transition: background .3s var(--ease); }
.faq-q .pm::before, .faq-q .pm::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--petrole); border-radius: 2px; transition: opacity .3s var(--ease), background .3s var(--ease); }
.faq-q .pm::before { width: 13px; height: 2.4px; transform: translate(-50%,-50%); }
.faq-q .pm::after { width: 2.4px; height: 13px; transform: translate(-50%,-50%); }
.faq-item.open .pm { background: var(--corail-deep); }
.faq-item.open .pm::before { background: #fff; }
.faq-item.open .pm::after { opacity: 0; }
/* `background:none` neutralise le défaut `button:hover/:focus{background:#c36}` (reset Hello/WP)
   qui teintait l'item FAQ (`.faq-q` est un <button>). */
.faq-q:hover { padding-left: 22px; color: var(--petrole); background: none; }
.faq-q:focus { background: none; color: var(--petrole); }
/* coloriage hover de l'icône guardé aux pointeurs réels : sur tactile le `:hover` "colle" après
   un tap → l'icône resterait orange après fermeture. En `@media (hover:hover)` elle ne reflète
   plus que l'état ouvert/fermé sur mobile (desktop = feedback maquette conservé). */
@media (hover: hover) {
  .faq-q:hover .pm { background: var(--corail-deep); }
  .faq-q:hover .pm::before, .faq-q:hover .pm::after { background: #fff; }
}
.faq-a { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .38s var(--ease); }
/* variante ATOMIQUE (lot L1 2026-08-23) : la base e-div-block écrase display:grid (0,1,0) →
   réponses dépliées au repos. Doublé (0,3,0) — sans effet sur les .faq-a non atomiques. */
.faq-item .faq-a.faq-a { display: grid; }
/* idem padding des questions (régression signalée 2026-08-23) : NOTRE reset §7.5
    (0,2,0) battait  (0,1,0) — padding + glissement hover. */
.faq-item .faq-q.faq-q { padding: 23px 26px; }
.faq-item .faq-q.faq-q:hover { padding-left: 22px; }
.faq-item.open .faq-a { grid-template-rows: 1fr; }
.faq-item.open .faq-a p { padding-bottom: 22px; }
.faq-a p { overflow: hidden; min-height: 0; margin: 0; padding: 0 26px; color: var(--petrole-brume); font-size: 15px; line-height: 1.65; } /* max-width 64ch retiré (2026-08-21) : pleine largeur de carte, écart maquette assumé */

/* layout pages intérieures — classes doublées pour battre le padding/width var de `.e-con` (atomic) */
.dpage.dpage { padding: clamp(86px,9vw,104px) 0 0; display: flex; flex-direction: column; }
/* §7.5 préventif zones natives (split contact 2026-08-21) : la base Elementor .e-con pose
   padding:10px + width:100% — reset AVANT les règles (0,2,0) .wrap.wrap/.section.section qui
   ré-établissent leurs paddings, et avant les ré-ajouts du bloc split (ordre source). */
.wrap .e-con, .contact-grid .e-con, .cdest-col .e-con, .vcon .e-con { padding: 0; }
.wrap.wrap { width: 100%; max-width: var(--maxw,1220px); margin-inline: auto; padding: 0 24px; box-sizing: border-box; display: flex; flex-direction: column; }
.section.section { padding: clamp(64px,9vw,120px) 0; display: flex; flex-direction: column; }
.section.section.alt { background: var(--sable-pale); }

/* bandeau CTA */
.hb-cta { margin-top: clamp(44px,5vw,68px); margin-bottom: clamp(54px,7vw,88px); background: var(--petrole); border-radius: var(--r-card); overflow: hidden; padding: clamp(30px,4vw,50px); display: flex; align-items: center; justify-content: space-between; gap: 26px; flex-wrap: wrap; color: #fff; isolation: isolate; }
/* variante ATOMIQUE (L3) : base e-div-block écrase display/padding à égalité — doublé (leçon L1/L2) */
.hb-cta.hb-cta { display: flex; padding: clamp(30px,4vw,50px); align-items: center; justify-content: space-between; }
.hb-cta > .e-con.e-con { width: auto; } /* base 100% → le bouton passait sous le texte */
.hb-cta .eyebrow { color: var(--corail-pale); }
.hb-cta .eyebrow::before { background: var(--corail); }
.hb-cta h3 { color: #fff; font-size: var(--fs-h3); margin-top: 12px; line-height: 1.05; }
.hb-cta p { color: rgba(255,255,255,.82); margin-top: 10px; font-size: 15.5px; max-width: 50ch; line-height: 1.6; }

/* ============================================================
   region/single (single POI mp_point_interet) — port maquette
   region-detail.html / oasis-activite.html. Base .art-body/.art-list
   déjà portées (region/listing). Réutilisable par le single activité.
   ============================================================ */
.art-head { max-width: 780px; }
.art-head .eyebrow { margin-bottom: 14px; }
.art-head h1 { font-size: var(--fs-h1); color: var(--petrole); line-height: 1.05; letter-spacing: -.03em; }
.art-sub { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; }
.facts { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 28px; padding-bottom: 30px; border-bottom: 1px solid rgba(34,56,63,.1); }
.fact { display: flex; align-items: center; gap: 12px; }
.fact .ic { width: 46px; height: 46px; border-radius: 13px; background: var(--sable-pale); color: var(--petrole); display: flex; align-items: center; justify-content: center; flex: none; }
.fact .ic svg { width: 22px !important; height: 22px !important; fill: none; stroke: currentColor; } /* le rendu e-svg pose fill=currentColor sur la racine → icônes pleines ; l attribut perd contre le CSS */ /* !important : variante atomique (L2) — le rendu e-svg pose un style inline width:100% */
/* variantes ATOMIQUES (lot L2 2026-08-23) : la base e-div-block écrase display à égalité (0,1,0) — doublé, sans effet sur le markup non atomique (leçon L1 .faq-a) */
.facts.facts { display: flex; padding-bottom: 30px; } /* padding maquette (l.675) rétabli — mangé par le reset §7.5 (bug signalé dev 2026-08-23) */
.fact.fact { display: flex; width: auto; } /* width:auto : base e-div-block 100% → facts empilés */
.feature.feature { display: grid; }
.fact .k { font-size: 12px; color: var(--petrole-brume); font-weight: 600; }
.fact .v { font-size: 15.5px; color: var(--petrole); font-weight: 700; font-family: var(--font-display); }
.art-cover { margin-top: clamp(22px,3vw,32px); border-radius: var(--r-card); overflow: hidden; aspect-ratio: 16/8; box-shadow: var(--shadow-soft); }
.art-cover img { width: 100%; height: 100%; object-fit: cover; }
.art-fig { margin: clamp(28px,3.5vw,40px) 0; }
.art-fig img { width: 100%; border-radius: var(--r-card); box-shadow: var(--shadow-soft); display: block; }
.art-fig figcaption { margin-top: 12px; font-size: 13.5px; color: var(--petrole-brume); text-align: center; font-style: italic; }
.art-duo { margin: clamp(28px,3.5vw,40px) 0; display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.art-duo img { width: 100%; aspect-ratio: 4/3; object-fit: cover; border-radius: 18px; box-shadow: var(--shadow-soft); }
.art-quote { margin: clamp(30px,4vw,46px) 0; padding-left: 26px; border-left: 4px solid var(--corail); }
.art-quote p { font-family: var(--font-display); font-size: clamp(20px,2.4vw,27px); color: var(--petrole); line-height: 1.3; font-weight: 600; }
.art-quote cite { display: block; margin-top: 14px; font-style: normal; font-family: var(--body); font-size: 14px; line-height: 1.6; font-weight: 600; color: var(--petrole-brume); }
/* RÈGLE GÉNÉRALE — reset du padding/marge UA des listes dans le contenu de page intérieure (`.dpage`).
   La maquette l'annule globalement via `*{margin:0;padding:0}` (styles.css:35) ; on le fait scopé à
   `.dpage` (jamais header/footer TB, hors `<main>`) pour éviter le récurrent `padding-inline-start:40px`
   sur les listes custom (`.cgrp ul`, `.art-list`, `.art-steps`, futures). Les puces/indentations voulues
   sont re-posées par les composants (`::before`, `padding-left`). */
.dpage ul, .dpage ol { margin: 0; padding: 0; }

/* Liste à puces CORAIL — composant partagé `.art-list` (À voir, infobox, etc. ; se répète sur tout
   le site). Reset du défaut UA (`padding-inline-start:40px` + puces `disc`) que la maquette annule,
   puce corail via `::before`. Maquette styles.css:899-901. */
.art-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 11px; }
.art-list li { position: relative; padding-left: 30px; color: var(--petrole-brume); font-size: 16px; line-height: 1.6; }
.art-list li::before { content: ""; position: absolute; left: 3px; top: 8px; width: 9px; height: 9px; border-radius: 50%; background: var(--corail); }
.art-steps { list-style: none; counter-reset: s; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 18px; }
.art-steps li { position: relative; padding-left: 54px; color: var(--petrole-brume); font-size: 16px; line-height: 1.6; min-height: 36px; }
.art-steps li::before { counter-increment: s; content: counter(s); position: absolute; left: 0; top: -3px; width: 36px; height: 36px; border-radius: 50%; background: var(--sable-pale); color: var(--petrole); font-family: var(--font-display); font-weight: 700; font-size: 16px; display: flex; align-items: center; justify-content: center; }
.art-steps li b { color: var(--petrole); font-weight: 700; }
/* le reset margin:0 (ci-dessus) neutralise le `.art-body > *+*{margin-top:22px}` pour les listes/étapes
   enfant DIRECT de l'article → on le restaure (l'infobox, elle, contient sa liste et reste à 0). */
.art-body > .art-list, .art-body > .art-steps { margin-top: 22px; }
/* margin-top laissé à `.art-body > * + *` (22px) — l'infobox est un enfant direct de l'article,
   comme la maquette (le `.infobox{margin-top:14px}` maquette ne s'applique qu'hors flux art-body). */
.infobox { background: var(--sable-pale); border-radius: 20px; padding: clamp(22px,3vw,32px); }
.infobox h3 { margin-bottom: 18px; }
.art-cta { margin-top: clamp(34px,4vw,46px); background: var(--petrole); border-radius: var(--r-card); padding: clamp(26px,3.4vw,40px); color: #fff; display: flex; align-items: center; justify-content: space-between; gap: 22px; flex-wrap: wrap; }
.art-cta h3 { color: #fff; font-size: var(--fs-h3); line-height: 1.1; }
.art-cta p { color: rgba(255,255,255,.82); margin-top: 8px; font-size: 15px; }
/* ---------- boutons markup MAQUETTE (.btn + <span class="ico">) ----------
   Le thème porte la variante ATOMIC (.btn--primary, .e-svg-base) via styles inline ; les boutons
   au markup MAQUETTE (span.ico — CTA .hb-cta / .art-cta / futurs blocs) ont besoin de la géométrie
   de base + des variantes maquette. Base scopée `:has(.ico)` → n'affecte PAS les boutons atomic
   (qui n'ont pas de `.ico`). Variantes single-dash (btn-primary/ghost/outline/sm) = maquette-only. */
.btn:has(.ico) { font-family: var(--body); font-weight: 700; font-size: 15px; border: 0; cursor: pointer; border-radius: 999px; padding: 13px 16px 13px 24px; display: inline-flex; align-items: center; gap: 11px; white-space: nowrap; }
.btn .ico { width: 26px; height: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: transparent; transition: background .35s var(--ease); }
.btn .ico svg { width: 16px; height: 16px; stroke: currentColor; transition: transform .4s var(--ease); }
.btn:hover .ico svg { transform: rotate(-45deg); }
/* Variantes doublées `.btn.btn-X` (0,2,0) : battent le reset `.elementor a { box-shadow:none }`
   (0,1,1) qui neutralise l'ombre des boutons markup maquette SUR LES PAGES ELEMENTOR (le single
   PHP, hors `.elementor`, n'était pas affecté). Cf. QA CTA région. */
.btn.btn-primary { background: var(--corail-deep); color: #fff; box-shadow: 0 14px 30px -12px rgba(234,86,56,.7); }
.btn.btn-primary .ico { color: #fff; }
.btn.btn-primary:hover { transform: translateY(-2px); color: #fff; box-shadow: 0 22px 42px -12px rgba(234,86,56,.85); }
.btn.btn-primary:hover .ico { background: #fff; color: var(--corail-deep); }
.btn.btn-outline { background: transparent; color: var(--petrole); box-shadow: inset 0 0 0 1.5px rgba(44,74,82,.5); }
.btn.btn-outline .ico { color: var(--petrole); }
.btn.btn-outline:hover { background: var(--petrole); color: #fff; }
.btn.btn-outline:hover .ico { background: rgba(255,255,255,.22); color: #fff; }
.btn.btn-ghost { background: rgba(255,255,255,.16); color: #fff; box-shadow: inset 0 0 0 1.5px rgba(255,255,255,.65); backdrop-filter: blur(8px); }
.btn.btn-ghost .ico { color: #fff; }
.btn.btn-ghost:hover { transform: translateY(-2px); color: #fff; }
.btn.btn-ghost:hover .ico { background: rgba(255,255,255,.3); }
/* `.btn.btn-sm` (0,2,0) : bat la géométrie de base `.btn:has(.ico)` (0,2,0) par ordre source —
   `.btn-sm` seul (0,1,0) perdait le padding (constaté au bloc contact-page : 13/24 au lieu de 11/20). */
.btn.btn-sm { padding: 11px 14px 11px 20px; font-size: var(--fs-label); gap: 9px; }
.btn-sm .ico { width: 22px; height: 22px; } .btn-sm .ico svg { width: 14px; height: 14px; } /* complément maquette l.64 (port initial partiel, constaté au bloc contact-page) */
/* width:100% : `.wrap` est un flex column → avec `margin-inline:auto` un item flex rétrécit à son
   contenu (art-nav à 1 lien tombait à ~391px). width:100% le remet à 720 (max-width), centré. */
.art-nav { width: 100%; max-width: 720px; margin: clamp(40px,5vw,58px) auto clamp(50px,7vw,84px); display: grid; grid-template-columns: 1fr 1fr; gap: 16px; border-top: 1px solid rgba(34,56,63,.12); padding-top: 28px; }
/* colonnes explicites : préc. à gauche, suiv. à droite — même quand un seul existe (auto-placement
   les mettrait en col 1). Reproduit la position maquette (suivant à droite). */
.art-navlink.pv { grid-column: 1; }
.art-navlink.nx { grid-column: 2; }
.art-navlink { display: flex; flex-direction: column; gap: 6px; padding: 18px 22px; border-radius: 16px; background: var(--sable-pale); transition: background .25s var(--ease), transform .25s var(--ease); }
.art-navlink:hover { background: var(--sable-hover); transform: translateY(-3px); }
.art-navlink .d { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--petrole-brume); display: flex; align-items: center; gap: 7px; }
.art-navlink .t { font-family: var(--font-display); font-weight: 700; font-size: 17px; color: var(--petrole); line-height: 1.1; }
.art-navlink .d svg { width: 15px; height: 15px; }
.art-navlink.nx { text-align: right; }
.art-navlink.nx .d { flex-direction: row-reverse; }
.disc { display: grid; grid-template-columns: repeat(3,1fr); gap: var(--gap-grid); }
.disc-card { background: #fff; border-radius: var(--r-card); overflow: hidden; box-shadow: var(--shadow-soft); display: flex; flex-direction: column; transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.disc-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-card); }
.disc-ph { aspect-ratio: 16/11; overflow: hidden; }
.disc-ph img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease); }
.disc-card:hover .disc-ph img { transform: scale(1.05); }
.disc-b { padding: 24px 24px 26px; display: flex; flex-direction: column; flex: 1; }
.disc-b h3 { font-size: var(--fs-h3); color: var(--petrole); }
.disc-b p { color: var(--petrole-brume); font-size: 14.5px; line-height: 1.6; margin-top: 10px; flex: 1; }
.disc-b .lk { margin-top: 18px; display: inline-flex; align-items: center; gap: 9px; font-weight: 700; font-size: var(--fs-label); color: var(--corail-deep); }
.disc-b .lk svg { width: 24px; height: 24px; border-radius: 50%; background: var(--sable-pale); padding: 5px; transition: background .3s var(--ease), color .3s var(--ease); }
.disc-card:hover .lk svg { background: var(--corail-deep); color: #fff; }
/* Cartes ENTIÈREMENT cliquables (2026-08-22, demande designer, §7.15 : le conteneur EST le
   lien, le .lk est un <span>). display flex conservé par la règle de base ; couleur héritée
   (sinon le a{color:corail} du thème teinte h3/p) ; hover carte → soulignement du CTA (la
   maquette n'a pas d'état texte propre — complément demandé), en plus du svg déjà câblé. */
a.disc-card { color: inherit; text-decoration: none; cursor: pointer; }
a.disc-card:focus-visible { outline: 3px solid var(--corail-deep); outline-offset: 3px; }
.disc-card:hover .lk, .disc-card:focus-visible .lk { text-decoration: none; } /* soulignement retiré (bug signalé dev 2026-08-23 — le hover reste porté par le rond svg, comme maquette) */
@media (max-width: 860px) { .disc { grid-template-columns: 1fr; gap: 16px; } }
@media (max-width: 600px) { .art-nav { grid-template-columns: 1fr; } .art-duo { grid-template-columns: 1fr; } }

/* ============================================================
   Bloc hebergement/listing — archive /hebergements/ (Theme Builder)
   Composant carte `.hc`/`.hcard` (maquette styles.css l.151-231) + page listing
   (hero, sidebar filtres, grille, badges, tiroir mobile — l.787-853). `.hb-cta`
   déjà porté (region/single) → non répété. Tokens `:root` (fondations) — aucune valeur en dur.
   Overrides Elementor : `.hc` est un <a> → bat `.elementor a{box-shadow:none}` (0,1,1) via
   `.hcard .hc` (0,2,0) ; `.fchip/.freset` sont (fperiod retiré 2026-08-21) des <button> → bat
   `button:hover/:focus{background:#c36}` via scope `.hb-side …` (0,2,1).
   ============================================================ */

/* pastille village (nom + étoiles) */
.vpill { background: rgba(255,255,255,.92); backdrop-filter: blur(8px); color: var(--petrole); font-weight: 700; font-size: 12.5px; padding: 7px 13px; border-radius: 999px; display: inline-flex; align-items: center; gap: 6px; }
.vpill .st { color: var(--corail); letter-spacing: 1px; }

/* bouton circulaire (flèche carte) */
.circ { flex: none; width: 46px; height: 46px; border-radius: 50%; background: #fff; color: var(--petrole); border: 0; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background .35s var(--ease), color .35s; }
.circ svg { width: 18px; height: 18px; stroke: currentColor; transition: transform .4s var(--ease); }

/* carte hébergement plein-visuel (.hcard > a.hc) */
.hc { position: relative; display: block; border-radius: var(--r-card); overflow: hidden; aspect-ratio: 5/6; box-shadow: var(--shadow-soft); isolation: isolate; transition: transform .45s var(--ease), box-shadow .45s; }
.hcard .hc { box-shadow: var(--shadow-soft); }
.hc:hover { transform: translateY(-7px); box-shadow: var(--shadow-card); }
.hcard .hc:hover { box-shadow: var(--shadow-card); }
.hc > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease); }
.hc:hover > img { transform: scale(1.06); }
.hscrim { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(16,27,32,.30) 0%, rgba(16,27,32,0) 30%, rgba(16,27,32,.06) 50%, rgba(14,24,28,.85) 100%); }
.htop { position: absolute; top: 15px; left: 15px; right: 15px; display: flex; justify-content: flex-end; z-index: 2; }
.hinfo { position: absolute; left: 17px; right: 17px; bottom: 17px; z-index: 2; color: #fff; padding-right: 56px; }
.hinfo h3 { color: #fff; font-size: var(--fs-h3); line-height: 1.08; text-shadow: 0 1px 12px rgba(0,0,0,.5); }
.hspecs { display: flex; align-items: center; flex-wrap: wrap; gap: 9px; margin-top: 9px; font-size: 13px; font-weight: 600; color: rgba(255,255,255,.96); text-shadow: 0 1px 8px rgba(0,0,0,.5); }
.hspecs .hmi { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.hspecs svg { width: 15px; height: 15px; flex: none; stroke: currentColor; }
.hdot { width: 3px; height: 3px; border-radius: 50%; background: rgba(255,255,255,.65); flex: none; }
.hequip { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 13px; }
.hchip { width: 34px; height: 34px; border-radius: 50%; background: rgba(255,255,255,.17); backdrop-filter: blur(10px); box-shadow: inset 0 0 0 1px rgba(255,255,255,.40); display: flex; align-items: center; justify-content: center; color: #fff; }
.hchip svg { width: 17px; height: 17px; stroke: currentColor; }
.hc .circ { position: absolute; right: 17px; bottom: 17px; z-index: 3; }
.hc:hover .circ { background: var(--corail-deep); color: #fff; }
.hc:hover .circ svg { transform: rotate(-45deg); }

/* hero listing */
.hb-head { max-width: 720px; margin-bottom: clamp(24px,3vw,34px); }
.hb-head .eyebrow { margin-bottom: 14px; }
.hb-head h1 { font-size: var(--fs-h1); color: var(--petrole); line-height: 1.02; letter-spacing: -.03em; }
.hb-head .lead { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; max-width: 54ch; } /* base .lead{max-width:54ch} maquette (héritée par hb-head) */

/* layout : sidebar filtres + grille */
.hb-layout { display: grid; grid-template-columns: 268px minmax(0,1fr); gap: clamp(26px,3.2vw,46px); align-items: start; }
.hb-side { position: sticky; top: clamp(94px,10vw,108px); display: flex; flex-direction: column; gap: 22px; }
.fgroup { padding-bottom: 20px; border-bottom: 1px solid rgba(34,56,63,.1); }
.fgroup:last-of-type { border-bottom: 0; padding-bottom: 0; }
.flabel { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--petrole-brume); margin-bottom: 13px; }
.fchips { display: flex; flex-wrap: wrap; gap: 8px; }
.fchip { background: var(--sable-pale); color: var(--petrole); border: 0; cursor: pointer; font-family: var(--body); font-weight: 600; font-size: 13px; padding: 9px 15px; border-radius: 999px; transition: background .2s, color .2s, transform .2s; }
.hb-side .fchip:not(.active):focus { background: var(--sable-pale); color: var(--petrole); } /* beat button:focus{#c36,#fff} — focus = repos maquette */
.hb-side .fchip:not(.active):hover { background: var(--sable-hover); color: var(--petrole); } /* color : le reset hello button:hover{color:#fff} passait le texte en blanc (maquette : fond seul) */
.fchip.active { background: var(--petrole); color: #fff; }
.hb-side .fchip.active:hover { background: var(--petrole); }
.freset { align-self: flex-start; background: none; border: 0; cursor: pointer; font-family: var(--body); font-weight: 700; font-size: 13px; color: var(--corail-deep); padding: 2px 0; display: inline-flex; align-items: center; gap: 7px; }
.hb-side .freset:hover, .hb-side .freset:focus { background: none; }
.freset svg { width: 14px; height: 14px; }

/* barre résultats + grille */
.hb-resbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 18px; }
.hb-count { font-size: 14px; font-weight: 600; color: var(--petrole-brume); }
.hb-count b { font-family: var(--font-display); color: var(--petrole); font-size: 16.5px; }
.hb-grid { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: var(--gap-grid); }
.hb-empty { display: none; padding: 50px 20px; text-align: center; color: var(--petrole-brume); font-size: 16px; }

/* mobile : chrome tiroir (masqué desktop, injecté par hebergements.js) */
.hb-filter-btn, .hb-side-head, .hb-side-foot { display: none; }
.hb-backdrop { position: fixed; inset: 0; background: rgba(20,33,38,.45); opacity: 0; visibility: hidden; transition: opacity .3s var(--ease), visibility .3s; z-index: 79; }
.hb-backdrop.open { opacity: 1; visibility: visible; }

/* badges promo / indisponible */

/* responsive */
@media (max-width: 860px) {
  .hb-layout { grid-template-columns: 1fr; gap: 24px; }
  .hb-resbar { align-items: center; gap: 12px; }
  .hb-filter-btn { display: inline-flex; align-items: center; gap: 8px; font-family: var(--body); font-weight: 700; font-size: var(--fs-label); color: var(--petrole); background: #fff; box-shadow: var(--hair); border: 0; cursor: pointer; padding: 11px 18px; border-radius: 999px; transition: background .25s, color .25s; }
  .hb-filter-btn:hover { background: var(--petrole); color: #fff; }
  .hb-filter-btn svg { width: 17px; height: 17px; stroke: currentColor; }
  .hb-side { position: fixed; top: 0; left: 0; bottom: 0; width: min(88%,360px); z-index: 80; background: var(--lumiere); transform: translateX(-100%); transition: transform .35s var(--ease); overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 0 22px; gap: 18px; box-shadow: 0 30px 80px -20px rgba(8,16,20,.55); }
  .hb-side.open { transform: none; }
  .hb-side-head { display: flex; align-items: center; justify-content: space-between; position: sticky; top: 0; background: var(--lumiere); padding: 18px 0 12px; z-index: 3; font-family: var(--font-display); font-weight: 700; font-size: var(--fs-h4); color: var(--petrole); }
  .hb-side-close { width: 40px; height: 40px; padding: 0; /* idem reset hello (croix écrasée 8px) */ flex: none; border-radius: 50%; border: 0; background: rgba(44,74,82,.08); color: var(--petrole); display: flex; align-items: center; justify-content: center; cursor: pointer; }
  .hb-side-close svg { width: 18px; height: 18px; stroke: currentColor; }
  .hb-side-foot { display: block; position: sticky; bottom: 0; background: var(--lumiere); padding: 14px 0 18px; box-shadow: 0 -1px 0 rgba(34,56,63,.12); }
  .hb-side-foot .btn { width: 100%; justify-content: center; }
  .fchips { flex-wrap: wrap; overflow: visible; margin: 0; padding: 0; }
  .fgroup { padding-bottom: 18px; }
}
@media (max-width: 560px) { .hb-grid { grid-template-columns: 1fr; } }

/* ============================================================
   Bloc hebergement/single — /hebergements/{slug}/ (single-mp_hebergement.php)
   Porté de maquette styles.css l.653-785. Déjà portés (réutilisés) : .dpage/.wrap/.section,
   .bcrumb, .facts/.fact (villa), .infobox, .sec-head, .eyebrow, .btn(-primary/-outline/-ghost), .hc, .faq*.
   ⚠️ Boutons villa (<button>) défendus contre le reset hello `reset.css` `button:hover/:focus{background:#c36}`
   (0,1,1, thème-wide, PHP inclus) : hover ET focus refixés (child après parent → gagne à égalité).
   `.dmain .dtitle` (0,2,0) bat `.dpage h1{margin:0}` (0,1,1). Tokens :root. Aucune valeur en dur.
   ============================================================ */

/* galerie (grande image + vignettes) */
.gal2 { display: grid; grid-template-columns: 1.95fr 1fr; gap: 14px; }
.gal2-main { position: relative; height: clamp(300px,38vw,440px); border-radius: 22px; overflow: hidden; box-shadow: var(--shadow-soft); }
.gal2-main img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: opacity .35s var(--ease); }
.gal2-arrows { position: absolute; left: 16px; bottom: 16px; display: flex; gap: 10px; z-index: 2; }
.gal2-arrows button { width: 44px; height: 44px; padding: 0; /* neutralise le padding .5rem 1rem du reset hello (sinon SVG écrasé 12px) */ border-radius: 50%; border: 0; cursor: pointer; background: rgba(255,255,255,.92); backdrop-filter: blur(6px); color: var(--petrole); display: flex; align-items: center; justify-content: center; box-shadow: var(--shadow-soft); transition: transform .25s var(--ease); }
.gal2-arrows button:hover, .gal2-arrows button:focus { transform: translateY(-2px); background: rgba(255,255,255,.92); color: var(--petrole); }
.gal2-arrows svg { width: 19px; height: 19px; stroke: currentColor; fill: none; }
.gal2-thumbs { display: grid; grid-template-rows: repeat(3,1fr); gap: 14px; height: clamp(300px,38vw,440px); }
.gal2-thumb { position: relative; border-radius: 18px; overflow: hidden; cursor: pointer; }
.gal2-thumb img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .6s var(--ease); }
.gal2-thumb:hover img { transform: scale(1.06); }
.gal2-thumb::after { content: ""; position: absolute; inset: 0; background: rgba(16,27,32,0); transition: background .3s; }
.gal2-thumb:hover::after { background: rgba(16,27,32,.12); }
.gal2-thumb .more { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: rgba(16,27,32,.5); color: #fff; font-weight: 700; font-size: 15px; z-index: 2; }

/* corps : contenu + encart sticky */
.dwrap { display: grid; grid-template-columns: minmax(0,1fr) 384px; gap: clamp(32px,4.5vw,72px); align-items: start; margin-top: clamp(34px,4vw,54px); }
.dloc { display: inline-flex; align-items: center; gap: 8px; font-size: var(--fs-eyebrow); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--corail-deep); }
.dloc svg { width: 16px; height: 16px; }
.dmain .dtitle { font-size: var(--fs-h1); color: var(--petrole); margin-top: 12px; line-height: 1.02; }
.dintro { font-size: var(--fs-lead); color: var(--petrole-brume); margin-top: 16px; max-width: 60ch; line-height: 1.6; }
.dsec { margin-top: 38px; }
.dsec h3 { font-size: var(--fs-h3); color: var(--petrole); margin-bottom: 16px; }
.ddesc p { color: var(--petrole-brume); font-size: 15.5px; line-height: 1.75; margin-bottom: 14px; max-width: 64ch; }
.infogrid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px 28px; }
.infogrid .k { font-size: 12.5px; color: var(--petrole-brume); font-weight: 600; }
.infogrid .v { font-size: 15px; color: var(--petrole); font-weight: 600; margin-top: 3px; }
.compo { display: grid; grid-template-columns: 1fr 1fr; gap: 26px 44px; }
.cgrp h4 { font-size: 15.5px; color: var(--petrole); margin-bottom: 10px; }
.cgrp ul { list-style: none; }
.cgrp li { position: relative; padding-left: 17px; font-size: 14px; color: var(--petrole-brume); margin-bottom: 7px; line-height: 1.5; }
.cgrp li::before { content: ""; position: absolute; left: 0; top: 8px; width: 6px; height: 6px; border-radius: 50%; background: var(--corail); }
/* lien nu dans une rangée de composition (ex. « Télécharger l'inventaire », import 2026-09-09) */
.cgrp > a { display: inline-block; font-size: 14px; color: var(--corail-deep); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1.5px; }
.cgrp > a:hover { color: var(--corail); }

/* encart réservation sticky (MOCK — Thelis différé) */
.dside { position: sticky; top: clamp(96px,10vw,110px); display: flex; flex-direction: column; gap: 18px; }
.bk { background: #fff; border-radius: 22px; box-shadow: var(--shadow-card); padding: 24px; }
.bk h3 { font-size: var(--fs-h4); color: var(--petrole); }
.bk-selects { display: flex; flex-direction: column; gap: 11px; margin-top: 16px; }
.bk-sel-row { display: grid; grid-template-columns: 1fr 1fr; gap: 11px; }
.bk-sel { display: flex; flex-direction: column; gap: 6px; }
.bk-sel .l { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--petrole-brume); }
.bk-sel .s { position: relative; }
.bk-sel select { width: 100%; appearance: none; -webkit-appearance: none; background: var(--sable-pale); border: 0; border-radius: 11px; padding: 11px 34px 11px 13px; font-family: var(--font-display); font-weight: 700; font-size: 14px; color: var(--petrole); cursor: pointer; }
.bk-sel .s svg { position: absolute; right: 11px; top: 50%; transform: translateY(-50%); width: 15px; height: 15px; color: var(--petrole); pointer-events: none; }
.bk-divider { height: 1px; background: rgba(34,56,63,.1); margin-top: 16px; }
.bk-sub { font-size: 12.5px; color: var(--petrole-brume); margin-top: 6px; }
.bk-weeks { display: flex; flex-direction: column; gap: 9px; margin-top: 14px; }
.bk-week { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; text-align: left; border: 0; background: var(--sable-pale); border-radius: 13px; padding: 12px 14px; cursor: pointer; font-family: var(--body); white-space: normal; transition: background .2s, box-shadow .25s var(--ease); }
.bk-week:hover, .bk-week:focus { background: var(--sable-hover); }
.bk-week .wd { font-size: 13px; font-weight: 600; color: var(--petrole); line-height: 1.3; }
.bk-week .wr { display: flex; align-items: center; gap: 8px; flex: none; }
.bk-week .wp { font-family: var(--font-display); font-weight: 700; font-size: 15px; color: var(--lagune); white-space: nowrap; }
.bk-week .wp s { font-size: 11.5px; color: var(--petrole-brume); font-weight: 500; margin-right: 5px; }
.bk-week .promo { background: var(--olivier-deep); color: #fff; font-size: 10.5px; font-weight: 700; padding: 3px 7px; border-radius: 7px; }
.bk-week.sel, .bk-week.sel:hover, .bk-week.sel:focus { background: #fff; box-shadow: inset 0 0 0 2px var(--corail-deep); }
.bk-week.off, .bk-week.off:hover, .bk-week.off:focus { cursor: default; opacity: .62; background: var(--sable-pale); }
.bk-week.off .wp { font-size: 12px; color: var(--petrole-brume); font-weight: 600; }
.bk-go { margin-top: 16px; width: 100%; background: var(--corail-deep); color: #fff; border: 0; cursor: pointer; font-family: var(--body); font-weight: 700; font-size: 16px; padding: 16px; border-radius: 14px; display: flex; align-items: center; justify-content: center; gap: 10px; transition: transform .25s var(--ease), box-shadow .25s; }
.bk-go:hover, .bk-go:focus { background: var(--corail-deep); color: #fff; transform: translateY(-2px); box-shadow: 0 18px 36px -16px rgba(234,86,56,.7); }
.bk-go svg { width: 18px; height: 18px; }
.bk-trust { display: flex; align-items: center; justify-content: center; gap: 8px; flex-wrap: wrap; margin-top: 14px; font-size: 12px; color: var(--petrole-brume); text-align: center; }
.bk-trust .dot { width: 3px; height: 3px; border-radius: 50%; background: var(--petrole-brume); }
.help { background: var(--sable-pale); border-radius: 20px; padding: 22px; }
.help h4 { font-size: 16px; color: var(--petrole); }
.help p { font-size: 13.5px; color: var(--petrole-brume); margin-top: 6px; line-height: 1.5; }
.help .btn { margin-top: 14px; width: 100%; justify-content: center; }

/* grille cross-sell « Autres hébergements » (maquette .hgrid l.213) */
.hgrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--gap-grid); }

/* tuiles vidéo + 360 (placeholder statique) */
.media2 { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.mtile { position: relative; border-radius: 20px; overflow: hidden; aspect-ratio: 16/10; cursor: pointer; box-shadow: var(--shadow-soft); }
.mtile > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .6s var(--ease); }
.mtile:hover > img { transform: scale(1.04); }
.mtile .ov { position: absolute; inset: 0; background: linear-gradient(180deg,rgba(16,27,32,.12),rgba(14,24,28,.62)); }
.mtile .ic { position: absolute; left: 50%; top: 40%; transform: translate(-50%,-50%); width: 66px; height: 66px; border-radius: 50%; background: rgba(255,255,255,.94); display: flex; align-items: center; justify-content: center; z-index: 2; transition: transform .25s var(--ease); }
.mtile:hover .ic { transform: translate(-50%,-50%) scale(1.08); }
.mtile .ic svg { width: 26px; height: 26px; color: var(--petrole); }
.mtile .lab { position: absolute; left: 0; right: 0; bottom: 18px; z-index: 2; text-align: center; color: #fff; font-family: var(--font-display); font-weight: 700; font-size: 18px; text-shadow: 0 1px 10px rgba(0,0,0,.5); }
.mtile .lab small { display: block; font-family: var(--body); font-weight: 600; font-size: 12.5px; color: rgba(255,255,255,.86); margin-top: 3px; }

/* cross-village (autre village) */
.crossv { display: grid; grid-template-columns: 1fr 1fr; background: var(--petrole); border-radius: var(--r-card); overflow: hidden; color: #fff; isolation: isolate; }
.crossv-media { position: relative; min-height: 300px; }
.crossv-media > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.crossv-txt { padding: clamp(30px,4vw,56px); display: flex; flex-direction: column; justify-content: center; }
.crossv-txt .eyebrow { color: var(--corail-pale); }
.crossv-txt .eyebrow::before { background: var(--corail-pale); }
.crossv-txt h2 { color: #fff; font-size: var(--fs-h2); margin-top: 14px; line-height: 1.04; }
.crossv-txt .loc { display: inline-flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; color: rgba(255,255,255,.85); margin-top: 14px; }
.crossv-txt .loc svg { width: 16px; height: 16px; }
.crossv-txt .loc .st { color: var(--corail-pale); letter-spacing: 1px; }
.crossv-txt p { margin-top: 14px; color: rgba(255,255,255,.82); font-size: 15.5px; line-height: 1.6; max-width: 46ch; }
.crossv-txt .btn { margin-top: 26px; align-self: flex-start; }

/* responsive single hébergement */
@media (max-width: 980px) {
  .dwrap { grid-template-columns: 1fr; }
  .dside { position: static; flex-direction: row; flex-wrap: wrap; }
  .bk, .help { flex: 1 1 300px; }
}
@media (max-width: 760px) {
  .gal2 { grid-template-columns: 1fr; height: auto; }
  .gal2-main { height: 300px; }
  .gal2-thumbs { grid-template-rows: none; grid-template-columns: repeat(3,1fr); height: 110px; }
  .infogrid { grid-template-columns: 1fr; }
  .dside { flex-direction: column; }
  .compo { grid-template-columns: 1fr; }
  .crossv { grid-template-columns: 1fr; }
  .crossv-media { min-height: 220px; }
}
@media (max-width: 600px) { .media2 { grid-template-columns: 1fr; } }

/* ============================================================
   Bloc village/hero — landing village (TB Single mp_village)
   Porté maquette styles.css l.474-500 + responsive (@900/@560) + body.vhead-top.
   `.loc` scopé `.vhero .loc` (maquette). Boutons <button> (.vh-media/.resa-f/.resa-go)
   défendus du reset hello `button:hover/:focus{background:#c36}` (hover ET focus). Tokens :root.
   ============================================================ */
.vcon.vcon { padding: 0; display: flex; flex-direction: column; } /* conteneur Elementor plein cadre du hero (bat padding+row .e-con → hero pleine largeur) */
/* Landing village : reproduction EXACTE maquette (`<body class="vhead-top">` statique). Le header reste
   `position:fixed` (défaut Elementor → reste visible au scroll) ; on RETIRE juste la ligne bottom (maquette
   `body.vhead-top .nav{box-shadow:none}`) et le hero est collé (`body.vhead-top .vhero{margin-top:0}`,
   déjà porté plus bas). `vhead-top` ajouté au body des singles mp_village via functions.php. */
/* Reproduit maquette (l.1097 `body.vhead-top .nav{position:sticky}` + l.1102 box-shadow:none) : header
   EN FLUX au top (hero juste après, pas d'overlap) puis stické au scroll. En WP le `.s-hdr` est enveloppé
   dans `<header.elementor-64>` (enfant de body) ; `position:sticky` sur `.s-hdr` stickerait dans ce wrapper
   court (~82px) → échoue. On rend donc le WRAPPER sticky (contexte = body, comme `.nav`) et le `.s-hdr`
   statique (en flux dedans). Scopé `body.vhead-top` (singles mp_village uniquement). */
body.vhead-top .elementor.elementor-64 { position: sticky; top: 0; z-index: 999; }
body.vhead-top .s-hdr.s-hdr { position: static; box-shadow: none; }
/* léger shrink au scroll (maquette `.nav.scrolled{padding:12px}` — `.s-hdr` base = 15px ; header.js pose
   `.scrolled` >40px). Transition padding .4s déjà sur `.s-hdr`. */
body.vhead-top .s-hdr.s-hdr.scrolled { padding-top: 12px; padding-bottom: 12px; background: rgba(251,250,246,.88); }
.vhero { position: relative; margin: 14px; border-radius: 30px; overflow: hidden; min-height: calc(100svh - 28px); display: flex; align-items: center; justify-content: center; isolation: isolate; }
.vhero > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: -2; transform-origin: center; }
.vhero .vscrim { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(16,27,32,.55), rgba(16,27,32,.26) 36%, rgba(16,27,32,.3) 64%, rgba(14,24,28,.66)); z-index: -1; }
.vhero-in { padding: clamp(76px,12vh,116px) clamp(20px,4vw,40px) clamp(28px,4vw,52px); width: 100%; max-width: 1040px; margin: 0 auto; color: #fff; display: flex; flex-direction: column; align-items: center; text-align: center; gap: clamp(15px,1.9vw,22px); }
.vhero .loc { display: inline-flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: rgba(255,255,255,.92); }
.vhero .loc svg { width: 17px; height: 17px; }
.vhero h1 { margin: 0; color: #fff; font-size: clamp(48px,9vw,104px); line-height: .95; letter-spacing: -.035em; text-shadow: 0 2px 28px rgba(0,0,0,.42); } /* margin:0 → annule le reset hello h1{margin-block .5rem/1rem} (maquette *{margin:0}) */
.vh-tag { margin: 0; font-size: clamp(16px,1.9vw,21px); color: rgba(255,255,255,.94); max-width: 46ch; line-height: 1.5; text-shadow: 0 1px 12px rgba(0,0,0,.45); } /* margin:0 → annule le reset hello p{margin-block-end:.9rem} */
.vh-media-row { display: flex; gap: 11px; justify-content: center; margin-top: 2px; }
.vh-media { display: inline-flex; align-items: center; gap: 9px; background: rgba(16,27,32,.34); backdrop-filter: blur(12px); box-shadow: inset 0 0 0 1px rgba(255,255,255,.38), 0 10px 24px -12px rgba(8,16,20,.6); color: #fff; border: 0; cursor: pointer; font-family: var(--body); font-weight: 700; font-size: 13.5px; padding: 11px 16px; border-radius: 999px; transition: .25s var(--ease); }
.vh-media:hover, .vh-media:focus { background: rgba(16,27,32,.5); color: #fff; transform: translateY(-1px); }
.vh-media svg { width: 17px; height: 17px; }
.resabar { display: flex; align-items: stretch; background: rgba(255,255,255,.97); border-radius: 20px; box-shadow: 0 26px 64px -26px rgba(8,16,20,.6); padding: 8px; gap: 2px; width: 100%; max-width: 940px; margin: clamp(8px,1.4vw,18px) auto 0; text-align: left; } /* backdrop-filter blur(6px) retiré (2026-08-21, gênait au scroll) — fond 97% blanc, lisibilité vérifiée */
.resa-f { flex: 1; display: flex; flex-direction: column; justify-content: center; gap: 4px; padding: 13px 20px; border-radius: 14px; cursor: pointer; transition: background .2s; min-width: 0; text-align: left; border: 0; background: none; font-family: var(--body); }
.resa-f:hover, .resa-f:focus { background: var(--sable-pale); }
.resa-f .lab { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--petrole-brume); }
.resa-f .val { font-size: 15px; font-weight: 600; color: var(--petrole); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: flex; align-items: center; gap: 7px; }
.resa-f .val svg { width: 15px; height: 15px; flex: none; color: var(--corail-deep); }
.resa-div { width: 1px; background: rgba(34,56,63,.12); margin: 11px 0; flex: none; }
.resa-go { flex: none; display: inline-flex; align-items: center; gap: 9px; background: var(--corail-deep); color: #fff; border: 0; cursor: pointer; font-family: var(--body); font-weight: 700; font-size: 15px; padding: 0 26px; border-radius: 14px; transition: transform .25s var(--ease), background .25s; }
.resa-go:hover, .resa-go:focus { background: var(--corail); color: #fff; transform: translateY(-1px); }
.resa-go svg { width: 18px; height: 18px; }
body.vhead-top .vhero { margin-top: 0; }
@media (max-width: 900px) {
  .resabar { flex-wrap: wrap; }
  .resa-f { flex: 1 1 44%; }
  .resa-div { display: none; }
  .resa-go { flex: 1 1 100%; justify-content: center; padding: 15px; }
}
@media (min-width: 901px) {
  body.vhead-top .vhero { min-height: calc(100svh - 96px); }
  body.vhead-top .vhero-in { padding-top: clamp(40px,5vh,64px); }
}
@media (max-width: 560px) {
  .vhero { margin: 6px; border-radius: 20px; min-height: calc(100svh - 12px); }
}

/* Reset marges vpage : DÉPLACÉ dans le bloc fondations (chantier vpage 2026-07-27) — il était ici,
   APRÈS des composants comme .art-body, et écrasait leurs marges à spécificité égale. */

/* section esprit (maquette styles.css l.503-509) */
.esprit { max-width: 760px; margin: 0 auto; text-align: center; }
.esprit .eyebrow { justify-content: center; }
.esprit h2 { font-size: var(--fs-h2); margin-top: 14px; color: var(--petrole); } /* color explicite : landing ≠ .dpage (qui posait petrole sur h1..h4) → sinon #333 du reset hello */
.esprit p { margin-top: 18px; color: var(--petrole-brume); font-size: 17px; line-height: 1.7; }
.esprit-stats { display: flex; justify-content: center; gap: clamp(26px,5vw,62px); margin-top: 38px; flex-wrap: wrap; }
.esprit-stats .n { font-family: var(--font-display); font-weight: 700; font-size: 32px; color: var(--petrole); display: block; line-height: 1; }
.esprit-stats .l { font-size: 13px; color: var(--petrole-brume); margin-top: 6px; display: block; }

/* section galerie coverflow (maquette styles.css l.512-542, 611-613, 624). `.gal-arrow`/`.sl-head` partagés
   avec le slider hébergements village. `.cg-cap` blanc (sur image). Flèches défendues du reset #c36 via
   `.cgal .gal-arrow.prev/.next` (0,3,0). Layout piloté par js/village.js (items position:absolute). */
.sl-head { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 14px; margin-bottom: clamp(28px,3.4vw,40px); }
.sl-head .eyebrow { justify-content: center; }
.sl-head h2 { font-size: var(--fs-h2); color: var(--petrole); } /* color : landing ≠ .dpage */
.sl-head .lead { margin: 0; max-width: 54ch; }
.cgal { position: relative; overflow: hidden; }
.cgal-stage { position: relative; height: clamp(360px,44vw,500px); }
.cgal-item { position: absolute; top: 0; left: 0; border-radius: 24px; overflow: hidden; box-shadow: var(--shadow-soft); cursor: pointer; will-change: left,top,width,height; transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.cgal-item > img { width: 100%; height: 100%; object-fit: cover; }
.cgal-item .cg-shade { position: absolute; inset: 0; background: rgba(8,16,20,.3); opacity: .16; transition: opacity .4s var(--ease); pointer-events: none; }
.cgal-item.active .cg-shade { opacity: 0; }
.cgal-item:not(.active) { transition: filter .45s var(--ease); filter: saturate(.9) brightness(.93); }
.cgal-item:not(.active):hover { transform: translateY(-5px); box-shadow: var(--shadow-card); filter: saturate(1) brightness(1.02); }
.cgal-item:not(.active):hover .cg-shade { opacity: 0; }
.cgal-item:not(.active) .cg-shade { opacity: .26; }
.cgal-item .cg-grad { position: absolute; inset: 0; background: linear-gradient(180deg,rgba(16,27,32,.02) 42%,rgba(14,24,28,.84)); opacity: 0; transition: opacity .5s var(--ease); }
.cgal-item.active .cg-grad { opacity: 1; }
.cgal-item .cg-cap { position: absolute; left: 30px; right: 30px; bottom: 28px; z-index: 2; color: #fff; opacity: 0; transform: translateY(14px); transition: opacity .55s var(--ease) .1s, transform .55s var(--ease) .1s; pointer-events: none; }
.cgal-item.active .cg-cap { opacity: 1; transform: none; }
.cg-cap .et { font-size: var(--fs-eyebrow); font-weight: 700; letter-spacing: .16em; text-transform: uppercase; color: var(--corail-pale); }
.cg-cap h4 { color: #fff; font-size: var(--fs-h3); margin-top: 6px; line-height: 1.06; text-shadow: 0 2px 16px rgba(0,0,0,.5); }
.cg-cap p { font-size: 14px; color: rgba(255,255,255,.92); margin-top: 6px; max-width: 42ch; text-shadow: 0 1px 8px rgba(0,0,0,.5); }
.gal-nav { display: flex; gap: 12px; flex: none; }
.gal-arrow { width: 52px; height: 52px; padding: 0; /* idem reset hello */ border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; border: 0; transition: .25s var(--ease); }
.gal-arrow svg { width: 21px; height: 21px; stroke: currentColor; fill: none; }
.gal-arrow.prev { background: #fff; box-shadow: var(--shadow-soft); color: var(--petrole); }
.gal-arrow.next { background: var(--petrole); color: #fff; }
.gal-arrow:hover { transform: translateY(-2px); box-shadow: var(--shadow-card); }
.cgal .gal-nav { position: absolute; right: 16px; bottom: 16px; z-index: 6; display: flex; gap: 10px; }
.cgal .gal-arrow.prev { background: rgba(255,255,255,.92); backdrop-filter: blur(8px); }
.cgal .gal-arrow.next { background: var(--corail-deep); color: #fff; }
@media (max-width: 900px) { .cgal-stage { height: clamp(320px,72vw,460px); } }

/* section slider hébergements village (maquette styles.css l.533, 543-547, 146). Réutilise .sl-head,
   .gal-nav/.gal-arrow (prev blanc / next petrole hors .cgal), carte .hc + enfants, .btn-outline.
   L'overflow-x du slider est interne (snap) — pas un débordement de page. */
.sl-right { display: flex; flex-direction: column; align-items: center; gap: 18px; max-width: 520px; }
/* `.sl-right` est devenu un CONTENEUR NATIF sur les 2 pages village (voie B, 2026-09-16) : sa
   base atomique gagne sur la classe simple ci-dessus (§7.5). Mesuré : en `e-div-block` il passe
   en `display:block` (gap perdu, flèches désalignées) ; en `e-flexbox` il passe en
   `flex-direction:row` (chapô et flèches côte à côte). Double classe = même remède que
   `.sl-head.sl-head`, `.wrap.wrap` et `.vcon.vcon`, qui existent pour la même raison.
   AUCUNE valeur de design ne change ici : ce sont les propriétés déjà déclarées au-dessus,
   re-spécifiées pour battre la base. */
.sl-right.sl-right { display: flex; flex-direction: column; align-items: center; gap: 18px; }
.hslider { display: flex; gap: 20px; overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; padding: 14px 4px 38px; scrollbar-width: none; margin: 0 -4px; }
.hslider::-webkit-scrollbar { display: none; }
.hslider .hcard { flex: 0 0 clamp(280px,30vw,338px); scroll-snap-align: start; }
.hslider .hc:hover { box-shadow: 0 22px 50px -28px rgba(34,56,63,.55); }
.sec-cta { margin-top: clamp(16px,2.2vw,26px); display: flex; justify-content: center; }

/* reveal — état par défaut VISIBLE (maquette l.320) : l'apparition est 100 % GSAP (gsap.from, village.js) ;
   sans GSAP/JS rien ne touche l'élément. Filet reduced-motion = maquette l.427 (aucun résidu invisible). */
.reveal { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .reveal { opacity: 1 !important; transform: none !important; } }

/* section teaser aquatique — composant « feature » (maquette l.550-570 + @900 l.625-626 ; `.feature.rev`
   servira la section #infos). `.feature h2` color explicite (landing ≠ .dpage). */
.feature { display: grid; grid-template-columns: 1.08fr 1fr; gap: clamp(28px,4vw,56px); align-items: center; }
.feature.rev .feat-media { order: 2; }
.feat-mosaic { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 14px; aspect-ratio: 1/0.92; }
.feat-mosaic .m { position: relative; border-radius: 20px; overflow: hidden; box-shadow: var(--shadow-soft); }
.feat-mosaic .m > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease); }
.feat-mosaic .m:hover > img { transform: scale(1.05); }
.feat-mosaic .m.tall { grid-row: span 2; }
/* média du feature (section infos — maquette l.552-559 + @min-901 stretch l.555-557) */
.feat-media { position: relative; border-radius: var(--r-card); overflow: hidden; aspect-ratio: 4/3; box-shadow: var(--shadow-soft); }
.feat-media > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
@media (min-width: 901px) {
  .feature > .feat-media { align-self: stretch; aspect-ratio: auto; min-height: clamp(320px,34vw,460px); }
}
.feat-media .pin { position: absolute; left: 16px; top: 16px; z-index: 2; display: inline-flex; align-items: center; gap: 7px; background: rgba(255,255,255,.9); backdrop-filter: blur(6px); border-radius: 999px; padding: 7px 13px; font-size: 12.5px; font-weight: 700; color: var(--petrole); }
.feat-media .pin svg { width: 15px; height: 15px; color: var(--corail-deep); }
/* liste infos pratiques (maquette l.571-577) */
.infos-list { list-style: none; margin-top: 8px; padding: 0; }
.infos-list li { display: flex; gap: 13px; padding: 14px 0; border-bottom: 1px solid rgba(34,56,63,.08); }
.infos-list li:last-child { border-bottom: 0; }
.infos-list .ic { flex: none; width: 40px; height: 40px; border-radius: 12px; background: var(--sable-pale); color: var(--corail-deep); display: flex; align-items: center; justify-content: center; }
.infos-list .ic svg { width: 20px; height: 20px; stroke: currentColor; }
.infos-list h4 { font-size: 15px; color: var(--petrole); }
.infos-list p { font-size: 13.5px; color: var(--petrole-brume); margin-top: 2px; }
.feature h2 { font-size: var(--fs-h2); margin-top: 14px; color: var(--petrole); }
.feature .lead { margin-top: 14px; }
.feat-list { display: flex; flex-wrap: wrap; gap: 10px 12px; margin-top: 22px; }
.feat-list .chip { display: inline-flex; align-items: center; gap: 8px; background: var(--sable-pale); border-radius: 999px; padding: 9px 14px; font-size: 13px; font-weight: 600; color: var(--petrole); }
.feat-list .chip svg { width: 16px; height: 16px; stroke: currentColor; color: var(--corail-deep); }
/* Le fond du chip s'inverse sur .section.alt (même beige que --sable-pale, pastille
   invisible sinon) — maquette styles.css:576, complété au chantier landings. */
.section.alt .feat-list .chip { background: #fff; }
/* Marge quand une section.alt suit directement le wrap d'intro (maquette:653). */
.dpage > .wrap + section.alt { margin-top: clamp(36px, 4.5vw, 64px); }
.feature .btn { margin-top: 26px; }
@media (max-width: 900px) {
  .feature { grid-template-columns: 1fr; gap: 30px; }
  .feature.rev .feat-media { order: 0; }
}

/* section activités à onglets (maquette l.585-587 + @900 l.627 + @560 l.629 + carrousel village @600
   l.630-633). `.acts-tabs`/`.acts-tab`/`.rtile`/`.sec-head`/`.sec-cta` déjà portés. Le carrousel `.vpage`
   (body des singles mp_village) override le 1 col @560 (source order) — fidèle maquette. */
.acts-panel { display: none; }
.acts-panel.show { display: block; }
.acts-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: var(--gap-grid); }
/* section avis — composant témoignages générique (maquette l.256-269, sous-ensemble du markup landing ;
   la variante home `.s-tst-*` reste intacte). `blockquote{margin:0}` = équivalent du `*{margin:0}` maquette
   (l'UA pose 1em/40px). Avatars : fond posé par token inline dans le markup (var(--corail-deep)…). */
.tgrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: var(--gap-grid); }
.tcard { position: relative; overflow: hidden; background: #fff; border-radius: var(--r-card); padding: 28px 28px 26px; box-shadow: var(--shadow-soft); display: flex; flex-direction: column; gap: 15px; transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.tcard:hover { transform: translateY(-5px); box-shadow: var(--shadow-card); }
.tcard .qstars { color: var(--corail); letter-spacing: 2px; font-size: 15px; }
.tcard blockquote { margin: 0; font-size: 17px; color: var(--encre); line-height: 1.62; flex: 1; }
.tcard .who { display: flex; align-items: center; gap: 13px; }
.tcard .av { width: 46px; height: 46px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 700; font-family: var(--font-display); font-size: 17px; }
.tcard .who .nm { font-weight: 700; color: var(--petrole); font-size: 14.5px; }
.tcard .who .ct { font-size: 12.5px; color: var(--petrole-brume); }

/* bandeau Groupes & CSE (maquette l.247-253 ; instance landing : min-height/display flex inline).
   `.groups h2/p` (0,1,1) battent les globaux (blanc sur overlay sombre). Parallaxe img = couche wow. */
.groups { position: relative; border-radius: var(--r-card); overflow: hidden; isolation: isolate; }
.groups > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.groups .gov { position: absolute; inset: 0; background: linear-gradient(100deg, rgba(34,56,63,.94) 0%, rgba(34,56,63,.78) 42%, rgba(34,56,63,.35) 100%); }
.groups .gin { position: relative; z-index: 2; padding: clamp(38px,6vw,72px); max-width: 60ch; color: #fff; }
.groups .eyebrow { color: var(--corail-pale); }
.groups .eyebrow::before { background: var(--corail); }
.groups h2 { color: #fff; font-size: var(--fs-h2); margin: 16px 0 14px; }
.groups p { color: rgba(255,255,255,.9); font-size: 16px; margin-bottom: 26px; max-width: 46ch; }

/* CTA final (maquette l.281-291 ; instance village = widget HTML, home = template atomic #37 .s-fin distinct).
   `.final h2/p` (0,1,1, source après le reset village) battent les globaux (blanc sur overlay). Parallaxe img = couche wow. */
.final { position: relative; border-radius: var(--r-card); overflow: hidden; isolation: isolate; text-align: center; }
.final > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 60%; }
.final .fov { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(14,24,28,.5), rgba(14,24,28,.72)); }
.final .fin { position: relative; z-index: 2; padding: clamp(56px,9vw,110px) 24px; color: #fff; }
.final h2 { color: #fff; font-size: var(--fs-h1); max-width: 18ch; margin: 0 auto 16px; text-shadow: 0 2px 24px rgba(8,16,20,.5); }
.final p { color: rgba(255,255,255,.92); font-size: 18px; max-width: 44ch; margin: 0 auto 30px; text-shadow: 0 1px 14px rgba(8,16,20,.5); }
.final .frow { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }
.final .btn-ghost { background: rgba(14,24,28,.34); box-shadow: inset 0 0 0 1.5px rgba(255,255,255,.82); }
.final .btn-ghost:hover { background: rgba(14,24,28,.5); }
.final .phone { margin-top: 24px; font-size: 14px; color: rgba(255,255,255,.85); display: flex; align-items: center; gap: 8px; justify-content: center; }
.final .phone svg { width: 16px; height: 16px; }

/* grille région (teaser village — maquette l.234, @900 l.342, @560 l.353 ; carrousel .vpage @600 ci-dessous) */
.rgrid { display: grid; grid-template-columns: repeat(4,1fr); gap: var(--gap-grid); }
@media (max-width: 900px) { .acts-grid { grid-template-columns: 1fr 1fr; } .rgrid { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 560px) { .acts-grid { grid-template-columns: 1fr; } .rgrid { grid-template-columns: 1fr; } }
@media (max-width: 600px) {
  .vpage .rgrid, .vpage .acts-grid { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; gap: 14px; margin: 0 -24px; padding: 10px 24px 30px; }
  .vpage .rgrid::-webkit-scrollbar, .vpage .acts-grid::-webkit-scrollbar { display: none; }
  .vpage .rgrid > *, .vpage .acts-grid > * { flex: 0 0 72%; scroll-snap-align: start; }
}

/* ============================================================
   Page oasis-aquatique (village/aquatique-page — maquette styles.css l.857-880).
   Composants propres : en-tête .aqhead, tête de galerie .aqgal-head, cartes « à découvrir » .disc,
   bloc centré .why. Le reste (dpage/cgal/feature/chips/faq…) est déjà porté. Tokens :root.
   ============================================================ */
.aqhead { max-width: 760px; margin-bottom: clamp(22px,2.8vw,34px); }
.aqhead .eyebrow { margin-bottom: 14px; }
.aqhead h1 { font-size: var(--fs-h1); color: var(--petrole); line-height: 1.04; letter-spacing: -.03em; }
.aqhead .lead { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; max-width: 64ch; }
.aqgal-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 18px; margin-bottom: 18px; }
.dpage .cgal { margin-bottom: clamp(54px,7vw,88px); }
/* NB : .disc* et sa MQ @860 étaient déjà portés (single activité, plus haut) — doublon retiré. */
.why { max-width: 880px; margin: 0 auto; text-align: center; }
.why .eyebrow { justify-content: center; margin-bottom: 16px; }
.why p { color: var(--petrole-brume); font-size: var(--fs-lead); line-height: 1.7; margin-top: 14px; }
.why .feat-list { justify-content: center; margin-top: 26px; }

/* ============================================================
   Page oasis-groupes (village/groupes-page — maquette styles.css l.953-956 + l.986-997).
   En-tête .gp-head + formulaire de devis .devis (mock démo). Focus des champs défendu du reset
   Hello (border #333) par la règle :focus maquette (corail-deep). Le reste (facts/disc/infobox/
   art-list/faq…) est déjà porté. Tokens :root.
   ============================================================ */
.gp-head { max-width: 780px; margin-bottom: clamp(22px,2.6vw,32px); }
.gp-head .eyebrow { margin-bottom: 14px; }
.gp-head h1 { font-size: var(--fs-h1); color: var(--petrole); line-height: 1.04; letter-spacing: -.03em; }
.gp-head .lead { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; }
/* formulaire de devis */
.devis { background: var(--sable-pale); border-radius: var(--r-card); padding: clamp(26px,4vw,48px); }
/* la carte devis est désormais un e-con (bloc devis Elementor, 2026-08-21) : re-gagner le padding
   sur le reset `.wrap .e-con { padding: 0 }` (§7.5, même (0,2,0) mais déclaré plus haut) */
.devis.devis { padding: clamp(26px,4vw,48px); }
.devis h2 { font-size: var(--fs-h2); color: var(--petrole); }
.devis .lead { margin-top: 12px; color: var(--petrole-brume); font-size: 16px; max-width: 60ch; }
/* .devis-grid/.devis-go/.devis-ok PURGÉS (2026-08-21) puis .df (2026-08-22, dernier mock
   recForm converti) : les 4 formulaires sont des widgets Elementor calés par le bloc .mp-cform. */

/* ============================================================
   Page oasis-cse (village/cse-page — maquette styles.css l.970-984).
   Bandeau linéaires .cse-deal (fond pétrole, -52 % corail-pale) + exemple concret .cse-calc.
   Le reste (gp-head/facts/feature/art-list/devis/faq) est déjà porté. Tokens :root.
   ============================================================ */
.cse-deal { display: grid; grid-template-columns: auto 1fr; gap: clamp(22px,3vw,40px); align-items: center; background: var(--petrole); border-radius: var(--r-card); overflow: hidden; color: #fff; padding: clamp(26px,3.4vw,44px); margin-top: 8px; }
.cse-pct { font-family: var(--font-display); font-weight: 700; font-size: clamp(48px,7vw,86px); line-height: .9; color: var(--corail-pale); white-space: nowrap; }
.cse-pct small { display: block; font-size: 14px; font-weight: 600; color: rgba(255,255,255,.82); letter-spacing: .04em; margin-top: 8px; }
.cse-per { display: flex; flex-direction: column; gap: 12px; }
.cse-per .row { display: flex; align-items: baseline; gap: 12px; padding-bottom: 12px; border-bottom: 1px solid rgba(255,255,255,.16); }
.cse-per .row:last-child { border-bottom: 0; padding-bottom: 0; }
.cse-per .d { font-family: var(--font-display); font-weight: 700; font-size: 18px; color: #fff; white-space: nowrap; }
.cse-per .t { font-size: 13.5px; color: rgba(255,255,255,.82); }
.cse-calc { display: grid; grid-template-columns: 1.1fr 1fr; gap: clamp(24px,3vw,44px); align-items: center; }
.cse-calc .box { background: #fff; border-radius: var(--r-card); padding: clamp(26px,3.4vw,40px); box-shadow: var(--shadow-soft); }
.cse-calc .lbl { font-size: var(--fs-eyebrow); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--petrole-brume); }
.cse-calc .new { font-family: var(--font-display); font-weight: 700; font-size: clamp(34px,4.4vw,52px); color: var(--petrole); line-height: 1; margin-top: 10px; display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.cse-calc .pct { font-family: var(--body); font-size: 14px; font-weight: 700; color: #fff; background: var(--corail-deep); padding: 6px 12px; border-radius: 999px; }
.cse-calc .old { font-size: 16px; color: var(--petrole-brume); text-decoration: line-through; margin-top: 10px; }
.cse-calc .note { font-size: 13.5px; color: var(--petrole-brume); line-height: 1.6; margin-top: 14px; }
@media (max-width: 760px) { .cse-deal { grid-template-columns: 1fr; gap: 24px; text-align: center; } .cse-pct { text-align: center; } .cse-calc { grid-template-columns: 1fr; } }

/* ============================================================
   Page oasis-residentiel (village/residentiel-page — maquette styles.css l.1068-1078 + l.1022-1030).
   En-tête .rs-head, grille .rs-villages (disc-cards + vpill), formulaire contact .cform (mock démo,
   consent RGPD accent corail), astérisque .req. Le reste (facts/feature/disc/df/faq) déjà porté.
   ============================================================ */
.rs-head { max-width: 780px; margin-bottom: clamp(6px,1.2vw,16px); }
.rs-head .eyebrow { margin-bottom: 14px; }
.rs-head h1 { font-size: var(--fs-h1); color: var(--petrole); line-height: 1.04; letter-spacing: -.03em; }
.rs-head .lead { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; }
.rs-villages { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap-grid); }
.rs-villages .disc-ph { position: relative; }
.rs-villages .disc-ph .vpill { position: absolute; left: 14px; bottom: 14px; }
.req { color: var(--corail-deep); font-weight: 700; }
/* formulaire contact (résidentiel — puis /contact/, /residentiel/ marque) */
.cform { background: var(--sable-pale); border-radius: var(--r-card); padding: clamp(26px,3.4vw,44px); }
.cform h2 { font-size: var(--fs-h3); color: var(--petrole); line-height: 1.08; }
.cform .lead { margin-top: 10px; font-size: 15px; color: var(--petrole-brume); max-width: 52ch; }
/* .cform-grid/.df/.consent/.cform-go/.cform-ok PURGÉS (2026-08-22) : dernier mock formulaire
   (recForm candidature) converti en widget Elementor — la famille mock est morte, le calage vit
   dans le bloc gabarit .mp-cform. .cform (carte) et .req (leads « champs marqués d'un * ») restent. */
@media (max-width: 760px) { .rs-villages { grid-template-columns: 1fr; } }

/* ============================================================
   Page oasis-contact (village/contact-page — maquette styles.css l.1004-1007, 1020, 1032-1052).
   En-tête .ct-head, grille formulaire/carte .contact-grid, carte coordonnées .cdest, FAQ centrée
   .ct-faq. Le formulaire réutilise .cform (résidentiel). `.cchan` = composant marque, non porté.
   ============================================================ */
.ct-head { max-width: 760px; margin-bottom: clamp(22px,2.8vw,34px); }
.ct-head .eyebrow { margin-bottom: 14px; }
.ct-head h1 { font-size: var(--fs-h1); color: var(--petrole); line-height: 1.04; letter-spacing: -.03em; }
.ct-head .lead { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; }
.contact-grid { display: grid; grid-template-columns: 1.12fr .88fr; gap: clamp(20px,2.6vw,34px); align-items: start; margin-top: clamp(26px,3.4vw,46px); }
.cdest-col { display: flex; flex-direction: column; gap: clamp(16px,2vw,22px); }
.cdest { background: #fff; border-radius: var(--r-card); overflow: hidden; box-shadow: var(--shadow-soft); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.cdest:hover { transform: translateY(-5px); box-shadow: var(--shadow-card); }
.cdest-ph { position: relative; aspect-ratio: 16/7; overflow: hidden; }
.cdest-ph img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease); }
.cdest:hover .cdest-ph img { transform: scale(1.05); }
.cdest-ph .vpill { position: absolute; left: 14px; bottom: 14px; }
.cdest-b { padding: clamp(18px,2.2vw,26px); }
.cdest-b h3 { font-family: var(--font-display); font-weight: 700; font-size: var(--fs-h4); color: var(--petrole); line-height: 1.1; }
.cdest-list { margin-top: 14px; display: flex; flex-direction: column; gap: 11px; }
.cdest-list .li { display: flex; gap: 11px; align-items: flex-start; font-size: 14px; color: var(--petrole-brume); line-height: 1.45; }
.cdest-list .li svg { flex: none; width: 18px; height: 18px; color: var(--corail-deep); margin-top: 1px; }
.cdest-list .li a { color: var(--petrole-brume); transition: color .25s var(--ease); }
.cdest-list .li a:hover { color: var(--corail-deep); }
.cdest-cta { margin-top: 20px; display: flex; gap: 18px; flex-wrap: wrap; align-items: center; }
.cdest-map { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; font-size: 13.5px; color: var(--corail-deep); transition: gap .25s var(--ease); }
.cdest-map svg { width: 17px; height: 17px; }
/* split contact natif (2026-08-21) : e-svg pose width/height 100% en inline → tailles maquette
   réaffirmées pour les icônes NATIVES (wrapper .e-svg-base dimensionné ; !important pour .ico,
   dont le wrapper 26/22px est plus grand que le svg — pattern s-reassur-ic-svg). */
.cdest-list .li .e-svg-base { flex: none; width: 18px; height: 18px; margin-top: 1px; }
.cdest .e-svg-base svg, .ct-faq .e-svg-base svg { fill: none; stroke: currentColor; } /* le rendu e-svg perd le fill=none racine (pattern s-reassur-ic-svg) */
.cdest-map .e-svg-base { width: 17px; height: 17px; }
.btn .ico.e-svg-base svg { width: 16px !important; height: 16px !important; }
.btn-sm .ico.e-svg-base svg { width: 14px !important; height: 14px !important; }
/* §7.5 préventif — zone contact native : les e-div-block portent .e-con (padding:10px par défaut,
   feuille base chargée APRÈS le thème) et e-div-block-base (display:block) qui battent les classes
   maquette (0,1,0) par ordre source → reset scopé + ré-affirmation des display (0,2,0). */
/* ré-ajouts explicites APRÈS le reset (même spécificité → ordre source) ; width:auto sur les
   éléments de nature inline (la base .e-con pose width:100%). */
.cdest-col .cdest-b { padding: clamp(18px,2.2vw,26px); }
.contact-grid .cdest-col { display: flex; flex-direction: column; gap: clamp(16px,2vw,22px); }
.cdest-b .cdest-list { margin-top: 14px; }
.cdest-b .cdest-cta { display: flex; margin-top: 20px; }
.cdest-b .cdest-list { display: flex; flex-direction: column; gap: 11px; }
@media (max-width: 980px) { .contact-grid .cdest-col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; } }
@media (max-width: 620px) { .contact-grid .cdest-col { grid-template-columns: 1fr; } }
.cdest-ph .vpill { display: inline-flex; width: auto; padding: 7px 13px; }
.cdest-cta .cdest-map { display: inline-flex; width: auto; }
.cdest-cta .btn.btn-sm { padding: 11px 14px 11px 20px; width: auto; }
.e-con.btn { width: auto; } /* générique : tout bouton NATIF (e-con pose width:100%) */
.cdest-map:hover { gap: 11px; }
/* FAQ centrée (réutilise .faq global) */
.ct-faq .sec-head { justify-content: center; text-align: center; margin-bottom: 34px; }
.ct-faq .sec-head .eyebrow { justify-content: center; }
/* Centrage RÉEL du bloc titre (demande dev 2026-07-24 — la maquette laisse le h2 18ch et l'encart
   calés à gauche malgré text-align:center : écart volontaire vs maquette, WP centre vraiment). */
.ct-faq .sec-head { display: block; }
.ct-faq .sec-head h2, .ct-faq .sec-head p { margin-inline: auto; }

/* ÉQUIVALENT GÉNÉRAL de `.dpage>.wrap+section.alt{margin-top:clamp(36px,4.5vw,64px)}` (maquette
   l.645 — jamais porté). 1er sélecteur = pages PHP (adjacence DOM réelle) ; 2e = pages Elementor
   (l'adjacence traverse les conteneurs : .vcon directement après le conteneur .wrap). Corrige le
   FAQ contact collé + les marges latentes cse/residentiel ; aquatique S1 garde son style inline
   identique (même valeur). */
.dpage > .wrap + section.alt,
.dpage > .wrap + .vcon section.alt { margin-top: clamp(36px,4.5vw,64px); }

/* .faq-wrap rétrécissait dans le `.wrap` flex column (margin:auto → shrink-to-fit : 678px au lieu
   de 840) — même piège que .faq/.art-nav (maquette : .wrap n'est pas flex). */
.faq-wrap { width: 100%; }
@media (max-width: 980px) { .contact-grid { grid-template-columns: 1fr; } .cdest-col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; } }
@media (max-width: 620px) { .cdest-col { grid-template-columns: 1fr; } }

/* ============================================================
   Page recrutement (recrutement/page — maquette styles.css l.1111-1151).
   Intro RH, avantages 4 col, offres dépliables .job* (accordéon max-height), candidature
   .cform--white + champ fichier. Les sélecteurs `.job-ul, .job-body-in ul` sont DOUBLÉS : le corps
   des offres vient du post_content CPT dont les <ul> n'ont pas de classe (équivalent documenté).
   ============================================================ */
.rec-intro { margin-top: clamp(26px,3.4vw,42px); }
.rec-count { margin: clamp(16px,1.8vw,22px) 0 clamp(18px,2vw,26px); font-size: var(--fs-label); font-weight: 600; color: var(--petrole); }
.rec-count b { font-family: var(--font-display); }
.rec-illus { opacity: .6; font-weight: 600; }
/* composant atouts (maquette l.178-185 + MQ @900/@560 — JAMAIS porté : première utilisation ici,
   le bloc home réassurance a ses propres classes s-*) */
.atouts { display: grid; grid-template-columns: repeat(3,1fr); gap: var(--gap-grid); }
.atout { background: #fff; border-radius: 20px; padding: 26px 24px; box-shadow: var(--shadow-soft); transition: transform .4s var(--ease), box-shadow .4s var(--ease); }
.atout:hover { transform: translateY(-5px); box-shadow: var(--shadow-card); }
.atout .ic { width: 48px; height: 48px; border-radius: 14px; background: var(--sable-pale); color: var(--petrole); display: flex; align-items: center; justify-content: center; margin-bottom: 16px; transition: background .35s var(--ease), color .35s; }
.atout .ic svg { width: 24px; height: 24px; stroke: currentColor; }
.atout:hover .ic { background: var(--corail-deep); color: #fff; }
.atout h4 { color: var(--petrole); font-size: 16.5px; letter-spacing: -.01em; }
.atout p { font-size: 13px; color: var(--petrole-brume); margin-top: 7px; line-height: 1.5; }
@media (max-width: 900px) { .atouts { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 560px) { .atouts { grid-template-columns: 1fr; } }
/* avantages : 4 cartes sur une ligne en desktop (au lieu du 3+1 hérité de .atouts) */
.atouts.rec-av { grid-template-columns: repeat(4,minmax(0,1fr)); }
@media (max-width: 1040px) { .atouts.rec-av { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 560px) { .atouts.rec-av { grid-template-columns: 1fr; } }
/* offres : filtres alignés à gauche */
#jobTabs { justify-content: flex-start; }
/* offres — cartes dépliables */
.job-list { display: flex; flex-direction: column; gap: 14px; }
.job { background: #fff; border-radius: 18px; box-shadow: var(--shadow-soft); overflow: hidden; transition: box-shadow .3s var(--ease); }
.job:hover { box-shadow: var(--shadow-card); }
.job-head { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: clamp(18px,2vw,24px) clamp(18px,2.2vw,26px); background: none; border: 0; cursor: pointer; text-align: left; font-family: var(--body); }
/* reset hello : `[type=button]:hover/:focus { background:#c36 }` (0,2,0, rose hors charte) battait
   notre background:none (0,1,0) — au survol ET après clic (focus) → rose à l'ouverture aussi.
   Même famille de piège que `button:hover{color:#fff}` (chips). Maquette : AUCUN fond au hover
   du head (le hover de ligne = box-shadow .job:hover, déjà en place). (2026-08-22) */
.job-head:hover, .job-head:focus { background: none; color: inherit; }
.job-ct { min-width: 0; }
.job-title { display: block; font-family: var(--font-display); font-weight: 700; font-size: clamp(18px,1.9vw,22px); color: var(--petrole); letter-spacing: -.01em; line-height: 1.12; }
.job-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-top: 9px; }
.job-meta .jm { font-size: var(--fs-meta); color: var(--petrole-brume); font-weight: 600; }
.job-meta .jsep { width: 1px; height: 12px; background: rgba(34,56,63,.2); }
.job-cat { background: var(--sable-pale); color: var(--petrole); font-weight: 700; font-size: 11px; letter-spacing: .05em; text-transform: uppercase; padding: 4px 11px; border-radius: 999px; }
.job-x { flex: none; display: inline-flex; align-items: center; gap: 8px; font-weight: 700; font-size: var(--fs-label); color: var(--corail-deep); white-space: nowrap; }
.job-x .jchev { width: 18px; height: 18px; transition: transform .35s var(--ease); }
.job.open .job-x .jchev { transform: rotate(180deg); }
.job-body { max-height: 0; overflow: hidden; transition: max-height .45s var(--ease); }
.job.open .job-body { max-height: 720px; }
.job-body-in { padding: 2px clamp(18px,2.2vw,26px) clamp(20px,2.4vw,26px); }
.job-body-in p { color: var(--petrole-brume); line-height: 1.6; }
.job-body-in h4 { font-family: var(--font-display); font-weight: 700; color: var(--petrole); margin: 15px 0 9px; font-size: 16px; }
.job-ul, .job-body-in ul { list-style: none; display: flex; flex-direction: column; gap: 9px; margin-bottom: 20px; }
.job-ul li, .job-body-in ul li { position: relative; padding-left: 28px; color: var(--petrole-brume); line-height: 1.5; }
.job-ul li b, .job-body-in ul li b { color: var(--petrole); font-weight: 700; }
.job-ul li::before, .job-body-in ul li::before { content: ""; position: absolute; left: 0; top: 2px; width: 17px; height: 17px; border-radius: 50%; background: var(--corail-pale); }
.job-ul li::after, .job-body-in ul li::after { content: ""; position: absolute; left: 6px; top: 5px; width: 4px; height: 8px; border-right: 2px solid var(--corail-deep); border-bottom: 2px solid var(--corail-deep); transform: rotate(42deg); }
/* candidature — panneau blanc sur section sable + champ fichier */
.cform--white { background: #fff; box-shadow: var(--shadow-card); }
/* .rec-file* PURGÉ (2026-08-22) : styles repris dans le gabarit .mp-cform (input[type=file] + hint ::after). */

/* ============================================================
   Page 404 (maquette styles.css l.1083-1092 — template 404.php du thème enfant).
   ============================================================ */
.nf { max-width: 700px; margin: 0 auto; text-align: center; padding: clamp(24px,7vw,90px) 0 clamp(40px,8vw,110px); }
.nf-num { font-family: var(--font-display); font-weight: 700; font-size: clamp(110px,22vw,220px); line-height: .86; letter-spacing: -.04em; background: linear-gradient(160deg,var(--sable) 0%,var(--corail-pale) 120%); -webkit-background-clip: text; background-clip: text; color: transparent; }
.nf h1 { font-size: var(--fs-h2); color: var(--petrole); line-height: 1.06; margin-top: 4px; }
.nf p { color: var(--petrole-brume); font-size: var(--fs-lead); line-height: 1.65; margin: 16px auto 0; max-width: 46ch; }
.nf-cta { margin-top: 32px; display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }
.nf-links { margin-top: 30px; font-size: 13.5px; color: var(--petrole-brume); display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; align-items: center; }
.nf-links .lbl { font-weight: 700; letter-spacing: .04em; text-transform: uppercase; font-size: var(--fs-eyebrow); }
.nf-links a { color: var(--corail-deep); font-weight: 700; position: relative; }
.nf-links a::after { content: ""; position: absolute; left: 0; right: 0; bottom: -3px; height: 1.5px; background: currentColor; transform: scaleX(0); transform-origin: left; transition: transform .3s var(--ease); }
.nf-links a:hover::after { transform: scaleX(1); }

/* ============================================================
   SKIN THELIS SIMPLEBLOCK — sélecteur de semaines réel (thelis-integration.spec.md, passe skin)
   Reskin CSS du web component <thr-simpleblock> aux tokens Montana Parc (esprit mock .bk-week).
   Périmètre : UNIQUEMENT sous `.bk` (single hébergement à paire complète) — zéro fuite.
   Méthode : chaînes Thelis reprises VERBATIM + préfixe `.bk` (+1 classe → gagne sur leur feuille
   1448.style.min.css chargée après la nôtre). AUCUN !important sauf le bouton Réserver (contre
   `.thr .btn-primary{...!important}` côté Thelis). Classes stables only (ng-if retire des nœuds,
   jamais de :nth-child). Cible = cohérence forte, pas pixel-perfect (DOM/données ≠ mock).
   ============================================================ */

/* espace titre → premier champ (retouche 2026-08-21) */
.bk h3 { margin-bottom: 14px; }
/* racine : annule le panneau gris Thelis (la carte .bk fournit déjà blanc + r-22 + ombre) */
.bk .thr-simpleblock { padding: 0; background-color: transparent; }

/* barre selects (engine) : à plat, uppercase retiré (remis ciblé sur les labels) */
.bk .thr-simpleblock .thr-simpleblock-engine { padding: 0; background: transparent; text-transform: none; }
.bk .thr-simpleblock .thr-simpleblock-engine .thr-simpleblock-engine-row { padding: 0; min-height: 0; }
/* RETOUCHE 2026-08-21 (hauteur) : label + select sur UNE rangée dans une pilule sable unique —
   le conteneur (div sans classe) porte fond + radius, le select devient transparent. */
.bk .thr-simpleblock .thr-simpleblock-engine .thr-simpleblock-engine-row.thr-simpleblock-engine-row-simple .thr-simpleblock-engine-inputs > *:has(select[ng-model="$ctrl.day"]) { display: flex; align-items: center; gap: 2px; background-color: var(--sable-pale); border-radius: 11px; padding-left: 13px; margin-inline: 4px; box-sizing: border-box; width: calc(100% - 8px); } /* calée sur les pilules visibles du haut (retrait 4px de leurs conteneurs) */
/* label (« Arrivée le ») : taille normale petrole, à gauche dans la pilule */
.bk .thr-simpleblock .thr-simpleblock-engine .thr-simpleblock-engine-row.thr-simpleblock-engine-row-simple .thr-simpleblock-engine-inputs > * > span { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--petrole-brume); }
.bk .thr-simpleblock .thr-simpleblock-engine .thr-simpleblock-engine-row.thr-simpleblock-engine-row-simple .thr-simpleblock-engine-inputs > *:has(select[ng-model="$ctrl.day"]) > span { font-family: var(--body); font-size: 14px; font-weight: 600; letter-spacing: normal; text-transform: none; color: var(--petrole); white-space: nowrap; margin: 0; }
/* selects : famille .bk-sel select — chevron data-URI (stroke = valeur du token --petrole,
   var() impossible dans une data-URI), appearance:none comme le mock, :focus natif préservé */
.bk .thr-simpleblock .thr-simpleblock-engine .thr-simpleblock-engine-row.thr-simpleblock-engine-row-simple .thr-simpleblock-engine-inputs > * select { appearance: none; -webkit-appearance: none; background-color: var(--sable-pale); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232C4A52' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 11px center; background-size: 15px 15px; border: 0; border-radius: 11px; padding: 11px 34px 11px 13px; height: auto; font-family: var(--font-display); font-weight: 700; font-size: 14px; color: var(--petrole); text-transform: none; cursor: pointer; }

.bk .thr-simpleblock .thr-simpleblock-engine .thr-simpleblock-engine-row.thr-simpleblock-engine-row-simple .thr-simpleblock-engine-inputs > *:has(select[ng-model="$ctrl.day"]) select { background-color: var(--sable-pale); padding-left: 6px; } /* PAS transparent : Chromium/Firefox teintent le PANNEAU d options avec le bg du select (constaté : panneau blanc vs beige des 2 autres) — même beige que le conteneur, invisible liste fermée */

/* onglets mois (composant sans équivalent mock — design validé) : famille .bk-week */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-months { display: none; } /* RETOUCHE 2026-08-21 (hauteur) : onglets masqués, le select mois pilote */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-months .thr-simpleblock-month { background-color: var(--sable-pale); color: var(--petrole); font-family: var(--body); font-size: 13px; font-weight: 600; text-transform: none; border-radius: 9px; padding: 8px 0; transition: background .2s; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-months .thr-simpleblock-month:hover { background-color: var(--sable-hover); }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-months .thr-simpleblock-month.thr-simpleblock-month-current, .bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-months .thr-simpleblock-month.thr-simpleblock-month-current:hover { background-color: #fff; color: var(--petrole); box-shadow: inset 0 0 0 2px var(--corail-deep); font-weight: 700; }

/* zone résultats */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results { padding-top: 14px; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays { gap: 9px; }

/* ligne semaine : carte façon .bk-week (bordures tableau Thelis annulées) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay { border: 0; background-color: var(--sable-pale); border-radius: 13px; padding: 9px 14px; transition: background .2s; display: flex; align-items: center; gap: 12px; min-height: 52px; } /* RETOUCHE 2026-08-21 : rangée unique compacte */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period.thr-simpleblock-stay-period { flex: 1; display: flex; flex-direction: column; align-items: flex-start; justify-content: center; gap: 2px; } /* classe doublée (chaîne Thelis chargée après) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period > span { display: flex; align-items: baseline; gap: 4px; margin: 0; padding: 0; } /* du/au l'un sous l'autre (retouche 2026-08-21) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period .label.label { padding: 0; margin: 0; min-width: 1.5em; text-align: left; } /* padding Thelis 2.2/6.6/3.3 parasite supprimé — « du/au » démarrent au ras du contenu */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay.unavailable { background-color: var(--sable-pale); opacity: .62; }
/* ligne d'en-tête (du/au) : PAS une carte — à plat */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row.thr-simpleblock-headers .thr-simpleblock-stay { background-color: transparent; border-radius: 0; padding: 0 14px; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row.thr-simpleblock-headers .thr-simpleblock-stay > div > div { color: var(--petrole); font-size: 13px; font-weight: 600; }

/* dates du séjour : famille .bk-week .wd */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period { color: var(--petrole); }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period .label { color: var(--petrole-brume); font-size: 11px; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period .date { color: var(--petrole); font-size: 13px; font-weight: 600; line-height: 1.3; }

/* prix : famille .bk-week .wp (le taupe gras 120% Thelis → lagune display) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-price.thr-simpleblock-stay-price.thr-simpleblock-stay-price { color: var(--petrole-brume); font-size: 10.5px; line-height: 1.3; white-space: nowrap; text-align: right; display: block; width: 100%; } /* classe TRIPLÉE : la chaîne Thelis container:not(...) > * fait (0,10,0) — leur flex rendait text-align inopérant (« A partir de » décalé de 8px) */ /* cellule prix compacte : « A partir de » serré au-dessus du prix (retouche 2026-08-21) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-price-container.thr-simpleblock-stay-price-container { padding: 0; margin: 0; flex: none; width: 92px; align-items: flex-end; justify-content: center; min-height: 0; height: auto; gap: 0; } /* colonne prix fixe 92px : effet tableau (le bloc prix démarre au même x sur toutes les lignes) */ /* width:auto : Thelis pose width:100% → la cellule prix sortait de la carte */ /* classe doublée : la chaîne Thelis (0,9,0) chargée après la nôtre gagne à égalité */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-add-to-cart-container { margin: 0 !important; padding: 0; line-height: 0; } /* 2e !important du skin : Thelis pose margin-top 1.2em sur la classe — le composant est h=0 (bouton étiré en absolu), sa marge créait 19px fantômes sous le prix */ /* padding Thelis annulé — hauteur de ligne uniforme */
/* (chaîne Thelis exacte : …-stay-price-container:not(…)>* — leur (0,9,0) exige la reprise verbatim) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-price-container:not(.thr-simpleblock-stay-unavailable) > * .thr-simpleblock-price { font-family: var(--font-display); font-weight: 700; font-size: 15px; line-height: 1.15; color: var(--lagune); display: block; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-price-container:not(.thr-simpleblock-stay-unavailable) > * .thr-simpleblock-striked-price { color: var(--petrole-brume); font-size: 11.5px; font-weight: 500; text-decoration: line-through; }

/* « Complet » (stock 0) : famille .bk-week.off .wp — .text-center est générique bootstrap → scope serré */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-price-container > .text-center { color: var(--petrole-brume); font-size: 0; font-weight: 600; } /* « Complet » court (retouche 2026-08-21) */

/* « Cette période n'est plus disponible » (passé) : italique Thelis retiré */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-price.thr-simpleblock-stay-price.thr-simpleblock-stay-unavailable { display: none; } /* message HORS FLUX : son emprise 92px fantôme poussait le bloc prix des lignes « période passée » (qui portent container + message). L inertie de la ligne vient de .unavailable sur la carte, pas du message. (0,11,0 : bat la règle prix triplée) */ /* même largeur que la colonne prix */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay.unavailable::after { content: ""; flex: none; width: 34px; height: 34px; } /* gouttière du bouton panier, vide : colonnes alignées entre lignes */ /* texte long masqué (retouche 2026-08-21, variante a) */


/* badge promo + tooltip (non observés en données réelles — stylés d'après le template, QA forcée) */
.bk .thr-simpleblock .thr-promotion .thr-promotion-block { background-color: var(--olivier-deep); color: #fff; width: auto; height: auto; padding: 4px 8px; border-radius: 7px; font-size: 12px; font-weight: 700; }
.bk .thr-simpleblock .thr-promotion .thr-promotion-description { background-color: #fff; border: 2px solid var(--sable); border-radius: var(--r-img); color: var(--petrole); box-shadow: var(--shadow-soft); }
.bk .thr-simpleblock .thr-promotion .thr-promotion-description .thr-promotion-description-name { color: var(--olivier-deep); }
.bk .thr-simpleblock .thr-promotion .thr-promotion-description .thr-promotion-description-title, .bk .thr-simpleblock .thr-promotion .thr-promotion-description .thr-promotion-description-thumbs { color: var(--petrole-brume); font-size: 14px; }

/* tooltip info prix (icône FA chargée par le loader) */
.bk .thr-simpleblock .thr-informations-price-info { color: var(--petrole-brume); }
.bk .thr-simpleblock .thr-price-information { background-color: #fff; color: var(--petrole); border-radius: var(--r-img); box-shadow: var(--shadow-soft); }

/* états transitoires */
.bk .thr-simpleblock .thr-simpleblock-loading { color: var(--petrole-brume); background-color: var(--sable-pale); border-radius: 13px; }
.bk .thr-simpleblock .thr-simpleblock-error { color: var(--petrole); background-color: var(--corail-pale); border-radius: 13px; }

/* bouton Réserver : cible .bk-go. SEUL !important du skin (contre `.thr .btn-primary{color/background !important}`
   côté Thelis). Le bouton porte `btn btn-primary` → notre .btn/.btn.btn-primary global matche AUSSI :
   toutes les propriétés visuelles sont posées ici pour que les deux jeux ne se chevauchent pas. */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay button.btn.thr-add-to-cart { background: var(--corail-deep) !important; color: #fff !important; font-family: var(--body) !important; border: 0; border-radius: 14px; padding: 12px 18px; font-weight: 700; font-size: 16px; line-height: 1.2; letter-spacing: normal; text-transform: none; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; gap: 8px; cursor: pointer; box-shadow: none; transform: none; transition: transform .25s var(--ease), box-shadow .25s; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay button.btn.thr-add-to-cart:hover, .bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay button.btn.thr-add-to-cart:focus { background: var(--corail-deep) !important; color: #fff !important; transform: translateY(-2px); box-shadow: 0 18px 36px -16px rgba(234,86,56,.7); }
/* RETOUCHE 2026-08-21 : toute la LIGNE dispo est cliquable — le bouton (porteur du ng-click
   Angular) est étiré invisible sur la carte (inset 0). CSS SEUL (leçon picker : le DOM Angular
   se reconstruit, aucun listener JS). Les lignes .unavailable restent non cliquables. */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay:not(.unavailable) { position: relative; cursor: pointer; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay:not(.unavailable)::after { content: ""; flex: none; width: 34px; height: 34px; border-radius: 10px; background: var(--corail-deep) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='21' r='1.4'/%3E%3Ccircle cx='19' cy='21' r='1.4'/%3E%3Cpath d='M2 3h3l2.6 12.5a2 2 0 0 0 2 1.5h8.8a2 2 0 0 0 2-1.5L23 7H6'/%3E%3C/svg%3E") no-repeat center / 18px 18px; } /* bouton carré corail + panier blanc — signal cliquable, décoratif (le clic = bouton étiré) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay:not(.unavailable):hover { background-color: var(--sable-hover); }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay:not(.unavailable) button.btn.thr-add-to-cart, .bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay:not(.unavailable) button.btn.thr-add-to-cart:hover, .bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay:not(.unavailable) button.btn.thr-add-to-cart:focus { position: absolute; inset: 0; width: 100%; height: 100%; background: transparent !important; color: transparent !important; font-size: 0; padding: 0; margin: 0; border-radius: 13px; box-shadow: none; transform: none; }

/* --- Layout : forcer la forme MOBILE de Thelis dans la sidebar (leurs @media regardent le
   VIEWPORT, pas le conteneur → à 1440px ils tassent la table 5 colonnes dans 336px = overflow).
   Nos règles hors MQ + préfixe .bk battent leurs règles MQ (spécificité), tous viewports. --- */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row { flex-direction: column; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays { flex-direction: column; flex-basis: auto; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay { flex-direction: row; flex-basis: auto; justify-content: space-between; align-items: center; flex-wrap: nowrap; gap: 10px; }
/* en-têtes colonnes (du/au) : inutiles en layout cartes — masquées (comportement mobile Thelis) */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row.thr-simpleblock-headers { display: none; }
/* dates dans la carte : compactes (du sam. 04 / au sam. 11), à gauche — famille .bk-week .wd */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period { display: flex; flex-direction: row; flex-basis: auto; flex-grow: 1; gap: 8px; text-align: left; align-items: center; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period .date { display: inline; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period .date.mobile { display: none; }
/* prix + bouton : à droite de la carte, empilés serrés */
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-price-container { display: flex; flex-direction: column; flex-basis: auto; width: auto; align-items: flex-end; justify-content: center; gap: 4px; margin: 0; padding: 0; text-align: right; }
.bk .thr-simpleblock .thr-simpleblock-simple .thr-simpleblock-results .thr-simpleblock-row .thr-simpleblock-stays .thr-simpleblock-stay .thr-simpleblock-stay-period > span { display: flex; gap: 4px; align-items: baseline; white-space: nowrap; }

/* ============================================================
   BLOC village/recherche-thelis (passe 1) — popovers d'édition de la resabar hero.
   État repos = maquette au pixel (l.491-496 portées, intouchées). Ici : uniquement les popovers
   cachés (aucune référence maquette — design tokens validé à l'œil, spec §Structure) + l'ancrage.
   Le popover Période (2 inputs date natifs) est le placeholder passe 1 du picker maison (passe 2).
   ============================================================ */
.resabar { position: relative; } /* ancrage des popovers (aucun effet visuel au repos) */
.resa-pop { position: absolute; top: calc(100% + 10px); left: 8px; z-index: 40; min-width: 280px; background: #fff; border-radius: 14px; box-shadow: var(--shadow-card); padding: 16px; display: flex; flex-direction: column; gap: 12px; text-align: left; }
.resa-pop[hidden] { display: none; }
.rp-step .rp-lab { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--petrole-brume); }
/* liste Durée (2026-08-21, remplace le select .rp-field) : items façon picker, scrollable */
.rp-durlist { display: flex; flex-direction: column; gap: 2px; max-height: 280px; overflow-y: auto; min-width: 176px; }
.rp-duropt { border: 0; background: transparent; text-align: left; font-family: var(--body); font-weight: 600; font-size: 14px; color: var(--petrole); padding: 9px 13px; border-radius: 9px; cursor: pointer; transition: background .15s; }
.rp-duropt:hover, .rp-duropt:focus { background: var(--sable-hover); color: var(--petrole); } /* couleur explicite : bat le reset hello button:hover{#fff} */
.rp-duropt.is-cur, .rp-duropt.is-cur:hover, .rp-duropt.is-cur:focus { background: var(--corail-deep); color: #fff; font-weight: 700; }
/* chevron du select (même data-URI que le skin widget — stroke = valeur du token --petrole) */
.rp-step { display: flex; align-items: center; justify-content: space-between; gap: 14px; }
.rp-ctr { display: flex; align-items: center; gap: 10px; }
.rp-btn { width: 32px; height: 32px; border: 0; border-radius: 50%; background: var(--sable-pale); color: var(--petrole); font-size: 17px; font-weight: 700; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background .2s; }
.rp-btn:hover, .rp-btn:focus { background: var(--sable-hover); color: var(--petrole); }
.rp-num { font-family: var(--font-display); font-weight: 700; font-size: 15px; color: var(--petrole); min-width: 18px; text-align: center; }
@media (max-width: 560px) { .resa-pop { left: 8px; right: 8px; min-width: 0; } }

/* --- Passe 2 : date-range picker maison (popover Période — spec §Passe 2, tokens only) --- */
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.resa-pop-cal { width: 560px; max-width: calc(100vw - 32px); }
.rp-cal { display: flex; flex-direction: column; gap: 10px; }
.rp-cal-head { display: flex; align-items: center; gap: 10px; }
.rp-nav:disabled { opacity: .35; cursor: default; }
.rp-nav:disabled:hover { background: var(--sable-pale); }
.rp-cal-titles { flex: 1; display: flex; justify-content: space-around; font-family: var(--font-display); font-weight: 700; font-size: 15px; color: var(--petrole); text-transform: capitalize; }
.rp-cal-months { display: flex; gap: 18px; }
.rp-month { flex: 1; min-width: 0; }
.rp-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.rp-dow { font-size: var(--fs-micro); font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--petrole-brume); text-align: center; padding: 4px 0; }
.rp-empty { height: 32px; }
.rp-day { height: 32px; border: 0; background: transparent; border-radius: 9px; font-family: var(--body); font-size: 13px; color: var(--petrole); cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; transition: background .15s; }
.rp-day:disabled { color: var(--petrole-brume); opacity: .4; cursor: default; }
/* .is-sat supprimé (contrainte samedi = erreur d'interprétation, cf. thelis-search.js) */
.rp-day:not(:disabled):hover, .rp-day:not(:disabled):focus { background: var(--sable-hover); color: var(--petrole); }
.rp-day.in-range, .rp-day.in-range:not(:disabled):hover { background: var(--sable-pale); border-radius: 0; }
.rp-day.is-begin, .rp-day.is-end, .rp-day.is-begin:not(:disabled):hover, .rp-day.is-end:not(:disabled):hover, .rp-day.is-begin:not(:disabled):focus, .rp-day.is-end:not(:disabled):focus { background: var(--corail-deep); color: #fff; font-weight: 700; border-radius: 9px; }
.rp-cal-hint { font-size: var(--fs-micro); color: var(--petrole-brume); margin: 0; }
@media (max-width: 560px) { .resa-pop-cal { width: auto; } }
.rp-day.is-begin:disabled, .rp-day.is-end:disabled { opacity: 1; cursor: default; } /* les ancres arrivée/départ restent pleines même désactivées (mode opposé) */

/* ============================================================
   FORMULAIRE CONTACT — Elementor Pro Form (docs/forms/contact.spec.md v2, mécanisme clé en main)
   Override scopé `.mp-cform` : le markup Elementor (relevé 4.2.1 : .elementor-field-group /
   -field / -field-label / -select-wrapper / -field-subgroup / -message…) reçoit les styles du
   mock .cform/.df (mêmes tokens, mêmes valeurs). Conteneurs : .contact-grid et .cform sont des
   e-flexbox → reset padding préventif (§7.5) + display grid réaffirmé (l'ordre de chargement
   des feuilles Elementor peut battre la règle .contact-grid historique).
   États d'ERREUR : aucune référence maquette (conçus aux tokens — validation à l'œil).
   ============================================================ */
.e-con.contact-grid { display: grid; padding: 0; }
.e-con.cform { display: flex; flex-direction: column; padding: clamp(26px,3.4vw,44px); }
.mp-cform.elementor-widget-form .elementor-form-fields-wrapper { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 24px; padding: 0; --e-form-fields-gap: 0px; } /* la var Elementor (défaut 10px) posait margin-bottom 10 + padding latéral 5 par groupe → rangées 25px et gouttière visuelle 25px au lieu des 15px maquette (calage 2026-08-21) */
.mp-cform.mp-cform.elementor-widget-form .elementor-field-group.elementor-field-group { display: flex; flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 7px; margin: 0; padding: 0; max-width: none; width: 100%; } /* (0,5,0) : le CSS Elementor de page (0,4,0, chargé après) posait margin-bottom 10 + padding 0 5 via --e-form-fields-gap → rangées 25px, marge bouton 47px (calage 2026-08-21) */ /* width:100% neutralise .elementor-col-50 (width:50% de la cellule) ; nowrap neutralise le flex-wrap:wrap d'Elementor qui, en colonne + hauteur étirée par la grille, fait passer le champ EN COLONNE À CÔTÉ du label */
.mp-cform.elementor-widget-form .elementor-field-group.elementor-col-100, .mp-cform.elementor-widget-form .elementor-field-type-submit { grid-column: 1 / -1; }
.mp-cform.elementor-widget-form .elementor-field-label { font-size: 12.5px; font-weight: 700; color: var(--petrole-brume); letter-spacing: .02em; }
.mp-cform.elementor-widget-form .elementor-field-label.elementor-screen-only { position: absolute; clip: rect(0 0 0 0); } /* label vide acceptance */
.mp-cform.elementor-widget-form .elementor-field-required::after { content: none; } /* pas d'astérisque maquette (novalidate visuel) */
/* astérisques OPT-IN par widget (réglage mark_required — résidentiel : la maquette LES affiche,
   `.req{color:corail}`) : Elementor les pose sur label::after, canal distinct du ::after ci-dessus */
.mp-cform.mp-cform.mp-cform .elementor-mark-required .elementor-field-label::after { content: "*"; color: var(--corail-deep); font-weight: 700; padding-left: .2em; }
/* champ UPLOAD (candidature — CV) : reprise des styles du mock .rec-file, scopés gabarit (0,4,0) */
.mp-cform.mp-cform.mp-cform input[type="file"] { width: 100%; font-family: var(--body); font-size: 14px; color: var(--petrole-brume); background: #fff; border: 1.5px solid rgba(34,56,63,.12); border-radius: 12px; padding: 10px 12px; cursor: pointer; transition: border-color .2s; }
.mp-cform.mp-cform.mp-cform input[type="file"]:hover { border-color: rgba(34,56,63,.28); }
.mp-cform.mp-cform.mp-cform input[type="file"]::file-selector-button { font-family: var(--body); font-weight: 700; font-size: 13px; color: #fff; background: var(--corail-deep); border: 0; border-radius: 999px; padding: 9px 16px; margin-right: 14px; cursor: pointer; transition: background .25s; }
.mp-cform.mp-cform.mp-cform input[type="file"]::file-selector-button:hover { background: var(--corail); }
.mp-cform.elementor-widget-form .elementor-field-type-upload::after { content: "PDF ou Word, 5 Mo max."; font-size: var(--fs-micro); color: var(--petrole-brume); opacity: .8; } /* hint maquette .rec-file-hint (le champ upload Elementor n'a pas de contrôle description) */
.mp-cform.mp-cform.mp-cform .elementor-field-textual, .mp-cform.mp-cform.mp-cform .elementor-field-textual:focus { font-family: var(--body); font-size: 15px; color: var(--petrole); background: #fff; border: 1.5px solid rgba(34,56,63,.12); border-radius: 12px; padding: 13px 15px; width: 100%; transition: border-color .2s; box-shadow: none; line-height: normal; } /* line-height: Elementor pose 1.4 (21px) → champs +3px plus hauts que la maquette (normal). TRIPLÉ (0,6,0) : le CSS de page du TEMPLATE partagé (post-379, chargé en dernier) matérialise la typo globale Elementor (Roboto) plus fort que (0,4,0) — constat devis 2026-08-21 */
.mp-cform.mp-cform.mp-cform .elementor-field-textual:focus { outline: none; border-color: var(--corail-deep); }
.mp-cform.elementor-widget-form textarea.elementor-field-textual { min-height: 120px; resize: vertical; }
.mp-cform.mp-cform.mp-cform .elementor-select-wrapper select { appearance: none; -webkit-appearance: none; -moz-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232C4A52' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 13px center; background-size: 15px 15px; padding-right: 40px; cursor: pointer; } /* TRIPLÉ comme la règle champs (déclarée avant, dont le shorthand background écraserait ce chevron à niveau inégal) */
.mp-cform.elementor-widget-form .elementor-select-wrapper .select-caret-down-wrapper { display: none; } /* caret SVG propre au widget (élément, pas ::before) : doublait notre chevron data-URI */
/* consentement : famille .cform .consent */
.mp-cform.elementor-widget-form .elementor-field-type-acceptance .elementor-field-subgroup { font-size: 13px; color: var(--petrole-brume); line-height: 1.5; }
/* le flex vit sur .elementor-field-option (c'est LUI qui contient input+label — le subgroup n'a
   qu'un enfant) : case et 1re ligne de texte alignées, comme .consent maquette (calage 2026-08-21) */
.mp-cform.elementor-widget-form .elementor-field-type-acceptance .elementor-field-option { display: flex; flex-wrap: wrap; gap: 0 11px; align-items: flex-start; } /* wrap + row-gap 0 : le message d'erreur (injecté 3e enfant de l'option) passe SOUS la rangée case+texte, écarté par son seul margin-top 4px comme les autres champs */
.mp-cform.elementor-widget-form .elementor-field-type-acceptance input { flex: none; width: 17px; height: 17px; margin-top: 1.25px; accent-color: var(--corail-deep); } /* 1.25 = (line-box 19.5 − case 17)/2 : centre de case = centre de la 1re ligne (mesuré 0.00px, 2026-08-21) */
.mp-cform.elementor-widget-form .elementor-field-type-acceptance .elementor-field-option label { font-size: 13px; color: var(--petrole-brume); line-height: 1.5; flex: 1 1 0; min-width: 0; } /* Elementor pose line-height:1 (13px) → texte désaligné de la case 17px ; flex:1 + min-width:0 : avec le wrap de l'option, le label se COMPRESSE au lieu de wrapper sous la case (390px) — seul le message d'erreur (basis 100%) passe à la ligne */
.mp-cform.elementor-widget-form .elementor-field-type-acceptance .elementor-message { flex-basis: 100%; }
/* bouton : famille .btn/.cform-go (pilule corail) */
.mp-cform.mp-cform.elementor-widget-form .elementor-field-type-submit.elementor-field-type-submit { margin-top: 7px; } /* (0,5,0) après la règle groupe : 15px de gap + 7 = 22px avant le bouton (maquette .cform-go) */
/* honeypot : son div wrapper (sans .elementor-field-group, input masqué inline) occupait une rangée
   FANTÔME de la grille → double rowGap (30px) avant le bouton (calage 2026-08-21) */
.mp-cform.elementor-widget-form .elementor-form-fields-wrapper > .elementor-field-type-text:not(.elementor-field-group) { display: none; }
.mp-cform.mp-cform.mp-cform .elementor-button, .mp-cform.mp-cform.mp-cform .elementor-button:hover, .mp-cform.mp-cform.mp-cform .elementor-button:focus { font-family: var(--body); font-weight: 700; font-size: 15px; border: 0; cursor: pointer; border-radius: 999px; padding: 13px 24px; background: var(--corail-deep); color: #fff; box-shadow: 0 14px 30px -12px rgba(234,86,56,.7); transition: transform .25s var(--ease), box-shadow .25s; width: auto; align-self: flex-start; } /* TRIPLÉ (0,4,0) : post-379.css (CSS du TEMPLATE partagé, chargé après style.css) pose `.elementor-widget-form .elementor-button[type=submit] { background: var(--e-global-color-accent) }` (vert, (0,3,0)) — à égalité il gagnait sur le devis (3e occurrence de la mécanique post-CSS : Roboto, chevrons, bouton) */
.mp-cform.mp-cform.mp-cform .elementor-button:hover, .mp-cform.mp-cform.mp-cform .elementor-button:focus { transform: translateY(-2px); box-shadow: 0 22px 42px -12px rgba(234,86,56,.85); }
/* états — SUCCÈS verbatim mock (olivier), ERREURS conçues aux tokens (aucune réf maquette) */
.mp-cform.elementor-widget-form .elementor-message::before { display: none; } /* icône eicon du widget : le mock n'en a pas (le ✓ du succès est DANS le texte verbatim) */
.mp-cform.elementor-widget-form .elementor-message.elementor-message-success { color: var(--olivier-deep); font-weight: 700; font-size: 14.5px; }
.mp-cform.elementor-widget-form .elementor-message.elementor-message-danger { color: var(--corail-deep); font-weight: 600; font-size: 13px; }
.mp-cform.elementor-widget-form .elementor-error .elementor-field-textual { border-color: var(--corail-deep); }
.mp-cform.elementor-widget-form .elementor-field-group .elementor-message { margin-top: 4px; }
@media (max-width: 760px) { .mp-cform.elementor-widget-form .elementor-form-fields-wrapper { grid-template-columns: 1fr; } }

/* ============================================================
   Corrections d'audit conversion atomique (2026-08-23).
   Deux mécaniques distinctes :
   (a) les bases atomiques h2.e-heading-base / p.e-paragraph-base (0,1,1),
       chargées APRÈS le thème, battent à égalité nos règles `classe élément`
       → re-assertion doublée à (0,2,1) ;
   (b) les styles INLINE de la maquette (marges/largeurs des sec-heads FAQ,
       wrapper faq-wrap 840px) perdus par les convertisseurs L1/L3
       → re-exprimés ici, scopés aux éléments convertis. */
.art-body.art-body h2 { margin-top: clamp(34px, 4vw, 48px); }
.art-body.art-body h3 { margin-top: 30px; }
.hb-cta.hb-cta p { margin-top: 10px; }
.feature.feature h2 { margin-top: 14px; }
/* Têtes FAQ converties des pages à faq-wrap : margin-bottom:28px inline maquette
   (hebergements.html:339, oasis-hebergements.html:285, oasis-region.html:196). */
.sec-head.fqhd293, .sec-head.fqhd310, .sec-head.fqhd344 { margin-bottom: 28px; }
/* Ces trois FAQ n'ont PAS de section dédiée dans la maquette (bloc 840px, marge
   clamp(44px,5.5vw,68px), fond de page) — le convertisseur L1 a créé section+wrap :
   on ramène le rythme et la largeur de la maquette. */
section.section:has(> .wrap > .sec-head.fqhd293),
section.section:has(> .wrap > .sec-head.fqhd310),
section.section:has(> .wrap > .sec-head.fqhd344) { padding: clamp(44px, 5.5vw, 68px) 0 0; }
section.section:has(> .wrap > .sec-head.fqhd293) > .wrap,
section.section:has(> .wrap > .sec-head.fqhd310) > .wrap,
section.section:has(> .wrap > .sec-head.fqhd344) > .wrap { max-width: calc(840px + 48px); }
/* /faq/ : marges inline des têtes de groupes (faq.html:162/169/176). */
.fqwr354 .sec-head { margin-bottom: 18px; }
.fqwr354 .faq + .sec-head { margin-top: clamp(30px, 4vw, 46px); }
/* /oasis-contact/ : marge haute du bloc faq (inline du faq-wrap maquette, wrapper non recréé
   par la conversion ; scopé page pour ne pas doubler la marge sur /contact/ non converti). */
.page-id-348 .ct-faq .faq { margin-top: clamp(28px, 3.5vw, 44px); }
/* Flèche des boutons CTA convertis (L3) : le rendu e-svg pose width:100% INLINE et
   fill="currentColor" sur la racine (flèche dessinée en trait → remplie = glyphe difforme).
   Même parade que les icônes facts L2. */
.btn .ico svg { width: 16px !important; height: 16px !important; fill: none; }
.btn-sm .ico svg { width: 14px !important; height: 14px !important; }
/* …et le wrapper .e-svg-base intermédiaire (e-div-block.ico > widget e-svg) prenait une hauteur
   de boîte de ligne (65px mesurés) qui éjectait la flèche hors de la pastille → dimensionné
   (pattern des icônes natives l.1776-1780). */
.btn .ico .e-svg-base { display: flex; flex: none; width: 16px; height: 16px; }
.btn-sm .ico .e-svg-base { width: 14px; height: 14px; }
/* …et la base e-con impose min-width:30px à la pastille (mesuré) → 26/22px maquette ré-affirmés. */
.btn .ico.ico { width: 26px; min-width: 26px; }
.btn-sm .ico.ico { width: 22px; min-width: 22px; }
/* Sweep titres 2026-08-23 (h3 CTA signalé par le dev — 11 écarts mesurés, 2 causes) :
   h3 des bandeaux CTA (base atomique bat .hb-cta h3 (0,1,1)) et `.sec-head .lead`
   (maquette styles.css:149, jamais porté — manquait aussi aux widgets html). */
.hb-cta.hb-cta h3 { margin-top: 12px; }
.sec-head .lead { margin-top: 4px; }

/* ============ §7.5 préventif LOT L5 — cartes, features, atouts, why ============
   Doublements posés EN PRÉVENTION (leçons L1-L4) contre : bases atomiques (display/
   width/min-width/margins, chargées après le thème), reset `.wrap .e-con{padding:0}`
   (paddings des cartes), rendu e-svg (width:100% inline + fill=currentColor sur la
   racine, wrapper .e-svg-base à boîte de ligne). Valeurs = maquette styles.css
   l.159-185, 555-569, 864-879, 1073-1116. */
.disc.disc, .rs-villages.rs-villages, .atouts.atouts, .feat-mosaic.feat-mosaic { display: grid; }
.disc-card.disc-card { display: flex; flex-direction: column; width: auto; min-width: 0; }
.disc-b.disc-b { display: flex; flex-direction: column; padding: 24px 24px 26px; }
.disc-b.disc-b p { margin-top: 10px; }
.disc-b .lk.lk { display: inline-flex; min-width: 0; padding: 0; margin-top: 18px; } /* pas de width:auto : la maquette étire le lk sur la colonne (flex stretch) */
.disc-b .lk svg { width: 24px !important; height: 24px !important; fill: none; stroke: currentColor; padding: 5px; }
.feat-list.feat-list { display: flex; flex-wrap: wrap; margin-top: 22px; }
.why .feat-list.feat-list { margin-top: 26px; justify-content: center; }
.feat-list .chip.chip { display: inline-flex; width: auto; min-width: 0; padding: 9px 14px; }
.feat-list .chip svg { width: 16px !important; height: 16px !important; fill: none; stroke: currentColor; }
.feat-media .pin.pin { display: inline-flex; width: auto; min-width: 0; }
.feat-media .pin svg { width: 15px !important; height: 15px !important; fill: none; stroke: currentColor; }
.atout.atout { display: block; width: auto; min-width: 0; padding: 26px 24px; }
.atout.atout p { margin-top: 7px; }
.atout .ic.ic { display: flex; width: 48px; min-width: 48px; height: 48px; }
.atout .ic svg { width: 24px !important; height: 24px !important; fill: none; stroke: currentColor; }
.disc-ph .vpill.vpill { display: inline-flex; width: auto; min-width: 0; padding: 7px 13px; }
.why.why { display: block; }
.why.why p { margin-top: 14px; }
/* la base e-svg impose 65×65 au wrapper (taille par défaut du widget) → auto + flex,
   le svg intérieur (dimensionné !important ci-dessus) fait la taille. */
.chip .e-svg-base, .pin .e-svg-base, .atout .ic .e-svg-base, .fact .ic .e-svg-base, .lk .e-svg-base { display: flex; flex: none; width: auto; height: auto; }
/* utilitaire : note des features (remplace le style inline maquette, même valeurs) */
.feat-note.feat-note { color: var(--petrole-brume); font-size: 15.5px; line-height: 1.7; margin-top: 14px; }

/* ============ §7.5 préventif LOT L7 — blocs village atomiques (bascule A2) ============
   Mêmes mécaniques que L5 : bases atomiques (display/width/margins), reset `.vcon .e-con
   { padding: 0 }` (l.1101), rendu e-svg (inline width:100% + fill=currentColor + wrapper 65×65).
   Valeurs = règles thème existantes (l.1476-1653) reprises à l'identique. */
.vhero.vhero { width: auto; /* base atomique width:100% + margin 14 = débordement 14px */ position: relative; margin: 14px; border-radius: 30px; overflow: hidden; min-height: calc(100svh - 28px); display: flex; align-items: center; justify-content: center; isolation: isolate; padding: 0; }
.vhero-in.vhero-in { padding: clamp(76px,12vh,116px) clamp(20px,4vw,40px) clamp(28px,4vw,52px); display: flex; flex-direction: column; align-items: center; gap: clamp(15px,1.9vw,22px); }
.vhero .loc.loc { display: inline-flex; width: auto; min-width: 0; }
.vhero .loc svg { width: 17px !important; height: 17px !important; fill: none; stroke: currentColor; }
.vh-media-row.vh-media-row { display: flex; width: auto; min-width: 0; margin-top: 2px; }
.vh-media.vh-media { display: inline-flex; width: auto; min-width: 0; padding: 11px 16px; }
.vh-media svg { width: 17px !important; height: 17px !important; } /* play = fill plein (voulu) */
.vh-media-row .vh-media:nth-child(2) svg { fill: none; stroke: currentColor; } /* 360° = trait */
.esprit.esprit { display: block; margin: 0 auto; text-align: center; width: auto; }
.esprit.esprit h2 { margin-top: 14px; }
.esprit.esprit p { margin-top: 18px; }
.esprit-stats.esprit-stats { display: flex; width: auto; margin-top: 38px; }
.esprit-stats > .e-con { width: auto; min-width: 0; }
.sl-head.sl-head { display: flex; flex-direction: column; align-items: center; margin-bottom: clamp(28px,3.4vw,40px); width: auto; }
.cgal.cgal { position: relative; overflow: hidden; display: block; padding: 0; }
.cgal-stage.cgal-stage { position: relative; height: clamp(360px,44vw,500px); display: block; padding: 0; }
.cgal-item.cgal-item { position: absolute; top: 0; left: 0; border-radius: 24px; overflow: hidden; display: block; padding: 0; min-width: 0; }
.cg-cap.cg-cap h4 { margin-top: 6px; }
.cg-cap.cg-cap p { margin-top: 6px; }
.gal-nav.gal-nav { display: flex; width: auto; min-width: 0; padding: 0; }
.gal-arrow.gal-arrow { width: 52px; min-width: 52px; height: 52px; padding: 0; display: flex; border-radius: 50%; }
.gal-arrow svg { width: 21px !important; height: 21px !important; fill: none; stroke: currentColor; }
.tgrid.tgrid { display: grid; }
.tcard.tcard { position: relative; overflow: hidden; padding: 28px 28px 26px; display: flex; flex-direction: column; gap: 15px; min-width: 0; }
.tcard .who.who { display: flex; width: auto; min-width: 0; padding: 0; }
.tcard .av.av { width: 46px; min-width: 46px; height: 46px; display: flex; padding: 0; }
.groups.groups { position: relative; border-radius: var(--r-card); overflow: hidden; isolation: isolate; padding: 0; }
.groups.groups h2 { margin: 16px 0 14px; }
.groups.groups p { margin-bottom: 26px; }
.final.final { position: relative; border-radius: var(--r-card); overflow: hidden; isolation: isolate; text-align: center; padding: 0; display: block; }
.final.final h2 { margin: 14px auto 16px; } /* mt14 = inline maquette (index/vfin001) */
.final.final p { margin: 0 auto 30px; }
.final .phone.phone { display: flex; width: auto; min-width: 0; margin-top: 24px; }
.final .phone svg { width: 16px !important; height: 16px !important; fill: none; stroke: currentColor; }
/* infos pratiques : liste atomique en div (e-div-block ne rend pas ul/li) — copie des règles li */
.infos-list.infos-list { display: block; margin-top: 8px; padding: 0; width: auto; }
.infos-list .il { display: flex; gap: 13px; padding: 14px 0; border-bottom: 1px solid rgba(34,56,63,.08); width: auto; }
.infos-list .il:last-child { border-bottom: 0; }
.infos-list.infos-list p { margin-top: 2px; }
.infos-list .ic svg { width: 20px !important; height: 20px !important; fill: none; stroke: currentColor; }
/* wrappers e-svg (base 65×65) des nouveaux contextes */
.loc .e-svg-base, .vh-media .e-svg-base, .gal-arrow .e-svg-base, .phone .e-svg-base, .infos-list .ic .e-svg-base { display: flex; flex: none; width: auto; height: auto; }

/* L7 — styles inline maquette re-exprimés en CSS : les styles LOCAUX atomiques ne compilent
   pas margin/min-height/display/color/background (constaté à la bascule A2 — seuls
   justify-content/text-align survivent). */
.groups.groups { min-height: 340px; display: flex; }
.final .eyebrow { color: var(--corail-pale); justify-content: center; }
.tcard .tquote { margin: 0; font-size: 17px; color: var(--encre); line-height: 1.62; flex: 1; }
.av-corail { background: var(--corail-deep); }
.av-lagune { background: var(--lagune); }
.av-olivier { background: var(--olivier-deep); }
.vhero-in .elementor-widget { width: 100%; } /* wrapper du shortcode resabar (max-width 940 sur .resabar) */

/* ============ §7.5 préventif LOT L6 — CSE, galerie aquatique, tête offres ============
   Mêmes mécaniques (bases atomiques, reset .wrap .e-con, e-svg). Les utilitaires .cse-h3 /
   .cse-list / .ali remplacent les styles inline de la maquette (cse.html / oasis-cse.html). */
.aqgal-head.aqgal-head { display: flex; width: auto; margin-bottom: 18px; }
.cse-deal.cse-deal { display: grid; padding: clamp(26px,3.4vw,44px); margin-top: clamp(34px,4vw,52px); }
.cse-per.cse-per { display: flex; flex-direction: column; width: auto; min-width: 0; }
.cse-calc.cse-calc { display: grid; margin-top: 18px; }
.cse-calc .box.box { padding: clamp(26px,3.4vw,40px); }
.cse-calc .btn { margin-top: 22px; }
/* titres intermédiaires CSE (h3 inline maquette) */
.cse-h3.cse-h3 { font-family: var(--font-display); font-weight: 700; color: var(--petrole); font-size: clamp(20px,2.2vw,25px); margin-top: clamp(40px,5vw,60px); }
/* liste avantages : variante grid inline maquette + items div (e-div-block ne rend pas ul/li) */
.art-list.cse-list { max-width: none; display: grid; grid-template-columns: 1fr 1fr; gap: 11px 36px; margin-top: 18px; padding: 0; }
.art-list .ali { position: relative; padding-left: 30px; color: var(--petrole-brume); font-size: 16px; line-height: 1.6; width: auto; }
.art-list .ali::before { content: ""; position: absolute; left: 3px; top: 8px; width: 9px; height: 9px; border-radius: 50%; background: var(--corail); }
@media (max-width: 760px) { .art-list.cse-list { grid-template-columns: 1fr; } }
/* Équivalent de `.cse-pct small` (l.1709) pour la version Elementor : le sanitiseur html-v3
   retire les `<small>` ET tous les attributs des balises inline — donc aussi un `class="sm"`
   écrit dans le contenu. `.sm` n'est PAS portée par du HTML : c'est la classe d'un widget
   `e-paragraph` natif (`settings.classes`), seule forme qui survit à un enregistrement
   éditeur. Cf. docs/migration/html-v3-classes-internes.md */
.cse-pct .sm { display: block; font-size: 14px; font-weight: 600; color: rgba(255,255,255,.82); letter-spacing: .04em; margin-top: 8px; }
.cse-note { color: var(--petrole-brume); font-size: 15.5px; line-height: 1.7; } /* p du bloc exemple CSE — sans margin-top (maquette) */

/* Têtes de section centrées (FAQ, « À découvrir aussi », activités village…) : centrage RÉEL
   du bloc titre — les boîtes h2 (18ch) / lead (54ch) restaient calées à gauche dans l'inner
   étiré (bug signalé dev 2026-08-23, même décision que .ct-faq l.1801). Classe posée par
   patch sur toutes les têtes converties à styles locaux centrés. */
.sec-head.sec-head--c { justify-content: center; }
.sec-head--c > .e-con { text-align: center; margin-inline: auto; }
.sec-head--c > .e-con > * { margin-inline: auto; }
.sec-head--c .eyebrow { justify-content: center; }
.sec-head--c > .lead { margin-inline: auto; text-align: center; }

/* ============ Lightbox médias (vidéo / 360) — chantier 2026-08-23 ============ */
.mp-lb-overlay { position: fixed; inset: 0; z-index: 99990; background: rgba(10,18,22,.88); display: flex; align-items: center; justify-content: center; padding: 4vmin; }
/* ⚠ le display:flex ci-dessus écrase l'attribut [hidden] (styles auteur > UA) → la fermeture
   posait hidden sans rien masquer (« lightbox figée », signalé dev 2026-08-24). */
.mp-lb-overlay[hidden] { display: none !important; }

/* ============ §L8 — templates singles Theme Builder (option 1a, chantier 2026-08-25) ============
   Chrome éditorial (art-cta, sec-head, FAQ, cross-village…) dans le template Elementor éditable ;
   contenu fiche via fragments [mp_single] (inc/cpt-shortcodes.php). Règles de liaison : */
/* art-cta sorti de l'article .art-body (pour être éditable) : recontraint comme dans le flux
   (720px centré) ; doublage préventif §7.5 — le reset `.wrap .e-con{padding:0}` mangeait son
   padding et les bases atomiques (0,1,1) chargées après battent `.art-cta` (0,1,0). */
.dpage .art-cta--solo.art-cta--solo { width: 100%; max-width: 720px; margin-left: auto; margin-right: auto; padding: clamp(26px,3.4vw,40px); display: flex; align-items: center; justify-content: space-between; gap: 22px; flex-wrap: wrap; }
.dpage .art-cta > .e-con:not(.btn) { width: auto; padding: 0; } /* colonne texte : la base width:100% ferait passer le bouton à la ligne */
.dpage .art-cta p { margin-top: 8px; line-height: 1.78; } /* (0,2,1) re-bat la base e-paragraph margin:0 ; line-height hérité de `.art-body p` dans le flux maquette */
.dpage .art-cta--solo h3 { margin-top: 30px; } /* hérité de `.art-body h3` dans le flux maquette (l'art-cta y était imbriqué) */
/* offres d'emploi : cible de la redirection single → #offre-<slug> ; dégage le header fixe (~80px) */
.job { scroll-margin-top: 110px; }

/* (règle de masquage auto du CTA sur fiche sans corps RETIRÉE le 2026-08-25 : le CTA est un bloc
   PAR FICHE dans son document Elementor — ce qui est dans l'éditeur est sur la page, le client
   le supprime lui-même s'il ne le veut pas.) */
/* zone libre par fiche (option A hybride) : l'adjacence wrap + alt doit traverser la zone
   (vide pour les fiches sans document Elementor propre) */
.dpage > .wrap + .zone-libre + section.alt { margin-top: clamp(36px,4.5vw,64px); }
.zone-libre.zone-libre { padding: 0; } /* padding 10px de base (hors reset .wrap .e-con) */
.zone-libre:not(:has(.elementor)) { display: none; } /* aucune trace quand la fiche n'a pas de doc */

/* — hébergement (template TB #single-hebergement) : doublages §7.5 des conteneurs chrome.
   Règle : ne re-doubler QUE ce que la base atomique (0,1,1) ou le reset `.wrap .e-con{padding:0}`
   casse, pour laisser les media queries (0,1,0) de la zone responsive single opérer. */
.dwrap.dwrap { display: grid; } /* base flex → grid réaffirmé ; colonnes/gap restent sur .dwrap (0,1,0) */
.dside.dside { display: flex; flex-direction: column; }
@media (max-width: 980px) { .dside.dside { flex-direction: row; } }
@media (max-width: 760px) { .dside.dside { flex-direction: column; } }
.bk.bk { padding: 24px; }       /* re-bat le reset .wrap .e-con */
.help.help { padding: 22px; }
.bk-trust.bk-trust { display: flex; align-items: center; justify-content: center; gap: 8px; flex-wrap: wrap; margin-top: 14px; }
.crossv.crossv { display: grid; }
.crossv-txt.crossv-txt { display: flex; flex-direction: column; justify-content: center; padding: clamp(30px,4vw,56px); }
.dpage .dsec h3 { margin-bottom: 16px; }  /* base e-heading margin:0 mangeait le margin de .dsec h3 */
.dpage .bk h3 { margin-bottom: 14px; }
.sec-crossv.section { padding-top: 0; }   /* ex `style="padding-top:0"` du template PHP */
/* parité dégradation : section/bloc chrome masqué quand son fragment fiche est vide */
.dsec-desc:not(:has(.ddesc)), .dsec-compo:not(:has(.compo)), .dsec-infos:not(:has(.infogrid)) { display: none !important; }
.sec-immersive:not(:has(.mtile)) { display: none !important; }
/* l'adjacence `.wrap + section.alt` (l.1818) doit traverser la section immersive MASQUÉE
   (en PHP elle était absente du DOM) */
.dpage > .wrap + .sec-immersive:not(:has(.mtile)) + section.alt { margin-top: clamp(36px,4.5vw,64px); }
/* e-image atomique dans .crossv-media : la base .e-image-base (0,1,1, chargée après) battait
   le `.crossv-media > img` (0,1,1) — doublé (0,2,1) */
.crossv .crossv-media > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* corrections QA L8 hébergement (bases atomiques / resets, relevé 2026-08-25) : */
.dsec.dsec { display: block; }                      /* base e-flexbox row : h3 et contenu passaient côte à côte */
.infobox.infobox { display: block; padding: clamp(22px,3vw,32px); } /* base flex + reset .wrap .e-con */
.help .btn.btn { width: 100%; }                     /* `.e-con.btn{width:auto}` (0,2,0 déclaré après) l'emportait */
.crossv .crossv-txt h2 { margin-top: 14px; }        /* base e-heading margin:0 */
.crossv .crossv-txt .loc { margin-top: 14px; }
.crossv .crossv-txt p { margin-top: 14px; }
.crossv .crossv-txt .btn { margin-top: 26px; align-self: flex-start; }
.crossv .loc .e-svg-base { width: 16px; height: 16px; } /* pin : le svg inline width:100% remplit son wrapper → on dimensionne le WRAPPER (le svg gonflait le .loc à ~300px) */
.dpage .help p { margin-top: 6px; } /* base e-paragraph margin:0 mangeait le 6px */
body.admin-bar .mp-lb-close { top: 50px; } /* sous la barre d'admin WP (32px, z-index 99999) */
.mp-lb-frame { position: relative; width: min(1100px, 100%); }
.mp-lb-box { width: 100%; aspect-ratio: 16/9; background: #000; border-radius: 14px; overflow: hidden; box-shadow: 0 40px 90px -30px rgba(0,0,0,.8); }
.mp-lb-box iframe, .mp-lb-box video { width: 100%; height: 100%; border: 0; display: block; }
/* croix : FIXE en haut à droite de l'écran (toujours visible, même si le cadre touche le bord),
   fond corail du site, X en SVG (glyphe texte = centrage dépendant de la police — signalé dev
   2026-08-24). Durci contre les styles de <button> du thème/kit (appearance/padding/font). */
.mp-lb-close, .mp-lb-close:focus { position: fixed; top: 18px; right: 18px; z-index: 2; width: 44px; height: 44px; padding: 0; margin: 0; border: 0; outline: 0; appearance: none; -webkit-appearance: none; border-radius: 50%; background: var(--corail-deep, #EA5638); color: #fff; line-height: 0; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background .25s var(--ease), transform .25s var(--ease); }
.mp-lb-close:hover { background: var(--corail, #FB6F52); transform: rotate(90deg); }
.mp-lb-close:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }
.mp-lb-close svg { width: 18px !important; height: 18px !important; display: block; fill: none; stroke: currentColor; }
html.mp-lb-open { overflow: hidden; }
/* boutons hero village : masqués au front tant que le lien n'est pas renseigné dans Elementor
   (le canvas éditeur les montre toujours — règle canvas display !important) */
.vhero a.vh-media[href="#"], .vhero a.vh-media:not([href]), .vhero .vh-media[href=""] { display: none; }
/* tuiles hébergement cliquables */
a.mtile { cursor: pointer; color: inherit; text-decoration: none; }

/* Sections formulaires (templates #379/#380 + candidature) : les conteneurs Elementor v3
   (.devis/.cform) posent un gap flex par défaut (20px) qui s'AJOUTAIT aux marges maquette
   entre eyebrow/titre/lead/formulaire (bug signalé dev 2026-08-24). Gap neutralisé + marges
   maquette ré-affirmées (styles.css:986-989, 1022-1025). */
.devis.e-con, .cform.e-con { gap: 0; }
.devis .lead.lead { margin-top: 12px; }
.cform .lead.lead { margin-top: 10px; }
.devis > .mp-cform, .devis .mp-cform.elementor-widget-form { margin-top: 26px; }
.cform > .mp-cform, .cform .mp-cform.elementor-widget-form { margin-top: 24px; }

/* ============================================================
   PILOTE TOURISME (2026-09-07) — templates TB single-post / archive-categorie.
   Règles croisant du CSS Elementor : (0,4,0) minimum (piège §5 passation) —
   d'où les préfixes .dpage .wrap / doubles classes. Hover ET focus neutralisés
   sur les liens-boutons des cartes et de la pagination (piège Hello button:hover).
   ============================================================ */

/* — date de publication (widget post-info, classe élément .art-date) — */
.dpage .wrap .art-date.elementor-widget { margin-top: 14px; }
.dpage .wrap .art-date .elementor-icon-list-item { font-size: 13px; color: var(--petrole-brume); }
.dpage .wrap .art-date .elementor-icon-list-text { color: var(--petrole-brume); }

/* — visuel de une (widget featured image, classe élément .art-cover : radius/ratio déjà portés
     par .art-cover existant) — */
.dpage .wrap .art-cover.elementor-widget img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* — corps de l'article (widget Post Content, classe élément .art-body-w) : typo du site sur
     les blocs core (wp-block-library chargé par WP ; ces règles alignent sur .art-body) — */
.dpage .wrap .art-body-w.elementor-widget { max-width: 720px; margin-top: clamp(30px,4vw,46px); }
.dpage .wrap .art-body-w.elementor-widget p { color: var(--petrole-brume); font-size: 16.5px; line-height: 1.78; margin-top: 22px; }
.dpage .wrap .art-body-w.elementor-widget h2 { font-size: var(--fs-h3); color: var(--petrole); line-height: 1.12; margin-top: clamp(34px,4vw,48px); }
.dpage .wrap .art-body-w.elementor-widget h3 { font-size: calc(var(--fs-h3) * .82); color: var(--petrole); line-height: 1.2; margin-top: clamp(26px,3vw,36px); }
.dpage .wrap .art-body-w.elementor-widget ul.wp-block-list { margin-top: 22px; padding-left: 22px; list-style: disc; }
.dpage .wrap .art-body-w.elementor-widget ul.wp-block-list li { color: var(--petrole-brume); font-size: 16.5px; line-height: 1.7; margin-top: 10px; }
.dpage .wrap .art-body-w.elementor-widget strong { color: var(--petrole); }
.dpage .wrap .art-body-w.elementor-widget a { color: var(--corail-deep); }
.dpage .wrap .art-body-w.elementor-widget a:hover,
.dpage .wrap .art-body-w.elementor-widget a:focus { color: var(--corail-deep); text-decoration: underline; }
.dpage .wrap .art-body-w.elementor-widget .wp-block-image { margin-top: clamp(26px,3vw,36px); border-radius: var(--r-card); overflow: hidden; }
.dpage .wrap .art-body-w.elementor-widget .wp-block-image img { width: 100%; height: auto; display: block; }

/* — description d'archive — */
.dpage .wrap .art-head .arch-desc p { margin-top: 14px; font-size: var(--fs-lead); color: var(--petrole-brume); line-height: 1.6; }

/* — cartes (widgets Posts / Archive Posts, skin cards, classe élément .s-artcards) :
     langage visuel des cartes la-region — HOVER aligné sur .rtile (2026-09-08) :
     mêmes transitions/valeurs (.45s/-5px/scale 1.08 .8s), overflow hidden partout,
     l'image ne sort JAMAIS du cadre — */
.section .wrap .s-artcards .elementor-post__card { border-radius: var(--r-card); overflow: hidden; box-shadow: var(--shadow-soft); background: #fff; transition: transform .45s var(--ease), box-shadow .45s var(--ease); }
.section .wrap .s-artcards .elementor-post:hover .elementor-post__card { transform: translateY(-5px); box-shadow: var(--shadow-card); }
.section .wrap .s-artcards .elementor-post__thumbnail { aspect-ratio: 16/11; overflow: hidden; }
.section .wrap .s-artcards .elementor-post__thumbnail__link { display: block; overflow: hidden; }
.section .wrap .s-artcards .elementor-post__thumbnail img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s var(--ease); }
.section .wrap .s-artcards .elementor-post:hover .elementor-post__thumbnail img { transform: scale(1.08); }
.section .wrap .s-artcards .elementor-post__badge { background: var(--corail-deep); color: #fff; font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; border-radius: 999px; padding: 5px 12px; }
.section .wrap .s-artcards .elementor-post__title,
.section .wrap .s-artcards .elementor-post__title a { font-size: var(--fs-h3); color: var(--petrole); line-height: 1.15; }
.section .wrap .s-artcards .elementor-post__excerpt p { color: var(--petrole-brume); font-size: 14.5px; line-height: 1.6; }
.section .wrap .s-artcards .elementor-post__meta-data { font-size: 12.5px; color: var(--petrole-brume); border: 0; }
.section .wrap .s-artcards .elementor-post__read-more { font-weight: 700; font-size: var(--fs-label); color: var(--corail-deep); text-transform: none; letter-spacing: normal; text-decoration: none; }
.section .wrap .s-artcards .elementor-post__read-more:hover,
.section .wrap .s-artcards .elementor-post__read-more:focus { color: var(--corail-deep); text-decoration: none; background: transparent; } /* casse et style des liens du site — pas d'uppercase, pas de soulignement au hover (correctif 2026-09-08) */

/* — pagination numérique (archive) : hover ET focus neutralisés explicitement — */
.section .wrap .s-artcards .elementor-pagination { margin-top: clamp(30px,4vw,44px); }
.section .wrap .s-artcards .elementor-pagination .page-numbers { color: var(--petrole); font-weight: 700; padding: 8px 14px; border-radius: 10px; }
.section .wrap .s-artcards .elementor-pagination .page-numbers.current { background: var(--corail-deep); color: #fff; }
.section .wrap .s-artcards .elementor-pagination a.page-numbers:hover,
.section .wrap .s-artcards .elementor-pagination a.page-numbers:focus { background: var(--sable-pale); color: var(--petrole); }

/* — titres des widgets Pro (post-title / archive-title) : le kit Elementor pose Roboto à
     spécificité supérieure au h1..h4 global (0,0,1) — réalignement tokens (constat QA pilote) — */
.dpage .wrap .art-head h1.elementor-heading-title { font-family: var(--font-display); color: var(--petrole); font-weight: 700; letter-spacing: -.03em; line-height: 1.05; text-wrap: balance; }
.dpage .wrap .art-body-w.elementor-widget h2, .dpage .wrap .art-body-w.elementor-widget h3 { font-family: var(--font-display); font-weight: 700; letter-spacing: -.025em; }

/* ==========================================================================
   LANDINGS SEO (body.lp) — couche portée VERBATIM de maquette/Landings/<slug>/styles.css
   (chantier landings passe 2, 2026-09-09). var(--display) devient var(--font-display)
   (piège Elementor v3 documenté au :root). La classe body lp est posée par le
   filtre body_class sur les pages marquées _mp_landing (cpt-shortcodes.php).
   ========================================================================== */
/* ===== landings SEO (body.lp) ===== */

/* 1. Titres de section longs (les H2 des landings sont repris tels quels) :
      on desserre le max-width:18ch de .sec-head h2, sinon 5 lignes. */
body.lp .sec-head h2{max-width:30ch}
/* Le texte juste SOUS un titre de section prend toute la largeur, en une seule
   colonne (meme choix que pour l'intro). .sec-head est un flex space-between et
   .lead est bride a 54ch : le texte tenait sur ~60% de la largeur, avec un grand
   vide a droite. On le met sur sa propre ligne, sans bride de mesure. */
body.lp .sec-head > .lead{flex:1 0 100%;max-width:none}
/* la FAQ garde son en-tete centre et resserre (voir 7) */
body.lp .lp-faq .sec-head > .lead{flex:0 1 auto;max-width:62ch}

/* 2. Deux blocs de contenu qui se suivent dans une meme section : ni .feature,
      ni .disc, ni .art-cover n'ont de marge propre, ils etaient colles (gap 0).
      Le premier bloc apres un .sec-head est exclu (celui-ci a son margin-bottom). */
body.lp .section .wrap > *:not(.sec-head) + *:not(.sec-head):not(.sec-cta){margin-top:clamp(40px,5vw,72px)}

/* 3. HERO de landing : bloc photo arrondi, contenu dans la largeur de la zone
      (le hero plein ecran reste reserve a la home et aux home de village). */
/* Bandeau sur TOUTE LA LARGEUR, comme le .vhero des pages village (retrait de
   14px, rayon de 30px), mais avec une hauteur CONTENUE au lieu de 100svh. */
/* width:auto : la base atomique e-con pose width:100%, qui ignore les marges 14px
   → bord droit à viewport+14, scroll horizontal (constaté 1440 ET 390). En auto,
   le bloc/flex-item prend conteneur moins marges, comme le header nu de la maquette. */
body.lp .lp-hero{position:relative;margin:14px;border-radius:30px;overflow:hidden;width:auto;
  isolation:isolate;min-height:clamp(340px,36vw,500px);display:flex;align-items:center}
body.lp .lp-hero>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* Voile : le texte est desormais centre verticalement, et les H1 de landing
   sont longs (l'encre va jusqu'a 90% de la largeur du bandeau sur 8 pages) :
   pas de degrade lateral seul, il les laisserait sur photo nue. Voile vertical
   regulier dans l'esprit de .vhero / .final, plancher a .46 (suffisant pour du
   blanc sur n'importe quelle photo), plus une couche laterale faible pour la
   profondeur, comme .hero-scrim2 sur les home. */
body.lp .lp-hero .lp-hscrim{position:absolute;inset:0;background:
  linear-gradient(96deg,rgba(17,28,33,.28) 0%,rgba(17,28,33,.12) 42%,
    rgba(17,28,33,0) 72%),
  linear-gradient(180deg,rgba(19,31,36,.58) 0%,rgba(19,31,36,.46) 34%,
    rgba(19,31,36,.50) 66%,rgba(17,28,33,.62) 100%)}
/* le contenu est cale sur la grille de la page via un .wrap interieur :
   le titre tombe donc au meme x que le reste de la page, pas au bord
   du bandeau. */
body.lp .lp-hero-in{position:relative;z-index:2;width:100%;
  padding-block:clamp(34px,3.4vw,50px)}
body.lp .lp-hero-in .lead{max-width:62ch}

/* En dessous de 1220px le .wrap interieur n'est plus centre : son padding de
   24px s'ajoute au retrait de 14px du bandeau, et le titre tombait 14px plus a
   droite que le reste de la page. On compense. */
@media(max-width:1268px){
  /* Le texte se retrouvait a 10px du bord arrondi : trop serre. On reduit le
     retrait du bandeau et on redonne du padding au contenu. Le total reste
     24px, donc le titre tombe toujours sur la grille de la page. */
  body.lp .lp-hero{margin:14px 8px}
  body.lp .lp-hero-in > .wrap{padding-inline:16px}
}
body.lp .lp-hero h1{color:#fff;font-size:var(--fs-h1);line-height:1.04;letter-spacing:-.03em;margin-top:14px}
body.lp .lp-hero .lead{color:rgba(255,255,255,.9);margin-top:16px;max-width:62ch}
body.lp .lp-hero .eyebrow{color:var(--corail-pale)}
body.lp .lp-hero .eyebrow::before{background:var(--corail-pale)}

/* 4bis. Chapo sous le hero. UNE seule forme pour les 18 landings : un bloc,
      UNE colonne, filet corail-deep a gauche, typo de chapo (un cran au-dessus
      du corps). Les colonnes typographiques sont proscrites ici : elles
      coupaient une meme phrase entre les deux colonnes, illisible. L'intro
      prend TOUTE la largeur de la zone en desktop (choix user : Â« pas sur une
      colonne 1/2 Â»), ce qui en fait le seul bloc de texte de la page a le
      faire. Les pages dont l'intro a deux blocs les empilent. */
body.lp .lp-lede{display:block;margin-top:clamp(34px,4.2vw,58px)}
body.lp .lp-lede .lede-p{color:var(--petrole-brume);font-size:16.5px;line-height:1.78}
body.lp .lp-lede .lede-p+.lede-p{margin-top:14px}
body.lp .lp-lede .lede-accent{font-family:var(--font-display);font-weight:600;font-size:var(--fs-h3);line-height:1.22;letter-spacing:-.01em;color:var(--petrole)}
/* le 2e bloc, quand il y en a un, se cale sous le TEXTE du 1er, pas sous le filet */
body.lp .lp-lede > * + *{margin-top:clamp(18px,2vw,26px);padding-left:clamp(18px,1.8vw,25px)}
/* Filet corail-deep a GAUCHE de toute intro de landing : c'est le marqueur du
   chapo. Il etait porte par .lede-open (11 pages), par .lede-accent (3 pages,
   mais dans la colonne de DROITE, donc pas a gauche de l'intro) et absent des
   intros en 2 colonnes simples (4 pages). Une seule regle, sur le premier bloc
   de l'intro, qui porte aussi la TYPO de chapo quel que soit son balisage
   (.lede-open, ou un <div> qui contient des .lede-p). Elle vient APRES .lede-p :
   c'est elle qui doit gagner. */
body.lp .lp-lede > *:first-child{padding-left:clamp(18px,1.8vw,25px);
  border-left:3px solid var(--corail-deep)}
body.lp .lp-lede > *:first-child,
body.lp .lp-lede > *:first-child p,
body.lp .lede-open{font-size:clamp(18px,1.85vw,21px);line-height:1.62;color:var(--petrole)}

/* Tete de ligne en gras (villes, sites) : le site source ecrit ses listes en
   Â« Lieu Â· precision : texte Â» et, sans relief, la colonne se lit comme un pave.
   Le gras seul dans la couleur du corps (--petrole-brume) ne detache pas assez,
   on remonte a la couleur pleine, comme .art-steps li b et .job-ul li b. */
body.lp p > b:first-child, body.lp li > b:first-child{color:var(--petrole);font-weight:700}

/* 4. Prose SANS titre. Etait en deux colonnes cote a cote : rejete par le user
      (Â« y en a encore en 2 colonnes Â»), au meme titre que l'intro et les leads
      de section. Une seule colonne, toute la largeur. Les blocs stackes se
      lisent comme des paragraphes qui se suivent, d'ou un gap au rythme du
      paragraphe (14px) et non au rythme d'un bloc.
      La grille 2/1 est CONSERVEE pour .lp-blocks, qui porte des titres : c'est
      elle qui donne le rythme de la page (choix user explicite). */
body.lp .lp-2col{display:grid;grid-template-columns:1fr;gap:clamp(14px,1.6vw,18px)}
/* .lp-2col ne contient jamais de titre (two_col() bascule sur .lp-blocks des
   qu'il y en a un) : regle conservee par securite si le cas apparait. */
body.lp .lp-2col h3{font-size:var(--fs-h4);color:var(--petrole);line-height:1.15;margin-bottom:12px}
body.lp .lp-2col p{color:var(--petrole-brume);font-size:16.5px;line-height:1.78}
body.lp .lp-2col p+p{margin-top:14px}
body.lp .lp-2col a.ln{color:var(--corail-deep);font-weight:600;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1.5px}
body.lp .lp-2col a.ln:hover{color:var(--corail)}
/* Repli liens nus (2026-09-17) : `class="ln"` écrite dans un contenu html-v3 ne survit pas à
   un enregistrement éditeur (le sanitiseur retire tous les attributs inline). Même habillage
   sans la classe, comme déjà fait pour `.art-body` l.1135. */
body.lp .lp-2col a:not(.btn):not(.ln){color:var(--corail-deep);font-weight:600;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1.5px}
body.lp .lp-2col a:not(.btn):not(.ln):hover{color:var(--corail)}
/* (plus de bascule mobile : la grille est deja a une colonne) */

/* 5. Bande photo arrondie sur toute la largeur de la zone : on reutilise
      .art-cover, avec une variante plus basse pour les panoramas. */
body.lp .art-cover.wide{aspect-ratio:16/6}
@media(max-width:700px){ body.lp .art-cover,body.lp .art-cover.wide{aspect-ratio:16/10} }

/* (§6 lp-ph maquette : placeholder « zone réservée » NON porté, les zones sont instanciées avec les vrais widgets) */
/* Cadrage héro du pilote : seul style inline img du corpus des 20 maquettes
   (camping-cote-d-azur, object-position:center 72%) — porté en règle scopée page. */
body.page-id-827 .lp-hero img{object-position:center 72%}

/* 7. FAQ centree dans la page, titre compris. */
body.lp .lp-faq{max-width:880px;margin-inline:auto}
body.lp .lp-faq .sec-head{flex-direction:column;align-items:center;text-align:center;gap:0}
body.lp .lp-faq .sec-head h2{max-width:26ch}
body.lp .lp-faq .sec-head .eyebrow{margin-bottom:14px}

/* 8. Titre de sous-section dans un .feature : les landings mettent un H3 (le H2
      est porte par le .sec-head), il lui faut la meme presence, un cran dessous. */
body.lp .feature h3{font-size:var(--fs-h3);margin-top:14px;line-height:1.12}
/* Paragraphes courants des .feature : la maquette les style INLINE (motif unique,
   91/91 occurrences corpus, toutes dans .feature) — encodé ici en règle, l'assembleur
   ne porte pas les attributs style des <p>. Le .lead garde son propre style. */
body.lp .feature p:not(.lead){color:var(--petrole-brume);font-size:15.5px;line-height:1.7}
body.lp .feature p+p{margin-top:14px}

/* 9. Blocs NON cliquables : ni ombre ni survol. Une carte blanche posee sur une
      ombre et qui se souleve au survol annonce un lien, or ces blocs ne pointent
      vers rien. On retire aussi le panneau blanc : prive de son ombre il
      disparaitrait sur le fond creme. Il reste la photo arrondie + le texte. */
body.lp .disc.flat .disc-card{background:transparent;box-shadow:none;transition:none;overflow:visible}
body.lp .disc.flat .disc-card:hover{transform:none;box-shadow:none}
body.lp .disc.flat .disc-ph{border-radius:var(--r-card);overflow:hidden}
body.lp .disc.flat .disc-ph img{transition:none}
body.lp .disc.flat .disc-card:hover .disc-ph img{transform:none}
body.lp .disc.flat .disc-b{padding:22px 2px 0}
body.lp .disc.flat .disc-b p{font-size:15.5px;line-height:1.7}

/* sans le padding des cartes, les 2 rangees se retrouvaient a 20px : on desserre */
body.lp .atouts.flat{gap:clamp(32px,3.6vw,46px) var(--gap-grid)}
body.lp .atouts.flat .atout{background:transparent;box-shadow:none;transition:none;padding:0}
body.lp .atouts.flat .atout:hover{transform:none;box-shadow:none}
body.lp .atouts.flat .atout:hover .ic{background:var(--sable-pale);color:var(--petrole)}

/* 10-11. Variantes d'intro supprimees. `.solo` coulait le chapo en deux colonnes
       typographiques et `.open` posait une grille 1.15fr/1fr : dans les deux cas
       une meme phrase se retrouvait coupee entre deux colonnes. Une seule forme
       desormais, voir 4bis. Les classes restent dans le HTML sans effet, le
       balisage n'a pas eu a bouger. */

/* 12. Sous-titre aplati par le site. Certaines pages source mettent un vrai
       sous-titre dans un simple <p> : il sortait donc dans la typo du corps de
       texte. On le remonte en <h4>, un cran sous le h3 du bloc. */
body.lp .lp-sub{font-family:var(--font-display);font-weight:700;font-size:18px;line-height:1.25;
  color:var(--petrole);margin-top:22px;margin-bottom:6px}
body.lp .lp-sub:first-child{margin-top:0}

/* 13. GRILLE DES BLOCS DE CONTENU.
       Deux versions ont ete rejetees avant celle-ci :
       (a) grille 2 colonnes ou le dernier bloc impair etait etale en colonnes
           TYPOGRAPHIQUES -> le texte se coupait en plein paragraphe, illisible ;
       (b) tout en lignes titre-a-gauche/texte-a-droite -> lisible, mais plus
           aucun rythme.

       Version retenue : grille a 2 colonnes (c'est elle qui donne le rythme),
       et quand le nombre de blocs est IMPAIR le dernier passe pleine largeur en
       titre-a-gauche / texte-a-droite. La ligne est remplie, le rythme 2/1 est
       marque, et le texte reste d'un seul tenant.
       Un filet en haut de chaque bloc structure la grille : un bloc plus court
       que son voisin se lit alors comme une cellule, pas comme un trou. */
/* Meme module de colonnes que .feature (1.08fr / 1fr, gap clamp(28,4vw,56)) :
   sinon la 2e colonne de la grille demarre 20px avant la colonne de texte des
   blocs image/texte, et le decalage se voit d'un bloc a l'autre. */
body.lp .lp-blocks{display:grid;grid-template-columns:1.08fr 1fr;align-content:start;
  column-gap:clamp(28px,4vw,56px);row-gap:0}
body.lp .lp-blocks > div{padding:clamp(26px,3vw,38px) 0;border-top:1px solid rgba(44,74,82,.14)}
body.lp .lp-blocks > div:nth-child(-n+2){border-top:0;padding-top:0}
body.lp .lp-blocks h3{font-size:var(--fs-h4);color:var(--petrole);line-height:1.18;
  letter-spacing:-.01em;margin-bottom:13px}
body.lp .lp-blocks p{color:var(--petrole-brume);font-size:16.5px;line-height:1.76}
body.lp .lp-blocks p + p,
body.lp .lp-blocks .art-list{margin-top:14px}
body.lp .lp-blocks a.ln{color:var(--corail-deep);font-weight:600;text-decoration:underline;
  text-underline-offset:3px;text-decoration-thickness:1.5px}
body.lp .lp-blocks a.ln:hover{color:var(--corail)}
/* Repli liens nus (2026-09-17) : `class="ln"` écrite dans un contenu html-v3 ne survit pas à
   un enregistrement éditeur (le sanitiseur retire tous les attributs inline). Même habillage
   sans la classe, comme déjà fait pour `.art-body` l.1135. */
body.lp .lp-blocks a:not(.btn):not(.ln){color:var(--corail-deep);font-weight:600;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1.5px}
body.lp .lp-blocks a:not(.btn):not(.ln):hover{color:var(--corail)}

/* Le bloc impair final occupe TOUTE la largeur de la zone, sur une seule
   colonne de texte (choix user). La mesure y est large : on ouvre donc
   l'interligne pour que l'oeil retrouve le debut de la ligne suivante. */
body.lp .lp-blocks > div:last-child:nth-child(odd){grid-column:1 / -1}
body.lp .lp-blocks > div:last-child:nth-child(odd) p{line-height:1.9}

@media(max-width:900px){
  body.lp .lp-blocks{grid-template-columns:1fr}
  body.lp .lp-blocks > div:nth-child(-n+2){border-top:1px solid rgba(44,74,82,.14);
    padding-top:clamp(26px,3vw,38px)}
  body.lp .lp-blocks > div:first-child{border-top:0;padding-top:0}
  body.lp .lp-blocks > div:last-child:nth-child(odd) p{line-height:1.76}
}

/* 14. Echelle des titres sur les landings : 44 (h2 de section) / 30 (titre de
       bloc image-texte) / 23 (titre de ligne, zone reservee) / 18 (question de
       FAQ, sous-titre, item de reassurance) / corps 17. Les items de
       reassurance etaient a 16.5, soit exactement la taille du corps : ils ne
       se lisaient pas comme des titres. */
body.lp .atouts .atout h4{font-size:18px;line-height:1.25}

/* 15. Titre qui est en fait une PHRASE (le site en met jusqu'a 105 signes) :
       au calibre d'un titre de bloc il occupe 3 lignes enormes. On descend
       d'un cran, sans le confondre avec le corps de texte. */
body.lp .feature h3.lp-long{font-size:var(--fs-h4);line-height:1.22}
/* taille RELATIVE au token : en 20px fixe, le titre long devenait plus gros
   que le titre normal sur mobile (ou --fs-h4 descend a 19px). */
body.lp .lp-blocks h3.lp-long{font-size:clamp(18px,calc(var(--fs-h4) * .86),20px);line-height:1.25}

/* fragment slider hebergements des landings (Z-TARIFS, entete=0) : fleches a droite au-dessus du track */
body.lp .hsl-frag .gal-nav{display:flex;justify-content:flex-end;margin-bottom:16px}
/* État des flèches du slider hébergements (village.js sync) : bornes du track. */
.gal-arrow.is-off{opacity:.35;pointer-events:none}

/* Icônes .fact en widget e-svg (landings) : le wrapper div.e-svg-base (block 46x65,
   svg calé haut-gauche) débordait de la pastille — ajouté au patron commun
   .chip/.pin/.atout/.lk .e-svg-base (display:flex;width:auto, §fiche hébergement).
   Le bridage 22px du svg existait déjà (.fact .ic svg !important). */


/* ============================================================================
   LOISIRS & ACTIVITÉS — listing des 2 pages village (chantier loisirs 2026-09-10,
   docs/loisirs/spec-import.md §C8). Rien de neuf côté cartes : le bloc réutilise
   .disc / .disc-card / .vpill (section « Votre résidence secondaire » de residentiel)
   et .fchip (filtres hebergements). Ne sont définis ici que la barre de filtre, la
   pastille sur photo, l'état vide, et la variante 4 colonnes de l'icon-box.
   ---------------------------------------------------------------------------- */

/* barre de filtre : chips à gauche, compteur à droite */
.lz-bar { display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; margin-bottom: 26px; }
.lz-chips { display: flex; flex-wrap: wrap; gap: 8px; }
/* mêmes rattrapages que .hb-side sur .fchip : le reset hello button:hover/:focus{#c36,#fff}
   passait le texte en blanc (maquette : changement de fond seul). Scope .lz-bar = (0,2,0). */
.lz-bar .fchip:not(.active):hover { background: var(--sable-hover); color: var(--petrole); }
.lz-bar .fchip:not(.active):focus { background: var(--sable-pale); color: var(--petrole); }
.lz-bar .fchip.active:hover { background: var(--petrole); }
.lz-count { color: var(--petrole-brume); font-size: 13.5px; white-space: nowrap; }
.lz-count b { color: var(--petrole); font-size: 15.5px; }

/* pastille sur la photo (catégorie, ou distance pour les fiches à proximité).
   Fond sable : les visuels sous la ligne de flottaison sont en `loading=lazy`, l'espace est
   réservé par l'aspect-ratio de .disc-ph — sans fond, une image pas encore chargée se lit
   comme un visuel MANQUANT (signalement 2026-09-10). Avec, elle se lit comme une attente. */
.lz .disc-ph { position: relative; background: var(--sable-pale,#F3EFE7); }
.lz-tag { position: absolute; top: 12px; left: 12px; }
/* les cartes n'ont pas de single (le CPT est une source de données) : le lien
   « En savoir plus » des fiches à proximité est le SEUL lien de la carte. */
.lz .disc-b a.lk { text-decoration: none; align-self: flex-start; }
.lz .disc-b a.lk:hover svg { background: var(--corail-deep); color: #fff; }

.lz-empty { display: none; text-align: center; padding: 40px 0 8px; color: var(--petrole-brume); }
.lz-empty .freset { margin: 14px auto 0; }

/* section « Les services » : icon-box du site en 4 COLONNES (le motif home est en 3).
   Le nombre de colonnes est un STYLE LOCAL V4 porté par la classe lz-serv-grid (donc
   modifiable dans l'éditeur, comme reassur-grid-nat sur la home) — il n'est pas ici.
   Cette règle ne fait que rendre son padding-haut à la section, qui sur la home suit
   le hero et n'en a presque pas. Même spécificité (0,2,0) que .s-reassur.s-reassur :
   elle passe parce qu'elle est plus bas dans la feuille. */
.s-reassur.lz-serv { padding-top: clamp(48px,7vw,90px); }

/* ============================================================
   PAGES DE TEXTE — `body.mp-page-texte` (classe posée dans functions.php)
   Pages servies par leur post_content, sans document Elementor : mentions légales (#837),
   déclaration d'accessibilité (#1646, importée de la prod), plan du site (#838).

   Pourquoi une section dédiée : ces pages n'ont AUCUNE règle de composant, et les fondations
   les laissent nues.
   - `body:where(.vpage) :where(h1,h2,h3,h4,p){margin:0}` (§ reset des pages intérieures)
     annule tout le rythme vertical → mesuré : titres et paragraphes à margin 0/0, les titres
     de section collés au paragraphe précédent.
   - le header est en `position:fixed` (82 px à 1440, 78 px à 390) et `main` commence à y=0
     → le <h1> et la première section passaient SOUS le header.
   - la mesure valait la pleine largeur du conteneur (1140 px), très au-delà du confort de
     lecture.
   - le reset Hello posait `#c36` (rose) sur les liens du corps — 3ᵉ fois sur ce projet.
   Scope : `body.mp-page-texte` ET `main.site-main` (le gabarit Hello par défaut) — les pages
   à document Elementor n'ont ni l'un ni l'autre.
   ============================================================ */

/* dégagement du header fixe + gouttières + respiration avant le footer.
   Valeur > hauteur du header dans les deux cas (82 / 78 px), mesurée.

   ⚠ `max-width` : le gabarit Hello plafonne `.site-main` PAR PALIERS, façon grille Bootstrap
   — `body:not([class*="elementor-page-"]) .site-main` à 500px (≥576), 600px (≥768), 800px
   (≥992), 1140px (≥1200). Conséquence mesurée : entre 768 et 991 px de viewport le contenu
   reste figé à **600 px** quelle que soit la largeur d'écran — 552 px utiles dans 900 px
   d'écran, et le plan du site retombait à UNE colonne dans 800 px de large. On remplace ces
   paliers par la largeur fluide du site (`--maxw`), qui aligne au passage ces pages sur le
   conteneur du footer. Spécificité (0,2,2) > celle du gabarit (0,2,1) : gagne à toutes les
   largeurs, les media queries n'ajoutant pas de spécificité. */
body.mp-page-texte main.site-main {
  max-width: var(--maxw);
  padding-top: clamp(104px, 8vw, 132px);
  padding-bottom: clamp(56px, 7vw, 96px);
  padding-left: clamp(20px, 4vw, 24px);
  padding-right: clamp(20px, 4vw, 24px);
}
/* le <h1> figure dans la même liste de sélecteurs du gabarit, donc sous les mêmes paliers */
body.mp-page-texte .page-header .entry-title { max-width: none; }

/* MESURE de lecture. Le bloc titre et le corps partagent la même largeur pour que le <h1>
   s'aligne sur le texte. 68ch ≈ 65-75 caractères par ligne. */
body.mp-page-texte .page-header,
body.mp-page-texte .page-content { max-width: min(68ch, 100%); margin-inline: auto; }

/* BLOC TITRE : le <h1> du thème, à la typo display de la maquette, souligné d'un filet. */
body.mp-page-texte .page-header {
  margin-bottom: clamp(28px, 3.5vw, 44px);
  padding-bottom: clamp(18px, 2.2vw, 26px);
  border-bottom: 1px solid rgba(44,74,82,.14);
}
body.mp-page-texte .page-header .entry-title {
  font-family: var(--font-display); font-weight: 700; font-size: var(--fs-h2);
  line-height: 1.12; color: var(--petrole); margin: 0;
}

/* RYTHME VERTICAL. Spécificité (0,2,1) : bat le reset `:where()` des fondations, et reste
   sous n'importe quelle règle de composant si l'une de ces pages en reçoit un jour. */
body.mp-page-texte .page-content h2,
body.mp-page-texte .page-content h3,
body.mp-page-texte .page-content h4 {
  font-family: var(--font-display); font-weight: 700; color: var(--petrole);
  line-height: 1.25; margin: 0;
}
body.mp-page-texte .page-content h2 { font-size: var(--fs-h3); margin-top: 2.1em; margin-bottom: .55em; }
body.mp-page-texte .page-content h3 { font-size: var(--fs-h4); margin-top: 1.9em; margin-bottom: .5em; }
body.mp-page-texte .page-content h4 { font-size: 17px; margin-top: 1.6em; margin-bottom: .45em; }
/* pas d'espace au-dessus du premier titre : le filet du bloc titre le sépare déjà */
body.mp-page-texte .page-content > :first-child { margin-top: 0; }

body.mp-page-texte .page-content p {
  margin: 0 0 1.05em; font-size: var(--fs-body); line-height: 1.7;
  color: var(--encre); text-wrap: pretty;
}
body.mp-page-texte .page-content p:last-child { margin-bottom: 0; }
body.mp-page-texte .page-content strong { font-weight: 700; color: var(--petrole); }

/* listes : la déclaration d'accessibilité en compte 4 (11 items) */
body.mp-page-texte .page-content ul,
body.mp-page-texte .page-content ol { margin: 0 0 1.05em; padding-left: 1.35em; }
body.mp-page-texte .page-content li { margin-bottom: .4em; line-height: 1.7; }
body.mp-page-texte .page-content li::marker { color: var(--corail-deep); }

/* LIENS du corps : le reset Hello posait #c36. Couleur déclarée explicitement, souligné
   discret, corail au survol — traitement des liens de texte du site. */
body.mp-page-texte .page-content a:link,
body.mp-page-texte .page-content a:visited {
  color: var(--petrole); text-decoration: underline;
  text-decoration-color: rgba(234,86,56,.55); text-underline-offset: 3px;
  transition: color .2s, text-decoration-color .2s;
}
body.mp-page-texte .page-content a:hover,
body.mp-page-texte .page-content a:focus-visible {
  color: var(--corail-deep); text-decoration-color: var(--corail-deep);
}

/* ANCRES : sans cela, `#donnees-personnelles` amène la section exactement sous le header
   fixe — le navigateur saute bien, mais le titre visé reste invisible (mesuré : top = 0). */
body.mp-page-texte .page-content :where(h2,h3,h4)[id] { scroll-margin-top: clamp(96px, 8vw, 124px); }

/* Bouton orphelin de GenerateBlocks : la déclaration d'accessibilité importée de la prod
   porte `<a class="gb-button">Télécharger le plan pluriannuel</a>`, dont le CSS vivait dans
   le thème de production. Sans règle il rendait comme un lien nu. Composant BESPOKE (padding
   et structure propres, pas de `.e-div-block-base` ni d'icône) plutôt que la classe globale
   `.btn`, qui est faite pour les structures atomiques V4. */
body.mp-page-texte .page-content .gb-button-wrapper { margin: 1.4em 0 1.2em; }
body.mp-page-texte .page-content a.gb-button:link,
body.mp-page-texte .page-content a.gb-button:visited {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 11px 20px; border-radius: 999px;
  background: transparent; color: var(--petrole);
  box-shadow: inset 0 0 0 1.5px rgba(44,74,82,.5);
  font-size: var(--fs-label); font-weight: 700; text-decoration: none;
  transition: transform .25s var(--ease), background .25s, color .25s, box-shadow .25s;
}
body.mp-page-texte .page-content a.gb-button:hover,
body.mp-page-texte .page-content a.gb-button:focus-visible {
  transform: translateY(-2px); background: var(--petrole); color: #fff;
  box-shadow: inset 0 0 0 1.5px var(--petrole); text-decoration: none;
}

/* PLAN DU SITE : sortie du sitemap HTML de Rank Math — 5 sections, 77 liens. Pleine largeur
   (ce n'est pas du texte courant, la mesure de lecture n'a pas d'objet) et listes en colonnes. */
body.mp-page-texte .page-content:has(.rank-math-html-sitemap) { max-width: min(var(--maxw), 100%); }
body.mp-page-texte .rank-math-html-sitemap__section { margin-bottom: clamp(30px, 4vw, 46px); }
body.mp-page-texte .rank-math-html-sitemap__title {
  font-family: var(--font-display); font-weight: 700; font-size: var(--fs-h4);
  color: var(--petrole); margin: 0 0 .7em; padding-bottom: .45em;
  border-bottom: 1px solid rgba(44,74,82,.12);
}
/* `.page-content ul` dans le sélecteur : la règle générique des listes ci-dessus est à
   (0,2,2) et gagnait sur une version à (0,2,1) — le `padding-left: 1.35em` des listes de
   texte décalait les items de 21,6 px par rapport au titre de leur section. */
body.mp-page-texte .page-content ul.rank-math-html-sitemap__list {
  list-style: none; margin: 0; padding: 0;
  columns: 3 260px; column-gap: clamp(20px, 3vw, 40px);
}
body.mp-page-texte .page-content li.rank-math-html-sitemap__item { break-inside: avoid; margin-bottom: .5em; }
body.mp-page-texte a.rank-math-html-sitemap__link:link,
body.mp-page-texte a.rank-math-html-sitemap__link:visited {
  color: var(--encre); text-decoration: none; font-size: var(--fs-label);
  transition: color .2s;
}
body.mp-page-texte a.rank-math-html-sitemap__link:hover,
body.mp-page-texte a.rank-math-html-sitemap__link:focus-visible {
  color: var(--corail-deep); text-decoration: underline; text-underline-offset: 3px;
}

/* ---- SOMMAIRE + TEXTE (pages de texte longues) --------------------------------------------
   Deux colonnes : navigation collante à gauche, texte à droite. Le sommaire est DÉRIVÉ des
   titres de section en PHP (functions.php) — le client ajoute une section, le sommaire suit.
   Il occupe la largeur que la colonne de lecture laissait vide sur grand écran.

   Le bloc de page passe à 960 px : 250 de sommaire + la gouttière + une mesure de lecture.
   Le titre partage cette largeur, pour s'aligner sur le bord gauche du sommaire. */
body.mp-page-texte main.site-main:has(.mp-somm) .page-header,
body.mp-page-texte .page-content:has(.mp-somm) { max-width: min(960px, 100%); }

body.mp-page-texte .page-content:has(.mp-somm) {
  display: grid;
  grid-template-columns: minmax(180px, 250px) minmax(0, 1fr);
  gap: clamp(28px, 4vw, 58px);
  align-items: start;
}
/* `min-width: 0` : sans lui un item de grille refuse de descendre sous la largeur de son
   contenu le plus large (une URL longue, une ligne de code) et pousse un scroll horizontal. */
body.mp-page-texte .mp-texte { min-width: 0; }
body.mp-page-texte .mp-texte > :first-child { margin-top: 0; }

/* collant sous le header fixe (82 px mesurés), pas au ras du haut de fenêtre */
body.mp-page-texte .mp-somm { position: sticky; top: clamp(98px, 8vw, 122px); }
body.mp-page-texte .mp-somm-t {
  margin: 0 0 12px; font-family: var(--font-display); font-size: var(--fs-eyebrow);
  font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: var(--petrole-brume);
}
/* `ul.mp-somm-l` : la règle générique des listes de texte est à (0,2,2) et gagnerait sinon —
   même piège que sur le sitemap (21,6 px de padding parasite). */
body.mp-page-texte .page-content ul.mp-somm-l { list-style: none; margin: 0; padding: 0; }
body.mp-page-texte .page-content li.mp-somm-i { margin: 0 0 2px; line-height: 1.45; }
body.mp-page-texte .mp-somm-l a:link,
body.mp-page-texte .mp-somm-l a:visited {
  display: block; padding: 6px 10px; margin-left: -10px; border-radius: 8px;
  font-size: var(--fs-micro); color: var(--petrole-brume);
  text-decoration: none; transition: background .2s, color .2s;
}
body.mp-page-texte .mp-somm-l a:hover,
body.mp-page-texte .mp-somm-l a:focus-visible {
  background: var(--sable-pale, #F3EFE7); color: var(--petrole); text-decoration: none;
}

/* ≤900 : une seule colonne. Le sommaire passe au-dessus du texte, en pastilles qui se
   replient — une liste verticale de 9 entrées repousserait le contenu de 250 px. */
@media (max-width: 900px) {
  /* la mesure de lecture revient : en une colonne, le bloc de 960 px donnerait des lignes de
     837 px à 900 px de viewport — plus larges que ce qu'on venait de corriger. */
  body.mp-page-texte main.site-main:has(.mp-somm) .page-header,
  body.mp-page-texte .page-content:has(.mp-somm) { max-width: min(68ch, 100%); }
  body.mp-page-texte .page-content:has(.mp-somm) { grid-template-columns: minmax(0, 1fr); }
  body.mp-page-texte .mp-somm {
    position: static; margin-bottom: clamp(24px, 4vw, 34px);
    padding-bottom: clamp(18px, 3vw, 24px); border-bottom: 1px solid rgba(44,74,82,.12);
  }
  body.mp-page-texte .page-content ul.mp-somm-l { display: flex; flex-wrap: wrap; gap: 8px; }
  body.mp-page-texte .page-content li.mp-somm-i { margin: 0; }
  body.mp-page-texte .mp-somm-l a:link,
  body.mp-page-texte .mp-somm-l a:visited {
    margin-left: 0; padding: 6px 12px; border-radius: 999px;
    background: rgba(44,74,82,.06); color: var(--petrole);
  }
}

/* ===== Chatbot Ideta (mu-plugin mp-chatbot-ideta.php, 2026-09-29) =====
   Le chat pose son lanceur (#ideta_i), sa bulle (#ideta_c) et sa fenêtre (#ideta_f) en fixed avec
   un z-index au maximum : menu mobile ouvert, ils passaient PAR-DESSUS ses liens (« Nous contacter »,
   pastilles de langue). On les masque le temps que le menu est ouvert ; ils reviennent à sa fermeture.
   !important : Ideta pilote display en style inline. */
body:has(.s-hdr-mobile.open) #ideta_i,
body:has(.s-hdr-mobile.open) #ideta_c,
body:has(.s-hdr-mobile.open) #ideta_f { display: none !important; }

/* ===== Footer — contact CSE (demande client, 2026-09-29) =====
   Le bloc .s-ftr-place-cse (footer #72, bande contact) est MASQUÉ partout. Sur la seule page /cse/
   (#352, et ses versions EN/DE servies par Linguise), la classe body mp-footer-cse (functions.php)
   masque les 2 blocs village et affiche le bloc CSE à leur place. Sélecteurs descendants (le canvas
   Elementor enveloppe les widgets). Dans l'éditeur, le bloc reste visible, en pointillés, pour être
   modifiable. */
.s-ftr .s-ftr-place-cse { display: none; }
body.mp-footer-cse .s-ftr .s-ftr-place { display: none; }
body.mp-footer-cse .s-ftr .s-ftr-place.s-ftr-place-cse { display: flex; }
body.mp-footer-cse .s-ftr .s-ftr-contact { grid-template-columns: 1fr minmax(250px,.9fr); }
@media (max-width: 1080px) { body.mp-footer-cse .s-ftr .s-ftr-contact { grid-template-columns: 1fr; } }
body.elementor-editor-active .s-ftr .s-ftr-place.s-ftr-place-cse { display: flex; outline: 1px dashed rgba(255,198,172,.55); outline-offset: 6px; }

/* Formulaires (recette QA A01, 2026-09-30) : à l'envoi d'un formulaire incomplet, Elementor Pro ajoute
   TOUJOURS le message global « Une erreur est survenue — merci de réessayer » (error_message) sous les
   messages de champ. Le visiteur ne doit voir que « Ce champ est requis. » sous chaque champ : le bloc
   global est masqué quand au moins un champ est en erreur. Une vraie panne d'envoi (aucun champ en
   erreur) affiche toujours son message. Le bloc global est un enfant direct du <form> du widget
   (markup Elementor, pas le canvas de l'éditeur). */
.elementor-form:has(.elementor-field-group.elementor-error) > .elementor-message-danger { display: none; }

/* Footer (recette QA A13, 2026-09-30) : « Avant de partir » et « Mes réservations » pointent vers « # »
   (pages pas encore écrites). Masqués sans être supprimés : classe s-ftr-link-masque posée sur les deux
   liens dans le footer #72 ; retirer la classe dans l'éditeur quand la cible existe. Visibles en
   pointillés dans l'éditeur. */
.s-ftr .s-ftr-link.s-ftr-link-masque { display: none; }
body.elementor-editor-active .s-ftr .s-ftr-link.s-ftr-link-masque { display: flex; outline: 1px dashed rgba(255,198,172,.55); outline-offset: 4px; }
