:root{
  --or:#E9B824;
  --or-clair:#F4D77A;
  --vert:#2FA05E;
  --vert-clair:#3CBB72;
  /* Le vert fané des soirées du bar.
     Il ne sert qu'à une chose : dire qu'une ligne rangée avec les matchs n'en
     est pas un. Fané et non le vert vif de la maison — celui-là est pris par
     les boutons et les pastilles « ouvert », et deux verts vifs côte à côte
     ne se distinguent plus. Assez clair pour porter du texte noir dessus,
     comme l'or. */
  --vert-fade:#93B9A0;
  --vert-fade-clair:#AECFB8;
  --rouge:#C4553D;
  --rouge-clair:#D2624A;
  --creme:#F5EBD8;
  --tx:#D8D2C6;
  --tx-2:#BFC7BB;
  --line:rgba(255,255,255,.06);
  --line-2:rgba(255,255,255,.10);
  --line-soft:rgba(255,255,255,.04);
  --carte:#0F1612;
  --carte-2:#0B120E;
  --noir:#050606;
  --noir-2:#0A0D0C;
  --r:12px;
  --pad:26px;
  /* Interligne unique pour tous les titres. Les capitales accentuées
     du display demandent nettement plus d'un cadratin ; les nombres
     isolés (dates, prix) gardent leur 1, ce ne sont pas des titres. */
  --titre-lh:1.16;
  --ui:Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial;
  --disp: 'Oswald', 'Arial Black', 'Helvetica Neue', Arial, sans-serif;
  --body:Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial;
}
/* width:100% + padding ne doit jamais déborder du conteneur. */
*,*::before,*::after{box-sizing:border-box}
html,body{
  margin:0;padding:0;height:100%;background:var(--noir);color:var(--creme);
}
html{scroll-behavior:smooth}
body{font-family:var(--body);line-height:1.6;-webkit-font-smoothing:antialiased}
/* Aucun lien souligné par défaut : le survol se signale par la couleur or. */
a{text-decoration:none;color:inherit}
.wrap{max-width:1320px;margin:0 auto;padding:0 var(--pad);box-sizing:border-box}
/* Le header est fixe : sans cette marge, il recouvrirait le haut
   de la section visée par une ancre du menu. */
/* La section s'arrête pile sous la barre : les trente pixels de rab
   laissaient voir la fin de la section précédente au-dessus du titre, et
   c'est justement ce qu'on ne veut pas voir en arrivant. L'air, la section
   l'a déjà — c'est son propre `padding` de 64px, au-dessus de son titre. */
section[id],#programme{scroll-margin-top:var(--tete-h,74px)}
/* Le programme arrive vingt pixels plus bas que les autres : son intitulé est
   un filet doré collé au haut du bloc, sans le `padding` qui donne de l'air
   aux sections suivantes. */
#programme{scroll-margin-top:calc(var(--tete-h,74px) + 60px)}
.sec{padding:64px 0}
.page{width:100%}
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:10px;
  font-family:var(--ui);font-weight:600;font-size:13.5px;
  letter-spacing:.16em;text-transform:uppercase;
  padding:12px 32px;border-radius:8px;border:1px solid transparent;
  cursor:pointer;transition:transform .18s ease,box-shadow .22s ease,background .2s ease,color .2s ease;
  text-decoration:none;color:var(--creme);
}
.btn-or{background:var(--or);color:#12100A}
/* Au survol le bouton s'inverse : fond transparent, texte et contour dorés.
   Il s'éclaircissait vers un jaune pâle et montait de deux pixels — le
   contour existe déjà au repos, en transparent, donc rien ne change de
   taille et la barre du haut ne frémit pas au passage de la souris. */
.btn-or:hover{background:transparent;color:var(--or);border-color:var(--or);box-shadow:none}
.btn-ghost{background:rgba(245,235,216,.03);border-color:var(--line-2);color:var(--creme)}
.btn-ghost:hover{background:rgba(233,184,36,.10);border-color:var(--or);color:var(--or)}

/* ── Cartes ───────────────────────────────────────────────── */
.card{
  background:linear-gradient(170deg,var(--carte-2),var(--carte));
  /* Même filet doré que le compte à rebours, la carte du hero,
     l'ardoise et les bannières. */
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  border-radius:var(--r);
}

/* Icônes SVG recolorées en or via mask (les fichiers sources sont noirs) */
.ico{
  display:block;width:46px;height:46px;
  background:var(--or);
  -webkit-mask-position:center;mask-position:center;
  -webkit-mask-size:contain;mask-size:contain;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  transition:background .25s ease,transform .25s ease;
}

/* ══ NAV ═══════════════════════════════════════════════════ */
.nav{
  position:fixed;top:0;left:0;right:0;z-index:60;
  transition:background .3s ease,border-color .3s ease,backdrop-filter .3s ease,
             transform .38s cubic-bezier(.2,.7,.3,1),opacity .28s ease;
  border-bottom:1px solid transparent;
}
/* Escamotée à la descente, elle revient dès qu'on remonte. */
.nav.cachee{transform:translateY(-100%);opacity:0;pointer-events:none}
.nav.stuck{
  background:rgba(8,11,9,.88);backdrop-filter:blur(18px);
  -webkit-backdrop-filter:blur(18px);border-bottom-color:var(--line);
}
.nav-in{
  max-width:1320px;margin:0 auto;padding:14px var(--pad);
  display:flex;align-items:center;justify-content:space-between;gap:24px;
}
/* ══ BANDEAU D'ANNONCE ═════════════════════════════════════
   Premier enfant de l'en-tête : il partage son fond et son
   escamotage au défilement. Un ruban continu y fait passer les
   prochaines affiches, deux copies identiques à la suite. */
.bandeau{
  display:flex;align-items:center;gap:16px;
  padding:0 var(--pad);background:transparent;color:var(--creme);
  /* 1px est le minimum réel : c'est l'opacité, pas l'épaisseur, qui
     affine le filet à l'œil. Le trait n'est plus une bordure mais un
     ::before : une bordure vit hors de la boîte de padding, donc hors
     de portée de la lueur, que l'overflow découperait. */
  padding-bottom:1px;
}
.bandeau[hidden]{display:none}
/* Une lueur parcourt le filet doré, de gauche à droite, puis marque
   une pause avant de repartir : un flux, pas un clignotant. Elle se
   superpose au filet sans le remplacer — si l'animation ne tourne
   pas, la bordure reste intacte. */
.bandeau{position:relative;overflow:hidden}
.bandeau::before{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:color-mix(in srgb, var(--or) 45%, transparent);
  pointer-events:none;
}
.bandeau::after{
  content:"";position:absolute;left:0;bottom:0;
  width:40%;height:1px;pointer-events:none;
  background:linear-gradient(90deg,
    transparent,
    color-mix(in srgb, var(--or) 70%, #fff) 45%,
    #FFF3D0 50%,
    color-mix(in srgb, var(--or) 70%, #fff) 55%,
    transparent);
  animation:filet-flux 5.5s linear infinite;
  will-change:transform;
}
/* -100 % = la largeur de la lueur, soit 40 % du bandeau : elle part
   hors champ à gauche et sort à droite à 250 % (= 100 % du bandeau).
   Le palier final ménage la respiration entre deux passages. */
@keyframes filet-flux{
  0%   {transform:translateX(-100%)}
  70%  {transform:translateX(250%)}
  100% {transform:translateX(250%)}
}
/* Le filet ne s'en va pas avec le bandeau : dès qu'on ferme celui-ci,
   il se redessine au sommet de la barre de navigation, donc en haut de
   l'en-tête. Les deux traits ne coexistent jamais — le sélecteur de
   frère adjacent ne s'arme que lorsque le bandeau porte « hidden ».
   Les traits partent du bord de la fenêtre et non de .nav-in, qui est
   centrée et plafonnée à 1320 px : sans cela, le filet serait plus
   court que le bandeau sur les grands écrans. */
.nav{overflow:hidden}
.nav-in{position:relative}
.bandeau[hidden] + .nav-in::before,
.bandeau[hidden] + .nav-in::after{
  content:"";position:absolute;top:0;height:1px;
  left:calc(50% - 50vw);pointer-events:none;
}
.bandeau[hidden] + .nav-in::before{
  width:100vw;
  background:color-mix(in srgb, var(--or) 45%, transparent);
}
.bandeau[hidden] + .nav-in::after{
  width:40vw;
  background:linear-gradient(90deg,
    transparent,
    color-mix(in srgb, var(--or) 70%, #fff) 45%,
    #FFF3D0 50%,
    color-mix(in srgb, var(--or) 70%, #fff) 55%,
    transparent);
  animation:filet-flux 5.5s linear infinite;
  will-change:transform;
}
@media (prefers-reduced-motion:reduce){
  .bandeau::after,
  .bandeau[hidden] + .nav-in::after{animation:none;opacity:0}
}
/* Titre et croix ne défilent pas : seule la fenêtre du milieu bouge. */
.bandeau-titre{
  /* 400 est une graisse réellement chargée pour Inter ; 700 était
     synthétisé par le navigateur, donc plus épais que voulu. */
  flex-shrink:0;color:#fff;font-family:var(--ui);font-weight:400;
  font-size:13.5px;letter-spacing:.2em;text-transform:uppercase;
}
.bandeau-fenetre{
  flex:1;min-width:0;overflow:hidden;text-decoration:none;color:inherit;
  /* Le texte s'efface au lieu de se couper net contre le titre. */
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 26px,#000 calc(100% - 26px),transparent);
  mask-image:linear-gradient(90deg,transparent,#000 26px,#000 calc(100% - 26px),transparent);
}
.bandeau-fenetre:hover{text-decoration:none}
/* Croix tracée en SVG plutôt qu'avec le caractère × : l'épaisseur
   du trait se règle au dixième, ce qu'aucune graisse de police ne
   permet ici — Inter n'est chargé qu'en 400 et 600. */
.bandeau-fermer{
  flex-shrink:0;width:22px;height:22px;padding:0;
  border:0;background:none;color:#fff;cursor:pointer;
  display:grid;place-items:center;
  transition:opacity .2s ease;
}
.bandeau-fermer svg{
  width:100%;height:100%;
  fill:none;stroke:currentColor;stroke-width:1.1;stroke-linecap:round;
}
.bandeau-fermer:hover{opacity:.6}
.bandeau-piste{
  display:flex;width:max-content;
  animation:defile var(--defile,40s) linear infinite;
}
/* Le ruban s'arrête sous le curseur : on peut lire une affiche
   sans lui courir après. */
.bandeau-fenetre:hover .bandeau-piste{animation-play-state:paused}
/* -50% = la largeur d'une copie : la seconde arrive pile où la
   première a commencé, la boucle ne saute pas. */
@keyframes defile{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.bandeau-suite{display:flex;align-items:center}
.bandeau-ev{
  display:flex;align-items:center;gap:11px;padding:8px 0;
  font-family:var(--ui);font-weight:600;font-size:12.5px;letter-spacing:.04em;
  white-space:nowrap;
}
.bandeau-point{
  font-style:normal;font-size:8px;color:var(--or);opacity:.45;padding:0 38px;
}
/* Un seul corps de texte pour tout le ruban : la hiérarchie ne
   passe que par la couleur et la graisse. Or pour ce qui situe
   l'affiche — le quand, la compétition — blanc gras pour les
   faits : l'heure et les équipes. */
/* Le pictogramme du sport, en blanc comme les faits qu'il annonce. */
.bandeau-ico{width:16px;height:16px;background:#fff;flex-shrink:0}
.bandeau-quand{
  flex-shrink:0;color:var(--or);font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;
}
.bandeau-h{color:#fff;font-weight:700;font-family:inherit}
.bandeau-comp{
  color:var(--or);font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;
}
.bandeau-aff{display:flex;align-items:center;gap:7px;color:#fff;font-weight:700}
.bandeau-sep{
  font-style:normal;font-weight:600;color:var(--or);
  letter-spacing:.12em;text-transform:uppercase;
}

.brand{display:flex;align-items:center;gap:12px}
.brand img{width:46px;height:46px;object-fit:contain;filter:drop-shadow(0 3px 10px rgba(0,0,0,.6))}
.brand span{
  /* Kelly Slab, chargée en sous-ensemble dans le <head> : elle ne
     sert qu'ici. La fonte n'existe qu'en 400 : on épaissit au trait
     plutôt qu'en déclarant un 700, que le navigateur simulerait en
     écrasant les empattements. Le tracé se centre sur le contour,
     d'où l'interlettrage relevé pour compenser. */
  font-family:'Kelly Slab', var(--disp);font-size:19px;
  -webkit-text-stroke:1px currentColor;
  letter-spacing:.075em;color:var(--creme);text-transform:uppercase;
}
.brand{
  text-decoration:none;color:var(--creme);
}
.brand:hover,.brand:focus{text-decoration:none}
/* Sélecteur de langue, entre l'écusson et le menu. */
.langue{
  display:flex;gap:2px;padding:2px;flex-shrink:0;
  border:1px solid var(--line-2);border-radius:7px;background:rgba(8,11,9,.5);
}
.langue button{
  padding:5px 10px;border:0;border-radius:5px;background:transparent;
  font-family:var(--ui);font-weight:600;font-size:11px;letter-spacing:.1em;
  color:var(--tx-2);cursor:pointer;transition:background .2s ease,color .2s ease;
}
.langue button:hover{color:var(--creme)}
.langue button[aria-pressed="true"]{background:var(--or);color:#12100A}
@media (max-width:960px){.nav-in .langue{margin-left:auto}}

.nav-links{display:flex;align-items:center;gap:30px}
.nav-links a{
  font-family:var(--ui);font-weight:600;font-size:11.5px;
  letter-spacing:.2em;text-transform:uppercase;color:#fff;
  padding:6px 0;position:relative;transition:color .2s ease;
}
.nav-links a{ text-decoration:none }
.nav-links a::after{
  content:"";position:absolute;left:0;bottom:-6px;height:2px;width:0;
  background:var(--or);transition:width .25s ease,height .15s ease,background .15s ease;
}
/* Pas de changement de graisse au survol : ça élargirait le texte
   et ferait sauter les items voisins. Seule la couleur bouge. */
.nav-links a:hover{
  color:var(--or);text-decoration:none;
}
.nav-links a:hover::after{width:100%;height:2px;background:var(--or)}
/* Accès à l'espace client. Le libellé bascule sur le prénom
   une fois la personne connectée. */
/* Plus petite que ses voisins, et volontairement : le bouton doré et le
   sélecteur de langue font 30px, elle en faisait 36 — elle dépassait des deux
   et passait pour le bouton principal de la barre, alors qu'elle est le moins
   important des trois. Le cadre serre le texte au plus près ; la taille des
   lettres, elle, ne bouge pas : c'est un nom, il doit se lire. */
.compte{
  display:flex;align-items:center;gap:5px;flex-shrink:0;
  font-family:var(--ui);font-weight:600;font-size:11px;
  letter-spacing:.12em;text-transform:uppercase;color:var(--creme);
  height:26px;padding:0 4px;border:0;background:none;
  transition:color .2s ease;
}
/* Ni cadre ni fond : c'est le moins important des trois éléments de la
   barre, et il portait le seul contour. Le survol échange les deux couleurs
   au lieu d'en imposer une troisième : déconnecté le nom passe au doré,
   connecté il revient au crème. Sans cet échange, un compte connecté — déjà
   doré — n'aurait montré aucune réponse au passage de la souris. */
.compte:hover{color:var(--or)}
/* L'icône garde sa couleur de repos : seul le TEXTE répond au survol.
   Avec `currentColor` elle suivait le texte, et les deux changeaient
   ensemble — Greg voulait le mot, pas le bonhomme. */
.compte svg{width:13px;height:13px;fill:var(--creme);flex-shrink:0}
.compte.connecte svg{fill:var(--or)}
/* Les capitales n'ont pas de jambages : sous elles, la ligne réserve une
   place que rien n'occupe, et le mot paraît monté d'un cheveu alors que sa
   boîte, elle, est bien centrée. On le redescend d'un pixel. L'icône n'a pas
   ce problème — elle est géométrique et tombe juste. */
.compte span{line-height:1;transform:translateY(1px)}
/* Le prénom à la main, une fois connecté : c'est un nom de personne, pas un
   intitulé de menu. Les capitales et l'interlettrage sautent — une écriture
   manuscrite en majuscules espacées ne ressemble plus à rien — et la taille
   monte, parce que cette police dessine plus petit à corps égal. */
.compte.connecte span{
  font-family:'Caveat', 'Segoe Script', 'Bradley Hand', cursive;
  font-size:21px;font-weight:600;letter-spacing:0;text-transform:none;
  transform:translateY(2px);
}
/* Connecté : le nom en doré signale l'état actif, et un pixel de plus —
   c'est un prénom, pas un intitulé de menu, et il se lit mieux d'un degré
   au-dessus. L'icône ne bouge pas : sa taille est fixée en pixels. */
.compte.connecte{color:var(--or);font-size:12px}
.compte.connecte:hover{color:var(--creme)}

/* ── L'avatar du membre ──────────────────────────────────────
   Une liste fermée : le bar propose, le membre choisit, personne n'envoie
   de photo. « Aucun » est une case comme les autres et vient en premier,
   parce que se retirer un avatar doit être aussi facile que s'en donner un.

   Le fond en damier derrière l'image : un avatar détouré sur fond sombre a
   l'air d'un trou, et on ne voit pas qu'il est transparent. */
/* Sept par ligne : c'est ce qui les rend assez grands pour qu'on distingue
   la chèvre au rugby de la chèvre au volley — à cinquante-six pixels elles
   se ressemblaient toutes. Une grille et non un `flex` : les colonnes se
   partagent la largeur, donc la taille suit celle de la carte au lieu d'être
   fixée à l'avance. Quatre sur un téléphone, où sept feraient des jetons. */
/* `minmax(0,1fr)` et non `1fr` : `1fr` vaut `minmax(auto,1fr)`, et `auto`
   refuse de descendre sous la taille du contenu — les colonnes restaient à
   186 px sur un téléphone de 390, la grille débordait et TOUTE la page se
   mettait à défiler de côté. */
.avatars{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:12px;max-width:780px}
@media (max-width:760px){.avatars{grid-template-columns:repeat(4,minmax(0,1fr))}}
.avatar{
  width:100%;aspect-ratio:1;padding:0;border-radius:50%;overflow:hidden;
  border:2px solid transparent;background:rgba(255,255,255,.04);
  cursor:pointer;transition:border-color .18s ease,transform .18s ease;
  display:flex;align-items:center;justify-content:center;
}
.avatar img{width:100%;height:100%;object-fit:cover;display:block}
.avatar:hover{border-color:color-mix(in srgb,var(--or) 45%,transparent)}
.avatar.choisi{border-color:var(--or)}
/* « Aucun » : un cadre vide et un tiret, pas une croix — on n'efface rien,
   on choisit de ne rien mettre. */
.avatar-vide{
  color:var(--tx-2);font-family:var(--ui);font-size:26px;
  border-style:dashed;border-color:var(--line-2);
}
.avatar-vide.choisi{border-style:solid;border-color:var(--or);color:var(--or)}
/* L'avatar à la place de l'icône. Deux fois la taille de celle-ci : un
   dessin de chèvre en tenue de sport ne se distingue pas à seize pixels, et
   c'est la seule image personnelle de la barre.

   La taille est portée par la CLASSE et non par l'endroit. Elle était écrite
   `.compte .avatar-mini`, donc elle ne valait que pour la barre du haut :
   dans le tiroir du téléphone, la même image sortait à sa taille naturelle
   — 256 px — et remplissait l'écran par-dessus le menu. Un nom qui dit
   « mini » doit être mini partout où il est posé.

   Le bouton perd sa hauteur fixe quand il en porte un — sinon l'image
   dépasserait de sa boîte et se ferait rogner en haut et en bas. */
.avatar-mini{
  width:40px;height:40px;border-radius:50%;object-fit:cover;flex-shrink:0;
}
.compte:has(.avatar-mini){height:auto;min-height:40px}

/* Pas de cadre : les trois barres se suffisent. On garde malgré tout
   les 44px de zone tactile, invisibles mais nécessaires au doigt. */
.burger{
  display:none;width:44px;height:44px;border:0;background:none;
  padding:0;cursor:pointer;
  flex-direction:column;align-items:center;justify-content:center;gap:5px;
}
.burger i{display:block;width:18px;height:1.5px;background:var(--creme);transition:transform .25s ease,opacity .2s ease}
.burger.open i:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
.burger.open i:nth-child(2){opacity:0}
.burger.open i:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}

.drawer{
  position:fixed;top:var(--tete-h,74px);left:0;right:0;bottom:auto;z-index:55;
  background:rgba(8,11,9,.97);backdrop-filter:blur(20px);
  border-bottom:1px solid var(--line);
  padding:20px var(--pad) 30px;
  display:none;flex-direction:column;gap:4px;
}
.drawer.open{display:flex}
/* Le voile sous le tiroir : le fond s'assombrit pendant que le menu est
   ouvert. Sans lui, la page continuait de vivre derrière un menu à moitié
   transparent — une affiche, un carrousel, des boutons dorés — et l'œil ne
   savait plus ce qui était ouvert.
   Sous le tiroir (55) et sous la barre du haut (60), donc à 54 : le menu et
   son bouton de fermeture restent en pleine lumière. */
.drawer-voile{
  position:fixed;inset:0;z-index:54;
  background:rgba(5,6,6,.74);
  -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);
  opacity:0;visibility:hidden;
  transition:opacity .22s ease,visibility .22s ease;
}
.drawer-voile.ouvert{opacity:1;visibility:visible}
/* Sur grand écran il n'y a pas de tiroir, donc rien à voiler. */
@media (min-width:961px){.drawer-voile{display:none}}
.drawer a{
  font-family:var(--ui);font-weight:600;font-size:15px;
  letter-spacing:.18em;text-transform:uppercase;
  padding:14px 0;border-bottom:1px solid var(--line-soft);color:#fff;
}
.drawer .btn{margin-top:18px}
/* Seule entrée du tiroir qui mène à un espace personnel, et pas à une ancre
   de la page : elle passe en doré, texte compris, et se détache du bloc des
   ancres. Avec la seule icône dorée elle se perdait en bas de la liste — on la
   lisait comme une section de plus, alors que c'est la seule qui sort du
   site. */
#compte-mobile{
  display:flex;align-items:center;gap:11px;
  color:var(--or);
  /* Elle ouvre le tiroir, donc le trait doré va DESSOUS : il sépare le compte
     des ancres de la page, qui sont autre chose. Le gris des autres entrées
     l'aurait fondue dans la liste. */
  border-bottom:1px solid rgba(233,184,36,.45);
  padding-bottom:16px;margin-bottom:4px;
}
#compte-mobile svg{width:19px;height:19px;fill:var(--or);flex-shrink:0}
/* Dans le tiroir, un cran en dessous de la barre du haut : la ligne fait
   quarante-trois pixels de haut, un avatar de quarante la ferait grandir à
   elle seule. Trente-deux le laisse bien plus visible que l'icône de dix-neuf
   qu'il remplace, sans déformer la liste. */
#compte-mobile .avatar-mini{width:32px;height:32px}

/* ══ HERO ══════════════════════════════════════════════════ */
.hero{
  position:relative;min-height:100svh;display:flex;align-items:center;
  padding:calc(var(--tete-h,74px) + 46px) 0 70px;overflow:hidden;
}
.hero-bg{position:absolute;inset:0;z-index:0}
.hero-bg img,
.hero-bg video{width:100%;height:100%;object-fit:cover;object-position:center 38%}
/* Le film se pose sur l'image, qui sert de repli — et vers laquelle
   il s'efface une fois passé. */
/* Même courbe que la respiration de l'écusson : les deux mouvements
   sont simultanés, une accélération différente les désaccorderait. */
.hero-film{position:absolute;inset:0;transition:opacity 2.6s cubic-bezier(.37,0,.63,1)}
.hero-film.fondu{opacity:0}
.hero-film[hidden]{display:none}
.hero-bg video{display:block}
/* Deux calques distincts, et non un seul qu'on ferait changer de
   fond : un dégradé vit dans background-image, un aplat dans
   background-color. Les deux ne s'interpolent pas — le dégradé
   disparaissait net et laissait voir la vidéo en clair pendant que
   le noir montait. On anime donc une opacité, qui, elle, se
   transitionne toujours.

   ::before — voile constant. La vidéo est plus claire que l'image
   fixe ; sans lui, le titre doré et le menu perdent leur contraste.

   Il s'AJOUTE au masque de `.hero-bg::after`, qui couvre les deux. Le
   24-9-2026 ce masque a été assombri pour la nouvelle photo, et la
   vidéo a pris l'assombrissement en plus du sien : trop sombre. Ce
   voile-ci a donc été allégé d'autant — .76/.68/.82 devient
   .63/.56/.71 —, ce qui redonne à la vidéo exactement ce qu'elle avait
   (luminance mesurée : 27,45 avant, 27,08 après) pendant que l'image
   fixe, elle, garde le masque plus dense.

   La règle à retenir : ces deux valeurs vont par paire. Toucher l'une
   sans l'autre change les deux moments du hero au lieu d'un seul. */
.hero-film::before{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(180deg,rgba(6,10,8,.63),rgba(6,10,8,.56) 45%,rgba(6,10,8,.71));
}
/* ::after — fermeture au noir, avant le fondu sur l'image. */
.hero-film::after{
  content:"";position:absolute;inset:0;z-index:2;pointer-events:none;
  background:#040705;opacity:0;
  transition:opacity 1.4s cubic-bezier(.37,0,.63,1);
}
.hero-film.noircit::after{opacity:1}
.hero-bg::after{
  content:"";position:absolute;inset:0;
  /* Le fondu vers le noir en bas pour la jonction avec la page, et
     juste ce qu'il faut de voile en haut pour que la nav et le titre
     restent lisibles.
     Assombri en deux fois le 24-9-2026. La nouvelle photo a deux écrans
     allumés et un néon : elle porte bien plus de lumière au milieu que
     celle d'avant, et la salle passait devant l'écusson au lieu de
     rester derrière. C'est un fond, et un fond se regarde en dernier.
     Le cran d'après a été essayé et écarté : les écrans de foot sont
     les pixels les plus clairs de l'image et résistent au voile, si
     bien qu'en poussant encore on écrase la foule sans les calmer —
     il reste deux rectangles verts sur du noir. */
  background:
    linear-gradient(180deg,rgba(8,11,9,.74) 0%,rgba(8,11,9,.48) 34%,rgba(8,11,9,.80) 78%,var(--noir) 100%),
    radial-gradient(60% 55% at 50% 42%,transparent 0%,rgba(8,11,9,.44) 100%);
}
/* Le voile réglable, par-dessus les deux masques ci-dessus.
   Un calque de PLUS et non un remplacement : ceux du dessus sont réglés à
   l'œil sur deux moments distincts — la vidéo pendant qu'elle tourne, la
   photo une fois le film fini — et vont par paire. Un curseur unique aurait
   cassé cet accord ; celui-ci se pose au-dessus et les ignore.
   `--hero-velo` est posée par le script à partir du réglage du panneau, et
   vaut 0 tant que personne n'y touche : sans réglage, rien ne change. */
.hero-bg::before{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:rgba(8,11,9,var(--hero-velo,0));
}
/* Le bloc descend de 15px, réglé à l'œil le 24-9-2026 : l'écusson
   arrivait trop haut sous la barre, 30 était trop. En `top` et non en
   marge ou en padding — le hero centre son contenu verticalement, et
   tout ce qui passe par la boîte se partage en deux : 15px de marge
   n'en auraient donné que 7. */
.hero-in{position:relative;z-index:2;width:100%;text-align:center;top:15px}
.hero-crest-wrap{
  position:relative;width:min(275px,47vw);
  /* L'écusson remonte de 18px, et SEULEMENT lui : ce qu'on retire en haut on
     le rend en bas, donc la hauteur du bloc ne change pas et le titre ne
     bouge pas d'un pixel. -18 + 44 = les 26 d'avant. */
  margin:-18px auto 44px;
  display:grid;place-items:center;
}
/* Halo doré diffus derrière l'écusson. Sur le wrapper car un <img>
   ne peut pas porter de pseudo-élément. */
.hero-crest-wrap::before{
  content:"";position:absolute;inset:-24%;z-index:-1;pointer-events:none;
  background:radial-gradient(circle at 50% 47%,
    rgba(233,184,36,.45) 0%,
    rgba(233,184,36,.22) 32%,
    rgba(233,184,36,.07) 54%,
    transparent 72%);
  filter:blur(16px);
  animation:halo 7s ease-in-out infinite;
}
.hero-crest{
  position:relative;width:100%;
  /* Le premier drop-shadow épouse la silhouette : le halo suit le contour
     de la chèvre, pas un simple disque. */
  filter:drop-shadow(0 0 24px rgba(233,184,36,.55))
         drop-shadow(0 18px 44px rgba(0,0,0,.75));
  animation:float 7s ease-in-out infinite;
}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-11px)}}
/* Coup de zoom à l'ouverture du noir sur l'image. Porté par le
   conteneur et non par l'image : .hero-crest anime déjà son propre
   transform (le flottement), les deux s'écraseraient. Le halo, qui
   vit sur le conteneur, suit le mouvement. */
@keyframes coupDeZoom{
  0%{transform:scale(1)}
  46%{transform:scale(1.085)}
  100%{transform:scale(1)}
}
/* Lent et sans à-coup : la courbe est symétrique, l'aller et le
   retour ont exactement la même douceur. */
.hero-crest-wrap.zoom{animation:coupDeZoom 6.5s cubic-bezier(.37,0,.63,1)}
@keyframes halo{0%,100%{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.07)}}
/* Les deux effets de l'écusson s'éteignent depuis le panneau. Le halo part
   en deux morceaux : le disque diffus derrière (::before) et l'ombre dorée
   qui épouse la silhouette. Éteindre l'un sans l'autre laisse un contour
   doré sur fond noir, ce qui n'est pas « sans halo », c'est à moitié. */
.hero-crest-wrap.sans-halo::before{display:none}
.hero-crest-wrap.sans-halo .hero-crest{filter:drop-shadow(0 18px 44px rgba(0,0,0,.75))}
.hero-crest-wrap.sans-flottement .hero-crest{animation:none}

/* ── Pop-up d'événement ──────────────────────────────────────
   Une carte, pas un plein écran : sur mobile elle occupe environ trois quarts
   de la hauteur et on voit le site derrière, ce qui dit tout de suite que ça
   se ferme. La croix est posée SUR l'affiche, en haut à droite, dans une
   pastille sombre : sur une photo claire une croix nue disparaît. */
#goat-popup{position:fixed;inset:0;z-index:9998;display:grid;place-items:center;padding:20px}
#goat-popup .popup-voile{
  position:absolute;inset:0;background:rgba(4,8,6,.78);
  opacity:0;transition:opacity .26s ease;
  -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);
}
#goat-popup.abierto .popup-voile{opacity:1}
/* Même construction que la bannière des fléchettes : la photo occupe tout,
   le texte est posé dessus, en bas, sur un dégradé qui éteint l'image sous
   les mots. C'est ce qui donne une affiche et non une fiche — et c'est la
   façon de faire du site partout ailleurs. */
/* La photo et le texte sont empilés dans la MÊME case de grille : la carte
   fait donc la hauteur du plus grand des deux. Le texte était posé en absolu
   par-dessus, et dès qu'il dépassait la photo — un match a deux écussons, un
   titre sur deux lignes et une compétition en plus — il sortait par le haut
   et passait sous la croix. */
#goat-popup .popup-carte{
  position:relative;z-index:1;overflow-x:hidden;overflow-y:auto;
  /* Une seule colonne, et qui ne dépasse pas. Une colonne implicite `auto`
     se dimensionne sur le contenu le plus large : dès que le titre passe en
     `nowrap` pour être mesuré, la colonne prenait la largeur du titre, le
     bloc de texte avec — et le titre « rentrait » dans une largeur plus
     grande que la carte, qui le coupait ensuite. `minmax(0,1fr)` la cloue à
     la largeur de la carte. */
  display:grid;grid-template-areas:"pile";grid-template-columns:minmax(0,1fr);
  width:min(520px,92vw);max-height:88dvh;
  border:1px solid color-mix(in srgb, var(--or) 34%, transparent);
  border-radius:16px;background:var(--carte-2);
  box-shadow:0 30px 70px -24px rgba(0,0,0,.9);
  opacity:0;transform:translateY(14px) scale(.985);
  transition:opacity .26s ease,transform .26s cubic-bezier(.2,.7,.3,1);
}
#goat-popup.abierto .popup-carte{opacity:1;transform:none}
#goat-popup .popup-affiche{
  grid-area:pile;display:block;width:100%;height:auto;
  /* Le plancher évite qu'une photo très large écrase le texte posé dessus :
     en dessous, on recadre plutôt que de rendre les mots illisibles. Si le
     texte fait la loi, la photo s'étire à sa hauteur et se recadre. */
  min-height:420px;object-fit:cover;background:#0B120E;
}
/* Le conteneur porte le focus, pas la croix : sinon l'anneau doré de
   `:focus-visible` dessine un second cercle sur le premier. */
#goat-popup .popup-carte:focus,#goat-popup .popup-carte:focus-visible{outline:none}
#goat-popup .popup-fermer{
  position:absolute;top:12px;right:12px;z-index:2;
  width:44px;height:44px;display:grid;place-items:center;
  border:1px solid rgba(244,239,230,.22);border-radius:50%;
  background:rgba(4,8,6,.72);color:var(--creme);cursor:pointer;
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);
  transition:background .2s ease,color .2s ease,border-color .2s ease;
}
#goat-popup .popup-fermer:hover{background:var(--or);color:#12100A;border-color:var(--or)}
#goat-popup .popup-fermer svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
/* Le dégradé devient opaque très tôt : la ligne de la date est la première
   du bloc, elle tombe donc tout en haut, là où l'image se voyait encore. En
   doré clair sur une photo claire, elle ne se lisait pas. */
#goat-popup .popup-txt{
  grid-area:pile;align-self:end;position:relative;z-index:1;
  padding:84px 26px 30px;text-align:center;
  background:linear-gradient(180deg,
    transparent 0%,
    rgba(4,8,6,.42) 12%,
    rgba(4,8,6,.86) 30%,
    rgba(4,8,6,.96) 46%,
    rgba(4,8,6,.99) 100%);
}
/* Une fête ou une annonce a moins de lignes qu'un match — ni écussons ni
   compétition —, donc son bloc de texte était plus court et le dégradé
   commençait plus bas : la photo restait claire juste au-dessus de la date.
   On lui rend la même réserve, pour que le voile monte pareil. */
#goat-popup .popup-carte:not(.popup-carte-match):not(.popup-carte-sinfoto) .popup-txt{
  padding-top:180px;
}
/* La date respire avant le titre : collée, la petite ligne dorée se lisait
   comme une surtitre du titre et non comme une information à elle. */
#goat-popup .popup-quand{
  margin:0 0 22px;font-family:var(--ui);font-size:12px;font-weight:600;
  letter-spacing:.18em;text-transform:uppercase;color:var(--or);
}
#goat-popup .popup-txt h2{
  margin:0;font-family:var(--disp);font-size:clamp(26px,6vw,36px);
  line-height:1.12;letter-spacing:.005em;text-transform:uppercase;color:var(--creme);
  text-shadow:0 3px 18px rgba(0,0,0,.8);
}
#goat-popup .popup-txt h2 .or{color:var(--or)}
/* Un match : les écussons, le « vs » et la compétition, comme sur les
   affiches de la page. Sans photo, les blasons tiennent l'affiche tout seuls
   et le fond prend le halo doré du hero — un vide se lirait comme une image
   qui n'a pas chargé. */
/* Sans photo, il n'y a plus d'image à éteindre : pas de dégradé, et le halo
   doré tient lieu de fond. */
#goat-popup .popup-carte-sinfoto{
  background:
    radial-gradient(120% 70% at 50% 0%, rgba(233,184,36,.16) 0%, rgba(11,18,14,0) 64%),
    var(--carte-2);
}
#goat-popup .popup-carte-sinfoto .popup-txt{
  padding:64px 26px 32px;background:none;
}
#goat-popup .popup-duel{
  display:flex;align-items:center;justify-content:center;gap:20px;margin:0 0 14px;
}
/* L'écusson nu, sans pastille derrière : un blason est déjà une forme, et
   l'encadrer en fait une vignette d'application. Le drapeau garde son masque
   rond — c'est un carré plein, et lui seul a besoin d'être découpé. */
#goat-popup .popup-blason{
  width:68px;height:68px;display:grid;place-items:center;
}
#goat-popup .popup-blason-drapeau{overflow:hidden;border-radius:50%}
#goat-popup .popup-blason img{width:100%;height:100%;object-fit:contain}
#goat-popup .popup-blason-drapeau img{object-fit:cover}
#goat-popup .popup-blason b{font-family:var(--disp);font-size:20px;color:var(--tx)}
#goat-popup .popup-vs{
  font-family:var(--disp);font-size:16px;font-weight:700;
  text-transform:uppercase;color:var(--or);
}
/* La compétition se lit sous le titre, en second : c'est le contexte du
   match, pas son nom. Marge propre — la règle générale des paragraphes du
   bloc la décollerait comme une phrase. */
#goat-popup .popup-compet{
  margin:8px 0 0;font-family:var(--ui);font-size:11px;font-weight:500;
  letter-spacing:.2em;text-transform:uppercase;color:rgba(244,239,230,.62);
}
/* La phrase, et elle seule. La date et la compétition sont des `p` elles
   aussi : sans ce `:not()`, cette règle-ci — plus bas dans la feuille ET
   plus précise, parce qu'elle ajoute le nom de balise — leur remettait
   `margin:16px 0 0`. La date perdait donc l'air qu'on lui donnait en
   dessous et se collait au titre, quelle que soit la valeur écrite plus
   haut. */
#goat-popup .popup-txt p:not(.popup-quand):not(.popup-compet){
  margin:16px 0 0;font-size:15px;line-height:1.65;color:var(--tx);
}
#goat-popup .popup-cta{
  display:inline-block;margin-top:26px;padding:15px 32px;border-radius:11px;
  background:var(--or);color:#12100A;text-decoration:none;
  font-family:var(--ui);font-weight:600;font-size:13px;
  letter-spacing:.14em;text-transform:uppercase;
  transition:background .2s ease,transform .2s ease;
}
#goat-popup .popup-cta:hover{background:var(--or-clair);transform:translateY(-1px)}
@media (max-width:700px){
  /* Trois quarts de l'écran, pas plus : le reste du site reste visible
     derrière, et la carte se lit comme quelque chose qui se ferme. */
  #goat-popup .popup-carte{width:min(460px,92vw);max-height:86dvh}
  #goat-popup .popup-affiche{min-height:340px}
  /* Une carte de match sans photo ne fait que la hauteur de ses mots : sur un
     téléphone elle flottait au milieu de l'écran comme une vignette. Elle
     prend les trois quarts promis et répartit son contenu dedans — c'est la
     hauteur qui fait l'affiche, pas la quantité de texte. */
  #goat-popup .popup-carte-sinfoto{
    min-height:72dvh;display:flex;flex-direction:column;justify-content:center;
  }
  #goat-popup .popup-carte-sinfoto .popup-txt{padding:60px 20px 34px}
  #goat-popup .popup-carte-sinfoto .popup-duel{margin-bottom:20px}
  #goat-popup .popup-carte-sinfoto .popup-txt p:not(.popup-quand):not(.popup-compet){
    margin-top:20px;
  }
  #goat-popup .popup-carte-sinfoto .popup-compet{margin-top:12px}
  #goat-popup .popup-carte-sinfoto .popup-cta{margin-top:32px}
  #goat-popup .popup-txt{padding:72px 20px 24px}
  #goat-popup .popup-carte:not(.popup-carte-match):not(.popup-carte-sinfoto) .popup-txt{
    padding-top:150px;
  }
  #goat-popup .popup-duel{gap:14px}
  #goat-popup .popup-blason{width:54px;height:54px}
  #goat-popup .popup-vs{font-size:14px}
}
@media (prefers-reduced-motion:reduce){
  #goat-popup .popup-voile,#goat-popup .popup-carte{transition:none}
}

/* L'avis de clôture des réservations du jour : une règle de la maison, pas
   un refus. Doré et non rouge — on n'est pas complet, on invite à venir. */
.resa-cloture{
  margin:8px 0 0;font-family:var(--ui);font-size:12px;line-height:1.5;
  color:var(--or);
}

/* ── Site fermé pour travaux ─────────────────────────────────
   Un voile opaque par-dessus la page déjà chargée : rien à recharger, rien
   à rediriger. L'icône est dorée mais discrète — c'est une information, pas
   une alarme : le bar est ouvert, c'est le site qui se refait. */
#goat-travaux{
  position:fixed;inset:0;z-index:9999;
  display:grid;place-items:center;padding:24px;
  background:#080B09;
  animation:travauxEntre .35s ease both;
}
@keyframes travauxEntre{from{opacity:0}to{opacity:1}}
#goat-travaux .travaux-carte{
  max-width:460px;text-align:center;
  border:1px solid var(--line-2);border-radius:16px;
  padding:40px 28px;background:rgba(255,255,255,.02);
}
/* L'écusson plutôt qu'un pictogramme : c'est la seule page du site qu'on
   verra sans rien d'autre, autant qu'elle dise chez qui on est. Le halo
   doré du hero en plus petit, pour qu'il ne flotte pas sur le noir. */
#goat-travaux .travaux-ecusson{
  display:block;width:104px;height:auto;margin:0 auto 22px;
  filter:drop-shadow(0 0 20px rgba(233,184,36,.4))
         drop-shadow(0 12px 30px rgba(0,0,0,.7));
}
#goat-travaux h1{
  font-family:var(--disp);font-size:clamp(21px,3.4vw,27px);
  line-height:1.15;letter-spacing:.005em;text-transform:uppercase;
  color:var(--or);margin:0 0 14px;text-shadow:none;
}
#goat-travaux p{
  margin:0;font-size:14.5px;line-height:1.6;color:var(--creme);opacity:.78;
}
/* La version anglaise, un cran en dessous : les deux se lisent, mais la
   première reste la principale. */
#goat-travaux .travaux-en{
  margin-top:14px;padding-top:14px;border-top:1px solid var(--line-2);
  font-size:13.5px;opacity:.6;
}
/* Les réseaux, centrés sous le texte : pendant la fermeture c'est le seul
   endroit où aller. Ils peuvent passer à la ligne — ici on n'est pas dans le
   pied de page, rien ne les serre. */
#goat-travaux .travaux-socials{
  margin-top:22px;justify-content:center;flex-wrap:wrap;
}
/* Le bouton qui redemande la page. Le même que sur la page « travaux »
   servie par nginx : deux écrans qui disent la même chose doivent avoir la
   même tête. */
#goat-travaux .travaux-recarga{
  margin-top:22px;display:inline-flex;align-items:center;gap:9px;
  padding:11px 18px;border:1px solid var(--or);border-radius:10px;
  background:rgba(233,184,36,.08);color:var(--or);cursor:pointer;
  font-family:var(--ui);font-size:13px;font-weight:600;
  letter-spacing:.1em;text-transform:uppercase;
  transition:background .2s ease,color .2s ease;
}
#goat-travaux .travaux-recarga:hover{background:var(--or);color:#12100A}
#goat-travaux .travaux-recarga svg{
  width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
#goat-travaux .travaux-recarga[aria-busy="true"] svg{
  animation:giraTravaux 1s linear infinite;
}
@keyframes giraTravaux{to{transform:rotate(360deg)}}

.hero h1{
  font-family:var(--disp);
  font-size:clamp(28px,5vw,60px);
  line-height:var(--titre-lh);letter-spacing:.005em;text-transform:uppercase;
  color:var(--or);
  text-shadow:0 4px 26px rgba(0,0,0,.85),0 0 60px rgba(233,184,36,.22);
  /* Le navigateur pose 0.67em de marge basse sur un h1 — 40px ici.
     Elle fusionnait avec celle de la baseline et l'emportait : régler
     la baseline ne changeait donc rien. On la remet à zéro pour que
     l'écart vienne bien de .tag. */
  margin-bottom:0;
}
.hero .tag{
  font-family:var(--ui);font-weight:600;font-size:clamp(14px,2vw,19px);
  letter-spacing:.34em;text-transform:uppercase;color:var(--creme);
  margin-top:15px;
}
/* ── Prochaines affiches, sous les boutons du hero ─────────
   Deux zones : une bande dorée à gauche, qui porte l'appel à
   l'action sur toute la hauteur, et le corps à droite, où trois
   affiches se relaient. Même gabarit que le compte à rebours. */
.hero-suivant{
  display:flex;flex-direction:column;
  width:100%;max-width:620px;margin:40px auto 0;
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  border-radius:16px;
  /* Ce qui dépasse est coupé. Il manquait : l'affiche est un fond posé sur
     un élément à angles droits, et elle débordait par-dessus le filet dans
     le coin en haut à droite. Le commentaire du halo, trois lignes plus bas,
     affirmait depuis toujours que cette ligne était là — elle ne l'était
     pas, et c'est justement pour ça qu'on ne la cherchait pas.

     Le halo reste une ombre portée : `overflow:hidden` ne coupe pas les
     ombres extérieures, donc les deux vont bien ensemble. */
  overflow:hidden;
  /* La bande dorée va au bord : c'est l'en-tête qui arrondit. */
  background:rgba(8,11,9,.5);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
}
.hero-suivant[hidden]{display:none}
/* ── Le cadre qui respire ────────────────────────────────────
   Pas un reflet qui tourne — celui-là on le suit des yeux et on ne lit plus
   ce qu'il y a dedans. Ici c'est le filet entier qui s'éclaire et retombe,
   lentement, comme une veilleuse : on le remarque du coin de l'œil et on
   revient à l'affiche. Quatre secondes et demie de montée, autant de
   descente.

   Deux choses bougent ensemble : la couleur du filet et un halo posé juste
   derrière. Le halo est une ombre portée, pas un élément : la carte a déjà
   `overflow:hidden` pour que la bande dorée touche le bord, et tout ce qu'on
   ajouterait dedans serait coupé. */
.hero-suivant{
  animation:veilleuse 9s ease-in-out infinite;
}
@keyframes veilleuse{
  0%,100%{
    border-color:color-mix(in srgb, var(--or) 30%, transparent);
    box-shadow:0 0 0 0 rgba(233,184,36,0);
  }
  50%{
    border-color:color-mix(in srgb, var(--or) 72%, transparent);
    box-shadow:0 0 22px -6px rgba(233,184,36,.28);
  }
}
/* Les filets de l'intérieur respirent avec lui : celui qui sépare « Tous les
   directs » de l'affiche, celui qui pose les deux actions en bas, et celui
   qui les sépare l'une de l'autre. Sinon le cadre s'éclaire tout seul et les
   traits du dedans restent éteints — la carte se découd. Même durée, même
   courbe : c'est un seul mouvement, pas quatre. */
.hero-suivant .hs-lien,
.hero-suivant .hs-actions,
.hero-suivant .hs-action-sobre{
  animation:veilleuseFilet 9s ease-in-out infinite;
}
@keyframes veilleuseFilet{
  0%,100%{border-color:color-mix(in srgb, var(--or) 30%, transparent)}
  50%{border-color:color-mix(in srgb, var(--or) 72%, transparent)}
}
@media (prefers-reduced-motion:reduce){
  .hero-suivant,
  .hero-suivant .hs-lien,
  .hero-suivant .hs-actions,
  .hero-suivant .hs-action-sobre{animation:none}
}
/* Pas de survol au niveau de la carte : elle réagirait aussi sur
   l'affiche, qui n'est pas cliquable. Chaque case s'éclaire seule. */

/* Chaque case porte son propre lien et rien d'autre : aucun lien ne
   s'étire au-delà du sien, sinon survoler l'affiche allumerait la
   bande voisine. La zone de l'affiche n'est pas cliquable pour
   l'instant — elle mènera à la réservation du match. */
.hs-haut{display:flex;align-items:stretch}
.hs-haut[hidden]{display:none}

/* ── Bande dorée, sur toute la hauteur du rang ── */
.hs-lien{
  flex:0 0 13%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;
  padding:14px 7px;
  /* Fond de la carte, comme les deux actions : ce sont les filets,
     et non des aplats, qui découpent les trois cases. */
  background:transparent;color:var(--or);text-decoration:none;text-align:center;
  border-right:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  font-family:var(--ui);font-size:10.5px;font-weight:600;
  letter-spacing:.07em;line-height:1.3;text-transform:uppercase;
  transition:background .25s ease;
}
.hs-lien svg{
  width:15px;height:15px;flex-shrink:0;
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
  /* Elle invite à descendre : un va-et-vient lent et court, qui
     signale la direction sans attirer l'œil en permanence. */
  animation:hs-fleche 2.8s ease-in-out infinite;
}
@keyframes hs-fleche{
  0%,100%{transform:translateY(0)}
  50%    {transform:translateY(5px)}
}
.hs-lien:hover{background:rgba(233,184,36,.10);color:var(--or-clair);text-decoration:none}
.hs-lien:focus-visible{outline:2px solid var(--or);outline-offset:-4px}

/* ── Corps : la case de l'affiche ──
   Fond des cartes tarif, sur cette case seulement — la bande dorée
   et les deux actions gardent celui de la carte. */
.hs-corps{
  background:linear-gradient(170deg,var(--carte-2),var(--carte));
  flex:1;min-width:0;
  display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:9px;
  padding:14px 16px 15px;
}

/* Un événement mis en avant amène son affiche : elle passe en fond de la
   case, sous un voile. Sans le voile, le doré de la date sur une photo
   claire disparaît — et ici c'est le texte qui porte l'information, la photo
   ne fait que donner le ton. Le fond de secours reste celui de la carte, au
   cas où l'image ne charge pas. */
.hs-corps-affiche{
  background-color:var(--carte-2);
  background-size:cover;background-position:center;
  position:relative;isolation:isolate;
  /* Le double de la hauteur d'une ligne de programme : une photo dans une
     bande de 80 px n'est plus une affiche, c'est une texture. Le contenu
     reste centré dedans — `.hs-corps` s'en charge déjà. */
  min-height:170px;
}
/* Le voile monte du bas, comme sur le pop-up : la photo se voit en haut et
   s'éteint sous les mots. C'est ce qui fait une affiche et pas un fond. La
   courbe est celle de `#goat-popup .popup-txt`, à une nuance près — la case
   est basse et large, donc le noir arrive plus tard en proportion. */
.hs-corps-affiche::before{
  content:'';position:absolute;inset:0;z-index:-1;
  background:linear-gradient(180deg,
    transparent 0%,
    rgba(4,8,6,.34) 22%,
    rgba(4,8,6,.82) 48%,
    rgba(4,8,6,.95) 68%,
    rgba(4,8,6,.99) 100%);
}
/* Une affiche mise en avant ne s'aligne pas comme le relais de matchs :
   l'intitulé en haut à gauche, puis au centre la date, le titre et la
   phrase, les uns sous les autres — l'ordre du pop-up. Le relais, lui, tient
   tout sur une ligne pour que trois affiches se succèdent sans que rien ne
   bouge ; une seule affiche n'a rien à faire succéder. */
/* Le texte se pose en bas et laisse le tiers du haut à la photo : c'est ce
   tiers nu qui fait voir qu'il y a une affiche derrière les mots. La réserve
   du haut est écrite en pixels — un pourcentage de padding se calculerait
   sur la LARGEUR de la case, qui n'a rien à voir. */
.hs-corps-affiche{justify-content:flex-end;gap:12px;padding:52px 18px 20px}
.hs-af-centre{
  display:flex;flex-direction:column;align-items:center;gap:9px;
  text-align:center;min-width:0;
}
.hs-af-quand{
  margin:0;font-family:var(--ui);font-size:15px;font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;color:var(--or);
}
.hs-af-titre{
  margin:0;font-family:var(--disp);font-weight:600;
  font-size:clamp(20px, 4.6vw, 30px);line-height:1.1;
  letter-spacing:.03em;text-transform:uppercase;color:#fff;
  max-width:100%;
}
.hs-af-titre .or{color:var(--or)}
/* Les deux camps sur une ligne, à la même taille : c'est le titre, et les
   noms en héritent — d'où le `font-size:inherit`, sinon `.hs-eq b` leur
   remettrait la taille des lignes de programme. */
.hs-af-duel{display:flex;align-items:center;justify-content:center;gap:14px}
.hs-af-duel .hs-eq{min-width:0}
.hs-af-duel .hs-eq b{
  font-family:inherit;font-size:inherit;font-weight:inherit;
  letter-spacing:inherit;color:inherit;line-height:inherit;
  /* Pas de points de suspension ici : le titre rapetisse pour tenir, et
     « LIVERPO… vs MANCHESTER C… » n'annonce rien. */
  overflow:visible;text-overflow:clip;
}
.hs-af-duel .hs-sep{font-size:.6em;color:var(--or)}
/* Quand même les noms serrés ne tiennent pas : il ne reste que les blasons,
   et l'affiche reste sur une ligne. Cachés pour l'œil, pas pour le lecteur
   d'écran — c'est un nom d'équipe, pas de la décoration. La classe est posée
   par `ajusteAffiche()`, qui est le seul à savoir si ça tient. */
.hs-af-duel.sans-noms .hs-eq b{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0;
}
/* Seuls sur la ligne, les blasons reprennent un peu de présence. */
.hs-af-duel.sans-noms .fx-crest{width:38px;height:38px}
.hs-af-duel.sans-noms .fx-crest img{max-width:38px;max-height:38px}
/* Sur un téléphone, l'affiche tient sur UNE ligne. Greg : « mobile je veux
   toujours le match sur une ligne ».

   Elle a d'abord été empilée en trois — les deux camps l'un sous l'autre et
   le « vs » au milieu —, parce qu'en une ligne qui se replie, le second
   écusson partait seul à la ligne avec son nom et le « vs » restait pendu au
   bout du premier. Mais ce n'était pas la direction qu'il fallait changer,
   c'était le REPLI : en `nowrap`, plus personne ne part seul, et c'est la
   taille qui cède. Empilée, l'affiche prenait trois lignes et repoussait la
   phrase et les boutons hors de la carte.

   Les noms sont déjà les noms COURTS — « PSG », « Les Bleus » —, donc la
   ligne a rarement à se serrer beaucoup. L'ellipse est là par sécurité :
   elle n'annonce pas grand-chose, mais un nom qui déborde de la carte
   annonce moins encore. */
@media (max-width:700px){
  .hs-af-duel{flex-wrap:nowrap;gap:7px}
  .hs-af-duel .hs-eq{justify-content:center;gap:5px;min-width:0}
  .hs-af-duel .hs-eq b{overflow:hidden;text-overflow:ellipsis}
  .hs-af-duel .hs-sep{font-size:.52em;line-height:1}
  /* Le titre descend d'un cran : « LES BLEUS vs ITALIE » avec ses deux
     drapeaux fait déjà près de trois cents pixels au minimum. */
  .hs-af-titre{font-size:clamp(15px, 4.2vw, 24px)}
  /* Et les blasons avec lui : à quarante-deux pixels chacun, ils mangeaient
     à eux seuls le quart de la ligne. */
  .hs-af-duel .fx-crest{width:26px;height:26px}
  .hs-af-duel .fx-crest img{max-width:26px;max-height:26px}
  .hs-af-duel .fx-crest .ico{width:19px;height:19px}
}
.hs-af-texte{
  margin:0;font-family:var(--ui);font-size:13px;line-height:1.5;
  color:rgba(244,239,230,.72);
}

/* ── Plusieurs annonces : les mêmes affiches, qui se relaient ──
   Une annonce garde sa mise en page qu'elle soit seule ou accompagnée : ce
   qu'on regarde est la même chose. Le relais des matchs, lui, aligne tout sur
   une ligne pour faire défiler des rencontres, et ça ne va pas à une affiche.

   Les vues occupent la même case de la grille : elles se superposent, la case
   prend la hauteur de la PLUS HAUTE et rien ne saute d'une affiche à l'autre
   — aucune hauteur fixe à tenir à jour, et la plus bavarde des trois donne la
   mesure aux autres. La photo et le voile descendent sur chaque vue : posés
   sur la case, ils vaudraient pour toutes et on ne verrait qu'une image. */
/* Deux classes, pas une : `.hs-corps` reprend un padding dans le bloc
   téléphone plus bas, et à égalité de poids c'est la dernière qui gagne. La
   réserve, ici, appartient aux vues — la case, elle, n'en a aucune. */
.hs-corps.hs-corps-vues{padding:0;gap:0;background-color:var(--carte-2);position:relative}
.hs-af-piste{display:grid;flex:1;min-width:0}
.hs-af-vue{
  grid-area:1 / 1;position:relative;isolation:isolate;min-width:0;
  display:flex;flex-direction:column;justify-content:flex-end;gap:12px;
  /* Le texte se pose en bas et laisse le haut à la photo : c'est ce qui fait
     voir qu'il y a une affiche derrière les mots. */
  padding:52px 18px 20px;min-height:170px;
  background-color:var(--carte-2);background-size:cover;background-position:center;
  opacity:0;pointer-events:none;transition:opacity .9s ease;
}
/* L'entrante attend que la sortante soit bien partie : en plein fondu croisé,
   deux titres se superposent et plus rien ne se lit. */
.hs-af-vue.actif{opacity:1;pointer-events:auto;transition-delay:.35s}
/* Le voile monte du bas, comme sur le pop-up : la photo se voit en haut et
   s'éteint sous les mots. Même courbe que `.hs-corps-affiche`. */
.hs-af-vue::before{
  content:'';position:absolute;inset:0;z-index:-1;
  background:linear-gradient(180deg,
    transparent 0%,
    rgba(4,8,6,.34) 22%,
    rgba(4,8,6,.82) 48%,
    rgba(4,8,6,.95) 68%,
    rgba(4,8,6,.99) 100%);
}
/* Les pastilles par-dessus, en bas : la photo va d'un bord à l'autre de la
   case — c'est ce qui en fait une affiche et pas une bande illustrée —, donc
   elles ne peuvent pas prendre leur place dans le flux. La réserve en bas des
   vues leur laisse la ligne. */
.hs-corps-vues .hs-puces{
  position:absolute;left:0;right:0;bottom:9px;z-index:2;margin:0;
}
.hs-corps-vues-puces .hs-af-vue{padding-bottom:30px}

/* Intitulé fixe et date qui tourne, sur la même ligne. */
.hs-tete{
  display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;
  /* Aucun espacement horizontal : il ne s'appliquerait qu'à gauche de
     la piste des dates et décalerait son centre de la même valeur.
     L'écart pastille/intitulé est porté par la pastille. */
  row-gap:6px;column-gap:0;
  font-family:var(--ui);font-size:11px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;
}
.hs-label{color:var(--or);font-weight:300;font-size:11px;letter-spacing:.18em}
.hs-quand,.hs-h{color:#fff}
.hs-comp{color:#7A8479;font-weight:400}

/* Le point respire au lieu de clignoter : une onde qui s'éteint. */
.hs-point{
  width:7px;height:7px;border-radius:50%;background:var(--or);flex-shrink:0;
  position:relative;top:-1px;margin-right:9px;
  animation:hs-pulse 2.6s ease-out infinite;
}
@keyframes hs-pulse{
  0%  {box-shadow:0 0 0 0 color-mix(in srgb, var(--or) 55%, transparent)}
  70% {box-shadow:0 0 0 9px transparent}
  100%{box-shadow:0 0 0 0 transparent}
}

/* Les affiches occupent la même case de la grille : elles se
   superposent, et la piste prend la hauteur de la plus haute —
   aucune hauteur fixe à tenir à jour. Deux pistes tournent de
   concert : la date en haut, l'affiche en dessous. */
.hs-piste{display:grid;justify-items:center}
/* La piste des dates occupe tout ce qui reste après l'intitulé :
   la date se centre donc entre « Prochainement » et le bord droit,
   et non par rapport à la carte entière. */
.hs-piste-info{flex:1;min-width:0}
.hs-info,.hs-match{
  grid-area:1 / 1;
  opacity:0;pointer-events:none;
  transition:opacity .28s ease,transform .28s ease;
  transform:translateY(6px);
}
/* L'entrante attend que la sortante ait fini : sans ce décalage les
   deux affiches se superposent en plein fondu, et le texte devient
   illisible pendant une demi-seconde. */
.hs-info.actif,.hs-match.actif{
  opacity:1;transform:none;pointer-events:auto;transition-delay:.22s;
}
/* Sans nowrap : la compétition la plus longue — « Vuelta · dernière
   étape » — dépasse la largeur disponible sur mobile et sortait de la
   carte. Elle passe maintenant à la ligne. */
.hs-info{
  display:flex;align-items:center;justify-content:center;flex-wrap:wrap;
  gap:4px 9px;min-width:0;
  /* Sans cette borne, la case de grille se dimensionne sur le contenu
     et le retour à la ligne ne se déclenche jamais. */
  max-width:100%;
}
.hs-piste,.hs-piste-info{max-width:100%;min-width:0}
.hs-match{display:flex;align-items:center;justify-content:center;flex-wrap:nowrap;gap:12px;min-width:0;width:100%}
.hs-eq{display:flex;align-items:center;gap:8px;min-width:0}
.hs-eq b{
  font-family:var(--disp);font-weight:600;font-size:clamp(14px, 3.2vw, 22px);
  letter-spacing:.04em;text-transform:uppercase;color:#fff;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  min-width:0;line-height:1;
}
/* Deux camps : colonnes égales, « vs » pile au milieu, sans
   max-width en % (il se calculait sur la largeur du match, elle-même
   définie par les équipes — d'où « PS… » et le trou à droite). */
.hs-match-duel{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);
  justify-items:stretch;
  gap:10px 12px;
  width:100%;
}
.hs-match-duel .hs-eq:first-child{justify-content:flex-end}
.hs-match-duel .hs-eq:last-child{justify-content:flex-start}
.hero-suivant .fx-crest{width:42px;height:42px;flex-shrink:0}
.hero-suivant .fx-crest img{max-width:42px;max-height:42px}
.hero-suivant .fx-crest .ico{width:29px;height:29px;background:var(--or)}
.hero-suivant .hs-letra{
  display:flex;align-items:center;justify-content:center;
  font-family:var(--disp);font-size:15px;font-weight:600;color:var(--or);
  background:rgba(233,184,36,.12);
  border:1px solid color-mix(in srgb, var(--or) 35%, transparent);
}
.hs-sep{
  font-family:var(--disp);font-style:normal;font-size:13px;color:var(--or);
  letter-spacing:.14em;text-transform:uppercase;
  flex-shrink:0;line-height:1;align-self:center;padding:0 2px;
}

/* ── Pied de carte : les deux actions ───────────────────────
   Deux segments pleine largeur plutôt que deux boutons posés dans
   la carte : le pied se lit comme une barre, et l'action qui
   rapporte reste la seule en aplat doré. */
.hs-actions{
  display:flex;
  border-top:1px solid color-mix(in srgb, var(--or) 30%, transparent);
}
.hs-action{
  flex:1;display:flex;align-items:center;justify-content:center;
  padding:15px 14px;text-align:center;text-decoration:none;
  font-family:var(--ui);font-size:11.5px;font-weight:600;
  letter-spacing:.13em;text-transform:uppercase;
  transition:background .25s ease,color .25s ease;
}
.hs-action-or,.hs-action-sobre{background:transparent;color:var(--or)}
.hs-action-sobre{
  border-left:1px solid color-mix(in srgb, var(--or) 30%, transparent);
}
.hs-action-or:hover,.hs-action-sobre:hover{
  background:rgba(233,184,36,.10);color:var(--or-clair);text-decoration:none;
}
.hs-action:focus-visible{outline:2px solid var(--or);outline-offset:-4px}

/* Puces de relais, au-dessus du lien étiré pour garder leur clic. */
/* Le corps étire ses enfants pour que la ligne du haut se cale à
   gauche : les puces, elles, restent centrées sous l'affiche. */
.hs-puces{display:flex;justify-content:center;gap:7px;margin-top:1px}
.hs-puce{
  width:6px;height:6px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background:rgba(245,235,216,.28);
  transition:background .3s ease,transform .3s ease;
}
.hs-puce:hover{background:rgba(245,235,216,.55)}
.hs-puce.actif{background:var(--or);transform:scale(1.25)}
.hs-puce:focus-visible{outline:2px solid var(--or);outline-offset:3px}

@media (max-width:560px){
  /* 13 % d'une carte de 354 px ne laisseraient que 46 px : le mot
     « programme » n'y tiendrait pas. La bande passe en largeur fixe. */
  .hero-suivant{margin-top:22px}
  .hs-lien{flex:0 0 78px;font-size:9.5px;padding:12px 6px;gap:12px}
  .hs-corps{padding:12px 12px 13px;gap:8px}
  .hs-corps-affiche{min-height:150px;padding:45px 14px 16px}
  .hs-af-vue{min-height:150px;padding:45px 14px 16px}
  .hs-corps-vues-puces .hs-af-vue{padding-bottom:26px}
  .hs-af-quand{font-size:13px;letter-spacing:.14em}
  .hs-af-texte{font-size:12px}
  .hs-tete{gap:7px;font-size:10px;letter-spacing:.1em}
  .hs-label{font-size:10px;letter-spacing:.14em}
  /* La date ne tient pas sur la ligne de l'intitulé à cette largeur :
     en base flexible à 100 %, elle passe dessous, pleine largeur et
     toujours centrée, au lieu de déborder hors de la carte. */
  /* La date prend sa propre ligne dès qu'elle ne tient plus à côté
     de l'intitulé, et non seulement sous 560 px. */
  .hs-piste-info{flex:1 0 100%}
  .hs-info{gap:7px}
  .hs-eq b{font-size:16px}
  .hero-suivant .fx-crest{width:34px;height:34px}
  .hero-suivant .fx-crest img{max-width:34px;max-height:34px}
  .hero-suivant .fx-crest .ico{width:24px;height:24px}
  .hs-match{gap:10px}
  /* Côte à côte, chaque segment tomberait sous les 150 px : le
     libellé passerait sur deux lignes. On les empile. */
  .hs-actions{flex-direction:column}
  .hs-action{padding:13px 14px;font-size:11px}
  .hs-action-sobre{
    border-left:0;
    border-top:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  }
}
@media (prefers-reduced-motion:reduce){
  .hs-point,.hs-lien svg{animation:none}
  .hs-info,.hs-match{transition:none}
}

/* Compte à rebours */
.countdown{
  display:flex;justify-content:center;gap:10px;flex-wrap:wrap;
  margin:38px auto 0;max-width:620px;
}
.cd{
  flex:1;min-width:88px;
  background:rgba(8,11,9,.62);backdrop-filter:blur(12px);
  /* Même filet que la carte des affiches, juste en dessous : les deux
     blocs se répondent au lieu de proposer deux gris différents. */
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  border-radius:12px;padding:16px 8px;
}
.cd b{
  display:block;font-family:var(--disp);font-size:clamp(28px,4.4vw,42px);
  line-height:1;color:var(--creme);font-variant-numeric:tabular-nums;
}
.cd span{
  display:block;margin-top:8px;font-family:var(--ui);font-size:10px;
  letter-spacing:.26em;text-transform:uppercase;color:var(--or);
}
.opening{
  margin-top:26px;font-family:var(--ui);font-weight:300;
  font-size:clamp(13px,1.7vw,16px);letter-spacing:.34em;
  text-transform:uppercase;color:var(--tx-2);
}
.opening b{color:var(--or);font-weight:600}

/* ══ L'ESSENTIEL ═══════════════════════════════════════════ */
.essentiel{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
  gap:14px;margin-top:52px;
}
.ess{
  position:relative;overflow:hidden;isolation:isolate;
  padding:34px 20px;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:16px;
  background:var(--carte-2);
  transition:border-color .28s ease,transform .28s ease;
}
/* Photo de fond, puis voile : sans le second, ni l'icône dorée
   ni le texte crème ne tiennent sur une image claire. */
.ess::before{
  content:"";position:absolute;inset:0;z-index:-2;
  background-size:cover;
  /* --cadre vise la zone intéressante de chaque photo : la vignette
     est étroite, un cadrage centré coupait le sujet. */
  background-position:var(--cadre,center);
  transition:opacity .35s ease,transform .6s cubic-bezier(.2,.7,.3,1);
  opacity:.62;
}
.ess::after{
  content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(180deg,rgba(6,10,8,.20) 0%,rgba(6,10,8,.55) 34%,rgba(6,10,8,.88) 68%,rgba(6,10,8,.99) 100%);
}
/* Au survol, le même reflet que le cadre des fléchettes fait le tour de la
   carte. Ici pas de pseudo-élément libre — ::before porte la photo et ::after
   le voile — alors le dégradé est peint dans le fond de la carte elle-même :
   la couleur pleine découpée sur la boîte de contenu, le dégradé conique sur
   la boîte de bordure. Il ne dépasse donc que par le liseré d'1px, et le
   bord doit passer en transparent pour le laisser voir. */
.ess:hover{
  border-color:transparent;
  transform:translateY(-5px);
  background:
    linear-gradient(var(--carte-2),var(--carte-2)) padding-box,
    conic-gradient(from var(--goat-flux),
      color-mix(in srgb, var(--or) 26%, transparent) 0 58%,
      color-mix(in srgb, var(--or) 70%, transparent) 70%,
      #FFF0BE 76%,
      color-mix(in srgb, var(--or) 70%, transparent) 82%,
      color-mix(in srgb, var(--or) 26%, transparent) 94%) border-box;
  animation:goatFlux 7s linear infinite;
}
.ess:hover::before{opacity:.82;transform:scale(1.07)}

/* Les chemins vivent ici, et non dans une variable posée en HTML :
   une URL relative dans une variable CSS est résolue par rapport à
   la feuille de style, ce qui donnait assets/css/assets/img/… */
.ess-direct::before{background-image:url('../img/4k.jpg')}
.ess-flechettes::before{background-image:url('../img/darts.jpg')}
.ess-evenements::before{background-image:url('../img/evenement.jpg')}
.ess-food::before{background-image:url('../img/drink.jpg')}
.ess-reservations::before{background-image:url('../img/reserved.jpg')}
.ess-ambiance::before{background-image:url('../img/ambiance.jpg')}
/* URL absolue depuis l'API (panel Web) : une relative se résoudrait contre le CSS. */
.ess-photo::before{background-image:var(--ess-photo)}
.ess:hover .ico{transform:scale(1.09)}
.ess b{
  font-family:var(--ui);font-weight:500;font-size:12.5px;
  letter-spacing:.18em;text-transform:uppercase;color:var(--creme);
}
.ess p{font-size:13px;color:var(--tx-2);line-height:1.55;max-width:24ch}
/* Carte sans icône : le contenu descend au bas de la carte pour que son
   texte s'aligne sur celui des cartes voisines. Sans ça, il remontait de
   toute la hauteur de l'icône et la ligne du bas devenait un escalier. */
.ess-sans-ico{justify-content:flex-end}

/* ══ PROGRAMME TV — bandeaux d'affiches ════════════════════ */
/* Même respiration au-dessus et en dessous du titre de section.
   La marge basse du .h2 (8px) est absorbée par collapse, elle ne compte pas. */
.fixtures{display:flex;flex-direction:column;gap:14px;margin-top:56px}
.fixture{
  display:grid;grid-template-columns:auto 1fr auto;
  align-items:center;gap:22px;
  padding:15px 22px;border-radius:14px;
  border:1px solid var(--line-2);
  background:linear-gradient(100deg,rgba(233,184,36,.11),rgba(233,184,36,.03) 45%,rgba(16,23,19,.55));
  transition:border-color .25s ease;
}
.fixture:hover{border-color:var(--or)}

/* Pavé de date plein : l'ancre visuelle de la ligne. À 80 px, c'était lui
   qui décidait de la hauteur de la fiche — il dépassait de quatre pixels les
   deux lignes posées à côté et tirait tout le reste avec lui. Ramené à la
   hauteur de ce qu'il accompagne, c'est le contenu qui commande. */
.fx-day{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  width:62px;height:62px;flex-shrink:0;
  border-radius:12px;background:var(--or);color:#12100A;
}
.fx-day span{
  font-family:var(--ui);font-size:9.5px;font-weight:600;
  letter-spacing:.18em;text-transform:uppercase;opacity:.72;
}
.fx-day b{font-family:var(--disp);font-size:26px;line-height:1;margin-top:1px}
.fx-day i{
  font-family:var(--ui);font-style:normal;font-size:8.5px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;opacity:.6;margin-top:2px;
}

/* ── Une soirée du bar, rangée avec les matchs ──
   Même gabarit, une seule chose qui change : le pavé de date. Dans une liste
   de matchs, une ligne qui a exactement la même tête qu'un match est prise
   pour un match, et on ne lit le titre qu'après s'être trompé. */
.fx-day-fete{background:var(--vert-fade)}
.fixture-fete{border-color:rgba(147,185,160,.30)}
.fixture-fete .fx-meta b{color:var(--vert-fade-clair)}
.fx-fete-titre{
  margin:0 0 3px;
  font-family:var(--disp);font-size:20px;line-height:1.15;
  letter-spacing:.02em;color:var(--creme);
}
/* La phrase sous le titre.
   Elle n'avait AUCUNE règle : un <p> nu, et le navigateur lui posait son
   blanc d'une ligne au-dessus et au-dessous. C'est de là que venaient et
   l'écart avec le titre et le vide sous la carte — pas d'un réglage, d'une
   absence de réglage. Vaut aussi pour la note d'un match, qui avait le même
   trou. */
.fx-note{
  margin:0;
  font-family:var(--ui);font-size:13.5px;line-height:1.45;
  color:var(--tx-2);
}
/* Un peu moins haute que les fiches de match : elle n'a pas de blasons, donc
   le même rembourrage y laissait un creux sous la dernière ligne. */
.fixture-fete{padding-top:13px;padding-bottom:13px}
/* Le bloc de texte au milieu de la carte, quoi qu'il fasse comme hauteur. */
.fixture-fete .fx-body{align-self:center}
.fx-cta-fete{border-color:rgba(147,185,160,.38)}
.fx-cta-fete:hover{
  background:rgba(147,185,160,.12);border-color:var(--vert-fade);
}

/* L'icône de la fête sur la case du jour. Sans elle, la soirée n'existe que
   pour qui clique le bon jour par hasard : les icônes de sport disent où sont
   les matchs, rien ne disait où est la fête.
   C'était un point de couleur ; au milieu des ballons et des ovales, un rond
   n'annonce rien. Même taille que les autres, et la couleur des soirées. */
.day-icos .day-ico-fete{
  width:16px;height:16px;background:var(--vert-fade);
}
/* Sur le jour choisi le fond est doré : comme les icônes de sport, elle
   passe en sombre pour rester lisible. */
.day-on .day-icos .day-ico-fete{background:#12100A;opacity:.6}

/* ── Suggérer une diffusion ──────────────────────────────────
   Les deux boutons d'un jour vide, dans la troisième colonne de la fiche.
   En colonne dès qu'on manque de place : côte à côte, « Suggérer une
   diffusion » écrasait « Réserver » sur un téléphone. */
.fx-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}
/* Le bouton discret des deux : suggérer est une idée, réserver est l'action.
   Même gabarit, moins d'encre. */
.fx-cta-suggerer{
  border-color:var(--line-2);color:var(--tx-2);
  font-size:12px;
}
.fx-cta-suggerer:hover{border-color:var(--or);color:var(--creme)}

#goat-suggestion{position:fixed;inset:0;z-index:9997;display:grid;place-items:center;padding:20px}
#goat-suggestion[hidden]{display:none}
#goat-suggestion .sg-voile{
  position:absolute;inset:0;background:rgba(4,8,6,.78);
  opacity:0;transition:opacity .2s ease;
  -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);
}
#goat-suggestion.abierto .sg-voile{opacity:1}
#goat-suggestion .sg-carte{
  position:relative;z-index:1;width:min(460px,92vw);max-height:88dvh;overflow-y:auto;
  padding:26px 24px 24px;
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  border-radius:16px;background:var(--carte-2);
  box-shadow:0 30px 70px -24px rgba(0,0,0,.9);
  opacity:0;transform:translateY(12px) scale(.985);
  transition:opacity .2s ease,transform .2s cubic-bezier(.2,.7,.3,1);
}
#goat-suggestion.abierto .sg-carte{opacity:1;transform:none}
#goat-suggestion .sg-carte:focus,#goat-suggestion .sg-carte:focus-visible{outline:none}
#goat-suggestion .sg-fermer{
  position:absolute;top:10px;right:10px;
  width:38px;height:38px;display:grid;place-items:center;
  border:1px solid rgba(244,239,230,.18);border-radius:50%;
  background:transparent;color:var(--tx-2);cursor:pointer;
  transition:background .2s ease,color .2s ease,border-color .2s ease;
}
#goat-suggestion .sg-fermer:hover{background:var(--or);color:#12100A;border-color:var(--or)}
#goat-suggestion .sg-fermer svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
#goat-suggestion .sg-titre{
  margin:0 40px 6px 0;font-family:var(--disp);font-size:24px;line-height:1.1;
  letter-spacing:.02em;color:var(--creme);text-transform:uppercase;
}
#goat-suggestion .sg-intro{margin:0 0 18px;font-size:13.5px;line-height:1.5;color:var(--tx-2)}
#goat-suggestion .sg-form{display:flex;flex-direction:column;gap:12px}
#goat-suggestion .sg-duo{display:grid;grid-template-columns:1fr 1fr;gap:12px}
#goat-suggestion label{display:block}
#goat-suggestion label>span{
  display:block;margin-bottom:5px;
  font-family:var(--ui);font-size:11px;font-weight:500;
  letter-spacing:.12em;text-transform:uppercase;color:var(--tx-2);
}
#goat-suggestion input,#goat-suggestion textarea,#goat-suggestion select{
  width:100%;padding:10px 12px;
  border:1px solid var(--line-2);border-radius:10px;
  background:rgba(4,8,6,.5);color:var(--creme);
  font-family:var(--ui);font-size:14px;line-height:1.4;
}
/* L'heure : le même menu que le créneau d'une réservation. La flèche du
   navigateur est grise et se perd sur le noir ; on la remplace par la
   nôtre, en doré, dessinée dans le fond. */
#goat-suggestion select{
  appearance:none;-webkit-appearance:none;
  padding-right:30px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23e9b824' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right 9px center;
  background-size:14px 14px;
}
#goat-suggestion select:focus{outline:none;border-color:var(--or)}
/* La liste déroulée, elle, est dessinée par le système : on lui donne au
   moins le fond de la maison, sinon elle sort blanche. */
#goat-suggestion select option{background:#0B120E;color:var(--creme)}
#goat-suggestion textarea{resize:vertical;min-height:72px}
#goat-suggestion input:focus,#goat-suggestion textarea:focus{
  outline:none;border-color:var(--or);
}
/* La date : une ligne qu'on lit, pas un champ qu'on remplit. Dans neuf cas
   sur dix c'est le jour qu'on a sous les yeux, et un sélecteur de date de
   plus est un obstacle. « Autre date » le fait apparaître. */
#goat-suggestion .sg-date{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  font-family:var(--ui);font-size:13.5px;color:var(--tx-2);
}
#goat-suggestion .sg-date b{color:var(--creme);font-weight:600}
#goat-suggestion .sg-autre{
  background:none;border:none;padding:0;cursor:pointer;
  font-family:var(--ui);font-size:12.5px;color:var(--or);
  text-decoration:underline;text-underline-offset:3px;
}
#goat-suggestion .sg-autre:hover{color:var(--or-clair)}
#goat-suggestion .sg-date-champ{display:inline-flex}
#goat-suggestion .sg-date-input{max-width:190px}
#goat-suggestion .sg-hora-input{max-width:120px}
/* flatpickr cache l'original et pose le sien à côté : sans cette règle,
   le champ caché comptait encore dans la ligne et laissait un trou. */
#goat-suggestion input.flatpickr-input.form-control[readonly]{display:block}
#goat-suggestion .sg-date-input.flatpickr-input:not([readonly]){display:none}
/* Le petit calendrier et la petite horloge que le navigateur dessine dans
   ces champs sont gris et se perdent sur le fond noir. Le filtre les repeint
   en doré : `invert` les passe en blanc, puis sepia+saturate+hue-rotate les
   amènent sur l'or de la maison. C'est la seule façon d'atteindre un dessin
   que le navigateur garde pour lui. */
#goat-suggestion .sg-date-input::-webkit-calendar-picker-indicator,
#goat-suggestion .sg-hora-input::-webkit-calendar-picker-indicator{
  cursor:pointer;opacity:1;
  filter:invert(78%) sepia(64%) saturate(548%) hue-rotate(359deg) brightness(95%) contrast(92%);
}
/* L'appât : hors écran, jamais affiché, jamais dans la tabulation. */
#goat-suggestion .sg-miel{
  position:absolute;left:-9999px;width:1px;height:1px;opacity:0;
}
#goat-suggestion .sg-err{
  margin:0;font-size:13px;line-height:1.45;color:#E98A8A;
}
#goat-suggestion .sg-envoyer{margin-top:4px;align-self:flex-start}
#goat-suggestion .sg-ok{
  margin:0;font-size:14.5px;line-height:1.5;color:var(--vert-clair);
}
@media (max-width:520px){
  #goat-suggestion .sg-duo{grid-template-columns:1fr}
}

.fx-body{min-width:0}
.fx-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 8px}
/* Le sport, devant l'heure. En blanc : le doré appartient à l'heure, et deux
   dorés l'un contre l'autre ne hiérarchisent plus rien.
   `align-items:center` et non `baseline` : une icône n'a pas de ligne de
   base, elle se serait posée par son bas contre celle des lettres. */
.fx-meta .fx-sport{
  width:19px;height:19px;flex-shrink:0;
  background:var(--creme);
}
.fx-meta b{font-family:var(--disp);font-size:20px;line-height:1;color:var(--or)}
/* La compétition — « UEFA Nations League », « Top 14 · J5 », « Événement du
   bar » — en petit et en fin.
   Elle était au même corps que l'heure, dans la typographie étroite et grasse
   des titres : deux blocs de la même force l'un contre l'autre, et le nom de
   la compétition pesait autant que le titre de la carte juste en dessous.
   C'est un classement, pas un titre : Inter, plus petit, léger, bien espacé. */
.fx-meta span{
  font-family:var(--ui);font-size:12px;font-weight:400;line-height:1.1;
  letter-spacing:.16em;text-transform:uppercase;color:var(--tx-2);
}

.fx-teams{display:flex;align-items:center;flex-wrap:wrap;gap:14px}
.fx-team{display:flex;align-items:center;gap:12px;min-width:0}
/* Même gabarit pour un blason et pour l'icône du sport : les lignes
   restent alignées, qu'on ait le logo du club ou non. Le hero garde les
   siens plus grands — il n'a qu'une affiche à montrer, pas une liste. */
.fx-crest{
  width:30px;height:30px;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  overflow:hidden;line-height:0;
}
.fx-crest img{
  display:block;box-sizing:border-box;
  width:auto;height:auto;
  max-width:100%;max-height:100%;
  object-fit:contain;object-position:center;
}
.fx-crest .ico{width:23px;height:23px}
/* Drapeau national : masque rond. `cover` au lieu de `contain` parce que le
   fichier est carré (1:1) et remplit le cercle pile. Réservé aux drapeaux :
   voir blason() dans goat-programme.js. */
.fx-crest-drapeau img{
  width:100%;height:100%;
  border-radius:50%;
  object-fit:cover;
}
.fx-team span{color:#fff;font-size:16px;font-weight:600}
/* Le nom court ne sert qu'au mobile ; en dessous de 520px les deux
   rôles s'inversent. */
.fx-court{display:none}
.fx-vs{font-family:var(--disp);font-size:14px;color:var(--or);letter-spacing:.14em;text-transform:uppercase}

/* Pastille verte = on peut encore réserver ; rouge = c'est joué. */
.fx-cta{
  padding:14px 26px;font-size:11.5px;white-space:nowrap;
  background:rgba(245,235,216,.03);border-color:var(--line-2);color:var(--creme);
}
.fx-cta::before{
  content:"";width:7px;height:7px;border-radius:50%;
  background:var(--vert);box-shadow:0 0 0 3px rgba(47,160,94,.18);
}
.fx-cta:hover{background:rgba(233,184,36,.10);border-color:var(--or);transform:translateY(-2px)}

/* ══ LIGNE DU TEMPS — la semaine en cours ══════════════════ */
/* minmax(0,1fr) : sans ça les colonnes gardent min-width:auto et débordent. */
/* margin-top identique à .fixtures : même respiration sous les deux filets. */
.week{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:12px;margin-top:34px}
.day{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  padding:18px 8px;border-radius:12px;width:100%;
  border:1px solid var(--line-2);
  background:linear-gradient(180deg,rgba(233,184,36,.11),rgba(233,184,36,.03) 45%,rgba(16,23,19,.55));
  font:inherit;color:inherit;cursor:pointer;
  transition:border-color .25s ease;
}
.day:hover{border-color:var(--or)}
.day span{
  font-family:var(--ui);font-size:11px;font-weight:500;
  letter-spacing:.2em;text-transform:uppercase;color:var(--tx-2);
}
.day b{
  font-family:var(--disp);font-size:32px;line-height:1;
  color:var(--creme);font-variant-numeric:tabular-nums;
}
.day i{
  font-family:var(--ui);font-style:normal;font-size:9px;font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;color:var(--tx-2);
}
/* Aujourd'hui : pavé plein — même langage visuel que la date des affiches. */
/* Les sports du jour, en bas de la carte : la bande dit déjà quel jour on
   regarde, elle ne disait pas lesquels valent le déplacement — ni pour quoi.
   Une icône par sport, trois au plus : au-delà, ce n'est plus une indication,
   c'est une frise.

   Elles se posent dans le coin, hors de la pile centrale : celle-ci garde
   ses trois lignes et sa hauteur, que le jour diffuse ou non. Empilées et
   non alignées — trois de front rejoindraient le milieu de la carte et la
   date passerait derrière. */
.day{position:relative}
.day-icos{
  position:absolute;top:8px;right:8px;
  display:flex;flex-direction:column;align-items:center;gap:4px;
}
/* Un cran plus grandes : à 13 px, un ballon et un ovale se ressemblent, et
   c'est exactement ce que ces pastilles doivent distinguer d'un coup d'œil. */
.day-icos .ico{width:16px;height:16px}
/* Sur le jour choisi, le fond est doré : les icônes s'y perdraient. */
.day-on .day-icos .ico{background:#12100A;opacity:.6}
.day-on{background:var(--or);border-color:var(--or)}
.day-on:hover{transform:none}
.day-on span{color:#12100A;opacity:.7}
.day-on b{color:#12100A}
.day-on i{color:#12100A;opacity:.65}
/* Pastille du jour courant quand la sélection est ailleurs. */
.day-auj:not(.day-on) b{color:var(--or)}

/* Programme du jour sélectionné, sous la ligne du temps. */
/* Les fiches d'un même jour se touchaient : elles s'empilaient sans écart,
   et trois retransmissions d'affilée se lisaient comme un seul bloc. Le même
   écart que la liste des grands événements, qui est la même fiche. */
.day-event{display:flex;flex-direction:column;gap:14px;margin-top:14px}
.fx-vide{margin:0;color:var(--tx-2);font-size:14.5px;line-height:1.6;max-width:62ch}
/* Remplace le bouton de réservation sur un match déjà joué. */

/* Headings + micro elements */
.eyebrow{font-family:var(--ui);font-size:12px;letter-spacing:.26em;text-transform:uppercase;color:var(--or);margin-bottom:8px}
/* line-height:1 faisait se toucher « Espace / fléchettes » : en
   capitales accentuées le cadratin ne suffit pas. */
.h2{font-family:var(--disp);font-size:clamp(28px,5.2vw,56px);line-height:var(--titre-lh);color:var(--creme);margin:0 0 8px}
.h3{font-family:var(--ui);font-size:18px;line-height:var(--titre-lh);color:var(--creme);margin:0}
.rule{display:flex;align-items:center;gap:12px;margin-top:22px;color:var(--tx-2)}
.rule b{font-family:var(--disp);font-size:15px;letter-spacing:.2em;color:var(--or)}
/* Le <i> est le filet décoratif qui prolonge le libellé jusqu'au bord. */
.rule i{flex:1;height:1px;background:linear-gradient(90deg,var(--line-2),transparent)}
/* Le filet de la semaine en doré léger, et lui seul : cette ligne porte
   maintenant deux commandes, et le gris la laissait passer pour un intitulé
   de plus. Ailleurs il reste gris — s'il était doré partout, il ne
   signalerait plus rien nulle part. */
/* Le titre de la semaine s'écrit tout seul et change de casse selon le mois
   — « octobre » est en minuscules en français. En capitales, il reste le
   même intitulé que les autres lignes de section. */
/* Plus grand que les autres intitulés de section : celui-ci partage sa ligne
   avec deux commandes qui ont le même corps, et à taille égale on ne savait
   plus lequel des trois était le titre. */
#semaine-titre{text-transform:uppercase;font-size:19px}
#titre-semaine i{
  background:linear-gradient(90deg,
    color-mix(in srgb, var(--or) 42%, transparent), transparent);
}

/* Le bout du filet : de quoi changer de semaine sans quitter la ligne du
   titre. Discret — c'est une commande, pas une invitation. */
.rule-nav{
  flex-shrink:0;background:none;border:0;padding:2px 0;margin:0;cursor:pointer;
  display:inline-flex;align-items:center;gap:9px;
  /* La même lettre que l'intitulé de la ligne : deux corps différents sur un
     même filet, et ça se lit comme deux niveaux. C'est la couleur qui les
     distingue — l'intitulé est doré, la commande grise jusqu'au survol. */
  font-family:var(--disp);font-size:15px;font-weight:600;letter-spacing:.2em;
  text-transform:uppercase;color:var(--tx-2);
  border-radius:6px;transition:color .2s ease;
}
/* La flèche est toujours dorée, même quand le libellé est encore gris :
   c'est elle qui dit ce que fait le bouton, et on la voit avant de lire. */
.rule-nav-ico{
  width:19px;height:19px;flex-shrink:0;
  fill:none;stroke:var(--or);stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round;
}
/* Au survol, la couleur et rien d'autre : un trait sous un libellé en
   capitales espacées se lit comme un lien souligné, et celui-ci n'en est pas
   un — il change la page sous vos yeux, il n'y mène pas. */
.rule-nav:hover{color:var(--or)}
/* Le cadre reste pour la navigation au clavier : sans lui, on ne sait plus
   où l'on est dans la page. Il ne sort pas à la souris. */
.rule-nav:focus-visible{outline:2px solid var(--or);outline-offset:4px}
.rule-nav[hidden]{display:none}
/* Les deux boutons se suivent : le filet ne repousse que le premier. */
.rule-nav + .rule-nav{margin-left:14px}
/* Sur un téléphone, la flèche seule : deux libellés de seize lettres à côté
   du titre, et la ligne se casse en trois. */
@media (max-width:560px){
  .rule-nav span{display:none}
  .rule-nav{gap:0}
  .rule-nav-ico{width:16px;height:16px}
  .rule-nav + .rule-nav{margin-left:10px}
}
.lede{font-size:15.5px;color:var(--tx-2);line-height:1.7;max-width:64ch;margin:0}
.or{color:var(--or)}

/* ══ AU PROGRAMME ══════════════════════════════════════════ */
/* Autant de tuiles qu'on veut, et elles rapetissent ensemble.
   `auto-fit` + `minmax` : elles se partagent la largeur tant qu'elles tiennent
   au-dessus du plancher, et passent à la ligne après. Avant c'était une seule
   ligne quel qu'en soit le nombre — douze, ça allait ; à vingt-neuf chaque
   tuile aurait fait trente pixels. */
.programme{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(78px,1fr));
  gap:8px;margin-top:34px;
}
.sport{
  /* Carrée, quelle que soit sa largeur.
     Sans ça, la tuile gardait la hauteur de son contenu pendant que la largeur
     se divisait : à quatorze sports elles étaient nettement plus hautes que
     larges, et celle dont le nom passait sur deux lignes dépassait les
     autres. La proportion d'abord, le contenu s'y range. */
  aspect-ratio:1/1;
  padding:9% 5%;text-align:center;width:100%;overflow:hidden;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  /* El aire entre el icono y el nombre. En % del ancho, como el resto: así la
     casilla pequeña no se queda con la separación de la grande. */
  gap:13%;
  border-radius:14px;border:1px solid var(--line-2);
  /* Mêmes teintes que les bandeaux d'affiches, mais en dégradé vertical. */
  background:linear-gradient(180deg,rgba(233,184,36,.11),rgba(233,184,36,.03) 45%,rgba(16,23,19,.55));
  font:inherit;color:inherit;cursor:pointer;
  transition:border-color .25s ease,transform .25s ease,background .25s ease;
}
/* Sport dont le programme est ouvert en dessous. */
.sport-on{border-color:var(--or);background:rgba(233,184,36,.09)}
.sport-on b{color:var(--creme)}

/* Programme du sport sélectionné. :empty évite une marge fantôme
   tant qu'aucun sport n'est ouvert. */
.sport-event{display:flex;flex-direction:column;gap:14px;margin-top:14px}
.sport-event:empty{display:none}
.sport-vide{
  margin:0;padding:22px 24px;border-radius:14px;
  border:1px dashed var(--line-2);background:rgba(16,23,19,.35);
  color:var(--tx-2);font-size:14.5px;
}
/* Le bloc porte la phrase ET le bouton, sur UNE ligne : la phrase à gauche,
   le bouton à droite. Il était dessous, ce qui donnait un pavé de deux
   étages pour dire « il n'y a rien, voulez-vous demander quelque chose ? ».
   Au-dessous de 560 px il repasse à la ligne — une phrase de trois mots et
   un bouton ne tiennent pas côte à côte sur un téléphone. */
.sport-vide{
  display:flex;align-items:center;justify-content:space-between;
  gap:16px;flex-wrap:wrap;
}
.sport-vide p{margin:0;flex:1 1 300px}
.sport-vide .fx-actions{margin-top:0}
.sport:hover{border-color:var(--or);transform:translateY(-4px)}
.sport:hover .ico{background:var(--or-clair)}
/* Les valeurs fixes restent : c'est ce que voit un navigateur qui ne connaît
   pas les unités de conteneur. Juste en dessous, la version qui suit la
   taille de la tuile. */
.sport .ico{width:38px;height:38px;flex-shrink:0}
/* Interlettrage resserré : c'est lui, pas le corps, qui faisait
   déborder « HANDBALL » ou « CYCLISME » d'une tuile étroite. */
.sport b{
  font-family:var(--ui);font-weight:500;font-size:9.5px;
  letter-spacing:.06em;text-transform:uppercase;color:var(--tx-2);
  /* Deux lignes au maximum, serrées, et coupées s'il le faut : « Sports
     mécaniques » ne doit pas pouvoir pousser le carré. */
  line-height:1.15;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;overflow-wrap:anywhere;
}
/* L'icône et le libellé à l'échelle de la tuile : c'est ce qui fait qu'à
   vingt-neuf sports ça reste une grille et pas une bouillie. `cqw` = 1 % de
   la largeur de la tuile. */
@supports (width:1cqw){
  .sport{container-type:inline-size}
  .sport .ico{width:42cqw;height:42cqw;max-width:38px;max-height:38px}
  .sport b{font-size:clamp(6.5px,11cqw,9.5px);letter-spacing:.04em}
}
.sport:hover b{color:var(--creme)}

/* ══ LE LIEU (3 niveaux) ═══════════════════════════════════ */
.niveaux{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:22px;margin-top:52px}
.niveau{overflow:hidden;display:flex;flex-direction:column;transition:transform .3s ease,border-color .3s ease}
.niveau:hover{transform:translateY(-6px);border-color:var(--line-2)}
/* Les plans sont des rendus sur fond blanc : fond crème + multiply pour
   qu'ils se lisent comme un plan imprimé, sans aplat blanc qui brûle la page. */
.niveau .shot{
  position:relative;background:#E8DCC4;aspect-ratio:1/1;overflow:hidden;
  border-bottom:1px solid var(--line-soft);
}
.niveau .shot img{
  width:100%;height:100%;object-fit:contain;
  mix-blend-mode:multiply;
  transition:transform .55s cubic-bezier(.2,.7,.3,1);
  filter:contrast(1.03) saturate(.96);
}
.niveau .shot::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  box-shadow:inset 0 -34px 46px -30px rgba(8,11,9,.5);
}
.niveau:hover .shot img{transform:scale(1.05)}
.niveau:hover .num{opacity:1}
@media (hover:none){.niveau .num{opacity:1}}
/* Voile sombre par défaut, libellé au centre. Il s'efface au survol
   et laisse place à la pastille en haut à gauche. */
.voile{
  position:absolute;inset:0;z-index:3;display:grid;place-items:center;
  background:rgba(6,12,9,.74);
  transition:opacity .35s ease;
}
.voile b{
  font-family:var(--disp);font-size:clamp(24px,3.2vw,40px);
  letter-spacing:.14em;text-transform:uppercase;color:var(--or);
  text-shadow:0 6px 26px rgba(0,0,0,.85),0 0 40px rgba(233,184,36,.28);
}
.niveau:hover .voile{opacity:0}

/* ── Loupe : dit que la vignette s'ouvre ─────────────────── */
.loupe{
  position:absolute;right:10px;bottom:10px;z-index:4;
  width:30px;height:30px;border-radius:50%;
  display:grid;place-items:center;
  background:rgba(8,11,9,.72);
  border:1px solid color-mix(in srgb, var(--or) 40%, transparent);
  color:var(--or);pointer-events:none;
}
.loupe svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round}
.niveau .shot{cursor:zoom-in}
.niveau .shot:focus-visible{outline:2px solid var(--or);outline-offset:-3px}

/* ── Plan en plein écran ──────────────────────────────────
   Même traitement que la vignette — fond crème et fusion en
   multiply — pour que le plan se lise comme un plan imprimé. */
.visio{
  position:fixed;inset:0;z-index:200;display:none;
  place-items:center;padding:clamp(14px,4vw,40px);
  background:rgba(6,10,8,.94);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
}
.visio.ouvert{display:grid;animation:visioParait .25s ease}
@keyframes visioParait{
  from{opacity:0;transform:scale(.97)}
  to  {opacity:1;transform:none}
}
.visio-cadre{
  position:relative;margin:0;width:100%;
  /* Les plans sont carrés : borner la largeur par la hauteur de la
     fenêtre suffit à ce qu'ils tiennent en entier. */
  max-width:min(92vw, 84vh, 760px);
  background:#E8DCC4;border-radius:14px;overflow:hidden;
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
}
.visio-cadre img{
  display:block;width:100%;height:auto;
  mix-blend-mode:multiply;filter:contrast(1.03) saturate(.96);
}
.visio-legende{
  position:absolute;left:0;right:0;bottom:0;padding:14px 16px;
  background:linear-gradient(180deg,transparent,rgba(4,8,6,.9));
  font-family:var(--ui);font-size:11.5px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;color:#fff;
}
.visio-fermer{
  position:absolute;top:clamp(12px,3vw,26px);right:clamp(12px,3vw,26px);
  width:42px;height:42px;padding:0;border-radius:50%;cursor:pointer;
  display:grid;place-items:center;
  background:rgba(8,11,9,.6);color:var(--or);
  border:1px solid color-mix(in srgb, var(--or) 40%, transparent);
  transition:background .25s ease,border-color .25s ease;
}
.visio-fermer:hover{background:rgba(233,184,36,.14);border-color:var(--or)}
.visio-fermer svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round}
.visio-fermer:focus-visible{outline:2px solid var(--or);outline-offset:3px}
@media (prefers-reduced-motion:reduce){
  .visio.ouvert{animation:none}
}
/* Sans survol possible (tactile), on montre la carte directement. */
@media (hover:none){.voile{opacity:0}}

.niveau .num{
  position:absolute;top:14px;left:14px;z-index:2;
  opacity:0;transition:opacity .3s ease;
  font-family:var(--disp);font-size:13px;letter-spacing:.16em;
  background:rgba(8,11,9,.8);backdrop-filter:blur(8px);
  border:1px solid var(--line-2);color:var(--or);
  padding:7px 13px;border-radius:999px;
}
.niveau .txt{padding:26px 24px 30px}
.niveau .txt p{color:var(--tx-2);font-size:14px;margin-top:11px;line-height:1.6}
/* Le lien de la privatisation : au bout du texte, à droite, doré et discret.
   Une privatisation se demande — elle ne s'achète pas d'un bouton plein. */
.niveau-cta{text-align:right;margin-top:16px}
.niveau-cta a{
  color:var(--or);font-size:13px;font-family:var(--ui);
  border-bottom:1px solid transparent;transition:border-color .2s ease;
}
.niveau-cta a:hover{border-bottom-color:var(--or)}

/* ══ DRINK & FOOD ══════════════════════════════════════════ */
.banner{
  border-radius:var(--r);overflow:hidden;
  /* Même filet doré que le compte à rebours et la carte du hero. */
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  margin-bottom:46px;position:relative;
}
/* ── Un flux lumineux qui fait le tour du filet ──────────────
   Un dégradé conique qu'on fait tourner, découpé pour ne garder que le bord :
   deux masques superposés, l'un sur la boîte entière et l'autre sur le
   contenu, et on garde la différence — il ne reste que le liseré d'1px.

   L'angle est une propriété enregistrée : sans @property, un navigateur ne
   sait pas interpoler un angle dans une variable et l'animation ne démarre
   pas. Là où ça manque, le filet reste ce qu'il était — doré et immobile.
   C'est exactement la bonne dégradation : personne ne voit une page cassée,
   seulement une page plus sage. */
@property --goat-flux{syntax:"<angle>";initial-value:0deg;inherits:false}
.banner::after{
  content:"";position:absolute;inset:0;z-index:2;
  border-radius:inherit;padding:1px;pointer-events:none;
  background:conic-gradient(from var(--goat-flux),
    transparent 0 58%,
    color-mix(in srgb, var(--or) 55%, transparent) 70%,
    #FFF0BE 76%,
    color-mix(in srgb, var(--or) 55%, transparent) 82%,
    transparent 94%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask-composite:exclude;
  animation:goatFlux 7s linear infinite;
}
@keyframes goatFlux{to{--goat-flux:360deg}}
/* Qui a demandé moins d'animations n'a pas demandé celle-ci non plus. Les
   cartes gardent leur bord doré : ce qui s'arrête, c'est le tour. */
@media (prefers-reduced-motion:reduce){
  .banner::after{animation:none}
  .ess:hover{animation:none;border-color:var(--or);background:var(--carte-2)}
}
/* Éteint depuis le panneau : le filet redevient ce qu'il était. On retire le
   reflet et pas seulement son animation — un dégradé conique arrêté laisse un
   côté plus clair que les autres, ce qui se voit plus qu'il ne se comprend. */
.banner.sans-flux::after{display:none}

/* display:block indispensable : en inline, l'image se pose sur la
   ligne de base et laisse un vide sous elle, dans le cadre. */
.banner img{display:block;width:100%;height:auto}
/* Le cadre tient sa hauteur du rapport de l'image, et non plus de
   l'image elle-même : c'est ce qui permet ensuite de l'animer. Image
   et vidéo se superposent en couvrant le cadre, quel qu'il devienne. */
/* width:100% est indispensable : sans elle la largeur reste « auto »,
   et dès que la hauteur devient explicite le navigateur la recalcule
   à partir du rapport — le cadre se rétrécissait alors des deux côtés
   au lieu de s'aplatir. */
.banner-film{aspect-ratio:1672/729;width:100%;
  /* Moitié de l'écart des autres bannières : ici les tarifs suivent
     immédiatement, ils appartiennent au même bloc. */
  margin-bottom:23px;}
.banner-film > img,
.banner-film .banner-video{
  position:absolute;inset:0;display:block;
  width:100%;height:100%;object-fit:cover;
}

/* La hauteur est posée en JavaScript au fil du défilement : ici, on
   ne garde que la transition qui lisse les à-coups d'un doigt sur un
   écran tactile. */
.banner-film{transition:height .12s linear}
@media (prefers-reduced-motion:reduce){
  .banner-film{transition:none}
}

/* ══ ARDOISE ═══════════════════════════════════════════════
   Toute la carte dans un seul panneau, quatre registres qu'on
   choisit par onglets. Même vocabulaire que la carte du hero :
   fond sombre, filets dorés, cases séparées par des traits. */
.ardoise{
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  border-radius:16px;overflow:hidden;
  background:rgba(8,11,9,.5);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
}
.ard-onglets{
  display:flex;
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
  border-bottom:1px solid color-mix(in srgb, var(--or) 30%, transparent);
}
.ard-onglet{
  flex:1 0 auto;position:relative;padding:17px 16px;cursor:pointer;
  background:transparent;border:0;white-space:nowrap;
  border-left:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  font-family:var(--ui);font-size:11.5px;font-weight:600;
  letter-spacing:.13em;text-transform:uppercase;color:var(--or);
  transition:background .25s ease,color .25s ease;
}
.ard-onglet:first-child{border-left:0}
.ard-onglet:hover{background:rgba(233,184,36,.10);color:var(--or-clair)}
/* Plus de trait sous l'onglet actif : c'est le fond, un peu plus
   dense que celui du survol, qui le signale. */
.ard-onglet.actif{background:rgba(233,184,36,.11);color:var(--or-clair)}
.ard-onglet:focus-visible{outline:2px solid var(--or);outline-offset:-4px}

/* Sans JavaScript les quatre panneaux restent visibles à la suite :
   la carte est toujours lisible, elle perd seulement le tri. */
.ard-panneau{padding:26px clamp(18px,2.4vw,32px) 30px}
.ardoise.pilotee .ard-panneau{display:none}
.ardoise.pilotee .ard-panneau.actif{display:block;animation:ardParait .35s ease}
@keyframes ardParait{
  from{opacity:0;transform:translateY(7px)}
  to  {opacity:1;transform:none}
}

/* Ligne de tête du panneau : le compte, puis la mention de service. */
.ard-tete{
  display:flex;align-items:center;flex-wrap:wrap;gap:10px;
  padding-bottom:16px;margin-bottom:6px;
  border-bottom:1px solid color-mix(in srgb, var(--or) 16%, transparent);
  font-family:var(--ui);font-size:11px;letter-spacing:.14em;text-transform:uppercase;
}
/* La mention de service porte seule la ligne de tête : en blanc et
   plus grande, elle se lit comme une phrase et non comme une note. */
.ard-tete .ard-note{
  color:#fff;font-weight:400;text-transform:none;letter-spacing:.01em;
  font-size:13.5px;line-height:1.55;flex:1;min-width:200px;
}
.ard-tete .prix-verre{margin-left:auto}

/* Deux colonnes pour les longues listes : une seule ligne de 1200 px
   laisserait un vide entre le nom et le prix. */
.ard-liste{columns:2;column-gap:clamp(28px,4vw,60px)}
.ard-liste .ligne{break-inside:avoid;border-bottom-color:color-mix(in srgb, var(--or) 14%, transparent);border-bottom-style:solid}

/* Les pressions n'ont pas de prix fixe : elles ferment le panneau
   plutôt que d'occuper un onglet presque vide. */
.ard-pression{
  margin-top:22px;padding:15px 18px;border-radius:10px;
  border:1px solid color-mix(in srgb, var(--or) 20%, transparent);
  background:rgba(233,184,36,.04);
  display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
}
.ard-pression b{
  font-family:var(--ui);font-size:12px;font-weight:600;letter-spacing:.13em;
  text-transform:uppercase;color:var(--or);
}
.ard-pression span{font-size:13.5px;color:var(--tx-2)}

/* Une seule colonne centrée : la phrase est courte, et en vis-à-vis
   d'une photo elle laissait une demi-largeur vide. */
.ard-planche{display:flex;flex-direction:column;align-items:center;gap:20px}
.ard-planche .mise-photo{
  width:100%;max-width:640px;height:auto;border-radius:12px;
}
.ard-planche .planche-txt{
  max-width:46ch;text-align:center;font-size:15px;color:var(--creme);margin:0;
}
.ard-plats{
  width:100%;max-width:640px;
  display:flex;flex-direction:column;
}
.ard-plats .ligne-plat{
  display:flex;align-items:center;gap:14px;
  padding:12px 0;
  border-bottom:1px dashed rgba(245,235,216,.07);
}
.ard-plats .ligne-plat:last-child{border-bottom:0}
.ard-plats .ligne-photo{
  width:56px;height:56px;object-fit:cover;border-radius:8px;flex-shrink:0;
}
.ard-plats .ligne-corps{
  display:flex;flex-direction:column;gap:3px;min-width:0;flex:1;
}
.ard-plats .ligne-plat .nom{white-space:normal}
.ard-plats .ligne-plat .det{flex:none}
.ard-plats .ligne.ligne-plat .prix{margin-left:auto;align-self:center}

/* Las mismas medidas fuera de la plancha. `lignesHtml` mete este marcado en
   .ard-liste y en .carte-menu cuando el articulo tiene foto, y alli
   .ligne-corps se quedaba sin estilo: el nombre y el detalle salian pegados y
   el precio no se iba a la derecha. */
/* `.ligne.ligne-plat` y no `.ligne-plat` a secas: el elemento lleva las dos
   clases, `.ligne` está declarada MÁS ABAJO en este fichero y con la misma
   fuerza —así que ganaba ella— y su `align-items:baseline` posaba la foto
   sobre la línea del nombre en vez de centrarla. Dos clases pesan más que una
   y el orden dentro del fichero deja de decidir. */
.ligne.ligne-plat{display:flex;align-items:center;gap:14px}
.ligne-photo{width:56px;height:56px;object-fit:cover;border-radius:8px;flex-shrink:0}
.ligne-corps{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}
/* Por lo mismo: `.ligne .nom` está más abajo y con la misma fuerza, así que
   el nombre se quedaba sin envolver y el detalle sin su ancho. */
.ligne.ligne-plat .nom{white-space:normal}
.ligne.ligne-plat .det{flex:none}
/* Les trois au centre en hauteur : la photo, le bloc nom + détail, et le prix.
   Collé en haut, le prix pendait au-dessus du vide quand le détail tenait sur
   deux lignes. */
.ligne.ligne-plat .prix{margin-left:auto;align-self:center}

@media (max-width:900px){
  .ard-liste{columns:1}
}
@media (max-width:700px){
  /* Cinq onglets ne tiennent pas sur une ligne de 354 px. Les empiler
     sur deux rangées laissait le cinquième orphelin ; les faire
     défiler obligeait à deviner qu'on peut pousser la barre. Ils
     deviennent donc un accordéon : chaque catégorie occupe sa ligne,
     et son panneau s'ouvre dessous.

     display:contents dissout la barre d'onglets : ses boutons
     deviennent enfants de l'ardoise, ce qui permet de les intercaler
     avec les panneaux par « order », sans dupliquer le HTML. */
  .ardoise{display:flex;flex-direction:column}
  .ard-onglets{display:contents}

  /* Ciblage par identifiant, et non par nth-of-type : la barre
     d'onglets reste un div frère des panneaux même dissoute, elle
     serait comptée avec eux et décalerait tout l'ordre d'un rang. */
  #ong-1{order:1}  #pan-1{order:2}
  #ong-2{order:3}  #pan-2{order:4}
  #ong-3{order:5}  #pan-3{order:6}
  #ong-4{order:7}  #pan-4{order:8}
  #ong-5{order:9}  #pan-5{order:10}

  .ard-onglet{
    display:flex;align-items:center;justify-content:space-between;gap:12px;
    width:100%;padding:16px 18px;text-align:left;white-space:normal;
    border-left:0;
    border-bottom:1px solid color-mix(in srgb, var(--or) 30%, transparent);
    font-size:11.5px;letter-spacing:.12em;
  }
  /* Le chevron dit que la ligne s'ouvre, et pivote quand elle est ouverte. */
  .ard-onglet::after{
    content:"";width:8px;height:8px;flex-shrink:0;
    border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;
    transform:rotate(45deg) translate(-2px,-2px);
    transition:transform .25s ease;
  }
  .ard-onglet.actif::after{transform:rotate(225deg) translate(-2px,-2px)}
  /* Dernière ligne fermée : pas de filet sous elle. */
  #ong-5:not(.actif){border-bottom:0}
  .ard-onglet-dernier:not(.actif){border-bottom:0}
  .ard-panneau{padding:18px 18px 24px}
  .ardoise.pilotee .ard-panneau.actif{
    border-bottom:1px solid color-mix(in srgb, var(--or) 30%, transparent);
  }
  .ardoise.pilotee #pan-5.actif{border-bottom:0}
  .ardoise.pilotee .ard-panneau-dernier.actif{border-bottom:0}
}
@media (prefers-reduced-motion:reduce){
  .ardoise.pilotee .ard-panneau.actif{animation:none}
}

/* Deux colonnes explicites : auto-fit en créerait une troisième
   maintenant qu'il y a trois cartes. */
.cartes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px}
.carte-large{grid-column:1/-1}
.carte-menu{padding:34px 30px 36px;display:flex;flex-direction:column}
.carte-menu > .h3{padding-bottom:18px;border-bottom:1px solid var(--line);margin-bottom:6px}
/* Le filet passe sur la ligne de tête, le .h3 n'étant plus enfant direct. */
.carte-tete{
  display:flex;align-items:baseline;justify-content:space-between;gap:20px;
  padding-bottom:18px;border-bottom:1px solid var(--line);margin-bottom:6px;
}
.prix-verre{font-family:var(--disp);font-size:30px;line-height:1;color:var(--or);white-space:nowrap}
.carte-menu .note{
  font-size:14px;color:var(--tx-2);font-style:italic;
  margin:14px 0 4px;line-height:1.5;
}
.ligne{
  display:flex;align-items:baseline;gap:10px;
  padding:11px 0;border-bottom:1px dashed rgba(245,235,216,.07);
}
.ligne:last-child{border-bottom:0}
.ligne .nom{font-weight:600;font-size:14.5px;color:var(--creme);white-space:nowrap}
.ligne .det{font-size:12px;color:var(--tx-2);flex:1;line-height:1.45}
.ligne .prix{
  font-family:var(--disp);font-size:16px;color:var(--or);
  white-space:nowrap;letter-spacing:.02em;
}
/* display:block sinon l'image laisse un vide sous elle, en inline. */
/* La colonne est l'élément de grille : ses deux cartes s'empilent
   sous « sans alcool » au lieu de repartir sous la colonne de gauche. */
.colonne{display:flex;flex-direction:column;gap:22px}
/* La dernière carte absorbe le mou : les deux colonnes finissent
   à la même hauteur quelle que soit la plus longue. */
.colonne > .card:last-child{flex:1}
.mise-photo{display:block;width:100%;height:auto;border-radius:9px;margin-top:18px}
.planche-txt{font-size:14px;color:var(--tx-2);line-height:1.7;margin:14px 0 0}

/* ══ COGNACS ARRANGÉS ══════════════════════════════════════ */
/* Cinq par ligne : 13 recettes donnent 5 + 5 + 3. */
.recettes{
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
  gap:10px;margin-top:22px;
}
.recette{
  display:flex;align-items:center;gap:12px;
  padding:13px 14px;border-radius:12px;
  border:1px solid var(--line-soft);background:rgba(16,23,19,.55);
  transition:border-color .22s ease,background .22s ease,transform .22s ease;
}
.recette:hover{border-color:var(--line-2);background:rgba(233,184,36,.05);transform:translateX(4px)}
/* La pastille prend la couleur du mélange, posée sur --c.
   color-mix évite d'écrire trois teintes par recette ; sans support,
   la pastille retombe simplement sur l'or. */
.recette em{
  font-style:normal;font-family:var(--disp);font-size:15px;
  color:var(--c,var(--or));min-width:30px;height:30px;
  display:grid;place-items:center;border-radius:7px;flex-shrink:0;
  border:1px solid color-mix(in srgb, var(--c,var(--or)) 55%, transparent);
  background:color-mix(in srgb, var(--c,var(--or)) 15%, transparent);
  transition:background .22s ease,border-color .22s ease;
}
.recette:hover em{
  background:color-mix(in srgb, var(--c,var(--or)) 26%, transparent);
  border-color:color-mix(in srgb, var(--c,var(--or)) 85%, transparent);
}
/* Le Spécial 13 change au gré des confitures : il porte toutes les teintes. */
.recette-13 em{
  color:#12100A;border:0;
  background:linear-gradient(135deg,#E4405F 0%,#F5A623 45%,#7CB342 100%);
}
.recette-13:hover em{filter:brightness(1.1)}
.recette span{
  font-family:var(--ui);font-weight:400;font-size:11px;
  letter-spacing:.02em;text-transform:uppercase;color:var(--creme);line-height:1.35;
}

/* ══ FLÉCHETTES ════════════════════════════════════════════ */
/* Titre posé sur le bandeau, dégradé pour garder le texte lisible
   quelle que soit la zone de l'image qui passe dessous. */
.banner-titre .banner-txt{
  position:absolute;left:0;right:0;bottom:0;
  padding:clamp(22px,3.4vw,44px);
  padding-top:clamp(60px,8vw,120px);
  background:linear-gradient(180deg,transparent,rgba(4,8,6,.55) 26%,rgba(4,8,6,.88) 58%,rgba(4,8,6,.98));
  /* Le texte à gauche, la carte promo à droite, tous deux posés sur le bas
     de l'image. `flex-end` et non `center` : les deux s'alignent sur la même
     ligne de base, celle du bas, comme deux affiches accrochées au même mur.
     En colonne étroite ça s'empile tout seul — la carte passe sous
     l'accroche, et non à côté d'un titre coupé en quatre. */
  display:flex;align-items:flex-end;justify-content:space-between;
  flex-wrap:wrap;gap:clamp(14px,2.6vw,32px);
}
.banner-txt-in{flex:1 1 320px;min-width:0}
/* Sur la vidéo, le dégradé est un cran plus dense : l'image bouge,
   et un voile calé sur une photo fixe laissait le texte vaciller. */
.banner-film .banner-txt{
  background:linear-gradient(180deg,transparent,
    rgba(4,8,6,.82) 24%,rgba(4,8,6,.98) 55%,rgba(4,8,6,1));
}
.banner-titre .h2{font-size:clamp(30px,4.4vw,52px)}

/* En colonne étroite, le rapport de l'image donne un cadre plus bas
   que son pavé de texte, qui débordait vers le haut et se faisait
   rogner. On rend donc le texte au flux : c'est lui qui fixe la
   hauteur, et l'image passe derrière en la couvrant. */
@media (max-width:700px){
  .banner-film{aspect-ratio:auto;min-height:clamp(230px,58vw,320px)}
  .banner-film .banner-txt{
    /* relative et non static : dans le flux, il donne sa hauteur au
       cadre, mais il reste un élément positionné — sinon la vidéo,
       elle positionnée, se peindrait par-dessus et l'effacerait. */
    position:relative;z-index:1;
    /* Le pavé descend : plus d'air au-dessus, moins en dessous. */
    padding-top:clamp(120px,34vw,190px);
    padding-bottom:16px;
  }
}
.banner-titre .lede{margin-top:14px;color:var(--tx);max-width:52ch}

/* Quatre tarifs sur une ligne pleine largeur, bouton en dessous. */
/* Deux tarifs : deux colonnes. En laisser quatre déclarées les
   tasserait sur la moitié gauche de la ligne. */
/* ── Les tarifs et la carte du happy hour, côte à côte ──────
   Deux tiers / un tiers, et non moitié-moitié : à gauche il y a quatre
   lignes avec un libellé long, un prix et un bouton ; à droite trois lignes
   courtes. Les proportions suivent ce qu'il y a dedans.

   `align-items:stretch` sur la rangée : la carte prend la hauteur des quatre
   tarifs. C'est ce qui fait que les deux colonnes se terminent au même
   endroit au lieu de laisser un décrochage. */
.tarifs-rangee{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:stretch}
@media (min-width:900px){
  .tarifs-rangee.avec-happy{grid-template-columns:minmax(0,66fr) minmax(0,37fr)}
}
/* Les quatre tarifs l'un sous l'autre QUAND la carte du happy hour prend le
   tiers de droite : dans les deux tiers qui restent, deux par rangée
   redonnaient des libellés coupés.

   Sans la carte, ils ont toute la largeur et reprennent deux colonnes :
   quatre lignes pleine page pour quatre prix, c'est une liste qui descend
   pour rien. C'est la même raison dans les deux sens — la mise en page suit
   la place qu'il y a. */
.tarifs{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;align-items:stretch}
@media (min-width:700px){
  .tarifs-rangee:not(.avec-happy) .tarifs{
    grid-template-columns:repeat(2,minmax(0,1fr));
  }
}
/* justify-self : sans lui l'élément s'étire sur toute la rangée. */
.tarif-cta{
  /* Collé à la note qui l'annonce : c'est la même idée en deux morceaux —
     « on peut avoir une table avec » / « réserver ». L'écart d'avant valait
     quand le bouton suivait directement les tarifs. */
  grid-column:1/-1;justify-self:center;margin-top:12px;
  border-color:rgba(47,160,94,.45);
  /* Seul le box-shadow est animé : animer border-color écraserait
     le survol, une animation l'emportant sur une règle normale. */
  animation:ledGlow 2.6s ease-in-out infinite;
}
@keyframes ledGlow{
  0%,100%{box-shadow:0 0 8px -5px rgba(47,160,94,.22)}
  50%{box-shadow:0 0 16px -3px rgba(47,160,94,.3),0 0 34px 2px rgba(47,160,94,.07)}
}
/* Même LED verte que les boutons des affiches : dispo = on peut réserver. */
.tarif-cta::before{
  content:"";width:8px;height:8px;border-radius:50%;background:var(--vert);
  box-shadow:0 0 0 3px rgba(47,160,94,.18),0 0 12px 3px rgba(47,160,94,.6);
  animation:led 2.6s ease-in-out infinite;
}
.tarif-cta:hover{border-color:var(--vert);background:rgba(47,160,94,.12)}

/* La note « piste + table », juste au-dessus du bouton : une phrase, du même
   corps et de la même encre que le reste des notes du site. Elle avait droit
   à un cadre et à une pastille ; ça ne ressemblait à rien d'autre ici. */
.tarif-note{
  grid-column:1/-1;justify-self:center;margin:26px 0 0;
  /* Sans largeur maximale : la phrase tient sur une ligne, et c'est comme ça
     qu'elle se lit d'un coup d'œil au-dessus du bouton. En dessous de sa
     largeur, elle passe à la ligne toute seule. */
  text-align:center;
  font-size:14px;line-height:1.6;color:var(--tx-2);
}
@keyframes led{0%,100%{opacity:.6}50%{opacity:1}}
/* Chaque tarif est une case, et chaque case a son bouton.
   Le prix en haut à droite, le bouton en bas : on lit ce qu'on prend, combien
   ça coûte, et on part. Avant, les quatre lignes partageaient un seul
   « Réserver » en bas, qui ouvrait l'écran des fléchettes sans rien choisir —
   on venait de cliquer « 1 heure · 25 € » et la première question était
   « combien de temps ? ». */
.tarif{
  /* Tout sur une ligne : ce qu'on prend, ce que ça coûte, et on y va.
     Le bouton était en dessous sur toute la largeur et la case faisait deux
     fois la hauteur pour trois mots. `minmax(0,1fr)` sur le libellé : c'est
     lui qui se serre, pas le prix ni le bouton. */
  display:grid;grid-template-columns:auto minmax(18px,1fr) auto auto;
  align-items:center;gap:8px 16px;
  padding:13px 16px;border-radius:12px;
  /* Le prix respire à droite : le libellé se serre, lui, alors ce n'est pas
     un espace pris à quelqu'un. */
  border:1px solid var(--line);
  /* Même fond que les cartes des niveaux. */
  background:linear-gradient(170deg,var(--carte-2),var(--carte));
  /* `relative` pour le lien étiré : voir plus bas. */
  position:relative;
  transition:border-color .25s ease;
}
.tarif:hover{
  border-color:color-mix(in srgb, var(--vert) 55%, transparent);
}
/* Petit : à côté du prix, pas à la place du prix. Et sans cadre ni fond : la
   ligne EST déjà un cadre, et un bouton encadré dedans faisait deux boîtes
   l'une dans l'autre. Restent la pastille verte et le mot. */
.tarif-btn{
  padding:7px 2px;font-size:14px;letter-spacing:.12em;gap:8px;
  white-space:nowrap;
  border:0;background:none;color:var(--creme);
}
/* Le lien étiré : un pseudo-élément qui couvre la ligne entière. Toute la
   ligne devient cliquable SANS cesser d'être un lien — on garde le clic du
   milieu, « ouvrir dans un nouvel onglet », et le clavier, ce qu'un
   `onclick` posé sur la boîte aurait tous perdus. */
.tarif-btn::after{
  content:"";position:absolute;inset:0;border-radius:inherit;
}
/* Sauf dans la carte promo : elle porte déjà son propre clic, et un calque
   invisible tendu par-dessus son titre serait une surprise pour la
   prochaine chose qu'on y mettra. */
.happy-promo-btn::after{display:none}
/* Au survol de la LIGNE, et pas du mot : puisque tout est cliquable,
   n'allumer le mot qu'à son aplomb mentirait sur ce qui répond. */
.tarif:hover .tarif-btn{color:var(--or)}
.tarif-btn::before{
  content:"";width:7px;height:7px;border-radius:50%;flex-shrink:0;
  background:var(--vert);
  box-shadow:0 0 0 2px rgba(47,160,94,.16),0 0 8px 2px rgba(47,160,94,.5);
}
.tarif-btn:hover{color:var(--or)}
/* Le filet entre la durée et le prix. Éteint aux deux bouts : un trait qui
   bute contre le texte fait un tableau, un trait qui s'évanouit fait une
   ligne de menu — et c'est un menu. */
.tarif-filet{
  height:1px;min-width:0;
  background:linear-gradient(90deg,
    transparent 0,
    rgba(255,255,255,.34) 18%,
    rgba(255,255,255,.34) 82%,
    transparent 100%);
}
/* En colonne étroite, la rangée se replie et le filet n'a plus de largeur à
   remplir : il ne reste qu'un point. */
@media (max-width:560px){
  .tarif-filet{display:none}
}
.tarif > b{margin-right:10px}
/* Deux crans plus grand qu'avant, à la demande de Greg — le PRIX, lui, ne
   bouge pas : il est déjà à vingt et c'est lui qu'on lit en premier. */
.tarif span{
  font-family:var(--ui);font-size:14px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--creme);line-height:1.4;
}
/* Le bouton est un <a>, pas un <span> : il ne doit rien hériter de la règle
   du dessus, qui est faite pour le libellé. */
.tarif .tarif-btn{text-transform:uppercase}
/* `.tarif .or` et non `.or` seul : `.tarif span` ajoute le nom de balise et
   l'emporte sur une classe, donc le doré ne sortait pas. Troisième fois
   aujourd'hui que cette règle de spécificité mord — quand une couleur
   « ne s'applique pas », c'est presque toujours une règle plus précise qui
   gagne, pas la déclaration qui manque. */
.tarif .or{color:var(--or)}
.tarif b{font-family:var(--disp);font-size:20px;color:var(--or);line-height:1;white-space:nowrap}

/* ══ CONTACT / FOOTER ══════════════════════════════════════ */
.footer{
  border-top:1px solid var(--line);
  background:linear-gradient(180deg,#080C0A,#040605);
  padding:clamp(56px,7vw,88px) 0 0;
}
/* Les trois colonnes commencent ET finissent sur la même ligne. Les deux à
   la fois, donc le surplus de hauteur ne peut aller ni en haut ni en bas :
   il se pose au milieu, avant le dernier bloc de chaque colonne (`.fbas`,
   repoussé par `margin-top:auto`). C'est l'email, la mention sous le
   formulaire et le calendrier qui finissent ensemble. */
.fgrid{
  display:grid;grid-template-columns:repeat(3,1fr);align-items:stretch;
  gap:clamp(30px,5vw,72px);
}
.fh{
  font-family:var(--ui);font-weight:700;font-size:10.5px;letter-spacing:.22em;
  text-transform:uppercase;color:#fff;margin:0 0 26px;
}
/* Colonnes en flex : le bloc marqué .fbas est repoussé en bas,
   ce qui aligne réseaux, carte et newsletter sur une même ligne. */
.fcol{display:flex;flex-direction:column}
/* Colonne d'identité : le texte reste collé à l'écusson — c'est là qu'il se
   lit —, et le reliquat se pose plus bas, entre l'adresse et les réseaux.
   Il a longtemps vécu sous l'écusson, pour que l'adresse ait le même air
   au-dessus qu'en dessous ; depuis que le calendrier a allongé la colonne
   des horaires, ce reliquat est trop gros pour tenir là sans faire un trou
   au premier regard. */
/* Les écarts viennent du `gap` de la colonne : plus de marges à eux. */
.fcol:first-child .fbaseline{margin-top:0}
.fbas{margin-top:auto}
.fcol p{font-size:14px;color:var(--tx-2);line-height:1.8;margin:0}
/* .fcol p (0,1,1) l'emportait sur .fh (0,1,0) : l'écart déclaré sur les
   intitulés du pied de page ne s'appliquait jamais. On le repose avec une
   spécificité suffisante.
   Quatorze pixels et non vingt-six : un intitulé doit toucher ce qu'il
   annonce. À vingt-six, « NEWSLETTER » flottait au-dessus de sa phrase comme
   s'il annonçait autre chose. Le même écart pour les quatre, c'est ce qui
   fait lire le pied comme un seul bloc. */
.fcol .fh{margin:0 0 14px}
.fcol a{color:var(--tx-2);font-size:14px;line-height:2}
.fcol a:hover{color:var(--or)}

/* Colonne marque */
/* ── La colonne d'identité, à espace constant ──
   Six éléments —l'écusson, la phrase, l'adresse, les réseaux, le mail et les
   moyens de paiement— et autant d'écarts différents : 18 px sous l'écusson,
   22 autour de l'adresse, 24 avant les réseaux. Ça se lisait comme quatre
   blocs sans rapport. Un seul `gap` et chacun respire pareil ; les marges
   d'avant sont annulées une à une juste en dessous. */
/* `space-between` et pas un écart plus grand écrit à la main : la colonne
   fait la hauteur de la plus haute des trois, et ce qui reste se partage
   entre les six blocs. Le premier touche le haut, le dernier touche le bas,
   et les trois colonnes commencent et finissent sur la même ligne — quelle
   que soit la hauteur du calendrier d'à côté. Un écart fixé au jugé serait
   juste aujourd'hui et faux au premier texte qui change. Le `gap` reste
   comme plancher, pour le jour où il n'y aura rien à répartir. */
/* Quatorze et non vingt-deux depuis que le téléphone est passé sous le
   mail : une ligne de vingt-huit pixels en plus. Reprise sur les écarts de
   la colonne, elle rend la hauteur qu'elle vient de prendre — les trois
   colonnes finissent toujours ensemble et le calendrier d'à côté n'a pas
   bougé. */
.fcol:first-child{gap:14px;justify-content:space-between}
.fbrand{display:flex;align-items:center;gap:13px}
.fbrand img{width:54px;height:54px;object-fit:contain}
.fbrand span{
  /* Même traitement que le mot-symbole de l'en-tête, à l'échelle du
     pied : le trait suit le corps, sinon l'épaississement paraîtrait
     plus léger ici que là-haut. */
  font-family:'Kelly Slab', var(--disp);font-size:22px;
  -webkit-text-stroke:1.1px currentColor;
  letter-spacing:.075em;text-transform:uppercase;color:var(--creme);
}
.fbaseline{max-width:34ch}

/* La marge est neutralisée plus bas par une règle du pied de page :
   on la repose avec assez de spécificité pour tenir. */
/* L'adresse en doré : c'est ce qu'on vient chercher dans un pied de page,
   au milieu d'un bloc de texte crème où rien ne ressortait. Le corps et
   l'interligne restent ceux de .fcol p — la couleur suffit à la distinguer,
   un demi-point de plus ne faisait que désaligner la colonne. */
/* Sous le plan, dans la colonne du milieu. `margin-top` et pas un `gap` de
   colonne : ici les éléments n'ont pas tous le même écart — le plan est collé
   à son intitulé et l'adresse se pose juste dessous, comme une légende. */
.fcol .fadr{color:var(--or);margin:12px 0 0}

/* Horaires : le jour à gauche, la plage à droite, un filet ténu entre
   les deux lignes. Les trois jours « selon programme » ne sont pas des
   horaires — ils prennent un ton plus discret pour ne pas se lire
   comme une plage d'ouverture. */
/* Colonne la plus courte des trois : ses sept lignes se répartissent
   sur la hauteur disponible pour que le bloc se termine au même
   niveau que les réseaux à gauche et la newsletter au centre. */
.horaires{margin:0 0 14px}
.fcol:last-child .horaires{
  flex:1;display:flex;flex-direction:column;justify-content:space-between;
}
.horaires > div{
  display:flex;align-items:baseline;justify-content:space-between;gap:16px;
  padding:6px 0;border-bottom:1px solid rgba(245,235,216,.06);
}
.horaires > div:last-child{border-bottom:0}
.horaires dt{font-family:var(--ui);font-size:13px;font-weight:600;color:var(--creme)}
.horaires dd{
  margin:0;font-size:13px;color:var(--or);
  white-space:nowrap;text-align:right;
}
.horaires .h-prog{
  color:var(--tx-2);font-size:11.5px;font-style:italic;white-space:normal;
}
/* ── Le calendrier des horaires ─────────────────────────────
   Trois mois d'ouverture, dont les jours normalement fermés qu'un match fait
   ouvrir : c'est ce que le tableau de la semaine ne pouvait pas dire. Les
   cases sont des boutons — on choisit un jour et la ligne du bas donne ses
   heures. */
/* Le calendrier est un objet, pas une suite de lignes du pied de page : son
   cadre le dit, et sépare les chiffres du reste de la colonne. */
.cal-h{
  /* Plus compact sans toucher aux tailles de texte : c'est la grille qui
     rétrécit — cases moins hautes, écarts plus serrés, cadre moins large —,
     pas ce qui se lit dedans.

     Et il occupe TOUTE la hauteur qui reste dans sa colonne. C'est ce qui
     aligne les trois par le bas, et par construction : chercher l'alignement
     en réglant la proportion des cases marchait le jour où on le réglait et
     redevenait faux au premier texte qui change de longueur ailleurs. */
  flex:1;display:flex;flex-direction:column;
  margin:0 0 14px;padding:12px 13px 11px;max-width:340px;
  border:1px solid var(--line-2);border-radius:12px;
  background:rgba(0,0,0,.22);
}
.cal-h[hidden]{display:none}
.cal-tete{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  margin-bottom:8px;
}
.cal-tete b{
  font-family:var(--ui);font-size:13px;font-weight:600;color:var(--creme);
  letter-spacing:.02em;
}
.cal-fleche{
  width:25px;height:25px;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  border:1px solid var(--line-2);border-radius:7px;background:transparent;
  color:var(--or);font-size:15px;line-height:1;cursor:pointer;
  transition:border-color .2s ease,background .2s ease,color .2s ease;
}
.cal-fleche:hover:not(:disabled){border-color:var(--or);background:rgba(233,184,36,.10)}
/* Désactivée, pas cachée : la place de la flèche ne doit pas bouger d'un
   mois à l'autre, sinon le titre se déplace sous le curseur. */
.cal-fleche:disabled{opacity:.28;cursor:default}
.cal-sem,.cal-grille{
  display:grid;grid-template-columns:repeat(7,1fr);gap:5px;
}
/* Quatre pixels sous les initiales des jours, vingt-quatre au-dessus du
   détail : la grille était collée en haut du cadre et flottait en bas.
   Elle descend et l'écart se répartit — le bloc se pose au milieu de ce
   qu'on lui a donné au lieu de s'accrocher au plafond. */
.cal-sem{margin-bottom:12px}
.cal-sem span{
  text-align:center;font-family:var(--ui);font-size:10px;font-weight:600;
  letter-spacing:.06em;color:var(--tx-2);
}
.cal-dia,.cal-hueco{
  /* Des cases carrées. On est parti de 0,92, puis 0,97, et voilà le dernier
     cheveu qui manquait pour que cette colonne finisse sur la même ligne que
     les deux autres : six rangs, donc chaque centième compte six fois. La
     largeur ne bouge pas — c'est la grille qui la donne. */
  aspect-ratio:1 / 1;display:flex;align-items:center;justify-content:center;
  font-family:var(--ui);font-size:12px;border-radius:6px;
  border:1px solid transparent;background:transparent;
}
.cal-dia{cursor:pointer;color:var(--tx);transition:background .18s ease,color .18s ease}
/* Fermé, hors des trois mois, ou déjà passé : lisible mais en retrait, et
   sans prétendre qu'on peut cliquer dessus. */
.cal-cerrado{color:var(--tx-2)}
.cal-fuera{color:rgba(244,239,230,.22);cursor:default}
.cal-abierto{
  background:rgba(244,239,230,.09);color:#fff;font-weight:600;
}
/* Un jour d'habitude fermé que le programme fait ouvrir : c'est l'information
   que ce calendrier existe pour donner, elle est en doré. */
.cal-partido{background:rgba(233,184,36,.16);color:var(--or)}
.cal-hoy{border-color:color-mix(in srgb, var(--or) 55%, transparent)}
/* Le jour choisi se lit d'un coup d'œil : plein, en clair, cerclé d'or. Un
   simple filet se perdait sur les jours de match, qui sont déjà dorés. Le
   cercle est une ombre et non un contour : il ne prend pas de place et ne
   décale donc pas la grille. */
.cal-sel,.cal-sel.cal-abierto,.cal-sel.cal-partido{
  background:var(--creme);color:#12100A;font-weight:700;
  box-shadow:0 0 0 2px var(--or);
}
.cal-sel:hover{background:var(--creme);color:#12100A}
.cal-dia:hover:not(.cal-fuera){background:rgba(233,184,36,.22);color:var(--or)}
/* `.cal-h .cal-detail` et non `.cal-detail` : le pied de page déclare
   `.fcol p{margin:0}`, qui ajoute le nom de balise et l'emporte donc sur une
   classe seule. La marge écrite ici n'arrivait jamais à l'écran et le filet
   restait collé aux chiffres. Le même piège que la date du pop-up. */
.cal-h .cal-detail{
  /* `auto` en haut : la ligne du bas se pose au bas du cadre et c'est elle
     qui absorbe ce qui reste. La grille, elle, garde ses cases carrées. */
  margin:16px 0 0;margin-top:auto;padding-top:17px;
  border-top:1px solid var(--line-2);
  /* Centrée et un cran plus grande : c'est la réponse à la question qu'on se
     pose en regardant le calendrier — « et ce jour-là, c'est quelle heure ? ».
     Collée à gauche en tout petit, elle se lisait comme une note de bas de
     page sous le tableau. */
  font-family:var(--ui);font-size:14px;line-height:1.5;color:var(--creme);
  /* Une seule ligne, centrée. En colonne depuis que la pastille du match
     passait dessous — la pastille est partie, la colonne n'a plus lieu
     d'être. */
  display:block;text-align:center;
}
.cal-txt{min-width:0}
.cal-h .cal-detail b{color:var(--creme);font-weight:600}
/* Les heures en clair : c'est l'information, pas le décor. Elles étaient au
   gris du texte secondaire, plus pâles que la date qui les accompagne. */
.cal-h .cal-detail .cal-horas{color:var(--or);font-weight:600}
/* `.cal-marque` — la pastille « ouvert pour le match » — a été retirée du
   pied du calendrier : la ligne dit le jour et l'heure, et rien d'autre. */
/* Toujours deux lignes : les icônes, puis l'e-mail. En `wrap` les deux se
   mettaient côte à côte quand la place le permettait et passaient à la ligne
   sinon : le pied changeait de forme selon la largeur et selon le nombre
   d'icônes allumées. En colonne, il a la même tête partout. */
/* Les réseaux et le mail comptent pour deux éléments de la colonne : le même
   écart entre eux qu'entre tout le reste. `fbas` ne s'applique plus ici —
   c'est le `gap` qui range, plus une marge automatique qui pousse. */
.fcontact{display:flex;flex-direction:column;align-items:flex-start;gap:14px;padding-top:0}
.fcol:first-child .fbas{margin-top:0}
/* Le bandeau des paiements : à la largeur de la colonne, sans dépasser sa
   taille réelle — agrandi, le noir de l'image se décolle du fond. */
.fpaiement{
  display:block;width:100%;max-width:258px;height:auto;
  /* Le même filet que le plan et le calendrier d'en face : sans lui, le noir
     de l'image se fondait dans le fond et le bandeau flottait sans bord,
     alors que tout ce qui l'entoure en a un. */
  border:1px solid var(--line-2);border-radius:10px;
}
.mini-carte{
  position:relative;display:block;overflow:hidden;
  height:140px;max-width:255px;border-radius:10px;
  border:1px solid var(--line-2);background:#0B120E;
}
.mini-carte:hover{border-color:var(--or)}
/* Mosaïque de 3x3 tuiles, décalée pour que l'adresse tombe
   pile au centre du cadre, quelle que soit sa largeur. */
.mini-carte-tuiles{
  position:absolute;width:768px;height:768px;
  left:calc(50% - 478.6px);top:calc(50% - 338.7px);
  /* Les tuiles OSM sont claires : on les bascule dans la palette sombre. */
  filter:invert(1) hue-rotate(180deg) brightness(.78) contrast(.92) saturate(.45);
  transition:filter .25s ease;
}
.mini-carte:hover .mini-carte-tuiles{filter:invert(1) hue-rotate(180deg) brightness(.92) contrast(.95) saturate(.6)}
.mini-carte-tuiles img{position:absolute;width:256px;height:256px;display:block}
.mini-carte-pin{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:13px;height:13px;border-radius:50%;background:var(--or);
  box-shadow:0 0 0 4px rgba(233,184,36,.28),0 0 0 11px rgba(233,184,36,.12),
             0 0 18px 4px rgba(233,184,36,.5);
}
/* Mention obligatoire au titre de la licence OpenStreetMap. */
.mini-carte-credit{
  position:absolute;right:6px;bottom:5px;
  font-size:9px;letter-spacing:.02em;color:var(--tx-2);
  background:rgba(5,8,6,.7);padding:2px 6px;border-radius:4px;
}
/* Plus clair que les autres liens du pied : c'est une adresse à laquelle on
   écrit, pas un lien de navigation, et elle se lisait comme du texte gris. */
/* Les deux façons de nous joindre, l'une sous l'autre et sans écart : leur
   interligne les sépare déjà bien assez. */
.fjoindre{display:flex;flex-direction:column;align-items:flex-start;gap:0}
/* `.fcol a` (0,1,1) l'emportait sur `.fmail` (0,1,0) : la couleur crème
   écrite ici n'a jamais rien changé et l'email se lisait au gris du texte
   courant. On repose la règle avec une spécificité qui tient, en blanc —
   c'est ce qu'on vient chercher dans un pied de page. */
.fcol a.fmail,.fcol a.ftel{word-break:break-word;color:#fff}
.fcol a.fmail:hover,.fcol a.ftel:hover{color:var(--or)}

/* Une seule ligne, quel que soit le nombre allumé : c'est `nowrap` qui le
   garantit, et `shrink:0` empêche les icônes de s'écraser pour y tenir. */
.socials{display:flex;flex-wrap:nowrap;gap:10px}
.socials a{flex-shrink:0}
.socials a{
  width:40px;height:40px;display:grid;place-items:center;
  border:1px solid var(--line-2);border-radius:10px;color:var(--or);
  transition:border-color .2s ease,background .2s ease,transform .2s ease;
}
/* Au survol l'icône passe en blanc : le doré sur un fond doré très clair se
   lisait moins bien qu'au repos, alors que c'est le moment où on la regarde.
   Fanzo suit tout seul — son masque se remplit de `currentColor`. */
.socials a:hover{border-color:var(--or);background:rgba(233,184,36,.1);transform:translateY(-3px);color:#fff}
.socials svg{width:18px;height:18px;fill:currentColor}
/* Fanzo : logo de marque, pas icône maison. Il garde ses proportions, donc la
   case s'élargit au lieu de l'écraser dans le carré de 40 px des autres.
   Même fond que les autres : le logo fourni est blanc, et le poser sur une
   pastille claire le rendait invisible. */
.socials a.social-fanzo{width:auto;padding:0 12px}
/* Fanzo est un mot, pas un symbole : sa boîte n'est pas carrée, donc on lui
   laisse la largeur qu'il lui faut au lieu de l'écraser dans le carré des
   autres. Le tracé suit `currentColor` comme eux — doré, blanc au survol. */
.socials a.social-fanzo svg{width:auto;height:14px;display:block;fill:currentColor}

.news{display:flex;gap:8px;padding-top:12px}
/* Sous le formulaire : à quoi sert l'adresse. Petit et discret — c'est une
   mention obligatoire, pas un argument de vente — mais lisible, et le lien
   en doré comme les autres du pied. */
/* `.fcol .news-rgpd` et non `.news-rgpd` seul : `.fcol p` ajoute le nom de
   balise et l'emporte sur une classe, donc la taille écrite ici n'arrivait
   pas à l'écran — la mention se lisait en 14 px comme le reste du pied. */
.fcol .news-rgpd{
  margin:10px 0 0;font-size:10.5px;line-height:1.55;color:var(--tx-2);
}
.news input{
  flex:1;background:rgba(8,11,9,.6);border:1px solid var(--line-2);
  border-radius:9px;padding:12px 14px;font-size:13.5px;min-width:0;color:var(--creme);
}
.news input:focus{outline:none;border-color:var(--or)}
.news button{
  background:var(--or);color:#12100A;border:0;border-radius:9px;
  padding:0 18px;font-family:var(--ui);font-weight:600;font-size:12px;
  letter-spacing:.14em;text-transform:uppercase;cursor:pointer;
  transition:background .2s ease;
}
.news button:hover{background:var(--or-clair)}

.fbot{
  margin-top:clamp(40px,5vw,64px);padding:24px 0 28px;
  border-top:1px solid var(--line-soft);
  display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;
  font-size:12.5px;color:#5E665F;
}
.fbot a{color:#5E665F}
.fbot a:hover{color:var(--or)}

/* Signature du studio. Le logo garde sa couleur — c'est une marque,
   pas un élément de la charte du GOAT — mais reste en retrait. */
.fcredit{
  display:flex;align-items:center;gap:9px;
  font-size:11.5px;letter-spacing:.05em;color:#4C534D;
}
.fcredit img{
  display:block;width:45px;height:auto;opacity:.62;
  transition:opacity .3s ease;
}
.fcredit a:hover img,.fcredit a:focus-visible img{opacity:1}
.fcredit a:focus-visible{outline:2px solid var(--or);outline-offset:4px;border-radius:3px}

/* Sur une seule ligne : copyright à gauche, signature au centre,
   liens à droite. L'ordre du HTML garde la signature en dernier
   pour l'empilement mobile, on le réarrange donc ici. */
@media (min-width:900px){
  .fcredit{order:1}
  .fbot .fliens{order:2}
}
/* En dessous, les trois blocs ne tiennent plus côte à côte :
   ils s'empilent et la signature reste en dernier. */
@media (max-width:899px){
  .fcredit{margin-top:6px}
}

@media (max-width:960px){
  .fgrid{grid-template-columns:1fr 1fr}
}
@media (max-width:560px){
  .fgrid{grid-template-columns:1fr}
}


/* ══ BANDEAU COOKIES ═══════════════════════════════════════ */
.cookies{
  position:fixed;left:var(--pad);right:var(--pad);bottom:var(--pad);z-index:80;
  max-width:560px;padding:22px 24px;border-radius:14px;
  border:1px solid var(--line-2);
  background:rgba(10,14,11,.96);backdrop-filter:blur(18px);
  box-shadow:0 24px 60px -20px rgba(0,0,0,.9);
  display:none;
}
.cookies.open{display:block}
.cookies b{
  display:block;font-family:var(--ui);font-size:11px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--or);margin-bottom:10px;
}
.cookies p{font-size:13.5px;color:var(--tx-2);line-height:1.6;margin:0}
.cookies a{color:var(--tx);text-decoration:underline}
.cookies a:hover{color:var(--or)}
.cookies-btns{display:flex;gap:10px;margin-top:18px;flex-wrap:wrap}
/* Refuser doit être aussi accessible qu'accepter : même taille,
   même poids visuel. C'est une exigence de la CNIL. */
.cookies-btns .btn{flex:1;min-width:150px;padding:13px 20px;font-size:11.5px}

@media (max-width:520px){
  .cookies{padding:18px}
  .cookies-btns .btn{flex:1 1 100%}
}

/* Leurre anti-robot : sorti de l'écran plutôt que display:none,
   que certains robots savent repérer. */
.leurre{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

/* Zones qui réagissent au survol sans être cliquables : on garde
   la flèche et on empêche la sélection de texte au glissé. */
.ess,.niveau,.recette,.banner,.fixture{
  cursor:default;user-select:none;-webkit-user-select:none;
}
/* Les liens qu'elles contiennent restent, eux, cliquables. */
.ess a,.niveau a,.banner a,.fixture a,.fixture button{cursor:pointer;user-select:auto}

/* ══ ANIMATIONS ════════════════════════════════════════════ */
.reveal{opacity:0;transform:translateY(26px);transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.3,1)}
.reveal.in{opacity:1;transform:none}

/* Bouton « Réserver » de l'en-tête : compact, il partage la ligne
   avec l'écusson, le sélecteur de langue et le burger. Sa hauteur est
   celle de la pastille FR — le bouton lui-même, pas le groupe qui
   l'entoure : 2px de retrait et 1px de bordure les séparent. */
/* Les deux mots du bouton d'en-tête, l'un après l'autre.
   Empilés dans la MÊME case de grille : le bouton prend la largeur du plus
   long et ne bouge plus, sinon la barre entière tressauterait à chaque
   changement. Le fondu est lent et chaque mot reste longtemps lisible —
   c'est un rappel discret, pas un clignotant. */
.btn-relais{display:inline-grid;grid-template-areas:"mot";align-items:center}
.btn-relais > span{grid-area:mot;text-align:center}
/* Quatorze secondes de cycle, et les deux mots ne se croisent JAMAIS.

   Le premier réglage les faisait se fondre l'un dans l'autre : pendant deux
   secondes et demie, à chaque bascule, « Réserver » et « Privatiser »
   étaient lisibles EN MÊME TEMPS, l'un par-dessus l'autre. Quatre secondes
   sur quatorze — presque un tiers du temps — où le bouton ne montrait qu'une
   bouillie de lettres. Greg l'a photographié : « PRÍVATÍSER ».

   Un fondu enchaîné marche entre deux images qui se ressemblent. Entre deux
   MOTS différents, il ne marche pas : il faut que le premier ait fini de
   partir avant que le second arrive. D'où le passage par zéro — l'un
   s'efface, puis l'autre paraît. Chaque mot tient toujours ses cinq
   secondes ; seul le passage est net au lieu d'être trouble. */
.btn-relais-a{animation:btn-relais-a 14s ease-in-out infinite}
.btn-relais-b{animation:btn-relais-b 14s ease-in-out infinite}
@keyframes btn-relais-a{
  0%,30%{opacity:1}
  36%,86%{opacity:0}
  92%,100%{opacity:1}
}
@keyframes btn-relais-b{
  0%,36%{opacity:0}
  42%,80%{opacity:1}
  86%,100%{opacity:0}
}
/* Effet éteint dans le panneau, ou pas de deuxième mot : le bouton redevient
   ce qu'il a toujours été, un mot qui ne bouge pas. */
.btn-relais.sans-relais .btn-relais-a{animation:none;opacity:1}
.btn-relais.sans-relais .btn-relais-b{display:none}
/* Mouvement réduit : un seul mot, celui qui compte. L'autre disparaît au
   lieu de rester superposé. */
@media (prefers-reduced-motion:reduce){
  .btn-relais-a,.btn-relais-b{animation:none}
  .btn-relais-b{display:none}
}

.btn-nav{
  /* Hauteur du groupe FR/EN entier, pas de la seule pastille : le
     doré doit peser autant que le sélecteur à côté. */
  height:30px;padding:0 20px;font-size:12px;border-radius:6px;
  /* Le cadre du sélecteur de langue reproduit à l'identique : 2px de
     fond sombre puis un filet. En box-shadow plutôt qu'en bordure —
     une bordure agrandirait le bouton et romprait l'alignement des
     hauteurs qu'on vient de caler. */
  box-shadow:0 0 0 2px rgba(8,11,9,.5),
             0 0 0 3px var(--line-2);
}

/* Le bouton du HEADER seul, à l'envers des autres : creux au repos, plein au
   survol. C'est le seul aplat doré d'une barre déjà chargée — l'écusson, le
   nom, la langue, le compte —, et il y criait plus fort que tout. Les
   boutons du corps de page, eux, gardent leur plein : là ils sont seuls et
   doivent se voir. */
.btn-or.btn-nav{background:transparent;color:var(--or);border-color:var(--or)}
.btn-or.btn-nav:hover{background:var(--or);color:#12100A;border-color:var(--or)}

/* ══ MOBILE ════════════════════════════════════════════════ */
/* En dessous de 700px la ligne d'en-tête ne tient plus à cinq
   éléments : le mot-clé passait sur deux lignes et poussait le
   burger hors de l'écran. L'écusson seul suffit à identifier. */
/* Le mot-symbole à côté de l'écusson : jamais sur mobile, nulle part.
   À 700px il tenait encore, mais dès qu'un en-tête gagne un élément — la
   langue, un lien de retour — il se casse en deux lignes et double la hauteur
   de la barre. L'écusson identifie déjà le bar ; le mot ne sert qu'au bureau. */
@media (max-width:900px){
  .brand span,
  .marque span,
  .fbrand span{display:none}
}

@media (max-width:700px){
  :root{--pad:18px}
  .nav-in{gap:10px;padding:11px var(--pad)}
  /* L'écusson n'est pas carré (620x582) : dans une boîte carrée de 40,
     « contain » cale sur la largeur et ne laisse que 37,5 de haut. On
     pilote donc par la hauteur, pour l'aligner sur le burger. */
  .brand img{width:auto;height:40px}
  .langue button{padding:5px 9px;font-size:10.5px}
  .btn-nav{height:29px;padding:0 14px;font-size:11px}
  /* Le ruban défile : rien à masquer, on réduit seulement l'échelle. */
  /* Le titre garde sa place ; c'est la fenêtre qui se rétrécit. */
  .bandeau{gap:10px}
  /* Le titre mange un tiers de la largeur sur 390px : sur mobile le
     ruban parle de lui-même, on le supprime. */
  .bandeau-titre{display:none}
  /* En-tête des pages secondaires : à cinq éléments la ligne déborde
     d'un pixel sur 390px. Le mot-symbole, lui, saute plus haut (900px). */
  .tete-in{gap:10px}
  .tete-liens{gap:14px}
  /* Sans nowrap, « Se déconnecter » se casse en deux lignes et double
     la hauteur de l'en-tête. */
  .lien-discret{white-space:nowrap;font-size:10px;letter-spacing:.1em}
  /* Sur un téléphone, l'en-tête doit tenir sur UNE ligne : le mot du retour
     s'efface, il ne reste que la flèche — le mot vit dans `aria-label`, donc
     rien ne se perd pour un lecteur d'écran. Sous 420 px, « Se déconnecter »
     ne garde que son icône : à cinq éléments c'est le plus long, et le
     rétrécir vaut mieux que de laisser la barre passer sur deux lignes. */
  .lien-discret .mot{display:none}
  .lien-discret .fleche{font-size:15px;letter-spacing:0}
  .bandeau-fenetre{
    -webkit-mask-image:linear-gradient(90deg,transparent,#000 14px,#000 calc(100% - 14px),transparent);
    mask-image:linear-gradient(90deg,transparent,#000 14px,#000 calc(100% - 14px),transparent);
  }
  .bandeau-fermer{width:18px;height:18px}
  .bandeau-ev{gap:9px;padding:6px 0;font-size:11px}
  .bandeau-quand,.bandeau-comp{letter-spacing:.1em}
  .bandeau-ico{width:14px;height:14px}
  .bandeau-point{padding:0 24px}
  .burger{width:40px;height:40px;flex-shrink:0}
  .burger i{width:20px}

  /* Pas de bloc collé à droite : les quatre éléments se répartissent
     sur toute la largeur (space-between hérité de .nav-in). */
  .nav-in .langue{margin-left:0}
  /* « SECONDES » remplit sa case au caractère près : on desserre. */
  .cd span{letter-spacing:.16em;font-size:9.5px}
  /* Le bandeau tire sa hauteur de l'image : à 390px elle ne fait plus
     que 153px alors que le titre posé dessus en demande 235, et le
     texte débordait par le haut. On recadre l'image en hauteur fixe. */
  .banner-titre img{height:320px;object-fit:cover;object-position:center}
  /* La mosaïque reste centrée sur l'adresse quelle que soit la
     largeur : on peut donc la laisser occuper toute la colonne. */
  .mini-carte{max-width:none;height:165px}
  /* La marge de .fadr est neutralisée en pied de page : on la repose
     ici, l'adresse touchait le cadre de la carte. */
  .horaires > div{padding:5px 0}
  .horaires dt,.horaires dd{font-size:12.5px}
  .horaires .h-prog{font-size:11px}
  /* Quatre lignes de tarifs empilées prenaient un tiers d'écran pour
     quatre chiffres : gabarit resserré, le prix reste l'accroche. */
  .tarifs{gap:8px}
  .tarif{padding:10px 12px;gap:6px 10px;border-radius:10px}
  .tarif span{font-size:10.5px;letter-spacing:.07em}
  .tarif b{font-size:18px}
  /* Sous 520 px les trois ne tiennent plus sur une ligne : le libellé et le
     prix gardent la leur, le bouton passe dessous sur toute la largeur. Le
     serrer encore le rendrait impossible à viser au doigt. */
  .tarif-btn{padding:7px 10px;font-size:10px;letter-spacing:.1em}
  @media (max-width:520px){
    .tarif{grid-template-columns:minmax(0,1fr) auto}
    .tarif-btn{grid-column:1/-1;justify-self:stretch;padding:9px 12px}
  }
}

/* ══ RESPONSIVE ════════════════════════════════════════════ */
/* Douze colonnes ne tiennent que sur grand écran : on replie ensuite. */
@media (max-width:1180px){
  /* Sur deux lignes : on repasse en flux par rangées, sinon `auto-flow:column`
     continuerait à créer des colonnes au lieu de renvoyer à la ligne. */
  .programme{
    grid-auto-flow:row;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;
  }
}
@media (max-width:620px){
  /* Six par ligne, et six exactement. C'était `auto-fit`, donc le nombre de
     colonnes suivait la largeur de l'écran : cinq ici, six là, et douze
     sports tombaient en 5+5+2 — une dernière rangée à moitié vide qu'on lit
     comme une erreur. Un compte fixe donne deux rangées pleines sur tous les
     téléphones. (Essayé à quatre d'abord, à la demande de Greg, puis six :
     « fais plutôt des lignes de 6 sur mobile ».)
     Tuiles très étroites, donc icône et libellé réduits et interlettrage à
     zéro pour « HANDBALL » et « FOOTBALL ». */
  .programme{
    grid-template-columns:repeat(6,minmax(0,1fr));gap:5px;
  }
  .sport{padding:8% 3%;gap:11%;border-radius:10px}
  .sport .ico{width:26px;height:26px}
  .sport b{font-size:7.5px;letter-spacing:0;line-height:1.2}
  /* Six cartes en deux lignes de trois : colonnes très étroites,
     donc padding, icône et corps de texte revus à l'échelle. */
  .essentiel{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:34px}
  .ess{padding:22px 14px;gap:12px}
  .ess .ico{width:34px;height:34px}
  .ess b{font-size:11px;letter-spacing:.13em}
  .ess p{font-size:12.5px;line-height:1.5;max-width:none}

  /* Le hero tenait 100svh alors que son contenu s'arrête bien avant :
     le reliquat s'ajoutait aux 70px de padding et creusait 156px de
     vide avant « Au programme ». Hauteur pilotée par le contenu. */
  /* 33 en bas et non 18 : ici la hauteur suit le contenu, donc rien ne
     rattrape les 15px dont le bloc est descendu, et la carte du bas
     passait sous le bord — que `overflow:hidden` coupe net. Cette
     valeur suit le `top` de `.hero-in` : les deux bougent ensemble. */
  .hero{min-height:auto;padding:calc(var(--tete-h,62px) + 42px) 0 33px}
  /* Le hero se termine sur ses boutons : la section qui suit n'a pas
     besoin du même sas que deux sections de contenu. */
  .hero + .sec{padding-top:30px}
  /* L'écusson faisait 226px de large et écrasait le titre : il recule
     au rang d'emblème, le titre prend le premier rôle. */
  /* Même idée en petit : -12 en haut, rendus en bas. */
  .hero-crest-wrap{width:min(176px,45vw);margin-top:-12px;margin-bottom:28px}
  /* Halo et ombres calibrés pour un écusson de 340px : à 176px le même
     rayonnement mange la moitié du hero. On divise l'intensité. */
  .hero-crest-wrap::before{
    inset:-14%;filter:blur(11px);
    background:radial-gradient(circle at 50% 47%,
      rgba(233,184,36,.20) 0%,
      rgba(233,184,36,.09) 34%,
      rgba(233,184,36,.03) 56%,
      transparent 74%);
  }
  .hero-crest{
    filter:drop-shadow(0 0 10px rgba(233,184,36,.22))
           drop-shadow(0 10px 24px rgba(0,0,0,.6));
  }
  .hero h1{
    font-size:42px;
    text-shadow:0 4px 26px rgba(0,0,0,.9),0 0 70px rgba(233,184,36,.34);
  }
  .hero .tag{margin-top:15px;font-size:12.5px;letter-spacing:.24em}
  /* 64px de respiration entre sections, c'est un rythme d'écran large ;
     sur 390px ça se lit comme un trou. */
  .sec{padding:42px 0}

  /* ── Carte repliée ──────────────────────────────────────
     La piste passe de 0fr à 1fr : le navigateur anime vers la
     hauteur réelle du contenu, sans max-height à deviner. */
  .cartes{gap:10px}
  .carte-menu{padding:16px 16px 18px}
  .carte-menu > .h3,.carte-tete{padding-bottom:14px;margin-bottom:0}
  .carte-corps{
    display:grid;grid-template-rows:0fr;
    transition:grid-template-rows .32s cubic-bezier(.2,.7,.3,1);
  }
  .carte-corps-in{overflow:hidden;min-height:0}
  .carte-menu.ouverte .carte-corps{grid-template-rows:1fr}
  /* Chevron : seul indice qu'une catégorie s'ouvre. */
  .carte-bascule{position:relative;cursor:pointer;padding-right:28px}
  .carte-bascule::after{
    content:"";position:absolute;right:4px;top:6px;width:8px;height:8px;
    border-right:2px solid var(--or);border-bottom:2px solid var(--or);
    transform:rotate(45deg);transition:transform .3s ease;
  }
  .carte-menu.ouverte .carte-bascule::after{transform:rotate(-135deg);top:10px}
  /* Le premier bloc de contenu retrouve l'air que la tête a perdu. */
  .carte-menu.ouverte .carte-corps-in > *:first-child{margin-top:14px}
  /* Repliée, la carte n'a rien à séparer : le filet et le creux qu'il
     laissait sous lui disparaissent. */
  .carte-menu:not(.ouverte){padding-bottom:15px}
  .carte-menu:not(.ouverte) > .h3,
  .carte-menu:not(.ouverte) > .carte-tete{border-bottom-color:transparent;padding-bottom:0}
  /* Le prix déplacé dans la grille prend le gabarit d'une recette,
     sinon il flotte comme un élément étranger au bout de la liste. */
  .prix-case{
    display:grid;place-items:center;
    padding:13px 14px;border-radius:12px;
    border:1px solid color-mix(in srgb, var(--or) 45%, transparent);
    background:color-mix(in srgb, var(--or) 10%, transparent);
    font-size:26px;
  }
}
@media (max-width:960px){
  .nav-links{display:none}
  .compte{display:none}
  .burger{display:flex}
  .fgrid{grid-template-columns:1fr 1fr;gap:36px}
  .tarifs{grid-template-columns:1fr 1fr}
}
/* Sous 820px le bouton passe sous la ligne plutôt que de l'écraser. */
@media (max-width:820px){
  .fixture{grid-template-columns:auto 1fr;gap:18px}
  .fx-cta{grid-column:1/-1;width:100%}
}
@media (max-width:1180px){
  .recettes{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media (max-width:900px){
  .recettes{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:760px){
  .cartes{grid-template-columns:1fr}
}
@media (max-width:620px){
  .recettes{grid-template-columns:repeat(2,minmax(0,1fr))}
  .tarifs{grid-template-columns:1fr}
  .week{gap:6px}
  /* ── Un point à la place des pictogrammes ──
     Sur un téléphone, la carte d'un jour fait cinquante pixels de large.
     Trois icônes de seize empilées dans son coin passaient par-dessus le
     chiffre : on ne lisait plus ni la date ni le sport. Greg : « à la place
     des pictos tu mets un point jaune en dessous de la date pour dire qu'il
     y a quelque chose de programmé — 1 ou 10, c'est pareil, un point ».
     Il a raison : à cette taille, ce qu'on vient lire c'est S'IL se passe
     quelque chose, pas quoi. Le quoi est une ligne plus bas, dès qu'on
     touche le jour. */
  .day-icos{display:none}
  .day-plein::after{
    content:"";position:absolute;left:50%;bottom:5px;
    width:6px;height:6px;margin-left:-3px;border-radius:50%;
    background:var(--or);box-shadow:0 0 7px rgba(233,184,36,.65);
  }
  /* Le jour choisi est doré : un point doré dessus ne se verrait pas. */
  .day-on.day-plein::after{
    background:#12100A;box-shadow:none;opacity:.6;
  }
  /* Cartes des jours resserrées ici aussi : cette media query
     redéfinissait padding et interligne, et écrasait donc les
     valeurs posées plus haut dès qu'on passait sous 620 px. */
  /* Les plans en pleine largeur poussaient tout le reste vers le bas.
     La carte devient une ligne : vignette carrée à gauche, texte à
     droite, et la vignette ouvre le plan en grand. */
  .niveaux{grid-template-columns:1fr;gap:12px;margin-top:32px}
  .niveau{flex-direction:row;align-items:stretch}
  .niveau .shot{
    flex:0 0 108px;width:108px;aspect-ratio:1/1;
    border-bottom:0;border-right:1px solid var(--line-soft);
  }
  /* Le voile et son libellé mangeraient une vignette de cette taille. */
  .niveau .voile{display:none}
  .niveau .num{top:6px;left:6px;font-size:8px;padding:3px 6px}
  .niveau .txt{padding:13px 15px;display:flex;flex-direction:column;justify-content:center}
  .niveau .txt p{font-size:13px;line-height:1.6}
  .loupe{width:24px;height:24px;right:6px;bottom:6px}
  .loupe svg{width:12px;height:12px}

  /* Le bas s'ouvre pour laisser passer le point : sans ça il tombait sur
     « OCT ». Ce bloc-ci redéfinit tout le rembourrage de la carte, donc
     c'est ICI qu'il faut le dire — une règle posée plus haut dans la même
     media query se faisait écraser par celle-là. */
  .day{padding:6px 2px 15px;gap:0}
  .day span{font-size:8.5px;letter-spacing:0;line-height:1.4}
  .day b{font-size:17px;line-height:1.05}
  .day i{font-size:7.5px;letter-spacing:.04em;line-height:1.4}
}
@media (max-width:520px){
  /* Sur téléphone les affiches doivent se parcourir d'un coup d'œil :
     on resserre tout le gabarit plutôt que de réduire le seul texte. */
  .fixtures{gap:10px;margin-top:36px}
  .fixture{padding:12px 14px;gap:11px}
  .fx-day{width:52px;height:52px;border-radius:10px}
  .fx-day span{font-size:8.5px;letter-spacing:.12em}
  .fx-day b{font-size:22px}
  .fx-day i{font-size:7.5px;letter-spacing:.1em;margin-top:1px}
  .fx-meta{gap:8px;margin-bottom:7px}
  /* L'heure rapetisse ; la compétition, elle, est déjà petite et fine — la
     descendre encore la rendrait illisible sur un téléphone. */
  .fx-meta b{font-size:15px}
  .fx-meta span{font-size:11px;letter-spacing:.12em}
  .fx-team{gap:8px}
  .fx-team span{font-size:13px}
  .fx-crest{width:28px;height:28px}
  .fx-crest .ico{width:22px;height:22px}
  /* Une affiche = une ligne : club, « vs », club, avec les noms courts. */
  .fx-long{display:none}
  .fx-court{display:inline}
  .fx-teams{gap:7px}
  .fx-vs{font-size:11px}
  .fx-cta{padding:9px 16px;font-size:10px}
  .fx-vide{font-size:13px}
}
@media (max-width:620px){
  /* ── Le pied de page à plat, et dans l'ordre qu'on veut ──
     Greg : « descend ceci en dessous des horaires » (le bandeau des
     paiements) et « inverse newsletter et horaires ».

     Les trois blocs vivent dans trois colonnes différentes, et `order` ne
     range que des frères : on dissout donc les colonnes avec
     `display:contents`, ce qui fait de leurs contenus les enfants directs de
     la grille. Même technique que l'ardoise de la carte.

     Conséquence : le `gap` de la grille s'appliquerait entre CHAQUE bloc, y
     compris entre l'écusson et sa phrase, qui sont collés. Il passe donc à
     zéro et les écarts se posent à la main — serrés dans un groupe, larges
     entre deux groupes. */
  .fgrid{display:flex;flex-direction:column;gap:0}
  .fcol{display:contents}
  .fcol-marque > *{order:1}
  .fcol-lieu > *{order:2}
  .fcol-heures > *{order:3}
  /* La newsletter après les horaires, le bandeau des paiements tout en bas. */
  .fcol-lieu > .fbas{order:4}
  .fcol-marque > .fpaiement{order:5}
  /* La colonne d'identité respire comme les autres. Sur grand écran, son
     `justify-content:space-between` étalait l'écusson, la phrase et les
     réseaux sur toute la hauteur ; à plat ils retombaient à quatorze pixels
     les uns des autres et le bloc paraissait tassé à côté du reste.
     Greg : « mets de l'espace entre ces blocs comme aux autres ». */
  .fcol-marque > * + *{margin-top:34px}
  /* La phrase porte un `margin-top:0` déclaré en `.fcol:first-child
     .fbaseline`, plus précis que la règle du dessus : elle restait donc
     collée à l'écusson pendant que tout le reste s'écartait. Deux classes et
     l'enfant direct suffisent à repasser devant. */
  .fcol.fcol-marque > .fbaseline{margin-top:34px}
  /* Et les réseaux, pour la même raison : `.fcol:first-child .fbas` leur
     pose un `margin-top:0` plus précis que la règle d'écart. C'est la
     deuxième fois dans ce bloc, et les deux se corrigent pareil — ajouter
     une classe pour repasser devant. */
  .fcol.fcol-marque > .fbas{margin-top:34px}
  /* Et l'air entre deux groupes, là où le `gap` de 34 px se trouvait. */
  .fcol-lieu > .fh,
  .fcol-heures > .fh,
  .fcol-lieu > .fbas,
  .fcol-marque > .fpaiement{margin-top:34px}
  /* `margin-top:auto` collait la newsletter en bas de sa colonne pour
     aligner les trois ; à plat il n'y a plus rien à aligner, et il
     absorberait l'écart qu'on vient de poser. */
  .fcol-lieu > .fbas{margin-top:34px}
  /* Le pied de page respire en trois colonnes, où le blanc du haut équilibre
     la largeur. Sur un téléphone il n'y a qu'une colonne : ces 56 px ne
     séparaient plus rien, ils laissaient juste un trou noir entre le trait du
     haut et l'écusson. */
  .footer{padding-top:32px}
  /* Six icônes plus Fanzo ne tiennent pas sur 360 px à la taille du bureau.
     On resserre plutôt que de les laisser déborder ou passer à la ligne. */
  /* Sur mobile les icônes passent à la ligne au lieu de déborder : à huit
     réseaux allumés, une seule ligne sortait de l'écran. Le mail garde sa
     propre ligne — c'est `.fcontact` qui l'y met, pas cette règle. */
  .socials{gap:8px;flex-wrap:wrap}
  .socials a{width:36px;height:36px}
  .socials a.social-fanzo{width:auto;padding:0 10px}
  .cd{min-width:70px;padding:13px 6px}
  /* Pleine largeur, les deux boutons formaient deux barres et le hero
     perdait son axe : on les recentre à la largeur de leur libellé. */
  .hero-cta{gap:10px}
  .hero-cta .btn{width:auto;padding:11px 24px;font-size:12px;letter-spacing:.13em}
  }

@media (prefers-reduced-motion:reduce){
  *{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
  html{scroll-behavior:auto}
  /* Fond animé : on rend la main à l'image fixe. */
  .hero-film{display:none}
  /* Le ruban ne peut pas se contenter d'une durée quasi nulle : il
     sauterait. On l'arrête et on le rend défilable au doigt. */
  .bandeau-piste{animation:none!important}
  .bandeau{overflow-x:auto}
  .bandeau-suite[aria-hidden]{display:none}
  .reveal{opacity:1;transform:none}
}

::selection{background:var(--or);color:#12100A}

/* Les petites flèches des champs de nombre : dehors, partout.
   Elles bougent d'une unité quand on voulait changer de dizaine, et un coup
   de molette au-dessus du champ change le chiffre sans qu'on l'ait demandé.
   Tout le monde sait taper des chiffres. Le type reste `number` : le
   téléphone sort toujours son clavier de chiffres. */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}
input[type="number"]{-moz-appearance:textfield;appearance:textfield}

:focus-visible{outline:2px solid var(--or);outline-offset:3px;border-radius:4px}

/* ══════════════════════════════════════════════════════════
   PAGES ANNEXES
   Mentions légales · Confidentialité · Connexion · Compte.
   Elles réutilisent les jetons, le reset et les boutons
   définis plus haut : rien n'est redéclaré ici.
   ══════════════════════════════════════════════════════════ */

/* ── Boutons complémentaires ────────────────────────────── */
.btn-plein{width:100%}
.btn-danger{background:transparent;border-color:rgba(196,85,61,.5);color:var(--rouge)}
.btn-danger:hover{background:rgba(196,85,61,.12);border-color:var(--rouge);color:var(--rouge)}

/* ── En-tête et pied communs aux annexes ────────────────── */
.tete{border-bottom:1px solid var(--line);background:rgba(8,11,9,.92)}
.tete-in{
  max-width:1100px;margin:0 auto;padding:14px var(--pad);
  display:flex;align-items:center;justify-content:space-between;gap:20px;
}
.marque{display:flex;align-items:center;gap:12px;color:var(--creme)}
.marque:hover{text-decoration:none}
.marque img{width:44px;height:44px;object-fit:contain}
/* Le même mot-symbole que l'accueil, et pas de l'Oswald : c'est la marque,
   elle ne change pas d'une page à l'autre. Mêmes réglages que `.brand span` —
   Kelly Slab n'existe qu'en 400, donc on épaissit au trait, et l'interlettrage
   compense le contour. */
.marque span{
  font-family:'Kelly Slab', var(--disp);font-size:19px;
  -webkit-text-stroke:1px currentColor;
  letter-spacing:.075em;color:var(--creme);text-transform:uppercase;
}
.tete-liens{display:flex;align-items:center;gap:18px}
.lien-discret{
  font-size:11.5px;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--tx-2);
}
.lien-discret:hover{color:var(--or);text-decoration:none}
/* Se déconnecter : le même bouton que « Se connecter » dans l'en-tête du
   site — mêmes mesures, même cadre, même icône à gauche —, mais en rouge.
   C'est la seule action de cette barre qui défait quelque chose, et elle se
   tenait à côté d'un lien anodin, dans la même graisse et la même couleur.
   Le rouge est celui du site, pas un rouge inventé. */
.btn-sortir{
  display:flex;align-items:center;gap:5px;flex-shrink:0;
  font-family:var(--ui);font-weight:600;font-size:11px;
  letter-spacing:.12em;text-transform:uppercase;
  color:var(--rouge-clair);
  height:26px;padding:0 9px;border-radius:6px;
  border:1px solid color-mix(in srgb, var(--rouge) 45%, transparent);
  transition:border-color .2s ease,color .2s ease,background .2s ease;
}
.btn-sortir:hover{
  border-color:var(--rouge);color:#fff;background:var(--rouge);
  text-decoration:none;
}
.btn-sortir svg{width:13px;height:13px;fill:currentColor;flex-shrink:0}
/* Même correction optique que sur « Se connecter » : des capitales sans
   jambages paraissent montées dans leur ligne. */
.btn-sortir span{line-height:1;transform:translateY(1px)}

/* Le pied reste EN BAS quand la page est courte.

   Sans ça il se colle à la fin du contenu : sur « Mes devis », vide, il
   remontait au milieu de l'écran avec du noir en dessous — et il changeait de
   hauteur à chaque onglet du compte, selon la longueur de ce qu'on regardait.
   Un pied de page qui se déplace quand on navigue ne se lit plus comme le bas
   de la page.

   Sur les pages longues, rien ne change : `min-height` ne sert que lorsque le
   contenu ne remplit pas l'écran.

   Le `width:100%` sur le contenu n'est pas décoratif : `main` porte un
   `margin:0 auto`, et des marges automatiques sur l'axe transversal d'une
   colonne flexible annulent l'étirement — sans lui, la page se rétrécissait à
   la largeur de son texte. */
.page-colonne{min-height:100dvh;display:flex;flex-direction:column}
.page-colonne > main{flex:1 0 auto;width:100%}
.page-colonne > .pied{flex-shrink:0}

.pied{border-top:1px solid var(--line);padding:22px 0 28px;font-size:12.5px;color:#5E665F}
.pied-in{
  max-width:1100px;margin:0 auto;padding:0 var(--pad);
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;
}
.pied a{color:#5E665F}
.pied a:hover{color:var(--or)}

/* ── Pages de texte légal ───────────────────────────────────
   Tout est scopé sous .doc : sans ça, les sélecteurs de balises
   repeindraient les titres et paragraphes de l'accueil. */
/* Réservé à la version anglaise : la mention de primauté du texte
   français n'a aucun sens quand on lit l'original. */
.si-en{display:none}
html[lang="en"] .si-en{display:block}

.doc{max-width:820px;margin:0 auto;padding:clamp(40px,6vw,72px) var(--pad) clamp(60px,8vw,96px)}
.doc h1{
  font-family:var(--disp);font-size:clamp(30px,5vw,46px);line-height:var(--titre-lh);
  text-transform:uppercase;letter-spacing:.02em;color:var(--creme);margin:0 0 10px;
}
.doc .maj{font-size:12.5px;color:#5E665F;margin:0 0 42px}
.doc h2{
  font-family:var(--ui);font-size:12px;font-weight:600;letter-spacing:.2em;
  text-transform:uppercase;color:var(--or);margin:40px 0 12px;
}
.doc p,.doc li{font-size:15px;color:var(--tx-2);margin:0 0 12px;line-height:1.7}
.doc ul{margin:0 0 12px;padding-left:20px}
.doc li{margin-bottom:6px}
.doc strong{color:var(--creme);font-weight:600}
.doc a{color:var(--or)}
.doc dl{margin:0}
.doc dt{
  font-size:11px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--tx-2);margin-top:14px;
}
.doc dd{margin:2px 0 0;font-size:15px;color:var(--creme)}
/* Champ non renseigné, visible pour ne pas partir en ligne par oubli. */
.trou{
  display:inline-block;padding:1px 9px;border-radius:5px;
  border:1px dashed rgba(233,184,36,.5);background:rgba(233,184,36,.08);
  color:var(--or);font-size:13px;font-weight:600;letter-spacing:.04em;
}

/* ── Connexion et inscription ───────────────────────────── */
.ecran{
  position:relative;overflow:hidden;
  min-height:calc(100vh - 73px);
  display:flex;align-items:center;justify-content:center;
  padding:clamp(30px,6vw,64px) var(--pad);
  background:var(--noir);
}
/* La salle en fond, floutée : on reconnaît le lieu sans que
   l'image ne concurrence le formulaire. */
.ecran::before{
  content:"";position:absolute;inset:-20px;z-index:0;
  background:url('../img/bg-hero.jpg') center/cover no-repeat;
  filter:blur(5px);opacity:.42;
}
.ecran::after{
  content:"";position:absolute;inset:0;z-index:0;
  background:
    radial-gradient(72% 58% at 50% 46%,transparent 0%,rgba(5,6,6,.72) 100%),
    linear-gradient(180deg,rgba(5,6,6,.58),rgba(5,6,6,.86));
}
.panneau{
  position:relative;z-index:1;
  width:100%;max-width:440px;
  background:rgba(9,14,11,.88);backdrop-filter:blur(14px);
  -webkit-backdrop-filter:blur(14px);
  border:1px solid var(--line-2);border-radius:16px;
  padding:clamp(26px,4vw,40px);
  box-shadow:0 30px 70px -24px rgba(0,0,0,.95);
}

/* Formulaire d'inscription sur deux colonnes dès qu'il y a la place.
   En dessous, la grille retombe sur une colonne d'elle-même. */
@media (min-width:760px){
  .panneau.panneau-large{max-width:700px}
  .panneau-large #form-inscription{
    display:grid;grid-template-columns:1fr 1fr;column-gap:20px;
  }
  /* Ce qui ne se divise pas : mot de passe, sports, cases, bouton. */
  .panneau-large #form-inscription > .champ-large,
  .panneau-large #form-inscription > .champ-groupe,
  .panneau-large #form-inscription > .case,
  .panneau-large #form-inscription > .btn{grid-column:1/-1}
}
.panneau h1{
  font-family:var(--disp);font-size:clamp(24px,3.4vw,32px);line-height:var(--titre-lh);
  text-transform:uppercase;letter-spacing:.04em;color:var(--creme);margin:0 0 6px;
}
.panneau .intro{font-size:14px;color:var(--tx-2);margin:0 0 26px}

.onglets{
  display:grid;grid-template-columns:1fr 1fr;gap:4px;
  padding:4px;margin-bottom:26px;
  background:rgba(8,11,9,.6);border:1px solid var(--line);border-radius:10px;
}
.onglet{
  padding:11px 10px;border:0;border-radius:7px;background:transparent;
  font-family:var(--ui);font-weight:600;font-size:11.5px;
  letter-spacing:.14em;text-transform:uppercase;color:var(--tx-2);
  cursor:pointer;transition:background .2s ease,color .2s ease;
}
.onglet:hover{color:var(--creme)}
.onglet[aria-selected="true"]{background:var(--or);color:#12100A}

.btn-google{
  width:100%;display:flex;align-items:center;justify-content:center;gap:12px;
  padding:13px 18px;border-radius:9px;border:1px solid var(--line-2);
  background:#fff;color:#1F1F1F;
  font-family:var(--ui);font-weight:600;font-size:14px;letter-spacing:0;
  text-transform:none;cursor:pointer;
  transition:background .2s ease,transform .18s ease;
}
.btn-google:hover{background:#F1F1F1;transform:translateY(-2px);text-decoration:none}
.btn-google svg{width:19px;height:19px;flex-shrink:0}

.separateur{
  display:flex;align-items:center;gap:14px;margin:22px 0;
  font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:#5E665F;
}
.separateur::before,.separateur::after{content:"";flex:1;height:1px;background:var(--line-2)}

/* `hidden` debe ganar SIEMPRE. `.champ{display:flex}` tiene la misma
   especificidad que `[hidden]` y viene después, así que un campo marcado como
   oculto seguía viéndose: a una cuenta de Google se le pedía un mot de passe
   que no existe. El resto de la hoja lo iba parcheando clase por clase. */
[hidden]{display:none!important}

.champ{display:flex;flex-direction:column;gap:7px;margin-bottom:16px}
.champ label{
  font-size:10.5px;font-weight:600;letter-spacing:.18em;
  text-transform:uppercase;color:var(--or);
}
.champ input,.champ select{
  background:rgba(8,11,9,.6);border:1px solid var(--line-2);
  border-radius:9px;padding:13px 15px;font-size:14.5px;
  font-family:var(--ui);color:var(--creme);width:100%;
  transition:border-color .2s ease,background .2s ease;
}
.champ input:focus,.champ select:focus{outline:none;border-color:var(--or);background:rgba(8,11,9,.85)}
.champ input::placeholder{color:#5E665F}
.champ .aide{font-size:11.5px;color:#5E665F}
.champ.erreur input{border-color:var(--rouge)}
.champ .message{font-size:12px;color:var(--rouge);display:none}
.champ.erreur .message{display:block}

/* Deux champs qui vont ensemble, côte à côte dès qu'il y a la place.
   Prénom et Nom sont les deux moitiés d'une même réponse : empilés, ils
   faisaient deux rangées pour deux mots.
   `minmax(0,1fr)` et non `1fr` : `1fr` vaut `minmax(auto,1fr)` et refuse de
   descendre sous la largeur naturelle d'un champ de saisie — c'est ce qui a
   déjà fait déborder cette page sur le côté. L'écart n'est qu'horizontal :
   la marge basse de `.champ` fait déjà celui d'en dessous. */
.champ-duo{display:grid;grid-template-columns:minmax(0,1fr);gap:0 16px}
@media (min-width:560px){
  .champ-duo{grid-template-columns:repeat(2,minmax(0,1fr))}
}

.case{
  display:flex;align-items:flex-start;gap:10px;
  font-size:12.5px;color:var(--tx-2);line-height:1.5;margin-bottom:18px;cursor:pointer;
}
.case input{margin-top:2px;accent-color:var(--or);width:16px;height:16px;flex-shrink:0;cursor:pointer}

/* ── Sports favoris ─────────────────────────────────────────
   Un groupe de cases à cocher, pas un <select multiple> : sur
   téléphone celui-ci ouvre une liste native où l'on ne voit
   qu'une option à la fois. En pastilles, les douze sports se
   lisent d'un coup et se cochent au doigt. */
.champ-groupe{border:0;padding:0;margin:0 0 16px;min-width:0}
.champ-groupe legend{
  padding:0;margin-bottom:7px;
  font-size:10.5px;font-weight:600;letter-spacing:.18em;
  text-transform:uppercase;color:var(--or);
}
.puces{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
/* .puce est un <label> dans un .champ : il hérite des capitales et de
   l'interlettrage des intitulés de formulaire. On le garde — c'est la
   ligne du site — mais resserré, sinon douze pastilles tiennent trois
   lignes. */
.puce{cursor:pointer;letter-spacing:.1em}
/* La case native est masquée sans display:none, qui la sortirait
   du parcours au clavier : c'est la pastille qui prend le focus. */
.puce input{position:absolute;opacity:0;width:0;height:0}
.puce span{
  display:block;padding:6px 11px;border-radius:999px;
  border:1px solid var(--line-2);background:rgba(8,11,9,.6);
  font-size:10px;font-weight:600;color:var(--tx-2);
  transition:border-color .2s ease,background .2s ease,color .2s ease;
}
.puce:hover span{border-color:color-mix(in srgb, var(--or) 45%, transparent);color:var(--creme)}
.puce input:checked + span{
  background:var(--or);border-color:var(--or);color:#12100A;
}
.puce input:focus-visible + span{outline:2px solid var(--or);outline-offset:3px}

.pied-form{
  margin-top:22px;padding-top:20px;border-top:1px solid var(--line);
  font-size:13px;color:var(--tx-2);text-align:center;
}
.oubli{display:block;margin-top:-6px;margin-bottom:18px;font-size:12.5px;text-align:right}

/* ── Espace compte ──────────────────────────────────────── */
.espace{max-width:1100px;margin:0 auto;padding:clamp(34px,5vw,56px) var(--pad) 80px}
/* Le salut occupe sa ligne, seul. Le bouton « Nouvelle réservation » était
   posé à sa droite, à l'opposé de la colonne où l'on va réserver ; il est
   descendu en tête de cette colonne-là. */
.bonjour{margin-bottom:34px}
.bonjour h1{
  font-family:var(--disp);font-size:clamp(28px,4.4vw,44px);line-height:var(--titre-lh);
  text-transform:uppercase;letter-spacing:.02em;color:var(--creme);margin:0;
}
.bonjour p{margin:8px 0 0;font-size:14px;color:var(--tx-2)}

.rangee{display:grid;grid-template-columns:1.6fr 1fr;gap:22px;align-items:start}
/* Même hauteur que l'en-tête de la carte d'en face, pour que les deux
   colonnes démarrent sur la même ligne. */
.cta-resa{margin-bottom:22px;padding:15px 24px;font-size:12px}
.bloc{
  background:linear-gradient(170deg,var(--carte-2),var(--carte));
  border:1px solid var(--line-2);border-radius:14px;
  padding:clamp(22px,2.6vw,30px);
}
.bloc + .bloc{margin-top:22px}
/* Un bloc caché reste un frère : `+ .bloc` s'appliquait quand même et poussait
   « Mes informations » de 22px vers le bas, hors d'alignement avec le bouton
   d'en face. Le bandeau « Confirmez votre email » est masqué la plupart du
   temps, donc c'était l'état normal de la page. */
.bloc[hidden] + .bloc{margin-top:0}
.bloc h2{
  font-family:var(--ui);font-size:11.5px;font-weight:600;letter-spacing:.2em;
  text-transform:uppercase;color:var(--or);margin:0 0 20px;
  padding-bottom:14px;border-bottom:1px solid var(--line);
}

.resa{
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:20px;
  padding:16px;border-radius:12px;border:1px solid var(--line-2);
  background:linear-gradient(180deg,rgba(233,184,36,.08),rgba(16,23,19,.5));
}
.resa + .resa{margin-top:12px}
.resa-date{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  width:66px;height:66px;flex-shrink:0;border-radius:11px;
  background:var(--or);color:#12100A;
}
.resa-date span{font-size:10px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;opacity:.72}
.resa-date b{font-family:var(--disp);font-size:27px;line-height:1}
.resa-date i{font-style:normal;font-size:8.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;opacity:.62}
.resa-corps h3{font-family:var(--ui);font-size:16px;font-weight:600;color:var(--creme);margin:0 0 5px}
.resa-corps p{margin:0;font-size:13px;color:var(--tx-2)}
/* Deux colonnes quand il n'y a pas de bouton : une grille garde l'écart
   entre ses pistes même vides, et la fiche aurait gardé vingt pixels de
   trou à droite pour rien. */
.resa-seule{grid-template-columns:auto 1fr}
.resa-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}
.resa-actions .btn{padding:10px 16px;font-size:10.5px}

/* Les pastilles d'une fiche, sur UNE ligne.
   Elles étaient posées au fil du texte : à la moindre fiche resserrée —
   une privatisation a trois pastilles et deux boutons — « SOLDE » tombait
   tout seul à la ligne suivante, où il ne se lit plus comme la suite de
   l'état mais comme un autre sujet. Elles rétrécissent plutôt que de
   passer à la ligne ; le texte de chacune, lui, ne se coupe jamais. */
.resa-pastilles{
  display:flex;align-items:center;gap:6px;flex-wrap:nowrap;
  margin-bottom:7px;min-width:0;
}
.resa-pastilles > *{margin-bottom:0;min-width:0;flex-shrink:0}
.etat{
  display:inline-flex;align-items:center;gap:7px;
  padding:5px 11px;border-radius:999px;font-size:10px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;margin-bottom:7px;
}
.etat::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.etat-ok{color:var(--vert);background:rgba(47,160,94,.14);border:1px solid rgba(47,160,94,.4)}
.etat-attente{color:var(--or);background:rgba(233,184,36,.12);border:1px solid rgba(233,184,36,.4)}
.etat-passe{color:var(--tx-2);background:rgba(255,255,255,.05);border:1px solid var(--line-2)}
.etat-annule{color:var(--rouge);background:rgba(196,85,61,.12);border:1px solid rgba(196,85,61,.4)}

/* Ce qui a déjà été réglé, à côté de l'état. Même gabarit que `.etat` mais
   sans la pastille ronde : celle-ci dit où en est la réservation, celle-là
   dit ce qui est payé, et deux points l'un à côté de l'autre les feraient
   lire comme deux états. Le montant n'est pas en versales — un chiffre en
   majuscules n'existe pas, et l'espacement des lettres le rendait illisible. */
.paye{
  display:inline-flex;align-items:center;gap:5px;
  padding:5px 11px;border-radius:999px;font-size:10px;font-weight:600;
  margin-bottom:7px;margin-left:7px;
  color:var(--vert);background:rgba(47,160,94,.14);
  border:1px solid rgba(47,160,94,.4);
}
.paye > span{letter-spacing:.14em;text-transform:uppercase}
.paye i{font-style:normal;opacity:.7}
.paye-non{
  color:var(--or);background:rgba(233,184,36,.12);
  border-color:rgba(233,184,36,.4);
}
/* Où l'on est assis, sous l'heure. En doré comme l'adresse du pied de page :
   c'est la même sorte d'information — où aller —, et en gris elle se perdait
   dans la ligne au-dessus. */
.resa-corps .resa-lieu{margin-top:3px;color:var(--or);font-size:12.5px}
/* Quand elle a été demandée. En plus petit et plus gris que tout le reste :
   c'est une trace, pas un renseignement qu'on vient chercher. */
.resa-corps .resa-demande{margin-top:4px;font-size:11.5px;color:#8d968b}
/* «Retirer» : un lien et pas un bouton. Ce n'est pas l'action de la fiche —
   c'est du rangement, et un bouton de plus à côté d'« Annuler » les aurait
   fait peser pareil. */
.lien-retirer{
  font-family:var(--ui);font-size:10.5px;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--tx-2);opacity:.75;
  padding:10px 4px;white-space:nowrap;
}
.lien-retirer:hover{color:var(--rouge);opacity:1}

/* « Modifier » : le même gabarit discret que « Retirer », mais il ne détruit
   rien — donc doré au survol et pas rouge. Devant « Annuler » dans la fiche :
   c'est le geste qu'on veut voir essayer en premier. */
.lien-modifier{
  font-family:var(--ui);font-size:10.5px;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--tx-2);opacity:.85;
  padding:10px 4px;white-space:nowrap;
}
.lien-modifier:hover{color:var(--or);opacity:1}

/* ── Déplacer une réservation ─────────────────────────────────
   Un volet qui s'ouvre DANS la fiche, sur toute sa largeur : ce qu'on
   modifie est juste au-dessus, et une fenêtre par-dessus l'aurait caché au
   moment précis où on le compare. */
.resa-modif{
  grid-column:1/-1;margin-top:14px;padding-top:14px;
  border-top:1px solid var(--line-2);
}
.resa-modif-etat{margin:0;font-size:13px;color:var(--tx-2)}
.resa-modif-grille{display:flex;flex-wrap:wrap;gap:16px 22px;align-items:flex-start}
.resa-modif-champ{display:flex;flex-direction:column;gap:7px}
.resa-modif-champ > span{
  font-family:var(--ui);font-size:9.5px;font-weight:600;letter-spacing:.18em;
  text-transform:uppercase;color:var(--tx-2);
}
/* Le champ de date et son pictogramme, comme sur la page de réservation.
   Le dessin est posé par-dessus et ne reçoit aucun clic ; c'est le champ,
   dessous, qui ouvre le calendrier — où qu'on clique dedans, ce qui est ce
   qu'on fait quand on ne sait pas encore qu'un champ s'ouvre. */
.resa-champ-ico{display:block;position:relative}
.resa-champ-ico svg{
  position:absolute;right:13px;top:50%;transform:translateY(-50%);
  width:17px;height:17px;
  fill:none;stroke:var(--or);stroke-width:1.7;stroke-linecap:round;
  pointer-events:none;
}
.resa-champ-ico svg circle{fill:var(--or);stroke:none}
.resa-modif-date{
  font-family:var(--ui);font-size:14px;font-weight:600;color:var(--creme);
  background:rgba(255,255,255,.04);border:1px solid var(--line-2);
  border-radius:9px;padding:10px 40px 10px 13px;
  width:170px;cursor:pointer;
}
.resa-modif-date:focus{outline:none;border-color:var(--or)}
/* Le jour verrouillé : il se lit encore — c'est la date de SA réservation —
   mais il ne s'ouvre plus. Le pictogramme s'éteint avec lui : doré, il
   promettrait un calendrier qui ne vient pas. */
.resa-modif-date:disabled{opacity:.55;cursor:default}
.resa-champ-ico.est-fige svg{stroke:var(--tx-2);opacity:.45}
.resa-modif-jour{
  margin:8px 0 0;font-size:12px;line-height:1.5;color:var(--tx-2);
  max-width:520px;
}
/* L'icône du système : étirée sur tout le champ et invisible, c'est elle qui
   ouvre le calendrier natif quand flatpickr n'a pas pu se charger. La nôtre
   est dorée juste au-dessus ; deux pictogrammes valent moins qu'un. */
.resa-modif-date::-webkit-calendar-picker-indicator{
  position:absolute;inset:0;
  width:auto;height:auto;margin:0;padding:0;
  background:transparent;color:transparent;
  cursor:pointer;opacity:0;
}
.resa-modif-heures{display:flex;flex-wrap:wrap;gap:7px;max-width:420px}
.resa-modif-h{
  font-family:var(--ui);font-size:13px;font-weight:600;color:var(--creme);
  background:rgba(255,255,255,.04);border:1px solid var(--line-2);
  border-radius:9px;padding:9px 12px;cursor:pointer;
}
.resa-modif-h:hover{border-color:var(--or)}
.resa-modif-h.est-choisi{background:var(--or);border-color:var(--or);color:#12100A}
/* Moins et plus plutôt qu'une liste : au doigt c'est le geste le plus court,
   et la fourchette fait deux ou trois valeurs. */
.resa-modif-nb{display:flex;align-items:center;gap:4px}
.resa-modif-nb button{
  width:38px;height:38px;border-radius:9px;cursor:pointer;
  font-size:17px;color:var(--creme);
  background:rgba(255,255,255,.04);border:1px solid var(--line-2);
}
.resa-modif-nb button:hover:not(:disabled){border-color:var(--or)}
.resa-modif-nb button:disabled{opacity:.3;cursor:default}
.resa-modif-nb b{
  font-family:var(--disp);font-size:19px;color:var(--creme);
  min-width:36px;text-align:center;
}
.resa-modif-note{margin:14px 0 0;font-size:12px;line-height:1.55;color:var(--tx-2)}
/* Ce que le changement fait à l'argent. Doré quand il en manque — c'est la
   couleur de ce qui est dû sur tout le site —, vert quand il n'y a rien à
   payer et qu'on garde sa mise. */
.resa-modif-sup,.resa-modif-bon{
  margin:14px 0 0;padding:11px 13px;border-radius:10px;
  font-size:12.5px;line-height:1.55;max-width:520px;
}
.resa-modif-sup{
  border:1px solid rgba(233,184,36,.4);background:rgba(233,184,36,.08);
  color:var(--tx-2);
}
.resa-modif-sup b{color:var(--or);font-weight:700}
.resa-modif-bon{
  border:1px solid rgba(47,160,94,.3);background:rgba(47,160,94,.06);
  color:var(--tx-2);
}
.resa-modif-bon b{color:var(--creme);font-weight:600}
/* Le champ libre d'une demande : ce qu'on ne sait pas faire tout seul se
   dit avec des mots. */
.resa-modif-txt{
  font-family:var(--ui);font-size:14px;line-height:1.5;color:var(--creme);
  background:rgba(255,255,255,.04);border:1px solid var(--line-2);
  border-radius:9px;padding:10px 12px;width:100%;max-width:520px;resize:vertical;
}
.resa-modif-txt:focus{outline:none;border-color:var(--or)}
.resa-modif-champ{max-width:520px}
.resa-modif-marge{
  font-family:var(--ui);font-weight:600;color:var(--or);
  white-space:nowrap;
}
.resa-modif-err{margin:10px 0 0;font-size:12.5px;line-height:1.5;color:var(--rouge)}
.resa-modif-btns{display:flex;align-items:center;justify-content:flex-end;gap:14px;margin-top:14px}
.resa-modif-btns .btn{padding:10px 18px;font-size:10.5px}
/* Éteint plutôt qu'absent : le bouton reste à sa place tant qu'on n'a rien
   changé, sinon le pied du volet saute à chaque geste. */
.resa-modif-btns .est-eteint{opacity:.35;pointer-events:none}

/* ── Le dialogue ──────────────────────────────────────────────
   Il remplace `confirm()`. Le fond est très sombre et non un voile léger :
   la question doit être la seule chose lisible, sinon on confirme sans
   avoir lu. */
.dlg{
  position:fixed;inset:0;z-index:120;
  display:flex;align-items:center;justify-content:center;padding:20px;
  background:rgba(4,6,5,.82);
  -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);
}
.dlg-carte{
  width:100%;max-width:430px;padding:26px 26px 22px;border-radius:14px;
  border:1px solid var(--line-2);
  background:linear-gradient(170deg,#141A16,#0B120E);
  box-shadow:0 24px 60px rgba(0,0,0,.55);
}
.dlg-titre{
  margin:0 0 10px;font-family:var(--ui);font-size:15.5px;font-weight:600;
  color:var(--creme);line-height:1.35;
}
.dlg-txt{margin:0;font-size:14px;line-height:1.6;color:var(--tx-2)}
.dlg-txt:empty{display:none}
.dlg-btns{display:flex;gap:10px;justify-content:flex-end;margin-top:22px;flex-wrap:wrap}
.dlg-btns .btn{padding:11px 20px;font-size:11px}
/* La page ne défile plus derrière : sur mobile, le doigt qui vise un bouton
   faisait glisser le contenu dessous. */
body.dlg-ouvert{overflow:hidden}

.vide{
  padding:30px 24px;border-radius:12px;text-align:center;
  border:1px dashed var(--line-2);background:rgba(16,23,19,.35);
}
.vide p{margin:0 0 16px;font-size:14px;color:var(--tx-2)}

/* La zona de borrado, aparte y legible. El texto iba en #5E665F sobre fondo
   casi negro: la advertencia que más importa era la única que no se leía. */
.zone-danger{
  margin-top:26px;padding:18px;border-radius:12px;
  border:1px solid rgba(214,74,74,.28);background:rgba(214,74,74,.05);
}
.zone-danger h3{
  margin:0 0 10px;font-family:var(--ui);font-size:11px;font-weight:700;
  letter-spacing:.18em;text-transform:uppercase;color:#E08585;
}
.zone-danger p{font-size:13px;color:var(--tx-2);margin:0 0 14px;line-height:1.6}

/* Aviso de cuenta con Google: es una explicación, no el pie de un formulario.
   Sin filete y alineado como el resto del bloque. */
.info-google{
  margin:0;font-size:13.5px;line-height:1.6;color:var(--tx-2);
}

@media (max-width:620px){
  /* Trois pastilles ne tiennent pas sur la largeur d'un téléphone : là,
     passer à la ligne vaut mieux que déborder du cadre. */
  .resa-pastilles{flex-wrap:wrap;gap:6px 7px}
}

@media (max-width:860px){
  .rangee{grid-template-columns:1fr}
  .resa{grid-template-columns:auto 1fr;row-gap:14px}
  .resa-actions{grid-column:1/-1;justify-content:flex-start}
}

/* Sous 420 px : le libellé du bouton rouge tombe aussi. */
@media (max-width:420px){
  .btn-sortir span{display:none}
  .btn-sortir{padding:0 8px}
}

/* ── Happy darts hour ───────────────────────────────────
   Un lien discret sous les tarifs, et la fenêtre qu'il ouvre.

   Aux couleurs de la maison — l'or, le noir, la crème — comme toutes les
   autres fenêtres du site. En vert, elle avait l'air de venir d'ailleurs :
   le vert fané ne sert ici qu'à dire « ceci n'est pas un match », et il ne
   voulait rien dire sur un tarif.

   Le lien reste discret à dessein : c'est une promotion, pas l'offre
   principale. Mis au même niveau que les quatre tarifs, il aurait donné
   l'impression que le prix normal est celui qu'on paie quand on s'y prend
   mal. */
/* La carte promo, posée sur la photo des fléchettes.
   Trois lignes : ce que c'est, quand, et le bouton. Un cran plus grande que
   la première version — à taille de note de bas de page, une promotion ne se
   remarque pas, et c'est bien elle qu'on veut faire remarquer. */
.happy-promo{
  position:relative;max-width:none;
  /* `center` sur l'axe principal : les trois lignes se groupent au milieu de
     la hauteur qu'elles reçoivent. Collées en haut, elles laissaient un vide
     sous le bouton dès que la colonne de gauche s'allongeait. */
  display:flex;flex-direction:column;align-items:flex-start;
  justify-content:center;gap:15px;
  padding:31px 34px;border-radius:20px;
  /* Le même fond que les lignes de tarif d'à côté : les deux colonnes sont
     du même bloc. Le verre dépoli n'avait de sens que posé sur la photo — il
     n'y a plus rien à flouter derrière. */
  background:linear-gradient(170deg,var(--carte-2),var(--carte));
  cursor:pointer;
  transition:background .25s ease,transform .3s ease,border-color .25s ease;
}
/* ── L'enseigne au néon ──────────────────────────────────────
   La photo des fléchettes a une enseigne « COLD BEER » qui brille au fond.
   La carte en est une autre : un tube de verre allumé, pas un rectangle sage
   posé dessus. C'est la seule chose de cette page qui se lise comme un objet
   du bar et pas comme une boîte de site web.

   Un néon, techniquement, c'est un trait fin très lumineux entouré de sa
   propre lueur. Donc : une bordure de 2 px en or clair, et quatre ombres
   empilées — deux dedans, deux dehors — qui vont du plus serré au plus
   large. Une seule ombre large fait un flou ; c'est l'empilement qui fait le
   tube.

   Et le clignotement : pas un battement régulier, qui est un voyant
   d'alarme. Un vrai tube hésite deux ou trois fois de suite puis tient. La
   courbe est écrite comme ça — trois hoquets serrés au début, et six
   secondes de calme après. */
/* La couleur du tube vit dans une propriété enregistrée : sans `@property`,
   un navigateur ne sait pas interpoler une couleur dans une variable et le
   passage de l'or au rouge se ferait d'un coup. Là où ça manque, le tube
   reste doré et fixe — la carte ne perd rien, elle arrête de changer. */
@property --neon{syntax:"<color>";initial-value:#E9B824;inherits:true}
.happy-promo{
  /* Un tube fin et une lueur basse. Il a fallu deux passes pour y arriver :
     à 2 px et pleine intensité le cadre criait plus fort que ce qui est
     écrit dedans, et à 1,5 il criait encore. Puis, tout baissé d'un coup,
     il s'éteignait dans la photo. Puis la carte a quitté la photo pour sa
     propre colonne, et ce qui tenait juste devant une image chargée est
     devenu criard sur un fond plat, à côté de quatre lignes sobres. Ces
     valeurs-ci sont réglées pour ce fond-là. Un néon de bar vu de loin est
     discret ; ce qui le fait remarquer, c'est qu'il change, pas qu'il
     brûle. */
  border:1px solid color-mix(in srgb, var(--neon) 52%, transparent);
  box-shadow:
    /* Dedans : la paroi du tube. */
    inset 0 0 6px -2px color-mix(in srgb, var(--neon) 16%, transparent),
    inset 0 0 20px -8px color-mix(in srgb, var(--neon) 11%, transparent),
    /* Dehors : la lueur, serrée puis large. */
    0 0 7px -2px color-mix(in srgb, var(--neon) 18%, transparent),
    0 0 26px -6px color-mix(in srgb, var(--neon) 11%, transparent),
    0 0 58px -14px color-mix(in srgb, var(--neon) 8%, transparent),
    /* Et l'ombre portée, qui la décolle de la photo. Sans elle, un néon
       flotte sans être posé nulle part. */
    0 14px 34px -22px rgba(0,0,0,.8);
  /* Deux animations, deux propriétés : le hoquet touche l'opacité, la
     couleur touche la couleur. Mêlées dans une seule courbe, il aurait fallu
     réécrire les six ombres à chaque image clé. */
  animation:
    happyNeon 9s steps(1, end) infinite,
    happyCouleur 18s ease-in-out infinite;
}
/* Or, rouge, vert vif, et retour. Chacune tient quatre secondes et met deux
   secondes à devenir la suivante : un tube qui change de couleur le fait en
   fondu, il ne saute pas — le saut, c'est le hoquet, et il est déjà pris. */
@keyframes happyCouleur{
  0%, 22%   {--neon:#E9B824}
  33%, 55%  {--neon:#E0715F}
  66%, 88%  {--neon:#6BD79A}
  100%      {--neon:#E9B824}
}
@keyframes happyNeon{
  /* Les hoquets. Court et sec : un tube qui s'allume, pas un gyrophare. */
  0%, 2%, 5%, 8%   {opacity:1}
  1%, 6.5%         {opacity:.74}
  3.5%             {opacity:.9}
  /* Puis il tient, et c'est le plus long. */
  9%, 100%         {opacity:1}
}

/* Le texte allumé lui aussi : un néon dont seul le cadre brille est un cadre
   avec du texte dedans. Le halo reprend la couleur de chaque ligne. */
/* Le titre et l'icône changent avec le tube : c'est une seule enseigne, et
   un cadre qui vire au vert autour d'un titre resté doré se lit comme deux
   choses posées l'une sur l'autre.

   C'est possible depuis que les trois couleurs ont baissé d'un cran : en
   rouge vif ou en vert fluo, « HAPPY DARTS HOUR » devenait pénible à lire
   deux fois sur trois. Aux teintes d'aujourd'hui, les trois passent sur le
   fond sombre de la carte. */
.happy-promo-titre{
  text-shadow:
    0 0 14px color-mix(in srgb, var(--neon) 20%, transparent),
    0 0 34px color-mix(in srgb, var(--neon) 10%, transparent);
}
/* La couleur elle-même se pose plus bas, avec le reste du titre : déclarée
   ici aussi, elle se serait fait écraser par la règle qui suit — et deux
   endroits pour une couleur, c'est un des deux qu'on oublie. */

/* Au survol, le tube monte d'un cran : c'est ce que fait un néon quand on
   s'en approche — rien, mais on a envie que ça réagisse. */
.happy-promo:hover{
  background:linear-gradient(170deg,var(--carte),#141c17);
  transform:translateY(-2px);
}

/* Le contenu au-dessus de tout le reste. */
.happy-promo > *{position:relative;z-index:2}
/* Qui a demandé moins d'animations garde le néon allumé et perd seulement le
   clignotement : la lueur n'est pas une animation, c'est la carte. */
@media (prefers-reduced-motion: reduce){
  /* Ni hoquet ni changement de couleur : le tube reste doré et allumé. */
  .happy-promo{animation:none}
  .happy-promo:hover{transform:none}
}

/* Quatre lignes : l'icône, le nom, quand, et le bouton. L'icône sur sa
   propre ligne — à côté du titre elle le poussait de côté et le titre n'était
   plus centré que par accident. */
/* Tous les textes de la carte d'un cran en dessous, à la demande de Greg.
   Elle occupe une colonne entière à côté de quatre lignes de tarif écrites
   en douze : à vingt-quatre, son titre pesait plus lourd que les prix, qui
   sont ce qu'on vient chercher. */
.happy-promo-titre{
  align-self:stretch;text-align:center;
  font-family:var(--ui);font-size:20px;font-weight:800;
  letter-spacing:.1em;text-transform:uppercase;color:var(--neon);
}
/* L'icône de fête. Elle bat : c'est le seul mouvement de la carte qui ne
   vient pas du tube, et c'est ce qui attire l'œil en premier. */
.happy-promo-ico{
  width:38px;height:38px;flex:0 0 auto;margin:0 auto;background:var(--neon);
  animation:happyBat 2.4s ease-in-out infinite;
}
@keyframes happyBat{
  0%,100%{opacity:1;transform:scale(1)}
  50%    {opacity:.5;transform:scale(.88)}
}
@media (prefers-reduced-motion: reduce){
  .happy-promo-titre .ico{animation:none}
}
.happy-promo-txt{
  align-self:stretch;text-align:center;
  font-family:var(--ui);font-size:14px;line-height:1.5;
  letter-spacing:.09em;text-transform:uppercase;color:var(--tx);
}
/* Dans la carte, le bouton perd son cadre et son fond : à vingt pixels du
   tube allumé, ça faisait deux cadres l'un dans l'autre. Restent la pastille
   verte et le mot — c'est sur ça qu'on clique, et le reste ne servait qu'à
   dire « ceci est un bouton » à quelque chose qui le dit déjà. */
/* Le bouton reprend sa propre taille : dans les lignes de tarif il est un
   mot au bout d'une rangée, ici il est l'action d'un panneau grand comme la
   moitié de la colonne. Le même corps aux deux endroits ferait petit ici. */
.happy-promo-btn{
  margin-top:12px;align-self:stretch;justify-content:center;
  padding:2px 0;font-size:15px;gap:11px;
  border:0;background:none;color:var(--creme);
}
.happy-promo-btn::before{width:10px;height:10px}
.happy-promo-btn:hover,
.happy-promo:hover .happy-promo-btn{
  border:0;background:none;color:var(--or);
}

.happy-fond{
  position:fixed;inset:0;z-index:210;display:none;
  place-items:center;padding:clamp(14px,4vw,40px);
  background:rgba(6,10,8,.94);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
}
.happy-fond.ouvert{display:grid;animation:visioParait .25s ease}
@media (prefers-reduced-motion:reduce){
  .happy-fond.ouvert{animation:none}
}
.happy-boite{
  position:relative;width:100%;max-width:min(92vw,560px);
  max-height:86vh;overflow:auto;
  background:var(--noir-2);border-radius:16px;padding:clamp(20px,4vw,30px);
  border:1px solid color-mix(in srgb, var(--or) 30%, transparent);
}
.happy-boite h3{
  margin:0;font-family:var(--ui);font-size:clamp(17px,3vw,21px);
  color:var(--or);letter-spacing:.02em;
}
.happy-boite .happy-chapo{
  margin:8px 0 0;font-size:14px;line-height:1.55;color:var(--tx);
}
/* Les horaires non plus ne sont pas une carte : c'est la même fenêtre, et
   un encadré dans un encadré ajoute un bord sans ajouter un sens. Un filet
   en haut les sépare de l'accroche, et c'est tout. */
.happy-quand{
  margin:18px 0 0;padding:14px 0 2px;
  border-top:1px solid var(--line);
}
.happy-quand ul{margin:0;padding:0;list-style:none}
.happy-quand li{
  display:flex;justify-content:space-between;gap:16px;
  font-size:14px;line-height:1.9;color:var(--creme);
}
.happy-quand li b{color:var(--or);font-variant-numeric:tabular-nums}
.happy-tarifs{margin:18px 0 0;display:grid;gap:0}
/* Des lignes, pas des cartes. Chaque tarif dans son cadre, ça faisait quatre
   boîtes dans une boîte : la fenêtre entière est déjà le cadre, et ce qu'on
   lit ici est une liste de quatre prix. Un filet entre deux suffit à les
   séparer. */
.happy-tarif{
  position:relative;
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:12px 2px;border-bottom:1px solid var(--line);
}
.happy-tarif:hover .tarif-btn{color:var(--or)}
.happy-tarif:hover{
  border-bottom-color:color-mix(in srgb, var(--vert) 50%, transparent);
}
.happy-tarif:last-child{border-bottom:0;padding-bottom:2px}
.happy-tarif span{flex:1 1 140px;font-size:14px;color:var(--creme)}
/* Le prix normal barré à côté du réduit : sans lui, « 18 € » ne dit pas que
   c'est une affaire — il faudrait remonter la page pour comparer. */
.happy-tarif del{color:var(--tx-2);opacity:.65;font-size:13px}
.happy-tarif b{color:var(--or);font-size:17px;font-variant-numeric:tabular-nums}
/* La même croix que les autres fenêtres, au même endroit. */
.happy-fermer{
  position:absolute;top:10px;right:10px;width:38px;height:38px;
  display:grid;place-items:center;border-radius:50%;cursor:pointer;
  background:rgba(8,11,9,.6);color:var(--or);
  border:1px solid color-mix(in srgb, var(--or) 40%, transparent);
  font-size:18px;line-height:1;
  transition:background .25s ease,border-color .25s ease;
}
.happy-fermer:hover{background:rgba(233,184,36,.14);border-color:var(--or)}
.happy-fermer:focus-visible{outline:2px solid var(--or);outline-offset:3px}



/* ── La bulle « cochez la newsletter » ──────────────────────
   Une seule fois, à la première visite du compte. Elle est en
   or plein avec de l'encre noire : c'est la seule chose de la
   page qui demande quelque chose, et elle ne reviendra pas —
   si elle se fond dans la carte, elle passe inaperçue et le
   geste est manqué pour de bon.

   La flèche pointe la case, pas le texte : c'est la case qu'on
   veut faire cocher. Elle est à 22 px du bord gauche, là où
   tombe la case à cocher de `.case`. */
.bulle-news{
  position:relative;
  margin:0 0 20px;
  padding:13px 34px 13px 15px;
  border-radius:10px;
  background:var(--or);
  color:#0A0D0C;
  box-shadow:0 10px 26px rgba(0,0,0,.45);
  animation:bulle-news-entree .42s cubic-bezier(.2,.9,.3,1.2) both;
}
.bulle-news p{
  margin:0;
  font-size:12.5px;line-height:1.5;font-weight:500;
}
/* La pointe. Deux triangles superposés : le clair par-dessus
   le sombre, pour qu'elle porte la même ombre que la bulle. */
.bulle-news::after{
  content:'';position:absolute;left:18px;bottom:-7px;
  width:0;height:0;
  border-left:8px solid transparent;
  border-right:8px solid transparent;
  border-top:8px solid var(--or);
}
.bulle-news-x{
  position:absolute;top:6px;right:8px;
  width:24px;height:24px;padding:0;
  display:flex;align-items:center;justify-content:center;
  border:0;border-radius:6px;background:transparent;
  color:#0A0D0C;font-size:19px;line-height:1;cursor:pointer;
  opacity:.55;transition:opacity .15s,background .15s;
}
.bulle-news-x:hover{opacity:1;background:rgba(0,0,0,.10)}
.bulle-news-x:focus-visible{outline:2px solid #0A0D0C;outline-offset:2px}

/* Tant que la bulle est là, la case respire : c'est elle qu'on
   montre du doigt, et un cadre or sur fond noir se voit mieux
   qu'une flèche seule. */
.case-signalee input{
  outline:2px solid var(--or);outline-offset:3px;border-radius:3px;
  animation:case-respire 1.9s ease-in-out 3;
}
@keyframes bulle-news-entree{
  from{opacity:0;transform:translateY(7px) scale(.98)}
  to{opacity:1;transform:none}
}
@keyframes case-respire{
  0%,100%{outline-color:var(--or)}
  50%{outline-color:rgba(233,184,36,.25)}
}
/* Qui a demandé moins d'animations n'en a aucune : la bulle
   s'affiche, simplement. */
@media (prefers-reduced-motion:reduce){
  .bulle-news{animation:none}
  .case-signalee input{animation:none}
}

/* ── L'œil des champs de mot de passe ───────────────────────
   Le bouton est posé PAR-DESSUS le champ, dans une boîte en
   position relative que le script glisse autour. Le champ
   garde sa largeur de 100 % et son style : rien à retoucher
   dans les formulaires, ni ici ni ailleurs.

   Le padding à droite se met sur le champ et pas sur la
   boîte : sans lui, le texte long passe sous l'icône. */
.mdp-oeil-boite{position:relative;display:block}
.mdp-oeil-boite input{padding-right:46px}
.mdp-oeil{
  position:absolute;top:0;right:0;bottom:0;
  width:44px;padding:0;margin:0;
  display:flex;align-items:center;justify-content:center;
  border:0;background:transparent;color:#5E665F;cursor:pointer;
  border-radius:0 9px 9px 0;
  transition:color .18s ease;
}
.mdp-oeil svg{width:18px;height:18px;display:block}
.mdp-oeil:hover,.mdp-oeil:focus-visible{color:var(--or)}
.mdp-oeil:focus-visible{outline:2px solid var(--or);outline-offset:-2px}

/* ── Le message d'erreur d'un formulaire ────────────────────
   Collé au-dessus du bouton qu'on vient de pousser : c'est là
   qu'on regarde. Encadré et non un simple texte rouge — sur
   l'inscription, une ligne rouge de plus au milieu de douze
   champs se confond avec les messages de chaque champ. */
.msg-erreur{
  margin:0 0 12px;
  padding:10px 13px;
  border:1px solid rgba(196,85,61,.45);
  border-radius:9px;
  background:rgba(196,85,61,.10);
  color:var(--rouge-clair);
  font-size:13px;line-height:1.45;
}

/* ── Un bloc qu'on plie ─────────────────────────────────────
   Le titre devient le bouton, avec un chevron à droite qui se
   retourne à l'ouverture. Le bouton remplit toute la largeur :
   on clique sur le titre, pas sur une flèche de 16 pixels. */
.bloc-bascule{
  width:100%;display:flex;align-items:center;justify-content:space-between;
  gap:12px;padding:0;border:0;background:none;cursor:pointer;text-align:left;
  font:inherit;color:inherit;letter-spacing:inherit;text-transform:inherit;
}
.bloc-bascule:hover .bloc-chevron{color:var(--or-clair)}
.bloc-bascule:focus-visible{outline:2px solid var(--or);outline-offset:4px;border-radius:4px}
.bloc-chevron{
  width:17px;height:17px;flex-shrink:0;color:var(--or);
  transition:transform .22s ease,color .18s ease;
}
.bloc-bascule[aria-expanded="true"] .bloc-chevron{transform:rotate(180deg)}
/* Replié, le trait sous le titre n'a plus rien à séparer. */
.bloc-pliable.replie h2{margin-bottom:0;padding-bottom:0;border-bottom:0}
@media (prefers-reduced-motion:reduce){
  .bloc-chevron{transition:none}
}

/* ── Les devis, dans le compte ──────────────────────────────
   Deux groupes dans la même carte : ce qu'il a envoyé, ce
   qu'il a reçu. Le rôtulo est plus petit que le titre de la
   carte — c'est une subdivision, pas une carte de plus. */
.devis-grupo + .devis-grupo{margin-top:22px}
.devis-rotulo{
  margin:0 0 10px;
  font-family:var(--ui);font-size:10.5px;font-weight:600;letter-spacing:.18em;
  text-transform:uppercase;color:var(--tx-2);
}
.devis-ligne{
  padding:12px 14px;border-radius:10px;
  border:1px solid var(--line-2);background:rgba(255,255,255,.02);
}
.devis-ligne + .devis-ligne{margin-top:8px}
.devis-titre{
  margin:0;font-family:var(--ui);font-size:14px;font-weight:600;
  color:var(--creme);line-height:1.35;
}
.devis-sous{margin:3px 0 0;font-family:var(--ui);font-size:12.5px;color:var(--tx-2);line-height:1.45}
.devis-ref{margin:5px 0 0;font-family:var(--ui);font-size:11.5px;letter-spacing:.05em;color:var(--or)}
.devis-attente{margin:5px 0 0;font-family:var(--ui);font-size:11.5px;color:#5E665F;font-style:italic}
.devis-vide{margin:0;font-family:var(--ui);font-size:13px;color:#5E665F}

/* Sur une fiche de réservation : la table qu'il avait désignée est bien
   celle qu'on lui a donnée. Discret et doré — c'est une bonne nouvelle, pas
   une alerte. */
.resa-matable{
  margin:6px 0 0;font-family:var(--ui);font-size:12.5px;color:var(--or);
}
.resa-matable b{font-weight:600}

/* ── Ma table ───────────────────────────────────────────────
   Le plan de salle du panneau, en lecture, avec une punaise par table. */
.table-note{
  margin:0 0 12px;font-family:var(--ui);font-size:13px;color:var(--tx-2);
  line-height:1.55;
}
.table-etages{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.table-etage{
  padding:7px 14px;border-radius:999px;
  border:1px solid var(--line-2);background:transparent;
  font-family:var(--ui);font-size:12.5px;color:var(--tx-2);cursor:pointer;
  transition:border-color .15s ease,color .15s ease,background .15s ease;
}
.table-etage:hover{color:var(--creme);border-color:rgba(255,255,255,.22)}
.table-etage.actif{
  background:var(--or);border-color:var(--or);color:#12100A;font-weight:600;
}

/* Le plan tient sa largeur et les punaises suivent : leurs coordonnées sont
   en POURCENTAGE, jamais en pixels — le même plan est regardé sur un
   téléphone et sur un écran large. */
.table-plan{
  position:relative;border-radius:12px;overflow:hidden;
  border:1px solid var(--line-2);background:rgba(255,255,255,.02);
}
.table-plan-fond{display:block;width:100%;height:auto}
/* Plus petites qu'avant : le plan ayant perdu la moitié de sa largeur, des
   punaises de trente pixels se seraient chevauchées là où les tables sont
   serrées. */
.table-puce{
  position:absolute;transform:translate(-50%,-50%);
  min-width:24px;height:24px;padding:0 6px;
  display:flex;align-items:center;justify-content:center;
  border-radius:999px;cursor:pointer;
  border:1px solid rgba(233,184,36,.55);
  background:rgba(8,11,9,.82);
  font-family:var(--ui);font-size:10px;font-weight:600;
  color:var(--or);
  transition:transform .12s ease,background .15s ease,color .15s ease;
}
.table-puce:hover{transform:translate(-50%,-50%) scale(1.12)}
/* La sienne : pleine. Une punaise creuse et une punaise pleine se
   distinguent d'un coup d'œil, même à trente pixels. */
.table-puce.choisie{
  background:var(--or);border-color:var(--or);color:#12100A;
  box-shadow:0 0 0 3px rgba(233,184,36,.22);
}
/* Ses places, au-dessus du plan. Numérotées : la première est LA sienne,
   les autres sont des replis, et c'est cet ordre qu'on suit en attribuant. */
/* Deux colonnes à parts égales : le plan de droite fait donc la moitié de
   ce qu'il faisait, ce qui suffit largement pour viser une punaise, et ses
   places restent lisibles à gauche pendant qu'on cherche la suivante. */
.table-grille{display:grid;grid-template-columns:1fr 1fr;gap:20px;align-items:start}
@media(max-width:760px){
  /* Sur un téléphone, l'un sous l'autre : ses places d'abord, c'est la
     réponse ; le plan ensuite, c'est l'outil. */
  .table-grille{grid-template-columns:1fr}
}
.table-choisies{min-width:0}
.table-col-plan{min-width:0}
.table-choisie{
  display:flex;align-items:center;gap:12px;position:relative;
  padding:10px 40px 10px 12px;border-radius:10px;
  border:1px solid var(--line-2);background:rgba(255,255,255,.02);
}
.table-choisie + .table-choisie{margin-top:8px}
.table-choisie .devis-titre,.table-choisie .devis-sous{display:block}
.table-choisie-nom{min-width:0;flex:1 1 auto}
.table-rang{
  flex:0 0 24px;width:24px;height:24px;border-radius:999px;
  display:flex;align-items:center;justify-content:center;
  background:var(--or);color:#12100A;
  font-family:var(--ui);font-size:12px;font-weight:700;
}
/* Le point sur l'onglet d'un étage où il a une place : sans lui, il faut
   ouvrir les quatre pour retrouver ce qu'on a choisi. */
.table-pastille{
  display:inline-block;width:6px;height:6px;border-radius:999px;
  background:var(--or);margin-left:7px;vertical-align:middle;
}
.table-etage.actif .table-pastille{background:#12100A}

/* ── Chèques cadeaux ────────────────────────────────────────
   Ce qu'on peut offrir, en lignes : le nom, le prix, le bouton. Le prix a
   sa place à lui pour que l'œil descende une colonne au lieu de chercher. */
.cheque-modelo{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.cheque-modelo-nom{flex:1 1 160px;min-width:0}
.cheque-modelo .devis-titre,.cheque-modelo .devis-sous{display:block}
.cheque-prix{
  flex:0 0 auto;font-family:var(--ui);font-size:15px;font-weight:600;color:var(--or);
}
.cheque-offrir{flex:0 0 auto;width:auto;padding:8px 18px;font-size:12.5px}

/* Le formulaire s'ouvre SOUS le chèque choisi : on voit encore ce qu'on
   offre en écrivant pour qui c'est. */
.cheque-form{
  margin:8px 0 0;padding:14px 16px;border-radius:10px;
  border:1px solid rgba(233,184,36,.35);background:rgba(233,184,36,.05);
}
/* La phrase qui répond avant qu'on pose la question : « est-ce que je tape
   un e-mail ? qui le reçoit ? quand ? » */
.cheque-form-note{
  margin:0 0 14px;font-family:var(--ui);font-size:12.5px;line-height:1.55;
  color:var(--tx-2);
}
.cheque-aide{
  display:block;margin-top:5px;font-family:var(--ui);font-size:11.5px;
  color:#5E665F;line-height:1.45;
}

/* Le code, en grand et à part : c'est la seule chose qu'on cherchera des
   yeux, six mois plus tard, devant le comptoir. */
.cheque-code{
  margin:0 0 4px;font-family:var(--ui);font-size:16px;font-weight:700;
  letter-spacing:.14em;color:var(--or);
}
.cheque-histo-note{
  margin:0 0 12px;font-family:var(--ui);font-size:12.5px;color:#5E665F;
  line-height:1.5;
}
/* Le petit mot, en italique et derrière son filet : c'est une citation de
   ce qu'on a écrit, pas une ligne de la fiche. */
.cheque-mot{
  margin:8px 0 0;padding-left:10px;border-left:2px solid rgba(233,184,36,.45);
  font-family:var(--ui);font-size:12.5px;font-style:italic;color:var(--tx-2);
  line-height:1.5;
}
.cheque-envoi{margin-top:6px}
/* Parti : vert et coché. Raté : rouge. Entre les deux il n'y a rien à dire —
   c'est parti ou ça n'est pas parti. */
.cheque-parti{color:var(--vert)}
.cheque-rate{color:#E4736B}
.cheque-etat{font-weight:600;font-family:var(--ui);font-size:12px}
/* Un lien et non un bouton : le cadeau est déjà parti, et un bouton doré
   ferait croire qu'il reste un geste à faire. */
/* Le coin haut-droit, à l'opposé du code : où le chèque en est, et le seul
   geste qui reste. Ils ne s'y mettent jamais à deux — un chèque est soit en
   cours, soit fini. */
.cheque-coin{
  position:absolute;top:10px;right:12px;
  display:flex;align-items:center;gap:6px;
}
.cheque-renvoyer{
  padding:0;border:0;background:none;cursor:pointer;
  font-family:var(--ui);font-size:12px;color:#5E665F;
  text-decoration:underline;text-underline-offset:3px;
}
/* La croix reprend celle des devis, posée dans le coin plutôt que collée à
   l'absolu : elle suit l'état au lieu de flotter à côté. */
.cheque-coin .cheque-x{position:static;width:22px;height:22px}
/* De quoi loger le lien sans que les lignes longues passent dessous : les
   fiches de chèques sont les seules à le porter. */
#cheques-mios .devis-ligne{padding-right:96px}
.cheque-renvoyer:hover{color:var(--or)}
.cheque-etat-usado,.cheque-etat-caducado{color:#5E665F}
.cheque-etat-valido{color:var(--vert)}

/* Lu par les lecteurs d'écran, invisible à l'œil. Pour les étiquettes de
   champs dont la forme dit déjà à quoi ils servent. */
.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* ── Mes équipes ────────────────────────────────────────────
   Un bar sportif se choisit pour ce qu'il diffuse : on coche ses équipes une
   fois, et leurs matchs attendent dans le compte. */
.equipes-ajout{display:flex;gap:10px;align-items:stretch;flex-wrap:wrap}
/* ── Mes favoris : cinq lignes, chacune avec son titre ──────────
   Une seule liste où l'on aurait mis équipes, joueurs, joueuses et
   combattants ne veut rien dire : on n'y cherche pas ce qu'on nous propose,
   on y cherche un nom, et « Choisir une équipe… » devant cent cinquante
   combattants de l'UFC est un mensonge. Le titre est DEVANT le champ, pas
   au-dessus : cinq lignes empilées avec leur légende au-dessus feraient dix
   lignes. */
/* ── Mes favoris ─────────────────────────────────────────────
   Ce qu'on suit tient sur UNE ligne d'écussons. En fiches empilées, cinq
   favoris faisaient trois cent trente pixels avant la première ligne du
   programme — et c'est le programme qu'on vient voir. */
/* Une seule hauteur pour toute la ligne, posée ici : « Conor McGregor »
   passe sur deux lignes et « AC Milan » sur une, et sans cette mesure
   commune la rangée devenait un escalier. Le « + » la reprend. */
.fav-barra{
  --fav-alto:72px;
  display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;
}
/* Petites : ce sont des repères, pas des fiches. Huit favoris tenaient sur
   quatre-vingt-dix pixels de haut et repoussaient le programme d'autant —
   or c'est le programme qu'on vient voir, les écussons on les reconnaît. */
/* La cellule porte la croix ; la pastille est le bouton qui filtre.
   Deux frères et non un bouton dans l'autre : un bouton dans un bouton n'est
   pas du HTML et le navigateur en fait ce qu'il veut. */
.fav-celda{position:relative;width:62px;height:var(--fav-alto)}
.fav-pastilla{
  display:flex;flex-direction:column;align-items:center;gap:4px;
  width:100%;height:100%;padding:7px 3px 6px;border-radius:10px;
  border:1px solid var(--line-2);background:rgba(8,11,9,.55);
  font:inherit;color:inherit;cursor:pointer;
  transition:border-color .18s ease,background .18s ease;
}
.fav-pastilla:hover{border-color:var(--or)}
/* Celui qu'on a choisi : le programme en dessous ne montre plus que lui. */
.fav-pastilla[aria-pressed="true"]{
  border-color:var(--or);background:rgba(233,184,36,.12);
}
.fav-pastilla[aria-pressed="true"] .fav-pastilla-nom{color:var(--or)}
.fav-pastilla-img{
  display:flex;align-items:center;justify-content:center;
  width:30px;height:30px;
}
.fav-pastilla-img img{max-width:100%;max-height:100%;object-fit:contain}
.fav-sin-imagen{font-size:17px;line-height:1}
/* Le nom sous l'image : un écusson seul ne se reconnaît pas toujours, et
   chez les joueurs c'est un portrait. Deux lignes au plus, puis on coupe —
   « Borussia Mönchengladbach » ne doit pas faire une pastille deux fois plus
   haute que ses voisines. */
.fav-pastilla-nom{
  font-family:var(--ui);font-size:9.5px;line-height:1.25;text-align:center;
  color:var(--tx-2);
  /* Deux lignes TOUJOURS réservées, même pour un nom court : c'est ce qui
     fait que les cartes s'alignent au lieu de monter et descendre. */
  min-height:2.5em;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;
}
.fav-quitar{
  position:absolute;top:-5px;right:-5px;width:18px;height:18px;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  border-radius:50%;border:1px solid var(--line-2);
  background:#12100A;color:var(--tx-2);font-size:13px;line-height:1;
  opacity:0;transition:opacity .15s ease,color .15s ease,border-color .15s ease;
}
.fav-celda:hover .fav-quitar,.fav-quitar:focus{opacity:1}
.fav-quitar:hover{color:var(--rouge);border-color:var(--rouge)}
/* Au doigt il n'y a pas de survol : la croix reste visible. */
@media (hover:none){.fav-quitar{opacity:.7}}

/* Le « + », au bout de ce qu'on a déjà : là où l'œil finit de lire. */
.fav-mas{
  width:62px;height:var(--fav-alto);cursor:pointer;
  border-radius:10px;border:1px dashed var(--line-2);background:transparent;
  color:var(--tx-2);font-size:22px;line-height:1;
  transition:border-color .2s ease,color .2s ease;
}
.fav-mas:hover{border-color:var(--or);color:var(--or)}

/* ── L'assistant : sport, puis ligue, puis équipe ──────────────
   Le seul ordre qui rende six cent cinquante lignes choisissables. */
.fav-asistente{
  margin-top:14px;padding:14px;border-radius:12px;
  border:1px solid var(--line-2);background:rgba(4,6,5,.5);
}
.fav-asis-tete{
  display:flex;align-items:center;gap:10px;margin-bottom:12px;
  padding-bottom:10px;border-bottom:1px solid var(--line-2);
}
.fav-asis-titre{
  flex:1;font-family:var(--ui);font-size:11.5px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;color:var(--or);
}
/* Deux vrais traits dessinés, pas des caractères : « ← » et « × » sont
   rendus par la police du système, qui les fait maigres ici et gras
   ailleurs. */
.fav-asis-retour,.fav-asis-fermer{
  width:30px;height:30px;flex:0 0 auto;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  border-radius:9px;border:1px solid var(--line-2);background:transparent;
  color:var(--tx-2);
  transition:border-color .2s ease,color .2s ease;
}
.fav-asis-retour svg,.fav-asis-fermer svg{
  width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
}
.fav-asis-retour:hover,.fav-asis-fermer:hover{border-color:var(--or);color:var(--or)}

.fav-sports{display:flex;flex-wrap:wrap;gap:6px}
.fav-sport{
  display:inline-flex;align-items:center;gap:7px;cursor:pointer;
  padding:6px 11px 6px 8px;border-radius:999px;
  border:1px solid var(--line-2);background:rgba(8,11,9,.6);
  font-family:var(--ui);font-size:12.5px;color:var(--tx-2);
  transition:border-color .2s ease,color .2s ease,background .2s ease;
}
/* Le pictogramme d'un sport : la classe `.ico` du site fait tout le
   travail — un masque qui ne garde que la forme du dessin et la remplit de
   doré. Il ne reste ici qu'à lui donner sa taille. */
.fav-sport-ico{width:18px;height:18px;flex:0 0 auto}
.fav-pastilla-ico{width:24px;height:24px}
.fav-sport img{width:18px;height:18px;object-fit:contain;flex:0 0 auto}
.fav-sport:hover{border-color:var(--or);color:var(--creme);background:rgba(233,184,36,.08)}

.fav-ligas{display:flex;flex-wrap:wrap;gap:6px}
.fav-liga{
  cursor:pointer;padding:8px 14px;border-radius:999px;
  border:1px solid var(--line-2);background:rgba(8,11,9,.6);
  font-family:var(--ui);font-size:12.5px;color:var(--tx-2);
  transition:border-color .2s ease,color .2s ease,background .2s ease;
}
.fav-liga:hover{border-color:var(--or);color:var(--creme);background:rgba(233,184,36,.08)}

.fav-buscar{
  width:100%;margin-bottom:10px;padding:10px 12px;border-radius:10px;
  border:1px solid var(--line-2);background:rgba(8,11,9,.6);
  font-family:var(--ui);font-size:14px;color:var(--creme);
}
.fav-buscar:focus{outline:none;border-color:var(--or)}
/* La liste défile dans son cadre : cent joueurs de l'ATP ne poussent pas le
   programme hors de l'écran. */
.fav-elegir{
  display:flex;flex-direction:column;gap:2px;
  max-height:300px;overflow-y:auto;
}
.fav-opcion{
  display:flex;align-items:center;gap:10px;width:100%;cursor:pointer;
  padding:7px 9px;border-radius:9px;border:1px solid transparent;
  background:transparent;text-align:left;
  font-family:var(--ui);font-size:13.5px;color:var(--tx-2);
}
.fav-opcion img{width:24px;height:24px;object-fit:contain;flex:0 0 auto}
.fav-opcion .fav-sin-imagen{width:24px;text-align:center;font-size:16px}
.fav-opcion:hover{background:rgba(233,184,36,.10);color:var(--creme)}
.fav-opcion[hidden]{display:none}

.fav-ligne select,
.equipes-ajout select{
  flex:1 1 220px;min-width:0;
  padding:11px 12px;border-radius:10px;
  border:1px solid var(--line-2);background:rgba(8,11,9,.6);
  font-family:var(--ui);font-size:14px;color:var(--creme);
}
.fav-ligne select:focus,
.equipes-ajout select:focus{outline:none;border-color:var(--or)}
.equipes-ajout .btn{flex:0 0 auto;width:auto;padding-left:22px;padding-right:22px}

/* L'écusson : c'est par lui qu'on reconnaît son équipe d'un coup d'œil,
   avant même d'avoir lu le nom. `contain` et pas `cover` — un blason coupé
   n'est plus un blason. */
.equipe-ligne{display:flex;align-items:center;gap:12px}
.equipe-logo{
  width:30px;height:30px;flex:0 0 30px;object-fit:contain;
}
.equipe-emoji{
  width:30px;flex:0 0 30px;text-align:center;font-size:20px;line-height:30px;
}
.equipe-nom{min-width:0}
/* `.devis-titre` et `.devis-sous` sont écrits pour des paragraphes. Ici ce
   sont des `span` — un `p` n'a pas le droit de vivre dans un `span` —, donc
   il faut leur rendre la ligne : sans ça « Bayern Munich » et « Football »
   se collaient l'un à l'autre. */
.equipe-nom .devis-titre,.equipe-nom .devis-sous{display:block}

/* ── Le programme des favoris ───────────────────────────────
   Ce sont les fiches de « Au programme » telles quelles : même
   pavé de date, même heure en or, mêmes écussons, même bouton.
   Elles s'habillent donc toutes seules (`.fixture`) et il ne
   reste ici qu'à les empiler. */
.fav-programme{display:flex;flex-direction:column;gap:12px}

/* ── L'aperçu d'un devis ────────────────────────────────────
   Le courrier tel qu'il est parti, dans une iframe isolée. La
   carte prend presque tout l'écran : un courrier d'un mètre de
   haut dans une boîte de 400 px ne se lit pas. */
.apercu{
  position:fixed;inset:0;z-index:130;
  display:flex;align-items:center;justify-content:center;padding:16px;
  background:rgba(4,6,5,.86);
  -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);
}
.apercu-carte{
  display:flex;flex-direction:column;
  width:100%;max-width:620px;height:min(88vh,900px);
  border-radius:14px;overflow:hidden;
  border:1px solid var(--line-2);background:#0B120E;
  box-shadow:0 24px 60px rgba(0,0,0,.55);
}
.apercu-barre{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:12px 14px;border-bottom:1px solid var(--line);flex-shrink:0;
}
.apercu-titre{
  margin:0;font-family:var(--ui);font-size:11px;font-weight:600;
  letter-spacing:.2em;text-transform:uppercase;color:var(--or);
}
.apercu-x{
  width:30px;height:30px;padding:0;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  border:1px solid var(--line-2);border-radius:8px;background:transparent;
  color:var(--tx-2);font-size:20px;line-height:1;cursor:pointer;
  transition:color .15s,border-color .15s;
}
.apercu-x:hover{color:var(--or);border-color:var(--or)}
.apercu-x:focus-visible{outline:2px solid var(--or);outline-offset:2px}
.apercu-corps{flex:1;min-height:0;display:flex}
.apercu-cadre{flex:1;width:100%;border:0;background:#080B09}
.apercu-corps .devis-vide{margin:auto;padding:24px}

/* Une proposition s'ouvre ; une demande non. */
.devis-ouvrable{
  display:block;width:100%;text-align:left;cursor:pointer;
  font:inherit;color:inherit;
  transition:border-color .15s ease,background .15s ease;
}
.devis-ouvrable:hover{border-color:color-mix(in srgb,var(--or) 45%,transparent);background:rgba(233,184,36,.05)}
.devis-ouvrable:focus-visible{outline:2px solid var(--or);outline-offset:2px}
.devis-ouvrir{
  display:block;margin-top:8px;
  font-family:var(--ui);font-size:11.5px;font-weight:600;
  letter-spacing:.04em;color:var(--or);
}

/* La croix qui retire une ligne du compte.
   Posée sur le coin et non dans le flux : la ligne d'une proposition est
   déjà un bouton entier, et un bouton dans un bouton n'existe pas. Discrète
   tant qu'on ne la cherche pas — elle retire une trace, et on ne fait pas
   ça d'un coup de doigt distrait. */
.devis-ligne-bloc{position:relative}
.devis-ligne-bloc + .devis-ligne-bloc,
.devis-ligne + .devis-ligne-bloc,
.devis-ligne-bloc + .devis-ligne{margin-top:8px}
.devis-ligne{position:relative}
.devis-retirer{
  position:absolute;top:6px;right:8px;
  width:26px;height:26px;padding:0;
  border:0;border-radius:8px;background:transparent;
  font:400 20px/1 var(--ui);color:#5E665F;cursor:pointer;
  transition:color .15s ease,background .15s ease;
}
.devis-retirer:hover{color:#E4736B;background:rgba(228,115,107,.1)}
.devis-retirer:focus-visible{outline:2px solid var(--or);outline-offset:2px}
/* De la place pour elle : sans ça, une date longue passe dessous. */
.devis-ligne{padding-right:40px}

/* ── Le compte : un menu, une section ───────────────────────
   Le menu tient la largeur d'un nom de section et rien de
   plus ; la section prend le reste. Sur téléphone il passe
   au-dessus, en ligne, parce qu'une colonne de menu sur 360
   pixels ne laisse rien au contenu. */
.compte-grille{
  display:grid;gap:22px;align-items:start;
  grid-template-columns:230px minmax(0,1fr);
}
.compte-menu{
  display:flex;flex-direction:column;gap:4px;
  padding:10px;border-radius:var(--r);
  border:1px solid var(--line);background:var(--carte);
  position:sticky;top:20px;
}
.compte-onglet{
  display:block;width:100%;text-align:left;
  padding:11px 13px;border:0;border-radius:9px;background:transparent;
  font-family:var(--ui);font-size:11.5px;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--tx-2);cursor:pointer;
  transition:background .15s ease,color .15s ease;
}
.compte-onglet:hover{background:rgba(255,255,255,.04);color:var(--creme)}
.compte-onglet:focus-visible{outline:2px solid var(--or);outline-offset:-2px}
/* L'actif en doré plein : sur une liste de quatre, une nuance
   de gris ne dit pas où l'on est. */
.compte-onglet[aria-selected="true"]{
  background:var(--or);color:#0A0D0C;
}
.compte-contenu{display:flex;flex-direction:column;gap:18px;min-width:0}
.compte-contenu > .bloc{margin:0}
/* Le deuxième rôtulo d'une section respire : « Historique »
   ne doit pas se coller à la dernière réservation à venir. */
.compte-sep{margin-top:26px}
/* Le bouton qui déplie le menu : il n'existe que sur téléphone. Sur grand
   écran la colonne de gauche tient tout entière, il n'y a rien à ouvrir. */
.compte-menu-bouton{display:none}

@media (max-width:880px){
  /* `minmax(0,1fr)` et non `1fr` : `1fr` vaut `minmax(auto,1fr)`, et `auto`
     refuse de descendre sous la taille du contenu. Le menu passé en ligne,
     avec ses huit onglets en `nowrap`, forçait donc la colonne à 1116 px sur
     un téléphone de 390 — et c'est TOUTE la page du compte qui se mettait à
     défiler de côté, textes et champs compris. Son `overflow-x:auto` ne
     servait à rien : il défilait dans une boîte déjà trop large. */
  .compte-grille{grid-template-columns:minmax(0,1fr);gap:16px}

  /* ── Le menu se déplie, il ne défile plus ──
     Il a été une barre horizontale : huit onglets qu'il fallait pousser du
     doigt pour voir les derniers, sans jamais savoir combien il en restait.
     Greg : « je n'aime pas les menus en barre horizontale où il faut défiler
     latéralement ». Le bouton porte le nom de la section ouverte, la liste
     s'ouvre PAR-DESSUS le contenu — en absolu, pour que rien ne saute sous
     le doigt au moment où l'on vise. */
  .compte-menu-zone{position:relative;z-index:30}
  .compte-menu-bouton{
    display:flex;align-items:center;justify-content:space-between;gap:12px;
    width:100%;padding:13px 16px;border-radius:var(--r);
    border:1px solid var(--line);background:var(--carte);
    font-family:var(--ui);font-size:12px;font-weight:600;letter-spacing:.14em;
    text-transform:uppercase;color:var(--or);cursor:pointer;text-align:left;
  }
  .compte-menu-bouton:focus-visible{outline:2px solid var(--or);outline-offset:2px}
  .compte-menu-fleche{
    width:16px;height:16px;flex-shrink:0;transition:transform .2s ease;
  }
  .compte-menu-bouton[aria-expanded="true"] .compte-menu-fleche{
    transform:rotate(180deg);
  }
  .compte-menu{
    position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:40;
    display:none;flex-direction:column;gap:2px;
    box-shadow:0 26px 54px -20px rgba(0,0,0,.95);
  }
  .compte-menu.ouvert{display:flex}
  .compte-onglet{padding:12px 14px}
}

/* ── La newsletter, dans le compte ──────────────────────────
   Un paragraphe, un état, un bouton. Rien d'autre : c'est une
   décision à deux valeurs, pas un réglage. */
.news-texte{margin:0 0 16px;font-family:var(--ui);font-size:14px;line-height:1.6;color:var(--tx-2)}
.news-etat{
  margin:0 0 14px;font-family:var(--ui);font-size:13px;font-weight:600;
  color:#8a857c;
}
.news-etat.news-oui{color:var(--vert-clair)}
.news-pied{margin:14px 0 0;font-family:var(--ui);font-size:11.5px;line-height:1.5;color:#5E665F}

/* L'entrée du menu qu'on montre du doigt, le temps de la bulle. */
.compte-onglet.onglet-signale{
  outline:2px solid var(--or);outline-offset:-2px;
  animation:onglet-respire 1.9s ease-in-out 3;
}
@keyframes onglet-respire{
  0%,100%{outline-color:var(--or)}
  50%{outline-color:rgba(233,184,36,.25)}
}
/* La bulle sous le menu : sa pointe remonte vers l'entrée. */
.compte-menu + .bulle-news{margin-top:10px}
.compte-menu + .bulle-news::after{top:-7px;bottom:auto;border-top:0;border-bottom:8px solid var(--or)}
@media (prefers-reduced-motion:reduce){
  .compte-onglet.onglet-signale{animation:none}
}

/* ── Un titre de section avec son lien à droite ─────────────
   Le trait du titre passe sous les deux : c'est une ligne, pas
   un titre avec quelque chose posé à côté. */
.bloc h2.titre-avec-lien{
  display:flex;align-items:baseline;justify-content:space-between;gap:16px;
}
.titre-lien{
  font-family:var(--ui);font-size:11px;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--or);white-space:nowrap;
  transition:color .15s ease;
}
.titre-lien:hover{color:var(--or-clair);text-decoration:underline}
.titre-lien:focus-visible{outline:2px solid var(--or);outline-offset:3px;border-radius:4px}
