@charset "UTF-8";
/* ==========================================================================
   LX2028 — HABITACLE : or mat sur cuir pleine fleur
   Refonte visuelle mylimousineparis.com — page d'accueil, EN APERCU.
   Feuille autonome, scopee sous .lx28, servie en <link> (cacheable).

   REGLES TENUES DANS CE FICHIER
   - Aucun opacity:0 / visibility:hidden / clip-path masquant sur un
     conteneur de texte au repos. Les apparitions sont ARMEES par la classe
     .lx-anim posee sur <html> par lx2028.js APRES hydratation, et vivent
     exclusivement sous @media (prefers-reduced-motion: no-preference).
   - Aucun !important sur un selecteur d'element nu. Les seuls !important
     sont portes par des selecteurs scopes (.lx28 ...) ou d'attribut
     ([data-r]) — ils servent a battre les 100 !important historiques de
     habitacle.css poses sur selecteurs nus (body p, h2, a, input...).
   - Aucun appel reseau : polices deja auto-hebergees, grain en data-URI,
     icones remixicon deja presentes. Zero Google Fonts.
   ========================================================================== */

/* ==========================================================================
   1. TOKENS  (declares dans les DEUX portees : hors de .lx28 le bouclier
      !important historique reprend la main)
   ========================================================================== */
:root,
.lx28 {
  /* --- FONDS SOMBRES --- */
  --lx-noir:        #0A0908;   /* oklch(14.1% .003 69.4) — fond global */
  --lx-cuir:        #15120E;   /* oklch(18.4% .009 75.0) — carte niveau 1 */
  --lx-cuir-2:      #1D1913;   /* oklch(21.6% .013 77.9) — champs, carte 2 */
  --lx-cuir-3:      #262019;   /* oklch(24.8% .016 71.3) — hover de carte */

  /* --- FONDS CLAIRS --- */
  --lx-clair:       #F7F4EE;   /* oklch(96.8% .009 84.6) */
  --lx-clair-2:     #EDE8DE;   /* oklch(93.2% .014 84.6) */

  /* --- TEXTE SUR SOMBRE --- */
  --lx-ivoire:      #F4F0E8;   /* titres, texte fort      17.50:1 / noir */
  --lx-ivoire-2:    #BDB4A5;   /* chapo, corps             9.70:1 / noir */
  --lx-ivoire-3:    #948B7C;   /* mentions — INTERDIT dans le hero (4.45:1) */

  /* --- TEXTE SUR CLAIR --- */
  --lx-encre:       #131110;   /* 17.15:1 / clair */
  --lx-encre-2:     #4E4840;   /*  8.23:1 / clair */
  --lx-encre-3:     #6E675D;   /*  5.09:1 / clair — jamais sous 16px */

  /* --- ACCENT UNIQUE : OR MAT (chroma .081, ne jamais depasser .09) --- */
  --lx-or:          #C9AC74;   /* SUR FOND SOMBRE UNIQUEMENT   9.13:1 */
  --lx-or-hover:    #DCC38F;   /*                             11.60:1 */
  --lx-or-fil:      #8A7346;   /* bordures de controle 4.38:1 / noir */
  --lx-or-clair:    #6E5A2A;   /* SUR FOND CLAIR UNIQUEMENT    6.06:1 */
  --lx-focus:       #E4CD9B;   /* anneau de focus             12.79:1 */
  --lx-or-a07:      rgba(201,172,116,.07);
  --lx-or-a10:      rgba(201,172,116,.10);
  --lx-or-a26:      rgba(201,172,116,.26);
  --lx-or-a55:      rgba(201,172,116,.55);

  /* --- FILETS --- */
  --lx-fil:         #332B22;                 /* decoratif pur (1.43:1) */
  --lx-fil-clair:   #DFD9CD;
  --lx-nav-bord:    rgba(244,240,232,.10);

  /* --- CONSTANTES DE LISIBILITE (figees, non esthetiques) ---------------
     Toute la table de contraste du hero et de la nav est calculee sur ces
     deux valeurs. Les modifier fait tomber les ratios SANS alerte visuelle.
     LX-VOILE-A = .88  -> pire fond possible sous le texte du hero : #272726
     LX-NAV-A   = .90  -> pire fond possible sous la nav pilule  : #22201F  */
  --lx-voile-a:     .88;
  --lx-voile:       rgba(10, 9, 8, .88);
  --lx-nav-bg:      rgba(10, 9, 8, .90);
  --lx-nav-bg-scroll: rgba(10, 9, 8, .96);

  /* --- TYPOGRAPHIE (0 Ko ajoute : les 4 woff2 existants suffisent) --- */
  --lx-sans:  "Archivo Variable", "Archivo", system-ui, -apple-system, "Segoe UI", sans-serif;
  --lx-serif: "Bodoni Moda Variable", "Bodoni Moda", Didot, "Times New Roman", serif;
  --lx-h1:    clamp(2.625rem, 1.30rem + 4.60vw, 5.00rem);   /*  42 ->  80 px */
  --lx-h2:    clamp(2.125rem, 1.55rem + 2.40vw, 3.50rem);   /*  34 ->  56 px */
  --lx-h3:    clamp(1.375rem, 1.15rem + 0.95vw, 1.875rem);  /*  22 ->  30 px */
  --lx-chapo: clamp(1.0625rem, 1.00rem + 0.28vw, 1.25rem);  /*  17 ->  20 px */
  --lx-corps: 1rem;
  --lx-petit: .8125rem;
  --lx-badge: .6875rem;
  --lx-nav-fs: .8125rem;
  --lx-lh-h1: .90; --lx-lh-h2: 1.00; --lx-lh-h3: 1.15;
  --lx-lh-chapo: 1.55; --lx-lh-corps: 1.65;
  --lx-ls-h1: -.030em; --lx-ls-h2: -.018em; --lx-ls-h3: -.004em;
  --lx-ls-badge: .22em; --lx-ls-nav: .08em; --lx-ls-cta: .01em;
  --lx-w-titre: 620; --lx-w-cta: 600;

  /* --- ESPACEMENTS --- */
  --lx-1: 4px;  --lx-2: 8px;  --lx-3: 12px; --lx-4: 16px; --lx-5: 24px;
  --lx-6: 32px; --lx-7: 48px; --lx-8: 64px; --lx-9: 96px; --lx-10: 128px;
  --lx-section: clamp(5.5rem, 3rem + 6vw, 10rem);
  --lx-gouttiere: clamp(1.25rem, .5rem + 3vw, 3rem);
  --lx-conteneur: 1240px;
  --lx-mesure: 52ch;
  --lx-gap: clamp(1rem, .5rem + 1.4vw, 1.5rem);

  /* --- RAYONS --- */
  --lx-r-carte: 20px; --lx-r-media: 16px; --lx-r-champ: 12px;
  --lx-r-pill: 999px; --lx-r-petit: 8px;

  /* --- OMBRES --- */
  --lx-sh-carte: inset 0 1px 0 rgba(244,240,232,.04), 0 24px 60px -32px rgba(0,0,0,.90);
  --lx-sh-carte-h: inset 0 1px 0 rgba(244,240,232,.06), 0 32px 72px -30px rgba(0,0,0,.95);
  --lx-sh-claire: 0 1px 2px rgba(19,17,16,.05), 0 24px 56px -34px rgba(19,17,16,.40);
  --lx-sh-cta: 0 12px 32px -16px rgba(201,172,116,.55);
  --lx-sh-nav: 0 8px 40px -20px rgba(0,0,0,.85);

  /* --- DUREES & COURBES --- */
  --lx-t-micro: 140ms; --lx-t-ui: 220ms; --lx-t-reveal: 520ms;
  --lx-t-nappe: 900ms; --lx-t-caret: 1100ms;
  --lx-e-out:  cubic-bezier(.22,.61,.36,1);
  --lx-e-soft: cubic-bezier(.16,1,.30,1);
  --lx-stagger: 60ms;

  /* --- COUCHES --- */
  --lx-z-fond: 0; --lx-z-contenu: 10; --lx-z-nav: 60; --lx-z-drawer: 80;

  /* --- GRAIN DE CUIR : ~700 octets, aucune requete reseau --- */
  --lx-grain: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='180' height='180'><filter id='g'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='180' height='180' filter='url(%23g)' opacity='0.5'/></svg>");
}

/* ==========================================================================
   2. BOUCLIER — neutralise les !important historiques poses sur selecteurs
      nus par l'ancienne feuille (body p, h2, a, input...). Selecteurs
      SCOPES uniquement, jamais nus.

      CONSEQUENCE A CONNAITRE : entre deux declarations !important, c'est la
      specificite qui tranche. Le bouclier remet donc `color` en heritage,
      et TOUTE couleur de composant ci-dessous doit elle aussi porter
      !important, sinon elle est battue par le bouclier. C'est la raison
      unique des !important qui suivent — aucun n'est decoratif.
   ========================================================================== */
.lx28 :is(h1, h2, h3, h4, p, ul, ol, li, a, span, small, label,
          input, select, textarea, button, figure, blockquote) {
  font-family: inherit !important;
  color: inherit !important;
  text-align: inherit !important;
  letter-spacing: inherit !important;
  text-transform: inherit !important;
  line-height: inherit !important;
}
.lx28 :is(ul, ol) { list-style: none !important; margin: 0 !important; padding: 0 !important; }

/* ==========================================================================
   3. BASE
   ========================================================================== */
.lx28 {
  position: relative;
  font-family: var(--lx-sans) !important;
  font-size: var(--lx-corps) !important;
  line-height: var(--lx-lh-corps) !important;
  color: var(--lx-ivoire-2) !important;
  background: var(--lx-noir) !important;
  font-feature-settings: "kern" 1, "liga" 1;
  font-optical-sizing: auto;
  -webkit-font-smoothing: antialiased;
  overflow-x: clip;
}
.lx28 *, .lx28 *::before, .lx28 *::after { box-sizing: border-box; }
.lx28 img, .lx28 svg, .lx28 picture { max-width: 100%; display: block; }
.lx28 img { height: auto; }

.lx28 .lx28-conteneur {
  width: 100%;
  max-width: var(--lx-conteneur);
  margin-inline: auto;
  padding-inline: var(--lx-gouttiere);
}

.lx28 a { color: inherit !important; text-decoration: none; }
.lx28 :focus-visible {
  outline: 2px solid var(--lx-focus);
  outline-offset: 2px;
  border-radius: var(--lx-r-petit);
}
.lx28-section--clair :focus-visible { outline-color: var(--lx-or-clair); }

.lx28 .lx28-saut {
  position: absolute; left: var(--lx-4); top: var(--lx-4);
  z-index: 999; padding: 10px 16px; border-radius: var(--lx-r-pill);
  background: var(--lx-or) !important; color: var(--lx-noir) !important;
  font-size: var(--lx-petit) !important; font-weight: 600 !important;
  transform: translateY(-160%); transition: transform var(--lx-t-ui) var(--lx-e-out);
}
.lx28 .lx28-saut:focus { transform: translateY(0); }

/* --- TYPO ---------------------------------------------------------------- */
.lx28 .lx28-h1 {
  font-size: var(--lx-h1) !important; line-height: var(--lx-lh-h1) !important;
  letter-spacing: var(--lx-ls-h1) !important; text-transform: uppercase !important;
  font-weight: var(--lx-w-titre) !important; font-variation-settings: "wght" 620;
  color: var(--lx-ivoire) !important; text-wrap: balance; hyphens: none;
  margin: 0;
}
.lx28 .lx28-h2 {
  font-size: var(--lx-h2) !important; line-height: var(--lx-lh-h2) !important;
  letter-spacing: var(--lx-ls-h2) !important; text-transform: uppercase !important;
  font-weight: var(--lx-w-titre) !important; font-variation-settings: "wght" 620;
  color: var(--lx-ivoire) !important; text-wrap: balance; margin: 0;
}
.lx28 .lx28-h3 {
  font-size: var(--lx-h3) !important; line-height: var(--lx-lh-h3) !important;
  letter-spacing: var(--lx-ls-h3) !important; text-transform: uppercase !important;
  font-weight: 600 !important; color: var(--lx-ivoire) !important; text-wrap: balance; margin: 0;
}
/* Le SEUL serif du site : un mot par titre, bas de casse, jamais ailleurs. */
.lx28 .lx28-it {
  font-family: var(--lx-serif) !important;
  font-style: italic !important; font-weight: 400 !important;
  font-size: 1.06em !important;                 /* compensation de hauteur d'x */
  letter-spacing: 0; text-transform: none !important;
  color: var(--lx-or) !important;
}
.lx28-section--clair .lx28-it { color: var(--lx-or-clair) !important; }

.lx28 .lx28-chapo {
  font-size: var(--lx-chapo) !important; line-height: var(--lx-lh-chapo) !important;
  color: var(--lx-ivoire-2) !important; max-width: var(--lx-mesure); margin: 0;
}
.lx28 .lx28-surtitre,
.lx28 .lx28-badge {
  font-size: var(--lx-badge) !important; font-weight: 600 !important; text-transform: uppercase !important;
  letter-spacing: var(--lx-ls-badge) !important; line-height: 1 !important;
}
.lx28 .lx28-mentions {
  font-size: var(--lx-petit) !important; line-height: 1.7 !important;
  color: var(--lx-ivoire-2) !important;       /* pas ivoire-3 : 4.45:1 dans le hero */
}
.lx28 .lx28-tel { font-variant-numeric: tabular-nums lining-nums; }

/* --- FILET --- */
.lx28 .lx28-filet { width: 72px; height: 1px; background: var(--lx-fil) !important; border: 0; margin: var(--lx-6) 0; }
.lx28-section--clair .lx28-filet { background: var(--lx-fil-clair) !important; }

/* --- BOUTONS ------------------------------------------------------------- */
.lx28 .lx28-cta,
.lx28 .lx28-cta-2 {
  display: inline-flex; align-items: center; justify-content: center;
  gap: var(--lx-2); min-height: 56px; padding: 0 28px;
  border-radius: var(--lx-r-pill); border: 1px solid transparent;
  font-size: .9375rem !important; font-weight: var(--lx-w-cta) !important;
  letter-spacing: var(--lx-ls-cta) !important; line-height: 1 !important;
  cursor: pointer; text-align: center !important;
  transition: background-color var(--lx-t-micro) var(--lx-e-out),
              border-color var(--lx-t-micro) var(--lx-e-out),
              box-shadow var(--lx-t-micro) var(--lx-e-out),
              transform var(--lx-t-micro) var(--lx-e-out);
}
.lx28 .lx28-cta { background: var(--lx-or) !important; color: var(--lx-noir) !important; }        /* 9.13:1 */
.lx28 .lx28-cta i { font-size: 1.1em !important; }
.lx28 .lx28-cta-2 { background: transparent !important; color: var(--lx-ivoire) !important; border-color: var(--lx-or-fil) !important; }
.lx28-section--clair .lx28-cta { background: var(--lx-or-clair) !important; color: var(--lx-clair) !important; } /* 6.06:1 */
.lx28-section--clair .lx28-cta-2 { color: var(--lx-encre) !important; border-color: #B9AE93 !important; }

@media (hover: hover) and (pointer: fine) {
  .lx28 .lx28-cta:hover { background: var(--lx-or-hover) !important; transform: translateY(-1px); box-shadow: var(--lx-sh-cta); }
  .lx28 .lx28-cta-2:hover { border-color: var(--lx-or) !important; }
  .lx28-section--clair .lx28-cta:hover { background: #5A4A22 !important; transform: translateY(-1px); }
}

/* Lien texte souligne — le CTA secondaire du hero, degrade en lien */
.lx28 .lx28-lien {
  display: inline-flex; align-items: center; gap: var(--lx-2);
  color: var(--lx-or) !important; text-decoration: underline;
  text-underline-offset: .28em; text-decoration-thickness: 1px;
  font-size: var(--lx-petit) !important; font-weight: 500 !important;
}
.lx28-section--clair .lx28-lien { color: var(--lx-or-clair) !important; }
@media (hover: hover) { .lx28 .lx28-lien:hover { color: var(--lx-or-hover) !important; } }

/* ==========================================================================
   4. NAVIGATION — pilule flottante
      NOTE : si la coquille 2027 rend deja sa propre nav, SUPPRIMER le bloc
      <header class="lx28-nav"> dans la vue PHP. Ne jamais le masquer en CSS.
   ========================================================================== */
.lx28 .lx28-nav {
  position: fixed; top: 18px; left: 50%; transform: translateX(-50%);
  z-index: var(--lx-z-nav);
  width: min(calc(100% - 32px), var(--lx-conteneur));
  height: 56px; padding: 0 8px 0 20px;
  display: flex; align-items: center; gap: var(--lx-4);
  border-radius: var(--lx-r-pill);
  background: var(--lx-nav-bg) !important;            /* .90 : pire fond compose #22201F */
  border: 1px solid var(--lx-nav-bord);
  box-shadow: var(--lx-sh-nav);
  transition: height var(--lx-t-ui) var(--lx-e-out),
              background-color var(--lx-t-ui) var(--lx-e-out);
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .lx28 .lx28-nav { -webkit-backdrop-filter: blur(16px) saturate(130%); backdrop-filter: blur(16px) saturate(130%); }
}
.lx-nav-compacte .lx28 .lx28-nav { height: 48px; background: var(--lx-nav-bg-scroll); }

.lx28 .lx28-nav__marque {
  font-weight: 600 !important; font-size: var(--lx-nav-fs) !important; letter-spacing: var(--lx-ls-nav) !important;
  text-transform: uppercase !important; color: var(--lx-ivoire) !important; white-space: nowrap;
}
.lx28 .lx28-nav__marque b { color: var(--lx-or) !important; font-weight: 600 !important; }
.lx28 .lx28-nav__liens { display: flex; align-items: center; gap: var(--lx-5); margin-inline: auto; }
.lx28 .lx28-nav__liens a {
  font-size: var(--lx-nav-fs) !important; font-weight: 500 !important; letter-spacing: var(--lx-ls-nav) !important;
  text-transform: uppercase !important; color: var(--lx-ivoire-2) !important; white-space: nowrap;
  transition: color var(--lx-t-micro) var(--lx-e-out);
}
@media (hover: hover) { .lx28 .lx28-nav__liens a:hover { color: var(--lx-ivoire) !important; } }
.lx28 .lx28-nav__tel {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--lx-nav-fs) !important; font-weight: 600 !important; color: var(--lx-or) !important;
  white-space: nowrap;
}
.lx28 .lx28-nav__cta {
  display: inline-flex; align-items: center; gap: 6px;
  height: 40px; padding: 0 18px; border-radius: var(--lx-r-pill);
  background: var(--lx-or) !important; color: var(--lx-noir) !important;
  font-size: var(--lx-nav-fs) !important; font-weight: 600 !important; letter-spacing: var(--lx-ls-cta) !important;
  white-space: nowrap; transition: background-color var(--lx-t-micro) var(--lx-e-out);
}
@media (hover: hover) { .lx28 .lx28-nav__cta:hover { background: var(--lx-or-hover) !important; } }
.lx28 .lx28-burger {
  display: none; align-items: center; justify-content: center;
  width: 44px; height: 44px; border-radius: var(--lx-r-pill);
  border: 1px solid var(--lx-nav-bord); background: transparent !important;
  color: var(--lx-ivoire) !important; font-size: 20px !important;
}

/* Sentinelle de scroll inseree par le JS (evite un listener scroll) */
.lx28 .lx28-sentinelle {
  position: absolute; top: 0; left: 0;
  width: 1px; height: 40px; pointer-events: none;
}

/* Drawer construit PAR LE JS a partir de #lx28-plan : aucun balisage
   masque n'est servi par le serveur. */
.lx28-drawer {
  border: 0; padding: 0; margin: 0; max-width: none; max-height: none;
  width: 100%; height: 100%;
  overflow-y: auto; overscroll-behavior: contain;
  background: var(--lx-noir) !important; color: var(--lx-ivoire) !important;
}
.lx28-drawer::backdrop { background: rgba(10,9,8,.86) !important; }
.lx28-drawer__inner { padding: 88px var(--lx-5) var(--lx-7); }
.lx28-drawer__fermer {
  position: absolute; top: 18px; right: 18px;
  width: 48px; height: 48px; border-radius: var(--lx-r-pill);
  border: 1px solid var(--lx-nav-bord); background: transparent !important;
  color: var(--lx-ivoire) !important; font-size: 22px !important; cursor: pointer;
}
.lx28-drawer a {
  display: block; padding: 14px 0; min-height: 48px;
  font-family: var(--lx-sans) !important; font-size: 1.375rem !important; font-weight: 600 !important;
  text-transform: uppercase !important; letter-spacing: -.01em !important;
  color: var(--lx-ivoire) !important; text-decoration: none;
  border-bottom: 1px solid var(--lx-fil);
}

/* ==========================================================================
   5. HERO — 4 couches CSS servies par le serveur, 0 Ko de JS
   ========================================================================== */
.lx28 .lx28-hero {
  position: relative; isolation: isolate;
  min-height: 680px; height: 100svh; max-height: 980px;
  display: flex; align-items: center;
  padding-block: 128px var(--lx-7);
  background: var(--lx-noir) !important;
  overflow: hidden;
}

/* Couche 0 — lumiere rasante */
.lx28 .lx28-hero::before {
  content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background: radial-gradient(120% 70% at 50% 78%, rgba(201,172,116,.10) 0%, transparent 68%) !important;
}

/* Couche 1 — LA NAPPE, en CSS pur (transposition de la nappe anmd) */
.lx28 .lx28-nappe {
  position: absolute; inset: -20% -10% -30%; z-index: 0; pointer-events: none;
  background-image:
    radial-gradient(circle 1.1px at 50% 50%, rgba(244,240,232,.16) 99%, transparent 100%),
    radial-gradient(circle 1px   at 50% 50%, rgba(244,240,232,.10) 99%, transparent 100%),
    radial-gradient(circle 1px   at 50% 50%, rgba(201,172,116,.09) 99%, transparent 100%);
  background-size: 28px 28px, 44px 44px, 68px 68px;
  background-position: 0 0, 9px 13px, 21px 5px;
  transform: perspective(900px) rotateX(64deg) translateZ(0);
  transform-origin: 50% 100%;
  -webkit-mask-image: radial-gradient(ellipse 82% 58% at 50% 38%, #000 8%, transparent 74%);
          mask-image: radial-gradient(ellipse 82% 58% at 50% 38%, #000 8%, transparent 74%);
}
/* Sans mask-image (vieux WebKit/Android), la nappe deviendrait un carre gris :
   on la remplace par une simple lueur. */
@supports not ((-webkit-mask-image: radial-gradient(#000, transparent)) or (mask-image: radial-gradient(#000, transparent))) {
  .lx28 .lx28-nappe {
    background-image: radial-gradient(ellipse 80% 55% at 50% 30%, rgba(244,240,232,.06), transparent 70%);
    transform: none;
  }
}

/* Couche 2 — la matiere : cadrage serre sellerie/poignee, sombre, desature.
   Fond CSS decoratif : aucune requete avant le LCP, aucun risque de CLS,
   et si le fichier manque le hero reste complet. */
.lx28 .lx28-hero__matiere {
  position: absolute; z-index: 1; pointer-events: none;
  inset: auto 0 0 auto; width: min(45vw, 620px); height: 78%;
  background-image: image-set(
    url("../images/hero/habitacle-sellerie.avif") type("image/avif"),
    url("../images/hero/limousine-nuit.webp")     type("image/webp"));
  background-image: -webkit-image-set(
    url("../images/hero/habitacle-sellerie.avif") type("image/avif"),
    url("../images/hero/limousine-nuit.webp")     type("image/webp"));
  background-size: cover; background-position: 62% 50%;
  filter: saturate(.42) contrast(1.04) brightness(.62);
  -webkit-mask-image: linear-gradient(to left, #000 8%, transparent 88%),
                      linear-gradient(to top,  transparent 0%, #000 26%);
          mask-image: linear-gradient(to left, #000 8%, transparent 88%),
                      linear-gradient(to top,  transparent 0%, #000 26%);
  -webkit-mask-composite: source-in; mask-composite: intersect;
}

/* Couche 3 — grain de cuir */
.lx28 .lx28-hero__grain {
  position: absolute; inset: 0; z-index: 2; pointer-events: none;
  background-image: var(--lx-grain); background-size: 180px;
  mix-blend-mode: overlay; opacity: .05;
}

/* Couche 4 — VOILE DE LISIBILITE. C'est lui qui borne le pire cas :
   .88 sur du blanc pur donne #272726 -> H1 a 13.16:1, chapo a 7.29:1. */
.lx28 .lx28-hero__voile {
  position: absolute; inset: 0; z-index: 3; pointer-events: none;
  background: linear-gradient(100deg, var(--lx-voile) 0 58%, rgba(10,9,8,0) 92%) !important;
}

.lx28 .lx28-hero__contenu { position: relative; z-index: 10; width: 100%; }
.lx28 .lx28-hero__col { max-width: min(62%, 820px); }
.lx28 .lx28-hero .lx28-surtitre { color: var(--lx-ivoire-2) !important; display: block; margin-bottom: var(--lx-5); }
.lx28 .lx28-hero .lx28-chapo { margin-top: var(--lx-5); }
.lx28 .lx28-hero__actions {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--lx-4);
  margin-top: var(--lx-7);
}
.lx28 .lx28-hero__mentions { margin-top: var(--lx-5); }
.lx28 .lx28-hero__mentions span + span::before { content: " · "; color: var(--lx-or) !important; }

/* Curseur : <span> vide, aria-hidden. Aucun texte n'est masque. */
.lx28 .lx28-caret {
  display: inline-block; width: 2px; height: .86em;
  margin-left: .12em; vertical-align: -.06em;
  background: var(--lx-or) !important;
}

/* Le canvas est cree par le JS ; sa boite est reservee par la nappe CSS. */
.lx28 .lx28-nappe-canvas {
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  transition: opacity var(--lx-t-nappe) linear;
}

/* --- BANDEAU DE SEGMENTATION (greffe ITINERAIRE) --- */
.lx28 .lx28-segments {
  position: relative; z-index: 10;
  background: var(--lx-noir) !important; border-top: 1px solid var(--lx-fil);
}
.lx28 .lx28-segments ul {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--lx-3) var(--lx-6);
  padding-block: var(--lx-5);
}
.lx28 .lx28-segments a {
  display: inline-flex; align-items: center; gap: var(--lx-3);
  font-size: var(--lx-petit) !important; font-weight: 600 !important; text-transform: uppercase !important;
  letter-spacing: var(--lx-ls-nav) !important; color: var(--lx-ivoire-2) !important;
  transition: color var(--lx-t-micro) var(--lx-e-out);
}
.lx28 .lx28-segments a::before {
  content: ""; width: 5px; height: 5px; border-radius: var(--lx-r-pill);
  background: var(--lx-or) !important; flex: none;
}
@media (hover: hover) { .lx28 .lx28-segments a:hover { color: var(--lx-ivoire) !important; } }

/* ==========================================================================
   6. SECTIONS
   ========================================================================== */
.lx28 .lx28-section { padding-block: var(--lx-section); position: relative; }
.lx28 .lx28-section--nuit  { background: var(--lx-noir) !important; color: var(--lx-ivoire-2) !important; }
.lx28 .lx28-section--clair { background: var(--lx-clair) !important; color: var(--lx-encre-2) !important; }
.lx28-section--clair .lx28-h2, .lx28-section--clair .lx28-h3 { color: var(--lx-encre) !important; }
.lx28-section--clair .lx28-chapo { color: var(--lx-encre-2) !important; }

.lx28 .lx28-entete { max-width: 780px; margin-bottom: var(--lx-8); }
.lx28 .lx28-entete--large { max-width: 900px; }
.lx28 .lx28-entete .lx28-badge { display: inline-flex; align-items: center; gap: var(--lx-2); }
.lx28 .lx28-entete .lx28-chapo { margin-top: var(--lx-5); }
.lx28 .lx28-pastilles--bloc { margin-bottom: var(--lx-8); }

.lx28 .lx28-badge {
  height: 26px; padding: 0 12px; border-radius: var(--lx-r-pill);
  display: inline-flex; align-items: center;
  color: var(--lx-or) !important; border: 1px solid var(--lx-or-a26); background: var(--lx-or-a07) !important;
}
.lx28-section--clair .lx28-badge { color: var(--lx-or-clair) !important; border-color: rgba(110,90,42,.28) !important; background: rgba(110,90,42,.06) !important; }

/* Chapo justifie : uniquement >= 1024px et sur 52ch, sinon rivieres. */
@media (min-width: 1024px) {
  .lx28 .lx28-chapo--justifie { text-align: justify !important; text-justify: inter-word; hyphens: auto; text-wrap: pretty; }
}

/* --- GRILLES --- */
.lx28 .lx28-grille { display: grid; gap: var(--lx-gap); }
.lx28 .lx28-grille--4 { grid-template-columns: 1fr; }
.lx28 .lx28-grille--3 { grid-template-columns: 1fr; }
@media (min-width: 768px)  { .lx28 .lx28-grille--4, .lx28 .lx28-grille--3 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1120px) { .lx28 .lx28-grille--3 { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1200px) { .lx28 .lx28-grille--4 { grid-template-columns: repeat(4, 1fr); } }

/* --- CARTE CUIR (objet signature) --- */
.lx28 .lx28-carte {
  position: relative; overflow: hidden;
  background-color: var(--lx-cuir) !important;
  background-image: var(--lx-grain),
    linear-gradient(158deg, rgba(201,172,116,.05), transparent 42%);
  background-size: 180px, auto;
  background-blend-mode: overlay, normal;
  border: 1px solid var(--lx-cuir-2);
  border-radius: var(--lx-r-carte);
  padding: clamp(24px, 2vw, 36px);
  box-shadow: var(--lx-sh-carte);
  color: var(--lx-ivoire-2) !important;
  transition: background-color var(--lx-t-ui) var(--lx-e-out),
              box-shadow var(--lx-t-ui) var(--lx-e-out);
  display: flex; flex-direction: column; gap: var(--lx-5);
}
/* Liseret en arc, angle superieur droit — decoratif, aucun texte dedans */
.lx28 .lx28-carte::before {
  content: ""; position: absolute; top: -1px; right: -1px;
  width: 160px; height: 160px; pointer-events: none;
  background: conic-gradient(from 200deg at 100% 0%, var(--lx-or-a55), transparent 38%) !important;
  /* anneau de 1.5 px : transparent a l'interieur, opaque sur 1.5 px,
     transparent au-dela. Sans le 4e arret, on obtient un aplat en coin. */
  -webkit-mask: radial-gradient(140px at 100% 0,
      transparent 0 calc(100% - 1.5px), #000 calc(100% - 1.5px) 100%, transparent 100%);
          mask: radial-gradient(140px at 100% 0,
      transparent 0 calc(100% - 1.5px), #000 calc(100% - 1.5px) 100%, transparent 100%);
}
@supports not ((-webkit-mask: radial-gradient(#000, transparent)) or (mask: radial-gradient(#000, transparent))) {
  .lx28 .lx28-carte::before { display: none; }
  .lx28 .lx28-carte { border-top-color: var(--lx-or-a26); }
}
/* La carte est un conteneur flex : sans align-self, la pilule et le lien
   s'etirent sur toute la largeur. */
.lx28 .lx28-carte > .lx28-badge,
.lx28 .lx28-carte > .lx28-lien { align-self: flex-start; }

@media (hover: hover) and (pointer: fine) {
  .lx28 .lx28-carte:hover { background-color: var(--lx-cuir-3) !important; box-shadow: var(--lx-sh-carte-h); }
}
.lx28 .lx28-carte .lx28-h3 { color: var(--lx-ivoire) !important; }

/* Carte claire (section 02) */
.lx28 .lx28-carte--claire {
  background-color: var(--lx-clair-2) !important;
  background-image: linear-gradient(158deg, rgba(110,90,42,.05), transparent 42%);
  border-color: var(--lx-fil-clair) !important;
  box-shadow: var(--lx-sh-claire);
  color: var(--lx-encre-2) !important;
}
.lx28 .lx28-carte--claire::before {
  background: conic-gradient(from 200deg at 100% 0%, rgba(110,90,42,.45), transparent 38%) !important;
}
.lx28 .lx28-carte--claire .lx28-h3 { color: var(--lx-encre) !important; }
@media (hover: hover) and (pointer: fine) {
  .lx28 .lx28-carte--claire:hover { background-color: #E7E1D5 !important; box-shadow: var(--lx-sh-carte-h); }
}

/* --- LISTE A PASTILLES --- */
.lx28 .lx28-liste { display: grid; gap: var(--lx-3); }
.lx28 .lx28-liste li {
  display: grid; grid-template-columns: 28px 1fr; gap: 14px;
  align-items: start; font-size: var(--lx-corps) !important; line-height: 1.6 !important;
}
.lx28 .lx28-pastille {
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; border-radius: var(--lx-r-pill);
  font-size: 15px !important; line-height: 1 !important;
  color: var(--lx-or) !important; background: var(--lx-or-a10) !important; border: 1px solid var(--lx-or-a26);
}
.lx28 .lx28-carte--claire .lx28-pastille,
.lx28-section--clair .lx28-pastille {
  color: var(--lx-or-clair) !important; background: rgba(110,90,42,.08) !important; border-color: rgba(110,90,42,.26) !important;
}

/* --- RANG DE LIENS (prestations reelles) --- */
.lx28 .lx28-pastilles { display: flex; flex-wrap: wrap; gap: var(--lx-2); margin-top: var(--lx-6); }
.lx28 .lx28-pastilles a {
  display: inline-flex; align-items: center; min-height: 40px; padding: 0 16px;
  border-radius: var(--lx-r-pill); border: 1px solid var(--lx-fil-clair);
  background: var(--lx-clair) !important; color: var(--lx-encre-2) !important;
  font-size: var(--lx-petit) !important; font-weight: 500 !important;
  transition: border-color var(--lx-t-micro) var(--lx-e-out), color var(--lx-t-micro) var(--lx-e-out);
}
@media (hover: hover) { .lx28 .lx28-pastilles a:hover { border-color: var(--lx-or-clair) !important; color: var(--lx-encre) !important; } }
.lx28-section--nuit .lx28-pastilles a {
  border-color: var(--lx-fil) !important; background: var(--lx-cuir) !important; color: var(--lx-ivoire-2) !important;
}
@media (hover: hover) { .lx28-section--nuit .lx28-pastilles a:hover { border-color: var(--lx-or-fil) !important; color: var(--lx-ivoire) !important; } }

/* ==========================================================================
   7. FLOTTE
   ========================================================================== */
.lx28 .lx28-vehicule__media {
  position: relative; aspect-ratio: 16 / 10; overflow: hidden;
  border-radius: var(--lx-r-media); background: var(--lx-cuir-2) !important;
  margin: calc(-1 * clamp(24px, 2vw, 36px)) calc(-1 * clamp(24px, 2vw, 36px)) 0;
  border-bottom: 1px solid var(--lx-cuir-2);
}
.lx28 .lx28-vehicule__media img {
  width: 100%; height: 100%; object-fit: cover;
  filter: saturate(.85) contrast(1.06);
}
.lx28 .lx28-vehicule__places {
  font-variant-numeric: tabular-nums lining-nums;
}

/* ==========================================================================
   8. LE DEROULE — 4 lignes horizontales, aucune carte
   ========================================================================== */
.lx28 .lx28-deroule { position: relative; display: grid; }
.lx28 .lx28-etape {
  display: grid; grid-template-columns: 88px 1fr; gap: var(--lx-5);
  align-items: start; padding-block: var(--lx-7);
  border-top: 1px solid var(--lx-fil-clair);
}
.lx28 .lx28-etape:last-child { border-bottom: 1px solid var(--lx-fil-clair); }
.lx28 .lx28-etape__num {
  font-family: var(--lx-serif) !important; font-style: italic !important; font-weight: 400 !important;
  font-size: clamp(2rem, 1.2rem + 2vw, 2.75rem) !important; line-height: 1 !important;
  color: var(--lx-or-clair) !important; font-variant-numeric: lining-nums;
}
.lx28 .lx28-etape__corps { display: grid; gap: var(--lx-3); }
.lx28 .lx28-etape__corps p { max-width: 46ch; }
@media (min-width: 900px) {
  .lx28 .lx28-etape { grid-template-columns: 88px minmax(0, 22ch) minmax(0, 1fr); align-items: baseline; }
  .lx28 .lx28-etape__corps { grid-column: 3; }
  .lx28 .lx28-etape .lx28-h3 { grid-column: 2; }
}
/* Progression au scroll : CSS pur, degradation propre, purement decoratif */
.lx28 .lx28-deroule__rail {
  position: absolute; left: 32px; top: 0; bottom: 0; width: 1px;
  background: var(--lx-fil-clair) !important; pointer-events: none;
}
.lx28 .lx28-deroule__rail span {
  display: block; width: 100%; height: 100%;
  background: linear-gradient(to bottom, var(--lx-or-clair), rgba(110,90,42,0)) !important;
  transform-origin: top; transform: scaleY(1);
}
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .lx28 .lx28-deroule__rail span {
      animation: lx-progression linear both;
      animation-timeline: view();
      animation-range: entry 25% cover 65%;
    }
  }
}
@keyframes lx-progression { from { transform: scaleY(0); } to { transform: scaleY(1); } }

/* ==========================================================================
   9. ZONES + FORMULAIRE
   ========================================================================== */
.lx28 .lx28-zones { display: flex; flex-wrap: wrap; gap: var(--lx-2); }

.lx28 .lx28-form { display: grid; gap: var(--lx-5); }
@media (min-width: 900px) { .lx28 .lx28-form { grid-template-columns: repeat(2, 1fr); } }
.lx28 .lx28-champ { display: grid; gap: var(--lx-2); }
.lx28 .lx28-champ--large { grid-column: 1 / -1; }
.lx28 .lx28-champ label { font-size: var(--lx-petit) !important; font-weight: 500 !important; color: var(--lx-ivoire-2) !important; }
.lx28 .lx28-champ input,
.lx28 .lx28-champ select,
.lx28 .lx28-champ textarea {
  width: 100%; min-height: 56px; padding: 0 16px;
  font-family: var(--lx-sans) !important; font-size: 1rem !important;   /* 16px : pas de zoom iOS */
  color: var(--lx-ivoire); background: var(--lx-cuir-2) !important;
  border: 1px solid var(--lx-or-fil);             /* 3.85:1 — pas le filet decoratif */
  border-radius: var(--lx-r-champ);
  transition: border-color var(--lx-t-micro) var(--lx-e-out);
}
.lx28 .lx28-champ textarea { min-height: 140px; padding: 16px; line-height: 1.6 !important; resize: vertical; }
.lx28 .lx28-champ select {
  appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--lx-or) 50%),
                    linear-gradient(135deg, var(--lx-or) 50%, transparent 50%);
  background-position: calc(100% - 22px) 25px, calc(100% - 16px) 25px;
  background-size: 6px 6px, 6px 6px; background-repeat: no-repeat;
  padding-right: 44px;
}
.lx28 .lx28-champ :is(input, select, textarea):focus { border-color: var(--lx-or) !important; }
.lx28 .lx28-champ ::placeholder { color: var(--lx-ivoire-3) !important; }
/* Leurre anti-spam : champ VIDE, sans contenu textuel, retire du flux et du
   parcours clavier. Volontairement en display:none et non en left:-9999px —
   le hors-ecran est la signature exacte que l'examen manuel recherche. */
.lx28 .lx28-leurre { display: none; }
.lx28 .lx28-form__pied { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: var(--lx-5); }
.lx28 .lx28-form__legal { font-size: var(--lx-petit) !important; color: var(--lx-ivoire-3) !important; max-width: 46ch; }

/* Mini-formulaire de la section 02 (fond clair) */
.lx28 .lx28-mini {
  margin-top: var(--lx-8); padding: clamp(20px, 2vw, 28px);
  background: var(--lx-clair-2) !important; border: 1px solid var(--lx-fil-clair);
  border-radius: var(--lx-r-carte);
  display: grid; gap: var(--lx-4);
}
@media (min-width: 900px) { .lx28 .lx28-mini { grid-template-columns: repeat(3, 1fr) auto; align-items: end; } }
.lx28 .lx28-mini label { font-size: var(--lx-petit) !important; font-weight: 500 !important; color: var(--lx-encre-2) !important; }
.lx28 .lx28-mini :is(input, select) {
  width: 100%; min-height: 52px; padding: 0 14px;
  font-family: var(--lx-sans) !important; font-size: 1rem !important;
  color: var(--lx-encre) !important; background: var(--lx-clair) !important;
  border: 1px solid #B9AE93; border-radius: var(--lx-r-champ);
}
.lx28 .lx28-mini :is(input, select):focus { border-color: var(--lx-or-clair) !important; }
.lx28 .lx28-mini__titre { grid-column: 1 / -1; font-size: var(--lx-petit) !important; font-weight: 600 !important; text-transform: uppercase !important; letter-spacing: var(--lx-ls-badge) !important; color: var(--lx-or-clair) !important; }

/* ==========================================================================
   10. PLAN DE SITE (source du drawer mobile) + PIED
   ========================================================================== */
.lx28 .lx28-plan { background: var(--lx-noir) !important; border-top: 1px solid var(--lx-fil); padding-block: var(--lx-9); }
.lx28 .lx28-plan__grille { display: grid; gap: var(--lx-7); }
@media (min-width: 760px) { .lx28 .lx28-plan__grille { grid-template-columns: repeat(3, 1fr); } }
.lx28 .lx28-plan h2, .lx28 .lx28-plan h3 {
  font-size: var(--lx-badge) !important; font-weight: 600 !important; text-transform: uppercase !important;
  letter-spacing: var(--lx-ls-badge) !important; color: var(--lx-or) !important; margin-bottom: var(--lx-4);
}
.lx28 .lx28-plan ul { display: grid; gap: var(--lx-2); }
.lx28 .lx28-plan a { font-size: .9375rem !important; color: var(--lx-ivoire-2) !important; }
@media (hover: hover) { .lx28 .lx28-plan a:hover { color: var(--lx-ivoire) !important; } }
.lx28 .lx28-plan__legal { margin-top: var(--lx-7); padding-top: var(--lx-5); border-top: 1px solid var(--lx-fil); font-size: var(--lx-petit) !important; color: var(--lx-ivoire-3) !important; }

/* ==========================================================================
   11. RESPONSIVE
   ========================================================================== */
@media (max-width: 899px) {
  .lx28 .lx28-nav { top: 12px; height: 52px; padding: 0 6px 0 16px; gap: var(--lx-2); }
  .lx28 .lx28-nav__liens { display: none; }
  .lx28 .lx28-nav__tel { margin-inline: auto; }
  .lx28 .lx28-nav__cta { display: none; }
  .lx28 .lx28-burger { display: inline-flex; }
  .lx28 .lx28-hero { min-height: 560px; padding-block: 116px var(--lx-7); }
  .lx28 .lx28-hero__col { max-width: 100%; }
  .lx28 .lx28-hero__voile { background: linear-gradient(to top, var(--lx-voile) 0 62%, rgba(10,9,8,.55) 100%) !important; }
  .lx28 .lx28-hero__matiere { width: 100%; height: 46%; background-position: 58% 46%; }
  .lx28 .lx28-nappe { transform: perspective(900px) rotateX(70deg); background-size: 22px 22px, 34px 34px, 52px 52px; }
  .lx28 .lx28-hero .lx28-h1 { line-height: .92 !important; }
  .lx28 .lx28-hero__actions { flex-direction: column; align-items: stretch; }
  .lx28 .lx28-hero__actions .lx28-cta { width: 100%; min-height: 52px; }
  .lx28 .lx28-etape { grid-template-columns: 60px 1fr; padding-block: var(--lx-6); }
  .lx28 .lx28-deroule__rail { left: 22px; }
  .lx28 .lx28-entete { margin-bottom: var(--lx-6); }
}
@media (max-width: 420px) {
  .lx28 .lx28-nav__marque { font-size: .75rem !important; }
}

/* ==========================================================================
   12. CONTRAT D'APPARITION — armé par le JS, jamais par le serveur
   --------------------------------------------------------------------------
   Le HTML rendu par PHP ne contient NI opacity:0 NI visibility:hidden.
   Sans JS, sans hydratation, ou en reduced-motion : rien ne s'applique et
   tout est deja en position finale. La revelation se fait par TRANSFORM
   SEUL — aucune animation ne touche l'opacite d'un element contenant du
   texte. La garde ci-dessous ferme la feuille contre toute regression.
   ========================================================================== */
[data-r] { opacity: 1 !important; visibility: visible !important; }

/* Decalage en cascade porte par la valeur de l'attribut : aucun style inline,
   aucune classe posee par le serveur. Plafonne a 4 (240 ms). */
[data-r="1"] { --lx-i: 1; }
[data-r="2"] { --lx-i: 2; }
[data-r="3"] { --lx-i: 3; }
[data-r="4"] { --lx-i: 4; }

@media (prefers-reduced-motion: no-preference) {
  .lx-anim .lx28 [data-r] {
    transform: translate3d(0, 14px, 0);
    transition: transform var(--lx-t-reveal) var(--lx-e-out);
    transition-delay: calc(var(--lx-i, 0) * var(--lx-stagger));
  }
  .lx-anim .lx28 [data-r].lx-vu { transform: none; }

  /* Le caret est un <span> VIDE, aria-hidden : aucun texte n'est concerne. */
  .lx28 .lx28-caret { animation: lx-clignote var(--lx-t-caret) steps(1) 3; }
  @keyframes lx-clignote { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }
}

/* ==========================================================================
   13. REDUCED MOTION — composition strictement identique
   ========================================================================== */
@media (prefers-reduced-motion: reduce) {
  .lx28 *, .lx28 *::before, .lx28 *::after {
    animation-duration: .01ms;
    animation-iteration-count: 1;
    transition-duration: .01ms;
    scroll-behavior: auto;
  }
  .lx28 .lx28-caret { animation: none; }   /* fixe, pas supprime */
}

/* ==========================================================================
   14. IMPRESSION
   ========================================================================== */
@media print {
  .lx28 .lx28-nav, .lx28 .lx28-nappe, .lx28 .lx28-hero__matiere,
  .lx28 .lx28-hero__grain, .lx28 .lx28-hero__voile { display: none; }
  .lx28 { background: #fff !important; color: #000 !important; }
}
