/* ====================================================================
   design.css — Académie Clairefontaine (FFF) · site Vackelys
   Feuille unique, commune à index / sejour / resultatrecherche.
   Remplace styles-mutu.css. Ne définit JAMAIS la couleur des 13
   classes pilotées par style_config.css (forme uniquement).
   ==================================================================== */

/* ---------- 0. Police FFF Equipe ---------- */
@font-face { font-family: "FFF Equipe"; src: url(fonts/FFF-Equipe-Light.otf) format("opentype"); font-weight: 300; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Equipe"; src: url(fonts/FFF-Equipe-Regular.otf) format("opentype"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Equipe"; src: url(fonts/FFF-Equipe-Bold.otf) format("opentype"); font-weight: 700; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Equipe"; src: url(fonts/FFF-Equipe-Black.otf) format("opentype"); font-weight: 900; font-style: normal; font-display: swap; }

/* ---------- 0 bis. Polices de la charte FFF (livraison skeletons/new_retour) ----------
   Les trois familles de titrage de la charte, absentes jusqu'ici du projet :
   les blocs repris du squelette se rabattaient sur FFF Equipe.

   EN SERVICE. FFF Hero porte tous les titres, via --font-title (section 1)
   et la regle h1-h6 (section 2). FFF France et FFF Heritage ne sont
   appelees QUE par la tuile Immersion du bloc Univers (section 7), qui
   redefinit --font-title / --font-body sur elle seule : ces deux familles
   ne sont donc telechargees que sur les pages ou le module Univers est
   actif avec au moins deux univers configures.

   /!\ Les sections 10 (tableau des sessions) et 17 (cartes sejour) notent
   que le titrage FFF France n'y est PAS repris. C'est toujours exact, mais
   la raison a change : la police est desormais chargee de toute facon, ces
   deux blocs restent en FFF Hero par choix de rendu, pas par economie.

   FFF Equipe est aussi livree en .woff dans le meme dossier, plus legere que
   les .otf ci-dessus ; la bascule n'est pas faite ici, elle changerait le
   fichier charge sur toutes les pages. */
@font-face { font-family: "FFF Hero"; src: url(fonts/FFF-Hero-Light.woff) format("woff"); font-weight: 300; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Hero"; src: url(fonts/FFF-Hero-Book.woff) format("woff"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Hero"; src: url(fonts/FFF-Hero-Bold.woff) format("woff"); font-weight: 700; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Hero"; src: url(fonts/FFF-Hero-Black.woff) format("woff"); font-weight: 900; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF France"; src: url(fonts/FFFFrance-Regular.woff) format("woff"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF France"; src: url(fonts/FFFFrance-Medium.woff) format("woff"); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF France"; src: url(fonts/FFFFrance-Bold.woff) format("woff"); font-weight: 700; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF France"; src: url(fonts/FFFFrance-Black.woff) format("woff"); font-weight: 900; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Heritage"; src: url(fonts/FFFHeritage-Regular.woff2) format("woff2"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Heritage"; src: url(fonts/FFFHeritage-Medium.woff2) format("woff2"); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: "FFF Heritage"; src: url(fonts/FFFHeritage-Black.woff2) format("woff2"); font-weight: 900; font-style: normal; font-display: swap; }

/* ---------- 1. Variables ----------
   Les 3 teintes de marque (navy / rouge / or) ne sont utilisées QUE sur
   des éléments non pilotés par le back-office. À retoucher ici si un
   client change d'identité. */
:root {
  --fff-navy: #002140;
  --fff-navy-2: #0a2c4f;
  --fff-navy-3: #244a70;
  --fff-red: #e30613;
  --fff-gold: #c8af73;
  --fff-green: #1f8d49;
  --fff-orange: #d97706;
  --fff-ink: #1f2a37;
  --fff-text: #3f4650;
  --fff-muted: #5b6572;
  --fff-muted-2: #8a929c;
  --fff-muted-3: #9aa4b0;
  --fff-hero-text: #d9e2ec;
  --fff-line: #e4e4e4;
  --fff-line-2: #eeeeee;
  --fff-line-3: #dfe4ea;
  --fff-field: #d7dce2;
  --fff-bg: #eceef1;
  --fff-bg-2: #f4f6f8;
  --fff-white: #ffffff;
  --fff-font: "FFF Equipe", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --fff-container: 1180px;
  --fff-gutter: 24px;
  /* Largeur de la carte du moteur de recherche (Figma : 1084 px dans le
     conteneur 1180). Variabilisee pour que la section 18 (tres grands
     ecrans) la fasse suivre le conteneur : les deux regles qui la portent
     sont `.moteur-bandeau` et `.barre-icone-1 > div` (section 6). */
  --fff-moteur: 1084px;
  --fff-header-h: 88px;
  --fff-shadow-card: 0 30px 64px 0 rgba(0, 20, 45, 0.34);
  --fff-shadow-soft: 0 12px 32px rgba(0, 20, 45, 0.16);
  /* Charte « Equipe de France », reprise du squelette FFF_new_Accueil.html.
     Employee UNIQUEMENT par la carte Immersion du bloc #stages-im-ex et par
     la colonne Immersion du bloc #comparer : le reste du site garde
     navy / rouge / or ci-dessus. */
  --fff-edf-blue: #0030b1;
  --fff-edf-wave: #0a2bb8;
  --fff-edf-deep: #000563;
  --fff-edf-gold: #d8b260;
  --fff-edf-tint: #eef2ff;
  --fff-edf-tint-2: #e2e9fb;
  /* Filet des surfaces teintées Immersion (squelette : --tint-edf-line) :
     --fff-edf-tint-2 ci-dessus est un FOND, trop clair pour un filet. */
  --fff-edf-tint-line: #c9d6fa;
  /* Fond des lignes « Féminin » du tableau des sessions (squelette : #FFF3F5,
     le rosé qui accompagne le liseré --fff-red). */
  --fff-red-tint: #fff3f5;
  --fff-blue: #003287;
  /* Bleu ciel de la charte FFF. Ajoute pour la page Clairefontaine
     (section 13 ter) : numerotation des cartes « la semaine » et
     triangle plein de la section « la vie du site ». */
  --fff-sky: #009fe3;
  --font-fff-title: 'FFF Hero', 'Oswald', 'Arial Narrow', sans-serif;
  --font-fff-body: 'FFF Equipe', 'Plus Jakarta Sans', Arial, system-ui, sans-serif;
  --font-edf-title: 'FFF France', 'FFF Hero', 'Oswald', 'Arial Narrow', sans-serif;
  --font-edf-body: 'FFF Heritage', 'Plus Jakarta Sans', Arial, system-ui, sans-serif;
  --font-title: var(--font-fff-title);
  --font-body: var(--font-fff-body);
  --fff-footerblue: #002566;
}

/* ---------- 2. Base ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: var(--fff-header-h); }
body {
  margin: 0;
  font-family: var(--font-fff-body);
  font-size: 13px;
  line-height: 1.5;
  color: var(--fff-text);
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; display: block; }
a { color: var(--fff-navy); text-decoration: none; transition: color .15s ease; }
a:hover, a:focus-visible { color: var(--fff-blue); }
h1, h2, h3, h4, h5, h6 { margin: 0; font-family: var(--font-title); font-weight: 700; line-height: 1; color: var(--fff-navy); text-transform: uppercase; }
p { margin: 0 0 12px; }
ul { margin: 0; padding: 0; }
button, input, select, textarea { font-family: inherit; font-size: inherit; }
button { cursor: pointer; }
:focus-visible { outline: 2px solid var(--fff-blue); outline-offset: 2px; }

/* Utilitaires (doublons volontaires de Bootstrap, sans effet si BS est chargé).
   /!\ Ne PAS redéclarer `.d-none` ici : chargée après Bootstrap, la copie
   `display:none !important` bat `.d-lg-block` / `.d-md-block` à spécificité
   égale et masque l'élément à toutes les tailles (`d-none d-lg-block`…).
   Bootstrap 5 fournit déjà `.d-none`. */
.visually-hidden { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border: 0 !important; }

/* Annotation maquette : indique l'origine d'un contenu injecté par le site (absent du site réel) */
.fff-src { display: none; padding: 3px 8px; border: 1px dashed var(--fff-muted-3); border-radius: 3px; font: 400 10px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--fff-muted-2); background: var(--fff-bg-2); }
body > .fff-src { margin: 4px 16px; }

/* Conteneur */
.fff-container { width: 100%; max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 0 var(--fff-gutter); }
.fff-section { padding: 48px 0; }
.fff-section-head { grid-column: 1 / -1; display: flex; align-items: center; justify-content: flex-start; gap: 12px; flex-wrap: wrap; }
.fff-title { font-size: 30px; line-height: 1; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-navy) ; }
.fff-kicker { font-size: 11px; font-weight: 700; letter-spacing: 1.32px; text-transform: uppercase; color: var(--fff-muted); }
/* Pastille carree des surtitres du squelette (`.dot-fff`, `.eyebrow`),
   prefixee comme le reste du fichier. Le surtitre qui la porte doit
   passer en `display: flex` : elle n'est pas un puce de liste, c'est un
   premier enfant a aligner sur la ligne de texte. */
.fff-dot { display: inline-block; flex-shrink: 0; width: 9px; height: 9px; background: var(--fff-blue); }
.fff-lbl { font-size: 13px; font-weight: 700; letter-spacing: 1.56px; text-transform: uppercase; color: var(--fff-muted-2); }

/* Echelle de titres du squelette (`FFF_Academie_V16_1_Accueil.html`,
   `.h-xl` / `.h-lg` / `.h-md` / `.h-sm`), prefixee `fff-` comme le reste
   du fichier. Ces classes ne portent QUE la taille (et le poids pour les
   deux plus petites) : elles se cumulent avec `.fff-title`, qui garde la
   casse, la couleur navy et l'interlettrage.
   Les tailles sont fluides (`clamp()`), donc valables a toutes les
   largeurs : un titre qui porte une de ces classes echappe au palier
   mobile `.fff-title { font-size: 24px }` (section 14), d'ou le `:not()`
   pose la-bas. Ne pas le retirer.
   `.fff-h-xl` n'est utilisee par aucun gabarit : le H1 du heros porte
   deja la meme `clamp()` en dur (`.titre-site-index h1`, section 5).
   Elle est definie ici pour que l'echelle soit complete.
   `font-weight: 600` est repris du squelette tel quel ; FFF Hero ne
   fournit pas ce poids (300/400/700/900), le navigateur retient donc
   700 — meme rendu qu'aujourd'hui, valeur conservee par fidelite. */
.fff-h-xl { font-size: clamp(44px, 6.4vw, 88px); }
.fff-h-lg { font-size: clamp(34px, 4.4vw, 60px); }
.fff-h-md { font-size: clamp(28px, 3vw, 40px); font-weight: 600; }
.fff-h-sm { font-size: clamp(22px, 2vw, 26px); font-weight: 600; }

/* Couleurs sémantiques historiques */
.text-darkblue { color: var(--fff-navy); }
.text-danger, .danger { color: var(--fff-red); }
.text-success, .success { color: var(--fff-green); }
.upper { text-transform: uppercase; }
.cursor-default { cursor: default; }
.font-size-13 { font-size: 13px; }
.left { float: left; }
.right { float: right; }
.span-nunito-b { font-weight: 700; }
.fixe { position: relative; }

/* ---------- 3. Boutons ----------
   Couleurs : back-office (.btn-process-cmd-one/two, .bgColorBouton,
   .btnSearch, .btn-couleur-config …) → on ne fixe que la forme. */
.btn-process-cmd-one, .btn-process-cmd-two, .bgColorBouton, .btn-custom-color-back,
.btn-retour-sejour, .btn-couleur-config, .btn-cookies, .fff-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 44px; padding: 0 28px;
  border: 1px solid transparent; border-radius: 5px;
  font-family: var(--fff-font); font-size: 14px; font-weight: 700; line-height: 1; letter-spacing: 0.7px; text-transform: uppercase;
  text-decoration: none; white-space: nowrap; cursor: pointer;
  transition: transform .12s ease, box-shadow .12s ease, opacity .12s ease;
}
.btn-process-cmd-one:hover, .bgColorBouton:hover, .fff-btn:hover { transform: translateY(-1px); box-shadow: 0 8px 18px rgba(0, 20, 45, 0.16); }
.btn-process-cmd-two { background: transparent; }
/* Famille CTA « contour » (cartes séjour) : la FORME est ici, la COULEUR vient
   du back-office. S'emploie TOUJOURS avec .btn-process-cmd-two, dont
   style_config.css fixe border-color + color (couleur bouton) en !important :
     <a class="btn-process-cmd-two fff-btn-cta">Découvrir</a>
   Survol : le fond prend currentColor (= couleur bouton) et le texte passe en
   blanc via -webkit-text-fill-color, propriété que style_config ne verrouille pas. */
.fff-btn-cta::after { content: "→"; }
.fff-btn-cta:hover, .fff-btn-cta:focus-visible {
  background-color: currentColor; -webkit-text-fill-color: var(--fff-white);
  transform: translateY(-1px); box-shadow: 0 8px 18px rgba(0, 20, 45, 0.16);
}
.fff-btn { background: var(--fff-blue); color: var(--fff-white); }
.fff-btn:hover { color: var(--fff-white); }
.fff-btn--outline { background: transparent; border-color: var(--fff-field); color: var(--fff-navy); }
.fff-btn--outline:hover { color: var(--fff-navy); }
.fff-btn--sm, .btn-cookies, .fff-btn-cta, .index-sejour-card .btn-process-cmd-one, .background-white .btn-process-cmd-one, .background-search .btn-process-cmd-one {
  min-height: 30px; padding: 8px 16px; border-radius: 3px; font-size: 12px; letter-spacing: 0.6px;
}

/* ---------- 4. Champs ---------- */
.form-control, .form-select, .selectSearch, .fff-input, select, input[type="text"], input[type="email"], input[type="tel"], input[type="date"], textarea {
  width: 100%; min-height: 44px; padding: 0 14px;
  border: 1px solid var(--fff-field); border-radius: 5px; background: var(--fff-white);
  font-family: var(--fff-font); font-size: 13px; font-weight: 700; color: #33404d;
  appearance: none; -webkit-appearance: none;
}
textarea { padding: 12px 14px; min-height: 120px; }
select, .form-select, .selectSearch {
  background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%239aa4b0'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 14px center; padding-right: 30px;
}
input::placeholder { color: var(--fff-muted-3); font-weight: 400; }
label { font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; color: var(--fff-muted-2); }
input[type="checkbox"], input[type="radio"] { width: 16px; height: 16px; min-height: 0; margin: 0 8px 0 0; vertical-align: middle; accent-color: var(--fff-blue); }
/* ====================================================================
   5. LAYOUT — EN-TÊTE (identique sur les 3 pages)
   Règle 3 : aucun <div> ajouté dans le menu. Tout est fait en CSS.
   ==================================================================== */
/* /!\ NE PAS poser de `z-index` ici, ni sur `.header` : cela creerait un
   contexte d'empilement qui enfermerait la barre de navigation FIXE avec le
   heros. Les blocs qui mordent sur le bas du heros en marge negative passeraient
   alors DERRIERE la photo : le moteur de recherche (`#searchForm`, -64 px,
   z-index 6) et les canaux de contact (`.fff-contact-canaux`, -46 px, z-index 3)
   disparaissent. L'empilement de l'en-tete se regle sur son enfant
   `.navbar-default` (100), pas sur ses conteneurs. */
.fff-header { position: relative; }

/* .header : barre de navigation seule, hauteur reduite au contenu.
   Tout l'habillage du heros (image de fond du back-office, hauteur pleine,
   voile sombre) est porte par `.header-image`, posee par
   layout-header.html.twig quand `showHero` est vrai. */
.header {
  /* PAS d'`isolation: isolate` : elle enfermait le z-index de la barre fixe et
     du logo dans l'en-tete (cf. `.fff-header` ci-dessus). Le voile du heros est
     donc en z-index 0 et non -1, cf. `.header-image::before`. */
  position: relative;
  min-height: var(--fff-header-h);
  padding-top: var(--fff-header-h);
  background-color: var(--fff-white);
}
/* /!\ LE `!important` EST OBLIGATOIRE — ne pas le retirer.
   La banniere de l'enseigne (`assets/template/config/style_config.css`, genere
   par TemplateController) et l'image de couverture de la recherche
   (layout-head-assets.html.twig, section 7) posent toutes deux leur
   background-image sur `.header` lui-meme, en `!important`. style_config.css
   est partage avec les autres templates (edv, Skeleton, Default) : impossible
   de le retarger sur `.header-image`. Sans heros, la banniere doit donc etre
   neutralisee ici. */
.header:not(.header-image) { background-image: none !important; }

/* Habillage du heros : image de fond, hauteur pleine, voile sombre.
   Gabarit : squelette `FFF_Academie_V16_1_Accueil.html`, bloc `.hero.hero--sky`.
   /!\ La hauteur est une `clamp()` : elle remplace les trois paliers de
   `min-height` que portaient les media queries (788 / 640 / 560 px). Ne pas
   remettre de `min-height` fixe dans une media query, elle gagnerait sur la
   clamp et figerait la hauteur.
   `+ var(--fff-header-h)` : dans le squelette, le heros est un bloc SEPARE,
   pose sous une barre de navigation qui ne lui prend pas de hauteur. Ici,
   `.header-image` contient AUSSI la barre (88 px de `padding-top`). Sans ce
   `calc`, la photo visible serait plus courte de 88 px que dans le squelette. */
.header-image {
  min-height: calc(clamp(540px, 66vh, 680px) + var(--fff-header-h));
  display: flex; flex-direction: column; justify-content: center;
  background-color: var(--fff-navy);
  background-size: cover; background-position: 50% 60%; background-repeat: no-repeat;
}
/* Voile du heros : DEUX degrades superposes (squelette `.hero::before` +
   `.hero--sky::before`). L'horizontal porte la lisibilite du texte, cale a
   gauche ; le vertical assombrit le bas, sous lequel le moteur de recherche
   vient mordre. Un seul degre vertical ne suffit pas : le titre passe sur la
   partie claire de la photo.
   `top: var(--fff-header-h)` (et non `0` comme dans le squelette) : ici la
   barre de navigation est opaque et posee DANS `.header`, il n'y a rien a
   assombrir derriere elle. */
.header-image::before {
  content: ""; position: absolute; left: 0; right: 0; top: var(--fff-header-h); bottom: 0;
  background:
    linear-gradient(90deg, rgba(0, 22, 70, 0.88) 0%, rgba(0, 22, 70, 0.55) 48%, rgba(0, 22, 70, 0.08) 100%),
    linear-gradient(0deg, rgba(0, 22, 70, 0.75) 0%, rgba(0, 22, 70, 0) 55%);
  /* `0` et non `-1` : sans `isolation` sur `.header`, un z-index negatif
     passerait DERRIERE la photo de fond (peinte par `.header` lui-meme) et le
     voile serait invisible. A 0, il couvre la photo et reste sous les enfants
     de `.header`, qui sont tous en z-index >= 1 (regle suivante). */
  pointer-events: none; z-index: 0;
}
/* S'applique AUSSI a `.fff-hero-body` : son contenu (titre SEO, slogan) doit
   passer devant le voile. La regle qui le repassait en `position: static` n'a
   plus lieu d'etre — elle servait a ce que le logo `absolute` se cale sur
   `.header` et non sur le corps du heros ; le logo est `fixed` desormais. */
.header > * { position: relative; z-index: 1; }

/* Artefact de la maquette statique : un <li> rendu hors du <ul>. Sans effet sur le site réel. */
.header > li.menu-top-header { display: none; }

/* Barre de navigation (fond + couleur du texte : back-office)
   `fixed` (squelette : `.site-header { position: sticky; top: 0 }`) : la barre
   reste en haut de l'ecran au defilement. AUCUN decalage de mise en page a
   craindre, la hauteur etait deja reservee par `padding-top` sur `.header` et
   la barre etait deja hors du flux (`absolute`).
   /!\ `sticky` est impossible ici : la barre est posee DANS `.header`, qui
   porte aussi le heros. Elle reviendrait dans le flux (les 88 px seraient
   comptes deux fois) et se decollerait au bas de `.header`.
   Le logo est le PREMIER enfant du <nav> (layout-nav-menu.html.twig), comme
   dans le squelette : il herite donc de `fixed` et du z-index de la barre, et
   le retrait gauche n'a plus a lui reserver 250 px.
   `z-index: 100` : la barre traverse toute la page, elle doit passer devant
   TOUT le contenu — fil d'ariane (3), moteur (6), onglet favoris (40), bouton
   de recherche (45), autocompletion (60). Elle reste sous les surcouches qui
   doivent la masquer : loader (1000), panneau lateral (1050, plus bas),
   fenetres modales (1055) et bandeau de previsualisation (2000). */
.navbar-default {
  position: fixed; top: 0; left: 0; right: 0; z-index: 100;
  height: var(--fff-header-h);
  display: flex; align-items: stretch;
  padding: 0 48px;
  border-bottom: 1px solid #e3e7ee;
}
/* `:has(> #menu-navigation)` : ne cibler QUE le conteneur du menu. Sans lui,
   `.navbar-default > div` attrape aussi les deux <div> du logo (plus
   specifique que `.logo-other-screens`) et `flex: 1` + `justify-content:
   flex-end` renverraient le logo au milieu de la barre. */
.navbar-default > div:has(> #menu-navigation) { display: flex; align-items: stretch; justify-content: flex-end; flex: 1; padding-right: 0; }
#menu-navigation { display: flex; align-items: stretch; }
#menu-navigation > .navbar-nav { display: flex; align-items: center; gap: 26px; list-style: none; margin: 0; padding: 0; height: 100%; }
#menu-navigation > .navbar-nav > li { position: relative; display: flex; align-items: center; height: 100%; }
#menu-navigation > .navbar-nav > li > a {
  display: inline-flex; align-items: center; gap: 6px; height: 100%;
  padding: 0; border-bottom: 2px solid transparent;
  font-size: 13.5px; font-weight: 700; letter-spacing: 0.8px; text-transform: uppercase; line-height: 1;
  transition: border-color .15s ease, opacity .15s ease;
}
#menu-navigation > .navbar-nav > li > a:hover,
#menu-navigation > .navbar-nav > li.active > a { border-bottom-color: var(--fff-blue); }
#menu-navigation > .navbar-nav > li > a .fa { font-size: 14px; }
/* Entrées Expérience / Immersion : couleur de marque, et non la couleur de menu
   de l'enseigne — c'est pourquoi leur <li> ne porte pas `.menu-top-header`
   (cf. layout-nav-menu.html.twig) : `style_config.css` colore
   `#menu-navigation>.navbar-nav>.menu-top-header>a` en `!important` et
   l'emporterait. Squelette : `.nav .nav-exp` / `.nav .nav-imm`. */
#menu-navigation > .navbar-nav > li > a.fff-nav-exp { color: var(--fff-blue); }
#menu-navigation > .navbar-nav > li > a.fff-nav-imm { color: var(--fff-edf-blue); }
/* Entrées neutres (Sessions 27-28, Clairefontaine, Contact) et bouton
   « Mon espace » : l'encre du squelette (`--ink: #1B2433`). Ce n'est pas
   `--fff-ink` (#1f2a37), valeur distincte conservée pour son unique
   consommateur (section 24). Pas de `!important` nécessaire : ces <li> ne
   portent plus `.menu-top-header`, la règle de `style_config.css` ne les
   atteint plus (cf. layout-nav-menu.html.twig). */
#menu-navigation > .navbar-nav > li.fff-nav-lien > a,
#menu-navigation > .navbar-nav > li.fff-nav-compte > a { color: #1b2433; }
/* Pastille ronde or cerclée de bleu EDF du squelette (`.dot-edf`) : variante de
   `.fff-dot` (section 1), qui couvre déjà `.dot-fff` à l'identique. */
.fff-dot--edf { width: 10px; height: 10px; border-radius: 50%; background: var(--fff-edf-gold); border: 2px solid var(--fff-edf-blue); }
/* Sous-menus déroulants */
.dropdown-menu.sub-menu { display: none; position: absolute; top: 100%; left: 0; min-width: 220px; padding: 10px 0; list-style: none; background: var(--fff-white); border: 1px solid var(--fff-line); border-radius: 0 0 5px 5px; box-shadow: var(--fff-shadow-soft); }
.dropdown:hover > .dropdown-menu.sub-menu, .dropdown.show > .dropdown-menu.sub-menu, .dropdown-menu.sub-menu.show { display: block; }
.dropdown-menu.sub-menu a { display: block; padding: 8px 18px; font-size: 12px; font-weight: 700; color: var(--fff-navy); text-transform: uppercase; letter-spacing: 0.4px; }
/* Figma : … CONTACT · ☎ 01 00 00 00 00 · [MON ESPACE]. Le téléphone est une entrée du menu (li.menu-tel),
   placée juste avant le bouton compte : il suit la largeur du bouton (« Bonjour … », déconnexion). */
#menu-navigation > .navbar-nav > li.menu-tel { margin-left: 14px; }
#menu-navigation > .navbar-nav > li.menu-tel > a { gap: 7px; font-size: 14px; letter-spacing: 0; white-space: nowrap; border-bottom-color: transparent; }
#menu-navigation > .navbar-nav > li.menu-tel .fa-phone { color: var(--fff-blue); }
/* Item "Mon espace" (li.fff-nav-compte) : bouton bordé. Repéré avant par
   `li:has(> a > .fa-user)` ; l'entrée ne porte plus d'icône (squelette :
   `.nav__account`, bouton bordé sans icône). Même spécificité que l'ancien
   sélecteur (1 id + 2 classes) : les cascades des paliers mobiles
   (sections plus bas) sont inchangées. */
#menu-navigation > .navbar-nav > li.fff-nav-compte { margin-left: 14px; }
#menu-navigation > .navbar-nav > li.fff-nav-compte > a {
  height: 36px; padding: 0 15px; border: 1px solid #cdd4dc; border-radius: 3px;
  font-size: 13px; letter-spacing: 0.65px; white-space: nowrap;
}
#menu-navigation > .navbar-nav > li.fff-nav-compte > a br { display: none; }
/* Maquette : état déconnecté (Figma). Retirer la classe body.fff-demo-deconnecte pour voir l'état connecté. */
.fff-demo-deconnecte .supervisionName, .fff-demo-deconnecte #menu-navigation > .navbar-nav > li > a.logout { display: none; }
#menu-navigation > .navbar-nav > li.fff-nav-compte > a:hover { border-color: currentColor; }
.supervisionName { display: block; font-size: 10px; font-weight: 400; letter-spacing: 0; text-transform: none; opacity: .8; }
#menu-navigation > .navbar-nav > li > a.logout { font-size: 12px; letter-spacing: 0.4px; opacity: .85; }
/* Connecté : menu de l'espace client, sous le bouton compte (aligné à droite) et sous l'icône compte (petits écrans) */
#menu-navigation .dropdown-menu.sub-menu.menu-client { left: auto; right: 0; margin: 0; }
/* Flèche du menu déroulant : vers le bas fermé, vers le haut ouvert (clic : aria-expanded posé par Bootstrap ;
   survol : barre de navigation uniquement, le panneau latéral ne s'ouvre qu'au clic) */
#menu-navigation .dropdown-toggle::after { transition: transform .2s ease; }
#menu-navigation .dropdown-toggle[aria-expanded="true"]::after,
#menu-navigation:not(.showing, .show, .hiding) .dropdown:hover > .dropdown-toggle::after { transform: rotate(180deg); }
.compte-mobile-menu .dropdown-menu.menu-client { min-width: 240px; padding: 10px 0; border: 1px solid var(--fff-line); border-radius: 5px; box-shadow: var(--fff-shadow-soft); }
.compte-mobile-menu .menu-client a { padding: 8px 18px; font-size: 12px; font-weight: 700; color: var(--fff-navy); text-transform: uppercase; letter-spacing: 0.4px; }
.menu-client a .fa { width: 16px; margin-right: 6px; text-align: center; }
/* Sous-menu ouvert : il déborde sous l'en-tête, et la page qui suit (fil d'ariane z-index 3, héros…) passait
   par-dessus. Plus besoin de remonter `.fff-header` : les sous-menus sont rendus
   DANS `.navbar-default` (z-index 100), donc deja devant toute la page. Un
   `z-index` sur `.fff-header` ferait au contraire disparaitre le moteur de
   recherche derriere le heros le temps du survol. */

.telLayout { font-size: 14px; font-weight: 700; line-height: 1; white-space: nowrap; text-decoration: none;}
/* Logo : deux variantes exclusives (mobile / autres écrans).
   Rendu DANS la barre (squelette `.site-header > .wrap > .brand`) : c'est un
   simple element de flex, sans position ni z-index propres. La hauteur vient du
   `align-items: stretch` de la barre, `align-items: center` centre le <a>.
   `flex-shrink: 0` : le logo garde sa largeur, c'est le menu qui se resserre. */
.logo-other-screens, .logo-mobile {
  display: flex; align-items: center; flex-shrink: 0;
}
.logo-mobile { display: none; }
.logo-other-screens a, .logo-mobile a { display: flex; align-items: center; }
/* Logo : agrandi (Figma 46 px, trop petit a l'ecran ; on remonte a 64 px dans les 88 px de la barre) */
.logo-enseigne { height: 64px; width: auto; display: block; }

/* Corps du héros : surtitre + titre SEO + chapo.
   Squelette : le contenu est ancre EN BAS du heros (`.hero { align-items:
   flex-end }`), pas centre. `.fff-hero-body` est en `flex: 1` dans
   `.header-image` : c'est donc son `align-items` qui decide, pas le
   `justify-content` du parent. */
.fff-hero-body { flex: 1; display: flex; align-items: flex-end; width: 100%; padding: 0; }
.header-image .fff-hero-body { padding: 72px 0 120px; }
.container-logo { width: 100%; max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 0 var(--fff-gutter); }
/* Pas de `gap` : les trois interlignes du squelette sont inegaux
   (surtitre -> titre 16 px, titre -> chapo 18 px). Ils sont portes par les
   marges des elements eux-memes, pour qu'un bloc absent n'ouvre pas de vide. */
.titre-site-index { display: flex; flex-direction: column; max-width: var(--fff-container); }
/* Surtitre dore + triangle rouge (squelette `.eyebrow` + `.pointer`).
   Texte en dur dans layout-titre-seo.html.twig : aucun champ back-office ne
   le porte. Le triangle est un `::before`, pas un element : rien a ajouter
   dans le balisage, et il disparait avec le surtitre. */
.fff-hero-kicker {
  display: flex; align-items: center; gap: 12px; margin: 0;
  font-size: 12.5px; font-weight: 800; letter-spacing: 2px; text-transform: uppercase;
  color: var(--fff-gold);
}
.fff-hero-kicker::before {
  content: ""; flex-shrink: 0; width: 24px; aspect-ratio: 1 / 0.89;
  background: var(--fff-red); clip-path: polygon(0 0, 100% 50%, 0 100%);
}
/* `max-width: 13ch` (squelette) : le titre se casse en colonne etroite, il ne
   tient PAS sur la largeur du conteneur. C'est voulu.
   La taille est une `clamp()` : elle remplace les quatre paliers de
   `font-size` des media queries (88 / 64 / 52 / 40 / 34 px). */
.titre-site-index h1 {
  margin-top: 16px;
  max-width: 13ch;
  font-size: clamp(44px, 6.4vw, 88px); font-weight: 700; line-height: 1.04; letter-spacing: 0;
  color: var(--fff-white); text-transform: uppercase; text-wrap: balance;
}
.slogan-site-index { margin-top: 18px; }
.slogan-site-index h2 {
  max-width: 64ch; font-size: clamp(16px, 1.4vw, 19px); font-weight: 400; line-height: 1.6; letter-spacing: 0;
  font-family: var(--font-fff-body);          /* la regle h1..h6 (l.99) imposerait FFF Hero */
  color: #e3eaf5; text-transform: none;
}
.bgimage-inside { position: static; }

/* Panneau favoris (fond du titre : back-office via .bgColorBouton) */
.verticalfavoris { position: fixed; right: 0; top: 50%; transform: translateY(-50%); z-index: 40; }
.verticalfavoris ul { list-style: none; margin: 0; padding: 0; }
.verticalfavoris > ul > li { position: relative; }
/* /!\ Ne cibler QUE les <li> de premier niveau du panneau (les deux onglets
   desktop/mobile). gestionFavoris.js injecte SES PROPRES <li> (un par sejour
   favori) dans `.content-favoris` : sans `> `, ce selecteur les masquait tous
   — le sejour ajoute n'apparaissait jamais dans la liste. */
.verticalfavoris > ul > li:not(.listFavoris) { display: none; }
.verticalfavoris h3 {
  margin: 0; padding: 14px 10px; min-height: 0;
  writing-mode: vertical-rl; text-orientation: mixed;
  border-radius: 4px 0 0 4px; box-shadow: var(--fff-shadow-soft);
  font-size: 12px; font-weight: 700; letter-spacing: 1.2px; line-height: 1; cursor: pointer;
}
.verticalfavoris h3 a { color: #ffffff; }
.content-favoris {
  position: absolute; right: 100%; top: 0; width: 320px; max-height: 60vh; overflow: auto;
  display: none; padding: 16px;
  background: var(--fff-white); border: 1px solid var(--fff-line); border-right: 0; border-radius: 5px 0 0 5px;
  box-shadow: var(--fff-shadow-soft);
}
.listFavoris:hover .content-favoris, .content-favoris.favoHover:hover, .content-favoris.open { display: block; }
/* Liste des favoris injectee par gestionFavoris.js (<ul><li> + .nameFavoris). */
.content-favoris ul { list-style: none; margin: 0; padding: 0; }
.content-favoris li { padding: 7px 0; border-bottom: 1px solid var(--fff-line); }
.content-favoris li:last-of-type { border-bottom: 0; }
.content-favoris .nameFavoris a { color: var(--fff-navy); font-size: 13.5px; text-decoration: none; }
.content-favoris .nameFavoris a:hover { text-decoration: underline; }
.content-favoris .deleteFavoris { cursor: pointer; text-align: right; }
.favoris-lien-modal { color: inherit; }

/* ====================================================================
   6. MOTEUR DE RECHERCHE (identique sur les 3 pages)
   .moteur-bandeau / .btnSearch : couleur back-office → forme seulement.
   ==================================================================== */
#searchToggle { display: none; position: fixed; right: 16px; bottom: 60px; z-index: 45; width: 48px; height: 48px; min-height: 0; padding: 0; border-radius: 50%; box-shadow: var(--fff-shadow-soft); }
/* Figma : la carte du moteur est alignée à gauche du conteneur, à la largeur de son contenu */
#searchForm { position: relative; z-index: 6; width: 100%; max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: -64px auto 0; padding: 0 var(--fff-gutter); }
#recherche { position: relative; }
.moteur-bandeau > .barre-icone-1 > div { max-width: var(--fff-moteur); }
/* .moteur-bandeau : le fond est piloté par le back-office (navy #0a2c4f dans le Figma).
   La carte blanche des pages accueil / résultats est donc portée par le conteneur
   intérieur (.barre-icone-1 > div), qui recouvre entièrement le bandeau. */
/* Figma : carte du moteur large de 1084 px, centrée dans le conteneur 1180.
   La largeur est portée par `--fff-moteur` (section 1), que la section 18
   fait suivre le conteneur au-delà de 1600 px.
   Le bandeau reprend l'arrondi de la carte : sans ça, sa couleur de fond
   (back-office) dépasse dans les coins arrondis de la carte blanche. */
.moteur-bandeau {
  display: flex; flex-direction: column; gap: 0;
  max-width: var(--fff-moteur); margin: 0 auto; padding: 0; border-radius: 8px; box-shadow: none;
}
.barre-icone-1 > div { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 18px; align-items: end; padding: 22px 24px; border-radius: 8px; background: var(--fff-white); box-shadow: var(--fff-shadow-card); }
/* 1re rangée : 4 champs souples + cellule actions dimensionnée sur son contenu */
.barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: repeat(4, minmax(0, 1fr)) max-content; }
.barre-icone-1 > div > div { min-width: 0; }
/* Figma : 3 critères (âge, format, période) + bouton. Les autres champs du moteur (mot-clé, ville, durée, thème)
   restent dans le DOM (JS) mais sont masqués. Réactiver ici si le client les utilise. */
.moteur-bandeau > .barre-icone-1 + .barre-icone-1 { display: none; }
.barre-icone-1 > div > div:has(> #searchSejour) { display: none; }
.btnSearch.btnEfface { display: none; }
.barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: repeat(3, minmax(0, 1fr)) max-content; }
/* Libellés des champs rendus visibles au-dessus du champ (Figma) */
.moteur-bandeau label.visually-hidden { position: static !important; width: auto !important; height: auto !important; margin: 0 0 8px !important; overflow: visible !important; clip: auto !important; white-space: normal !important; display: block; font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; color: var(--fff-muted-2); }
.fff-field { display: flex; flex-direction: column; }
.fff-field > div:first-child { display: none; }
.fff-field > div:last-child { min-width: 0; }
.selectMutual { position: relative; }
.ville-icone, .icon-recherche { width: 18px; height: 18px; object-fit: cover; border-radius: 50%; flex-shrink: 0; }
.btn-custom-search { font-weight: 700; }
#searchSejour.ui-autocomplete-input { font-weight: 400; }
.fff-search-actions { display: flex; gap: 8px; white-space: nowrap; }
.btnSearch {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; padding: 0; flex-shrink: 0;
  border: 1px solid var(--fff-field); border-radius: 5px; background: var(--fff-white);
  font-size: 15px; transition: transform .12s ease, box-shadow .12s ease;
}
.btnSearch:hover { transform: translateY(-1px); box-shadow: 0 8px 18px rgba(0, 20, 45, 0.16); }
.btnSearch[type="submit"] { flex: 1; width: auto; padding: 0 28px; background: var(--fff-blue); border-color: var(--fff-blue); font-weight: 700; letter-spacing: 0.7px; text-transform: uppercase; color:white !important;}
.btnSearch[type="submit"]::after { content: "Voir les sessions →"; margin-left: 8px; font-size: 14px; }
.btnEfface { width: 44px; background: var(--fff-navy); border-color: var(--fff-navy); }
/* Autocomplete jQuery UI */
.ui-autocomplete { position: absolute; z-index: 60; list-style: none; padding: 6px 0; margin: 0; background: var(--fff-white); border: 1px solid var(--fff-line); border-radius: 5px; box-shadow: var(--fff-shadow-soft); max-height: 300px; overflow: auto; }
.ui-autocomplete li { padding: 8px 14px; font-size: 13px; cursor: pointer; }
.ui-autocomplete li:hover, .ui-autocomplete .ui-state-active { background: var(--fff-bg-2); color: var(--fff-navy); }
.ui-helper-hidden-accessible { display: none; }

.colorStar { color: var(--fff-blue); }
/* ====================================================================
   7. ACCUEIL
   ==================================================================== */
/* Bandeau remise (couleurs : back-office en inline dans le gabarit) */
.remise-banner { text-align: center; background: var(--fff-blue); }
.remiseLibelle a { font-size: 14px; font-weight: 700; letter-spacing: 0.98px; text-transform: uppercase; color: var(--fff-white); }
.remiseLibelle a:hover { text-decoration: underline; }

/* Bandeau promo (couleurs : back-office en inline dans le gabarit).
   Pleine largeur comme le heros : enfant direct de #wrapper, aucun max-width. */
.fff-promo-bandeau { padding: 13px var(--fff-gutter); text-align: center; }
.fff-promo-bandeau a { color: inherit; text-decoration: none; }
.fff-promo-bandeau a:hover { text-decoration: underline; }
.fff-promo-bandeau p { margin: 0; }

/* Messages flash */
.msgContainer:not(:empty) { max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 24px auto 0; }

/* Description enseigne (WYSIWYG) = accroche « 56 hectares, 1 château… » du Figma */
.wysiwyg-content { max-width: 980px; }
.wysiwyg-content .full-content { font-size: 30px; font-weight: 700; line-height: 1.15; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-navy); text-wrap: balance; }
.wysiwyg-content .full-content p { margin: 0; }
.wysiwyg-content .full-content h2, .wysiwyg-content .full-content h3 { margin-bottom: 14px; font-size: 30px; line-height: 1; }
.wysiwyg-content .full-content strong { color: var(--fff-navy); }
.wysiwyg-content .preview { margin-top: 8px; }
/* « Lire la suite » du WYSIWYG : absent de la maquette Figma */
.toggle-more, .toggle-less { display: none; }
.toggle-more, .toggle-less {
  padding: 8px 0; border: 0; background: none;
  font-size: 12px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-blue);
}
.toggle-more:hover, .toggle-less:hover { text-decoration: underline; }

/* Univers (tuiles) — module optionnel (Figma 08)
   Report des regles `.univ` du squelette FFF_Academie_V16_1_Accueil.html
   (l. 299-310 et l. 765-771) : tuile 16/10, visuel en fond, degrade montant,
   nom + description en surimpression.

   DEUX ECARTS DE STRUCTURE, assumes :

   1. Le squelette cible `.univ a` — ses quatre tuiles sont TOUJOURS des
      liens. Ici la tuile est un `<a>` OU un `<div>` selon les donnees du
      back-office (cf. en-tete de univers_image.html.twig). Tout est donc
      cible sur `.univers-image-container`, JAMAIS sur `a` : une tuile non
      cliquable doit avoir exactement le meme rendu.

   2. Les colonnes sont en `auto-fit` et non en `repeat(4, 1fr)` : le
      back-office livre 3, 4, 5 ou 7 images (`univers.format`), pas
      seulement 4. Dans les ~1132 px utiles du conteneur, le `minmax(240px,
      1fr)` plafonne de fait a 4 colonnes — le format 4 tombe donc
      exactement sur la grille du squelette.

   EMPILEMENT — `isolation: isolate` ouvre le contexte, le visuel passe en
   `z-index: -2` et le degrade en `-1`. Un enfant a z-index negatif peint
   AU-DESSUS du fond de son element mais SOUS son contenu en flux : le navy
   de secours reste visible pendant le chargement du visuel, et le titre n'a
   besoin d'aucun z-index. Ne pas revenir a un `::after` pose par-dessus le
   visuel : il faudrait alors re-empiler le titre au-dessus de lui.

   VARIANTES `data-k` — elles encodent l'ORDRE des tuiles, pas leur sujet.
   La cle vient de l'INDICE de l'image dans `univers.images` (table
   `clesUnivers` de univers.html.twig) : 1re tuile `exp`, 2e `imm`, 3e `fem`,
   4e `fut`, au-dela `exp`. Elle ne decrit donc PAS un univers metier — un
   back-office qui range ses univers autrement verra le degrade rouge sur sa
   3e tuile. C'est le comportement demande.
   `fut` n'a aucune regle propre : dans le squelette il est identique a `exp`
   (meme degrade navy, memes polices FFF). Son absence ici est normale. */
.univers { background-color:#F4F6FA; }
.univers > div { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px; }
.fff-univers-title { grid-column: 1 / -1; }
.univers-image-col { min-width: 0; }
/* Doublons de la mosaïque (cf. en-tête de univers.html.twig) : une seule
   variante visible par palier, bascule à 992px (media query plus bas). */
.uv-lg-only { display: block; }
.uv-sm-only { display: none; }
.univers-image-container {
  position: relative; display: block; overflow: hidden; isolation: isolate;
  aspect-ratio: 16 / 10; border-radius: 6px;
  background: var(--fff-navy); color: var(--fff-white);
}
.univers-image-container img { position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%; object-fit: cover; transition: transform .35s ease; }
.univers-image-container:hover img { transform: scale(1.04); }
.univers-image-container::before { content: ""; position: absolute; inset: 0; z-index: -1; background: linear-gradient(0deg, rgba(0, 15, 45, 0.88), rgba(0, 15, 45, 0) 62%); }
.univers-image-title { position: absolute; left: 14px; right: 14px; bottom: 12px; }
/* `color: inherit` et non `var(--fff-white)` : la couleur du nom est un champ
   de back-office (`colorLegend`), pose en inline par le gabarit QUAND il est
   renseigne. En `inherit`, le blanc de la tuile prend le relais s'il est
   vide — sans quoi le titre retomberait sur le navy de la regle h1-h6
   (section 2), illisible sur le degrade. */
.univers-image-title h3 { font-family: var(--font-title); font-size: 20px; font-weight: 600; letter-spacing: 0.04em; color: inherit; }
/* `<small>` = champ « Description de l'univers » du back-office. Il est DANS
   le h3, comme le `<small>` du `<span>` du squelette : il faut donc defaire
   la casse et l'interlettrage herites du titre. */
.univers-image-title small { display: block; margin-top: 2px; font-family: var(--font-body); font-size: 12.5px; font-weight: 600; letter-spacing: 0; text-transform: none; opacity: 0.9; }
/* Immersion : charte Equipe de France. C'est la SEULE tuile a changer de
   police, d'ou --font-title / --font-body redefinis ici et non en :root. */
.univers-image-container[data-k="imm"] { outline: 2px solid var(--fff-edf-gold); outline-offset: -2px; --font-title: var(--font-edf-title); --font-body: var(--font-edf-body); }
.univers-image-container[data-k="imm"]::before { background: linear-gradient(0deg, rgba(10, 43, 184, 0.94), rgba(10, 43, 184, 0) 62%); }
/* Regle posee sur l'ENFANT : elle l'emporte sur `colorLegend`, qui est pose
   en inline sur le h3 PARENT et ne fait donc que s'heriter jusqu'ici. */
.univers-image-container[data-k="imm"] small { color: var(--fff-edf-gold); opacity: 1; }
.univers-image-container[data-k="fem"]::before { background: linear-gradient(0deg, rgba(150, 0, 30, 0.85), rgba(150, 0, 30, 0) 62%); }

/* Sections cartes : coups de cœur & bons plans */
.coups-coeur, .bons-plans { background-color: #F4F6FA;}
.coups-coeur > div, .bons-plans > div { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.bons-plans > div { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.coups-coeur > div > .fff-section-head, .bons-plans > div > .fff-section-head { order: -1; }
.coups-coeur .etiquette-age { left: auto; right: 12px; }
.coeur, .thumb { font-size: 18px; line-height: 1; }
.coeur { color: var(--fff-red); }
.mini-coeur { font-size: 16px; }
.lien-italique { margin-left: auto; flex: 0 0 auto; }
.lien-italique .link { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; font-size: 11px; font-weight: 700; letter-spacing: 0.44px; text-transform: uppercase; }
.lien-italique .link p { margin: 0; }
.lien-italique .link::after { content: "→"; }

/* Carte séjour (index-sejour-card) */
.background-white {
  height: 100%; background: var(--fff-white);
  border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden;
  transition: box-shadow .2s ease, transform .2s ease;
}
.background-white:hover { box-shadow: var(--fff-shadow-soft); transform: translateY(-2px); }
.content { display: flex; flex-direction: column; height: 100%; }
/* 16/9 comme `.mcard__media` du squelette V16, et non plus la largeur reelle
   d'une colonne (378/170) : le visuel gagne ~25% de hauteur. L'image n'est
   pas deformee (`object-fit: cover` ci-dessous), elle est juste moins
   recadree. Le filet de format de la section 17 est pris DANS cette boite. */
.content > a { position: relative; display: block; aspect-ratio: 16 / 9; overflow: hidden; background: var(--fff-bg); }
.content > a img { width: 100%; height: 100%; object-fit: cover; }
.etiquette-age {
  position: absolute; left: 12px; top: 12px; z-index: 1; white-space: nowrap;
  border-radius: 2px; background: var(--fff-navy);
  font-size: 9px; font-weight: 700; letter-spacing: 0.54px; text-transform: uppercase; color: var(--fff-white);
}
.h4 { margin: 0; padding: 18px 20px 0; font-size: 17px; line-height: 1.1; font-weight: 700; text-transform: uppercase; }
.bpDescIndex { font-size: 12px; line-height: 1.5; }
.etoilesAvis { line-height: 1; }
.fff-card-foot {
  display: flex; justify-content: space-between; align-items: flex-end; gap: 12px;
  margin: auto 20px 18px; padding-top: 14px; border-top: 1px solid var(--fff-line-2);
}
.fff-card-foot:first-child, .content > div:last-child:not(.fff-card-foot) { margin-top: 18px; }
.prix-index p { margin: 0 0 4px; font-size: 9px; font-weight: 700; letter-spacing: 0.72px; text-transform: uppercase; color: var(--fff-muted-3); }
.prix-index > span { display: block; font-size: 18px; font-weight: 700; line-height: 1; color: var(--fff-navy); }
.prix-sejour-barre { text-decoration: line-through; font-weight: 700; letter-spacing: 0; }
.prix-index .prix-sejour-barre { margin-left: 4px; }
/* Bons plans : carte horizontale (image à gauche).
   La colonne droite compte 1 à 3 blocs (titre, étoiles, accroche) : 3 lignes
   auto + 1 ligne souple, et le pied est ancré sur la DERNIÈRE ligne. Avec une
   grille à nombre de lignes fixe, un bloc de plus renvoyait le pied sous
   l'image, dans la colonne de gauche. */
.bons-plans .content { display: grid; grid-template-columns: 200px minmax(0, 1fr); grid-template-rows: repeat(3, auto) 1fr; }
.bons-plans .content > a { grid-column: 1; grid-row: 1 / -1; aspect-ratio: auto; height: 100%; min-height: 150px; }
.bons-plans .content > :not(a) { grid-column: 2; }
.bons-plans .h4 { padding-right: 20px; }
.bons-plans .fff-card-foot { grid-row: -2 / -1; align-self: end; margin-top: 14px; }

/* Carrousel = bloc « institution » du Figma : texte à gauche, visuel à droite */
#slider-orgas { padding: 56px 0 8px; }
.sliding { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 560px); gap: 56px; align-items: center; }
.background--container { order: 2; min-width: 0; }
#carousel { position: relative; border-radius: 6px; overflow: hidden; aspect-ratio: 560 / 330; background: var(--fff-navy); }
.slider-pistes > div { position: absolute; inset: 0; display: none; }
.slider-pistes > div.active { display: block; }
.slider-pistes a { display: block; height: 100%; color: var(--fff-white); }
.carou-img { width: 100%; height: 100%; object-fit: cover; }
.slider-pistes a > div { position: absolute; left: 0; right: 0; bottom: 0; padding: 60px 28px 26px; background: linear-gradient(180deg, rgba(0, 33, 64, 0) 0%, rgba(0, 33, 64, 0.82) 100%); }
.carou-title { display: block; font-size: 22px; font-weight: 700; letter-spacing: 0.44px; text-transform: uppercase; color: var(--fff-white); }
.carou-desc { font-size: 13px; line-height: 1.5; color: var(--fff-hero-text); }
.slider-puces { position: absolute; right: 20px; bottom: 16px; z-index: 2; display: flex; gap: 6px; }
.slider-puces button { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 50%; background: rgba(255, 255, 255, 0.45); }
.slider-puces button.active { background: var(--fff-white); }
#carousel > button[data-bs-slide] {
  position: absolute; top: 50%; z-index: 2; transform: translateY(-50%);
  width: 36px; height: 36px; padding: 0; border: 0; border-radius: 50%;
  background: rgba(255, 255, 255, 0.92); color: var(--fff-navy); font-size: 13px;
}
#carousel > button[data-bs-slide="prev"] { left: 14px; }
#carousel > button[data-bs-slide="next"] { right: 14px; }
.width-presentation { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 9px; }
.text-slider { margin: 0; font-size: 30px; font-weight: 700; line-height: 1.18; letter-spacing: 0; text-transform: uppercase; color: var(--fff-navy); text-wrap: pretty; }
/* Figma : la 2e phrase est un bloc à part (bleu, 9 px d'écart) */
.text-slider strong { display: block; margin-top: 9px; color: #004687; }
.savoir-plus .btn-process-cmd-one { min-height: 44px; padding: 0 22px; border-radius: 3px; font-size: 13px; letter-spacing: 0.65px; }

/* Modules : carte / vidéo / instagram */
.home-modules { padding: 48px 0; }
.home-modules > div { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px; }
.home-modules > div > div:first-child { grid-column: 1 / -1; }
.home-modules > div > div { min-width: 0; }
.carte-map, .moduleVid, .insta-block { display: flex; flex-direction: column; gap: 22px; }
.destinations, .moduleVid > div:first-child > .video, .insta-block > div:first-child > .video {
  text-transform: uppercase;
  font-size: 30px; font-weight: 700; line-height: 1; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-navy);
}
#map { min-height: 320px; border-radius: 8px; overflow: hidden; background: var(--fff-bg); box-shadow: inset 0 0 0 1px var(--fff-line); }
#videoRow { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; }
#videoRow iframe, #videoRow video { width: 100%; aspect-ratio: 16 / 9; border: 0; border-radius: 6px; }
.insta-card__link { display: block; background: var(--fff-white); border: 1px solid var(--fff-line); border-radius: 8px; }
.insta-card__header { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; font-size: 13px; color: var(--fff-navy); }
.insta-card__date { margin: 0; font-size: 11px; color: var(--fff-muted-2); }
.insta-card__media img { width: 100%; aspect-ratio: 1 / 1; object-fit: cover; border-radius: 6px; }
.insta-card__caption { font-size: 13px; line-height: 1.5; color: var(--fff-text); }

/* Bandeau images (cartes catégories) */
.bandeau-container { padding: 48px 0; }
.bandeau-container > div { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 28px; }
.bandeau-image-col { min-width: 0; }
.bandeau-image-container {
  display: flex; flex-direction: column; height: 100%;
  background: var(--fff-white); border: 1px solid var(--fff-line-3); border-radius: 10px; overflow: hidden;
  transition: box-shadow .2s ease, transform .2s ease;
}
.bandeau-image-container:hover { box-shadow: var(--fff-shadow-soft); transform: translateY(-2px); }
.bandeau-image-container img { width: 100%; height: 220px; object-fit: cover; }
.bandeau-image-title { padding: 26px 30px; border-top: 5px solid var(--fff-navy); }
.bandeau-image-col:nth-child(even) .bandeau-image-title { border-top-color: var(--fff-blue); }
.bandeau-image-title h2 { font-size: 22px; line-height: 1; letter-spacing: 0.44px; }

/* ====================================================================
   8. LAYOUT — PIED DE PAGE (identique sur les 3 pages)
   Règle 3 : aucun <div> ajouté. Sélecteurs d'enfant direct respectés.
   ==================================================================== */
/* Couleurs du pied de page FIXES (charte fff) : les classes ciblées par style_config.css
   (.espace-libre, .big-footer, .footer-bg) ont été retirées du markup, le back-office
   n'a donc plus de prise ici. */
/* Espace libre = ligne newsletter + note d'avis du footer Figma */
#espace-libre { position: relative; display: flow-root; margin-top: 60px; padding: 0 0 26px; overflow: visible; background: var(--fff-footerblue); color: var(--fff-white); }
/* Logo à cheval sur le bord supérieur du pied de page (Figma : groupe à -60 px
   → 60 px au-dessus du navy, le reste dedans, d'où l'effet « coupé »).
   Le lockup complet (écusson + « Académie » + CLAIREFONTAINE) est une IMAGE DU MARKUP
   (`.footer-logo`, cf. layout-footer-espace-libre.html.twig), comme dans le squelette
   `new_retour` (`.ft3__logo > img`) — plus de fonds CSS sur deux pseudo-éléments.
   Hauteur 140 px = l'encombrement exact de l'ancien montage (80 + 5 + 43 + 12) :
   le reste du pied de page ne bouge pas. `#espace-libre` est en `display: flow-root`,
   la marge négative ne s'échappe donc pas de la section. */
.footer-logo { display: block; width: auto; height: 140px; margin: -60px auto 36px; }
#espace-libre > div { width: 100%; max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 0 var(--fff-gutter); }
#espace-libre > div > div { display: flex; justify-content: space-between; align-items: center; gap: 24px 40px; flex-wrap: wrap; }
#espace-libre > div > div > div:first-child > div { display: flex; align-items: flex-start; gap: 40px; flex-wrap: wrap; }
div.icone { display: flex; align-items: center; gap: 10px; }
img.icone { width: 18px; height: 18px; object-fit: cover; border-radius: 50%; }
.espace-liens { font-size: 12px; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; }

/* Bloc newsletter (Figma : titre + accroche + champ + bouton).
   L'icone rendue par le back-office devant le lien n'existe pas dans la maquette. */
.icone-newsletter { align-items: flex-start; gap: 0; flex: none; }
.icone-newsletter > img.icone { display: none; }
.news-bloc { display: flex; flex-direction: column; gap: 6px; flex: none; }
.news-titre { font-size: 18px; font-weight: 700; line-height: 1.1; letter-spacing: 0.36px; text-transform: uppercase; color: var(--fff-white); }
.news-sous { font-size: 12px; line-height: 1.5; color: #a7b8cc; }
.news-ligne { display: flex; align-items: stretch; gap: 12px; }
.news-champ {
  width: 230px; height: 36px; border: 1px solid #34557a; border-radius: 3px;
  background: rgba(255, 255, 255, 0.05); font-size: 12px; color: var(--fff-white);
}
.news-champ::placeholder { color: #8ea1b6; }
.news-champ:focus { outline: 0; border-color: var(--fff-gold); }
.inscripNews { display: inline-flex; align-items: center; min-height: 36px; border-radius: 3px; background: var(--fff-red); white-space: nowrap; transition: transform .12s ease, box-shadow .12s ease; }
.inscripNews:hover { transform: translateY(-1px); box-shadow: 0 8px 18px rgba(0, 20, 45, 0.25); }
.inscripNews .espace-liens { font-size: 12px; letter-spacing: 0.6px; }
#espace-libre a:not(.inscripNews):hover .espace-liens { text-decoration: underline; }

/* Paiement sécurisé + modes de règlement (squelette : `.ft3__pay` / `.ft3__secure`).
   Le badge est l'image du projet (`paiement-securise.png`) : son fond blanc est
   incrusté, inutile de reposer le `background: #fff` + padding que le squelette
   applique à ses <svg>. Le texte vient du back-office (globale `listeMode`), d'où
   le `max-width` en `ch` : la longueur de la liste n'est pas maîtrisée ici. */
.espace-libre-pay { display: flex; flex-direction: column; align-items: flex-start; gap: 14px; flex: 0 1 320px; }
.espace-libre-pay .pay-badge { width: 160px; height: auto; border-radius: 2px; }
.espace-libre-pay p { margin: 0; max-width: 44ch; font-size: 12px; line-height: 1.6; color: var(--fff-white); }

/* Note d'avis, alignée à droite */
.espace-libre-note { display: flex; flex-direction: column; align-items: flex-end; gap: 5px; text-align: right; }
.note-val { display: flex; align-items: baseline; gap: 3px; font-size: 34px; font-weight: 700; line-height: 1; letter-spacing: -0.34px; color: var(--fff-white); }
.note-sur { font-size: 16px; font-weight: 700; color: var(--fff-gold); }
.note-lbl { font-size: 10px; letter-spacing: 0.3px; color: #a7b8cc; }

/* Big footer — enchaîne visuellement sur #espace-libre (même teinte, filet) */
#big-footer { padding: 0 0 34px; background: var(--fff-footerblue); color: var(--fff-white); }
#big-footer > .container {
  width: 100%; max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 0 var(--fff-gutter);
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)) minmax(0, 0.72fr); gap: 0 40px;
}
/* Ligne de réassurance : écrite en 1er dans le gabarit, posée en 1re ligne sur toute la largeur,
   encadrée de deux filets (Figma). Les colonnes de liens suivent en 2e ligne. */
#big-footer > .container > .reassurance-index { grid-row: 1; grid-column: 1 / -1; margin-bottom: 27px; padding: 6px 0; border-top: 1px solid rgba(255, 255, 255, 0.12); border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
#big-footer > .container > div:not(.reassurance-index) { grid-row: 2; }
#big-footer ul { list-style: none; margin: 0; padding: 0; }

/* Colonnes de liens : titre en dur (doré), liens du back-office (blancs) */
.colonne-liens { display: flex; flex-direction: column; gap: 7px; }
.colonne-titre { font-size: 12px; font-weight: 800; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-gold); }
.colonne-liens a { display: block; font-size: 11.5px; font-weight: 400; line-height: 19.5px; color: var(--fff-white); text-decoration: none; transition: opacity .15s ease; }
.colonne-liens a:hover { opacity: .7; text-decoration: underline; color: var(--fff-white); }

/* Réassurance (ex-« modes de règlement ») : 4 garanties en ligne, picto + libellé */
.reassurance-index ul { display: flex; align-items: center; gap: 14px 40px; flex-wrap: wrap; list-style: none; margin: 0; padding: 0; }
.reassurance-index ul li { display: flex; align-items: center; gap: 9px; font-size: 11.5px; font-weight: 700; line-height: 1.2; white-space: nowrap; color: var(--fff-white); }
.reassurance-index img { width: 16px; height: 16px; margin: 0; object-fit: contain; }

/* 5e colonne « Nos réseaux » (titre : .colonne-titre, commun aux colonnes de liens) */
.colonne-rs { display: flex; flex-direction: column; gap: 13px; }
.icone-rs { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.icone-rs a { display: flex; align-items: center; justify-content: center; width: 30px; height: 30px; border: 1px solid #34557a; border-radius: 50%; transition: transform .15s ease, border-color .15s ease; }
.icone-rs a:hover { transform: translateY(-2px); border-color: var(--fff-white); }
.icone-rs img.icone { width: 14px; height: 14px; border: 0; border-radius: 0; object-fit: contain; }

/* Bande de copyright : rouge fff, texte blanc */
#footer { position: relative; }
#footer > footer { background: var(--fff-red); color: var(--fff-white); text-align: center; }
/* Liste de liens du bloc non reprise (remontée dans « En savoir plus ») : les règles restent
   au cas où le back-office la rendrait malgré tout. */
.footer { display: flex; justify-content: center; flex-wrap: wrap; gap: 6px 24px; margin-bottom: 8px; }
.footer > div > a { font-size: 10px; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; }
.footer > div > a:hover { text-decoration: underline; }
#footer > footer p { margin: 0; font-size: 10px; line-height: 1.4; }
#footer > footer p a { color: inherit; text-decoration: underline; }

/* ====================================================================
   9. MODALES (Bootstrap 5 assure l'affichage ; ici : habillage)
   ==================================================================== */
/* Repli sans Bootstrap : une modale non ouverte reste hors flux (BS met .modal.show en display:block) */
.modal:not(.show) { display: none; }
.modal.show { position: fixed; inset: 0; z-index: var(--bs-modal-zindex, 1055); display: block; overflow-y: auto; }
.modal-dialog { max-width: 560px; margin: 40px auto; }
.modal-dialog.modal-lg { max-width: 820px; }
.modal-content { border: 0; border-radius: 8px; overflow: hidden; font-family: var(--fff-font); color: var(--fff-text); box-shadow: var(--fff-shadow-card); }
.modal-header { display: flex; justify-content: space-between; align-items: center; gap: 16px; padding: 16px 24px; background: var(--fff-navy); color: var(--fff-white); border: 0; }
.modal-title { margin: 0; font-size: 14px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-white); }
.modal-header button { padding: 0 4px; border: 0; background: none; color: var(--fff-white); font-size: 26px; line-height: 1; }
.modal-body { padding: 24px; font-size: 13px; line-height: 1.6; }
.modal-footer { display: flex; justify-content: flex-end; align-items: center; gap: 10px; flex-wrap: wrap; padding: 16px 24px; border-top: 1px solid var(--fff-line-2); }
.modal-footer button { min-height: 40px; padding: 0 22px; border-radius: 4px; font-size: 13px; font-weight: 700; letter-spacing: 0.65px; text-transform: uppercase; }
.modal-footer > div { margin-right: auto; }
#depart-footer button, #saveCookies { border: 1px solid var(--fff-field); background: var(--fff-white); color: var(--fff-navy); }
/* Newsletter */
.newsletter-modal .modal-body > p { margin-bottom: 12px; }
/* Artefact de la maquette statique : fragment de ligne newsletter rendu hors de la modale. Sans effet sur le site réel. */
#wrapper > .newsletter-ligne { display: none; }
.newsletter-ligne { display: grid; grid-template-columns: minmax(160px, 220px) minmax(0, 1fr); gap: 12px; align-items: center; }
.newsletter-ligne label { display: inline; font-size: 13px; font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--fff-text); }
.newsletter-ligne > div:first-child label, .required { font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; color: var(--fff-muted-2); }
.required::after { content: " *"; color: var(--fff-red); }
.newsletter-ligne input[type="checkbox"] + label { font-size: 13px; }
.newsletter-ligne > div:only-child { grid-column: 1 / -1; }
#result:not(:empty), #error:not(:empty) { padding: 8px 12px; border-radius: 4px; font-weight: 700; font-size: 12px; }
#result:not(:empty) { background: rgba(31, 141, 73, 0.1); }
#error:not(:empty) { background: rgba(227, 6, 19, 0.08); }
cap-widget { display: block; }
/* Favoris */
.content-favoris-modal { min-height: 80px; }
.footerFavoris:empty { display: none; }
/* Cookies */
.logocookies { display: flex; justify-content: center; }
.cookies-logo { height: 64px; width: auto; }
.cookies-texte { font-size: 13px; line-height: 1.6; text-align: center; }
.cookies-texte a { text-decoration: underline; }
.cookieButtonsBlock { display: flex; justify-content: center; gap: 10px; flex-wrap: wrap; }
.btn-cookies { background: var(--fff-navy); color: var(--fff-white); }
.btn-cookies:hover { color: var(--fff-white); box-shadow: 0 8px 18px rgba(0, 20, 45, 0.16); }
.navigate-without-accepting.btn-cookies { background: transparent; border-color: var(--fff-field); color: var(--fff-navy); }
.navigate-without-accepting.btn-cookies:hover { color: var(--fff-navy); }
.navigate-accepting.btn-cookies { background: var(--fff-blue); }
.cookies-categorie { display: flex; justify-content: space-between; align-items: center; gap: 16px; border-bottom: 1px solid var(--fff-line-2); font-weight: 700; color: var(--fff-navy); }
.cookies-categorie > div { display: inline-flex; gap: 6px; }
.accept, .refuse { min-height: 30px; padding: 0 14px; border: 1px solid var(--fff-field); border-radius: 3px; background: var(--fff-white); font-size: 11px; font-weight: 700; color: var(--fff-navy); }
.accept.active, .accept[aria-pressed="true"] { background: var(--fff-green); border-color: var(--fff-green); color: var(--fff-white); }
.refuse.active, .refuse[aria-pressed="true"] { background: var(--fff-blue); border-color: var(--fff-blue); color: var(--fff-white); }
.btn-gerer-cookies { position: fixed; left: 16px; bottom: 16px; z-index: 45; min-height: 32px; font-size: 11px; box-shadow: var(--fff-shadow-soft); }

/* Loader */
.loaderFront { position: fixed; inset: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; background: rgba(255, 255, 255, 0.94); }
.innerFront { text-align: center; }
.loader-logo { height: 80px; width: auto; }
.loader-message { font-size: 14px; letter-spacing: 1px; }
.spinLoader { width: 36px; height: 36px; margin: 16px auto 0; border: 3px solid var(--fff-line); border-top-color: var(--fff-blue); border-radius: 50%; animation: fff-spin .8s linear infinite; }
@keyframes fff-spin { to { transform: rotate(360deg); } }

/* Mode prévisualisation */
.modePrevisualisation { position: fixed; top: 0; left: 0; right: 0; z-index: 2000; padding: 6px 12px; background: var(--fff-gold); color: #2a2410; text-align: center; font-size: 11px; font-weight: 900; letter-spacing: 0.9px; text-transform: uppercase; }

/* ====================================================================
   10. MODULES À CRÉER CÔTÉ VACKELYS (présents dans le Figma, absents du
   site). Classes préfixées fff-. Hors marqueurs DEBUT/FIN.
   ==================================================================== */
/* Chiffres clés
   Reprise de `.section--tight > .keyfigs` du squelette
   FFF_Academie_V16_1_Accueil.html (index-fff-stats) : bandeau de 4 cellules
   entre un filet bleu épais en haut et un filet clair en bas, séparées par
   un filet vertical. Le squelette nomme ces règles .keyfigs / .keyfig /
   .keyfig__n / .keyfig__l ; variables de la charte projet à la place des
   siennes (--line -> --fff-line-3, --line-soft -> --fff-line, --muted ->
   --fff-muted).
   Espacements portés ici (padding des cellules, padding-block de la section
   en clamp comme `.section--tight`), et non plus en classes Bootstrap du
   gabarit : le squelette ne les exprime qu'en clamp. */
.fff-stats { padding-block: clamp(40px, 5vw, 64px); }
.fff-stats-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border-top: 4px solid var(--fff-blue); border-bottom: 1px solid var(--fff-line); }
.fff-stat { padding: 22px 24px; border-left: 1px solid var(--fff-line-3); }
.fff-stat:first-child { border-left: 0; }
.fff-stat strong { display: block; font-family: var(--font-title); font-size: clamp(30px, 3.4vw, 46px); font-weight: 600; line-height: 1.05; color: var(--fff-blue); }
.fff-stat span { display: block; margin-top: 4px; font-size: 11.5px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--fff-muted); }

/* Tableau des sessions */
.fff-sessions-table { border: 1px solid var(--fff-line); border-radius: 5px; overflow: hidden; background: var(--fff-white); }
.fff-sessions-table table { width: 100%; border-collapse: collapse; }
.fff-sessions-table th { padding: 13px 20px; background: var(--fff-navy); text-align: left; font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-white); }
.fff-sessions-table td { padding: 15px 20px; border-top: 1px solid var(--fff-line-2); font-size: 13px; font-weight: 700; color: var(--fff-navy); vertical-align: middle; }
.fff-sessions-table td.fff-muted { color: var(--fff-muted); font-weight: 400; }
.fff-sessions-table td:last-child { text-align: right; }
.fff-status { font-size: 12px; font-weight: 700; }
.fff-status--ok { color: var(--fff-green); }
.fff-status--wait { color: var(--fff-orange); }
.fff-status--last { color: var(--fff-blue); }
.fff-status--complet { color: var(--fff-muted); }

/* ---- Variantes de ligne : FORMAT (catégorie) + tag Féminin ----
   Reprise du tableau `.sess` du squelette FFF_Academie_V16_1_Accueil :

     tr[data-k="exp"]   catégorie 2 (Expérience)   liseré bleu à gauche
     tr[data-k="imm"]   catégorie 3 (Immersion)    fond bleuté, liseré or
     tr.is-fem          un tag de getIdTag         fond rosé, liseré rouge

   Mêmes clés `data-k` / `.is-fem` que les cartes séjour (section 17), posées
   par index-fff-sessions.html.twig d'après `formatId` et `feminin` de
   UniverselService::getSelectionDepart. Une ligne sans catégorie listée n'a
   pas de `data-k` et garde la ligne blanche, sans liseré.

   /!\ L'ORDRE de ces règles est celui du squelette et il COMPTE : `.is-fem`
       est écrit APRÈS `[data-k="imm"]` et, à spécificité égale, l'emporte
       donc sur lui. Une ligne Immersion + Féminin prend le fond rosé et le
       liseré rouge, pas le bleuté et l'or. Ne pas les remonter.

   Le liseré est un `box-shadow` interne et non une bordure : la bordure
   gauche des cellules de bord serait rognée par l'`overflow: hidden` du
   cadre, et un `border-left` décalerait le texte de la 1re colonne.

   Le titrage Équipe de France du squelette sur les lignes Immersion
   (--font-edf-title) n'est PAS repris, comme pour les cartes séjour :
   charger une police de plus est une passe à part entière (section 0 bis). */
.fff-sessions-table tr[data-k="exp"] td:first-child { box-shadow: inset 5px 0 0 var(--fff-blue); }
.fff-sessions-table tr[data-k="imm"] td { background: var(--fff-edf-tint); border-top-color: var(--fff-edf-tint-line); }
.fff-sessions-table tr[data-k="imm"] td:first-child { box-shadow: inset 5px 0 0 var(--fff-edf-gold); }
.fff-sessions-table tr.is-fem td { background: var(--fff-red-tint); }
.fff-sessions-table tr.is-fem td:first-child { box-shadow: inset 5px 0 0 var(--fff-red); }

/* CTA des lignes Immersion : charte Équipe de France, or sur bleu
   (squelette : `.btn--edf-blue`, posé sur le bouton des lignes
   data-k="imm"). Piloté ici par `data-k` et non par une classe sur le
   bouton : le gabarit n'a alors rien à poser, la ligne porte déjà sa
   variante.

   Les lignes Immersion + Féminin gardent CE bouton : le squelette écrit
   `btn--edf-blue` sur ses lignes `is-fem` Immersion, le liseré rouge ne
   change que le cadre de la ligne. D'où le ciblage sur `data-k` seul.

   `.fff-btn` est une classe DU PROJET, librement recolorée — à la
   différence de `.btn-process-cmd-one/two` et des autres classes dont
   style_config.css verrouille la couleur du back-office en !important.

   Pas de règle `:hover` : ce sélecteur est plus spécifique que
   `.fff-btn:hover` (section 3), le texte reste donc or au survol, et la
   seule autre propriété du survol est la transformation, conservée. */
.fff-sessions-table tr[data-k="imm"] .fff-btn { background: var(--fff-edf-blue); color: var(--fff-edf-gold); }

/* Pastille de format, en couleur d'univers (squelette : `.fmt--exp` /
   `.fmt--imm`). `.fff-fmt` seule — séjour d'une catégorie hors getIdCateg —
   garde la couleur du texte de la cellule. */
.fff-fmt { font-weight: 700; white-space: nowrap; }
.fff-fmt--exp { color: var(--fff-blue); }
.fff-fmt--imm { color: var(--fff-edf-blue); }

/* Étiquette du tag, à la suite du nom du stage (squelette : `.femtag`). */
.fff-femtag { display: inline-flex; align-items: center; margin-left: 8px; padding: 3px 8px; border-radius: 999px; background: var(--fff-red); font-size: 10px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; color: var(--fff-white); vertical-align: middle; }

/* Témoignage */
.fff-temoignage { padding: 48px 0; }
.fff-temoignage-grid { display: grid; grid-template-columns: 400px minmax(0, 1fr); gap: 56px; align-items: center; }
.fff-temoignage-img { height: 260px; border-radius: 6px; overflow: hidden; }
.fff-temoignage-img img { width: 100%; height: 100%; object-fit: cover; }
.fff-temoignage blockquote { margin: 0; display: flex; flex-direction: column; gap: 13px; align-items: flex-start; }
.fff-temoignage blockquote p { margin: 0; font-size: 34px; font-weight: 300; line-height: 1.4; color: var(--fff-navy); text-wrap: pretty; }
/* Figma : la chute de la citation est en rouge */
.fff-temoignage-accent { color: var(--fff-blue); }
.fff-temoignage cite { font-style: normal; font-size: 11px; font-weight: 700; letter-spacing: 1.21px; text-transform: uppercase; color: var(--fff-muted-2); }

/* ====================================================================
   11. PAGES INTÉRIEURES (résultats, séjour) — body.fff-page-inner
   En-tête réduit à la barre blanche, moteur en bandeau sous la barre.
   ==================================================================== */
.fff-page-inner .header { min-height: var(--fff-header-h); display: block; background-image: none !important; background-color: var(--fff-white); }
.fff-page-inner .header::before { display: none; }
.fff-page-inner .header .fff-hero-body { padding: 0; }
/* Le H1 SEO reste dans le DOM (accessible) mais la page intérieure porte son propre H1 */
.fff-page-inner .titre-site-index { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
/* Moteur (Figma Recherche) : barre segmentée blanche, à cheval sur le bas du héros.
   Le formulaire est inclus JUSTE APRÈS le héros (resultatrecherche.html.twig) et
   occupe une hauteur nulle : `top` se compte donc depuis le BAS du héros, et la
   valeur est négative pour faire remonter la barre par-dessus le visuel.
   28px = le débord haut de la maquette (héros de 315px, barre de 78px posée à
   287px de son sommet). Sous 992px la règle repasse en `position: static` et la
   barre se range en flux, entre le héros et le compteur — c'est tout l'intérêt
   de cette place dans le DOM. */
.fff-page-inner #searchForm { position: relative; z-index: 6; height: 0; max-width: none; margin: 0; padding: 0; }
.fff-page-inner #recherche { position: absolute; left: 0; right: 0; top: -28px; padding: 0 var(--fff-gutter); }
/* Pas d'overflow:hidden ici : il rognerait l'ombre portée de la barre blanche. */
.fff-page-inner .moteur-bandeau { max-width: var(--fff-container); margin: 0 auto; gap: 0; padding: 0; border-radius: 4px; }
/* Barre segmentée : ombre portée du Figma (0 18 44 rgba(0,33,64,.22)) + liseré rapproché */
.fff-page-inner .barre-icone-1 > div, .fff-page-inner .barre-icone-1 > div:has(> .fff-search-actions) { gap: 0; align-items: stretch; padding: 0; border-radius: 4px; box-shadow: 0 18px 44px 0 rgba(0, 33, 64, 0.22), 0 3px 8px 0 rgba(0, 33, 64, 0.14); overflow: hidden; }
.fff-page-inner .barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: repeat(3, minmax(0, 1fr)) max-content; }
.fff-page-inner .fff-field { padding: 10px 18px; border-right: 1px solid var(--fff-line-2); }
.fff-page-inner .moteur-bandeau label.visually-hidden { margin: 0 0 2px !important; font-size: 8px; letter-spacing: 0.8px; color: var(--fff-muted-3); }
.fff-page-inner .selectSearch { min-height: 20px; padding: 0 20px 0 0; border: 0; border-radius: 0; font-size: 13px; color: var(--fff-navy); background-position: right 4px center; }
.fff-page-inner .fff-search-actions { align-self: stretch; }
.fff-page-inner .btnSearch[type="submit"] { height: 100%; min-height: 55px; padding: 0 30px; border-radius: 0; border: 0; }
.fff-page-inner .btnSearch[type="submit"]::after { content: "Rechercher"; }
/* Page recherche : barre identique a la page categorie (71 px de haut) */
.fff-page-recherche .fff-field { gap: 6px; padding: 18px 24px; }
.fff-page-recherche .moteur-bandeau label.visually-hidden { margin: 0 0 6px !important; font-size: 9px; letter-spacing: 0.9px; }
.fff-page-recherche .selectSearch { font-size: 15px; }
.fff-page-recherche .btnSearch[type="submit"] { min-height: 71px;} // padding: 0 34px; 

/* ---- Résultats de recherche ---- */
/* Fil d'ariane : EN FLUX et en navy, juste au-dessus du compteur
   « N STAGES DISPONIBLES ». C'etait auparavant le surtitre doré posé sur le
   héros (Figma « TOUS LES STAGES · SAISON 2026 »), en `position: absolute`
   dans un `.fff-ariane-wrap` de hauteur nulle place avant le héros. Le
   gabarit héros l'inclut desormais dans `.fff-main`, d'ou la suppression du
   positionnement absolu et de l'or.
   `.fff-ariane-wrap` ne sert plus qu'au gabarit catégorie, qui le redéfinit
   en bandeau blanc (section 15). */
.fff-ariane-wrap { position: relative; z-index: 3; height: 0; padding: 0; }
.ariane-resultat ol { display: flex; flex-wrap: wrap; gap: 6px 8px; list-style: none; margin: 0; padding: 0; font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-navy); }
.ariane-resultat li { flex: 0 0 auto; }
.ariane-resultat li + li::before { content: "·"; margin-right: 8px; color: var(--fff-navy); }
.ariane-resultat li.active { color: var(--fff-navy); }
.ariane-resultat .link { color: var(--fff-navy); opacity: .7; }
.ariane-resultat .link:hover { color: var(--fff-blue); opacity: 1; }
/* Le fil reprend le décalage qui était sur `.fff-nb-resultats` : la barre
   blanche du moteur est en `position: absolute` et déborde d'une cinquantaine
   de pixels sous le héros. Le compteur qui suit n'a plus qu'un écart normal.
   Les deux n'existent que sur le gabarit héros. */
.fff-ariane-resultats { margin-top: 80px; }
.fff-hero-recherche {
  position: relative; margin-top: 0; min-height: 315px; padding: 104px 0 100px; color: var(--fff-white);
  background: linear-gradient(180deg, rgba(0, 33, 64, 0.72) 0%, rgba(0, 33, 64, 0.9) 100%), url(../../img/front/fff/recherche-hero.jpg) center / cover no-repeat;
}
.fff-hero-recherche .fff-container { display: flex; flex-direction: column; gap: 15px; }
.fff-hero-recherche .titre-principal-recherche.text-darkblue { color: var(--fff-white); }
.titre-principal-recherche { font-size: 34px; font-weight: 900; line-height: 1; letter-spacing: 0.68px; text-transform: uppercase; color: var(--fff-navy); text-wrap: balance; }
.texte-principal { max-width: 640px; }
.fff-hero-recherche .bpccText.text-darkblue { color: var(--fff-hero-text); }
.bpccText { margin: 0; font-size: 13px; line-height: 1.75; color: var(--fff-muted); }
/* Barre d'outils (tri + pagination) : carte blanche à cheval sur le héros */
.fff-toolbar {
  position: relative; z-index: 2; margin-top: 60px;
  display: flex; justify-content: space-between; align-items: center; gap: 12px 24px; flex-wrap: wrap;
  padding: 0;
}
/* Compteur de résultats (maquette) : « N STAGES DISPONIBLES ». Le décalage qui
   compense le débord de la barre blanche du moteur est passé sur le fil
   d'ariane, qui le précède maintenant : il ne reste ici qu'un écart normal.
   Absent du gabarit catégorie, dont l'en-tête a son propre compteur : là,
   `.fff-toolbar` garde son margin. */
.fff-nb-resultats { margin: 10px 0 0; font-size: 13px; font-weight: 700; letter-spacing: 0.9px; text-transform: uppercase; color: var(--fff-navy); }
.fff-nb-resultats + .fff-toolbar { margin-top: 14px; }
.fff-toolbar > div { min-width: 0; }
.fff-toolbar > div:first-child { flex: 1 1 auto; }
.fff-toolbar > div:last-child { flex: 0 0 auto; }
.filtres { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 0; }
.filtres::before { content: "Trier par"; margin-right: 4px; white-space: nowrap; font-size: 11px; font-weight: 700; letter-spacing: 0.9px; text-transform: uppercase; color: var(--fff-muted-2); }
.btn-group-sejour { display: inline-flex; align-items: center; gap: 6px; min-height: 28px; padding: 0 13px; border: 1px solid var(--fff-navy); border-radius: 20px; background: var(--fff-white); font-size: 10px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-navy); transition: background .15s ease, color .15s ease; }
.btn-group-sejour:hover, .btn-group-sejour.active, .btn-group-sejour[aria-current] { background: var(--fff-navy); color: var(--fff-white); }
.btn-sort-sejour-icon .fa { font-size: 10px; }
/* Filtre par format (haut droite des résultats) : pastilles Tous / Expérience / Immersion */
.fff-filtre-format { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap; }
.fff-filtre-format .btn-group-sejour { cursor: pointer; font-family: inherit; }
.fff-filtre-format .btn-group-sejour:not(.active):not(:hover) { border-color: var(--fff-line); }
.btn-group-sejour.filtre-immersion { border-color: var(--fff-blue) !important; color: var(--fff-blue); }
.btn-group-sejour.filtre-immersion:hover, .btn-group-sejour.filtre-immersion.active { background: var(--fff-blue); color: var(--fff-white); }
.fff-results > [hidden] { display: none; }
.barre-pagination { display: flex; justify-content: center; align-items: center; padding: 0; }
.fff-pagination-bottom { padding-top: 16px; padding-bottom: 48px; }
.fff-pagination-bottom .barre-pagination { justify-content: center; }
.pagination { display: flex; align-items: center; gap: 6px; list-style: none; margin: 0; padding: 0; }
.pagination > li > a, .pagination > li > span { display: inline-flex; align-items: center; justify-content: center; min-width: 30px; height: 30px; padding: 0 8px; border: 1px solid var(--fff-line); border-radius: 3px; background: var(--fff-white); font-size: 12px; font-weight: 700; color: var(--fff-navy); }
.pagination > li.active > span, .pagination > li.active > a { background: var(--fff-navy); border-color: var(--fff-navy); color: var(--fff-white); }
.pagination .pages-move .fa { font-size: 10px; }
/* Grille de résultats : tient avec 1 carte comme avec 30 */
/* Carte résultat (Figma) : image + badges, titre, ligne « durée · saison », encadré prix + bouton.
   Le bouton de carte porte .btn-process-cmd-one : sa couleur vient du back-office
   (le Figma montre un lien texte « VOIR → », impossible sans écraser style_config). */
.fff-results .background-search { box-shadow: none; border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; }
.fff-results .info-block { display: grid; grid-template-columns: minmax(0, 1fr) max-content; align-items: center; gap: 8px 0; padding: 6px 20px 18px; }
.fff-results .info-block::before { display: none; }
.fff-results .info-block > div:has(> .a-partir-de-bleu-nuit) { display: contents; }
.fff-results .reduction-recherche { display: none; }
.fff-results .duree-sejour { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 6px; margin: 0 0 15px; padding-bottom: 14px; border-bottom: 1px solid var(--fff-line-2); font-size: 12px; font-weight: 400; color: var(--fff-muted-2); }
.fff-results .duree-sejour > div { display: inline-flex; align-items: baseline; white-space: nowrap; }
.fff-results .duree-sejour > div + div::before { content: "·"; margin-right: 6px; color: var(--fff-muted-3); }
.fff-results .duree-sejour img { display: none; }
.fff-results .duree-sejour p { margin: 0; }
.fff-results .a-partir-de-bleu-nuit { grid-column: 1; grid-row: 2; padding: 9px 12px; border: 1px solid var(--fff-line-2); border-radius: 3px; }
.fff-results .a-partir-de { display: block; }
.fff-results .prix-block-recherche p { margin: 0; font-size: 9px; font-weight: 700; letter-spacing: 0.8px; text-transform: uppercase; color: var(--fff-muted-3); }
.fff-results .prix-block-recherche .prix-sejour-barre { display: none; } /* prix barré : absent des cartes du Figma */
.fff-results .prix-block-recherche .prix-sejour { font-size: 17px; font-weight: 700; }
.fff-results .prix-block-recherche .complet-font-recherche { padding: 0; border-radius: 0; background: none; font-size: 17px; font-weight: 700; letter-spacing: 0; text-transform: uppercase; color: var(--fff-blue); }
/* Stage complet : le lien reste actif (navy) quand une liste d'attente est ouverte */
.fff-results .bouton-dec-recherche.liste-attente { color: var(--fff-navy); white-space: nowrap; }
.fff-results .bouton-dec-recherche.liste-attente:hover { color: var(--fff-blue); }
/* Encadré prix + lien « Voir → » : une seule boîte, portée par les 2 cellules de la rangée.
   La classe .btn-process-cmd-one a été retirée du lien dans les gabarits : le Figma demande
   un lien texte, et la couleur de ce bouton est imposée en !important par le back-office. */
.fff-results .info-block { align-items: stretch; }
.fff-results .a-partir-de-bleu-nuit { grid-column: 1; grid-row: 2; display: flex; align-items: flex-end; min-height: 33px; padding: 0; border: 0; border-radius: 0; }
.fff-results .prix-block-recherche { width: 100%; }
.fff-results .info-block > .bouton-dec-recherche, .fff-results .bouton-dec-recherche {
  grid-column: 2; grid-row: 2; display: inline-flex; align-items: flex-end; justify-content: flex-end;
  min-height: 0; padding: 0 0 2px 10px; border: 0; border-radius: 0;
  background: none; font-size: 11px; font-weight: 700; letter-spacing: 0.44px; text-transform: uppercase; color: var(--fff-navy);
}
.fff-results .bouton-dec-recherche:hover { background: none; box-shadow: none; transform: none; color: var(--fff-blue); }
.fff-results { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 22px; padding-top: 24px; padding-bottom: 8px; }
.fff-results > div { min-width: 0; }
.fff-results .background-search { position: relative; display: flex; flex-direction: column; height: 100%; transition: box-shadow .2s ease, transform .2s ease; }
.fff-results .background-search:hover { box-shadow: var(--fff-shadow-soft); transform: translateY(-2px); }
.fff-results .background-search > div:first-child { order: 3; }
.fff-results .background-search > div:first-child > div { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; padding: 18px 20px 0; }
.fff-results .background-search > div:first-child h2 { min-width: 0; }
.fff-results .background-search > div:nth-child(2) { display: contents; }
.fff-results .image-block { order: 1; }
/* Note en étoiles : juste SOUS le visuel, entre la photo et le titre.
   Pas sur la photo (elle porte déjà la pastille d'état, l'étiquette
   format/âge et le cœur favori), et plus dans `.fff-card-foot` : ce pied est
   aplati en `display: contents`, l'étoile y devenait un item de la grille de
   `.info-block` et, la grille plaçant le bloc prix en ligne 2, poussait
   `.duree-sejour` (et son filet) en ligne 3, SOUS le prix.
   Le span est donc sorti du pied dans shared-carte-sejour.html.twig, et les
   `order` du titre / bloc info / description sont décalés d'un cran. */
.fff-results .starsAvis { order: 2; padding: 12px 20px 0; font-size: 11px; line-height: 1; }
/* Les 18px de respiration sous le visuel sont portés par la note quand elle
   existe : sinon le titre les ajouterait une seconde fois. */
.fff-results .background-search:has(.starsAvis) > div:first-child > div { padding-top: 6px; }
.fff-results .info-block { order: 4; }
.fff-results .background-search > div:nth-child(3) { order: 5; }
/* 16/9 : meme ratio que le visuel de la carte d'accueil (section 7) et que
   `.mcard__media` du squelette V16. 378/170 etait la largeur reelle d'une
   colonne de resultats, soit un visuel tres bas. */
.image-block { position: relative; aspect-ratio: 16 / 9; overflow: hidden; background: var(--fff-bg); }
.image-block > a { display: block; height: 100%; }
.image-block img { width: 100%; height: 100%; object-fit: cover; }
/* PLUS DE PASTILLE D'ETAT SUR LE VISUEL : les pastilles COMPLET et
   DISPONIBLE (`.complet-recherche` / `.dispo-recherche`) ont ete retirees du
   gabarit, le creneau haut droite revenant a l'etiquette d'age — comme
   `.mcard__media .badge--age` du squelette FFF_Academie_V16_4_Sessions.html.
   Leurs regles de position et de couleur sont donc parties avec elles ;
   `.complet` (fiche sejour, galerie) et `.complet-font-recherche` (etat ecrit
   a la place du prix) subsistent, cf. section 12.

   L'etat reste connu de la carte : `shared-carte-sejour` pose `.is-complet`
   sur la racine quand `isComplet`, ce qui grise le lien « Voir » (Figma).
   Ne pas rebrancher ce grisage sur `.complet-font-recherche` : ce dernier
   suit `minPrice`, pas `maxPrice`, et ce sont deux champs distincts (cf. la
   note en tete de recherche-resultats.html.twig). */
.fff-results .background-search.is-complet .bouton-dec-recherche:not(.liste-attente) { color: var(--fff-muted-2); }
/* Étiquettes du visuel : le FORMAT (Expérience / Immersion) a gauche,
   l'AGE a droite. Wrapper commun, seul le format porte
   `.etiq-format-recherche` — d'ou le `:not()` qui renvoie l'age a droite. */
.etiq-age-recherche { position: absolute; left: 12px; top: 12px; z-index: 1; }
.etiq-age-recherche:not(.etiq-format-recherche) { left: auto; right: 12px; }
/* Pastille Immersion : or sur le bleu profond de la charte « Equipe de
   France » (--fff-edf-*, section 1), et non plus bleu sur blanc. Regle de
   BASE, donc valable partout ou la pastille est rendue : carte de resultats
   (shared-carte-sejour), carte des coups de coeur (index-sejour-card) et
   en-tete de la fiche sejour (sejour-resume). La pastille Expérience, elle,
   garde le navy de `.rectangle-index`. */
.rectangle-index.etiq-immersion { background: var(--fff-edf-gold); color: var(--fff-edf-deep); }
.sejName-recherche { display: block; padding: 0; font-size: 15px; line-height: 1.1; letter-spacing: 0.3px; }
.fff-results .sejName-recherche { font-size: 21px; letter-spacing: 0; }
.sejName-recherche.h4 { padding: 0; }
.favoris-recherche { width: 30px; padding: 0; flex-shrink: 0; font-size: 13px; }
.favoris-recherche:hover { color: var(--fff-blue); border-color: var(--fff-blue); }
/* Favori sur le visuel : cœur rouge sous l'étiquette d'âge (haut droite),
   dont il garde le décalage de 40px — la pastille d'état qui occupait ce
   créneau a été retirée du gabarit.
   Vide par défaut, plein quand le JS pose `.disabled` (séjour déjà en favori). */
.image-block .favoris-recherche {
  position: absolute; right: 12px; top: 40px; z-index: 2;
  display: flex; align-items: center; justify-content: center; /* écrase `.image-block > a { display: block }` */
  width: 28px; height: 28px; min-height: 0; padding: 0;
  border: 0; border-radius: 50%; background: transparent;
  font-size: 18px; color: var(--fff-red);
}
.image-block .favoris-recherche:hover { color: var(--fff-blue); transform: scale(1.1); }
.favoris-recherche .favori-plein, .favoris-recherche.disabled .favori-vide { display: none; }
.favoris-recherche.disabled .favori-plein { display: inline-block; }
.info-block { display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-auto-rows: auto; align-items: end; gap: 0 12px; padding: 6px 16px 14px; flex: 1; }
.info-block::before { content: ""; grid-column: 1 / -1; grid-row: 3; height: 1px; margin-top: 10px; background: var(--fff-line-2); }
/* Figma : la carte résultat n'affiche ni pictos ni description ; les blocs restent dans le DOM (masqués).
   La description est le 3e div de `.background-search`, et elle est OPTIONNELLE :
   la viser par `:last-child` la confond avec le bloc image + infos sur les cartes
   qui n'en ont pas — la carte ne montrait alors que son titre, et sa `.duree-sejour`
   perdait la couleur de la variante Immersion (section 20), le `div` du selecteur
   suffisant à le faire gagner. D'où `:nth-child(3)`, qui ne peut viser que la
   description. Même raison pour les trois autres regles ci-dessous et plus bas. */
.fff-results .sejour-pictos, .fff-results .background-search > div:nth-child(3), .fff-results .bonplan-recherche { display: none; }
.sejour-pictos { grid-column: 1 / -1; grid-row: 1; display: flex; align-items: center; gap: 8px; list-style: none; margin: 0; padding: 0; }
.sejour-pictos .icons { width: 18px; height: 18px; margin: 0; color: var(--fff-muted-2); }
.sejour-pictos .icons img { width: 18px; height: 18px; object-fit: cover; border-radius: 50%; }
.sejour-pictos .icons .fa { font-size: 14px; }
.sejour-pictos .icons .fa-lg { font-size: 15px; }
.reduction-recherche { grid-column: 1 / -1; grid-row: 2; display: flex; align-items: center; gap: 8px; border-radius: 0; background: none; font-size: 12px; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--fff-blue); }
.reduction-recherche > div:first-child { flex: 0 0 auto; }
.bonplan-recherche { display: block; width: 18px; height: 18px; padding: 0; border-radius: 50%; object-fit: cover; }
.descrip-bonplan-recherche { margin: 0; }
.info-block > .fff-card-foot { grid-column: 1; grid-row: 4; display: flex; flex-direction: column; align-items: flex-start; gap: 6px; margin: 0; padding-top: 10px; border-top: 0; }
.info-block > .bouton-dec-recherche { grid-column: 2; grid-row: 4; align-self: end; }
.duree-sejour { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 10px; color: var(--fff-muted-2); }
.duree-sejour > div { display: inline-flex; align-items: center; gap: 5px; }
.duree-sejour p { margin: 0; }
.clock-recherche { width: 12px; height: 12px; object-fit: cover; border-radius: 50%; }
.a-partir-de-bleu-nuit { display: block; }
.prix-block-recherche p { margin: 0 0 4px; }
.a-partir-de .text-darkblue { color: var(--fff-muted-3); }
.prix-block-recherche .prix-sejour-barre { font-size: 13px; margin-bottom: 2px; }
.prix-block-recherche .prix-sejour { font-size: 15px; font-weight: 700; }
.prix-block-recherche .complet-font-recherche { font-size: 9px; }
.fff-results .background-search > div:nth-child(3) { padding: 0 20px 18px; }
.stayDesc { margin: 0; font-size: 12px; line-height: 1.5; color: var(--fff-muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.fff-results .background-search > div:nth-child(3) .duree-sejour { display: block; color: var(--fff-muted); }

/* ====================================================================
   12. FICHE SÉJOUR — socle commun (affiné à l'étape 3)
   ==================================================================== */
.panel, .cadre-contenu { background: var(--fff-white); border: 1px solid var(--fff-line); border-radius: 5px; overflow: hidden; margin-bottom: 28px; }
.panel-heading, .panel-heading-descriptif { padding: 13px 20px; background: var(--fff-navy); color: var(--fff-white); }
.panel-heading-descriptif .sejour-panel-h2, .sejour-panel-h2, .panel-title, .panel-title-descriptif { font-size: 12px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-white); }
.panel-body-descriptif, .panel-collapse { padding: 20px; }
.panel-primary-descriptif { border-color: var(--fff-line); }
.contenu-principal, .contenu-dates, .contenu-infos, .contenu-options, .contenu-hebergement { padding: 20px; }
.descriptif-sejour, .descriptif-sejour-full { font-size: 13px; line-height: 1.7; color: var(--fff-text); }
.descriptif-sejour-titre { margin: 14px 0 8px; font-size: 13px; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; color: var(--fff-navy); }
.glyph-det-sej, .icons { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; margin-right: 8px; color: var(--fff-navy); }
.tooltip-width { max-width: 260px; }
.linkDatesAncre { font-size: 12px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; }
.haut-page { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; letter-spacing: 0.44px; text-transform: uppercase; }
.barre-favoris { display: flex; justify-content: flex-end; align-items: center; gap: 8px; }
.barre-favoris .favoris, .barre-favoris .mailer, .barre-favoris .printer, .favoris-recherche {
  display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 0 12px;
  border: 1px solid var(--fff-field); border-radius: 3px; background: var(--fff-white);
  font-size: 11px; font-weight: 700; letter-spacing: 0.44px; text-transform: uppercase; color: var(--fff-navy); cursor: pointer;
}
.prix-sejour, .apartir-sej { font-size: 36px; font-weight: 900; line-height: 1; color: var(--fff-navy); }
.a-partir-de, .a-partir-de-bleu-nuit { font-size: 9px; font-weight: 700; letter-spacing: 0.72px; text-transform: uppercase; color: var(--fff-muted-3); }
.a-partir-de-bleu-nuit { color: var(--fff-navy); }
.description { font-size: 15px; line-height: 1.5; color: var(--fff-muted); }
.blockSejourLogo img { max-height: 48px; width: auto; }
.code-promo, .etiquette-promo { display: inline-block; padding: 5px 10px; border-radius: 2px; background: var(--fff-blue); color: var(--fff-white); font-size: 9px; font-weight: 700; letter-spacing: 0.54px; text-transform: uppercase; }
.complet, .complet-font-recherche { display: inline-block; padding: 5px 10px; border-radius: 20px; background: var(--fff-navy); color: var(--fff-white); font-size: 9px; font-weight: 700; letter-spacing: 0.45px; text-transform: uppercase; }
.rectangle-index { display: inline-block; white-space: nowrap; border-radius: 2px; background: var(--fff-navy); color: var(--fff-white); font-size: 9px; font-weight: 700; letter-spacing: 0.54px; text-transform: uppercase; }
.triangle-left-index { display: none; }
.photos_sejour, .background-sejours { position: relative; border-radius: 8px; overflow: hidden; background: var(--fff-bg); }
.sejour-photo-principale { width: 100%; aspect-ratio: 430 / 235; object-fit: cover; }
.blockSliderPhoto { position: relative; display: flex; align-items: center; gap: 8px; }
.sliderPhotos { display: flex; gap: 8px; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; }
.sliderPhotos::-webkit-scrollbar { display: none; }
.photo-du-slider { width: 92px; height: 50px; flex-shrink: 0; object-fit: cover; border-radius: 3px; border: 2px solid transparent; scroll-snap-align: start; cursor: pointer; }
.photo-du-slider.active, .photo-du-slider:hover { border-color: var(--fff-navy); }
.chevron-left, .chevron-right { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 50px; flex-shrink: 0; border: 1px solid var(--fff-line); border-radius: 3px; background: var(--fff-white); color: var(--fff-muted-3); cursor: pointer; }
.tableSejour { width: 100%; border-collapse: collapse; }
.tableSejour th { padding: 13px 14px; background: var(--fff-navy); text-align: left; font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-white); }
.tableSejour td { padding: 15px 14px; border-top: 1px solid var(--fff-line-2); font-size: 13px; font-weight: 700; color: var(--fff-navy); vertical-align: middle; }
.reassurance { display: flex; align-items: center; gap: 12px; padding: 16px 20px; border: 1px solid var(--fff-line); border-radius: 5px; background: var(--fff-white); }
.telServiceClient { font-size: 20px; font-weight: 900; color: var(--fff-navy); }
.img-mode-reg { max-width: 252px; height: auto; }
.intit-envoyer-mail { display: block; margin-bottom: 6px; font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; color: var(--fff-muted-2); }
.text-box { width: 100%; min-height: 120px; border: 1px solid var(--fff-field); border-radius: 5px; }
.background-search { background: var(--fff-white); border: 1px solid #e8e8e8; border-radius: 8px; overflow: hidden; }

/* ====================================================================
   13. FICHE SÉJOUR — mise en page (body.fff-page-sejour)
   Valeurs relevées dans le Figma « Séjour / 1920w light » :
   colonne de contenu 1240, colonnes 1fr / 411 (gap 40), bandeau de
   recherche persistant #0a2c4f de 78px, panneaux à en-tête navy.
   Aucun <div> ajouté : les deux colonnes utilisent les conteneurs
   existants du gabarit (#cadreSejour, .fixe).
   ==================================================================== */
.fff-page-sejour { --fff-container: 1240px; }
/* Bandeau ARCHIVÉ : le gabarit le rend en permanence dans la maquette ;
   sur le site il n'apparaît que pour un séjour archivé. */
.fff-page-sejour .archive { display: none; }

/* ---- Bandeau de recherche persistant (Figma : sous l'en-tête, fond #0a2c4f) ---- */
.fff-page-sejour #searchForm { position: static; height: auto; }
.fff-page-sejour #recherche { position: static; padding: 0; }
.fff-page-sejour .moteur-bandeau {
  max-width: none; margin: 0; padding: 16px 40px; gap: 12px;
  border: 0; border-radius: 0; box-shadow: none; background: var(--fff-navy-2);
}
.fff-page-sejour .barre-icone-1 > div,
.fff-page-sejour .barre-icone-1 > div:has(> .fff-search-actions) {
  display: flex; align-items: center; gap: 12px;
  max-width: 1840px; margin: 0 auto; padding: 0;
  background: transparent; border-radius: 0; box-shadow: none;
}
/* Le champ mot-clé est visible ici (Figma) et occupe l'espace libre. */
.fff-page-sejour .barre-icone-1 > div > div:has(> #searchSejour) { display: block; flex: 1; min-width: 0; }
.fff-page-sejour #searchSejour {
  height: 46px; min-height: 46px; padding: 0 16px 0 40px; border: 0; border-radius: 5px;
  font-size: 13px; font-weight: 400; background: var(--fff-white) url(../../img/front/fff/ico-search-grey.svg) no-repeat left 16px center; background-size: 15px 15px;
}
.fff-page-sejour .moteur-bandeau label.visually-hidden {
  position: absolute !important; width: 1px !important; height: 1px !important; margin: -1px !important;
  overflow: hidden !important; clip: rect(0, 0, 0, 0) !important;
}
.fff-page-sejour .fff-field { flex: 0 0 160px; padding: 0; border: 0; }
.fff-page-sejour .selectSearch {
  height: 46px; min-height: 46px; padding: 0 16px; border: 0; border-radius: 5px;
  font-size: 13px; font-weight: 700; color: var(--fff-muted); background-color: var(--fff-white);
  background-position: right 14px center;
}
.fff-page-sejour .fff-search-actions { flex: 0 0 auto; align-self: auto; }
.fff-page-sejour .btnSearch[type="submit"] {
  width: 160px; height: 46px; min-height: 46px; padding: 0; border: 0; border-radius: 5px; gap: 7px;
}
.fff-page-sejour .btnSearch[type="submit"]::after { content: "Rechercher"; margin: 0; font-size: 13px; letter-spacing: 0.52px; }
/* style_config.css (back-office, chargé après, en !important) peint
   .moteur-bandeau en blanc et .btnSearch en #444 : la fiche séjour impose un
   bandeau navy et un bouton à texte blanc. Deux classes + !important suffisent. */
.fff-page-sejour .moteur-bandeau { background-color: var(--fff-navy-2) !important; }
.fff-page-sejour .btnSearch[type="submit"] { color: var(--fff-white) !important; }
/* L'élément flex est le <div> qui enveloppe .fff-field, pas .fff-field lui-même */
.fff-page-sejour .barre-icone-1 > div > div:has(> .fff-field) { flex: 0 0 160px; }

/* ---- Fil d'ariane ---- */
.fff-page-sejour .ariane { padding: 26px var(--fff-gutter) 0; }
.ariane ol { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 7px; max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 0; list-style: none; font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-muted); }
.ariane li + li::before { content: "›"; margin-right: 7px; color: var(--fff-muted-3); }
.ariane li { flex: 0 0 auto; white-space: nowrap; }
.ariane li.active { color: var(--fff-navy); }
.ariane .link { color: var(--fff-muted); }
.ariane .link:hover { color: var(--fff-blue); }

/* ---- Titre + actions (Figma : titre à gauche, favoris et note à droite) ---- */
.fff-page-sejour .printFull:has(> .titres-details-sejours) {
  display: grid; grid-template-columns: minmax(0, 1fr) max-content; align-items: start; gap: 8px 24px;
  max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 14px var(--fff-gutter) 0;
}
.titres-details-sejours { grid-column: 1; padding: 0; }
.titres-details-sejours h1 { font-size: 34px; line-height: 1.05; letter-spacing: -0.2px; text-wrap: balance; }
.barre-favoris.fond_gris { grid-column: 2; grid-row: 1 / span 2; padding: 0; background: none; }
.barre-favoris .favoris { display: grid; justify-items: end; gap: 8px; min-height: 0; padding: 0; border: 0; background: none; }
.barre-favoris .favoris > br { display: none; }
.barre-favoris .addFavoriSej {
  display: inline-flex; align-items: center; gap: 7px; min-height: 34px; padding: 0 14px;
  border: 1px solid #cdd4dc; border-radius: 3px;
  font-size: 11px; font-weight: 700; letter-spacing: 0.55px; text-transform: uppercase; color: var(--fff-navy);
}
.barre-favoris .addFavoriSej:hover { border-color: var(--fff-navy); color: var(--fff-navy); }
.barre-favoris .addFavoriSej > span { display: inline-flex; align-items: center; gap: 7px; }
.barre-favoris .addFavoriSej .favori-retirer, .barre-favoris .addFavoriSej.disabled .favori-ajouter { display: none; }
.barre-favoris .addFavoriSej.disabled .favori-retirer { display: inline-flex; }
.barre-favoris .addFavoriSej.disabled { border-color: var(--fff-navy); background: var(--fff-navy); color: #fff; }
.barre-favoris .addFavoriSej.disabled:hover { border-color: var(--fff-blue); background: var(--fff-blue); color: #fff; }
.sejour-actions-sep, .barre-favoris .mailer, .barre-favoris .printer { display: none; }
.sejour-note { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 700; color: var(--fff-blue); }
.sejour-note::before { content: "★★★★★"; letter-spacing: 1px; color: var(--fff-blue); }
.sejour-note a { color: var(--fff-blue); }

/* ---- Galerie + carte prix : 1fr / 411px ---- */
#cadreSejour.fixe {
  display: grid; grid-template-columns: minmax(0, 1fr) 411px; align-items: start; gap: 40px;
  max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 22px var(--fff-gutter) 0;
}
.sejour-slogan { font-size: 13px; font-weight: 400; color: var(--fff-muted); } /* « titre accrocheur » du séjour = sous-titre du Figma */
.fff-page-sejour .photos_sejour { margin-bottom: 0; border-radius: 3px; }
.fff-page-sejour .photos_sejour .complet { display: none; } /* état conditionnel : séjour complet */
#etiquette-age { position: absolute; right: 14px; top: 14px; z-index: 1; }
#triangle-left { display: none; }
#rectangle { display: inline-block; border-radius: 3px; background: var(--fff-navy); color: var(--fff-white); font-size: 10px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; }
.fff-page-sejour .sejour-photo-principale { aspect-ratio: 787 / 430; border-radius: 3px; }
.blockSliderPhoto { display: flex; align-items: center; gap: 10px; }
.sliderPhotos { flex: 1; display: flex; gap: 10px; overflow-x: auto; scrollbar-width: none; }
.photo-du-slider { width: 130px; height: 62px; flex-shrink: 0; object-fit: cover; border-radius: 3px; border: 2px solid transparent; cursor: pointer; }
.photo-du-slider:first-child, .photo-du-slider.active, .photo-du-slider:hover { border-color: var(--fff-navy); }
.chevron-left, .chevron-right { width: 26px; height: 62px; border: 1px solid var(--fff-line); border-radius: 3px; background: var(--fff-white); color: var(--fff-muted-3); }
.sejour-video-vignette { position: relative; display: block; width: 130px; height: 62px; flex-shrink: 0; border-radius: 3px; overflow: hidden; }
.sejour-video-vignette img { width: 100%; height: 100%; object-fit: cover; }
.sejour-video-vignette::after { content: "\25B6"; position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: rgba(0, 33, 64, 0.45); color: var(--fff-white); font-size: 13px; }
.favoris-bottom { display: none; }

/* ---- Carte prix / réservation ---- */
/* Squelette `.recap` : `top: calc(var(--header-h) + 16px)`. Les 104 px en dur
   valaient 88 + 16 : juste a 88 px de barre, faux aux 72 px des petits ecrans. */
.fff-page-sejour #cadreSejour > .printFull { position: sticky; top: calc(var(--fff-header-h) + 16px); }
.fff-page-sejour .description {
  display: flex; flex-direction: column; gap: 0; padding: 18px;
  border: 1px solid #e8e8e8; border-radius: 3px; background: var(--fff-white); font-size: 13px;
}
.blockSejourLogo .sejour-pictos { display: flex; align-items: center; gap: 8px; }
.blockSejourInfo { display: flex; flex-direction: column; gap: 14px; }
.code-promo { display: block; padding: 0; background: none; color: inherit; letter-spacing: normal; text-transform: none; }
.code-promo > div { display: grid; grid-template-columns: 20px minmax(0, 1fr); gap: 9px; align-items: start; }
.code-promo .etiquette-promo { width: 20px; height: 20px; padding: 0; background: none; }
.code-promo p { margin: 0; font-size: 12px; line-height: 1.45; color: var(--fff-text); }
.code-promo p:first-child { font-size: 9px; font-weight: 700; letter-spacing: 0.9px; text-transform: uppercase; color: var(--fff-blue); }
.price { display: grid; gap: 3px; }
.apartir-sej { font-size: 12px; font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--fff-muted-3); }
.price .prix-sejour-barre { font-size: 12px; font-weight: 400; text-decoration: line-through; color: var(--fff-muted-3); }
/* Prix courant : <div> sans classe fourni par le gabarit (il affiche « COMPLET » si le séjour est plein) */
.price > div:not([class]) { font-size: 34px; font-weight: 900; line-height: 1; color: var(--fff-navy); }
.price .linkDatesAncre { display: block; margin-top: 12px; }
.sejour-cta-dates { width: 100%; min-height: 44px; border-radius: 3px; font-size: 13px; letter-spacing: 0.65px; }
.blockInfosSejourDispo { display: flex; flex-direction: column; gap: 0; border: 1px solid var(--fff-line-2); border-radius: 3px; }
.sejour-brevet + .sejour-brevet { border-top: 1px solid var(--fff-line-2); }
.sejour-brevet > div { display: grid; grid-template-columns: 15px minmax(0, 1fr); gap: 10px; align-items: center; }
.img-plus-sej { width: 15px; height: 15px; }
.les-plus { font-size: 12px; line-height: 1.4; color: var(--fff-text); }

/* ---- Descriptif (gauche) + panneaux latéraux (droite) ---- */
.fff-page-sejour #cadreSejour + div { max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 14px var(--fff-gutter) 0; }
.fff-page-sejour #cadreSejour + div > .linkDatesAncre { display: inline-block; font-size: 10px; letter-spacing: 1px; color: var(--fff-navy); }
.fff-page-sejour #cadreSejour ~ .fixe {
  display: grid; grid-template-columns: minmax(0, 1fr) 411px; align-items: start; gap: 0 40px;
  max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 10px var(--fff-gutter) 0;
}
.contenu-principal, .contenu-options { padding: 0; }
/* Ordre des panneaux latéraux (Figma) : options, formalités, service client, paiement */
.contenu-options { display: flex; flex-direction: column; }
.contenu-options > .panel-primary-descriptif:has(.sejour-criteres) { order: 3; }
.panel, .cadre-contenu { border-radius: 3px; margin-bottom: 20px; }
.panel-heading, .panel-heading-descriptif { padding: 13px 18px; }
.panel-heading-descriptif .sejour-panel-h2, .sejour-panel-h2, .panel-title, .panel-title-descriptif { font-size: 17px; letter-spacing: 1px; }
/* En-tête + corps d'un même panneau : une seule carte */
.descriptif-sejour-titre.panel { margin: 0; padding: 13px 18px; border-radius: 3px 3px 0 0; border-bottom: 0; background: var(--fff-navy); }
.descriptif-sejour-titre.panel .sejour-panel-h2 { color: var(--fff-white); }
#panelDescSejour.panel, #panelHebergSejour.panel, #panelDatesSejour.panel { border-radius: 0 0 3px 3px; }
.panel-heading-descriptif { border-radius: 3px 3px 0 0; }
.panel-heading-descriptif + .panel { margin-top: -20px; border-top-left-radius: 0; border-top-right-radius: 0; }
.descriptif-sejour-wysiwyg { font-size: 12px; line-height: 1.8; color: var(--fff-muted); }
.descriptif-sejour-wysiwyg p { margin: 20px 0 4px; }
.descriptif-sejour-wysiwyg p:first-of-type { margin-top: 12px; }
.descriptif-sejour-wysiwyg .span-nunito-b { font-size: 13px; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; color: var(--fff-navy); }
.descriptif-sejour-wysiwyg hr { display: none; }
.taux-encadrement { font-size: 11px; font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--fff-muted-3); }
/* Activités : puces en pastilles (Figma) */
.sejour-activites { display: flex; flex-wrap: wrap; gap: 8px; list-style: none; }
.sejour-activites li { margin: 0; padding: 7px 13px; border: 1px solid var(--fff-line-3); border-radius: 15px; font-size: 11px; font-weight: 700; color: var(--fff-navy); }
.sejour-activites li::before { display: none; }
.sejour-criteres, .sejour-formalites, .sejour-options { list-style: none; margin: 0; padding: 0; }
.panel-body-descriptif { padding: 16px 18px; }
.sejour-options li { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin: 0; padding: 9px 0; border-bottom: 1px solid var(--fff-line-2); line-height: 1.45; text-transform: none; }
.sejour-options li:last-child { border-bottom: 0; }
.descriptionOption { font-size: 12px; color: var(--fff-text); }
.prixOption { flex: 0 0 auto; font-size: 13px; font-weight: 700; color: var(--fff-navy); }
/* Formalités : liste à coches (Figma) */
.sejour-formalites li { display: grid; grid-template-columns: 14px minmax(0, 1fr) auto auto; align-items: start; gap: 9px; margin: 0 0 9px; padding: 0; font-size: 12px; line-height: 1.5; color: var(--fff-text); }
.sejour-formalites li::before { content: "✓"; position: static; width: auto; height: auto; margin: 0; border-radius: 0; background: none; font-weight: 700; color: var(--fff-green); }
.sejour-formalites img { width: 16px; height: 16px; }
.sejour-criteres li { margin-bottom: 12px; padding: 0; font-size: 12px; line-height: 1.55; }
.sejour-criteres b { display: block; margin-bottom: 2px; font-size: 11px; letter-spacing: 0.8px; text-transform: uppercase; color: var(--fff-navy); }
.sejour-criteres span { color: var(--fff-muted); }
.sejour-alerte-agrement { border-left: 3px solid var(--fff-gold); border-radius: 3px; background: #fdf8ee; font-size: 11px; line-height: 1.6; color: var(--fff-text); }
.sejour-sejour-adapte .right, .panel-body-descriptif .right { display: block; margin-top: 8px; float: none; font-size: 11px; font-style: normal; }
/* Réassurance : « Numéro du service client » encadré, « Paiement sécurisé » à en-tête navy */
.fff-page-sejour .reassurance { flex-direction: column; align-items: flex-start; gap: 3px; margin-bottom: 20px; padding: 14px 18px; border-radius: 3px; }
.fff-page-sejour .reassurance p { margin: 0; font-size: 12px; line-height: 1.55; color: var(--fff-muted); }
.fff-page-sejour .reassurance p:first-child { font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-muted-2); }
.fff-page-sejour .reassurance .telServiceClient { font-size: 22px; font-weight: 900; color: var(--fff-navy); }
.fff-page-sejour .reassurance .img-mode-reg { max-width: 100%; margin-bottom: 8px; }

/* ---- Situation / hébergement : texte à gauche, photo à droite ---- */
.margin-block, .fff-page-sejour .contenu-dates, .contenu-infos { max-width: calc(var(--fff-container) + 2 * var(--fff-gutter)); margin: 0 auto; padding: 0 var(--fff-gutter); }
.contenu-hebergement, .fff-page-sejour .contenu-dates, .contenu-infos { padding: 0; }
#panelHebergSejour.panel { display: grid; grid-template-columns: minmax(0, 1fr) 460px; gap: 0 40px; padding: 22px 24px; }
#panelHebergSejour > div:nth-child(-n+3) { grid-column: 1; }
.sejour-heberg-lieu { font-size: 13px; letter-spacing: 0.5px; text-transform: uppercase; color: var(--fff-navy); }
#panelHebergSejour hr { display: none; }
.sejour-heberg-capacite { font-size: 12px; color: var(--fff-navy); }
#panelHebergSejour > div:last-child { display: grid; grid-template-columns: minmax(0, 1fr); grid-column: 1 / -1; grid-template-areas: "texte photo"; grid-template-columns: minmax(0, 1fr) 460px; gap: 0 40px; }
#panelHebergSejour > div:last-child > div:first-child { grid-area: texte; }
#panelHebergSejour > div:last-child > div:last-child { grid-area: photo; }
.sejour-heberg-texte { font-size: 12px; line-height: 1.8; color: var(--fff-muted); }
/* Le gabarit rend « <label>Restauration</label> : » ; on masque le deux-points isolé */
.sejour-heberg-restauration { margin: 0; font-size: 0; }
.sejour-heberg-restauration label { display: block; margin: 16px 0 2px; font-size: 13px; font-weight: 700; letter-spacing: 0.5px; color: var(--fff-navy); }
.sejour-heberg-photo img { width: 100%; height: 250px; object-fit: cover; border-radius: 3px; }
/* Carte de situation : absente de la maquette Figma (le gabarit l'injecte si le client la renseigne) */
.sejour-heberg-carte { display: none; }

/* ---- Dates et tarifs ---- */
.descriptif-sejour-full { padding: 20px 24px; }
.sejour-code { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 4px 12px; font-size: 12px; font-weight: 700; letter-spacing: 0.8px; text-transform: uppercase; color: var(--fff-navy); }
.sejour-code i { font-style: normal; font-weight: 400; font-size: 10px; letter-spacing: 0; text-transform: none; color: var(--fff-muted-3); }
.sejour-depart-regle .nbDaysSelect.d-none { display: block; max-width: 320px; margin-bottom: 16px; }
#rowDates { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 40px; align-items: start; }
#rowDates > div:first-child { display: flex; flex-direction: column; gap: 16px; }
.datesDP { display: grid; grid-template-columns: max-content minmax(0, 1fr) max-content minmax(0, 1fr); align-items: center; gap: 10px; }
.datesDP > div:nth-child(odd) { font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-muted-2); }
.date { position: relative; }
.date .openCal { position: absolute; right: 1px; top: 1px; bottom: 1px; display: flex; align-items: center; justify-content: center; width: 40px; border-radius: 0 4px 4px 0; background: var(--fff-bg-2); color: var(--fff-navy); cursor: pointer; }
#rowDates > div:first-child > div:last-child { display: grid; grid-template-columns: max-content minmax(0, 260px); align-items: center; gap: 10px; }
.maReservationBlock { border: 1px solid var(--fff-line); border-radius: 3px; overflow: hidden; background: var(--fff-white); }
.maReservationTop { font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; }
.maReservationBlock #insertText { display: flex; flex-direction: column; gap: 6px; padding: 16px; font-size: 12px; color: var(--fff-text); }
#tarifRegle { font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-muted-2); }
#prixDepReg { font-size: 26px; font-weight: 900; line-height: 1; color: var(--fff-navy); }
#btnReserverRegle { width: 100%; border-radius: 3px; }
/* jQuery UI (showOn:"both") ajoute un bouton « … » après chaque champ ; .openCal ouvre déjà le calendrier */
#formReserveRegle .ui-datepicker-trigger { display: none; }
.date .form-control { padding-right: 48px; }
/* Titre de la carte : .bgColorBouton n'apporte que la couleur client, pas la forme bouton */
.maReservationTop.bgColorBouton { display: block; width: 100%; min-height: 0; border-radius: 0; padding: 12px 16px; text-align: left; font-size: 11px; letter-spacing: 1.1px; }
.maReservationTop.bgColorBouton:hover { transform: none; box-shadow: none; }
.unavailableDate, .ui-datepicker-unselectable { background-color: #dfdcdc; color: white; }
/* ---- Onglets ---- */
.nav-tabs.tabMid { display: flex; gap: 4px; margin: 0; padding: 0; list-style: none; border: 0; border-radius: 0; }
.nav-item.onglets .nav-link { min-height: 40px; padding: 0 20px; border: 0; border-radius: 3px 3px 0 0; background: var(--fff-bg-2); font-size: 11px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; white-space: nowrap; color: var(--fff-muted-2); }
.nav-item.onglets .nav-link.active { background: var(--fff-navy); color: var(--fff-white); }
.tab-content.panel { margin: 0 0 20px; border-radius: 0 3px 3px 3px; }
.tab-pane { padding: 0; }
.tab-pane:not(.active):not(.show) { display: none; }
/* Informations complémentaires : tableau libellé / valeur (Figma) */
.sejour-infos-pratiques { display: grid; grid-template-columns: 300px minmax(0, 1fr); align-items: start; font-size: 12px; color: var(--fff-text); }
.sejour-infos-pratiques > .fff-info-lbl { grid-column: 1; padding: 13px 18px; border-bottom: 1px solid var(--fff-line-2); font-size: 11px; font-weight: 700; letter-spacing: 0.8px; text-transform: uppercase; color: var(--fff-navy); }
.sejour-infos-pratiques > .font-desc { grid-column: 2; margin: 0; padding: 13px 18px; border-bottom: 1px solid var(--fff-line-2); font-size: 12px; line-height: 1.7; color: var(--fff-text); }
.sejour-infos-pratiques > .fff-odd-info { background: #fbfcfd; }
.sejour-infos-pratiques > .font-desc p { margin: 0 0 6px; }
.sejour-infos-pratiques > .font-desc p:last-child { margin-bottom: 0; }
.sejour-infos-pratiques > .span-nunito-b { grid-column: 1 / -1; padding: 0 0 12px; font-size: 13px; letter-spacing: 0.5px; text-transform: uppercase; color: var(--fff-navy); }
.sejour-lien-legal, .sejour-lien-ville { color: var(--fff-navy); text-decoration: underline; overflow-wrap: anywhere; }
.avisBlocks { border-bottom: 1px solid var(--fff-line-2); font-size: 12px; line-height: 1.7; }
.avisBlocks b { font-size: 11px; letter-spacing: 0.8px; text-transform: uppercase; color: var(--fff-navy); }
#temBl + div { padding: 14px 18px; font-size: 11px; font-weight: 700; letter-spacing: 0.8px; text-transform: uppercase; }
#temBl ~ div:last-child { padding: 0 18px 18px; }
.sejour-cta-avis { display: inline-flex; border-radius: 3px; }
.haut-page { justify-content: flex-end; width: 100%; padding: 4px 0 24px; }
.haut-page p { margin: 0; }
.haut-page .fa-2x { font-size: 18px; }

/* ====================================================================
   13 bis. PAGE CONTACT — body.fff-page-contact
   Figma « Contact » : heros bas sur photo (340 px), 3 cartes de contact a
   cheval sur le bas du heros, formulaire (1fr) + colonne « Nous trouver »
   (400 px), bandeau FAQ. Le fil d'ariane du Figma n'existe pas sur cette
   page : le heros porte directement le surtitre dore.
   ==================================================================== */
.fff-hero-contact {
  position: relative; min-height: 340px; display: flex; align-items: center; padding: 48px 0; color: var(--fff-white);
  background: linear-gradient(90deg, rgba(0, 33, 64, 0.94) 0%, rgba(0, 33, 64, 0.62) 100%), url(../../img/front/fff/contact-hero.jpg) center / cover no-repeat;
}
/* Figma : le texte du heros est en retrait de 48 px a l'interieur du conteneur 1180 */
.fff-hero-contact .fff-container { display: flex; flex-direction: column; gap: 14px; padding-left: calc(var(--fff-gutter) + 48px); }
.fff-hero-contact-kicker { margin: 0; font-size: 11px; font-weight: 700; letter-spacing: 1.76px; text-transform: uppercase; color: var(--fff-gold); }
.titre-principal-contact { font-size: 48px; font-weight: 900; line-height: 1.08; letter-spacing: 0.96px; text-transform: uppercase; color: var(--fff-white); text-wrap: balance; }
.fff-hero-contact .texte-principal { max-width: 560px; }
.fff-hero-contact .bpccText.text-darkblue { color: var(--fff-hero-text); }

/* Cartes d'acces rapide : remontees de 46 px sur le heros (Figma) */
.fff-contact-canaux { position: relative; z-index: 3; margin-top: -46px; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
.contact-canal { display: flex; align-items: center; gap: 14px; border-radius: 8px; background: var(--fff-white); box-shadow: 0 14px 34px 0 rgba(0, 33, 64, 0.14); }
.contact-canal-ico { flex: 0 0 46px; width: 46px; height: 46px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: #eef2f6; }
.contact-canal-ico img { width: 20px; height: 20px; object-fit: contain; }
.contact-canal > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.contact-canal-lbl { font-size: 10px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-muted-2); }
.contact-canal-val { font-size: 14px; font-weight: 700; color: var(--fff-navy); }
.contact-canal-val:hover { color: var(--fff-blue); }
.contact-canal-sub { font-size: 10px; color: var(--fff-muted-3); }

/* Formulaire + coordonnees */
.fff-contact-grid { display: grid; grid-template-columns: minmax(0, 1fr) 400px; gap: 52px; align-items: start; }
.contact-bloc-titre { font-size: 28px; font-weight: 700; line-height: 1; text-transform: uppercase; color: var(--fff-navy); }
.contact-form-note { font-size: 13px; color: var(--fff-muted-2); }
.contact-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
.contact-field { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.contact-field label { font-size: 10px; letter-spacing: 0.6px; }
.contact-form .form-control, .contact-form .form-select { min-height: 46px; padding: 0 16px; border-color: #d4dae1; border-radius: 5px; background-color: #fbfcfd; }
.contact-form .form-select { padding-right: 34px; }
.contact-form textarea.form-control { min-height: 160px; padding: 12px 16px; resize: vertical; }
.contact-form textarea.form-control::placeholder { color: #c2c8d0; font-weight: 400; }
.contact-rgpd { display: flex; align-items: flex-start; gap: 10px; }
.contact-rgpd input[type="checkbox"] { flex: 0 0 18px; width: 18px; height: 18px; margin: 1px 0 0; border: 1px solid #d4dae1; border-radius: 3px; }
.contact-rgpd label { font-size: 11px; font-weight: 700; line-height: 1.6; letter-spacing: 0; text-transform: none; color: var(--fff-muted-2); }
.contact-rgpd label a { color: var(--fff-navy); text-decoration: underline; }
.contact-form .required { font-size: 10px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-muted-2); }
.contact-form cap-widget { display: block; margin-top: 7px; }
.contact-submit { min-width: 234px; font-size: 12px; letter-spacing: 0.6px; }

.contact-aside { display: flex; flex-direction: column; gap: 16px; }
.contact-carte-lieu { position: relative; height: 234px; border-radius: 8px; overflow: hidden; }
.contact-carte-lieu img { width: 100%; height: 100%; object-fit: cover; }
.contact-carte-lieu::after { content: ""; position: absolute; inset: 0; background: rgba(0, 33, 64, 0.28); }
.contact-infos { display: flex; flex-direction: column; gap: 8px; border: 1px solid var(--fff-line); border-radius: 8px; }
.contact-infos-nom { font-size: 14px; font-weight: 700; letter-spacing: 0.42px; text-transform: uppercase; color: var(--fff-navy); }
.contact-infos address { margin: 0; font-style: normal; font-size: 13px; line-height: 1.35; color: var(--fff-muted); }
.contact-infos-lien { font-size: 12px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-navy); }
.contact-infos hr { height: 1px; margin: 8px 0; border: 0; background: var(--fff-line-2); }
.contact-horaires-titre { font-size: 10px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--fff-muted-3); }
.contact-horaires { display: flex; flex-direction: column; gap: 8px; margin: 0; }
.contact-horaires > div { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; }
.contact-horaires dt { font-size: 13px; color: var(--fff-muted); }
.contact-horaires dd { margin: 0; font-size: 13px; font-weight: 700; color: var(--fff-navy); }
.contact-horaires dd.contact-ferme { color: var(--fff-muted-3); }

/* Bandeau FAQ */
.fff-faq-teaser {
  position: relative; overflow: hidden; margin: 61px 0 51px; padding: 48px 44px; border-radius: 10px; color: var(--fff-white);
  background: linear-gradient(90deg, rgba(0, 33, 64, 0.94) 0%, rgba(0, 33, 64, 0.66) 100%), url(../../img/front/fff/contact-faq.jpg) center / cover no-repeat;
}
.fff-faq-teaser > div { display: flex; align-items: center; justify-content: space-between; gap: 32px; }
.fff-faq-teaser-txt { display: flex; flex-direction: column; gap: 8px; max-width: 560px; }
.fff-faq-kicker { font-size: 10px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; color: var(--fff-gold); }
.fff-faq-teaser h2 { font-size: 28px; font-weight: 900; letter-spacing: 0.56px; color: var(--fff-white); }
.fff-faq-teaser p { margin: 0; font-size: 13px; line-height: 1.6; color: var(--fff-hero-text); }
.fff-faq-teaser .btn-process-cmd-one { flex-shrink: 0; font-size: 12px; letter-spacing: 0.48px; }

/* ====================================================================
   13 ter. PAGE INSTITUTION / CLAIREFONTAINE (contenu en dur)
   body.fff-page-institution
   Integration du squelette `skeletons/new_retour/
   FFF_Academie_V16_6_Clairefontaine.html` (bloc <main> uniquement :
   l'en-tete, le fil d'ariane et le pied de page restent ceux du
   layout, partages par toutes les pages fff).

   Douze blocs, dans l'ordre du squelette :
     heros photo · chiffres cles · citation Sastre · galerie ·
     frise historique · chateau · anciens de l'INF · vie du site ·
     la semaine du stagiaire · plan du domaine · acces · duo d'offres

   NOMMAGE : le squelette nomme ces regles .cf-hero / .gal / .life /
   .map / .access / .section / .lead / .wrap. Toutes sont prefixees
   `fff-cf-` ici — `.lead`, `.map` et `.access` entreraient sinon en
   conflit avec Bootstrap 5.3 ou avec des classes metier, et le reste du
   fichier suit deja cette convention (cf. section 13 bis).

   COULEURS : les jetons du squelette (--navy, --muted, --line,
   --surface, --gold-fff, --edf-*) sont remplaces par ceux de la section
   1. Seul --fff-sky a du y etre ajoute : le squelette l'emploie pour la
   numerotation des cartes « la semaine » et un triangle de charte.

   Aucun de ces blocs n'est pilote par le back-office : ils ne servent
   qu'a cette page.
   ==================================================================== */

/* Reprise du rythme du squelette : `p { margin: 0 }` et des titres non
   bridés par la regle globale de la section 2. Portee par le conteneur
   de page pour ne rien changer ailleurs. */
.fff-cf p { margin: 0; }
.fff-cf h1, .fff-cf h2, .fff-cf h3 { line-height: 1.04; text-wrap: balance; }
.fff-page-institution .fff-main { background: var(--fff-white); }
/* Figma : le duo d'offres et le pied de page sont accoles (aucun blanc) */
.fff-page-institution #espace-libre { margin-top: 0; }

/* --- Rythme vertical et en-tetes de section ------------------------- */
.fff-cf-section { padding: clamp(56px, 7vw, 96px) 0; }
.fff-cf-section--tight { padding: clamp(40px, 5vw, 64px) 0; }
.fff-cf-section--surface { background: var(--fff-bg-2); }
.fff-cf-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 24px; flex-wrap: wrap; margin-bottom: clamp(24px, 3vw, 36px); }
.fff-cf-eyebrow { display: flex; align-items: center; gap: 12px; font-size: 12.5px; font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; color: var(--fff-muted); }
.fff-cf-lead { font-size: clamp(16px, 1.4vw, 19px); line-height: 1.6; color: var(--fff-muted); max-width: 64ch; }
.fff-cf-title { font-size: clamp(34px, 4.4vw, 60px); line-height: 1; font-weight: 700; text-transform: uppercase; color: var(--fff-navy); margin-top: 6px; }
.fff-cf-title--blue { color: var(--fff-blue); }

/* --- Elements de charte FFF : triangles (pointilles, rayures, filet) -
   Repris du squelette (`.ftri`), qui les pose en `<span>` positionnes
   par un style inline. Ils sont ici des `::before` / `::after` de la
   section : rien a ajouter dans le balisage, et aucun style dans les
   gabarits (cf. layout-head-assets).

   Trois habillages reviennent dans la page ; chacun combine deux
   triangles, places a l'oeil sur la section — il n'y a pas de regle
   generale a en tirer :
     --a  pointilles en haut a droite + filet plus bas
     --b  filet en haut a gauche + pointilles en bas a droite
     --c  rayures en bas a gauche + plein bleu ciel au-dessus
   ------------------------------------------------------------------- */
.fff-cf-deco { position: relative; overflow: hidden; isolation: isolate; }
.fff-cf-deco > .fff-container { position: relative; z-index: 1; }
.fff-cf-deco::before, .fff-cf-deco::after,
.fff-cf-off-exp::before, .fff-cf-off-exp::after,
.fff-cf-frise::before {
  content: ""; position: absolute; z-index: 0; pointer-events: none;
  aspect-ratio: 1 / 0.89; clip-path: polygon(0 0, 100% 50%, 0 100%);
}
/* Les trois motifs de la charte */
.fff-cf-deco--a::before, .fff-cf-deco--b::after, .fff-cf-off-exp::before, .fff-cf-frise::before {
  background: radial-gradient(circle, var(--fff-blue) 1.7px, transparent 2.2px) 0 0 / 11px 11px; opacity: 0.45;
}
.fff-cf-deco--c::before, .fff-cf-off-exp::after {
  background: repeating-linear-gradient(204deg, var(--fff-blue) 0 4px, transparent 4px 10px); opacity: 0.35;
}
.fff-cf-deco--a::after, .fff-cf-deco--b::before {
  clip-path: none; opacity: 0.5;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 89'%3E%3Cpolygon points='1.5,1.5 97,44.5 1.5,87.5' fill='none' stroke='%23003287' stroke-width='1.6'/%3E%3C/svg%3E") center / contain no-repeat;
}
.fff-cf-deco--c::after { background: var(--fff-sky); opacity: 0.14; }
/* Leurs positions */
.fff-cf-deco--a::before { width: 210px; right: -120px; top: 28px; }
.fff-cf-deco--a::after  { width: 110px; right: -58px; top: 230px; transform: scaleX(-1); }
.fff-cf-deco--b::before { width: 150px; left: -92px; top: 50px; }
.fff-cf-deco--b::after  { width: 170px; right: -100px; bottom: 30px; transform: scaleX(-1); }
.fff-cf-deco--c::before { width: 210px; left: -128px; bottom: 40px; transform: scaleX(-1); }
.fff-cf-deco--c::after  { width: 90px; left: -40px; bottom: 200px; }
.fff-cf-off-exp::before { width: 170px; right: -80px; top: 16px; }
.fff-cf-off-exp::after  { width: 150px; right: -60px; bottom: -30px; }
.fff-cf-frise::before   { width: 240px; right: -120px; top: 40px; opacity: 0.35; }

/* Cadrage des photos (squelette : `style="object-position:..."`).
   Le sujet n'est pas centre sur toutes les prises de vue ; ces classes
   portent le seul decalage, nommees par leur valeur. */
.fff-cf-op-20-40 { object-position: 20% 40%; }
.fff-cf-op-40-50 { object-position: 40% 50%; }
.fff-cf-op-50-30 { object-position: 50% 30%; }
.fff-cf-op-50-40 { object-position: 50% 40%; }
.fff-cf-op-50-45 { object-position: 50% 45%; }
.fff-cf-op-50-55 { object-position: 50% 55%; }
.fff-cf-op-50-60 { object-position: 50% 60%; }
.fff-cf-op-60-50 { object-position: 60% 50%; }

/* Renvoi de bas de bloc (squelette : `.muted` + style inline) */
.fff-cf-note { margin-top: 14px; font-size: 12.5px; line-height: 1.5; color: var(--fff-muted); }

/* --- 1. Heros photo -------------------------------------------------- */
.fff-cf-hero { position: relative; isolation: isolate; overflow: hidden; color: var(--fff-white); min-height: clamp(560px, 78vh, 760px); display: flex; align-items: flex-end; }
.fff-cf-hero > img { position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%; object-fit: cover; }
.fff-cf-hero::before { content: ""; position: absolute; inset: 0; z-index: -1; background: linear-gradient(0deg, rgba(5, 15, 40, 0.92) 5%, rgba(5, 15, 40, 0.35) 55%, rgba(5, 15, 40, 0.15)); }
.fff-cf-hero .fff-container { width: 100%; padding-top: 80px; padding-bottom: 72px; }
.fff-cf-hero .fff-cf-eyebrow { color: var(--fff-edf-gold); }
.fff-cf-hero h1 { margin-top: 14px; font-size: clamp(48px, 7vw, 104px); line-height: 1; font-weight: 700; text-transform: uppercase; color: var(--fff-white); max-width: 12ch; }
.fff-cf-hero .fff-cf-lead { color: #e3eaf5; margin-top: 18px; max-width: 58ch; }
.fff-cf-values { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 26px; }
.fff-cf-values span { border: 1px solid rgba(216, 178, 96, 0.7); border-radius: 999px; padding: 8px 18px; font-size: 12px; font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; color: var(--fff-edf-gold); }

/* --- 2. Bandeau des chiffres cles ------------------------------------ */
.fff-cf-figs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); background: var(--fff-navy); color: var(--fff-white); }
.fff-cf-figs > div { display: flex; gap: 16px; align-items: center; padding: 28px 26px; border-left: 1px solid rgba(255, 255, 255, 0.12); }
.fff-cf-figs > div:first-child { border-left: none; }
.fff-cf-figs img { width: 56px; height: 56px; object-fit: contain; flex-shrink: 0; }
.fff-cf-figs b { display: block; font-family: var(--font-title); font-weight: 600; font-size: clamp(30px, 3vw, 42px); line-height: 1; color: var(--fff-edf-gold); }
.fff-cf-figs span span { display: block; margin-top: 4px; font-size: 13px; color: #c9d3e6; }

/* --- 3. Citation Fernand Sastre -------------------------------------- */
.fff-cf-quote { max-width: 980px; margin: 0 auto; text-align: center; }
.fff-cf-quote blockquote { margin: 0; font-family: var(--font-edf-body); font-style: italic; font-size: clamp(24px, 3vw, 40px); line-height: 1.3; color: var(--fff-navy); }
.fff-cf-quote cite { display: block; margin-top: 16px; font-style: normal; font-size: 12.5px; font-weight: 800; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fff-muted); }

/* --- 4. Galerie « le CNF en images » ---------------------------------
   Mosaique : 4 colonnes, rangees de 210px ; deux modificateurs font
   tenir une vignette sur deux colonnes (`--w2`) ou deux rangees (`--h2`). */
.fff-cf-gal { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); grid-auto-rows: 210px; gap: 12px; }
.fff-cf-gal figure { margin: 0; position: relative; overflow: hidden; border-radius: 8px; background: #0b2350; }
.fff-cf-gal img { width: 100%; height: 100%; object-fit: cover; transition: transform .8s ease; }
.fff-cf-gal figure:hover img { transform: scale(1.05); }
.fff-cf-gal-w2 { grid-column: span 2; }
.fff-cf-gal-h2 { grid-row: span 2; }
.fff-cf-gal figcaption { position: absolute; inset: auto 0 0 0; padding: 28px 14px 12px; background: linear-gradient(0deg, rgba(0, 22, 70, 0.8), transparent); font-size: 13px; font-weight: 700; color: var(--fff-white); }
.fff-cf-gal figcaption small { display: block; font-size: 12px; font-weight: 500; opacity: 0.85; }

/* --- 5. Frise historique ---------------------------------------------
   Bloc autonome du squelette (`.cnf-frise`) : quatre « eres » en rail,
   la premiere sur deux colonnes avec ses photos en fond. Les annees sont
   en texte evide (`-webkit-text-stroke`), remplies au survol. */
.fff-cf-frise { position: relative; overflow: hidden; padding: clamp(56px, 7vw, 96px) 0; background: var(--fff-bg-2); color: var(--fff-ink); }
.fff-cf-frise .fff-container { position: relative; z-index: 1; }
.fff-cf-fz-eyebrow { font-size: 12.5px; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; color: var(--fff-muted); }
.fff-cf-frise h2 { margin: 8px 0 10px; font-family: var(--font-title); font-weight: 900; font-size: clamp(34px, 4.4vw, 60px); line-height: 1; text-transform: uppercase; color: var(--fff-blue); }
.fff-cf-fz-lead { max-width: 60ch; font-size: 17px; color: var(--fff-muted); }
.fff-cf-fz-rail { position: relative; margin-top: 44px; display: grid; grid-template-columns: 4fr 2fr 2fr 3fr; gap: 14px; }
.fff-cf-fz-era { position: relative; isolation: isolate; overflow: hidden; border-radius: 8px; background: var(--fff-white); border: 1px solid var(--fff-line-3); padding: 22px 22px 30px; }
.fff-cf-fz-era::after { content: ""; position: absolute; inset: 0; z-index: -1; background: linear-gradient(180deg, rgba(255, 255, 255, 0.35), rgba(255, 255, 255, 0.9) 42%, rgba(255, 255, 255, 0.95)); }
.fff-cf-fz-era--plain { background: var(--fff-white) repeating-linear-gradient(204deg, rgba(0, 50, 135, 0.06) 0 3px, transparent 3px 12px); }
.fff-cf-fz-era:has(.fff-cf-fz-bg) { padding-bottom: 52px; }
.fff-cf-fz-bg { position: absolute; inset: 0; z-index: -2; display: flex; }
.fff-cf-fz-bg figure { margin: 0; flex: 1; position: relative; overflow: hidden; }
.fff-cf-fz-bg img { width: 100%; height: 100%; object-fit: cover; opacity: 0.16; filter: grayscale(1) contrast(1.05); transform: scale(1.05); transition: opacity .8s ease, transform 1.4s ease; }
.fff-cf-fz-era:hover .fff-cf-fz-bg img { opacity: 0.42; transform: scale(1); }
.fff-cf-fz-bg figcaption { position: absolute; left: 12px; right: 12px; bottom: 10px; font-size: 10.5px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--fff-footerblue); opacity: 0; transform: translateY(6px); transition: .5s; }
.fff-cf-fz-era:hover .fff-cf-fz-bg figcaption { opacity: 0.75; transform: none; }
.fff-cf-fz-head { display: flex; align-items: baseline; gap: 10px; min-height: 54px; }
.fff-cf-fz-n { font-family: var(--font-title); font-weight: 300; font-size: 15px; letter-spacing: 0.2em; color: var(--fff-sky); }
.fff-cf-fz-t { font-family: var(--font-title); font-weight: 700; font-size: 17px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--fff-blue); }
.fff-cf-fz-p { display: block; margin-top: 2px; font-size: 12px; letter-spacing: 0.06em; color: var(--fff-muted); }
.fff-cf-fz-list { list-style: none; margin: 22px 0 0; padding: 0; display: grid; gap: 22px; }
.fff-cf-fz-era--wide .fff-cf-fz-list { grid-template-columns: 1fr 1fr; }
.fff-cf-fz-item { position: relative; }
.fff-cf-fz-y { display: flex; align-items: center; gap: 8px; font-family: var(--font-title); font-weight: 900; font-size: clamp(34px, 3.2vw, 46px); line-height: 1; color: transparent; -webkit-text-stroke: 1.2px var(--fff-blue); transition: color .35s; }
.fff-cf-fz-item:hover .fff-cf-fz-y { color: var(--fff-blue); }
.fff-cf-fz-stars { display: inline-flex; gap: 3px; }
.fff-cf-fz-stars svg { width: 16px; height: 16px; fill: var(--fff-gold); }
.fff-cf-fz-item h3 { margin: 8px 0 6px; font-family: var(--font-title); font-weight: 700; font-size: 18px; line-height: 1.1; letter-spacing: 0.02em; text-transform: uppercase; color: var(--fff-footerblue); }
.fff-cf-fz-item p { font-size: 14.5px; line-height: 1.55; color: var(--fff-muted); }
.fff-cf-fz-item--star::before { content: ""; position: absolute; left: -22px; top: 4px; bottom: 4px; width: 3px; border-radius: 2px; background: var(--fff-gold); }

/* --- 6. Chateau de Montjoye ------------------------------------------ */
.fff-cf-chateau { display: grid; grid-template-columns: 1.1fr 1fr; border-radius: 10px; overflow: hidden; }
.fff-cf-chateau-media { position: relative; min-height: 460px; }
.fff-cf-chateau-media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.fff-cf-chateau-txt { display: flex; flex-direction: column; justify-content: center; gap: 16px; padding: clamp(28px, 4vw, 56px); background: var(--fff-navy); color: var(--fff-white); }
.fff-cf-chateau-txt .fff-cf-eyebrow { color: var(--fff-edf-gold); }
.fff-cf-chateau-txt h2 { font-size: clamp(32px, 3.6vw, 50px); line-height: 1.04; font-weight: 700; text-transform: uppercase; color: var(--fff-white); }
.fff-cf-chateau-txt p { font-size: 15px; line-height: 1.65; color: #c9d3e6; }
.fff-cf-edf-accent { font-family: var(--font-edf-body); font-size: 24px; line-height: 1.4; color: var(--fff-edf-gold); }

/* --- 7. Les anciens de l'INF ----------------------------------------- */
.fff-cf-alumni { display: grid; grid-template-columns: 1.1fr 1fr; gap: clamp(24px, 4vw, 56px); align-items: center; }
.fff-cf-alumni .fff-cf-lead { margin-top: 12px; }
.fff-cf-alumni-names { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 20px; }
.fff-cf-alumni-names span { font-family: var(--font-title); font-weight: 600; font-size: clamp(20px, 2.2vw, 30px); line-height: 1.1; text-transform: uppercase; color: var(--fff-navy); }
.fff-cf-alumni-names span:nth-child(3n+2) { color: var(--fff-blue); }
.fff-cf-alumni-names span:nth-child(4n) { color: var(--fff-gold); }
.fff-cf-alumni-q { background: var(--fff-white); border-left: 5px solid var(--fff-gold); border-radius: 6px; padding: 24px 26px; }
.fff-cf-alumni-q blockquote { margin: 0; font-size: 18px; line-height: 1.55; font-weight: 600; color: var(--fff-navy); }
.fff-cf-alumni-q cite { display: block; margin-top: 12px; font-style: normal; font-size: 12px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--fff-muted); }

/* --- 8. La vie du site ----------------------------------------------- */
.fff-cf-life { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.fff-cf-life-c { display: flex; flex-direction: column; gap: 10px; padding: 22px; background: var(--fff-white); border: 1px solid var(--fff-line-3); border-radius: 8px; }
.fff-cf-life-c img { width: 58px; height: 58px; object-fit: contain; }
.fff-cf-life-c b { font-family: var(--font-title); font-weight: 600; font-size: 21px; line-height: 1.1; text-transform: uppercase; color: var(--fff-blue); }
.fff-cf-life-c p { font-size: 14.5px; line-height: 1.55; color: var(--fff-muted); }

/* --- 9. La semaine du stagiaire -------------------------------------- */
.fff-cf-lives { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }
.fff-cf-live { display: flex; flex-direction: column; overflow: hidden; background: var(--fff-white); border: 1px solid var(--fff-line-3); border-top: 4px solid var(--fff-blue); border-radius: 6px; }
.fff-cf-live > img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; }
.fff-cf-live-b { padding: 18px 20px 22px; }
.fff-cf-live-n { font-family: var(--font-title); font-weight: 700; font-size: 14px; letter-spacing: 0.08em; color: var(--fff-sky); }
.fff-cf-live h3 { margin: 4px 0 8px; font-size: 24px; font-weight: 700; text-transform: uppercase; color: var(--fff-blue); }
.fff-cf-live p { font-size: 14.5px; line-height: 1.5; color: var(--fff-muted); }
.fff-cf-live ul { list-style: none; margin: 12px 0 0; padding: 12px 0 0; border-top: 1px solid var(--fff-line-2); display: grid; gap: 6px; font-size: 13.5px; color: var(--fff-ink); }
.fff-cf-live li::before { content: ""; display: inline-block; width: 8px; height: 7px; margin-right: 8px; background: var(--fff-blue); clip-path: polygon(0 0, 100% 50%, 0 100%); }

/* --- 10. Plan du domaine ---------------------------------------------
   Les pastilles sont positionnees en pourcentage par un style inline :
   chaque point depend du dessin du plan, pas d'une grille. */
.fff-cf-map { display: grid; grid-template-columns: 1.6fr 1fr; gap: 20px; align-items: start; }
.fff-cf-map-img { position: relative; overflow: hidden; border-radius: 10px; border: 1px solid var(--fff-line-3); }
.fff-cf-map-img img { width: 100%; }
.fff-cf-map-pin { position: absolute; transform: translate(-50%, -50%); width: 30px; height: 30px; border-radius: 50%; background: var(--fff-red); color: var(--fff-white); font-size: 13px; font-weight: 800; display: flex; align-items: center; justify-content: center; border: 3px solid var(--fff-white); box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); }
.fff-cf-map-pin--gold { background: var(--fff-gold); color: var(--fff-navy); }
/* Les huit reperes sont cales sur le dessin du plan (cf-plan-domaine.jpg).
   Ces coordonnees appartiennent a l'image, pas au balisage : elles sont
   donc ici, dans l'ordre de la legende, et non en style inline. */
.fff-cf-map-pin:nth-of-type(1) { left: 72%;   top: 42%; }
.fff-cf-map-pin:nth-of-type(2) { left: 54%;   top: 39.5%; }
.fff-cf-map-pin:nth-of-type(3) { left: 82%;   top: 72%; }
.fff-cf-map-pin:nth-of-type(4) { left: 31%;   top: 34%; }
.fff-cf-map-pin:nth-of-type(5) { left: 45.5%; top: 26.5%; }
.fff-cf-map-pin:nth-of-type(6) { left: 57%;   top: 14%; }
.fff-cf-map-pin:nth-of-type(7) { left: 82.5%; top: 32%; }
.fff-cf-map-pin:nth-of-type(8) { left: 63%;   top: 47%; }
.fff-cf-map-legend { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.fff-cf-map-legend li { display: grid; grid-template-columns: 30px minmax(0, 1fr); gap: 12px; align-items: start; padding: 12px 14px; background: var(--fff-white); border: 1px solid var(--fff-line-3); border-radius: 6px; }
.fff-cf-map-legend i { width: 28px; height: 28px; border-radius: 50%; background: var(--fff-red); color: var(--fff-white); font-style: normal; font-size: 12px; font-weight: 800; display: flex; align-items: center; justify-content: center; }
.fff-cf-map-legend i.g { background: var(--fff-gold); color: var(--fff-navy); }
.fff-cf-map-legend b { display: block; font-size: 14.5px; color: var(--fff-ink); }
.fff-cf-map-legend span span { font-size: 13px; color: var(--fff-muted); }

/* --- 11. Venir au CNF ------------------------------------------------ */
.fff-cf-access { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: center; }
.fff-cf-access .fff-cf-lead { margin-top: 12px; }
.fff-cf-access-list { list-style: none; margin: 16px 0 0; padding: 0; display: grid; gap: 10px; }
.fff-cf-access-list li { display: flex; justify-content: space-between; gap: 14px; padding: 12px 0; border-bottom: 1px solid var(--fff-line-2); font-size: 14.5px; color: var(--fff-ink); }
.fff-cf-access-list b { color: var(--fff-blue); }
.fff-cf-access-note { margin-top: 18px; padding: 14px 16px; background: var(--fff-bg-2); border-left: 4px solid var(--fff-blue); border-radius: 6px; font-size: 14.5px; line-height: 1.55; }
.fff-cf-access-note b { color: var(--fff-blue); }
.fff-cf-access-note ul { list-style: none; margin: 8px 0 0; padding: 0; }
.fff-cf-access-note li { position: relative; padding: 4px 0 4px 16px; font-size: 14.5px; line-height: 1.5; color: var(--fff-muted); }
.fff-cf-access-note li::before { content: ""; position: absolute; left: 0; top: 11px; width: 7px; height: 6px; background: var(--fff-blue); clip-path: polygon(0 0, 100% 50%, 0 100%); }
.fff-cf-access > img { border-radius: 8px; border: 1px solid var(--fff-line-3); }

/* --- 12. Duo d'offres (appel a l'action) -----------------------------
   Le panneau Immersion reprend la charte « Equipe de France » : fond
   vague + or, polices FFF France / FFF Heritage (cf. section 1). */
.fff-cf-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.fff-cf-duo > a { position: relative; overflow: hidden; isolation: isolate; border-radius: 8px; padding: clamp(28px, 4vw, 44px); display: flex; flex-direction: column; gap: 12px; text-decoration: none; min-height: 320px; transition: transform .3s ease; }
.fff-cf-duo > a:hover { transform: translateY(-4px); }
.fff-cf-off-exp { background: var(--fff-white); border: 1px solid var(--fff-line-3); border-top: 5px solid var(--fff-blue); color: var(--fff-ink); }
.fff-cf-off-exp h3 { font-size: clamp(36px, 4vw, 56px); font-weight: 700; text-transform: uppercase; color: var(--fff-blue); }
.fff-cf-off-imm { background: var(--fff-edf-wave) url(../../img/front/fff/edf-wave.svg) center / cover no-repeat; color: var(--fff-white); font-family: var(--font-edf-body); }
.fff-cf-off-imm h3 { font-family: var(--font-edf-title); font-size: clamp(36px, 4vw, 56px); font-weight: 700; text-transform: uppercase; color: var(--fff-white); }
.fff-cf-off-imm .fff-cf-eyebrow { color: var(--fff-edf-gold); }
.fff-cf-duo .fff-cf-off-claim { font-family: var(--font-title); font-size: 20px; text-transform: uppercase; }
.fff-cf-off-exp .fff-cf-off-claim { color: var(--fff-blue); }
.fff-cf-off-imm .fff-cf-off-claim { font-family: var(--font-edf-title); color: var(--fff-edf-gold); }
.fff-cf-duo p { max-width: 40ch; font-size: 14.5px; line-height: 1.55; }
.fff-cf-off-exp p { color: var(--fff-muted); }
.fff-cf-off-imm p { color: #e3eafb; }
.fff-cf-off-pr { margin-top: auto; font-family: var(--font-title); font-weight: 700; font-size: 44px; line-height: 1; }
.fff-cf-off-exp .fff-cf-off-pr { color: var(--fff-blue); }
.fff-cf-off-imm .fff-cf-off-pr { font-family: var(--font-edf-title); color: var(--fff-edf-gold); }
.fff-cf-off-pr small { display: block; margin-top: 6px; font-family: var(--font-body); font-size: 13px; font-weight: 500; opacity: 0.8; }
.fff-cf-off-imm .fff-cf-off-pr small { font-family: var(--font-edf-body); }

/* --- Paliers responsive du bloc (reprises du squelette) -------------- */
@media (max-width: 1100px) {
  .fff-cf-fz-rail { grid-template-columns: 1fr 1fr; }
  .fff-cf-fz-era--wide { grid-column: 1 / -1; }
}
@media (max-width: 1000px) {
  .fff-cf-lives { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 900px) {
  .fff-cf-figs { grid-template-columns: 1fr 1fr; }
  .fff-cf-figs > div { border-top: 1px solid rgba(255, 255, 255, 0.12); }
  .fff-cf-figs > div:nth-child(3) { border-left: none; }
  .fff-cf-gal { grid-template-columns: 1fr 1fr; grid-auto-rows: 170px; }
  .fff-cf-chateau { grid-template-columns: minmax(0, 1fr); }
  .fff-cf-chateau-media { min-height: 280px; }
  .fff-cf-alumni { grid-template-columns: minmax(0, 1fr); }
  .fff-cf-life { grid-template-columns: 1fr 1fr; }
  .fff-cf-map { grid-template-columns: minmax(0, 1fr); }
  .fff-cf-access { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 800px) {
  .fff-cf-duo { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 700px) {
  .fff-cf-deco::before, .fff-cf-deco::after { opacity: 0.22 !important; }
  .fff-cf-deco--a::after, .fff-cf-deco--b::after, .fff-cf-deco--c::before { transform: scaleX(-1) scale(0.6); }
  .fff-cf-deco--a::before, .fff-cf-deco--b::before, .fff-cf-deco--c::after { transform: scale(0.6); }
}
@media (max-width: 640px) {
  .fff-cf-fz-rail { grid-template-columns: minmax(0, 1fr); }
  .fff-cf-fz-era--wide .fff-cf-fz-list { grid-template-columns: minmax(0, 1fr); }
  .fff-cf-frise::before { display: none; }
}
@media (max-width: 600px) {
  .fff-cf-lives { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 560px) {
  .fff-cf-life { grid-template-columns: minmax(0, 1fr); }
}
@media (hover: none) {
  .fff-cf-fz-bg img { opacity: 0.24; }
}
@media (prefers-reduced-motion: reduce) {
  .fff-cf-gal img, .fff-cf-duo > a, .fff-cf-fz-bg img, .fff-cf-fz-bg figcaption, .fff-cf-fz-y { transition: none !important; }
}

/* ====================================================================
   14. RESPONSIVE
   ==================================================================== */
/* Menu complet resserré : sans ça, il déborde de l'écran jusqu'à ~1310 px */
@media (min-width: 992px) and (max-width: 1400px) {
  .navbar-default { padding: 0 24px; }
  #menu-navigation > .navbar-nav { gap: 16px; }
  #menu-navigation > .navbar-nav > li > a { font-size: 13px; letter-spacing: 0.3px; }
  #menu-navigation > .navbar-nav > li.menu-tel, #menu-navigation > .navbar-nav > li.fff-nav-compte { margin-left: 8px; }
  #menu-navigation > .navbar-nav > li.menu-tel > a { font-size: 13px; }
}
/* Connecté (« Bonjour … » + déconnexion) : le menu déborde encore de ~60 px (client) à ~100 px (e-mail
   représentant légal) à 992 px — écarts resserrés et téléphone réduit à son icône jusqu'à 1200 px. */
@media (min-width: 992px) and (max-width: 1199.98px) {
  #menu-navigation > .navbar-nav:has(a.logout) { gap: 12px; }
  #menu-navigation > .navbar-nav:has(a.logout) > li.menu-tel .menu-tel-num { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
}
/* Menu : burger + panneau latéral gauche sous 992 px. Aucun point de rupture ici :
   il est porté par les classes Bootstrap du gabarit (layout-nav-menu) —
   `offcanvas-lg` sur #menu-navigation, `d-lg-none` sur le burger et l'icône compte.
   Le style du panneau ne s'applique que panneau ouvert (.showing / .show / .hiding) : fermé
   il est invisible, et au-delà de 992 px Bootstrap ne l'ouvre pas (et le referme au redimensionnement).
   Préfixe .navbar-default : passe devant `#menu-navigation > .navbar-nav { flex-direction: row }` (section 16). */
.bouton-mobile { align-items: center; margin-right: 0; }
.bouton-mobile button { position: relative; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 5px; }
.bouton-mobile button span, .bouton-mobile button span::before, .bouton-mobile button span::after { position: absolute; left: 12px; width: 20px; height: 2px; background: currentColor; content: ""; transition: transform .2s ease; }
.bouton-mobile button span { top: 21px; }
.bouton-mobile button span::before { left: 0; top: -6px; }
.bouton-mobile button span::after { left: 0; top: 6px; }
/* Barre de navigation blanche (back-office) : le back-office peint aussi le burger en blanc */
.navbar-default .bouton-mobile button { color: var(--fff-navy) !important; }
/* Icône compte, à gauche du burger */
.compte-mobile { align-items: center; justify-content: center; width: 44px; height: 44px; font-size: 20px; color: var(--fff-navy); }
.compte-mobile:hover { color: var(--fff-blue); }

/* Panneau latéral */
.navbar-default #menu-navigation:is(.showing, .show, .hiding) {
  --bs-offcanvas-width: 320px;
  flex-direction: column; align-items: stretch;
  background: var(--fff-white); color: var(--fff-navy); border-right: 0;
}
/* Bootstrap donne le focus au panneau à l'ouverture : pas de contour rouge sur tout le bord */
.navbar-default #menu-navigation:focus, .navbar-default #menu-navigation:focus-visible { outline: 0; }
/* Bootstrap insère le panneau ET son voile dans la barre de navigation : à 100,
   la barre passe déjà devant toute la page, mais pas devant le loader (1000) ni
   les fenêtres modales (1055). Le temps de l'ouverture, on remonte la BARRE
   (et non `.fff-header`, qui emporterait le héros et masquerait le moteur de
   recherche) juste au-dessus du voile Bootstrap. */
.navbar-default:has(#menu-navigation.show, #menu-navigation.showing, #menu-navigation.hiding) { z-index: 1050; }
.fff-header:has(#menu-navigation.show, #menu-navigation.showing) .verticalfavoris { visibility: hidden; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) .offcanvas-header { display: flex; align-items: center; justify-content: space-between; min-height: var(--fff-header-h); padding: 8px 16px; border-bottom: 1px solid var(--fff-line); }
.logo-offcanvas { height: 48px; width: auto; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) > .navbar-nav { flex: 1; flex-direction: column; align-items: stretch; gap: 0; height: auto; padding: 8px 20px 24px; overflow-y: auto; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) > .navbar-nav > li, .navbar-default #menu-navigation:is(.showing, .show, .hiding) > .navbar-nav > li.fff-nav-compte { display: block; height: auto; margin-left: 0; }
/* Téléphone : placé avant le bouton compte dans le balisage (barre), remis en dernière ligne du panneau */
.navbar-default #menu-navigation:is(.showing, .show, .hiding) > .navbar-nav > li.menu-tel { order: 1; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) > .navbar-nav > li > a { display: flex; width: 100%; height: auto; min-height: 48px; padding: 12px 0; border-bottom: 1px solid var(--fff-line); font-size: 14px; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) > .navbar-nav > li.fff-nav-compte > a { height: auto; margin-top: 16px; padding: 12px 15px; border: 1px solid #cdd4dc; justify-content: center; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) > .navbar-nav > li.menu-tel > a { gap: 8px; border-bottom: 0; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) .dropdown-menu.sub-menu { display: block; position: static; min-width: 0; margin: 0; box-shadow: none; border: 0; border-radius: 0; background: transparent; padding: 4px 0 8px 16px; }
.navbar-default #menu-navigation:is(.showing, .show, .hiding) .dropdown-menu.sub-menu a { padding: 8px 0; color: inherit; }
/* Menu de l'espace client : replié dans le panneau, déplié au clic sur « Bonjour … » (.show posé par Bootstrap).
   Passe devant la règle ci-dessus et devant l'ouverture au survol de la barre. */
.navbar-default #menu-navigation:is(.showing, .show, .hiding) .dropdown-menu.sub-menu.menu-client:not(.show) { display: none; }
@media (max-width: 1200px) {
  .barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .fff-search-actions { grid-column: 1 / -1; }
  .btnSearch[type="submit"] { flex: 1; }
  .fff-page-inner .barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: repeat(3, minmax(0, 1fr)) max-content; }
  .fff-search-actions { grid-column: auto; }
  #cadreSejour.fixe, .fff-page-sejour #cadreSejour ~ .fixe { grid-template-columns: minmax(0, 1.35fr) minmax(280px, 1fr); }
  #lightSliderSejSim { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 991.98px) {
  /* Barre réduite au logo + icône compte + burger (alignement vertical/écart : classes Bootstrap du gabarit) */
  .navbar-default { padding: 0 16px; }
}
@media (max-width: 992px) {
  :root { --fff-header-h: 72px; }
  .uv-lg-only { display: none; }
  .uv-sm-only { display: block; }
  .sliding { grid-template-columns: minmax(0, 1fr); }
  .background--container { order: 0; }
  .logo-enseigne { height: 52px; }
  .coups-coeur > div { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .fff-results { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Moteur intérieur : redevient un bandeau sous la barre blanche */
  .fff-page-inner #searchForm { height: auto; }
  .fff-page-inner #recherche { position: static; padding: 0; }
  .fff-page-inner .moteur-bandeau { max-width: none; border-radius: 0; box-shadow: none; padding: 0; }
  .fff-page-inner .barre-icone-1 > div, .fff-page-inner .barre-icone-1 > div:has(> .fff-search-actions) { padding: 10px 16px; border-radius: 0; box-shadow: none; border-bottom: 1px solid var(--fff-line); }
  .fff-page-sejour .moteur-bandeau { padding: 16px var(--fff-gutter); }
  .fff-page-sejour .barre-icone-1 > div, .fff-page-sejour .barre-icone-1 > div:has(> .fff-search-actions) { flex-wrap: wrap; padding: 0; border: 0; }
  /* Mot-clé sur sa propre ligne, puis les listes + le bouton */
  .fff-page-sejour .barre-icone-1 > div > div:has(> #searchSejour) { flex: 1 1 100%; }
  .fff-page-sejour .barre-icone-1 > div > div:has(> .fff-field) { flex: 1 1 0; }
  .fff-page-inner .barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .fff-page-inner .fff-field { border-right: 0; padding: 6px 0; }
  .fff-page-inner .fff-search-actions { grid-column: 1 / -1; }
  .fff-page-inner .btnSearch[type="submit"] { min-height: 44px; border-radius: 5px; }
  .fff-page-sejour .fff-field { padding: 0; }
  .fff-page-sejour .btnSearch[type="submit"] { min-height: 46px; }
  .fff-ariane-wrap { height: auto; padding-top: 14px; }
  /* Moteur en flux sous le héros : le fil n'a plus de débord à compenser. */
  .fff-ariane-resultats { margin-top: 24px; }
  .fff-hero-recherche { margin-top: 14px; min-height: 0; padding: 48px 0 56px; }
  .fff-toolbar { margin-top: 24px; flex-direction: column; align-items: flex-start; }
  .fff-nb-resultats { margin-top: 10px; font-size: 12px; }
  .fff-nb-resultats + .fff-toolbar { margin-top: 16px; }
  .bons-plans > div { grid-template-columns: minmax(0, 1fr); }
  .home-modules > div { grid-template-columns: minmax(0, 1fr); }
  #big-footer > .container { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px 32px; }
  #big-footer > .container > div:not(.reassurance-index) { grid-row: auto; }
  #big-footer .colonne-rs { grid-column: 1 / -1; } /* « Nos réseaux » sur sa propre ligne, sous les menus */
  .fff-temoignage-grid { grid-template-columns: minmax(0, 1fr); gap: 28px; }
  .fff-temoignage-img { height: 260px; }
  /* Tableau des sessions : empilé en cartes sous 860 px, voir plus bas. */
  .verticalfavoris > ul > li.listFavoris { display: none; }
  .verticalfavoris > ul > li:not(.listFavoris) { display: block; }
  /* Fiche séjour : une seule colonne */
  #cadreSejour.fixe, .fff-page-sejour #cadreSejour ~ .fixe { grid-template-columns: minmax(0, 1fr); gap: 24px; }
  .fff-page-sejour #cadreSejour > .printFull { position: static; }
  #panelHebergSejour.panel { grid-template-columns: minmax(0, 1fr); }
  #panelHebergSejour > div:last-child { grid-template-columns: minmax(0, 1fr); grid-template-areas: "texte" "photo"; gap: 16px; }
  #panelHebergSejour > div:last-child > div:last-child { flex-direction: row; flex-wrap: wrap; }
  #rowDates { grid-template-columns: minmax(0, 1fr); }
  .titres-details-sejours h1 { font-size: 32px; }
  .sejour-note { order: 0; }
  /* Contact */
  .fff-hero-contact { min-height: 0; padding: 48px 0 64px; }
  .fff-hero-contact .fff-container { padding-left: var(--fff-gutter); }
  .titre-principal-contact { font-size: 36px; }
  .fff-contact-grid { grid-template-columns: minmax(0, 1fr); gap: 32px; }
  .contact-aside { max-width: 480px; }
  .fff-faq-teaser { margin: 40px 0; padding: 36px 28px; }
}
@media (max-width: 768px) {
  :root { --fff-gutter: 16px; }
  body { font-size: 14px; }
  #espace-libre { margin-top: 48px; }
  .logo-other-screens { display: none; }
  .logo-mobile { display: flex; }
  .wysiwyg-content .full-content, .text-slider { font-size: 22px; }
  .destinations, .moduleVid > div:first-child > .video, .insta-block > div:first-child > .video { font-size: 24px; }
  #espace-libre > div > div > div:first-child > div { gap: 16px; }
  /* Moteur a ~1 cm sous le slogan. Le contenu du heros est ancre en bas des
     le grand ecran (cf. `.fff-hero-body`) : l'ecart sous le slogan vaut
     padding-bas - |margin-top| = 38 px, quelle que soit la longueur du H1
     (back-office). Seul le padding est resserre ici. */
  .header-image .fff-hero-body { padding: 56px 0 76px; }
  #searchForm { margin-top: -38px; }
  .sejour-depart-regle .nbDaysSelect.d-none { max-width: none; }
  .sejour-code span { flex-basis: 100%; }
  .descriptif-sejour-full { padding: 16px; }
  .moteur-bandeau { padding: 16px; }
  .barre-icone-1 > div, .barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: minmax(0, 1fr); gap: 12px; padding: 16px; }
  .btnSearch[type="submit"] { flex: 1; }
  .remiseLibelle a { font-size: 12px; }
  /* Les titres passes a l'echelle fluide (`.fff-h-*`, section 3) sont
     exclus : leur `clamp()` donne deja la bonne taille ici (28 px en
     `.fff-h-md`, 34 px en `.fff-h-lg`) et ce palier la rabaisserait. */
  .fff-title:not(.fff-h-xl):not(.fff-h-lg):not(.fff-h-md):not(.fff-h-sm) { font-size: 24px; }
  .fff-section, .univers, .coups-coeur, .bons-plans, #slider-orgas, .home-modules, .bandeau-container, .fff-temoignage { padding: 32px 0; }
  .coups-coeur > div { grid-template-columns: minmax(0, 1fr); }
  .fff-results { grid-template-columns: minmax(0, 1fr); }
  /* Nos univers : 2 par ligne. `auto-fit, minmax(240px, 1fr)` ne loge qu'une
     colonne dans les 358 px disponibles a 390 px — on force le nombre. */
  .univers > div { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Plus de `height` ni de reduction du titre a ce palier : la hauteur vient
     de l'`aspect-ratio: 16 / 10` (section 7) et le squelette garde ses noms
     d'univers a 20 px jusqu'en bas (`.univ span`, aucune regle dans son
     propre palier `max-width: 900px`). La regle de taille qui etait ici
     ciblait `.univers-image-title h2` alors que le gabarit emet un `h3` :
     elle n'a jamais pris effet, le mobile tournait donc deja sans elle. */
  .fff-hero-recherche { padding: 40px 0 72px; }
  .titre-principal-recherche { font-size: 26px; }
  .fff-toolbar { margin-top: 24px; padding: 0; }
  .fff-toolbar .barre-pagination { width: 100%; }
  .fff-page-inner .barre-icone-1 > div, .fff-page-inner .barre-icone-1 > div:has(> .fff-search-actions) { grid-template-columns: minmax(0, 1fr); }
  .titres-details-sejours h1 { font-size: 26px; }
  /* Fiche séjour (maquette mobile) : Âge + Période côte à côte, Ville puis bouton pleine largeur */
  .fff-page-sejour .barre-icone-1 > div, .fff-page-sejour .barre-icone-1 > div:has(> .fff-search-actions) { gap: 8px; }
  .fff-page-sejour .barre-icone-1 > div > div:has(> .fff-field) { flex: 1 1 calc(50% - 4px); }
  .fff-page-sejour .fff-search-actions { flex: 1 1 100%; }
  .fff-page-sejour .btnSearch[type="submit"] { width: 100%; }
  /* Titre pleine largeur, favoris et note en dessous */
  .fff-page-sejour .printFull:has(> .titres-details-sejours) { grid-template-columns: minmax(0, 1fr); }
  .barre-favoris.fond_gris { grid-column: 1; grid-row: auto; }
  .barre-favoris .favoris { display: flex; justify-content: space-between; flex-wrap: wrap; align-items: center; gap: 8px 12px; width: 100%; }
  .barre-favoris .favoris > a:not(.addFavoriSej) { display: none; } /* liens mail/impression : images déjà masquées, restaient des items vides */
  .barre-favoris .addFavoriSej, .sejour-note a { white-space: nowrap; }
  .barre-favoris .addFavoriSej { padding: 0 10px; letter-spacing: 0.3px; }
  #lightSliderSejSim { grid-template-columns: minmax(0, 1fr); }
  .nav-item.onglets .nav-link { padding: 0 14px; font-size: 10px; }
  /* Nos offres du moment : la carte reste horizontale (photo a gauche) comme au
     grand ecran, colonne photo reduite a 110 px — reste ~208 px pour le texte.
     `flex-wrap` sur le pied : filet de securite si le prix s'allonge. */
  .bons-plans .content { grid-template-columns: 110px minmax(0, 1fr); grid-template-rows: repeat(3, auto) 1fr; }
  .bons-plans .content > a { grid-column: 1; grid-row: 1 / -1; aspect-ratio: auto; height: 100%; min-height: 150px; }
  .bons-plans .content > :not(a) { grid-column: 2; }
  .bons-plans .fff-card-foot { grid-row: -2 / -1; align-self: end; margin-top: 14px; flex-wrap: wrap; }
  .lien-italique { margin-left: 0; width: 100%; }
  #carousel { aspect-ratio: 4 / 3; }
  .carou-title { font-size: 18px; }
  #big-footer > .container { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px 24px; } /* 2 menus par ligne */
  .reassurance-index ul { flex-direction: column; align-items: flex-start; gap: 10px; }
  .news-ligne { flex-wrap: wrap; }
  .news-champ { width: 100%; }
  .espace-libre-note { align-items: flex-start; text-align: left; }
  .fff-temoignage blockquote p { font-size: 22px; }
  .fff-temoignage blockquote br { display: none; }
  .modal-dialog { margin: 12px; }
  .newsletter-ligne { grid-template-columns: minmax(0, 1fr); gap: 6px; }
  .verticalfavoris { top: auto; bottom: 120px; transform: none; }
  .btn-gerer-cookies { left: 12px; bottom: 12px; }
  /* Contact */
  .titre-principal-contact { font-size: 28px; }
  .fff-contact-canaux { grid-template-columns: minmax(0, 1fr); margin-top: -28px; gap: 12px; }
  .contact-form-grid { grid-template-columns: minmax(0, 1fr); }
  .contact-submit { width: 100%; }
  .fff-faq-teaser { margin: 32px 0; padding: 28px 20px; }
  .fff-faq-teaser > div { flex-direction: column; align-items: flex-start; gap: 20px; }
  .fff-faq-teaser h2 { font-size: 22px; }
}
/* Chiffres clés (index-fff-stats) : 4 par ligne à partir de md, 2 en sm et xs
   (palier Bootstrap conservé ; le squelette bascule à 720px). Chaque cellule
   prend alors un filet haut, et la 3e perd son filet gauche : elle ouvre la
   2e ligne. */
@media (max-width: 767.98px) {
  .fff-stats-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .fff-stat { border-top: 1px solid var(--fff-line); }
  .fff-stat:nth-child(3) { border-left: 0; }
}
/* Dates et tarifs (forfait) : Du / Au sur deux lignes, téléphone uniquement (< md) */
@media (max-width: 767.98px) {
  .datesDP { grid-template-columns: 32px minmax(0, 1fr); row-gap: 12px; }
  #rowDates > div:first-child > div:last-child { grid-template-columns: minmax(0, 1fr); gap: 6px; }
}
/* Tableau des sessions : UNE CARTE PAR LIGNE sous 860 px.
   Reprise du squelette FFF_Academie_V16_1_Accueil (`@media (max-width:860px)`,
   règles `.sess`), y compris son point de rupture : six colonnes ne tiennent
   pas sur un téléphone, et le défilement horizontal qui tenait lieu de
   réponse jusqu'ici masquait le statut et le bouton.

   Les cellules passent en `display: block` : l'en-tête ne les coiffe plus,
   d'où `thead { display: none }` et le libellé repris de `data-l` en
   `::before` (posé dans index-fff-sessions.html.twig — une cellule sans
   `data-l` perd son intitulé).

   La 1re cellule (la date) devient le bandeau de titre de la carte, peint à
   la couleur de la variante : navy par défaut, bleu Équipe de France en
   Immersion, rouge en Féminin. Le liseré gauche du mode tableau n'a plus de
   sens ici, le fond le remplace — d'où les `box-shadow: none`.

   Le CORPS de la carte, lui, garde le fond teinté de sa variante : les
   règles de la section 10 visent toutes les cellules et ne sont pas
   annulées ici, seul le bandeau leur échappe. C'est ce que fait le
   squelette.

   /!\ Aucun `!important` ici, mais des sélecteurs calibrés : les règles de
       variante du mode tableau (section 10) sont aussi spécifiques que
       celles-ci, la bascule se joue donc sur un élément ou une classe de
       plus — voir les deux notes ci-dessous. Les raccourcir casserait le
       bandeau.

   /!\ Même ordre qu'en mode tableau : `.is-fem` APRÈS `[data-k="imm"]`, pour
       qu'une ligne Immersion + Féminin prenne le bandeau rouge. */
@media (max-width: 860px) {
  .fff-sessions-table { border: 0; border-radius: 0; background: none; }
  .fff-sessions-table thead { display: none; }
  .fff-sessions-table table, .fff-sessions-table tbody, .fff-sessions-table tr, .fff-sessions-table td { display: block; width: 100%; }
  .fff-sessions-table tr { margin-bottom: 12px; border: 1px solid var(--fff-line); border-radius: 5px; overflow: hidden; background: var(--fff-white); }
  .fff-sessions-table td { padding: 6px 16px; border-top: 0; }
  /* Bandeau de titre : la date, en blanc sur la couleur de la variante.
     /!\ `tr td:first-child` et non `td:first-child` : l'élément `tr` en plus
         fait passer le sélecteur DEVANT les règles de variante du mode
         tableau (`tr[data-k="imm"] td`, `tr.is-fem td`, section 10), à
         spécificité égale mais plus bas dans le fichier. Sans lui le fond
         teinté de la ligne resterait sur le bandeau. */
  .fff-sessions-table tr td:first-child { padding: 10px 16px; background: var(--fff-navy); color: var(--fff-white); }
  /* Le liseré gauche est remplacé par le fond : annulé sur LES TROIS
     variantes, `exp` comprise (son `box-shadow` de la section 10 est aussi
     spécifique que celui-ci et survivrait à une règle plus courte). */
  .fff-sessions-table tr[data-k] td:first-child,
  .fff-sessions-table tr.is-fem td:first-child { box-shadow: none; }
  .fff-sessions-table tr[data-k="imm"] td:first-child { background: var(--fff-edf-blue); }
  .fff-sessions-table tr.is-fem td:first-child { background: var(--fff-red); }
  /* Nom du stage : décollé du bandeau. L'étiquette du tag reste à sa suite,
     comme dans le squelette ; elle passe à la ligne d'elle-même si le nom
     remplit la largeur. */
  .fff-sessions-table .fff-sess-nom { padding-top: 12px; }
  /* Libellé de colonne, devant la valeur (squelette : `td[data-l]::before`). */
  .fff-sessions-table td[data-l]::before { content: attr(data-l); display: inline-block; width: 72px; font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-muted); }
  /* Bouton pleine largeur en pied de carte (`td:last-child` est aligné à
     droite en mode tableau, section 10). */
  .fff-sessions-table td.fff-sess-cta { padding: 10px 16px 14px; text-align: left; }
  .fff-sessions-table td.fff-sess-cta .fff-btn { width: 100%; }
}
@media (max-width: 480px) {
  .logo-enseigne { height: 44px; }
  /* Surtitre : 12.5 px + 2 px d'interlettrage + le triangle depassent la
     largeur utile sous ~420 px. Resserre, il tient sur une ligne. */
  .fff-hero-kicker { gap: 9px; font-size: 11px; letter-spacing: 1.4px; }
  .fff-hero-kicker::before { width: 20px; }
}

/* ====================================================================
   15. PAGE CATÉGORIE (gabarit commun) — body.fff-page-categorie
   Figma « Page catégorie "Commun" » : barre blanche, moteur en bandeau
   navy pleine largeur sous la barre, fil d'ariane sur fond blanc,
   titre + filet rouge + compteur de résultats, zone de description
   libre (back-office), barre tri + nb par page, grille 3 colonnes
   (cartes identiques à la page Résultats), pagination à droite.
   ==================================================================== */
.fff-page-categorie .fff-main { background: var(--fff-white); padding-bottom: 8px; }

/* ---- Moteur : bandeau navy en flux, juste sous la barre blanche ----
   Le fond du bandeau reprend la teinte « bandeau » du back-office
   (navy #002140 dans le Figma) : à reporter côté back-office si le
   client change d'identité. */
.fff-page-categorie #searchForm { position: relative; z-index: 6; height: auto; max-width: none; margin: 0; padding: 0; }
.fff-page-categorie #recherche {
  position: relative; left: auto; right: auto; top: auto;
  padding: 34px var(--fff-gutter) 38px;
  background: var(--fff-navy);
  border-top: 3px solid var(--fff-blue);
  box-shadow: inset 0 -1px 0 rgba(200, 175, 115, 0.35), 0 16px 34px -14px rgba(0, 33, 64, 0.3);
}
/* Écusson en filigrane (Figma) : purement décoratif, contenu dans la hauteur du bandeau
   (pas d'overflow:hidden sur #recherche, qui rognerait l'ombre de la barre) */
.fff-page-categorie #recherche::after {
  content: ""; position: absolute; right: 7%; top: 3px; width: 111px; height: 140px;
  background: url(../../img/front/fff/logo-fff-crest.svg) center / contain no-repeat; opacity: .07; pointer-events: none;
}
.fff-page-categorie .moteur-bandeau { position: relative; z-index: 1; }
/* Figma : la barre segmentée occupe toute la largeur du conteneur (1180).
   Vaut pour les deux pages intérieures qui portent le moteur en bandeau. */
.fff-page-inner .moteur-bandeau > .barre-icone-1 > div { max-width: none; }
.fff-page-categorie .fff-field { gap: 6px; padding: 18px 24px; }
.fff-page-categorie .moteur-bandeau label.visually-hidden { margin: 0 0 6px !important; font-size: 9px; letter-spacing: 0.9px; }
.fff-page-categorie .selectSearch { font-size: 15px; }
.fff-page-categorie .btnSearch[type="submit"] { min-height: 71px; padding: 0 34px; }

/* ---- Fil d'ariane sur fond blanc ---- */
.fff-page-categorie .fff-ariane-wrap { height: auto; padding: 0 var(--fff-gutter); background: var(--fff-white); }
.fff-page-categorie .ariane-resultat { position: static; left: auto; right: auto; top: auto; padding: 14px 0; }
.fff-page-categorie .ariane-resultat ol { gap: 6px 8px; }
.fff-page-categorie .ariane-resultat li + li::before { content: "›"; color: #c3cad2; }
.fff-page-categorie .ariane-resultat li.active { color: var(--fff-blue); }
.fff-page-categorie .ariane-resultat .link { color: var(--fff-muted-3); opacity: 1; }
.fff-page-categorie .ariane-resultat .link:hover { color: var(--fff-blue); }

/* ---- Titre de catégorie + compteur ---- */
.fff-categ-head { display: flex; flex-direction: column; align-items: flex-start; gap: 14px; padding-top: 6px; padding-bottom: 26px; border-bottom: 1px solid #e4e7ea; }
.descriptionCateg { font-size: 34px; font-weight: 900; line-height: 1; letter-spacing: 0.34px; color: var(--fff-navy); text-wrap: balance; }
.fff-categ-head .rule { width: 54px; height: 4px; background: var(--fff-blue); }
.fff-page-categorie .nbResultatsCateg { font-size: 14px; font-weight: 700; line-height: 1.2; letter-spacing: 0.56px; color: var(--fff-blue); }

/* ---- Description de la catégorie (WYSIWYG back-office) ----
   Texte courant : la teinte titre 30 px du bloc « description enseigne »
   de l'accueil ne convient pas ici, on repasse en texte de lecture. */
.fff-categ-desc { align-self: stretch; max-width: 900px; margin-top: 4px; }
.fff-categ-desc .full-content { display: flex; flex-direction: column; gap: 14px; font-size: 14px; font-weight: 400; line-height: 1.8; letter-spacing: 0; text-transform: none; color: var(--fff-muted); }
.fff-categ-desc .full-content p { margin: 0; text-wrap: pretty; }
.fff-categ-desc .full-content strong { font-weight: 700; color: var(--fff-navy); }
.fff-categ-desc .full-content img { margin: 6px 0; border-radius: 6px; }

/* ---- Barre tri + nombre par page + pagination haute ---- */
.fff-page-categorie .fff-toolbar { margin-top: 0; padding: 22px 0; }
.fff-page-categorie .filtres::before { display: none; }
.fff-page-categorie .filtres { gap: 10px; }
.fff-page-categorie .btn-group-sejour { min-height: 33px; padding: 0 12px; border-radius: 3px; font-size: 11px; letter-spacing: 0.55px; white-space: nowrap; }
.fff-page-categorie .btn-group-sejour:not(.active) .btn-sort-sejour-icon { color: var(--fff-blue); }
.fff-toolbar-droite { display: flex; align-items: center; gap: 14px; }
.nb-par-page { display: flex; align-items: center; gap: 8px; }
.nb-par-page label { font-size: 12px; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--fff-muted); }
.nb-par-page .selectNbSejour { width: auto; min-height: 32px; padding: 0 32px 0 12px; border-color: #cdd4dc; border-radius: 3px; font-size: 12px; color: var(--fff-navy); background-position: right 11px center; }
.fff-page-categorie .pagination > li > a, .fff-page-categorie .pagination > li > span { min-width: 32px; height: 32px; }

/* ---- Grille de résultats : cartes identiques à la page Résultats ---- */
.fff-page-categorie .fff-results { padding-top: 0; padding-bottom: 0; }
.fff-slot-suivant { display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 6px; min-height: 300px; padding: 28px; border: 1px dashed #c3cad2; border-radius: 8px; background: #f8f9fb; text-align: center; }
.fff-slot-suivant-titre { font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; color: #8a95a1; }
.fff-slot-suivant p { margin: 0; max-width: 250px; font-size: 12.5px; line-height: 1.6; color: var(--fff-muted-3); text-wrap: pretty; }
.fff-slot-suivant strong { color: var(--fff-muted); }

/* ---- Pagination basse : alignée à droite (Figma) ---- */
.fff-page-categorie .fff-pagination-bottom { padding-top: 22px; padding-bottom: 60px; }
.fff-page-categorie .fff-pagination-bottom .barre-pagination { justify-content: flex-end; }

@media (max-width: 992px) {
  .fff-page-categorie #recherche { position: relative; padding: 16px var(--fff-gutter) 18px; }
  .fff-page-categorie #recherche::after { display: none; }
  .fff-page-categorie .fff-field { padding: 6px 0; }
  .fff-page-categorie .btnSearch[type="submit"] { min-height: 44px; }
  .fff-page-categorie .fff-toolbar { flex-direction: column; align-items: flex-start; gap: 16px; }
  .fff-categ-desc { padding: 24px 20px; }
  .fff-slot-suivant { display: none; }
}
@media (max-width: 768px) {
  .descriptionCateg { font-size: 26px; }
  .fff-page-categorie .fff-toolbar { padding: 18px 0; }
  .fff-toolbar-droite { flex-wrap: wrap; }
  .fff-page-categorie .fff-pagination-bottom .barre-pagination { justify-content: center; }
}

/* Impression */
@media print {
  .noPrint, .navbar-default, #searchForm, #searchToggle, .verticalfavoris, .btn-gerer-cookies, .modal { display: none !important; }
  .header, .header-image { min-height: 0; padding-top: 0; background: none !important; }
  .header::before, .header-image::before { display: none; }
  .titre-site-index h1, .slogan-site-index h2 { color: var(--fff-navy);}
   .slogan-site-index h2 {font-family:var(--font-fff-body) !important; }
  .fff-hero-kicker { color: var(--fff-navy); }
  .fff-hero-kicker::before { display: none; }
}

/* ==========================================================================
   16. INTEGRATION TWIG — écarts maquette ↔ gabarits (ajouté à l'intégration)
   ========================================================================== */
/* search.html.twig rend les boutons du moteur DEUX fois (search-boutons) :
   en fin de barre 1 (.barre-boutons-inline, qui porte .fff-search-actions)
   et sur une ligne mobile (.barre-boutons). La maquette n'a que la première. */
.moteur-bandeau > .barre-boutons { display: none; }

/* Bootstrap 5 pose `.navbar-nav { flex-direction: column }` : la maquette
   (faux Bootstrap) ne le voyait pas, le menu s'empilait verticalement. */
#menu-navigation > .navbar-nav { flex-direction: row; }

/* Module vidéo (index-video) : la maquette n'en montrait qu'un emplacement
   vide, son vrai balisage n'était pas stylé. Mise en forme minimale. */
#videoRow { display: block; }
#video-container { position: relative; }
#blockVideo { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: 6px; background: var(--fff-navy); }
#videoBefore, #videoAfter { position: absolute; top: 50%; transform: translateY(-50%); width: 32px; cursor: pointer; }
#videoBefore { left: 12px; }
#videoAfter { right: 12px; }
#buttonsOnVideo { display: flex; gap: 8px; }
#buttonsOnVideo img { cursor: pointer; }

/* Résultats : les variantes de titre calculées (recherche réécrite, univers,
   aucun résultat) sont rendues dans .titres-resultat-recherche, sans les
   classes de la maquette : sans ces règles, texte navy sur le héros navy. */
.fff-hero-recherche .titres-resultat-recherche { display: flex; flex-direction: column; gap: 15px; color: var(--fff-hero-text); }
.fff-hero-recherche .titres-resultat-recherche h1 { margin: 0; font-size: 34px; font-weight: 900; line-height: 1; letter-spacing: 0.68px; text-transform: uppercase; color: var(--fff-white); }
.fff-hero-recherche .titres-resultat-recherche h2.titre-principal-recherche,
.fff-hero-recherche .titres-resultat-recherche div.titre-principal-recherche { margin: 0; max-width: 640px; font-size: 13px; font-weight: 400; line-height: 1.75; letter-spacing: 0; text-transform: none; color: var(--fff-hero-text); }
.fff-hero-recherche .titres-resultat-recherche p { margin: 0; }
.fff-hero-recherche .titres-resultat-recherche a { color: var(--fff-gold); }

/* Fiche séjour : la maquette dessinait 5 étoiles FIXES en ::before, quelle
   que soit la note. Le gabarit rend la note réelle (pointToStar) et le
   nombre d'avis dans le même lien : on retire les étoiles décoratives. */
.sejour-note::before { content: none; }
.sejour-note a { display: inline-flex; align-items: center; gap: 1px; }
.sejour-note .star { font-size: 11px; color: var(--fff-blue); }
.sejour-note .sejour-nb-avis { margin-left: 6px; }

/* Fiche séjour : ces conteneurs sont enfants DIRECTS de #wrapper, colonne
   flex. `margin: 0 auto` y désactive l'étirement : leur largeur suivait
   alors leur contenu (photo absente ou texte court = bloc rétréci et centré).
   width:100% + max-width garde le centrage sans dépendre du contenu. */
.fff-page-sejour #cadreSejour.fixe,
.fff-page-sejour #cadreSejour + div,
.fff-page-sejour #cadreSejour ~ .fixe,
.fff-page-sejour .margin-block,
.fff-page-sejour .contenu-infos { width: 100%; }

/* Accueil : blocs institution + choix du stage, TEMPORAIRES en HTML statique
   (index-fff-institution / index-fff-stages). Même habillage que le
   carrousel (.sliding) et les cartes du bandeau, sous des classes propres
   pour ne pas entrer en conflit avec les modules back-office. */
/* Grille institution : 2 colonnes, la colonne de gauche tenant deux lignes
   (texte puis bouton) face a une image qui les couvre toutes les deux.
   `align-self: end/start` de part et d'autre du `row-gap` garde le duo
   texte + bouton centre verticalement sur l'image, a 23px l'un de l'autre.
   En mobile la meme grille rempile en texte / image / bouton (cf. 992px). */
.fff-institution-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 560px); grid-template-areas: "text img" "cta img"; column-gap: 56px; row-gap: 23px; }
.fff-institution-text { grid-area: text; align-self: end; display: flex; flex-direction: column; align-items: flex-start; gap: 23px; }
.fff-institution-cta { grid-area: cta; align-self: start; }
.fff-institution-text p { margin: 0; font-size: 30px; font-weight: 700; line-height: 1.18; text-transform: uppercase; color: var(--fff-navy); }
.fff-institution-text strong { display: block; margin-top: 9px; color: #004687; }
.fff-institution-grid img { grid-area: img; align-self: center; width: 100%; aspect-ratio: 560 / 330; object-fit: cover; border-radius: 6px; }
.fff-stages .fff-title { margin: 0 0 28px; }
.fff-stages-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 28px; }
.fff-stage-card { display: flex; flex-direction: column; background: var(--fff-white); border: 1px solid var(--fff-line-3); border-radius: 10px; overflow: hidden; }
.fff-stage-card img { width: 100%; height: 220px; object-fit: cover; }
.fff-stage-body { flex: 1; display: flex; flex-direction: column; align-items: flex-start; gap: 12px; border-top: 5px solid var(--fff-navy); }
.fff-stage-card:nth-child(even) .fff-stage-body { border-top-color: var(--fff-blue); }
.fff-stage-kicker { margin: 0; font-size: 11px; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase; color: var(--fff-muted); }
.fff-stage-body h3 { margin: 0; font-size: 26px; line-height: 1; letter-spacing: 0.5px; text-transform: uppercase; color: var(--fff-navy); }
.fff-stage-body p:not(.fff-stage-kicker) { margin: 0; font-size: 13px; line-height: 1.6; color: var(--fff-text); }
.fff-stage-body .fff-btn { margin-top: auto; }
@media (max-width: 992px) {
  .fff-institution-grid { grid-template-columns: minmax(0, 1fr); grid-template-areas: "text" "img" "cta"; row-gap: 28px; }
  .fff-institution-text { align-self: auto; }
  .fff-institution-cta { align-self: auto; }
}
@media (max-width: 768px) {
  .fff-institution-text p { font-size: 22px; }
  .fff-institution-cta > .fff-btn { width: 100%; }
  .fff-stage-body > .fff-btn { align-self: stretch; width: 100%; }
}

/* ====================================================================
   13 bis. ACCUEIL — BLOC « CHOISISSEZ VOTRE STAGE » 2e VERSION
   Reprise de `#stages-im-ex` du squelette FFF_new_Accueil.html
   (index-fff-stages.html.twig, sous le bloc `#stages-im-ex-old`).
   TEMPORAIRE, en HTML statique : a supprimer avec l'ancien bloc et ses
   classes .fff-stage-* une fois la bascule faite.

   Le squelette nomme ces regles .offer / .price / .btn / .lead / .tri ;
   toutes sont prefixees ici, les quatre dernieres entrant sinon en
   conflit avec Bootstrap 5.3 (.btn, .lead, .badge) ou avec les cartes
   sejour (.price, section 9). Les styles inline du squelette (position
   des triangles, cadrage des photos) sont remontes ici.

   La carte Immersion est la seule a employer la charte « Equipe de
   France » (--fff-edf-*, section 1) : fond vagues + or sur bleu.
   ==================================================================== */
.fff-offers-head { margin-bottom: 28px; }
.fff-offers-head .fff-title { margin: 0; }
.fff-offers-lead { margin: 10px 0 0; max-width: 64ch; font-size: 15px; line-height: 1.6; color: var(--fff-muted); }
.fff-offers-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; }

/* `isolation` + `overflow` : les triangles decoratifs sont en position
   absolue dans la carte, ils ne doivent ni deborder ni passer au-dessus
   du texte (cf. .fff-offer-body, z-index 1). */
.fff-offer {
  position: relative; isolation: isolate; overflow: hidden;
  display: flex; flex-direction: column;
  background: var(--fff-white); color: var(--fff-ink);
  border: 1px solid var(--fff-line-3); border-top: 6px solid var(--fff-navy); border-radius: 6px;
}
.fff-offer--imm {
  background: var(--fff-edf-wave) url(../../img/front/fff/edf-wave.svg) center / cover;
  color: var(--fff-white); border-color: var(--fff-edf-blue); border-top-color: var(--fff-edf-gold);
}
.fff-offer-media { position: relative; height: 230px; overflow: hidden; }
.fff-offer-media img { width: 100%; height: 100%; object-fit: cover; object-position: 50% 30%; }
.fff-offer--imm .fff-offer-media img { object-position: 50% 40%; }
/* Degrade vers le bleu EDF : raccorde la photo au fond vagues de la carte. */
.fff-offer--imm .fff-offer-media::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(0deg, rgba(10, 43, 184, 0.65), transparent 60%);
}
.fff-offer-logo { position: absolute; right: 20px; bottom: -1px; z-index: 2; padding: 12px 14px 8px; background: var(--fff-white); border-radius: 6px 6px 0 0; }
.fff-offer--imm .fff-offer-logo { background: var(--fff-edf-wave); }
.fff-offer-logo img { display: block; width: auto; height: 72px; }
.fff-offer--imm .fff-offer-logo img { height: 84px; }

/* Triangles decoratifs (carte Experience seule) : la position etait en
   style inline dans le squelette. */
.fff-tri { position: absolute; z-index: 0; width: 170px; aspect-ratio: 1 / 0.89; pointer-events: none; clip-path: polygon(0 0, 100% 50%, 0 100%); }
.fff-tri--stripes { right: -40px; bottom: -14px; opacity: 0.55; background: repeating-linear-gradient(204deg, var(--fff-navy) 0 4px, transparent 4px 9px); }
.fff-tri--dots { right: 24px; bottom: 150px; width: 96px; opacity: 0.5; background: radial-gradient(circle, var(--fff-navy) 1.6px, transparent 2.1px) 0 0 / 11px 11px; }

.fff-offer-body { position: relative; z-index: 1; flex: 1; display: flex; flex-direction: column; gap: 16px; padding: 28px 32px 32px; }
.fff-offer-name { margin: 0; font-size: 28px; font-weight: 700; line-height: 1; letter-spacing: 0.28em; text-transform: uppercase; color: var(--fff-navy); }
.fff-offer--imm .fff-offer-name { color: var(--fff-edf-gold); }
.fff-offer-meta { margin: 2px 0 0; font-size: 13px; color: var(--fff-muted); }
.fff-offer--imm .fff-offer-meta { color: #d6dff8; }
.fff-offer-claim { margin: 0; font-size: 28px; font-weight: 700; line-height: 1.1; text-transform: uppercase; color: var(--fff-navy); }
.fff-offer--imm .fff-offer-claim { color: var(--fff-white); }
.fff-offer-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.fff-offer-duo > p { margin: 0; padding-top: 10px; border-top: 2px solid var(--fff-line-2); font-size: 14px; line-height: 1.45; }
.fff-offer--imm .fff-offer-duo > p { border-top-color: rgba(216, 178, 96, 0.45); }
.fff-offer-duo b { display: block; margin-bottom: 4px; font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fff-muted); }
.fff-offer--imm .fff-offer-duo b { color: #d6dff8; }
.fff-offer-price { display: flex; align-items: baseline; flex-wrap: wrap; gap: 14px; margin: 0; }
.fff-offer-price-n { font-size: 56px; font-weight: 700; line-height: 1; color: var(--fff-navy); }
.fff-offer--imm .fff-offer-price-n { color: var(--fff-edf-gold); }
.fff-offer-price-s { font-size: 14.5px; color: var(--fff-muted); }
.fff-offer--imm .fff-offer-price-s { color: #d6dff8; }
/* `margin-top: auto` : les deux cartes n'ont pas la meme hauteur de texte,
   les CTA restent alignes en bas de carte. */
.fff-offer-cta { margin-top: auto; padding-top: 6px; display: flex; align-items: center; flex-wrap: wrap; gap: 16px; }
.fff-btn--edf { background: var(--fff-edf-gold); color: var(--fff-edf-deep); }
.fff-btn--edf:hover { color: var(--fff-edf-deep); }
.fff-link-arrow {
  display: inline-flex; align-items: center; gap: 8px; min-height: 44px;
  font-size: 13px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  text-decoration: none; color: var(--fff-navy);
}
.fff-link-arrow::after { content: "→"; }
.fff-offer--imm .fff-link-arrow { color: var(--fff-white); }

@media (max-width: 992px) {
  .fff-offers-grid { grid-template-columns: 1fr; }
}
@media (max-width: 768px) {
  .fff-offer-body { padding: 22px 20px 24px; }
  .fff-offer-duo { grid-template-columns: 1fr; }
  .fff-offer-claim { font-size: 24px; }
  .fff-offer-price-n { font-size: 44px; }
  .fff-offer-cta > .fff-btn { width: 100%; }
}


/* ====================================================================
   13 quater. ACCUEIL — BLOC « UN SEUL LIEU »
   Reprise de `#lieu-unique` du squelette FFF_new_Accueil.html
   (index-fff-lieu-unique.html.twig), rendu entre « Choisissez votre
   stage » et Sessions. TEMPORAIRE, en HTML statique.

   Le squelette nomme ces regles .unity / .eyebrow / .lead ; toutes sont
   prefixees ici, les deux dernieres entrant sinon en conflit avec
   Bootstrap 5.3. Le surtitre et le titre reutilisent .fff-kicker et
   .fff-title (section 3), a la place des tailles du squelette. La
   couleur d'accent, variable `--u-c` posee en style inline la-bas, est
   ici le navy de la charte.
   ==================================================================== */
.fff-lieu-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(28px, 4vw, 56px); align-items: center; }
.fff-lieu-txt .fff-kicker { margin: 0; }
.fff-lieu-txt .fff-title { margin-top: 6px; }
.fff-lieu-lead { margin: 16px 0 0; max-width: 64ch; font-size: 15px; line-height: 1.6; color: var(--fff-muted); }

/* Les trois arguments : cartes blanches a filet navy, en ligne sous le texte. */
.fff-lieu-points { list-style: none; display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin: 24px 0 0; padding: 0; }
.fff-lieu-points li { padding: 16px; background: var(--fff-white); border: 1px solid var(--fff-line); border-top: 4px solid var(--fff-navy); border-radius: 6px; }
.fff-lieu-points b { display: block; font-size: 19px; font-weight: 700; line-height: 1.15; text-transform: uppercase; color: var(--fff-navy); }
.fff-lieu-points span { display: block; margin-top: 6px; font-size: 13.5px; line-height: 1.45; color: var(--fff-muted); }

/* Pastille de synthese : chiffre dans un disque blanc, sur fond navy. */
.fff-lieu-stamp {
  display: inline-flex; align-items: center; gap: 14px; margin: 22px 0 0; padding: 10px 22px 10px 10px;
  border-radius: 999px; background: var(--fff-navy); color: var(--fff-white); box-shadow: var(--fff-shadow-soft);
  font-size: 12px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase;
}
.fff-lieu-stamp b { display: flex; align-items: center; justify-content: center; width: 52px; height: 52px; flex-shrink: 0; border-radius: 50%; background: var(--fff-white); color: var(--fff-navy); font-size: 30px; letter-spacing: 0; }

/* Mosaique : carree, une grande photo a gauche sur les deux rangees. */
.fff-lieu-vis { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 10px; aspect-ratio: 1 / 1; }
.fff-lieu-vis figure { position: relative; margin: 0; border-radius: 8px; overflow: hidden; }
.fff-lieu-vis figure:first-child { grid-row: 1 / span 2; }
.fff-lieu-vis img { width: 100%; height: 100%; object-fit: cover; }
.fff-lieu-vis figcaption {
  position: absolute; left: 10px; bottom: 10px; padding: 6px 10px; border-radius: 3px;
  background: rgba(255, 255, 255, 0.94); color: var(--fff-navy);
  font-size: 11.5px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase;
}

@media (max-width: 992px) {
  .fff-lieu-grid { grid-template-columns: 1fr; }
  .fff-lieu-points { grid-template-columns: 1fr; }
}


/* ====================================================================
   13 quinquies. ACCUEIL — BLOC « CE QUI EST INCLUS, CE QUI CHANGE »
   Reprise de `#comparer` du squelette FFF_Academie_V16_1_Accueil.html
   (index-fff-comparer.html.twig), rendu juste apres le bloc Sessions.
   TEMPORAIRE, en HTML statique.

   Le squelette nomme ces regles .cmp / .badge / .no / .once / .ast /
   .fn ; toutes sont prefixees ici, plusieurs entrant sinon en conflit
   avec Bootstrap 5.3. Les styles en ligne du squelette (couleur des
   coches, tailles du pied de tableau) sont remontes ici.

   Le repli des prestations communes est un collapse Bootstrap : le
   libelle du bouton bascule sur `aria-expanded`, tenu a jour par
   Bootstrap, sans JS propre au bloc.

   Seuil responsive a 860 px, repris du squelette : il est impose par la
   largeur des deux colonnes (2 x 220 px), pas par la grille du site.
   ==================================================================== */
.fff-cmp-intro { margin-bottom: 28px; }
.fff-cmp-intro .fff-title { margin: 0; }
.fff-cmp-lead { margin: 10px 0 0; max-width: 64ch; font-size: 15px; line-height: 1.6; color: var(--fff-muted); }

/* Chaque ligne est une grille a trois colonnes : le tableau n'en est pas
   un (pas de <table>), les lignes sont independantes — c'est ce qui
   permet d'en replier six dans un collapse sans casser l'alignement. */
.fff-cmp { border: 1px solid var(--fff-line); border-radius: 6px; overflow: hidden; }
.fff-cmp-row { display: grid; grid-template-columns: minmax(0, 1fr) 220px 220px; }
.fff-cmp-row > * { display: flex; align-items: center; min-height: 54px; padding: 12px 18px; border-bottom: 1px solid var(--fff-line-2); font-size: 15px; }
.fff-cmp-row > *:nth-child(2), .fff-cmp-row > *:nth-child(3) { justify-content: center; text-align: center; }
.fff-cmp-row > *:nth-child(3) { background: var(--fff-edf-tint); }

/* En-tete : bleu FFF a gauche, fond vagues « Equipe de France » a droite. */
.fff-cmp-head > * { min-height: 84px; border-bottom: 0; }
.fff-cmp-head > *:first-child { background: var(--fff-bg-2); font-size: 12.5px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fff-navy); }
.fff-cmp-head .fff-cmp-c-exp { gap: 12px; background: var(--fff-blue); color: var(--fff-white); }
.fff-cmp-head .fff-cmp-c-imm { gap: 12px; background: var(--fff-edf-wave) url(../../img/front/fff/edf-wave.svg) center / cover; color: var(--fff-white); }
.fff-cmp-head img { width: auto; height: 48px; }
.fff-cmp-head span { font-size: 21px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; }

/* Lignes de section (socle commun / prestations differenciantes). */
.fff-cmp-group > * { min-height: 42px; background: var(--fff-bg-2); font-size: 11.5px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fff-muted); }
.fff-cmp-group > *:nth-child(3) { background: var(--fff-edf-tint-2); }

.fff-cmp-label { gap: 8px; flex-wrap: wrap; }
.fff-cmp-val-exp { font-weight: 700; color: var(--fff-blue); }
.fff-cmp-val-imm { font-weight: 700; color: var(--fff-edf-blue); }
.fff-cmp-no { font-size: 13px; color: var(--fff-muted-2); }
/* Coche : masque `.fff-ico` (section 13 ter), colorie par sa colonne.
   Selecteur a deux classes, sinon `.fff-ico { width: 1em }`, declare plus
   bas dans le fichier, l'emporterait a specificite egale. */
.fff-cmp .fff-cmp-ok { width: 22px; height: 22px; }
.fff-cmp-row > *:nth-child(2) .fff-cmp-ok { color: var(--fff-blue); }
.fff-cmp-row > *:nth-child(3) .fff-cmp-ok { color: var(--fff-edf-blue); }
.fff-cmp-once { font-size: 12px; font-style: italic; font-weight: 700; white-space: nowrap; color: var(--fff-muted); }
.fff-cmp-new { display: inline-flex; align-items: center; padding: 4px 9px; border-radius: 999px; background: var(--fff-edf-gold); color: var(--fff-edf-deep); font-size: 10px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; }
.fff-cmp-opt { padding: 5px 12px; border: 1px dashed var(--fff-muted-2); border-radius: 999px; font-size: 11px; color: var(--fff-muted); }

/* Bouton de repli : les deux libelles sont dans le gabarit, l'etat
   `aria-expanded` (pose par Bootstrap) decide duquel s'affiche. */
.fff-cmp-toggle { display: flex; justify-content: center; padding: 12px; background: var(--fff-white); border-bottom: 1px solid var(--fff-line-2); }
.fff-cmp-toggle-btn { min-height: 44px; padding: 0 12px; border: 0; background: none; font-size: 12.5px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fff-blue); }
.fff-cmp-toggle-btn .fff-cmp-toggle-masquer { display: none; }
.fff-cmp-toggle-btn[aria-expanded="true"] .fff-cmp-toggle-voir { display: none; }
.fff-cmp-toggle-btn[aria-expanded="true"] .fff-cmp-toggle-masquer { display: inline; }

/* Pied de tableau : tarifs, aux couleurs des deux offres. */
.fff-cmp-price > * { min-height: 110px; flex-direction: column; justify-content: center; gap: 2px; border-bottom: 0; }
.fff-cmp-price > *:first-child { align-items: flex-start; background: var(--fff-bg-2); }
.fff-cmp-price b { font-size: 12.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fff-navy); }
.fff-cmp-price small { font-size: 12.5px; opacity: 0.92; }
.fff-cmp-price > *:first-child small { color: var(--fff-muted); }
.fff-cmp-price .fff-cmp-p-exp { background: var(--fff-blue); color: var(--fff-white); }
.fff-cmp-price .fff-cmp-p-imm { background: var(--fff-edf-wave) url(../../img/front/fff/edf-wave.svg) center / cover; color: var(--fff-white); }
.fff-cmp-n { font-size: 40px; font-weight: 700; line-height: 1.05; }
.fff-cmp-p-imm .fff-cmp-n { color: var(--fff-edf-gold); }

.fff-cmp-ast { font-weight: 700; color: var(--fff-edf-blue); }
.fff-cmp-fn { margin: 10px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--fff-muted); }

@media (max-width: 860px) {
  .fff-cmp-row { grid-template-columns: minmax(0, 1fr) 88px 88px; }
  .fff-cmp-row > * { padding: 10px; font-size: 13.5px; }
  .fff-cmp-head img { display: none; }
  .fff-cmp-head span { font-size: 13px; letter-spacing: 0.04em; }
  .fff-cmp-val-exp, .fff-cmp-val-imm { font-size: 12.5px; }
  .fff-cmp-n { font-size: 20px; }
  .fff-cmp-price small { font-size: 11px; }
}

/* ====================================================================
   13 sexies. ACCUEIL — BLOC « LE LIEU »
   Reprise de `#lieu` du squelette FFF_Academie_V16_1_Accueil.html
   (index-fff-domaine.html.twig), rendu juste apres le temoignage.
   TEMPORAIRE, en HTML statique.

   Le squelette nomme ces regles .split / .split__media / .stack /
   .lead ; toutes sont prefixees ici, .lead entrant sinon en conflit
   avec Bootstrap 5.3. `fff-lieu-` etant deja pris par `#lieu-unique`
   (section 13 quater), le prefixe est `fff-domaine-`. Le titre reprend
   .fff-title (section 3) mais garde la taille et le bleu FFF du
   squelette, poses la-bas en style en ligne. La regle est accrochee a
   `#lieu` : il lui faut passer devant le palier mobile
   `.fff-title:not(.fff-h-*) { font-size: 24px }` (section 14, 768 px),
   que les quatre `:not()` rendent plus specifique qu'un selecteur de
   classes — l'echelle fluide du squelette vaut a toutes les largeurs,
   exactement comme pour les titres `.fff-h-*`. Seuil responsive a
   900 px, repris du squelette.
   ==================================================================== */
.fff-domaine-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(28px, 5vw, 72px); align-items: center; }
.fff-domaine-media { border-radius: 8px; overflow: hidden; aspect-ratio: 4 / 3; }
.fff-domaine-media img { width: 100%; height: 100%; object-fit: cover; }
.fff-domaine-txt .fff-kicker { display: flex; align-items: center; gap: 12px; margin: 0; }
#lieu .fff-title { margin: 6px 0 0; font-size: clamp(32px, 3.6vw, 52px); color: var(--fff-blue); }
.fff-domaine-lead { margin: 18px 0 0; max-width: 64ch; font-size: clamp(16px, 1.4vw, 19px); line-height: 1.6; color: var(--fff-muted); }
.fff-domaine-txt .fff-btn { margin-top: 24px; }

/* Respiration sous le bloc a partir de md (768 px, palier Bootstrap) :
   remplace le `padding-bottom` de `py-5` (48 px) pose sur la section. */
@media (min-width: 768px) {
  .fff-domaine { padding-bottom: 100px; }
}

@media (max-width: 900px) {
  .fff-domaine-grid { grid-template-columns: 1fr; }
}

/* ====================================================================
   13 ter. FICHE SÉJOUR — alignement Figma (2e passe)
   Icônes posées en masque CSS : une seule couleur (currentColor),
   aucune police supplémentaire chargée, pas de conflit avec la classe
   `.fa` de FA 4 toujours utilisée ailleurs sur le site.

   Les SVG vivent dans assets/css/fff/icons, à côté de cette feuille :
   les 15 seules icônes dont le template fff se sert, copiées depuis
   Font Awesome Free 6.4 (icônes CC BY 4.0, la mention de licence est
   conservée dans chaque fichier). Plus rien ici ne pointe vers
   assets/fontawesome, dossier auquel le template fff ne touche donc
   plus du tout. Nom de fichier = nom FA, suffixe `-regular` pour le
   style outline, aucun suffixe pour solid.
   ==================================================================== */
.fff-ico {
  display: inline-block; flex-shrink: 0; width: 1em; height: 1em; vertical-align: -0.125em;
  background-color: currentColor;
  -webkit-mask-position: center; -webkit-mask-size: contain; -webkit-mask-repeat: no-repeat;
  mask-position: center; mask-size: contain; mask-repeat: no-repeat;
}
.fff-ico--users { -webkit-mask-image: url(icons/users.svg); mask-image: url(icons/users.svg); }
.fff-ico--user { -webkit-mask-image: url(icons/user-regular.svg); mask-image: url(icons/user-regular.svg); }
.fff-ico--clock { -webkit-mask-image: url(icons/clock-regular.svg); mask-image: url(icons/clock-regular.svg); }
.fff-ico--location { -webkit-mask-image: url(icons/location-dot.svg); mask-image: url(icons/location-dot.svg); }
.fff-ico--calendar { -webkit-mask-image: url(icons/calendar-days-regular.svg); mask-image: url(icons/calendar-days-regular.svg); }
.fff-ico--building { -webkit-mask-image: url(icons/building-regular.svg); mask-image: url(icons/building-regular.svg); }
.fff-ico--brevet { -webkit-mask-image: url(icons/graduation-cap.svg); mask-image: url(icons/graduation-cap.svg); }
.fff-ico--wheelchair { -webkit-mask-image: url(icons/wheelchair.svg); mask-image: url(icons/wheelchair.svg); }
.fff-ico--thumbs-up { -webkit-mask-image: url(icons/thumbs-up-regular.svg); mask-image: url(icons/thumbs-up-regular.svg); }
.fff-ico--heart { -webkit-mask-image: url(icons/heart.svg); mask-image: url(icons/heart.svg); }
.fff-ico--heart-o { -webkit-mask-image: url(icons/heart-regular.svg); mask-image: url(icons/heart-regular.svg); }
.fff-ico--phone { -webkit-mask-image: url(icons/phone.svg); mask-image: url(icons/phone.svg); }
.fff-ico--check { -webkit-mask-image: url(icons/check.svg); mask-image: url(icons/check.svg); }
.fff-ico--chevron-left { -webkit-mask-image: url(icons/chevron-left.svg); mask-image: url(icons/chevron-left.svg); }
.fff-ico--chevron-right { -webkit-mask-image: url(icons/chevron-right.svg); mask-image: url(icons/chevron-right.svg); }

/* ---- Titre + slogan : sous-titre collé au H1 ---- */
.fff-page-sejour .printFull:has(> .titres-details-sejours) { row-gap: 6px; }
.fff-page-sejour .printFull > .sejour-slogan { grid-column: 1; margin: 0; font-size: 14px; line-height: 1.4; }
.fff-page-sejour .printFull > .sejour-slogan p { margin: 0; }
.barre-favoris .addFavoriSej .fff-ico { width: 13px; height: 13px; }

/* ---- Pastilles FORMAT / NOUVEAU (reprises de la page résultats) ---- */
.sejour-pastilles { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 10px; }
.sejour-pastilles .rectangle-index { line-height: 1.4; }
.rectangle-index.etiq-nouveau { background: var(--fff-blue); color: var(--fff-white); }
.sejour-pictos .icons .fff-ico { width: 16px; height: 16px; }

/* ---- Caractéristiques : icônes FA 6 ---- */
.blockInfosSejourDispo .glyph-det-sej.fff-ico { width: 14px; height: 14px; margin: 0 8px 0 10px; vertical-align: -2px; color: var(--fff-navy); }

/* ---- Carrousel photo : flèches + compteur sur la photo, bande de vignettes
   défilante (4 visibles, 3 à côté de la vignette vidéo). Le mini-slider
   d'origine dimensionnait .photo-du-slider comme UNE vignette : seule la
   première photo était visible. ---- */
.fff-carousel { position: relative; }
.fff-page-sejour .sejour-photo-principale { display: block; transition: opacity .2s ease; }
.fff-page-sejour .sejour-photo-principale.is-changing { opacity: .55; }
.fff-carousel-nav {
  position: absolute; top: 50%; z-index: 2; display: inline-flex; align-items: center; justify-content: center;
  width: 42px; height: 42px; margin-top: -21px; padding: 0; border: 0; border-radius: 50%;
  background: rgba(255, 255, 255, 0.92); color: var(--fff-navy); box-shadow: 0 4px 14px rgba(0, 20, 45, 0.18);
  cursor: pointer; transition: background-color .15s ease, color .15s ease;
}
.fff-carousel-nav:hover, .fff-carousel-nav:focus-visible { background: var(--fff-navy); color: var(--fff-white); }
.fff-carousel-prev { left: 14px; }
.fff-carousel-next { right: 14px; }
.fff-carousel-nav .fff-ico { width: 14px; height: 14px; }


.fff-page-sejour .blockSliderPhoto { --fff-thumb-h: 90px; display: flex; align-items: center; gap: 10px; }
.fff-page-sejour .sejour-video-vignette { height: var(--fff-thumb-h); }
.fff-thumbs { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; }
.fff-page-sejour .fff-thumbs-track {
  position: relative; flex: 1; min-width: 0; display: flex; gap: 10px; width: auto; height: auto;
  overflow-x: auto; scroll-snap-type: x proximity; scrollbar-width: none; border: 0; border-radius: 0; cursor: default;
}
.fff-thumbs-track::-webkit-scrollbar { display: none; }
.fff-page-sejour .fff-thumbs-track img {
  flex: 0 0 calc((100% - 30px) / 4); min-width: 0; height: var(--fff-thumb-h); object-fit: cover;
  border: 2px solid transparent; border-radius: 3px; opacity: .65; scroll-snap-align: start; cursor: pointer;
  transition: opacity .15s ease, border-color .15s ease;
}
.fff-page-sejour .blockSliderPhoto:has(.sejour-video-vignette) .fff-thumbs-track img { flex-basis: calc((100% - 20px) / 3); }
.fff-page-sejour .fff-thumbs-track img:hover, .fff-page-sejour .fff-thumbs-track img:focus-visible { opacity: 1; }
.fff-page-sejour .fff-thumbs-track img.is-active { border-color: var(--fff-navy); opacity: 1; }
.fff-thumbs-nav {
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 26px; height: var(--fff-thumb-h); padding: 0;
  border: 1px solid var(--fff-line); border-radius: 3px; background: var(--fff-white); color: var(--fff-muted-2); cursor: pointer;
}
.fff-thumbs-nav:hover, .fff-thumbs-nav:focus-visible { border-color: var(--fff-navy); color: var(--fff-navy); }
.fff-thumbs-nav .fff-ico { width: 10px; height: 10px; }
/* Vignettes plus basses sur petit écran : elles n'y font que ~70 px de large */
@media (max-width: 768px) {
  .fff-page-sejour .blockSliderPhoto { --fff-thumb-h: 60px; }
}

/* Galerie (Figma) : pas d'habillage de carte, photo plus arrondie */
.fff-page-sejour .photos_sejour {
  background: transparent; border: 0; border-radius: 0; overflow: visible;
}
.fff-page-sejour .photos_sejour:hover { box-shadow: none; transform: none; }
.fff-page-sejour .fff-carousel { border-radius: 12px; overflow: hidden; }
.fff-page-sejour .sejour-photo-principale { border-radius: 12px; }

/* Vignettes : largeur fixe, bande centrée */
.fff-page-sejour .blockSliderPhoto { --fff-thumb-w: 160px; justify-content: center; }
.fff-page-sejour .fff-thumbs { flex: 0 1 auto; justify-content: center; }
.fff-page-sejour .fff-thumbs-track { flex: 0 1 auto; }
.fff-page-sejour .fff-thumbs-track img,
.fff-page-sejour .blockSliderPhoto:has(.sejour-video-vignette) .fff-thumbs-track img {
  flex: 0 0 var(--fff-thumb-w); width: var(--fff-thumb-w); border-radius: 6px;
}

/* Flèches de la bande plus basses */
.fff-page-sejour .fff-thumbs-nav { height: 40px; flex-basis: 28px; border-radius: 6px; }

@media (max-width: 768px) {
  .fff-page-sejour .blockSliderPhoto { --fff-thumb-w: 100px; }
}

/* ---- Paiement sécurisé : panneau à en-tête navy (Figma) ---- */
.fff-page-sejour .reassurance p:first-child .fff-ico { width: 10px; height: 10px; vertical-align: -1px; }
.sejour-paiement { margin-bottom: 20px; }
.sejour-paiement .panel-body-descriptif { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; margin-bottom: 0; }
.sejour-paiement .img-mode-reg { max-width: 190px; height: auto; }
.sejour-paiement-modes { margin: 0; font-size: 12px; line-height: 1.55; color: var(--fff-muted); }

/* ---- Hébergement : photo remontée en haut du panneau, à hauteur du lieu ---- */
/* 4e rangée en 1fr : elle absorbe la hauteur de la photo, sans étirer les
   rangées lieu / capacité / texte. */
#panelHebergSejour.panel { grid-template-rows: auto auto auto 1fr; }
#panelHebergSejour > div:last-child { display: contents; }
#panelHebergSejour > div:last-child > div:first-child { grid-column: 1; grid-row: 3; }
#panelHebergSejour > div:last-child > div:last-child { grid-column: 2; grid-row: 1 / span 4; align-self: start; }

/* ---- Dates et tarifs : en-têtes navy + ligne de filtres blanche ----
   dataTables.css pose `thead .sorting { background: none }` (plus
   spécifique que `.tableSejour th`) : la ligne des libellés était blanc sur
   blanc, et la ligne de filtres héritait du navy. */
.fff-page-sejour #tableSejour thead > tr:first-child > th { padding: 13px 28px 13px 14px; background: var(--fff-navy); font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: var(--fff-white); }
.fff-page-sejour #tableSejour thead > tr.filterRow > th { padding: 10px 6px; border-bottom: 1px solid var(--fff-line-2); background: var(--fff-white); }
.fff-page-sejour #tableSejour thead > tr.filterRow > th:first-child { padding-left: 0; }
.fff-page-sejour #tableSejour thead > tr.filterRow > th:last-child { padding-right: 0; }
.fff-page-sejour #tableSejour .filterRow .form-control { height: 34px; min-height: 34px; padding: 0 10px; border: 1px solid var(--fff-field); border-radius: 3px; font-size: 12px; box-shadow: none; }

/* ---- Pagination du tableau : navy au lieu du bleu #1e90ff de dataTables.css ---- */
.fff-page-sejour .filters div.dataTables_paginate ul.pagination .paginate_button.active a { background-color: var(--fff-navy); border-color: var(--fff-navy); color: var(--fff-white); }
/* Nombre de lignes par page : aligné sur les boutons de pagination (30 px) */
.fff-page-sejour .filters .dataTables_length { margin: 2px 0 2px 10px; }
.fff-page-sejour .filters .dataTables_length label { margin: 0; }
.fff-page-sejour .filters .dataTables_length select.input-sm {
  width: auto; min-width: 0; height: 30px; min-height: 30px; padding: 0 22px 0 9px;
  border: 1px solid var(--fff-line); border-radius: 3px; font-size: 12px; font-weight: 700; line-height: 28px; color: var(--fff-navy);
  -webkit-appearance: none; appearance: none;
  background: var(--fff-white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23002140' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat right 8px center / 8px 5px;
}

/* ---- Dates et tarifs : même largeur que les blocs du dessus. La règle
   `.contenu-hebergement, .fff-page-sejour .contenu-dates, .contenu-infos
   { padding: 0 }` retirait la gouttière latérale : le bloc débordait de
   24 px de chaque côté (l'hébergement la garde via .margin-block). ---- */
.fff-page-sejour .contenu-dates { padding: 0 var(--fff-gutter); }

/* ---- Infos complémentaires / avis : même largeur que les autres blocs.
   Le bloc récupère sa gouttière (le padding:0 de la ligne 1116 le faisait
   déborder de 24 px de chaque côté), et le panneau intérieur, qui porte
   aussi .contenu-dates, perd la gouttière de la règle ci-dessus pour
   occuper toute la largeur. ---- */
.fff-page-sejour .contenu-infos { padding: 0 var(--fff-gutter); }
.fff-page-sejour .contenu-infos .contenu-dates { max-width: none; padding: 0; }

/* ---- Variante mobile des tarifs : mobile uniquement ---- */
@media (min-width: 768px) {
  .fff-page-sejour .sejour-tarifs-mobile { display: none; }
}

@media (max-width: 992px) {
  #panelHebergSejour > div:last-child > div:first-child,
  #panelHebergSejour > div:last-child > div:last-child { grid-column: 1; grid-row: auto; }
  #panelHebergSejour.panel { grid-template-rows: none; }
}

/* ====================================================================
   FICHE SEJOUR + PIED DE PAGE — MOBILE (< 768 px)
   Même seuil que la bascule .sejour-tarifs-mobile ci-dessus.
   ==================================================================== */
/* Pastille « Nouveau » posée sur la photo : masquée hors mobile */
.sejour-photo-nouveau { display: none; }

@media (max-width: 767.98px) {
  /* ---- Photo principale : Nouveau en haut à gauche, âge en haut à droite ---- */
  .fff-page-sejour .sejour-photo-nouveau { display: inline-block; position: absolute; left: 14px; top: 14px; z-index: 1; padding: 8px; font-size: 10px; line-height: 1; letter-spacing: 0.6px; border-radius: 3px; }
  .fff-page-sejour .sejour-pastilles .etiq-nouveau { display: none; } /* déjà sur la photo */
  .fff-page-sejour .sejour-pastilles:not(:has(> :not(.etiq-nouveau))) { display: none; }

  /* ---- Tarifs : cartes mobiles à la place du tableau ---- */
  .fff-page-sejour .tarifs-desktop { display: none; }
  /* Mention « hors options » : déjà rendue juste au-dessus par `.sejour-code`
     (sejour-dates-tarifs), le bloc mobile la répétait une seconde fois. */
  .sejour-tarifs-mobile .sejour-mention-options { display: none; }
  /* Filtres Durée / Mois : absents de la maquette. Masqués et NON supprimés du
     gabarit — tarifSejour.js écrit dans #collapseFilterDuree et
     #collapseFilterMois (contrat en tête de sejour-tarifs-mobile.html.twig). */
  .sejour-tarifs-mobile .btnFiltrer,
  .sejour-tarifs-mobile #listeFilters { display: none; }
  /* Ville de départ : seul filtre conservé, en tête du bloc comme sur la
     maquette. L'habillage du champ vient de `.form-select` (section 4). */
  .sejour-tarifs-mobile > div:first-of-type { margin-bottom: 16px; }
  /* Boutons créés par tarifSejour.js (classes Bootstrap) : habillage bouton rouge fff */
  #mobile-date-container .btn-primary,
  #mobile-date-container .pre_reservation {
    display: inline-flex; align-items: center; justify-content: center; min-height: 36px; padding: 0 18px;
    border: 0; border-radius: 5px; background: var(--fff-blue); color: var(--fff-white);
    font-size: 12px; font-weight: 700; line-height: 1; letter-spacing: 0.6px; text-transform: uppercase;
    transition: transform .12s ease, box-shadow .12s ease;
  }
  #mobile-date-container .btn-primary:hover, #mobile-date-container .btn-primary:focus-visible,
  #mobile-date-container .pre_reservation:hover, #mobile-date-container .pre_reservation:focus-visible {
    background: var(--fff-blue); color: var(--fff-white); transform: translateY(-1px); box-shadow: 0 8px 18px rgba(0, 20, 45, 0.16);
  }

  /* ---- Informations complémentaires : un bloc titre + description par ligne,
     fonds blanc / gris alternés. Titres et descriptions vont toujours par paires
     (le titre est aux rangs impairs) : on alterne sur le rang du titre, pas sur
     nth-of-type (les descriptions mélangent <p> et <div>). ---- */
  .sejour-infos-pratiques { grid-template-columns: minmax(0, 1fr); }
  .fff-page-sejour .sejour-infos-pratiques > .fff-info-lbl,
  .fff-page-sejour .sejour-infos-pratiques > .font-desc { grid-column: 1; background: var(--fff-white); }
  .sejour-infos-pratiques > .fff-info-lbl { padding: 13px 16px 4px; border-bottom: 0; }
  .sejour-infos-pratiques > .font-desc { padding: 0 16px 13px; }
  .fff-page-sejour .sejour-infos-pratiques > .fff-info-lbl:nth-child(4n+3),
  .fff-page-sejour .sejour-infos-pratiques > .fff-info-lbl:nth-child(4n+3) + .font-desc { background: var(--fff-bg-2); }

  /* ---- Hébergement : photo avant le descriptif ----
     Le conteneur du descriptif + medias est en `display: contents`, donc le
     texte et la photo sont deja des elements de la grille du panneau, places
     en automatique (`grid-row: auto`, palier 992). Le placement automatique
     suit l'ordre du document MODIFIE par `order` : passer le texte apres
     suffit, sans toucher au gabarit. La carte de situation ne remonte pas
     avec la photo, elle est masquee sur ce template (.sejour-heberg-carte).
     Ordre obtenu : lieu, capacite, photo, descriptif. */
  #panelHebergSejour > div:last-child > div:first-child { order: 1; }

  /* ---- Pied de page : newsletter + note centrées, « Nos réseaux » centré ---- */
  #espace-libre > div > div { flex-direction: column; align-items: center; text-align: center; }
  #espace-libre > div > div > div:first-child > div { justify-content: center; }
  /* Champ e-mail et bouton a la largeur de l'accroche : `align-items: center`
     dimensionnait chaque enfant sur son propre contenu. Les `width: 100%`
     corrigent au passage un debordement horizontal — `.icone-newsletter` et
     `.news-bloc` sont en `flex: none`, donc non retrecissables, alors que
     `.news-sous` deplie fait ~456 px pour 358 px disponibles. */
  .icone-newsletter { width: 100%; }
  .news-bloc { align-items: stretch; width: 100%; }
  .news-ligne { justify-content: stretch; }
  .inscripNews { flex: 1 1 100%; justify-content: center; }
  /* La rangee passe en colonne : `flex-basis: 320px` s'appliquerait alors a la
     HAUTEUR du bloc et creuserait un trou sous les modes de reglement. */
  .espace-libre-pay { align-items: center; flex-basis: auto; }
  .espace-libre-note { align-items: center; text-align: center; }
  .colonne-rs { align-items: center; }
  .icone-rs { justify-content: center; }
}

/* ====================================================================
   17. CARTES SÉJOUR — TROIS VISUELS SELON LE FORMAT ET LE TAG
   Reprise des cartes `.mcard` du squelette FFF_Academie_V16 : le bloc
   `.must` de FFF_Academie_V16_1_Accueil pour l'accueil, la grille de
   sessions de FFF_Academie_V16_4_Sessions pour la forme `is-fem`.

     data-k="exp"   Expérience   carte blanche, filet bleu
     data-k="imm"   Immersion    charte Équipe de France (fond vagues)
     .is-fem        Féminin      liseré rouge, EN PLUS du data-k

   Les classes du squelette ne sont PAS reprises : seuls `data-k` et
   `.is-fem` sont posés sur les cartes DU PROJET par les gabarits
   index-coups-coeur (accueil) et recherche-resultats (résultats), qui
   calculent la variante depuis FFFType::getIdCateg / getIdTag. Les deux
   cartes étant structurellement différentes (`.background-white` à
   l'accueil, `.background-search` aux résultats), chaque règle est
   écrite pour les deux et scopée à son bloc.

   La variante Immersion emploie les tokens --fff-edf-* de la section 1,
   déjà en place pour `#stages-im-ex` (section 13 bis) : même fond
   vagues, même or. Le titrage en FFF France (--font-edf-title du
   squelette) n'est PAS repris : charger une police de plus est une
   passe à part entière (cf. section 0 bis).

   /!\ `.colorStar` et `.text-danger` ne sont recolorées QUE sur la
       variante Immersion : en bleu ou en rouge sur le fond bleu nuit,
       elles étaient illisibles. Les étiquettes du visuel, elles, ne sont
       PAS retouchées ici : la pastille de format est dorée par sa regle
       de BASE `.etiq-immersion` (section 11), sur toutes les pages, et
       l'étiquette d'âge garde son navy sur les deux variantes, comme dans
       le squelette. AUCUNE des 13 classes pilotées par
       style_config.css n'est touchée — sur cette variante le bouton
       `btn-process-cmd-two` est écarté du GABARIT
       (index-sejour-card.html.twig), il n'est pas recoloré ici.
   ==================================================================== */

/* ---- Filet de format, SOUS LE VISUEL ----
   Le squelette le pose en `border-top` sur `.mcard__body`
   (FFF_Academie_V16_4_Sessions.html, regle `.mcard__body`), donc entre le
   visuel et le texte. Nos cartes n'ont pas d'élément qui englobe le texte
   seul : le filet est donc pose en `border-bottom` sur le VISUEL, ce qui
   donne exactement la même ligne — le texte suit le visuel sans marge ni
   gouttière dans les deux cartes.

   `box-sizing: border-box` est global (section 2) : le filet est pris
   DANS la boîte du visuel, qui porte un `aspect-ratio`. L'image perd donc
   4px de hauteur au lieu de pousser la carte.

   Un séjour sans format listé n'a pas de `data-k` et garde donc la carte
   inchangée, sans filet. */
.coups-coeur .background-white[data-k] .content > a,
.fff-results .background-search[data-k] .image-block { border-bottom: 4px solid var(--fff-blue); }

/* ---- Immersion : fond vagues Équipe de France ---- */
.coups-coeur .background-white[data-k="imm"],
.fff-results .background-search[data-k="imm"] {
  background: var(--fff-edf-wave) url(../../img/front/fff/edf-wave.svg) center / cover;
  border-color: var(--fff-edf-blue);
  color: var(--fff-white);
}
/* Filet sous le visuel en or (squelette : `.mcard[data-k="imm"]
   .mcard__body { border-top-color: var(--edf-gold) }`). */
.coups-coeur .background-white[data-k="imm"] .content > a,
.fff-results .background-search[data-k="imm"] .image-block { border-bottom-color: var(--fff-edf-gold); }
/* Titre et prix en or, textes secondaires en bleu clair. */
.coups-coeur .background-white[data-k="imm"] .text-darkblue,
.coups-coeur .background-white[data-k="imm"] .prix-index > span,
.fff-results .background-search[data-k="imm"] .sejName-recherche,
.fff-results .background-search[data-k="imm"] .prix-sejour,
.fff-results .background-search[data-k="imm"] .complet-font-recherche { color: var(--fff-edf-gold); }
.coups-coeur .background-white[data-k="imm"] .prix-index p,
.fff-results .background-search[data-k="imm"] .prix-block-recherche p,
.fff-results .background-search[data-k="imm"] .duree-sejour,
.fff-results .background-search[data-k="imm"] .duree-sejour > div + div::before,
.fff-results .background-search[data-k="imm"] .stayDesc { color: var(--fff-hero-text); }
/* Accroche bon plan et prix barré : le rouge `.danger` est illisible ici. */
.coups-coeur .background-white[data-k="imm"] .text-danger,
.coups-coeur .background-white[data-k="imm"] .danger { color: var(--fff-hero-text); }
/* Étoiles d'avis : `.colorStar` vaut --fff-blue (section 7), invisible. */
.coups-coeur .background-white[data-k="imm"] .colorStar,
.fff-results .background-search[data-k="imm"] .colorStar { color: var(--fff-edf-gold); }
/* Filets internes : le gris clair disparaît sur le fond sombre. */
.coups-coeur .background-white[data-k="imm"] .fff-card-foot,
.fff-results .background-search[data-k="imm"] .duree-sejour { border-color: rgba(255, 255, 255, 0.24); }
/* PAS DE RECOLORATION DE L'ETIQUETTE D'AGE sur la variante Immersion : elle
   garde le navy de `.rectangle-index` / `.etiquette-age` (section 12), donc
   le MEME visuel qu'en Expérience. C'est ce que fait le squelette, ou
   `.badge--age` reste en navy sur les cartes `data-k="imm"`
   (FFF_Academie_V16_4_Sessions.html : la seule regle qui vise
   `.mcard[data-k="imm"] .badge` ne touche que la taille de police).
   Seule la pastille de FORMAT est doree, par `.etiq-immersion` (section 11).
   Ne pas ajouter ici de regle sur `.rectangle-index` : elle emporterait
   l'etiquette d'age avec la pastille de format. */
/* « Voir → » des résultats : classe projet, librement recolorée (à la
   différence du bouton de la carte d'accueil, voir plus bas). */
.fff-results .background-search[data-k="imm"] .bouton-dec-recherche,
.fff-results .background-search[data-k="imm"] .bouton-dec-recherche:hover { color: var(--fff-edf-gold); }

/* ---- CTA de la carte d'accueil, variante Immersion ----
   Sur cette variante le gabarit écarte `btn-process-cmd-two` — dont
   style_config.css verrouille `color` et `border-color` en !important à
   la couleur bouton du back-office, bleu sur bleu nuit — et rend
   `fff-btn fff-btn-cta fff-btn-cta--edf`. Contrepartie assumée : ce
   bouton-là ne suit plus la couleur bouton du back-office.
   Ces deux règles viennent APRÈS `.fff-btn` et `.fff-btn:hover`
   (section 3) : à spécificité égale, c'est l'ordre du fichier qui
   tranche, donc ne pas les remonter. */
.fff-btn-cta--edf { background: transparent; border-color: var(--fff-edf-gold); color: var(--fff-edf-gold); }
.fff-btn-cta--edf:hover, .fff-btn-cta--edf:focus-visible { color: var(--fff-edf-gold); }

/* ---- Féminin : liseré rouge ----
   `outline` et non `border` : la bordure porte déjà le filet de format
   (or en Immersion, bleu en Expérience), que le squelette conserve sous
   le liseré — d'où le cumul `mcard is-fem` + data-k. L'offset négatif
   ramène le liseré à l'intérieur du rayon de la carte. */
.coups-coeur .background-white.is-fem,
.fff-results .background-search.is-fem { outline: 3px solid var(--fff-red); outline-offset: -3px; }
.fff-page-categorie .fff-categ-head .fff-categ-desc,
.fff-page-categorie #descContent,
.fff-page-categorie #descContent > .full-content { max-width: none; width: 100%; margin-left: 0; margin-right: 0; padding-left: 0; padding-right: 0; columns: auto; float: none; }
.fff-page-categorie #descContent > .full-content > div { width: 100%; max-width: none; margin: 0; }

/* ====================================================================
   18. TRÈS GRANDS ÉCRANS (≥ 1600 px)
   Le gabarit est calé sur le conteneur de 1180 px du Figma. Au-delà de
   ~1600 px la page se réduit à un bandeau central : ces trois paliers
   élargissent le conteneur et relèvent les plafonds des `clamp()` de
   titrage, qui sont TOUS atteints vers 1400 px de viewport (6,4vw = 88 px
   à 1375 px) — passé ce seuil, le texte ne grandissait plus du tout.

   Rien ne bouge sous 1600 px : toutes les requêtes de la section 14 sont
   en `max-width` ≤ 1400 px, il n'y a aucun recouvrement.

   TOUT passe par les variables de la section 1 : les quinze conteneurs
   bâtis sur `calc(var(--fff-container) + 2 * var(--fff-gutter))`
   (.fff-container, .container-logo, #searchForm, .msgContainer,
   #espace-libre, le pied de page, le fil d'ariane, les blocs séjour…)
   suivent sans une règle de plus.

   /!\ PLACER CETTE SECTION EN FIN DE FICHIER. `.fff-page-sejour` pose son
   propre `--fff-container` (section 15) et cette classe est sur le <body> :
   une valeur héritée de `:root` ne l'atteindrait JAMAIS, quelle que soit la
   spécificité — la valeur propre de l'élément gagne sur l'héritage. D'où la
   redéclaration de `.fff-page-sejour` dans chaque palier, et la nécessité
   de passer APRÈS la section 15 dans l'ordre du fichier.
   ==================================================================== */
@media (min-width: 1600px) {
  :root { --fff-container: 1360px; --fff-gutter: 32px; --fff-moteur: 1264px; }
  .fff-page-sejour { --fff-container: 1420px; }
  /* Barre de nav : elle est `position: fixed` pleine largeur avec un retrait
     fixe de 48 px (section 4), donc le logo restait collé au bord de l'écran
     pendant que le titre SEO était centré 300 px plus loin.
     `(100% - conteneur) / 2` tombe EXACTEMENT sur le bord gauche du contenu
     du conteneur : (vw - conteneur - 2g)/2 + g = (vw - conteneur)/2. Le logo
     s'aligne donc sur le titre du héros à chaque palier. Le `max()` garde les
     48 px d'origine si la fenêtre est plus étroite que le conteneur. */
  .navbar-default { padding-inline: max(48px, calc((100% - var(--fff-container)) / 2)); }
  /* Plafond du titre de héros relevé (le plancher et la pente ne changent
     pas : ils gouvernent les écrans étroits, déjà réglés). */
  .titre-site-index h1, .fff-h-xl { font-size: clamp(44px, 6.4vw, 100px); }
  .fff-section { padding: 64px 0; }
}
@media (min-width: 1920px) {
  :root { --fff-container: 1560px; --fff-gutter: 40px; --fff-moteur: 1460px; }
  .fff-page-sejour { --fff-container: 1620px; }
  .titre-site-index h1, .fff-h-xl { font-size: clamp(44px, 6.4vw, 112px); }
  /* Héros : `clamp(540px, 66vh, 680px)` (section 5) plafonne à 680 px, trop
     bas face à un titre de 112 px. `+ var(--fff-header-h)` comme la règle de
     base : le héros englobe la barre fixe. */
  .header-image { min-height: calc(760px + var(--fff-header-h)); }
  /* Résultats de recherche : 4 colonnes au lieu de 3. Les cartes sont en
     `aspect-ratio: 16/9`, à 3 colonnes dans 1560 px leur visuel montait à
     ~290 px de haut. Les blocs éditoriaux de l'accueil (.coups-coeur 3 col,
     .bons-plans 2 col) ne sont PAS touchés : leurs cartes sont grandes par
     choix de maquette. */
  .fff-results { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (min-width: 2400px) {
  :root { --fff-container: 1760px; --fff-gutter: 48px; --fff-moteur: 1660px; }
  .fff-page-sejour { --fff-container: 1820px; }
}
