/* ==========================================================================
   Yacht In — Design system (§8 du PRD)
   Registre : luxe balnéaire, Côte d'Azur. Mobile-first strict.
   ========================================================================== */

/* --- Polices auto-hébergées (woff2 prioritaire, repli TTF) ----------------- */
@font-face {
  font-family: 'Domine';
  src: url('../fonts/domine-700.woff2') format('woff2'),
       url('../fonts/domine-700.ttf') format('truetype');
  font-weight: 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Work Sans';
  src: url('../fonts/worksans-400.woff2') format('woff2'),
       url('../fonts/worksans-400.ttf') format('truetype');
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Work Sans';
  src: url('../fonts/worksans-600.woff2') format('woff2'),
       url('../fonts/worksans-600.ttf') format('truetype');
  font-weight: 600; font-style: normal; font-display: swap;
}
@font-face {
  font-family: 'Great Vibes';
  src: url('../fonts/greatvibes-400.woff2') format('woff2'),
       url('../fonts/greatvibes-400.ttf') format('truetype');
  font-weight: 400; font-style: normal; font-display: swap;
}

/* --- Tokens ---------------------------------------------------------------- */
:root {
  --marine:  #132638;
  --marine-70: rgba(19, 38, 56, .70);
  --marine-90: rgba(19, 38, 56, .92);
  --camel:   #BB9671;
  --camel-fonce: #a67e58;
  --camel-action: #946B46;
  --camel-action-hover: #875D3B;
  --camel-pale: #F3ECE3;   /* DESIGN.md « Camel pâle » : sélection légère, survol */
  /* Camel lisible en petit corps sur fond clair : le camel signature plafonne à
     2,72:1 sur blanc et 2,42:1 sur sable, très en deçà des 4,5:1 exigés par
     WCAG AA. Réservé au TEXTE camel de petite taille (.eyebrow) ; les surfaces
     et les accents décoratifs gardent --camel. */
  --camel-texte: #8C6542;  /* 5,18:1 sur blanc · 4,61:1 sur sable */
  --whatsapp: #25D366;
  --whatsapp-hover: #1FBA59;
  --sable:   #F6F1EA;
  --blanc:   #FFFFFF;
  /* Assombri de #6A7285 le 16/08/2026 : l'ancien ton tombait à 4,29:1 sur sable,
     sous le seuil AA de 4,5:1 — or c'est la paire de texte courant la plus
     fréquente du site (toutes les sections --sable). */
  --ardoise: #656D7F;      /* 5,17:1 sur blanc · 4,60:1 sur sable */
  --ardoise-30: rgba(101, 109, 127, .30);
  /* Contour des composants interactifs (champs, puces) : WCAG 1.4.11 impose
     3:1, que --ardoise-30 n'atteint pas (1,50:1). Les filets purement
     décoratifs peuvent rester en --ardoise-30. */
  --bordure-champ: rgba(101, 109, 127, .85);  /* 3,81:1 sur blanc · 3,48:1 sur sable */

  --serif:  'Domine', 'Playfair Display', Georgia, 'Times New Roman', serif;
  --sans:   'Work Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --script: 'Great Vibes', 'Brush Script MT', cursive;

  --rayon:   12px;
  --rayon-lg: 20px;
  --ombre:   0 1px 3px rgba(19,38,56,.06), 0 8px 24px rgba(19,38,56,.06);
  --ombre-fort: 0 12px 40px rgba(19,38,56,.16);
  --transition: 220ms cubic-bezier(.4,0,.2,1);
  --largeur-max: 1240px;
  --mesure: 62ch;          /* mesure de lecture — cf. `.mesure` */
  --gouttiere: clamp(1rem, 4vw, 2.5rem);
  --espace-1: 4px;
  --espace-2: 8px;
  --espace-3: 12px;
  --espace-4: 16px;
  --espace-6: 24px;
  --espace-10: 40px;
  --z-barre-actions: 90;
  --z-cookies: 95;
  --z-menu: 99;
  --z-entete: 100;
  --z-tooltip: 110;

  /* Verre marine : fond translucide partagé par l'en-tête et le menu mobile.
     Défini une seule fois pour que les deux surfaces restent identiques —
     elles se touchent quand le menu est ouvert. */
  --verre: linear-gradient(160deg, rgba(19,38,56,.94) 0%, rgba(11,25,38,.97) 100%);
  --verre-flou: blur(20px) saturate(1.2);
}

/* --- Reset ---------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
/* Césure des mots insécables (adresses e-mail, références) : à fort
   grossissement du texte, `contact@yachtin.fr` poussait /contact et /maintenance
   en débordement horizontal. Portée volontairement limitée au **texte** :
   posée sur `body`, la règle cassait aussi les libellés d'interface — « Invités »
   se retrouvait avec son « s » sur une deuxième ligne dans la barre de recherche. */
p, li, dd, dt, blockquote, figcaption,
h1, h2, h3, h4, td, th { overflow-wrap: break-word; }

body {
  font-family: var(--sans);
  font-size: 16px;
  line-height: 1.65;
  color: var(--marine);
  background: var(--blanc);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}
img, video { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; cursor: pointer; border: none; background: none; }
ul { list-style: none; }
:focus-visible { outline: 2px solid var(--camel); outline-offset: 3px; border-radius: 4px; }

/* --- Typographie ---------------------------------------------------------- */
h1, h2, h3, h4 { font-family: var(--serif); font-weight: 700; line-height: 1.12; color: var(--marine); }
h1 { font-size: clamp(2rem, 6vw, 4rem); letter-spacing: -.02em; }
h2 { font-size: clamp(1.5rem, 4vw, 2.25rem); letter-spacing: -.01em; }
h3 { font-size: clamp(1.15rem, 2.5vw, 1.4rem); }
p  { color: var(--ardoise); }
.surtitre {
  font-family: var(--script);
  font-size: clamp(1.6rem, 4vw, 2.4rem);
  /* Sur fond clair, le camel signature n'atteint que 2,72:1 (blanc) et 2,42:1
     (sable) là où un grand texte demande 3:1. Le camel profond garde l'or de la
     signature en passant le seuil ; sur fond marine on revient au camel clair,
     qui y est déjà largement contrasté et plus lumineux. */
  color: var(--camel-fonce);
  font-weight: 400;
  line-height: 1;
  display: block;
}
.section--marine .surtitre, .hero .surtitre { color: var(--camel); }
.eyebrow {
  font-size: .78rem; letter-spacing: .22em; text-transform: uppercase;
  font-weight: 600; color: var(--camel-texte);
}

/* --- Layout utilitaires --------------------------------------------------- */
.conteneur { width: 100%; max-width: var(--largeur-max); margin-inline: auto; padding-inline: var(--gouttiere); }
.section { padding-block: clamp(3.5rem, 9vw, 7rem); }
.section--sable { background: var(--sable); }
.section--marine { background: var(--marine); color: var(--sable); }
.section--marine h2, .section--marine h3 { color: var(--blanc); }
.section--marine p { color: rgba(246,241,234,.75); }
.centre { text-align: center; }
/* Mesure de lecture, en une seule valeur : 62 signes par ligne, dans la bande
   confortable des 45–75. Quatre largeurs différentes coexistaient (56ch, 58ch,
   62ch et la largeur libre d'une colonne de grille) sans qu'aucune raison ne
   les distingue — ce qui se voit, page ouverte, comme un défaut d'alignement. */
.mesure { max-width: var(--mesure); }
.mesure.centre { margin-inline: auto; }
.entete-section { margin-bottom: clamp(2rem, 5vw, 3.5rem); }

/* --- Boutons (pilule) ----------------------------------------------------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .55em;
  min-height: 48px; padding: .75rem 1.75rem;
  border-radius: 999px; font-weight: 600; font-size: 1rem;
  transition: var(--transition); text-align: center;
  /* Pas de `white-space: nowrap` : a fort grossissement du texte, un libelle
     insecable poussait la page en debordement horizontal (WCAG 1.4.4). */
  max-width: 100%; text-wrap: balance;
}
.btn--primaire { background: var(--camel-action); color: var(--blanc); }
.btn--primaire:hover { background: var(--camel-action-hover); color: var(--blanc); transform: translateY(-2px); box-shadow: 0 8px 20px rgba(148,107,70,.35); }
.btn--secondaire { background: transparent; color: var(--marine); border: 1.5px solid var(--marine); }
.btn--secondaire:hover { background: var(--marine); color: var(--blanc); }
.btn--clair { background: var(--blanc); color: var(--marine); }
.btn--clair:hover { background: var(--sable); transform: translateY(-2px); }
.btn--fantome { color: var(--marine); padding-inline: .5rem; }
.btn--fantome:hover { color: var(--camel); }
.btn--bloc { width: 100%; }
.btn--sm { min-height: 44px; padding: .5rem 1.1rem; font-size: .9rem; }

/* --- Header --------------------------------------------------------------- */
.entete {
  position: sticky; top: 0; z-index: var(--z-entete);
  background: var(--verre); backdrop-filter: var(--verre-flou);
  color: var(--sable);
  transition: var(--transition);
}
.entete__inner { display: flex; align-items: center; justify-content: space-between; min-height: 72px; gap: 1rem; }
.logo { display: inline-flex; align-items: center; }
/* Le logo est posé sur un fond marine sombre : deux ombres portées le décollent
   sans l'encadrer — `drop-shadow` épouse l'alpha du fichier, donc suit le
   lettrage et jamais un rectangle. Ombre courte pour la profondeur, halo doré
   serré pour la chaleur. Hauteur et intensité pilotées depuis le back-office
   (Réglages → Site & design), d'où les variables. */
.logo img {
  height: var(--logo-h, 40px); width: auto;
  filter: drop-shadow(0 1px 2px rgba(0,0,0,.55))
          drop-shadow(0 0 6px rgba(187,150,113,var(--logo-halo, .12)));
}
.nav-principale { display: none; }
.nav-principale ul { display: flex; gap: 1.6rem; align-items: center; }
.nav-principale a { font-size: .95rem; color: rgba(246,241,234,.85); position: relative; padding-block: .25rem; }
.nav-principale a:hover, .nav-principale a[aria-current="page"] { color: var(--blanc); }
.nav-principale a::after {
  content: ''; position: absolute; left: 0; bottom: -2px; height: 2px; width: 0;
  background: var(--camel); transition: width var(--transition);
}
.nav-principale a:hover::after, .nav-principale a[aria-current="page"]::after { width: 100%; }
.entete__actions { display: flex; align-items: center; gap: .75rem; }

.selecteur-langue { display: flex; gap: .15rem; align-items: center; font-size: .82rem; }
.selecteur-langue a { color: rgba(246,241,234,.55); border-radius: 4px; text-transform: uppercase;
  /* WCAG 2.5.8 : 24x24 minimum. Les trois codes de langue mesuraient 17 a 22 px de large. */
  display: inline-flex; align-items: center; justify-content: center; min-width: 32px; min-height: 32px; padding: .2rem .35rem; }
.selecteur-langue a[aria-current="true"] { color: var(--blanc); font-weight: 600; }
.selecteur-langue a:hover { color: var(--camel); }

.burger {
  display: flex; flex-direction: column; justify-content: center; gap: 5px;
  width: 44px; height: 44px; color: var(--blanc);
}
.burger span { display: block; height: 2px; width: 24px; background: currentColor; transition: var(--transition); margin-inline: auto; }
.burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* --- Menu mobile ----------------------------------------------------------
   Panneau plein écran qui glisse de la droite sur un voile qui se fond, lignes
   révélées en cascade (30 ms). Pas de séparateurs : la hiérarchie vient de la
   taille, de la police et de l'espace. */
.menu-mobile { position: fixed; inset: 0; z-index: var(--z-menu); visibility: hidden; }
.menu-mobile.ouvert { visibility: visible; }

.menu-mobile__voile {
  position: absolute; inset: 0;
  background: rgba(8, 18, 28, .55); backdrop-filter: blur(3px);
  opacity: 0; transition: opacity 320ms ease;
}
.menu-mobile.ouvert .menu-mobile__voile { opacity: 1; }

.menu-mobile__panneau {
  position: absolute; inset: 0 0 0 auto; width: 100%; max-width: 30rem;
  /* Le filet de séparation se pose au milieu de cet écart : même respiration
     au-dessus et en dessous de chaque trait. */
  display: flex; flex-direction: column; gap: 1.4rem;
  padding: 5.5rem var(--gouttiere) 2rem;
  overflow-y: auto; overscroll-behavior: contain;
  color: var(--sable);
  /* Fond translucide : la page reste devinée derrière, plus premium qu'un aplat.
     Même verre que l'en-tête, avec lequel le panneau est jointif. */
  background: var(--verre); backdrop-filter: var(--verre-flou);
  box-shadow: -24px 0 60px rgba(0,0,0,.45);
  transform: translateX(100%);
  transition: transform 380ms cubic-bezier(.22,.68,.28,1);
}
.menu-mobile.ouvert .menu-mobile__panneau { transform: none; }

/* Chaque ligne entre avec son propre décalage (--i posé par le gabarit) */
.menu-mobile li, .menu-mobile__pied {
  opacity: 0; transform: translateX(18px);
  transition: opacity 300ms ease, transform 300ms cubic-bezier(.22,.68,.28,1);
}
.menu-mobile.ouvert li, .menu-mobile.ouvert .menu-mobile__pied {
  opacity: 1; transform: none;
  transition-delay: calc(120ms + var(--i, 0) * 30ms);
}

/* Entrées : même corps partout. Le regroupement (blocs séparés d'un filet) et la
   graisse portent la hiérarchie — un écart de taille cassait la cohérence. */
.menu-mobile__bloc { display: flex; flex-direction: column; gap: .15rem; }
.menu-mobile__bloc + .menu-mobile__bloc {
  padding-top: 1.4rem; border-top: 1px solid rgba(246,241,234,.12);
}
.menu-mobile__bloc a {
  display: flex; align-items: center; gap: .95rem;
  font-size: 1.05rem; line-height: 1.3; letter-spacing: .01em;
  color: rgba(246,241,234,.74); padding: .5rem 0; min-height: 48px;
  transition: var(--transition);
}
.menu-mobile__bloc--principal a { color: var(--blanc); font-weight: 600; }
.menu-mobile__bloc a:hover, .menu-mobile__bloc a[aria-current="page"] { color: var(--camel); }

.menu-mobile__ico {
  flex: 0 0 34px; height: 34px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(187,150,113,.12); color: var(--camel);
  box-shadow: inset 0 0 0 1px rgba(187,150,113,.22);
  transition: var(--transition);
}
.menu-mobile__bloc a:hover .menu-mobile__ico { background: var(--camel); color: var(--marine); }
.menu-mobile__bloc a[aria-current="page"] .menu-mobile__ico { background: rgba(187,150,113,.3); }

/* Pied : CTA pleine largeur puis les langues, chacun sur son filet */
.menu-mobile__pied {
  margin-top: auto; padding-top: 1.4rem; display: grid; gap: 1.1rem;
  border-top: 1px solid rgba(246,241,234,.12);
}

@media (prefers-reduced-motion: reduce) {
  .menu-mobile__panneau, .menu-mobile li, .menu-mobile__pied { transition: none; }
}

/* --- Hero ----------------------------------------------------------------- */
.hero { position: relative; min-height: min(88vh, 720px); display: flex; align-items: flex-end;
  color: var(--blanc); overflow: hidden; }
.hero__media { position: absolute; inset: 0; z-index: -2; }
.hero__media img { width: 100%; height: 100%; object-fit: cover; }
/* Voile très léger : on laisse voir la vidéo. Le dégradé bas est conservé mais
   resserré sur le dernier tiers — sans lui, le texte blanc et la barre de
   recherche deviennent illisibles sur les plans clairs (mer, sillage). */
.hero::after {
  content: ''; position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(to top,
    rgba(19,38,56,.62) 0%,
    rgba(19,38,56,.34) 22%,
    rgba(19,38,56,.10) 45%,
    rgba(19,38,56,.10) 100%);
}
/* Signature dorée : un reflet traverse le surtitre toutes les 13 s, comme la
   lumière sur un cadran. Le balayage n'occupe que les 18 derniers pour-cent du
   cycle (~2,3 s de mouvement, puis ~10,7 s de repos) — sinon l'effet devient
   une animation permanente, tout l'inverse de l'intention.
   Sous `@supports` : sans `background-clip: text`, le texte serait transparent
   donc invisible ; il reste alors simplement camel. */
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  .hero .surtitre {
    /* Le fond ne peint QUE la boîte de l'élément : avec `line-height: 1`, les
       hampes et jambages de Great Vibes en sortaient et disparaissaient. Cette
       interligne généreuse englobe tout le glyphe. */
    line-height: 1.55;
    /* Éclaircissement mesuré : un blanc franc claquait, on reste dans les ors. */
    background-image: linear-gradient(115deg,
      var(--camel) 0%, var(--camel) 40%,
      #dcc4a4 46%, #ecdcc2 50%, #dcc4a4 54%,
      var(--camel) 60%, var(--camel) 100%);
    background-size: 300% 100%;
    background-position: 200% 0;
    -webkit-background-clip: text; background-clip: text;
    color: transparent; -webkit-text-fill-color: transparent;
    /* Deux pistes synchronisées : le reflet qui traverse, et un halo qui s'allume
       pendant son passage — un éclat sans lueur reste plat.
       Course en `linear` : un `ease-in-out` accélère au milieu du trajet, ce qui
       donne exactement l'impression de précipitation qu'on veut éviter. */
    animation: reflet-dore 15s linear infinite, halo-dore 15s ease-in-out infinite;
  }
}
/* ~4,2 s de traversée pour ~10,8 s de repos. */
@keyframes reflet-dore {
  0%, 72% { background-position: 200% 0; }
  100%    { background-position: -100% 0; }
}
@keyframes halo-dore {
  0%, 72%, 100% { filter: drop-shadow(0 0 0 rgba(236,220,194,0)); }
  86%           { filter: drop-shadow(0 0 10px rgba(236,220,194,.3)); }
}

.hero__contenu { padding-block: clamp(1.75rem, 5vw, 4rem); max-width: 40rem; }
.hero h1 { color: var(--blanc); margin-block: .35rem .7rem; }
.hero__tagline { color: rgba(255,255,255,.9); font-size: 1.08rem; margin-bottom: 1.25rem; max-width: 34ch; }
@media (min-width: 960px) {
  /* La tagline tenait sur trois lignes courtes à côté d'un titre large */
  .hero__contenu { max-width: 46rem; }
  .hero__tagline { max-width: 52ch; font-size: 1.15rem; }
}
.hero__cta { display: flex; flex-wrap: wrap; gap: .8rem; }

/* Variante « page interne » (maintenance…) : héro plus compact, image statique.
   Le surtitre doré animé reste la signature de l'accueil — ici, .eyebrow. */
.hero--page { min-height: min(52vh, 460px); }
.hero--page .hero__media .placeholder-img { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }
.hero--page .eyebrow { color: var(--camel); }
@media (min-width: 960px) {
  .hero--page { min-height: min(60vh, 540px); }
}

/* Barre de recherche (desktop en ligne, mobile bouton) */
.recherche-hero { margin-top: 1.75rem; }
.recherche-barre { display: none; }
.recherche-barre {
  background: #fff; border-radius: 14px; overflow: hidden; /* coins arrondis appliqués au bouton */
  box-shadow: var(--ombre-fort); gap: 0; align-items: stretch; max-width: 620px;
}
.recherche-barre .champ-inline { display: flex; flex-direction: column; justify-content: center; padding: .7rem 1rem; flex: 1 1 0; min-width: 0; gap: .15rem; }
/* Les champs date ont une largeur intrinsèque (jj/mm/aaaa + icône) : sans cette
   base, le format était rogné. Les invités n'ont pas besoin d'autant de place. */
.recherche-barre .champ-inline--date { flex: 1 1 11.5ch; min-width: 11.5ch; }
.recherche-barre .champ-inline--nombre { flex: 0 1 8ch; min-width: 6ch; }
.recherche-barre label { font-size: .66rem; letter-spacing: .12em; text-transform: uppercase; color: var(--ardoise); font-weight: 600; }
/* Les champs natifs n'héritent ni de la police ni de la taille : on les aligne
   explicitement sur le reste du site (sinon date et nombre s'affichent dans
   deux polices différentes de celle du site). */
.recherche-barre input, .recherche-barre select {
  border: none; background: none; width: 100%; padding: .1rem 0;
  font-family: var(--sans); font-size: .95rem; font-weight: 500; line-height: 1.35;
  color: var(--marine); color-scheme: light;
}
.recherche-barre input[type="date"] { min-width: 0; }
.recherche-barre input::-webkit-datetime-edit { padding: 0; font-family: var(--sans); }
.recherche-barre input::-webkit-calendar-picker-indicator { opacity: .55; cursor: pointer; padding-left: .2rem; }
.recherche-barre input::placeholder { color: var(--ardoise); opacity: 1; }
.recherche-barre .sep { width: 1px; background: var(--ardoise-30); margin-block: .7rem; }
/* Bouton pleine hauteur, à ras du bord droit (les coins sont arrondis par le conteneur) */
.recherche-barre .btn {
  flex: 0 0 auto; align-self: stretch; min-height: 0; border-radius: 0;
  padding: 0 1.6rem; font-size: .95rem;
}
.recherche-barre .btn:hover { transform: none; box-shadow: none; }

/* --- Grilles & cartes ----------------------------------------------------- */
.grille { display: grid; gap: clamp(1.25rem, 3vw, 2rem); }
.grille--3 { grid-template-columns: minmax(0, 1fr); }
.grille--4 { grid-template-columns: repeat(2, 1fr); }
.grille--auto { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); }

.carte {
  background: var(--blanc); border-radius: var(--rayon); overflow: hidden;
  box-shadow: var(--ombre); transition: var(--transition); display: flex; flex-direction: column;
  border: 1px solid rgba(19,38,56,.05);
}
.carte:hover { transform: translateY(-6px); box-shadow: var(--ombre-fort); }
.carte__media { position: relative; aspect-ratio: 4/3; overflow: hidden; background: var(--sable); }
.carte__media img { width: 100%; height: 100%; object-fit: cover; transition: transform 500ms ease; }
.carte:hover .carte__media img { transform: scale(1.05); }
/* Badge discret : une pastille en verre dépoli plutôt qu'un gros bloc camel qui
   écrasait la photo et empiétait sur le sujet. */
.carte__badge {
  position: absolute; top: .7rem; left: .7rem; z-index: 2;
  background: rgba(19,38,56,.78); color: var(--blanc);
  font-size: .6rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
  padding: .22rem .55rem; border-radius: 999px;
  backdrop-filter: blur(4px); box-shadow: inset 0 0 0 1px rgba(255,255,255,.16);
}
.carte__corps { padding: .95rem 1.05rem 1.1rem; display: flex; flex-direction: column; flex: 1; gap: .45rem; }
/* Deux lignes réservées au titre : les cartes d'une même rangée gardent leurs
   specs, prix et bouton alignés même quand un nom déborde. */
.carte__titre {
  font-size: 1.05rem; line-height: 1.25; min-height: calc(2 * 1.25em);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
/* Toujours lisible, même dans une section marine (la carte reste blanche). */
.carte__titre a { color: var(--marine); text-decoration: none; }
.carte__titre a:hover { color: var(--camel-fonce); }
.carte__specs { display: flex; flex-wrap: wrap; gap: .25rem .75rem; font-size: .76rem; color: var(--ardoise); }
.carte__specs span { display: inline-flex; align-items: center; gap: .28rem; white-space: nowrap; }
.carte__specs svg { opacity: .7; }
.carte__pied { margin-top: auto; padding-top: .75rem; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .5rem; border-top: 1px solid rgba(19,38,56,.06); }
/* Prix sur une seule ligne (« À partir de 18 000 € / jour » tenait sur trois) */
.carte__prix { line-height: 1.15; min-width: 0; }
.carte__prix small { display: block; font-size: .66rem; letter-spacing: .06em; text-transform: uppercase; color: var(--ardoise); }
.carte__prix b { font-family: var(--serif); font-size: 1.12rem; color: var(--marine); }
.carte__prix .carte__unite { display: inline; font-size: .7rem; text-transform: none; letter-spacing: 0; }
.carte__actions { display: flex; gap: .4rem; }

.placeholder-img {
  display: flex; align-items: center; justify-content: center; height: 100%;
  background: linear-gradient(135deg, var(--sable), #e8ddd0);
  /* Le repli porte le nom de la fiche : c'est du contenu, pas un ornement.
     Le camel signature n'y tenait que 2,42:1 pour un seuil de 3:1. */
  color: var(--camel-texte); font-family: var(--script); font-size: 2rem;
}

/* --- Rail : rangée de cartes défilante (accueil) --------------------------
   Défilement natif à toutes les tailles (doigt, trackpad, flèches) plutôt qu'une
   grille figée qui tronquait la flotte à ce qui tenait dans la ligne. Les cartes
   gardent une largeur fixe : la dernière dépasse légèrement du cadre, ce qui
   signale qu'il y a une suite. */
.rail { position: relative; }
.rail__piste {
  display: flex; gap: 1rem;
  overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth;
  overscroll-behavior-x: contain; -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  /* déborde des gouttières pour que le défilement parte du bord de l'écran */
  margin-inline: calc(-1 * var(--gouttiere)); padding-inline: var(--gouttiere);
  /* `overflow-x: auto` force le rognage vertical : cette marge intérieure laisse
     passer le soulèvement et l'ombre des cartes au survol. */
  padding-block: 1rem 1.4rem;
}
.rail__piste::-webkit-scrollbar { display: none; }
.rail__piste:focus-visible { outline: 2px solid var(--camel); outline-offset: 4px; border-radius: 4px; }
.rail__item { scroll-snap-align: start; flex: 0 0 78%; max-width: 300px; display: flex; }
.rail__item > .carte { width: 100%; }

.rail__fleche {
  display: none; position: absolute; top: calc(50% - .9rem); transform: translateY(-50%);
  width: 40px; height: 40px; border-radius: 50%; z-index: 3;
  background: var(--blanc); color: var(--marine);
  box-shadow: var(--ombre-fort); border: 1px solid rgba(19,38,56,.06);
  align-items: center; justify-content: center; transition: var(--transition);
}
.rail--defilable .rail__fleche { display: flex; }
.rail__fleche:hover { background: var(--camel); color: var(--blanc); }
.rail__fleche[disabled] { opacity: 0; pointer-events: none; }
.rail__fleche--prec { left: calc(-1 * var(--gouttiere) / 2); }
.rail__fleche--suiv { right: calc(-1 * var(--gouttiere) / 2); }

/* --- Catégories (accueil) ------------------------------------------------- */
.cat-carte { position: relative; border-radius: var(--rayon); overflow: hidden; aspect-ratio: 3/4;
  display: flex; align-items: flex-end; color: var(--blanc); }
.cat-carte img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: -1; }
.cat-carte::after { content:''; position: absolute; inset: 0; background: linear-gradient(to top, var(--marine-90), transparent 70%); z-index: -1; }
.cat-carte__corps { padding: 1.4rem; }
.cat-carte h3 { color: var(--blanc); margin-bottom: .2rem; }
.cat-carte p { color: rgba(255,255,255,.8); font-size: .85rem; }

/* --- Bandeau confiance ---------------------------------------------------- */
.confiance { display: grid; gap: 1.5rem; grid-template-columns: minmax(0, 1fr); }
.confiance__item { display: flex; gap: 1rem; align-items: flex-start; }
/* La typographie du bandeau appartient au composant. Elle vivait en style inline
   sur l'accueil et Maintenance, et manquait sur Location : le titre y prenait la
   taille par défaut d'un <h2> et écrasait la rangée. Un seul endroit désormais,
   les trois pages sont identiques par construction. */
.confiance__item h2, .confiance__item h3 { font-size: 1.05rem; margin-bottom: .2rem; }
.confiance__item p { font-size: .88rem; }
.confiance__ico { flex: 0 0 auto; width: 48px; height: 48px; border-radius: 50%; background: var(--sable);
  display: flex; align-items: center; justify-content: center; color: var(--camel); }
.confiance__ico svg { width: 24px; height: 24px; }

/* --- Filtres catalogue ---------------------------------------------------- */
.catalogue-tete { display: flex; flex-direction: column; gap: 1rem; margin-bottom: 1.5rem; }
.filtres { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; }
.filtres select, .filtres input {
  min-height: 44px; padding: .5rem .9rem; border: 1px solid var(--bordure-champ);
  border-radius: 999px; font-size: .9rem; background: var(--blanc); color: var(--marine);
}
.filtres select:focus, .filtres input:focus { border-color: var(--camel); outline: none; box-shadow: 0 0 0 3px rgba(187,150,113,.18); }
.filtres-compte { font-size: .88rem; color: var(--ardoise); margin-left: auto; }
.puce-filtre { display:inline-flex; align-items:center; gap:.4rem; background: var(--sable); border-radius:999px; padding:.35rem .8rem; font-size:.82rem; }
.puce-filtre button { color: var(--ardoise); font-size: 1rem; line-height: 1; }

/* --- Fiche bateau --------------------------------------------------------- */
.fiche-hero { display: grid; gap: 0; }
/* `--miniatures-h` = hauteur exacte du rail de vignettes (vignette + bordures +
   padding). Elle sert à caler le filtre de catégories juste au-dessus du rail,
   c'est-à-dire au bas de la PHOTO : le filtre est en surimpression dans
   `.galerie`, dont le bas est celui des miniatures, pas celui de l'image.
   Les trois valeurs ci-dessous sont reprises telles quelles par
   `.galerie__miniatures` — les modifier ensemble. */
.galerie { position: relative; background: var(--marine);
  --miniatures-h: calc(54px + 4px + 1.2rem); }

/* Piste défilante : le swipe mobile est le défilement natif (scroll-snap), donc
   fluide, avec inertie, et fonctionnel même sans JavaScript. */
.galerie__piste {
  position: relative; /* offsetParent des vues : offsetLeft = position dans la piste (JS) */
  display: flex;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.galerie__piste::-webkit-scrollbar { display: none; }
.galerie__vue { flex: 0 0 100%; scroll-snap-align: center; aspect-ratio: 16/10; overflow: hidden; }
.galerie__vue img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Flèches : inutiles sans JS (le doigt et le trackpad suffisent) → révélées par
   `galerie--interactive`, posée par app.js. Masquées au survol tactile. */
/* Le disque visible descend à 36 px, mais le bouton en garde 44 : le padding
   reste dans la cible tactile et `background-clip: content-box` empêche le fond
   de s'y étendre. Réduire `width` aurait rogné la zone de tap sous le plancher
   que DESIGN.md impose. */
.galerie__fleche {
  display: none;
  position: absolute; top: calc(50% - 2.2rem); transform: translateY(-50%);
  width: 44px; height: 44px; padding: 4px; border-radius: 999px;
  background: rgba(19, 38, 56, .55); background-clip: content-box; color: #fff;
  align-items: center; justify-content: center;
  backdrop-filter: blur(3px); transition: var(--transition);
}
.galerie--interactive .galerie__fleche { display: flex; }
.galerie__fleche:hover { background: var(--camel); }
.galerie__fleche[disabled] { opacity: .3; pointer-events: none; }
.galerie__fleche--prec { left: .6rem; }
.galerie__fleche--suiv { right: .6rem; }

.galerie__compteur {
  position: absolute; top: .8rem; right: .8rem;
  background: rgba(19, 38, 56, .6); color: #fff;
  font-size: .75rem; font-variant-numeric: tabular-nums;
  padding: .2rem .6rem; border-radius: 999px;
}

/* `safe center` : les miniatures sont centrées tant qu'elles tiennent, et
   repassent à gauche dès qu'elles débordent — un `center` seul rendrait le
   début de la piste inatteignable au défilement. */
.galerie__miniatures { display: flex; gap: .5rem; overflow-x: auto; padding: .6rem;
  background: var(--marine); justify-content: safe center; }
.galerie__miniatures button { flex: 0 0 72px; height: 54px; border-radius: 6px; overflow: hidden; opacity: .55; transition: var(--transition); border: 2px solid transparent; }
.galerie__miniatures button.actif, .galerie__miniatures button:hover { opacity: 1; border-color: var(--camel); }
.galerie__miniatures img { width: 100%; height: 100%; object-fit: cover; }
.galerie__miniatures button[hidden] { display: none; }

/* Filtre par catégorie : en surimpression au BAS DE LA PHOTO, centré. Dans le
   flux, il épaississait le bandeau marine ; en haut, il masquait le sujet.
   `bottom` part de la hauteur des miniatures (cf. `--miniatures-h`) parce que
   le bas de `.galerie` est celui du rail, pas celui de l'image.
   Puces claires, la sélection prend le camel signature comme partout ailleurs. */
.galerie__filtres { position: absolute; z-index: 2; left: 50%; transform: translateX(-50%);
  bottom: calc(var(--miniatures-h) + .7rem);
  display: flex; flex-wrap: nowrap; gap: .35rem;
  max-width: calc(100% - 1.4rem);
  /* Une seule ligne, quitte à défiler : sur un téléphone, quatre catégories
     passaient à la ligne et empilaient deux rangées de puces sur la photo.
     `safe center` centre tant que ça tient et bascule à gauche au débordement,
     sinon le début du rail serait inatteignable. */
  justify-content: safe center; overflow-x: auto; scrollbar-width: none; }
.galerie__filtres::-webkit-scrollbar { display: none; }
.galerie__filtre { flex: 0 0 auto; min-height: 32px; padding: .3rem .7rem; border-radius: 999px;
  border: 1px solid rgba(246,241,234,.22); background: var(--marine-90); color: var(--sable);
  font-size: .72rem; font-weight: 600; white-space: nowrap;
  transition: color var(--transition), background var(--transition), border-color var(--transition); }
@media (min-width: 760px) { .galerie__filtre { font-size: .78rem; padding: .3rem .85rem; } }
.galerie__filtre:hover { border-color: var(--camel); }
.galerie__filtre.est-actif { background: var(--camel); border-color: var(--camel); color: var(--marine); }

/* Agrandissement : la photo entière est le bouton.
   La pastille posée en bas à droite mangeait un coin de l'image pour redire ce
   que le curseur `zoom-in` dit déjà. Elle disparaît, mais **pas le bouton** :
   c'est lui qui porte le nom accessible et l'accès clavier. Une `<img>` seule,
   même cliquable, ne se tabule pas. Il devient donc un calque transparent posé
   sur toute la photo — invisible, mais focusable et annoncé.
   Il n'existe que si le script a pu l'activer (rendu `hidden` côté serveur). */
.galerie__vue { position: relative; }
.galerie__vue[hidden] { display: none; }
.galerie__zoom { position: absolute; inset: 0; z-index: 2; width: 100%; height: 100%;
  background: none; border: 0; cursor: zoom-in; }

/* Visionneuse plein écran (<dialog> natif : Échap, voile et piège de focus
   sont gérés par le navigateur). */
.zoom { width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh;
  padding: 0; border: 0; background: rgba(9,18,28,.94); color: var(--sable); }
.zoom[open] { display: flex; flex-direction: column; }
.zoom::backdrop { background: rgba(9,18,28,.94); }
.zoom__figure { flex: 1; min-height: 0; display: grid; grid-template-rows: minmax(0, 1fr) auto; gap: .9rem;
  margin: 0; padding: clamp(1rem, 4vw, 2.5rem);
  /* Le balayage horizontal est à nous, le zoom à deux doigts reste au navigateur. */
  touch-action: pan-y pinch-zoom; }
.zoom__figure img { width: 100%; height: 100%; object-fit: contain;
  transition: transform 180ms ease-out, opacity 180ms ease-out; }
/* Pendant le geste, l'image colle au doigt : aucune transition ne doit traîner. */
.zoom__figure img.glisse { transition: none; }
.zoom__legende { display: flex; flex-wrap: wrap; justify-content: center; gap: .6rem;
  font-size: .85rem; color: rgba(246,241,234,.75); text-align: center; }
.zoom__fermer, .zoom__fleche { position: absolute; z-index: 2; display: grid; place-items: center;
  width: 48px; height: 48px; border-radius: 50%; background: rgba(246,241,234,.12);
  color: var(--sable); border: 1px solid rgba(246,241,234,.2);
  transition: background var(--transition), color var(--transition); }
.zoom__fermer:hover, .zoom__fleche:hover { background: var(--camel); color: var(--marine); }
.zoom__fleche[disabled] { opacity: .25; pointer-events: none; }
.zoom__fermer { top: 1rem; right: 1rem; }
.zoom__fleche--prec { left: 1rem; top: 50%; transform: translateY(-50%); }
.zoom__fleche--suiv { right: 1rem; top: 50%; transform: translateY(-50%); }

/* Bande de miniatures du plein écran : elle évite d'avoir à fermer la visionneuse
   pour changer de photo. Construite par le script, jamais rendue côté serveur. */
.zoom__miniatures { position: relative; display: flex; flex: 0 0 auto; gap: .4rem;
  justify-content: safe center; overflow-x: auto; overscroll-behavior-x: contain;
  padding: 0 clamp(1rem, 4vw, 2.5rem) clamp(.75rem, 3vw, 1.5rem); scrollbar-width: none; }
.zoom__miniatures::-webkit-scrollbar { display: none; }
.zoom__vignette { flex: 0 0 72px; height: 54px; padding: 0; overflow: hidden;
  border: 2px solid transparent; border-radius: 6px; background: rgba(246,241,234,.08);
  opacity: .55; transition: opacity var(--transition), border-color var(--transition); }
.zoom__vignette img { width: 100%; height: 100%; display: block; object-fit: cover; }
.zoom__vignette:hover, .zoom__vignette.actif { opacity: 1; border-color: var(--camel); }
.zoom__vignette[hidden] { display: none; }
/* Les planches ne sont pas des photos : ratios de 482×191 à 1097×1950, souvent
   détourées. Un recadrage en `cover` n'en montrerait qu'un fragment illisible. */
.zoom__miniatures--planches .zoom__vignette img { object-fit: contain; }
.zoom__miniatures--planches .zoom__vignette { background: rgba(246,241,234,.92); }
@media (prefers-reduced-motion: reduce) {
  /* Le geste continue de fonctionner : seul le retour animé de l'image disparaît. */
  .zoom__figure img { transition: none; }
}

/* --- Plans d'amenagement (fiches de vente) ---------------------------------
   Fond blanc et cadre blanc : la moitie des plans sont des PNG detoures, l'autre
   des JPEG a fond blanc. Poses sur blanc, les deux origines rendent pareil ; la
   bordure fine, et non un contraste de fond, delimite la planche.
   Les sources sont petites (de 482x191 a 1000 px de large apres conversion) :
   `max-width` est borne en ligne a la largeur reelle du fichier, jamais etire. */
.plans { margin-top: 2.5rem; }
.plans__intro { max-width: 60ch; margin: 0 0 1.2rem; color: var(--ardoise); font-size: .9rem; }
.plans-grille { display: grid; gap: 1rem;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); align-items: start; }
.plan { margin: 0; }
.plan__cadre { position: relative; margin-inline: auto; padding: 1rem; background: #fff;
  border: 1px solid rgba(19,38,56,.12); border-radius: var(--rayon, 6px); width: fit-content;
  max-width: 100%; }
/* La HAUTEUR est le vrai garde-fou : une vue de dessus fait 563x1000 px et,
   bornée en largeur seulement, occupait un écran entier. Plafonnée, l'image
   garde son ratio (`width:auto`) et le bloc reste une annexe, pas un poster.
   Le plein écran est là pour qui veut lire le détail. */
.plan__cadre img { display: block; width: auto; max-width: 100%;
  max-height: clamp(180px, 26vh, 260px); height: auto; margin-inline: auto; }
.plan__legende { margin-top: .6rem; text-align: center; font-size: .85rem; color: var(--ardoise); }
.plan__zoom { position: absolute; right: .5rem; bottom: .5rem; z-index: 2;
  display: grid; place-items: center; width: 36px; height: 36px; border-radius: 50%;
  background: var(--marine-90); color: var(--sable); border: 1px solid rgba(246,241,234,.22);
  transition: background var(--transition), color var(--transition); }
.plan__zoom:hover { background: var(--camel); color: var(--marine); }
.plan__cadre:has(.plan__zoom:not([hidden])) img { cursor: zoom-in; }
/* Le plan agrandi garde son fond blanc : sur le voile marine, un PNG detoure
   en trait sombre serait illisible. */
[data-plans-dialogue] .zoom__figure img { background: #fff; padding: 1rem; }

.fiche-corps { display: grid; gap: 2.5rem; grid-template-columns: minmax(0, 1fr); }
/* Elements de grille : `min-width: auto` les empeche de descendre sous leur
   largeur min-content, ce qui pousse la page au grossissement du texte. */
.fiche-corps *, .fiche-vente__corps * { min-width: 0; }
.fiche-entete .fil-ariane { font-size: .8rem; color: var(--ardoise); margin-bottom: .75rem; }
.fiche-entete .fil-ariane a:hover { color: var(--camel); }
.fiche-titre-ligne { display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem 1rem; }
.fiche-meta-rapide { display: flex; flex-wrap: wrap; gap: .5rem 1.5rem; margin-top: .75rem; color: var(--ardoise); font-size: .95rem; }

/* Caractéristiques — colonnes aérées, partagées par la fiche yacht et la fiche
   de vente (variante « C » de `test-grille-caracteristiques.html`, retenue le
   17/08/2026). Le quadrillage précédent — cellules blanches cloisonnées de
   filets sur les quatre côtés — faisait tableur, et surtout il laissait une
   **case vide** en fin de grille dès que le nombre de caractéristiques n'était
   pas un multiple du nombre de colonnes : le cas de presque toutes les fiches,
   puisque ce nombre dépend de ce qui est renseigné. `auto-fit` remplit la
   dernière rangée au lieu de la creuser. L'espace et un filet camel organisent,
   la valeur passe devant son libellé. */
.specs-grille { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1.6rem 2rem; }
.specs-grille > div { padding-top: .85rem; border-top: 2px solid var(--camel); }
.specs-grille dt { font-size: .78rem; letter-spacing: .1em; text-transform: uppercase; color: var(--camel-texte); margin-bottom: .25rem; }
/* La valeur doit dominer son libellé : 1 rem ne suffirait pas, 1,5 rem — la
   marche suivante du système — en ferait un titre. Marche intermédiaire assumée. */
.specs-grille dd { font-family: var(--serif); font-size: 1.2rem; line-height: 1.25; color: var(--marine); }
/* Une valeur à rallonge (motorisation, lieu de visite) tient sur trois lignes
   dans une colonne et creuse toute sa rangée. Sur deux colonnes, elle en occupe
   une seule et la rangée reste basse. */
.specs-grille > div.est-longue { grid-column: span 2; }

/* Équipements : grille régulière (les pilules en flex-wrap donnaient des lignes
   de longueurs inégales, d'où une impression de désordre). Une icône Lucide par
   équipement, choisie dans le back-office. */
.equipements-grille {
  display: grid; gap: .45rem;
  /* Deux par ligne, mais la grille retombe seule a une colonne quand le texte
     grossit : le libelle est un element flex ANONYME, que `min-width: 0` ne peut
     pas atteindre. Le minimum en rem suit donc la taille de police. */
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 9rem), 1fr));
}
.equipements-grille li {
  display: flex; flex-wrap: wrap; align-items: center; gap: .55rem;
  background: var(--sable); border-radius: 10px;
  padding: .5rem .6rem; font-size: .8rem; line-height: 1.25;
}
.equipement-ico {
  flex: 0 0 26px; height: 26px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--blanc, #fff); color: var(--camel);
  border-radius: 8px;
}
.equipement-ico svg { width: 15px; height: 15px; }

@media (min-width: 760px) {
  .equipements-grille { grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: .5rem; }
  .equipements-grille li { font-size: .84rem; padding: .55rem .7rem; }
  .equipement-ico { flex-basis: 28px; height: 28px; }
  .equipement-ico svg { width: 16px; height: 16px; }
}

.tarifs-table { width: 100%; border-collapse: collapse; font-size: .92rem; }
.tarifs-table th, .tarifs-table td { padding: .8rem 1rem; text-align: left; border-bottom: 1px solid var(--ardoise-30); }
.tarifs-table th { font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ardoise); font-weight: 600; }
.tarifs-table td:not(:first-child) { font-family: var(--serif); color: var(--marine); }
.inclus-grille { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1.5rem; margin-top: 1.5rem; }
.inclus-col h4 { font-family: var(--sans); font-size: .8rem; text-transform: uppercase; letter-spacing: .1em; margin-bottom: .6rem; }
.inclus-col.oui h4 { color: #2e7d5b; }
.inclus-col.non h4 { color: var(--ardoise); }
.inclus-col li { padding-left: 1.4rem; position: relative; color: var(--ardoise); font-size: .9rem; margin-bottom: .3rem; }
.inclus-col.oui li::before { content: '✓'; position: absolute; left: 0; color: #2e7d5b; font-weight: 700; }
.inclus-col.non li::before { content: '·'; position: absolute; left: .4rem; color: var(--ardoise); }

/* Encadré demande (sticky desktop) */
.encart-demande {
  background: var(--blanc); border: 1px solid var(--ardoise-30); border-radius: var(--rayon-lg);
  padding: 1.5rem; box-shadow: var(--ombre);
}
/* Un prix est un bloc insecable (espace fine avant le symbole) : il ne peut pas
   se casser, sa taille doit donc etre bornee par la fenetre. En anglais
   « 1,450,000 € » debordait de l encart au grossissement du texte. */
.encart-demande .prix-grand { font-family: var(--serif); font-size: clamp(1.5rem, 8vw, 2rem); color: var(--marine); }
.encart-demande .prix-grand small { font-family: var(--sans); font-size: .85rem; color: var(--ardoise); font-weight: 400; }

/* --- Tunnel de demande ---------------------------------------------------- */
.tunnel { display: grid; gap: 2rem; grid-template-columns: minmax(0, 1fr); }
/* Les éléments de grille et de flex ont `min-width: auto` : ils refusent de
   descendre sous la largeur min-content de leur contenu. Un champ natif porte
   une largeur intrinsèque (≈ 20 caractères) qui, à fort grossissement du texte,
   poussait tout le formulaire hors de l'écran. Sur un élément de bloc ordinaire
   la déclaration ne change rien — elle ne vise donc que les cas concernés. */
.tunnel * { min-width: 0; }
.etapes { display: flex; gap: .5rem; margin-bottom: 2rem; }
.etape-jauge { flex: 1; height: 4px; background: var(--ardoise-30); border-radius: 999px; overflow: hidden; }
.etape-jauge span { display: block; height: 100%; background: var(--camel); width: 0; transition: width var(--transition); }
.etape-num { font-size: .8rem; color: var(--ardoise); letter-spacing: .1em; text-transform: uppercase; margin-bottom: .5rem; }
.etape-panneau { display: none; }
.etape-panneau.actif { display: block; animation: fondu .3s ease; }
@keyframes fondu { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

.recap-devis { position: sticky; top: 90px; background: var(--sable); border-radius: var(--rayon-lg); padding: 1.5rem; }
.recap-devis h3 { font-family: var(--sans); font-size: .8rem; text-transform: uppercase; letter-spacing: .12em; color: var(--ardoise); margin-bottom: 1rem; }
.recap-ligne { display: flex; justify-content: space-between; padding: .5rem 0; font-size: .92rem; border-bottom: 1px solid var(--ardoise-30); }
.recap-total { display: flex; justify-content: space-between; align-items: baseline; margin-top: 1rem; padding-top: 1rem; border-top: 2px solid var(--marine); }
.recap-total b { font-family: var(--serif); font-size: 1.6rem; color: var(--marine); }
.recap-note { font-size: .78rem; color: var(--ardoise); margin-top: .75rem; font-style: italic; }

/* --- Formulaires ---------------------------------------------------------- */
.champ { margin-bottom: 1.1rem; }
.champ label { display: block; font-size: .85rem; font-weight: 600; margin-bottom: .4rem; color: var(--marine); }
.champ input, .champ select, .champ textarea {
  width: 100%; min-height: 48px; padding: .7rem 1rem;
  border: 1px solid var(--bordure-champ); border-radius: var(--rayon); min-width: 0;
  font-size: 16px; /* ≥16px : évite le zoom iOS */ font-family: inherit; color: var(--marine); background: var(--blanc);
  transition: var(--transition);
}
.champ textarea { min-height: 120px; resize: vertical; }
.champ input:focus, .champ select:focus, .champ textarea:focus {
  border-color: var(--camel); outline: none; box-shadow: 0 0 0 3px rgba(187,150,113,.18);
}
.champ input[aria-invalid="true"] { border-color: #c0392b; }
.champ .erreur { color: #c0392b; font-size: .8rem; margin-top: .3rem; display: none; }
.champ input[aria-invalid="true"] ~ .erreur { display: block; }
.grille-champs { display: grid; gap: 0 1rem; grid-template-columns: minmax(0, 1fr); }
.honeypot { position: absolute; left: -9999px; opacity: 0; pointer-events: none; }
.case-rgpd { display: flex; gap: .6rem; align-items: flex-start; font-size: .88rem; color: var(--ardoise); }
/* WCAG 2.5.8 : les cases natives font 13x13 par defaut. */
.champ input[type="checkbox"], .champ input[type="radio"],
.case-rgpd input { width: 24px; height: 24px; min-height: 0; margin-top: .15rem; flex: 0 0 auto; accent-color: var(--camel); }

/* Extras du tunnel : cartes compactes (nom + prix sur une ligne, description en
   dessous). La pastille de sélection ne prend plus de colonne : elle se pose en
   coin et n'apparaît qu'une fois cochée. */
.chips-extras { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .45rem; }
.chip-extra {
  position: relative; display: flex; flex-direction: column; gap: .15rem;
  padding: .55rem .7rem; border: 1px solid var(--bordure-champ); border-radius: 10px;
  cursor: pointer; transition: var(--transition);
}
.chip-extra:hover { border-color: var(--camel); }
.chip-extra.coche { border-color: var(--camel); background: rgba(187,150,113,.07); }
.chip-extra:has(input:checked) { border-color: var(--camel); background: rgba(187,150,113,.07); }
.chip-extra input { position: absolute; opacity: 0; }
.chip-extra:has(input:focus-visible) { outline: 2px solid var(--camel); outline-offset: 3px; }
.chip-extra__tete { display: flex; align-items: baseline; justify-content: space-between; gap: .5rem; }
.chip-extra__tete strong { color: var(--marine); font-size: .82rem; line-height: 1.25; }
.chip-extra__prix { font-family: var(--serif); color: var(--marine); font-size: .8rem; white-space: nowrap; }
.chip-extra__desc {
  color: var(--ardoise); font-size: .7rem; line-height: 1.3;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.chip-extra__check {
  position: absolute; top: -7px; right: -7px;
  width: 18px; height: 18px; border-radius: 50%;
  background: var(--camel); color: #fff;
  display: flex; align-items: center; justify-content: center;
  opacity: 0; transform: scale(.6); transition: var(--transition);
}
.chip-extra.coche .chip-extra__check { opacity: 1; transform: none; }
.chip-extra:has(input:checked) .chip-extra__check { opacity: 1; transform: none; }

/* --- Bandeau cookies ------------------------------------------------------ */
.cookies {
  position: fixed; inset-inline: 1rem auto; bottom: 1rem; z-index: var(--z-cookies);
  background: var(--marine); color: var(--sable); border-radius: var(--rayon);
  padding: 1rem 1.1rem; box-shadow: var(--ombre-fort);
  max-width: min(340px, calc(100vw - 2rem));
  display: none;
}
.cookies.visible { display: block; }
.cookies p { color: rgba(246,241,234,.85); font-size: .84rem; line-height: 1.45; margin-bottom: .8rem; }
.cookies__actions { display: flex; flex-wrap: wrap; gap: .5rem; }

/* --- Footer --------------------------------------------------------------- */
.pied { background: var(--marine); color: rgba(246,241,234,.72); padding-block: 3rem 1.5rem; }
/* Deux règles écrites pour les fonds clairs fuitaient dans le pied marine et y
   imposaient l'ardoise, soit 3,20:1 — sous le seuil AA. La couleur voulue est
   celle de `.pied` ci-dessus (7,76:1) : on la laisse redescendre. */
.pied p,
.pied .accordeon__corps > div { color: inherit; }
.pied a:hover { color: var(--camel); }
.pied__grille { display: grid; gap: 2rem; grid-template-columns: minmax(0, 1fr); }
/* Le titre de colonne enveloppe désormais le bouton d'accordéon (motif WAI-ARIA) :
   un <h4> à l'intérieur d'un <button> était invalide et sortait le titre de la
   navigation par titres. L'apparence est inchangée. */
.pied__col h4, .pied__col-titre { color: var(--blanc); font-family: var(--sans); font-size: .8rem; text-transform: uppercase; letter-spacing: .12em; margin-bottom: 1rem; }
.pied__col-titre .accordeon__tete { color: inherit; font: inherit; letter-spacing: inherit; text-transform: inherit; }
.pied__col li { margin-bottom: .2rem; font-size: .92rem; }
/* WCAG 2.5.8 : les liens du pied ne faisaient que 18 px de haut. */
.pied__col li a { display: inline-flex; align-items: center; min-height: 32px; }
.pied__marque { margin-bottom: .8rem; }
.pied__marque img {
  height: var(--logo-h-pied, 46px); width: auto;
  filter: drop-shadow(0 1px 2px rgba(0,0,0,.5))
          drop-shadow(0 0 7px rgba(187,150,113,var(--logo-halo, .12)));
}
.pied__contact li { display: flex; gap: .6rem; align-items: flex-start; }
.pied__bas { border-top: 1px solid rgba(246,241,234,.12); margin-top: 2.5rem; padding-top: 1.5rem;
  display: flex; flex-direction: column; gap: .75rem; font-size: .82rem; color: rgba(246,241,234,.62); }
.pied__social { display: flex; gap: .8rem; }
.pied__social a { width: 40px; height: 40px; border-radius: 50%; border: 1px solid rgba(246,241,234,.2);
  display: flex; align-items: center; justify-content: center; }
.pied__social a:hover { border-color: var(--camel); }

/* Accordéon (footer mobile + FAQ) */
.accordeon__item { border-bottom: 1px solid var(--ardoise-30); }
.accordeon__tete { width: 100%; display: flex; justify-content: space-between; align-items: center; gap: 1rem;
  padding: 1.1rem 0; text-align: left; font-family: var(--serif); font-size: 1.05rem; color: var(--marine); }
.accordeon__tete .plus { transition: transform var(--transition); flex: 0 0 auto; color: var(--camel); font-size: 1.4rem; }
.accordeon__tete[aria-expanded="true"] .plus { transform: rotate(45deg); }
.accordeon__corps { max-height: 0; overflow: hidden; transition: max-height var(--transition); }
.accordeon__corps > div { padding-bottom: 1.1rem; color: var(--ardoise); }

/* --- Fil d'ariane --------------------------------------------------------- */
.fil-ariane a { color: var(--ardoise); }

/* --- Confirmation --------------------------------------------------------- */
.confirmation-panneau { text-align: center; max-width: 34rem; margin-inline: auto; }
.confirmation-panneau .ref { font-family: var(--serif); font-size: 1.6rem; color: var(--camel);
  background: var(--sable); display: inline-block; padding: .5rem 1.5rem; border-radius: 999px; margin: 1rem 0; }
.ico-succes { width: 72px; height: 72px; margin: 0 auto 1.5rem; border-radius: 50%; background: rgba(46,125,91,.12);
  display: flex; align-items: center; justify-content: center; color: #2e7d5b; }

/* --- Texte replié (« Lire la suite ») -------------------------------------
   `<details>` natif : le dépliage fonctionne sans JavaScript. Le marqueur par
   défaut est masqué au profit d'un lien discret à chevron. */
.lire-suite > summary {
  list-style: none; cursor: pointer;
  display: inline-flex; align-items: center; gap: .4rem;
  margin-top: .35rem; padding: .5rem .2rem; min-height: 44px;
  font-size: .85rem; font-weight: 600; letter-spacing: .04em;
  color: var(--camel-texte); transition: var(--transition);
}
.lire-suite > summary::-webkit-details-marker { display: none; }
.lire-suite > summary:hover { color: var(--camel-fonce); }
.lire-suite > summary svg { transition: transform var(--transition); }
.lire-suite[open] > summary svg { transform: rotate(180deg); }
.lire-suite__moins { display: none; }
.lire-suite[open] .lire-suite__plus { display: none; }
.lire-suite[open] .lire-suite__moins { display: inline; }
/* Le contenu déplié entre en fondu plutôt que d'apparaître d'un bloc. */
.lire-suite[open] > *:not(summary) { animation: lire-suite-entree .45s ease both; }
@keyframes lire-suite-entree {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: none; }
}

/* --- Animations au défilement --------------------------------------------- */
/* Le masquage initial n'est appliqué que si JS est actif (classe posée dans le
   <head> du layout) : sans JavaScript, le contenu reste intégralement visible. */
.reveal { opacity: 1; transform: none; }
.js .reveal { opacity: 0; transform: translateY(24px); transition: opacity .6s ease, transform .6s ease; }
.js .reveal.visible { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
  .js .reveal { opacity: 1; transform: none; }
}

/* --- Accueil : bloc de présentation --------------------------------------- */
.section-intro { padding-block: clamp(3.5rem, 8vw, 6.5rem); }
.intro-bloc { max-width: 860px; margin-inline: auto; }
.intro-bloc .surtitre { font-size: clamp(1.8rem, 4vw, 2.6rem); margin-bottom: .25rem; }
.intro-bloc h2 { font-size: clamp(1.65rem, 4.5vw, 2.6rem); margin-bottom: clamp(1.5rem, 4vw, 2.5rem); }
.intro-texte { display: flex; flex-direction: column; gap: 1.1rem; }
.intro-texte p { font-size: clamp(1rem, 1.6vw, 1.08rem); line-height: 1.8; color: var(--ardoise); }
.intro-texte strong { color: var(--marine); font-weight: 600; }
.intro-signature { font-family: var(--serif); font-style: italic; color: var(--camel-texte) !important; font-size: 1.15rem !important; margin-top: .3rem; }

/* Séparateur ornemental (losange camel) */
.separateur-orne { display: flex; align-items: center; gap: 1rem; margin-block: clamp(2rem,5vw,3.5rem); color: var(--ardoise-30); }
.separateur-orne::before, .separateur-orne::after { content: ''; flex: 1; height: 1px; background: currentColor; }
.separateur-orne span { width: 8px; height: 8px; background: var(--camel); transform: rotate(45deg); }

/* --- Accueil : héro & sections -------------------------------------------- */
/* Mobile : héro plus court pour laisser apparaître la bande confiance */
.hero--accueil { min-height: 68vh; }
/* Recentrage de la vidéo sur mobile : on décale le cadrage vers le bateau (à droite) */
.hero--accueil .hero__media video { object-position: 72% center; }
.hero__cta-mobile { margin-top: .9rem; }

.bande-confiance {
  background: var(--blanc); border-bottom: 1px solid rgba(19,38,56,.07);
  padding-block: clamp(1.75rem, 4vw, 2.5rem);
}

.entete-tete {
  display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;
  margin-bottom: clamp(1.75rem, 4vw, 2.75rem);
}
.entete-tete h2 { margin: .3rem 0; }
.section-exp .carte { color: var(--marine); }

/* --- Vitrine « à bord » : jouets, restauration, services -------------------
   Vitrine, pas tarif : on montre l'étendue de l'offre, le chiffrage se fait dans
   le tunnel de demande. Des pastilles fines qui se replient remplacent les
   grandes cartes carrées — plus court à parcourir, et l'ajout d'une famille ne
   fait plus exploser la hauteur de la section. */
.vitrine { display: grid; gap: 1.6rem; margin-top: clamp(1.5rem, 4vw, 2.25rem); }
.vitrine__groupe { padding-top: 1.3rem; border-top: 1px solid rgba(19,38,56,.09); }
.vitrine__groupe:first-child { padding-top: 0; border-top: none; }

.vitrine__titre {
  display: flex; align-items: center; gap: .55rem;
  font-family: var(--sans); font-size: .78rem; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase; color: var(--marine);
  margin-bottom: .85rem;
}
.vitrine__titre-ico {
  flex: 0 0 28px; height: 28px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--sable); color: var(--camel);
}
.vitrine__compte {
  font-size: .68rem; letter-spacing: 0; color: var(--ardoise);
  border: 1px solid var(--ardoise-30); border-radius: 999px; padding: 0 .45rem;
}

.vitrine__liste { display: flex; flex-wrap: wrap; gap: .4rem; list-style: none; }
.vitrine__puce {
  display: inline-flex; align-items: center; gap: .45rem;
  padding: .38rem .8rem .38rem .5rem;
  background: var(--blanc); border: 1px solid rgba(19,38,56,.09); border-radius: 999px;
  font-size: .8rem; color: var(--marine); line-height: 1.3;
  transition: var(--transition);
}
.vitrine__puce:hover { border-color: var(--camel); box-shadow: var(--ombre); transform: translateY(-1px); }
.vitrine__emoji { font-size: 1rem; line-height: 1; }

/* Newsletter */
.newsletter { display: flex; flex-direction: column; gap: 1.5rem; }
.newsletter__form { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; }
.newsletter__form input {
  flex: 1; min-width: 200px; min-height: 48px; padding: .7rem 1.1rem;
  border: 1px solid var(--bordure-champ); border-radius: 999px; font-size: 16px; background: var(--blanc);
}
.newsletter__form input:focus { border-color: var(--camel); outline: none; box-shadow: 0 0 0 3px rgba(187,150,113,.18); }
.newsletter__etat { flex-basis: 100%; font-size: .85rem; margin: 0; }

@media (min-width: 760px) {
  .entete-tete { flex-direction: row; justify-content: space-between; align-items: flex-end; }
  .newsletter { flex-direction: row; align-items: center; justify-content: space-between; }
  .newsletter > div { flex: 1; }
  .newsletter__form { flex: 1; max-width: 440px; }
}
@media (min-width: 960px) {
  .hero__cta-mobile { display: none; }
  .hero--accueil { min-height: min(80vh, 680px); }
  .hero--accueil .hero__media video { object-position: center; }
  .vitrine__liste { gap: .45rem; }
}

/* --- Page Maintenance -------------------------------------------------------
   Familles de prestations (sections à pastille-icône + cartes fines), puis
   le processus « comment ça se passe » en étapes numérotées, et les groupes
   du formulaire de devis. Base mobile, montée en colonnes sur desktop. */

/* Familles de prestations : aperçu rapide plutôt que longues cartes répétées.
   Chaque famille garde toutes ses prestations immédiatement visibles. */
.familles { display: grid; grid-template-columns: minmax(0, 1fr); gap: .85rem; margin-top: clamp(1.5rem, 4vw, 2.25rem); }
.famille { border: 1px solid rgba(19,38,56,.09); border-radius: var(--rayon-lg); padding: 1rem 1.1rem; background: var(--blanc); }
.famille__tete { display: flex; align-items: center; gap: .65rem; }
.famille__titre { font-size: 1.05rem; margin: 0 0 .2rem; }
.famille__ico {
  width: 36px; height: 36px; border-radius: 50%; flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--sable); color: var(--camel-fonce);
}
.famille__prestations { display: flex; flex-wrap: wrap; gap: .45rem; margin: .9rem 0 0; padding: 0; list-style: none; }
.famille__prestations li { display: inline-flex; align-items: center; padding: .35rem .55rem; border-radius: 999px;
  background: var(--sable); color: var(--marine); font-size: .83rem; }
.familles__cta { margin: 1.5rem 0 0; }

/* Rail d'images Maintenance : photos des catégories téléversées au back-office.
   Sans photo, la vue ne rend pas la section — jamais d'emplacement vide. */
.maintenance-media { margin-top: clamp(3rem, 7vw, 5rem); }
.maintenance-media__entete { margin-bottom: .35rem; }
.maintenance-media__entete h3 { margin-top: .25rem; }
.maintenance-media__item { display: block; border: 1px solid rgba(19,38,56,.09); border-radius: var(--rayon-lg); overflow: hidden; background: var(--blanc); }
.maintenance-media__visuel { display: block; width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: cover; background: var(--sable); }
.maintenance-media__item figcaption { padding: .85rem 1rem; font-family: var(--serif); color: var(--marine); font-size: .95rem; }
.maintenance-media .rail__item { flex-basis: 78%; max-width: 300px; }

/* Le rail clôt la section : on resserre sa sortie avant le séparateur, sans
   modifier le rythme vertical des autres sections du site. */
.section--prestations { padding-bottom: clamp(2.5rem, 5vw, 4rem); }
.section--prestations + .conteneur .separateur-orne { margin-block: clamp(1.25rem, 3vw, 2rem); }

/* Processus « comment ça se passe » : filet vertical sur mobile, rangée de
   quatre étapes reliées par un filet horizontal sur desktop. */
.process { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: minmax(0, 1fr); gap: 1.75rem; }
.process__etape { position: relative; padding-left: 3.25rem; }
.process__num {
  position: absolute; left: 0; top: 0; width: 2.5rem; height: 2.5rem;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--serif); font-size: 1.2rem; color: var(--camel);
  background: var(--blanc); border: 1px solid var(--camel); border-radius: 50%;
}
.process__etape:not(:last-child)::after {
  content: ''; position: absolute;
  left: 1.25rem; top: 2.75rem; bottom: -1.5rem; width: 1px; background: var(--ardoise-30);
}
.process__etape h3 { font-size: 1.05rem; margin-bottom: .25rem; }
.process__etape p { font-size: .92rem; color: var(--ardoise); margin: 0; }

/* Groupes du formulaire de devis (fieldsets à legende serif) */
.form-groupe { border: none; padding: 0; margin: 0 0 1.75rem; }
.form-groupe legend {
  font-family: var(--serif); font-size: 1.15rem; color: var(--marine);
  margin-bottom: 1rem; display: flex; align-items: center; gap: .6rem; padding: 0;
}
.form-groupe legend .icone { color: var(--camel); }
.champ .aide { font-size: .8rem; color: var(--ardoise); margin-top: .3rem; }
.form-erreurs {
  border: 1px solid #c0392b; border-radius: var(--rayon); color: #c0392b;
  padding: .8rem 1rem; margin-bottom: 1.25rem; font-size: .9rem; background: #fdf3f2;
}
.form-erreurs ul { margin: .3rem 0 0; padding-left: 1.1rem; }

/* Formulaire maintenance : le devis reste dans la page (et accessible sans
   JavaScript), mais se replie après une arrivée directe pour alléger la lecture. */
.devis-depliable { border: 1px solid var(--ardoise-30); border-radius: var(--rayon-lg); background: var(--blanc); overflow: hidden; }
.devis-depliable > summary { list-style: none; cursor: pointer; min-height: 76px; padding: 1.1rem 1.25rem;
  display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.devis-depliable > summary::-webkit-details-marker { display: none; }
.devis-depliable__texte { display: grid; gap: .2rem; }
.devis-depliable__texte strong { color: var(--marine); font-family: var(--serif); font-size: 1.15rem; }
.devis-depliable__texte span { color: var(--ardoise); font-size: .9rem; }
.devis-depliable__action { flex: 0 0 auto; display: inline-flex; align-items: center; gap: .45rem; color: var(--camel-fonce); font-size: .85rem; font-weight: 600; }
.devis-depliable__action svg { transition: transform var(--transition); }
.devis-depliable[open] .devis-depliable__action svg { transform: rotate(180deg); }
.devis-depliable__replier { display: none; }
.devis-depliable[open] .devis-depliable__ouvrir { display: none; }
.devis-depliable[open] .devis-depliable__replier { display: inline; }
.devis-depliable__contenu { border-top: 1px solid var(--ardoise-30); padding: 1.5rem 1.25rem; }
.devis-depliable[open] > .devis-depliable__contenu { animation: devis-entree .35s ease both; }
@keyframes devis-entree { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }

@media (max-width: 639px) {
  .devis-depliable > summary { align-items: flex-start; }
  .devis-depliable__action { padding-top: .15rem; }
  .devis-depliable__ouvrir, .devis-depliable__replier { display: none !important; }
  .devis-depliable__contenu { padding: 1.25rem 1rem; }
}

@media (min-width: 640px) {
  .familles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .familles__cta { grid-column: 1 / -1; }
}
@media (min-width: 900px) {
  .process { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1.5rem; }
  .process__etape { padding-left: 0; padding-top: 3.25rem; }
  .process__num { top: 0; }
  .process__etape:not(:last-child)::after {
    left: calc(2.5rem + .5rem); right: calc(-1.5rem + .5rem);
    top: 1.25rem; bottom: auto; width: auto; height: 1px;
  }
}
@media (min-width: 960px) {
  .familles { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* --- Page Location -------------------------------------------------------- */
.hero--location .hero__media picture { display: block; width: 100%; height: 100%; }
.hero--location .hero__media img { object-position: center 42%; }
.hero--location::after {
  background: linear-gradient(90deg, rgba(12,28,42,.76) 0%, rgba(19,38,56,.42) 48%, rgba(19,38,56,.16) 100%);
}
.hero--location .hero__cta { flex-direction: column; align-items: stretch; }
.hero--location .hero__cta .btn { width: 100%; }
.location-hero__reassurance { margin-top: .75rem; color: rgba(255,255,255,.82); font-size: .82rem; }
#formules-location .surtitre, .location-selection .surtitre { color: var(--camel-fonce); }

.location-formules { display: grid; gap: 1.25rem; }
.location-formule {
  overflow: hidden; display: flex; flex-direction: column;
  background: var(--blanc); border-radius: var(--rayon-lg);
  box-shadow: var(--ombre);
}
.location-formule__media { position: relative; aspect-ratio: 16/10; overflow: hidden; }
.location-formule__media img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s ease; }
.location-formule:hover .location-formule__media img { transform: scale(1.035); }
.location-formule__duree {
  position: absolute; left: 1rem; bottom: 1rem;
  display: inline-flex; align-items: center; gap: .45rem;
  padding: .45rem .75rem; border-radius: 999px;
  background: rgba(19,38,56,.86); backdrop-filter: blur(10px); color: var(--blanc);
  font-size: .78rem; font-weight: 600;
}
.location-formule__corps { display: flex; flex-direction: column; flex: 1; padding: 1.25rem; }
.location-formule__corps h3 { margin-bottom: .65rem; }
.location-formule__corps > p { font-size: .92rem; }
.location-formule__inclus {
  display: flex; align-items: flex-start; gap: .5rem; margin-top: 1rem;
  color: var(--marine) !important; font-size: .82rem !important; font-weight: 600;
}
.location-formule__inclus svg { flex: 0 0 auto; margin-top: .15rem; color: var(--camel); }
.location-formule__pied {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .8rem;
  margin-top: auto; padding-top: 1.15rem;
}
.location-formule__pied strong { color: var(--marine); font-family: var(--serif); font-size: 1.1rem; }
.location-formule__pied small { display: block; font-family: var(--sans); color: var(--ardoise); font-size: .68rem; font-weight: 400; }
.location-tarif-note { margin: 1.4rem auto 0; max-width: 72ch; font-size: .78rem; }

.filtre-champ { display: grid; gap: .3rem; flex: 1 1 150px; }
.filtre-champ > span { padding-left: .25rem; color: var(--marine); font-size: .72rem; font-weight: 600; }
.filtre-champ select { width: 100%; }
.filtres-reset { min-height: 44px; display: inline-flex; align-items: center; padding-inline: .35rem; color: var(--camel-texte); font-size: .85rem; font-weight: 600; text-decoration: underline; text-underline-offset: .2em; }
.location-selection .filtres { align-items: flex-end; }
.location-selection__grille { margin-top: 1.5rem; }
.location-selection__vide { text-align: center; padding: 3rem 0; color: var(--ardoise); }
.location-selection__vide p { margin-bottom: 1rem; }
.location-confiance { border-top: 1px solid rgba(19,38,56,.07); }
.location-cta h2 { color: var(--blanc); margin: .35rem 0 .8rem; }
.location-cta p { margin-bottom: 1.5rem; }
.location-cta__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: .8rem; }

@media (min-width: 700px) {
  .hero--location .hero__cta { flex-direction: row; align-items: center; }
  .hero--location .hero__cta .btn { width: auto; }
  .location-formules { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .location-formule__media { aspect-ratio: 4/3; }
}

@media (max-width: 480px) {
  .entete__inner { gap: .4rem; }
  .entete .logo img { height: 28px; }
  .entete__actions { gap: .3rem; }
  .entete .entete__compte { width: 36px; height: 36px; }
  .entete .burger { width: 40px; height: 40px; }
  .entete .selecteur-langue { gap: 0; font-size: .72rem; }
  .entete .selecteur-langue a { min-width: 28px; padding: .15rem .2rem; }
}
@media (min-width: 960px) {
  .hero--location .hero__media img { object-position: center 55%; }
}

/* --- Utilitaires divers --------------------------------------------------- */
.prose { max-width: 68ch; }
.prose p { margin-bottom: 1rem; color: var(--marine); line-height: 1.8; }
.prose h2, .prose h3 { margin: 2rem 0 .8rem; }
.prose ul { list-style: disc; padding-left: 1.3rem; margin-bottom: 1rem; color: var(--marine); }
.prose li { margin-bottom: .4rem; }
.visuellement-cache { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ==========================================================================
   Points de rupture (mobile-first : on ajoute pour desktop)
   ========================================================================== */
@media (min-width: 560px) {
  .rail__item { flex-basis: 46%; max-width: 320px; }
}
@media (min-width: 900px) {
  .rail__item { flex-basis: 31%; }
  .rail__fleche--prec { left: -1.1rem; }
  .rail__fleche--suiv { right: -1.1rem; }
}
@media (min-width: 1200px) {
  .rail__item { flex-basis: 23.5%; max-width: none; }
}

@media (min-width: 640px) {
  .grille--3 { grid-template-columns: repeat(2, 1fr); }
  .grille-champs { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .confiance { grid-template-columns: repeat(2, 1fr); }
  .chips-extras { grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); }
  .inclus-grille { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}

@media (min-width: 960px) {
  .nav-principale { display: block; }
  .burger { display: none; }
  .grille--3 { grid-template-columns: repeat(3, 1fr); }
  .grille--4 { grid-template-columns: repeat(4, 1fr); }
  .recherche-barre { display: flex; }
  .hero__cta .btn--recherche-mobile { display: none; }
  .confiance { grid-template-columns: repeat(3, 1fr); }
  .cat-grille { grid-template-columns: repeat(3, 1fr); }

  .fiche-corps { grid-template-columns: 1.7fr 1fr; align-items: start; }
  .fiche-aside { position: sticky; top: 90px; }
  /* Plus de nombre de colonnes imposé ici : `auto-fit` s'en charge et remplit la
     dernière rangée, ce qu'un `repeat(3, …)` ne peut pas faire. */
  .tunnel { grid-template-columns: 1.6fr 1fr; align-items: start; }
  .pied__grille { grid-template-columns: 2fr 1fr 1fr 1.3fr; gap: 2.5rem; }
  .pied__bas { flex-direction: row; justify-content: space-between; align-items: center; }
  .footer-accordeon .accordeon__corps { max-height: none !important; }
  .footer-accordeon .accordeon__tete { pointer-events: none; padding-bottom: .5rem; }
  .footer-accordeon .accordeon__tete .plus { display: none; }
}

/* Desktop : l'image ne doit plus occuper presque tout l'écran. Le ratio s'élargit
   et la hauteur est bornée — l'image est recadrée (`cover`), le mobile reste intact. */
@media (min-width: 900px) {
  .galerie__vue { aspect-ratio: 16/9; max-height: min(70vh, 640px); }
}
@media (min-width: 1200px) {
  .galerie__vue { aspect-ratio: 21/9; max-height: min(66vh, 600px); }
}

/* --- Calendrier de disponibilité (F-10) ------------------------------------ */
.calendrier {
  background: var(--blanc, #fff);
  border: 1px solid #e7e0d4;
  border-radius: 14px;
  padding: 1.1rem 1.1rem   .9rem;
  max-width: 420px;
}
.calendrier-entete {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: .7rem;
}
.calendrier-entete strong { font-family: var(--serif); color: var(--marine); }
.calendrier-nav {
  width: 36px; height: 36px; border-radius: 10px;
  border: 1px solid #e7e0d4; background: none; color: var(--marine);
  font-size: 1rem; cursor: pointer; transition: border-color .15s ease, background .15s ease;
}
.calendrier-nav:hover { border-color: var(--camel); background: #f3ece3; }
.calendrier-nav:disabled { opacity: .35; cursor: default; }
.calendrier-grille {
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px;
  text-align: center; font-size: .85rem;
}
.calendrier-jour-nom {
  font-size: .68rem; text-transform: uppercase; letter-spacing: .06em;
  color: var(--ardoise, #6b7683); padding: .25rem 0; font-weight: 600;
}
.calendrier-jour {
  padding: .38rem 0; border-radius: 8px; color: var(--marine);
}
.calendrier-indispo {
  background: #f0e4dc; color: #b08968;
  text-decoration: line-through; text-decoration-thickness: 1px;
}
.calendrier-auj { box-shadow: inset 0 0 0 2px var(--camel); font-weight: 700; }
.calendrier-legende {
  display: flex; align-items: center; gap: .45rem; flex-wrap: wrap;
  margin-top: .7rem; font-size: .74rem; color: var(--ardoise, #6b7683);
}
.calendrier-pastille {
  width: 12px; height: 12px; border-radius: 4px; background: #f0e4dc;
  border: 1px solid #d9bfa5; display: inline-block;
}
.calendrier-note { flex-basis: 100%; }

/* --- Article de blog (F-20) ------------------------------------------------ */
.article-contenu { font-size: 1.02rem; line-height: 1.75; color: var(--marine); }
.article-contenu h2 { font-size: 1.35rem; margin: 2rem 0 .7rem; }
.article-contenu h3 { font-size: 1.1rem; margin: 1.5rem 0 .5rem; }
.article-contenu p { margin: 0 0 1rem; }
.article-contenu ul, .article-contenu ol { margin: 0 0 1rem 1.4rem; }
.article-contenu li { margin-bottom: .35rem; }
.article-contenu a { color: var(--camel-fonce); }
.article-contenu img { max-width: 100%; border-radius: 12px; margin: 1rem 0; }
.article-contenu blockquote {
  border-left: 3px solid var(--camel); padding: .5rem 1.1rem; margin: 1.25rem 0;
  background: var(--sable); border-radius: 0 10px 10px 0; font-style: italic;
}

/* --- Espace client (F-14 → F-17) ------------------------------------------- */
/* L'icône est posée sur l'en-tête marine : elle doit être claire (elle était en
   `--marine`, donc invisible sur son propre fond). */
.entete__compte {
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; border-radius: 999px;
  color: rgba(246,241,234,.85);
  transition: var(--transition);
}
.entete__compte:hover { background: rgba(187,150,113,.16); color: var(--camel); }

.message-flash {
  padding: .8rem 1.1rem; border-radius: var(--rayon); margin-bottom: 1.25rem;
  font-size: .92rem; border: 1px solid transparent;
}
.message-flash--succes { background: #eef7ee; border-color: #b9dcb9; color: #2c6b2f; }
.message-flash--erreur { background: #fdefec; border-color: #f0c4bb; color: #a53125; }

.compte-connexion { padding-top: 2.5rem; }
.compte-connexion__contenu { max-width: 520px; }
.compte-connexion__intro { margin-bottom: 1.5rem; color: var(--ardoise); }
.compte-connexion__note { margin-top: 1.5rem; color: var(--ardoise); font-size: .85rem; }
.compte-confirmation {
  max-width: 460px;
  margin-inline: auto;
  padding-block: clamp(1.25rem, 7vw, 3.5rem);
  text-align: center;
}
.compte-confirmation:focus { outline: none; }
.compte-confirmation__icone {
  display: inline-flex;
  margin-bottom: 1.25rem;
  color: var(--camel-action);
}
.compte-confirmation h1 { margin-bottom: 1rem; font-size: 2.25rem; }
.compte-confirmation__texte {
  max-width: 42ch;
  margin-inline: auto;
  color: var(--marine);
  font-size: 1.05rem;
  line-height: 1.6;
}
.compte-confirmation__note {
  max-width: 48ch;
  margin: .65rem auto 0;
  color: var(--ardoise);
  font-size: .85rem;
}
.compte-confirmation__retour {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .45rem;
  min-height: 44px;
  margin-top: 1.5rem;
  color: var(--marine);
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.compte-confirmation__retour:hover { color: var(--camel-action); }
@media (max-width: 480px) {
  .compte-confirmation h1 { font-size: 2rem; }
}

.compte-nav { display: flex; flex-wrap: wrap; gap: .75rem; align-items: center; }
.compte-liste { display: flex; flex-direction: column; gap: .9rem; list-style: none; padding: 0; }
.compte-carte {
  background: var(--blanc); border: 1px solid var(--ardoise-30);
  border-radius: var(--rayon-lg); padding: 1.15rem 1.35rem;
}
.compte-carte__ref { font-weight: 600; color: var(--marine); margin-right: .6rem; }
.compte-carte__detail { margin-top: .4rem; font-size: .9rem; color: var(--ardoise); }
.compte-fiche { list-style: none; padding: 0; }
.compte-fiche li {
  display: flex; justify-content: space-between; align-items: center; gap: 1rem;
  padding: .45rem 0; font-size: .92rem; border-bottom: 1px solid var(--sable);
}
.compte-fiche li:last-child { border-bottom: none; }
.compte-fiche li span { color: var(--ardoise); }
.compte-actions { display: flex; flex-wrap: wrap; gap: .75rem; }

.statut-badge {
  display: inline-block; font-size: .68rem; font-weight: 600; letter-spacing: .07em;
  text-transform: uppercase; padding: .28rem .7rem; border-radius: 999px;
  background: var(--sable); color: var(--marine); vertical-align: middle;
}
.statut-badge--nouvelle,
.statut-badge--en_cours { background: #fdf3e3; color: #8a6117; }
.statut-badge--devis_envoye { background: #e8f0fb; color: #2a5590; }
.statut-badge--confirmee { background: #eef7ee; color: #2c6b2f; }
.statut-badge--terminee { background: var(--sable); color: var(--ardoise); }
.statut-badge--annulee { background: #fdefec; color: #a53125; }

/* --- Icônes Lucide (helper icone(), app/icones.php) ------------------------ */
.icone { flex-shrink: 0; vertical-align: -0.18em; }
.pied__contact .icone { color: var(--camel); margin-top: .1rem; }

/* --- Canal Vente de yachts ------------------------------------------------- */
.carte__surtitre { display: block; font-size: .72rem; letter-spacing: .14em; text-transform: uppercase; color: var(--camel-action); font-weight: 600; margin-bottom: .15rem; }
.carte__badge--offre { background: var(--marine); color: var(--sable); }
.carte__badge--vendu { background: #6b7078; color: var(--blanc); }

/* Entrée de page : même structure éditoriale que le catalogue Expériences
   (titre à gauche, promesse + accès directs à droite), sans hero image. Le haut
   reprend les 40px du catalogue Yachts, cf. DESIGN.md § Catalogue Expériences. */
.vente-intro { padding-top: var(--espace-10); padding-bottom: clamp(2.5rem, 6vw, 5rem); }
.vente-intro__grille { display: grid; gap: var(--espace-6); }
.vente-intro__grille h1 { max-width: 13ch; margin-top: var(--espace-3); }
.vente-intro__texte { max-width: 58ch; }
.vente-intro__texte > p:first-child { font-size: clamp(1.05rem, 2vw, 1.25rem); color: var(--marine); }
.vente-intro__ancres { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--espace-2); margin-top: var(--espace-6); }
.vente-intro__ancres a { display: grid; grid-template-columns: minmax(0, 1fr) auto; min-height: 56px; align-items: center; gap: var(--espace-2); padding: var(--espace-3) var(--espace-4); border: 1px solid var(--ardoise-30); border-radius: var(--rayon); font-size: .82rem; font-weight: 600; line-height: 1.3; transition: color var(--transition), border-color var(--transition), background var(--transition); }
.vente-intro__ancres a span { display: grid; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--ardoise); background: var(--sable); font-variant-numeric: tabular-nums; }
.vente-intro__ancres a:hover { border-color: var(--marine); color: var(--blanc); background: var(--marine); }
.vente-intro__ancres a:hover span { color: var(--marine); background: var(--camel); }

/* Neuf et occasion : deux blocs autonomes, ancrables depuis l'entrée de page. */
.vente-bloc { scroll-margin-top: calc(72px + var(--espace-6)); }

/* En-tête de section — un seul motif pour tout le canal Vente.
   Chaque section avait le sien : deux colonnes alignées PAR LE BAS pour le neuf
   et l'occasion, une colonne large pour l'accompagnement, un centrage pour la
   vitrine. Trois compositions sur une même page ne se lisent pas comme une
   variation mais comme une absence de règle — et l'alignement bas faisait
   flotter le début du paragraphe à une hauteur qui dépendait du nombre de
   lignes du titre. Ici : surtitre, titre, texte, empilés sur le même bord
   gauche, avec un rythme vertical fixe. La vitrine des marques garde son
   centrage : elle introduit une grille centrée, pas une liste alignée à gauche. */
.vente-entete { margin-bottom: clamp(2rem, 5vw, 2.75rem); }
.vente-entete h2 { margin-top: var(--espace-2); text-wrap: balance; }
.vente-entete p { max-width: var(--mesure); margin-top: var(--espace-4); text-wrap: pretty; }
.vente-grille { margin-top: var(--espace-4); }
.vente-vide { text-align: center; padding: 3rem 1rem; }
.vente-vide p { margin-bottom: 1rem; color: var(--marine); }
/* Section sans aucune fiche publiée : état utile plutôt qu'un blanc — le canal
   se vend au contact tant que le catalogue réel n'est pas saisi. */
.vente-etat-vide { max-width: 60ch; padding: var(--espace-6) 0 0; border-top: 1px solid var(--ardoise-30); }
.vente-etat-vide p { margin-bottom: var(--espace-4); }

/* Filtre marque du neuf, en puces (le neuf s'organise par chantier). Chaque
   puce reste un lien GET : le filtrage fonctionne sans JavaScript.
   Une SEULE ligne, jamais de retour à la ligne : sur mobile, trois rangées de
   puces repoussaient la première fiche hors de l'écran et cassaient la lecture.
   La piste déborde jusqu'au bord de l'écran (marge négative de gouttière) et se
   fond à droite pour signaler le défilement ; le rembourrage de fin dépasse la
   largeur du fondu pour que la dernière puce ne finisse jamais estompée. */
.vente-filtre { margin-bottom: var(--espace-4); }
.vente-filtre__label { display: block; margin-bottom: .5rem; color: var(--ardoise); font-size: .72rem; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; }
.vente-chips { position: relative; display: flex; flex-wrap: nowrap; gap: var(--espace-2); overflow-x: auto; overscroll-behavior-x: contain; margin-inline: calc(var(--gouttiere) * -1); padding-inline: var(--gouttiere) calc(var(--gouttiere) + 2rem); scrollbar-width: none; -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 3rem), transparent); mask-image: linear-gradient(90deg, #000 calc(100% - 3rem), transparent); }
.vente-chips::-webkit-scrollbar { display: none; }
.vente-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: .4rem; min-height: 44px; padding: .5rem 1rem; border: 1px solid var(--bordure-champ); border-radius: 999px; background: transparent; color: var(--ardoise); font-size: .84rem; font-weight: 600; white-space: nowrap; transition: color var(--transition), border-color var(--transition), background var(--transition); }
.vente-chip span { color: inherit; font-size: .74rem; font-variant-numeric: tabular-nums; opacity: .7; }
.vente-chip:hover { border-color: var(--marine); color: var(--marine); }
.vente-chip.est-actif { border-color: var(--marine); background: var(--marine); color: var(--blanc); }

/* Vitrine « Marques partenaires » (neuf) : panneaux éditoriaux, deux par rangée
   sur desktop. Le visuel est une photo d'ambiance ; le logo du chantier — fourni
   en blanc — se pose dessus dans un bandeau marine translucide, qui garantit son
   contraste quelle que soit la photo. Sans photo, le repli tient la place plutôt
   que d'écraser la carte. */
.vente-marques__intro { text-align: center; margin-bottom: var(--espace-6); }
.vente-marques__intro h2 { margin-top: var(--espace-2); }
.vente-marques__grille { display: grid; gap: clamp(1rem, 3vw, 1.75rem); }
.marque-panneau { display: flex; flex-direction: column; overflow: hidden; border: 1px solid rgba(19,38,56,.06); border-radius: var(--rayon-lg); background: var(--blanc); box-shadow: var(--ombre); transition: transform var(--transition), box-shadow var(--transition); }
.marque-panneau__media { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--sable); }
.marque-panneau__media > img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 500ms cubic-bezier(.4,0,.2,1); }
.marque-panneau__media .placeholder-img { font-size: clamp(1.6rem, 5vw, 2.4rem); text-align: center; padding-inline: var(--espace-6); }
/* Avec photo : bandeau dégradé en bas, qui garantit le contraste du logo blanc
   sans masquer l'image. Sans photo : le logo devient le visuel, centré sur un
   plein marine — pas de faux bandeau posé sur du vide. */
.marque-panneau__logo { position: absolute; inset: auto 0 0 0; display: flex; align-items: flex-end; justify-content: center; height: 92px; padding: var(--espace-6) clamp(1.5rem, 6vw, 3rem) var(--espace-4); background: linear-gradient(180deg, rgba(19,38,56,0) 0%, rgba(19,38,56,.82) 45%, rgba(19,38,56,.94) 100%); }
.marque-panneau__media--sans-photo { background: var(--marine); }
.marque-panneau__media--sans-photo .marque-panneau__logo { inset: 0; align-items: center; height: auto; padding: clamp(1.5rem, 5vw, 2.5rem) clamp(1.5rem, 6vw, 3rem); background: none; }
.marque-panneau__logo img { width: 100%; height: 100%; object-fit: contain; object-position: center bottom; }
.marque-panneau__media--sans-photo .marque-panneau__logo img { object-position: center; }
.marque-panneau__corps { display: flex; flex-direction: column; flex: 1; gap: var(--espace-2); padding: var(--espace-6); }
.marque-panneau__titre { font-family: var(--serif); font-size: 1.3rem; line-height: 1.15; color: var(--marine); }
.marque-panneau__compte { font-size: .72rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--camel-action); }
.marque-panneau__texte { font-size: .92rem; line-height: 1.6; color: var(--ardoise); }
.marque-panneau__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--espace-4); margin-top: auto; padding-top: var(--espace-4); }
.lien-discret { display: inline-flex; align-items: center; gap: .3rem; min-height: 24px; font-size: .8rem; font-weight: 600; color: var(--ardoise); transition: color var(--transition); }
.lien-discret:hover { color: var(--marine); }

/* Accompagnement : les quatre temps de l'achat, sur fond marine. Relie
   explicitement la vente à la maintenance (continuité, pas quatre métiers). */
.vente-etapes { display: grid; gap: var(--espace-6); margin: 0; padding: 0; list-style: none; counter-reset: none; }
.vente-etape { position: relative; padding-top: var(--espace-4); border-top: 1px solid rgba(246,241,234,.22); }
.vente-etape__icone { display: inline-grid; width: 40px; height: 40px; place-items: center; margin-bottom: var(--espace-3); border-radius: 50%; background: rgba(246,241,234,.08); color: var(--camel); }
.vente-etape__num { position: absolute; top: var(--espace-4); right: 0; font-family: var(--serif); font-size: 1.5rem; color: rgba(246,241,234,.42); line-height: 1; }
.vente-etape h3 { font-size: 1.15rem; margin-bottom: var(--espace-2); text-wrap: balance; }
/* Le texte des étapes était à .9rem, soit 14,4 px : sous le plancher de 16 px,
   et posé clair sur marine, où la graisse perçue baisse encore. Ramené au corps
   du site, avec la compensation d'usage du texte clair sur fond sombre —
   interligne un cran plus ouvert et un soupçon d'interlettrage. */
.vente-etape p { font-size: 1rem; line-height: 1.7; letter-spacing: .01em; text-wrap: pretty; }
.vente-accompagnement__lien { margin-top: var(--espace-10); }

@media (min-width: 640px) {
  .vente-etapes { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--espace-10) var(--espace-6); }
}
@media (min-width: 760px) {
  /* Seul l'en-tête de PAGE reste sur deux colonnes : titre et chapô y forment un
     bloc d'ouverture, pas une introduction de liste. L'alignement bas y a un
     sens — les deux colonnes se posent sur la même ligne, au-dessus des ancres. */
  .vente-intro__grille { grid-template-columns: minmax(0, .9fr) minmax(0, 1fr); align-items: end; }
  .vente-marques__grille { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
  .vente-etapes { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--espace-6); }
  /* Les quatre étapes se lisent en rangées : icônes, titres, textes. Dès qu'un
     titre passe sur deux lignes — « Comprendre votre programme » en français,
     trois des quatre en italien — son texte descend seul et la rangée se
     désaligne. La sous-grille fait porter les trois rangées par la grille
     parente, donc les textes démarrent tous à la même hauteur quelle que soit
     la langue. Sous `@supports` : sans elle, `grid-row: span 3` produirait une
     mise en page fausse plutôt qu'un repli. */
  @supports (grid-template-rows: subgrid) {
    .vente-etapes { grid-template-rows: auto auto auto; align-items: start; }
    .vente-etape { display: grid; grid-template-rows: subgrid; grid-row: span 3; row-gap: 0; }
    .vente-etape__icone { margin-bottom: 0; }
    .vente-etape h3 { margin-block: var(--espace-3) var(--espace-2); }
  }
}
@media (hover: hover) {
  .marque-panneau:hover { transform: translateY(-4px); box-shadow: var(--ombre-fort); }
  .marque-panneau:hover .marque-panneau__media > img { transform: scale(1.04); }
}
@media (prefers-reduced-motion: reduce) {
  .marque-panneau,
  .marque-panneau__media > img { transition: none; }
  .marque-panneau:hover { transform: none; }
  .marque-panneau:hover .marque-panneau__media > img { transform: none; }
}

.etiquette { display: inline-block; vertical-align: middle; margin-left: .6rem; padding: .2em .7em; border-radius: 999px; font-size: .7rem; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; }
.etiquette--offre { background: var(--marine); color: var(--sable); }
.etiquette--vendu { background: #6b7078; color: var(--blanc); }

.fiche-vente { padding: clamp(1.4rem, 4vw, 2.6rem) 0 clamp(2.5rem, 6vw, 4rem); }
.fiche-vente__tete { max-width: 70ch; }
.fiche-vente__accroche { font-size: 1.1rem; color: var(--marine-70); margin: .6rem 0; }
.fiche-vente__prix { font-size: 1.4rem; color: var(--marine); margin-top: .4rem; }
.fiche-vente__prix small { display: block; font-size: .8rem; color: var(--camel-action); text-transform: uppercase; letter-spacing: .08em; }
.fiche-vente__galerie { display: flex; gap: .6rem; overflow-x: auto; scroll-snap-type: x mandatory; padding: 1.6rem 0; -webkit-overflow-scrolling: touch; }
.fiche-vente__photo { flex: 0 0 min(88%, 780px); scroll-snap-align: center; margin: 0; border-radius: var(--rayon-lg); overflow: hidden; background: var(--sable); }
.fiche-vente__photo img { width: 100%; aspect-ratio: 16 / 10; object-fit: cover; display: block; }
.fiche-vente__corps { display: grid; gap: clamp(1.5rem, 4vw, 2.5rem); grid-template-columns: minmax(0, 1fr); }
.fiche-vente__equipements { list-style: none; padding: 0; margin: 1rem 0 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: .6rem; }
.fiche-vente__equipements li { display: flex; align-items: center; gap: .5rem; color: var(--marine); }
.fiche-vente__equipements svg { color: var(--camel-action); flex: none; }
.fiche-vente__specs { display: grid; grid-template-columns: auto 1fr; gap: .4rem 1rem; margin: 0; }
.fiche-vente__specs dt { color: var(--marine-70); font-size: .9rem; }
.fiche-vente__specs dd { margin: 0; color: var(--marine); font-weight: 600; text-align: right; }

.carte-info { background: var(--blanc); border-radius: var(--rayon-lg); padding: 1.4rem 1.5rem; box-shadow: var(--ombre); margin-bottom: 1.2rem; }
.carte-info h2 { font-size: 1.15rem; margin-bottom: .8rem; }
.carte-info--contact { background: var(--sable); }
.carte-info--contact .btn { margin-top: 1rem; width: 100%; }
.carte-info__legal { margin-top: .8rem; font-size: .82rem; text-align: center; }
.carte-info__legal a { color: var(--marine-70); }

.lien-retour { display: inline-block; margin: 1.2rem 0 .4rem; color: var(--camel-action); font-weight: 600; }

@media (min-width: 900px) {
  .fiche-vente__corps { grid-template-columns: minmax(0, 1fr) 340px; align-items: start; }
  .fiche-vente__aside { position: sticky; top: 100px; }
}

/* --- Expériences ----------------------------------------------------------
   La page commence par une introduction éditoriale, sans hero promotionnel.
   Les collections sont des rails tactiles natifs : le contenu reste accessible
   sans JavaScript, au clavier comme au doigt. */
.experiences-page { background: var(--blanc); }
.experiences-intro { padding-top: var(--espace-10); padding-bottom: clamp(2.5rem, 6vw, 5rem); }
/* Fil d'ariane des entrées éditoriales (Expériences, Vente) : même respiration
   avant le surtitre sur les trois pages qui partagent cette grammaire. */
.experiences-intro .fil-ariane,
.experience-fiche .fil-ariane,
.vente-intro .fil-ariane { margin-bottom: var(--espace-6); font-size: .82rem; color: var(--ardoise); }
.experiences-intro .fil-ariane a:hover,
.experience-fiche .fil-ariane a:hover,
.vente-intro .fil-ariane a:hover { color: var(--camel-action); }
.experiences-intro__grille { display: grid; gap: var(--espace-6); }
.experiences-intro__grille h1 { max-width: 12ch; margin-top: var(--espace-3); }
.experiences-intro__texte { max-width: 58ch; }
.experiences-intro__texte > p:first-child { font-size: clamp(1.05rem, 2vw, 1.25rem); color: var(--marine); }
.experiences-intro__note { margin-top: var(--espace-4); padding-left: var(--espace-4); border-left: 2px solid var(--camel); font-size: .9rem; }
.experiences-vide__icone { display: inline-flex; align-items: center; justify-content: center; width: 56px; height: 56px; margin-bottom: var(--espace-4); border-radius: 50%; color: var(--camel-action); background: var(--blanc); }
.experiences-vide h2 { margin-bottom: var(--espace-3); }
.experiences-vide .btn { margin-top: var(--espace-6); }

.experience-vedette { display: grid; padding-inline: 0; color: var(--sable); background: var(--marine); overflow: hidden; }
.experience-vedette__media { min-height: 280px; background: #0d1d2b; }
.experience-vedette__media img { width: 100%; height: 100%; min-height: 280px; object-fit: cover; }
.experience-vedette__placeholder,
.experience-fiche__placeholder,
.experience-carte__placeholder { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: var(--camel); background: linear-gradient(145deg, #172f45, #0c1b28); }
.experience-vedette__contenu { display: flex; flex-direction: column; align-items: flex-start; justify-content: center; padding: clamp(2rem, 7vw, 4.5rem) var(--gouttiere); }
.experience-vedette__contenu h2 { margin: var(--espace-2) 0 var(--espace-4); color: var(--blanc); font-size: clamp(1.8rem, 5vw, 3rem); }
.experience-vedette__contenu > p:not(.experience-vedette__collection) { color: rgba(246,241,234,.78); }
.experience-vedette__label { font-size: .7rem; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: var(--camel); }
.experience-vedette__collection { margin-top: var(--espace-6); font-size: .82rem; color: rgba(246,241,234,.62); }
.experience-vedette__faits { display: flex; flex-wrap: wrap; gap: var(--espace-3) var(--espace-6); margin: var(--espace-6) 0; font-size: .84rem; color: var(--sable); }
.experience-vedette__faits span { display: inline-flex; align-items: center; gap: var(--espace-2); }

.experiences-explorer { display: grid; gap: var(--espace-6); padding-block: clamp(var(--espace-10), 6vw, 4rem); }
.experiences-explorer h2 { margin-bottom: var(--espace-3); }
.experiences-explorer__liens { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--espace-2); }
.experiences-explorer__liens a { display: grid; grid-template-columns: minmax(0, 1fr) auto; min-height: 56px; align-items: center; gap: var(--espace-2); padding: var(--espace-3) var(--espace-4); border: 1px solid var(--ardoise-30); border-radius: var(--rayon); font-size: .82rem; font-weight: 600; line-height: 1.3; transition: color var(--transition), border-color var(--transition), background var(--transition); }
.experiences-explorer__liens a span { display: grid; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--ardoise); background: var(--sable); font-variant-numeric: tabular-nums; }
.experiences-explorer__liens a:hover { border-color: var(--marine); color: var(--blanc); background: var(--marine); }
.experiences-explorer__liens a:hover span { color: var(--marine); background: var(--camel); }
.experiences-collections { background: var(--sable); }
.experience-collection { padding-block: clamp(var(--espace-10), 6vw, 4rem); scroll-margin-top: calc(72px + var(--espace-6)); }
.experience-collection + .experience-collection { border-top: 1px solid rgba(106,114,133,.18); }
.experience-collection__entete { display: grid; gap: var(--espace-3); margin-bottom: var(--espace-6); }
.experience-collection__entete p { max-width: 56ch; }
.experience-collection__entete--entreprises { max-width: 720px; gap: var(--espace-2); padding-bottom: var(--espace-6); border-bottom: 1px solid rgba(19,38,56,.22); }
.experience-collection__entete--entreprises h2 { max-width: 24ch; }
.experience-collection__entete--entreprises p { max-width: 60ch; color: var(--marine-70); font-size: 1rem; }
.experience-rail { display: grid; grid-auto-flow: column; grid-auto-columns: clamp(240px, 76vw, 280px); gap: var(--espace-3); margin-inline: calc(var(--gouttiere) * -1); padding: var(--espace-2) var(--gouttiere) var(--espace-4); overflow-x: auto; overscroll-behavior-inline: contain; scroll-padding-inline: var(--gouttiere); scroll-snap-type: inline mandatory; scrollbar-width: thin; scrollbar-color: var(--camel) transparent; }
.experience-rail > * { scroll-snap-align: start; }
.experience-rail__item { width: auto; max-width: none; min-width: 0; flex-basis: auto; }
.experience-rail-wrap .rail__fleche { display: none; width: 44px; height: 44px; }
.experience-carte { min-width: 0; height: 100%; background: var(--blanc); border: 1px solid rgba(106,114,133,.14); border-radius: var(--rayon); overflow: hidden; transition: transform var(--transition), border-color var(--transition); }
.experience-carte:hover { transform: translateY(-4px); border-color: rgba(148,107,70,.5); }
.experience-carte__lien { display: flex; flex-direction: column; height: 100%; }
.experience-carte__media { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--marine); }
.experience-carte__media img { width: 100%; height: 100%; object-fit: cover; transition: transform 500ms ease; }
.experience-carte:hover .experience-carte__media img { transform: scale(1.035); }
.experience-carte__collection { position: absolute; left: var(--espace-3); bottom: var(--espace-3); padding: var(--espace-2) var(--espace-3); border-radius: 999px; color: var(--blanc); background: rgba(19,38,56,.86); backdrop-filter: blur(6px); font-size: .68rem; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; }
.experience-carte__corps { display: flex; flex: 1; flex-direction: column; padding: var(--espace-4); }
.experience-carte__corps h3 { display: -webkit-box; overflow: hidden; font-size: 1.08rem; line-height: 1.3; overflow-wrap: anywhere; hyphens: auto; text-wrap: balance; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }
.experience-carte__corps > p { display: -webkit-box; overflow: hidden; margin-top: var(--espace-2); font-size: .84rem; line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
.experience-carte__meta { display: grid; gap: var(--espace-2); margin-top: var(--espace-3); color: var(--ardoise); font-size: .76rem; }
.experience-carte__meta span { display: flex; align-items: flex-start; gap: var(--espace-2); }
.experience-carte__meta svg { flex: none; margin-top: 2px; color: var(--camel-action); }
.experience-carte__action { display: inline-flex; align-items: center; gap: var(--espace-2); margin-top: auto; padding-top: var(--espace-4); color: var(--camel-action); font-size: .8rem; font-weight: 600; }
.experience-cta-route { color: var(--sable); background: var(--marine); }
.experience-cta-route__interieur { display: grid; gap: var(--espace-6); padding-block: var(--espace-10); }
.experience-cta-route__titre,
.experience-cta-route__suite { display: grid; align-content: center; gap: var(--espace-3); }
.experience-cta-route__label,
.experience-cta-yacht__label { display: inline-flex; align-items: center; gap: var(--espace-2); color: var(--camel); font-size: .82rem; font-weight: 600; }
.experience-cta-route h2 { max-width: 22ch; color: var(--blanc); text-wrap: balance; }
.experience-cta-route p { max-width: 55ch; color: rgba(246,241,234,.82); text-wrap: pretty; }
.experience-cta-route .btn { width: 100%; margin-top: var(--espace-1); }
.experience-cta-yacht { padding-block: var(--espace-6); }
.experience-cta-yacht__interieur { display: grid; max-width: 960px; gap: var(--espace-4); margin-inline: auto; padding: var(--espace-6); color: var(--sable); background: var(--marine); border-radius: var(--rayon); }
.experience-cta-yacht__titre,
.experience-cta-yacht__suite { display: grid; align-content: center; gap: var(--espace-3); }
.experience-cta-yacht__label { color: var(--camel); }
.experience-cta-yacht h2 { max-width: 22ch; color: var(--blanc); text-wrap: balance; }
.experience-cta-yacht p { max-width: 58ch; color: rgba(246,241,234,.82); text-wrap: pretty; }
.experience-cta-yacht .btn { width: 100%; margin-top: var(--espace-1); }
.experience-compose { display: grid; width: calc(100% - (var(--gouttiere) * 2)); max-width: 960px; gap: var(--espace-6); margin-block: clamp(var(--espace-10), 5vw, 4rem); padding: clamp(var(--espace-6), 4vw, var(--espace-10)); color: var(--sable); background: var(--marine); border-radius: var(--rayon-lg); overflow: hidden; }
.experience-compose__titre,
.experience-compose__suite { display: grid; align-content: center; gap: var(--espace-3); }
.experience-compose h2 { color: var(--blanc); }
.experience-compose p { max-width: 58ch; color: rgba(246,241,234,.75); }
.experience-compose .btn { width: 100%; margin-top: var(--espace-1); }

/* Fiche expérience : image et synthèse au-dessus, contenu éditorial puis
   encart de demande stable à droite sur grand écran. */
.experience-fiche .fil-ariane { margin-bottom: clamp(var(--espace-4), 3vw, var(--espace-6)); }
.experience-fiche__tete { padding-block: clamp(var(--espace-6), 5vw, var(--espace-10)); background: var(--sable); }
.experience-fiche__hero { display: grid; overflow: hidden; background: var(--blanc); border-radius: var(--rayon); }
.experience-fiche__visuel { min-height: 240px; aspect-ratio: 4 / 3; background: var(--marine); }
.experience-fiche__visuel img { width: 100%; height: 100%; object-fit: cover; }
.experience-fiche__hero--sans-photo .experience-fiche__visuel { min-height: 200px; aspect-ratio: 16 / 9; }
.experience-fiche__resume { display: flex; min-width: 0; flex-direction: column; justify-content: center; padding: clamp(var(--espace-6), 5vw, var(--espace-10)); }
.experience-fiche__resume h1 { max-width: 13ch; font-size: clamp(2rem, 5vw, 3.5rem); letter-spacing: -.02em; overflow-wrap: anywhere; text-wrap: balance; }
.experience-fiche__collection { margin-bottom: var(--espace-3); color: var(--camel-action); font-size: .72rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; }
.experience-fiche__accroche { max-width: 44ch; margin-top: var(--espace-4); font-size: clamp(1rem, 2vw, 1.18rem); color: var(--marine); text-wrap: pretty; }
.experience-fiche__faits { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1px; margin-block: var(--espace-6); background: rgba(106,114,133,.2); border: 1px solid rgba(106,114,133,.2); }
.experience-fiche__faits div { padding: var(--espace-3); background: var(--blanc); }
.experience-fiche__faits dt { color: var(--ardoise); font-size: .66rem; letter-spacing: .08em; text-transform: uppercase; }
.experience-fiche__faits dd { margin-top: var(--espace-1); color: var(--marine); font-size: .86rem; line-height: 1.4; overflow-wrap: anywhere; }
.experience-fiche__faits > div:last-child:nth-child(odd) { grid-column: 1 / -1; }
.experience-fiche__photos { display: grid; grid-auto-flow: column; grid-auto-columns: min(74vw, 420px); gap: var(--espace-3); padding-block: var(--espace-6); overflow-x: auto; scroll-snap-type: inline mandatory; }
.experience-fiche__photos img { width: 100%; height: 240px; object-fit: cover; border-radius: var(--rayon); scroll-snap-align: start; }
.experience-fiche__contenu { padding-block: clamp(var(--espace-10), 7vw, 5rem); }
.experience-fiche__grille { display: grid; gap: clamp(var(--espace-6), 5vw, var(--espace-10)); }
.experience-fiche__principal { min-width: 0; }
.experience-fiche__introduction h2,
.experience-fiche__bloc h2 { margin-bottom: var(--espace-4); font-size: clamp(1.35rem, 3vw, 1.8rem); }
.experience-fiche__description { margin: 0; font-size: 1.03rem; }
.experience-fiche__description p:last-child { margin-bottom: 0; }
.experience-fiche__introduction + .experience-fiche__bloc,
.experience-fiche__introduction + .experience-fiche__double,
.experience-fiche__bloc + .experience-fiche__bloc,
.experience-fiche__bloc + .experience-fiche__double,
.experience-fiche__double + .experience-fiche__bloc { margin-top: clamp(var(--espace-6), 4vw, var(--espace-10)); }
.experience-fiche__double { display: grid; gap: clamp(var(--espace-6), 4vw, var(--espace-10)); }
.experience-fiche__double > .experience-fiche__bloc { margin-top: 0; }
.experience-fiche__details { display: grid; gap: 1px; border: 1px solid var(--ardoise-30); background: var(--ardoise-30); }
.experience-fiche__details div { display: flex; justify-content: space-between; gap: var(--espace-4); padding: var(--espace-3) var(--espace-4); background: var(--blanc); }
.experience-fiche__details dt { color: var(--ardoise); }
.experience-fiche__details dd { text-align: right; font-weight: 600; }
.experience-fiche__aside .encart-demande { border-radius: var(--rayon); box-shadow: none; }
.experience-fiche__aside .encart-demande p { margin-top: var(--espace-4); font-size: .88rem; }
.experience-fiche__aside .encart-demande .btn { margin-top: var(--espace-6); }
.experience-fiche__prix { display: block; font-family: var(--serif); font-size: clamp(1.45rem, 4vw, 2rem); color: var(--marine); }
.experience-options { display: grid; gap: 1px; border: 1px solid var(--ardoise-30); background: var(--ardoise-30); }
.experience-option { display: flex; justify-content: space-between; gap: var(--espace-4); padding: var(--espace-4); background: var(--blanc); }
.experience-option h3 { font-family: var(--sans); font-size: .95rem; }
.experience-option p { margin-top: var(--espace-1); font-size: .82rem; }
.experience-option > strong { flex: none; color: var(--camel-action); font-size: .85rem; }
.experience-similaires { overflow: hidden; }
.experience-fiche > .section { padding-block: clamp(3rem, 7vw, 5rem); }

@media (min-width: 760px) {
  .experiences-intro__grille { grid-template-columns: minmax(0, .9fr) minmax(0, 1fr); align-items: end; }
  .experience-collection__entete { grid-template-columns: minmax(0, .7fr) minmax(0, 1fr); align-items: end; }
  .experience-collection__entete--entreprises { grid-template-columns: 1fr; align-items: start; }
  .experiences-explorer__liens { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .experience-rail { grid-auto-columns: clamp(240px, 34vw, 280px); gap: var(--espace-4); margin-inline: 0; padding-inline: 0; scroll-padding-inline: 0; scroll-snap-type: inline proximity; }
  .experience-rail-wrap.rail--defilable .rail__fleche { display: flex; }
  .experience-cta-route__interieur { grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); align-items: center; }
  .experience-cta-route__suite { grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--espace-6); }
  .experience-cta-route .btn { width: auto; margin-top: 0; }
  .experience-cta-yacht__interieur { grid-template-columns: minmax(0, .85fr) minmax(280px, 1.15fr); align-items: center; gap: var(--espace-10); padding: var(--espace-10); }
  .experience-cta-yacht .btn { width: fit-content; margin-top: var(--espace-1); }
  .experience-compose { grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); align-items: center; }
  .experience-compose .btn { width: fit-content; }
  .experience-fiche__double { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .experience-fiche__photos { grid-auto-columns: min(42vw, 480px); }
}

@media (min-width: 840px) {
  .experience-fiche__hero { grid-template-columns: minmax(0, 1.05fr) minmax(420px, .95fr); }
  .experience-fiche__visuel { min-height: 460px; aspect-ratio: auto; }
  .experience-fiche__hero--sans-photo { grid-template-columns: minmax(280px, .72fr) minmax(440px, 1.28fr); }
  .experience-fiche__hero--sans-photo .experience-fiche__visuel { min-height: 360px; aspect-ratio: auto; }
}

@media (min-width: 960px) {
  .experience-vedette { grid-template-columns: minmax(0, 1.15fr) minmax(380px, .85fr); }
  .experience-vedette__media,
  .experience-vedette__media img { min-height: 540px; }
  .experience-vedette__collection { margin-top: 0; }
  .experiences-explorer { grid-template-columns: minmax(280px, .7fr) minmax(0, 1.3fr); align-items: center; }
  .experience-rail { grid-auto-columns: clamp(248px, 24vw, 280px); }
  .experience-fiche__grille { grid-template-columns: minmax(0, 1fr) minmax(280px, 320px); align-items: start; }
  .experience-fiche__aside { position: sticky; top: calc(72px + var(--espace-6)); }
}

@media (max-width: 420px) {
  .experience-option { flex-direction: column; gap: var(--espace-2); }
}

@media (max-width: 359px) {
  .experiences-explorer__liens { grid-template-columns: 1fr; }
}

@media (prefers-reduced-motion: reduce) {
  .experience-carte,
  .experience-carte__media img { transition: none; }
}

/* --- Barre d'actions flottante -------------------------------------------
   Point d'entrée unique vers les cinq canaux de contact. La barre reste
   compacte et lisible sur 320 px, sans recouvrir durablement le pied de page. */
.barre-actions {
  position: fixed;
  z-index: var(--z-barre-actions);
  left: 50%;
  bottom: calc(10px + env(safe-area-inset-bottom, 0px));
  width: calc(100% - 32px);
  max-width: 440px;
  min-height: 54px;
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  align-items: center;
  gap: 2px;
  padding: 5px;
  border-radius: 999px;
  color: var(--blanc);
  background: rgba(19, 38, 56, .94);
  box-shadow: 0 4px 8px rgba(8, 18, 28, .24);
  transform: translateX(-50%);
  transition: opacity var(--transition), transform var(--transition), visibility var(--transition);
}
@supports (backdrop-filter: blur(12px)) {
  .barre-actions { background: rgba(19, 38, 56, .86); backdrop-filter: blur(12px) saturate(1.15); }
}

.barre-actions__action {
  position: relative;
  min-width: 44px;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--espace-2);
  border-radius: 999px;
  color: var(--blanc);
  transition: color var(--transition), background-color var(--transition), transform var(--transition);
}
.barre-actions__action:hover { color: var(--camel); background: rgba(246, 241, 234, .08); }
.barre-actions__action:active { transform: scale(.96); }
.barre-actions__action--whatsapp { color: var(--blanc); background: var(--whatsapp); }
.barre-actions__action--whatsapp:hover { color: var(--blanc); background: var(--whatsapp-hover); }
.barre-actions__action--devis { color: var(--blanc); background: var(--camel-action); }
.barre-actions__action--devis:hover { color: var(--blanc); background: var(--camel-action-hover); }
.barre-actions__action--devis span { display: none; font-weight: 600; font-size: .9rem; white-space: nowrap; }

@media (hover: hover) {
  .barre-actions__action[data-tooltip]::after {
    content: attr(data-tooltip);
    position: absolute;
    z-index: var(--z-tooltip);
    left: 50%;
    bottom: calc(100% + var(--espace-3));
    width: max-content;
    max-width: 180px;
    padding: 6px 9px;
    border-radius: 6px;
    background: var(--marine);
    color: var(--blanc);
    font-size: .75rem;
    line-height: 1.25;
    box-shadow: var(--ombre);
    opacity: 0;
    pointer-events: none;
    transform: translate(-50%, 4px);
    transition: opacity var(--transition), transform var(--transition);
  }
  .barre-actions__action[data-tooltip]:hover::after,
  .barre-actions__action[data-tooltip]:focus-visible::after {
    opacity: 1;
    transform: translate(-50%, 0);
  }
}

body.avec-barre-actions .pied {
  padding-bottom: calc(5.25rem + env(safe-area-inset-bottom, 0px));
}
body.avec-barre-actions .cookies {
  bottom: calc(4.75rem + env(safe-area-inset-bottom, 0px));
}
body.panneau-ouvert .barre-actions,
body.menu-mobile-ouvert .barre-actions {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translate(-50%, 12px);
}

/* Panneaux natifs : focus, Échap et modalité sont fournis par <dialog>. */
.panneau-action {
  width: min(100%, 720px);
  max-width: none;
  max-height: calc(100dvh - 12px);
  margin: auto 0 0;
  border: 0;
  border-radius: 16px 16px 0 0;
  color: var(--marine);
  background: var(--blanc);
  box-shadow: 0 -18px 56px rgba(8, 18, 28, .22);
  overflow: hidden;
  opacity: 0;
  transform: translateY(18px);
  transition: opacity var(--transition), transform var(--transition), display var(--transition) allow-discrete;
}
.panneau-action[open] { opacity: 1; transform: none; }
.panneau-action::backdrop {
  background: rgba(8, 18, 28, .62);
  backdrop-filter: blur(3px);
}
.panneau-action__coque { max-height: calc(100dvh - 12px); display: flex; flex-direction: column; }
.panneau-action__entete {
  flex: none;
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--espace-4);
  padding: var(--espace-6) var(--espace-4) var(--espace-4);
  border-bottom: 1px solid rgba(106, 114, 133, .18);
  background: var(--blanc);
}
.panneau-action__entete h2 { margin-top: 2px; font-size: clamp(1.35rem, 6vw, 1.8rem); }
.panneau-action__entete p:not(.panneau-action__surtitre) { margin-top: var(--espace-2); font-size: .9rem; line-height: 1.5; }
.panneau-action__surtitre {
  color: var(--camel-action);
  font-size: .72rem;
  font-weight: 600;
  letter-spacing: .14em;
  line-height: 1.2;
  text-transform: uppercase;
}
.panneau-action__fermer {
  flex: 0 0 44px;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  color: var(--marine);
  background: var(--sable);
  transition: background-color var(--transition), transform var(--transition);
}
.panneau-action__fermer:hover { background: #ebe2d6; transform: rotate(4deg); }
.panneau-action__corps { min-height: 0; padding: var(--espace-4); overflow-y: auto; overscroll-behavior: contain; }
.panneau-action__corps--chat { position: relative; min-height: min(600px, 66dvh); padding: 0; background: var(--sable); }
.panneau-action__confidentialite { flex: none; padding: var(--espace-3) var(--espace-4); font-size: .75rem; line-height: 1.4; text-align: center; }
.panneau-action__confidentialite a,
.formulaire-rapide__lien-complet { color: var(--camel-action); text-decoration: underline; text-underline-offset: 2px; }

/* Recherche mobile : panneau court partagé par le CTA du hero et celui du menu. */
.recherche-mobile-dialogue { width: min(100%, 520px); }
.recherche-mobile-form__grille { display: grid; gap: var(--espace-3); }
.recherche-mobile-form .champ { margin: 0; }
.recherche-mobile-form .btn { margin-top: var(--espace-4); }

.zapier-chatbot { display: block; width: 100%; min-height: min(600px, 66dvh); }
.zapier-etat {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--espace-3);
  padding: var(--espace-6);
  text-align: center;
  background: var(--sable);
}
.zapier-etat[hidden] { display: none; }
.zapier-etat__indicateur { width: 28px; height: 28px; border: 3px solid rgba(19, 38, 56, .18); border-top-color: var(--camel-action); border-radius: 50%; animation: tourner .8s linear infinite; }
.zapier-etat--erreur p { color: var(--marine); }
@keyframes tourner { to { transform: rotate(360deg); } }

.formulaire-rapide__grille { display: grid; gap: var(--espace-3); }
.formulaire-rapide .champ { margin: 0; }
.formulaire-rapide .champ label { display: block; margin-bottom: var(--espace-1); font-size: .82rem; font-weight: 600; color: var(--marine); }
.formulaire-rapide input,
.formulaire-rapide select,
.formulaire-rapide textarea {
  width: 100%;
  min-height: 46px;
  padding: 10px 12px;
  border: 1px solid rgba(106, 114, 133, .36);
  border-radius: 8px;
  color: var(--marine);
  background: var(--blanc);
  font: inherit;
}
.formulaire-rapide textarea { min-height: 88px; resize: vertical; }
.formulaire-rapide input:focus,
.formulaire-rapide select:focus,
.formulaire-rapide textarea:focus { border-color: var(--camel-action); outline: 2px solid rgba(148, 107, 70, .18); outline-offset: 1px; }
.formulaire-rapide [aria-invalid="true"] { border-color: #b42318; }
.formulaire-rapide__aide { margin-top: calc(var(--espace-2) * -1); font-size: .78rem; line-height: 1.4; }
.formulaire-rapide__consentement { margin-top: var(--espace-4); align-items: flex-start; font-size: .8rem; line-height: 1.4; }
.formulaire-rapide__consentement input { width: 18px; min-height: 18px; margin-top: 2px; }
.formulaire-rapide__actions { margin-top: var(--espace-4); display: flex; flex-direction: column-reverse; align-items: stretch; gap: var(--espace-3); }
.formulaire-rapide__lien-complet { align-self: center; font-size: .82rem; }
.formulaire-rapide__etat { min-height: 1.5em; margin-top: var(--espace-2); font-size: .84rem; text-align: center; }
.formulaire-rapide__etat.est-erreur { color: #b42318; }
.formulaire-rapide__etat.est-succes { color: #176b4d; }
.formulaire-rapide [hidden] { display: none !important; }

@media (min-width: 640px) {
  .barre-actions {
    bottom: calc(var(--espace-4) + env(safe-area-inset-bottom, 0px));
    grid-template-columns: repeat(4, 44px) minmax(170px, 1fr);
    gap: 6px;
    padding: 5px 7px;
  }
  .barre-actions__action--devis span { display: inline; }
  body.avec-barre-actions .pied { padding-bottom: calc(6rem + env(safe-area-inset-bottom, 0px)); }
  body.avec-barre-actions .cookies { bottom: calc(5.25rem + env(safe-area-inset-bottom, 0px)); }
  .panneau-action {
    width: min(calc(100% - 32px), 720px);
    max-height: min(860px, calc(100dvh - 48px));
    margin: auto;
    border-radius: 16px;
    box-shadow: 0 24px 70px rgba(8, 18, 28, .3);
    transform: translateY(10px) scale(.985);
  }
  .panneau-action[open] { transform: none; }
  .panneau-action--assistant { width: min(calc(100% - 32px), 480px); }
  .recherche-mobile-dialogue { width: min(calc(100% - 32px), 520px); }
  .panneau-action__coque { max-height: min(860px, calc(100dvh - 48px)); }
  .panneau-action__entete { padding: var(--espace-6); }
  .panneau-action__corps { padding: var(--espace-6); }
  .panneau-action__corps--chat { padding: 0; }
  .panneau-action__confidentialite { padding-inline: var(--espace-6); }
  .formulaire-rapide__grille { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--espace-4); }
  .recherche-mobile-form__grille { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--espace-4); }
  .recherche-mobile-form__invites { grid-column: 1 / -1; }
  .formulaire-rapide__large { grid-column: 1 / -1; }
  .formulaire-rapide__actions { flex-direction: row; align-items: center; justify-content: space-between; }
}

@media (max-height: 520px) and (orientation: landscape) {
  .barre-actions { bottom: calc(var(--espace-2) + env(safe-area-inset-bottom, 0px)); }
  .panneau-action { max-height: 100dvh; border-radius: 0; }
  .panneau-action__coque { max-height: 100dvh; }
  .panneau-action__entete { padding-block: var(--espace-3); }
}

@media (prefers-reduced-motion: reduce) {
  .barre-actions,
  .barre-actions__action,
  .barre-actions__action[data-tooltip]::after,
  .panneau-action,
  .panneau-action__fermer { transition: none; }
  .zapier-etat__indicateur { animation: none; }
}
