/* =============================================================
   Legion Tournament · ce que l'application ajoute à la maquette.
   La feuille de la maquette (site-vitrine/site/assets/css/style.css)
   est servie telle quelle ; ici, seulement ce qu'elle n'avait pas :
   avis après une action, erreurs de formulaire, nombre de tours
   variable (arbre, frise, manches), poules, lancement.
   ============================================================= */

/* ---------- avis après une action (bande sous l'en-tête) ---------- */
.avis-app { background: var(--plaque); color: var(--clair); border-bottom: 1px solid var(--filet-nuit); }
.avis-app__barre { display: flex; align-items: center; gap: .75rem; padding-block: .9rem; font-weight: 600; }
.avis-app__barre::before { content: ''; flex: none; width: .5rem; height: .5rem; border-radius: 50%; background: var(--clair); }
.avis-app--erreur { background: var(--plaque-claire); color: var(--nuit); border-bottom-color: var(--filet-nuit); }
.avis-app--erreur .avis-app__barre::before { width: 18px; height: 18px; border-radius: 50%; background: linear-gradient(var(--blanc), var(--blanc)) center 3px / 2px 8px no-repeat, linear-gradient(var(--blanc), var(--blanc)) center 13px / 2px 2px no-repeat, var(--nuit); }

/* ---------- connexion : le code, et renvoyer l'e-mail ---------- */
.connexion-renvoi { align-items: center; }
.connexion-renvoi .bloc__note { flex-basis: 100%; }
#code { max-width: 12rem; letter-spacing: .15em; font-variant-numeric: tabular-nums; }

/* ---------- compte dans l'en-tête ---------- */
/* Sans liens (visiteur sans compte), le bouton « Se connecter » reste à droite. */
.app-entete__barre > .app-compte { margin-left: auto; }
@media (max-width: 760px) {
  /* Le logo et le compte ne collent plus au bord haut de l'écran (point 24 de l'audit). */
  .app-entete__barre { padding-top: .6rem; row-gap: .35rem; }
  .app-entete__barre > .logo, .app-entete__barre > .app-compte { min-height: 48px; }
}
.app-compte__sortie { margin: 0; }
.app-compte__sortie .lien-discret { font-size: .85rem; text-transform: none; letter-spacing: 0; }

/* Sur téléphone, la déconnexion passe dans le pied de page (l'en-tête n'a
   la place que pour le logo et l'avatar, comme dans la maquette). */
.app-pied__sortie { display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem .75rem; margin: 0; }

/* ---------- pages courtes (connexion, pseudo, lien d'équipe) ---------- */
/* Étroite, mais calée sur le bord gauche du titre, comme le reste de l'application
   (point 26 de l'audit : centrée, elle avait un autre bord gauche que le titre). */
.page-etroite { max-width: calc(46rem + 2 * var(--gouttiere)); margin-left: max(0px, calc((100% - var(--largeur)) / 2)); margin-right: auto; }
.page-etroite > .feuille .bloc__corps, .page-etroite > .feuille .formulaire-app { padding-inline: 0; }
.page-etroite .info p + p { margin-top: 1rem; }
.page-etroite > .feuille + .feuille { margin-top: 1.5rem; }
.page-etroite .bloc__corps p + p, .page-etroite .bloc__corps p + ul, .page-etroite .bloc__corps ul + p { margin-top: .75rem; }

/* ---------- erreurs de formulaire ---------- */
.champ__erreur, .erreurs-etape p { display: flex; align-items: flex-start; gap: .55rem; font-weight: 600; color: var(--texte); }
.champ__erreur::before, .erreurs-etape p::before { content: ''; flex: none; width: 18px; height: 18px; margin-top: .15rem; border-radius: 50%;
  background: linear-gradient(var(--surface, var(--blanc)), var(--surface, var(--blanc))) center 3px / 2px 8px no-repeat, linear-gradient(var(--surface, var(--blanc)), var(--surface, var(--blanc))) center 13px / 2px 2px no-repeat, var(--texte); }
.erreurs-etape { display: grid; gap: .5rem; margin-bottom: 1.75rem; padding: 1rem 1.1rem; border: 2px solid var(--texte); border-radius: var(--rayon-moyen); }
[aria-invalid="true"] { outline: 2px solid var(--texte); outline-offset: 2px; }
.erreurs { display: grid; gap: .6rem; margin-bottom: 1.75rem; padding: 1.1rem 1.25rem; border-radius: var(--rayon-moyen); background: var(--plaque-claire); color: var(--nuit); }
.erreurs__titre { font: 700 1.15rem/1.2 var(--police-titre); }
.erreurs__liste { display: grid; gap: .3rem; }
.erreurs .lien-discret { color: var(--nuit); text-align: left; }
.etape__erreur { display: grid; place-items: center; width: 1.3rem; height: 1.3rem; margin-left: .2rem; border-radius: 50%; background: var(--clair); color: var(--nuit); font: 700 .85rem/1 var(--police-titre); }

/* ---------- formulaires en ligne : un bouton par formulaire ---------- */
.actions-ligne > form, .inscrit__actions > form, .a-traiter__actions > form { display: contents; }
.lien-discret--clair { color: var(--texte-doux); }
.lien-discret--clair:hover { color: var(--texte); }
.menu-export > form { padding: 0; }
.menu-export > form > button { width: 100%; padding: .75rem .9rem; border: 0; background: none; color: var(--texte); text-align: left; cursor: pointer; font: 600 1rem/1.2 var(--police-titre); }
.menu-export > form > button:hover { background: var(--surface); }

/* ---------- nombre de tours, de manches, de cases : variable ---------- */
.arbre__tours[style*="--tours"] { grid-template-columns: repeat(var(--tours), minmax(10.5rem, 1fr)); min-width: calc(var(--tours) * 12.75rem); }
.arbre--grand .arbre__tours[style*="--tours"] { grid-template-columns: repeat(var(--tours), minmax(13rem, 1fr)); min-width: calc(var(--tours) * 16.5rem); }
.arbre__troisieme { display: grid; gap: .6rem; max-width: 16rem; margin-top: 2rem; }
.arbre__troisieme .arbre__intitule { margin-bottom: 0; }
.match--exempte .match__ligne + .match__ligne .match__equipe { font-size: .85rem; color: var(--clair-doux); }
.frise-tours[style*="--tours"] { grid-template-columns: repeat(var(--tours), minmax(0, 1fr)); }
.manches[style*="--manches"] { grid-template-columns: repeat(var(--manches), minmax(0, 1fr)); }
.avancement__cases[style*="--cases"] { grid-template-columns: repeat(var(--cases), minmax(0, 1fr)); }

/* Tableau du bas et grande finale : des colonnes de matchs, sans traits. */
/* Deux tours qui ne se suivent ni par paires ni un pour un : pas de trait entre eux (_arbre.eta). */
.arbre__tour--sans-suite .arbre__case::after, .arbre__tour--sans-suite .arbre__paire::after { display: none; }
.arbre__tour--sans-entree .arbre__case::before { display: none; }
.arbre--sans-traits .arbre__colonne { justify-content: space-around; }
.arbre--sans-traits .arbre__case { flex: none; }

/* Championnat et ligue : qui est au repos à chaque journée. */
.journee__repos { padding: .7rem 1.25rem 0; font-size: .92rem; color: var(--doux); }

/* ---------- poules et classements (écran A) ---------- */
.poules { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 24rem), 1fr)); gap: 1.25rem; margin-bottom: 1.25rem; }
.poule { padding: 1.25rem 1.4rem 1rem; }
.poule .arbre__nom { margin-bottom: .9rem; }
.classement td, .classement th { white-space: nowrap; }
[data-suivie] .classement tr[data-parcours] { box-shadow: inset 3px 0 0 var(--clair); }
[data-suivie] .classement tr[data-parcours] .demo-table__equipe { text-decoration: underline; text-underline-offset: .2em; }

/* ---------- battle royale : feuille de résultats (panneau clair) ---------- */
.feuille-resultats { width: 100%; border-collapse: collapse; }
.feuille-resultats th, .feuille-resultats td { padding: .5rem .5rem .5rem 0; border-bottom: 1px solid var(--trait); text-align: left; vertical-align: middle; }
.feuille-resultats thead th { font: 600 .8rem/1 var(--police-texte); color: var(--texte-doux); }
.feuille-resultats tbody th { font: 600 1.05rem/1.2 var(--police-titre); }
.feuille-resultats tbody th span { display: block; margin-top: .2rem; font: 500 .82rem/1.2 var(--police-texte); text-transform: none; color: var(--texte-doux); }
.feuille-resultats input { width: 5.5rem; min-height: 44px; padding: .4rem .6rem; border: 1px solid var(--trait-fort); border-radius: var(--rayon-petit); background: var(--creux); color: var(--texte); font: 700 1.1rem/1 var(--police-titre); }
/* Deux équipes sur la même place : la couleur d'alerte, des angles arrondis (point 71 de l'audit). */
.feuille-resultats .est-en-double input[name^="place_"] { border: 2px solid var(--encre); box-shadow: 0 0 0 3px var(--signal); }
.feuille-resultats .est-en-double th span { display: flex; align-items: center; gap: .4rem; font-weight: 700; color: var(--texte); }
.feuille-resultats .est-en-double th span::before { content: ''; flex: none; width: .7rem; height: .7rem; border-radius: 50%; background: var(--signal); box-shadow: 0 0 0 1px var(--encre); }
.resultats-partie { margin-top: .5rem; }
.partie-bloc + .partie-bloc, .tour-titre + .partie-bloc { margin-top: 1.5rem; }
.partie-bloc .bloc__titre a { color: inherit; text-decoration-thickness: 2px; text-underline-offset: .15em; }
.resultats-partie__note { margin-top: .75rem; }
[data-suivie] .resultats-partie tr[data-parcours], [data-suivie] .classement-battle tr[data-parcours] { box-shadow: inset 3px 0 0 var(--clair); }

/* ---------- modifier un tournoi : l'annulation, sous le formulaire ---------- */
.annuler { margin-top: 3.5rem; scroll-margin-top: 1rem; }

/* ---------- tableau de bord : lancer le tournoi ---------- */
.lancer { display: grid; justify-items: start; gap: 1rem; padding-top: 1.5rem; border-top: 1px solid var(--trait); scroll-margin-top: 1rem; }
.inscrits__liens { display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem 1.5rem; }
.inscrits .bloc__titre a { color: inherit; text-decoration-thickness: 2px; text-underline-offset: .15em; }
.inscrit > span:first-child { display: block; }

/* ---------- boîte d'envoi de développement ---------- */
.courriel__texte { overflow-wrap: anywhere; }
.courriel__apercu { display: block; width: 100%; height: 760px; margin-top: 1rem; border: 0; border-radius: var(--rayon-petit); background: var(--nuit-3); }
.courriel details summary { cursor: pointer; font-weight: 600; }
.courriel details .courriel__texte { margin-top: .75rem; }
.courriel__texte a { color: inherit; }

@media (max-width: 760px) {
  .frise-tours[style*="--tours"] { grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: minmax(6.5rem, 1fr); overflow-x: auto; padding-top: 8px; }
  .manches[style*="--manches"] { grid-template-columns: repeat(auto-fill, minmax(6.5rem, 1fr)); }
  .avancement__cases[style*="--cases"] { gap: .2rem; }
  .poule { padding-inline: 1rem; }
  .app-compte__sortie { display: none; }
  /* La maquette retire le retrait des têtes de panneau sur téléphone :
     le titre « À traiter » touchait le bord de sa feuille. */
  .app-grille .a-traiter-bloc > .bloc__tete { padding-inline: 1rem; }
}
a.app-avatar { text-decoration: none; }
/* Captures jointes aux scores (preuves) */
.preuve { text-decoration: none; color: inherit; }
.preuve__image { flex: none; width: 7.5rem; height: auto; max-height: 5rem; object-fit: cover; border-radius: var(--rayon-petit); background: var(--nuit); }

/* ---------- partage : plusieurs boutons, le QR code à côté ---------- */
.partage__boutons { display: flex; flex-wrap: wrap; gap: .5rem; }
@media (max-width: 40rem) { .partage { grid-template-columns: minmax(0, 1fr); } .partage__qr { width: 8rem; height: 8rem; } }

/* ---------- grand écran (télévision, vidéoprojecteur) : lisible à 5 mètres ---------- */
.grand-ecran { min-height: 100vh; font-size: clamp(1rem, .6rem + .9vw, 1.6rem); }
.grand-ecran__page { display: grid; grid-template-rows: auto 1fr; gap: 1.5em; min-height: 100vh; padding: clamp(1rem, 2.5vw, 3rem); }
.grand-ecran__tete { display: flex; justify-content: space-between; align-items: center; gap: 2rem; }
.grand-ecran__etat { font: 700 .9em/1 var(--police-texte); color: var(--clair-doux); text-transform: uppercase; letter-spacing: .08em; }
.grand-ecran__titre { margin-top: .3em; font: 800 clamp(2rem, 1rem + 3.5vw, 5rem)/1 var(--police-titre); letter-spacing: -.03em; }
.grand-ecran__infos { margin-top: .4em; color: var(--clair-doux); }
.grand-ecran__suivre { display: flex; align-items: center; gap: 1em; flex: none; text-align: right; color: var(--clair-doux); font-size: .85em; }
.grand-ecran__suivre p { display: grid; gap: .3em; max-width: 14em; }
.grand-ecran__suivre strong { color: var(--clair); font: 700 1.05em/1.2 var(--police-titre); word-break: break-all; }
.grand-ecran__qr { width: clamp(6rem, 9vw, 11rem); height: auto; border-radius: var(--rayon-petit); }
.grand-ecran__corps { display: grid; align-content: start; gap: 1.5em; }
.grand-ecran__bloc { display: grid; gap: .8em; }
.grand-ecran__intitule { font: 700 1.2em/1.1 var(--police-titre); color: var(--clair-doux); }
.grand-ecran__matchs { display: grid; gap: 1em; grid-template-columns: repeat(var(--colonnes, 1), minmax(0, 1fr)); }
.grand-ecran__matchs--2 { --colonnes: 2; }
.grand-ecran__matchs--3 { --colonnes: 3; }
.grand-ecran .ecran__equipe { font-size: 1.5em; }
.grand-ecran .ecran__entete { font-size: .8em; }
.grand-ecran .ecran__points { font-size: clamp(4rem, 2rem + 5vw, 9rem); }
.grand-ecran__matchs--3 .ecran__points { font-size: clamp(3rem, 1.5rem + 3.5vw, 6.5rem); }
.grand-ecran__matchs--3 .ecran__equipe { font-size: 1.15em; }
.grand-ecran__arbre .arbre { font-size: 1.15rem; }
.grand-ecran__poules { grid-template-columns: repeat(auto-fit, minmax(22rem, 1fr)); gap: 1.5em; }
.grand-ecran .classement { font-size: 1em; }
.grand-ecran .classement th, .grand-ecran .classement td { padding: .55em .7em; font-size: 1em; }
.grand-ecran .classement thead th { font-size: .75em; }
.grand-ecran .classement .demo-table__equipe { font: 700 1.25em/1.2 var(--police-titre); color: var(--clair); }
.grand-ecran .classement .demo-table__pts { font-size: 1.3em; }
.grand-ecran .classement .demo-table__rang { font: 800 1.2em/1 var(--police-titre); }
.grand-ecran__annonce { display: grid; justify-items: center; gap: .6em; padding: 2em 0; text-align: center; color: var(--clair-doux); }
.grand-ecran__surtitre { font: 700 1em/1 var(--police-texte); text-transform: uppercase; letter-spacing: .08em; }
.grand-ecran__grand { font: 800 clamp(2.5rem, 1rem + 5vw, 7rem)/1 var(--police-titre); letter-spacing: -.03em; color: var(--clair); }
.grand-ecran__equipes { display: flex; flex-wrap: wrap; justify-content: center; gap: .6em; }
.grand-ecran__equipes li { padding: .4em .9em; border: 1px solid var(--filet-nuit-fort); border-radius: var(--rayon-bouton); font: 700 1em/1.2 var(--police-titre); }
.grand-ecran__resultat { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 2em; align-items: center; }
.grand-ecran__resultat > .grand-ecran__podium:only-child { grid-column: 1 / -1; }
.grand-ecran__podium, .grand-ecran__classement { display: grid; }
.grand-ecran__marche, .grand-ecran__classement li { display: grid; grid-template-columns: 2.2em minmax(0, 1fr); align-items: center; gap: .8em; padding: .6em 0; border-bottom: 1px solid var(--filet-nuit); }
.grand-ecran__marche > span:last-child { display: grid; gap: .2em; color: var(--clair-doux); }
.grand-ecran__marche strong { font: 800 1.8em/1.05 var(--police-titre); color: var(--clair); }
.grand-ecran__marche--1 strong { font-size: 2.6em; color: var(--signal); }
.grand-ecran__rang { font: 800 2.2em/.9 var(--police-titre); color: rgba(238, 242, 248, .35); }
.grand-ecran__marche--1 .grand-ecran__rang { color: var(--signal); }
.grand-ecran__classement li { grid-template-columns: 2.2em minmax(0, 1fr) auto; padding: .4em 0; }
.grand-ecran__classement strong { font: 700 1.3em/1.1 var(--police-titre); }
.grand-ecran__classement li > span:last-child { color: var(--clair-doux); }
.grand-ecran__classement .grand-ecran__rang { font-size: 1.4em; }
.grand-ecran__heure { font-size: .75em; color: var(--clair-doux); }
.grand-ecran__plein { position: fixed; right: 1rem; bottom: 1rem; opacity: .35; transition: opacity .2s; }
.grand-ecran__plein:hover, .grand-ecran__plein:focus-visible { opacity: 1; }
@media (max-width: 60rem) {
  .grand-ecran__tete { flex-direction: column; align-items: flex-start; }
  .grand-ecran__suivre { text-align: left; flex-direction: row-reverse; }
  .grand-ecran__matchs, .grand-ecran__resultat { grid-template-columns: minmax(0, 1fr); }
}

/* ---------- récapitulatif des résultats (« recap » est pris par l'assistant) ---------- */
.palmares { display: grid; gap: 1.5rem; }
.palmares > .feuille + .feuille { margin-top: 0; }
.palmares__actions { display: flex; flex-wrap: wrap; gap: .6rem; }
.palmares__podium { display: grid; }
.palmares__podium li { display: grid; grid-template-columns: 2.5rem minmax(0, 1fr); align-items: center; gap: 1rem; padding: .7rem 0; border-bottom: 1px solid var(--trait); }
.palmares__podium li:last-child { border-bottom: 0; }
.palmares__podium li > span:last-child { display: grid; gap: .15rem; color: var(--texte-doux); }
.palmares__podium strong { font: 800 1.35rem/1.1 var(--police-titre); color: var(--texte); }
.palmares__rang { font: 800 2rem/.9 var(--police-titre); color: var(--texte-doux); }
.palmares__phase { margin: 1.25rem 0 .5rem; font: 700 1.05rem/1.2 var(--police-titre); }
.palmares__phase:first-child { margin-top: 0; }
.palmares-table { width: 100%; border-collapse: collapse; font-size: .95rem; }
.palmares-table th, .palmares-table td { padding: .5rem .5rem; text-align: left; vertical-align: top; border-bottom: 1px solid var(--trait); }
.palmares-table th { font: 600 .8rem/1.2 var(--police-texte); color: var(--texte-doux); }
.palmares-table__rang { width: 3rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.palmares-table__score { white-space: nowrap; font-variant-numeric: tabular-nums; font-weight: 700; }
.palmares__gagne { font-weight: 700; }
.palmares__pied { font-size: .85rem; color: var(--clair-doux); }

/* ---------- impression : le récapitulatif sur papier blanc, sans l'application autour ---------- */
@media print {
  @page { margin: 14mm; }
  body, .app { background: #fff !important; color: #000; }
  .app-entete, .app-pied, .avis-app, .saut-contenu, .palmares__actions, .grand-ecran__plein { display: none !important; }
  .app-tete, .app-corps { padding: 0 !important; background: none !important; }
  .app-tete__titre { font-size: 22pt; color: #000; }
  .app-tete__chemin, .app-tete__resume { color: #333; }
  .enveloppe { max-width: none; padding: 0; }
  .feuille { box-shadow: none; border: 0; padding: 0; margin-top: 8mm; break-inside: auto; }
  .palmares__matchs { break-before: auto; }
  .palmares-table tr { break-inside: avoid; }
  .palmares__pied { color: #333; margin-top: 6mm; }
  .info { border: 1px solid #999; background: none; color: #000; }
  a { color: inherit; text-decoration: none; }
}

/* ---------- planning du jour (terrains et horaires) ---------- */
.planning-page { display: grid; gap: 1.5rem; }
.planning-page .planning .match { display: block; color: inherit; text-decoration: none; }
.planning-page .planning .match + .match { margin-top: .5rem; }
.planning__groupe { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: .5rem; }
.planning__groupe .match + .match { margin-top: 0 !important; }
.planning-page .alerte-fin { margin: 0; }
@media print {
  .planning-page .planning { overflow: visible; box-shadow: none; border-color: #999; background: none; color: #000; }
  .planning-page .planning__table { min-width: 0 !important; }
  .planning-page .planning__table th, .planning-page .planning__table td { border-color: #bbb; color: #000; }
  .planning-page .match { break-inside: avoid; }
  .planning__legende { display: none; }
}
/* Un horaire prévu n'est pas du direct : pas de signal jaune ni de pouls. */
.match__statut--prevu { color: var(--clair-doux); }
.match__statut--prevu::before { display: none; }

/* ---------- saisie au bord du terrain (téléphone) ---------- */
.saisie { display: grid; gap: 1.25rem; }
.saisie > [data-zone] { display: grid; gap: 1.25rem; }
.saisie__terrains { display: flex; flex-wrap: wrap; gap: .5rem; }
.saisie__terrains a { padding: .55rem .9rem; border: 1px solid var(--filet-nuit-fort); border-radius: var(--rayon-bouton); color: var(--clair); font-weight: 700; text-decoration: none; }
.saisie__terrains a[aria-current="page"] { background: var(--clair); color: var(--nuit); border-color: var(--clair); }
.saisie__match { scroll-margin-top: 1rem; }
.saisie__match .bloc__corps { display: grid; gap: 1rem; }
.saisie__match .declarer__scores { justify-content: center; }
.saisie__valider { width: 100%; }
.saisie__note { color: var(--clair-doux); }
.saisie-lien { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 1.25rem; align-items: center; margin-top: 1rem; }
.saisie-lien .partage__lien { background: var(--creux); border-color: var(--trait-fort); color: var(--texte); }
.saisie-lien form { margin: 0; }
@media (max-width: 40rem) { .saisie-lien { grid-template-columns: minmax(0, 1fr); } }

/* ---------- feuilles de match (à imprimer, une par page) ---------- */
.feuilles { display: grid; gap: 1.5rem; }
.feuille-match { display: grid; gap: 1.1rem; padding: clamp(1.1rem, 3vw, 2rem); border-radius: var(--rayon); }
.feuille-match__tete { display: flex; justify-content: space-between; gap: 1.5rem; align-items: flex-start; padding-bottom: 1rem; border-bottom: 2px solid var(--texte); }
.feuille-match__tournoi { font: 600 .85rem/1.2 var(--police-texte); color: var(--texte-doux); }
.feuille-match__nom { margin-top: .3rem; font: 800 1.8rem/1.05 var(--police-titre); }
.feuille-match__infos { margin-top: .35rem; font-weight: 700; }
.feuille-match__qr { flex: none; width: 6.5rem; height: 6.5rem; }
.feuille-match__equipes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.25rem; }
.feuille-match__equipe h3 { margin-bottom: .5rem; font: 800 1.2rem/1.1 var(--police-titre); }
.feuille-match table { width: 100%; border-collapse: collapse; font-size: .9rem; }
.feuille-match th, .feuille-match td { height: 1.9rem; padding: .25rem .4rem; border: 1px solid var(--trait-fort); text-align: left; }
.feuille-match thead th { font: 600 .75rem/1.1 var(--police-texte); color: var(--texte-doux); }
.feuille-match__joueurs td:first-child { width: 2.5rem; }
.feuille-match__case { width: 3.5rem; }
.feuille-match__score th[scope="row"] { width: 40%; }
.feuille-match__score td { font: 800 1.3rem/1 var(--police-titre); text-align: center; }
.feuille-match__signatures { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; }
.feuille-match__signatures p { padding-bottom: 2.6rem; border-bottom: 1px solid var(--texte); font: 600 .8rem/1.2 var(--police-texte); color: var(--texte-doux); }
.feuille-match__pied { font-size: .8rem; color: var(--texte-doux); }
@media (max-width: 40rem) { .feuille-match__equipes { grid-template-columns: minmax(0, 1fr); } }
@media print {
  .feuilles { display: block; }
  .feuilles > .app-tete, .app-tete:has(+ .app-corps .feuilles) { display: none !important; }
  .feuille-match { break-after: page; padding: 0; border: 0; box-shadow: none; background: #fff; color: #000; --texte: #000; --texte-doux: #333; --trait-fort: #555; }
  .feuille-match:last-child { break-after: auto; }
  .feuilles > .info, .feuilles__terrains { display: none; }
}
.grand-ecran__suite { display: grid; grid-template-columns: repeat(auto-fit, minmax(16em, 1fr)); gap: .6em 1.5em; }
.grand-ecran__suite li { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: .1em .8em; align-items: baseline; padding: .5em 0; border-bottom: 1px solid var(--filet-nuit); }
.grand-ecran__suite strong { font: 700 1.1em/1.2 var(--police-titre); }
.grand-ecran__suite li > span:last-child { grid-column: 2; color: var(--clair-doux); font-size: .85em; }
.grand-ecran__quand { grid-row: span 2; font: 800 1.4em/1 var(--police-titre); color: var(--signal); }

/* ---------- choix des cartes, sur la page du match ---------- */
.veto-match { margin-top: 1.25rem; }
.veto-match .bloc__corps { display: grid; gap: 1rem; }
.veto-match .veto__tours { grid-template-columns: repeat(auto-fill, minmax(7.5rem, 1fr)); }
.veto-match__statut { font-weight: 600; }
.veto__carte--choix { padding: 0; border-color: var(--trait-fort); }
.veto__carte--choix form { display: contents; }
.veto__bouton { display: grid; align-content: space-between; gap: .8rem; width: 100%; min-height: 5.5rem; padding: .8rem .9rem; border: 0; border-radius: inherit; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
.veto__bouton .veto__qui { color: var(--signal); }
.veto__carte--choix:hover, .veto__carte--choix:focus-within { border-color: var(--clair); box-shadow: 0 0 0 2px var(--clair); }
.manche__carte { overflow-wrap: anywhere; }

/* ---------- assistant : d'où l'on part (modèle, tournoi repris) ---------- */
.depart-avis { margin-bottom: 1.5rem; }
.depart-avis__titre { font: 700 1.15rem/1.2 var(--police-titre); }
.depart-avis p + p { margin-top: .35rem; }
.ecrire__equipes { display: grid; grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); gap: .3rem 1rem; max-height: 16rem; overflow-y: auto; margin-top: .75rem; padding: .75rem; border: 1px solid var(--trait); border-radius: var(--rayon-petit); }

/* ---------- la roue des jeux (plusieurs jeux, tirage à chaque manche) ---------- */
.roue-match__corps { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 1.5rem 2rem; align-items: center; }
.roue { position: relative; width: clamp(12rem, 30vw, 16rem); aspect-ratio: 1; }
.roue__disque { width: 100%; height: 100%; transform: rotate(var(--angle, 0deg)); font-family: var(--police-titre); }
.roue--tourne .roue__disque { transition: transform 4.8s cubic-bezier(.12, .66, .08, 1); }
.roue__repere { position: absolute; z-index: 1; top: -.35rem; left: 50%; width: 0; height: 0; transform: translateX(-50%);
  border-left: .7rem solid transparent; border-right: .7rem solid transparent; border-top: 1.3rem solid var(--signal); filter: drop-shadow(0 2px 2px rgba(0, 0, 0, .5)); }
.roue--arrivee .roue__disque { animation: roue-arrivee .6s ease-out; }
@keyframes roue-arrivee { 0% { filter: brightness(1); } 40% { filter: brightness(1.35); } 100% { filter: brightness(1); } }
.roue-match__texte { display: grid; gap: .9rem; justify-items: start; }
.roue-match__resultat { font: 700 1.3rem/1.2 var(--police-titre); transition: opacity .3s; }
.roue-match__resultat strong { color: var(--signal); }
.roue-match__resultat--attente { opacity: 0; }
.roue-match__historique { display: grid; gap: .2rem; color: var(--texte-doux); font-size: .9rem; }
.roue-match__texte form { margin: 0; }
.veto__jeu { margin-top: .5rem; font: 700 1.05rem/1.2 var(--police-titre); }
@media (max-width: 40rem) { .roue-match__corps { grid-template-columns: minmax(0, 1fr); justify-items: center; } .roue-match__texte { justify-items: center; text-align: center; } }
@media (prefers-reduced-motion: reduce) { .roue--tourne .roue__disque { transition: none; } .roue--arrivee .roue__disque { animation: none; } }

/* ---------- épreuves (plusieurs jeux, chacun à son format) ---------- */
.epreuves { display: grid; gap: 1rem; padding-top: 1rem; }
.epreuve { display: grid; gap: .4rem; padding: .9rem 1rem; border: 1px solid var(--trait); border-radius: var(--rayon-moyen); }
.epreuve.est-en-cours { border-color: var(--signal); }
.epreuve.est-eventuelle { border-style: dashed; }
.epreuve__tete { display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem 1rem; }
.epreuve__num { font: 600 .8rem/1 var(--police-texte); color: var(--texte-doux); }
.epreuve__jeu { font: 700 1.15rem/1.1 var(--police-titre); }
.epreuve__etat { margin-left: auto; font-weight: 700; }
.epreuve .manches { padding-top: .4rem; }
.bo-jeux { display: grid; gap: .6rem; margin-top: 1rem; }
.bo-jeu { display: grid; grid-template-columns: minmax(8rem, 1fr) auto; align-items: center; gap: .5rem 1rem; }
.bo-jeu__nom { font: 700 1rem/1.2 var(--police-titre); }
@media (max-width: 40rem) { .bo-jeu { grid-template-columns: minmax(0, 1fr); } }

/* ---------- phase finale : les premiers choisissent leur adversaire ---------- */
.choix-adversaires .bloc__corps { display: grid; gap: 1rem; }
.choix__statut { font-weight: 600; }
.choix__ordre { display: grid; gap: .4rem; }
.choix__ordre li { display: grid; grid-template-columns: 3rem minmax(0, auto) minmax(0, 1fr); align-items: baseline; gap: .8rem; padding: .55rem .8rem; border: 1px solid var(--trait); border-radius: var(--rayon-petit); }
.choix__ordre li.est-courant { border-color: var(--texte); box-shadow: 0 0 0 1px var(--texte); }
.choix__ordre li > span:last-child { color: var(--texte-doux); }
.choix__rang { font: 800 1.1rem/1 var(--police-titre); }
.choix__equipes { display: flex; flex-wrap: wrap; gap: .6rem; }
.choix__equipes form { margin: 0; }
.choix__rang-bouton { margin-left: .4rem; font-size: .8em; opacity: .7; }

/* ---------- esport : le salon de jeu, et le règlement, sur la page du match ---------- */
/* Dans un <pre> : la typographie de l'affichage n'y touche pas, ce qu'on copie est exact. */
.salon-jeu__texte { margin: 0; font: inherit; font-weight: 700; white-space: pre-wrap; overflow-wrap: anywhere; }
.salon-jeu .outil > .champ { justify-self: stretch; }
.salon-jeu textarea { width: 100%; }
.match-reglement { padding-top: 1rem; }

/* ---------- assistant de création (bloc 4 de l'audit) ---------- */
/* Des choix rédigés en phrases : l'un sous l'autre, le texte aligné à gauche (point 38). */
.segments--phrases { grid-auto-flow: row; grid-auto-columns: auto; max-width: 40rem; }
.segments--phrases .segment label { place-items: center start; text-align: left; min-height: 48px; padding: .7rem 1rem; line-height: 1.3; }
/* Un compteur garde sa largeur, sans vide à droite (point 39). */
.compteur { justify-self: start; }
/* Rien d'encadré quand la phase 2 n'a pas lieu d'être ; une seule colonne quand l'autre est masquée (point 40). */
.phases-bloc:not(:has(> :not([hidden]))) { display: none; }
.questions-duo:has(> [hidden]) { grid-template-columns: minmax(0, 1fr); }
/* Les titres en légende se placent comme les autres : sous le trait, pas dessus (point 43). */
fieldset.bloc-question > legend { float: left; width: 100%; }
fieldset.bloc-question > legend + * { clear: both; }
/* Les jeux : « Retirer » dans le champ, tous les champs de la même largeur (point 37). */
.jeu-ligne { position: relative; display: block; }
.jeu-ligne input { width: 100%; padding-right: 6.5rem; }
.jeu-ligne .recap__modifier { position: absolute; top: 50%; right: .6rem; transform: translateY(-50%); }
/* Les questions libres : un titre, de quoi la retirer, des champs à la bonne largeur (point 42). */
.question-libre { justify-items: stretch; }
.question-libre__tete { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; gap: .5rem 1rem; }
.question-libre__options { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: .75rem 2rem; }
.question-libre__options .interrupteur + .interrupteur { margin-top: 0; }
/* Reprendre un de ses tournois : chercher dans la liste. */
.depart__recherche { max-width: 26rem; margin-bottom: 1rem; }
/* Le planning estimé : une seule barre de défilement, sombre sur la plaque claire (point 49). */
.planning--apercu { scrollbar-width: none; }
.planning--apercu::-webkit-scrollbar { display: none; }
.surface-claire .defilement { --curseur: var(--nuit); }
/* Téléphone : « Retour » et l'action côte à côte, l'action en grand (point 48). */
@media (max-width: 760px) {
  .assistant__nav { flex-wrap: nowrap; padding: .45rem; }
  .assistant__nav .bouton { min-height: 48px; padding-inline: 1rem; }
  .assistant__nav .bouton--principal { flex: 1; }
  .assistant__nav > span:empty { display: none; }
}

/* ---------- page d'un tournoi (bloc 5 de l'audit) ---------- */
/* Les boutons passent sous le titre : ils ne l'écrasent plus dans une colonne étroite (point 52). */
.tournoi-tete .app-tete__haut { grid-template-columns: minmax(0, 1fr); align-items: start; }
.tournoi-tete .app-tete__cote { justify-items: start; }
/* Une info sur plusieurs lignes garde sa puce à la hauteur de la première. */
.app-tete__infos li { align-items: baseline; }
.app-tete__infos li::before { flex: none; transform: translateY(-.2em); }
/* Battle royale : « en tête, 14 points » en légende, sous le grand score (point 58). */
.ecran .ecran__equipe--legende { font: 600 1rem/1.2 var(--police-texte); letter-spacing: 0; color: var(--clair-doux); }
/* « J'ai lu le règlement » : le lien vers l'onglet se voit comme un lien (point 59). */
.case label a { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 3px; }
/* « Forfait » dans l'arbre : une légende, pas un score (point 57). */
.match .match__score.match__forfait { font: 600 .8rem/1.4rem var(--police-texte); color: var(--doux); }

/* ---------- page de match (bloc 6 de l'audit) ---------- */
/* 62 : le bouton du navigateur est caché, la zone en tient lieu ; le clavier y passe toujours. */
.depot { position: relative; }
.depot__champ { position: absolute; top: 0; left: 0; width: 1px; height: 1px; opacity: 0; overflow: hidden; clip-path: inset(50%); }
.depot:has(.depot__champ:focus-visible) .depot__zone { outline: 2px solid var(--texte); outline-offset: 2px; }
.depot__choisi { font-weight: 700; overflow-wrap: anywhere; }
.depot--choisi .depot__zone { border-style: solid; border-color: var(--texte); }
/* 66 : une manche qui se jouera forcément n'a pas le pointillé du « si nécessaire ». */
.manche.est-a-venir { background: transparent; }
.manche.est-a-venir .manche__score, .manche.est-a-venir .manche__vainqueur { color: var(--texte-doux); }
/* 69 : le nom d'une carte ne se coupe pas au milieu d'un mot. */
.veto__nom { text-wrap: balance; }
/* 70 : les noms des deux équipes à la même hauteur, même si les joueurs tiennent sur deux lignes d'un côté. */
.ecran--match .ecran__score { grid-template-rows: auto 1fr auto; row-gap: 0; }
.ecran--match .ecran__score > div { display: grid; grid-row: 1 / span 3; grid-template-rows: subgrid; align-content: start; }
.ecran--match .ecran__score > .ecran__points { grid-row: 1 / span 3; align-self: center; }
.ecran--match .ecran__equipe { grid-row: 1; }
.ecran--match .ecran__joueurs { grid-row: 2; align-self: start; }
.ecran--match .piste-manches { grid-row: 3; }
@media (max-width: 760px) {
  .ecran--match .ecran__pied { flex-wrap: wrap; row-gap: .5rem; line-height: 1.2; }
  .ecran--match .ecran__pied > span { white-space: nowrap; }
}

/* ---------- le chat du match (bloc 6, décidé le 2026-10-21) ---------- */
/* Les zones du direct, sans boîte : leurs blocs restent dans la pile de la colonne. */
.zone-directe { display: contents; }
#chat { scroll-margin-top: 1rem; }
.chat__corps { display: grid; gap: .9rem; }
.chat__corps > * + * { margin-top: 0; }
.chat__liste { display: grid; align-content: start; gap: .6rem; max-height: 26rem; overflow-y: auto; overscroll-behavior: contain; padding-right: .2rem; }
.chat__message { display: grid; gap: .3rem; justify-self: start; max-width: 88%; padding: .6rem .8rem; border: 1px solid var(--trait); border-radius: var(--rayon-moyen); background: var(--teinte); }
.chat__message.est-mien { justify-self: end; background: rgba(238, 242, 248, .1); }
.chat__message--arbitre { border-color: var(--signal); }
.chat__tete { display: flex; justify-content: space-between; align-items: baseline; gap: .8rem; font: 500 .8rem/1.2 var(--police-texte); color: var(--texte-doux); }
.chat__qui { font-weight: 700; color: var(--texte); }
.chat__texte { white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.4; }
.chat__texte--masque { font-style: italic; color: var(--texte-doux); }
.chat__message.est-masque .chat__texte:not(.chat__texte--masque) { color: var(--texte-doux); text-decoration: line-through; text-decoration-color: var(--texte-doux); }
.chat__action { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: .2rem .8rem; margin: -.2rem 0 -.3rem; font-size: .8rem; color: var(--texte-doux); }
.chat__action .lien-discret { min-height: 28px; font-size: .8rem; }
.chat__form { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: .6rem; }
.chat__form textarea { width: 100%; min-height: 44px; padding: .6rem .8rem; border: 1px solid var(--trait-fort); border-radius: var(--rayon-petit); background: var(--creux); color: var(--texte); font: 500 1rem/1.4 var(--police-texte); resize: vertical; }
.chat__form textarea:focus-visible { outline: 2px solid var(--choix); outline-offset: 0; }
.chat__form textarea::placeholder { color: var(--texte-doux); }
.chat__erreur { color: var(--signal); font-weight: 600; }
.chat-compteur { display: inline-grid; place-items: center; min-width: 1.4rem; height: 1.4rem; margin-left: .5rem; padding: 0 .35rem; border-radius: 999px; background: var(--signal); color: var(--nuit); font: 700 .8rem/1 var(--police-texte); }
.chat-compteur[hidden] { display: none; }
@media (max-width: 760px) {
  .chat__liste { max-height: 60vh; }
  .chat__message { max-width: 94%; }
}

/* ---------- tableau de bord (bloc 7 de l'audit) ---------- */
/* 72 : un joueur voit d'abord où il joue ; sur chaque carte en direct, son match en cours ou le prochain. */
.bord-corps .enveloppe > .mes-tournois:first-child { margin-top: 0; }
.tournoi-carte__infos strong { color: var(--clair); }
.tournoi-carte__suite { display: grid; gap: .25rem; width: 100%; padding: .75rem .9rem; border-left: 3px solid var(--signal); border-radius: var(--rayon-petit); background: var(--teinte); font-size: .95rem; color: var(--clair-doux); }
.tournoi-carte__etiquette { font: 600 .78rem/1.2 var(--police-texte); text-transform: uppercase; letter-spacing: .06em; color: var(--signal); }
.tournoi-carte__match { color: var(--clair); }
.tournoi-carte__match strong { font: 700 1.05rem/1.2 var(--police-titre); }
.organiser { display: grid; justify-items: start; gap: 1rem; margin-top: 3.5rem; padding-top: 1.5rem; border-top: 1px solid var(--filet-nuit); color: var(--clair-doux); }
.organiser .mes-tournois__titre { color: var(--clair); }
/* 74 : cinq chiffres au plus, chacun dans sa case. */
.chiffres__liste { grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); }
/* 75 : sur téléphone et tablette, ce qui attend l'organisateur passe avant la carte du direct. */
@media (max-width: 1080px) {
  .bord-corps .a-traiter-bloc--d-abord { order: -1; }
}
/* 76 : « Écrire aux équipes » : l'objet et le message à la largeur du panneau. */
.ecrire > .champ { justify-self: stretch; max-width: 44rem; }
/* Les liens d'une carte sur la même ligne de texte (« Ouvrir le match → », « Voir le tournoi »). */
.tournoi-carte__liens { align-items: baseline; }

/* ---------- Modifier, inviter, saisie au bord du terrain (bloc 8 de l'audit) ---------- */
/* 79 : les blocs de la page « Arbitres et bénévoles » ne se touchent plus. */
.equipe-jour { display: grid; gap: 2rem; }
.equipe-jour .feuille { scroll-margin-top: 1rem; }
/* 78 : le nom (ou l'adresse) au-dessus de son rôle, l'état et « Retirer » ensemble ; une longue adresse se coupe. */
.aides li { grid-template-columns: auto minmax(0, 1fr) auto; }
.aides__qui { display: grid; gap: .2rem; min-width: 0; }
.aides__nom { overflow-wrap: anywhere; }
.aides__fin { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem 1rem; }
.aides__fin form { margin: 0; }
/* 81 : le rôle en tuiles décrites, au-dessus ; « Inviter » en jaune, dessous : on ne confond plus le choix et le bouton. */
.inviter { grid-template-columns: minmax(0, 1fr); justify-items: start; align-items: start; }
.inviter > .champ { justify-self: stretch; max-width: 30rem; }
.inviter > .champ-groupe { width: 100%; }
/* 84 : une adresse ne se coupe qu'après une barre oblique (<wbr>), pas au milieu d'un mot. */
.partage__lien { word-break: normal; overflow-wrap: anywhere; }
.saisie-lien .partage__lien { padding-inline: .7rem; font-size: .82rem; }
/* 80 : dans « Modifier », les outils du jour J sont loin de la barre « Enregistrer les modifications ». */
.renvoi-equipe { margin-top: 3.5rem; }
.renvoi-equipe__corps { display: grid; justify-items: start; gap: 1rem; }
.assistant__etape > .feuille.renvoi-equipe__corps > * + * { padding-top: 0; border-top: 0; }
/* Sur téléphone, « Retour au tournoi » devient « Retour » : la barre tient dans l'écran. */
@media (max-width: 760px) { .hors-telephone { display: none; } }
/* 82 : annuler le tournoi ne ressemble pas à un bouton ordinaire. */
.bouton--danger { background: transparent; border: 2px solid #B42318; color: #B42318; }
.bouton--danger:hover { background: #B42318; color: #fff; }
/* 85 : la page du bénévole : le nom du tournoi en haut, rien d'autre ; les matchs à suivre repliés. */
.app-entete__tournoi { margin-right: auto; font: 600 1rem/1.2 var(--police-texte); color: var(--clair-doux); }
.saisie__intertitre { margin-top: 1rem; font: 700 1.3rem/1.2 var(--police-titre); color: var(--clair); }
.saisie__match--replie .bloc__tete { padding-bottom: 0; border-bottom: 0; }
.saisie__ouvrir > summary { list-style: none; margin-top: 1rem; cursor: pointer; }
.saisie__ouvrir > summary::-webkit-details-marker { display: none; }
.saisie__ouvrir[open] > summary { display: none; }
.saisie__ouvrir > .bloc__corps { padding: 1.25rem 0 0; }
@media (max-width: 760px) {
  .aides li { grid-template-columns: auto minmax(0, 1fr); }
  .aides__fin { grid-column: 2; }
}

/* ---------- comptes et bêta (bloc 9 de l'audit) ---------- */
/* 89 : sur fond clair, un lien dans le texte se voit : souligné de sa couleur (le trait clair prévu pour la nuit y disparaissait). */
.surface-claire p a:not([class]), .surface-claire li a:not([class]) { font-weight: 600; text-decoration-color: currentColor; }
/* 86 : « Votre clé est partie » : la clé se tape sur cet appareil, sans repasser par la connexion. */
.formulaire-cle { margin-top: .5rem; }

/* ---------- grand écran (bloc 10 de l'audit) ---------- */
/* 92 : sur un écran large, les terrains et la suite à gauche, l'arbre ou le classement à droite ;
   chaque colonne s'ajuste à sa place (legion.js), l'arbre peut grossir : on ne rétrécit plus tout d'un bloc. */
/* 93 : l'adresse sous le QR code passe à la ligne après une barre oblique (<wbr>), pas au milieu d'un mot. */
.grand-ecran__suivre p { max-width: 18em; }
.grand-ecran__suivre strong { word-break: normal; overflow-wrap: anywhere; }
.grand-ecran__colonnes { display: grid; gap: 1.5em; }
.grand-ecran__colonne { min-width: 0; }
.grand-ecran__contenu { display: grid; align-content: start; gap: 1.5em; }
@media (min-width: 1200px) and (min-aspect-ratio: 4/3) {
  .grand-ecran__colonnes--deux { grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); gap: 2.5em; align-items: start; }
  .grand-ecran__colonnes--deux .grand-ecran__matchs--2 { --colonnes: 1; }
  .grand-ecran__colonnes--deux .grand-ecran__matchs--3 { --colonnes: 2; }
  .grand-ecran__colonnes--deux .grand-ecran__suite { grid-template-columns: minmax(0, 1fr); }
}
