/* =====================================================================
   ECOSYSTEME.CSS — Design system partagé AS Cachalots
   Le squelette commun aux 3 sites. Chaque page pose sa peau via
   <body class="skin-club|skin-ete|skin-cup">.
   =====================================================================

   REPÈRE RAPIDE (ajouté le 08/08/2026, pour s'y retrouver sans relire
   tout le fichier) :

   Couleurs — chaque peau redéfinit ces variables, ne jamais coder une
   couleur en dur dans une page si l'un de ces tokens convient :
     --accent, --accent-d   couleur de marque de la peau + variante foncée
     --eau                  bleu/cyan d'accent secondaire
     --bg, --surface, --surface-2   fond de page / carte / carte imbriquée
     --ink, --muted          texte principal / texte secondaire
     --line                  bordures
     --eau-text, --accent-text   variantes de --eau/--accent SÛRES EN TEXTE
       (contraste WCAG ≥4,5:1 vérifié par calcul) — utiliser CES tokens,
       jamais --eau/--accent bruts, dès qu'ils colorent du texte lisible.
       Sur skin-cup (fond sombre), ces variantes valent --eau/--accent
       elles-mêmes : déjà conformes, pas de double calcul nécessaire.

   Classes utilitaires (espacements/tailles répétés sur plusieurs pages —
   si un nouvel ajustement se répète 3+ fois, il mérite d'en rejoindre
   une plutôt que de rester en style="" local) :
     .mt-8 .mt-12 .mt-16 .mt-22 .mt-24 .mt-26 .mt-30   margin-top
     .pt-30                                             padding-top
     .center                                            text-align:center
     .max-640 .max-820                                  max-width
     .text-ink .text-accent-d                           couleur de texte
     .lead-wide                                          paragraphe d'intro large
     .logo-ico                                           logo nav/pied de page 40px
     .section-band                                       bandeau de section alterné
     .fil                                                 fil d'Ariane (nav + a + [aria-current])

   Un ajustement qui ne se répète qu'une fois reste légitimement en
   style="" local à sa page — ce repère ne concerne que les motifs
   transversaux, voir /areas/cachalots-web-ecosystem.md pour l'historique
   complet des passes de nettoyage.
   ===================================================================== */

/* ---------- TOKENS DE BASE (identiques partout) ---------- */
:root{
  --encre:#0B1B2B; --ardoise:#33475B; --brume:#7089A0;
  --nuage:#D6E2EC; --ecume:#F4F9FC; --blanc:#FFFFFF;
  --titre:"Sora", system-ui, sans-serif;
  --texte:"Inter", system-ui, sans-serif;
  --r-pill:999px; --r-carte:16px; --r-media:20px;
  --ombre:0 6px 24px rgba(11,27,43,.10);
  --ombre-forte:0 14px 44px rgba(11,27,43,.16);
  --max:1140px;

  /* Couleurs de marque des 3 sites. Ce ne sont PAS des couleurs de peau : elles
     identifient un site et restent identiques quelle que soit la peau de la page
     qui les affiche (pastilles de l'eco-bar et du module « famille »). */
  --marque-club:#0C5FA8; --marque-ete:#FFB020; --marque-cup:#FF2E7E;
}

/* ---------- LES 3 PEAUX (seules les couleurs changent) ---------- */
body.skin-club{
  --accent:#0C5FA8; --accent-d:#083C6E; --eau:#37A8E0;
  --bg:#F4F9FC; --surface:#FFFFFF; --surface-2:#EDF4FA;
  --ink:#0B1B2B; --muted:#54687C; --line:#D6E2EC; --on-accent:#FFFFFF;
  /* --eau-text : variante lisible de --eau quand elle sert de couleur de TEXTE
     (05/08/2026 — --eau brute est à 2,53:1 sur --bg, sous le seuil WCAG AA 4,5:1).
     --eau reste inchangée pour les fonds/bordures, où ce n'est pas le même calcul. */
  --eau-text:#1F6E9C; --accent-text:var(--accent);
}
body.skin-ete{
  --accent:#FFB020; --accent-d:#FF6A5B; --eau:#0FA9C4; --base-club:#0C5FA8;
  --bg:#FFF7EC; --surface:#FFFFFF; --surface-2:#FFF0D8;
  --ink:#0B1B2B; --muted:#6B5A3C; --line:#F0DCB8; --on-accent:#3A2A00;
  /* idem club : --eau (2,64:1) ET --accent (1,72:1) échouaient toutes deux
     en couleur de texte sur cette peau. Variantes assombries, même teinte. */
  --eau-text:#0A6A7E; --accent-text:#8F5E0C;
}
body.skin-cup{
  --accent:#FF2E7E; --accent-d:#FF74AC; --eau:#25D3E4;
  --bg:#0D1114; --surface:#161B21; --surface-2:#1F262E;
  --ink:#F4F9FC; --muted:#8FA0AD; --line:#242C34; --on-accent:#FFFFFF;
  /* déjà conformes sur fond sombre (--eau 10,40:1, --accent 5,37:1) : aucun changement */
  --eau-text:var(--eau); --accent-text:var(--accent);
}

/* ---------- COULEURS D'IDENTITÉ DES ÉPREUVES (Six Fours Swim Cup) ----------
   Ce ne sont PAS des couleurs de peau : chaque teinte identifie une distance
   et doit rester identique entre le planning (planning.html) et les tracés de
   la carte 3D (parcours-3d.html). Source unique : ne pas redéfinir en local. */
body.skin-cup{
  --c-5km:#2FAE4F;      /* Swim 5 — Rouv'Eau Libre */
  --c-3km:#E8503A;      /* Swim 3 — Open & Coupe de France */
  --c-2km:#3AA4E8;      /* Swim 2 */
  --c-1km:#9AA7B0;      /* Swim 1 & Relais 3×1000 */
  --c-500m:#1C6B3C;     /* Swim 500 */
  --c-3x300m:#8A5CC7;   /* Relais 3×300 */
  --c-200m:#C8872A;     /* Swim 200 — Kids */
  --c-4x200m:#D84F8E;   /* Relais 4×200 (tracé non couru en 2026) */
  /* niveaux de difficulté des fiches d'épreuve — sémantiques, pas décoratifs */
  --niv-1:#2FAE4F;      /* Découverte */
  --niv-2:#E8B33A;      /* Intermédiaire */
}

/* ---------- RESET ---------- */
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scroll-padding-top:76px;overflow-x:clip}
body{font-family:var(--texte);background:var(--bg);color:var(--ink);line-height:1.6;-webkit-font-smoothing:antialiased}
h1,h2,h3,h4{font-family:var(--titre);line-height:1.12;letter-spacing:-.02em}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
button{font-family:inherit;cursor:pointer}
:focus-visible{outline:3px solid var(--eau-text);outline-offset:3px;border-radius:4px}

/* ---------- ACCESSIBILITÉ & CIBLES TACTILES (partagé) ----------
   Anciennement dupliqué dans le <style> de chaque page — centralisé ici. */
.skip{position:absolute;left:-9999px;top:0;z-index:100;background:var(--accent);color:var(--on-accent);
  padding:12px 18px;border-radius:0 0 12px 0;font-weight:700}
.skip:focus{left:0}

/* le burger reste tapable au-dessus du tiroir ouvert */
.nav-burger{position:relative;z-index:3;min-width:44px;min-height:44px}
body.nav-open .nav-burger .i-menu{display:none}
.nav-burger .i-close{display:none}
body.nav-open .nav-burger .i-close{display:inline}

/* logo deux lignes (nom + baseline) */
.nav-logo .lg{display:flex;flex-direction:column;line-height:1.12}
.nav-logo .lg small{font-family:var(--texte);font-size:10.5px;font-weight:700;color:var(--muted);
  text-transform:uppercase;letter-spacing:.14em}

/* cibles tactiles ≥ 44px partout (usage mobile principal) */
.nav-logo{min-height:44px}
.eco-pill{min-height:44px}
.btn-sm{min-height:44px}
.family .fp{min-height:44px}
.copy a{min-height:44px;align-items:center}
.alert a{display:inline-flex;align-items:center;min-height:44px}
@media(max-width:940px){
  .nav-links a{min-height:48px;display:flex;align-items:center}
  .nav-links .btn{min-height:48px;justify-content:center;margin:6px 0 0}
}

/* ---------- TÉMOIGNAGES (preuve sociale) ---------- */
.quote{display:flex;flex-direction:column;gap:12px}
.quote blockquote{margin:0;font-size:14.5px;color:var(--ink);line-height:1.65}
.quote blockquote::before{content:"“ ";color:var(--accent-text);font-family:var(--titre);font-weight:800;font-size:22px;line-height:0}
.quote .who{display:flex;align-items:center;gap:10px;margin-top:auto}
.quote .who .av{width:38px;height:38px;border-radius:50%;background:var(--surface-2);border:1px solid var(--line);
  display:grid;place-items:center;font-size:17px;flex:0 0 auto}
.quote .who b{font-size:13.5px;display:block}
.quote .who small{font-size:12px;color:var(--muted)}
.quote .stars{color:var(--accent-text);letter-spacing:2px;font-size:13px}


.wrap{max-width:var(--max);margin:0 auto;padding:0 24px}
.section{padding:76px 0}
.eyebrow{font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.16em;
  color:var(--eau-text);display:inline-flex;align-items:center;gap:8px}
.eyebrow::before{content:"";width:22px;height:2px;background:currentColor;border-radius:2px}
.h2{font-size:clamp(27px,3.6vw,40px);font-weight:800;margin:14px 0 14px}
.lead{color:var(--muted);max-width:620px;font-size:17px}

/* ---------- SÉLECTEUR D'ÉCOSYSTÈME (commun, sticky) ---------- */
.eco-bar{position:sticky;top:0;z-index:60;background:color-mix(in srgb,var(--bg) 88%,transparent);
  backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.eco-inner{max-width:var(--max);margin:0 auto;padding:9px 24px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.eco-label{font-weight:600;font-size:12.5px;color:var(--muted);margin-right:auto}
.eco-pill{display:inline-flex;align-items:center;gap:7px;padding:6px 13px;border-radius:var(--r-pill);
  font-weight:600;font-size:12.5px;border:1.5px solid transparent;transition:transform .18s}
.eco-pill .dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
.eco-pill:hover{transform:translateY(-1px)}
.eco-pill.is-club{color:#0C5FA8;background:#E7F1FA;border-color:#CBE2F4}
.eco-pill.is-club .dot{background:var(--marque-club)}
.eco-pill.is-ete{color:#B26A00;background:#FFF3DE;border-color:#FCE0AE}
.eco-pill.is-ete .dot{background:var(--marque-ete)}
.eco-pill.is-cup{color:#C31B62;background:#FCE4EE;border-color:#F7C2D8}
.eco-pill.is-cup .dot{background:var(--marque-cup)}
/* aria-current="page" sur la page elle-même, "true" ailleurs sur le même site :
   les deux méritent l'anneau. */
.eco-pill[aria-current]{box-shadow:inset 0 0 0 1.5px currentColor}

/* ---------- HEADER / NAV ---------- */
.nav{position:sticky;top:0;z-index:55;background:color-mix(in srgb,var(--surface) 92%,transparent);
  backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}
.nav-in{max-width:var(--max);margin:0 auto;padding:12px 24px;display:flex;align-items:center;gap:18px}
.nav-logo{display:flex;align-items:center;gap:10px;font-family:var(--titre);font-weight:800;font-size:17px}
.nav-logo img{height:40px;width:auto}
.nav-links{display:flex;align-items:center;gap:4px;margin-left:auto}
.nav-links a,.nav-drop>span{padding:9px 12px;border-radius:10px;font-weight:600;font-size:14px;
  color:var(--ink);transition:background .15s;white-space:nowrap}
.nav-links a:hover,.nav-drop>span:hover{background:var(--surface-2)}
.nav-drop{position:relative}
.nav-drop>span{display:inline-flex;align-items:center;gap:5px;cursor:default}
.nav-drop-menu{position:absolute;top:calc(100% + 6px);left:0;min-width:216px;background:var(--surface);
  border:1px solid var(--line);border-radius:14px;box-shadow:var(--ombre-forte);padding:8px;
  opacity:0;visibility:hidden;transform:translateY(6px);transition:.16s;z-index:5}
.nav-drop:hover .nav-drop-menu,.nav-drop:focus-within .nav-drop-menu{opacity:1;visibility:visible;transform:none}
.nav-drop-menu a{display:block;padding:9px 12px;border-radius:9px;font-size:14px}
.nav-cta{margin-left:6px}

/* ---------- FIL D'ARIANE ---------- */
/* Centralisé ici le 05/08/2026 — n'existait qu'en local sur tarifs-horaires.html */
.fil{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted);margin-bottom:14px}
.fil a{color:var(--muted);display:inline-flex;align-items:center;min-height:44px}
.fil a:hover{color:var(--accent)}
.fil [aria-current]{color:var(--ink);font-weight:600}

/* ---------- UTILITAIRES ---------- */
/* Centralisées ici le 05/08/2026 : motifs répétés en style="" inline
   sur de nombreuses pages (logo, bandeau de section alterné, espacements).
   Les ajustements ponctuels propres à une seule page restent en inline. */
.logo-ico{height:40px;width:auto}
.section-band{background:var(--surface);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.mt-8{margin-top:8px}
.mt-12{margin-top:12px}
.mt-16{margin-top:16px}
.mt-22{margin-top:22px}
.mt-24{margin-top:24px}
.mt-26{margin-top:26px}
.mt-30{margin-top:30px}
.pt-30{padding-top:30px}
.center{text-align:center}
.max-640{max-width:640px}
.max-820{max-width:820px}
.text-ink{color:var(--ink)}
.text-accent-d{color:var(--accent-d)}
.lead-wide{color:var(--muted);max-width:70ch;font-size:1.02rem;line-height:1.7}
.nav-burger{display:none;margin-left:auto;background:var(--surface-2);border:1px solid var(--line);
  border-radius:10px;padding:9px 12px;font-size:18px;color:var(--ink)}

@media(max-width:940px){
  .nav-burger{display:block}
  .eco-bar{position:static}          /* une seule barre collante sur mobile */
  body.nav-open{overflow:hidden}     /* pas de défilement derrière le menu */
  /* voile d'arrière-plan du tiroir : créé par eco.js (scrim.className='nav-scrim'),
     n'avait aucun style avant correction — invisible et sans profondeur */
  .nav-scrim{position:fixed;inset:0;background:rgba(8,14,20,.55);z-index:71;
    opacity:0;visibility:hidden;transition:opacity .22s}
  body.nav-open .nav-scrim{opacity:1;visibility:visible}

  /* BUG CORRIGÉ : le tiroir n'avait pas de z-index. .hero-in (z-index:2) et tout
     élément de page avec un z-index explicite passaient AU-DESSUS du tiroir
     (position:fixed + z-index:auto ne bat pas un z-index explicite, même faible,
     au même niveau d'empilement) — d'où le chevauchement menu/contenu de page. */
  .nav-links{position:fixed;inset:0 0 0 auto;width:min(340px,86vw);flex-direction:column;align-items:stretch;
    gap:2px;background:var(--surface);padding:76px 18px 24px;box-shadow:var(--ombre-forte);
    transform:translateX(100%);transition:transform .22s;overflow:auto;border-left:1px solid var(--line);
    z-index:72}
  body.nav-open .nav-links{transform:none}

  /* BUG CORRIGÉ : cette règle rendait TOUS les sous-menus visibles en permanence
     sur mobile (opacity:1;visibility:visible sans condition), alors qu'eco.js
     gère un accordéon via la classe .is-open (un seul sous-menu ouvert à la fois).
     Le CSS ignorait cet état : la totalité des sous-menus (« Les parcours » et ses
     12 épreuves compris) s'affichait développée dès l'ouverture du tiroir. */
  .nav-drop-menu{position:static;transform:none;box-shadow:none;border:0;
    padding:2px 0 6px 14px;min-width:0;display:none}
  .nav-drop.is-open .nav-drop-menu{display:block;opacity:1;visibility:visible}
  .nav-drop>span{display:flex}
}

/* ---------- BOUTONS ---------- */
.btn{display:inline-flex;align-items:center;gap:8px;font-family:var(--titre);font-weight:700;font-size:15px;
  padding:13px 24px;border-radius:var(--r-pill);border:1.5px solid transparent;transition:.18s;white-space:nowrap}
.btn-primary{background:var(--accent);color:var(--on-accent)}
.btn-primary:hover{transform:translateY(-2px);filter:brightness(1.06);box-shadow:0 8px 22px color-mix(in srgb,var(--accent) 40%,transparent)}
.btn-ghost{border-color:var(--accent-text);color:var(--accent-text);background:transparent}
body.skin-cup .btn-ghost{color:var(--ink);border-color:var(--line)}
.btn-ghost:hover{background:color-mix(in srgb,var(--accent) 12%,transparent);transform:translateY(-2px)}
.btn-sm{padding:9px 16px;font-size:13.5px}

/* ---------- HERO ---------- */
.hero{position:relative;overflow:hidden}
.hero-media{position:absolute;inset:0;z-index:0}
.hero-media img{width:100%;height:100%;object-fit:cover}
.hero-media::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 55%,transparent),var(--bg) 92%)}
body.skin-cup .hero-media::after{background:linear-gradient(180deg,rgba(13,17,20,.55),var(--bg) 94%)}
.hero-in{position:relative;z-index:2;max-width:var(--max);margin:0 auto;padding:80px 24px 40px}
.hero h1{font-size:clamp(40px,7vw,74px);font-weight:800;margin:16px 0 18px;max-width:16ch}
.hero .sub{font-size:clamp(17px,2.2vw,20px);color:var(--muted);max-width:620px;margin-bottom:26px}
.hero-cta{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.hero-tags{display:flex;gap:8px;flex-wrap:wrap;margin:22px 0 6px}
.tag{font-size:12.5px;font-weight:600;padding:6px 13px;border-radius:var(--r-pill);
  background:color-mix(in srgb,var(--accent) 12%,var(--surface));color:var(--accent-text);border:1px solid color-mix(in srgb,var(--accent) 24%,transparent)}
.tag.water{background:color-mix(in srgb,var(--eau) 14%,var(--surface));color:var(--eau-text);border-color:color-mix(in srgb,var(--eau) 30%,transparent)}
body.skin-cup .tag{color:var(--accent-d)}

/* fil de l'eau — signature */
.waterline{position:relative;height:66px;margin-top:-1px}
.waterline svg{position:absolute;inset:0;width:100%;height:100%}

/* ---------- COMPTE À REBOURS ---------- */
.count{display:flex;gap:10px;flex-wrap:wrap;margin:6px 0 26px}
.count .u{background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:12px 18px;
  min-width:78px;text-align:center;box-shadow:var(--ombre)}
.count .n{font-family:var(--titre);font-weight:800;font-size:30px;color:var(--accent-text);line-height:1}
body.skin-cup .count .n{color:var(--eau)}
.count .l{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin-top:5px}

/* ---------- CARTES ---------- */
.cards{display:grid;gap:20px}
.cards.c2{grid-template-columns:repeat(2,1fr)}
.cards.c3{grid-template-columns:repeat(3,1fr)}
.cards.c4{grid-template-columns:repeat(4,1fr)}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-carte);
  padding:24px;box-shadow:var(--ombre);transition:transform .18s,box-shadow .18s}
.card:hover{transform:translateY(-4px);box-shadow:var(--ombre-forte)}
.card .ic{font-size:30px;margin-bottom:12px}
.card h3{font-size:19px;margin-bottom:8px}
.card p{color:var(--muted);font-size:14.5px}
.card .arrow{display:inline-flex;margin-top:14px;font-weight:700;color:var(--accent-text);font-size:14px}
body.skin-cup .card .arrow{color:var(--eau)}

/* carte "spot" cliquable (feature) */
.spot{position:relative;border-radius:var(--r-carte);overflow:hidden;min-height:220px;display:flex;
  align-items:flex-end;padding:24px;color:#fff;box-shadow:var(--ombre)}
.spot img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}
.spot::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent,rgba(8,20,34,.82));z-index:1}
.spot>*{position:relative;z-index:2}
.spot h3{font-size:22px;color:#fff}
.spot p{color:rgba(255,255,255,.86);font-size:14px;margin-top:4px}

/* badge */
.badge{display:inline-block;font-size:11px;font-weight:700;padding:4px 10px;border-radius:var(--r-pill);
  background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}
body.skin-cup .badge{color:var(--accent-d)}
.badge.new{background:color-mix(in srgb,var(--eau) 18%,transparent);color:var(--eau-text)}

/* liste discipline / stage */
.stage{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-carte);padding:22px;box-shadow:var(--ombre)}
.stage .top{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:6px}
.stage h3{font-size:18px}
.stage .age{font-size:12px;font-weight:600;color:var(--muted)}
.stage p{font-size:14px;color:var(--muted);margin:8px 0 14px}
.stage .meta{font-size:13px;margin:4px 0}
.stage .meta b{font-family:var(--titre)}
.stage .links{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}

/* bandeau info / alerte */
.alert{display:flex;gap:14px;background:color-mix(in srgb,var(--accent-d) 10%,var(--surface));
  border:1px solid color-mix(in srgb,var(--accent-d) 30%,transparent);border-left:4px solid var(--accent-d);
  border-radius:12px;padding:16px 18px;font-size:14.5px;color:var(--ink)}
.alert .i{font-size:20px}

/* étapes numérotées */
.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;counter-reset:s}
.step{position:relative;padding-top:8px}
.step .num{width:36px;height:36px;border-radius:50%;background:var(--accent);color:var(--on-accent);
  font-family:var(--titre);font-weight:800;display:grid;place-items:center;margin-bottom:12px}
.step h4{font-size:16px;margin-bottom:6px}
.step p{font-size:14px;color:var(--muted)}

/* stats */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;text-align:center}
.stat .n{font-family:var(--titre);font-weight:800;font-size:clamp(34px,5vw,52px);color:var(--accent-text)}
body.skin-cup .stat .n{color:var(--eau)}
.stat .l{font-size:13px;color:var(--muted);text-transform:uppercase;letter-spacing:.1em}

/* partenaires */
.partners{display:flex;flex-wrap:wrap;gap:26px;align-items:center;justify-content:center}
.partners img{height:46px;width:auto;opacity:.78;filter:grayscale(.3);transition:.2s}
.partners img:hover{opacity:1;filter:none}

/* Peau sombre : les logos reposent sur une plaque claire au lieu d'être
   transformés en silhouette.
   L'ancienne règle `filter:brightness(0) invert(1)` écrasait chaque logo en blanc
   uni — un logo déjà clair devenait alors invisible, et les chartes graphiques des
   partenaires institutionnels interdisent en général ce genre d'altération.
   La plaque garantit la lisibilité quelles que soient les couleurs du fichier. */
body.skin-cup .partners a,
body.skin-cup .partners span{background:var(--blanc);border-radius:12px;
  padding:10px 14px;border:1px solid rgba(255,255,255,.14);transition:.2s}
body.skin-cup .partners a:hover{border-color:var(--eau);transform:translateY(-1px)}
body.skin-cup .partners img{filter:none;opacity:1}

/* Repli quand le fichier du logo est absent : le nom du partenaire prend le relais.
   Le HTML porte <span class="p-nom">Nom</span> après l'<img>, et l'attribut onerror
   pose la classe .sans-logo sur le parent. Sans cela, un logo manquant disparaissait
   sans laisser de trace — indétectable à l'œil comme au diagnostic. */
.partners .p-nom{display:none;font-family:var(--titre);font-weight:700;font-size:13px;
  color:var(--muted);white-space:nowrap}
.partners .sans-logo .p-nom{display:inline}
.partners .sans-logo{padding:10px 16px;border:1px dashed var(--line);
  border-radius:var(--r-pill);background:transparent}
body.skin-cup .partners .sans-logo{background:transparent;border-style:dashed;
  border-color:var(--line)}

/* liste verticale d'épreuves (programme) */
.stage-list{display:flex;flex-direction:column;gap:8px;align-items:stretch}
.stage-list .btn{justify-content:flex-start;text-align:left}

/* section sombre "épopée" (réutilisable) */
.feature-dark{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-media);
  padding:44px;box-shadow:var(--ombre)}

/* ---------- FOOTER + module famille ---------- */
.foot{background:var(--encre);color:var(--nuage);padding:56px 0 30px}
.foot .cols{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:36px}
.foot h4{color:#fff;font-size:16px;margin-bottom:14px}
.foot p,.foot a,.foot li{font-size:14px;color:#AEC1D2}
.foot a:hover{color:#fff}
.foot ul{list-style:none;display:grid;gap:9px}
.foot .brand{font-family:var(--titre);font-weight:800;font-size:20px;color:#fff;display:flex;align-items:center;gap:10px;margin-bottom:12px}
.family{margin-top:34px;padding-top:24px;border-top:1px solid #22364a}
.family .fl{font-size:12px;text-transform:uppercase;letter-spacing:.14em;color:#7089A0;margin-bottom:12px}
.family .fpills{display:flex;gap:10px;flex-wrap:wrap}
.family .fp{display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border-radius:var(--r-pill);
  font-weight:600;font-size:13.5px;background:#13273b;border:1px solid #22364a;color:#DCE8F2}
.family .fp:hover{border-color:currentColor;transform:translateY(-1px);transition:.15s}
.family .fp .dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto;background:currentColor}
/* La pastille tenait sa couleur d'un style="background:#…" répété dans le HTML de
   chaque page : elle disparaissait dès que l'attribut sautait. Elle la tient
   désormais d'une classe. */
.family .fp.is-club .dot{background:var(--marque-club)}
.family .fp.is-ete  .dot{background:var(--marque-ete)}
.family .fp.is-cup  .dot{background:var(--marque-cup)}
.family .fp[aria-current]{border-color:currentColor}
/* réseaux sociaux du footer — même palette que .family .fp */
.socials{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}
.socials a{display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:8px 16px;
  border-radius:var(--r-pill);background:#13273b;border:1px solid #22364a;
  font-weight:600;font-size:13px;color:#DCE8F2}
.socials a:hover{color:#fff;border-color:currentColor}
/* icône en ligne : suit la couleur du lien, y compris au survol */
.socials a svg{width:16px;height:16px;flex:0 0 auto}
/* partenaires : cibles tactiles confortables */
.partners a,.partners span{display:inline-flex;align-items:center;min-height:48px;padding:2px}
.copy{margin-top:26px;font-size:12.5px;color:#5f748a;text-align:center}

/* ---------- ANCRES ----------
   L'en-tête est collant : sans ce retrait, une arrivée sur #ancre place le titre
   derrière la barre. Règle globale, inutile de la répéter dans chaque page. */
section[id],article[id],div[id]{scroll-margin-top:96px}
.copy a{color:#AEC1D2;text-decoration:underline;text-underline-offset:2px;display:inline-block;padding:8px 6px}
.copy a:hover{color:#fff}
/* zones tactiles confortables pour les liens de contact */
.foot ul a{display:inline-flex;align-items:center;min-height:32px}

/* =====================================================================
   COMPOSANTS PARTAGÉS PAR PLUSIEURS PAGES
   (auparavant recopiés dans le <style> de chaque page — centralisés ici)
   ===================================================================== */

/* deux colonnes qui s'empilent */
.duo{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:start}
.duo.wide{grid-template-columns:1.1fr .9fr}
@media(max-width:940px){.duo,.duo.wide{grid-template-columns:1fr}}

/* liste « libellé / valeur » : tarifs, horaires, repères */
.tarifs{list-style:none;display:grid;gap:2px}
.tarifs li{display:flex;justify-content:space-between;align-items:baseline;gap:14px;
  padding:11px 0;border-bottom:1px solid var(--line);font-size:14.5px}
.tarifs li:last-child{border-bottom:0}
.tarifs li b{font-weight:600}
.tarifs li span{font-family:var(--titre);font-weight:700;color:var(--eau-text);text-align:right;
  min-width:0;overflow-wrap:anywhere}
.tarifs li span a{color:var(--accent-d);text-decoration:underline;text-underline-offset:3px;
  display:inline-flex;align-items:center;min-height:44px}
@media(max-width:480px){
  .tarifs li{flex-direction:column;align-items:flex-start;gap:2px}
  .tarifs li span{text-align:left}
}

/* note de bas de bloc */
.note-s{font-size:13px;line-height:1.6;color:var(--muted);margin-top:14px;
  border-left:3px solid var(--accent);padding-left:12px}

/* repères chiffrés */
.chips{display:flex;gap:12px;flex-wrap:wrap;margin-top:22px}
.chip{flex:1 1 150px;min-width:0;background:var(--surface);border:1px solid var(--line);
  border-top:2px solid color-mix(in srgb,var(--accent) 40%,transparent);
  border-radius:12px;padding:12px 16px}
.chip .k{font-family:var(--titre);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted)}
.chip .v{font-size:15px;font-weight:700;margin-top:3px;overflow-wrap:anywhere}
.chip .v .mono{font-family:var(--titre);color:var(--eau-text)}
@media(max-width:480px){.chip{flex:1 1 100%}}

/* frise chronologique (étapes de course, repères kilométriques) */
.tl{border-left:3px solid var(--accent);padding-left:24px;margin-left:6px;display:grid;gap:2px}
.tl>div{position:relative;padding:12px 0;font-size:14.5px;color:var(--muted);line-height:1.6}
.tl>div::before{content:"";position:absolute;left:-31px;top:19px;width:11px;height:11px;
  border-radius:50%;background:var(--bg);border:3px solid var(--accent)}
.tl b{color:var(--ink)}
.tl .k,.tl .h{display:block;font-family:var(--titre);font-weight:800;font-size:12px;
  letter-spacing:.12em;color:var(--eau-text);margin-bottom:2px}
.tl .dep b{color:var(--accent-d)}

/* façades RGPD : cartes et vidéos tierces ne chargent qu'au clic */
.facade{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;
  min-height:260px;text-align:center;padding:26px;background:var(--surface-2);
  border:1px solid var(--line);border-radius:var(--r-media)}
.facade p{font-size:13px;color:var(--muted);max-width:340px}
.facade .btn{min-height:44px}
.embed{border-radius:var(--r-media);overflow:hidden;border:1px solid var(--line)}
.embed iframe{display:block;width:100%;min-height:320px;border:0}
.embed.video{aspect-ratio:16/9}
.embed.video iframe{height:100%;min-height:0}

/* bande photo d'ambiance */
.photoband{display:grid;grid-template-columns:repeat(6,1fr);gap:8px}
.photoband img{width:100%;min-width:0;height:150px;object-fit:cover;border-radius:12px;
  border:1px solid var(--line)}
@media(max-width:940px){.photoband{grid-template-columns:repeat(3,1fr)}}
@media(max-width:480px){.photoband{grid-template-columns:repeat(2,1fr)}.photoband img{height:118px}}

/* aperçu lourd chargé à la demande */
.visual3d{position:relative;min-height:320px;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:14px;text-align:center;padding:26px;
  background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-media)}
.visual3d .globe{font-size:44px}
.visual3d iframe{width:100%;min-height:420px;border:0;border-radius:var(--r-media)}

/* liste d'épreuves cliquables */
.stage-list .btn{white-space:normal;text-align:left;min-height:52px;gap:12px}
.stage-list .dist{margin-left:auto;font-family:var(--titre);font-size:12.5px;
  font-weight:700;color:var(--eau-text);white-space:nowrap}
.stage-list .cup{margin-left:auto;font-size:11px;font-weight:700;padding:4px 10px;
  border-radius:var(--r-pill);background:color-mix(in srgb,var(--accent) 18%,transparent);
  color:var(--accent-d);white-space:nowrap}

/* carte cliquable en entier */
.card-link{display:block}
.card-link:hover .arrow{transform:translateX(3px)}
.card .arrow{transition:transform .18s}

/* barre d'action collante (mobile uniquement) */
.stickybar{display:none}
@media(max-width:940px){
  .stickybar{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:70;gap:10px;
    align-items:center;justify-content:space-between;padding:9px 14px;
    background:color-mix(in srgb,var(--bg) 94%,transparent);backdrop-filter:blur(10px);
    border-top:1px solid var(--line)}
  .stickybar .txt{font-size:12px;color:var(--muted);line-height:1.35}
  .stickybar .txt b{display:block;color:var(--ink);font-size:13.5px}
  .stickybar .btn{min-height:44px}
  body:has(.stickybar){padding-bottom:74px}
}

/* ---------- RESPONSIVE ---------- */
@media(max-width:940px){
  .cards.c4{grid-template-columns:repeat(2,1fr)}
  .steps{grid-template-columns:repeat(2,1fr)}
  .foot .cols{grid-template-columns:1fr;gap:26px}
}
@media(max-width:680px){
  .section{padding:52px 0}
  .cards.c2,.cards.c3,.cards.c4{grid-template-columns:1fr}
  .stats{grid-template-columns:repeat(2,1fr);gap:26px}
  .eco-label{display:none}                 /* on garde juste les 3 pastilles */
  .eco-inner{justify-content:center;gap:8px}
  .foot ul{gap:6px}
  .foot ul a{min-height:44px}              /* cible tactile confortable (pouce) */
  .foot .cols{gap:22px}
  .hero-in{padding:64px 22px 34px}

  /* ---------- Compacité du bandeau d'accueil sur mobile ----------
     Sur un écran de 390 px, chaque élément du hero occupait sa propre ligne :
     4 tags sur 4 lignes, un compte à rebours qui débordait en 3 + 1, et trois
     boutons pleine largeur empilés. Le premier contenu réel arrivait après plus
     de deux hauteurs d'écran. */

  /* le compte à rebours tient sur une seule ligne */
  .count{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:4px 0 20px}
  .count .u{min-width:0;padding:10px 4px;border-radius:12px}
  .count .n{font-size:23px}
  .count .l{font-size:9.5px;letter-spacing:.06em;margin-top:3px}

  /* étiquettes plus denses : 3 par écran au lieu d'une */
  .hero-tags{gap:6px;margin:16px 0 4px}
  .tag{font-size:11.5px;padding:5px 11px}

  /* action principale pleine largeur, secondaires côte à côte */
  .hero-cta{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:4px}
  .hero-cta .btn{width:100%;min-width:0;justify-content:center;text-align:center;
    font-size:13.5px;padding:12px 8px}
  .hero-cta .btn-primary{grid-column:1/-1;font-size:15px}
}
@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important;scroll-behavior:auto}}
