/* ==========================================================================
   LAARICHI — Enfant du Monde
   Site one-page immersif — feuille de style
   ========================================================================== */

/* ---------- Police de marque ---------- */
@font-face{
  font-family: "Horizon";
  src: url("../fonts/Horizon.woff2") format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

/* ---------- Tokens ---------- */
:root{
  --black-deep:   #050403;
  --black:        #0c0807;
  --red-primary:  #960000;
  --red-deep:     #2c0705;
  --red-blood:    #4a0d08;
  --red-intense:  #8c1c0a;
  --orange-burnt: #b8410f;
  --orange-fire:  #e8621f;
  --orange-glow:  #ff8a3d;
  --orange-cta:   #ff8000;
  --off-white:    #efe6d8;
  --off-white-dim:#efe6d8b3;
  /* Version "lisible" du blanc cassé : utilisée pour tout texte secondaire
     posé sur fond texturé/photo. --off-white-dim (≈70% opacité) tombe sous
     le seuil WCAG AA (4.5:1) dès que le fond n'est plus un aplat sombre ;
     celle-ci reste ≥ AA quel que soit le fond de la Section 1. */
  --off-white-soft:#efe6d8e3;

  --font-display: "Horizon", "Fraunces", "Georgia", serif;
  /* Remplace Barlow Condensed (jugé trop générique/template) par Fraunces :
     même famille que la police de titre (déjà utilisée en repli ci-dessus),
     ce qui unifie tout le système typographique autour d'une seule police
     à deux rôles plutôt que deux polices sans lien. Fraunces est une police
     variable (axes opsz + wght chargés via le lien Google Fonts dans le
     <head> de chaque page) : le navigateur affine automatiquement la
     graisse optique selon la taille de texte (gros titres vs. petites
     légendes). */
  --font-body: "Fraunces", "Georgia", serif;

  --ease: cubic-bezier(.22,.61,.36,1);

  /* Hauteur de la barre de nav fixe : référencée par le padding des pages
     de contenu et par scroll-padding-top, pour qu'aucun titre ni ancre ne
     se retrouve caché dessous. */
  --nav-height: 4rem;
}

/* ---------- Reset ---------- */
*, *::before, *::after{ box-sizing: border-box; }
html, body{ height: 100%; }
/* scroll-snap-type ici, sur <html> (le vrai scrollingElement de cette
   page — vérifié : ni <main> ni <body> ne portent d'overflow qui en ferait
   un conteneur de scroll), pas sur <main>. Testé en conditions réelles :
   posé sur <main>, qui n'est PAS le conteneur qui défile, Chrome bloque
   purement et simplement le scroll à la molette sur toute la page
   (confirmé par bascule none/proximity — 0px de mouvement avec proximity
   sur main, scroll normal avec none). C'est très probablement la cause du
   scroll qui "part dans tous les sens" signalé sur mobile : un scroll qui
   ne prend pas la moitié du temps pousse à insister/swiper plus fort,
   d'où des sauts erratiques une fois qu'il finit par répondre. */
html{
  scroll-behavior: smooth;
  scroll-padding-top: var(--nav-height);
  scroll-snap-type: y proximity;
}
body{
  margin: 0;
  background: var(--black);
  color: var(--off-white);
  font-family: var(--font-body);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}
img{ max-width: 100%; display: block; }
button{ font-family: inherit; cursor: pointer; }
h1, p{ margin: 0; }

.sr-only{
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}

.skip-link{
  position: absolute;
  left: 0; top: 0;
  transform: translateY(-120%);
  background: var(--off-white);
  color: var(--black);
  padding: .8em 1.2em;
  z-index: 1000;
  text-decoration: none;
  font-family: var(--font-body);
  transition: transform .2s var(--ease);
}
.skip-link:focus{ transform: translateY(0); }

/* ==========================================================================
   NAVIGATION — commune à toutes les pages
   Signée comme le reste du site : grain pellicule, liseré "braise" en
   dégradé plutôt qu'un trait plat, emblème qui respire doucement, liens
   numérotés façon sommaire éditorial.
   ========================================================================== */
.site-nav{
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 50; /* au-dessus du grain (5), du vignettage (2) et du contenu (3-4) */
  background: linear-gradient(to bottom, rgba(8,5,4,.88), rgba(8,5,4,.74));
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  transition: background .3s var(--ease), box-shadow .3s var(--ease);
}
/* Liseré du bas en dégradé "ciel de feu" plutôt qu'une bordure plate — un
   fil incandescent qui reprend la palette de la marque sur toute pages. */
.site-nav::before{
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 2px;
  background: linear-gradient(to right,
    transparent,
    var(--red-primary) 15%,
    var(--orange-fire) 50%,
    var(--orange-glow) 65%,
    transparent 92%);
  opacity: .55;
}
/* Une fois qu'on a quitté le haut de page, la barre s'affirme un peu plus
   (fond plus opaque + ombre portée) pour rester lisible sur tout contenu
   défilé en dessous. Classe posée par js/main.js. */
.site-nav.is-scrolled{
  background: linear-gradient(to bottom, rgba(8,5,4,.97), rgba(8,5,4,.93));
  box-shadow: 0 12px 30px rgba(0,0,0,.35);
}

.site-nav__bar{
  position: relative;
  max-width: 1120px;
  margin: 0 auto;
  height: var(--nav-height);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 clamp(1.2rem, 5vw, 2.5rem);
}

.site-nav__brand{
  display: flex;
  align-items: center;
  gap: .55rem;
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: 1.1rem;
  letter-spacing: .04em;
  color: var(--off-white);
  text-decoration: none;
  line-height: 1;
  text-shadow: 0 2px 10px rgba(0,0,0,.5);
}
/* ---------- Bouton menu (mobile) ---------- */
.site-nav__toggle{
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 5px;
  width: 2.4rem;
  height: 2.4rem;
  margin-right: -.5rem;
  border: 0;
  background: transparent;
  padding: 0;
}
.site-nav__toggle-bar{
  display: block;
  width: 1.4rem;
  height: 2px;
  background: var(--off-white);
  transition: transform .25s var(--ease), opacity .25s var(--ease), background .25s var(--ease);
}
.site-nav__toggle[aria-expanded="true"] .site-nav__toggle-bar{
  background: var(--orange-glow);
}
.site-nav__toggle[aria-expanded="true"] .site-nav__toggle-bar:nth-child(1){
  transform: translateY(7px) rotate(45deg);
}
.site-nav__toggle[aria-expanded="true"] .site-nav__toggle-bar:nth-child(2){
  opacity: 0;
}
.site-nav__toggle[aria-expanded="true"] .site-nav__toggle-bar:nth-child(3){
  transform: translateY(-7px) rotate(-45deg);
}

/* ---------- Menu — mobile-first : replié sous la barre par défaut ---------- */
.site-nav__menu{
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background:
    linear-gradient(165deg, rgba(8,5,4,.98), rgba(44,7,5,.96) 65%, rgba(8,5,4,.98));
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  max-height: 0;
  overflow: hidden;
  transition: max-height .35s var(--ease);
}
/* Même filigrane losange que le reste du site, en watermark discret. */
.site-nav__menu::before{
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: .07;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='64'%3E%3Cpath d='M32 2 L62 32 L32 62 L2 32 Z' fill='none' stroke='%23efe6d8' stroke-width='1'/%3E%3C/svg%3E");
  background-size: 64px 64px;
}
/* Écho géant, très estompé, de l'emblème — signature discrète plutôt
   qu'un simple aplat de couleur derrière les liens. */
.site-nav__menu::after{
  content: "";
  position: absolute;
  right: -3.5rem;
  bottom: -3.5rem;
  width: 14rem;
  height: 14rem;
  border-radius: 50%;
  border: 10px solid rgba(255,138,61,.09);
  pointer-events: none;
}
.site-nav.is-open .site-nav__menu{
  max-height: 26rem;
}
.site-nav__menu ul{
  position: relative;
  list-style: none;
  margin: 0;
  padding: .4rem clamp(1.2rem, 5vw, 2.5rem) 1.2rem;
  display: flex;
  flex-direction: column;
}
.site-nav__menu li{
  display: flex;
  align-items: center;
  gap: .7rem;
  border-top: 1px solid rgba(239,230,216,.08);
}
.site-nav__menu li:first-child{ border-top: 0; }
.site-nav__menu a{
  position: relative;
  display: block;
  flex: 1;
  padding: .85rem 0;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .1em;
  font-size: .82rem;
  color: var(--off-white-soft);
  text-decoration: none;
  transition: color .2s var(--ease);
}
/* Soulignement "braise" qui se déploie au survol plutôt qu'un trait fixe —
   déjà déployé sur la page courante. */
.site-nav__menu a::after{
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: .55rem;
  height: 2px;
  background: var(--orange-glow);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .3s var(--ease);
}
.site-nav__menu a:hover,
.site-nav__menu a:focus-visible{
  color: var(--off-white);
}
.site-nav__menu a:hover::after,
.site-nav__menu a:focus-visible::after{
  transform: scaleX(1);
}
.site-nav__menu a[aria-current="page"]{
  color: var(--orange-glow);
}
.site-nav__menu a[aria-current="page"]::after{
  transform: scaleX(1);
}

/* 860px plutôt que 700px : avec Fraunces (plus large que l'ancienne police
   condensée), la marque + les 5 liens n'ont plus la place de tenir sur une
   ligne en dessous de ~820px — vérifié en mesurant l'espace réel entre le
   logo et le premier lien à plusieurs largeurs. */
@media (min-width: 860px){
  .site-nav__toggle{ display: none; }
  .site-nav__menu{
    position: static;
    max-height: none;
    overflow: visible;
    background: transparent;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
  .site-nav__menu::before,
  .site-nav__menu::after{
    content: none; /* le filigrane et l'écho ne servent que le panneau mobile */
  }
  .site-nav__menu ul{
    flex-direction: row;
    align-items: center;
    gap: clamp(1.1rem, 2.2vw, 2rem);
    padding: 0;
  }
  .site-nav__menu li{ border-top: 0; gap: .35rem; }
  .site-nav__menu a{
    flex: none;
    padding: .3rem 0;
    font-size: .78rem;
  }
  .site-nav__menu a::after{ bottom: -.15rem; }
}

/* ---------- Scroll rhythm ---------- */
/* scroll-snap-type est sur <html>, pas ici (voir en tête de fichier). */
.section{
  position: relative;
  /* 100vh d'abord (repli navigateurs anciens), 100svh ensuite : la
     DERNIÈRE valeur valide l'emporte en cascade, donc l'ordre inverse
     annulerait silencieusement svh. 100vh se cale sur la barre d'adresse
     mobile *cachée*, plus haut que l'espace réellement visible tant
     qu'elle est affichée — avec le scroll-snap de #main, ça faisait
     "bouger"/mal s'aligner les sections à l'apparition/disparition de la
     barre. 100svh (small viewport height) reste stable dans les deux cas :
     c'est la valeur qui doit gagner ici. Même ordre à respecter partout où
     ce couple est dupliqué (voir .portrait, .story-hero, .story-finale,
     merci.html, 404.html). */
  min-height: 100vh;
  min-height: 100svh;
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  scroll-snap-align: start;
  padding: clamp(1.5rem, 6vw, 3rem);
}

/* ==========================================================================
   Texture — grain de pellicule
   ========================================================================== */
.film-grain{ isolation: isolate; }
/* inset en px fixes (pas en %) et volontairement petit : juste assez de
   marge pour couvrir un arrondi subpixel, sans plus. Un `inset:-10%`
   testé ici gonflait le scrollWidth de la section bien au-delà de sa
   largeur réelle (jusqu'à +37px sur un écran de 375px de large) — écarts
   masqués visuellement par overflow:hidden mais toujours mesurés comme
   un débordement horizontal, un filet de sécurité à ne pas dépendre en
   silence. */
.film-grain::after{
  content: "";
  position: absolute;
  inset: -4px;
  pointer-events: none;
  z-index: 5;
  opacity: .16;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 180px 180px;
}

/* ---------- Motif losanges en filigrane ---------- */
.diamond-pattern::before{
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 1;
  opacity: .07;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='64'%3E%3Cpath d='M32 2 L62 32 L32 62 L2 32 Z' fill='none' stroke='%23efe6d8' stroke-width='1'/%3E%3C/svg%3E");
  background-size: 64px 64px;
}

/* ==========================================================================
   SECTION 1 — HERO
   ========================================================================== */
.hero{
  /* Repli uni si l'image est absente ; sinon elle couvre tout le cadre.
     Le dégradé assombrit le haut (titre) et le bas (bouton) à l'identique
     — même courbe, miroir haut/bas — et finit en noir plein aux deux
     bords : à 0% pour donner du contraste au titre, à 100% pour se
     fondre sans coupure dans la section 2. */
  background-color: var(--red-primary);
  background-image:
    linear-gradient(to bottom,
      rgba(0,0,0,1) 0%,
      rgba(0,0,0,.75) 12%,
      rgba(0,0,0,0) 38%,
      rgba(0,0,0,0) 62%,
      rgba(0,0,0,.75) 88%,
      rgba(0,0,0,1) 100%),
    url("../Illustrations/background.webp");
  background-size: cover, cover;
  background-position: center, center;
  background-repeat: no-repeat, no-repeat;
}

/* Grille à 3 rangées, calée en position absolue sur tout le cadre de la
   section (plus fiable qu'un height:100% en flexbox, dont la résolution
   dépend d'une hauteur "définie" du parent). Fractions asymétriques :
   pousse le logo un peu sous le centre optique, et le CTA vers le bas
   du cadre plutôt que collé au logo. */
.hero__stack{
  position: absolute;
  inset: 0;
  display: grid;
  /* grid-template-columns explicite : sans ça, l'unique colonne implicite
     se dimensionne sur son contenu (au lieu de toute la largeur) et
     justify-items:center centre alors DANS cette colonne déjà décalée,
     pas dans la section — d'où un rendu qui semblait mal centré/débordant. */
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: 1fr auto .9fr;
  justify-items: center;
  /* inset:0 ignore le padding de .hero (position:absolute) : on le
     recrée ici pour garder une marge de sécurité de chaque côté. */
  padding: 0 clamp(1.5rem, 6vw, 3rem);
}
.hero__top{
  align-self: end;
  /* Remonte le bloc titre (nom + signature) sans toucher au logo ni au
     CTA : ceux-ci vivent dans les rangées suivantes de la grille et ne
     bougent pas — seule la marge sous ce bloc augmente. */
  padding-bottom: clamp(5.6rem, 17vh, 9.5rem);
}
.hero__bottom{
  align-self: end;
  padding-bottom: clamp(1.4rem, 6vh, 3rem);
}

.hero .vignette{
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  box-shadow: inset 0 0 18vw 2vw rgba(0,0,0,.4);
}

/* Nom ("Laarichi") et signature ("Enfant du Monde") empilés sur deux
   lignes, hiérarchie marquée plutôt qu'un même poids pour les deux : le
   nom de marque domine, la signature reste lisible mais clairement
   secondaire — align-items:center recentre la ligne la plus courte sur
   la plus longue (jamais alignées à gauche l'une sous l'autre). */
.hero-title{
  position: relative;
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .1em;
  max-width: 100%;
}

/* Police Anton (display gras condensé, cf. Illustrations de référence
   images/teste.webp) avec un rendu "contour néon" : lettres creuses (fond
   de la section visible à travers), contour et lueur rouge #960000
   (--red-primary, couleur de marque). white-space:nowrap empêche la ligne
   de se rompre. Anton est bien plus condensée qu'Horizon (~0.62em de
   chasse par lettre contre ~0.9em) donc le coefficient vw est recalé en
   conséquence pour occuper une largeur comparable sans jamais revenir à
   la ligne, du plus petit mobile (320px) au plus grand desktop. Fond
   transparent + contour posés dans un @supports : un navigateur sans
   text-stroke retombe sur un remplissage plein (voir plus bas) plutôt que
   du texte invisible.

   Coefficient vw et bornes mesurés séparément pour "Laarichi" seul (8
   lettres) — vérifié sans débordement de 320px à 2560px, ~85-95% de la
   largeur disponible sur mobile/tablette (jusqu'à ~1000px), plafonné
   ensuite à 6.5rem : au-delà, 11vw dépassait déjà 6.5rem avant même
   d'atteindre les résolutions PC courantes (1280-1366px, très répandues
   sur laptop) — la marge n'y était plus que de 64 à 95px de chaque côté,
   trop juste pour du "presque déborde" en pratique. Plafond abaissé sans
   toucher au coefficient : mobile/tablette gardent exactement le même
   rendu (le plafond ne s'y déclenche pas), seul le desktop rétrécit,
   avec 200px+ de marge de chaque côté à 1280px comme à 1920px. */
.hero-title__name{
  display: block;
  white-space: nowrap;
  text-align: center;
  font-family: "Anton", var(--font-display);
  font-weight: 400;
  text-transform: uppercase;
  line-height: .96;
  color: var(--red-primary);
  letter-spacing: .01em;
  font-size: clamp(1rem, 11vw, 6.5rem);
  text-shadow:
    0 0 2px rgba(200,30,20,.9),
    0 0 7px rgba(150,0,0,.55),
    0 0 16px rgba(80,0,0,.35);
}
@supports (-webkit-text-stroke: 1px black) or (text-stroke: 1px black){
  .hero-title__name{
    color: transparent;
    -webkit-text-stroke: .03em var(--red-primary);
    text-stroke: .03em var(--red-primary);
  }
}

/* Même traitement que .hero-title__name (police, contour néon), à une
   échelle réduite (~45% de la taille du nom, mesuré) — assez petit pour
   rester nettement secondaire, assez grand pour rester confortablement
   lisible même sur mobile étroit (jamais en dessous de ~16px en usage
   réel, voir le coefficient vw). Propriétés dupliquées plutôt que
   partagées via une classe commune : les deux tailles ont été calibrées
   indépendamment (chaque ligne a sa propre longueur, donc son propre
   rapport largeur/taille de police) et gagnent à rester faciles à ajuster
   séparément. */
.hero-title__tagline{
  display: block;
  white-space: nowrap;
  text-align: center;
  font-family: "Anton", var(--font-display);
  font-weight: 400;
  text-transform: uppercase;
  line-height: .96;
  color: var(--red-primary);
  letter-spacing: .01em;
  font-size: clamp(.85rem, 5vw, 2.9rem);
  text-shadow:
    0 0 2px rgba(200,30,20,.9),
    0 0 7px rgba(150,0,0,.55),
    0 0 16px rgba(80,0,0,.35);
}
@supports (-webkit-text-stroke: 1px black) or (text-stroke: 1px black){
  .hero-title__tagline{
    color: transparent;
    -webkit-text-stroke: .03em var(--red-primary);
    text-stroke: .03em var(--red-primary);
  }
}

/* ---------- Logo ----------
   Aucun cadre ni fond propre : le logo repose à nu sur le fond de la
   section (voir .hero__stack plus haut pour le centrage exact). Léger
   remonte via transform (pure peinture, ne modifie pas la hauteur de la
   rangée "auto" qui le porte) plutôt qu'une marge négative, pour ne
   jamais grignoter l'espacement avec le CTA sous lui. */
.hero-logo-slot{
  position: relative;
  z-index: 3;
  width: min(26vw, 140px);
  display: flex;
  align-items: center;
  justify-content: center;
  transform: translateY(-1rem);
}
.hero-logo-slot__hint{
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .22em;
  font-size: .7rem;
  color: rgba(239,230,216,.55);
}
.hero-logo{
  width: 100%;
  height: auto;
  filter: drop-shadow(0 8px 18px rgba(0,0,0,.5));
}

/* ---------- CTA ---------- */
.cta-button{
  position: relative;
  z-index: 3;
  display: inline-block;
  padding: .85rem 2.4rem;
  border-radius: 2px;
  background: var(--red-primary);
  color: var(--off-white);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .84rem;
  text-transform: uppercase;
  letter-spacing: .18em;
  text-decoration: none;
  box-shadow: 0 10px 24px rgba(0,0,0,.4);
  transition: background .25s var(--ease), transform .2s var(--ease);
}
.cta-button:hover,
.cta-button:focus-visible{
  background: var(--orange-cta);
  transform: translateY(-2px);
}

/* ==========================================================================
   SECTION 2 — TRANSITION
   ========================================================================== */
.transition{
  /* Même principe que le raccord section 1 → section 2 (voir .hero) : un
     point d'ancrage à chaque bord (une seule valeur, jamais un palier tenu
     sur plusieurs %) et tout le mouvement du dégradé au milieu. Le haut
     part de noir plein (raccord avec le bas de la section 1) puis s'efface
     vite pour révéler fond-1.png. Après le plateau clair, RETOUR EN FONDU
     CONTINU vers --black-deep jusqu'à 100% pile — sans palier tenu avant
     l'arrivée : --black-deep n'est atteint qu'au tout dernier pixel, qui
     est très exactement la couleur de départ de la section 3 (.portrait
     et .portrait__scrim démarrent aussi sur --black-deep). Le raccord se
     fait donc sur UN SEUL point de couleur commune, pas deux paliers noirs
     empilés de part et d'autre — c'était le bandeau noir "mort" du rendu
     précédent. */
  background-color: var(--black-deep);
  background-image:
    linear-gradient(to bottom,
      #000 0%,
      rgba(0,0,0,0) 16%,
      rgba(0,0,0,0) 80%,
      var(--black-deep) 97%,
      var(--black-deep) 100%),
    url("../Illustrations/fond-1.png");
  background-size: cover, cover;
  background-position: center, center;
  background-repeat: no-repeat, no-repeat;
}
/* opacity/transform/transition : fournis par .reveal (voir plus bas) */
.transition-text{
  font-family: var(--font-body);
  font-weight: 500;
  font-style: italic;
  font-size: clamp(1.1rem, 4vw, 1.6rem);
  letter-spacing: .02em;
  color: var(--off-white-dim);
  text-align: center;
  max-width: 18ch;
}

/* ==========================================================================
   SECTION 3 — VISUEL SIGNATURE + FORMULAIRE
   ========================================================================== */
.signature{ padding: 0; }

.portrait{
  position: relative;
  width: 100%;
  height: 100%;
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  align-items: center;
  justify-content: center;

  /* Le fichier fournit l'image ; repli en rouge uni (--red-primary,
     #960000) tant qu'il est absent — même couleur d'aplat que la
     section 1, pour une identité cohérente entre les deux sections. */
  background-color: var(--red-primary);
  background-image: url("../assets/hero-portrait.jpg");
  background-size: cover;
  background-position: center 20%;
  background-repeat: no-repeat;
}

.portrait__scrim{
  position: absolute;
  inset: 0;
  z-index: 2;
  /* Même style d'ombre que .hero (section 1) : noir plein aux deux bords,
     clair au centre — garde le formulaire lisible tout en unifiant le
     traitement visuel entre les sections 1 et 3. */
  background: linear-gradient(to bottom,
    rgba(0,0,0,1) 0%,
    rgba(0,0,0,.75) 12%,
    rgba(0,0,0,0) 38%,
    rgba(0,0,0,0) 62%,
    rgba(0,0,0,.75) 88%,
    rgba(0,0,0,1) 100%);
}

/* opacity/transform/transition : fournis par .reveal (voir plus bas) */
.signature__content{
  position: relative;
  z-index: 4;
  width: min(90vw, 420px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .9rem;
}

.signature__kicker{
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .28em;
  font-size: .72rem;
  color: var(--off-white);
  text-shadow: 0 1px 6px rgba(0,0,0,.6);
}

.contact-form{
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: .8rem;
}

/* Piège à robots : invisible pour tout le monde (visuel ET lecteur
   d'écran), contrairement à .sr-only qui reste volontairement exposé aux
   technologies d'assistance. Un champ honeypot doit rester hors de portée
   des deux, sinon un·e utilisateur·rice non-voyant·e pourrait le remplir
   par erreur et voir son message légitime rejeté comme spam. */
.contact-form__trap{
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.contact-form__field{
  display: flex;
  flex-direction: column;
  gap: .32rem;
  text-align: left;
}
.contact-form__field label{
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .12em;
  font-size: .68rem;
  color: var(--off-white-soft);
  text-shadow: 0 1px 4px rgba(0,0,0,.6);
}
.contact-form__field input,
.contact-form__field textarea,
.contact-form__field select{
  width: 100%;
  border: 0;
  outline: 0;
  border-radius: 10px;
  background: var(--off-white);
  color: var(--black);
  font-family: var(--font-body);
  font-size: 1rem;
  padding: .75rem .9rem;
  box-shadow: 0 6px 20px rgba(0,0,0,.3);
  transition: box-shadow .2s var(--ease);
}
.contact-form__field textarea{
  min-height: 6.5rem;
  resize: vertical;
  line-height: 1.4;
}
.contact-form__field input::placeholder,
.contact-form__field textarea::placeholder{
  color: #7a7168;
}
/* Survol : léger raffermissement de l'ombre, discret (le clavier reste le
   parcours principal — voir :focus-visible juste après pour l'état net). */
.contact-form__field input:hover,
.contact-form__field textarea:hover,
.contact-form__field select:hover{
  box-shadow: 0 6px 20px rgba(0,0,0,.42);
}
.contact-form__field input:focus-visible,
.contact-form__field textarea:focus-visible,
.contact-form__field select:focus-visible{
  box-shadow: 0 0 0 3px rgba(255,138,61,.55), 0 6px 20px rgba(0,0,0,.3);
}
/* Validation temps réel (voir js/main.js) : liseré rouge sur un champ
   invalide, posé uniquement après un premier passage (aria-invalid n'est
   basculé sur "true" qu'au blur), jamais dès la première frappe. */
.contact-form__field input[aria-invalid="true"]{
  box-shadow: 0 0 0 2px var(--orange-fire), 0 6px 20px rgba(0,0,0,.3);
}
.contact-form__error{
  min-height: 1em;
  font-size: .72rem;
  line-height: 1.3;
  color: var(--orange-glow);
  text-shadow: 0 1px 4px rgba(0,0,0,.6);
}

/* <select> "Comment avez-vous connu LAARICHI ?" : on masque la flèche
   native (rendu très variable d'un navigateur à l'autre) et on la
   redessine en SVG inline, dans le même gris que les placeholders. */
.contact-form__field select{
  -webkit-appearance: none;
  appearance: none;
  padding-right: 2.6rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9' fill='none'%3E%3Cpath d='M1 1l6 6 6-6' stroke='%237a7168' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right .95rem center;
}
.contact-form__field select:required:invalid{
  /* tant qu'aucune option réelle n'est choisie, le texte reste gris
     comme un placeholder plutôt que noir plein. */
  color: #7a7168;
}

/* "(facultatif)" accolé au label Téléphone — annule la casse/graisse du
   label pour rester discret. */
.contact-form__optional{
  font-weight: 400;
  text-transform: none;
  letter-spacing: .04em;
  color: rgba(239,230,216,.5);
}

/* Case de consentement RGPD — alignée à gauche, corps de texte fin comme
   .contact-form__consent, cliquable sur toute la ligne (label englobant). */
.contact-form__check{
  display: flex;
  align-items: flex-start;
  gap: .6rem;
  text-align: left;
  font-family: var(--font-body);
  font-size: .78rem;
  line-height: 1.45;
  color: rgba(239,230,216,.8);
  text-shadow: 0 1px 6px rgba(0,0,0,.5);
  cursor: pointer;
}
.contact-form__check input{
  flex: 0 0 auto;
  width: 1.1rem;
  height: 1.1rem;
  margin-top: .12rem;
  accent-color: var(--red-primary);
}
/* Anneau de focus clavier — même teinte que .contact-form__field
   input:focus-visible, pour une navigation clavier lisible sur la case
   RGPD (l'anneau bleu par défaut du navigateur tranche mal sur le fond
   sombre de la section). */
.contact-form__check input:focus-visible{
  outline: 2px solid var(--orange-glow);
  outline-offset: 2px;
}
/* Lien "politique de confidentialité" dans le libellé de consentement :
   souligné pour rester repérable comme lien au sein d'un paragraphe qui,
   sinon, n'a pas de couleur de lien distincte. */
.contact-form__check a{
  color: inherit;
  text-decoration: underline;
  text-underline-offset: .15em;
}
.contact-form__check a:hover,
.contact-form__check a:focus-visible{
  color: var(--orange-glow);
}

/* Même couleur que .cta-button (rouge de marque) plutôt que noir : ce
   bouton apparaît aussi bien sur le fond quasi-noir des pages de contenu
   (Contact) que sur le dégradé chaud de la Section 3 de l'accueil — un
   bouton noir se fondait dans le premier cas, invisible faute de contraste. */
/* Orange plutôt que rouge de marque : --red-primary sur le dégradé rouge
   de la section 3 (même teinte, juste plus sombre) faisait un bouton peu
   lisible — la forme se distinguait mal du fond. --orange-fire (déjà
   utilisé pour l'état survol un peu partout sur le site — nav, liens,
   anneaux de focus) tranche nettement sur le rouge, à l'état de repos
   aussi bien qu'au survol. Texte en noir (pas blanc cassé) : vérifié,
   off-white sur orange-fire tombe sous 3:1 de contraste — noir dessus
   dépasse 6:1, conforme WCAG AA. */
.contact-form__submit{
  margin-top: .1rem;
  padding: .9rem 1.6rem;
  border: 0;
  border-radius: 999px;
  background: var(--orange-fire);
  color: var(--black);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .88rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  box-shadow: 0 10px 24px rgba(0,0,0,.35);
  transition: background .25s var(--ease), transform .2s var(--ease);
}
.contact-form__submit:hover,
.contact-form__submit:focus-visible{
  background: var(--orange-cta);
}
.contact-form__submit:disabled{
  opacity: .6;
  cursor: default;
  transform: none;
}

.form-message{
  min-height: 1.2em;
  margin-top: .2rem;
  text-align: center;
  font-size: .85rem;
  font-weight: 600;
  color: var(--off-white);
  text-shadow: 0 1px 6px rgba(0,0,0,.6);
}
.form-message[data-state="error"]{ color: #ffb199; }
.form-message[data-state="success"]{ color: #ffe1b0; }

.contact-form__consent{
  margin-top: .2rem;
  text-align: center;
  font-size: .72rem;
  line-height: 1.4;
  color: rgba(239,230,216,.65);
  text-shadow: 0 1px 6px rgba(0,0,0,.5);
}

/* ==========================================================================
   FORMULAIRE D'INSCRIPTION (liste d'attente) — commun à toutes les pages
   (accueil, boutique, à propos, journal, contact). Contrairement à
   .contact-form (deux colonnes, plusieurs champs), il s'agit d'un unique
   champ email en forme de pilule avec un bouton flèche intégré à droite —
   pattern newsletter classique, pensé pour une inscription en un geste.
   ========================================================================== */
.email-form{
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: .8rem;
}

.email-form__field{
  position: relative;
  width: 100%;
}
.email-form__field input{
  width: 100%;
  border: 0;
  outline: 0;
  border-radius: 999px;
  background: var(--off-white);
  color: var(--black);
  font-family: var(--font-body);
  font-size: 1rem;
  /* padding-right dégagé pour laisser la place au bouton flèche absolu. */
  padding: .9rem 3.6rem .9rem 1.3rem;
  box-shadow: 0 6px 20px rgba(0,0,0,.3);
}
.email-form__field input::placeholder{ color: #7a7168; }
.email-form__field input:focus-visible{
  box-shadow: 0 0 0 3px rgba(255,138,61,.55), 0 6px 20px rgba(0,0,0,.3);
}

/* Bouton flèche — même couleur de marque que .cta-button/.contact-form__submit,
   circulaire et intégré dans la pilule plutôt qu'un bouton séparé, pour
   garder l'inscription à un seul geste (email + Entrée/clic). */
.email-form__field button{
  position: absolute;
  top: 50%;
  right: .35rem;
  transform: translateY(-50%);
  width: 2.5rem;
  height: 2.5rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: 50%;
  background: var(--red-primary);
  color: var(--off-white);
  box-shadow: 0 6px 16px rgba(0,0,0,.3);
  transition: background .25s var(--ease), transform .2s var(--ease);
}
/* Zone de toucher élargie, invisible : le bouton visuel (2.5rem, 2.2rem
   dans le footer — voir plus bas) reste petit pour s'intégrer à la pilule,
   mais la cible tactile réelle doit atteindre 44×44px (WCAG 2.5.5). -5px
   sur chaque bord ajoute 10px de marge cliquable sans rien changer au
   rendu visuel. */
.email-form__field button::before{
  content: "";
  position: absolute;
  inset: -5px;
}
.email-form__field button:hover,
.email-form__field button:focus-visible{
  background: var(--orange-fire);
  color: var(--black);
}
.email-form__field button:disabled{
  opacity: .6;
  cursor: default;
}

.email-form__consent{
  margin-top: .2rem;
  text-align: center;
  font-size: .72rem;
  line-height: 1.4;
  color: rgba(239,230,216,.65);
  text-shadow: 0 1px 6px rgba(0,0,0,.5);
}

/* ==========================================================================
   FOOTER — commun à toutes les pages (dupliqué dans chaque .html comme la
   nav). Une seule colonne centrée : marque, formulaire, liens, copyright —
   dans cet ordre, à plat. Pas de grille, pas de filet de séparation avec
   la section précédente (le fond quasi-noir de .portrait se fond
   directement dans --black-deep, sans ligne entre les deux). */
.site-footer{
  background: var(--black-deep);
  color: rgba(239,230,216,.72);
  font-family: var(--font-body);
  padding: clamp(3rem, 9vw, 5.5rem) clamp(1.25rem, 5vw, 3rem);
  text-align: center;
}

.site-footer__inner{
  max-width: 30rem;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* Marque — même traitement que le titre du hero (voir .hero-title__name /
   .hero-title__tagline, section 1) : Anton condensée, contour néon,
   majuscules. La marque doit s'écrire pareil partout où elle apparaît, pas
   juste dans le hero. Contour transparent → repli en aplat plein dans le
   même @supports. */
/* Même police et même texte que le titre du hero ("Laarichi" / "Enfant du
   Monde", voir .hero-title__name), mais SANS le contour néon (pas de
   text-stroke transparent, pas de lueur en text-shadow) : aplat de
   couleur plein, propre. À cette taille réduite, l'effet néon du hero —
   calibré pour un texte bien plus grand — brouillait les lettres plus
   qu'il ne les mettait en valeur (le flou de la lueur, fixe en px,
   devient disproportionné une fois le texte petit).

   Sélecteur ".site-footer a.site-footer__logo" (pas juste
   ".site-footer__logo") : le logo est un lien, et ".site-footer a{color:…}"
   plus bas (classe + type = specificité supérieure à une classe seule)
   écrasait sinon ce rouge par la couleur de lien générique — invisible
   tant que le contour néon masquait le remplissage, redécouvert en le
   retirant. */
.site-footer a.site-footer__logo{
  display: inline-block;
  text-decoration: none;
  font-family: "Anton", var(--font-display);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: .01em;
  line-height: .96;
  color: var(--red-primary);
  /* Taille fixe (pas de vw) : une petite marque de pied de page n'a pas
     besoin de suivre la largeur de l'écran comme le titre du hero — juste
     rester lisible et discrète, à taille de texte constante. */
  font-size: 1.4rem;
}
.site-footer__tagline{
  display: block;
  margin: .3rem 0 0;
  font-family: "Anton", var(--font-display);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: .01em;
  line-height: .96;
  color: var(--red-primary);
  font-size: .65rem;
}

/* --- Formulaire (réutilise .email-form) --- */
.site-footer__lead{
  margin: 1.8rem 0 .8rem;
  font-size: .9rem;
  line-height: 1.5;
  color: rgba(239,230,216,.7);
}
.site-footer .email-form{ width: 100%; gap: .5rem; }
.site-footer .email-form__field input{
  padding-block: .72rem;
  font-size: .95rem;
  box-shadow: 0 4px 14px rgba(0,0,0,.35);
}
.site-footer .form-message{
  min-height: 0;
  margin-top: .15rem;
  font-size: .78rem;
  text-shadow: none;
}

/* --- Liens --- */
/* Une seule ligne qui s'enroule (Instagram, contact, pages légales) : pas
   de colonnes, pas d'en-têtes de catégorie — le contenu se suffit à
   lui-même. Point milieu classique entre chaque lien plutôt qu'un motif
   dessiné : la ponctuation la plus simple possible. */
.site-footer__links{
  margin-top: 2.4rem;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  row-gap: .5rem;
  column-gap: .6rem;
}
.site-footer__links span{
  color: rgba(239,230,216,.35);
}

.site-footer a{
  position: relative;
  color: rgba(239,230,216,.72);
  text-decoration: none;
  font-size: .85rem;
  transition: color .2s var(--ease);
}
.site-footer a:hover,
.site-footer a:focus-visible{ color: var(--off-white); }
.site-footer a:focus-visible{
  outline: 2px solid var(--orange-fire);
  outline-offset: 3px;
}

.site-footer__copy{
  margin-top: 2.4rem;
  font-size: .72rem;
  letter-spacing: .04em;
  color: rgba(239,230,216,.4);
}

/* ==========================================================================
   PAGES DE CONTENU — Boutique, À propos, Journal, Contact
   Gabarit commun : lecture normale (pas d'immersion plein cadre ni de
   scroll-snap, réservés à l'accueil), pensé pour du texte long et lisible.
   ========================================================================== */
.page-body{
  background: var(--black);
  background-image: radial-gradient(120% 60% at 50% 0%, rgba(150,0,0,.25), transparent 60%);
  background-repeat: no-repeat;
}
/* Une teinte de fond propre à chaque page plutôt que le même dégradé
   répété partout — voir body class dans boutique.html/journal.html/
   contact.html. */
.page-body--boutique{
  background-image: radial-gradient(110% 55% at 85% 0%, rgba(232,98,31,.22), transparent 62%);
}
.page-body--journal{
  background-image: radial-gradient(110% 55% at 15% 0%, rgba(150,0,0,.28), transparent 62%);
}
.page-body--contact{
  background-image: radial-gradient(120% 60% at 50% 100%, rgba(255,138,61,.16), transparent 65%);
}

.page{
  position: relative;
  min-height: 100vh;
  display: flex;
  justify-content: center;
  overflow: hidden;
  padding: clamp(2.5rem, 8vh, 4.5rem) clamp(1.5rem, 6vw, 3rem) 4rem;
}
/* Grand cercle très estompé en coin — signature discrète plutôt qu'un
   fond entièrement nu. */
.page::before{
  content: "";
  position: absolute;
  top: 15%;
  right: -8rem;
  width: 26rem;
  height: 26rem;
  border-radius: 50%;
  border: 14px solid rgba(255,138,61,.05);
  pointer-events: none;
}

.page__inner{
  width: 100%;
  max-width: 640px;
  position: relative;
  z-index: 1;
}
@media (min-width: 900px){
  .page__inner{ margin-left: 4%; margin-right: auto; }
}

.page__kicker{
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .26em;
  font-size: .72rem;
  color: var(--orange-glow);
  margin-bottom: .9rem;
}

.page__title{
  font-family: var(--font-display);
  text-transform: uppercase;
  line-height: 1.02;
  color: var(--off-white);
  font-size: clamp(2rem, 6vw, 3.2rem);
  margin-bottom: 1.6rem;
  overflow-wrap: break-word; /* voir la même règle sur .story-title */
  word-break: break-word;
}

.page__lead{
  font-size: clamp(1.05rem, 2.4vw, 1.2rem);
  line-height: 1.55;
  color: var(--off-white);
  margin-bottom: 1.4rem;
}

.page__body p{
  font-size: 1rem;
  line-height: 1.7;
  color: rgba(239,230,216,.82);
  margin-bottom: 1.1rem;
}
.page__body p:last-child{ margin-bottom: 0; }

/* Sous-titres et liens du corps de texte — utilisés par les pages légales
   (mentions-legales.html, confidentialite.html). */
.page__body h2{
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .12em;
  font-size: .82rem;
  color: var(--orange-glow);
  margin: 2rem 0 .7rem;
}
.page__body h2:first-child{ margin-top: 0; }
.page__body a{
  color: var(--orange-glow);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.page__body a:hover,
.page__body a:focus-visible{ color: var(--off-white); }
.page__body strong{ color: var(--off-white); }
.page__body-updated{
  margin-top: 2rem;
  font-size: .82rem;
  color: rgba(239,230,216,.5);
}

/* Bandeau "bientôt disponible" — Boutique et Journal, tant qu'il n'y a pas
   encore de produits/articles réels à afficher. */
.page__notice{
  margin-top: 2rem;
  padding: 1.6rem clamp(1.2rem, 4vw, 2rem);
  border: 1px solid rgba(239,230,216,.14);
  border-radius: 12px;
  background: rgba(239,230,216,.04);
}
.page__notice p{
  color: rgba(239,230,216,.75);
  font-size: .95rem;
  line-height: 1.6;
  margin-bottom: 1.1rem;
}
.page__notice p:last-of-type{ margin-bottom: 0; }
.page__notice .cta-button{
  position: static;
  box-shadow: none;
}

/* ==========================================================================
   Reveal utility (JS toggles .is-visible) — appliqué à tout élément
   ".reveal" observé par l'IntersectionObserver dans js/main.js.
   ========================================================================== */
.reveal{
  opacity: 0;
  transform: translateY(26px);
  transition: opacity .9s var(--ease), transform .9s var(--ease);
}
.reveal.is-visible{
  opacity: 1;
  transform: translateY(0);
}
/* Décalage léger entre éléments d'un même groupe (paragraphes qui
   s'enchaînent) — purement esthétique, cosmétique, jamais bloquant. */
.reveal:nth-child(2){ transition-delay: .05s; }
.reveal:nth-child(3){ transition-delay: .1s; }
.reveal:nth-child(4){ transition-delay: .15s; }
.reveal:nth-child(5){ transition-delay: .2s; }

/* ==========================================================================
   PAGE "À PROPOS" — plateforme de marque
   Gabarit éditorial long-format : hero dédié, sections numérotées, citations,
   emplacements image plein cadre et galeries, grille de modèle économique,
   section finale cinématique, navigation à points. Distinct du gabarit
   ".page" (réservé aux pages courtes Boutique/Journal/Contact) car cette
   page a besoin de bien plus de respiration et de rythme visuel.
   ========================================================================== */

/* ---------- Nav à points (sommaire flottant, desktop uniquement) ---------- */
.story-dots{
  position: fixed;
  right: 1.6rem;
  top: 50%;
  transform: translateY(-50%);
  z-index: 40;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .9rem;
}
.story-dots__dot{
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(239,230,216,.22);
  border: 0;
  padding: 0;
  cursor: pointer;
  transition: background .25s var(--ease), transform .25s var(--ease);
}
.story-dots__dot:hover,
.story-dots__dot:focus-visible{
  background: rgba(239,230,216,.5);
}
.story-dots__dot.is-active{
  background: var(--orange-glow);
  transform: scale(1.7);
}
@media (max-width: 900px){
  .story-dots{ display: none; }
}

/* ---------- Hero dédié à la page ---------- */
.story-hero{
  position: relative;
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  overflow: hidden;
  padding: var(--nav-height) 1.5rem 3rem;
}
.story-hero .img-slot{
  position: absolute;
  inset: 0;
  aspect-ratio: auto; /* sinon le 16/9 de la règle de base l'emporte sur inset:0 */
  border-radius: 0;
  border: 0;
}
/* En coin plutôt qu'au centre : sur un fond plein écran, un repère centré
   se superposerait au titre/à la légende qui occupent, eux, le centre. */
.story-hero .img-slot__hint{
  position: absolute;
  inset: auto auto calc(var(--nav-height) + 1.2rem) 1.2rem;
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  gap: .5rem;
  text-align: left;
  opacity: .6;
}
.story-hero .img-slot__hint svg{ width: 1.1rem; height: 1.1rem; flex-shrink: 0; }
.story-hero__scrim{
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse at center, transparent 30%, rgba(5,4,3,.75) 82%),
    linear-gradient(to bottom, rgba(5,4,3,.55) 0%, transparent 35%, transparent 60%, var(--black) 100%);
  pointer-events: none;
}
.story-hero__content{
  position: relative;
  z-index: 2;
}
.story-hero__eyebrow{
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .68rem;
  letter-spacing: .45em;
  color: var(--orange-glow);
  text-transform: uppercase;
  margin-bottom: 1.6rem;
  padding-left: .45em; /* recentre malgré le tracking */
}
.story-hero__title{
  font-family: var(--font-display);
  text-transform: uppercase;
  line-height: .95;
  color: var(--off-white);
  font-size: clamp(3.2rem, 13vw, 7.5rem);
  text-shadow: 0 2px 4px rgba(0,0,0,.55), 0 4px 22px rgba(0,0,0,.4);
}
.story-hero__tagline{
  font-family: var(--font-body);
  font-style: italic;
  font-weight: 500;
  color: var(--off-white-dim);
  font-size: clamp(.95rem, 2.4vw, 1.2rem);
  letter-spacing: .06em;
  margin-top: 1rem;
}
.story-hero__line{
  width: 1px;
  height: 56px;
  margin: 2.4rem auto 0;
  background: linear-gradient(to bottom, var(--orange-glow), transparent);
}

/* ---------- Rythme général ---------- */
.story-sep{
  width: 100%;
  height: 1px;
  background: linear-gradient(to right, transparent, rgba(239,230,216,.1), transparent);
  position: relative;
  z-index: 1;
}

/* ==========================================================================
   CHAPITRES — chaque chiffre (01-07) est un vrai "chapitre" avec son propre
   traitement de fond, pas une répétition du même dégradé sur toute la page.
   Donne un rythme au défilement plutôt qu'un mur uniforme.
   ========================================================================== */
.story-chapter{
  position: relative;
  overflow: hidden; /* contient le débord des chiffres géants en filigrane */
}
.story-chapter > *{ position: relative; }
.story-chapter--identite{ background: var(--black-deep); }
.story-chapter--vision{
  background:
    radial-gradient(75% 55% at 12% 0%, rgba(150,0,0,.22), transparent 65%),
    var(--black-deep);
}
.story-chapter--personnage{
  /* Le chapitre du désert et du squelette rouge : le plus long, le plus
     sombre au départ, qui vire lentement vers le sang. */
  background: linear-gradient(180deg, var(--black-deep) 0%, var(--black) 55%, var(--red-deep) 100%);
}
.story-chapter--cible{ background: var(--black); }
.story-chapter--esthetique{
  /* Esthétique : le chapitre le plus chaud, en écho au propos (couleur,
     culture, richesse visuelle). */
  background: linear-gradient(165deg, var(--red-deep) 0%, var(--black-deep) 60%, var(--orange-burnt) 170%);
}
.story-chapter--modele{ background: var(--black-deep); }
.story-chapter--modele::before{
  /* Filigrane losange : le chapitre "Modèle" est le plus factuel/graphique
     de la page (grille de prix) — le motif appuie ce ton. */
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: .05;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='64'%3E%3Cpath d='M32 2 L62 32 L32 62 L2 32 Z' fill='none' stroke='%23efe6d8' stroke-width='1'/%3E%3C/svg%3E");
  background-size: 64px 64px;
}
.story-chapter--communication{
  background: linear-gradient(195deg, var(--red-deep) 0%, var(--black-deep) 75%);
}

.story-block{
  max-width: 640px;
  margin: 0 auto;
  padding: clamp(4rem, 12vh, 7rem) clamp(1.5rem, 6vw, 3rem);
  position: relative;
}
/* Colonne décalée plutôt que strictement centrée — seuls les chapitres
   principaux (pas les blocs de récit intermédiaires) portent ce décalage,
   pour casser la symétrie "un seul bloc centré" répétée sept fois. */
@media (min-width: 900px){
  /* max-width un peu plus large que la base (640px) une fois décalée : la
     police de titre (Horizon) est très large, une colonne trop étroite
     force des césures disgracieuses au milieu de mots comme "comprendre". */
  .story-block[data-chapter].story-block--left{ margin: 0 auto 0 6%; max-width: 720px; }
  .story-block[data-chapter].story-block--right{ margin: 0 6% 0 auto; max-width: 720px; }
}

/* ---------- Label de section ("— Identité") ---------- */
.story-label{
  display: flex;
  align-items: center;
  gap: 1.2rem;
  margin-bottom: 2.2rem;
}
.story-label__line{
  flex: 1;
  height: 1px;
  background: linear-gradient(to right, rgba(239,230,216,.16), transparent);
}
.story-label__title{
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .68rem;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: rgba(239,230,216,.4);
  flex-shrink: 0;
}

/* ---------- Grand titre de section, avec mot-accent ---------- */
.story-title{
  font-family: var(--font-display);
  text-transform: uppercase;
  line-height: 1;
  color: var(--off-white);
  font-size: clamp(2.1rem, 6.5vw, 3.6rem);
  margin-bottom: 1.8rem;
  /* Horizon est une police très large (~0.94em par caractère en moyenne) :
     un mot long ("l'appartenance.") peut à lui seul dépasser la largeur de
     la colonne décalée. Sans ce filet, le texte déborde silencieusement et
     se fait couper net par l'overflow:hidden du chapitre (qui sert par
     ailleurs à contenir le chiffre géant en filigrane). */
  overflow-wrap: break-word;
  word-break: break-word;
}
.story-title em,
.story-title .accent{
  font-style: normal;
  color: var(--orange-glow);
}

/* ---------- Corps de texte ---------- */
.story-block p{
  font-size: 1.02rem;
  line-height: 1.85;
  color: rgba(239,230,216,.82);
  margin-bottom: 1.2rem;
  font-weight: 300;
}
.story-block p:last-child{ margin-bottom: 0; }
.story-block strong{ font-weight: 600; color: var(--off-white); }
.story-block em{ font-style: italic; color: var(--off-white); }
/* Première phrase d'un chapitre : un peu plus affirmée, sert de vraie
   accroche plutôt qu'un paragraphe identique aux autres. */
.story-block[data-chapter] > p:first-of-type{
  font-size: 1.18rem;
  color: var(--off-white);
  font-weight: 400;
}

/* ---------- Citations — cassent la colonne plutôt que de s'y aligner ---------- */
.story-quote{
  border-left: 3px solid var(--red-primary);
  padding: 1.4rem 0 1.4rem 1.8rem;
  margin: 2.6rem 0;
  font-size: clamp(1.25rem, 3.4vw, 1.85rem);
  font-style: italic;
  color: var(--off-white);
  line-height: 1.4;
}
.story-quote--small{
  border-left-color: var(--orange-glow);
  border-left-width: 2px;
  padding: 1rem 0 1rem 1.6rem;
  margin: 1.8rem 0;
  font-size: clamp(1rem, 2vw, 1.1rem);
  font-style: italic;
  color: rgba(239,230,216,.85);
  line-height: 1.65;
}
@media (min-width: 900px){
  /* La citation déborde de la colonne (déjà décalée) vers l'extérieur —
     un vrai bris de grille, pas un simple paragraphe en italique. */
  .story-block[data-chapter].story-block--left .story-quote{
    margin-left: -3.5rem;
    padding-left: 3.5rem;
  }
  .story-block[data-chapter].story-block--right .story-quote{
    margin-right: -3.5rem;
    padding-right: 1.8rem;
  }
}

/* ---------- Emplacement image (plein cadre) — voir Illustrations/marque/README.md ---------- */
.img-slot{
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: linear-gradient(155deg, var(--black-deep), var(--red-deep) 120%);
  border: 1px solid rgba(239,230,216,.12);
}
.img-slot img{
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.img-slot__hint{
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .4rem;
  text-align: center;
  padding: 1rem;
  color: rgba(239,230,216,.4);
}
.img-slot__hint svg{
  width: 1.6rem;
  height: 1.6rem;
  opacity: .5;
}
.img-slot__hint span{
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .68rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  max-width: 22ch;
}

.story-image{
  position: relative;
}
.story-image .img-slot{
  aspect-ratio: 16 / 10;
  border-left: 0;
  border-right: 0;
}
/* Fondu haut/bas/côtés pour que l'image (une fois ajoutée) se fonde dans le
   noir plutôt que de créer une coupure nette. */
.story-image::before,
.story-image::after{
  content: "";
  position: absolute;
  left: 0; right: 0;
  height: 120px;
  z-index: 1;
  pointer-events: none;
}
.story-image::before{ top: 0; background: linear-gradient(to bottom, var(--black), transparent); }
.story-image::after{ bottom: 0; background: linear-gradient(to top, var(--black), transparent); }

/* ---------- Galeries ---------- */
.story-gallery{
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 2px;
}
.story-gallery .img-slot{
  aspect-ratio: 1 / 1;
  border-radius: 0;
}
.story-gallery--culture{
  grid-template-columns: repeat(2, 1fr);
}
.story-gallery--culture .img-slot{ aspect-ratio: 3 / 4; }
@media (min-width: 640px){
  .story-gallery--culture{ grid-template-columns: repeat(4, 1fr); }
}

/* ---------- Grille de modèle économique ---------- */
.story-stats{
  display: grid;
  grid-template-columns: 1fr;
  gap: 1px;
  background: rgba(239,230,216,.08);
  border: 1px solid rgba(239,230,216,.08);
  margin: 2.2rem 0;
}
@media (min-width: 480px){
  .story-stats{ grid-template-columns: repeat(2, 1fr); }
}
.story-stats__cell{
  background: var(--black);
  padding: 2rem 1.5rem;
  text-align: center;
}
.story-stats__val{
  display: block;
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: clamp(1.6rem, 4vw, 2.4rem);
  color: var(--orange-glow);
  margin-bottom: .5rem;
  line-height: 1;
}
/* La police Horizon n'a pas de glyphe "€" (il disparaît silencieusement,
   sans même afficher un caractère de repli) — on force le symbole sur la
   police secondaire, qui le connaît. */
.story-stats__val .currency{
  font-family: var(--font-body);
  font-weight: 600;
}
.story-stats__label{
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .68rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: rgba(239,230,216,.45);
  line-height: 1.5;
}

/* ---------- Finale cinématique ---------- */
.story-finale{
  position: relative;
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  overflow: hidden;
}
.story-finale .img-slot{
  position: absolute;
  inset: 0;
  border: 0;
  aspect-ratio: auto;
}
/* En coin plutôt qu'au centre — voir .story-hero .img-slot__hint. */
.story-finale .img-slot__hint{
  position: absolute;
  inset: auto auto 1.2rem 1.2rem;
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  gap: .5rem;
  text-align: left;
  opacity: .6;
}
.story-finale .img-slot__hint svg{ width: 1.1rem; height: 1.1rem; flex-shrink: 0; }
.story-finale__scrim{
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at center, transparent 15%, var(--black) 78%);
  pointer-events: none;
}
.story-finale__content{
  position: relative;
  z-index: 2;
  padding: 2rem;
}
.story-finale__eyebrow{
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .7rem;
  letter-spacing: .3em;
  color: var(--orange-glow);
  text-transform: uppercase;
  max-width: 26ch;
  margin: 0 auto 1.6rem;
  line-height: 1.6;
}
.story-finale__line{
  width: 1px;
  height: 44px;
  margin: 0 auto;
  background: linear-gradient(to bottom, var(--orange-glow), transparent);
}
.story-finale__mark{
  display: block;
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: clamp(2.6rem, 10vw, 5.5rem);
  color: var(--off-white);
  line-height: 1;
  margin: 1.6rem 0 .6rem;
}
.story-finale__sub{
  display: block;
  font-family: var(--font-body);
  font-style: italic;
  font-weight: 500;
  color: rgba(239,230,216,.45);
  font-size: clamp(.9rem, 2vw, 1.05rem);
  letter-spacing: .08em;
}

/* ---------- Bloc d'inscription (après .story-finale) ----------
   Reprend le langage typographique de .signature__kicker / .page__title
   (accueil, boutique...) plutôt que d'inventer un nouveau style — la
   page "À propos" n'utilise pas le composant .page, d'où ce bloc dédié. */
.story-cta{
  padding: clamp(3rem, 10vh, 5rem) clamp(1.5rem, 6vw, 3rem);
  display: flex;
  justify-content: center;
  text-align: center;
  background: var(--black-deep);
}
.story-cta__inner{
  width: min(90vw, 420px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .7rem;
}
.story-cta__kicker{
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .28em;
  font-size: .72rem;
  color: var(--orange-glow);
}
.story-cta__title{
  font-family: var(--font-display);
  text-transform: uppercase;
  line-height: 1.02;
  color: var(--off-white);
  font-size: clamp(1.8rem, 5vw, 2.6rem);
  margin-bottom: .2rem;
}
.story-cta__lead{
  color: rgba(239,230,216,.75);
  font-size: 1rem;
  line-height: 1.5;
  margin-bottom: .5rem;
}

/* ==========================================================================
   BOUTIQUE — grille produits, fiche produit (modale), panier (tiroir).
   Voir boutique.html, js/boutique.js, data/produits.json, creer-commande.php.
   ========================================================================== */

/* La boutique a besoin de plus de largeur que les pages de texte. */
.page__inner--wide{ max-width: 1120px; }
@media (min-width: 900px){
  .page__inner--wide{ margin-left: auto; margin-right: auto; }
}
.page--boutique .page__lead{ max-width: 60ch; }

/* ---------- Filtres par catégorie ---------- */
.shop-filters{
  display: flex;
  flex-wrap: wrap;
  gap: .6rem;
  margin: .4rem 0 2rem;
}
.shop-filters__chip{
  border: 1px solid rgba(239,230,216,.2);
  background: transparent;
  color: rgba(239,230,216,.78);
  font-family: var(--font-body);
  font-size: .8rem;
  text-transform: uppercase;
  letter-spacing: .12em;
  padding: .5rem 1rem;
  border-radius: 999px;
  transition: color .2s var(--ease), border-color .2s var(--ease), background .2s var(--ease);
}
.shop-filters__chip:hover{ color: var(--off-white); border-color: rgba(239,230,216,.45); }
.shop-filters__chip.is-active{
  background: var(--off-white);
  border-color: var(--off-white);
  color: var(--black);
}

/* ---------- Grille produits ---------- */
.shop-grid{
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: clamp(1.2rem, 3vw, 2rem);
}

.product-card{ display: flex; flex-direction: column; }
.product-card.is-out{ opacity: .62; }

.product-card__media{
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 3 / 4;
  border: 0;
  padding: 0;
  border-radius: 12px;
  overflow: hidden;
  background: transparent;
  cursor: pointer;
}
.product-card__ph,
.product-modal__ph,
.cart-line__ph{
  position: absolute;
  inset: 0;
  background:
    linear-gradient(135deg, rgba(150,0,0,.28), rgba(12,8,7,.9)),
    var(--black);
}
.product-card__ph::after{
  content: "LAARICHI";
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: .8rem;
  letter-spacing: .2em;
  color: rgba(239,230,216,.22);
}
.product-card__media img,
.product-modal__image img{
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.product-card__media img{
  transition: transform .5s var(--ease);
}
.product-card__media:hover img{ transform: scale(1.04); }
.product-card__media:focus-visible{
  outline: 2px solid var(--orange-glow);
  outline-offset: 2px;
}

.product-card__badge{
  position: absolute;
  top: .7rem;
  left: .7rem;
  z-index: 2;
  background: var(--black-deep);
  color: var(--orange-glow);
  font-size: .62rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  padding: .35rem .6rem;
  border-radius: 4px;
}
.product-card__badge--out{ color: rgba(239,230,216,.7); }

.product-card__body{
  padding: .9rem .1rem 0;
  display: flex;
  flex-direction: column;
  gap: .3rem;
}
.product-card__name{
  margin: 0;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 1rem;
  color: var(--off-white);
}
.product-card__desc{
  margin: 0;
  font-size: .86rem;
  line-height: 1.45;
  color: rgba(239,230,216,.62);
}
.product-card__row{
  margin-top: .5rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .8rem;
}
.product-card__price{
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 1.02rem;
  color: var(--off-white);
}
.product-card__add{
  border: 0;
  border-radius: 999px;
  background: var(--red-primary);
  color: var(--off-white);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .74rem;
  text-transform: uppercase;
  letter-spacing: .1em;
  padding: .6rem 1.1rem;
  transition: background .25s var(--ease), color .25s var(--ease);
}
.product-card__add:hover:not(:disabled),
.product-card__add:focus-visible:not(:disabled){
  background: var(--orange-fire);
  color: var(--black);
}
.product-card__add:disabled{
  background: rgba(239,230,216,.12);
  color: rgba(239,230,216,.5);
  cursor: default;
}

/* ---------- État vide ---------- */
.shop-empty{
  padding: 3rem 0 1rem;
  max-width: 46ch;
}
.shop-empty__title{
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: clamp(1.4rem, 4vw, 2rem);
  color: var(--off-white);
  margin-bottom: .8rem;
}
.shop-empty p{
  color: rgba(239,230,216,.75);
  line-height: 1.6;
  margin-bottom: .6rem;
}
.shop-empty__link{
  display: inline-block;
  margin-top: .6rem;
  color: var(--orange-glow);
  font-weight: 600;
  text-decoration: none;
}
.shop-empty__link:hover{ text-decoration: underline; }

/* ---------- Bouton panier flottant ---------- */
.cart-toggle{
  position: fixed;
  right: clamp(1rem, 4vw, 2rem);
  bottom: clamp(1rem, 4vw, 2rem);
  z-index: 45;
  display: inline-flex;
  align-items: center;
  gap: .55rem;
  border: 0;
  border-radius: 999px;
  background: var(--red-primary);
  color: var(--off-white);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .82rem;
  text-transform: uppercase;
  letter-spacing: .1em;
  padding: .8rem 1.3rem;
  box-shadow: 0 12px 30px rgba(0,0,0,.45);
  transition: background .25s var(--ease), transform .2s var(--ease);
}
.cart-toggle:hover,
.cart-toggle:focus-visible{ background: var(--orange-fire); color: var(--black); }
.cart-toggle svg{ width: 1.25rem; height: 1.25rem; }
.cart-toggle__count{
  min-width: 1.4rem;
  height: 1.4rem;
  padding: 0 .35rem;
  border-radius: 999px;
  background: var(--black-deep);
  color: var(--off-white);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: .78rem;
}
.cart-toggle--filled .cart-toggle__count{ background: var(--orange-glow); color: var(--black); }
@media (max-width: 560px){
  .cart-toggle__label{ display: none; }
  .cart-toggle{ padding: .85rem; }
}

/* ---------- Fond sombre commun (panier + fiche) ---------- */
.drawer-backdrop{
  position: fixed;
  inset: 0;
  z-index: 60;
  background: rgba(5,4,3,.66);
  opacity: 0;
  transition: opacity .22s var(--ease);
}
.drawer-backdrop.is-open{ opacity: 1; }

.drawer-close{
  border: 0;
  background: transparent;
  color: var(--off-white);
  width: 2.4rem;
  height: 2.4rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: background .2s var(--ease);
}
.drawer-close svg{ width: 1.3rem; height: 1.3rem; }
.drawer-close:hover,
.drawer-close:focus-visible{ background: rgba(239,230,216,.12); }

/* ---------- Tiroir panier ---------- */
.cart-drawer{
  position: fixed;
  top: 0;
  right: 0;
  z-index: 61;
  width: min(420px, 100%);
  height: 100%;
  display: flex;
  flex-direction: column;
  background: var(--black);
  border-left: 1px solid rgba(239,230,216,.12);
  transform: translateX(100%);
  transition: transform .24s var(--ease);
}
.cart-drawer.is-open{ transform: translateX(0); }

.cart-drawer__head{
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1.1rem 1.2rem;
  border-bottom: 1px solid rgba(239,230,216,.1);
}
.cart-drawer__head h2{
  margin: 0;
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: 1.1rem;
  color: var(--off-white);
}
.cart-drawer__body{
  flex: 1;
  overflow-y: auto;
  padding: 1rem 1.2rem;
}
.cart-drawer__empty{
  color: rgba(239,230,216,.6);
  font-size: .92rem;
  padding: 2rem 0;
  text-align: center;
}

.cart-line{
  display: grid;
  grid-template-columns: 64px 1fr;
  gap: .9rem;
  padding: .9rem 0;
  border-bottom: 1px solid rgba(239,230,216,.08);
}
.cart-line__media{
  position: relative;
  width: 64px;
  height: 80px;
  border-radius: 8px;
  overflow: hidden;
}
.cart-line__media img{
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.cart-line__info{ display: flex; flex-direction: column; gap: .15rem; }
.cart-line__name{
  margin: 0;
  font-weight: 600;
  font-size: .92rem;
  color: var(--off-white);
}
.cart-line__meta{
  margin: 0;
  font-size: .78rem;
  color: rgba(239,230,216,.55);
}
.cart-line__price{
  margin: .1rem 0 0;
  font-size: .9rem;
  color: var(--off-white);
}
.cart-line__qty{
  grid-column: 2;
  display: flex;
  align-items: center;
  gap: .5rem;
  margin-top: .4rem;
}
.cart-line__step{
  width: 1.7rem;
  height: 1.7rem;
  border: 1px solid rgba(239,230,216,.25);
  background: transparent;
  color: var(--off-white);
  border-radius: 6px;
  font-size: 1rem;
  line-height: 1;
}
.cart-line__step:hover{ border-color: var(--off-white); }
.cart-line__remove{
  margin-left: auto;
  border: 0;
  background: transparent;
  color: rgba(239,230,216,.5);
  font-size: .76rem;
  text-decoration: underline;
}
.cart-line__remove:hover{ color: var(--orange-glow); }

.cart-drawer__foot{
  padding: 1.1rem 1.2rem calc(1.1rem + env(safe-area-inset-bottom));
  border-top: 1px solid rgba(239,230,216,.1);
}
.cart-drawer__line{
  display: flex;
  justify-content: space-between;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 1.05rem;
  color: var(--off-white);
}
.cart-drawer__note{
  margin: .3rem 0 .9rem;
  font-size: .78rem;
  color: rgba(239,230,216,.55);
}
.cart-drawer__checkout{
  width: 100%;
  border: 0;
  border-radius: 999px;
  background: var(--red-primary);
  color: var(--off-white);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .85rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  padding: .95rem 1.4rem;
  transition: background .25s var(--ease), color .25s var(--ease);
}
.cart-drawer__checkout:hover:not(:disabled),
.cart-drawer__checkout:focus-visible:not(:disabled){
  background: var(--orange-fire);
  color: var(--black);
}
.cart-drawer__checkout:disabled{ opacity: .5; cursor: default; }
.cart-drawer__reassurance{
  margin: .7rem 0 0;
  text-align: center;
  font-size: .74rem;
  color: rgba(239,230,216,.5);
}
.cart-drawer__reassurance a{ color: rgba(239,230,216,.7); }

/* ---------- Fiche produit (modale) ---------- */
.product-modal{
  position: fixed;
  z-index: 61;
  top: 50%;
  left: 50%;
  width: min(920px, calc(100% - 2rem));
  max-height: calc(100% - 2rem);
  overflow-y: auto;
  transform: translate(-50%, -48%);
  opacity: 0;
  background: var(--black);
  border: 1px solid rgba(239,230,216,.12);
  border-radius: 16px;
  transition: transform .24s var(--ease), opacity .24s var(--ease);
  display: grid;
  grid-template-columns: 1.05fr 1fr;
}
.product-modal.is-open{ transform: translate(-50%, -50%); opacity: 1; }
.product-modal__close{ position: absolute; top: .6rem; right: .6rem; z-index: 2; }

.product-modal__media{ padding: 1rem; }
.product-modal__image{
  position: relative;
  width: 100%;
  aspect-ratio: 3 / 4;
  border-radius: 10px;
  overflow: hidden;
}
.product-modal__thumbs{
  display: flex;
  gap: .5rem;
  margin-top: .6rem;
  flex-wrap: wrap;
}
.product-modal__thumb{
  width: 3.4rem;
  height: 3.4rem;
  border: 1px solid rgba(239,230,216,.2);
  border-radius: 6px;
  overflow: hidden;
  padding: 0;
  background: var(--black-deep);
  position: relative;
}
.product-modal__thumb img{ width: 100%; height: 100%; object-fit: cover; }
.product-modal__thumb.is-active{ border-color: var(--orange-glow); }

.product-modal__info{
  padding: 2rem 2rem 2rem 1rem;
  display: flex;
  flex-direction: column;
  gap: .5rem;
}
.product-modal__cat{
  margin: 0;
  font-size: .7rem;
  text-transform: uppercase;
  letter-spacing: .18em;
  color: var(--orange-glow);
}
.product-modal__title{
  margin: 0;
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: clamp(1.6rem, 4vw, 2.2rem);
  line-height: 1.05;
  color: var(--off-white);
}
.product-modal__price{
  margin: .2rem 0 .4rem;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 1.2rem;
  color: var(--off-white);
}
.product-modal__desc{
  font-size: .95rem;
  line-height: 1.65;
  color: rgba(239,230,216,.8);
}
.product-modal__sizes{ margin-top: .6rem; }
.product-modal__sizes-label{
  margin: 0 0 .5rem;
  font-size: .7rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: var(--off-white-soft);
}
.product-modal__size-options{ display: flex; flex-wrap: wrap; gap: .5rem; }
.product-modal__size{
  min-width: 3rem;
  padding: .55rem .8rem;
  border: 1px solid rgba(239,230,216,.25);
  background: transparent;
  color: var(--off-white);
  border-radius: 8px;
  font-family: var(--font-body);
  font-size: .9rem;
}
.product-modal__size:hover{ border-color: var(--off-white); }
.product-modal__size.is-active{
  background: var(--off-white);
  color: var(--black);
  border-color: var(--off-white);
}
.product-modal__add{
  margin-top: 1rem;
  border: 0;
  border-radius: 999px;
  background: var(--red-primary);
  color: var(--off-white);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .85rem;
  text-transform: uppercase;
  letter-spacing: .14em;
  padding: .95rem 1.4rem;
  transition: background .25s var(--ease), color .25s var(--ease);
}
.product-modal__add:hover,
.product-modal__add:focus-visible{ background: var(--orange-fire); color: var(--black); }

@media (max-width: 720px){
  .product-modal{
    grid-template-columns: 1fr;
    width: 100%;
    max-height: 100%;
    height: 100%;
    border-radius: 0;
    border: 0;
    top: 0; left: 0;
    transform: translateY(100%);
  }
  .product-modal.is-open{ transform: translateY(0); }
  .product-modal__info{ padding: 1rem 1.3rem 2.5rem; }
}

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior: auto; scroll-snap-type: none; }
  .reveal{
    transition: none;
    opacity: 1;
    transform: none;
  }
  .story-dots__dot{ transition: none; }
  .site-nav,
  .site-nav__menu,
  .site-nav__menu a,
  .site-nav__menu a::after,
  .site-nav__toggle-bar{
    transition: none;
  }
  .site-footer a,
  .site-footer a::after{
    transition: none;
  }
}

/* ---------- Small height phones: relax snap so content never clips ---------- */
@media (max-height: 560px){
  .section{ min-height: auto; padding-top: 3rem; padding-bottom: 3rem; }
}

/* Section 3 — le formulaire d'inscription complet de l'accueil (Prénom,
   Nom, Email, Téléphone, source, consentement) est bien plus haut que
   l'ancien champ email seul. Sous ~820px de hauteur d'écran, on laisse la
   section grandir et défiler avec la page plutôt que d'être rognée par
   l'overflow:hidden de .section (scroll-snap est en "proximity", une
   section plus haute que le viewport ne casse pas le rythme de défilement).
   .portrait est un flex "row" : align-items pilote l'axe vertical.
   "safe center" = formulaire centré verticalement tant qu'il tient dans
   l'écran, calé en haut (défilable, rien de rogné) seulement s'il déborde.
   justify-content (horizontal) reste à "center" via la règle de base. */
@media (max-height: 820px){
  /* overflow visible : si le formulaire dépasse la hauteur d'écran (très
     petits téléphones), la section grandit et défile avec la page au lieu
     d'être rognée par l'overflow:hidden de .section. */
  .signature{ overflow: visible; }
  .signature .portrait{
    /* .portrait est un flex "row" → align-items pilote l'axe vertical.
       "safe center" = centré tant que ça tient, calé en haut (défilable,
       rien de rogné) seulement en cas de débordement réel. */
    align-items: safe center;
    /* padding-bottom > padding-top : compense la barre fixe (--nav-height)
       pour que le formulaire tombe au centre optique de la zone visible. */
    padding-top: clamp(1.5rem, 5vh, 3rem);
    padding-bottom: clamp(3.5rem, 9vh, 6rem);
  }
}

/* ==========================================================================
   COOKIE CONSENT — bannière + centre de préférences (voir js/cookie-consent.js)
   ==========================================================================
   Bannière NON bloquante (barre en bas de l'écran, ne recouvre jamais le
   contenu ni ne piège le focus) ; seule la modale "Gérer les préférences"
   est une vraie boîte de dialogue modale. Palette et police reprises telles
   quelles du reste du site (--red-primary, Fraunces) plutôt que d'en
   introduire de nouvelles, pour rester cohérent avec l'identité existante.
   ========================================================================== */
.cookie-banner{
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 100; /* au-dessus de .site-nav (50) et de tout le reste */
  background: linear-gradient(to bottom, rgba(12,8,7,.92), var(--black-deep) 40%);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-top: 1px solid rgba(239,230,216,.12);
  box-shadow: 0 -12px 30px rgba(0,0,0,.35);
  padding: 1.4rem clamp(1.25rem, 5vw, 3rem);
  color: rgba(239,230,216,.85);
  font-family: var(--font-body);
  /* Glisse depuis le bas + fondu (voir .is-visible) : transform/opacity
     plutôt que bottom, pour une animation fluide sur toutes les machines. */
  transform: translateY(100%);
  opacity: 0;
  transition: transform .3s var(--ease), opacity .3s var(--ease);
}
.cookie-banner.is-visible{
  transform: translateY(0);
  opacity: 1;
}
@media (prefers-reduced-motion: reduce){
  .cookie-banner{ transition: none; }
}

.cookie-banner__inner{
  max-width: 1080px;
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 1rem 2rem;
}
.cookie-banner__text{ flex: 1 1 320px; min-width: 0; }
.cookie-banner__title{
  margin: 0 0 .35rem;
  font-weight: 600;
  font-size: 1rem;
  color: var(--off-white);
}
.cookie-banner__description{
  margin: 0;
  font-size: .82rem;
  line-height: 1.5;
  color: rgba(239,230,216,.72);
}
.cookie-banner__description a{
  color: var(--orange-glow);
  text-decoration: underline;
  text-underline-offset: .15em;
}
.cookie-banner__description a:hover,
.cookie-banner__description a:focus-visible{ color: var(--off-white); }

.cookie-banner__actions{
  display: flex;
  flex-wrap: wrap;
  gap: .6rem;
  flex: 0 0 auto;
}

/* Boutons partagés bannière + modale — mêmes proportions pour "Accepter" et
   "Refuser" (même taille de cible, même poids visuel) : le refus doit être
   aussi facile à choisir que l'acceptation, jamais relégué à un lien
   discret en petits caractères. */
.cookie-btn{
  padding: .7rem 1.3rem;
  border-radius: 999px;
  border: 1px solid transparent;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: .82rem;
  white-space: nowrap;
  cursor: pointer;
  transition: background .2s var(--ease), color .2s var(--ease), border-color .2s var(--ease);
}
.cookie-btn--primary{
  background: var(--red-primary);
  color: var(--off-white);
}
.cookie-btn--primary:hover,
.cookie-btn--primary:focus-visible{
  background: var(--orange-fire);
  color: var(--black);
}
.cookie-btn--secondary{
  background: transparent;
  color: rgba(239,230,216,.85);
  border-color: rgba(239,230,216,.35);
}
.cookie-btn--secondary:hover,
.cookie-btn--secondary:focus-visible{
  border-color: var(--off-white);
  color: var(--off-white);
}
.cookie-btn:focus-visible{
  outline: 2px solid var(--orange-fire);
  outline-offset: 2px;
}

@media (max-width: 640px){
  .cookie-banner__actions{ width: 100%; }
  .cookie-btn{ flex: 1 1 auto; text-align: center; }
}

/* ---------- Modale "Gérer les préférences" ---------- */
.cookie-modal{
  position: fixed;
  inset: 0;
  z-index: 200; /* au-dessus de la bannière (100) */
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
  background: rgba(5,4,3,.72);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  opacity: 0;
  transition: opacity .25s var(--ease);
}
.cookie-modal.is-visible{ opacity: 1; }
.cookie-modal[hidden]{ display: none; }
@media (prefers-reduced-motion: reduce){
  .cookie-modal{ transition: none; }
}

.cookie-modal__panel{
  width: min(560px, 100%);
  max-height: min(80vh, 720px);
  overflow-y: auto;
  background: var(--black-deep);
  border: 1px solid rgba(239,230,216,.12);
  border-radius: 16px;
  box-shadow: 0 24px 60px rgba(0,0,0,.5);
  padding: clamp(1.5rem, 4vw, 2.25rem);
  color: rgba(239,230,216,.85);
  font-family: var(--font-body);
  transform: translateY(12px) scale(.98);
  transition: transform .25s var(--ease);
}
.cookie-modal.is-visible .cookie-modal__panel{ transform: translateY(0) scale(1); }
.cookie-modal__panel:focus-visible{ outline: none; }

.cookie-modal__title{
  margin: 0 0 .5rem;
  font-family: var(--font-display);
  font-size: 1.4rem;
  color: var(--off-white);
  border-radius: 4px;
}
/* Reçoit le focus programmatique à l'ouverture (voir js/cookie-consent.js) :
   anneau discret plutôt que le rectangle noir par défaut du navigateur. */
.cookie-modal__title:focus-visible{
  outline: 2px solid var(--orange-fire);
  outline-offset: 4px;
}
.cookie-modal__intro{
  margin: 0 0 1.4rem;
  font-size: .85rem;
  line-height: 1.55;
  color: rgba(239,230,216,.7);
}

.cookie-category{
  padding: 1rem 0;
  border-top: 1px solid rgba(239,230,216,.1);
}
.cookie-category:first-of-type{ border-top: 0; padding-top: 0; }
.cookie-category__header{
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
}
.cookie-category__header h3{
  margin: 0;
  font-size: .95rem;
  font-weight: 600;
  color: var(--off-white);
}
.cookie-category__locked{
  font-size: .72rem;
  font-style: italic;
  color: rgba(239,230,216,.5);
}
.cookie-category p{
  margin: .4rem 0 0;
  font-size: .8rem;
  line-height: 1.5;
  color: rgba(239,230,216,.62);
}

/* Interrupteur (toggle) plutôt qu'une case à cocher nue : plus lisible en
   un coup d'œil pour "activé/désactivé" sur une liste de catégories.
   Le <input type="checkbox"> reste la source de vérité (JS le lit
   directement) — seul l'habillage visuel change. */
.cookie-switch{
  position: relative;
  display: inline-block;
  width: 2.6rem;
  height: 1.5rem;
  flex: 0 0 auto;
}
.cookie-switch input{
  position: absolute;
  inset: 0;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}
.cookie-switch__track{
  position: absolute;
  inset: 0;
  background: rgba(239,230,216,.2);
  border-radius: 999px;
  transition: background .2s var(--ease);
  pointer-events: none;
}
.cookie-switch__track::before{
  content: "";
  position: absolute;
  top: .18rem; left: .18rem;
  width: 1.14rem; height: 1.14rem;
  border-radius: 50%;
  background: var(--off-white);
  transition: transform .2s var(--ease);
}
.cookie-switch input:checked + .cookie-switch__track{ background: var(--red-primary); }
.cookie-switch input:checked + .cookie-switch__track::before{ transform: translateX(1.1rem); }
.cookie-switch input:focus-visible + .cookie-switch__track{
  outline: 2px solid var(--orange-fire);
  outline-offset: 2px;
}
.cookie-switch input:disabled + .cookie-switch__track{
  opacity: .5;
  cursor: default;
}

.cookie-modal__actions{
  display: flex;
  justify-content: flex-end;
  gap: .6rem;
  margin-top: 1.6rem;
  padding-top: 1.2rem;
  border-top: 1px solid rgba(239,230,216,.1);
}
@media (max-width: 480px){
  .cookie-modal__actions{ flex-direction: column-reverse; }
  .cookie-modal__actions .cookie-btn{ width: 100%; text-align: center; }
}

/* ---------- Page /gestion-cookies.html : mêmes blocs que la modale mais
   posés à même le corps de page (voir .page__body), pas en superposition. ---------- */
.cookie-settings__actions{
  display: flex;
  flex-wrap: wrap;
  gap: .7rem;
  margin: 1.6rem 0;
}
.cookie-settings__status{
  margin: 0 0 1.6rem;
  padding: .85rem 1.1rem;
  border-radius: 10px;
  background: rgba(239,230,216,.06);
  border: 1px solid rgba(239,230,216,.12);
  font-size: .85rem;
  color: rgba(239,230,216,.75);
}

/* ==========================================================================
   FIL D'ARIANE — pages secondaires (mentions légales, CGV, confidentialité,
   gestion des cookies). Maillage interne vers l'accueil + repère de
   navigation ; posé en JSON-LD (BreadcrumbList) en plus du HTML visible.
   ========================================================================== */
.breadcrumb{ margin: 0 0 1.4rem; }
.breadcrumb ol{
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  margin: 0;
  padding: 0;
  font-family: var(--font-body);
  font-size: .78rem;
  color: rgba(239,230,216,.55);
}
.breadcrumb li{ display: flex; align-items: center; }
.breadcrumb li:not(:last-child)::after{
  content: "/";
  margin: 0 .5rem;
  color: rgba(239,230,216,.3);
}
.breadcrumb a{
  color: rgba(239,230,216,.75);
  text-decoration: underline;
  text-underline-offset: .15em;
}
.breadcrumb a:hover,
.breadcrumb a:focus-visible{ color: var(--orange-glow); }
