/*
Theme Name: CAP 03 — Commentry Aventure Passion
Theme URI: https://www.hcod.fr/
Author: HCOD
Author URI: https://www.hcod.fr/
Description: Thème WordPress sur mesure pour le club de raid multisport CAP 03 (Commentry, Allier). 
Version: 2.16.0
Requires at least: 6.5
Tested up to: 7.0
Requires PHP: 7.4
Text Domain: cap03
Tags: full-site-editing, block-templates, sports, custom-colors, block-patterns
*/

/* ============================================================
   CAP 03 — Commentry Aventure Passion
   Feuille de style commune à toutes les pages
   ============================================================ */
/* ------------------------------------------------------------
   Palette — source unique : theme.json

   Ces variables courtes sont des alias des presets générés par WordPress à
   partir de theme.json. Elles ne redéfinissent pas les couleurs : elles les
   empruntent. Une modification via Apparence → Éditeur → Styles se répercute
   donc partout, y compris dans les sections encore écrites en HTML brut.

   La valeur après la virgule est un simple filet de sécurité si les styles
   globaux ne sont pas chargés (aperçu isolé, styles globaux désactivés).
   Pour changer une couleur : modifier theme.json, jamais cette liste.
   ------------------------------------------------------------ */
:root{
  --rouge:var(--wp--preset--color--rouge,#8B1A42);
  --rouge-fonce:var(--wp--preset--color--rouge-fonce,#6d1434);
  --rose-clair:var(--wp--preset--color--rose-clair,#e9b8cb);
  --rose-pale:var(--wp--preset--color--rose-pale,#f0d4de);
  --noir:var(--wp--preset--color--noir,#1d1d1b);
  --gris-fonce:var(--wp--preset--color--gris-fonce,#262624);
  --gris:var(--wp--preset--color--gris,#4c4a46);
  /* Ce gris sert aux mentions secondaires (dates, notes). L'ancienne valeur
     #8f8b84 ne ressortait pas assez : 3,4 pour 1 sur blanc, en deçà du seuil
     de 4,5 exigé pour un texte de cette taille. La teinte retenue tient aussi
     sur le fond crème des encadrés, un peu plus sombre que le blanc. */
  --gris-clair:var(--wp--preset--color--gris-clair,#706c66);
  /* Sur fond sombre, le même gris devient au contraire trop foncé : cette
     variante y prend le relais. */
  --gris-sur-sombre:#a8a49c;
  --creme:var(--wp--preset--color--creme,#f6f4f1);
  --bordure:var(--wp--preset--color--bordure,#eae6e0);
  --blanc:var(--wp--preset--color--blanc,#ffffff);
  --condensed:var(--wp--preset--font-family--barlow-condensed,'Barlow Condensed',sans-serif);
  --corps:var(--wp--preset--font-family--barlow,'Barlow',sans-serif);
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
/* L'en-tête est collant : sans cette marge, une cible d'ancre (#cotisations,
   #infos, #preinscription…) se retrouve cachée dessous à l'arrivée. */
main [id]{scroll-margin-top:clamp(88px,11vw,104px)}
html,body{margin:0;padding:0}
body{font-family:var(--corps);color:var(--noir);background:#fff;-webkit-font-smoothing:antialiased;min-width:320px;overflow-x:clip}
a{color:var(--rouge);text-decoration:none}
a:hover{color:var(--rouge-fonce)}
img{max-width:100%}
h1,h2,h3{font-family:var(--condensed);text-transform:uppercase;line-height:1.05;margin:0}
p,ul{margin:0}
.container{max-width:1240px;margin:0 auto;padding-left:20px;padding-right:20px}

/* ---------- Sections & fonds ---------- */
.section{padding:clamp(56px,8vw,104px) 0}
.section--sm{padding:clamp(44px,6vw,80px) 0}
.bg-creme{background:var(--creme)}
.bg-noir{background:var(--noir);color:#fff}
.bg-rouge{background:var(--rouge);color:#fff}
.kicker{font-weight:700;font-size:13px;letter-spacing:2.5px;text-transform:uppercase;color:var(--rouge)}
.kicker--light{color:var(--rose-clair)}
.section-head{display:flex;flex-direction:column;gap:12px;max-width:720px;margin-bottom:36px}
/* Variantes d'en-tête de section — remplacent les styles en ligne de la maquette,
   pour que les titres restent éditables dans l'Éditeur de site. */
.section-head--row{max-width:none;flex-direction:row;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:16px}
.section-head-titles{display:flex;flex-direction:column;gap:12px}
.section-head--center{align-items:center;text-align:center;padding:0 20px;gap:10px;max-width:none;margin-bottom:0}
.title{font-weight:700;font-size:clamp(30px,4.5vw,46px)}
.title--sm{font-size:clamp(26px,3.5vw,36px);letter-spacing:1px}
.title--xs{font-size:clamp(24px,3vw,34px)}
.lead--sm{font-size:16px}
/* Variantes de conteneur — remplacent des largeurs posées en style en ligne. */
.container--histoire{max-width:940px}
.cta-inner--narrow{max-width:680px}
.cta-inner--fb{max-width:640px;gap:14px}
/* Section « Un club affilié » : texte à gauche, logos à droite. */
.affil-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:32px}
.affil-text{flex:1 1 360px;display:flex;flex-direction:column;gap:12px}
.lead{font-size:17px;line-height:1.65;color:var(--gris);text-wrap:pretty}
.bg-noir .lead{color:#c9c6c0}
.bg-rouge .lead{color:var(--rose-pale)}
.note{font-size:14px;color:var(--gris-clair);text-wrap:pretty}

/* ---------- Boutons ---------- */
.btn{display:inline-block;font-family:var(--condensed);font-weight:700;letter-spacing:1.2px;text-transform:uppercase;border-radius:8px;padding:14px 32px;font-size:20px;cursor:pointer;border:none;text-align:center}
.btn--primary{background:var(--rouge);color:#fff}
.btn--primary:hover{background:var(--rouge-fonce);color:#fff}
.btn--white{background:#fff;color:var(--rouge)}
.btn--white:hover{background:var(--rose-pale);color:var(--rouge-fonce)}
.btn--dark{background:var(--noir);color:#fff}
.btn--dark:hover{background:var(--rouge);color:#fff}
/* Bouton Facebook aux couleurs de la marque : un lien vers un réseau se
   reconnaît plus vite à son logo qu'à son nom. Le <a> occupe déjà toute la
   surface du bouton (voir « .btn > a ») : c'est donc lui qui aligne le logo
   et le libellé, sans quoi l'icône se placerait hors de la zone cliquable. */
/* Le bleu officiel de Facebook (#1877F2) ne contraste qu'à 4,2 pour 1 avec du
   texte blanc, sous le seuil de 4,5. Un ton à peine plus profond le porte à
   5,2 sans que le bouton cesse d'être identifiable au premier coup d'œil. */
.btn--facebook{background:#1568D9;color:#fff}
.btn--facebook:hover{background:#125CC0;color:#fff}
/* « .btn.btn--facebook » et non « .btn--facebook » : la règle « .btn > a »,
   déclarée plus bas, impose display:block et l'emporterait à spécificité
   égale — le pseudo-élément resterait alors en ligne, donc sans dimensions. */
.btn.btn--facebook > a{display:flex;align-items:center;justify-content:center;gap:10px}
/* Le logo est posé en CSS et non dans le HTML : WordPress supprime les <svg>
   du contenu d'un paragraphe piloté par une liaison. Purement décoratif, il
   n'a de toute façon rien à annoncer aux lecteurs d'écran. */
.btn.btn--facebook > a::before{content:"";display:inline-block;flex:none;width:1.05em;height:1.05em;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M15.12 5.32H17V2.14A26.11 26.11 0 0 0 14.26 2C11.54 2 9.68 3.66 9.68 6.7v2.62H6.61v3.56h3.07V22h3.68v-9.12h3.06l.46-3.56h-3.52V7.05c0-1.03.29-1.73 1.76-1.73Z'/%3E%3C/svg%3E") center/contain no-repeat}
.btn--outline-dark{background:none;border:2px solid var(--noir);color:var(--noir);padding:12px 32px}
.btn--outline-dark:hover{border-color:var(--rouge);color:var(--rouge)}
.btn--outline-light{background:none;border:2px solid rgba(255,255,255,.6);color:#fff;padding:12px 32px}
.btn--outline-light:hover{border-color:#fff;color:#fff}
.btn--outline-grey{background:none;border:2px solid #d8d3cc;color:var(--gris);padding:12px 26px;font-size:18px}
.btn--outline-grey:hover{border-color:var(--rouge);color:var(--rouge)}
.btn--sm{font-size:18px;letter-spacing:1.2px;padding:12px 26px}
.btn-row{display:flex;flex-wrap:wrap;gap:14px}
.btn-row--center{justify-content:center}
.btn-row--spaced{margin-top:8px}
.btn-row--after{margin-top:28px}
.link-more{font-weight:700;font-size:15px;white-space:nowrap}
/* Un bouton peut être un <a> nu (maquette d'origine) ou un <p class="btn"> qui
   enveloppe un lien (blocs éditables) : dans les deux cas le lien prend la
   couleur du bouton et occupe toute sa surface cliquable. */
.btn > a{color:inherit;text-decoration:none;display:block;margin:-14px -32px;padding:14px 32px}
.btn--sm > a,.btn--outline-dark > a,.btn--outline-light > a,.btn--outline-grey > a{margin:-12px -26px;padding:12px 26px}
p.btn{margin:0}
.link-more > a{color:inherit;text-decoration:none}

/* ---------- En-tête ---------- */
/* En-tête collant.

   Le sticky est posé sur l'ENVELOPPE (le <header> du bloc Élément de modèle),
   pas sur .site-header : un élément collant ne se déplace qu'à l'intérieur de
   son parent, et l'enveloppe fait exactement la hauteur de l'en-tête. Posé sur
   .site-header, le sticky n'avait donc aucune marge de manœuvre et l'en-tête
   partait avec la page.

   Pas de backdrop-filter non plus, malgré la tentation : il crée un bloc
   conteneur pour les éléments en position:fixed, ce qui enfermerait le panneau
   du menu mobile dans l'en-tête au lieu de le laisser couvrir l'écran. */
header.wp-block-template-part{position:sticky;top:0;z-index:60}
.site-header{background:rgba(255,255,255,.96);border-bottom:1px solid var(--bordure)}
/* La barre d'administration est fixe au-dessus de 782px : l'en-tête doit se
   coller dessous, pas dessous elle. En deçà, elle défile avec la page. */
.admin-bar header.wp-block-template-part{top:32px}
@media screen and (max-width:782px){
  .admin-bar header.wp-block-template-part{top:0}
}
.header-inner{display:flex;align-items:center;justify-content:space-between;gap:24px;padding-top:10px;padding-bottom:10px}
.brand{display:flex;align-items:center;gap:12px;flex-shrink:0}
.brand img{height:58px;width:58px;object-fit:contain;display:block}
.brand-text{display:flex;flex-direction:column;line-height:1.05}
.brand-name{font-family:var(--condensed);font-weight:800;font-size:22px;letter-spacing:.5px;color:var(--noir)}
.brand-sub{font-size:11px;font-weight:600;letter-spacing:1.2px;text-transform:uppercase;color:var(--rouge)}
/* ---------- Navigation ----------
   Le bloc Navigation de WordPress remplace les liens écrits en dur : le menu se
   gère depuis Apparence → Éditeur → Navigation. Son balisage est un <nav><ul><li><a>,
   d'où ces sélecteurs — la maquette visait « .nav-desktop > a », qui ne
   correspond plus à rien. */
.nav-desktop .wp-block-navigation__container{gap:26px;align-items:center}
.nav-desktop .wp-block-navigation-item__content{font-weight:600;font-size:15px;color:var(--noir);letter-spacing:.2px;white-space:nowrap;text-decoration:none}
.nav-desktop .wp-block-navigation-item__content:hover{color:var(--rouge)}
/* Page courante : WordPress pose lui-même la classe, plus besoin de JavaScript. */
.nav-desktop .current-menu-item > .wp-block-navigation-item__content{color:var(--rouge);font-weight:700}

/* « Adhérer » est une entrée de menu comme les autres — donc gérable depuis
   l'admin — mais habillée en bouton grâce à sa classe. Elle rejoint ainsi le
   panneau mobile au lieu d'encombrer l'en-tête, où le burger et elle ne
   tenaient pas ensemble sur un écran de téléphone. */
.nav-desktop .nav-cta > .wp-block-navigation-item__content{
  background:var(--rouge);color:#fff;font-family:var(--condensed);font-weight:700;
  text-transform:uppercase;font-size:17px;letter-spacing:1px;padding:10px 22px;border-radius:6px;
}
.nav-desktop .nav-cta > .wp-block-navigation-item__content:hover{background:var(--rouge-fonce);color:#fff}
.nav-desktop .current-menu-item.nav-cta > .wp-block-navigation-item__content{color:#fff}

/* Burger et panneau mobile — habillés aux couleurs du club. */
.nav-desktop .wp-block-navigation__responsive-container-open,
.nav-desktop .wp-block-navigation__responsive-container-close{color:var(--noir)}
.nav-desktop .wp-block-navigation__responsive-container-open{border:1px solid #e0dbd4;border-radius:8px;padding:10px 12px}
.nav-desktop .wp-block-navigation__responsive-container.is-menu-open{background:#fff;padding:clamp(24px,6vw,48px) 20px}
/* Le menu desktop est aligné à droite, et WordPress propage cet alignement dans
   le panneau : la liste s'y rétrécissait à la largeur du texte, calée contre le
   bord droit. Dans le panneau, les entrées doivent occuper toute la largeur. */
.nav-desktop .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{
  align-items:stretch;width:100%;
}
.nav-desktop .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container{
  gap:2px;align-items:stretch;justify-content:flex-start;width:100%;
}
.nav-desktop .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item{align-items:stretch}
.nav-desktop .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content{font-size:22px;padding:12px 4px;border-bottom:1px solid #f2efe9;width:100%}
/* Dans le panneau mobile, « Adhérer » redevient un vrai bouton pleine largeur. */
.nav-desktop .wp-block-navigation__responsive-container.is-menu-open .nav-cta{width:100%;margin-top:12px}
.nav-desktop .wp-block-navigation__responsive-container.is-menu-open .nav-cta > .wp-block-navigation-item__content{
  border-bottom:none;justify-content:center;text-align:center;padding:14px;font-size:19px;
}

/* ---------- Logo d'accueil ----------
   Grand logo centré sous le menu, pour marquer l'arrivée sur le site. Double
   volontairement celui de l'en-tête, mais bien plus visible. Réservé au desktop :
   sur mobile, où l'écran est court, il repousserait le contenu sous la ligne de
   flottaison — et le logo de l'en-tête suffit. */
.home-logo{text-align:center;padding:clamp(24px,3vw,40px) 20px 0}
.home-logo .home-logo-img{margin:0}
.home-logo .home-logo-img img{width:clamp(144px,15vw,210px);height:auto}
@media(max-width:900px){
  .home-logo{display:none}
}

/* ---------- Héros accueil ---------- */
.hero{text-align:center;padding-top:clamp(32px,4vw,48px)}
.hero-inner{max-width:880px;margin:0 auto;display:flex;flex-direction:column;align-items:center;gap:22px;padding:0 20px}
.hero h1{font-weight:800;font-size:clamp(42px,8vw,84px);line-height:.98;letter-spacing:.5px;text-wrap:balance}
.hero h1 span{color:var(--rouge)}
.hero .lead{max-width:640px;font-size:clamp(16px,2vw,19px);line-height:1.6}
.frise{display:block;width:100%;margin:clamp(28px,5vw,56px) 0 -2px}

/* ---------- Héros de page intérieure ---------- */
.page-hero{padding-top:clamp(48px,7vw,92px)}
.page-hero .container{display:flex;flex-direction:column;gap:14px}
.page-hero h1{font-weight:800;font-size:clamp(38px,6.5vw,72px);line-height:1;text-wrap:balance}
.page-hero .lead{max-width:700px;font-size:clamp(16px,2vw,19px);line-height:1.6}
/* Indicateur de défilement (rendu en PHP, voir cap03_hero_scroll_cue).
   Trois chevrons toujours visibles, parcourus par une onde de lumière : le
   repère reste lisible même animation coupée. Masqué en mobile. */
.hero-cue{display:flex;flex-direction:column;align-items:center;
  margin:clamp(16px,2.6vw,28px) auto 0;padding:6px 10px;
  background:none;border:none;color:inherit;cursor:pointer}
.hero-cue svg{display:block;margin-top:-7px;opacity:.3;animation:cap03-cue 2.1s ease-in-out infinite}
.hero-cue svg:nth-of-type(2){animation-delay:.27s}
.hero-cue svg:nth-of-type(3){animation-delay:.54s}
.hero-cue:hover svg{opacity:.85}
.hero-cue:focus-visible{outline:2px solid currentColor;outline-offset:3px;border-radius:8px}
@keyframes cap03-cue{0%,100%{opacity:.3}45%{opacity:1}}
@media(max-width:767px){.hero-cue{display:none}}
@media(prefers-reduced-motion:reduce){.hero-cue svg{animation:none;opacity:.8}}
.frise-neg{display:block;width:100%;margin:clamp(24px,4vw,44px) 0 -2px;filter:brightness(0) invert(1);opacity:.16}
.bg-rouge .frise-neg{opacity:.18}
.badge-pill{border:1px solid rgba(255,255,255,.5);border-radius:99px;padding:4px 12px;font-size:12px;font-weight:600;letter-spacing:1px;text-transform:uppercase}
.hero-badges{display:flex;align-items:center;gap:12px;flex-wrap:wrap}

/* ---------- Bandeau prochain rendez-vous ---------- */
.band{padding:18px 0}
.band .container{display:flex;flex-wrap:wrap;align-items:center;gap:10px 28px}
.band-label{font-family:var(--condensed);font-weight:700;font-size:15px;letter-spacing:2.5px;text-transform:uppercase;color:var(--rose-clair)}
.band-title{font-family:var(--condensed);font-weight:700;font-size:clamp(19px,2.4vw,24px);letter-spacing:.5px;text-transform:uppercase}
.band-sub{font-size:15px;color:var(--rose-pale)}
.band-link{margin-left:auto;color:#fff;font-weight:700;font-size:15px;border-bottom:2px solid rgba(255,255,255,.4)}
.band-link:hover{color:#fff;border-bottom-color:#fff}

/* ---------- Mises en page 2 colonnes ---------- */
.split{display:flex;flex-wrap:wrap;align-items:center;gap:48px}
.split--reverse{flex-wrap:wrap-reverse}
.split-text{flex:1 1 440px;display:flex;flex-direction:column;gap:18px}
.split-media{flex:1 1 380px}
.check-list{list-style:none;padding:0;display:flex;flex-direction:column;gap:10px}
.check-list li{display:flex;align-items:baseline;gap:10px;font-size:16px;line-height:1.5}
.check-list li::before{content:"›";color:var(--rouge);font-weight:700}
.bg-rouge .check-list li::before,.bg-noir .check-list li::before{color:var(--rose-clair)}

/* ---------- Emplacements photos / logos ---------- */
.placeholder{display:flex;align-items:center;justify-content:center;text-align:center;background:repeating-linear-gradient(45deg,#f1ede8,#f1ede8 12px,#f6f4f1 12px,#f6f4f1 24px);border:2px dashed #d8d3cc;border-radius:16px;color:var(--gris-clair);font-size:14px;font-weight:600;padding:16px;min-height:120px}
.bg-noir .placeholder,.bg-rouge .placeholder{background:repeating-linear-gradient(45deg,rgba(255,255,255,.06),rgba(255,255,255,.06) 12px,rgba(255,255,255,.12) 12px,rgba(255,255,255,.12) 24px);border-color:rgba(255,255,255,.35);color:rgba(255,255,255,.75)}
.placeholder--photo{height:380px}
.placeholder--wide{height:340px}
.placeholder--card{height:190px;border-radius:0;border-width:0 0 2px}
.placeholder--logo{width:190px;height:96px;border-radius:10px;flex-shrink:0}
.placeholder--fill{width:100%;height:100%;min-height:220px}
/* Photos pilotées (bloc cap03/photo) : reprennent le cadre des anciens placeholders
   — angles arrondis + image en « cover » (ratio préservé, pas de déformation). */
.cap03-photo{margin:0;border-radius:16px;overflow:hidden;line-height:0}
.cap03-photo img{display:block;width:100%;height:100%;object-fit:cover}
.split-media .cap03-photo{height:380px}
.cap03-photo.contact-map{height:100%;min-height:260px}
/* Galerie en mosaïque (bloc cap03/galerie) — tuiles de tailles variées, recadrées. */
.cap03-galerie{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));grid-auto-rows:200px;grid-auto-flow:dense;gap:14px}
.cap03-galerie__item{position:relative;display:block;overflow:hidden;border-radius:12px;background:#f1ede8;cursor:zoom-in;line-height:0}
.cap03-galerie__item img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .45s ease}
.cap03-galerie__item:hover img,.cap03-galerie__item:focus-visible img{transform:scale(1.05)}
.cap03-galerie__item:focus-visible{outline:3px solid var(--rouge);outline-offset:2px}
.cap03-galerie__item--wide{grid-column:span 2}
.cap03-galerie__item--tall{grid-row:span 2}
.cap03-galerie__item--big{grid-column:span 2;grid-row:span 2}
.cap03-galerie--apercu .cap03-galerie__item{cursor:pointer}
@media(max-width:560px){
  .cap03-galerie{grid-template-columns:repeat(2,1fr);grid-auto-rows:150px}
  .cap03-galerie__item--wide,.cap03-galerie__item--big{grid-column:auto}
  .cap03-galerie__item--tall,.cap03-galerie__item--big{grid-row:auto}
}
/* Visionneuse plein écran */
.cap03-lightbox{position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;background:rgba(18,13,10,.93);padding:clamp(12px,4vw,40px)}
.cap03-lightbox.is-open{display:flex}
.cap03-lightbox__img{max-width:min(1200px,92vw);max-height:86vh;width:auto;height:auto;object-fit:contain;border-radius:8px;box-shadow:0 24px 70px rgba(0,0,0,.55)}
.cap03-lightbox__btn,.cap03-lightbox__close{position:absolute;display:grid;place-items:center;border:none;background:rgba(255,255,255,.12);color:#fff;cursor:pointer;border-radius:50%;transition:background .2s}
.cap03-lightbox__btn:hover,.cap03-lightbox__close:hover{background:rgba(255,255,255,.25)}
.cap03-lightbox__btn{top:50%;transform:translateY(-50%);width:56px;height:56px;font-size:34px;line-height:1}
.cap03-lightbox__btn--prev{left:clamp(8px,3vw,32px)}
.cap03-lightbox__btn--next{right:clamp(8px,3vw,32px)}
.cap03-lightbox__close{top:clamp(10px,3vw,24px);right:clamp(10px,3vw,24px);width:46px;height:46px;font-size:30px;line-height:1}
.cap03-lightbox__counter{position:absolute;bottom:clamp(12px,3vw,28px);left:0;right:0;text-align:center;color:rgba(255,255,255,.85);font-weight:600;font-size:15px;letter-spacing:.03em;margin:0}
@media(max-width:560px){.cap03-lightbox__btn{width:46px;height:46px;font-size:28px}}
@media(prefers-reduced-motion:reduce){.cap03-galerie__item img{transition:none}}

/* ---------- Grilles de cartes ---------- */
.grid{display:grid;gap:18px}
/* Activités : la grille tenait 6 colonnes, taillée pour les 6 activités
   d'origine. À 7, la dernière se retrouvait seule sur une deuxième ligne ;
   et tout faire tenir sur une ligne donnait des cartes de 158px pour 485px
   de haut. Des colonnes plus larges (4 par ligne) rendent les cartes bien
   plus lisibles et absorbent les activités à venir sans orpheline. */
.grid--activites{grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px}
.grid--3{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
.grid--cards{grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:20px}
.grid--fill{grid-template-columns:repeat(auto-fill,minmax(220px,1fr))}
/* Annonceurs : 4 colonnes en desktop (au lieu de ~5) pour des logos plus grands. */
@media(min-width:900px){.grid--fill{grid-template-columns:repeat(4,1fr)}}
.grid--team{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:20px}
.grid--bureau{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:16px}
/* Desktop : tout le bureau (6) sur une seule ligne. En dessous de 1100px, la
   grille se réenroule d'elle-même. (L'équivalent pour les commissions est placé
   après leur règle de base, sinon celle-ci — plus bas dans le fichier —
   l'emporterait par l'ordre source.) */
@media(min-width:1100px){
  .grid--bureau{grid-template-columns:repeat(6,1fr)}
}
.card{background:#fff;border:1px solid var(--bordure);border-radius:12px;transition:box-shadow .2s,transform .2s}
.card:hover{box-shadow:0 10px 28px rgba(29,29,27,.10)}
/* Survol : la carte se soulève ET s'agrandit légèrement. Le zoom reste discret
   (3 %) — au-delà, le texte devient flou sur les écrans non-Retina. */
.card--lift:hover{transform:translateY(-3px) scale(1.03)}
.activity-card{padding:26px 20px 22px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px}
.activity-card img{height:86px;width:auto;max-width:120px;object-fit:contain}
.activity-card h3{font-size:22px;letter-spacing:.5px}
.activity-card p{font-size:14px;line-height:1.5;color:#6b6862}

/* ---------- Chiffres clés ---------- */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:14px;margin-top:10px}
.stat{background:#fff;border:1px solid var(--bordure);border-radius:10px;padding:18px 16px;display:flex;flex-direction:column;gap:4px}
.stat b{font-family:var(--condensed);font-weight:800;font-size:34px;line-height:1;color:var(--rouge)}
.stat span{font-size:13px;line-height:1.35;color:#6b6862}
.stats-band{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:28px;text-align:center}
.stats-band .stat-big b{display:block;font-family:var(--condensed);font-weight:800;font-size:clamp(40px,6vw,58px);line-height:1}
.stats-band .stat-big span{font-size:14px;line-height:1.4;color:var(--rose-pale)}

/* ---------- Cartes actualités / événements ---------- */
.news-card{overflow:hidden;display:flex;flex-direction:column}
.news-body{padding:20px 22px 24px;display:flex;flex-direction:column;gap:10px;flex:1}
.news-meta{display:flex;align-items:center;justify-content:space-between;gap:10px}
/* La pastille (bloc post-terms) est un conteneur qui s'étirerait sur toute la
   largeur : on le contient à son texte, sinon le fond rose prend toute la ligne
   au lieu de rester une pastille. La date reste à droite. */
.badge-cat{align-self:center;background:#f5e3ea;color:var(--rouge);font-size:12px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:4px 10px;border-radius:99px}
.news-date{font-size:13px;color:var(--gris-clair);white-space:nowrap;margin:0}
.news-card h3{font-size:24px;line-height:1.1;text-wrap:balance}
.news-card .news-body p{font-size:14.5px;line-height:1.55;color:#6b6862;flex:1}
.news-card .link-more{font-size:14px}
.event-card{background:var(--gris-fonce);border:1px solid #3a3a37;border-radius:12px;overflow:hidden;display:flex;flex-direction:column}
.event-card .placeholder--card{height:180px}
.event-body{padding:22px;display:flex;flex-direction:column;gap:10px;flex:1}
.event-periode{font-size:12px;font-weight:700;letter-spacing:1.5px;text-transform:uppercase;color:var(--rose-clair)}
.event-card h3{font-size:26px;color:#fff}
.event-card p{font-size:14.5px;line-height:1.55;color:#b8b5af;flex:1}
.event-card .link-more{color:#fff;font-size:14px}
.event-card .link-more:hover{color:var(--rose-clair)}

/* ---------- Grandes cartes événement (page Événements) ---------- */
.event-row{border:1px solid var(--bordure);border-radius:16px;overflow:hidden;display:flex;flex-wrap:wrap;background:#fff}
.event-row-media{flex:1 1 320px;min-height:260px;position:relative}
.event-row-media .placeholder{width:100%;height:100%;min-height:260px;border-radius:0;border-width:0 2px 0 0}
.event-row-body{flex:2 1 380px;padding:clamp(24px,3vw,36px);display:flex;flex-direction:column;gap:12px}
.badge-annule{position:absolute;top:14px;left:14px;background:var(--noir);color:#fff;font-size:12px;font-weight:700;letter-spacing:1px;text-transform:uppercase;padding:6px 12px;border-radius:99px}
.badge-periode{background:var(--rouge);color:#fff;font-size:12px;font-weight:700;letter-spacing:1px;text-transform:uppercase;padding:5px 12px;border-radius:99px}
.event-row h2{font-weight:800;font-size:clamp(26px,3.5vw,40px);line-height:1}
.event-row .lead{font-size:16px}
.tag{border:1px solid #ddd6ce;border-radius:99px;padding:5px 12px;font-size:13px;font-weight:600;color:var(--gris)}
.tag-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:2px}

/* ---------- Chips / filtres ---------- */
.chips-bar{padding:22px 0;border-bottom:1px solid var(--bordure)}
.chips{display:flex;flex-wrap:wrap;gap:10px;justify-content:center}
.chip{border:1px solid #ddd6ce;background:#fff;border-radius:99px;padding:8px 18px;font-family:var(--corps);font-weight:600;font-size:14px;color:var(--noir);cursor:pointer;white-space:nowrap}
.chip:hover{border-color:var(--rouge);color:var(--rouge)}
.chip.active{background:var(--rouge);border-color:var(--rouge);color:#fff}

/* ---------- Frise chronologique (Le Club) ---------- */
.timeline{display:flex;flex-direction:column}
.timeline-item{display:flex;gap:22px}
.timeline-marker{display:flex;flex-direction:column;align-items:center;flex-shrink:0}
.timeline-year{font-family:var(--condensed);font-weight:800;font-size:22px;color:var(--rouge);width:64px;text-align:center;margin:0}
/* Le trait vertical est un pseudo-élément : c'est une décoration, elle n'a pas à
   exister comme bloc éditable dans l'Éditeur de site. Le dernier repère n'en a
   pas — la frise ne doit pas se prolonger dans le vide. */
.timeline-marker::after{content:"";width:2px;flex:1;background:#e0d7d0;min-height:20px}
.timeline-item--last .timeline-marker::after{display:none}
.timeline-line{width:2px;flex:1;background:#e0d7d0;min-height:20px}
.timeline-content{padding-bottom:28px}
.timeline-content h3{font-size:22px;margin-bottom:6px}
.timeline-content p{font-size:16px;line-height:1.6;color:var(--gris)}

/* ---------- Cartes valeurs / infos / étapes / commissions ---------- */
.info-card{padding:26px 22px;display:flex;flex-direction:column;gap:10px}
.info-card img{height:56px;width:auto;max-width:70px;object-fit:contain;align-self:flex-start}
/* Le bloc Image entoure le picto d'un <figure> : il devient l'élément flex, et
   c'est lui qui doit s'aligner à gauche et ne pas s'étirer. */
.info-card > figure.wp-block-image{margin:0;align-self:flex-start}
.info-card h3{font-size:22px}
.info-card p{font-size:15px;line-height:1.55;color:#6b6862}
.info-card .referent{font-size:13.5px;color:var(--gris-clair)}
.info-card .referent b{color:var(--gris);font-weight:600}
/* Le numéro d'étape et le corps de carte sont des <p> depuis la conversion en
   blocs. Ils doivent donc être plus spécifiques que « .info-card p », qui les
   écraserait — la maquette s'en sortait avec un <span>, hors de portée de cette
   règle. */
.info-card .step-num{font-family:var(--condensed);font-weight:800;font-size:44px;line-height:1;color:var(--rouge);margin:0}
.info-card .info-text{font-size:15.5px;color:var(--gris)}
.info-card .info-title{font-size:21px}
/* Picto plus discret sur les cartes « infos pratiques ». */
.info-card .info-picto img{height:48px;max-width:60px}
.note--spaced{margin-top:24px}
.lead--narrow{max-width:560px;font-size:16px}
.container--form{max-width:800px}
.card-head-row{display:flex;align-items:center;gap:12px}
.card-head-row img{height:44px;width:auto;max-width:56px;object-fit:contain}
/* Le bloc Image enveloppe le picto d'un <figure> : c'est lui l'élément flex. */
.card-head-row > figure.wp-block-image{margin:0;flex-shrink:0}
.grid--commissions{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}
/* Desktop : les 5 commissions sur une seule ligne. */
@media(min-width:1100px){
  .grid--commissions{grid-template-columns:repeat(5,1fr)}
}
.info-card--commission{padding:24px 22px}
/* Infos pratiques : le tableau des créneaux prend deux tiers, la carte
   Tarif un tiers. En dessous de 900px tout s'empile. */
.grid--infos{grid-template-columns:1fr}
@media(min-width:900px){.grid--infos{grid-template-columns:2fr 1fr}}
/* Tableau des créneaux (bloc cap03/planning) */
.planning-card{gap:14px}
.planning{width:100%;border-collapse:collapse;font-size:15.5px}
.planning thead th{font-family:var(--condensed);font-size:12px;font-weight:700;letter-spacing:1.6px;
  text-transform:uppercase;color:var(--gris-clair);text-align:left;padding:0 14px 8px 0;
  border-bottom:1px solid var(--bordure);white-space:nowrap}
.planning thead th:last-child{padding-right:0}
.planning tbody th,.planning tbody td{padding:12px 14px 12px 0;border-bottom:1px solid var(--bordure);
  vertical-align:baseline;text-align:left}
.planning tbody td:last-child,.planning tbody th:last-child{padding-right:0}
.planning tbody tr:last-child th,.planning tbody tr:last-child td{border-bottom:0;padding-bottom:0}
.planning tbody th{font-family:var(--condensed);font-weight:700;font-size:19px;color:var(--noir);
  white-space:nowrap}
/* Largeurs explicites : sans elles, la colonne Lieu absorbe tout l'espace
   restant et l'écart entre les colonnes devient irrégulier. */
.planning thead th:first-child,.planning tbody th{width:18%}
.planning thead th:nth-child(2),.planning tbody td:nth-child(2){width:30%}
.planning tbody td{color:var(--gris)}
.planning tbody td:nth-child(2){font-weight:600;color:var(--noir);white-space:nowrap}
.info-card .planning-note{margin:0;font-size:13.5px;color:var(--gris-clair)}
/* En petit écran, un tableau à trois colonnes se comprime : chaque créneau
   devient un bloc et les cellules portent leur libellé de colonne. */
@media(max-width:560px){
  .planning thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .planning,.planning tbody,.planning tr,.planning th,.planning td{display:block;width:auto}
  .planning tbody tr{padding:12px 0;border-bottom:1px solid var(--bordure)}
  .planning tbody tr:last-child{border-bottom:0;padding-bottom:0}
  .planning tbody th,.planning tbody td{border:0;padding:0}
  .planning tbody th{font-size:20px;margin-bottom:4px}
  .planning tbody td{display:flex;gap:8px;padding:2px 0}
  .planning tbody td::before{content:attr(data-col) " :";flex:none;min-width:64px;
    font-size:12px;font-weight:700;letter-spacing:1.2px;text-transform:uppercase;
    color:var(--gris-clair);line-height:1.7}
}
/* Carte entièrement cliquable. Le libellé reste un vrai lien (clavier et
   lecteurs d'écran) ; son ::after s'étend sur la carte pour capter le clic,
   ce qui évite d'imbriquer toute la carte dans un <a>.
   Les sélecteurs sont préfixés par .info-card : « .info-card p » (0,1,1)
   l'emporterait sinon sur une classe seule (0,1,0) et repeindrait le lien. */
.info-card--lien{position:relative}
.info-card--lien:hover{transform:translateY(-3px);box-shadow:0 12px 28px rgba(29,29,27,.10);border-color:var(--rouge)}
.info-card--lien:focus-within{outline:2px solid var(--rouge);outline-offset:3px}
.info-card .info-lien{margin-top:auto;padding-top:4px;font-size:14.5px;font-weight:700;color:var(--rouge)}
.info-card .info-lien a{color:inherit;text-decoration:none}
.info-card .info-lien a::after{content:"";position:absolute;inset:0;border-radius:12px}
.info-card--lien:hover .info-lien a{text-decoration:underline}
/* Membres d'une commission : la boucle de requête liste ses résultats. Les noms
   étant longs et en majuscules, une liste verticale (un nom par ligne) reste
   plus lisible dans une carte étroite qu'une énumération en ligne. Les noms sont
   stockés en majuscules (pas d'accent à gérer). */
.commission-members{display:flex;flex-direction:column;gap:2px}
.commission-members .wp-block-post-title{margin:0;font-family:var(--corps);font-weight:600;font-size:14px;letter-spacing:.3px;line-height:1.5;text-transform:none;color:var(--gris)}

/* ---------- Tranches d'âge ---------- */
.age-card{background:#fff;border:1px solid var(--bordure);border-radius:14px;overflow:hidden;display:flex;flex-direction:column}
.age-head{background:var(--rouge);color:#fff;padding:18px 22px;display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.age-head b{font-family:var(--condensed);font-weight:800;font-size:26px;text-transform:uppercase}
.age-head span{font-family:var(--condensed);font-weight:700;font-size:20px;color:var(--rose-pale)}
.age-card p{padding:20px 22px 24px;font-size:15px;line-height:1.55;color:var(--gris)}
/* .age-head est un <p> depuis la conversion : il tomberait sous « .age-card p »,
   qui lui collerait le rembourrage et la couleur du corps de carte. */
.age-card .age-head{padding:18px 22px;margin:0;color:#fff}
.age-card .age-text{padding:20px 22px 24px;margin:0}

/* ---------- Trombinoscope ---------- */
.team-card{display:flex;flex-direction:column;gap:12px}
.team-card .placeholder{height:220px;border-radius:14px}
.team-card--bureau .placeholder{height:260px}
.team-role{font-family:var(--condensed);font-weight:700;font-size:13px;letter-spacing:1.5px;text-transform:uppercase;color:var(--rouge)}
.bg-noir .team-role{color:var(--rose-clair)}
.team-name{font-family:var(--condensed);font-weight:700;font-size:23px;text-transform:uppercase}
.team-sub{font-size:14px;color:var(--rose-clair)}

/* ---------- Agenda ---------- */
.agenda-list{display:flex;flex-direction:column;gap:14px}
.agenda-row{background:#fff;border:1px solid var(--bordure);border-radius:12px;padding:20px 22px;display:flex;flex-wrap:wrap;align-items:center;gap:16px 22px}
.date-box{display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--rouge);color:#fff;border-radius:10px;padding:10px 16px;min-width:78px}
.date-box b{font-family:var(--condensed);font-weight:800;font-size:26px;line-height:1}
.date-box span{font-size:12px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--rose-pale)}
.agenda-info{flex:1 1 260px;display:flex;flex-direction:column;gap:3px}
.agenda-info h3{font-size:22px}
.agenda-info p{font-size:14.5px;color:#6b6862}
.agenda-type{border:1px solid #ddd6ce;border-radius:99px;padding:6px 14px;font-size:13px;font-weight:600;color:var(--gris);white-space:nowrap}

/* ---------- Entraînements ---------- */
.train-card{border:1px solid var(--bordure);border-radius:14px;overflow:hidden;display:flex;flex-direction:column;background:#fff}
.train-head{background:var(--rouge);color:#fff;padding:16px 22px;display:flex;align-items:center;gap:12px}
.train-head img{height:40px;width:auto;max-width:50px;object-fit:contain;filter:brightness(0) invert(1)}
.train-head b{font-family:var(--condensed);font-weight:800;font-size:22px;text-transform:uppercase}
/* Le picto est enveloppé d'un <figure> par le bloc Image, et le titre d'un <p>
   par le bloc Paragraphe : ce sont eux, désormais, les éléments flex. */
.train-head > figure.wp-block-image{margin:0;flex-shrink:0}
.train-head .train-title{margin:0}
.train-body{padding:20px 22px 24px;display:flex;flex-direction:column;gap:8px;flex:1}
/* Le contenu de la carte tient désormais dans un seul paragraphe multiligne
   (horaire, lieu et précision saisis d'un bloc) : la règle qui mettait le
   premier paragraphe en avant n'a plus d'objet. */
.train-body p{font-size:15.5px;line-height:1.6;color:var(--gris)}

/* ---------- Tarifs ---------- */
.price-card{border-radius:16px;padding:30px 26px;display:flex;flex-direction:column;gap:14px;background:#fff;border:1px solid var(--bordure)}
.price-card--featured{background:var(--rouge);border-color:var(--rouge);color:#fff}
.price-badge{align-self:flex-start;background:#fff;color:var(--rouge);font-size:12px;font-weight:700;letter-spacing:1px;text-transform:uppercase;padding:5px 12px;border-radius:99px}
.price-card h3{font-weight:800;font-size:26px}
.price-amount{display:flex;align-items:baseline;gap:6px}
.price-amount b{font-family:var(--condensed);font-weight:800;font-size:46px;line-height:1;color:var(--rouge)}
.price-card--featured .price-amount b{color:#fff}
.price-amount span{font-size:14px;color:var(--gris-clair)}
.price-card--featured .price-amount span{color:var(--rose-pale)}
.price-list{list-style:none;padding:0;display:flex;flex-direction:column;gap:8px}
.price-list li{display:flex;align-items:baseline;gap:8px;font-size:15px;line-height:1.5;color:var(--gris)}
.price-card--featured .price-list li{color:var(--rose-pale)}
.price-list li::before{content:"✓";color:var(--rouge);font-weight:700}
.price-card--featured .price-list li::before{color:#fff}

/* ---------- Formulaires ---------- */
.form-card{background:#fff;border:1px solid var(--bordure);border-radius:16px;padding:clamp(24px,4vw,36px);display:flex;flex-direction:column;gap:16px}
.form-card--creme{background:var(--creme)}
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}
.field{display:flex;flex-direction:column;gap:6px;font-size:13px;font-weight:600;color:var(--gris)}
.field input,.field select,.field textarea{padding:11px 13px;border:1px solid #d8d3cc;border-radius:8px;outline:none;font-family:var(--corps);font-size:15px;background:#fff}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--rouge)}
.field textarea{resize:vertical}
.form-success{display:none;background:#e8f3ea;border:1px solid #bcdcc2;color:#1e6b34;padding:12px 14px;border-radius:8px;font-size:14.5px}
/* Formulaire non raccordé : le vert « succès » mentirait au visiteur. */
.form-notice--warning{background:#fdf3e3;border-color:#e9cf9c;color:#7a4c05}
.form-notice--warning a{color:inherit;font-weight:700;text-decoration:underline}
.form-card .btn{align-self:flex-start}

/* ---------- Carrousel partenaires ----------
   Défilement piloté en JS (transform), voir assets/js/main.js [data-marquee].
   Logos nus (sans cadre ni fond), cliquables vers le site du partenaire. */
.marquee{overflow:hidden;width:100%}
.marquee-track{display:flex;gap:56px;width:max-content;align-items:center;will-change:transform}
.marquee-logo{flex-shrink:0;display:flex;align-items:center;justify-content:center;height:72px}
.marquee-logo img{max-height:72px;width:auto;object-fit:contain;display:block}
a.marquee-logo{transition:opacity .2s ease}
a.marquee-logo:hover,a.marquee-logo:focus-visible{opacity:.6}

/* ---------- Partenaires / annonceurs ---------- */
.partner-card{border:1px solid var(--bordure);border-radius:16px;overflow:hidden;display:flex;flex-direction:column;background:#fff}
.partner-media{padding:14px;display:flex;align-items:center;justify-content:center;aspect-ratio:3/2}
.partner-media .placeholder{width:100%;height:100%;border-radius:10px}
.partner-body{padding:8px 24px 24px;display:flex;flex-direction:column;gap:8px;flex:1}
.partner-body h3{font-size:23px}
.partner-body p{font-size:15px;line-height:1.6;color:#6b6862;flex:1}
.logo-cell{background:#fff;border:1px solid var(--bordure);border-radius:12px;padding:18px;display:flex;align-items:center;justify-content:center}
.logo-cell .placeholder{width:100%;height:80px;border-radius:8px}
.annonceur-card{border:1px solid var(--bordure);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;background:#fff}
.annonceur-media{padding:10px;display:flex;align-items:center;justify-content:center;aspect-ratio:3/2}
.annonceur-media .placeholder{width:100%;height:100%;border-radius:8px}
.annonceur-body{padding:6px 16px 14px;display:flex;flex-direction:column;gap:2px}
.annonceur-body b{font-family:var(--condensed);font-weight:700;font-size:17px;text-transform:uppercase}
.annonceur-body span{font-size:13px;color:var(--gris-clair)}
.formule{background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.25);border-radius:12px;padding:18px 20px;display:flex;align-items:baseline;justify-content:space-between;gap:12px}
.formule b{font-family:var(--condensed);font-weight:700;font-size:20px;text-transform:uppercase}
.formule span{font-size:14px;color:var(--rose-pale);text-align:right}
/* Section « offre » : argumentaire à gauche, encart à droite (partenaires, annonceurs). */
.offre-row{display:flex;flex-wrap:wrap;align-items:center;gap:40px}
.offre-text{flex:1 1 400px;display:flex;flex-direction:column;gap:16px}
.offre-formules{flex:1 1 280px;display:flex;flex-direction:column;gap:12px}
.title--offre{font-weight:800;font-size:clamp(28px,4vw,46px);line-height:1.02}
.btn-row--tight{margin-top:4px}
.side-card{flex:1 1 300px;display:flex;flex-direction:column;gap:14px;background:var(--gris-fonce);border:1px solid #3a3a37;border-radius:16px;padding:30px}
.side-card h3{font-size:22px}
/* « :not(.btn) » est indispensable : depuis la conversion FSE, les boutons
   sont des <p>. Sans cette exclusion, « .side-card p » (0,1,1) l'emporte sur
   « .btn--primary » (0,1,0) et repeint le libellé en gris — le bouton
   « Nous contacter » des partenaires était illisible pour cette raison. */
.side-card p:not(.btn){font-size:15.5px;line-height:1.6;color:#b8b5af}
.side-card .side-card-title{color:#fff}
/* Ce lien est un <p> depuis la conversion : il doit primer sur « .side-card p ». */
.side-card .side-card-link{text-align:center;margin:0}
.side-card .side-card-link a{color:var(--rose-clair);font-weight:700;font-size:14px}
/* Variante pour un fond rouge : la carte gris foncé y ferait un bloc lourd.
   On reprend le verre dépoli déjà utilisé sur cette section. */
.side-card--clair{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.25)}
/* « :not(.btn) » est indispensable : les boutons sont des <p> depuis la
   conversion FSE, et une règle « .side-card--clair p » les repeindrait en
   rose sur fond blanc — texte illisible. */
.side-card--clair p:not(.btn){color:var(--rose-pale)}
.side-card--clair .side-card-link a{color:#fff}

/* ---------- Galerie ----------
   Le bloc Galerie natif de WordPress remplace la mosaïque figée de la maquette :
   le club ajoute ses photos depuis l'éditeur, sans toucher au code. On lui donne
   le rythme de la maquette (coins arrondis, hauteur régulière). */
.galerie-photos.wp-block-gallery{gap:14px}
.galerie-photos.wp-block-gallery .wp-block-image{border-radius:12px;overflow:hidden}
.galerie-photos.wp-block-gallery .wp-block-image img{border-radius:12px;aspect-ratio:6/5;object-fit:cover;width:100%}
.galerie-note{margin-top:28px}

/* Mosaïque d'origine — conservée pour d'éventuels usages ponctuels. */
.gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));grid-auto-rows:200px;gap:14px}
.gallery-item .placeholder{width:100%;height:100%;border-radius:12px}
.gallery-item--w2{grid-column:span 2}
.gallery-item--h2{grid-row:span 2}
@media(max-width:560px){.gallery-item--w2{grid-column:auto}.gallery-item--h2{grid-row:auto}}

/* ---------- CTA centré ---------- */
.cta{text-align:center}
.cta-inner{max-width:720px;margin:0 auto;display:flex;flex-direction:column;align-items:center;gap:18px}
.cta h2{font-weight:800;font-size:clamp(30px,5.5vw,56px);line-height:1}
/* Titre de la page 404 — un h1, plus mesuré que le h2 d'un CTA. */
.cta .cta-title{font-weight:800;font-size:clamp(38px,6.5vw,72px)}

/* ---------- Coordonnées (contact) ---------- */
.contact-row{display:flex;flex-wrap:wrap;gap:44px}
.contact-col{display:flex;flex-direction:column;gap:20px}
.contact-col--infos{flex:1 1 320px}
.contact-col--form{flex:1 1 420px}
.contact-social{display:flex;gap:12px;margin-top:4px}
.contact-map{margin-top:8px;border-radius:14px}
.coord{display:flex;gap:14px;align-items:flex-start}
.coord img{height:38px;width:auto;max-width:46px;object-fit:contain;flex-shrink:0;margin-top:2px}
/* Le bloc Image entoure le picto d'un <figure>, qui devient l'élément flex. */
.coord > figure.wp-block-image{margin:0;flex-shrink:0}
.coord-body{display:flex;flex-direction:column;gap:0}
/* Ces deux-là sont des <p> depuis la conversion : ils doivent primer sur
   « .coord p », qui les repeindrait en gris. La maquette utilisait un <span>,
   hors de portée de cette règle. */
.coord .coord-label{font-family:var(--condensed);font-weight:700;font-size:15px;letter-spacing:1px;text-transform:uppercase;color:var(--rouge);margin:0}
.coord .coord-value{margin:0}
.coord a{font-size:16.5px;color:var(--noir);font-weight:600}
.coord a:hover{color:var(--rouge)}
.coord p{font-size:16px;line-height:1.5;color:var(--gris)}
/* Le lien Facebook était plus discret que les autres boutons. */
.btn--xs{font-size:16px;padding:11px 20px}
.btn--xs > a{margin:-11px -20px;padding:11px 20px}

/* ---------- Bouton « retour en haut » ---------- */
.back-to-top{
  position:fixed;right:clamp(16px,3vw,28px);bottom:clamp(16px,3vw,28px);z-index:70;
  width:48px;height:48px;display:flex;align-items:center;justify-content:center;
  background:var(--rouge);color:#fff;border:none;border-radius:50%;cursor:pointer;
  box-shadow:0 6px 20px rgba(29,29,27,.22);
  opacity:0;transform:translateY(8px);
  transition:opacity .2s,transform .2s,background .2s;
}
.back-to-top.is-visible{opacity:1;transform:translateY(0)}
.back-to-top:hover{background:var(--rouge-fonce)}
.back-to-top:focus-visible{outline:3px solid var(--rouge);outline-offset:3px}
/* [hidden] est neutralisé par « display:flex » : on le rétablit explicitement,
   sinon le bouton resterait visible avant que le JavaScript ne s'exécute. */
.back-to-top[hidden]{display:none}
/* Le texte n'est là que pour les lecteurs d'écran : il ne doit pas s'afficher,
   mais rester dans l'arbre d'accessibilité — d'où ce masquage et non
   « display:none », qui l'en retirerait. */
.screen-reader-text{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;
}

/* ---------- Pied de page ---------- */
.site-footer{background:var(--noir);color:#b8b5af;padding-top:clamp(20px,3vw,28px)}
.footer-pictos{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:16px;padding-bottom:clamp(16px,2.5vw,24px)}
.footer-pictos img{height:clamp(30px,3.5vw,52px);width:auto;opacity:.92;display:block}
.footer-cols{border-top:1px solid #3a3a37;display:flex;flex-wrap:wrap;gap:44px;padding:clamp(32px,5vw,48px) 0 44px}
.footer-col{display:flex;flex-direction:column;gap:10px}
.footer-col--brand{flex:1 1 260px;gap:16px}
.footer-col--brand img{height:88px;width:88px;object-fit:contain}
.footer-col--brand p{font-size:14.5px;line-height:1.6}
.footer-col--links{flex:1 1 180px}
.footer-col--contact{flex:1 1 240px}
.footer-col h3{font-size:19px;letter-spacing:1.5px;color:#fff;margin-bottom:6px}
.footer-col a{color:#b8b5af;font-size:14.5px}
.footer-col a:hover{color:#fff}
/* Colonnes de liens : le bloc Navigation produit un <ul><li><a>. Les colonnes
   gèrent déjà leur espacement avec « gap ». */
.footer-nav .wp-block-navigation__container{gap:10px;align-items:flex-start}
.footer-nav .wp-block-navigation-item__content{color:#b8b5af;font-size:14.5px;text-decoration:none}
.footer-nav .wp-block-navigation-item__content:hover{color:#fff}
/* Le logo est un <figure> depuis la conversion. */
.footer-col--brand .footer-logo{margin:0}
.footer-col--contact p{font-size:14.5px;line-height:1.7}
.footer-col--contact a{color:var(--rose-clair)}
.footer-col--contact .muted{color:var(--gris-sur-sombre)}
/* L'e-mail et le téléphone étaient des <a> nus, ce sont désormais des <p> qui
   les enveloppent : sans cela, ils héritent de l'interligne 1.7 du bloc contact
   et l'espacement double. */
.footer-col--contact .footer-contact-link{line-height:1.4;margin:0}
.footer-bottom{border-top:1px solid #3a3a37}
.footer-bottom .container{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;padding-top:18px;padding-bottom:18px;font-size:13px;color:var(--gris-sur-sombre)}
.footer-bottom p{font-size:13px;color:var(--gris-sur-sombre);margin:0}
.footer-bottom a{color:var(--gris-sur-sombre)}
.footer-bottom a:hover{color:#fff}


/* ============================================================
   Ajustements spécifiques WordPress / éditeur de blocs
   ============================================================ */
body{margin:0}
.wp-site-blocks{padding:0}
.wp-site-blocks > *{margin-block-start:0}

/* Boucles de requête : les grilles reprennent les classes de la maquette */
.wp-block-post-template{margin:0;padding:0;list-style:none}
/* …sauf quand la boucle EST le conteneur : cette règle-ci vient après .container
   et lui retirait sinon son centrage et ses marges latérales — le contenu se
   collait au bord de l'écran et se décalait de 100px par rapport aux sections
   voisines. */
.wp-block-post-template.container{margin-left:auto;margin-right:auto;padding-left:20px;padding-right:20px}
.wp-block-post-template.grid--activites,
.wp-block-post-template.grid--cards,
.wp-block-post-template.grid--3,
.wp-block-post-template.grid--fill,
.wp-block-post-template.grid--team,
.wp-block-post-template.grid--bureau{display:grid}
/* Toutes nos boucles espacent leurs cartes avec « gap ». La mise en page « flux »
   de WordPress ajoute en plus un margin-block-start à chaque enfant SAUF le
   premier : dans une grille, la première carte se retrouvait décalée de 24px
   vers le haut par rapport à toutes les autres. */
.wp-block-post-template > .wp-block-post{width:100%;margin-block-start:0}
/* Une carte doit remplir la hauteur de sa cellule de grille.
   L'élément <li> généré par la boucle s'étire bien (align-items:stretch par
   défaut), mais la carte à l'intérieur gardait sa hauteur naturelle : les bas
   de cartes se retrouvaient en escalier selon la longueur du texte.
   Le carrousel de partenaires est exclu : sa piste n'est pas une grille. */
.wp-block-post-template.grid > .wp-block-post > *{height:100%}

/* Image mise en avant dans les cartes */
.wp-block-post-featured-image{margin:0}
.wp-block-post-featured-image img{display:block;width:100%;height:100%;object-fit:cover}
.card-media{height:190px;overflow:hidden}
.card-media .wp-block-post-featured-image,.card-media img{height:100%}
.card-media--event{height:180px;overflow:hidden}
.card-media--logo{background:var(--creme);padding:20px;display:flex;align-items:center;justify-content:center;height:120px}
.card-media--logo img{object-fit:contain;max-height:80px;width:auto;margin:0 auto}
.card-media--logo .wp-block-post-featured-image{width:100%;height:80px;display:flex;align-items:center;justify-content:center}
.team-media{height:260px;border-radius:14px;overflow:hidden}
.team-media--sm{height:220px}
/* Photos du bureau réduites pour que les 6 membres tiennent sur une ligne. */
.team-card--bureau .team-media{height:200px}
.team-media .wp-block-post-featured-image{height:100%}
.event-row .event-row-media .wp-block-post-featured-image{height:100%;min-height:260px}

/* Titres de billets */
.wp-block-post-title{font-family:var(--condensed);text-transform:uppercase;line-height:1.1;margin:0}
.wp-block-post-title a{color:inherit}
.wp-block-post-title a:hover{color:var(--rouge)}
.wp-block-post-excerpt{margin:0}
.wp-block-post-excerpt__excerpt{margin:0;font-size:14.5px;line-height:1.55;color:#6b6862}
.wp-block-post-excerpt__more-link{font-weight:700;font-size:14px}
/* Le bordeaux du club disparaît sur les sections sombres (1,7 pour 1) :
   il y cède la place à un rose clair de la même famille. */
.bg-noir .wp-block-post-excerpt__more-link,
.bg-gris-fonce .wp-block-post-excerpt__more-link,
.news-card--dark .wp-block-post-excerpt__more-link{color:#d98aa8}
.event-card .wp-block-post-excerpt__excerpt{color:#b8b5af}
.wp-block-post-date{font-size:13px;color:var(--gris-clair)}

/* Sections d'activités alternées (archive Activités) */
.activity-detail{padding:clamp(48px,7vw,88px) 0}
.activity-detail .split{gap:clamp(32px,5vw,64px)}
.wp-block-post:nth-child(even) .activity-detail{background:var(--creme)}
.wp-block-post:nth-child(even) .activity-detail .split{flex-direction:row-reverse}
.activity-detail .wp-block-post-content ul{padding-left:0;list-style:none;display:flex;flex-direction:column;gap:8px}
.activity-detail .wp-block-post-content li{display:flex;align-items:baseline;gap:10px;font-size:15.5px;line-height:1.5;color:var(--gris)}
.activity-detail .wp-block-post-content li::before{content:"›";color:var(--rouge);font-weight:700}

/* Contenu d'article */
.entry-content p{margin:0 0 1em;font-size:17px;line-height:1.7;color:var(--gris)}
.entry-content h2,.entry-content h3{margin:1.4em 0 .5em}
.wp-block-post-content p{font-size:17px;line-height:1.7;color:var(--gris)}
/* Citation dans le contenu d'une page (définition CNIL des mentions légales,
   extraits de textes officiels…) : filet rouge et retrait, pour distinguer
   d'un coup d'œil ce qui est cité de ce qui est écrit par le club. */
.wp-block-post-content blockquote{margin:1.6em 0;padding:2px 0 2px 22px;border-left:3px solid var(--rouge)}
.wp-block-post-content blockquote p{font-size:16px;color:var(--gris-clair)}
.wp-block-post-content blockquote p:last-of-type{margin-bottom:.4em}
.wp-block-post-content blockquote cite{display:block;font-style:normal;font-size:13.5px;color:var(--gris-clair)}
.wp-block-post-content blockquote cite a{color:var(--rouge)}
/* Listes des pages légales : puces sobres, alignées sur le corps de texte. */
.container--narrow .wp-block-post-content ul,
.container--narrow .wp-block-post-content ol{margin:0 0 1.2em;padding-left:22px}
.container--narrow .wp-block-post-content li{font-size:17px;line-height:1.7;color:var(--gris);margin-bottom:.35em}
/* Une sous-liste sert de précision : plus discrète que son parent. */
.container--narrow .wp-block-post-content li ul{margin:.5em 0 .2em}
.container--narrow .wp-block-post-content li li{font-size:16px;color:var(--gris-clair)}
/* Sommaire d'un document long : repère fixe en tête de page, pour ne pas
   obliger à parcourir plusieurs écrans avant de trouver la bonne section. */
.sommaire{background:var(--creme);border:1px solid var(--bordure);border-radius:12px;
  padding:22px 26px 8px;margin:2em 0}
.sommaire p{margin:0 0 .6em;font-size:15.5px}
.container--narrow .wp-block-post-content .sommaire li{font-size:16px;margin-bottom:.5em}
.sommaire a{color:var(--rouge);text-decoration:none}
.sommaire a:hover{text-decoration:underline}

/* Pagination de requête */
.wp-block-query-pagination{display:flex;gap:12px;justify-content:center;margin-top:32px;font-weight:600}

/* Bandeau visible seulement si un badge est renseigné */
.badge-periode:empty,.badge-annule:empty,.agenda-type:empty{display:none}
/* Vider un champ dans « Gestion du site » doit faire DISPARAÎTRE l'élément.
   Sans ça, une pastille ou un bouton vidé laisse sa coquille (fond, bordure,
   marge intérieure), et les conteneurs en flex conservent leur gouttière. */
.price-badge:empty,.badge-pill:empty,.btn:empty,.kicker:empty,.lead:empty,
.note:empty,.link-more:empty,.info-lien:empty,.side-card-link:empty,
.band-sub:empty,.band-label:empty,.planning-note:empty,.title:empty{display:none}
/* « Édition passée » : même emplacement que « Annulé », ton plus discret —
   c'est une information de contexte, pas une alerte. Les deux mentions
   s'excluent (voir le binding evenement_passe_label). */
.badge-passe{background:var(--gris);font-weight:600}


/* Compléments v2 : blocs dynamiques */
.container--narrow{max-width:800px}
.archive-title{font-weight:800;font-size:clamp(38px,6.5vw,72px);color:#fff}
.badge-cat a{color:inherit;text-decoration:none}
.badge-cat--dark{background:rgba(255,255,255,.14);color:var(--rose-clair)}
.badge-cat--dark a{color:var(--rose-clair)}
.single-date{color:var(--rose-clair);font-size:14px}
.hero-badges{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.post-nav{display:flex;justify-content:space-between;gap:16px;margin-top:40px;font-weight:600}
.news-body .wp-block-post-title{font-size:23px}
.event-body .wp-block-post-title{font-size:26px;color:#fff}
.event-body .wp-block-post-title a{color:#fff}
.event-periode{font-size:12px;font-weight:700;letter-spacing:1.5px;text-transform:uppercase;color:var(--rose-clair);margin:0}
.event-periode:empty{display:none}
/* La période est un <p> depuis la conversion (un <span> dans la maquette) : la
   règle « .event-card p{flex:1;color:...} » la faisait grandir — repoussant le
   titre et le texte vers le bas — et la peignait en gris. On la fixe : elle ne
   grandit pas, garde sa couleur rose, et le titre la suit directement. */
.event-card .event-periode{flex:0 0 auto;color:var(--rose-clair)}
.partners-home{padding:clamp(48px,7vw,80px) 0}
.partners-actions{justify-content:center;padding:24px 20px 0}
.partners-note{padding:16px 20px 0;text-align:center}
.partners-note a{font-weight:700}
.team-card .wp-block-post-title{font-size:23px}
/* Cartes du bureau plus étroites (6 par ligne) : nom un peu plus compact. */
.team-card--bureau .wp-block-post-title{font-size:18px}
.team-card--bureau .team-role{font-size:12px}
.bg-noir .team-card .wp-block-post-title{color:#fff}
.date-box .date-jour{font-family:var(--condensed);font-weight:800;font-size:26px;line-height:1;margin:0;color:#fff}
.date-box .date-mois{font-size:12px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--rose-pale);margin:0}
.agenda-info .wp-block-post-title{font-size:22px}
.agenda-lieu{font-size:14.5px;color:#6b6862;margin:0}
.event-list{display:flex;flex-direction:column;gap:28px}
.event-row .wp-block-post-title{font-weight:800;font-size:clamp(26px,3.5vw,40px);line-height:1}
.event-row .wp-block-post-excerpt__excerpt{font-size:16px;line-height:1.65;color:var(--gris)}
.formats-line{font-size:13px;font-weight:600;color:var(--gris);margin:0}
.formats-line:empty{display:none}
.activity-picto img{height:86px;width:auto;object-fit:contain}
.activity-head{display:flex;align-items:center;gap:16px}
.activity-head .activity-picto img{height:64px}
.activity-photo{height:340px;border-radius:16px;overflow:hidden}
.activity-photo .wp-block-post-featured-image{height:100%}
.activity-detail .wp-block-post-title{font-weight:800;font-size:clamp(28px,4vw,44px);line-height:1}
.activity-detail .wp-block-post-excerpt__excerpt{font-size:17px;line-height:1.7;color:var(--gris)}
.partners-grid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:22px}
.partner-body .wp-block-post-title{font-size:23px}
.partner-body .wp-block-buttons{margin-top:4px}
.partner-body .wp-block-button__link{background:none;color:var(--rouge);padding:0;font-family:var(--corps);font-weight:700;font-size:14px;letter-spacing:0;text-transform:none;border-radius:0}
.partner-media .wp-block-post-featured-image{width:100%;height:100%}
.partner-media img{object-fit:contain;width:100%;height:100%}
.logo-cell .wp-block-post-featured-image{width:100%;height:80px}
.logo-cell img{object-fit:contain;height:80px}
.annonceur-media .wp-block-post-featured-image{width:100%;height:100%}
.annonceur-media img{object-fit:contain;width:100%;height:100%}
/* Un logo doit être visible EN ENTIER, jamais rogné : « contain ». Le bloc
   Image mis en avant pose « object-fit:cover » en style INLINE ; seul
   « !important » peut le neutraliser. Fond blanc pour détourer proprement les
   logos aux fonds variés. */
.partner-media .wp-block-post-featured-image img,
.annonceur-media .wp-block-post-featured-image img,
.logo-cell .wp-block-post-featured-image img{object-fit:contain !important}
.partner-media,.annonceur-media{background:#fff}
.annonceur-body .wp-block-post-title{font-size:17px}
.annonceur-body .wp-block-post-terms{font-size:13px;color:var(--gris-clair)}
.annonceur-body .wp-block-post-terms a{color:var(--gris-clair)}
.annonceur-ville{font-size:13px;color:var(--gris-clair);margin:0}
.annonceur-ville:empty{display:none}
/* Lien « Visiter le site » de l'annonceur : même style discret que le partenaire. */
.annonceur-visit{margin-top:6px}
.annonceur-body .wp-block-button__link{background:none;color:var(--rouge);padding:0;font-family:var(--corps);font-weight:700;font-size:13px;letter-spacing:0;text-transform:none;border-radius:0}
.annonceur-body .wp-block-button__link:hover{color:var(--rouge-fonce)}
/* Fiche sans site (ex. « Au Tourment d'Amour ») : la liaison n'ajoute pas de
   href, on masque le bouton plutôt que d'afficher un lien mort. */
.annonceur-visit .wp-block-button__link:not([href]),
.annonceur-visit .wp-block-button__link[href=""]{display:none}

/* Classe d'affichage utilisée par les compositions (patterns/*.php) */
.cap03-display{font-family:var(--condensed);font-weight:800;text-transform:uppercase;line-height:1.05}

/* ---------- Bandeau « prochain rendez-vous » ----------
   Alimenté par une boucle sur le CPT Agenda. « display:contents » sur l'élément
   d'article fait de ses enfants (libellé, titre, lieu, lien) des éléments
   directs de la rangée flex .container : sans lui, tout l'article compterait
   pour un seul élément et la mise en page s'effondrerait sur une colonne. */
.band .wp-block-post{display:contents}
.band .wp-block-post-title{font-family:var(--condensed);font-weight:700;font-size:clamp(19px,2.4vw,24px);letter-spacing:.5px;text-transform:uppercase;color:#fff}
.band .wp-block-post-title a{color:#fff}
/* Au survol, le lien du titre prenait le rouge foncé de theme.json — illisible
   sur le fond rouge du bandeau. On l'éclaircit à la place. */
.band .wp-block-post-title a:hover{color:var(--rose-pale)}
.band .band-link{margin-left:auto;margin-bottom:0}
.band .band-link a{color:#fff;font-weight:700;font-size:15px;border-bottom:2px solid rgba(255,255,255,.4)}
.band .band-link a:hover{border-bottom-color:#fff}
.band p{margin:0}

/* ---------- Logos d'affiliation (page Le Club) ----------
   Cadre de taille fixe, logo contenu à l'intérieur quelles que soient ses
   dimensions natives. Sans max-height, la règle globale « img{max-width:100%} »
   ne bride que la largeur : un logo presque carré déborde alors en hauteur et
   vient mordre sur la section suivante. */
.affil-logos{display:flex;flex-wrap:wrap;gap:16px}
/* .affil-logo est un <figure> (bloc Image) : d'où le margin:0, que le bloc pose
   par défaut. */
.affil-logo{flex-shrink:0;width:150px;height:90px;display:flex;align-items:center;justify-content:center;margin:0}
.affil-logo img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}

/* ============================================================
   Respect de « Réduire les animations » (système d'exploitation)
   Le carrousel de partenaires tourne en boucle infinie : pour une personne
   sujette au mal des transports ou aux troubles vestibulaires, c'est
   handicapant. On le fige et on l'enroule pour rester lisible.
   ============================================================ */
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}
  .card--lift:hover{transform:none}
}
