/* ==========================================================================
   RÔLES DE TEXTE — source unique, parent et sous-sites

   Les titres avaient leur échelle ; le texte courant n'en avait pas. On
   trouvait donc cinq tailles de paragraphe — 16, 18, 21, 23 et 27 px — sans
   qu'aucune ne corresponde à un rôle nommé. Deux paragraphes voisins ne se
   composaient pas pareil, et personne ne savait dire lequel avait raison.

   Sept rôles, un par usage réel. Comme pour les titres, la règle est : plus
   aucune déclaration font-size sur du texte hors de ce bloc. Un paragraphe
   qui doit paraître autrement change de classe.
   ========================================================================== */

.lead {
  font-size: var(--fs-lead);
  line-height: var(--lh-3);
}

/* Texte mis en avant : citations, chapô de carte, titre de barre fixe. */
.texte-fort {
  font-size: var(--fs-7);
  line-height: var(--lh-3);
}

/* Texte long : articles et pages de contenu, où le confort de lecture prime
   sur la densité. */
.texte-long {
  font-size: var(--fs-6);
  line-height: var(--lh-4);
}

.body,
.texte {
  font-size: var(--fs-5);
  line-height: var(--lh-4);
}

/* Texte secondaire : pieds de page, mentions sous un champ. */
.texte-second {
  font-size: var(--fs-4);
  line-height: var(--lh-3);
}

/* Libellés et boutons. */
.texte-libelle {
  font-size: var(--fs-3);
  line-height: var(--lh-2);
}

/* Mentions légales, crédits, poids de fichier. */
.texte-mention {
  font-size: var(--fs-1);
  line-height: var(--lh-2);
}

/* ============================================================================
   CIRQUE PHÉNIX — feuille de style du thème
   ----------------------------------------------------------------------------
   SOMMAIRE (Cmd+F sur « § n » pour sauter à une section)

   § 1  Variables, remise à zéro, base
   § 2  Rôles typographiques
   § 3  Boutons
   § 4  Navigation et barre utilitaire
   § 5  Grain et placeholders
   § 6  Hero
   § 7  Sections génériques
   § 8  Animations de révélation
   § 9  Adaptatif
   § 10 Compléments WordPress (menus, contenu, menu mobile)
   § 11 Barre utilitaire au-dessus du menu
   § 12 Bande de réservation pleine largeur
   § 13 Accueil Grand Public
   § 14 Bouton de réservation plein doré
   § 15 Toile Gutenberg (modèle pleine largeur)
   § 16 Champ date et calendrier
   § 17 Hero 85vh, contenu aligné à gauche
   § 18 Ajustements de sections
   § 19 Effet de survol unifié des boutons
   § 20 Barre de réservation fixe
   § 21 Chapiteau : bloc de chiffres
   § 22 Accessibilité
   § 23 Fil d'Ariane
   § 24 Calendrier de réservation (template-reservation.php)
   § 25 à 36 Compléments (séances, fonds, galerie, filets…)
   § 37 Landing (pages de conversion publicitaire)
   § 38 Réseaux sociaux
   § 39 Avis Google sur les landings

   CONVENTIONS
   - Couleurs, polices et espacements : uniquement via les variables du § 1.
   - Aucun !important sauf dans prefers-reduced-motion et les réinitialisations
     de styles injectés par WordPress.
   - Les surcharges de section se préfixent par leur identifiant (#chapiteau…)
     plutôt que par un !important.
   ============================================================================ */

/*
Theme Name: Cirque Phénix
Theme URI: https://www.cirquephenix.com/
Author: Edgar Tessier
Author URI: https://www.edgar-tessier.fr
Description: Theme sur-mesure du Cirque Phenix - direction luxe (noir, blanc, cuivre), page d'accueil emotionnelle et adaptable par audience. Titres en Trajan (substitut Cinzel), textes en Barlow Semi Condensed, accents Cormorant Garamond.
Version: 3.46.0
Requires at least: 6.0
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: cirque-phenix
*/

/* Barlow Semi Condensed — hébergé en local (RGPD + performance) */
@font-face {
  font-family: "Barlow Semi Condensed";
  src: url("assets/fonts/barlow-semicondensed-400.woff2") format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Barlow Semi Condensed";
  src: url("assets/fonts/barlow-semicondensed-500.woff2") format("woff2");
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Barlow Semi Condensed";
  src: url("assets/fonts/barlow-semicondensed-600.woff2") format("woff2");
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Barlow Semi Condensed";
  src: url("assets/fonts/barlow-semicondensed-400-italic.woff2") format("woff2");
  font-weight: 400;
  font-style: italic;
  font-display: swap;
}

/* ==== § 1 — VARIABLES, REMISE À ZÉRO, BASE ==== */
:root {
  --black: #111111;
  --white: #ffffff;
  --copper: #85684a;
  --beige: #f0e9da;
  --copper-lt: #b79a72;
  --copper-dim: rgba(133, 104, 74, 0.3);
  --paper: #fcfbf9;
  --ink: #141210;
  --ink-soft: #4a443c;
  --night: #0d0c0b;
  --night-2: #161311;
  --font-display: "Barlow Semi Condensed", system-ui, sans-serif;
  --font-accent: "Barlow Semi Condensed", system-ui, sans-serif;
  --font-body: "Barlow Semi Condensed", system-ui, sans-serif;

  /* Police des GRANDS titres, h1 et h2 seulement.
     Séparée de --font-display, qui habille aussi les chiffres, les noms de
     villes et les titres de cartes — tous en casse normale. Une police de
     capitales comme Trajan y transformerait « Pack Famille » en « PACK
     FAMILLE ». Ce jeton permet de changer les deux niveaux les plus hauts
     sans toucher au reste. */
  --font-titre: var(--font-display);
  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);

  /* Filets cuivre */
  --copper-hair: rgba(133, 104, 74, 0.22);
  --copper-hair-strong: rgba(133, 104, 74, 0.45);

  /* Échelle d'espacement — une seule source pour tout le rythme vertical.
     Toute nouvelle marge doit piocher ici plutôt qu'inventer une valeur. */

  /* ---------------------------------------------------------------------
     ÉCHELLE TYPOGRAPHIQUE

     Avant leur introduction, cette feuille comptait 54 tailles de police
     distinctes, 17 interlignages et 22 interlettrages, pour 334 déclarations
     toutes écrites en dur.

     Les 31 tailles fluides étaient chacune employées UNE seule fois — dont
     clamp(19px, 2vw, 23px) et clamp(19px, 1.55vw, 23px), mêmes bornes,
     pentes différentes. Autant dire trente et une échelles parallèles.

     Un rapport constant entre les pas est ce qui fait qu'une page « tombe
     juste » sans qu'on sache dire pourquoi. Il n'y en avait aucun.

     Pour modifier l'ensemble : ici, une seule fois.
     --------------------------------------------------------------------- */

  /* Tailles fixes — texte courant, mentions, libellés. */
  --fs-1: 10px;
  --fs-2: 11.5px;
  --fs-3: 13px;
  --fs-4: 14.5px;
  --fs-5: 16px;
  --fs-6: 18px;
  --fs-7: 21px;
  --fs-8: 26px;

  /* Tailles fluides — six niveaux de titre, l'accroche, les sous-titres. */
  --fs-d1: clamp(70px, 11vw, 170px);
  --fs-h1: clamp(40px, 7vw, 96px);
  --fs-h2: clamp(34px, 5vw, 66px);
  --fs-h3: clamp(26px, 3.6vw, 48px);
  --fs-h4: clamp(24px, 2.8vw, 38px);
  --fs-h5: clamp(21px, 2.3vw, 29px);
  --fs-h6: clamp(18px, 1.9vw, 23px);
  --fs-lead: clamp(19px, 2.2vw, 27px);
  --fs-sub: clamp(17px, 1.5vw, 21px);
  --fs-micro: clamp(13px, 1.2vw, 16px);
  --fs-nano: clamp(9.5px, 0.9vw, 11.5px);

  /* Interlignages, du plus serré au plus aéré. */
  /* Sous 1 : réservé au très grand affichage, où l'interligne normal
     ouvrirait un gouffre entre deux lignes de 170 px. */
  --lh-serre: 0.78;
  --lh-0: 1;
  --lh-1: 1.15;
  --lh-2: 1.3;
  --lh-3: 1.45;
  --lh-4: 1.6;
  --lh-5: 1.75;
  /* Au-delà : mentions légales et paragraphes en tout petit corps, où l'œil
     a besoin de plus d'air pour retrouver la ligne suivante. */
  --lh-large: 1.9;

  /* Interlettrages. Les valeurs hautes sont réservées aux petites capitales,
     qui ont besoin d'air pour rester lisibles. */
  --ls-0: 0.02em;
  --ls-1: 0.05em;
  --ls-2: 0.1em;
  --ls-3: 0.14em;
  --ls-4: 0.18em;
  --ls-5: 0.24em;

  /* ---------------------------------------------------------------------
     ÉCHELLE D'ESPACEMENT

     Avant son introduction, la feuille employait 56 valeurs distinctes de
     marge et de rembourrage : 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28,
     30, 32, 34, 36, 38, 40… sans aucun pas commun. Deux sections voisines ne
     respiraient donc jamais pareil, et le rythme vertical de la page ne
     s'installait nulle part.

     Seize pas, de 2 à 168 px. Pas de 2 px dans le bas — ce sont de vrais
     micro-ajustements, un filet, l'alignement d'une icône — puis une
     progression d'environ 1,25, le même rapport que la typographie. C'est ce
     rapport partagé qui fait qu'un texte et l'air autour de lui semblent
     appartenir au même système.
     --------------------------------------------------------------------- */

  --e-1: 2px;
  --e-2: 4px;
  --e-3: 6px;
  --e-4: 8px;
  --e-5: 12px;
  --e-6: 16px;
  --e-7: 20px;
  --e-8: 26px;
  --e-9: 32px;
  --e-10: 40px;
  --e-11: 52px;
  --e-12: 64px;
  --e-13: 80px;
  --e-14: 100px;
  --e-15: 124px;
  --e-16: 168px;

  /* Pas fluides — l'air entre les sections et à l'intérieur de chacune.

     Il en existait 56 variantes, chacune employée une ou deux fois :
     clamp(48px, 8vh, 90px), clamp(48px, 7vh, 86px), clamp(48px, 8vw, 90px)…
     trois façons d'écrire le même souffle, qui n'en donnaient jamais deux
     identiques. C'est la première cause d'un rythme vertical qui ne
     s'installe pas.

     Six pas, du resserrement d'une carte au grand blanc entre deux sections.
     Le levier « Densité verticale » du Personnalisateur agit sur eux. */
  --ef-1: clamp(14px, 1.8vw, 24px);
  --ef-2: clamp(20px, 2.6vw, 36px);
  --ef-3: clamp(28px, 4vw, 56px);
  --ef-4: clamp(40px, 6vh, 80px);
  --ef-5: clamp(64px, 9vh, 120px);
  --ef-6: clamp(88px, 13vh, 168px);

  /* Les trois mêmes pas, calés sur la LARGEUR de fenêtre.

     Les trois précédents emploient vh : c'est juste pour un rembourrage de
     section, qui doit respirer avec la hauteur de l'écran. Appliqué à une
     gouttière entre deux colonnes, c'est un contresens — la largeur d'un
     blanc se mettait à dépendre de la hauteur de la fenêtre, et une même
     page s'écartait différemment selon qu'on la regardait sur un écran large
     ou sur un portable posé à l'horizontale.

     Trente-six emplois horizontaux étaient dans ce cas. */
  /* La famille horizontale s'arrêtait au pas 4. Une règle appelant --efh-3
     produisait donc une valeur invalide, silencieusement ignorée : le gap du
     carrousel valait zéro et les cartes se touchaient. Une variable qui
     n'existe pas ne casse rien — elle annule, ce qui est pire à trouver. */
  --efh-1: clamp(14px, 1.8vw, 24px);
  --efh-2: clamp(20px, 2.6vw, 36px);
  --efh-3: clamp(28px, 4vw, 56px);
  --efh-4: clamp(40px, 6vw, 80px);
  --efh-5: clamp(64px, 9vw, 120px);
  --efh-6: clamp(88px, 13vw, 168px);

  /* Largeur du bloc de contenu. Le Personnalisateur la remplace ; les règles
     qui doivent s'y caler — la largeur d'une carte de carrousel — la lisent
     ici plutôt que de la recopier. */
  --cp-largeur: 1240px;
}
* {
  box-sizing: border-box;
}
html {
  scroll-behavior: smooth;
}
body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-body);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}
::selection {
  background: var(--copper);
  color: #fff;
}
a {
  color: inherit;
  text-decoration: none;
}
img {
  display: block;
  max-width: 100%;
}
h1,
h2,
h3,
p {
  margin: 0;
}
.vh {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
}

/* ==== § 2 — RÔLES TYPOGRAPHIQUES ==== */
.eyebrow {
  display: block;
  font-family: var(--font-body);
  font-weight: 600;
  /* Casse normale, comme les entrées du méga-menu.
     Les capitales imposaient de lire lettre à lettre : elles n'ont pas de
     hampes ni de jambages, donc pas de silhouette de mot — l'œil doit
     déchiffrer au lieu de reconnaître. Sur un sur-titre de 11,5 px, c'est
     une charge pour une ligne qui ne fait qu'annoncer. */
  text-transform: none;
  /* 0,14 em et non 0,24. À 11,5 px, 0,24 em fait 2,8 px entre chaque lettre —
     plus large qu'un caractère de texte courant. Le mot cessait d'être une
     forme : on lisait N-O-S-O-F-F-R-E-S. 0,14 em aère sans disloquer. */
  /* 0,05 em au lieu de 0,14. L'interlettrage large est une correction pour
     les capitales, qui se cognent sans lui ; en bas-de-casse il disloque le
     mot. */
  letter-spacing: var(--ls-1);
  /* 13 px au lieu de 11,5. À corps égal, un mot en bas-de-casse paraît plus
     petit qu'en capitales — la hauteur d'œil vaut environ 70 % de la
     capitale. Un cran rétablit la présence. */
  font-size: var(--fs-3);
  color: var(--copper);
  /* Le sur-titre portait un filet, dont la marge haute l'écartait du titre.
     Le filet parti, les deux lignes se touchaient : la marge basse reprend
     cet espace à son compte. */
  margin-inline: 0;
}
/* Barre horizontale automatique sous chaque eye-brow, partout — y compris
   dans les pages Gutenberg (paragraphe de classe « eyebrow »). */
/* Filet du sur-titre.

   Conservé partout où le sur-titre est seul — le bandeau d'accueil, par
   exemple, qui n'a pas de titre de section. Le retirer d'un bloc l'aurait
   privé de son seul repère graphique.

   Dans un chapeau de section, en revanche, il descend sous le titre : voir la
   règle suivante. */

/* Dans un chapeau de section, le filet passe SOUS LE TITRE.

   Sous le sur-titre, il séparait deux éléments qui vont ensemble : la petite
   ligne en capitales annonce le titre, elle ne s'en distingue pas. Sous le
   titre, il ferme le chapeau et sépare enfin quelque chose — l'annonce du
   contenu.

   Il passe de 2 à 3 px et de 48 à 64 : plus bas dans la page, sous un texte
   plus grand, un trait fin se lit comme un accident. */
.sec-head .eyebrow {
  /* 20 px et non 10.

     Le sur-titre portait un filet, dont la marge haute l'écartait du titre.
     Ce filet est passé sous le titre, et les deux lignes se sont retrouvées
     à se toucher : la valeur d'origine ne tenait compte que de l'épaisseur
     du trait, pas de l'air qu'il occupait. */
}

/* ==========================================================================
   ÉCHELLE DES TITRES — source unique, parent et sous-sites

   Six niveaux, définis une fois. Les BALISES portent l'échelle, les classes
   .h1 à .h6 permettent de composer un titre à un niveau différent de sa
   balise — un H2 de section qui doit paraître plus petit garde son rang
   sémantique et prend la classe .h3.

   Avant cela, chaque section fixait la taille de ses propres titres : neuf
   règles côté site principal, dix côté sous-sites, avec quatre valeurs
   différentes pour un simple h3 selon la section où il se trouvait. Deux
   cartes voisines n'avaient pas des titres de même taille.

   Règle de travail : plus aucune déclaration font-size sur un titre en
   dehors de ce bloc. Une section qui a besoin d'un autre niveau change de
   classe, elle ne change pas de taille.
   ========================================================================== */

h1,
.h1 {
  font-family: var(--font-titre);
  font-weight: 500;
  letter-spacing: var(--ls-1);
  line-height: var(--lh-0);
  font-size: var(--fs-h1);
  text-transform: uppercase;
}

h2,
.h2 {
  font-family: var(--font-titre);
  font-weight: 500;
  letter-spacing: var(--ls-1);
  line-height: var(--lh-1);
  font-size: var(--fs-h3);
  text-transform: uppercase;
}

h3,
.h3 {
  font-family: var(--font-accent);
  font-weight: 500;
  font-size: var(--fs-h5);
  line-height: var(--lh-1);
  letter-spacing: var(--ls-0);
}

h4,
.h4 {
  font-family: var(--font-accent);
  font-weight: 500;
  font-size: var(--fs-h6);
  line-height: var(--lh-2);
  letter-spacing: var(--ls-0);
}

h5,
.h5 {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-sub);
  line-height: var(--lh-2);
  letter-spacing: var(--ls-0);
}

h6,
.h6 {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-5);
  line-height: var(--lh-2);
  letter-spacing: var(--ls-1);
  text-transform: uppercase;
}

/* Titre de page intérieure : un cran sous le bandeau d'accueil, qui reste le
   seul à occuper l'écran entier. */
.h1-page,
.cpp-pagehero h1 {
  font-size: var(--fs-h2); /* charte-ok: titre de page intérieure, un cran sous le bandeau d’accueil */
}
.lead {
  font-family: var(--font-accent);
  font-weight: 400;
  font-size: var(--fs-lead);
  line-height: var(--lh-3);
}
/* L'italique a été retiré du thème : en capitales fines sur photo sombre, il
   coûtait en lisibilité ce qu'il apportait en élégance — et l'accroche du
   bandeau est la première phrase que lit un visiteur. La classe subsiste et
   porte désormais la seule graisse, pour que le balisage n'ait pas à changer
   dans les gabarits. */
.lead.i {
  font-weight: 300;
}
.body {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--fs-5);
  line-height: var(--lh-5);
  color: var(--ink-soft);
}
.body.serif {
  font-family: var(--font-accent);
  font-weight: 400;
  font-size: var(--fs-7);
  line-height: var(--lh-4);
  color: var(--ink-soft);
}

/* copper hairline flourish */
/* Filet sous le sur-titre. Rythme unique sur tout le site :
   8 px entre le sur-titre et le filet (ils forment un bloc solidaire),
   20 px entre le filet et le titre. Voir --e-4 et --e-7 dans l'échelle. */
.rule {
  display: block;
  width: 54px;
  height: 1px;
  background: var(--copper);
  opacity: 0.9;
  margin: 0 0 var(--e-7);
}
.rule.c {
  margin-left: auto;
  margin-right: auto;
}

/* ==== § 3 — BOUTONS ==== */
.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--e-5);
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-3);
  padding: var(--e-6) var(--e-9);
  border: 1px solid var(--copper);
  color: var(--copper);
  background: transparent;
  cursor: pointer;
  transition: 0.5s var(--ease);
  position: relative;
  overflow: hidden;
}
.btn > * {
  position: relative;
  z-index: 1;
}
.btn::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--copper);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.5s var(--ease);
  z-index: 0;
}
.btn:hover {
  color: #fff;
}
.btn:hover::before {
  transform: scaleX(1);
}
.btn.on-dark {
  color: var(--copper-lt);
  border-color: rgba(183, 154, 114, 0.55);
}
.btn.on-dark:hover {
  color: var(--night);
}
.btn.on-dark::before {
  background: var(--copper-lt);
}

.arrow {
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  color: var(--copper);
  cursor: pointer;
  padding-bottom: var(--e-2);
  position: relative;
  width: max-content;
}
.arrow::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  height: 1px;
  width: 100%;
  background: var(--copper);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.5s var(--ease);
}
.arrow:hover::after {
  transform: scaleX(1);
}
.arrow .ln {
  width: 26px;
  height: 1px;
  background: var(--copper);
  transition: width 0.4s var(--ease);
}
.arrow:hover .ln {
  width: 40px;
}

/* ==== § 4 — NAVIGATION ==== */
.nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 50;
  display: flex;
  align-items: center;
  gap: var(--e-8);
  padding: var(--e-7) var(--ef-3);
  transition:
    background 0.5s var(--ease),
    padding 0.5s var(--ease),
    border-color 0.5s;
  border-bottom: 1px solid transparent;
}
.nav.solid,
.nav.has-open {
  background: rgba(13, 12, 11, 0.86);
  backdrop-filter: blur(10px);
  padding-top: var(--e-6);
  padding-bottom: var(--e-6);
  border-color: rgba(183, 154, 114, 0.16);
}
/* Voile sombre sur la page quand un panneau du menu est ouvert : il fait
   ressortir le panneau et concentre l'attention. Posé sous la barre (z-index
   50) et sous le panneau, au-dessus du reste de la page. */
.cp-mega-overlay {
  position: fixed;
  inset: 0;
  background: rgba(13, 12, 11, 0.55);
  opacity: 0;
  visibility: hidden;
  transition:
    opacity 0.3s var(--ease),
    visibility 0.3s var(--ease);
  z-index: 40;
  pointer-events: none;
}
.nav.has-open ~ .cp-mega-overlay,
body.cp-mega-open .cp-mega-overlay {
  opacity: 1;
  visibility: visible;
}
.nav .logo {
  /* 56 px. Le logo est une signature manuscrite, très fine : les déliés se
     ferment bien avant que le mot ne paraisse petit, et c'est le seul élément
     de l'en-tête qui ne se relit pas — on le reconnaît ou non. */
  height: 56px;
  width: auto;
  opacity: 0.96;
  transition: height 0.5s var(--ease);
}
.nav.solid .logo {
  /* En-tête compacté au défilement : même proportion de réduction qu'avant,
     appliquée à la nouvelle taille. */
  height: 48px;
}
.nav .links {
  display: flex;
  gap: var(--e-9);
  margin: 0 auto;
}
.nav .links a {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  /* 13 px et non 11,5. En capitales espacées de 0,14 em, 11,5 px tombe sous
     le seuil de confort : la navigation est le premier élément qu'on lit, et
     le seul qu'on relit à chaque page. */
  font-size: var(--fs-5);
  color: rgba(255, 255, 255, 0.82);
  position: relative;
  padding: var(--e-3) 0;
}
.nav .links a::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  height: 1px;
  width: 100%;
  background: var(--copper);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.45s var(--ease);
}
.nav .links a:hover::after {
  transform: scaleX(1);
}
/* La rubrique dont le panneau est ouvert garde son soulignement. */
.nav .cp-nav-item.is-open > a::after {
  transform: scaleX(1);
}
/* Les liens d'un panneau ne reprennent pas le soulignement des rubriques :
   il se dessinerait en bas de leur boîte, donc sous le bouton « Découvrir ». */
.nav .cp-mega a::after,
.nav .cp-mega a:hover::after {
  content: none;
  display: none;
}
/* Le bouton du menu reprend le balayage de survol des boutons .btn :
   un aplat cuivre qui se déploie de la gauche, plutôt qu'un simple
   changement de fond. Il reste plein au repos — c'est l'action
   principale du site, elle ne doit pas s'effacer derrière un contour. */
.nav .navcta {
  position: relative;
  overflow: hidden;
  display: inline-flex;
  align-items: center;
  font-family: var(--font-body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-5);
  color: var(--night);
  background: var(--copper-lt);
  border: 1px solid var(--copper-lt);
  padding: var(--e-5) var(--e-7);
  transition:
    color 0.5s var(--ease),
    border-color 0.5s var(--ease);
}
.nav .navcta > * {
  position: relative;
  z-index: 1;
}
.nav .navcta::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--copper);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.5s var(--ease);
  z-index: 0;
}
.nav .navcta:hover,
.nav .navcta:focus-visible {
  color: #fff;
  border-color: var(--copper);
}
.nav .navcta:hover::before,
.nav .navcta:focus-visible::before {
  transform: scaleX(1);
}
@media (prefers-reduced-motion: reduce) {
  .nav .navcta::before {
    transition: none;
  }
}
.nav .burger {
  display: none;
  flex-direction: column;
  gap: var(--e-2);
  margin-left: auto;
}
.nav .burger span {
  width: 26px;
  height: 1.5px;
  background: #fff;
}

/* ==== § 5 — GRAIN ET PLACEHOLDERS ==== */
.grain::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: 0.5;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E");
}
.plate {
  position: relative;
  overflow: hidden;
  background: linear-gradient(150deg, #1c1813, #26201a 45%, #14110d);
}
.plate::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    80% 90% at 30% 15%,
    rgba(133, 104, 74, 0.34),
    transparent 60%
  );
}
.plate.frame {
  outline: 1px solid rgba(183, 154, 114, 0.28);
  outline-offset: -10px;
}
.plate .cap {
  position: absolute;
  left: 18px;
  bottom: 16px;
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-1);
  color: rgba(255, 255, 255, 0.66);
  z-index: 2;
}

/* ==== § 6 — HERO ==== */
.hero {
  position: relative;
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  color: #fff;
  padding: var(--e-16) var(--ef-3) var(--e-14);
  background: var(--night);
}
.hero .bg {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      120% 78% at 50% -6%,
      rgba(133, 104, 74, 0.3),
      transparent 55%
    ),
    radial-gradient(
      90% 120% at 50% 128%,
      rgba(133, 104, 74, 0.1),
      transparent 60%
    ),
    linear-gradient(#0d0c0b, #161311 70%, #0d0c0b);
}
.hero .spot {
  position: absolute;
  top: -30%;
  left: 50%;
  width: 70vw;
  height: 70vw;
  transform: translateX(-50%);
  background: radial-gradient(
    circle,
    rgba(133, 104, 74, 0.16),
    transparent 62%
  );
  animation: drift 14s ease-in-out infinite alternate;
}
@keyframes drift {
  from {
    transform: translateX(-54%) translateY(-4%);
  }
  to {
    transform: translateX(-46%) translateY(3%);
  }
}
.hero .inner {
  position: relative;
  z-index: 2;
  max-width: 960px;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.hero .mark {
  height: clamp(58px, 9vw, 104px);
  width: auto;
  margin-bottom: var(--e-9);
}
.hero .h1 {
  color: #fff;
  margin: var(--e-4) 0 0;
}
.hero .lead {
  color: rgba(255, 255, 255, 0.8);
  max-width: 600px;
  margin-inline: auto;
}
.hero .eyebrow {
  color: var(--copper-lt);
}

.scrollcue {
  position: absolute;
  bottom: 30px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-4);
  color: rgba(255, 255, 255, 0.45);
}
.scrollcue .line {
  width: 1px;
  height: 46px;
  background: linear-gradient(rgba(183, 154, 114, 0.7), transparent);
  animation: cue 2.4s ease-in-out infinite;
}
.scrollcue span {
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: var(--ls-5);
  font-size: var(--fs-1);
}
@keyframes cue {
  0%,
  100% {
    transform: scaleY(0.4);
    opacity: 0.4;
    transform-origin: top;
  }
  50% {
    transform: scaleY(1);
    opacity: 1;
    transform-origin: top;
  }
}

/* ==== § 7 — SECTIONS GÉNÉRIQUES ==== */
section {
  position: relative;
}
.sec {
  padding: var(--ef-6) var(--ef-3);
}
.container {
  max-width: 1240px;
  margin: 0 auto;
}
.center {
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.center .rule {
  margin: 0 0 var(--e-7);
}
.sec-head .eyebrow {
  display: block;
}

/* manifesto */
.manifesto {
  text-align: center;
}
.manifesto .h2 {
  max-width: 16ch;
  margin-inline: auto;
}
.manifesto .body.serif {
  max-width: 56ch;
  margin-inline: auto;
}

/* feature split */
.split {
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: var(--efh-4);
  align-items: center;
}
/* Les colonnes de grille ont min-width:auto par défaut, ce qui les empêche
   de rétrécir sous la largeur de leur contenu et provoque un débordement
   horizontal sur mobile. On les autorise à rétrécir. */
.split > * {
  min-width: 0;
}
.split.rev .media {
  order: 2;
}
.split .media {
  aspect-ratio: 4/5;
  height: 100%;
  min-height: 420px;
}
.split .txt .eyebrow {
  display: block;
}
.split .txt .h3 {
  color: var(--copper);
}

/* grandeur (dark) */
.grandeur {
  background: var(--night);
  color: #fff;
  overflow: hidden;
}
.grandeur .bg {
  position: absolute;
  inset: 0;
  background: radial-gradient(
    60% 120% at 50% 0%,
    rgba(133, 104, 74, 0.14),
    transparent 60%
  );
}
.grandeur .container {
  position: relative;
}
.grandeur .eyebrow {
  color: var(--copper-lt);
}
/* Sans ces règles, .h2 garde sa couleur d'encre et disparaît sur le fond nuit.
   C'est ce qui rendait « Phénix s'engage » illisible. */
.grandeur .h1-page,
.grandeur .h2,
.grandeur .h3 {
  color: #fff;
}
.grandeur .body,
.grandeur .tag {
  color: rgba(233, 226, 214, 0.82);
}
.grandeur .rule {
  background: var(--copper-lt);
}
.figs {
  display: flex;
  justify-content: center;
  gap: var(--efh-5);
  flex-wrap: wrap;
  margin: var(--e-10) 0 var(--e-9);
}
.fig .n {
  font-family: var(--font-display);
  font-weight: 500;
  color: var(--copper-lt);
  font-size: var(--fs-h2);
  line-height: var(--lh-0);
  letter-spacing: var(--ls-0);
}
.fig .l {
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  color: rgba(255, 255, 255, 0.6);
  margin-top: var(--e-5);
  max-width: 16ch;
  margin-left: auto;
  margin-right: auto;
}
.grandeur .tag {
  font-family: var(--font-accent);
  font-weight: 300;
  /* 21 px et non 29. --fs-h5 est la taille d'un titre de niveau 3 : appliquée
     à un chapô, elle le faisait lire comme un titre, et donnait à cette
     section un texte plus gros que partout ailleurs. */
  font-size: var(--fs-7);
  color: rgba(255, 255, 255, 0.85);
}

/* gallery */
.gallery .grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ef-2);
  margin-top: var(--e-11);
}
.gcard .media {
  aspect-ratio: 3/4;
  margin-bottom: var(--e-7);
}
.gcard .body {
  font-size: var(--fs-5);
}

/* final cta (dark) */
.final {
  background: var(--night);
  color: #fff;
  text-align: center;
  overflow: hidden;
}
.final .bg {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      80% 120% at 50% 120%,
      rgba(133, 104, 74, 0.22),
      transparent 60%
    ),
    radial-gradient(70% 90% at 50% 0%, rgba(133, 104, 74, 0.1), transparent 55%);
}
.final .container {
  position: relative;
}
.final .h2 {
  color: #fff;
  max-width: 18ch;
  margin-inline: auto;
}
.final .h3 {
  color: #fff;
}
.final .body,
.final .tag {
  color: rgba(233, 226, 214, 0.82);
}
.final .rule {
  background: var(--copper-lt);
}
.final .eyebrow {
  color: var(--copper-lt);
  display: block;
}

/* footer */
.foot {
  background: #0a0908;
  color: rgba(255, 255, 255, 0.55);
  padding: var(--ef-5) var(--ef-3) var(--e-11);
}
.foot .top {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1fr;
  gap: var(--e-10);
  align-items: start;
  border-bottom: 1px solid rgba(183, 154, 114, 0.18);
  padding-bottom: var(--e-11);
}
.foot .brandcol .logo {
  height: 44px;
  width: auto;
  margin-bottom: var(--e-7);
}
.foot .brandcol p {
  font-family: var(--font-accent);
  font-weight: 300;
  font-size: var(--fs-5);
  color: rgba(255, 255, 255, 0.6);
  max-width: 34ch;
  line-height: var(--lh-3);
}
.foot .col b {
  display: block;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  color: var(--copper-lt);
  margin-bottom: var(--e-6);
}
.foot .col a {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-4);
  color: rgba(255, 255, 255, 0.6);
  margin-bottom: var(--e-5);
  transition: 0.3s;
}
.foot .col a:hover {
  color: #fff;
}
.foot .bottom {
  display: flex;
  justify-content: space-between;
  gap: var(--e-7);
  flex-wrap: wrap;
  margin-top: var(--e-9);
  font-family: var(--font-body);
  font-size: var(--fs-2);
  letter-spacing: var(--ls-1);
  color: rgba(255, 255, 255, 0.4);
}

/* ==== § 8 — ANIMATIONS DE RÉVÉLATION ==== */
.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 1s var(--ease),
    transform 1s var(--ease);
}
.reveal.in {
  opacity: 1;
  transform: none;
}
.reveal.d1 {
  transition-delay: 0.12s;
}
.reveal.d2 {
  transition-delay: 0.24s;
}

/* ==== § 9 — ADAPTATIF ==== */
@media (max-width: 900px) {
  .nav .links {
    display: none;
  }
  .nav .navcta {
    display: none;
  }
  .nav .burger {
    display: flex;
  }
  .split {
    grid-template-columns: 1fr;
    gap: var(--e-9);
  }
  .split.rev .media {
    order: 0;
  }
  .split .media {
    min-height: 340px;
    aspect-ratio: 16/11;
    width: 100%;
    max-width: 100%;
  }
  .gallery .grid {
    grid-template-columns: 1fr;
    gap: var(--e-8);
  }
  .gcard .media {
    aspect-ratio: 16/11;
  }
  .foot .top {
    grid-template-columns: 1fr 1fr;
    gap: var(--e-9);
  }
}
@media (max-width: 560px) {
  .foot .top {
    grid-template-columns: 1fr;
  }
  .figs {
    gap: var(--e-8);
  }
}
@media (prefers-reduced-motion: reduce) {
  * {
    animation: none !important; /* légitime : respecte prefers-reduced-motion */
  }
  .reveal {
    opacity: 1;
    transform: none;
    transition: none;
  }
  html {
    scroll-behavior: auto;
  }
}

/* ============================================================
   § 10 — COMPLÉMENTS WORDPRESS (menus, listes, menu mobile, contenu)
   ============================================================ */
.nav .links {
  display: flex;
  gap: var(--e-9);
  margin: 0 auto;
  padding: 0;
  list-style: none;
  align-items: center;
}
.nav .links li {
  list-style: none;
  margin: 0;
}
.nav .brandlink {
  display: inline-flex;
  align-items: center;
}
.admin-bar .nav {
  top: 32px;
}
@media (max-width: 782px) {
  .admin-bar .nav {
    top: 46px;
  }
}

/* Menu mobile */
@media (max-width: 900px) {
  .nav .links {
    position: fixed;
    inset: 0;
    background: rgba(10, 9, 8, 0.97);
    backdrop-filter: blur(6px);
    flex-direction: column;
    justify-content: center;
    gap: var(--e-4);
    margin: 0;
    padding: var(--e-13) var(--e-9);
    transform: translateY(-100%);
    transition: transform 0.5s var(--ease);
    z-index: -1;
  }
  .nav.open .links {
    transform: none;
  }
  .nav .links a {
    font-size: var(--fs-7);
    letter-spacing: var(--ls-3);
    padding: var(--e-5) 0;
  }
  .nav .burger[aria-expanded="true"] span:nth-child(1) {
    transform: translateY(6.5px) rotate(45deg);
  }
  .nav .burger[aria-expanded="true"] span:nth-child(2) {
    opacity: 0;
  }
  .nav .burger[aria-expanded="true"] span:nth-child(3) {
    transform: translateY(-6.5px) rotate(-45deg);
  }
  .nav .burger span {
    transition: 0.35s var(--ease);
  }
}

/* Menu de pied de page (wp_nav_menu) */
.foot .cp-footlist {
  list-style: none;
  margin: 0;
  padding: 0;
}
.foot .cp-footlist li {
  list-style: none;
  margin: 0;
}
.foot .cp-footlist a {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-4);
  color: rgba(255, 255, 255, 0.6);
  margin-bottom: var(--e-5);
  transition: 0.3s;
}
.foot .cp-footlist a:hover {
  color: #fff;
}

/* Contenu de page / articles */
.cp-page,
.cp-postlist {
  max-width: 820px;
  margin-left: auto;
  margin-right: auto;
}
.cp-content {
  color: var(--ink-soft);
}
.cp-content h2 {
  font-family: var(--font-display);
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-h4); /* charte-ok: un titre d’article vaut un niveau 3 */
  margin: var(--e-10) 0 var(--e-6);
  color: var(--ink);
}
.cp-content h3 {
  font-family: var(--font-accent);
  margin-inline: 0;
  color: var(--copper);
}
.cp-content p {
  margin: 0 0 var(--e-7);
}
.cp-content a {
  color: var(--copper);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.cp-content img {
  margin: var(--e-8) 0;
}
.cp-content blockquote {
  border-left: 2px solid var(--copper);
  margin: var(--e-8) 0;
  padding: var(--e-3) 0 var(--e-3) var(--e-8);
  font-family: var(--font-accent);
  font-size: var(--fs-7);
  color: var(--ink);
}
.cp-post {
  padding: var(--e-10) 0;
  border-bottom: 1px solid var(--copper-dim);
}
.cp-post .h3 a {
  color: var(--ink);
  transition: 0.3s;
}
.cp-post .h3 a:hover {
  color: var(--copper);
}
.cp-pagination {
  margin-top: var(--e-11);
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: var(--ls-2);
  font-size: var(--fs-3);
}
.cp-pagination a,
.cp-pagination .current {
  padding: var(--e-4) var(--e-5);
  color: var(--ink);
}
.cp-pagination .current {
  color: var(--copper);
  border-bottom: 1px solid var(--copper);
}

/* ============================================================
   § 11 — BARRE UTILITAIRE AU-DESSUS DU MENU
   ============================================================ */
.topbar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 60;
  background: #0a0908;
  border-bottom: 1px solid rgba(183, 154, 114, 0.16);
}
.admin-bar .topbar {
  top: 32px;
}
@media screen and (max-width: 782px) {
  .admin-bar .topbar {
    top: 46px;
  }
}
.topbar-inner {
  display: flex;
  align-items: center;
  gap: var(--e-7);
  height: 40px;
  padding: 0 var(--ef-3);
}
.tb-lead {
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: var(--ls-5);
  font-size: var(--fs-1);
  color: rgba(255, 255, 255, 0.34);
  font-weight: 600;
}
.tb-links {
  display: flex;
  gap: var(--e-8);
  margin-left: auto;
  list-style: none;
  padding: 0;
}
.tb-links li {
  list-style: none;
  margin: 0;
}
.tb-links a {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  /* Un cran sous le menu principal : la barre utilitaire est un second
     niveau, elle ne doit pas peser autant. L'interlettrage suit celui du
     menu — à 0,14 em, Barlow Semi Condensed se disloque : cette police est
     déjà étroite, l'espacer la fait lire lettre à lettre. */
  font-size: var(--fs-3);
  color: rgba(255, 255, 255, 0.6);
  padding: var(--e-5) 0;
  position: relative;
  transition: 0.3s;
}
.tb-links a:hover,
.tb-links .current-menu-item > a {
  color: var(--copper-lt);
}

/* Le menu principal descend sous la barre */
.nav {
  top: 40px;
}
.admin-bar .nav {
  top: 72px;
} /* 32 (admin) + 40 (topbar) */
@media (max-width: 782px) {
  .admin-bar .nav {
    top: 86px;
  }
}

/* Sur mobile : barre masquée, menu principal en haut */
@media (max-width: 900px) {
  .topbar {
    display: none;
  }
  .nav {
    top: 0;
  }
  .admin-bar .nav {
    top: 46px;
  }
}

/* ============================================================
   § 12 — BANDE DE RÉSERVATION PLEINE LARGEUR
   Reprend le design system : nuit + cuivre, Cinzel/Cormorant/Barlow
   ============================================================ */
.btn.solid {
  background: var(--copper-lt);
  border-color: var(--copper-lt);
  color: var(--night);
}
.btn.solid::before {
  background: #fff;
}
.btn.solid:hover {
  color: var(--night);
}

.book {
  background: var(--night);
  color: #fff;
  overflow: hidden;
  padding: var(--ef-4) var(--ef-3);
}
.book .bg {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      70% 150% at 12% 0%,
      rgba(133, 104, 74, 0.2),
      transparent 60%
    ),
    radial-gradient(
      60% 130% at 100% 100%,
      rgba(133, 104, 74, 0.12),
      transparent 60%
    );
}
.book .container {
  position: relative;
  max-width: 1360px;
}
.book .book-head {
  display: flex;
  flex-direction: column;
  gap: var(--e-5);
  margin-bottom: var(--e-9);
  max-width: 56ch;
}
.book .book-head .eyebrow {
  color: var(--copper-lt);
}
.book .book-head .h2 {
  color: #fff;
  font-size: var(--fs-h4); /* charte-ok: idem, contraint par la hauteur du bloc */
  margin: 0;
}
.book .book-head .note {
  font-family: var(--font-accent);
  font-weight: 300;
  font-size: var(--fs-sub);
  line-height: var(--lh-3);
  color: rgba(255, 255, 255, 0.72);
}

/* Formulaire : occupe 100% de la largeur, une seule barre horizontale */
.book form {
  display: grid;
  grid-template-columns: repeat(3, 1fr) minmax(200px, auto);
  gap: var(--e-6);
  width: 100%;
  align-items: end;
}
.book .field {
  display: flex;
  flex-direction: column;
  gap: var(--e-4);
  min-width: 0;
}
.book .field label {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-1);
  color: rgba(255, 255, 255, 0.55);
}
.book .field select {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  background: rgba(255, 255, 255, 0.02);
  color: #fff;
  border: 1px solid rgba(183, 154, 114, 0.42);
  border-radius: 0;
  padding: var(--e-6) var(--e-10) var(--e-6) var(--e-6);
  font-family: var(--font-body);
  font-size: var(--fs-4);
  letter-spacing: var(--ls-0);
  cursor: pointer;
  transition:
    border-color 0.35s var(--ease),
    background 0.35s var(--ease);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%23B79A72' stroke-width='1.4'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 16px center;
}
.book .field select:hover {
  border-color: var(--copper-lt);
}
.book .field select:focus {
  outline: none;
  border-color: var(--copper-lt);
  background: rgba(255, 255, 255, 0.045);
}
.book .field select option {
  color: #141210;
}
.book .submit .btn {
  width: 100%;
  justify-content: center;
  min-height: 54px;
}

@media (max-width: 900px) {
  .book form {
    grid-template-columns: 1fr 1fr;
    gap: var(--e-6);
  }
  .book .submit {
    grid-column: 1 / -1;
  }
}
@media (max-width: 560px) {
  .book form {
    grid-template-columns: 1fr;
  }
}

/* ============================================================
   § 13 — ACCUEIL GRAND PUBLIC
   (réutilise les tokens du design system)
   ============================================================ */

/* Hero vidéo */
.hero-video {
  background: var(--night);
  justify-content: flex-start; /* colle le bloc à gauche */
  align-items: flex-end; /* … et en bas */
  text-align: left;
  padding-bottom: var(--ef-4);
}
.hero-video .bgvid {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}
.hero-video .scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    linear-gradient(
      rgba(10, 9, 8, 0.42),
      rgba(10, 9, 8, 0.66) 58%,
      rgba(10, 9, 8, 0.84)
    ),
    radial-gradient(
      70% 60% at 50% 26%,
      rgba(133, 104, 74, 0.14),
      transparent 62%
    );
}
.hero-video .inner {
  z-index: 2;
  max-width: 852px;
  align-items: flex-start;
  text-align: left;
  margin: 0;
  width: 100%;
}

.hero-video .lead {
  text-align: left;
  margin-left: 0;
  margin-right: 0;
  max-width: none;
}

/* Réservation posée sur la vidéo */
.hero .book-bar {
  width: 100%;
  margin-top: var(--e-10);
  background: rgba(10, 9, 8, 0.4);
  backdrop-filter: blur(9px);
  -webkit-backdrop-filter: blur(9px);
  border: 1px solid rgba(183, 154, 114, 0.34);
  padding: var(--e-7) var(--ef-1);
}
.hero .book-bar form {
  display: grid;
  grid-template-columns: 1fr 1fr auto;
  gap: var(--e-5);
  align-items: end;
  text-align: left;
}
.hero .book-bar .field {
  display: flex;
  flex-direction: column;
  gap: var(--e-4);
  min-width: 0;
}
.hero .book-bar .field label {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-1);
  color: rgba(255, 255, 255, 0.62);
}
.hero .book-bar .field select {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  background: rgba(10, 9, 8, 0.34);
  color: #fff;
  border: 1px solid rgba(183, 154, 114, 0.42);
  border-radius: 0;
  padding: var(--e-5) var(--e-10) var(--e-5) var(--e-6);
  font-family: var(--font-body);
  font-size: var(--fs-4);
  letter-spacing: var(--ls-0);
  cursor: pointer;
  transition:
    border-color 0.35s var(--ease),
    background 0.35s var(--ease);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%23B79A72' stroke-width='1.4'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 15px center;
}
.hero .book-bar .field select:hover,
.hero .book-bar .field select:focus {
  border-color: var(--copper-lt);
  outline: none;
  background-color: rgba(10, 9, 8, 0.5);
}
.hero .book-bar .field select option {
  color: #141210;
}
.hero .book-bar .submit .btn {
  width: 100%;
  justify-content: center;
  min-height: 52px;
}
@media (max-width: 900px) {
  .hero .book-bar form {
    grid-template-columns: 1fr 1fr;
    gap: var(--e-5);
  }
  .hero .book-bar .submit {
    grid-column: 1 / -1;
  }
}
@media (max-width: 560px) {
  .hero .book-bar form {
    grid-template-columns: 1fr;
  }
}

/* Présentation : sous-titre h3 sous le h2 */

/* Offres grand public (façon zoobeauval) */
.offers .grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ef-2);
  margin-top: var(--e-11);
}
.ocard .media {
  aspect-ratio: 4/3;
  margin-bottom: var(--e-7);
}
.ocard .h3 {
  color: var(--ink);
}
@media (max-width: 900px) {
  .offers .grid {
    grid-template-columns: 1fr;
    gap: var(--e-9);
  }
  .ocard .media {
    aspect-ratio: 16/10;
  }
}

/* Galerie photos (fond sombre) */
.gallery.grandeur {
  color: #fff;
}
.gallery .gg {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ef-1);
  margin-top: var(--e-11);
}
.gallery .ph {
  aspect-ratio: 3/4;
}
@media (max-width: 900px) {
  .gallery .gg {
    grid-template-columns: 1fr 1fr;
    gap: var(--e-5);
  }
}
@media (max-width: 560px) {
  .gallery .gg {
    grid-template-columns: 1fr;
  }
}

/* Avis */
.avis .grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ef-2);
  margin-top: var(--e-11);
}
.acard {
  margin: 0;
  padding: var(--e-9) var(--e-9);
  border: 1px solid var(--copper-dim);
  background: var(--white);
  display: flex;
  flex-direction: column;
  gap: var(--e-6);
}
.acard .stars {
  color: var(--copper);
  /* En pixels, hors échelle : il ne s'agit pas d'espacer du texte mais des
     étoiles, dont l'écart ne doit pas suivre le corps de la police. */
  letter-spacing: 3px; /* charte-ok: espace des étoiles, pas du texte */
  font-size: var(--fs-4);
}
.acard .q {
  font-family: var(--font-accent);
  font-weight: 400;
  font-size: var(--fs-7);
  line-height: var(--lh-3);
  color: var(--ink);
}
.acard footer {
  margin-top: auto;
  display: flex;
  flex-direction: column;
  gap: var(--e-1);
}
.acard footer b {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-2);
  font-size: var(--fs-2);
  color: var(--ink);
}
.acard footer span {
  font-family: var(--font-body);
  font-size: var(--fs-3);
  color: var(--copper);
}
@media (max-width: 900px) {
  .avis .grid {
    grid-template-columns: 1fr;
    gap: var(--e-7);
  }
}

/* Lieu : chiffres sur fond clair */
.stats {
  display: flex;
  gap: var(--ef-3);
  margin: var(--e-8) 0 var(--e-9);
  flex-wrap: wrap;
}
.stat b {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  color: var(--copper);
  font-size: var(--fs-h4);
  line-height: var(--lh-0);
  letter-spacing: var(--ls-0);
}
.stat span {
  display: block;
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-1);
  color: var(--ink-soft);
  margin-top: var(--e-4);
}

/* Actualités */
.news .grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ef-2);
  margin-top: var(--e-11);
}
.ncard {
  display: flex;
  flex-direction: column;
}
.ncard .media {
  aspect-ratio: 16/10;
  margin-bottom: var(--e-7);
  display: block;
  overflow: hidden;
}
.ncard .media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.ncard .date {
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-1);
  color: var(--copper);
  margin-bottom: var(--e-4);
}
.ncard .h3 a {
  color: var(--ink);
  transition: 0.3s;
}
.ncard .h3 a:hover {
  color: var(--copper);
}
@media (max-width: 900px) {
  .news .grid {
    grid-template-columns: 1fr;
    gap: var(--e-9);
  }
}

/* ============================================================
   § 13b — Ajustements : affiche, menu réduit, débordement mobile
   ============================================================ */
/* Affiche du spectacle (présentation).
   L'affiche était une <img> nue avec un contour tracé sur son bord : elle
   n'avait donc pas le filet en retrait des autres médias du site. Elle est
   désormais enveloppée dans une <figure class="cp-framed">, qui fournit le
   cadre et le survol comme partout ailleurs. */
.split .poster-fig {
  position: relative;
  display: block;
  margin: 0;
  overflow: hidden;
  background: var(--night);
}
.split .poster {
  width: 100%;
  height: auto;
  display: block;
  transition: transform 0.6s var(--ease);
}
.split .poster-fig:hover .poster {
  transform: scale(1.025);
}
@media (prefers-reduced-motion: reduce) {
  .split .poster {
    transition: none;
  }
  .split .poster-fig:hover .poster {
    transform: none;
  }
}

/* Overflow masqué en mobile (pas de défilement horizontal) */
@media (max-width: 900px) {
  html,
  body {
    overflow-x: hidden;
    max-width: 100%;
  }
  .hero .book-bar {
    max-width: 100%;
  }
  .container,
  .sec {
    max-width: 100%;
  }
}

/* ============================================================
   § 14 — BOUTON DE RÉSERVATION PLEIN DORÉ
   ============================================================ */
.btn-reserve {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-3);
  line-height: var(--lh-0);
  color: var(--night);
  text-decoration: none;
  cursor: pointer;
  border: 0;
  border-radius: 0;
  padding: var(--e-6) var(--e-9);
  background: var(--copper-lt);
  transition:
    background 0.4s var(--ease),
    transform 0.35s var(--ease),
    box-shadow 0.4s var(--ease);
}
.btn-reserve:hover {
  background: #cbb083;
  transform: translateY(-1px);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22);
}
.btn-reserve:active {
  transform: translateY(0);
}
.btn-reserve:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 3px;
}
/* Dans la barre de réservation : pleine largeur, hauteur alignée sur les champs */
.hero .book-bar .submit .btn-reserve {
  width: 100%;
  min-height: 50px;
  padding: 0 var(--e-8);
}
.book .submit .btn-reserve {
  width: 100%;
  min-height: 54px;
  padding: 0 var(--e-8);
}
@media (max-width: 900px) {
  .hero .book-bar .submit .btn-reserve {
    min-height: 52px;
  }
}

/* Photos de sections uploadées (Customizer) */
.gallery .gg img.ph {
  width: 100%;
  aspect-ratio: 3/4;
  object-fit: cover;
  display: block;
  border: 1px solid rgba(183, 154, 114, 0.18);
}
.ocard img.media {
  width: 100%;
  aspect-ratio: 4/3;
  object-fit: cover;
  display: block;
  margin-bottom: var(--e-7);
  border: 1px solid rgba(183, 154, 114, 0.18);
}
.split img.media {
  width: 100%;
  aspect-ratio: 4/5;
  object-fit: cover;
  display: block;
  border: 1px solid rgba(183, 154, 114, 0.22);
  background: var(--night);
}
@media (max-width: 900px) {
  .ocard img.media {
    aspect-ratio: 16/10;
  }
}

/* ============================================================
   § 15 — TOILE GUTENBERG
   ============================================================ */
.cp-canvas {
  padding-top: var(--ef-6);
  padding-bottom: var(--ef-5);
}
.cp-canvas > * {
  max-width: var(--wp--style--global--content-size, 760px);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--ef-3);
  padding-right: var(--ef-3);
}
.cp-canvas > .alignwide {
  max-width: var(--wp--style--global--wide-size, 1240px);
}
.cp-canvas > .alignfull {
  max-width: none;
  padding-left: 0;
  padding-right: 0;
}
.cp-canvas > * + * {
  margin-top: var(--ef-2);
}
/* Confort de lecture des blocs texte */
.cp-canvas p {
  font-size: var(--fs-5);
  line-height: var(--lh-5);
  color: var(--ink-soft);
}
.cp-canvas .wp-block-button__link {
  padding: var(--e-6) var(--e-9);
}

/* ============================================================
   § 16 — CHAMP DATE ET CALENDRIER
   ============================================================ */
.field-date {
  position: relative;
}
.cp-datefield {
  appearance: none;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-5);
  background: rgba(10, 9, 8, 0.34);
  color: #fff;
  border: 1px solid rgba(183, 154, 114, 0.42);
  border-radius: 0;
  padding: var(--e-5) var(--e-6);
  font-family: var(--font-body);
  font-size: var(--fs-4);
  letter-spacing: var(--ls-0);
  cursor: pointer;
  text-align: left;
  transition:
    border-color 0.35s var(--ease),
    background 0.35s var(--ease);
}
.cp-datefield:hover,
.cp-datefield[aria-expanded="true"] {
  border-color: var(--copper-lt);
  background: rgba(10, 9, 8, 0.5);
}
.cp-datefield svg {
  color: var(--copper-lt);
  flex: none;
}
.cp-datefield [data-cp-datetext] {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cp-datefield:not(.has-value) [data-cp-datetext] {
  color: rgba(255, 255, 255, 0.6);
}
.hero .book-bar select:disabled {
  opacity: 0.55;
  cursor: default;
}

.cp-cal {
  position: absolute;
  left: 0;
  bottom: calc(100% + 10px);
  z-index: 60;
  width: 300px;
  max-width: 86vw;
  background: var(--paper);
  color: var(--ink);
  border: 1px solid rgba(183, 154, 114, 0.5);
  padding: var(--e-6) var(--e-6) var(--e-6);
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
  text-align: left;
}
.cp-cal[hidden] {
  display: none;
}
.cp-cal-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--e-5);
}
.cp-cal-title {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: capitalize;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-4);
  color: var(--ink);
}
.cp-cal-arrow {
  width: 30px;
  height: 30px;
  border: 1px solid rgba(133, 104, 74, 0.35);
  background: transparent;
  color: var(--copper);
  font-size: var(--fs-5);
  line-height: var(--lh-0);
  cursor: pointer;
  border-radius: 0;
  transition: 0.3s var(--ease);
}
.cp-cal-arrow:hover:not([disabled]) {
  background: var(--copper-lt);
  color: var(--night);
  border-color: var(--copper-lt);
}
.cp-cal-arrow[disabled] {
  opacity: 0.3;
  cursor: default;
}
.cp-cal-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: var(--e-1);
}
.cp-cal-dow {
  text-align: center;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-1);
  color: var(--copper);
  padding: var(--e-2) 0 var(--e-4);
}
.cp-day {
  aspect-ratio: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-body);
  font-size: var(--fs-3);
  border: 0;
  background: transparent;
  color: #c3bcae;
  border-radius: 0;
  padding: 0;
}
.cp-day.is-empty {
  visibility: hidden;
}
.cp-day.is-off {
  color: #cfc9bd;
}
.cp-day.is-open {
  color: var(--ink);
  cursor: pointer;
  position: relative;
}
.cp-day.is-open:hover {
  background: #efe9de;
}
.cp-day.is-open::after {
  content: "";
  position: absolute;
  bottom: 5px;
  left: 50%;
  transform: translateX(-50%);
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--copper);
}
.cp-day.is-selected {
  background: var(--copper-lt);
  color: var(--night);
}
.cp-day.is-selected::after {
  display: none;
}
@media (max-width: 560px) {
  .cp-cal {
    left: 50%;
    transform: translateX(-50%);
  }
}

/* ============================================================
   § 17 — HERO 85VH, CONTENU ALIGNÉ À GAUCHE
   ============================================================ */
.hero-video {
  min-height: 95vh;
}
.hero-video .scrollcue {
  display: none;
}

/* Bouton FAQ au-dessus de la réservation */
.cp-faq {
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
  align-self: center;
  margin: var(--e-8) 0 0;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  color: #fff;
  text-decoration: none;
  transition: 0.3s var(--ease);
  align-self: flex-start;
}
.cp-faq:hover {
  color: var(--copper-lt);
}
.cp-faq-q {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1px solid rgba(183, 154, 114, 0.6);
  color: var(--copper-lt);
  font-size: var(--fs-3);
  font-weight: 600;
  line-height: var(--lh-0);
}
.cp-faq:hover .cp-faq-q {
  background: var(--copper-lt);
  color: var(--night);
  border-color: var(--copper-lt);
}

/* Champs + bouton de réservation : même hauteur, épuré */
.hero .book-bar .field select {
  height: 48px;
  padding-top: 0;
  padding-bottom: 0;
}
.hero .book-bar .cp-datefield {
  height: 48px;
  padding-top: 0;
  padding-bottom: 0;
}
.hero .book-bar .submit .btn-reserve {
  height: 48px;
  min-height: 0;
  padding: 0 var(--e-8);
  font-size: var(--fs-2);
  letter-spacing: var(--ls-3);
}

/* Offres façon Arlette Gruss : rangée de 5 cartes sous le hero */
.offers .grid.offers-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ef-1);
  margin-top: var(--e-11);
}
.offers .grid.offers-grid .ocard .media {
  aspect-ratio: 3/4;
  margin-bottom: var(--e-6);
}
.offers .grid.offers-grid .ocard .body {
  font-size: var(--fs-3);
  line-height: var(--lh-4);
}
@media (max-width: 1100px) {
  .offers .grid.offers-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}
@media (max-width: 760px) {
  .offers .grid.offers-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
@media (max-width: 480px) {
  .offers .grid.offers-grid {
    grid-template-columns: 1fr;
  }
}

/* ============================================================
   § 18 — AJUSTEMENTS DE SECTIONS
   ============================================================ */

/* FAQ collée aux champs : on réduit l'écart au-dessus de la barre */
.hero .book-bar {
  margin-top: var(--e-5);
}

/* Couleurs par section (design system) : blanc cassé (défaut) · beige clair · foncé (grandeur/final) */
.sec.beige {
  background: var(--beige);
}

/* Section Ensemble (groupes) : 3 encarts */
.ensemble-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ef-2);
  margin-top: var(--e-11);
}
.ensemble-grid .ocard .media {
  aspect-ratio: 4/3;
  margin-bottom: var(--e-7);
}
.ensemble-grid .ocard .h3 {
  color: var(--ink);
}
@media (max-width: 860px) {
  .ensemble-grid {
    grid-template-columns: 1fr;
    gap: var(--e-8);
  }
}
/* Hero grand public : contenu collé en bas à gauche */
.hero.hero-video {
  display: flex;
  align-items: flex-end; /* colle le contenu en bas */
  justify-content: flex-start; /* … à gauche */
  text-align: left;
  padding-top: var(--ef-5); /* dégage le haut, sous le menu */
  padding-bottom: var(--ef-4); /* petit espace en bas */
}
.hero.hero-video .inner {
  margin: 0; /* annule le centrage automatique */
  width: 100%;
  align-items: flex-start;
  text-align: left;
}

/* Page Réservation (modèle « Réservation — séances + billetterie ») */
.cp-resa {
  padding-top: var(--ef-6);
  padding-bottom: var(--ef-5);
}
.cp-resa .resa-intro {
  max-width: 680px;
  margin: var(--e-8) auto 0;
  text-align: center;
}

/* Ancres : décalage sous le menu fixe */
:target {
  scroll-margin-top: 120px;
}

/* ===== Contenu aligné à gauche sur tout le site =====
   Une seule exception, déclarée explicitement plus bas : #experience. */
.center,
.sec-head.center,
.container.center,
.grandeur .center,
.grandeur .sec-head {
  align-items: flex-start;
  text-align: left;
}
.center .tag,
.sec .center .tag {
  margin-left: 0;
  margin-right: 0;
}

/* Sections pleine largeur : elles se touchent, plus de bande de fond entre elles */
.cp-canvas > .alignfull {
  margin-top: 0;
  margin-bottom: 0;
}
/* Le contenu pleine largeur commence sous le menu, sans bande blanche */
.cp-canvas {
  padding-top: 0;
}
.cp-canvas > .alignfull {
  margin-top: 0;
  margin-bottom: 0;
}

.cp-canvas {
  padding-top: 0;
  padding-bottom: 0;
}
.cp-canvas > .alignfull {
  margin-top: 0;
  margin-bottom: 0;
}

.topbar .tb-lead {
  display: none;
}

@media (max-width: 900px) {
  /* Le hero s'adapte à son contenu sur mobile : plus rien n'est coupé */
  .hero.hero-video {
    min-height: auto;
  }
  /* Le bloc de réservation s'empile proprement */
  .hero .book-bar {
    display: block;
    width: 100%;
    max-width: 100%;
  }
  .hero .book-bar form {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--e-5);
  }
  .hero .book-bar .submit {
    grid-column: 1 / -1;
  }
  .hero .book-bar .submit .btn-reserve {
    width: 100%;
  }
}

/* Galerie en mosaïque : 1 grande + 4 petites */
.gallery .gg {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
  grid-template-rows: 1fr 1fr;
  gap: var(--e-4);
  height: clamp(380px, 52vw, 640px);
}
.gallery .gg > * {
  width: 100%;
  height: 100%;
  aspect-ratio: auto;
  min-height: 0;
}
.gallery .gg > :first-child {
  grid-row: 1 / span 2;
}
.gallery .gg .ph-fig .ph.plate {
  height: 100%;
} /* la grande occupe les 2 rangées à gauche */
.gallery .gg img.ph,
.gallery .gg .ph {
  object-fit: cover;
}

/* ---- Légendes des photos ----
   Incrustées en bas de chaque vignette : la mosaïque impose des cellules
   de hauteur fixe, une légende posée dessous les ferait déborder.
   Le voile dégradé garantit la lisibilité quelle que soit la photo. */
.gallery .gg .ph-fig {
  position: relative;
  margin: 0;
  overflow: hidden;
}
.gallery .gg .ph-fig .ph {
  width: 100%;
  height: 100%;
  display: block;
}
.gallery .gg-cap {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: var(--e-9) var(--e-6) var(--e-5);
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  color: #fff;
  background: linear-gradient(
    to top,
    rgba(13, 12, 11, 0.78),
    rgba(13, 12, 11, 0) 100%
  );
  pointer-events: none;
}
@media (max-width: 560px) {
  .gallery .gg-cap {
    font-size: var(--fs-1);
    letter-spacing: var(--ls-3);
    padding: var(--e-8) var(--e-5) var(--e-5);
  }
}

/* Sur mobile : la grande passe en haut, les petites en 2 colonnes */
@media (max-width: 700px) {
  .gallery .gg {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto;
    height: auto;
  }
  .gallery .gg > * {
    aspect-ratio: 1;
    height: auto;
  }
  .gallery .gg > :first-child {
    grid-column: 1 / -1;
    grid-row: auto;
    aspect-ratio: 16/10;
  }
}

.gallery.grandeur .sec-head .h2,
.gallery.grandeur .sec-head .eyebrow {
  color: #fff;
}
.gallery.grandeur .sec-head .eyebrow {
  color: var(--copper-lt);
}

/* Pré-footer global, centré, sur toutes les pages */
.cp-prefooter .cp-prefooter-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}
.cp-prefooter .rule {
  background: var(--copper-lt);
}
.cp-prefooter .h2 {
  margin-inline: 0;
}
.cp-prefooter .cp-prefooter-sub {
  max-width: 60ch;
  margin: 0 auto var(--e-9);
  color: rgba(233, 226, 214, 0.7);
  font-family: var(--font-body);
}
.cp-prefooter .btn-reserve {
  align-self: center;
}

/* Barre partenaires / presse (logos couleur, même hauteur) */
.cp-partners {
  background: #fcfbf9;
  padding: var(--ef-3) 0;
}
.cp-partners-label {
  text-align: center;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-5);
  font-size: var(--fs-2);
  color: var(--copper);
  margin-bottom: var(--e-8);
}
.cp-partners-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--ef-3);
}
.cp-partners-row a {
  display: inline-flex;
  align-items: center;
}
.cp-partners-row img {
  height: 36px;
  width: auto;
  max-width: 150px;
  object-fit: contain;
  opacity: 0.92;
  transition: opacity 0.3s ease;
}
.cp-partners-row a:hover img {
  opacity: 1;
}
@media (max-width: 600px) {
  .cp-partners-row {
    gap: var(--e-7);
  }
  .cp-partners-row img {
    height: 26px;
  }
}

/* Bandeau newsletter */
.cp-news-signup {
  background: var(--paper);
  color: var(--ink);
  padding: var(--ef-4) 0;
}
.cp-news-inner {
  max-width: 760px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: var(--ef-2);
  align-items: center;
  text-align: center;
}
.cp-news-form {
  width: 100%;
}
.cp-news-text {
  text-align: center;
}
.cp-news-signup .eyebrow {
  color: var(--copper);
}
.cp-news-signup .h2 {
  color: var(--ink);
  margin-inline: 0;
}
.cp-news-sub {
  color: var(--ink-soft);
  margin-bottom: 0;
}

/* ==== § 19 — EFFET DE SURVOL UNIFIÉ DES BOUTONS ==== */
.btn-reserve,
.wp-block-button__link {
  position: relative;
  overflow: hidden;
  isolation: isolate; /* le bouton crée son propre plan : le remplissage ne peut plus glisser dessous */
  background: transparent;
  border: 1px solid var(--copper);
  color: var(--copper);
  border-radius: 0;
  transition: color 0.5s var(--ease);
  /* légitimes : neutralisent les styles injectés par WordPress sur core/button */
  box-shadow: none !important;
  transform: none !important;
}
.btn-reserve::before,
.wp-block-button__link::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--copper);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.5s var(--ease);
  /* -1 place le remplissage derrière le texte. C'est sans risque grâce à
     isolation:isolate plus haut : il ne peut pas glisser sous la section. */
  z-index: -1;
}
.btn-reserve:hover,
.wp-block-button__link:hover {
  color: #fff;
  background: transparent;
}
.btn-reserve:hover::before,
.wp-block-button__link:hover::before {
  transform: scaleX(1);
}
.btn-reserve > * {
  position: relative;
  z-index: 1;
}

/* Sur fond nuit, le bouton reprend le cuivre clair : le cuivre foncé
   descendrait sous le seuil de contraste. */
.grandeur .btn-reserve,
.final .btn-reserve,
.cp-prefooter .btn-reserve {
  border-color: rgba(183, 154, 114, 0.55);
  color: var(--copper-lt);
}
.grandeur .btn-reserve::before,
.final .btn-reserve::before,
.cp-prefooter .btn-reserve::before {
  background: var(--copper-lt);
}
.grandeur .btn-reserve:hover,
.final .btn-reserve:hover,
.cp-prefooter .btn-reserve:hover {
  color: var(--night);
  border-color: var(--copper-lt);
}

/* Les boutons Gutenberg n'avaient pas cette variante : posés sur une section
   sombre, ils gardaient un texte blanc sur cuivre foncé au survol, à la
   limite du lisible. Ils suivent désormais la même règle que les boutons du
   thème. La classe .has-night-background-color couvre les sections composées
   en blocs, qui n'ont ni .grandeur ni .final. */
.grandeur .wp-block-button__link,
.final .wp-block-button__link,
.has-night-background-color .wp-block-button__link {
  border-color: rgba(183, 154, 114, 0.55);
  color: var(--copper-lt);
}
.grandeur .wp-block-button__link::before,
.final .wp-block-button__link::before,
.has-night-background-color .wp-block-button__link::before {
  background: var(--copper-lt);
}
.grandeur .wp-block-button__link:hover,
.final .wp-block-button__link:hover,
.has-night-background-color .wp-block-button__link:hover {
  color: var(--night);
  border-color: var(--copper-lt);
}

/* Section « Prêt à vivre l'expérience » : contenu recentré */
#experience .center {
  align-items: center;
  text-align: center;
}

/* Carte actu entièrement cliquable */
.news .ncard {
  position: relative;
}
.news .ncard .cp-card-link::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
}
.news .ncard:hover .h3 {
  color: var(--copper);
}
.news .ncard .ncard-cta {
  margin-top: var(--e-5);
  color: var(--copper);
}

/* ===== Article seul (single.php) ===== */
.cp-single {
  padding-top: var(--ef-6);
  padding-bottom: var(--ef-5);
}
.cp-single .container {
  max-width: 1260px;
}
.cp-single-head {
  margin-bottom: var(--e-8);
}
.cp-single-head .eyebrow {
  color: var(--copper);
}
.cp-single-media {
  max-width: 1040px;
  margin: 0 auto var(--e-10);
  padding: 0 var(--ef-3);
}
.cp-single-media img {
  width: 100%;
  height: auto;
  display: block;
}
.cp-single-content > * {
  margin-bottom: 1.1em;
}
.cp-single-content p,
.cp-single-content li {
  /* 16 px comme le reste du site. Le pas de 18 ne servait que deux fois, et
     deux pixels d'écart ne se lisent pas comme une intention : ils se lisent
     comme un oubli. Le confort de lecture d'un article vient de l'interlignage
     et de la largeur de colonne, pas de deux pixels de corps. */
  font-size: var(--fs-5);
  line-height: var(--lh-5);
  color: var(--ink-soft);
}
.cp-single-content ul {
  padding-left: 1.2em;
}
.cp-single-foot {
  margin-top: var(--e-10);
}

/* ==== § 20 — BARRE DE RÉSERVATION FIXE ==== */
.cp-stickybar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 60;
  background: rgba(13, 12, 11, 0.92);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  border-top: 1px solid rgba(183, 154, 114, 0.45);
  transform: translateY(100%);
  transition: transform 0.45s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.cp-stickybar.on {
  transform: translateY(0);
}
.cp-stickybar-inner {
  max-width: 1240px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-6);
  padding: var(--e-5) var(--ef-2);
}
.cp-stickybar .btn-reserve {
  flex-shrink: 0;
}
@media (max-width: 560px) {
  .cp-stickybar-inner {
    padding: var(--e-4) var(--e-6);
  }
}
.cp-stickyform {
  display: flex;
  align-items: flex-end;
  gap: var(--e-5);
  flex-wrap: wrap;
}
.cp-stickyform .sb-field {
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
  min-width: 200px;
}
.cp-stickyform .sb-label {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-5);
  font-size: var(--fs-1);
  color: #e9e2d6;
}
.cp-stickyform select {
  appearance: none;
  -webkit-appearance: none;
  background: transparent
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' fill='none' stroke='%23B79A72' stroke-width='1.6'/></svg>")
    no-repeat right 14px center;
  border: 1px solid rgba(183, 154, 114, 0.55);
  border-radius: 0;
  color: #fff;
  font-family: var(--font-body);
  font-size: var(--fs-4);
  padding: var(--e-5) var(--e-10) var(--e-5) var(--e-5);
  cursor: pointer;
}
.cp-stickyform select:focus {
  outline: none;
  border-color: #e6cf97;
}
.cp-stickyform select option {
  background: #141210;
  color: #fff;
}
.cp-stickyform select:disabled {
  opacity: 0.5;
  cursor: default;
}
@media (max-width: 900px) {
  .cp-stickybar-inner {
    flex-wrap: wrap;
  }
  .cp-stickyform {
    width: 100%;
  }
  .cp-stickyform .sb-field {
    flex: 1;
    min-width: 140px;
  }
  .cp-stickyform .btn-reserve {
    width: 100%;
    text-align: center;
    justify-content: center;
  }
}

/* Barre fixe façon Cirque du Soleil : titre + badge + champs pleine largeur */
.cp-stickybar-inner {
  flex-direction: column;
  align-items: stretch;
  gap: var(--e-5);
  padding: var(--e-5) var(--ef-2) var(--e-6);
}
.cp-stickybar-head {
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
}
.sb-title {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-7);
  color: var(--copper-lt);
  line-height: var(--lh-1);
}
.sb-meta {
  display: flex;
  align-items: center;
  gap: var(--e-5);
}
.sb-badge {
  display: inline-block;
  background: #e6cf97;
  color: #0d0c0b;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-2);
  padding: var(--e-1) var(--e-5);
  border-radius: 0px;
}
.sb-place {
  font-family: var(--font-body);
  font-size: var(--fs-3);
  color: rgba(233, 226, 214, 0.75);
}
.cp-stickyform {
  display: flex;
  align-items: flex-end;
  gap: var(--e-5);
  width: 100%;
}
.cp-stickyform .sb-field {
  flex: 1;
  min-width: 0;
}
.cp-stickyform .btn-reserve {
  flex: 0 0 auto;
}
/* Champ date (bouton) */
.sb-datewrap {
  position: relative;
}
.sb-datebtn {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-4);
  background: transparent;
  border: 1px solid rgba(183, 154, 114, 0.55);
  border-radius: 0;
  color: rgba(233, 226, 214, 0.85);
  font-family: var(--font-body);
  font-size: var(--fs-4);
  padding: var(--e-5) var(--e-5);
  cursor: pointer;
  text-align: left;
}
.sb-datebtn:focus {
  outline: none;
  border-color: #e6cf97;
}
.sb-datebtn.has-value #cp-sb-datetxt {
  color: #fff;
}
/* Calendrier (s'ouvre vers le haut) */
.sb-cal {
  position: absolute;
  bottom: calc(100% + 10px);
  left: 0;
  z-index: 70;
  background: #141210;
  border: 1px solid rgba(183, 154, 114, 0.55);
  padding: var(--e-5);
  min-width: 300px;
  box-shadow: 0 -8px 26px rgba(0, 0, 0, 0.28);
}
.sb-cal-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--e-4);
}
.sb-cal-head span {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  color: #e9e2d6;
}
.sb-cal-head button {
  background: transparent;
  border: 1px solid rgba(183, 154, 114, 0.45);
  border-radius: 0;
  color: #b79a72;
  font-size: var(--fs-5);
  line-height: var(--lh-0);
  padding: var(--e-2) var(--e-4);
  cursor: pointer;
}
.sb-cal-head button:hover {
  background: rgba(183, 154, 114, 0.12);
}
.sb-cal-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: var(--e-2);
}
.sb-cal-grid .dow {
  font-family: var(--font-body);
  font-size: var(--fs-1);
  text-transform: uppercase;
  letter-spacing: var(--ls-2);
  color: rgba(233, 226, 214, 0.5);
  text-align: center;
  padding: var(--e-2) 0;
}
.sb-cal-grid button {
  background: transparent;
  border: 0;
  border-radius: 0;
  color: #e9e2d6;
  font-family: var(--font-body);
  font-size: var(--fs-3);
  padding: var(--e-4) 0;
  cursor: pointer;
}
.sb-cal-grid button:disabled {
  color: rgba(233, 226, 214, 0.22);
  cursor: default;
}
.sb-cal-grid button:not(:disabled):hover {
  background: rgba(183, 154, 114, 0.18);
}
.sb-cal-grid button.sel {
  background: #b79a72;
  color: #0d0c0b;
  font-weight: 600;
}
@media (max-width: 760px) {
  .cp-stickyform {
    flex-wrap: wrap;
  }
  .cp-stickyform .sb-field {
    flex: 1 1 46%;
  }
  .cp-stickyform .btn-reserve {
    width: 100%;
    justify-content: center;
    text-align: center;
  }
  .sb-cal {
    left: 0;
    right: 0;
    min-width: 0;
  }
}

/* Barre fixe : sous-titre du spectacle + bouton à la même hauteur que les champs */
.sb-title .sb-sub {
  font-weight: 500;
  letter-spacing: var(--ls-1);
  /* Relatif au titre qui précède, et non à l'échelle : le sous-titre doit
     rester proportionné quel que soit le corps du titre. */
  font-size: 0.72em; /* charte-ok: relatif au titre qui précède, pas à l échelle */
  color: rgba(233, 226, 214, 0.75);
  text-transform: none;
}
.cp-stickyform .btn-reserve {
  height: 48px;
  display: inline-flex;
  align-items: center;
  padding: 0 var(--e-9);
}

/* Barre fixe : hauteur STRICTEMENT identique pour Date, Séance et le bouton */
.cp-stickyform {
  --sb-h: 56px;
}
.cp-stickyform .sb-datebtn,
.cp-stickyform select,
.cp-stickyform .btn-reserve {
  /* légitimes : alignent trois éléments de formulaire dont la hauteur native
     est imposée par le navigateur (select) — sans cela la barre se décale. */
  box-sizing: border-box;
  height: var(--sb-h) !important;
  padding-top: 0 !important;
  padding-bottom: 0 !important;
  display: inline-flex;
  align-items: center;
}
.cp-stickyform .sb-datebtn {
  width: 100%;
  justify-content: space-between;
}
.cp-stickyform select {
  width: 100%;
}
.cp-stickyform .btn-reserve {
  padding-left: var(--e-9);
  padding-right: var(--e-9);
}

/* Croix alignée sur le bord droit du contenu (au-dessus du bouton Réserver) */
.cp-stickybar-inner {
  position: relative;
}

/* « Masquer » : bouton explicite, aligné à droite du contenu */
.cp-stickybar .sb-min {
  position: absolute;
  top: 10px;
  right: clamp(18px, 4vw, 32px);
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: var(--e-3);
  background: transparent;
  border: 1px solid rgba(183, 154, 114, 0.45);
  border-radius: 0;
  color: var(--copper-lt);
  cursor: pointer;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-1);
  padding: var(--e-3) var(--e-5);
  transition:
    background 0.3s ease,
    color 0.3s ease;
}
.cp-stickybar .sb-min:hover {
  background: rgba(183, 154, 114, 0.14);
}
/* Bouton de réouverture (barre repliée) */
/* L'attribut hidden doit l'emporter : sans cette règle, position:fixed
   peut réafficher le bouton alors qu'il devrait rester masqué. */
.cp-sb-reopen[hidden] {
  display: none !important;
}
.cp-sb-reopen {
  position: fixed;
  bottom: 0;
  right: clamp(18px, 4vw, 32px);
  z-index: 59;
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
  background: #b79a72;
  border: 0;
  border-radius: 0;
  cursor: pointer;
  color: #0d0c0b;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  padding: var(--e-5) var(--e-7);
  /* Ombre discrète : elle doit détacher le bouton du contenu,
     pas assombrir le bas de la page. */
  box-shadow: 0 -4px 14px rgba(0, 0, 0, 0.14);
}
.cp-sb-reopen:hover {
  background: var(--copper);
}

/* Section Lieu : trait sous l'eyebrow + lien secondaire plus présent + rythme */
#chapiteau .rule {
  margin: var(--e-3) 0 var(--e-8);
  display: block;
}
#chapiteau .arrow {
  margin-top: var(--e-9);
  font-weight: 600;
  letter-spacing: var(--ls-4);
  color: var(--copper);
}
#chapiteau .arrow .ln {
  width: 34px;
  background: var(--copper);
}
#chapiteau .arrow:hover {
  color: var(--ink);
}
#chapiteau .arrow:hover .ln {
  width: 56px;
}

/* Section Lieu : cadre paysage (photo entière, sans recadrage) */
#chapiteau .split .media,
#chapiteau .split .cp-media-link .media {
  aspect-ratio: 3/2;
  height: auto;
  min-height: 0;
  width: 100%;
  object-fit: cover;
  display: block;
}

/* Section Lieu : image cliquable vers la visite 360° + overlay */
#chapiteau .cp-media-link {
  position: relative;
  display: block;
  overflow: hidden;
}
#chapiteau .cp-media-link .media {
  width: 100%;
  transition: transform 0.6s var(--ease);
}
#chapiteau .cp-media-link:hover .media {
  transform: scale(1.025);
}
#chapiteau .media-overlay {
  position: absolute;
  left: 50%;
  bottom: 22px;
  transform: translateX(-50%);
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
  white-space: nowrap;
  background: rgba(13, 12, 11, 0.86);
  border: 1px solid rgba(183, 154, 114, 0.6);
  color: #e9e2d6;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  padding: var(--e-5) var(--e-7);
  transition:
    background 0.35s ease,
    color 0.35s ease,
    border-color 0.35s ease;
}
#chapiteau .cp-media-link:hover .media-overlay {
  background: var(--copper-lt);
  border-color: var(--copper-lt);
  color: var(--night);
}
@media (max-width: 640px) {
  #chapiteau .media-overlay {
    font-size: var(--fs-1);
    padding: var(--e-4) var(--e-5);
    bottom: 14px;
  }
}

/* Section Lieu : le lien-image prend la place du média (image à droite) */
#chapiteau .split.rev > .cp-media-link {
  order: 2;
  width: 100%;
}
@media (max-width: 900px) {
  #chapiteau .split.rev > .cp-media-link {
    order: 0;
  }
}

/* ============================================================

#chapiteau .txt dl.stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  margin: var(--e-12) 0 0;
  padding: var(--e-9) 0;
  border-top: 1px solid var(--copper-hair);
  border-bottom: 1px solid var(--copper-hair);
}

#chapiteau .txt dl.stats dd {
  margin: 0;
}

#chapiteau .txt .stat {
  min-width: 0;
  padding-left: var(--ef-1);
  border-left: 1px solid var(--copper-hair);
}

#chapiteau .txt .stat:first-child {
  padding-left: 0;
  border-left: 0;
}

#chapiteau .txt .stat b {
  display: block;
  font-size: var(--fs-h4);
  line-height: var(--lh-0);
  white-space: nowrap;
}

#chapiteau .txt .stat span {
  display: block;
  font-size: var(--fs-nano);
  letter-spacing: var(--ls-2);
  margin-top: var(--e-4);
}

#chapiteau .txt .arrow {
  margin-top: var(--e-11);
}

#chapiteau .txt .h2 {
  line-height: var(--lh-1);
  max-width: 15ch;
  text-wrap: balance;
}

@media (max-width: 900px) {
  #chapiteau .txt .h2 {
    max-width: none;
  }
}

/* Filet cuivre en retrait sur la photo — le geste « Opéra de Paris ». */
#chapiteau .cp-media-link::after {
  content: "";
  position: absolute;
  inset: 10px;
  border: 1px solid rgba(252, 251, 249, 0.28);
  pointer-events: none;
}

/* ============================================================
   § 22 — ACCESSIBILITÉ
   Lien d'évitement et anneau de focus visible au clavier.
   ============================================================ */

.cp-skip {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 999;
  background: var(--night);
  color: var(--copper-lt);
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  padding: var(--e-5) var(--e-7);
  border: 1px solid var(--copper-lt);
  text-decoration: none;
}
.cp-skip:focus {
  left: 12px;
  top: 12px;
}

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--copper-lt);
  outline-offset: 3px;
}

.nav :where(a, button):focus-visible,
.topbar a:focus-visible,
.foot a:focus-visible,
.cp-stickybar :where(a, button, select):focus-visible {
  outline-color: var(--copper-lt);
}

/* ============================================================
   § 23 — FIL D'ARIANE
   ============================================================ */

.cp-breadcrumb {
  font-family: var(--font-body);
  font-size: var(--fs-3);
  letter-spacing: var(--ls-1);
  color: var(--ink-soft);
  margin: 0 0 var(--e-6);
}
.cp-breadcrumb a {
  color: var(--copper);
  text-decoration: none;
}
.cp-breadcrumb a:hover {
  text-decoration: underline;
}
.cp-breadcrumb .sep {
  margin: 0 var(--e-4);
  color: var(--copper-hair-strong);
}
.sec.dark .cp-breadcrumb,
.hero .cp-breadcrumb {
  color: rgba(233, 226, 214, 0.7);
}
.sec.dark .cp-breadcrumb a,
.hero .cp-breadcrumb a {
  color: var(--copper-lt);
}

/* ============================================================
   § 24 — CALENDRIER DE RÉSERVATION (template-reservation.php)
   Grille mensuelle en <table> (données réellement tabulaires :
   jours × jours de la semaine), repli en liste verticale sous 760 px.
   ============================================================ */

.cp-resa {
  padding: var(--ef-6) 0 var(--ef-6);
}
.cp-resa .resa-intro {
  max-width: 62ch;
  margin: var(--e-9) 0 0;
}
.cp-cal-legend {
  display: flex;
  flex-wrap: wrap;
  gap: var(--e-4) var(--e-8);
  font-family: var(--font-body);
  font-size: var(--fs-2);
  letter-spacing: var(--ls-2);
  text-transform: uppercase;
  color: var(--copper);
  margin: var(--e-11) 0 0;
}
.cp-cal-legend .is-full-key {
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
  color: var(--ink-soft);
}
.cp-cal-legend .is-full-key::before {
  content: "";
  width: 22px;
  height: 12px;
  border: 1px solid var(--copper-hair);
  background: repeating-linear-gradient(
    -45deg,
    transparent 0 3px,
    rgba(74, 68, 60, 0.16) 3px 5px
  );
}

/* ---- Navigation entre mois ----
   Sans JavaScript, les mois restent empilés et les flèches masquées :
   la page fonctionne dans tous les cas. */
.cp-calm {
  margin-top: var(--e-12);
}
.cp-calnav.is-js .cp-calm {
  margin-top: var(--e-11);
}
.cp-calm-arrows {
  display: none;
}
.cp-calnav.is-js .cp-calm-arrows {
  display: flex;
  align-items: center;
  gap: var(--e-3);
}
.cp-calm-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--e-7);
  flex-wrap: wrap;
  margin-bottom: var(--e-7);
}
.cp-calm-arrow {
  appearance: none;
  background: transparent;
  border: 1px solid var(--copper-hair-strong);
  border-radius: 0;
  color: var(--copper);
  font-family: var(--font-body);
  font-size: var(--fs-7);
  line-height: var(--lh-0);
  width: 42px;
  height: 42px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition:
    background 0.3s var(--ease),
    color 0.3s var(--ease),
    border-color 0.3s var(--ease);
}
.cp-calm-arrow:hover:not([disabled]) {
  background: var(--copper);
  border-color: var(--copper);
  color: var(--paper);
}
.cp-calm-arrow[disabled] {
  opacity: 0.3;
  cursor: default;
}
.cp-calm-count {
  font-family: var(--font-body);
  font-size: var(--fs-2);
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  color: var(--ink-soft);
  min-width: 62px;
  text-align: center;
}

/* ---- Titre de mois ---- */
.cp-calm-title {
  font-family: var(--font-display);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-h4);
  line-height: var(--lh-1);
  color: var(--ink);
  margin: 0;
}
.cp-calm-title span {
  color: var(--copper);
  font-weight: 400;
}

/* ---- Grille ---- */
.cp-calm-table {
  width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
}
.cp-calm-table th {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-1);
  color: var(--ink-soft);
  text-align: left;
  padding: 0 0 var(--e-5) var(--e-5);
}
.cp-calm-table th abbr {
  text-decoration: none;
  border: 0;
}
.cp-calm-table td {
  vertical-align: top;
  border: 1px solid var(--copper-hair);
  padding: var(--e-5) var(--e-5) var(--e-5);
  height: 128px;
}
.cp-calm-table td.is-void {
  border-color: transparent;
  background: none;
}
.cp-calm-table td.is-empty {
  background: rgba(133, 104, 74, 0.03);
}
.cp-calm-table td.is-empty .d {
  color: rgba(74, 68, 60, 0.35);
}

.cp-calm-table .d {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--fs-5);
  line-height: var(--lh-0);
  color: var(--ink);
  margin-bottom: var(--e-4);
}
.cp-calm-table .d-full {
  display: none; /* visible uniquement en mode liste (mobile) */
}

/* ---- Créneaux ---- */
.cp-calm-table .slots {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
}
.slot {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: baseline;
  gap: var(--e-1) var(--e-4);
  padding: var(--e-4) var(--e-4);
  border: 1px solid var(--copper-hair-strong);
  text-decoration: none;
  font-family: var(--font-body);
  color: var(--ink);
  transition:
    background 0.3s var(--ease),
    color 0.3s var(--ease),
    border-color 0.3s var(--ease);
}
.slot .p {
  justify-self: end;
}
.slot .t {
  font-weight: 600;
  font-size: var(--fs-3);
  letter-spacing: var(--ls-1);
}
.slot .p {
  font-size: var(--fs-2);
  letter-spacing: var(--ls-1);
  color: var(--copper);
  white-space: nowrap;
}
.slot:hover,
.slot:focus-visible {
  background: var(--copper);
  border-color: var(--copper);
  color: var(--paper);
}
.slot:hover .p,
.slot:focus-visible .p {
  color: var(--paper);
}

/* ---- Dernières places ----
   Filet cuivre à gauche plus une mention sur sa propre ligne.
   Pas de rouge : il jurerait avec la palette et se lirait comme une erreur. */
.slot.is-last {
  border-left: 3px solid var(--copper);
  padding-left: var(--e-4);
}
.slot .alert {
  grid-column: 1 / -1;
  font-size: var(--fs-1);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-2);
  color: var(--copper);
  line-height: var(--lh-1);
  margin-top: var(--e-1);
}
.slot.is-last:hover .alert,
.slot.is-last:focus-visible .alert {
  color: var(--paper);
}
.slot.is-last:hover,
.slot.is-last:focus-visible {
  border-left-color: var(--copper);
}
.cp-cal-legend .is-last-key {
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
}
.cp-cal-legend .is-last-key::before {
  content: "";
  width: 22px;
  height: 12px;
  border: 1px solid var(--copper-hair);
  border-left: 3px solid var(--copper);
}

/* ---- Séances complètes ----
   Pas de lien : une case complète ne doit pas être cliquable, sinon
   elle envoie l'utilisateur sur une billetterie qui lui dira non. */
.slot.is-full {
  cursor: default;
  border-color: var(--copper-hair);
  color: rgba(74, 68, 60, 0.7);
  background: repeating-linear-gradient(
    -45deg,
    transparent 0 4px,
    rgba(74, 68, 60, 0.06) 4px 7px
  );
}
.slot.is-full .t {
  text-decoration: line-through;
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
}
.slot.is-full .p {
  color: rgba(74, 68, 60, 0.7);
  font-weight: 600;
}

/* Jour dont toutes les séances sont complètes : le numéro s'atténue,
   pour que le regard file vers les jours encore disponibles. */
.cp-calm-table td.is-full-day .d {
  color: rgba(74, 68, 60, 0.5);
}

/* ---- Repli en liste sous 760 px ----
   La table devient une pile de jours ; les cases vides et hors mois
   disparaissent, l'en-tête aussi (le jour complet est réaffiché). */
@media (max-width: 760px) {
  .cp-calm-table,
  .cp-calm-table tbody,
  .cp-calm-table tr,
  .cp-calm-table td {
    display: block;
    width: auto;
    height: auto;
  }
  .cp-calm-table thead {
    display: none;
  }
  .cp-calm-table td.is-void,
  .cp-calm-table td.is-empty {
    display: none;
  }
  .cp-calm-table td.has-seances {
    border: 0;
    border-bottom: 1px solid var(--copper-hair);
    padding: var(--e-6) 0;
  }
  .cp-calm-table .d {
    font-size: var(--fs-4);
    text-transform: uppercase;
    letter-spacing: var(--ls-2);
    margin-bottom: var(--e-5);
  }
  .cp-calm-table .d-num {
    display: none;
  }
  .cp-calm-table .d-full {
    display: inline;
  }
  .cp-calm-table .slots {
    flex-direction: row;
    flex-wrap: wrap;
    gap: var(--e-4);
  }
  .slot {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--e-1);
    min-width: 92px;
    padding: var(--e-4) var(--e-5);
  }
  .cp-calm-head {
    align-items: center;
  }
  .cp-calm-arrow {
    width: 44px;
    height: 44px; /* cible tactile de 44 px, minimum recommandé */
  }
}

/* ============================================================
   § 25 — ÉTATS DES SÉANCES DANS LES FORMULAIRES DE RÉSERVATION
   Champ du hero (.cp-cal) et barre fixe (.sb-cal).
   Règle : on montre l'état, on ne masque jamais la séance.
   ============================================================ */

/* ---- Jour entièrement complet ----
   Le numéro est barré : l'information passe même sans distinction de couleur. */
.cp-day.is-open.is-full,
.sb-cal-grid button.is-full {
  color: rgba(74, 68, 60, 0.45);
  text-decoration: line-through;
  text-decoration-thickness: 1px;
}
.sb-cal-grid button.is-full {
  color: rgba(233, 226, 214, 0.4);
}

/* ---- Jour avec au moins une séance en fin de stock ----
   Un point cuivre sous le chiffre, discret mais repérable. */
.cp-day.is-open.has-last,
.sb-cal-grid button.has-last {
  position: relative;
}
.cp-day.is-open.has-last::after,
.sb-cal-grid button.has-last::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 4px;
  transform: translateX(-50%);
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--copper);
}
.sb-cal-grid button.has-last::after {
  background: var(--copper-lt);
}
.cp-day.is-open.has-last.is-selected::after,
.sb-cal-grid button.has-last.sel::after {
  background: currentColor;
}

/* ---- Séance complète dans la liste déroulante ----
   Les navigateurs grisent déjà une <option disabled> ; on renforce
   pour les moteurs qui ne le font pas assez nettement. */
.book-bar select option:disabled,
.cp-stickyform select option:disabled {
  color: rgba(74, 68, 60, 0.45);
}

/* ============================================================
   § 26 — RYTHME DES FONDS DE SECTION
   ----------------------------------------------------------------------------
   Trois tons, une règle : jamais deux sections voisines de même fond.

     paper #FCFBF9  lecture courante  (offres, avis, chapiteau, boutique)
     beige #F0E9DA  registre éditorial (création, ensemble, histoire, actualités)
     night #0d0c0b  moments immersifs  (galerie, appel à l'action, engagements)

   Le nuit ponctue, il ne meuble pas : trois apparitions au maximum sur
   la page d'accueil, sur les moments qui portent l'émotion.
   ============================================================ */

.sec.paper {
  background: var(--paper);
}
.sec.beige {
  background: var(--beige);
}

/* La bande d'appel à l'action est plus courte que les autres sections :
   elle se lit comme une respiration entre deux blocs, pas comme un chapitre. */
/* .sec.final ne modifie plus le retrait.

   Elle le portait à 120 px au lieu de 168, au motif qu'une bande de
   conclusion pèse moins qu'une section de contenu. L'argument se défend, mais
   il produisait la seule section de la page dont l'air différait sans que
   rien ne le signale à l'œil — on voyait un décalage sans en trouver la
   cause.

   Toutes les sections partagent désormais le retrait de .sec. Seule la visite
   virtuelle reste à zéro : elle ne contient qu'une photo bord à bord, et
   l'encadrer de deux bandes vides n'aurait aucun sens. */

/* ============================================================
   § 27 — REMPLACEMENT DES STYLES EN LIGNE
   ----------------------------------------------------------------------------
   Ces cinq blocs vivaient dans des attributs style= du gabarit. Un style en
   ligne l'emporte sur toute règle de cette feuille : c'est ce qui recentrait
   le texte des engagements malgré l'alignement à gauche du site.
   ============================================================ */

/* Chapô sous un titre de section — galerie, engagements, expérience.

   Il valait 29 px sur fond sombre (via .grandeur .tag) et 21 ailleurs, quand
   le texte courant en fait 16 : trois tailles pour un même rôle, selon la
   section où il tombe. C'est ce qui donnait l'impression que chaque section
   composait ses textes à sa façon.

   21 px désormais, partout : c'est le pas « mis en avant », celui des
   citations et du chapô de présentation. Un chapô n'est pas du texte courant,
   mais il n'est pas non plus un titre — 29 px le faisait lire comme tel. */
.sec-head-sub,
.container.center .sec-head-sub,
.grandeur .tag.sec-head-sub {
  font-size: var(--fs-7);
  line-height: var(--lh-3);
  max-width: 62ch;
  margin: var(--e-7) 0 var(--e-9);
}

/* Note sous le texte de présentation du spectacle. */
.pres-note {
  margin-bottom: var(--e-7);
}

/* Lien « toutes les actualités ». */
.cp-news-more {
  margin-top: var(--e-11);
}

/* Repli sans JavaScript sous le champ de réservation du hero. */
.cp-noscript-cta {
  margin-top: var(--e-5);
}

/* Seule la bande d'appel à l'action reste centrée : c'est une respiration,
   pas un chapitre. Elle garde donc son chapô et son filet au centre. */
#experience .sec-head-sub {
  margin-left: auto;
  margin-right: auto;
}
#experience .rule {
  margin-left: auto;
  margin-right: auto;
}

/* ============================================================
   § 28 — GALERIE : survol et agrandissement
   Même geste que la photo du chapiteau : léger zoom, filet cuivre
   en retrait, pastille au survol. Les vignettes s'ouvrent en grand.
   ============================================================ */

.gallery .gg .ph-btn {
  display: block;
  position: relative;
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
  border: 0;
  border-radius: 0;
  background: none;
  overflow: hidden;
  cursor: zoom-in;
  color: inherit;
  font: inherit;
}
.gallery .gg .ph-btn .ph {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.6s var(--ease);
}
.gallery .gg .ph-btn:hover .ph,
.gallery .gg .ph-btn:focus-visible .ph {
  transform: scale(1.035);
}

/* Filet en retrait, identique à celui du chapiteau. */
.gallery .gg .ph-fig::after {
  content: "";
  position: absolute;
  inset: 10px;
  border: 1px solid rgba(252, 251, 249, 0.28);
  pointer-events: none;
  z-index: 2;
}

/* Pastille « Agrandir » : masquée au repos, révélée au survol. */
.gallery .gg .ph-overlay {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  background: rgba(13, 12, 11, 0.86);
  border: 1px solid rgba(183, 154, 114, 0.6);
  color: #e9e2d6;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  padding: var(--e-5) var(--e-6);
  opacity: 0;
  z-index: 3;
  transition:
    opacity 0.35s var(--ease),
    background 0.35s var(--ease),
    color 0.35s var(--ease);
}
.gallery .gg .ph-btn:hover .ph-overlay,
.gallery .gg .ph-btn:focus-visible .ph-overlay {
  opacity: 1;
}
.gallery .gg .ph-btn:hover .ph-overlay {
  background: var(--copper-lt);
  border-color: var(--copper-lt);
  color: var(--night);
}

/* La légende passe au-dessus du filet. */
.gallery .gg-cap {
  z-index: 4;
}

/* ---- Visionneuse ---- */
.cp-lightbox[hidden] {
  display: none;
}
.cp-lightbox {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--ef-3);
  background: rgba(13, 12, 11, 0.94);
  opacity: 0;
  transition: opacity 0.28s var(--ease);
}
.cp-lightbox.is-open {
  opacity: 1;
}
.cp-lightbox figure {
  margin: 0;
  max-width: 100%;
  max-height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-6);
}
.cp-lightbox img {
  max-width: 100%;
  max-height: calc(100vh - 150px);
  width: auto;
  height: auto;
  display: block;
  border: 1px solid rgba(183, 154, 114, 0.28);
}
.cp-lightbox figcaption {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  color: var(--copper-lt);
}
.cp-lightbox-close {
  position: absolute;
  top: clamp(12px, 3vw, 28px);
  right: clamp(12px, 3vw, 28px);
  width: 46px;
  height: 46px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid rgba(183, 154, 114, 0.45);
  border-radius: 0;
  color: var(--copper-lt);
  font-size: var(--fs-7);
  line-height: var(--lh-0);
  cursor: pointer;
  transition:
    background 0.3s var(--ease),
    color 0.3s var(--ease);
}
.cp-lightbox-close:hover {
  background: var(--copper-lt);
  color: var(--night);
}

@media (prefers-reduced-motion: reduce) {
  .cp-lightbox,
  .gallery .gg .ph-btn .ph {
    transition: none;
  }
  .gallery .gg .ph-btn:hover .ph {
    transform: none;
  }
}

/* ============================================================
   § 29 — FILET EN RETRAIT SUR UNE PHOTO
   Le geste « Opéra de Paris », jusqu'ici réservé au chapiteau
   et à la galerie. .cp-framed s'applique à n'importe quelle image.
   ============================================================ */

.cp-framed {
  position: relative;
  display: block;
  margin: 0;
  overflow: hidden;
}
.cp-framed > img {
  display: block;
  width: 100%;
  height: auto;
  transition: transform 0.6s var(--ease);
}
/* Survol posé sur la classe elle-même : il n'existait jusqu'ici que dans
   quatre contextes écrits séparément (cartes d'offres, cartes Ensemble,
   toile Gutenberg, affiche). Une image simplement encadrée, comme celle de
   la section Histoire, n'en avait aucun. */
.cp-framed:hover > img,
.cp-framed:focus-within > img {
  transform: scale(1.035);
}
@media (prefers-reduced-motion: reduce) {
  .cp-framed > img {
    transition: none;
  }
  .cp-framed:hover > img,
  .cp-framed:focus-within > img {
    transform: none;
  }
}

/* Le cadre épouse l'image, quel que soit son format.
   Sans ces trois lignes, .split .media impose un portrait 4/5 et une hauteur
   minimale de 420 px : une photo en paysage laisse alors une bande vide en bas,
   et le filet suit la boîte au lieu de suivre la photo. */
.split .media.cp-framed {
  aspect-ratio: auto;
  height: auto;
  min-height: 0;
}
@media (max-width: 900px) {
  .split .media.cp-framed {
    aspect-ratio: auto;
    min-height: 0;
  }
}
.cp-framed::after {
  content: "";
  position: absolute;
  inset: 10px;
  border: 1px solid rgba(252, 251, 249, 0.28);
  pointer-events: none;
}
/* Sur fond clair, un filet blanc serait invisible : on le passe en cuivre. */
.sec.paper .cp-framed::after,
.sec.beige .cp-framed::after {
  border-color: rgba(252, 251, 249, 0.5);
  box-shadow: inset 0 0 0 1px rgba(133, 104, 74, 0.18);
}

/* ============================================================
   § 30 — CARTES D'OFFRES
   Le vocabulaire des sections appliqué à la carte : filet en retrait sur la
   photo, prix d'accroche, deux actions distinctes.

   La carte n'est PLUS entièrement cliquable. Elle l'a été : un pseudo-élément
   la recouvrait, et l'on partait vers la page de l'offre en visant le bouton
   « Réserver ». Deux cibles nommées valent mieux qu'une zone attrape-tout.
   ============================================================ */

.offers .ocard {
  position: relative;
  display: flex;
  flex-direction: column;
}

/* Le lien du titre couvre toute la carte : une seule cible pour le lecteur
   d'écran, toute la surface active à la souris. */
.offers .ocard .cp-card-link {
  color: inherit;
  text-decoration: none;
  transition: color 0.35s var(--ease);
}
/* Plus de zone cliquable sur toute la carte.

   Un pseudo-élément en inset:0 recouvrait la carte entière : on cliquait
   n'importe où et l'on partait vers la page de l'offre, y compris quand on
   visait « Réserver » et qu'on le manquait de deux pixels. Les deux boutons
   sont désormais les seules cibles, et chacun mène où son libellé annonce. */
/* Le survol ne colore plus le titre : il n'est plus cliquable, et le teinter
   promettrait une action qui n'existe pas. */
.offers .ocard .cp-card-link:focus-visible {
  outline: none;
}
/* :has(:focus-visible) et non :focus-within.

   :focus-within se déclenche au CLIC autant qu'au clavier : cliquer une carte
   lui posait un contour cuivre qui restait affiché, et avec le décalage de
   6 px les contours de deux cartes voisines se rejoignaient en un trait
   vertical. C'est ce que produisait chaque clic dans le carrousel.

   :focus-visible n'apparaît que lorsque le navigateur juge le repère utile —
   navigation au clavier, essentiellement. La carte reste donc atteignable au
   clavier avec son contour, et cliquable à la souris sans rien laisser. */
.offers .ocard:has(:focus-visible) {
  outline: 2px solid var(--copper);
  outline-offset: 6px;
}

/* Photo : zoom discret au survol, comme la galerie et le chapiteau. */
.offers .ocard .media.cp-framed {
  aspect-ratio: 3/4;
  margin-bottom: var(--e-4);
  overflow: hidden;
}
.offers .ocard .media.cp-framed > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s var(--ease);
}
.offers .ocard:hover .media.cp-framed > img,
.offers .ocard:focus-within .media.cp-framed > img {
  transform: scale(1.035);
}

.offers .ocard-eyebrow {
  /* Même taille que .eyebrow : c'est le même objet, un sur-titre. Il était
     à --fs-1 sur les cartes et à --fs-2 ailleurs, soit 10 px contre 11,5 —
     deux sur-titres côte à côte n'avaient pas le même poids. */
  font-size: var(--fs-2);
  letter-spacing: var(--ls-5);
  margin: 0 0 var(--e-4);
}

/* Prix d'accroche : un montant rassure autant qu'un pourcentage de remise,
   sans le vocabulaire de la promotion. */
.offers .ocard-price {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-4);
  letter-spacing: var(--ls-1);
  color: var(--copper);
  margin: 0 0 var(--e-4);
}

/* Le lien d'appel n'est plus un <a> : c'est un repère visuel, la carte
   entière portant le lien. Il garde son animation au survol de la carte. */
.offers .ocard-cta {
  margin-top: auto;
  display: inline-flex;
  align-items: center;
  gap: var(--e-5);
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  color: var(--copper);
}
.offers .ocard-cta .ln {
  display: block;
  width: 34px;
  height: 1px;
  background: var(--copper);
  transition: width 0.4s var(--ease);
}
.offers .ocard:hover .ocard-cta .ln,
.offers .ocard:focus-within .ocard-cta .ln {
  width: 56px;
}

@media (prefers-reduced-motion: reduce) {
  .offers .ocard .media.cp-framed > img,
  .offers .ocard-cta .ln {
    transition: none;
  }
  .offers .ocard:hover .media.cp-framed > img {
    transform: none;
  }
}

/* ============================================================
   § 31 — SECTION « SORTIES COLLECTIVES »
   Même grammaire de carte que les offres (§ 30), plus une ligne
   de contact : sur ces publics, un interlocuteur joignable
   convertit mieux qu'un bouton de plus.
   ============================================================ */

.ensemble-grid .ocard {
  position: relative;
  display: flex;
  flex-direction: column;
}
.ensemble-grid .ocard .cp-card-link {
  color: inherit;
  text-decoration: none;
  transition: color 0.35s var(--ease);
}
/* Plus de zone cliquable sur toute la carte — même décision que pour les
   offres. Deux cibles nommées valent mieux qu'une zone attrape-tout. */
.ensemble-grid .ocard:hover .cp-card-link,
.ensemble-grid .ocard:focus-within .cp-card-link {
  color: var(--copper);
}
.ensemble-grid .ocard .cp-card-link:focus-visible {
  outline: none;
}
/* :has(:focus-visible) et non :focus-within.

   :focus-within se déclenche au CLIC autant qu'au clavier : cliquer une carte
   lui posait un contour cuivre qui restait affiché, et avec le décalage de
   6 px les contours de deux cartes voisines se rejoignaient en un trait
   vertical. C'est ce que produisait chaque clic dans le carrousel.

   :focus-visible n'apparaît que lorsque le navigateur juge le repère utile —
   navigation au clavier, essentiellement. La carte reste donc atteignable au
   clavier avec son contour, et cliquable à la souris sans rien laisser. */
.ensemble-grid .ocard:has(:focus-visible) {
  outline: 2px solid var(--copper);
  outline-offset: 6px;
}

.ensemble-grid .ocard .media.cp-framed {
  aspect-ratio: 3/2;
  margin-bottom: var(--e-4);
  overflow: hidden;
}
.ensemble-grid .ocard .media.cp-framed > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s var(--ease);
}
.ensemble-grid .ocard:hover .media.cp-framed > img,
.ensemble-grid .ocard:focus-within .media.cp-framed > img {
  transform: scale(1.035);
}

.ensemble-grid .ocard-eyebrow {
  /* Même taille que .eyebrow : c'est le même objet, un sur-titre. Il était
     à --fs-1 sur les cartes et à --fs-2 ailleurs, soit 10 px contre 11,5 —
     deux sur-titres côte à côte n'avaient pas le même poids. */
  font-size: var(--fs-2);
  letter-spacing: var(--ls-5);
  margin: 0 0 var(--e-4);
}
.ensemble-grid .ocard-price {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-3);
  letter-spacing: var(--ls-0);
  color: var(--copper);
  margin: 0 0 var(--e-4);
}
.ensemble-grid .ocard-cta {
  margin-top: auto;
  display: inline-flex;
  align-items: center;
  gap: var(--e-5);
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  color: var(--copper);
}
.ensemble-grid .ocard-cta .ln {
  display: block;
  width: 34px;
  height: 1px;
  background: var(--copper);
  transition: width 0.4s var(--ease);
}
.ensemble-grid .ocard:hover .ocard-cta .ln,
.ensemble-grid .ocard:focus-within .ocard-cta .ln {
  width: 56px;
}

/* ---- Ligne de contact ---- */
.ens-contact {
  margin: var(--e-12) 0 0;
  padding-top: var(--e-9);
  border-top: 1px solid var(--copper-hair);
  font-family: var(--font-body);
  font-size: var(--fs-4);
  color: var(--ink-soft);
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--e-3) var(--e-5);
}
.ens-contact-q {
  color: var(--ink);
}
.ens-contact a {
  color: var(--copper);
  font-weight: 600;
  letter-spacing: var(--ls-1);
  text-decoration: none;
  border-bottom: 1px solid var(--copper-hair-strong);
  padding-bottom: var(--e-1);
  transition: border-color 0.3s var(--ease);
}
.ens-contact a:hover {
  border-bottom-color: var(--copper);
}
.ens-contact .sep {
  color: var(--copper-hair-strong);
}

@media (prefers-reduced-motion: reduce) {
  .ensemble-grid .ocard .media.cp-framed > img,
  .ensemble-grid .ocard-cta .ln {
    transition: none;
  }
  .ensemble-grid .ocard:hover .media.cp-framed > img {
    transform: none;
  }
}

/* ============================================================
   § 32 — LIGNE LÉGALE DU PIED DE PAGE
   ============================================================ */

.foot .bottom .cp-legal {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--e-3) 0;
}
.cp-legal-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
}
.cp-legal-list li + li::before,
.cp-legal .cp-cookie-prefs::before {
  content: "·";
  margin: 0 var(--e-4);
  color: rgba(233, 226, 214, 0.35);
}
.cp-legal-list a,
.cp-cookie-prefs {
  font-family: var(--font-body);
  font-size: var(--fs-2);
  letter-spacing: var(--ls-1);
  color: rgba(233, 226, 214, 0.6);
  text-decoration: none;
  transition: color 0.3s var(--ease);
}
.cp-legal-list a:hover,
.cp-cookie-prefs:hover {
  color: var(--copper-lt);
}
/* Le retrait du consentement est un bouton, pas un lien : il déclenche
   une action sur la page au lieu de mener ailleurs. */
.cp-cookie-prefs {
  appearance: none;
  background: none;
  border: 0;
  border-radius: 0;
  padding: 0;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
}
.cp-cookie-prefs[hidden] {
  display: none;
}

@media (max-width: 700px) {
  .cp-legal-list li:first-child::before {
    content: none;
  }
}

/* ============================================================
   § 33 — BANDEAU DES PAGES CLASSIQUES (page.php)
   Même vocabulaire que les bandeaux Gutenberg des pages
   « L'expérience » et « Découvrir le Cirque Phénix ».
   ============================================================ */

.cp-pagehero {
  padding-top: var(--ef-6);
  padding-bottom: var(--ef-4);
}
/* Fond photo (image mise en avant de la page), avec voile de lisibilité
   pour garder le texte lisible par-dessus. La photo est sur une couche
   séparée (::before) pour pouvoir l'animer en fondu à l'arrivée ; le voile
   est sur ::after, toujours au-dessus de la photo mais sous le texte. */
.cp-pagehero.has-hero-bg {
  position: relative;
  overflow: hidden;
}
.cp-pagehero.has-hero-bg::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image: var(--cp-hero-bg);
  background-size: cover;
  background-position: center;
  /* État de départ : invisible et très légèrement zoomée. */
  opacity: 0;
  transform: scale(1.06);
  animation: cp-hero-reveal 1.4s cubic-bezier(0.22, 1, 0.36, 1) 0.1s forwards;
}
.cp-pagehero.has-hero-bg::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(
    to bottom,
    rgba(13, 12, 11, 0.72),
    rgba(13, 12, 11, 0.58) 55%,
    rgba(13, 12, 11, 0.78)
  );
}
@keyframes cp-hero-reveal {
  to {
    opacity: 1;
    transform: scale(1);
  }
}
/* Respect des préférences d'accessibilité : pas d'animation si l'utilisateur
   a demandé à réduire les mouvements. */
@media (prefers-reduced-motion: reduce) {
  .cp-pagehero.has-hero-bg::before {
    animation: none;
    opacity: 1;
    transform: none;
  }
}
.cp-pagehero.has-hero-bg .container {
  position: relative;
  z-index: 2;
}
.cp-pagehero .h1-page {
  color: #fff;
  max-width: 20ch;
}
.cp-pagehero-lead {
  max-width: 60ch;
  margin: var(--e-7) 0 0;
  color: rgba(233, 226, 214, 0.82);
}
/* Le contenu commence sous le bandeau : il n'a plus à réserver
   la hauteur du menu fixe. */
.cp-pagehero + .sec {
  padding-top: var(--ef-4);
}

/* ============================================================
   § 34 — MENU À PANNEAUX
   Trois niveaux gérés dans Apparence → Menus, rendus par
   inc/megamenu.php. Le panneau s'ouvre au survol sur grand écran
   et au clic partout ailleurs.
   ============================================================ */

.cp-nav {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  align-items: center;
  gap: var(--ef-2);
}
.cp-nav-item {
  position: static; /* le panneau se cale sur la barre, pas sur l'élément */
  display: flex;
  align-items: center;
  gap: var(--e-3);
}

/* Toute la barre se teinte quand un panneau est ouvert, comme à l'Opéra :
   le menu devient un bloc sombre plein, pas une barre translucide. */
.nav.has-open {
  background: rgba(13, 12, 11, 0.98);
}

/* ---- Le panneau ---- */
.cp-mega {
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  background: #0d0c0b;
  border: 0;
  border-top: 1px solid rgba(183, 154, 114, 0.16);
  overflow: hidden; /* rogne le filigrane par le bas */
  padding: var(--ef-3) 0 var(--ef-3);
  opacity: 0;
  transform: translateY(-8px);
  transition:
    opacity 0.28s var(--ease),
    transform 0.28s var(--ease);
}
.cp-mega[hidden] {
  display: none;
}
.cp-nav-item.is-open .cp-mega {
  opacity: 1;
  transform: none;
}
.cp-mega-inner {
  display: grid;
  grid-template-columns: minmax(240px, 300px) 1fr;
  gap: var(--ef-3);
  align-items: start;
}
/* La zone des colonnes de liens s'étale toujours côte à côte, carte ou non. */
.cp-mega-inner .cp-mega-cols {
  grid-column: 2;
}
/* Sans carte illustrée (ex. « Infos pratiques »), pas de première colonne
   étroite : les colonnes de liens occupent toute la largeur. */
.cp-mega-inner.no-feature {
  grid-template-columns: 1fr;
}
.cp-mega-inner.no-feature .cp-mega-cols {
  grid-column: 1;
}
.cp-mega-cols {
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

/* ---- Filigrane ----
   Le nom de la rubrique en très grand, coupé par le bord inférieur.
   Purement décoratif : aria-hidden côté PHP, et il ne capte aucun clic. */
.cp-mega-watermark {
  position: absolute;
  left: clamp(22px, 5vw, 64px);
  right: 0;
  bottom: 0;
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: var(--ls-0);
  font-size: var(--fs-d1);
  line-height: var(--lh-serre);
  white-space: nowrap;
  color: rgba(233, 226, 214, 0.05);
  transform: translateY(26%);
  pointer-events: none;
  user-select: none;
  z-index: 0;
}
/* Le contenu passe devant le filigrane. */
.cp-mega-inner {
  position: relative;
  z-index: 1;
}

/* ---- Colonne de gauche : les boutons ---- */
.cp-mega-rail {
  display: flex;
  flex-direction: column;
  gap: var(--e-5);
}
.cp-mega-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: var(--e-5) var(--e-7);
  border: 1px solid rgba(183, 154, 114, 0.55);
  border-radius: 0;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  color: var(--copper-lt);
  text-decoration: none;
  transition:
    background 0.35s var(--ease),
    color 0.35s var(--ease);
}
.cp-mega-btn.is-primary {
  background: var(--copper-lt);
  border-color: var(--copper-lt);
  color: var(--night);
}
.cp-mega-btn:hover {
  background: var(--copper-lt);
  border-color: var(--copper-lt);
  color: var(--night);
}

/* ---- Colonnes de liens ---- */
.cp-mega-cols {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--ef-3);
}
.cp-mega-title {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  /* Capitales : la police de titrage est dessinée pour elles, et le contraste
     avec les entrées en dessous s'en trouve renforcé. Un cran de corps en
     moins et un interlettrage ouvert, sans quoi les capitales tassent. */
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-sub);
  line-height: var(--lh-1);
  color: rgba(233, 226, 214, 0.55);
  text-decoration: none;
  margin-bottom: var(--e-6);
}
a.cp-mega-title:hover {
  color: #fff;
}
.cp-mega-col ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--e-5);
}
.cp-mega-col a:not(.cp-mega-title) {
  font-family: var(--font-body);
  font-size: var(--fs-4);
  letter-spacing: var(--ls-0);
  color: #fff;
  text-decoration: none;
  transition: color 0.3s var(--ease);
}
.cp-mega-col a:not(.cp-mega-title):hover {
  color: var(--copper-lt);
}

/* ---- Carte illustrée ---- */
.cp-mega-feature,
.cp-mega-feature:hover,
.cp-mega-feature:focus-visible {
  display: block;
  text-decoration: none;
}
/* Le bouton n'hérite jamais du soulignement global des liens au survol. */
.cp-mega-feature-btn,
.cp-mega-feature:hover .cp-mega-feature-btn,
.cp-mega-feature:focus-visible .cp-mega-feature-btn {
  text-decoration: none;
}
.cp-mega-feature-img {
  display: block;
  position: relative;
  aspect-ratio: 16/9; /* vignette paysage, façon Opéra de Paris */
  overflow: hidden;
  background: rgba(183, 154, 114, 0.08);
}
.cp-mega-feature-img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.6s var(--ease);
}
.cp-mega-feature:hover .cp-mega-feature-img img {
  transform: scale(1.035);
}
.cp-mega-feature-img::after {
  content: "";
  position: absolute;
  inset: 8px;
  border: 1px solid rgba(252, 251, 249, 0.24);
  pointer-events: none;
}
.cp-mega-feature-txt {
  display: block;
  margin: var(--e-5) 0 0;
}
.cp-mega-feature-label {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-4);
  letter-spacing: var(--ls-0);
  color: #fff;
}
.cp-mega-feature-label .sep {
  color: var(--copper-lt);
}
/* Bouton plein sous la carte, comme le « Découvrir » de l'Opéra. */
.cp-mega-feature-btn {
  display: block;
  position: relative;
  z-index: 1;
  margin-top: var(--e-5);
  padding: var(--e-5) var(--e-7);
  background: var(--copper-lt);
  color: var(--night);
  text-align: center;
  border: 0;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-4);
  font-size: var(--fs-2);
  transition:
    background 0.35s var(--ease),
    color 0.35s var(--ease);
}
.cp-mega-feature:hover .cp-mega-feature-btn,
.cp-mega-feature:focus-visible .cp-mega-feature-btn {
  background: #fff;
  color: var(--night);
}

/* ---- Sous 1100 px : le panneau devient un accordéon dans le menu mobile ---- */
@media (max-width: 1100px) {
  .cp-nav {
    flex-direction: column;
    align-items: flex-start;
    gap: 0;
  }
  .cp-nav-item {
    flex-wrap: wrap;
    width: 100%;
    padding: var(--e-5) 0;
    border-bottom: 1px solid rgba(183, 154, 114, 0.16);
  }
  .cp-mega {
    position: static;
    width: 100%;
    background: none;
    border: 0;
    padding: var(--e-3) 0 var(--e-6);
    transform: none;
  }
  .cp-mega-inner {
    grid-template-columns: 1fr;
    gap: var(--e-8);
  }
  .cp-mega-feature {
    max-width: 280px;
  }
  /* Sur mobile le panneau est un accordéon : le filigrane déborderait. */
  .cp-mega-watermark {
    display: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .cp-mega,
  .cp-mega-toggle span,
  .cp-mega-feature-img img {
    transition: none;
  }
}

/* ============================================================
   § 35 — DIAPORAMA DE BANNIÈRE
   Ajoutez la classe cp-hero-slideshow à un bloc Couverture.
   Les images se définissent dans Personnaliser → Diaporama de bannière.
   ============================================================ */

.cp-hero-slideshow {
  position: relative;
  overflow: hidden;
}
.cp-slides {
  position: absolute;
  inset: 0;
  /* Au-dessus du voile de couleur, sous le contenu : le diaporama reste
     visible même quand la bannière a une superposition à 100 %. */
  z-index: 1;
  pointer-events: none;
}
.cp-slide {
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  opacity: 0;
  /* Le fondu est long : un enchaînement rapide sur une image plein écran
     donne une impression de clignotement. */
  transition: opacity 1.6s var(--ease);
}
.cp-slide.is-on {
  opacity: 1;
}

/* Le contenu de la bannière reste au-dessus de tout. */
.cp-hero-slideshow > .wp-block-cover__inner-container {
  position: relative;
  z-index: 3;
}
/* Le voile passe sous le diaporama et perd son opacité totale : un voile à
   100 % masquerait complètement les images. On garde un léger assombrissement
   pour que la carte ivoire et le texte restent lisibles par-dessus les photos. */
.cp-hero-slideshow > .wp-block-cover__background {
  z-index: 0;
  opacity: 0.35 !important;
}
/* Voile de lisibilité posé directement sur le diaporama. */
.cp-hero-slideshow .cp-slides::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    100deg,
    rgba(13, 12, 11, 0.88) 0%,
    rgba(13, 12, 11, 0.7) 42%,
    rgba(13, 12, 11, 0.45) 100%
  );
  z-index: 2;
}

@media (prefers-reduced-motion: reduce) {
  .cp-slide {
    transition: none;
  }
}

/* ============================================================
   § 36 — CARROUSEL DE TOURNÉE
   Shortcode [cp_tournee]. Défilement horizontal, cartes carrées.
   ============================================================ */

.cp-tour {
  margin: var(--e-11) 0 0;
}
.cp-tour-head {
  margin-bottom: var(--e-9);
}
.cp-tour-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
}
.cp-tour-eyebrow::before {
  content: "";
  width: 13px;
  height: 13px;
  background: var(--copper);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2C8 2 5 5 5 9c0 5 7 13 7 13s7-8 7-13c0-4-3-7-7-7zm0 9.5A2.5 2.5 0 1 1 12 6.5a2.5 2.5 0 0 1 0 5z'/%3E%3C/svg%3E")
    center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2C8 2 5 5 5 9c0 5 7 13 7 13s7-8 7-13c0-4-3-7-7-7zm0 9.5A2.5 2.5 0 1 1 12 6.5a2.5 2.5 0 0 1 0 5z'/%3E%3C/svg%3E")
    center/contain no-repeat;
}

.cp-tour-viewport {
  position: relative;
}
.cp-tour-track {
  list-style: none;
  margin: 0;
  padding: var(--e-2);
  display: flex;
  gap: var(--e-7);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  scrollbar-width: none;
}
.cp-tour-track::-webkit-scrollbar {
  display: none;
}
.cp-tour-card {
  flex: 0 0 clamp(240px, 30%, 310px);
  scroll-snap-align: start;
  position: relative;
  background: var(--paper);
  padding: var(--ef-2) var(--e-8) var(--e-8);
  text-align: center;
  min-height: 230px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-3);
  overflow: hidden;
  transition:
    transform 0.45s var(--ease),
    box-shadow 0.45s var(--ease);
}
.sec.paper .cp-tour-card {
  background: #fff;
}
/* Filet intérieur, geste maison. */
.cp-tour-card::after {
  content: "";
  position: absolute;
  inset: 9px;
  border: 1px solid var(--copper-hair);
  pointer-events: none;
  transition: border-color 0.45s var(--ease);
}
.cp-tour-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 18px 40px rgba(20, 18, 16, 0.1);
}
.cp-tour-card:hover::after {
  border-color: var(--copper);
}
/* Trait cuivre en haut de carte, signal d'accroche. */
.cp-tour-topline {
  width: 34px;
  height: 2px;
  background: var(--copper);
  margin-bottom: var(--e-3);
}
.cp-tour-ville {
  font-family: var(--font-display);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-lead);
  line-height: var(--lh-0);
  color: var(--ink);
}
.cp-tour-salle {
  font-family: var(--font-body);
  font-size: var(--fs-3);
  letter-spacing: var(--ls-0);
  color: var(--ink-soft);
}
.cp-tour-date {
  font-family: var(--font-body);
  font-size: var(--fs-3);
  color: var(--copper);
  margin-bottom: var(--e-2);
}
/* Bouton Réserver : carré, remplissage cuivre au survol, façon site. */
.cp-tour-book {
  margin-top: auto;
  display: inline-flex;
  align-items: center;
  gap: var(--e-4);
  padding: var(--e-5) var(--e-7);
  border: 1px solid var(--copper);
  border-radius: 0;
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  color: var(--copper);
  text-decoration: none;
  background: linear-gradient(var(--copper), var(--copper)) left / 0% 100%
    no-repeat;
  transition:
    background-size 0.45s var(--ease),
    color 0.35s var(--ease);
}
.cp-tour-book:hover,
.cp-tour-book:focus-visible {
  background-size: 100% 100%;
  color: var(--paper);
}
.cp-tour-book-arrow {
  transition: transform 0.35s var(--ease);
}
.cp-tour-book:hover .cp-tour-book-arrow {
  transform: translateX(3px);
}

/* Flèches */
.cp-tour-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--night);
  color: var(--paper);
  border: 0;
  border-radius: 0;
  font-size: var(--fs-7);
  line-height: var(--lh-0);
  cursor: pointer;
  opacity: 0.9;
  transition: opacity 0.3s var(--ease);
}
.cp-tour-arrow:hover {
  opacity: 1;
}
.cp-tour-arrow.is-prev {
  left: -8px;
}
.cp-tour-arrow.is-next {
  right: -8px;
}
.cp-tour-arrow[hidden] {
  display: none;
}

/* Pastilles de progression */
.cp-tour-dots {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: var(--e-3);
  margin-top: var(--e-9);
}
.cp-tour-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--copper);
  opacity: 0.28;
  border: 0;
  padding: 0;
  cursor: pointer;
  transition: opacity 0.3s var(--ease);
}
.cp-tour-dot.is-on {
  opacity: 1;
}

@media (max-width: 600px) {
  .cp-tour-card {
    flex-basis: 78%;
  }
  .cp-tour-arrow {
    display: none;
  }
}

/* ============================================================================
   § Padding latéral mobile & tablette — 18px minimum sur les côtés
   ----------------------------------------------------------------------------
   Garantit que le texte ne colle jamais aux bords du navigateur sur petit
   écran, y compris dans les blocs Gutenberg pleine largeur.
   ============================================================================ */
@media (max-width: 1024px) {
  /* Sections codées du thème */
  .sec {
    padding-left: var(--e-6);
    padding-right: var(--e-6);
  }
  /* Contenu Gutenberg standard */
  .cp-canvas > * {
    padding-left: var(--e-6);
    padding-right: var(--e-6);
  }
  /* Blocs pleine largeur : le fond reste plein bord à bord, mais le
     contenu interne garde ses 18px de respiration. */
  .cp-canvas > .alignfull > :not(.alignfull) {
    padding-left: var(--e-6);
    padding-right: var(--e-6);
  }
  /* Hero : titres et textes décollés des bords */
  .hero .container,
  .hero .center {
    padding-left: var(--e-6);
    padding-right: var(--e-6);
  }
}

/* ============================================================================
   § Menu mobile plein écran (< 1024px) — modèle Opéra de Paris
   ============================================================================ */
.cp-mbar {
  display: none;
}

/* Bascule vers le menu mobile à 1300 px.

   À 16 px en graisse 600, les quatre entrées demandent environ 738 px. Entre
   le logo et le bouton de réservation, un écran de 1280 px n'en laisse que
   700, un 1366 en laisse 788.

   Le seuil suit donc la taille de police : plus le menu est gros, plus tôt il
   doit céder la place au tiroir. Chaque cran de corps se paie en largeur, et
   c'est la seule variable d'ajustement une fois la police et la graisse
   choisies.

   Si le menu déroulant doit revenir sur les portables de 1280 px, la solution
   n'est pas de réduire encore le corps : c'est de raccourcir « Découvrir le
   Cirque Phénix », qui pèse à lui seul plus de 300 px. Le champ « Titre de la
   navigation » de WordPress permet de l'appeler « Découvrir » sans toucher au
   titre de la page. */
@media (max-width: 1300px) {
  /* On masque la barre desktop et on montre la barre mobile. */
  .nav {
    display: none !important;
  }
  .topbar {
    display: none;
  }

  .cp-mbar {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    align-items: center;
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    height: 64px;
    padding: 0 var(--e-6);
    background: #0d0c0b;
    z-index: 1000;
    border-bottom: 1px solid rgba(183, 154, 114, 0.16);
  }
  .admin-bar .cp-mbar {
    top: 46px;
  }

  .cp-mbar-ticket {
    justify-self: start;
    color: #fff;
    display: inline-flex;
    padding: var(--e-4);
    margin: calc(-1 * var(--e-4));
  }
  .cp-mbar-logo {
    justify-self: center;
    display: inline-flex;
    align-items: center;
  }
  .cp-mbar-logo img {
    height: 38px;
    width: auto;
    display: block;
  }
  /* Burger blanc, trois traits. */
  .cp-mbar-burger {
    justify-self: end;
    width: 30px;
    height: 22px;
    position: relative;
    background: none;
    border: 0;
    padding: 0;
    cursor: pointer;
  }
  .cp-mbar-burger span {
    position: absolute;
    left: 0;
    right: 0;
    height: 2px;
    background: #fff;
    transition:
      transform 0.3s var(--ease),
      opacity 0.2s var(--ease),
      top 0.3s var(--ease);
  }
  .cp-mbar-burger span:nth-child(1) {
    top: 2px;
  }
  .cp-mbar-burger span:nth-child(2) {
    top: 10px;
  }
  .cp-mbar-burger span:nth-child(3) {
    top: 18px;
  }
  /* Croix quand ouvert. */
  body.cp-mmenu-open .cp-mbar-burger span:nth-child(1) {
    top: 10px;
    transform: rotate(45deg);
  }
  body.cp-mmenu-open .cp-mbar-burger span:nth-child(2) {
    opacity: 0;
  }
  body.cp-mmenu-open .cp-mbar-burger span:nth-child(3) {
    top: 10px;
    transform: rotate(-45deg);
  }

  /* Le contenu de page commence sous la barre fixe. */
  body {
    padding-top: var(--e-12);
  }
  .admin-bar body {
    padding-top: var(--e-14);
  }
}

/* --- Le menu plein écran --- */
.cp-mmenu {
  position: fixed;
  inset: 64px 0 0 0;
  background: #fff;
  z-index: 999;
  overflow: hidden;
}
.admin-bar .cp-mmenu {
  top: 110px;
}
body:not(.cp-mmenu-open) .cp-mmenu[hidden] {
  display: none;
}

/* Panneaux empilés, glissement horizontal. */
.cp-mmenu-panel {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  padding: var(--e-8) var(--e-7) var(--e-8);
  overflow-y: auto;
  background: #fff;
  transform: translateX(100%);
  transition: transform 0.32s var(--ease);
}
.cp-mmenu-panel.cp-mmenu-root {
  transform: translateX(0);
}
.cp-mmenu-panel.is-active {
  transform: translateX(0);
}
.cp-mmenu-panel.is-left {
  transform: translateX(-30%);
}

.cp-mmenu-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}
.cp-mmenu-list li {
  margin: 0;
}
.cp-mmenu-list a,
.cp-mmenu-open {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  gap: var(--e-5);
  padding: var(--e-6) var(--e-1);
  font-family: var(--font-body);
  font-size: var(--fs-7);
  font-weight: 500;
  color: var(--ink);
  text-decoration: none;
  background: none;
  border: 0;
  border-bottom: 1px solid rgba(20, 18, 16, 0.08);
  cursor: pointer;
  text-align: left;
}
.cp-mmenu-open svg {
  flex: none;
  color: var(--copper);
}
.cp-mmenu-lead {
  color: var(--copper) !important;
  font-size: var(--fs-5) !important; /* charte-ok: surcharge du tiroir mobile, imposée à un bloc du noyau */
  letter-spacing: var(--ls-1);
}
.cp-mmenu-group {
  padding: var(--e-7) var(--e-1) var(--e-3);
  font-family: var(--font-body);
  font-size: var(--fs-2);
  font-weight: 600;
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  color: var(--copper);
}
.cp-mmenu-back {
  display: flex;
  align-items: center;
  gap: var(--e-4);
  padding: var(--e-3) var(--e-1) var(--e-6);
  margin-bottom: var(--e-3);
  background: none;
  border: 0;
  font-family: var(--font-body);
  font-size: var(--fs-4);
  font-weight: 600;
  letter-spacing: var(--ls-1);
  color: var(--ink-soft);
  cursor: pointer;
}
.cp-mmenu-cta {
  margin-top: auto;
  display: block;
  text-align: center;
  padding: var(--e-6);
  background: var(--copper);
  color: #fff !important;
  font-family: var(--font-body);
  font-weight: 600;
  letter-spacing: var(--ls-2);
  text-transform: uppercase;
  font-size: var(--fs-3);
  border-bottom: 0 !important;
  /* Au-dessus de la bulle du chatbot, qui se pose en bas à droite avec un
     z-index élevé et recouvrait la moitié du bouton. Le tiroir occupe déjà
     tout l'écran : rien d'autre n'a de raison de flotter par-dessus. */
  position: relative;
  z-index: 2;
}

/* ---------------------------------------------------------------------------
   Bulle du chatbot et actions fixes

   La bulle « Une question ? » est posée par une extension, en bas à droite,
   sans rien savoir de ce que le thème place au même endroit. Elle recouvrait
   le bouton d'action du tiroir mobile — la moitié droite devenait
   incliquable, et c'est justement la zone que le pouce droit atteint le plus
   naturellement.

   Deux réponses, parce que le problème a deux faces : on remonte la bulle
   au-dessus des barres fixes, et on la masque tant que le tiroir est ouvert.
   Un menu plein écran est un moment où l'on choisit sa destination ; une
   bulle de discussion n'y a pas sa place.

   La bulle vient d'une extension dont je n'ai pas le code : les sélecteurs
   ci-dessous couvrent les implantations les plus répandues, mais ils sont une
   supposition. Le repli sûr est la classe cp-hors-barre, à poser à la main sur
   la bulle depuis les réglages de l'extension : elle vaut pour n'importe
   quelle bulle, quel que soit son nom.

   Pour trouver le vrai sélecteur : clic droit sur la bulle, « Inspecter »,
   relever l'identifiant ou la classe de l'élément surligné, et l'ajouter aux
   trois listes ci-dessous.
   --------------------------------------------------------------------- */

.cp-hors-barre,
.cp-chat-bulle,
#cp-chatbot-launcher,
.cpp-chat-toggle,
[class*="chat-widget"],
[id*="chat-launcher"] {
  z-index: 900;
}

@media (max-width: 1300px) {
  /* Au-dessus de la barre mobile de 64 px, plus une marge de respiration.
     Le seuil suit celui de la bascule vers le menu mobile : c'est l'apparition
     de la barre qui rend le décalage nécessaire, pas une largeur en soi. */
  .cp-hors-barre,
  .cp-chat-bulle,
  #cp-chatbot-launcher,
  .cpp-chat-toggle,
  [class*="chat-widget"],
  [id*="chat-launcher"] {
    bottom: 80px;
  }
}

/* Tiroir ouvert : la bulle s'efface. Un menu plein écran est un moment où
   l'on choisit sa destination ; une bulle de discussion n'y a pas sa place.

   Le masquage lui-même est fait par le script, qui reconnaît ces éléments à
   leur comportement — fixés à l'écran, ancrés en bas — et non à leur nom.
   Les règles ci-dessous ne sont qu'une ceinture : elles agissent si le nom de
   l'extension figure dans la liste, le script agit dans tous les cas. */
.cp-mmenu-open .cp-hors-barre,
.cp-mmenu-open .cp-chat-bulle,
.cp-mmenu-open #cp-chatbot-launcher,
.cp-mmenu-open .cpp-chat-toggle,
.cp-mmenu-open [class*="chat-widget"],
.cp-mmenu-open [id*="chat-launcher"] {
  opacity: 0;
  pointer-events: none;
  visibility: hidden;
}

/* ==== § 37 — LANDING (PAGES DE CONVERSION PUBLICITAIRE) ====
   Gabarit template-landing.php. N'ajoute que ce qui n'existe pas ailleurs :
   la grille de chiffres, la liste pratique, les avis et la FAQ. Tout le reste
   (.eyebrow, .h1, .h2, .lead, .body, .btn-reserve, .reveal, .cp-stickybar)
   est repris tel quel des § 2, § 3, § 8, § 14 et § 20. */

.cp-lp-body {
  background: var(--paper);
}
.cp-lp-skip {
  position: absolute;
  left: -9999px;
  top: 0;
}
.cp-lp-skip:focus {
  left: 12px;
  top: 12px;
  z-index: 100;
  background: #fff;
  color: var(--ink);
  padding: var(--e-5) var(--e-6);
  outline: 2px solid var(--copper);
}

/* Chrome minimal : logo seul, mentions légales seules. */
/* Gouttière commune à toute la landing : exactement celle de .sec sur le reste

/* Barre de marque : la place et les proportions de .nav sur la page d'accueil
   — transparente sur la vidéo, logo de 34 px de haut, mêmes gouttières. Sans
   menu ni bouton : une landing n'a qu'une sortie. */
.cp-lp-nav {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  z-index: 5;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-8);
  padding: var(--e-7) var(--ef-3);
}
.cp-lp-nav .brandlink {
  display: inline-flex;
  align-items: center;
}
.cp-lp-nav .logo {
  height: 34px;
  width: auto;
  opacity: 0.96;
  transition: opacity 0.5s var(--ease);
}
.cp-lp-nav .brandlink:hover .logo {
  opacity: 1;
}
.cp-lp-navnote {
  font-family: var(--font-body);
  font-size: var(--fs-2);
  font-weight: 600;
  letter-spacing: var(--ls-5);
  text-transform: uppercase;
  /* 0.5 tombait à 3,4:1 sur le fond nuit, sous le seuil AA du texte non
     agrandi. 0.72 remonte à 6,9:1. */
  color: rgba(252, 251, 249, 0.72);
}
@media (max-width: 600px) {
  .cp-lp-navnote {
    display: none;
  }
  .cp-lp-nav .logo {
    height: 28px;
  }
}
.cp-lp-bar img {
  width: 132px;
  height: auto;
}
.cp-lp-legal {
  background: var(--night);
  color: rgba(252, 251, 249, 0.42);
  text-align: center;
  padding: var(--e-11) var(--ef-3) var(--e-14);
}
.cp-lp-legal p {
  font-size: var(--fs-3);
  line-height: var(--lh-large);
  letter-spacing: var(--ls-0);
}
.cp-lp-legal a {
  color: var(--copper-lt);
  border-bottom: 1px solid rgba(183, 154, 114, 0.35);
}
.cp-lp-legal a:hover {
  border-bottom-color: var(--copper-lt);
}

/* Sections */
.cp-lp-in {
  max-width: 1240px;
  margin: 0 auto;
}

/* Le conteneur suit la largeur du site, mais le texte garde une longueur de
   ligne lisible : au-delà de ~66 caractères, l'œil perd le début de la ligne
   suivante. */
.cp-lp-sec .body,
.cp-lp-sec .lead,
.cp-lp-hero .lead {
  max-width: 62ch;
}
/* Même respiration verticale que .sec : clamp(88px, 13vh, 168px). */
.cp-lp-sec {
  padding: var(--ef-6) var(--ef-3);
}
.cp-lp-sec.on-night {
  background: var(--night);
}
.cp-lp-sec.on-beige {
  background: var(--beige);
}
/* Rythme interne, une seule cascade pour toute la page :
.cp-lp-sec .btn-reserve {
  margin-top: var(--e-9);
}
.cp-lp-sec > .cp-lp-in > .grid,
.cp-lp-sec .cp-partners-row {
  margin-top: var(--e-9);
}
/* Le premier accordéon suit le titre au même intervalle qu'un paragraphe. */
.cp-lp-sec.on-night .h2 {
  color: var(--paper);
}
.cp-lp-sec.on-night .body {
  color: rgba(252, 251, 249, 0.72);
}
.cp-lp-sec.on-night .eyebrow,
.cp-lp-hero .eyebrow {
  color: var(--copper-lt);
}
.cp-lp-sec.on-night .eyebrow::after,
.cp-lp-hero .eyebrow::after {
  background: var(--copper-lt);
}

/* Le gabarit n'a pas la barre mobile fixe du site : sans cette règle, il
   hérite du décalage de 64 px prévu pour elle et ouvre sur une bande vide. */
.cp-lp-body {
  padding-top: 0;
}

/* Boutons : la landing garde le survol du site (§ 19) — contour cuivre au
   repos, remplissage qui glisse depuis la gauche au survol. Sur les fonds
   sombres, le cuivre clair prend le relais, comme pour .final et .cp-prefooter.
   Aucune surcharge du remplissage ici : le ::before du § 19 fait le travail. */
.cp-lp-hero .btn-reserve,
.cp-lp-sec.on-night .btn-reserve,
.cp-stickybar .btn-reserve {
  border-color: rgba(183, 154, 114, 0.55);
  color: var(--copper-lt);
}
.cp-lp-hero .btn-reserve::before,
.cp-lp-sec.on-night .btn-reserve::before,
.cp-stickybar .btn-reserve::before {
  background: var(--copper-lt);
}
.cp-lp-hero .btn-reserve:hover,
.cp-lp-sec.on-night .btn-reserve:hover,
.cp-stickybar .btn-reserve:hover {
  color: var(--night);
  border-color: var(--copper-lt);
}

/* Hero — celui de l'accueil, en un peu plus court : sur une landing, le
   formulaire de réservation doit être atteint sans défiler. */
/* Hero : la gouttière du site, et une hauteur juste assez généreuse pour que
   le formulaire tienne sur le premier écran d'un téléphone. */
.cp-lp-hero {
  min-height: 92svh;
  padding: var(--ef-6) var(--ef-3) var(--ef-4);
}
.cp-lp-hero .inner {
  max-width: 1240px;
  margin: 0 auto;
  width: 100%;
}
.cp-lp-sur,
.cp-lp-sous {
  font-family: var(--font-body);
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  color: var(--copper-lt);
  margin: 0;
}
.cp-lp-sur {
  font-size: var(--fs-3);
  margin-bottom: var(--e-4);
}
.cp-lp-sous {
  font-size: var(--fs-micro);
  margin-top: var(--e-4);
  color: rgba(252, 251, 249, 0.78);
}
.cp-lp-hero .book-bar {
  margin-top: var(--e-9);
}
.cp-lp-trust {
  margin-top: var(--e-9);
  font-family: var(--font-body);
  font-size: var(--fs-2);
  letter-spacing: var(--ls-3);
  text-transform: uppercase;
  color: rgba(252, 251, 249, 0.45);
}

/* Bloc de prix du hero.
   Pas de pastille pleine ni de cartouche coloré : ce vocabulaire-là n'est pas
   celui du Phénix. Le registre est celui d'une affiche d'opéra — filets fins,
   capitales espacées, et la hiérarchie portée par la typographie seule.
   Ce qui frappe, c'est la comparaison : l'ancien prix barré posé juste à
   gauche du nouveau, tous deux dans la police de titrage, l'un effacé,
   l'autre plein. L'œil fait la soustraction avant de lire la ligne. */
.cp-lp-price {
  margin: var(--e-9) 0 0;
  padding: var(--e-7) 0;
  max-width: 560px;
  border-top: 1px solid rgba(183, 154, 114, 0.45);
  border-bottom: 1px solid rgba(183, 154, 114, 0.45);
}
.cp-lp-price-lbl {
  display: flex;
  align-items: center;
  gap: var(--e-5);
  margin: 0 0 var(--e-5);
  font-family: var(--font-body);
  font-size: var(--fs-2);
  font-weight: 600;
  letter-spacing: var(--ls-5);
  text-transform: uppercase;
  color: var(--copper-lt);
}
/* La remise : un filet à gauche, pas un fond. */
.cp-lp-price-lbl em {
  font-style: normal;
  letter-spacing: var(--ls-3);
  color: var(--paper);
  padding-left: var(--e-5);
  border-left: 1px solid rgba(183, 154, 114, 0.45);
}
.cp-lp-price-figs {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--e-2) var(--e-5);
  margin: 0;
}
/* Ancien prix : même police que le nouveau, à 55 % — la comparaison ne
   fonctionne que si les deux nombres appartiennent au même registre. */
.cp-lp-price-figs s {
  font-family: var(--font-display);
  font-size: var(--fs-h5);
  font-weight: 500;
  line-height: var(--lh-0);
  letter-spacing: var(--ls-0);
  color: rgba(252, 251, 249, 0.38);
  text-decoration-line: line-through;
  text-decoration-thickness: 1px;
  text-decoration-color: rgba(183, 154, 114, 0.85);
}
.cp-lp-price-figs b {
  font-family: var(--font-display);
  font-size: var(--fs-h3);
  font-weight: 500;
  line-height: var(--lh-0);
  letter-spacing: var(--ls-0);
  color: var(--paper);
  font-variant-numeric: tabular-nums;
}
.cp-lp-price-figs span {
  font-family: var(--font-body);
  font-size: var(--fs-3);
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  color: rgba(252, 251, 249, 0.6);
}
/* Conditions de l'offre : discrètes, mais présentes. Un prix annoncé sans ses
   conditions n'est pas un prix annoncé. */
.cp-lp-price .cp-lp-fine {
  margin: var(--e-4) 0 0;
  max-width: 52ch;
  font-family: var(--font-body);
  font-size: var(--fs-3);
  line-height: var(--lh-4);
  color: rgba(252, 251, 249, 0.45);
}
.cp-lp-save {
  margin: var(--e-5) 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-4);
  line-height: var(--lh-4);
  color: var(--copper-lt);
}

/* Repères — lieu, dates, durée, âge.
   La grille de cellules cloisonnées faisait tableau de gare. Ici : pas de
   cadre, une lueur cuivrée en fond comme dans le hero, des filets verticaux
   fins entre les colonnes seulement, et la valeur composée dans la police de
   titrage. Le bloc se lit comme le générique d'une affiche, pas comme un
   tableau de données. */
.cp-lp-reperes {
  background:
    radial-gradient(
      120% 140% at 50% 0%,
      rgba(151, 124, 89, 0.16),
      transparent 62%
    ),
    var(--ink);
  border-top: 1px solid rgba(183, 154, 114, 0.22);
  border-bottom: 1px solid rgba(183, 154, 114, 0.22);
  padding: var(--e-11) var(--ef-3);
}
.cp-lp-reperes dl {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--e-9) 0;
  margin: 0;
}
.cp-lp-reperes dl > div {
  padding: 0 var(--ef-2);
  border-left: 1px solid rgba(183, 154, 114, 0.28);
}
/* Première colonne de chaque rangée : pas de filet, sinon le bloc se referme
   sur lui-même comme un cadre. */
.cp-lp-reperes dl > div:nth-child(2n + 1) {
  border-left: 0;
  padding-left: 0;
}
.cp-lp-reperes dt {
  font-family: var(--font-body);
  font-size: var(--fs-1);
  font-weight: 600;
  letter-spacing: var(--ls-5);
  text-transform: uppercase;
  color: var(--copper-lt);
  margin-bottom: var(--e-4);
}
.cp-lp-reperes dd {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--fs-sub);
  line-height: var(--lh-2);
  letter-spacing: var(--ls-0);
  text-transform: uppercase;
  color: var(--paper);
}

/* Section spectacle : affiche et texte côte à côte */
.cp-lp-split {
  display: grid;
  gap: var(--e-9);
}
/* Affiche : même comportement que les photos de la galerie — filet en retrait
   (hérité de .cp-framed), léger zoom au survol, pastille « Agrandir ». */
.cp-lp-poster {
  margin: 0;
}
.cp-lp-poster .ph-btn {
  display: block;
  position: relative;
  width: 100%;
  padding: 0;
  margin: 0;
  border: 0;
  border-radius: 0;
  background: none;
  overflow: hidden;
  cursor: zoom-in;
  color: inherit;
  font: inherit;
}
.cp-lp-poster .ph {
  width: 100%;
  height: auto;
  display: block;
  transition: transform 0.6s var(--ease);
}
.cp-lp-poster .ph-btn:hover .ph,
.cp-lp-poster .ph-btn:focus-visible .ph {
  transform: scale(1.035);
}
.cp-lp-poster .ph-overlay {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  background: rgba(13, 12, 11, 0.86);
  border: 1px solid rgba(183, 154, 114, 0.6);
  color: #e9e2d6;
  font-family: var(--font-body);
  font-size: var(--fs-2);
  font-weight: 600;
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  padding: var(--e-4) var(--e-6);
  opacity: 0;
  transition: opacity 0.35s var(--ease);
  pointer-events: none;
  z-index: 3;
}
.cp-lp-poster .ph-btn:hover .ph-overlay,
.cp-lp-poster .ph-btn:focus-visible .ph-overlay {
  opacity: 1;
}

/* Bouton secondaire : même mécanique de survol, contour plus discret au repos
   pour que « En savoir plus » ne rivalise pas avec « Réserver ». */
.cp-lp-body .btn-reserve.is-ghost {
  border-color: rgba(133, 104, 74, 0.4);
}

/* Accordéons : contenu et carte */
.cp-lp-acc .body {
  max-width: 66ch;
}
.cp-lp-map {
  margin-top: var(--e-7);
}
.cp-lp-map iframe {
  width: 100%;
  height: 320px;
  border: 1px solid var(--copper-hair);
  display: block;
}
.cp-lp-maploader {
  appearance: none;
  cursor: pointer;
  width: 100%;
  min-height: 84px;
  border: 1px dashed var(--copper-hair-strong);
  background: transparent;
  color: var(--copper);
  font-family: var(--font-body);
  font-size: var(--fs-3);
  font-weight: 600;
  letter-spacing: var(--ls-3);
  text-transform: uppercase;
  transition:
    border-color 0.25s var(--ease),
    color 0.25s var(--ease);
}
.cp-lp-maploader:hover {
  border-color: var(--copper);
  color: var(--ink);
}
.cp-lp-mapnote {
  margin-top: var(--e-4);
  font-size: var(--fs-3);
  line-height: var(--lh-4);
  color: var(--ink-soft);
}
.cp-lp-mapnote a {
  color: var(--copper);
  border-bottom: 1px solid var(--copper-hair-strong);
}

/* La galerie de la landing est sur fond nuit : les titres de .gallery du site
   sont prévus pour un fond clair. */
.cp-lp-sec.gallery .gg {
  margin-top: var(--e-9);
}

/* Médias — bande identique à celle de la page d'accueil. La landing n'hérite
   pas du .container du site, d'où la gouttière rappelée ici. */
.cp-lp-partners {
  padding: var(--ef-4) var(--ef-3);
}

/* Chiffres de l'offre */ /* Chiffres de l'offre */
.cp-lp-figs {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--e-1);
  background: var(--copper-hair);
  border: 1px solid var(--copper-hair);
  margin-bottom: var(--e-9);
}
.cp-lp-fig {
  background: var(--paper);
  padding: var(--e-7) var(--e-9);
}
.on-night .cp-lp-fig {
  background: var(--ink);
}
.cp-lp-fig b {
  display: block;
  font-family: var(--font-display);
  font-size: var(--fs-h3);
  font-weight: 500;
  line-height: var(--lh-0);
  letter-spacing: var(--ls-0);
  color: var(--copper);
}
.on-night .cp-lp-fig b {
  color: var(--copper-lt);
}
.cp-lp-fig span {
  display: block;
  margin-top: var(--e-4);
  font-size: var(--fs-3);
  line-height: var(--lh-3);
  letter-spacing: var(--ls-2);
  text-transform: uppercase;
  color: var(--ink-soft);
}
.on-night .cp-lp-fig span {
  color: rgba(252, 251, 249, 0.55);
}

/* Réassurance pratique */
.cp-lp-facts {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
}
.cp-lp-facts li {
  padding: var(--e-7) 0;
  border-bottom: 1px solid var(--copper-hair);
  font-family: var(--font-body);
  font-size: var(--fs-5);
  line-height: var(--lh-4);
  color: var(--ink-soft);
}
.cp-lp-facts strong {
  display: block;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-3);
  font-size: var(--fs-2);
  color: var(--copper);
  margin-bottom: var(--e-2);
}

/* Avis */
.cp-lp-avis {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--e-7);
}
.cp-lp-avis figure {
  margin: 0;
  padding: var(--e-7) var(--e-9);
  border: 1px solid var(--copper-hair);
  background: var(--paper);
}
.cp-lp-avis blockquote {
  margin: 0;
}
.cp-lp-avis blockquote p {
  font-family: var(--font-body);
  font-size: var(--fs-5);
  line-height: var(--lh-4);
  color: var(--ink);
}
.cp-lp-avis figcaption {
  margin-top: var(--e-5);
  font-size: var(--fs-2);
  letter-spacing: var(--ls-3);
  text-transform: uppercase;
  color: var(--copper);
}

/* FAQ et accordéons — <details> natif, aucun JavaScript.
   En cartes filetées plutôt qu'en lignes : sur une page publicitaire, la FAQ
   est le dernier obstacle avant le paiement, elle doit se cliquer sans viser.
   Chaque question est une cible de 60 px de haut, avec un signe + encadré. */
.cp-lp-faq {
  border: 1px solid var(--copper-hair);
  background: var(--paper);
  margin-bottom: var(--e-4);
  transition: border-color 0.25s var(--ease);
}
.cp-lp-faq:hover,
.cp-lp-faq[open] {
  border-color: var(--copper-hair-strong);
}
.cp-lp-faq summary {
  cursor: pointer;
  list-style: none;
  position: relative;
  display: flex;
  align-items: center;
  min-height: 62px;
  padding: var(--e-5) var(--e-12) var(--e-5) var(--ef-1);
  font-family: var(--font-body);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: var(--ls-0);
  line-height: var(--lh-2);
  color: var(--ink);
}
.cp-lp-faq summary::-webkit-details-marker {
  display: none;
}
/* Le + est dessiné dans un carré cuivré : deux traits, celui du haut
   disparaît à l'ouverture. */
.cp-lp-faq summary::after,
.cp-lp-faq summary::before {
  content: "";
  position: absolute;
  background: var(--copper);
  transition:
    opacity 0.25s var(--ease),
    transform 0.25s var(--ease);
}
.cp-lp-faq summary::after {
  right: clamp(16px, 4vw, 24px);
  top: 50%;
  width: 13px;
  height: 1.5px;
  transform: translateY(-50%);
}
.cp-lp-faq summary::before {
  right: calc(clamp(16px, 4vw, 24px) + 5.75px);
  top: 50%;
  width: 1.5px;
  height: 13px;
  transform: translateY(-50%);
}
.cp-lp-faq[open] summary::before {
  opacity: 0;
  transform: translateY(-50%) rotate(90deg);
}
.cp-lp-faq summary:focus-visible {
  outline: 2px solid var(--copper);
  outline-offset: -2px;
}
.cp-lp-faq > .body,
.cp-lp-faq .cp-lp-acc {
  padding: 0 var(--ef-1) var(--e-7);
  max-width: 66ch;
  color: var(--ink-soft);
}
.cp-lp-faq .cp-lp-acc .body {
  color: var(--ink-soft);
}
/* Sur fond nuit (si une section sombre en contient) */
.on-night .cp-lp-faq {
  background: var(--ink);
  border-color: rgba(183, 154, 114, 0.28);
}
.on-night .cp-lp-faq summary {
  color: var(--paper);
}
.on-night .cp-lp-faq > .body,
.on-night .cp-lp-faq .cp-lp-acc .body {
  color: rgba(252, 251, 249, 0.72);
}

/* Rappel final */
.cp-lp-final {
  text-align: center;
}
.cp-lp-final .body {
  /* La largeur de lecture est bornée à 62ch plus haut : sans marges auto, le
     bloc reste collé à gauche dans une section pourtant centrée. */
  margin-left: auto;
  margin-right: auto;
}

/* Barre fixe : reprend § 20, sans le calendrier. */
.cp-lp-sticky .cp-stickybar-inner {
  max-width: 960px;
}
.cp-lp-sticky .lbl {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-3);
  font-weight: 600;
  letter-spacing: var(--ls-2);
  text-transform: uppercase;
  color: var(--paper);
}
.cp-lp-sticky .prc {
  display: block;
  margin-top: var(--e-1);
  font-size: var(--fs-3);
  letter-spacing: var(--ls-1);
  color: var(--copper-lt);
}
.cp-lp-sticky .btn-reserve {
  padding: var(--e-6) var(--e-8);
}

@media (min-width: 700px) {
  .cp-lp-figs {
    grid-template-columns: repeat(3, 1fr);
  }
  .cp-lp-facts {
    grid-template-columns: 1fr 1fr;
    column-gap: var(--e-11);
  }
  .cp-lp-avis {
    grid-template-columns: repeat(3, 1fr);
  }
  .cp-lp-reperes dl {
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 0;
  }
  .cp-lp-reperes dl > div:nth-child(2n + 1) {
    border-left: 1px solid rgba(183, 154, 114, 0.28);
    padding-left: var(--ef-2);
  }
  .cp-lp-reperes dl > div:first-child {
    border-left: 0;
    padding-left: 0;
  }
  .cp-lp-split {
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    gap: var(--e-11);
    align-items: center;
  }
}

/* ==== § 38 — RÉSEAUX SOCIAUX ====
   Une seule rangée, réutilisée par le pied de page du site et par celui des
   landings. Pictogrammes SVG inline : aucune police d'icônes à charger. */

.cp-socials {
  display: flex;
  flex-wrap: wrap;
  gap: var(--e-5);
  list-style: none;
  margin: var(--e-7) 0 0;
  padding: 0;
}
.cp-socials a {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid rgba(183, 154, 114, 0.35);
  color: var(--copper-lt);
  transition:
    border-color 0.25s var(--ease),
    color 0.25s var(--ease),
    background 0.25s var(--ease);
}
.cp-socials a:hover {
  border-color: var(--copper-lt);
  background: rgba(183, 154, 114, 0.12);
  color: #fff;
}
.cp-socials-lp {
  justify-content: center;
  margin-bottom: var(--e-7);
}

/* Liens légaux du pied de page des landings.
   .cp-legal-list est une liste en flex : sans justify-content, elle reste
   collée à gauche même dans un pied de page centré, le text-align du parent
   n'ayant aucun effet sur des éléments flex. */
.cp-lp-legal .cp-legal {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--e-3) 0;
  margin-top: var(--e-4);
}
.cp-lp-legal .cp-legal-list {
  justify-content: center;
}
/* Ces liens suivent le pied de page du site : pas de filet sous le texte,
   la couleur au survol suffit. */
.cp-lp-legal .cp-legal-list a {
  border-bottom: 0;
  color: rgba(233, 226, 214, 0.6);
}
.cp-lp-legal .cp-legal-list a:hover {
  color: var(--copper-lt);
}

/* ==== § 39 — AVIS GOOGLE SUR LES LANDINGS ====
   Le texte des avis est affiché tel quel, comme l'imposent les conditions de
   l'API Places. Le rôle du style est donc de le rendre lisible, pas de le
   mettre en scène : citations sobres, auteur et ancienneté en petit. */

.cp-lp-note {
  display: flex;
  align-items: baseline;
  gap: var(--e-4);
  margin: 0 0 var(--e-9);
  font-family: var(--font-body);
  font-size: var(--fs-4);
  letter-spacing: var(--ls-1);
  color: var(--ink-soft);
}
.cp-lp-note b {
  font-family: var(--font-display);
  font-size: var(--fs-8); /* charte-ok: chiffre de mention, pas du texte courant */
  font-weight: 500;
  line-height: var(--lh-0);
  color: var(--ink);
}
.cp-lp-note span {
  color: var(--copper);
}

.cp-lp-avis {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0;
  border-top: 1px solid var(--copper-hair);
}
.cp-lp-avis figure + figure {
  border-top: 1px solid var(--copper-hair);
}
.cp-lp-avis figure {
  margin: 0;
  padding: var(--e-7) 0;
  background: var(--beige);
}
.cp-lp-avis blockquote {
  margin: 0;
  font-family: var(--font-accent);
  font-size: var(--fs-sub);
  line-height: var(--lh-3);
  color: var(--ink);
}
.cp-lp-avis figcaption {
  display: flex;
  align-items: center;
  gap: var(--e-4);
  margin-top: var(--e-5);
}
.cp-lp-avis figcaption img {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  object-fit: cover;
  flex: none;
}
.cp-lp-avis figcaption b {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-2);
  font-weight: 600;
  letter-spacing: var(--ls-3);
  text-transform: uppercase;
  color: var(--ink);
}
.cp-lp-avis figcaption em {
  font-style: normal;
  font-size: var(--fs-3);
  color: var(--ink-soft);
}
/* État avant connexion de l'API : visible des seuls administrateurs. Un cadre
   pointillé, pour qu'on ne confonde jamais ce bloc avec du contenu publié. */
.cp-lp-avis-setup {
  border: 1px dashed var(--copper-hair-strong);
  padding: var(--e-7) var(--e-9);
  max-width: 62ch;
}
.cp-lp-avis-setup p {
  margin: 0 0 var(--e-4);
  font-family: var(--font-body);
  font-size: var(--fs-4);
  line-height: var(--lh-4);
  color: var(--ink-soft);
}
.cp-lp-avis-setup p:last-child {
  margin-bottom: 0;
}
.cp-lp-avis-setup b {
  color: var(--ink);
}
.cp-lp-avis-setup a {
  color: var(--copper);
  border-bottom: 1px solid var(--copper-hair-strong);
}

.cp-lp-avis-src {
  margin: var(--e-7) 0 0;
  font-size: var(--fs-3);
}
.cp-lp-avis-src a {
  color: var(--copper);
  border-bottom: 1px solid var(--copper-hair-strong);
}

@media (min-width: 760px) {
  .cp-lp-avis {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    border-bottom: 1px solid var(--copper-hair);
  }
  .cp-lp-avis figure + figure {
    border-top: 0;
    border-left: 1px solid var(--copper-hair);
  }
  .cp-lp-avis figure {
    padding: var(--e-9) var(--e-7);
  }
  .cp-lp-avis figure:first-child {
    padding-left: 0;
  }
  .cp-lp-avis figure:last-child {
    padding-right: 0;
  }
  .cp-lp-avis figure {
    padding-left: var(--e-9);
    padding-right: var(--e-9);
  }
  .cp-lp-avis figure:first-child {
    padding-left: 0;
  }
  .cp-lp-avis figure:last-child {
    padding-right: 0;
  }
}

/* ==========================================================================
   Dégagement sous le menu fixe — gabarit « pleine largeur (Gutenberg) »
   --------------------------------------------------------------------------
   .cp-canvas a un padding-top nul : c'est voulu pour les pages qui s'ouvrent
   sur un hero pleine hauteur, dont le fond doit remonter derrière le menu.
   Mais une page qui commence par une section ordinaire passe alors SOUS le
   menu et son eye-brow disparaît (cas de la page FAQ).

   On rend donc le dégagement au premier bloc, sauf s'il s'agit d'un hero.
   !important est nécessaire : Gutenberg écrit le padding en style en ligne,
   qui l'emporterait sinon sur la feuille de styles.
   ========================================================================== */
.cp-canvas
  > :first-child:not(.wp-block-cover):not(.cp-hero-slideshow):not(.cp-hero) {
  padding-top: var(--ef-6) !important;
}

/* ==========================================================================
   Liens dans le contenu composé en blocs
   --------------------------------------------------------------------------
   .cp-content soulignait déjà ses liens ; .cp-canvas, non. Les liens des
   pages en blocs étaient donc indiscernables du texte courant.

   Au repos, le lien garde la couleur du texte qui l'entoure et ne se signale
   que par un filet cuivre : la règle vaut ainsi sur fond ivoire, sable ou
   nuit, sans jamais poser de problème de contraste. Au survol, le texte
   passe au cuivre clair et le filet s'épaissit. Ce cuivre clair est celui
   déjà employé pour les liens du pied de page sur fond nuit : il tient sur
   les deux familles de fond.
   ========================================================================== */
.cp-canvas :is(p, li, dd, td, figcaption) a:not(.wp-element-button):not(.cp-tour-book):not(.btn):not(.arrow) {
  color: inherit;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-decoration-color: var(--copper-hair-strong);
  text-underline-offset: 0.22em;
  transition:
    color 0.3s var(--ease),
    text-decoration-color 0.3s var(--ease),
    text-decoration-thickness 0.3s var(--ease);
}
.cp-canvas :is(p, li, dd, td, figcaption) a:not(.wp-element-button):not(.cp-tour-book):not(.btn):not(.arrow):hover,
.cp-canvas :is(p, li, dd, td, figcaption) a:not(.wp-element-button):not(.cp-tour-book):not(.btn):not(.arrow):focus-visible {
  color: var(--copper-lt);
  text-decoration-color: var(--copper-lt);
  text-decoration-thickness: 2px;
}

/* Le fil d'Ariane est un repère de navigation, pas un lien de lecture.
   Il est toujours le premier paragraphe de la première section : on le
   reconnaît à sa position, ce qui évite d'avoir à poser une classe sur
   chaque page. La classe .cp-breadcrumb reste reconnue si elle est là. */
.cp-canvas > :first-child > p:first-child a,
.cp-canvas
  > :first-child
  :is(.wp-block-group__inner-container, .wp-block-cover__inner-container)
  > p:first-child
  a,
.cp-canvas .cp-breadcrumb a,
.cp-canvas .eyebrow a,
.cp-canvas .wp-block-buttons a {
  color: inherit;
  text-decoration: none;
  text-decoration-thickness: 1px;
}
.cp-canvas > :first-child > p:first-child a:hover,
.cp-canvas
  > :first-child
  :is(.wp-block-group__inner-container, .wp-block-cover__inner-container)
  > p:first-child
  a:hover,
.cp-canvas .cp-breadcrumb a:hover,
.cp-canvas .eyebrow a:hover {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 0.22em;
}

@media (prefers-reduced-motion: reduce) {
  .cp-canvas :is(p, li, dd, td, figcaption) a:not(.wp-element-button):not(.cp-tour-book):not(.btn):not(.arrow) {
    transition: none;
  }
}

/* ==========================================================================
   § 38 — TOILE GUTENBERG : RESPIRATION LATÉRALE
   --------------------------------------------------------------------------
   .cp-canvas > .alignfull annulait tout padding horizontal, et les sections
   composées en blocs n'en déclarent pas : entre 1240 px et 1400 px de large,
   le texte venait donc toucher les bords de l'écran. Le fond reste bord à
   bord, seul le contenu se décolle.
   ========================================================================== */
.cp-canvas > .alignfull {
  padding-left: var(--ef-3);
  padding-right: var(--ef-3);
}

/* ==========================================================================
   § 39 — PHOTOS ENCADRÉES DANS LA TOILE
   --------------------------------------------------------------------------
   Trois corrections d'un seul tenant.

   1. Le filet n'englobe plus la légende. WordPress place la légende DANS le
      <figure>, donc dans le cadre. La figure passe en grille : la photo et le
      filet occupent la même cellule, la légende descend dans la suivante.

   2. Le filet est visible sur une photo claire comme sur une photo sombre :
      filet blanc doublé d'une ombre cuivre vers l'intérieur.

   3. Survol : la photo avance légèrement, comme dans la galerie de l'accueil.
      L'effet est désactivé lorsqu'une légende est présente, car l'image
      agrandie déborderait sur elle. Pour conserver le survol ET une légende,
      écrivez la légende dans un paragraphe placé sous l'image plutôt que dans
      le champ « Légende » de la médiathèque.
   ========================================================================== */
.cp-canvas figure.cp-framed {
  display: grid;
  grid-template-columns: 1fr;
  position: relative;
  margin: 0;
  overflow: hidden;
}
.cp-canvas figure.cp-framed > img {
  grid-area: 1 / 1;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s var(--ease);
}
.cp-canvas figure.cp-framed::after {
  content: "";
  /* IMPÉRATIF : le §29 déclare position:absolute sur ce même pseudo-élément.
     Sans ces deux lignes, le cadre reste positionné par rapport à la figure
     entière (légende comprise) et grid-area est purement ignoré. */
  position: static;
  inset: auto;
  grid-area: 1 / 1;
  margin: var(--e-4);
  border: 1px solid rgba(252, 251, 249, 0.5);
  box-shadow: inset 0 0 0 1px rgba(133, 104, 74, 0.2);
  pointer-events: none;
  z-index: 1;
}
/* La marge haute de la légende absorbe le débordement de la photo agrandie :
   30 px couvrent 1,25 % d'une image allant jusqu'à 2 400 px de haut. */
.cp-canvas figure.cp-framed > figcaption {
  grid-area: 2 / 1;
  margin: var(--e-9) 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-3);
  line-height: var(--lh-3);
  color: var(--ink-soft);
}
.cp-canvas figure.cp-framed:hover > img,
.cp-canvas figure.cp-framed:focus-within > img {
  transform: scale(1.025);
}
@media (prefers-reduced-motion: reduce) {
  .cp-canvas figure.cp-framed > img {
    transition: none;
  }
  .cp-canvas figure.cp-framed:hover > img {
    transform: none;
  }
}

/* Affiche ou visuel qu'il ne faut pas rogner : la photo est contenue dans sa
   boîte au lieu d'être recadrée, sur un fond nuit qui absorbe les marges. */
.cp-canvas figure.cp-poster {
  background: var(--night);
}
.cp-canvas figure.cp-poster > img {
  object-fit: contain;
}

/* ==========================================================================
   § 40 — FILET DE RESPIRATION ENTRE DEUX SOUS-PARTIES
   --------------------------------------------------------------------------
   Un trait pleine largeur découpe la page en tranches et alourdit la lecture.
   Ici, un court filet cuivre aligné à gauche : il ponctue sans séparer, dans
   le même vocabulaire que le filet sous les eye-brows.
   ========================================================================== */
.cp-canvas hr.cp-rule-short {
  width: 48px;
  height: 1px;
  border: 0;
  background: var(--copper);
  opacity: 1;
  margin: var(--ef-3) auto var(--ef-2) 0;
}

/* ==========================================================================
   § 41 — RÉVÉLATION AU DÉFILEMENT DANS LA TOILE GUTENBERG
   --------------------------------------------------------------------------
   Le §8 fournit déjà .reveal, mais il faut poser la classe à la main sur
   chaque bloc : inutilisable depuis l'éditeur. Ici, le JavaScript marque
   lui-même les enfants directs de chaque section pleine largeur.

   La classe est POSÉE PAR LE JAVASCRIPT, jamais écrite dans le contenu :
   si le script échoue ou ne se charge pas, rien n'est masqué et la page
   reste entièrement lisible. C'est la seule façon sûre de cacher du
   contenu au chargement.
   ========================================================================== */
.cp-rv {
  opacity: 0;
  transform: translateY(24px);
  transition:
    opacity 0.9s var(--ease),
    transform 0.9s var(--ease);
  will-change: opacity, transform;
}
.cp-rv.is-in {
  opacity: 1;
  transform: none;
  will-change: auto;
}
@media (prefers-reduced-motion: reduce) {
  .cp-rv,
  .cp-rv.is-in {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ==========================================================================
   § 42 — COORDONNÉES DANS LE PIED DE PAGE
   --------------------------------------------------------------------------
   Placées sous le logo, avant les réseaux : c'est l'information la plus
   cherchée en bas de page, avant les liens de navigation.
   ========================================================================== */
.foot .cp-foot-contact {
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
  margin: var(--e-7) 0 var(--e-8);
  font-family: var(--font-body);
  font-style: normal;
  font-size: var(--fs-4);
  line-height: var(--lh-3);
  color: rgba(255, 255, 255, 0.6);
}
.foot .cp-foot-contact .cp-foot-lieu {
  font-weight: 600;
  color: rgba(255, 255, 255, 0.82);
}
.foot .cp-foot-contact a {
  color: rgba(255, 255, 255, 0.6);
  text-decoration: none;
  transition: color 0.3s var(--ease);
}
.foot .cp-foot-contact a:hover,
.foot .cp-foot-contact a:focus-visible {
  color: #fff;
}
/* Quatre colonnes tiennent mal en dessous de 1100 px : on passe à deux,
   puis à une seule sur téléphone. */
@media (max-width: 1100px) {
  .foot .top {
    grid-template-columns: 1fr 1fr;
    gap: var(--e-9);
  }
}
@media (max-width: 640px) {
  .foot .top {
    grid-template-columns: 1fr;
  }
}

/* ==========================================================================
   § 43 — LE CHAPITEAU : BANDEAU PLEINE LARGEUR
   --------------------------------------------------------------------------
   La photo passe en bandeau bord à bord, au-dessus des textes, et l'entrée
   vers la visite 360° se déplace au centre : posé en bas, le bouton se lisait
   comme une légende, pas comme une porte.

   La hauteur est bornée à 62 % de l'écran. Sans borne, une photo panoramique
   occuperait 800 px sur un écran courant : le visiteur enchaînerait deux
   pleines pages d'image après le hero, sans une ligne de texte.
   ========================================================================== */
.cp-lieu-wide {
  padding-left: 0;
  padding-right: 0;
  /* Le padding haut de .sec — jusqu'à 168 px — insérait une bande de fond
     au-dessus de l'image. Une image censée occuper toute la largeur doit
     toucher le haut de sa section, sinon elle flotte dans un cadre. */
  padding-top: 0;
}
.cp-lieu-media {
  position: relative;
  display: block;
  width: 100%;
  max-height: 62vh;
  overflow: hidden;
  margin: 0 0 var(--ef-3);
  background: var(--night);
}
.cp-lieu-img {
  display: block;
  width: 100%;
  height: 100%;
  max-height: 62vh;
  object-fit: cover;
  transition: transform 0.8s var(--ease);
}
/* Filet en retrait, comme sur les autres médias du site. */
.cp-lieu-media::after {
  content: "";
  position: absolute;
  inset: 14px;
  border: 1px solid rgba(252, 251, 249, 0.34);
  pointer-events: none;
  z-index: 2;
}

/* Entrée vers la visite : au centre, sur un voile qui se lève au survol. */
.cp-lieu-link .cp-lieu-cta {
  position: absolute;
  z-index: 3;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  display: inline-flex;
  align-items: center;
  gap: var(--e-5);
  padding: var(--e-6) var(--e-8);
  background: rgba(13, 12, 11, 0.62);
  border: 1px solid var(--copper-lt);
  color: #fff;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-3);
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  white-space: nowrap;
  transition:
    background 0.4s var(--ease),
    border-color 0.4s var(--ease);
}
.cp-lieu-ico {
  display: inline-flex;
  color: var(--copper-lt);
  transition: color 0.4s var(--ease);
}
.cp-lieu-link::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: rgba(13, 12, 11, 0);
  transition: background 0.5s var(--ease);
}
.cp-lieu-link:hover::before,
.cp-lieu-link:focus-visible::before {
  background: rgba(13, 12, 11, 0.3);
}
.cp-lieu-link:hover .cp-lieu-img,
.cp-lieu-link:focus-visible .cp-lieu-img {
  transform: scale(1.03);
}
.cp-lieu-link:hover .cp-lieu-cta,
.cp-lieu-link:focus-visible .cp-lieu-cta {
  background: var(--copper);
  border-color: var(--copper);
}
.cp-lieu-link:hover .cp-lieu-ico,
.cp-lieu-link:focus-visible .cp-lieu-ico {
  color: #fff;
}

/* Textes sous le bandeau : intro à gauche, chiffres à droite. Ils se lisent
   alors comme la légende de l'image, ce qu'ils sont. */
.cp-lieu-body {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  gap: var(--efh-4);
  align-items: start;
  padding-left: var(--ef-3);
  padding-right: var(--ef-3);
}
.cp-lieu-intro .body {
  max-width: 52ch;
}
.cp-lieu-stats {
  margin: 0;
}

@media (max-width: 900px) {
  .cp-lieu-body {
    grid-template-columns: 1fr;
  }
  .cp-lieu-media,
  .cp-lieu-img {
    max-height: 48vh;
  }
  .cp-lieu-link .cp-lieu-cta {
    padding: var(--e-5) var(--e-7);
    font-size: var(--fs-2);
    letter-spacing: var(--ls-3);
  }
}
@media (prefers-reduced-motion: reduce) {
  .cp-lieu-img {
    transition: none;
  }
  .cp-lieu-link:hover .cp-lieu-img {
    transform: none;
  }
}

/* ==========================================================================
   § 44 — CHIFFRES DU CHAPITEAU : EMPILÉS
   --------------------------------------------------------------------------
   En sortant les chiffres du bloc .txt, ils ont perdu la grille à quatre
   colonnes du §26, qui ciblait « #chapiteau .txt dl.stats ». Retombés sur le
   flex générique, ils se répartissaient trois puis un, d'où l'impression de
   désordre.

   Ils s'empilent désormais, séparés par un filet : la colonne de droite se
   lit comme une fiche technique en regard du texte, et le nombre de chiffres
   n'a plus d'incidence sur la mise en page.
   ========================================================================== */
.cp-lieu-body .cp-lieu-stats {
  display: flex;
  flex-direction: column;
  gap: 0;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--copper-hair);
}
.cp-lieu-body .cp-lieu-stats .stat {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--ef-2);
  padding: var(--ef-1) 0;
  border-bottom: 1px solid var(--copper-hair);
  border-left: 0;
}
.cp-lieu-body .cp-lieu-stats dd {
  display: contents;
  margin: 0;
}
/* Le chiffre à gauche, le libellé aligné à droite : l'œil descend la colonne
   des nombres sans être arrêté par des libellés de longueurs inégales. */
.cp-lieu-body .cp-lieu-stats .stat b {
  font-size: var(--fs-h4);
  line-height: var(--lh-0);
}
.cp-lieu-body .cp-lieu-stats .stat span {
  margin-top: 0;
  text-align: right;
  white-space: nowrap;
}

@media (max-width: 900px) {
  .cp-lieu-body .cp-lieu-stats {
    margin-top: var(--ef-2);
  }
}

/* ==========================================================================
   § 45 — CARTES D'OFFRES : MOTIF ÉDITORIAL
   --------------------------------------------------------------------------
   Repris de l'Opéra de Paris, dont les cartes suivent toujours le même
   enchaînement : image, petite catégorie, titre dominant, informations
   grises, lien texte. Aucun accent coloré sur le prix, aucune flèche.

   Ce qui change ici : le titre prend le pas sur le reste, le prix rejoint
   les informations secondaires au lieu de rivaliser avec lui en cuivre, et
   les descriptions occupent la même hauteur pour que les cartes gardent une
   ligne de base commune.
   ========================================================================== */

.offers .ocard .media.cp-framed {
  /* Un cran de plus entre la photo et le texte : c'est cette respiration
     qui fait la différence entre une carte et une vignette. */
  margin-bottom: var(--ef-1);
}

/* Catégorie : discrète, elle annonce sans concurrencer le titre. */
.offers .ocard-eyebrow {
  font-size: var(--fs-1);
  font-weight: 600;
  letter-spacing: var(--ls-5);
  color: var(--copper);
  margin: 0 0 var(--e-4);
}
/* Le filet du sur-titre n'a pas sa place ici : trois filets alignés sous
   trois catégories alourdissent la grille. */
.offers .ocard-eyebrow::after {
  display: none;
}

/* Titre : l'élément dominant de la carte. */
.offers .ocard .h3 {
  font-family: var(--font-display);
  line-height: var(--lh-1);
  letter-spacing: var(--ls-0);
  margin-inline: 0;
}

/* Description : deux lignes réservées, sinon une carte plus courte remonte
   son prix et son lien, et la rangée perd son alignement. */
.offers .ocard .body {
  font-size: var(--fs-4);
  line-height: var(--lh-4);
  color: var(--ink-soft);
  margin-inline: 0;
  min-height: calc(2 * 1.6em);
}

/* Prix : une information, pas une accroche. Il rejoint le gris des lignes
   secondaires plutôt que de disputer le cuivre au lien. */
.offers .ocard-price {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--fs-3);
  letter-spacing: var(--ls-0);
  color: var(--ink-soft);
  margin: 0 0 var(--ef-1);
}

/* Lien : texte souligné, comme les liens de contenu du site. La flèche et
   son trait extensible appartenaient à un autre vocabulaire. */
.offers .ocard-cta {
  margin-top: auto;
  display: inline-block;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-2);
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  color: var(--copper);
  padding-bottom: var(--e-1);
  border-bottom: 1px solid var(--copper-hair-strong);
  transition: border-color 0.35s var(--ease), color 0.35s var(--ease);
}
.offers .ocard-cta .ln {
  display: none;
}
.offers .ocard:hover .ocard-cta,
.offers .ocard:focus-within .ocard-cta {
  color: var(--copper-lt);
  border-bottom-color: var(--copper-lt);
}

@media (max-width: 900px) {
  /* Une carte par ligne : la hauteur réservée n'a plus d'utilité et
     laisserait un blanc sous les descriptions courtes. */
  .offers .ocard .body {
    min-height: 0;
  }
}

/* ==========================================================================
   § 46 — CARTES D'ACTUALITÉ : MÊME MOTIF QUE LES OFFRES
   --------------------------------------------------------------------------
   Le même enchaînement que le §45 : image, date, titre dominant, chapô gris,
   lien texte souligné. Les deux rangées de la page d'accueil se lisaient
   jusqu'ici avec deux vocabulaires différents — titres en Barlow gras d'un
   côté, en Trajan de l'autre, flèche ici, soulignement là.
   ========================================================================== */

.news .ncard .media {
  margin-bottom: var(--ef-1);
}

/* Date : même traitement que la catégorie d'une offre. */
.news .ncard .date {
  font-size: var(--fs-1);
  font-weight: 600;
  letter-spacing: var(--ls-5);
  margin-bottom: var(--e-4);
}

/* Titre : en capitales de labeur du site, comme les cartes d'offres. Les
   titres d'articles sont longs, on réserve donc trois lignes pour que les
   chapôs démarrent tous à la même hauteur. */
.news .ncard .h3 {
  font-family: var(--font-display);
  font-weight: 500;
  line-height: var(--lh-1);
  letter-spacing: var(--ls-0);
  margin-inline: 0;
  min-height: calc(3 * 1.22em);
}

.news .ncard .body {
  font-size: var(--fs-4);
  line-height: var(--lh-4);
  color: var(--ink-soft);
  margin-inline: 0;
  min-height: calc(2 * 1.6em);
}

/* Lien : texte souligné, la flèche appartenait à un autre vocabulaire. */
.news .ncard .ncard-cta {
  margin-top: auto;
  display: inline-block;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-2);
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  color: var(--copper);
  padding-bottom: var(--e-1);
  border-bottom: 1px solid var(--copper-hair-strong);
  transition: border-color 0.35s var(--ease), color 0.35s var(--ease);
}
.news .ncard .ncard-cta .ln {
  display: none;
}
.news .ncard:hover .ncard-cta,
.news .ncard:focus-within .ncard-cta {
  color: var(--copper-lt);
  border-bottom-color: var(--copper-lt);
}

/* Le titre passait au cuivre au survol de la carte, en même temps que le
   lien : deux signaux pour une seule cible. Seul le lien réagit. */
.news .ncard:hover .h3,
.news .ncard .h3 a:hover {
  color: var(--ink);
}

/* Photo : le même avancé discret que partout ailleurs. */
.news .ncard .media img {
  transition: transform 0.6s var(--ease);
}
.news .ncard:hover .media img {
  transform: scale(1.035);
}

@media (max-width: 900px) {
  /* Cartes empilées : les hauteurs réservées laisseraient des blancs. */
  .news .ncard .h3,
  .news .ncard .body {
    min-height: 0;
  }
}
@media (prefers-reduced-motion: reduce) {
  .news .ncard .media img {
    transition: none;
  }
  .news .ncard:hover .media img {
    transform: none;
  }
}

/* ==========================================================================
   § 47 — FRISE CHRONOLOGIQUE DANS LA TOILE
   --------------------------------------------------------------------------
   Ces règles vivaient dans un bloc <style> à même la page. Elles ne
   s'appliquaient qu'à l'éditeur : en ligne, « .cp-canvas p » du §15 compte
   deux sélecteurs contre un seul pour « .cp-frise-year », et l'emportait.
   Les années retombaient donc en gris, à la taille du texte courant.

   Remontées ici et préfixées par .cp-canvas, elles gagnent le duel de
   spécificité. Le bloc <style> de la page peut être supprimé.
   ========================================================================== */

.cp-canvas .cp-frise {
  --frise-gap: clamp(10px, 1.6vw, 26px);
}
.cp-canvas .cp-frise-track {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: var(--frise-gap);
  margin-top: var(--ef-3);
}
.cp-canvas .cp-frise-step {
  min-width: 0;
}
.cp-canvas .cp-frise-rail {
  position: relative;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
}
/* Un seul segment par intervalle : deux segments qui se chevauchent doublent
   l'opacité et donnent l'illusion d'un changement de couleur. */
.cp-canvas .cp-frise-step:not(:last-child) .cp-frise-rail::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  right: calc(-50% - var(--frise-gap));
  height: 1px;
  background: rgba(183, 154, 114, 0.38);
}
.cp-canvas .cp-frise-dot {
  position: relative;
  z-index: 1;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  border: 1px solid rgba(183, 154, 114, 0.85);
  background: #161311;
}
.cp-canvas .cp-frise-year {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--fs-h5);
  line-height: var(--lh-0);
  letter-spacing: var(--ls-0);
  color: var(--copper-lt);
  margin: var(--e-6) 0 var(--e-4);
}
/* Deux lignes réservées : les libellés vont d'un mot à sept, et sans hauteur
   commune la frise se lit en escalier. */
.cp-canvas .cp-frise-label {
  font-family: var(--font-body);
  font-size: var(--fs-3);
  line-height: var(--lh-3);
  letter-spacing: var(--ls-0);
  color: #cfc7ba;
  margin: 0;
  min-height: calc(2 * 1.5em);
}

@media (max-width: 900px) {
  .cp-canvas .cp-frise-track {
    grid-template-columns: none;
    grid-auto-flow: column;
    grid-auto-columns: minmax(158px, 1fr);
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    padding-bottom: var(--e-5);
  }
  .cp-canvas .cp-frise-step {
    scroll-snap-align: start;
  }
  .cp-canvas .cp-frise-label {
    min-height: 0;
  }
}

/* ==========================================================================
   § 48 — EYE-BROW QUI N'EST QU'UN LIEN
   --------------------------------------------------------------------------
   La classe .eyebrow sert à deux choses : annoncer une section, et donner
   aux liens d'appel leurs petites capitales cuivre. Le filet du §2 n'a de
   sens que dans le premier cas ; sous un lien, il produit un trait orphelin
   qui ressemble à une séparation de section.

   Quand l'eye-brow ne contient qu'un lien, on le supprime.
   ========================================================================== */
.eyebrow:has(> a:only-child)::after {
  display: none;
}

/* ==========================================================================
   § 49 — BOUTONS GUTENBERG : COULEURS EXPLICITES
   --------------------------------------------------------------------------
   Dans une page composée en blocs, le §19 ne suffit pas : un bouton placé
   dans un conteneur qui déclare sa couleur de texte — la carte blanche du
   hero, par exemple, avec son style en ligne — hérite de cette couleur au
   lieu de prendre le cuivre. Au repos le texte apparaissait noir, et le
   survol ne le repassait pas au blanc.

   On préfixe donc par .cp-canvas, ce qui suffit à l'emporter.
   ========================================================================== */
.cp-canvas .wp-block-button__link {
  color: var(--copper);
}
.cp-canvas .wp-block-button__link:hover,
.cp-canvas .wp-block-button__link:focus-visible {
  color: #fff;
}

/* Sur fond nuit, le remplissage passe en cuivre clair et le texte en nuit :
   du blanc sur ce cuivre-là tomberait sous le seuil de contraste. */
.cp-canvas .has-night-background-color .wp-block-button__link {
  color: var(--copper-lt);
}
.cp-canvas .has-night-background-color .wp-block-button__link:hover,
.cp-canvas .has-night-background-color .wp-block-button__link:focus-visible {
  color: var(--night);
}

/* ==========================================================================
   § 50 — VISIONNEUSE
   --------------------------------------------------------------------------
   Agrandissement d'une photo avec passage à la suivante. L'agrandissement
   natif de WordPress ne sait pas naviguer d'une image à l'autre : sur une
   grille de onze numéros, il faut refermer et rouvrir onze fois.
   ========================================================================== */

.cp-zoomable {
  cursor: zoom-in;
}
/* Loupe discrète, pour signaler que la photo s'ouvre. */
.cp-zoomable::before {
  content: "";
  position: absolute;
  z-index: 3;
  right: 20px;
  bottom: 20px;
  width: 34px;
  height: 34px;
  border: 1px solid rgba(252, 251, 249, 0.55);
  border-radius: 50%;
  background:
    linear-gradient(currentColor, currentColor) center/13px 1px no-repeat,
    linear-gradient(currentColor, currentColor) center/1px 13px no-repeat;
  color: rgba(252, 251, 249, 0.85);
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 0.35s var(--ease), transform 0.35s var(--ease);
  pointer-events: none;
}
.cp-zoomable:hover::before,
.cp-zoomable:focus-visible::before {
  opacity: 1;
  transform: none;
}
.cp-zoomable:focus-visible {
  outline: 2px solid var(--copper-lt);
  outline-offset: 3px;
}

body.cp-lb-open {
  overflow: hidden; /* la page ne défile plus derrière la visionneuse */
}

.cp-lb {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--ef-1);
  padding: var(--ef-4) var(--ef-3);
  background: rgba(8, 7, 6, 0.94);
}
.cp-lb[hidden] {
  display: none;
}
.cp-lb-fig {
  margin: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-6);
  max-height: 100%;
  min-width: 0;
}
.cp-lb-img {
  display: block;
  max-width: 100%;
  max-height: calc(100vh - 190px);
  width: auto;
  height: auto;
  object-fit: contain;
}
.cp-lb-cap {
  display: flex;
  align-items: baseline;
  gap: var(--e-6);
  font-family: var(--font-body);
  font-size: var(--fs-3);
  letter-spacing: var(--ls-4);
  text-transform: uppercase;
  color: #e9e2d6;
}
.cp-lb-compteur {
  color: var(--copper-lt);
  letter-spacing: var(--ls-2);
}

/* Commandes : cercles sobres, chevrons et croix dessinés en CSS. */
.cp-lb button {
  position: relative;
  flex: 0 0 auto;
  width: 46px;
  height: 46px;
  padding: 0;
  border: 1px solid rgba(183, 154, 114, 0.5);
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
  transition: background 0.3s var(--ease), border-color 0.3s var(--ease);
}
.cp-lb button:hover,
.cp-lb button:focus-visible {
  background: rgba(183, 154, 114, 0.16);
  border-color: var(--copper-lt);
}
.cp-lb button:focus-visible {
  outline: 2px solid var(--copper-lt);
  outline-offset: 3px;
}
.cp-lb button::before,
.cp-lb button::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  background: #e9e2d6;
}
.cp-lb-prev::before,
.cp-lb-next::before {
  width: 10px;
  height: 10px;
  background: transparent;
  border-left: 1.5px solid #e9e2d6;
  border-top: 1.5px solid #e9e2d6;
}
.cp-lb-prev::before {
  transform: translate(-35%, -50%) rotate(-45deg);
}
.cp-lb-next::before {
  transform: translate(-65%, -50%) rotate(135deg);
}
.cp-lb-prev::after,
.cp-lb-next::after {
  display: none;
}
.cp-lb-close {
  position: absolute;
  top: clamp(14px, 3vh, 28px);
  right: clamp(14px, 3vw, 32px);
}
.cp-lb-close::before,
.cp-lb-close::after {
  width: 16px;
  height: 1.5px;
}
.cp-lb-close::before {
  transform: translate(-50%, -50%) rotate(45deg);
}
.cp-lb-close::after {
  transform: translate(-50%, -50%) rotate(-45deg);
}

@media (max-width: 700px) {
  /* Les flèches passent sous la photo : à côté, elles ne laissent plus
     assez de largeur à l'image sur un téléphone. */
  .cp-lb {
    flex-wrap: wrap;
    align-content: center;
  }
  .cp-lb-fig {
    order: 1;
    flex: 1 0 100%;
  }
  .cp-lb-prev {
    order: 2;
  }
  .cp-lb-next {
    order: 3;
  }
  .cp-lb-img {
    max-height: calc(100vh - 250px);
  }
}
@media (prefers-reduced-motion: reduce) {
  .cp-zoomable::before {
    transition: none;
  }
}

/* ==========================================================================
   § 51 — TOURNÉE : DEUX CORRECTIONS
   ========================================================================== */

/* L'eye-brow de la tournée est en inline-flex pour aligner son épingle avec
   le texte. Le filet du §2, en display:block, devenait de ce fait un
   troisième élément de la rangée et se plaçait à droite du libellé. La
   grille lui rend sa ligne. */
.cp-tour-eyebrow {
  display: inline-grid;
  grid-template-columns: auto auto;
  align-items: center;
  column-gap: var(--e-4);
}
.cp-tour-eyebrow::before {
  grid-row: 1;
  grid-column: 1;
}
/* Sélecteur renforcé : plusieurs règles de centrage ciblent « .center
   .eyebrow::after » et pèsent deux classes ; on ne prend pas le risque
   d'être devancé sur les marges. */
.cp-tour-head .cp-tour-eyebrow::after {
  grid-row: 2;
  grid-column: 1 / -1;
  justify-self: start;
}

/* Le soulignement des liens de contenu est écarté à la source, dans le §40.
   Une surcharge ne pouvait pas l'emporter : « .cp-canvas :is(...) a:not() »
   compte deux classes et deux éléments une fois :is() et :not() pris en
   compte, soit davantage que « .cp-canvas .cp-tour-book ». C'est ce calcul
   que j'avais manqué en 2.89.0. */

/* ==========================================================================
   § 52 — CROIX DE FERMETURE DU MÉGA-MENU
   --------------------------------------------------------------------------
   Le panneau se refermait déjà par le voile, la touche Échap ou un second
   clic sur la rubrique. Rien ne le disait : sur un panneau qui couvre la
   moitié de l'écran, l'absence de croix laisse chercher.
   ========================================================================== */
.cp-mega-close {
  position: absolute;
  z-index: 3;
  top: clamp(16px, 2vw, 26px);
  right: clamp(16px, 3vw, 40px);
  width: 40px;
  height: 40px;
  padding: 0;
  border: 1px solid rgba(183, 154, 114, 0.4);
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
  transition: background 0.3s var(--ease), border-color 0.3s var(--ease);
}
.cp-mega-close::before,
.cp-mega-close::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 14px;
  height: 1px;
  background: rgba(233, 226, 214, 0.75);
  transition: background 0.3s var(--ease);
}
.cp-mega-close::before {
  transform: translate(-50%, -50%) rotate(45deg);
}
.cp-mega-close::after {
  transform: translate(-50%, -50%) rotate(-45deg);
}
.cp-mega-close:hover,
.cp-mega-close:focus-visible {
  background: rgba(183, 154, 114, 0.14);
  border-color: var(--copper-lt);
}
.cp-mega-close:hover::before,
.cp-mega-close:hover::after,
.cp-mega-close:focus-visible::before,
.cp-mega-close:focus-visible::after {
  background: #fff;
}
.cp-mega-close:focus-visible {
  outline: 2px solid var(--copper-lt);
  outline-offset: 2px;
}

/* La croix occupe l'angle : le contenu doit lui laisser la place, sinon un
   titre de colonne passe dessous sur les panneaux les plus larges. */
@media (max-width: 1400px) {
  .cp-mega-inner {
    padding-right: var(--efh-4);
  }
}

/* ==========================================================================
   § 53 — MENU DE SECOURS
   --------------------------------------------------------------------------
   Quand aucun menu n'est assigné à l'emplacement « Menu principal », le thème
   affiche une liste de secours. Les libellés sans page correspondante y sont
   rendus en <span class="link-inactive">, qui n'avait aucun style : ils
   héritaient de la couleur du texte courant, donc du nuit, et devenaient
   illisibles sur la barre sombre.

   Ils prennent la couleur des liens du menu, en plus discret : ils ne sont
   pas cliquables, autant que cela se voie.
   ========================================================================== */
.nav .links .link-inactive {
  font-family: var(--font-body);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-1);
  font-size: var(--fs-5);
  color: rgba(255, 255, 255, 0.42);
  padding: var(--e-3) 0;
  cursor: default;
}

/* Mention discrète, à la place de l'italique.

   Les balises <em> des gabarits ont été remplacées par cette classe : le
   navigateur met <em> en italique par défaut, et retirer la déclaration CSS
   ne suffisait donc pas. La nuance se marque désormais par la couleur et la
   taille, pas par l'inclinaison. */
.mention {
  font-size: var(--fs-4);
  color: var(--ink-soft);
}

/* Aucun italique sur le site public, quelle qu'en soit la source : balise,
   éditeur de blocs, contenu collé depuis Word. */
em,
i,
cite,
address,
.cp-content em,
.cp-content i {
  font-style: normal;
}

/* ==========================================================================
   OFFRES EN CARROUSEL

   Au-delà de trois offres, la grille ne tient plus sur une rangée. La piste
   défile horizontalement, avec accrochage : une carte s'arrête toujours
   alignée sur le bord, jamais coupée en deux.

   Le défilement natif fait le gros du travail — au doigt, à la molette, au
   clavier. Le script n'ajoute que les flèches et les points. Sans lui, la
   piste reste utilisable : c'est la raison pour laquelle les commandes sont
   posées par le script et non écrites dans le gabarit.
   ========================================================================== */

.offers-piste.est-carrousel {
  /*
   * Deux repères, et tout se déduit d'eux.
   *
   *   --piste-marge  la distance entre le bord de l'écran et la colonne de
   *                  contenu, c'est-à-dire là où commence le titre de section
   *   --ef-3         la gouttière laissée à gauche, pour qu'une carte ne soit
   *                  jamais coupée pile au bord de la fenêtre
   *
   * Au repos, la première carte se pose sur --piste-marge : au même niveau
   * que le titre. Dès qu'on fait défiler, elle glisse jusqu'à --ef-3 puis
   * passe dessous.
   *
   * Écrit sans pourcentage, volontairement. Un « 50% » dans une marge se
   * rapporte au conteneur, dont la largeur dépend elle-même du rembourrage
   * de la section : trois valeurs à tenir en tête pour vérifier une ligne.
   * Ici, deux repères nommés suffisent, et --cp-largeur suit déjà le réglage
   * « Largeur du contenu » du Personnalisateur.
   */
  --piste-marge: max(var(--ef-3), calc((100vw - var(--cp-largeur)) / 2));

  /* Même gouttière des deux côtés : la piste s'arrête à la même distance du
     bord gauche et du bord droit. Le débord asymétrique disait le sens de
     lecture, mais il faisait toucher le bord droit à la dernière carte alors
     que la première gardait sa marge — deux traitements pour une même rangée. */
  margin-left: calc(var(--ef-3) - var(--piste-marge));
  margin-right: calc(var(--ef-3) - var(--piste-marge));

  /* Ce qui remet la première carte au niveau du titre. */
  padding-left: calc(var(--piste-marge) - var(--ef-3));
  padding-right: 0;

  overflow-x: auto;
  /*
   * Sans cette ligne, la piste défile aussi VERTICALEMENT.
   *
   * La règle est peu connue : dès qu'un axe passe en « auto », l'autre, resté
   * à « visible », est ramené à « auto » par le navigateur. Un simple
   * overflow-x suffisait donc à créer une seconde barre de défilement, et le
   * moindre débord de hauteur devenait glissable.
   */
  overflow-y: hidden;

  /*
   * « proximity » et non « mandatory ».
   *
   * L'accrochage obligatoire force le navigateur à ramener la piste sur un
   * point d'ancrage après chaque geste. Pendant cette correction, il avale
   * les gestes suivants — y compris VERTICAUX, dès que le doigt effleure la
   * piste. Il fallait alors glisser deux fois pour reprendre la lecture.
   */
  scroll-snap-type: x proximity;

  /* L'accrochage vise le niveau du titre, pas le bord de l'écran. */
  scroll-padding-left: calc(var(--piste-marge) - var(--ef-3));

  /*
   * Le défilement horizontal ne se propage pas à la page, mais le vertical
   * continue de la traverser : contain sur le seul axe en ligne.
   */
  overscroll-behavior-inline: contain;
  overscroll-behavior-block: auto;

  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.offers-piste.est-carrousel::-webkit-scrollbar {
  display: none;
}
/* Pas de contour autour de la piste elle-même.

   Elle porte tabindex="0" pour rester défilable au clavier, et les
   navigateurs appliquent :focus-visible aux zones défilantes même quand le
   focus vient d'un clic ou d'un glissement — la règle dessinait donc un
   grand rectangle cuivre autour de toute la rangée dès qu'on la touchait.

   Le repère au clavier n'est pas perdu : chaque carte porte le sien, et le
   premier élément atteignable en tabulant dans la piste est un bouton
   « Réserver », qui s'entoure. On sait donc où l'on est sans encadrer la
   section entière. */
.offers-piste.est-carrousel:focus,
.offers-piste.est-carrousel:focus-visible {
  outline: none;
}

/* Sélecteur volontairement plus précis que « .offers .grid.offers-grid »,
   qui impose une grille de trois colonnes : à égalité, c'est l'ordre du
   fichier qui trancherait, et il suffirait d'un déplacement de bloc pour que
   la piste redevienne une grille sans qu'on comprenne pourquoi. */
.offers-piste.est-carrousel .grid.offers-grid {
  display: flex;
  gap: var(--efh-2);
  align-items: stretch;
}
/* La piste couvrant tout l'écran, le calcul des 3,5 cartes se fait sur cette
   largeur : les cartes grandissent d'autant. */
/* --------------------------------------------------------------------------
   En carrousel, les réglages de la grille sont neutralisés

   La grille en trois colonnes impose « aspect-ratio: 3/4 » aux visuels — un
   format portrait hérité d'une rangée d'affiches. En piste défilante, il
   donne des cartes deux fois plus hautes que larges : la section s'étire, et
   la piste finit par déborder verticalement, au point qu'on peut y faire
   défiler de haut en bas sans le vouloir.

   Ces sélecteurs sont volontairement plus précis que ceux de la grille —
   .offers .grid.offers-grid .ocard .media compte cinq classes, ceux-ci en
   comptent six. Une tentative précédente en comptait quatre : elle perdait
   silencieusement, et le format portrait revenait sans qu'on comprenne
   pourquoi la règle « ne marchait pas ».
   -------------------------------------------------------------------- */

/*
 * Largeur d'une carte : trois et demie entre le titre et le bord droit.
 *
 * Cette règle avait disparu lors d'une réécriture de bloc, et rien ne la
 * remplaçait : les cartes retombaient sur « flex: 0 0 auto » et se
 * dimensionnaient chacune sur son contenu. Celles qui portaient une grande
 * image devenaient larges, celles qui n'en avaient pas restaient étroites —
 * d'où une rangée aux cartes inégales.
 *
 * Le sélecteur compte six classes, comme celui des visuels : la grille en
 * trois colonnes en aligne cinq, et gagnerait autrement.
 *
 * Plafonnée à 460 px : au-delà, une carte d'offre devient une affiche. Sur
 * les très grands écrans, c'est le NOMBRE de cartes visibles qui augmente,
 * pas leur taille.
 */
.offers-piste.est-carrousel .grid.offers-grid .ocard {
  flex: 0 0 min(
    calc((100vw - var(--piste-marge) - var(--ef-3) - 3 * var(--efh-2)) / 3.5),
    460px
  );
  /* Les cartes ont la même largeur ; cette ligne leur donne la même HAUTEUR,
     pour que les liens « Voir l'offre » s'alignent d'une carte à l'autre. */
  align-self: stretch;
  scroll-snap-align: start;
}

.offers-piste.est-carrousel .grid.offers-grid .ocard .media,
.offers-piste.est-carrousel .grid.offers-grid .ocard .media.cp-framed,
.offers-piste.est-carrousel .grid.offers-grid .ocard img.media {
  /*
   * 4/5, et non 4/3.
   *
   * Les visuels d'offres sont des affiches VERTICALES. En 4/3, le recadrage
   * au centre tranchait le titre en haut et les dates en bas : « PACK FAMILLE
   * −40 % » se lisait « PACK FAMILLE », amputé de son argument.
   *
   * Quatre rapports ont été comparés sur l'affiche réelle. En 1/1 les dates
   * partent encore ; en 3/4 tout tient mais la carte atteint 525 px et la
   * rangée devient un mur. En 4/5, le titre et les dates sont là, et la carte
   * reste à 497 px.
   *
   * La vraie solution reste des visuels cadrés pour ce format. Celle-ci fait
   * au mieux avec des affiches conçues pour un mur.
   */
  aspect-ratio: 4 / 5;
  margin-bottom: var(--e-7);
  overflow: hidden;
}
.offers-piste.est-carrousel .grid.offers-grid .ocard .media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/*
 * En carrousel, la description disparaît.
 *
 * Une carte portait cinq éléments — sur-titre, titre, description, prix,
 * lien — quand la référence en porte deux. Dans une rangée où l'on voit trois
 * cartes et demie, on ne lit pas cinq lignes par carte : on balaie, on repère
 * un titre, on clique.
 *
 * C'est la description qui part, et non le prix ou le sur-titre. Le prix est
 * l'information qui décide ; le sur-titre — « En famille », « En amoureux » —
 * dit à qui l'offre s'adresse, ce qu'aucun titre ne remplace. La description,
 * elle, reformule le titre sans rien y ajouter : « Pack Famille » suivi de
 * « Quatre places à tarif réduit » ne surprend personne.
 *
 * Elle reste dans le balisage, lue par les lecteurs d'écran et affichée dès
 * que la section repasse en grille — sous trois offres, ou sur mobile où une
 * carte occupe l'écran et peut se permettre une phrase.
 */
.offers-piste.est-carrousel .grid.offers-grid .ocard .body {
  display: none;
}

/* Le lien se pose en bas de carte : les cartes ayant la même hauteur, les
   liens s'alignent d'une carte à l'autre au lieu de flotter chacun à la
   hauteur de son texte. */
.offers-piste.est-carrousel .grid.offers-grid .ocard-cta {
  margin-top: auto;
}
.offers-piste.est-carrousel .grid.offers-grid .ocard-price {
  margin-bottom: var(--e-6);
}

/* --------------------------------------------------------------------------
   Nombre de cartes visibles, selon la largeur d'écran

   Le rapport de 3,5 est juste sur un ordinateur, absurde sur un téléphone :
   sur un écran de 390 px, il donnait des cartes de 86 px de large — plus
   étroites que le mot « Famille ». Le titre se brisait en trois lignes et
   l'image devenait une vignette.

   Ce n'est pas le rapport qui doit être constant, c'est la LISIBILITÉ d'une
   carte. Trois paliers, et à chacun la carte suivante reste coupée par le
   milieu — le signal qui dit qu'il y a une suite.
   -------------------------------------------------------------------- */

/* Tablette : deux cartes et demie. */
@media (max-width: 900px) {
  .offers-piste.est-carrousel .grid.offers-grid .ocard {
    flex-basis: calc((100vw - var(--piste-marge) - var(--ef-3) - 2 * var(--efh-2)) / 2.5);
  }
}

/* Téléphone : une carte et un quart.

   À 1,5, la carte suivante apparaissait à moitié — assez pour qu'on hésite à
   la lire sur place plutôt qu'à faire défiler. À 1,25 elle n'est plus qu'une
   amorce : on comprend qu'il y a une suite, et la carte courante récupère la
   place. Elle passe de 228 à 274 px sur un écran de 390. */
@media (max-width: 560px) {
  .offers-piste.est-carrousel .grid.offers-grid .ocard {
    flex-basis: calc((100vw - var(--piste-marge) - var(--ef-3) - var(--efh-2)) / 1.25);
  }
}

@media (max-width: 780px) {
  /* La carte occupe l'essentiel de l'écran : la phrase redevient lisible et
     utile, elle ne concurrence plus rien. */
  .offers-piste.est-carrousel .grid.offers-grid .ocard .body {
    display: block;
  }
}

/* Défilement instantané pour qui a demandé moins d'animation : le glissement
   des cartes est agréable mais n'apporte aucune information. */
@media (prefers-reduced-motion: reduce) {
  .offers-piste.est-carrousel {
    scroll-behavior: auto;
  }
}

/* Texte réservé aux lecteurs d'écran.

   « (nouvel onglet) » doit être annoncé, jamais affiché : sans la mention,
   une personne qui navigue à l'aveugle perd le fil quand un onglet s'ouvre
   sans prévenir. Avec elle écrite en clair, le bouton devient bavard.

   clip-path plutôt que clip, obsolète depuis longtemps ; width/height à 1px
   plutôt que 0, certains lecteurs ignorant les éléments sans dimension. */
.cp-hors-ecran {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ==========================================================================
   COMMANDES DU CARROUSEL

   Ce bloc a été perdu deux fois par des réécritures automatiques trop larges,
   et les boutons s'affichaient alors nus : deux rectangles gris sans forme ni
   dimension. Il est désormais isolé en fin de feuille, hors de portée des
   remplacements qui visent le bloc de la piste.
   ========================================================================== */

/* Points à gauche, flèches à droite, aux deux bouts de la rangée.

   Groupées d'un seul côté, les commandes forment un amas dont on ne sait pas
   quoi lire en premier. Séparées, chacune dit ce qu'elle est : à gauche où
   l'on en est, à droite comment avancer — et le regard, qui vient de finir la
   dernière carte à droite, tombe sur la flèche. */
.offers-cmd {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-7);
  margin-top: var(--e-10);
}
.offers-cmd[hidden] {
  display: none;
}
.offers-fleches {
  display: flex;
  gap: var(--e-4);
}

.offers-fleche {
  flex: 0 0 auto;
  width: 46px;
  height: 46px;
  display: grid;
  place-items: center;
  /* Rondes : elles se distinguent des boutons carrés de la charte, qui mènent
     quelque part. Une flèche de carrousel ne quitte pas la page. */
  border-radius: 50%;
  border: 1px solid var(--copper-hair-strong);
  background: transparent;
  color: var(--ink);
  cursor: pointer;
  padding: 0;
  transition:
    background 0.25s var(--ease),
    border-color 0.25s var(--ease),
    color 0.25s var(--ease);
}
.offers-fleche:hover:not(:disabled) {
  background: var(--copper);
  border-color: var(--copper);
  color: #fff;
}
.offers-fleche:disabled {
  /* Désactivée plutôt que masquée : une commande qui disparaît fait bouger la
     rangée, et l'on cherche où elle est passée. */
  opacity: 0.3;
  cursor: default;
}
.offers-fleche svg {
  width: 15px;
  height: 15px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
}

.offers-points {
  display: flex;
  gap: var(--e-4);
}
.offers-point {
  width: 8px;
  height: 8px;
  padding: 0;
  border: 1px solid var(--copper);
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
  transition: background 0.25s var(--ease);
}
.offers-point[aria-current="true"] {
  background: var(--copper);
}
.offers-point:focus-visible,
.offers-fleche:focus-visible {
  outline: 2px solid var(--copper);
  outline-offset: 3px;
}

@media (max-width: 780px) {
  /* Le doigt remplace la flèche ; les points suffisent à dire où l'on en est. */
  .offers-fleche {
    display: none;
  }
}


/* Deux actions au bas d'une carte d'offre.

   « Réserver » est plein, le second lien ne l'est pas : c'est ce contraste
   qui dit lequel des deux est l'action attendue. Deux boutons de même poids
   ne se départagent pas, et l'on clique alors le plus à gauche. */
.offers .ocard-actions {
  display: flex;
  align-items: center;
  /* 26 px : à 20, le lien touchait presque le bouton et les deux se lisaient
     comme un seul bloc. */
  gap: var(--e-8);
  flex-wrap: wrap;
  margin-top: auto;
}
.offers .ocard-btn {
  padding: var(--e-5) var(--e-7);
  font-size: var(--fs-3);
}
.offers .ocard-actions .ocard-cta {
  margin-top: 0;
}

/* --------------------------------------------------------------------------
   Le filet appartient au titre, plus au sur-titre

   Neuf règles héritées habillaient encore le filet du sur-titre — largeur,
   couleur, centrage selon la section. Elles ne créent plus rien, puisque la
   déclaration de base a disparu, mais elles restaient dans la feuille et
   auraient fait revenir le filet à la première main qui rétablirait
   .eyebrow::after sans savoir pourquoi il avait été retiré.

   Une seule ligne les rend inopérantes, et elle explique la décision mieux
   que neuf suppressions dispersées.
   -------------------------------------------------------------------- */

/* Le filet appartient au sur-titre.

   Il avait été déplacé sous le titre, puis ramené ici. Les deux placements se
   défendent : sous le titre il ferme le bloc, sous le sur-titre il souligne
   l'annonce. C'est le second qui a été retenu — et la déclaration vit
   désormais à un seul endroit, celui-ci.

   Il reste masqué sur les cartes d'offres, où chaque carte n'a pas à porter
   son propre trait. */
.eyebrow::after {
  content: "";
  display: block;
  /* 56 × 3 px. Le trait suit le corps de ce qu'il souligne : sous une ligne
     de 11,5 px, les 96 px calculés pour un titre de 48 auraient dépassé le
     mot lui-même. */
  width: 56px;
  height: 3px;
  background: var(--copper);
  /* 20 px sous le sur-titre. Cette marge a été retirée deux fois par des
     nettoyages automatiques de marges verticales, et le filet s'est retrouvé
     collé aux jambages. Elle est verticale, mais elle appartient au dessin du
     filet, pas au rythme des sections. */
  margin-top: var(--e-7);
}
.ocard-eyebrow::after,
.cp-tour-eyebrow::after {
  content: none;
}

/* Pas de centrage du filet.

   J'avais écrit une règle centrant le filet dans une section « .center ». Elle
   était fausse ici : ce thème redéfinit .sec-head.center en alignement à
   GAUCHE — la classe a gardé son nom après un changement de parti pris. Le
   filet se centrait donc sous un titre aligné à gauche.

   La leçon vaut au-delà de ce cas : un nom de classe n'est pas une
   description fiable de ce qu'elle fait. */

/* Sur fond sombre, il reprend le cuivre clair comme le reste des filets. */
.on-night .h2::after,
.grandeur .h2::after,
.cp-lp-hero .h2::after {
  background: var(--copper-lt);
}



/* Bouton de réservation sous les avis, centré.

   Je l'avais aligné à gauche, par cohérence avec le titre de section. Le
   raisonnement valait pour un élément de LECTURE — un texte se cale sur la
   colonne. Une action qui clôt une rangée de trois cartes n'appartient à
   aucune des trois : centrée, elle se rapporte à l'ensemble. */
.avis-cta {
  margin-top: var(--ef-3);
  display: flex;
  justify-content: center;
}

/* Affiche de la section « Présentation ».

   Elle occupait la moitié de la colonne, soit 594 px de large et 891 de haut
   sur un grand écran : presque un écran entier pour une image que le visiteur
   a déjà vue en arrivant. Le texte qui l'accompagne — l'argument de vente —
   se retrouvait relégué à côté d'un mur.

   Plafonnée à 420 px, elle reste lisible dans ses détails et laisse la
   priorité au texte. Elle se cale en haut de sa colonne plutôt qu'au centre :
   son bord supérieur s'aligne alors sur le sur-titre. */
.split .poster-fig {
  max-width: 420px;
  align-self: start;
}

@media (max-width: 900px) {
  /* En colonne unique, l'affiche est centrée : alignée à gauche, elle
     laisserait un vide inexpliqué à sa droite. */
  .split .poster-fig {
    margin-inline: auto;
  }
}

/* Le second lien de la carte, « Voir l'offre ».

   C'était un <span> inerte, décoratif : la carte entière portait le clic. Il
   est devenu un vrai lien, il lui faut donc les états d'un lien — la couleur
   qui change, le soulignement qui se dessine, et un repère au clavier.

   Le survol ne se déclenche plus sur toute la carte mais sur le lien seul :
   c'est ce qui dit au visiteur où le clic est reçu. */
.offers .ocard-cta {
  color: var(--ink);
  text-decoration: none;
  border-bottom: 1px solid var(--copper-hair-strong);
  padding-bottom: var(--e-1);
  transition:
    color 0.25s var(--ease),
    border-color 0.25s var(--ease);
}
.offers .ocard-cta:hover,
.offers .ocard-cta:focus-visible {
  color: var(--copper);
  border-bottom-color: var(--copper);
}
.offers .ocard-cta:focus-visible {
  outline: 2px solid var(--copper);
  outline-offset: 4px;
}

/* Section « Visite virtuelle » : l'image, et rien autour.

   Elle réutilise .cp-lieu-wide, écrit pour l'ancien chapiteau où la photo
   était suivie d'un texte dans la même section. Deux valeurs y avaient un sens
   qui n'en a plus ici :

   — le retrait bas de 168 px hérité de .sec, qui séparait la photo du texte
     qui la suivait. Il n'y a plus de texte : il ne sépare plus rien et laisse
     une bande vide sous l'image ;
   — la marge basse de la photo, qui faisait le même travail en double.

   La section se réduit donc à sa photo, bord à bord. */
#visite.cp-lieu-wide {
  padding-bottom: 0;
}
#visite .cp-lieu-media {
  margin-bottom: 0;
}

/* Sous-titre du bandeau — « par les Étoiles du Cirque de Pékin ».

   Il vient sous un titre en Trajan de 96 px : composé au même corps que
   l'accroche, il ferait doublon avec elle et l'on lirait deux phrases de même
   poids. Plus petit et en capitales espacées, il se lit comme une signature —
   ce qu'il est.

   Barlow et non Trajan : le titre garde l'exclusivité de la police
   d'affichage, sans quoi le contraste qui le fait ressortir s'efface. */
.hero .hero-sous {
  font-family: var(--font-body);
  font-size: var(--fs-4);
  font-weight: 500;
  letter-spacing: var(--ls-3);
  text-transform: uppercase;
  color: var(--copper-lt);
  margin: var(--e-6) 0 0;
}

/* L'accroche s'écarte du sous-titre, pas du titre. */

/* ==========================================================================
   RYTHME INTERNE DES SECTIONS

   L'écart entre les sections était unifié ; celui entre les ÉLÉMENTS d'une
   section ne l'était pas. On trouvait six valeurs distinctes après un titre,
   six après un paragraphe, trois après un sur-titre — chacune posée au coup
   par coup, section par section.

   C'est ce qui obligeait à comparer deux captures d'écran pour voir qu'un
   bloc respirait autrement qu'un autre.

   Une seule cascade, déclarée ici, valable dans toutes les sections. Elle
   repose sur le sélecteur de frère adjacent : c'est le RAPPORT entre deux
   éléments qui fixe l'écart, pas l'élément lui-même. « Un titre suivi d'un
   texte » vaut 20 px, où qu'il se trouve.

   Quatre écarts, et rien d'autre :

     sur-titre → titre      20 px   ils s'annoncent l'un l'autre
     titre     → sous-titre 12 px   plus serré : c'est le même propos
     titre     → texte      20 px
     texte     → texte      20 px
     bloc      → action     32 px   l'action se détache

   Règle de travail : plus aucune marge posée sur un élément de section en
   dehors de ce bloc. Une exception se déclare par « charte-ok ».
   ========================================================================== */

.sec .eyebrow,
.sec .h2,
.sec h2,
.sec .h3,
.sec h3,
.sec .lead,
.sec .body,
.sec p {
  margin-top: 0;
}

/* Ce qui suit un sur-titre. */
.sec .eyebrow + .h2,
.sec .eyebrow + h2,
.sec .eyebrow + .h3,
.sec .eyebrow + .lead {
  margin-top: var(--e-7);
}

/* Ce qui suit un titre de section. */
.sec .h2 + .h3,
.sec h2 + .h3,
.sec .h2 + h3,
.sec h2 + h3 {
  margin-top: var(--e-5);
}
.sec .h2 + .lead,
.sec h2 + .lead,
.sec .h2 + .body,
.sec h2 + .body,
.sec .h2 + p,
.sec h2 + p {
  margin-top: var(--e-7);
}

/* Ce qui suit un sous-titre ou un paragraphe. */
.sec .h3 + .body,
.sec h3 + .body,
.sec .h3 + p,
.sec h3 + p,
.sec .lead + .body,
.sec .body + .body,
.sec p + p {
  margin-top: var(--e-7);
}

/* L'action se détache du bloc de texte. */
.sec .body + .btn,
.sec .body + .arrow,
.sec p + .btn,
.sec p + .arrow,
.sec .lead + .btn,
.sec .lead + .arrow,
.sec .body + .ocard-actions,
.sec p + .ocard-actions {
  margin-top: var(--e-9);
}


/* --------------------------------------------------------------------------
   Chiffres du chapiteau — règles restaurées

   Elles avaient été emportées par un nettoyage automatique des règles vides :
   après le retrait de leurs marges verticales, mon expression les a jugées
   vides alors qu'elles portaient encore la grille, les bordures et les
   tailles. Le bloc de chiffres s'affichait alors sans colonnes ni séparateurs.

   Les marges verticales ne sont pas rétablies : elles relèvent désormais de
   la cascade du rythme interne.
   -------------------------------------------------------------------- */

#chapiteau .txt dl.stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  margin: var(--e-12) 0 0;
  padding: var(--e-9) 0;
  border-top: 1px solid var(--copper-hair);
  border-bottom: 1px solid var(--copper-hair);
}
#chapiteau .txt .stat {
  min-width: 0;
  padding-left: var(--ef-1);
  border-left: 1px solid var(--copper-hair);
}
#chapiteau .txt .stat:first-child {
  padding-left: 0;
  border-left: 0;
}
#chapiteau .txt .stat b {
  display: block;
  font-size: var(--fs-h4);
  line-height: var(--lh-0);
  white-space: nowrap;
}
#chapiteau .txt .stat span {
  display: block;
  font-size: var(--fs-nano);
  letter-spacing: var(--ls-2);
}

/* Titre du chapiteau : mesure limitée.

   Restaurée avec les règles de chiffres. « max-width: 15ch » casse le titre
   sur deux lignes courtes, pour qu'il fasse face au bloc de chiffres au lieu
   de courir sous lui. La surcharge « none » plus bas le libère sur les
   écrans où les deux colonnes se superposent. */
#chapiteau .txt .h2 {
  line-height: var(--lh-1);
  max-width: 15ch;
}

/* --------------------------------------------------------------------------
   Le chapô se reconnaît à sa POSITION, pas à sa classe

   Le paragraphe qui suit immédiatement un titre de section joue toujours le
   même rôle : il annonce ce qui vient. Il valait pourtant 16 px dans le
   chapiteau, 21 dans la présentation et 29 dans la galerie — trois classes
   différentes pour un même office, selon la section où il tombe.

   Le rapport entre deux éléments suffit à le désigner : « un paragraphe
   immédiatement après un titre de section » est un chapô, quelle que soit sa
   classe. Même principe que la cascade du rythme interne, et même effet — une
   nouvelle section hérite du bon corps sans que personne ait à y penser.

   Les paragraphes suivants restent en texte courant : un chapô n'a qu'une
   ligne de tête, sinon c'est un article.
   -------------------------------------------------------------------- */

.sec .h2 + .body,
.sec h2 + .body,
.sec .h2 + p,
.sec h2 + p {
  font-size: var(--fs-7);
  line-height: var(--lh-3);
}

/* --------------------------------------------------------------------------
   Le filet suit l'alignement du texte, sans qu'on le lui dise

   Il était positionné par une liste d'exceptions : centré ici, à gauche là,
   selon la section. Chaque nouvelle section centrée exigeait une ligne de
   plus — et le pré-pied de page, centré, n'en avait pas : son filet restait
   collé à gauche sous un titre centré.

   « margin-inline: auto » ne centre un bloc que si son conteneur le décide.
   Or ce n'est pas ce qu'on veut : on veut que le filet suive le TEXTE.
   C'est exactement ce que fait une marge automatique conditionnée à
   text-align, et CSS sait l'exprimer sans JavaScript ni classe
   supplémentaire.

   Le filet devient donc un élément en ligne dans une boîte qui hérite de
   l'alignement du texte : centré si le texte l'est, à gauche sinon. Une
   section nouvelle n'a plus rien à déclarer.
   -------------------------------------------------------------------- */

/* Le filet est un bloc : il occupe sa propre ligne, sous le sur-titre.

   J'ai essayé « inline-block », qui aurait suivi text-align tout seul. Un
   élément en ligne se place à la SUITE du texte, pas dessous : le filet se
   retrouvait à droite du mot. La solution était trop maligne pour être juste.

   Le centrage se déclare donc, mais en UN SEUL endroit — la liste ci-dessous.
   Elle était auparavant éparpillée en quatre règles, et le pré-pied de page,
   centré, n'y figurait pas : son filet restait à gauche sous un titre centré.

   Ajouter une section centrée = ajouter son sélecteur ici, et nulle part
   ailleurs. */
.cp-prefooter .eyebrow::after,
.cp-prefooter-inner .eyebrow::after,
.cp-news-text .eyebrow::after,
#experience .center .eyebrow::after,
.cp-lp-final .eyebrow::after,
.has-text-align-center.eyebrow::after {
  margin-inline: auto;
}

/* ==========================================================================
   CARTES SUR FOND — offres et sorties collectives

   Sans fond, une carte n'est qu'une image suivie de texte : rien ne dit où
   elle commence ni où elle finit, et la rangée se lit comme une bande
   continue. Un fond légèrement plus chaud que la page suffit à faire objet.

   Cette règle habillait les seules cartes d'offres, sous un sélecteur de six
   classes. Les cartes « Ensemble » — Scolaires, Groupes, CSE — en avaient
   besoin aussi. Plutôt que de la recopier, elle porte désormais les deux :
   une troisième famille de cartes aurait fini par diverger des deux
   premières, comme les jetons d'espacement l'ont fait.
   ========================================================================== */

.offers-piste.est-carrousel .grid.offers-grid .ocard,
.ensemble-grid .ocard {
  /*
   * Le fond de la carte est l'INVERSE de celui de sa section.
   *
   * Les offres sont posées sur --paper, les groupes sur --beige. Donner le
   * même beige aux deux rendait les cartes de groupes invisibles : une carte
   * beige sur une section beige n'a plus de bord, et il a fallu lui ajouter
   * un contour pour la faire exister.
   *
   * En inversant, le contraste vient du fond lui-même. Le contour n'est plus
   * une béquille mais un liseré, et la règle vaut pour toute section à venir
   * sans qu'on ait à choisir une couleur.
   */
  background: var(--beige);
  /* Le visuel touche les trois bords : une image encadrée de blanc dans une
     carte déjà encadrée fait deux cadres pour un seul objet. */
  overflow: hidden;
  transition:
    background 0.3s var(--ease),
    transform 0.3s var(--ease);
}

/* Le texte, lui, respire. */
.offers-piste.est-carrousel .grid.offers-grid .ocard > *:not(.media):not(figure),
.ensemble-grid .ocard > *:not(.media):not(figure) {
  padding-inline: var(--e-7);
}
.offers-piste.est-carrousel .grid.offers-grid .ocard .media,
.offers-piste.est-carrousel .grid.offers-grid .ocard figure.media,
.ensemble-grid .ocard .media,
.ensemble-grid .ocard figure.media {
  margin-bottom: var(--e-7);
}
.offers-piste.est-carrousel .grid.offers-grid .ocard-actions,
.ensemble-grid .ocard .ocard-cta {
  padding-bottom: var(--e-8);
}

.offers-piste.est-carrousel .grid.offers-grid .ocard:hover,
.ensemble-grid .ocard:hover {
  /* Au survol, le fond se creuse d'un souffle. Composé à partir du cuivre de
     la palette plutôt que d'un ton choisi à l'œil : si la charte change, le
     survol suit. */
  background: color-mix(in srgb, var(--beige) 92%, var(--copper));
  /* Deux pixels, pas davantage : la carte doit répondre, pas sauter. Un
     déplacement plus ample déclenche le survol de la carte voisine quand la
     souris passe entre deux. */
  transform: translateY(-2px);
}

@media (prefers-reduced-motion: reduce) {
  .offers-piste.est-carrousel .grid.offers-grid .ocard,
  .ensemble-grid .ocard {
    transition: background 0.3s var(--ease);
  }
  .offers-piste.est-carrousel .grid.offers-grid .ocard:hover,
  .ensemble-grid .ocard:hover {
    transform: none;
  }
}

/* Contour des cartes.

   Il servait de béquille : sur le beige de la section « Ensemble », une carte
   beige n'avait pas de bord, et seul ce filet la faisait exister. Depuis que
   le fond s'inverse selon la section, le contraste vient du fond lui-même.

   Le filet est conservé mais change de rôle : il ne dessine plus le bord, il
   le précise — comme sur les médias du site. */
.offers-piste.est-carrousel .grid.offers-grid .ocard,
.ensemble-grid .ocard {
  border: 1px solid var(--copper-hair);
}
.offers-piste.est-carrousel .grid.offers-grid .ocard:hover,
.ensemble-grid .ocard:hover {
  border-color: var(--copper-hair-strong);
}

/* La mention chiffrée — « Dès 20 élèves », « Jusqu'à 5 500 places » — reprend
   le traitement du prix des offres : c'est la même information, celle qui
   décide, et elle n'avait pas de style propre dans cette section. */
.ensemble-grid .ocard .ocard-price {
  color: var(--copper);
  font-weight: 600;
}

/* L'appel à l'action des cartes « ensemble » est devenu un vrai lien : il
   reçoit les états d'un lien, comme celui des cartes d'offres. */
.ensemble-grid .ocard-cta {
  color: var(--ink);
  text-decoration: none;
  transition: color 0.25s var(--ease);
}
.ensemble-grid .ocard-cta:hover,
.ensemble-grid .ocard-cta:focus-visible {
  color: var(--copper);
}
.ensemble-grid .ocard-cta:focus-visible {
  outline: 2px solid var(--copper);
  outline-offset: 4px;
}

/* Sur une section beige, la carte passe au clair. */
.sec.beige .ensemble-grid .ocard,
.sec.beige .offers-piste.est-carrousel .grid.offers-grid .ocard {
  background: var(--paper);
}
.sec.beige .ensemble-grid .ocard:hover,
.sec.beige .offers-piste.est-carrousel .grid.offers-grid .ocard:hover {
  /* Le survol creuse dans le même sens : un souffle de cuivre dans le clair. */
  background: color-mix(in srgb, var(--paper) 94%, var(--copper));
}
