/* ==========================================================================
   informations.css - page « Informations pratiques » (template-informations.php).
   Chargée uniquement sur ce modèle (voir fun_planet_enqueue_per_template,
   functions.php). Couleurs : tokens var(--fp-*) uniquement, aucune valeur en
   dur (discipline vérifiée par tools/check-zones.mjs).

   REFONTE DU 2026-08-12, d'après la maquette du client, EN ADAPTATION : on en
   reprend les idées visuelles, la composition, le placement des images, les
   textures et les animations. Le thème garde le reste : barre de navigation,
   pied de page, largeur de contenu (--fp-wrap), boutons (.fp-btn), pilules de
   sur-titre (.fp-ibox), icônes et jetons de couleur. Aucun vert ni jaune de la
   maquette n'est repris en dur, jamais d'orange.

   COMPOSITION DE LA PAGE (rendus : inc/informations.php sauf mention)
     1. Coordonnées (fp-blk-informations-hero)  - bannière photo (titre de
        niveau 1, accroche, bouton, mascotte en coin) puis la mosaïque
        « bento » des coordonnées : adresse, photo, état d'ouverture en
        direct, téléphone, courriel.
     2. Accès (fp-blk-informations-acces)       - les trois moyens de venir,
        un grand panneau chacun. Défilement horizontal ÉPINGLÉ avec
        JavaScript sur grand écran, panneaux empilés en flux normal partout
        ailleurs (voir le bloc « ACCÈS » plus bas).
     3. Horaires (fp-blk-horaires)              - carte claire à deux onglets,
        alimentée par le module fp-horaires-manager. Renderer REMPLACÉ sur
        cette page seulement.
     4. Questions fréquentes (fp-blk-faq)       - composant FAQ PARTAGÉ, non
        remplacé (voir la note « composant partagé » plus bas).
     5. Nous contacter (fp-blk-contact)         - formulaire natif, plan et
        téléphone. Renderer REMPLACÉ sur cette page seulement.
     6. Espace presse (fp-blk-informations-medias) - dernier bloc de la page.

   OÙ VIVENT LES RÈGLES (règle d'architecture du projet : un seul endroit par
   composant, jamais de sélecteur d'identifiant de page) :
     - Les COMPOSANTS de cette page portent le préfixe .fp-ip-* et ne servent
       qu'ici : leurs zones ne sont semées que sur ce modèle.
     - Les COMPOSANTS PARTAGÉS qui gardent leur habillage dans cette feuille
       (.fp-acces*, .fp-coord*, .fp-contact*) restent écrits SANS scope de
       page : leurs zones sont insertables depuis le kit Magic Parc. Ils ne
       sont plus utilisés par cette page depuis la refonte (à l'exception des
       champs du formulaire, voir « NOUS CONTACTER »), mais ils habillent
       toujours des renderers vivants du thème : les supprimer laisserait ces
       renderers sans aucun style nulle part.
     - Les AJUSTEMENTS de composants déjà partagés (FAQ, tableau du module
       d'horaires) sont scopés sur le MODÈLE
       (.page-template-template-informations) : ils ne valent que pour cette
       page et ne peuvent en déborder.
     - Le composant icon-box (sur-titres) n'est JAMAIS redéfini ici : il se
       règle dans assets/css/main.css, et une retouche là-bas doit se voir sur
       cette page comme sur les autres.

   ANIMATION, ET LE CONTRAT QUI VA AVEC. Aucun contenu ne dépend du JavaScript
   pour être visible : les états masqués de départ vivent SOUS la classe
   html.fp-ip-anim, posée de façon synchrone dans l'en-tête
   (fp_informations_anti_flash_marqueur, inc/informations.php) avant la
   première peinture, et UNIQUEMENT si JavaScript s'exécute et que les
   animations ne sont pas réduites. Sans elle, ces règles ne s'appliquent à
   rien. assets/js/informations.js la retire de lui-même si GSAP n'arrive
   jamais ou si l'animation échoue : rien ne reste caché. La mise en page
   HORIZONTALE de la section d'accès vit sous la même classe, pour la même
   raison : elle n'a de sens que si l'épinglage va réellement exister.
   ========================================================================== */

/* --------------------------------------------------------------------------
   LARGEUR DE CONTENU DE CETTE PAGE - un cran plus large que le reste du site.

   Tout le site lit le meme jeton, --fp-wrap (main.css, :root), qui vaut
   min(1300px, 90vw). Le client veut ici un peu plus d'air : on remonte le
   jeton a min(1440px, 92vw).

   DEUX BORNES, et les deux comptent.
   1. La classe de modele que WordPress pose sur le <body> : elle n'existe que
      sur cette page, aucune autre page du site ne peut donc voir la nouvelle
      valeur, et il n'y a rien a annuler nulle part.
   2. Le conteneur de contenu #fp-content : le jeton ne descend que dans le
      CONTENU de la page. La barre de navigation et le pied de page, qui sont
      hors de ce conteneur et qui lisent eux aussi --fp-wrap, gardent la
      largeur commune a tout le site. Sans cette seconde borne, l'en-tete et le
      pied de cette page seraient plus larges que sur les autres, ce que
      personne n'a demande et qui se verrait d'une page a l'autre.

   C'est aussi la raison pour laquelle on redefinit le JETON plutot que des
   largeurs une par une : les sections de cette page (horaires, questions
   frequentes, nous contacter) le lisent deja a travers .fp-wrap, elles suivent
   donc d'elles-memes et la page garde une seule et meme colonne.

   Effet mesure sur le haut de page (fenetre de 1920 px) : la marge interne
   gauche du panneau passe de 350 a 280 px, le bloc « Acces au parc » se decale
   donc de 70 px vers la gauche.
   -------------------------------------------------------------------------- */
.page-template-template-informations #fp-content {
  --fp-wrap: min(1440px, 92vw);
}

/* --------------------------------------------------------------------------
   TEXTURE DE BANDEAU - motif de lignes obliques + halo, dessine entierement en
   CSS. Aucun fichier image n'est charge : le motif suit la palette (tokens),
   donc il reste juste si les couleurs changent dans le Customizer.
   -------------------------------------------------------------------------- */
.fp-acces-texture {
  background-image:
    radial-gradient(120% 130% at 8% -10%, color-mix(in srgb, var(--fp-primary) 62%, transparent) 0%, transparent 60%),
    radial-gradient(90% 120% at 100% 100%, color-mix(in srgb, var(--fp-accent) 26%, transparent) 0%, transparent 55%),
    repeating-linear-gradient(115deg,
      color-mix(in srgb, var(--fp-white) 7%, transparent) 0 2px,
      transparent 2px 24px);
}

/* --------------------------------------------------------------------------
   BRIQUES COMMUNES DE LA REFONTE (.fp-ip-*)

   Jetons LOCAUX a la page : ils ne servent qu'a eviter de repeter la meme
   formule dix fois, et ils sont tous construits sur la palette du theme. Aucune
   couleur en dur, ici comme ailleurs.
   -------------------------------------------------------------------------- */
.page-template-template-informations {
  /* Encre claire des fonds verts. Un gris sur fond coloré est un défaut de
     lisibilité : on éclaircit vers le blanc en gardant une pointe de teal.
     Contraste mesuré sur --fp-secondary : environ 10:1. */
  --fp-ip-clair: color-mix(in srgb, var(--fp-white) 84%, var(--fp-accent));
  /* Surfaces posées SUR un aplat vert (pastilles, cartouches). */
  --fp-ip-voile: color-mix(in srgb, var(--fp-white) 12%, transparent);
  --fp-ip-filet: color-mix(in srgb, var(--fp-white) 24%, transparent);
  --fp-ip-radius: clamp(20px, 2.4vw, 30px);
  --fp-ip-gap: clamp(12px, 1.1vw, 16px);
  /* Rythme vertical d'une section de cette page. */
  --fp-ip-y: clamp(64px, 7vw, 104px);
  /* Motif « Topo » du client EN TRAITS SEULS (assets/img/em-topo-traits.svg).
     em-topo.svg n'est PAS utilisable tel quel : il porte son propre aplat vert,
     qui recouvrirait le fond de la section au lieu de s'y poser en filigrane.
     Même choix que sur la page Restauration. */
  --fp-ip-motif: url('../img/em-topo-traits.svg');
}

/* LE MOTIF TOPOGRAPHIQUE (fp_informations_topo, inc/informations.php).
   Deux fusions, comme la maquette : soft-light sur les aplats verts, multiply
   sur le blanc. UNE SEULE DENSITÉ PAR SECTION : l'échelle est choisie à
   l'appel, jamais mélangée à l'intérieur d'une même surface. Le calque ne
   porte aucune information et ne capte aucun clic.
   Les sections qui le reçoivent posent « isolation: isolate » : sans cela, une
   fusion peut déborder sur ce qui est peint en dessous. */
.fp-ip-topo {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: var(--fp-ip-motif);
  background-repeat: no-repeat;
  background-position: center center;
}
.fp-ip-topo--clair {
  mix-blend-mode: soft-light;
  opacity: .45;
}
.fp-ip-topo--sombre {
  mix-blend-mode: multiply;
  opacity: .12;
}
.fp-ip-topo--sm { background-size: 620px auto; }
.fp-ip-topo--md { background-size: 1100px auto; }
.fp-ip-topo--lg { background-size: 1600px auto; }
/* HÉRO : le topo couvre TOUTE la section et s'adoucit nettement (retour
   client du 2026-08-12, quatrième passage : « le mettre en cover de toute la
   section, sinon il reste trop petit, et réduire son opacité de moitié au
   moins, là c'est trop visible »). Le calque est imprimé à la racine de la
   section (inc/informations.php), après la photo et le voile : il se fond
   par-dessus eux, sous le contenu. Opacité .45 -> .2, un peu plus que la
   moitié demandée (« au moins »). */
.fp-ip-hero > .fp-ip-topo {
  background-size: cover;
  opacity: .2;
}

/* TÊTE DE SECTION : pilule de sur-titre (icon-box du thème, jamais redéfinie
   ici), titre, accroche. Centrée par défaut, alignée à gauche sur la section
   d'accès, dont les panneaux commencent au bord gauche. */
.fp-ip-tete {
  display: flex;
  flex-direction: column;
  gap: 14px;
  max-width: 720px;
}
.fp-ip-tete--centre {
  align-items: center;
  text-align: center;
  margin: 0 auto;
}
.fp-ip-eyebrow { display: flex; }
.fp-ip-tete--centre .fp-ip-eyebrow { justify-content: center; }
/* Bebas Neue n'existe qu'en graisse 400 : demander plus fabriquerait un faux
   gras, banni du projet. Le poids visuel vient de la taille et de l'interlettre. */
.fp-ip-titre-section {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0;
  line-height: .96;
  font-size: clamp(2rem, 4.4vw, 4rem);
  margin: 0;
}
.fp-ip-lead {
  margin: 0;
  line-height: 1.62;
  max-width: 62ch;
  font-size: clamp(1rem, 1.1vw, 1.08rem);
}
.fp-ip-tete--centre .fp-ip-lead { margin-inline: auto; }

/* PASTILLE D'ÉTAT : LIBELLÉ LONG AU BUREAU, LIBELLÉ COURT AU DOIGT (retour
   client du 2026-08-18 : sur téléphone, « Fermé actuellement » passe à la
   ligne dans une case de demi-largeur, la pastille doit dire « Fermé »).

   PARTAGE DES RÔLES, ET IL NE BOUGE PAS. Le libellé LONG est écrit par le
   navigateur dans le span data-fp-horaires-status-label (setupHorairesLive,
   assets/js/main.js), script PARTAGÉ par toutes les pages à horaires : il
   n'est ni modifié ni dupliqué, et il porte le texte réglable du module
   fp-horaires-manager. Les deux libellés COURTS sont rendus par le serveur
   (fp_informations_statut_pastille, inc/informations.php) et masqués ici par
   défaut ; c'est la classe d'état posée par ce même script (is-open ou
   is-closed) qui décide lequel s'affiche, et seulement sous 720 px (voir le
   bloc RESPONSIVE en fin de feuille). Aucun état n'est deviné côté serveur.

   MASQUAGE DE BASE DÉPLACÉ DANS main.css (relecture du 2026-08-18) : le markup
   étant partagé avec la page Restauration (fp_render_restauration_horaires),
   le display: none de base doit vivre dans la feuille commune, sans quoi cette
   page-là affichait les trois libellés côte à côte. Ici ne restent que les
   règles de RÉVÉLATION sous 720 px (bloc responsive en fin de feuille). */

/* --------------------------------------------------------------------------
   1. COORDONNÉES (.fp-ip-hero) - zone fp-blk-informations-hero.

   Une bannière photo pleine largeur, aux deux coins BAS arrondis (la maquette),
   puis la mosaïque « bento » des coordonnées sur fond clair. La bannière reste
   collée au haut de la fenêtre : la barre de navigation du site est fixe et
   FLOTTE par-dessus (main.css, .fp-has-dark-hero .fp-nav), c'est donc la marge
   interne haute de la bannière qui lui réserve sa place, et son fond sombre
   garantit la lisibilité de la barre.
   -------------------------------------------------------------------------- */
.fp-ip-hero {
  position: relative;
  isolation: isolate;
  background: var(--fp-paper);
  padding-bottom: var(--fp-ip-y);
  /* Cible d'ancre (id="coordonnees") : réserve la hauteur de la barre de
     navigation flottante, sans quoi un saut vers cette section atterrit
     sous elle. Même valeur que le reste du site (restauration.css,
     evenements.css). */
  scroll-margin-top: calc(var(--fp-nav-h) + 16px);
}
/* FOND DE TOUTE LA PREMIÈRE SECTION (retour client, 2026-08-12, second
   passage : « je souhaiterais pouvoir définir une image en fond pour la
   première section, donc le héro »). C'est la MÊME image que fp-zone-bg
   posait déjà sur la seule bannière (fp_render_informations_hero,
   inc/informations.php) : elle est simplement épinglée un cran plus haut,
   sur .fp-ip-hero, pour couvrir la bannière ET la mosaïque en dessous. Aucun
   nouveau bloc Gutenberg, la cliente change une seule image. */
.fp-ip-hero-photo,
.fp-ip-hero-voile {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}
.fp-ip-hero-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Voile de lisibilité : dégradé dans le vert très foncé du thème, dense du
   côté du texte (bannière, en haut) et transparent de l'autre (la diagonale
   de la maquette). Le calque couvre maintenant toute la section, mosaïque
   comprise, mais l'angle reste quasi HORIZONTAL (100deg, une dizaine de
   degrés sous « à droite ») : dans une section bien plus large que haute,
   l'ajout de hauteur (la mosaïque) déplace donc très peu les paliers, mesurés
   à l'origine sur la seule bannière.

   LES PALIERS SONT MESURÉS SUR LE PIRE CAS, une photo entièrement BLANCHE,
   parce que c'est la cliente qui choisit la photo et que rien ne garantit
   qu'elle sera sombre : à 94 % le texte blanc de la bannière tient 15:1, à
   72 % (là où se termine sa colonne de texte, environ 60 % de la largeur) il
   tient encore 6:1. Le dernier palier, remonté de 30 % à 42 %, ne porte
   jamais de texte (mascotte, puis mosaïque aux tuiles opaques) : la marge
   supplémentaire compense la marge de manœuvre en moins sur la hauteur totale. */
.fp-ip-hero-voile {
  background: linear-gradient(100deg,
    color-mix(in srgb, var(--fp-dark) 94%, transparent) 0%,
    color-mix(in srgb, var(--fp-dark) 72%, transparent) 60%,
    color-mix(in srgb, var(--fp-dark) 42%, transparent) 100%);
}
.fp-ip-banniere {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--fp-secondary);
  color: var(--fp-white);
  border-radius: 0 0 clamp(24px, 3vw, 40px) clamp(24px, 3vw, 40px);
  min-height: min(76vh, 700px);
  display: flex;
  align-items: flex-end;
  padding-top: calc(var(--fp-nav-h) + clamp(36px, 5vw, 84px));
  padding-bottom: clamp(34px, 4.4vw, 68px);
}
/* Avec une image de fond posée au niveau de la section (.fp-ip-hero.has-photo),
   la bannière laisse voir cette image au lieu de son propre aplat : le voile
   de section (ci-dessus) assure alors la lisibilité du titre, exactement
   comme le faisait l'ancien voile local à la bannière. */
.fp-ip-hero.has-photo .fp-ip-banniere { background: transparent; }
/* BLOC DE TEXTE CENTRÉ (retrait de la mascotte, 2026-09-03, demande du
   client) : sur-titre, titre, accroche et bouton sont désormais alignés au
   centre, à toutes les largeurs. La mascotte qui occupait le coin droit de
   la bannière (en position absolue, donc hors du flux) est retirée du rendu
   (inc/informations.php) : ce centrage n'a plus à composer avec elle. */
.fp-ip-banniere-corps {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: clamp(14px, 1.6vw, 20px);
  width: 100%;
}
.fp-ip-titre {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0;
  /* Interlignage resserré pour accompagner l'agrandissement ci-dessous, une
     ligne trop aérée paraissant flottante à cette taille. */
  line-height: .85;
  /* Répartition équilibrée des mots sur plusieurs lignes (retour Marino,
     2026-09-06) plutôt qu'une dernière ligne orpheline d'un seul mot. */
  text-wrap: balance;
  /* AGRANDI D'ENVIRON 30 % (retour Marino, 2026-09-06 : le titre doit
     nettement dominer le paragraphe en dessous). Les trois bornes du clamp
     précédent (2,5rem / 4,6vw / 4,2rem) sont multipliées à l'identique, la
     coupure de ligne restant juste puisque max-width est exprimé en ch, dans
     la même unité que le texte : elle grandit au même rythme que les
     lettres. Vérifié sans débordement à 390px (le terme bas du clamp, fixe,
     y gouverne toujours seul, comme avant l'agrandissement). */
  font-size: clamp(3.25rem, 6vw, 5.46rem);
  margin: 0;
  max-width: 14ch;
}
.fp-ip-hero-lead {
  margin: 0;
  /* Élargi d'environ 54 à 62ch (retour Marino, 2026-09-06) pour qu'un mot
     ne parte plus seul à la ligne sur les largeurs d'ordinateur courantes.
     Aucun texte modifié : seule la largeur de la colonne change. */
  max-width: 62ch;
  line-height: 1.6;
  font-size: clamp(1rem, 1.2vw, 1.12rem);
  color: var(--fp-ip-clair);
}
.fp-ip-hero-actions { margin-top: 4px; }
/* Mascotte de la bannière RETIRÉE DU RENDU (2026-09-03, demande du client) :
   inc/informations.php n'imprime plus .fp-ip-banniere-mascotte, plus aucune
   image ni image d'attente à cet emplacement. Règles de mise en page de ce
   décor supprimées ici (et dans la requête média 720px plus bas) : le bloc
   de texte ci-dessus occupe seul la bannière, centré. */

/* LA MOSAÏQUE. Douze colonnes, comme la maquette : adresse (7) et photo (5) en
   haut sur deux rangées, puis état (3), téléphone (5) et courriel (4). Une
   tuile dont la donnée n'est pas renseignée dans les Coordonnées n'est PAS
   rendue : la mosaïque se resserre d'elle-même, elle n'affiche jamais de case
   vide. */
.fp-ip-bento {
  /* QUATRE CASES SUR UNE SEULE RANGÉE, toutes à la même largeur (retour
     client du 2026-08-12, cinquième passage : « remplace le bento par juste
     les quatre cases, l'une à côté de l'autre, toutes la même largeur, on
     verra mieux l'image de fond »). Flex plutôt que grille : si une tuile
     manque (téléphone ou courriel non renseignés dans les Coordonnées), les
     autres s'élargissent d'elles-mêmes, sans les règles :has() de l'ancien
     bento. La hauteur minimale du second passage (168px) est conservée,
     portée par les tuiles, contenu toujours ancré bas-gauche. */
  display: flex;
  align-items: stretch;
  gap: var(--fp-ip-gap);
  margin-top: clamp(28px, 3.4vw, 48px);
  /* Profondeur du suivi de la souris (assets/js/informations.js) : sans elle,
     une rotation sur X ou Y n'a aucun effet visible, le navigateur la rendant
     à plat. Aucune incidence quand le script ne tourne pas. */
  perspective: 1000px;
}
.fp-ip-tuile {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: 14px;
  padding: clamp(20px, 2vw, 30px);
  border-radius: var(--fp-ip-radius);
  background: var(--fp-cream);
  color: var(--fp-ink);
  border: 1px solid var(--fp-line);
  text-decoration: none;
  /* AUCUNE transition sur transform : le suivi de la souris et l'assemblage de
     la mosaïque pilotent cette propriété image par image (GSAP), une
     transition CSS viendrait lutter contre eux. */
  transition: background-color .3s ease, border-color .3s ease;
}
a.fp-ip-tuile:hover {
  background: color-mix(in srgb, var(--fp-accent) 16%, var(--fp-cream));
  border-color: var(--fp-primary);
}
a.fp-ip-tuile:focus-visible {
  outline: 2px solid var(--fp-primary);
  outline-offset: 3px;
}
.fp-ip-tuile-label {
  position: relative;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  gap: 9px;
  font-size: .78rem;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--fp-primary);
}
.fp-ip-tuile-ic { display: inline-flex; }
.fp-ip-tuile-ic svg { width: 16px; height: 16px; }
.fp-ip-tuile-corps {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}
.fp-ip-tuile-valeur,
.fp-ip-tuile-adresse {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  line-height: .96;
  letter-spacing: .01em;
  overflow-wrap: anywhere;
}
.fp-ip-tuile-valeur { font-size: clamp(1.5rem, 2.2vw, 2.1rem); }
/* Alignée sur la taille des autres valeurs depuis que la tuile d'adresse a la
   même largeur que ses voisines (rangée à quatre cases égales). */
.fp-ip-tuile-adresse { font-size: clamp(1.5rem, 2.2vw, 2.1rem); }
.fp-ip-tuile-precision {
  font-size: .95rem;
  line-height: 1.5;
  color: var(--fp-ink-soft);
}
.fp-ip-tuile-fleche {
  position: absolute;
  right: clamp(18px, 2vw, 28px);
  bottom: clamp(18px, 2vw, 28px);
  z-index: 1;
  display: inline-flex;
  color: var(--fp-primary);
  transition: transform .3s ease;
}
a.fp-ip-tuile:hover .fp-ip-tuile-fleche { transform: translate(3px, -3px); }
/* Grande tuile d'adresse : le vert très foncé du thème et le motif en
   filigrane, comme la maquette. Encre claire, contraste supérieur à 15:1. */
.fp-ip-tuile--adresse {
  background: var(--fp-dark);
  color: var(--fp-white);
  border-color: var(--fp-dark);
}
.fp-ip-tuile--adresse .fp-ip-tuile-label { color: var(--fp-accent); }
.fp-ip-tuile--adresse .fp-ip-tuile-precision { color: var(--fp-ip-clair); }
a.fp-ip-tuile--adresse:hover {
  background: var(--fp-secondary);
  border-color: var(--fp-secondary);
}
/* La flèche partagée (.fp-ip-tuile-fleche, définie plus haut) est colorée
   var(--fp-primary) par défaut : trop sombre sur le fond var(--fp-dark) de
   cette tuile, on reprend donc l'accent déjà utilisé pour son libellé. */
.fp-ip-tuile--adresse .fp-ip-tuile-fleche { color: var(--fp-accent); }
/* TUILE « ITINÉRAIRE » (retour de Marino, 09.09.2026) : la grande tuile
   d'adresse ne signalait jusque-là pas qu'elle est cliquable. Trois calques
   décoratifs, aria-hidden, aucune information n'y est portée :
    - un fond « plan du parc » très discret, le fichier utilisé partout
      ailleurs sur le site pour la même idée de trajet (assets/img/em-plan.svg,
      traits clairs sur aplat), à la place du motif topo partagé (posé sur les
      autres tuiles) : les deux textures superposées auraient chargé une case
      qui doit rester sobre ;
    - un petit repère de localisation en médaillon, distinct du petit icône
      typographique du libellé « Adresse » ;
    - un texte d'incitation (.fp-ip-tuile-itineraire-hint, sous l'adresse) et
      la flèche partagée ci-dessus (.fp-ip-tuile-fleche), pour que la case se
      lise enfin comme cliquable, comme ses voisines téléphone et courriel. */
.fp-ip-tuile-itineraire-motif {
  position: absolute;
  inset: -10%;
  z-index: 0;
  background-image: url('../img/em-plan.svg');
  background-size: min(900px, 220%);
  background-position: center 55%;
  background-repeat: no-repeat;
  opacity: .16;
  pointer-events: none;
}
.fp-ip-tuile-itineraire-pin {
  position: absolute;
  top: clamp(18px, 2vw, 28px);
  right: clamp(18px, 2vw, 28px);
  z-index: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--fp-ip-voile);
  color: var(--fp-accent);
  pointer-events: none;
}
.fp-ip-tuile-itineraire-pin svg { width: 17px; height: 17px; }
.fp-ip-tuile-itineraire-hint {
  display: inline-flex;
  align-items: center;
  font-size: .85rem;
  font-weight: 600;
  color: var(--fp-accent);
  /* Réserve la place de la flèche (.fp-ip-tuile-fleche, absolue en bas à
     droite) : sur une tuile étroite (mosaïque à deux colonnes, mobile), cette
     dernière ligne du contenu partagerait sinon la même hauteur qu'elle. */
  padding-right: clamp(28px, 6vw, 40px);
}
/* La tuile photo a été retirée de la mosaïque (retour client du 2026-08-12,
   cinquième passage) : le fond de section porte seul l'image, voir
   fp_render_informations_hero. */
/* Tuile d'état : le teal du parc. La pastille en direct (composant partagé
   .fp-horaires-status, main.css) reste MASQUÉE tant que le navigateur n'a pas
   tranché, pour ne jamais afficher un état faux dans une page mise en cache :
   le lien vers le tableau des horaires, lui, est toujours là. */
.fp-ip-tuile--statut {
  background: var(--fp-primary);
  color: var(--fp-white);
  border-color: var(--fp-primary);
}
.fp-ip-tuile--statut .fp-ip-tuile-label { color: var(--fp-white); }
.fp-ip-tuile-lien {
  font-weight: 600;
  color: var(--fp-white);
  text-decoration: underline;
  text-underline-offset: 3px;
}
/* Largeurs égales : chaque tuile de la rangée prend le même flex, la hauteur
   minimale du second passage est portée ici depuis le retrait de la grille. */
.fp-ip-bento > .fp-ip-tuile {
  flex: 1 1 0;
  min-width: 0;
  min-height: 168px;
}
.fp-ip-tuile--mail .fp-ip-tuile-valeur { font-size: clamp(1.2rem, 1.8vw, 1.7rem); }

/* --------------------------------------------------------------------------
   2. ACCÈS (.fp-ip-acces) - zone fp-blk-informations-acces.

   DEUX MISES EN PAGE POUR UN SEUL MARKUP, et c'est le point délicat de cette
   page.

   PAR DÉFAUT (donc : sans JavaScript, sous « animations réduites », si GSAP
   n'arrive jamais, ou sous 1024 px), les panneaux se SUIVENT VERTICALEMENT, en
   alternant le côté de la photo. C'est une mise en page complète, lisible et
   défilable normalement : rien n'est caché, rien n'attend un script.

   SOUS html.fp-ip-anim ET AU-DESSUS DE 1024 px seulement, la section prend la
   hauteur de la fenêtre et la piste passe en ligne : assets/js/informations.js
   épingle alors la section et fait défiler la piste horizontalement au fil du
   défilement vertical (mécanique de la maquette). La classe est posée avant la
   première peinture et RETIRÉE par le script s'il ne peut pas tenir sa
   promesse : on ne se retrouve donc jamais avec une piste horizontale que rien
   ne fait avancer.
   -------------------------------------------------------------------------- */
.fp-ip-acces {
  position: relative;
  isolation: isolate;
  background: var(--fp-secondary);
  color: var(--fp-white);
  padding: var(--fp-ip-y) 0;
  overflow: hidden;
  /* Cible d'ancre (id="acces") : même garde que .fp-ip-hero ci-dessus. */
  scroll-margin-top: calc(var(--fp-nav-h) + 16px);
}
/* Motif topographique FORCÉ EN COVER (retour client, 2026-08-12, second
   passage : « il faut le forcer en cover, il doit prendre toute la section »,
   même leçon que sur la page Restauration). Une taille fixe (--fp-ip-topo--md)
   laissait le motif plus étroit que la section une fois épinglée en pleine
   hauteur de fenêtre ; cover le fait toujours couvrir tout le cadre. */
.fp-ip-acces .fp-ip-topo {
  background-size: cover;
}
.fp-ip-acces .fp-ip-lead { color: var(--fp-ip-clair); }
.fp-ip-acces-cadre {
  position: relative;
  z-index: 1;
  margin-top: clamp(30px, 3.6vw, 52px);
}
.fp-ip-acces-piste {
  display: flex;
  flex-direction: column;
  gap: clamp(40px, 5vw, 80px);
  max-width: var(--fp-wrap);
  margin: 0 auto;
  padding: 0 var(--fp-gutter);
}
.fp-ip-panneau {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 420px);
  gap: clamp(24px, 3vw, 44px);
  align-items: center;
}
/* En flux normal, une photo sur deux passe à gauche : le regard descend en
   zigzag au lieu de longer une colonne. En piste horizontale, cette alternance
   n'a plus de sens (on lit de gauche à droite), elle est donc annulée. */
.fp-ip-panneau:nth-child(even) .fp-ip-panneau-photo { order: -1; }
.fp-ip-panneau-txt {
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-width: 0;
}
.fp-ip-panneau-rang {
  display: flex;
  align-items: center;
  gap: 14px;
  margin: 0;
  color: var(--fp-accent);
}
.fp-ip-panneau-ic {
  flex: 0 0 auto;
  width: 46px;
  height: 46px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--fp-ip-voile);
  border: 1px solid var(--fp-ip-filet);
  color: var(--fp-white);
}
.fp-ip-panneau-ic svg { width: 22px; height: 22px; }
.fp-ip-panneau-filet {
  flex: 1 1 auto;
  height: 1px;
  background: var(--fp-ip-filet);
}
.fp-ip-panneau-num {
  flex: 0 0 auto;
  font-family: var(--fp-font-heading);
  font-size: 1rem;
  letter-spacing: .12em;
  color: var(--fp-ip-clair);
}
.fp-ip-panneau-titre {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0;
  line-height: .92;
  font-size: clamp(1.9rem, 4vw, 3.6rem);
  margin: 0;
}
.fp-ip-panneau-desc {
  margin: 0;
  line-height: 1.64;
  max-width: 56ch;
  color: var(--fp-ip-clair);
}
.fp-ip-panneau-photo {
  position: relative;
  overflow: hidden;
  border-radius: var(--fp-ip-radius);
  aspect-ratio: 4 / 3;
  background: var(--fp-ip-voile);
}
.fp-ip-panneau-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Panneau dont la photo n'a pas encore été déposée : un filigrane de plan
   dessiné en CSS, jamais une image cassée ni un trou. */
.fp-ip-panneau-photo.is-vide {
  background-image:
    repeating-linear-gradient(90deg, var(--fp-ip-filet) 0 1px, transparent 1px 38px),
    repeating-linear-gradient(0deg, var(--fp-ip-filet) 0 1px, transparent 1px 38px);
}
/* Repères de progression : ils ne disent quelque chose QUE pendant le
   défilement épinglé. En flux normal, ils n'auraient rien à indiquer. */
.fp-ip-acces-reperes {
  display: none;
  gap: 10px;
  margin: clamp(22px, 2.6vw, 34px) auto 0;
  max-width: var(--fp-wrap);
  padding: 0 var(--fp-gutter);
}
.fp-ip-acces-repere {
  width: 34px;
  height: 3px;
  border-radius: var(--fp-pill);
  background: var(--fp-ip-filet);
  transition: background-color .3s ease;
}
.fp-ip-acces-repere.is-actif { background: var(--fp-accent); }
/* LES FLÈCHES DE PILOTAGE N'EXISTENT QUE DANS LE SLIDER ÉPINGLÉ AU DOIGT
   (rendues par inc/informations.php, révélées par le bloc « LES DEUX FLÈCHES DE
   PILOTAGE » plus bas). Masquées ICI par défaut, donc partout ailleurs sans
   exception : sur ordinateur, dans le repli vertical, sous « animations
   réduites » et sans JavaScript. Elles commanderaient sinon un défilement
   horizontal qui n'a pas lieu. */
.fp-ip-fleche { display: none; }

@media (min-width: 1024px) {
  html.fp-ip-anim .fp-ip-acces {
    min-height: 100vh;
    min-height: 100svh;
    display: flex;
    flex-direction: column;
    justify-content: center;
  }
  /* DÉFAUT MESURÉ AU BANC : dès que la section passe en conteneur flex, ses
     enfants deviennent des ÉLÉMENTS FLEX, et les marges latérales « auto » de
     .fp-wrap l'emportent alors sur l'étirement (règle du modèle flexible : une
     marge automatique consomme l'espace libre AVANT l'alignement). La colonne
     se rétrécissait donc sur son contenu, et la tête de section se retrouvait
     centrée au lieu d'être alignée sur le reste de la page (mesure : 730 px de
     large au lieu de 1325). On redonne explicitement toute la largeur aux trois
     enfants directs. */
  html.fp-ip-anim .fp-ip-acces > .fp-wrap,
  html.fp-ip-anim .fp-ip-acces > .fp-ip-acces-cadre,
  html.fp-ip-anim .fp-ip-acces > .fp-ip-acces-reperes { width: 100%; }
  html.fp-ip-anim .fp-ip-acces-cadre { overflow: hidden; }
  html.fp-ip-anim .fp-ip-acces-piste {
    flex-direction: row;
    align-items: center;
    gap: clamp(28px, 3vw, 48px);
    max-width: none;
    margin: 0;
    /* Bord gauche du premier panneau ALIGNÉ SUR LA LARGEUR DU TITRE au-dessus
       (retour client, 2026-08-12, second passage) : même calcul de bordure
       que .fp-wrap (main.css), pas un simple --fp-gutter qui collait le
       panneau au bord de la fenêtre au lieu du bord de la colonne de contenu.
       La partie droite, elle, continue de déborder hors cadre : c'est ce que
       le défilement horizontal révèle. */
    padding-left: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter));
    /* Respiration en fin de course (retour client du 2026-08-13 : « le scroll
       ne doit pas s'arrêter net à la fin de l'image ») : même bordure
       calculée qu'à gauche, le dernier panneau (À vélo ou à pied) finit donc
       aligné sur la colonne de contenu, avec l'espace pour être vu. La
       distance du pin suit automatiquement (piste.scrollWidth,
       assets/js/informations.js, invalidateOnRefresh). */
    padding-right: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter));
    will-change: transform;
  }
  html.fp-ip-anim .fp-ip-panneau {
    flex: 0 0 auto;
    width: min(1080px, 84vw);
  }
  html.fp-ip-anim .fp-ip-panneau:nth-child(even) .fp-ip-panneau-photo { order: 0; }
  html.fp-ip-anim .fp-ip-acces-reperes { display: flex; }
}

/* --------------------------------------------------------------------------
   LA MÊME PISTE HORIZONTALE, SUR TÉLÉPHONE ET TABLETTE (demande client du
   2026-08-14 : le slider latéral, « c'est vraiment sympa », il doit exister
   aussi au doigt).

   DEUX CLASSES SONT EXIGÉES, PAS UNE SEULE. html.fp-ip-anim dit que la page
   anime ; html.fp-ip-pin-mobile n'est posée par assets/js/informations.js QUE
   lorsque l'épinglage mobile a réellement été créé, et le script la retire dès
   qu'il ne l'est plus (rotation en paysage, filet de secours). Il la pose
   d'abord, MESURE la section ainsi compactée, et l'enlève aussitôt si elle ne
   tient pas dans l'écran : ce bloc est donc à la fois la mise en page et le
   banc de mesure qui décide de son propre emploi. Sans ce second verrou, un
   téléphone en paysage, un texte allongé par la cliente ou un GSAP qui
   n'arrive jamais afficheraient une piste en ligne que rien ne ferait avancer :
   les panneaux 2 et 3 hors écran, sans aucun moyen d'y accéder. Sous
   « animations réduites », aucune des deux classes n'existe et rien de ce bloc
   ne s'applique : les panneaux se suivent verticalement, comme aujourd'hui.

   LE MARKUP NE BOUGE PAS D'UNE LIGNE (arbitrage client) : le titre de section
   reste dans l'épinglage et donc visible pendant tout le défilement, exactement
   comme au bureau. C'est TOUT LE RESTE qui se compacte pour tenir dans 100svh,
   faute de quoi l'épinglage couperait le bas de la section.

   PANNEAU EMPILÉ ET PLEINE COLONNE (retour client du 2026-08-17) : « icône,
   titre, texte, image empilés, chaque panneau en pleine largeur alignée sur le
   titre Trois façons de nous rejoindre ». La photo étroite posée à côté du
   texte (première version de ce slider au doigt) est donc abandonnée : on
   reprend la structure du repli vertical, que le client apprécie, et on la fait
   défiler horizontalement. Deux conséquences mesurables :
     - la largeur d'un panneau part de la colonne de contenu, var(--fp-wrap)
       moins ses deux gouttières (moins le débord --fp-ip-peek depuis le
       2026-08-18), et la piste reçoit la même bordure de départ que .fp-wrap :
       le premier panneau démarre au pixel sous le titre de section, plus 15 px
       trop à gauche comme avec l'ancien padding-inline: var(--fp-gutter) ;
     - la course du pin tombe juste. La piste mesure bordure + 3 panneaux +
       2 écarts + bordure, le cadre fait 100vw, donc la distance parcourue vaut
       2 x (panneau + écart) : les trois panneaux se calent aux progressions
       0, 0,5 et 1, là où les trois repères basculent.

   DEUXIÈME REVUE MOBILE (retour client du 2026-08-18) : « la section en plein
   écran, le titre plus grand, l'iconbox et le texte un peu plus grands, plus
   de padding, tout doit respirer, plus d'espace entre la fin du texte et le
   début du slider, le slider prend plus de place, le titre du panneau plus
   grand, et plus d'espace entre les cartes, elles sont trop collées ». Trois
   mécaniques répondent à tout cela SANS jamais faire échouer le budget.

   1. LES TAILLES SE MESURENT EN HAUTEUR D'ÉCRAN (svh), PAS SEULEMENT EN
      LARGEUR. Une valeur en vw grandit sur un téléphone LARGE, or ce qui
      manque ou non ici, c'est de la HAUTEUR. Chaque poste de dépense (titres,
      accroche, écarts, photo) s'écrit donc « clamp(valeur d'aujourd'hui,
      N svh, plafond) » : sur un écran court (375 x 667, 553 px utiles) le
      plancher gouverne et la mise en page reste celle du 2026-08-17, à
      quelques pixels près ; sur un téléphone récent (393 x 852, environ 745 px
      utiles) tout grandit d'un tiers sans jamais dépasser. L'unité svh est
      STATIQUE (elle décrit la fenêtre barre d'adresse VISIBLE) : elle ne varie
      pas pendant le défilement, la mesure de sectionTient reste déterministe,
      et aucune media query de hauteur n'est introduite (interdit maison, voir
      assets/js/informations.js). Chaque déclaration en svh est doublée de la
      version d'origine juste au-dessus : sur un navigateur sans svh, la
      seconde est invalide, ignorée, et la première tient toujours.
   2. LE CADRE DU SLIDER PREND TOUTE LA PLACE QUI RESTE (flex: 1 0 auto) : la
      tête de section se cale en haut, les repères en bas, et les panneaux
      remplissent l'écran entre les deux. C'est cela, « la section en plein
      écran » : plus de bande morte au-dessus et en dessous d'un bloc centré.
      La croissance ne coûte RIEN au budget : elle ne consomme que de l'espace
      libre, et sectionTient mesure la section min-height neutralisée, donc au
      repos, où aucun étirement n'a lieu.
   3. LES CARTES SONT PLUS ÉTROITES QUE LA COLONNE (--fp-ip-peek) et l'écart
      entre elles s'élargit : la carte suivante déborde franchement dans
      l'écran au lieu d'affleurer le bord (« trop collées »). Effet de bord
      heureux et mesuré : la course du pin place alors le panneau 2 CENTRÉ dans
      la fenêtre à mi-parcours et le panneau 3 aligné à droite en fin de
      course, les trois repères basculant toujours aux mêmes progressions.

   TROISIÈME REVUE MOBILE (retour client du 2026-08-20) : bande blanche vue
   PENDANT L'APPROCHE et non plus seulement une fois épinglé, repères à
   remonter au ras du bas réel de l'écran, contenu du panneau trop serré sous
   la tête de section, titre de section qui passe sous la barre de navigation,
   cartes encore trop larges, et pas assez d'espace après la dernière carte.
   Chaque point est traité à sa règle, commentée sur place ; deux d'entre eux
   changent le BUDGET et méritent d'être lus ensemble :

   a. LA HAUTEUR DE LA BARRE DE NAVIGATION EST DÉSORMAIS RÉSERVÉE EN HAUT
      (--fp-nav-h-stuck, environ 70 px), ce qui est un coût fixe considérable
      sur un écran court.
   b. LA PHOTO DEVIENT LE SEUL POSTE ÉLASTIQUE : rangée 1fr entre un plancher
      (13svh) et un plafond (26svh) au lieu d'une hauteur fixe. Le budget se
      calcule donc AU PLANCHER, ce que mesure exactement sectionTient, et la
      photo rend d'elle-même la place que le nouveau coût fixe demande.
      C'est ce qui permet d'ajouter (a) sans perdre l'épinglage sur les petits
      téléphones : c'est la photo qui paie, pas le slider entier.

   BUDGET DE HAUTEUR AU PLANCHER, panneau le plus haut (« En transports
   publics », description la plus longue du semis, 160 signes). Colonne de
   contenu = min(1440px, 92vw) moins 2 x 20 px de gouttière mobile, moins la
   largeur de débord --fp-ip-peek.

     360 x 640 (fenêtre utile 560 px, colonne 291 px, carte 255 px) : marge
       haute 72 + 16 = 88, marge basse 8, sur-titre 24, écarts 13,4, titre
       21,5, accroche 3 lignes 68,4, cadre 24,6, panneau 263 (pastille 30,
       écarts 16,8, titre 19,9, description 5 lignes 110,3, écart 13,4, photo
       au plancher 13svh = 72,8), repères 13,1 = environ 524 px. Marge : 36 px,
       et la photo affichée occupe en réalité une centaine de pixels.
     375 x 667 (553 px utiles, colonne 305 px, carte 268 px) : environ 523 px
       au plancher. Marge : 30 px, photo affichée environ 102 px.
     393 x 852 (745 px utiles, colonne 322 px, carte 283 px) : titre sur deux
       lignes, accroche 17,3 px, titre de panneau 26,8 px, environ 650 px au
       plancher. Marge : 95 px, entièrement rendue à la photo, qui s'affiche
       alors à environ 190 px, tout près de son plafond de 26svh.

   Le pire cas d'une accroche allongée par la cliente coûte une vingtaine de
   pixels par ligne. Au-delà de la marge, la MESURE RÉELLE
   (assets/js/informations.js, sectionTient) refuse l'épinglage et la page
   reprend son empilement vertical : jamais de contenu coupé.
   -------------------------------------------------------------------------- */
@media (max-width: 1023px) {
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces {
    /* Rythme vertical resserré POUR CETTE SEULE SECTION : le jeton est
       redéfini sur elle, jamais sur la page, les autres sections gardent leur
       respiration. 64 px en haut et 64 px en bas mangeaient à eux seuls près
       du quart de l'écran utile, et le panneau empilé du 2026-08-17 demande
       une trentaine de pixels de plus que la version photo à côté du texte :
       ils sont repris ici.

       JAMAIS DE svh DANS UN JETON, et c'est un piège corrigé le 2026-08-20 :
       un jeton personnalisé n'est PAS validé à la déclaration, il est
       remplacé tel quel à la lecture. Une seconde déclaration en svh écrase
       donc la première même sur un navigateur qui ne connaît pas l'unité, et
       c'est la PROPRIÉTÉ qui la lit (ici padding) qui devient invalide à
       l'exécution, sans repli possible : le rythme de la section tombait alors
       à zéro. L'air proportionnel à la hauteur d'écran est rendu là où il est
       sans danger, sur des propriétés réelles doublées (marge du cadre, marge
       basse ci-dessous), où une déclaration invalide laisse simplement la
       précédente s'appliquer. */
    --fp-ip-y: clamp(16px, 4.5vw, 26px);
    /* DÉBORD LATÉRAL DES CARTES : de combien chaque panneau est plus étroit
       que la colonne de contenu, donc de combien la carte suivante entre dans
       l'écran (retour client du 2026-08-18 : « les cartes sont trop
       collées », puis 2026-08-20 : « encore un peu moins large, sinon c'est
       vraiment border »). Écrit une seule fois ici, lu par la largeur du
       panneau aux deux paliers de gouttière (voir plus bas). */
    --fp-ip-peek: clamp(30px, 10vw, 64px);
    /* ESPACE DE FIN DE COURSE (retour client du 2026-08-20 : « on triche un
       petit peu pour avoir un peu plus d'espace à droite de la dernière
       colonne », puis le soir même : « encore un peu d'espace à droite qui
       vienne pousser le slider pour qu'on ait le temps de lire avant que ça
       défile plus bas »). Une DEMI-LARGEUR D'ÉCRAN, donc proportionnelle à
       l'appareil et non plus une valeur fixe, plafonnée pour qu'une tablette
       n'hérite pas d'un désert. Porté par une boîte réelle, voir la règle de
       la piste plus bas. */
    --fp-ip-fin: min(50vw, 320px);
    /* MARGE INTERNE DROITE DE CHAQUE PANNEAU (méthode dictée par le client le
       2026-08-20 : « dans la colonne en voiture, on met du padding à droite,
       effet d'espace, le design respire »). Les POSITIONS ne bougent pas : la
       carte suivante démarre exactement où elle démarrait, c'est le contenu de
       la carte courante qui s'arrête plus tôt. */
    --fp-ip-pad-droite: clamp(20px, 7vw, 52px);
    /* LA BOÎTE COUVRE LA GRANDE HAUTEUR DE FENÊTRE (lvh), pas la petite (svh).
       C'est le correctif STRUCTUREL de la bande blanche (retour client du
       2026-08-20 au soir : elle réapparaissait pendant l'approche, sur
       l'appareil réel).
       lvh décrit la fenêtre BARRE D'OUTILS REPLIÉE, c'est à dire la plus grande
       qu'un navigateur mobile puisse présenter. La section, et donc la hauteur
       que ScrollTrigger fige en l'épinglant, couvre par construction n'importe
       quel état de la barre : il ne peut plus rester de bande sous elle, ni à
       l'approche, ni pendant l'épinglage, quelle qu'en soit la cause. Et lvh
       est une unité STATIQUE, contrairement à dvh : rien ne bouge quand la
       barre se replie, aucune remise en page, aucun saut de défilement.
       CE QUI EST LISIBLE, EN REVANCHE, RESTE LE PETIT VIEWPORT : la marge basse
       ci-dessous rend à la section la différence entre les deux, si bien que
       tout le contenu tient dans la partie visible barre DÉPLOYÉE. La zone
       rendue est du vert nu, exactement celle que la barre découvre en se
       repliant. */
    min-height: 100vh;
    min-height: 100lvh;
    display: flex;
    flex-direction: column;
    /* CONTENU ANCRÉ EN HAUT, jamais centré : un contenu centré qui déborde
       déborde des DEUX côtés, et le haut de la section passerait alors sous la
       barre de navigation quoi qu'on réserve. Avec le cadre qui absorbe
       l'espace libre (plus bas), l'ancrage en haut donne exactement la même
       image quand tout tient, et la seule image sûre quand tout ne tient pas. */
    justify-content: flex-start;
    /* LA BARRE DE NAVIGATION FLOTTE PAR-DESSUS LA SECTION ÉPINGLÉE (retour
       client du 2026-08-20 : « Trois façons de nous rejoindre passe en partie
       sous la barre », toujours vrai après la réserve par jeton du matin). La
       section est fixée à top: 0, ses premiers pixels sont donc exactement sous
       la barre.
       LA HAUTEUR N'EST PLUS DEVINÉE : assets/js/informations.js MESURE la barre
       réelle (.fp-nav, getBoundingClientRect) au moment de créer l'épinglage et
       à chaque recalcul, garde la plus grande valeur vue, et la pose ici en
       --fp-ip-nav. Plus aucune dépendance à un jeton dont la résolution peut
       différer d'un appareil ou d'une disposition d'en-tête à l'autre. Le jeton
       ne sert plus que de repli avant la première mesure. La marge de confort
       ajoutée par-dessus est exprimée en hauteur d'écran : quelques pixels là
       où la place manque, davantage là où elle abonde. */
    padding-top: calc(var(--fp-ip-nav, var(--fp-nav-h-stuck, 72px)) + 12px);
    padding-top: calc(var(--fp-ip-nav, var(--fp-nav-h-stuck, 72px)) + clamp(10px, 2.2svh, 24px));
    /* LA MARGE BASSE REND LA DIFFÉRENCE ENTRE LES DEUX FENÊTRES : le contenu
       est ainsi confiné dans la partie VISIBLE barre déployée, et la zone
       rendue reste un aplat vert que la barre découvre en se repliant. Les deux
       unités sont statiques : cette marge ne varie jamais en cours de
       défilement. Repli sans unités de fenêtre : une simple marge basse, la
       section revenant alors au comportement d'avant. */
    padding-bottom: 10px;
    padding-bottom: calc(100lvh - 100svh + clamp(8px, 1.4svh, 16px));
    overflow: hidden;
  }
  /* BANDE BLANCHE SOUS LA SECTION (retour client du 2026-08-18, puis
     2026-08-20 : « elle ne se remplit en vert qu'à l'instant où la section
     s'épingle, je la vois blanche pendant toute l'approche »).

     CAUSE, ET ELLE N'EST PAS DANS LA COURSE DU PIN. Pour épingler, ScrollTrigger
     enveloppe la section dans un ESPACEUR qui réserve, en plus de la hauteur de
     la section, toute la distance du défilement horizontal. Cet espaceur n'a
     aucun fond : partout où on le voit, on voit le fond de page nu, blanc.
     On le voit dans deux situations, et c'est la même bande :
       - PENDANT L'APPROCHE, dès que le bas de la section (100svh, c'est à dire
         la fenêtre barre d'outils VISIBLE) remonte au-dessus du bas réel de
         l'écran, ce qui arrive dès que Safari replie sa barre en descendant ;
       - PENDANT L'ÉPINGLAGE, sous la section fixée, pour la même raison.

     CORRECTIF DE PEINTURE, JAMAIS DE GÉOMÉTRIE : on donne son fond à
     l'espaceur. Il couvre EXACTEMENT la place réservée au parcours épinglé, ni
     plus ni moins, donc le remplissage est là dès le premier pixel de
     l'approche et il ne peut, par construction, jamais déborder sur la section
     suivante (contrairement à une ombre portée, essayée le 2026-08-18 et
     abandonnée ici pour cette raison). Aucune hauteur, aucune unité, aucune
     borne du pin ne change, et surtout pas de dvh sur la géométrie : la mise
     en page sauterait à chaque repli de barre.

     LA CLASSE EST POSÉE PAR assets/js/informations.js, qui reconnaît
     l'espaceur au fait que la section a changé de parent à la création du pin :
     aucun nom de classe de GSAP n'est supposé ici. Si l'espaceur n'était pas
     reconnu, la règle ne s'appliquerait à rien et on retomberait simplement sur
     le comportement d'avant, sans rien casser. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-espaceur {
    background: var(--fp-secondary);
  }
  /* Même défaut du modèle flexible qu'au bureau (voir le bloc ci-dessus) : dès
     que la section devient un conteneur flex, les marges latérales « auto » de
     .fp-wrap l'emportent sur l'étirement et la colonne se rétrécit sur son
     contenu. On redonne la largeur aux trois enfants directs. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces > .fp-wrap,
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces > .fp-ip-acces-cadre,
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces > .fp-ip-acces-reperes { width: 100%; }

  /* TÊTE DE SECTION : COMPACTE SUR UN ÉCRAN COURT, AMPLE SUR UN ÉCRAN HAUT.
     Elle reste dans l'épinglage, elle doit donc coûter le moins possible là où
     la place manque ; partout ailleurs, la seconde déclaration de chaque
     propriété la laisse grandir avec la hauteur d'écran (retour client du
     2026-08-18 : « titre plus grand, iconbox et texte un peu plus grands »).
     Aucun texte n'est masqué ni tronqué, à aucune taille. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces .fp-ip-tete {
    gap: 6px;
    gap: clamp(6px, 1.2svh, 12px);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces .fp-ibox { padding: 2px 11px 2px 2px; }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces .fp-ibox-ic {
    width: 20px;
    height: 20px;
    width: clamp(20px, 3.4svh, 26px);
    height: clamp(20px, 3.4svh, 26px);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces .fp-ibox-ic svg {
    width: 12px;
    height: 12px;
    width: clamp(12px, 2svh, 15px);
    height: clamp(12px, 2svh, 15px);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces .fp-ibox-title {
    font-size: .9rem;
    font-size: clamp(.9rem, 2.2svh, 1.05rem);
  }
  /* Le plancher de 1,4 rem est celui du 2026-08-17 et il n'est PAS remonté :
     à 360 px de large, c'est exactement la taille qui garde « Trois façons de
     nous rejoindre » sur une seule ligne. Au-dessus, c'est la hauteur d'écran
     qui commande, et un titre sur deux lignes sur un téléphone récent tient
     très largement dans la marge (voir le budget ci-dessus). */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces .fp-ip-titre-section {
    font-size: clamp(1.4rem, 5.2vw, 1.85rem);
    font-size: clamp(1.4rem, 3.9svh, 2.5rem);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces .fp-ip-lead {
    font-size: .92rem;
    line-height: 1.45;
    font-size: clamp(.95rem, 2.5svh, 1.08rem);
    line-height: 1.5;
  }
  /* PLUS D'AIR ENTRE LA FIN DU TEXTE ET LE DÉBUT DU SLIDER (demande du
     2026-08-18, reprise et accentuée le 2026-08-20 : « le bloc du panneau est
     trop serré contre la tête de section, tire l'ensemble un peu plus bas »),
     et LE CADRE PREND TOUTE LA PLACE QUI RESTE : c'est lui qui absorbe
     l'espace libre de l'écran, la tête de section restant en haut et les
     repères en bas. flex-shrink à 0 : le cadre est en overflow: hidden, il ne
     doit jamais pouvoir être comprimé et rogner un panneau. Il n'y a de toute
     façon aucune pression de compression (la section n'a qu'une hauteur
     MINIMALE), c'est une ceinture de sécurité. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces-cadre {
    margin-top: clamp(8px, 2.6vw, 14px);
    /* RESPIRATION APRÈS L'ACCROCHE (« ...depuis tout le Chablais »), demandée
       une nouvelle fois le 2026-08-20 au soir. Exprimée en hauteur d'écran,
       comme tout ce qui est réglable ici : l'air suit la place disponible au
       lieu d'être le même sur un petit et un grand téléphone. Le coût est
       repris par la photo, seul poste élastique. */
    margin-top: clamp(26px, 5.6svh, 60px);
    overflow: hidden;
    flex: 1 0 auto;
    /* LE CADRE DEVIENT LUI-MÊME UN CONTENEUR FLEXIBLE, et ce n'est pas un
       détail : sans cela la piste garde la hauteur de son contenu au lieu de
       suivre le cadre étiré, les cartes restent collées sous la tête de
       section et tout le bas de l'écran reste vide (mesuré au banc le
       2026-08-20, c'est le défaut que le client décrit). Un enfant flexible
       s'étire, lui, sans avoir besoin que le parent ait une hauteur
       « définie », ce qu'un pourcentage exigeait et n'obtenait pas d'un
       élément dimensionné par flex-grow. */
    display: flex;
  }

  /* LA PISTE PASSE EN LIGNE, comme au bureau. Le débordement à droite est
     exactement ce que le défilement horizontal révèle.

     BORDURE DE DÉPART CALCULÉE COMME .fp-wrap (correctif du 2026-08-17) : le
     jeton --fp-wrap vaut min(1440px, 92vw) sur cette page, la colonne de
     contenu n'occupe donc PAS toute la largeur de la fenêtre et un simple
     padding-inline: var(--fp-gutter) laissait le premier panneau démarrer
     environ 15 px à gauche du titre de section. Même formule qu'au bureau des
     deux côtés : le dernier panneau finit lui aussi aligné sur la colonne.

     align-items: stretch, et non plus « center » : les panneaux d'un slider
     doivent présenter leur pastille et leur titre TOUJOURS À LA MÊME HAUTEUR,
     sinon le contenu monte et descend à chaque geste. Le panneau, lui, répartit
     son surplus entre son texte et sa photo (align-content plus bas).

     LA PISTE S'ÉTIRE DANS LE CADRE (révision du 2026-08-20) : elle est
     désormais elle-même un élément flexible du cadre, donc elle en prend toute
     la hauteur, et les cartes avec elle. C'est ce qui descend la photo jusqu'au
     bas de l'écran au lieu de laisser les cartes serrées sous la tête de
     section avec du vide dessous. En LARGEUR, elle se laisse ramener à la
     largeur du cadre (flex: 1 1 auto plus min-width: 0), son contenu débordant
     comme avant : c'est ce débordement que le défilement horizontal révèle, et
     c'est lui que mesure la course du pin. Pendant la mesure de sectionTient,
     le cadre vaut la hauteur de son contenu, la piste s'y étire donc à
     l'identique : la mesure lit bien la hauteur naturelle.

     ÉCART ENTRE LES CARTES ÉLARGI (retour client du 2026-08-18) : combiné à la
     largeur de carte réduite juste en dessous, il rend visible la respiration
     entre la carte active et la suivante. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces-piste {
    flex-direction: row;
    align-items: stretch;
    flex: 1 1 auto;
    min-width: 0;
    gap: clamp(16px, 5vw, 28px);
    max-width: none;
    margin: 0;
    padding-inline: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter));
    will-change: transform;
  }
  /* PANNEAU EMPILÉ (demande client du 2026-08-17) : pastille, titre, texte,
     puis photo, exactement la structure du repli vertical. Une seule colonne
     de grille suffit à l'obtenir, le markup ne bouge pas (le bloc texte est
     écrit avant la photo dans inc/informations.php).

     LE PANNEAU DEVIENT UNE COLONNE FLEXIBLE (révision du 2026-08-20), texte en
     haut, photo en bas (justify-content: space-between, exactement la lecture
     du repli vertical). C'est le passage en colonne FLEXIBLE qui permet à la
     photo de se dimensionner en POURCENTAGE DE LA HAUTEUR DU PANNEAU (voir sa
     règle plus bas) : en grille, un pourcentage se serait résolu sur la rangée
     et non sur la carte, et les trois photos auraient eu des hauteurs
     différentes selon la longueur de leur texte.
     align-items: stretch est OBLIGATOIRE ici : la règle générale de ce panneau
     (mise en page de bureau) pose align-items: center, ce qui, en colonne
     flexible, centrerait les blocs sur la LARGEUR au lieu de les étirer.

     LARGEUR : LA COLONNE DE CONTENU MOINS LE DÉBORD (--fp-ip-peek, retours des
     2026-08-18 et 2026-08-20). Le premier panneau reste calé au pixel sous le
     titre de section (c'est la bordure de la piste qui le pose, elle ne bouge
     pas), et c'est à DROITE que la place se libère : on voit l'écart, puis une
     cinquantaine de pixels de la carte suivante. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau {
    flex: 0 0 auto;
    width: calc(var(--fp-wrap) - 2 * var(--fp-gutter) - var(--fp-ip-peek));
    /* LE CONTENU S'ARRÊTE AVANT LE BORD DROIT DE LA CARTE (méthode dictée par
       le client, voir --fp-ip-pad-droite plus haut) : la largeur de la carte et
       donc la position de la suivante ne bougent pas d'un pixel, c'est le texte
       et la photo qui rentrent. La largeur reste calculée sur la colonne de
       contenu, la marge interne est prise DEDANS (box-sizing: border-box, posé
       pour tout le site dans main.css). */
    padding-right: var(--fp-ip-pad-droite);
    display: flex;
    flex-direction: column;
    align-items: stretch;
    justify-content: space-between;
    gap: clamp(10px, 2.8vw, 14px);
    gap: clamp(12px, 2.4svh, 22px);
  }
  /* Le bloc de texte ne se comprime jamais : s'il manque de la place, c'est la
     photo qui la rend (voir sa règle plus bas), jamais une ligne de texte qui
     se tasse. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-txt { flex: 0 0 auto; }
  /* ESPACE APRÈS LE DERNIER PANNEAU (retour client du 2026-08-20 : aujourd'hui
     il faut être au pixel près pour lire « À vélo ou à pied », le défilement
     vertical reprend aussitôt).

     C'EST UNE BOÎTE, PAS UNE MARGE, et ce détail décide de tout : la course du
     pin vaut piste.scrollWidth moins la largeur du cadre
     (assets/js/informations.js), et la zone de débordement d'un conteneur
     flexible ne compte NI sa marge interne de fin, NI la marge du dernier
     élément (mesuré au banc sur Chromium le 2026-08-20 : ni l'une ni l'autre
     n'allongeait la course d'un pixel). Un élément flexible vide, lui, occupe
     une vraie place : la course s'allonge de sa largeur PLUS l'écart de la
     piste, l'épinglage dure d'autant plus longtemps, et la dernière carte finit
     à cette distance du bord droit au lieu d'y coller.
     Rien de tout cela ne touche à la HAUTEUR : la garde sectionTient est
     insensible à ce réglage. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces-piste::after {
    content: "";
    flex: 0 0 var(--fp-ip-fin);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau:nth-child(even) .fp-ip-panneau-photo { order: 0; }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-txt {
    gap: 7px;
    gap: clamp(8px, 1.5svh, 13px);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-rang { gap: 10px; }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-ic {
    width: 30px;
    height: 30px;
    width: clamp(30px, 4.4svh, 40px);
    height: clamp(30px, 4.4svh, 40px);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-ic svg {
    width: 16px;
    height: 16px;
    width: clamp(16px, 2.4svh, 21px);
    height: clamp(16px, 2.4svh, 21px);
  }
  /* Titre du panneau : plancher inchangé (écrans courts), et il grandit avec
     la hauteur d'écran (retour client du 2026-08-18 : « le titre du panneau en
     cours plus grand »). Le plafond reste sous celui du titre de SECTION, qui
     doit continuer de dominer la page. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-titre {
    font-size: clamp(1.35rem, 4.8vw, 1.7rem);
    font-size: clamp(1.35rem, 3.6svh, 2.2rem);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-desc {
    font-size: .92rem;
    line-height: 1.45;
    font-size: clamp(.92rem, 2.4svh, 1.04rem);
    line-height: 1.5;
  }
  /* LA PHOTO EST LE SEUL POSTE ÉLASTIQUE (révision du 2026-08-20, qui remplace
     la hauteur fixe de 25svh du 2026-08-18).

     ELLE VAUT UN TIERS DE LA HAUTEUR DE SA CARTE, entre un plancher et un
     plafond exprimés en hauteur d'écran. Un pourcentage de base flexible se
     résout sur la hauteur de la CARTE, et les trois cartes ont exactement la
     même hauteur (align-items: stretch sur la piste) : les trois photos sont
     donc identiques, quelle que soit la longueur du texte au-dessus. C'est
     précisément ce qu'une rangée de grille ne savait pas faire.
     Trois conséquences, et c'est tout l'intérêt :
       - la MESURE de sectionTient (assets/js/informations.js) se fait hors
         étirement, donc sur une carte de hauteur indéfinie : le pourcentage y
         retombe sur le contenu, c'est à dire sur le PLANCHER. Elle lit donc le
         pire cas, jamais la taille affichée, et un écran court garde
         l'épinglage avec une photo réduite au lieu de perdre le slider ;
       - un écran haut donne mécaniquement une photo plus grande, puisque la
         carte y est plus haute : le slider « prend plus de place » sans qu'on
         ait à l'écrire nulle part ;
       - c'est la photo, et jamais le texte, qui rend la place quand un coût
         fixe s'ajoute (hauteur de la barre de navigation réservée en haut, air
         supplémentaire sous la tête de section) : flex-shrink à 1 sur elle,
         à 0 sur le texte, plancher en garde-fou.
     LE CONTENU DE LA PHOTO EST SORTI DU FLUX (position: absolute) : sans cela,
     l'image chargée imposerait sa propre hauteur intrinsèque au moment de la
     mesure, et le budget lu serait celui d'une photo bien plus haute que le
     plancher. La boîte, elle, garde son overflow: hidden et son object-fit.
     Sans l'unité svh, les secondes déclarations sont ignorées et le plancher
     et le plafond en pixels s'appliquent seuls. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-photo {
    aspect-ratio: auto;
    flex: 0 1 34%;
    min-height: 96px;
    min-height: 13svh;
    max-height: 300px;
    max-height: 26svh;
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau-photo img {
    position: absolute;
    inset: 0;
  }
  /* REPÈRES AU RAS DU BAS RÉEL DE L'ÉCRAN (retour client du 2026-08-20 :
     « pratiquement au fond de l'écran, barre Safari déployée ou repliée »).

     Ils restent dans le flux (leur place est réservée, la mesure de
     sectionTient les compte, rien ne saute à l'épinglage) et c'est un simple
     décalage de position relative qui les fait suivre le bas RÉEL : la section
     réserve 100svh, c'est à dire la fenêtre barre d'outils VISIBLE, alors que
     le bas réel de l'écran est à 100dvh. La différence vaut zéro barre
     déployée, et la hauteur de la barre une fois repliée : les repères
     descendent donc exactement de ce qu'il faut, en continu.

     dvh N'EST EMPLOYÉE QUE POUR CES COMMANDES DE BAS D'ÉCRAN (les repères et
     les deux flèches), et c'est voulu : elle ne pilote ici aucune GÉOMÉTRIE
     (un décalage de position relative ne remet en page ni le voisin ni le
     parent, il ne fait que repeindre), donc la mise en page ne peut pas sauter
     au repli de la barre, et aucune remesure de ScrollTrigger n'est déclenchée.
     Le décalage reste DANS la boîte de la section, qui couvre désormais la
     grande hauteur de fenêtre : rien ne dépasse, l'overflow reste coupé.
     Sans les unités svh/dvh, la déclaration est invalide et les repères
     restent simplement au bas du contenu, comme avant. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces-reperes {
    display: flex;
    justify-content: center;
    margin-top: clamp(8px, 2.2vw, 12px);
    margin-top: clamp(10px, 1.8svh, 16px);
    padding-inline: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter));
    position: relative;
    top: 0;
    top: calc(100dvh - 100svh);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces-repere { width: 28px; }

  /* LES DEUX FLÈCHES DE PILOTAGE (retour de l'utilisatrice du 2026-08-20 : le
     défilement latéral commandé par le défilement vertical « ne paraissait pas
     logique »). Elles n'apparaissent QU'ICI, sous les deux classes de
     l'épinglage mobile : ailleurs, elles piloteraient un défilement qui n'a pas
     lieu (voir leur règle de masquage par défaut, plus haut dans cette
     feuille).

     PLACÉES SUR LA MÊME LIGNE QUE LES REPÈRES, aux deux bords de la colonne de
     contenu : jamais par-dessus le texte d'un panneau, et au pouce sans que la
     main couvre la carte. Elles suivent le bas RÉEL de l'écran par la même
     mécanique que les repères, écrite ici depuis le bas : le bord bas de la
     fenêtre est à 100dvh, la boîte descend jusqu'à 100lvh, la différence est
     donc exactement ce qu'il faut remonter. Les deux commandes restent ainsi
     alignées quel que soit l'état de la barre du navigateur.

     CIBLE TACTILE DE 44 px (WCAG 2.5.5) portée par la boîte elle-même. Contraste
     du pictogramme blanc sur le voile clair posé sur le vert de section : le
     voile est le même jeton que les pastilles de la page (--fp-ip-voile), déjà
     employé sur ce fond. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    position: absolute;
    z-index: 2;
    bottom: 10px;
    bottom: calc(100lvh - 100dvh + 10px);
    width: 44px;
    height: 44px;
    padding: 0;
    border-radius: 50%;
    border: 1px solid var(--fp-ip-filet);
    background: var(--fp-ip-voile);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    color: var(--fp-white);
    cursor: pointer;
    transition: background-color .25s ease, border-color .25s ease, opacity .25s ease;
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche svg {
    width: 20px;
    height: 20px;
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche--prec {
    left: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter));
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche--suiv {
    right: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter));
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche:hover {
    background: var(--fp-ip-filet);
    border-color: var(--fp-accent);
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche:focus-visible {
    outline: 2px solid var(--fp-white);
    outline-offset: 3px;
  }
  /* Extrémité atteinte : la flèche reste en place, atteignable au clavier et
     annoncée comme désactivée (aria-disabled, posé par
     assets/js/informations.js), simplement estompée. Elle ne DISPARAÎT pas :
     une commande qui s'efface à chaque bout fait sauter la mise en page et sort
     du parcours de tabulation. */
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche[aria-disabled="true"] {
    opacity: .38;
    cursor: default;
  }
}
/* Sous 720 px, la colonne de contenu passe à la gouttière mobile : les flèches
   suivent, comme la piste et les repères. */
@media (max-width: 720px) {
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche--prec {
    left: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter-mobile));
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-fleche--suiv {
    right: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter-mobile));
  }
}
/* Sous 720 px, .fp-wrap passe à --fp-gutter-mobile (main.css) : la piste, les
   repères ET la largeur d'un panneau suivent, sans quoi le premier panneau ne
   serait plus aligné sur le titre de section. Le débord --fp-ip-peek est
   retranché ici aussi : c'est la même carte, seule la gouttière change. */
@media (max-width: 720px) {
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces-piste,
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-acces-reperes {
    padding-inline: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter-mobile));
  }
  html.fp-ip-anim.fp-ip-pin-mobile .fp-ip-panneau {
    width: calc(var(--fp-wrap) - 2 * var(--fp-gutter-mobile) - var(--fp-ip-peek));
  }
}

/* --------------------------------------------------------------------------
   3. HORAIRES (.fp-ip-horaires) - zone fp-blk-horaires, renderer remplacé sur
   cette page (fp_render_informations_horaires, inc/informations.php).

   REFONTE DU 2026-08-24. La carte propre à cette page (deux positions
   « Horaires standards » et « Vacances et jours fériés », lignes à filet animé)
   a été remplacée par LE MODULE D'HORAIRES PARTAGÉ, celui de l'accueil :
   retour client, « vraiment le même ». Tout son habillage vit donc dans le bloc
   de composant « MODULE D'HORAIRES PARTAGÉ » de main.css (scope
   .fp-horaires-module) et cette feuille ne garde que la POSE, ci-dessous.

   RÈGLES DEVENUES ORPHELINES, ET LEUR SORT (leur markup n'existe plus) :
    - .fp-ip-horaires-carte et ses enfants directs : retirées. Leur seule
      intention encore valable, l'élévation de la carte (« tu vas garder cet
      effet avec un peu d'ombre sur la zone avec les horaires », client du
      2026-08-12), est reprise ci-dessous sur la carte du module.
    - .fp-ip-tabs et .fp-ip-tab* (bascule à deux positions, recette du widget
      d'activité) : retirées. La barre du module est celle du composant, sur les
      deux pages : lui refaire un habillage ici recréerait exactement l'écart
      que le client vient de faire supprimer.
    - .fp-ip-h-liste, .fp-ip-h-ligne et ses variantes, .fp-ip-h-filet,
      .fp-ip-h-vide, .fp-ip-h-note : retirées avec les lignes qu'elles
      habillaient. Le filet animé au défilement disparaît avec elles ; son
      pilote (assets/js/informations.js) garde sa garde « carte et filets
      présents » et ne fait donc simplement plus rien de ce côté.
    - Bloc mobile de la carte (720 px) : retiré, point par point.
      1. « la bascule prend la ligne, la pastille passe dessous et se centre » :
         sans objet, le composant empile déjà barre puis carte, et sa pastille
         est centrée à toutes les largeurs.
      2. « la pastille dit Fermé, pas Fermé actuellement » : cette bascule de
         libellé vit dans le bloc RESPONSIVE en fin de feuille et concerne la
         TUILE de la mosaïque du haut de page, qui rend bien les deux libellés
         courts (fp_informations_statut_pastille). Elle y a été restreinte à la
         tuile : la pastille du module, elle, n'a pas de libellé court, et la
         règle non restreinte lui aurait vidé son texte sous 720 px.
      3. « une puce verte remplace le mot Aujourd'hui » : NON reportée. Elle
         corrigeait un défaut propre à l'ancienne ligne (le mot poussait les
         jours à deux plages sur deux lignes) ; le composant résout la même
         gêne autrement, en passant jour et heures sur deux lignes sous 480 px.
         La reporter ferait diverger les deux pages pour rien.
      4. « les heures perdent leur gras » : sans objet, le composant les rend
         déjà en graisse 500 face à un jour en 700.

   CONTRASTES : blanc sur --fp-primary 4,85:1, --fp-cream sur --fp-primary
   4,78:1, encre du thème sur la carte claire du composant 16,9:1.
   -------------------------------------------------------------------------- */
.fp-ip-horaires {
  position: relative;
  isolation: isolate;
  background: var(--fp-primary);
  color: var(--fp-white);
  padding: var(--fp-ip-y) 0;
  overflow: hidden;
  /* Cible d'ancre (id="horaires", visée entre autres par le lien « Offres du
     moment » et la tuile « En ce moment » de la mosaïque) : même garde que
     les autres sections de la page. */
  scroll-margin-top: calc(var(--fp-nav-h) + 16px);
}
.fp-ip-horaires .fp-ip-lead { color: var(--fp-cream); }
/* MOTIF ANIMÉ EN FOND (demande de Marino, 09.09.2026) : le plan du parc
   (assets/img/em-plan.svg), MÊME RECETTE que .fp-footer::before (main.css,
   2026-09-06/07) : pseudo-élément couvrant en inset négatif (le zoom fixe et
   le va-et-vient ne doivent jamais découvrir un bord, la section est déjà en
   overflow: hidden ci-dessus), transform SEUL (jamais background-position,
   coûteux en repaint), tourne AUSSI sur mobile (aucune media-query de
   largeur), coupé sous prefers-reduced-motion. Opacité basse et calque posé
   en z-index 0, sous le contenu (.fp-ip-horaires > .fp-wrap passe en
   z-index 1 plus bas) : le tableau des horaires reste pleinement lisible. */
.fp-ip-horaires-motif {
  position: absolute;
  inset: -14%;
  z-index: 0;
  background: url('../img/em-plan.svg') center center / cover no-repeat;
  opacity: .16;
  pointer-events: none;
  transform: scale(1.12);
}
@media (prefers-reduced-motion: no-preference) {
  .fp-ip-horaires-motif {
    animation: fp-ip-horaires-motif-derive 26s ease-in-out infinite alternate;
    will-change: transform;
  }
}
@keyframes fp-ip-horaires-motif-derive {
  from { transform: scale(1.12) translateX(-3%); }
  to   { transform: scale(1.12) translateX(3%); }
}
@media (prefers-reduced-motion: reduce) {
  .fp-ip-horaires-motif { animation: none; will-change: auto; }
}
.fp-ip-horaires > .fp-wrap { position: relative; z-index: 1; }

/* MISE EN PAGE RECALÉE SUR L'ACCUEIL (retour de Marino, 2026-09-07, sur le
   site en ligne : « j'aime tout sauf la mise en page de cette section »).
   .fp-ip-horaires-grille reprend EXACTEMENT les proportions de
   .fp-horaires-grid / .fp-horaires-aside / .fp-horaires-main de l'accueil
   (home.css : flex 0 0 37% / 1 1 56%, même gap), SEUL align-items change :
   centré sur la hauteur du bloc tête + module plutôt qu'en fin de ligne,
   l'horloge n'ayant pas besoin de déborder comme la mascotte de l'accueil.
   Cette grille ne rend que si le module a quelque chose à montrer
   (fp_render_informations_horaires, inc/informations.php) ; sans module, la
   page retombe sur l'ancienne mise en page à une seule colonne, tête centrée
   sur toute la section (voir .fp-ip-horaires-repli plus bas), INCHANGÉE. */
.fp-ip-horaires-grille {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(24px, 4vw, 40px);
  /* PAS de margin-top ici (retiré le 09.09.2026, retour de Marino : « trop
     d'espace en haut »). La grille est le premier enfant de .fp-wrap, donc de
     la section : le padding-top DE LA SECTION (var(--fp-ip-y), symétrique à
     son padding-bottom) suffit déjà à réserver l'espace au-dessus de la tête.
     Un margin-top ici s'AJOUTAIT à ce padding et déséquilibrait la section,
     contrairement à .fp-horaires-grid de l'accueil (home.css), qui n'en pose
     aucun. */
}
/* ORDRE DE L'ACCUEIL REPRODUIT SOUS 1024PX : dans le DOM, l'horloge précède
   la colonne tête + module (comme .fp-horaires-aside précède .fp-horaires-main
   à l'accueil), mais visuellement le CONTENU vient D'ABORD, l'horloge APRÈS,
   réduite et centrée (même bascule par `order`, home.css, .fp-horaires-main
   order:0 / .fp-horaires-aside order:1 sous 900px). Sélecteurs PRÉFIXÉS par
   .fp-ip-horaires-grille (relecture Opus, 2026-09-07) : .fp-ip-horaires-main
   et .fp-horloge-inverse sont des noms assez génériques pour mériter d'être
   scopés à leur grille, même si aucune collision n'existe à ce jour ailleurs
   sur le site. */
.fp-ip-horaires-grille .fp-ip-horaires-main { order: 0; width: 100%; }
.fp-ip-horaires-grille .fp-horloge-inverse { order: 1; width: min(220px, 56vw); margin: 0 auto; }
/* Tête de section : redevient un enfant de la colonne du module (plus de la
   section entière), elle se centre donc sur CETTE colonne (max-width 720px,
   margin auto déjà posés par .fp-ip-tete/.fp-ip-tete--centre, inchangés).
   Le module garde le même espace au-dessus qu'avant (ancien margin-top de
   .fp-ip-horaires-corps, reporté ici). */
.fp-ip-horaires-main .fp-horaires-module--informations {
  margin-top: clamp(26px, 3vw, 44px);
}
@media (min-width: 1024px) {
  .fp-ip-horaires-grille {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: clamp(16px, 3vw, 32px);
  }
  /* Colonne de l'horloge NETTEMENT PLUS GRANDE, alignée sur la proportion de
     la colonne mascotte de l'accueil (37%, home.css .fp-horaires-aside) :
     l'horloge, width: 100% en interne (horloge.css), remplit toute cette
     colonne. */
  /* Plus petite (37 % -> 31 %) et descendue (marge haute) pour se trouver en
     face du tableau plutôt que du titre (Marino, 2026-09-07, deux retours). */
  .fp-ip-horaires-grille .fp-horloge-inverse {
    order: 0;
    flex: 0 0 31%;
    max-width: 31%;
    width: auto;
    margin: clamp(140px, 15vw, 260px) 0 0;
  }
  /* Colonne tête + module, même proportion que .fp-horaires-main de
     l'accueil (56%) : largeur en POURCENTAGE du flex-basis, donc DÉTERMINISTE,
     jamais calculée sur le contenu de la carte (une carte avec ou sans
     p.fp-horaires-note donne la même largeur à une taille d'écran donnée). */
  .fp-ip-horaires-grille .fp-ip-horaires-main {
    order: 1;
    flex: 1 1 56%;
    min-width: 0;
    width: auto;
  }
}
/* POSE DU MODULE SUR CETTE PAGE : il remplit toute la largeur de sa colonne
   (déterminée par .fp-ip-horaires-main ci-dessus), le composant fait le
   reste. */
.fp-horaires-module--informations {
  position: relative;
  z-index: 1;
  width: 100%;
}
/* ÉLÉVATION CONSERVÉE, demande explicite du client (2026-08-12) : « tu vas
   garder cet effet avec un peu d'ombre sur la zone avec les horaires, comme ça
   ça reste un petit peu surélevé du reste ». La carte du composant porte une
   ombre discrète, calibrée pour un fond blanc ; sur cet aplat teal, on reprend
   l'ombre portée du thème, plus marquée, sans rien changer d'autre. */
.fp-horaires-module--informations .fp-horaires-card {
  box-shadow: var(--fp-shadow-lg);
}
/* Repli sans module : mise en page historique à une seule colonne, tête déjà
   centrée sur toute la section par fp_informations_tete() (INCHANGÉE), cette
   règle ne fait que reporter l'espace qui vivait avant sur
   .fp-ip-horaires-corps. */
.fp-ip-horaires-repli { color: var(--fp-ink); margin-top: clamp(26px, 3vw, 44px); }

/* GROUPES DE VACANCES PAR CAMPAGNE (Marino, 2026-09-10 : « affiche aussi le
   nom, avec un slider en 2 par 2 pour une période prolongée »). Même bloc que
   home.css (dupliqué à dessein) : main.css, qui porte normalement tout
   l'habillage du module d'horaires partagé, est hors périmètre de ce
   chantier, un autre agent y travaille. Annule la ligne générique
   .fp-horaires-prochain-liste li (main.css, display: flex, pensée pour une
   simple ligne jour + heures) pour l'enveloppe de groupe, qui empile à la
   place en-tête, dates et navigation. Spécificité volontairement large (3
   classes + 1 élément) pour battre à coup sûr cette règle du composant, peu
   importe l'ordre de chargement des feuilles. */
.page-template-template-informations .fp-horaires-prochain-liste li.fp-horaires-prochain-groupe {
  display: block;
  padding: 4px 0;
}
/* NOËL S'AFFICHAIT MALGRÉ LE PLAFOND (Marino, 10.09.2026). La règle juste
   au-dessus pose display: block avec trois classes et un élément : elle
   battait l'attribut hidden que traiterFuturs() pose sur les groupes
   au-delà du plafond, et le troisième groupe restait visible. Même poids,
   déclaré après, l'attribut reprend la main. */
.page-template-template-informations .fp-horaires-prochain-liste li.fp-horaires-prochain-groupe[hidden] {
  display: none;
}
/* UNE SEULE PÉRIODE À VENIR : pas de deuxième colonne vide à côté. Le script
   écrit le nombre de groupes gardés dans data-fp-visibles ; à un, la grille
   repasse en une colonne et le groupe se centre. */
.page-template-template-informations .fp-horaires-prochain-liste[data-fp-visibles="1"] {
  grid-template-columns: minmax(0, 1fr);
}
/* DEUX GROUPES CÔTE À CÔTE (Marino, 10.09.2026 : « affiche deux l'un à côté
   de l'autre et affiche max 2 »). La liste devient une grille à deux colonnes
   dès qu'il y a la place : le Lundi du Jeûne fédéral à gauche, les Vacances
   d'automne et leur défilement à droite, Noël attendra son tour (le plafond de
   deux périodes est posé côté PHP par fp_horaires_futurs_attrs( 2 ) et
   appliqué par traiterFuturs()). Le séparateur passe d'un filet horizontal
   entre lignes à un filet vertical entre colonnes. Sous 640 px, on retombe sur
   l'empilement et le filet horizontal, il n'y a pas la place pour deux. */
.page-template-template-informations .fp-horaires-prochain-liste {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 10px 0;
}
/* Un display explicite battrait l'attribut hidden que traiterFuturs() pose
   sur la liste quand plus rien ne vient : on le remet a plat. */
.page-template-template-informations .fp-horaires-prochain-liste[hidden] { display: none; }
.page-template-template-informations .fp-horaires-prochain-groupe:not([hidden]) ~ .fp-horaires-prochain-groupe:not([hidden]) {
  padding-top: 10px;
  border-top: 1px solid color-mix(in srgb, var(--fp-ink) 16%, transparent);
}
@media (min-width: 640px) {
  .page-template-template-informations .fp-horaires-prochain-liste {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0 18px;
    align-items: start;
  }
  .page-template-template-informations .fp-horaires-prochain-groupe:not([hidden]) ~ .fp-horaires-prochain-groupe:not([hidden]) {
    padding-top: 0;
    padding-left: 18px;
    border-top: 0;
    border-left: 1px solid color-mix(in srgb, var(--fp-ink) 16%, transparent);
  }
}
/* JOURS EN GRAISSE NORMALE ET TÊTE RESSERRÉE (Marino, 10.09.2026 : « que les
   jours ne soient plus en gras si le titre l'est, et moins d'espace entre un
   titre et ses jours liés »). Le nom de la campagne porte déjà le gras : deux
   niveaux en gras se disputaient l'oeil. Les dates redescendent à la graisse
   courante, et l'air entre la tête du groupe et sa première date se réduit. */
.page-template-template-informations .fp-horaires-prochain-groupe-tete {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: center;
  gap: 3px 8px;
  margin: 0 0 1px;
}
.page-template-template-informations .fp-horaires-prochain-groupe .fp-horaires-prochain-jour {
  font-weight: 400;
}
.page-template-template-informations .fp-horaires-prochain-groupe-nom {
  font-weight: 700;
  color: var(--fp-ink);
}
.page-template-template-informations .fp-horaires-prochain-groupe-periode {
  opacity: .8;
}
.page-template-template-informations .fp-horaires-prochain-groupe-dates {
  list-style: none;
  margin: 0;
  padding: 0;
}
.page-template-template-informations .fp-horaires-prochain-groupe-dates li {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 4px 10px;
  padding: 1px 0;
}
.page-template-template-informations .fp-horaires-prochain-groupe-dates li[hidden] { display: none; }
/* Navigation deux par deux : masquée par défaut (posée hidden côté PHP),
   révélée par traiterFuturs() (assets/js/main.js) seulement si le groupe a
   plus de deux dates à venir. De vrais <button>, une petite région aria-live
   pour l'état (« Page 1 sur 3 ») : voir le contrat data-fp-groupe-* partagé
   avec home.css, activite.css et restauration.css. */
.page-template-template-informations .fp-horaires-prochain-groupe-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  margin-top: 4px;
}
.page-template-template-informations .fp-horaires-prochain-groupe-nav[hidden] { display: none; }
.page-template-template-informations .fp-horaires-prochain-groupe-arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--fp-ink) 32%, transparent);
  background: transparent;
  color: var(--fp-ink);
  font-size: .85rem;
  line-height: 1;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}
.page-template-template-informations .fp-horaires-prochain-groupe-arrow:hover:not(:disabled) {
  background: color-mix(in srgb, var(--fp-primary) 14%, transparent);
  color: var(--fp-primary);
}
.page-template-template-informations .fp-horaires-prochain-groupe-arrow:disabled {
  opacity: .35;
  cursor: default;
}
/* CIBLE TACTILE (passe tablette du 2026-09-10), même traitement que sur
   l'accueil : la flèche de 22 px de côté est petite dans les DEUX dimensions,
   donc difficile à viser au doigt. Au pointeur grossier, un pseudo-élément
   transparent porte la zone à 40 px sans rien changer au dessin ni à la mise
   en page. Au pointeur fin, rien ne change. */
@media (pointer: coarse) {
  .page-template-template-informations .fp-horaires-prochain-groupe-arrow { position: relative; }
  .page-template-template-informations .fp-horaires-prochain-groupe-arrow::after {
    content: '';
    position: absolute;
    inset: -9px;
  }
}
.page-template-template-informations .fp-horaires-prochain-groupe-statut {
  min-width: 3.5em;
  font-size: .7rem;
  font-variant-numeric: tabular-nums;
}
/* Pas de défilement animé : la pagination bascule par [hidden], un
   changement instantané à toutes les préférences de mouvement. Seule la
   micro-transition de survol des flèches est coupée ici. */
@media (prefers-reduced-motion: reduce) {
  .page-template-template-informations .fp-horaires-prochain-groupe-arrow { transition: none; }
}


/* --------------------------------------------------------------------------
   4. QUESTIONS FRÉQUENTES - composant FAQ PARTAGÉ (fp_render_faq_markup,
   inc/template-tags.php), rendu à l'identique sur toutes les pages du site :
   il est déjà en deux colonnes avec colonne de gauche collante, exactement ce
   que demande la maquette.

   ON NE REDÉFINIT DONC RIEN DE SON APPARENCE. Deux ajustements seulement,
   scopés sur le MODÈLE, donc sans effet ailleurs : la texture de section, et
   la NUMÉROTATION des questions (01, 02, 03...) que la maquette affiche. Le
   numéro est produit par un compteur CSS : aucun markup en plus, et il reste
   juste si la cliente ajoute ou retire une question.
   -------------------------------------------------------------------------- */
.page-template-template-informations .fp-faq2 {
  position: relative;
  isolation: isolate;
}
.page-template-template-informations .fp-faq2::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: var(--fp-ip-motif);
  background-repeat: no-repeat;
  background-position: center center;
  background-size: 1100px auto;
  mix-blend-mode: multiply;
  opacity: .1;
}
.page-template-template-informations .fp-faq2-list { counter-reset: fp-ip-faq; }
.page-template-template-informations .fp-faq2-q::before {
  counter-increment: fp-ip-faq;
  content: counter(fp-ip-faq, decimal-leading-zero);
  flex: 0 0 auto;
  font-family: var(--fp-font-heading);
  font-size: 1rem;
  letter-spacing: .1em;
  color: var(--fp-ink-soft);
}

/* --------------------------------------------------------------------------
   5. NOUS CONTACTER (.fp-ip-contact) - zone fp-blk-contact, renderer remplacé
   sur cette page (fp_render_informations_contact, inc/informations.php).

   Tête centrée, formulaire natif en carte blanche à gauche, plan et téléphone
   en colonne à droite. La section garde la classe .fp-contact : tout
   l'habillage des champs, écrit plus bas dans cette feuille, est scopé dessus
   et continue de s'appliquer sans une seule règle recopiée.
   -------------------------------------------------------------------------- */
.fp-ip-contact {
  position: relative;
  isolation: isolate;
  background: var(--fp-cream);
  padding: var(--fp-ip-y) 0;
  overflow: hidden;
  /* Cible d'ancre (id="contact", visée par le lien « Offres du moment » du
     site entier) : sans cette réserve, un atterrissage natif sur la section
     la plaçait sous la barre de navigation flottante. Voir aussi le
     diagnostic complet dans le rapport de ce lot : la cause principale du
     mauvais atterrissage est ailleurs (assets/js/informations.js, hors
     périmètre de ce fichier), cette règle corrige un défaut réel mais
     distinct. */
  scroll-margin-top: calc(var(--fp-nav-h) + 16px);
}
.fp-ip-contact .fp-ip-lead { color: var(--fp-ink-soft); }
/* ÉTIREMENT STRUCTUREL DES DEUX COLONNES (retour client, 2026-08-12,
   troisième passage : « il faut que la colonne avec le formulaire fasse la
   même hauteur que la colonne avec la map et le téléphone »).
   `align-items: stretch` (au lieu de `start`) donne aux DEUX colonnes la
   hauteur de la ligne de grille, donc celle de la plus haute des deux (le
   formulaire, en général). La colonne de droite (.fp-ip-contact-cote) reçoit
   ainsi une hauteur DÉFINIE, que son flex column répartit entre ses enfants :
   le plan (flex: 1 1 auto plus bas) absorbe tout l'écart, les tuiles
   téléphone et courriel gardent leur taille naturelle. AUCUNE hauteur n'est
   fixée en dur : si le formulaire prend une ligne de plus (message d'erreur,
   champ supplémentaire...), les deux colonnes grandissent ensemble. */
.fp-ip-contact-grille {
  display: grid;
  grid-template-columns: minmax(0, 1.12fr) minmax(300px, .88fr);
  gap: clamp(16px, 1.8vw, 26px);
  align-items: stretch;
  margin-top: clamp(28px, 3.2vw, 46px);
}
.fp-ip-carte {
  background: var(--fp-paper);
  border-radius: var(--fp-ip-radius);
  padding: clamp(22px, 2.6vw, 36px);
  box-shadow: var(--fp-shadow);
}
.fp-ip-contact-cote {
  display: flex;
  flex-direction: column;
  gap: clamp(16px, 1.8vw, 26px);
}
/* LA CARTE S'INTÈGRE DERRIÈRE, LE TEXTE EN GLASSMORPHISME PAR-DESSUS (retour
   client, 2026-08-12, second passage : « le texte avec Magic Parc... devrait
   être sur un fond glassmorphisme, je vais mettre la carte, la carte devra
   s'intégrer derrière et on aura cet élément en glassmorphisme par-dessus »).
   .fp-ip-plan porte donc le rapport largeur/hauteur (repris de l'ancienne
   carte 4/3) et devient le repère de position ; .fp-ip-plan-carte (carte
   intégrée ou filigrane de repli) le remplit en fond ; .fp-ip-plan-txt flotte
   en bande de verre au bord bas, lisible même sans carte (repli clair, voir
   plus bas).
   Recette de verre : MÊME LANGAGE que le tunnel anniversaire
   (plugins/fp-anniversaire/assets/fp-anniversaire.css, --fpa-verre), portée en
   tokens --fp-* et un peu PLUS OPAQUE : le fond ici est une carte
   (imagerie arbitraire, pas une scène de confettis dessinée par le thème), la
   marge de sécurité doit donc être plus large.
   CONTRASTE MESURÉ AU PIRE CAS (carte totalement NOIRE sous le verre à 82 %
   d'opacité, la couleur du verre se dilue alors à environ rgb(195,201,200)) :
   le nom du parc (--fp-secondary) y tient 5,6:1, largement suffisant ; c'est
   pour cette même raison que l'adresse passe de --fp-ink-soft (3,9:1 dans ce
   pire cas, insuffisant) à --fp-ink (9,7:1). */
.fp-ip-plan {
  position: relative;
  /* aspect-ratio sert de taille DE DÉPART (utile en une colonne, où la
     colonne n'a pas de hauteur imposée par l'autre) ; flex-grow tire ensuite
     le plan plus haut dès que la colonne dispose d'espace en plus (deux
     colonnes de même hauteur, ci-dessus) : « l'élément avec la map, on va le
     tirer passablement plus ». Rien n'est fixé en dur : sans espace
     supplémentaire (mobile), le plan retombe simplement sur son 4/3 d'origine. */
  aspect-ratio: 4 / 3;
  flex: 1 1 auto;
  border-radius: var(--fp-ip-radius);
  overflow: hidden;
  box-shadow: var(--fp-shadow);
  /* Cible de repli (id="plan") de la tuile itinéraire quand aucune URL de
     plan n'est réglée dans le Customizer : même garde que les sections. */
  scroll-margin-top: calc(var(--fp-nav-h) + 16px);
  --fp-ip-verre: color-mix(in srgb, color-mix(in srgb, var(--fp-primary) 8%, var(--fp-paper)) 82%, transparent);
  --fp-ip-verre-opaque: color-mix(in srgb, var(--fp-primary) 6%, var(--fp-paper));
  --fp-ip-verre-bord: color-mix(in srgb, var(--fp-primary) 24%, transparent);
}
.fp-ip-plan-carte {
  position: absolute;
  inset: 0;
  background: color-mix(in srgb, var(--fp-accent) 22%, var(--fp-cream));
}
.fp-ip-plan-carte iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
}
/* Sans carte intégrée (par défaut, AUCUN service tiers n'est appelé sur cette
   page), le cadre reste un vrai bloc : filigrane de plan dessiné en CSS. */
.fp-ip-plan.is-sans-carte .fp-ip-plan-carte {
  background-image:
    repeating-linear-gradient(90deg, color-mix(in srgb, var(--fp-primary) 8%, transparent) 0 1px, transparent 1px 34px),
    repeating-linear-gradient(0deg, color-mix(in srgb, var(--fp-primary) 8%, transparent) 0 1px, transparent 1px 34px);
}
.fp-ip-plan-txt {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 16px;
  padding: clamp(18px, 2vw, 24px);
  background: var(--fp-ip-verre);
  border-top: 1px solid var(--fp-ip-verre-bord);
  -webkit-backdrop-filter: blur(14px) saturate(1.3);
  backdrop-filter: blur(14px) saturate(1.3);
}
/* Repli sans flou possible : le voile deviendrait un simple film de couleur
   sur une carte nette, illisible. Fond opaque à la place (même teinte). */
@supports not ( ( backdrop-filter: blur(1px) ) or ( -webkit-backdrop-filter: blur(1px) ) ) {
  .fp-ip-plan-txt { background: var(--fp-ip-verre-opaque); }
}
.fp-ip-plan-titre {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: .03em;
  font-size: 1.35rem;
  line-height: 1;
  margin: 0 0 6px;
  color: var(--fp-secondary);
}
.fp-ip-plan-adresse {
  font-style: normal;
  margin: 0;
  line-height: 1.55;
  color: var(--fp-ink);
}
/* Tuile courriel : DUPLIQUÉE de la tuile téléphone (retour client,
   2026-08-12, troisième passage), même recette au trait près. Toutes deux en
   flex: 0 0 auto dans la colonne (.fp-ip-contact-cote) : elles gardent leur
   taille naturelle, c'est le plan au-dessus qui grandit pour égaliser les
   colonnes (voir .fp-ip-plan). */
.fp-ip-contact-tel,
.fp-ip-contact-mail {
  flex: 0 0 auto;
  flex-direction: row;
  align-items: center;
  gap: 16px;
  background: var(--fp-primary);
  color: var(--fp-white);
  border-color: var(--fp-primary);
  padding: clamp(16px, 1.8vw, 24px) clamp(20px, 2vw, 30px);
}
.fp-ip-contact-tel .fp-ip-tuile-label,
.fp-ip-contact-mail .fp-ip-tuile-label { color: var(--fp-white); }
.fp-ip-contact-tel .fp-ip-tuile-corps,
.fp-ip-contact-mail .fp-ip-tuile-corps { flex: 1 1 auto; }
.fp-ip-contact-tel .fp-ip-tuile-fleche,
.fp-ip-contact-mail .fp-ip-tuile-fleche {
  position: static;
  color: var(--fp-white);
}
a.fp-ip-contact-tel:hover,
a.fp-ip-contact-mail:hover {
  background: var(--fp-secondary);
  border-color: var(--fp-secondary);
}

/* --------------------------------------------------------------------------
   6. ESPACE PRESSE (.fp-ip-medias) - zone fp-blk-informations-medias.
   Dernier bloc de la page, comme dans la maquette : le pied de page du site
   suit immédiatement.

   TOUT CENTRÉ, SANS TOPO (retour client, 2026-08-12, troisième passage :
   « tu peux juste tout centrer... et enlever le topo en fond de la section
   espace presse »). La grille texte/photo à deux colonnes devient une
   colonne UNIQUE, centrée : titre, texte, pastilles et bouton centrés
   (texte compris), puis la photo, elle aussi centrée et plafonnée en largeur
   pour ne pas s'étirer d'un bord à l'autre. Le motif topo
   (fp_informations_topo) n'est plus appelé pour cette section dans
   inc/informations.php : plus de calque à masquer ici.
   -------------------------------------------------------------------------- */
.fp-ip-medias {
  position: relative;
  isolation: isolate;
  background: var(--fp-dark);
  color: var(--fp-white);
  padding: var(--fp-ip-y) 0 clamp(44px, 5vw, 76px);
  overflow: hidden;
  /* Cible d'ancre (id="medias") : même garde que les autres sections. */
  scroll-margin-top: calc(var(--fp-nav-h) + 16px);
}
.fp-ip-medias .fp-ip-lead { color: var(--fp-ip-clair); }
.fp-ip-medias-grille {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: clamp(28px, 4vw, 60px);
}
.fp-ip-medias-txt {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(14px, 1.6vw, 20px);
  max-width: 640px;
}
.fp-ip-medias-titre {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0;
  line-height: .9;
  font-size: clamp(2.4rem, 5.4vw, 4.8rem);
  margin: 0;
}
.fp-ip-medias-pills {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 10px;
  margin: 0;
  padding: 0;
}
.fp-ip-medias-pills li {
  background: var(--fp-ip-voile);
  border: 1px solid var(--fp-ip-filet);
  border-radius: var(--fp-pill);
  padding: 10px 20px;
  font-size: .95rem;
}
.fp-ip-medias-photo {
  width: min(100%, 640px);
  margin: 0 auto;
  border-radius: var(--fp-ip-radius);
  overflow: hidden;
  aspect-ratio: 4 / 3;
}
.fp-ip-medias-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* PHOTO DE FOND FACULTATIVE, DISTINCTE DE LA PHOTO DE DROITE (demande de
   Marino, 2026-09-07, deux images séparées) : la classe has-fond et la
   variable --fp-ip-medias-fond ne sont posées par fp_render_informations_medias()
   que si une vraie photo est déposée sur l'emplacement fp-zone-fond (voir
   inc/informations.php). Deux couches, dans l'ordre où l'oeil doit les lire
   de bas en haut : la photo (::before, plein cadre, recadrée en couverture,
   centrée), puis un voile vert très foncé (::after) qui l'assombrit pour
   garder le blanc du texte lisible, quelle que soit la photo déposée par la
   cliente. CONTRASTE CALCULÉ SUR LE COMPOSITE RÉEL, pas sur --fp-dark seul :
   au pire cas (photo entièrement blanche), le voile à 72% d'opacité laisse
   passer 28% de blanc, la couleur effectivement peinte est donc un mélange
   des deux (~rgb(71,105,101)), pas --fp-dark pur. Texte blanc sur ce
   composite : 6,0:1, toujours au-dessus du seuil AA 4,5:1. Le fond uni
   existant (var(--fp-dark) sur .fp-ip-medias) reste en repli sous la photo
   tant qu'elle n'a pas fini de charger. */
.fp-ip-medias.has-fond::before,
.fp-ip-medias.has-fond::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
}
.fp-ip-medias.has-fond::before {
  background-image: var(--fp-ip-medias-fond);
  background-size: cover;
  background-position: center;
}
.fp-ip-medias.has-fond::after {
  background: color-mix(in srgb, var(--fp-dark) 72%, transparent);
}
.fp-ip-medias.has-fond .fp-ip-medias-grille {
  position: relative;
  z-index: 1;
}
/* --------------------------------------------------------------------------
   ÉTATS MASQUÉS DE DÉPART - SOUS html.fp-ip-anim UNIQUEMENT.

   Cette classe est posée de façon synchrone dans l'en-tête
   (fp_informations_anti_flash_marqueur, inc/informations.php), avant la
   première peinture, et seulement si JavaScript s'exécute et que les
   animations ne sont pas réduites. Sans elle, RIEN de ce bloc ne s'applique :
   la page est entière dès le premier pixel. assets/js/informations.js n'amène
   donc jamais un contenu vers l'invisible, il ne fait que l'amener vers le
   visible, et il retire la classe si GSAP n'arrive pas.
   -------------------------------------------------------------------------- */
html.fp-ip-anim [data-fp-ip-rise] {
  opacity: 0;
  transform: translateY(26px);
}
html.fp-ip-anim [data-fp-ip-titre] {
  opacity: 0;
  transform: translateY(32px);
}
html.fp-ip-anim [data-fp-ip-tuile] {
  opacity: 0;
  transform: translateY(40px) scale(.96);
}
/* La règle html.fp-ip-anim .fp-ip-h-filet a été retirée le 2026-08-24 : les
   filets de l'ancienne carte des horaires n'existent plus (module partagé). */

/* --------------------------------------------------------------------------
   2. ACCES AU PARC (.fp-acces)
   Bandeau vert fonce plein (classe de fond partagee .fp-s-accent, qui bascule
   aussi les sur-titres en variante « verre », et qui pose le padding vertical
   du bandeau - dont le padding en haut demande par le client). Dessus, a
   gauche, un GRAND PANNEAU CLAIR (~62% de la largeur) qui DEBORDE HORS CADRE
   par la gauche : aucun radius de ce cote, il file jusqu'au bord de la
   fenetre. Ses deux coins DROITS sont tres arrondis. A droite, la mascotte en
   grand (decor de fond) puis les pastilles de contact, posees sur le vert.

   COIN CONCAVE (bas-gauche du panneau) : mesure sur le fichier fourni par le
   client (bord-arrondi-2.webp, 300x300, canal alpha) - c'est un quart de
   cercle de rayon egal au cote de l'image, rempli en blanc PUR (255/255/255),
   donc EXACTEMENT --fp-paper, pas le vert de la section. Reproduit ici en CSS pur
   (.fp-acces-card::after, radial-gradient) plutot qu'avec le fichier : le
   rendu est identique au pixel pres, mais (1) la couleur reste liee au token
   --fp-paper au lieu d'un blanc fige dans des pixels, (2) aucune requete
   image pour un si petit effet, (3) le fichier tel que fourni est ORIENTE
   pour un panneau qui prolonge le blanc PAR LE HAUT (associe a un plafond),
   pas pour raccorder un panneau au-dessus d'un vert en dessous comme ici : il
   aurait fallu le retourner (transform: scaleY(-1)) pour ne pas livrer un
   coin a l'envers. Le radial-gradient evite ce risque d'orientation en plus
   d'etre plus robuste a un futur changement de palette. */
.fp-acces {
  position: relative;
  overflow: hidden;
}
.fp-acces-texture {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}
.fp-acces-grid {
  display: grid;
  /* 2fr / 1fr : lu ~58-62% de la largeur de la fenetre pour le panneau une
     fois le debordement de gauche ajoute (mesure aux gabarits desktop
     courants, 1300-1920px) - la proportion exacte varie legerement avec la
     largeur puisque le debordement grandit avec elle, inherent a un panneau
     en bleed. */
  grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr);
  gap: clamp(24px, 3vw, 44px);
  align-items: start;
}

/* Le panneau clair. Il DECLARE son fond (fp-fond-clair, pose par le PHP) pour
   que l'icon-box qu'il contient reprenne la variante contour : sans cela, le
   bandeau sombre imposerait la variante verre a toute sa descendance. */
.fp-acces-card {
  /* Rayon des deux coins droits : mesure sur la maquette a ~60px. Exprime a
     partir du jeton --fp-radius-lg (2,5x) plutot qu'en valeur arbitraire, pour
     rester rattache a l'echelle de coins du theme. */
  --fp-acces-radius: calc(var(--fp-radius-lg) * 2.5);
  --fp-acces-pad: clamp(22px, 2.8vw, 42px);
  /* Distance entre le bord de la fenetre et le debut de contenu habituel
     (.fp-wrap) : c'est ce debordement qu'on annule par une marge negative
     pour que le panneau file jusqu'au bord, puis qu'on restitue en
     padding-left pour que le TEXTE reste lisible a la meme position que le
     reste du site. */
  --fp-acces-bleed: calc((100vw - var(--fp-wrap)) / 2 + var(--fp-gutter));
  position: relative;
  background: var(--fp-paper);
  color: var(--fp-ink);
  border-radius: 0 var(--fp-acces-radius) var(--fp-acces-radius) 0;
  margin-left: calc(-1 * var(--fp-acces-bleed));
  padding: var(--fp-acces-pad);
  padding-left: calc(var(--fp-acces-bleed) + var(--fp-acces-pad));
  box-shadow: var(--fp-shadow-lg);
}
.fp-acces-card::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: calc(-1 * var(--fp-acces-radius));
  width: var(--fp-acces-radius);
  height: var(--fp-acces-radius);
  background: radial-gradient(circle at bottom right, transparent var(--fp-acces-radius), var(--fp-paper) var(--fp-acces-radius));
  pointer-events: none;
}
.fp-acces-card-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
}
.fp-acces-card-titre { min-width: 0; }
/* Bebas Neue et Thoge n'existent qu'en graisse 400 : aucun faux gras ici. */
.fp-acces-title {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  line-height: 1.02;
  letter-spacing: .01em;
  font-size: clamp(1.9rem, 3.4vw, 2.9rem);
  color: var(--fp-secondary);
  margin: 4px 0 0;
}
.fp-acces-actions { flex: 0 0 auto; }
.fp-acces-lead {
  color: var(--fp-ink-soft);
  max-width: 64ch;
  margin: 16px 0 0;
  line-height: 1.65;
}

/* Les moyens d'acces : sous-cartes a filet. Le premier occupe toute la largeur
   (c'est le plus detaille), les suivants se rangent par deux. */
.fp-acces-modes {
  list-style: none;
  margin: 26px 0 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 16px;
}
.fp-acces-mode {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  padding: 20px;
  border: 1px solid color-mix(in srgb, var(--fp-primary) 30%, transparent);
  border-radius: var(--fp-radius);
  background: color-mix(in srgb, var(--fp-accent) 9%, var(--fp-paper));
  transition: border-color .25s ease, transform .25s ease;
}
.fp-acces-mode:hover {
  border-color: var(--fp-primary);
  transform: translateY(-3px);
}
/* La carte transports (is-large) empile une ligne d'en-tete (pastille +
   logo partenaire) puis le texte, plutot que l'icone et le texte cote a
   cote des deux autres cartes : c'est la seule a porter un logo, elle a
   besoin de sa propre ligne pour le caler a droite. */
.fp-acces-mode.is-large {
  grid-column: 1 / -1;
  flex-direction: column;
  align-items: stretch;
}
.fp-acces-mode-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
}
.fp-acces-mode-logo {
  max-height: 34px;
  width: auto;
  max-width: 140px;
  object-fit: contain;
  /* Fourni par le partenaire de transport : pas de teinte imposee, un logo
     de marque garde ses propres couleurs. */
}
.fp-acces-mode-ic {
  flex: 0 0 auto;
  width: 46px;
  height: 46px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: color-mix(in srgb, var(--fp-primary) 13%, var(--fp-white));
  border: 1px solid color-mix(in srgb, var(--fp-primary) 26%, transparent);
  color: var(--fp-primary);
}
.fp-acces-mode-ic svg { width: 22px; height: 22px; }
.fp-acces-mode-txt { min-width: 0; }
.fp-acces-mode-title {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: .02em;
  font-size: 1.3rem;
  line-height: 1.1;
  color: var(--fp-secondary);
  margin: 3px 0 6px;
}
.fp-acces-mode-desc {
  color: var(--fp-ink-soft);
  font-size: .97rem;
  line-height: 1.62;
  margin: 0;
}
.fp-acces-mode-desc + .fp-acces-mode-desc { margin-top: .7em; }

/* Fondu de fin de texte, carte transports uniquement : le premier paragraphe
   (visible) est cadre sur 4 lignes et s'estompe vers le bas, mais UNIQUEMENT
   quand un « Lire plus » existe reellement (:has le detecte) - sinon un texte
   court serait tronque sans aucun moyen de lire la suite. Ouvrir le details
   leve le cadrage EN MEME TEMPS qu'il revele les paragraphes suivants : aucun
   mot du premier paragraphe ne reste donc jamais durablement invisible. Le
   cadrage n'empeche pas la lecture par un lecteur d'ecran ni la selection du
   texte, seul le rendu visuel est concerne. */
.fp-acces-mode.is-large .fp-acces-mode-txt:has(.fp-acces-mode-plus) > .fp-acces-mode-desc:first-of-type {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 4;
  overflow: hidden;
  mask-image: linear-gradient(to bottom, #000 75%, transparent 100%);
  -webkit-mask-image: linear-gradient(to bottom, #000 75%, transparent 100%);
}
.fp-acces-mode.is-large .fp-acces-mode-txt:has(.fp-acces-mode-plus[open]) > .fp-acces-mode-desc:first-of-type {
  -webkit-line-clamp: unset;
  overflow: visible;
  mask-image: none;
  -webkit-mask-image: none;
}

/* « Lire plus » : <details> natif, donc sans JavaScript et avec un etat
   ouvert/ferme deja annonce par le navigateur. Le contenu replie est
   REELLEMENT dans la page (jamais masque aux lecteurs d'ecran ni aux moteurs). */
.fp-acces-mode-plus { margin-top: 10px; }
.fp-acces-mode-plus > summary {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  cursor: pointer;
  list-style: none;
  /* Cible tactile : avec les seuls 4 px de marge interne, la zone cliquable
     mesurait environ 30 px de haut, sous le minimum de 44 px recommande pour
     un doigt (WCAG 2.5.5). Le defaut valait a TOUTE largeur, mais ne genait
     que sur ecran tactile. La hauteur minimale ne change rien au dessin (le
     texte reste centre, la marge interne est conservee), elle elargit
     seulement la zone atteignable. */
  min-height: 44px;
  /* Vert fonce plutot que le teal principal : a cette taille et sur le fond
     legerement teinte de la sous-carte, le teal passait tout juste le seuil de
     contraste. Le teal revient au survol, ou il n'est plus la seule indication. */
  color: var(--fp-secondary);
  font-weight: 600;
  font-size: .92rem;
  padding: 4px 2px;
  border-radius: var(--fp-radius-sm);
}
.fp-acces-mode-plus > summary::-webkit-details-marker { display: none; }
.fp-acces-mode-plus > summary::after {
  content: "";
  width: 7px;
  height: 7px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-2px) rotate(45deg);
  transition: transform .25s ease;
}
.fp-acces-mode-plus[open] > summary::after { transform: translateY(1px) rotate(-135deg); }
.fp-acces-mode-plus > summary:hover { color: var(--fp-primary); }
.fp-acces-mode-plus > summary:focus-visible {
  outline: 2px solid var(--fp-primary);
  outline-offset: 3px;
}
.fp-acces-mode-plus .fp-acces-mode-plus-ouvert { display: none; }
.fp-acces-mode-plus[open] .fp-acces-mode-plus-ferme { display: none; }
.fp-acces-mode-plus[open] .fp-acces-mode-plus-ouvert { display: inline; }
.fp-acces-mode-plus > p { margin-top: 10px; }

/* Colonne de droite : la mascotte EN GRAND (elle joue le role d'un decor de
   fond pour la colonne), puis la pile de pastilles de contact sous elle. */
.fp-acces-side {
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.fp-acces-mascotte {
  position: relative;
  display: flex;
  justify-content: center;
}
/* Halo tres doux derriere la mascotte : renforce son role de decor SANS
   glassmorphism (aucun flou, aucun panneau translucide - un simple degrade
   radial dans la teinte d'accent). */
.fp-acces-mascotte::before {
  content: "";
  position: absolute;
  inset: -6% 6% -4%;
  z-index: 0;
  background: radial-gradient(60% 65% at 50% 42%, color-mix(in srgb, var(--fp-accent) 32%, transparent) 0%, transparent 72%);
  pointer-events: none;
}
.fp-acces-mascotte .fp-mascotte-figure {
  position: relative;
  z-index: 1;
}
.fp-acces-mascotte .fp-mascotte-figure img {
  max-width: min(320px, 86%);
  height: auto;
  filter: drop-shadow(0 18px 26px rgba(0, 0, 0, .3));
}

/* --------------------------------------------------------------------------
   PASTILLES DE COORDONNEES (.fp-coord-*) - composant partage, rendu par
   fp_coord_row / fp_render_coordonnees_card (inc/template-tags.php).

   Il ne REDEFINIT PAS l'icon-box : il HERITE de ses jetons de variante
   (--fp-ibox-bg / line / fg / pastille / flou, definis une seule fois dans
   main.css). Une pastille prend donc automatiquement l'aspect « verre » sur un
   fond sombre et « contour » sur un fond clair, et toute retouche de la
   palette de l'icon-box se repercute ici sans rien recopier. La difference
   avec l'icon-box est fonctionnelle, pas decorative : une pastille est un LIEN
   (telephone, e-mail, itineraire) avec un intitule, une valeur et parfois une
   precision, la ou l'icon-box est un sur-titre decoratif non cliquable.
   -------------------------------------------------------------------------- */
.fp-coord-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.fp-coord-card-title {
  font-size: .8rem;
  text-transform: uppercase;
  letter-spacing: .12em;
  font-weight: 600;
  opacity: .72;
  margin: 0 0 2px;
}
.fp-coord-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.fp-coord-row {
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 10px 18px 10px 10px;
  border-radius: var(--fp-radius);
  border: 1px solid var(--fp-ibox-line);
  background: var(--fp-ibox-bg);
  color: var(--fp-ibox-fg);
  -webkit-backdrop-filter: var(--fp-ibox-flou);
  backdrop-filter: var(--fp-ibox-flou);
  transition: transform .28s ease, border-color .28s ease;
}
.fp-coord-row:hover { transform: translateY(-2px); }
.fp-coord-ic {
  flex: 0 0 auto;
  width: 38px;
  height: 38px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--fp-ibox-pastille);
  color: var(--fp-ibox-fg);
}
.fp-coord-ic svg { width: 19px; height: 19px; }
.fp-coord-txt {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
  padding-top: 3px;
}
/* Intitule et precision : AUCUNE transparence. La hierarchie se fait a la
   taille et a la graisse, pas en delavant le texte - une opacite reduite ferait
   tomber le contraste sous le seuil lisible dans le contexte clair (le teal de
   l'icon-box sur blanc n'a deja pas de marge). */
.fp-coord-label {
  font-size: .74rem;
  text-transform: uppercase;
  letter-spacing: .11em;
  font-weight: 600;
}
.fp-coord-value {
  font-weight: 600;
  line-height: 1.4;
  color: inherit;
  text-decoration: none;
  overflow-wrap: anywhere;
}
a.fp-coord-value:hover { text-decoration: underline; }
a.fp-coord-value:focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 3px;
  border-radius: var(--fp-radius-sm);
}
/* Cible tactile : le lien lui-meme (numero de telephone, adresse e-mail,
   itineraire) ne faisait qu'environ 22 px de haut, la moitie du minimum de
   44 px recommande pour un doigt (WCAG 2.5.5) - et il fallait viser le texte
   sans deborder sur l'intitule au-dessus ni la precision en dessous. Defaut
   present a TOUTE largeur, sensible seulement sur ecran tactile.
   La pastille entiere (au moins 58 px de haut, pictogramme compris) devient
   la zone cliquable, ce que son survol laissait deja croire puisque la LIGNE
   se souleve au passage. Aucun deplacement de contenu.
   Deux gardes volontaires : la regle ne vise QUE les liens (une ligne sans
   adresse est rendue en <span>, elle ne devient jamais cliquable par erreur,
   et une ligne ne porte jamais plus d'un lien, donc aucun recouvrement de
   cibles), et elle est reservee aux pointeurs GROSSIERS (doigt, stylet). Sur
   souris, ou la precision n'est pas en cause, la pastille reste du texte
   ordinaire que l'on peut selectionner et copier, ce qu'un calque de
   recouvrement empecherait. */
@media (pointer: coarse) {
  .fp-coord-row a.fp-coord-value::after {
    content: "";
    position: absolute;
    inset: 0;
  }
}
.fp-coord-note {
  font-size: .85rem;
  line-height: 1.45;
  font-weight: 400;
}

/* --------------------------------------------------------------------------
   3. HORAIRES - la zone fp-blk-horaires porte une mascotte : le renderer
   partage (fp_render_horaires, inc/sections.php) passe alors en deux colonnes
   avec la grille .fp-horaires-grid deja definie dans main.css. On n'ajuste ici
   que les espacements et le CONFLIT DE SPECIFICITE avec le module d'horaires.

   Le conflit : main.css style « .fp-horaires-body table » (fond plein blanc,
   lignes paires creme) pour la table GENERIQUE du module. Ces regles sont plus
   specifiques que « .ht-table » du plugin et ecrasaient son fond translucide
   voulu sur la carte teal : lignes paires blanches, texte blanc, contraste
   casse. On restaure ici les valeurs du plugin (plugins/fp-horaires-manager/
   assets/fp-horaires.css) avec une specificite suffisante. Le CSS du plugin
   reste la source de verite, il n'est pas duplique.
   -------------------------------------------------------------------------- */
.page-template-template-informations .fp-horaires-lead {
  color: var(--fp-ink-soft);
  max-width: 58ch;
  margin: 14px 0 0;
  line-height: 1.65;
}
.page-template-template-informations .fp-horaires-body {
  margin-top: 26px;
  max-width: 640px;
}
.page-template-template-informations .ht-table {
  background-color: var(--fp-primary);
  border-radius: var(--fp-radius-lg);
  color: var(--fp-white);
}
.page-template-template-informations .ht-table tbody tr:nth-child(even) {
  background: rgba(255, 255, 255, .08);
}
.page-template-template-informations .ht-table th,
.page-template-template-informations .ht-table td {
  color: var(--fp-white);
}

/* --------------------------------------------------------------------------
   5. NOUS CONTACTER (.fp-contact)
   Deux colonnes : le formulaire a gauche (avec, sous le bouton d'envoi, les
   canaux directs), le plan d'acces a droite. Le plan reste visible pendant que
   l'on remplit le formulaire (colonne collante sur grand ecran).
   -------------------------------------------------------------------------- */
.fp-contact-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.08fr) minmax(300px, 0.92fr);
  gap: clamp(28px, 3.4vw, 54px);
  align-items: start;
}
.fp-contact-title {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  line-height: 1.02;
  letter-spacing: .01em;
  font-size: clamp(1.9rem, 3.4vw, 2.9rem);
  color: var(--fp-secondary);
  margin: 4px 0 0;
}
.fp-contact-lead { margin-top: 14px; }
.fp-contact-form-wrap { margin-top: 26px; }

/* Le formulaire natif ([fp_contact_form], inc/contact-form.php). Sa base vit
   dans main.css ; on affine ici la mise en page de la section (largeur pleine
   colonne, deux champs par ligne, etats de saisie lisibles). */
.fp-contact .fp-contact-form {
  max-width: none;
  gap: 18px;
}
.fp-contact .fp-contact-form .fp-field {
  display: flex;
  flex-direction: column;
  gap: 7px;
  margin: 0;
}
/* CORRECTIF D'HÉRITAGE (retour client, 2026-08-12, second passage : « la
   petite astérisque... actuellement elle passe à la ligne, donc ça décale
   tout le formulaire »). Cause : main.css pose une règle générique plus large
   (.fp-contact-form label { display:flex; flex-direction:column }), pour que
   le label et son champ s'empilent proprement dans le fil DOM de certains
   contextes. Mais un LABEL de ce formulaire peut contenir DEUX enfants
   directs (le texte du libellé, puis .fp-field-req) : en colonne, Flexbox les
   empile l'un sous l'autre, l'astérisque passe donc à la ligne. On repasse la
   direction en ligne SUR CETTE PAGE (le libellé et l'input restent, eux,
   empilés séparément par .fp-field, non touché) : un label sans astérisque
   n'a qu'un seul enfant, la direction ne change donc rien pour lui. */
.fp-contact .fp-contact-form label {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: baseline;
  gap: .35em;
  font-weight: 600;
  font-size: .95rem;
  color: var(--fp-ink);
}
.fp-contact .fp-field-req { color: var(--fp-primary); }
.fp-contact .fp-contact-form input,
.fp-contact .fp-contact-form select,
.fp-contact .fp-contact-form textarea {
  font: inherit;
  width: 100%;
  padding: 14px 16px;
  border: 1px solid var(--fp-line-strong);
  border-radius: var(--fp-radius-sm);
  background: var(--fp-paper);
  color: var(--fp-ink);
  transition: border-color .18s ease, box-shadow .18s ease;
}
/* Le contour de focus par defaut est remplace par un anneau PLUS visible, pas
   supprime : la navigation au clavier reste parfaitement lisible. */
.fp-contact .fp-contact-form input:focus-visible,
.fp-contact .fp-contact-form select:focus-visible,
.fp-contact .fp-contact-form textarea:focus-visible {
  outline: none;
  border-color: var(--fp-primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--fp-primary) 26%, transparent);
}
.fp-contact .fp-contact-form textarea {
  min-height: 165px;
  resize: vertical;
}
.fp-contact .fp-contact-form [aria-invalid="true"] { border-color: var(--fp-danger); }
.fp-contact .fp-contact-form .fp-form-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 18px;
}
.fp-contact .fp-contact-form .fp-form-legend {
  font-size: .85rem;
  color: var(--fp-ink-soft);
  margin: 0;
}
.fp-contact .fp-contact-form .fp-btn { align-self: flex-start; }
.fp-contact .fp-form-errors {
  background: color-mix(in srgb, var(--fp-danger) 9%, var(--fp-paper));
  border: 1px solid var(--fp-danger);
  border-radius: var(--fp-radius-sm);
  padding: 14px 18px;
  color: var(--fp-ink);
}
.fp-contact .fp-form-errors-title {
  margin: 0;
  font-weight: 700;
}
.fp-contact .fp-form-errors ul {
  margin: 6px 0 0;
  padding-left: 20px;
}
.fp-contact .fp-form-errors li { color: var(--fp-ink); }
.fp-contact .fp-form-success {
  background: color-mix(in srgb, var(--fp-primary) 11%, var(--fp-paper));
  border: 1px solid var(--fp-primary);
  border-radius: var(--fp-radius-sm);
  padding: 18px 20px;
  color: var(--fp-ink);
}
.fp-contact .fp-form-errors:focus-visible,
.fp-contact .fp-form-success:focus-visible {
  outline: 2px solid var(--fp-secondary);
  outline-offset: 3px;
}
.fp-contact-joindre { margin-top: 24px; }

/* Le plan d'acces. La carte integree n'est presente que si une URL
   d'integration est renseignee dans le Customizer : par defaut, la page
   n'appelle AUCUN service tiers. L'adresse ecrite et le bouton d'itineraire
   sont toujours la, sous la carte : ce sont eux l'information de reference,
   lisibles au clavier et au lecteur d'ecran. */
.fp-contact-side { position: sticky; top: calc(var(--fp-nav-h) + 24px); }
.fp-contact-plan {
  border: 1px solid var(--fp-line);
  border-radius: var(--fp-radius-lg);
  background: var(--fp-cream);
  box-shadow: var(--fp-shadow);
  overflow: hidden;
}
.fp-contact-map {
  position: relative;
  aspect-ratio: 4 / 3;
  background: color-mix(in srgb, var(--fp-accent) 22%, var(--fp-cream));
}
.fp-contact-map iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
}
.fp-contact-mascotte {
  position: absolute;
  right: 8px;
  bottom: 0;
  /* Plancher abaisse de 84 px a 56 px. La mascotte est posee EN SUPERPOSITION
     du plan, sa largeur doit donc rester PROPORTIONNELLE a lui : a 25 % elle
     occupe partout un bon quart de la largeur du plan et un peu plus de la
     moitie de sa hauteur, proportion voulue. Le plancher de 84 px reprenait la
     main des que le plan passait sous 336 px de large, c'est a dire des la
     colonne unique sur telephone (plan de 248 px de large a 320 px de fenetre,
     de 297 px a 375 px) : la mascotte y couvrait alors plus des trois quarts
     de la hauteur du plan et masquait ses commandes de zoom et sa mention
     d'attribution, dans le coin bas droit. A 56 px, la proportion reste celle
     de l'ordinateur jusqu'a 224 px de plan, soit sous le plus petit telephone
     encore utilise. */
  width: clamp(56px, 25%, 148px);
  pointer-events: none;
}
.fp-contact-mascotte .fp-mascotte-figure img {
  width: 100%;
  height: auto;
  filter: drop-shadow(0 14px 20px rgba(0, 0, 0, .32));
}
.fp-contact-plan-txt {
  padding: 22px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 12px;
}
/* Sans carte integree, le panneau reste un vrai bloc d'information : on lui
   donne un filigrane de plan dessine en CSS, purement decoratif. */
.fp-contact-plan.is-sans-carte {
  background:
    repeating-linear-gradient(90deg,
      color-mix(in srgb, var(--fp-primary) 7%, transparent) 0 1px,
      transparent 1px 34px),
    repeating-linear-gradient(0deg,
      color-mix(in srgb, var(--fp-primary) 7%, transparent) 0 1px,
      transparent 1px 34px),
    var(--fp-cream);
}
.fp-contact-plan-title {
  font-family: var(--fp-font-heading);
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: .03em;
  font-size: 1.25rem;
  line-height: 1.1;
  color: var(--fp-secondary);
  margin: 0;
}
.fp-contact-adresse {
  font-style: normal;
  color: var(--fp-ink-soft);
  line-height: 1.6;
  margin: 0;
}
.fp-contact-itineraire { margin-top: 2px; }

/* --------------------------------------------------------------------------
   MOUVEMENT PROPRE A LA PAGE - uniquement pour qui n'a pas demande moins
   d'animation. Le reste des apparitions passe par .fp-reveal (main.css).
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: no-preference) {
  /* .fp-ip-banniere-mascotte n'existe plus dans le rendu (retrait du
     2026-09-03) : la règle de flottement qui la ciblait est retirée. */
  .fp-acces-mascotte .fp-mascotte-figure {
    animation: fp-info-flotte 6.5s ease-in-out infinite;
  }
  @keyframes fp-info-flotte {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-10px); }
  }
}
/* « ANIMATIONS REDUITES » COUPE TOUT, sans exception : les transitions de
   survol, le flottement de la mascotte (deja absent, il n'existe que sous
   « no-preference »), et la totalite des mouvements pilotes par
   assets/js/informations.js, qui ne s'executent tout simplement pas puisque le
   marqueur html.fp-ip-anim n'est pas pose dans ce cas. La section d'acces se
   lit alors verticalement, en flux normal. */
@media (prefers-reduced-motion: reduce) {
  .fp-acces-mode,
  .fp-coord-row,
  .fp-acces-mode-plus > summary::after,
  .fp-ip-tuile,
  .fp-ip-tuile-fleche,
  .fp-ip-acces-repere,
  .fp-ip-fleche,
  .fp-contact .fp-contact-form input,
  .fp-contact .fp-contact-form select,
  .fp-contact .fp-contact-form textarea { transition: none; }
  .fp-acces-mode:hover,
  .fp-coord-row:hover { transform: none; }
  a.fp-ip-tuile:hover .fp-ip-tuile-fleche { transform: none; }
}

/* --------------------------------------------------------------------------
   RESPONSIVE
   -------------------------------------------------------------------------- */
@media (max-width: 1080px) {
  .fp-acces-grid { grid-template-columns: 1fr; }
  /* Le panneau s'empile proprement : plus de debordement ni de coin concave
     (qui n'aurait plus de bord droit du bandeau a rejoindre), un panneau
     normal, arrondi sur ses quatre coins comme les autres cartes du site. */
  .fp-acces-card {
    margin-left: 0;
    padding-left: var(--fp-acces-pad);
    border-radius: var(--fp-radius-lg);
  }
  .fp-acces-card::after { content: none; }
  .fp-acces-side {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: center;
    gap: 22px;
  }
  .fp-acces-mascotte { flex: 0 0 auto; }
  .fp-acces-mascotte .fp-mascotte-figure img { max-width: 190px; }
  .fp-acces-side .fp-coord-card { flex: 1 1 300px; }
}
@media (max-width: 900px) {
  .fp-contact-grid { grid-template-columns: 1fr; }
  .fp-contact-side { position: static; }
  .fp-acces-modes { grid-template-columns: 1fr; }
  .fp-acces-mode.is-large { grid-column: auto; }
  /* TOUTE LA PAGE PASSE À UNE COLONNE AU MÊME MOMENT : le formulaire de
     contact, les panneaux d'accès et le bloc presse. Sous cette largeur, une
     colonne de texte à côté d'une photo de 420 px n'a plus de place pour se
     lire.
     LES PANNEAUX D'ACCÈS, EUX, NE S'EMPILENT QUE SI LE DÉFILEMENT HORIZONTAL
     MOBILE N'EXISTE PAS (html.fp-ip-pin-mobile absente : animations réduites,
     GSAP en panne, ou écran trop court, voir assets/js/informations.js). Quand
     il existe, la piste compacte plus haut reprend la main, avec sa photo
     étroite à côté du texte. */
  html:not(.fp-ip-pin-mobile) .fp-ip-panneau { grid-template-columns: 1fr; }
  html:not(.fp-ip-pin-mobile) .fp-ip-panneau:nth-child(even) .fp-ip-panneau-photo { order: 0; }
  html:not(.fp-ip-pin-mobile) .fp-ip-panneau-photo { aspect-ratio: 16 / 10; }
  .fp-ip-contact-grille { grid-template-columns: 1fr; }
}
/* DÉFAUT CORRIGÉ (banc d'essai visuel, 2026-08-05) : les cartes « à vélo » et
   « en voiture » posent leur pastille d'icône À GAUCHE du texte. Sur un
   téléphone, la colonne de texte tombe alors à 108 px à 320 px et à 144 px à
   360 px : la description s'empile sur huit lignes de deux ou trois mots. La
   carte « en transports publics » (.is-large), elle, empile déjà icône puis
   texte, ce qui donnait deux mises en page différentes dans la même liste.
   Sous 480 px, les trois cartes s'empilent donc de la même façon. */
@media (max-width: 480px) {
  .fp-acces-mode { flex-direction: column; align-items: stretch; }
}
@media (max-width: 720px) {
  .fp-acces-mascotte .fp-mascotte-figure img { max-width: 220px; }
  .fp-acces-card { padding: 22px 18px; }
  .fp-acces-card-head { gap: 12px; }
  .fp-acces-actions { width: 100%; }
  .fp-contact .fp-contact-form .fp-form-row { grid-template-columns: 1fr; }
  .fp-contact-plan-txt { padding: 18px; }
  .fp-acces-side { flex-direction: column; align-items: stretch; }
  .fp-acces-mascotte { justify-content: center; }
}

/* --------------------------------------------------------------------------
   RESPONSIVE DE LA REFONTE (.fp-ip-*)

   La mosaïque des coordonnées passe de douze colonnes à six, puis à une seule.
   Les spans sont redonnés à chaque palier plutôt que remis à « auto » : une
   tuile absente (donnée non renseignée dans les Coordonnées) ne doit jamais
   laisser un trou dans la grille.
   -------------------------------------------------------------------------- */
/* UNE MOSAÏQUE QUI NE PEUT PAS AVOIR DE TROU.

   Une tuile dont la donnée n'est pas renseignée dans les Coordonnées n'est pas
   rendue du tout : sans ces règles, sa place resterait vide au milieu de la
   grille. Les voisines s'élargissent donc pour reprendre exactement la largeur
   libérée, et la mosaïque reste pleine quel que soit ce que la cliente a
   saisi. Les combinaisons couvertes sont toutes celles qui existent : pas de
   photo, pas d'adresse, pas de téléphone, pas de courriel, ni l'un ni l'autre.

   Depuis la rangée à quatre cases égales (cinquième passage), le flex fait
   ce travail tout seul : une tuile absente laisse simplement ses voisines
   s'élargir. Seul reste le repli intermédiaire : deux cases par ligne. */
@media (min-width: 721px) and (max-width: 1100px) {
  .fp-ip-bento { flex-wrap: wrap; }
  .fp-ip-bento > .fp-ip-tuile { flex: 1 1 calc(50% - var(--fp-ip-gap) / 2); }
}
@media (max-width: 720px) {
  .fp-ip-banniere {
    min-height: 0;
    align-items: flex-start;
    padding-bottom: clamp(28px, 8vw, 44px);
  }
  /* DEUX CASES PAR LIGNE (retour client du 2026-08-17, revue mobile) : adresse
     et horaires sur la première ligne, téléphone et courriel sur la seconde.
     C'est déjà l'ordre du document (fp_render_informations_hero,
     inc/informations.php) : rien à réordonner, il suffit de laisser la rangée
     revenir à la ligne. Une case absente (donnée non renseignée dans les
     Coordonnées) laisse simplement ses voisines s'élargir, comme aux autres
     paliers : le flex s'en charge, aucune règle :has() n'est nécessaire. */
  .fp-ip-bento { flex-wrap: wrap; }
  .fp-ip-bento > .fp-ip-tuile {
    flex: 1 1 calc(50% - var(--fp-ip-gap) / 2);
    /* Plancher abaissé de 168 à 132 px : à demi-largeur, une case a besoin de
       deux fois moins de hauteur pour respirer, et c'est de toute façon le
       contenu qui commande dès qu'il dépasse. L'étirement de la rangée
       (align-items: stretch, posé plus haut) égalise les deux voisines. */
    min-height: 132px;
    padding: 16px;
  }
  /* LISIBILITÉ À DEMI-LARGEUR, et rien d'autre. La colonne intérieure d'une
     case tombe à environ 114 px sur un écran de 375 px : aux tailles de la
     rangée pleine largeur, un numéro de téléphone s'y coupait en deux. On
     resserre donc l'intitulé et la valeur, uniquement dans la mosaïque (les
     tuiles jumelles de la section « Nous contacter », qui partagent ces
     classes, gardent leurs tailles : elles sont en pleine largeur là-bas).
     AUCUNE TRONCATURE : overflow-wrap: anywhere reste posé sur les valeurs
     (voir .fp-ip-tuile-valeur plus haut), une adresse de courriel plus longue
     que la case continue donc de passer à la ligne au lieu de déborder. */
  .fp-ip-bento .fp-ip-tuile-label {
    gap: 7px;
    font-size: .7rem;
    letter-spacing: .08em;
  }
  .fp-ip-bento .fp-ip-tuile-ic svg { width: 14px; height: 14px; }
  .fp-ip-bento .fp-ip-tuile-valeur,
  .fp-ip-bento .fp-ip-tuile-adresse { font-size: 1.15rem; line-height: 1.04; }
  /* NUMÉRO ET ADRESSE DE COURRIEL UN CRAN PLUS GRANDS (retour client du
     2026-08-18 : « augmente un tout petit peu leur taille »). Les deux valeurs
     deviennent FLUIDES : la case fait exactement la moitié de la colonne de
     contenu, donc sa largeur suit la fenêtre, et une taille qui suit la même
     unité garde le même rapport d'un téléphone à l'autre au lieu d'être juste
     sur l'un et trop grande sur l'autre. Les planchers valent les tailles
     précédentes : aucun écran ne perd de place. Aucune troncature possible,
     overflow-wrap: anywhere reste posé sur les valeurs (voir
     .fp-ip-tuile-valeur plus haut) : une valeur trop longue passe à la ligne,
     la case s'étirant avec sa voisine. */
  .fp-ip-bento .fp-ip-tuile--tel .fp-ip-tuile-valeur { font-size: clamp(1.15rem, 5.2vw, 1.4rem); }
  .fp-ip-bento .fp-ip-tuile--mail .fp-ip-tuile-valeur { font-size: clamp(.98rem, 4.3vw, 1.2rem); }
  .fp-ip-bento .fp-ip-tuile-precision { font-size: .85rem; line-height: 1.4; }
  /* « VOIR LES HORAIRES » SUR UNE SEULE LIGNE (retour client du 2026-08-18).
     Dans une case de demi-largeur, la colonne intérieure tombe à environ
     115 px sur un écran de 375 px : le libellé s'y coupait en deux. La taille
     suit la largeur de la case (même unité qu'elle) et reste sous la place
     disponible avec une marge d'un bon dixième à toutes les largeurs
     courantes ; white-space verrouille la ligne unique demandée.
     CIBLE TACTILE : ce lien est le SEUL élément interactif de la case (la case
     d'état n'est pas un lien, contrairement à ses trois voisines). Sa boîte
     est donc portée à 44 px de haut (WCAG 2.5.5), le texte restant calé en bas
     de cette boîte : rien ne bouge à l'œil, et la case ne grandit pas d'un
     pixel (elle a 132 px de hauteur minimale pour un contenu qui en occupe
     environ 90). */
  .fp-ip-bento .fp-ip-tuile-lien {
    display: inline-flex;
    align-items: flex-end;
    min-height: 44px;
    font-size: clamp(.7rem, 3vw, .84rem);
    white-space: nowrap;
  }
  /* PASTILLE D'ÉTAT EN LIBELLÉ COURT (retour client du 2026-08-18 : « Fermé »
     ou « Ouvert », pas « Fermé actuellement »). Le libellé long, écrit par
     setupHorairesLive (assets/js/main.js, non modifié), cède la place au
     libellé court rendu par le serveur qui correspond à l'état, et à lui seul :
     tant qu'aucune classe d'état n'est posée, rien ne change et la pastille
     reste de toute façon masquée. Voir le bloc « PASTILLE D'ÉTAT » en tête de
     feuille. */
  .fp-ip-tuile .fp-horaires-status.is-open .fp-ip-statut-court--ouvert,
  .fp-ip-tuile .fp-horaires-status.is-closed .fp-ip-statut-court--ferme { display: inline; }
  .fp-ip-tuile .fp-horaires-status.is-open [data-fp-horaires-status-label],
  .fp-ip-tuile .fp-horaires-status.is-closed [data-fp-horaires-status-label] { display: none; }
  /* CIBLE TACTILE INCHANGÉE : chaque case EST le lien, sur au moins 132 px de
     haut et la moitié de la colonne de large, très au-delà des 44 px
     recommandés pour un doigt (WCAG 2.5.5).
     La flèche de la tuile reprend sa place dans le flux : en absolu, elle
     chevauchait une valeur passée à la ligne (adresse de courriel longue). */
  .fp-ip-tuile-fleche { position: static; align-self: flex-end; }
  /* LE PLAN PREND BEAUCOUP PLUS DE PLACE, ET LE VERRE BEAUCOUP MOINS (retour
     client du 2026-08-17 : « on doit voir la carte derrière le voile de verre,
     pas seulement le texte par-dessus »).
     MESURE DU DÉFAUT à 375 px : le cadre en 4/3 faisait 229 px de haut et la
     bande de verre, passée en colonne à ce palier (titre, adresse sur trois
     lignes, puis bouton), en occupait environ 203 : il restait 26 px de carte
     visible, soit 11 pour cent du cadre.
     DEUX GESTES, AUCUN TEXTE TOUCHÉ. Le cadre passe en portrait (3/4), plafonné
     pour ne pas devenir démesuré sur une tablette étroite ni dépasser l'écran ;
     et le verre se resserre (marges internes, écart, tailles de titre et
     d'adresse), le bouton d'itinéraire gardant sa taille, donc sa cible
     tactile. Nouveau relevé à 375 px : cadre 376 px, verre environ 165 px, soit
     211 px de carte visible et 56 pour cent du cadre. */
  .fp-ip-plan {
    aspect-ratio: 3 / 4;
    max-height: 470px;
    max-height: min(68svh, 470px);
  }
  .fp-ip-plan-txt {
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
    padding: 12px 14px 14px;
  }
  .fp-ip-plan-titre { font-size: 1.12rem; margin-bottom: 4px; }
  .fp-ip-plan-adresse { font-size: .88rem; line-height: 1.4; }
  /* LE REPÈRE DU PLAN REVIENT AU MILIEU DE CE QU'ON VOIT (retour client du
     2026-08-18 : « le marqueur rouge apparaît vers le bas de la zone »).

     CAUSE : le service de cartographie centre le repère sur la carte ENTIÈRE,
     or le bandeau de verre en couvre le bas (environ 44 pour cent du cadre à
     375 px, cadre 376 px, bandeau 165 px). Le repère se retrouve donc bien en
     dessous du milieu de la BANDE RESTÉE VISIBLE.

     CORRECTIF DE CADRAGE, SANS PARAMÈTRE DE SERVICE TIERS : la carte est
     remontée de 42 pour cent de la hauteur du cadre et rallongée d'autant, si
     bien que son BAS reste exactement au bas du cadre (rien ne se découvre
     sous le bandeau, la mention d'attribution du service ne bouge pas d'un
     pixel) et que son CENTRE, donc le repère, remonte au milieu de la bande
     visible. Le haut qui dépasse est coupé par l'overflow du cadre.
     La valeur est exprimée en pourcentage de la hauteur du cadre, donc elle
     suit toute évolution de celui-ci ; le décalage vertical du positionnement
     absolu s'applique et la valeur de « bottom » héritée de inset: 0 est
     ignorée (boîte sur-contrainte : c'est « bottom » que le navigateur
     abandonne). */
  .fp-ip-plan-carte iframe {
    top: -42%;
    height: 142%;
  }
  /* PUCES DE CONTACT SOUS LE PLAN : PLUS DE LIBELLÉ (retour client du
     2026-08-18 : « supprime les libellés Téléphone et Courriel, garde l'icône
     et la valeur, la flèche reste tout à droite »). Le mot est isolé dans son
     propre span par le rendu (fp_render_informations_contact,
     inc/informations.php) et quitte ici l'ŒIL, pas le document : masquage
     accessible (boîte d'un pixel, découpée), donc un lecteur d'écran annonce
     toujours « Téléphone » avant le numéro. La puce garde sa mise en page de
     rangée : pictogramme et valeur à gauche, flèche poussée au bord droit par
     le corps de tuile (flex: 1 1 auto, plus haut dans cette feuille). */
  .fp-ip-contact-tel .fp-ip-tuile-mot,
  .fp-ip-contact-mail .fp-ip-tuile-mot {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
  }
  .fp-ip-medias-photo { aspect-ratio: 16 / 10; }
}

/* ==========================================================================
   PASSE TABLETTE (2026-08-24) : bande 721 px à 1024 px, et rien d'autre.

   Règle bornée des deux côtés. Le palier mobile de cette feuille est
   max-width: 720px : sous 721 px, rien de ce bloc n'est évalué et la plage
   validée par la cliente reste identique au pixel près. Au-dessus de 1024 px
   non plus : le poste de travail ne bouge pas.
   ========================================================================== */

/* « VOIR LES HORAIRES » DE LA TUILE D'ÉTAT : CIBLE TACTILE PLEINE.

   Une tablette est un écran tactile, et ce lien ne mesure que 27 px de haut
   dans la bande tablette (265 px de large à 768 px, 382 px à 1024 px). Sur
   téléphone il atteint déjà 44 px, non par une règle mais parce que la tuile
   y est assez étroite pour que le libellé passe sur deux lignes : la plage
   validée n'a donc rien à corriger, et ce bloc ne l'atteint pas.

   On agrandit la zone de contact SANS toucher au dessin, avec exactement la
   recette déjà employée pour le fil d'Ariane des pages de détail
   (activite.css) : un calque transparent centré sur le lien porte les 44 px.
   Un retrait vertical, lui, aurait bougé la mise en page, le lien étant un
   élément de boîte flexible (parent .fp-ip-tuile-corps en flex colonne) donc
   traité comme un bloc. La mise en position relative d'un élément de boîte
   flexible ne déplace rien. */
@media (min-width: 721px) and (max-width: 1024px) {
  .fp-ip-tuile-lien {
    position: relative;
  }
  .fp-ip-tuile-lien::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    height: 44px;
  }
}

/* --------------------------------------------------------------------------
   LA COUTURE ACCES / HORAIRES (Marino, 2026-09-09 : « y'a cet espace entre les
   moyens de se rendre au parc et les horaires »).
   --------------------------------------------------------------------------
   Mesure faite sur le site, pas devinee : les deux sections portaient chacune
   100,8 px de marge interieure haut ET bas (var(--fp-ip-y)). A leur frontiere,
   cela faisait donc plus de 200 px de vide cumules, en plus de ce que laisse
   l'epinglage de la section Acces, dont la boite fait toute la hauteur de
   l'ecran alors que son contenu s'arrete bien avant.

   On resserre UNIQUEMENT a la couture : le bas d'Acces et le haut d'Horaires.
   Les autres bords ne bougent pas, le rythme de la page est conserve.

   La hauteur de la section Acces, elle, n'est pas touchee : elle est imposee
   par l'epinglage GSAP (100vh), la reduire casserait le defilement horizontal
   des panneaux.
   -------------------------------------------------------------------------- */
.page-template-template-informations .fp-ip-acces {
  padding-bottom: clamp(32px, 4vw, 56px);
}
.page-template-template-informations .fp-ip-horaires {
  padding-top: clamp(32px, 4vw, 56px);
}

/* PASSE MOBILE D'INFORMATIONS PRATIQUES (Marino, 2026-09-10). Borné sous
   720px, le bureau et la tablette ne bougent pas.
   1. Case Adresse : la seconde icône d'épingle, « au milieu de nulle part »
      à droite, est retirée ; celle qui précède le titre reste.
   2. « Voir l'itinéraire » mis en avant, c'est un élément important pour la
      cliente : pilule pleine, teal sur blanc, au lieu d'un simple texte en
      accent, avec sa flèche.
   3. L'horloge ouvre la section des horaires, comme sur l'accueil : avant le
      titre et sa puce, centrée, agrandie. La grille est déjà en colonne à
      cette largeur, il suffit de la faire passer première et de lui rendre
      sa taille. */
@media (max-width: 720px) {
  .fp-ip-tuile--adresse .fp-ip-tuile-itineraire-pin { display: none; }
  .fp-ip-tuile-itineraire-hint {
    margin-top: 10px;
    padding: 9px 16px;
    border-radius: 999px;
    background: var(--fp-primary);
    color: var(--fp-white);
    font-size: .92rem;
  }
  .fp-ip-horaires-grille .fp-horloge-inverse {
    order: -1;
    /* 300 -> 210px (Marino, 2026-09-10 au soir : « réduis encore un peu les
       horloges pour accueil et infos pratiques »). Même geste que sur
       l'accueil, où elle passe à 190px : le cadran annonce la section sans
       occuper le tiers de l'écran. */
    width: min(100%, 210px);
    max-width: none;
    flex: none;
    margin: 0 auto 12px;
  }
  .fp-ip-horaires-grille .fp-ip-horaires-main { order: 0; }
}
