/* ============================================================
   FFBS Scout — style "scoreboard" sportif & contrasté (iPad).
   Thème sombre unique (choix assumé). Accent bleu = frappe, orange = lancer.
   ============================================================ */
:root{
  --bg:#0a0e17; --bg2:#0f1520; --panel:#141c2b; --panel2:#1a2536; --line:#26324a; --line2:#33425e;
  --txt:#f4f8ff; --dim:#8ea0bd; --faint:#5c6b85;
  --blue:#2f7bff; --blueA:#4d90ff; --orange:#ff8a1e; --orangeA:#ffa347; --green:#1e9c5f; --red:#ef5a5a;
  --fld:#22b56b; --fldA:#37cf82;
  --accent:var(--blue); --accentA:var(--blueA);
  --pinEven:#161f30; --pinHover:#1b2740; --rowEven:rgba(255,255,255,.018); --rowHover:rgba(47,123,255,.06);
  --topbar:rgba(12,17,28,.6); --btnHover:#26344a; --glow:#16203a;
  --r:16px;
  /* Échelle de rayons UNIFORME — coins plus généreux (façon "liquid glass") pour que les GRANDES
     cases de séparation s'accordent avec les boutons en capsule. */
  --r-lg:30px; --r-md:20px; --r-sm:14px; --r-xs:11px; --r-pill:999px;
  /* Surfaces "liquid glass" */
  --glass:rgba(21,29,45,.55); --glass2:rgba(31,42,63,.5);
  --glass-brd:rgba(255,255,255,.09); --glass-brd2:rgba(255,255,255,.16);
  --hi:rgba(255,255,255,.07);
  --shadow:0 14px 40px rgba(0,0,0,.42); --shadow-sm:0 6px 18px rgba(0,0,0,.3);
  --blur:blur(22px) saturate(170%);
}
/* L'accent choisi dans les Réglages s'applique PARTOUT : on ne le remplace plus par le mode.
   (Les couleurs bat/pit/fld restent sur les stats via --blue/--orange/--fld et les classes s-*.) */
body[data-theme="light"]{
  --bg:#eef1f7; --bg2:#e6ebf3; --panel:#ffffff; --panel2:#eef2f8; --line:#d6dde8; --line2:#c2ccda;
  --txt:#131c2c; --dim:#4f5e76; --faint:#7c8aa0;
  --pinEven:#f4f7fc; --pinHover:#e9eff8; --rowEven:rgba(0,0,0,.022); --rowHover:rgba(47,123,255,.09);
  --topbar:rgba(255,255,255,.62); --btnHover:#dde5f1; --glow:#d6e3f8;
  --glass:rgba(255,255,255,.6); --glass2:rgba(255,255,255,.5);
  --glass-brd:rgba(18,28,48,.09); --glass-brd2:rgba(18,28,48,.15);
  --hi:rgba(255,255,255,.85);
  --shadow:0 14px 40px rgba(30,50,90,.12); --shadow-sm:0 6px 18px rgba(30,50,90,.08);
}

*{box-sizing:border-box;margin:0;padding:0;}
html,body{height:100%;}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  color:var(--txt);
  background:
    radial-gradient(1100px 680px at 88% -12%, color-mix(in srgb,var(--accent) 15%,transparent), transparent 60%),
    radial-gradient(950px 620px at -8% 8%, color-mix(in srgb,var(--accent) 8%,transparent), transparent 55%),
    radial-gradient(900px 900px at 50% 118%, color-mix(in srgb,var(--accent) 7%,transparent), transparent 60%),
    var(--bg);
  background-attachment:fixed; min-height:100%;
  display:flex; flex-direction:column; -webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none;}
.num,.tabnum{font-variant-numeric:tabular-nums;}

/* ---------------- Top bar ---------------- */
.topbar{
  position:sticky;top:0;z-index:50;display:flex;align-items:center;gap:14px;
  padding:11px clamp(14px,3vw,28px); padding-top:max(11px,env(safe-area-inset-top));
  background:var(--topbar); -webkit-backdrop-filter:blur(22px) saturate(180%); backdrop-filter:blur(22px) saturate(180%);
  border-bottom:1px solid var(--glass-brd); box-shadow:inset 0 -1px 0 var(--hi);
}
.brand{font-weight:900;font-size:1.05rem;letter-spacing:.2px;display:flex;align-items:center;gap:9px;white-space:nowrap;color:var(--accent);}
/* Le texte reste UN SEUL élément : sinon le `gap` du flex s'ajoute à l'espace du mot
   et creuse un trou entre « Flash » et « Scout ». Le gap ne sépare que l'éclair du texte. */
.brand .btxt{color:var(--txt);}
.blogo{width:24px;height:24px;flex:0 0 auto;display:block;border-radius:7px;}
.baccent{color:var(--accent);}
.bico{font-size:1.2rem;}
.sel{
  font:inherit;font-weight:800;font-size:.9rem;color:var(--txt);background:var(--panel);
  border:1px solid var(--line);border-radius:12px;padding:9px 13px;cursor:pointer;max-width:220px;
}
.sel:focus-visible{outline:2px solid var(--accent);outline-offset:2px;}
.nav{margin-left:auto;display:flex;gap:6px;}
.nav a{font-weight:800;font-size:.92rem;color:var(--dim);padding:9px 16px;border-radius:999px;transition:.15s;}
.nav a:hover{color:var(--txt);background:var(--panel);}
.nav a.on{color:#fff;background:var(--accent);}
@media(max-width:620px){
  .topbar{flex-wrap:wrap;}
  .sel{order:3;flex:1;max-width:none;}
  .nav{order:2;margin-left:0;}
}

/* ---------------- Layout ---------------- */
#app{flex:1;width:min(1160px,100%);margin:0 auto;padding:clamp(16px,3vw,26px);padding-bottom:60px;}
.foot{text-align:center;color:var(--faint);font-size:.78rem;padding:16px;padding-bottom:max(16px,env(safe-area-inset-bottom));}
/* Liens légaux (mentions, confidentialité) : présents dans le HTML servi, donc visibles
   sans JavaScript et par les robots — obligation LCEN art. 6-III. */
.foot-links{display:block;margin-top:6px;}
.foot-links a{color:var(--faint);text-decoration:underline;text-underline-offset:2px;display:inline-block;padding:11px 10px;line-height:22px;min-height:44px;box-sizing:border-box;}
.foot-links a:hover,.foot-links a:focus-visible{color:var(--txt,inherit);}
.back{display:inline-flex;align-items:center;gap:7px;color:var(--dim);font-weight:800;font-size:.9rem;margin-bottom:14px;}
.back:hover{color:var(--txt);}
.muted{color:var(--dim);}

/* ---------------- Logos d'équipe (crest monogramme) ---------------- */
.tlogo{
  --sz:42px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;
  width:var(--sz);height:var(--sz);border-radius:26%;font-weight:900;letter-spacing:.5px;color:#fff;
  font-size:calc(var(--sz)*.36);line-height:1;font-variant:normal;
  background:linear-gradient(145deg,hsl(var(--h) 72% 52%),hsl(calc(var(--h) + 34) 60% 34%));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.28),inset 0 -2px 6px rgba(0,0,0,.28),0 4px 12px rgba(0,0,0,.32);
  border:1px solid rgba(255,255,255,.14);text-shadow:0 1px 2px rgba(0,0,0,.35);
}
.tlogo.lg{--sz:58px;}
.tlogo.xl{--sz:76px;}
/* logo réel : tuile claire, image contenue */
/* Les logos WBSC sont des images 4:3 dont le blason n'occupe que le centre (larges marges
   blanches intégrées). Contenues dans une tuile carrée, elles rendaient un blason minuscule
   perdu dans du vide. On réduit donc le rembourrage de la tuile (13% -> 4%) : `contain` garantit
   qu'aucun logo n'est rogné, il occupe simplement toute la place disponible. */
.tlogo-img{position:relative;background:#f3f5f9;padding:calc(var(--sz)*.04);box-shadow:inset 0 0 0 1px rgba(0,0,0,.06),0 3px 9px rgba(0,0,0,.28);text-shadow:none;overflow:hidden;}
.tlogo-img img{width:100%;height:100%;object-fit:contain;display:block;}
.tlogo-img.tlogo-fail{padding:0;background:linear-gradient(145deg,hsl(var(--h) 72% 52%),hsl(calc(var(--h) + 34) 60% 34%));box-shadow:inset 0 1px 0 rgba(255,255,255,.28),0 4px 12px rgba(0,0,0,.32);}
.tlogo-img.tlogo-fail::after{content:attr(data-abbr);position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-weight:900;font-size:calc(var(--sz)*.36);color:#fff;letter-spacing:.5px;text-shadow:0 1px 2px rgba(0,0,0,.35);}

/* ---------------- Classement (index équipes) ---------------- */
.standings{padding:6px 8px;}
.st-headrow,.st-row{display:grid;grid-template-columns:34px 42px 1fr auto 20px;align-items:center;gap:12px;}
.st-headrow{padding:10px 10px 8px;border-bottom:1px solid var(--line);}
.st-headrow .st-rank,.st-headrow .st-hpct{color:var(--faint);font-size:.66rem;font-weight:900;letter-spacing:.6px;text-transform:uppercase;}
.st-headrow .st-hlbl{grid-column:2 / 4;color:var(--faint);font-size:.66rem;font-weight:900;letter-spacing:.6px;text-transform:uppercase;}
.st-headrow .st-hpct{text-align:right;}
.st-row{padding:11px 10px;border-bottom:1px solid var(--line);transition:background .14s;}
.st-row:last-child{border-bottom:none;}
.st-row:hover{background:var(--rowHover);}
.st-row:active{background:var(--pinHover);}
.st-rank{font-weight:900;font-size:1.15rem;font-variant-numeric:tabular-nums;color:var(--dim);text-align:center;}
.st-row.podium .st-rank{color:var(--accent);}
.st-row.mine{background:rgba(34,181,107,.08);box-shadow:inset 3px 0 0 var(--green);}
.st-id{min-width:0;}
.st-name{font-weight:900;font-size:1rem;letter-spacing:-.2px;line-height:1.15;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.st-mine{font-weight:900;font-size:.62rem;letter-spacing:.3px;padding:3px 7px;border-radius:6px;background:rgba(34,181,107,.16);color:#7fe0aa;border:1px solid rgba(34,181,107,.4);}
.st-sub{color:var(--dim);font-weight:700;font-size:.8rem;margin-top:3px;}
.st-pct{text-align:right;}
.st-pctv{font-weight:900;font-size:1.15rem;font-variant-numeric:tabular-nums;}
.st-pctk{font-size:.58rem;font-weight:800;letter-spacing:.5px;color:var(--faint);text-transform:uppercase;}
.st-arrow{color:var(--faint);font-size:1.35rem;font-weight:700;line-height:1;text-align:center;}
.st-row:hover .st-arrow{color:var(--accent);}
.page-sub{color:var(--dim);font-weight:700;font-size:.9rem;margin-top:5px;}

/* ---------------- Résultats par date ---------------- */
.reslist{padding:4px 6px;}
.res-day{border-bottom:1px solid var(--line);padding:12px 8px;}
.res-day:last-child{border-bottom:none;}
.res-date{font-size:.66rem;text-transform:uppercase;letter-spacing:.5px;color:var(--faint);font-weight:900;margin-bottom:10px;}
.res-row{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;padding:6px 0;}
.res-team{display:flex;align-items:center;gap:9px;min-width:0;}
.res-team .tlogo{--sz:28px;}
.res-team.a{justify-content:flex-end;text-align:right;}
.res-team.h{justify-content:flex-start;}
.res-nm{font-weight:700;font-size:.9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dim);}
.res-team.win .res-nm{color:var(--txt);font-weight:900;}
.res-score{display:grid;grid-template-columns:1fr 14px 1fr;align-items:center;gap:6px;font-variant-numeric:tabular-nums;min-width:74px;}
.res-score b{font-size:1.15rem;font-weight:900;color:var(--faint);}
.res-score b:first-of-type{text-align:right;}
.res-score b:last-of-type{text-align:left;}
.res-score b.w{color:var(--txt);}
.res-score .res-sep{text-align:center;color:var(--faint);}
.res-sep{color:var(--faint);}
@media(max-width:520px){.res-nm{font-size:.82rem;}.res-team .tlogo{--sz:24px;}}

/* ---------------- Hero (équipe / match) ---------------- */
.hero{
  background:linear-gradient(120deg,var(--panel),var(--bg2));border:1px solid var(--line);
  border-radius:22px;padding:20px 22px;display:flex;align-items:center;gap:16px;flex-wrap:wrap;
}
.hero .id{min-width:0;}
.hero .name{font-size:clamp(1.6rem,4.5vw,2.5rem);font-weight:900;letter-spacing:-.5px;line-height:1.02;}
.hero .meta{display:flex;gap:9px;align-items:center;margin-top:11px;flex-wrap:wrap;}
.hero .sp{flex:1;}
.badge{font-weight:900;font-size:.86rem;padding:7px 12px;border-radius:10px;letter-spacing:.3px;}
.badge.rec{background:linear-gradient(135deg,#25b06d,var(--green));color:#eafff3;box-shadow:0 4px 14px rgba(30,156,95,.25);}
.badge.info{background:var(--panel2);color:var(--dim);border:1px solid var(--line);}
.badge.mine{background:rgba(34,181,107,.16);color:#7fe0aa;border:1px solid rgba(34,181,107,.4);}
.hero-sel{font:inherit;font-weight:900;font-size:1.05rem;color:var(--txt);background:transparent;border:none;cursor:pointer;padding:0;max-width:100%;}
.hero-sel:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:6px;}

/* ---------------- Toggle Frappe/Lancer ---------------- */
.toggle{display:inline-flex;background:var(--bg2);border:1px solid var(--line);border-radius:15px;padding:5px;gap:5px;}
.toggle button{
  font:inherit;font-weight:800;font-size:.9rem;letter-spacing:.3px;cursor:pointer;border:none;
  background:transparent;color:var(--dim);padding:11px 17px;border-radius:11px;transition:.15s;
}
.toggle button:hover{color:var(--txt);}
body[data-mode="bat"] .toggle button.on{background:linear-gradient(135deg,var(--blueA),var(--blue));color:#fff;box-shadow:0 6px 16px rgba(47,123,255,.3);}
body[data-mode="pit"] .toggle button.on{background:linear-gradient(135deg,var(--orangeA),var(--orange));color:#2a1400;box-shadow:0 6px 16px rgba(255,138,30,.3);}
body[data-mode="fld"] .toggle button.on{background:linear-gradient(135deg,var(--fldA),var(--fld));color:#04240f;box-shadow:0 6px 16px rgba(34,181,107,.3);}
.toggle button:focus-visible{outline:2px solid var(--txt);outline-offset:2px;}

/* segmented neutre (onglets Match) */
.seg{display:inline-flex;background:var(--bg2);border:1px solid var(--line);border-radius:14px;padding:4px;gap:4px;}
.seg button{font:inherit;font-weight:800;font-size:.92rem;cursor:pointer;border:none;background:transparent;color:var(--dim);padding:11px 20px;border-radius:10px;transition:.15s;}
.seg button:hover{color:var(--txt);}
.seg button.on{color:#fff;background:var(--blue);}

.sec{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:22px 2px 12px;flex-wrap:wrap;}
.sec .t{font-size:1.15rem;font-weight:900;letter-spacing:-.2px;}
.hint{color:var(--faint);font-size:.82rem;font-weight:600;}

/* ---------------- Buttons ---------------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font:inherit;font-weight:800;cursor:pointer;
  border:1px solid var(--line);background:var(--panel2);color:var(--txt);padding:12px 18px;border-radius:12px;transition:.12s;}
.btn:hover{background:var(--btnHover);}
.btn:active{transform:scale(.98);}
.btn.primary{background:linear-gradient(135deg,var(--accentA),var(--accent));border-color:transparent;color:#fff;}
.btn.sm{padding:8px 13px;font-size:.86rem;border-radius:10px;}
.btn.icon{width:34px;height:34px;padding:0;}
.btn.block{width:100%;}
.btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px;}
.btn-row{display:flex;flex-wrap:wrap;gap:10px;}
input.search{font:inherit;color:var(--txt);background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:12px 14px;width:100%;}
input.search:focus{outline:none;border-color:var(--accent);}

/* ---------------- Card / table ---------------- */
.card{background:var(--glass);border:1px solid var(--glass-brd);border-radius:var(--r-lg);overflow:hidden;
  -webkit-backdrop-filter:var(--blur); backdrop-filter:var(--blur);
  box-shadow:var(--shadow), inset 0 1px 0 var(--hi);}
.scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;}
table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums;}
thead th{position:sticky;top:0;background:var(--bg2);z-index:2;font-size:.7rem;font-weight:900;letter-spacing:.7px;
  color:var(--dim);text-transform:uppercase;padding:14px 12px;text-align:center;white-space:nowrap;
  border-bottom:2px solid var(--line);cursor:pointer;user-select:none;}
thead th.l{text-align:left;}
thead th.sorted{color:var(--accent);}
/* Colonne NOM figée : elle se réduit à son contenu (width:1%) au lieu d'absorber tout l'espace en trop,
   pour que les colonnes de stats se répartissent équitablement (fini le grand vide après le nom). */
th.pinL,td.pinL{position:sticky;left:0;z-index:3;background:var(--panel);border-right:1px solid var(--line);
  width:1%;max-width:260px;overflow:hidden;text-overflow:ellipsis;}
thead th.pinL{z-index:4;background:var(--bg2);}
tbody td{padding:0 12px;height:58px;text-align:center;white-space:nowrap;border-bottom:1px solid var(--line);font-weight:700;font-size:1rem;}
tbody tr:nth-child(even) td{background:var(--rowEven);}
tbody tr:nth-child(even) td.pinL{background:var(--pinEven);}
tbody tr:hover td{background:var(--rowHover);}
tbody tr:hover td.pinL{background:var(--pinHover);}
tbody tr:last-child td{border-bottom:none;}
td.pl{text-align:left;font-weight:800;font-size:1.02rem;}
td.pl a:hover{color:var(--accent);}
/* Nom court (box score) réservé au mobile : voir le bloc @media (max-width:560px) */
.nm-short{display:none;}
.rk{display:inline-block;width:26px;text-align:right;margin-right:10px;color:var(--faint);font-weight:900;font-variant-numeric:tabular-nums;}
.rk.top{color:var(--accent);}
td.hcell{color:#fff;}
.role{font-size:.58rem;font-weight:900;letter-spacing:.5px;padding:2px 6px;border-radius:5px;margin-left:6px;vertical-align:middle;}
.role.b{background:#16233c;color:#8fb6ff;} .role.p{background:#2f2410;color:#ffbf7a;} .role.off{background:var(--bg2);color:var(--faint);}
tr.na td{color:var(--faint);font-weight:600;}
td.dim{color:var(--faint);font-weight:600;}
th.keyc{color:var(--txt);position:sticky;right:0;z-index:3;background:var(--bg2);border-left:1px solid var(--line);}
thead th.keyc{z-index:4;}
th.keyc.sorted{color:var(--accent);}
td.keyc{position:sticky;right:0;z-index:2;background:var(--panel);border-left:1px solid var(--line);padding:8px 12px;}
tbody tr:nth-child(even) td.keyc{background:var(--pinEven);}
tbody tr:hover td.keyc{background:var(--pinHover);}
.pill{display:inline-block;min-width:74px;padding:9px 0;border-radius:11px;font-weight:900;font-size:1.12rem;text-align:center;color:#fff;}
.pill.plain{background:transparent!important;color:var(--txt);min-width:0;padding:0;font-size:1rem;}
.pill.sm{min-width:60px;padding:7px 0;font-size:1rem;}

/* ---------------- Fiche joueur ---------------- */
.fiche-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:16px;}
.fiche-head .nm{font-size:clamp(1.6rem,4.5vw,2.3rem);font-weight:900;letter-spacing:-.5px;line-height:1.05;}
.fiche-head .sub{color:var(--dim);margin-top:7px;font-weight:700;}
.side{border-radius:20px;border:1px solid var(--line);overflow:hidden;background:var(--panel);}
.side + .side{margin-top:16px;}
.side-h{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px;background:linear-gradient(120deg,var(--panel2),var(--panel));border-bottom:1px solid var(--line);}
.side-h .st{font-size:1.05rem;font-weight:900;display:flex;align-items:center;gap:9px;}
.side-h .dot{width:11px;height:11px;border-radius:3px;}
.side.s-bat .dot{background:var(--blue);} .side.s-pit .dot{background:var(--orange);} .side.s-fld .dot{background:var(--fld);}
.side-h .big{font-weight:900;font-size:1.4rem;padding:6px 14px;border-radius:12px;color:#fff;}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(90px,1fr));gap:8px;padding:14px;}
.gc{background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:11px 13px;}
.gc .k{font-size:.64rem;text-transform:uppercase;letter-spacing:.6px;color:var(--faint);font-weight:800;}
.gc .v{font-weight:900;font-size:1.28rem;margin-top:4px;font-variant-numeric:tabular-nums;}
.gc.hl .v{color:var(--accent2,inherit);}
.side.s-bat .gc.hl .v{color:var(--blueA);} .side.s-pit .gc.hl .v{color:var(--orangeA);} .side.s-fld .gc.hl .v{color:var(--fldA);}
.na-msg{padding:26px 18px;color:var(--faint);text-align:center;font-weight:700;}
.pw{display:grid;grid-template-columns:1fr 1fr;gap:0;border-top:1px solid var(--line);}
.pw>div{padding:15px 18px;}
.pw>div+div{border-left:1px solid var(--line);}
.pw h4{font-size:.66rem;text-transform:uppercase;letter-spacing:.6px;color:var(--faint);font-weight:800;margin-bottom:9px;}
.pw ul{list-style:none;display:flex;flex-direction:column;gap:7px;}
.pw li{font-size:.9rem;font-weight:600;padding-left:16px;position:relative;}
.pw .good li::before{content:"▸";position:absolute;left:0;color:var(--green);}
.pw .bad li::before{content:"▸";position:absolute;left:0;color:var(--red);}
@media(max-width:560px){.pw{grid-template-columns:1fr;}.pw>div+div{border-left:none;border-top:1px solid var(--line);}}

/* ---------------- Match : line-up / roster ---------------- */
.rows{display:flex;flex-direction:column;}
/* Rangée générique. En GRILLE à colonnes fixes (`34px 1fr auto auto`), tout dépendait de
   l'ordre exact des enfants : un bloc d'identité placé en premier atterrissait dans la colonne
   de rang de 34 px et son contenu s'empilait sur quatre lignes — constaté sur la liste des
   joueurs masqués de l'espace admin, sur téléphone COMME sur bureau. Le code appelant avait
   d'ailleurs déjà dû neutraliser cette grille par un style en ligne à un autre endroit.
   En flex, chaque élément prend la place qu'il lui faut et passe à la ligne si nécessaire,
   quel que soit l'ordre. */
.row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;padding:11px 14px;border-bottom:1px solid var(--line);}
.row > .n{flex:0 0 auto;min-width:26px;}
.row > .who{flex:1 1 auto;min-width:0;}
.row > .who .nm{overflow:hidden;text-overflow:ellipsis;}
.row:last-child{border-bottom:none;}
.row .n{color:var(--faint);font-weight:900;text-align:center;}
.row .who{min-width:0;}
.row .who .nm{font-weight:800;font-size:1rem;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
.row .who .nm a:hover{color:var(--accent);}
/* Rangées avec une icône « note » : le nom peut passer sur 2 lignes DANS son bloc, l'icône reste
   à côté (centrée) et ne tombe plus seule sur une ligne. */
.row .who .nm.nm-note{flex-wrap:nowrap;align-items:center;gap:6px;}
.nm.nm-note .nm-t{flex:1 1 auto;min-width:0;overflow-wrap:anywhere;}
.nm.nm-note .notebtn{flex:0 0 auto;}
.row .who .st{color:var(--dim);font-size:.82rem;font-weight:700;margin-top:3px;}
.row .who .st b{color:var(--txt);}
.row.atbat{background:rgba(255,255,255,.03);box-shadow:inset 3px 0 0 var(--accent);}
.row .acts{display:flex;gap:5px;}
.iconb{cursor:pointer;border:1px solid var(--line);background:var(--bg2);color:var(--txt);border-radius:8px;width:32px;height:32px;font-size:.85rem;line-height:1;display:inline-flex;align-items:center;justify-content:center;padding:0;}
.iconb:hover{background:var(--panel2);}
.pill-key{min-width:66px;padding:8px 0;border-radius:10px;font-weight:900;font-size:1.02rem;text-align:center;color:#fff;}
.empty{text-align:center;color:var(--dim);padding:26px 16px;font-weight:700;}

/* ---------------- Scoreboard (refonte) ---------------- */
.sb{display:flex;flex-direction:column;gap:16px;}
.sb-main{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;
  background:linear-gradient(135deg,var(--panel2),var(--bg2));border:1px solid var(--line);border-radius:18px;padding:18px 14px;}
.sb-team{text-align:center;min-width:0;padding:8px 6px;border-radius:14px;}
/* PAS de fond/liseré sur l'équipe en tête ni sur l'équipe à la batte (illisible) :
   le leader est signalé UNIQUEMENT par son chiffre en bleu (.sb-team.lead .sb-sc),
   l'équipe à la batte UNIQUEMENT par la mention AT-BAT au-dessus de son nom. */
.sb-atbat{display:block;font-size:.62rem;font-weight:900;letter-spacing:.14em;color:var(--accent);
  text-transform:uppercase;margin-bottom:2px;}
/* Rendue mais invisible sur l'équipe qui n'est pas à la batte : réserve la hauteur des deux côtés
   pour que le nom de l'équipe ne se décale pas vers le bas. */
.sb-atbat.ghost{visibility:hidden;}
.fs-scorecard .sb-atbat{font-size:clamp(.6rem,1.5vh,.8rem);}
.sb-tn{min-width:0;}
.sb-city{color:var(--faint);font-weight:700;font-size:1.1rem;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sb-nick{color:var(--dim);font-weight:900;font-size:1.7rem;line-height:1.12;letter-spacing:-.3px;}
.sb-team.lead .sb-nick{color:var(--txt);}
.sb-sc{font-size:4.4rem;font-weight:900;line-height:1;margin-top:8px;letter-spacing:-2px;}
/* écran large : occupe mieux la boîte du bandeau */
@media(min-width:760px){
  .sb-city{font-size:1.3rem;}
  .sb-nick{font-size:2.2rem;}
  .sb-sc{font-size:5.4rem;}
}
.sb-team.lead .sb-sc{color:var(--accent);}
.sb-mid{display:flex;flex-direction:column;gap:10px;align-items:center;}
.sb-chip{display:flex;flex-direction:column;align-items:center;gap:3px;background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:7px 14px;min-width:78px;}
.sb-chip .k{font-size:.58rem;text-transform:uppercase;letter-spacing:.6px;color:var(--faint);font-weight:800;}
.sb-chip .v{font-weight:900;font-size:1.35rem;line-height:1;}
/* bases (losange SVG avec marbre) + compteurs alignés (OUT / B / S) */
.bases{width:50px;height:50px;display:block;}
.bases .bpad{fill:var(--bg2);stroke:var(--line2);stroke-width:1.5;transition:fill .15s;}
.bases .bpad.on{fill:var(--accent);stroke:var(--accent);}
.bases .home{fill:none;stroke:var(--dim);stroke-width:1.5;}
.bases .home.bat{fill:var(--accent);stroke:var(--accent);}
.sb-counters{display:grid;grid-template-columns:auto auto;gap:7px 10px;align-items:center;}
.sb-counters .k{font-size:.62rem;font-weight:900;color:var(--faint);letter-spacing:.4px;text-align:right;justify-self:end;}
.cdots{display:inline-flex;gap:6px;align-items:center;}
.cdot{width:12px;height:12px;border-radius:50%;border:1px solid var(--line2);flex:0 0 auto;}
.cdot.on{background:var(--accent);border-color:var(--accent);}
.cdots.outs .cdot.on{background:var(--red);border-color:var(--red);}
/* cluster de contrôles (retour / plein écran / correction) */
.sb-ctrls{display:flex;gap:8px;flex:0 0 auto;}
/* roue crantée en haut à droite, au-dessus du score */
.sb-top{display:flex;justify-content:flex-end;margin-bottom:-6px;}
.sb-gear{flex:0 0 auto;opacity:.7;transition:.15s;}
.sb-gear svg{display:block;width:18px;height:18px;}
.sb-gear:hover{opacity:1;}
.sb-gear[aria-expanded="true"]{opacity:1;border-color:var(--accent);color:var(--accent);}
/* barre des coureurs */
.sb-bar{display:flex;align-items:center;gap:10px;}
.sb-runners{display:flex;flex-wrap:wrap;gap:6px;align-items:center;flex:1;}
.sb-adjpanel{width:100%;display:flex;flex-direction:column;gap:9px;background:var(--bg2);border:1px solid var(--line);border-radius:14px;padding:14px;}
.sb-adjpanel[hidden]{display:none;}
.sb-adjhint{color:var(--faint);font-size:.76rem;font-weight:600;text-align:center;margin-bottom:2px;}
.adjrow{display:flex;align-items:center;justify-content:space-between;gap:12px;}
.adjrow-full{justify-content:center;}
.adjlab{font-weight:800;font-size:.9rem;color:var(--dim);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.adjctl{display:flex;align-items:center;gap:10px;flex:0 0 auto;}
.adjv{font-weight:900;font-size:1.2rem;min-width:34px;text-align:center;font-variant-numeric:tabular-nums;}
@media(max-width:520px){.sb-sc{font-size:2.5rem;}.sb-main{padding:14px 8px;gap:6px;}.sb-chip{min-width:62px;padding:7px 10px;}}

/* ---------------- Mode plein écran (match) ---------------- */
.sb-fs{opacity:.7;transition:.15s;}
.sb-fs:hover{opacity:1;}
.sb-fs svg{display:block;width:18px;height:18px;}
body.fs{overflow:hidden;}
body.fs .topbar,body.fs .foot{display:none;}
/* IMPORTANT iOS : `inset:0` prend le GRAND viewport (sous la barre Safari), donc quand la barre
   est visible le bas est coupé et le contenu se superpose. On borne la hauteur au viewport VISIBLE
   avec 100dvh (dynamic viewport height) — ça se réduit tout seul quand la barre apparaît. */
.fs-wrap{position:fixed;top:0;left:0;right:0;height:100vh;height:100svh;z-index:150;
  background:radial-gradient(1200px 700px at 85% -15%,var(--glow),transparent 60%),var(--bg);
  display:grid;gap:10px;padding:10px;padding-top:max(10px,env(safe-area-inset-top));
  padding-bottom:max(10px,env(safe-area-inset-bottom));overflow:hidden;}
.fs-wrap>*{min-height:0;min-width:0;}
.fs-score{grid-area:score;}.fs-side{grid-area:side;}.fs-play{grid-area:play;}
/* PAYSAGE : gauche = score + jeu ; droite = batteur + lanceur + prochains (pleine hauteur) */
@media (orientation:landscape){
  /* Bandeau score en PLEINE LARGEUR en haut ; dessous : stats (gauche) | jeu (droite) */
  .fs-wrap{grid-template-columns:1fr 1.25fr;grid-template-rows:auto minmax(0,1fr);grid-template-areas:"score score" "side play";}
  .fs-side{display:flex;flex-direction:column;gap:10px;min-height:0;}
  .fs-next{flex:1 1 auto;min-height:0;}
}
/* PORTRAIT : score, puis batteur|lanceur côte à côte, puis jeu */
@media (orientation:portrait){
  .fs-wrap{grid-template-columns:1fr;grid-template-rows:auto auto 1fr;grid-template-areas:"score" "side" "play";}
  .fs-side{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
  .fs-next{display:none;}
  .fs-actions{justify-content:space-between;}
  .fs-actions .obtn{padding:16px 6px;}
  .fs-actions .act-btns{gap:8px;}
}
.fs-play{display:flex;flex-direction:column;gap:10px;min-height:0;}
/* bandeau plein écran : noms/ville/score AGRANDIS, occupe toute la largeur */
.fs-scorecard{padding:clamp(14px,3vh,30px) 26px;}
.fs-scorecard .sb-main{padding:8px 14px;gap:clamp(14px,3.5vw,44px);}
.fs-scorecard .sb-sc{font-size:clamp(4.5rem,13vh,8rem);}
.fs-scorecard .sb-nick{font-size:clamp(1.9rem,3.8vh,3rem);}
.fs-scorecard .sb-city{font-size:clamp(1.1rem,2.2vh,1.7rem);}
.fs-scorecard .sb-top{margin-bottom:-8px;}
.fs-batter,.fs-pit{padding:10px 12px;overflow:hidden;}
.fs-batter .sc-grid,.fs-pit .sc-grid{grid-template-columns:repeat(auto-fit,minmax(38px,1fr));gap:4px;padding-top:6px;}
.fs-batter .sc-grid .gc,.fs-pit .sc-grid .gc{padding:6px 3px;}
.fs-batter .sc-grid .gc .k,.fs-pit .sc-grid .gc .k{font-size:.5rem;}
.fs-batter .sc-grid .gc .v,.fs-pit .sc-grid .gc .v{font-size:.95rem;}
.fs-batter .sc-name,.fs-pit .sc-name{font-size:1rem;}
.fs-batter .sc-lab,.fs-pit .sc-lab{font-size:.6rem;}
/* Barre « Au bâton » en plein écran : compacte, pour laisser un maximum de place aux actions.
   Le libellé passe au-dessus, sur une seule ligne courte ; la bascule d'équipe reste tactile. */
.fs-bb{gap:8px;flex:0 0 auto;}
.fs-bb .seg{flex:1;}
.fs-bb .seg button{flex:1;padding:6px 10px;font-size:.8rem;}
@media (orientation:landscape){
  .fs-bb{gap:6px;}
  .fs-bb .bb-lab{font-size:.58rem;letter-spacing:.4px;}
  .fs-bb .seg button{padding:5px 8px;font-size:.76rem;}
}
/* Disposition des actions (flex row-wrap) : voir le bloc autoritaire « RÉPARTITION DES ACTIONS »
   plus bas — il possède flex-direction, colonnes et hauteurs. Ici, seulement le texte. */
.fs-actions{flex:1 1 auto;min-height:0;}
.fs-actions .act-head{margin-bottom:2px;}
.fs-actions .act-title{font-size:.92rem;}
.fs-actions .agl{margin-bottom:5px;}
/* prochains batteurs */
.fs-next{padding:12px;overflow-y:auto;}
.nx-lab{font-size:.66rem;text-transform:uppercase;letter-spacing:.5px;color:var(--faint);font-weight:900;margin-bottom:8px;}
.nx-row{display:flex;align-items:center;gap:9px;padding:7px 0;}
.nx-ord{width:22px;height:22px;border-radius:6px;background:var(--bg2);border:1px solid var(--line);display:inline-flex;align-items:center;justify-content:center;font-weight:900;font-size:.8rem;color:var(--dim);flex:0 0 auto;}
.nx-nm{font-weight:800;font-size:.92rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* modale d'avancement (toujours accessible) */
.adv-ov{position:fixed;inset:0;z-index:260;background:rgba(0,0,0,.62);display:flex;align-items:center;justify-content:center;padding:16px;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);}
.adv-modal{background:var(--panel);border:1px solid var(--line);border-radius:20px;width:min(560px,100%);max-height:92vh;overflow-y:auto;padding:18px;}
.adv-title{font-weight:900;font-size:1.05rem;margin-bottom:12px;}

/* ---------------- Score (ancien, conservé) ---------------- */
.score{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;text-align:center;gap:12px;}
.score .tn{color:var(--dim);font-weight:800;font-size:.9rem;}
.score .v{font-size:3rem;font-weight:900;font-variant-numeric:tabular-nums;line-height:1;}
.score .sep{color:var(--faint);font-size:1.6rem;}
.step{display:inline-flex;gap:7px;margin-top:8px;justify-content:center;}
.innings{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin:18px 0;}
.inn{width:38px;height:38px;border-radius:9px;border:1px solid var(--line);background:var(--bg2);color:var(--dim);font-weight:900;cursor:pointer;}
.inn.on{background:var(--accent);color:#fff;border-color:transparent;}
.counts{display:flex;justify-content:center;gap:24px;}
.counts .k{font-size:.66rem;text-transform:uppercase;color:var(--dim);letter-spacing:.5px;text-align:center;font-weight:800;}
.counts .v{font-weight:900;font-size:1.4rem;text-align:center;}
.outs{display:inline-flex;gap:6px;}
.outs .o{width:13px;height:13px;border-radius:50%;border:1px solid var(--line2);}
.outs .o.on{background:var(--red);border-color:var(--red);}
.actg{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:10px;}
.log{display:flex;flex-direction:column;}
.log-i{display:flex;gap:10px;align-items:center;padding:10px 0;border-bottom:1px solid var(--line);font-size:.9rem;font-weight:600;}
.log-i:last-child{border-bottom:none;}
.log-i .tag{font-size:.64rem;font-weight:900;padding:3px 9px;border-radius:6px;background:var(--panel2);color:var(--dim);white-space:nowrap;}
.log-i.run .tag{background:#14271e;color:#a9f5cf;} .log-i.out .tag{background:#33181a;color:#ffc9c9;}
.log-i .who{color:var(--dim);}

.pad{padding:18px;}

/* ---------------- Scoreboard / terrain ---------------- */
/* ══════════════════════════════════════════════════════════════════════════════
   ESPACEMENT ENTRE BOÎTES — règle générale
   `.card` n'a jamais porté de marge : l'air entre deux cartes venait UNIQUEMENT du titre
   de section (`.sec`) qu'on glissait entre elles. Partout où deux cartes se suivent sans
   titre — et il y en a beaucoup — elles se soudaient, liseré contre liseré. Un correctif
   ponctuel existait déjà ici même pour un seul cas (`.scorehead + .card`), ce qui disait
   assez que la règle manquait.
   Elle est posée une fois pour toutes : deux boîtes qui se suivent ne se touchent jamais.
   ══════════════════════════════════════════════════════════════════════════════ */
.card + .card, .card + .rows, .rows + .card, .rows + .rows,
.card + .side, .side + .card, .side + .side,
.card + .champtabs, .champtabs + .card,
.hero + .card, .card + .hero, .hero + .rows,
.card + .btn-row, .rows + .btn-row, .btn-row + .card, .btn-row + .rows,
.card + .scroll, .scroll + .card{ margin-top:14px; }

/* SAUF là où le conteneur écarte déjà lui-même ses enfants (flex/grid avec `gap`) :
   la marge s'y ajouterait à l'écart existant au lieu de le remplacer. */
.side-pair > .card, .side-pair > .side, .match-top > .card, .match-top > .side,
.wall-list > .card, .matchgrid > .card, .ld-grid > .card, .ph-grid > *{ margin-top:0; }

.scorehead + .card{margin-top:14px;}
.field{display:flex;align-items:center;justify-content:space-around;gap:18px;margin-top:18px;flex-wrap:wrap;}
.innctl{display:flex;align-items:center;gap:10px;}
.innctl .iconb{width:36px;height:36px;font-size:1rem;}
.innbox,.ctwo{text-align:center;}
.innbox .k,.ctwo .k{font-size:.66rem;text-transform:uppercase;color:var(--dim);letter-spacing:.5px;font-weight:800;}
.innbox .v{font-weight:900;font-size:1.7rem;}
.ctwo .v{font-weight:900;font-size:1.4rem;margin-top:2px;}
/* appel */
.appel-row{display:flex;align-items:center;cursor:pointer;gap:14px;}
.appel-row input{width:22px;height:22px;flex:0 0 auto;accent-color:var(--accent);cursor:pointer;}
.athome{margin-top:2px;font-weight:800;font-size:.82rem;background:var(--accent);color:#fff;padding:4px 13px;border-radius:999px;}
.base.home.bat{background:var(--accent);border-color:var(--accent);box-shadow:0 0 14px var(--accent);}
.fieldbox{display:flex;flex-direction:column;align-items:center;gap:10px;}
.diamond{position:relative;width:104px;height:104px;}
.base{position:absolute;width:26px;height:26px;background:var(--bg2);border:2px solid var(--line2);border-radius:5px;}
.base.on{background:var(--accent);border-color:var(--accent);box-shadow:0 0 12px var(--accent);}
.base.home{bottom:0;left:50%;transform:translateX(-50%) rotate(45deg);background:var(--panel2);}
.base.first{right:0;top:50%;transform:translateY(-50%) rotate(45deg);}
.base.second{top:0;left:50%;transform:translateX(-50%) rotate(45deg);}
.base.third{left:0;top:50%;transform:translateY(-50%) rotate(45deg);}
.runners{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;max-width:220px;}
.rchip{font-size:.72rem;font-weight:800;padding:4px 9px;border-radius:8px;background:var(--panel2);border:1px solid var(--line);}

/* ---------------- Carte batteur ---------------- */
.batter{border:2px solid var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 14%,transparent);}
.batter-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;}
.bt-lab{font-size:.7rem;text-transform:uppercase;letter-spacing:.6px;color:var(--accent);font-weight:900;}
.bt-name{font-size:1.35rem;font-weight:900;margin-top:3px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.bt-game{font-size:.82rem;color:var(--dim);font-weight:700;text-align:right;}
.subtag{font-size:.6rem;font-weight:900;letter-spacing:.4px;padding:2px 7px;border-radius:5px;background:#33260f;color:#ffbf7a;}
.btgrid{padding:14px 0 0;}
.btgrid .gc.hl .v{color:var(--blueA);}
.bt-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(66px,1fr));gap:8px;margin-top:14px;}
.bs{background:var(--bg2);border:1px solid var(--line);border-radius:10px;padding:9px 6px;text-align:center;}
.bs .k{display:block;font-size:.6rem;text-transform:uppercase;letter-spacing:.4px;color:var(--faint);font-weight:800;}
.bs .v{font-weight:900;font-size:1.14rem;font-variant-numeric:tabular-nums;}

/* ---------------- Cartes jumelles batteur / lanceur ---------------- */
.statduo{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
@media(max-width:640px){.statduo{grid-template-columns:1fr;}}
.statcard{border:2px solid var(--line);position:relative;}
/* Bascule MATCH/SAISON en haut à droite, ÉCARTÉE du coin arrondi de la carte (r-lg=30px) pour que
   les deux arrondis ne se télescopent pas — elle s'aligne dans la partie droite du bord. */
.statcard .scope-seg{position:absolute;top:16px;right:18px;margin-top:0;z-index:3;}
.statcard .sc-head{padding-right:104px;}
.statcard.s-bat{border-color:color-mix(in srgb,var(--blue) 70%,var(--line));box-shadow:0 0 0 3px color-mix(in srgb,var(--blue) 12%,transparent);}
.statcard.s-pit{border-color:color-mix(in srgb,var(--orange) 70%,var(--line));box-shadow:0 0 0 3px color-mix(in srgb,var(--orange) 12%,transparent);}
.sc-lab{font-size:.7rem;text-transform:uppercase;letter-spacing:.6px;font-weight:900;}
.s-bat .sc-lab{color:var(--blueA);} .s-pit .sc-lab{color:var(--orangeA);}
.sc-name{font-size:1.3rem;font-weight:900;margin-top:3px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.sc-name a:hover{color:var(--accent);}
/* Nom + bascule MATCH/SAISON collée à droite en haut de la carte. */
.sc-name-row{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;}
.sc-name-row .sc-name{flex:1 1 auto;min-width:0;}
/* Bascule MATCH/SAISON : compacte mais lisible, identique en mode normal et plein écran. */
.scope-seg{flex:0 0 auto;display:inline-flex;gap:2px;background:var(--glass2);border:1px solid var(--glass-brd);
  border-radius:var(--r-pill);padding:2px;margin-top:1px;}
.scope-seg button{border:none;background:transparent;color:var(--faint);font-weight:800;font-size:.64rem;
  letter-spacing:.02em;padding:3px 9px;border-radius:var(--r-pill);cursor:pointer;white-space:nowrap;line-height:1.25;}
.scope-seg button.on{background:var(--accent);color:#fff;}
/* Éditeur de coureurs (panneau « corriger ») */
.bases-edit{display:flex;flex-direction:column;gap:6px;flex:1 1 100%;margin-top:6px;}
.be-row{display:flex;align-items:center;gap:8px;}
.be-row .be-b{font-weight:900;font-size:.72rem;color:var(--accent);width:28px;flex:0 0 auto;}
.be-row .be-nm{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700;font-size:.9rem;}
.be-row .iconb{width:30px;height:30px;font-size:.8rem;}
.adjrow-full .adjlab{align-self:flex-start;}
.sb-adjpanel .iconb.half{width:auto;padding:0 12px;font-size:.8rem;font-weight:800;}
.sb-adjpanel .iconb.half.on{background:var(--accent);color:#fff;border-color:var(--accent);}
.sc-grid{padding:12px 0 0;grid-template-columns:repeat(auto-fit,minmax(64px,1fr));}
.sc-grid .gc{transition:.12s;}
.sc-grid .gc[data-stat]{cursor:pointer;}
.sc-grid .gc[data-stat]:hover{border-color:var(--accent);background:var(--panel2);}
.sc-grid .gc[data-stat]:active{transform:scale(.97);}
.s-bat .sc-grid .gc.hl .v{color:var(--blueA);}
.s-pit .sc-grid .gc .v{color:var(--orangeA);}

/* classement au clic sur une stat */
.statinfo-ov{position:fixed;inset:0;z-index:320;background:rgba(0,0,0,.62);display:flex;align-items:center;justify-content:center;padding:16px;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);}
.statinfo{background:var(--panel);border:1px solid var(--line);border-radius:20px;width:min(460px,100%);max-height:88vh;display:flex;flex-direction:column;padding:16px;}
.si-h{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;}
.si-title{font-weight:900;font-size:1.08rem;}
.si-desc{color:var(--dim);font-size:.86rem;font-weight:600;margin-top:4px;}
.si-sub{color:var(--faint);font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.4px;margin:12px 2px 4px;}
.si-list{overflow-y:auto;display:flex;flex-direction:column;}
.si-row{display:grid;grid-template-columns:30px 1fr auto 52px;align-items:center;gap:10px;padding:9px 6px;border-bottom:1px solid var(--line);}
.si-row:last-child{border-bottom:none;}
.si-row.hi{background:color-mix(in srgb,var(--accent) 16%,transparent);border-radius:9px;box-shadow:inset 3px 0 0 var(--accent);}
.si-rank{font-weight:900;color:var(--faint);text-align:center;font-variant-numeric:tabular-nums;}
.si-nm{font-weight:800;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.si-team{font-size:.72rem;color:var(--dim);font-weight:700;white-space:nowrap;}
.si-val{font-weight:900;text-align:right;font-variant-numeric:tabular-nums;}

/* ---------------- Carte du terrain (défenseur) ---------------- */
.fielder-btn{width:100%;font:inherit;font-weight:800;font-size:.9rem;cursor:pointer;padding:12px 14px;border-radius:10px;border:1px dashed var(--line2);background:var(--panel2);color:var(--dim);}
.fielder-btn b{color:var(--txt);}
.fielder-btn:hover{border-color:var(--accent);color:var(--txt);}
.fmap-ov{position:fixed;inset:0;z-index:300;background:rgba(0,0,0,.62);display:flex;align-items:center;justify-content:center;padding:16px;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);}
.fmap{background:var(--panel);border:1px solid var(--line);border-radius:20px;width:min(520px,100%);max-height:92vh;overflow:auto;padding:16px;}
.fmap-h{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px;font-weight:900;font-size:1rem;}
.fmap-field{position:relative;width:100%;aspect-ratio:4/3;overflow:hidden;border-radius:16px;border:1px solid rgba(0,0,0,.35);}
.fmap-svg{position:absolute;inset:0;width:100%;height:100%;display:block;}
.fpos{position:absolute;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:0;
  background:rgba(10,15,24,.85);border:1.5px solid rgba(255,255,255,.28);border-radius:9px;padding:3px 6px;cursor:pointer;color:#fff;min-width:38px;
  transition:.12s;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);box-shadow:0 3px 10px rgba(0,0,0,.4);}
.fpos:hover,.fpos:active{border-color:var(--accent);background:var(--accent);transform:translate(-50%,-50%) scale(1.08);z-index:5;}
.fpos.empty{opacity:.5;}
.fpos-pos{font-size:.5rem;font-weight:900;color:#cfe0ff;letter-spacing:.5px;}
.fpos:hover .fpos-pos{color:#fff;}
.fpos-num{font-weight:900;font-size:.85rem;line-height:1.05;}
.fpos-nm{font-size:.5rem;color:rgba(255,255,255,.75);max-width:56px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.1;}

/* Fiche de correction d'un play (tap sur le journal) */
.ep-modal{width:min(560px,100%);}
.ep-grp{margin-top:12px;}
.ep-grp .agl{font-size:.66rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);margin-bottom:7px;}
.ep-btns{display:grid;grid-template-columns:repeat(auto-fit,minmax(84px,1fr));gap:7px;}
.ep-btns .obtn.on{outline:2px solid var(--accent);outline-offset:1px;}
.ep-modal .ui-actions{margin-top:16px;}

/* ---------------- Actions ---------------- */
.act-title{font-weight:800;font-size:1rem;margin-bottom:12px;}
.act-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px;}
.act-head .act-title{margin-bottom:0;}
.countgrp .agl .cnt-v{color:var(--txt);font-size:.95rem;}
.act-grp+.act-grp{margin-top:12px;}
.agl{font-size:.66rem;text-transform:uppercase;letter-spacing:.6px;color:var(--dim);font-weight:800;margin-bottom:7px;}
.act-btns{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px;}
.obtn{font:inherit;font-weight:800;font-size:.92rem;cursor:pointer;padding:13px 10px;border-radius:11px;border:1px solid var(--line);background:var(--panel2);color:var(--txt);transition:.12s;}
.obtn:hover{background:var(--btnHover);}
.obtn.safe,.obtn.out,.obtn.run{border-color:var(--line);}
.obtn.safe:hover,.obtn.out:hover,.obtn.run:hover{background:var(--btnHover);}
/* Mode NORMAL (hors plein écran) : mêmes grilles par groupe + abréviation en gros/libellé en petit
   + cases de hauteur uniforme que le plein écran (harmonisation). En plein écran, .fs-actions gère
   tout en JS ; ici on garde un flux simple (la vue normale peut défiler). */
#actions:not(.fs-actions) .g-count .act-btns{grid-template-columns:repeat(3,minmax(0,1fr));}
#actions:not(.fs-actions) .g-onbase .act-btns{grid-template-columns:repeat(5,minmax(0,1fr));}
#actions:not(.fs-actions) .g-outs .act-btns{grid-template-columns:repeat(4,minmax(0,1fr));}
#actions:not(.fs-actions) .g-run .act-btns{grid-template-columns:repeat(5,minmax(0,1fr));}
#actions:not(.fs-actions) .obtn{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:2px;min-height:58px;padding:8px 6px;text-align:center;line-height:1.15;overflow:hidden;}
#actions:not(.fs-actions) .obtn .ob-s{font-size:1rem;}
.act-foot{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px;}

/* éditeur d'avancement */
.adv{display:flex;flex-direction:column;gap:10px;}
.advr{background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:11px 13px;}
.advn{font-weight:800;font-size:.92rem;margin-bottom:8px;}
.advb{display:flex;flex-wrap:wrap;gap:6px;}
.db{font:inherit;font-weight:800;font-size:.82rem;cursor:pointer;padding:8px 13px;border-radius:9px;border:1px solid var(--line);background:var(--panel);color:var(--dim);}
.db:hover{color:var(--txt);}
.db.on{background:var(--accent);color:#fff;border-color:transparent;}

/* journal */
.log-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px;}
.log-head .t{font-size:1.05rem;font-weight:900;}
.log-i .mn{font-size:.66rem;font-weight:800;color:var(--faint);min-width:26px;}
.log-i.run .tag{background:#14271e;color:#a9f5cf;} .log-i.out .tag{background:#33181a;color:#ffc9c9;}

/* ---------------- Effectif : grip + sub ---------------- */
/* liste des matchs */
.matchgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;}
.matchcard{padding:16px;display:flex;flex-direction:column;}
.mc-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;}
.mc-opp{font-weight:800;font-size:1rem;line-height:1.2;}
.mc-score{font-weight:900;font-size:1.7rem;margin:8px 0 2px;}
.mc-meta{color:var(--dim);font-size:.8rem;font-weight:700;}
.iconb.del{background:transparent;border-color:transparent;font-size:.95rem;}
.iconb.del:hover{background:rgba(239,90,90,.16);}

.page-head{margin:8px 0 18px;display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;}
/* La barre de sélection (compétition) ne doit pas coller au bandeau collant du haut. */
.champtabs{margin-top:4px;}
.page-title{font-size:1.6rem;font-weight:900;letter-spacing:-.4px;margin-right:auto;}
.page-head .compsel{max-width:300px;border-radius:999px;padding:11px 20px;background:linear-gradient(120deg,var(--panel2),var(--panel));border:1px solid var(--line2);font-weight:900;box-shadow:0 4px 14px rgba(0,0,0,.22);}
.page-head .compsel:hover{border-color:var(--accent);}
.page-head .page-sub{width:100%;margin-top:0;}
.card-title{font-size:1.05rem;font-weight:800;}
.swatches{display:flex;flex-wrap:wrap;gap:10px;}
.sw{width:42px;height:42px;border-radius:11px;border:2px solid transparent;cursor:pointer;transition:.12s;}
.sw:hover{transform:scale(1.06);}
.sw.on{border-color:var(--txt);box-shadow:0 0 0 3px var(--bg);}

.hlab{font-weight:800;font-size:.78rem;letter-spacing:.5px;text-transform:uppercase;color:var(--dim);}
.possel{font:inherit;font-weight:800;font-size:.8rem;background:var(--bg2);border:1px solid var(--line);border-radius:9px;padding:6px 7px;color:var(--txt);cursor:pointer;}
.grip{cursor:grab;color:var(--faint);font-size:1.1rem;touch-action:none;user-select:none;padding:0 2px;}
.lurow{grid-template-columns:auto 16px 1fr auto auto auto auto;gap:6px;will-change:transform;}
.lurow .iconb{width:38px;height:38px;}
.jersey{width:44px;text-align:center;font:inherit;font-weight:800;font-size:.92rem;background:var(--bg2);border:1px solid var(--line);border-radius:9px;padding:9px 4px;color:var(--txt);}
.jersey:focus{outline:none;border-color:var(--accent);}
.jtag{font-weight:900;color:var(--accent);}
.lurow.dragging{position:relative;background:var(--panel2);border-radius:12px;
  box-shadow:0 14px 32px rgba(0,0,0,.5),inset 3px 0 0 var(--accent);
  transform:scale(1.015);cursor:grabbing;}
.lurow.dragging .grip{cursor:grabbing;color:var(--accent);}
.lu-full{font-size:.66rem;font-weight:900;letter-spacing:.4px;text-transform:uppercase;color:#7fe0aa;background:rgba(34,181,107,.16);padding:3px 8px;border-radius:6px;vertical-align:middle;}
.lu-dh{font-size:.62rem;font-weight:900;letter-spacing:.4px;color:var(--orangeA);background:rgba(255,138,30,.14);border:1px solid rgba(255,138,30,.35);padding:2px 7px;border-radius:6px;vertical-align:middle;}
.lurow.nobat .n{color:var(--orangeA);font-size:.8rem;}
.lurow.nobat{opacity:.82;}
[data-add][disabled]{opacity:.4;cursor:not-allowed;pointer-events:none;}
.subrows{max-height:320px;overflow-y:auto;}
.gear{font-size:1.15rem;}

/* ---------------- Toast ---------------- */
.toast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(16px);
  background:var(--panel2);border:1px solid var(--line2);color:var(--txt);padding:11px 18px;border-radius:999px;
  font-weight:800;font-size:.88rem;opacity:0;pointer-events:none;transition:.2s;z-index:100;}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);}

@media (prefers-reduced-motion:reduce){*{transition:none!important;}}

/* ============ iPad — cibles tactiles agrandies ============ */
.btn{padding:14px 20px;}
.btn.sm{padding:11px 16px;font-size:.9rem;}
.iconb{width:42px;height:42px;font-size:1rem;border-radius:10px;}
.innctl .iconb,.step .iconb{width:46px;height:46px;font-size:1.15rem;}
.inn{width:44px;height:44px;font-size:1rem;}
.nav a{padding:12px 17px;font-size:.98rem;}
.toggle button{padding:13px 18px;font-size:.95rem;}
.seg button{padding:14px 22px;font-size:.98rem;}
.obtn{padding:16px 12px;font-size:.98rem;min-height:54px;}
.db{padding:13px 17px;font-size:.92rem;}
.possel{padding:11px 11px;font-size:.92rem;}
.sel{padding:12px 15px;font-size:.95rem;}
select,input.search{padding:13px 14px;font-size:1rem;}
.appel-row{padding:15px 14px;}
.appel-row input{width:28px;height:28px;}
.row{padding:14px;}
.sw{width:48px;height:48px;}
.tabs a,.mc-top .del{min-height:40px;}

/* ============ Match : barre "au bâton", récap ============ */
#body>*+*{margin-top:14px;}
.battingbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;}
.bb-lab{font-weight:800;font-size:.78rem;letter-spacing:.5px;text-transform:uppercase;color:var(--dim);}
.linescore td,.linescore th{text-align:center;}
.linescore td.l,.linescore th.l{text-align:left;}
.linescore .nm{font-weight:800;white-space:nowrap;}
td.nm{font-weight:800;}

/* ============ Récap : sections de constats ============ */
.rc-sec + .rc-sec{margin-top:16px;}
.rc-lbl{font-size:.68rem;text-transform:uppercase;letter-spacing:.6px;color:var(--faint);font-weight:900;margin-bottom:9px;display:flex;align-items:center;gap:8px;}
.rc-lbl .dot{width:9px;height:9px;border-radius:3px;background:var(--accent);}
.rc-lbl.bat .dot{background:var(--blue);} .rc-lbl.pit .dot{background:var(--orange);} .rc-lbl.fld .dot{background:var(--fld);}
.rc-note{color:var(--dim);font-size:.86rem;font-weight:700;margin-top:10px;padding-left:2px;}
.rc-note b{color:var(--txt);}
.rc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(72px,1fr));gap:8px;}
.rc-tile{background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:10px 8px;text-align:center;}
.rc-tile .k{font-size:.6rem;text-transform:uppercase;letter-spacing:.5px;color:var(--faint);font-weight:800;}
.rc-tile .v{font-weight:900;font-size:1.3rem;margin-top:3px;font-variant-numeric:tabular-nums;}
.rc-teamhead{display:flex;align-items:center;gap:12px;margin-bottom:14px;}
.rc-teamhead .rc-name{font-size:1.15rem;font-weight:900;letter-spacing:-.2px;}
.rc-teamhead .rc-final{margin-left:auto;font-weight:900;font-size:1.5rem;font-variant-numeric:tabular-nums;}
/* tables arrondies (line score / box score / pitchers) */
.rc-tblwrap{border:1px solid var(--line);border-radius:14px;overflow:hidden;}
.rc-tblwrap .scroll{border-radius:14px;}
.rc-tblwrap table{border-collapse:collapse;}
.rc-tblwrap tbody tr:last-child td{border-bottom:none;}
.rc-tblwrap thead th{background:var(--bg2);}

/* toggle erreur dans l'éditeur d'avancement */
.err-toggle{font:inherit;font-weight:800;font-size:.86rem;cursor:pointer;padding:11px 15px;border-radius:10px;border:1px solid var(--line);background:var(--panel2);color:var(--dim);display:inline-flex;align-items:center;gap:8px;}
.err-toggle .box{width:16px;height:16px;border-radius:4px;border:1.5px solid var(--line2);}
.err-toggle.on{background:#3a1818;border-color:#5a2626;color:#ffc9c9;}
.err-toggle.on .box{background:#ef5a5a;border-color:#ef5a5a;}

/* badge domicile / extérieur + champ de création */
.badge.ha{background:var(--panel2);color:var(--dim);border:1px solid var(--line);}
.nm-field{margin-top:6px;margin-bottom:14px;}
.nm-field:last-of-type{margin-bottom:0;}
.nm-field > label{display:block;font-weight:800;font-size:.82rem;color:var(--dim);margin-bottom:8px;}

/* ============ Tactile : ne pas garder l'état "survol" collé après un appui ============ */
@media (hover: none){
  .btn:hover{background:var(--panel2);}
  .btn.primary:hover{background:linear-gradient(135deg,var(--accentA),var(--accent));}
  .obtn:hover{background:var(--panel2);}
  .obtn.safe:hover{background:var(--panel2);}
  .obtn.out:hover{background:var(--panel2);}
  .obtn.run:hover{background:var(--panel2);}
  .iconb:hover{background:var(--bg2);}
  .iconb.del:hover{background:transparent;}
  .db:hover{color:var(--dim);}
  /* :not(.on) — ne pas neutraliser l'état ACTIF quand iOS garde le :hover collé après un appui,
     sinon l'onglet/bouton ouvert perd sa surbrillance sur iPad (invisible sur Mac). */
  .seg button:not(.on):hover{color:var(--dim);}
  .toggle button:not(.on):hover{color:var(--dim);}
  .nav a:not(.on):hover{color:var(--dim);background:transparent;}
  .sb-gear:hover{opacity:.7;}
  .sw:hover{transform:none;}
  .st-row:hover{background:transparent;}
  .st-row:hover .st-arrow{color:var(--faint);}
}

/* ============ Modales génériques (uiConfirm / uiPrompt) ============ */
.ui-ov{position:fixed;inset:0;z-index:280;background:rgba(0,0,0,.62);display:flex;align-items:center;justify-content:center;padding:16px;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);}
.ui-modal{background:var(--panel);border:1px solid var(--line);border-radius:20px;width:min(440px,100%);padding:20px;box-shadow:0 24px 60px rgba(0,0,0,.5);}
/* Astuce « ajouter à l'écran d'accueil » */
.a2hs-modal{width:min(480px,100%);}
.a2hs-steps{margin:12px 0 4px;padding-left:20px;line-height:1.7;font-size:.95rem;}
.a2hs-steps li{margin-bottom:8px;}
.a2hs-steps svg{display:inline-block;vertical-align:-4px;margin:0 2px;color:var(--accent);}
.ui-title{font-size:1.12rem;font-weight:800;color:var(--txt);}
.ui-msg{margin-top:10px;color:var(--dim);line-height:1.45;}
.ui-input{margin-top:16px;width:100%;background:var(--bg2);border:1px solid var(--line2);border-radius:12px;color:var(--txt);font:inherit;font-size:1.05rem;padding:13px 14px;}
.ui-input:focus{outline:none;border-color:var(--accent);}
.ui-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:18px;}
.btn.danger{background:linear-gradient(135deg,#ff7a7a,var(--red));border-color:transparent;color:#fff;}

/* ============ Fin de match : bandeau scoreboard ============ */
.sb.isfinal{position:relative;}
.sb-final{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px;padding:10px 12px;border-radius:12px;
  background:linear-gradient(135deg,rgba(30,156,95,.16),rgba(47,123,255,.12));border:1px solid var(--line2);}
.sbf-tag{font-size:.72rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--green);}
.sbf-txt{font-weight:800;color:var(--txt);}
.sbf-reason{font-size:.82rem;color:var(--dim);}
.sbf-resume{margin-left:auto;}
.gameover-msg{display:flex;flex-direction:column;align-items:center;gap:12px;padding:22px 10px;text-align:center;}
.gameover-msg .go-tag{font-size:1.05rem;font-weight:800;color:var(--green);letter-spacing:.04em;}

/* ============ Fin de match : carte récap ============ */
.rc-finalcard{border-color:var(--line2);background:linear-gradient(135deg,rgba(47,123,255,.10),rgba(20,28,43,.4));}
.rc-finalcard.ours{background:linear-gradient(135deg,rgba(30,156,95,.14),rgba(20,28,43,.4));}
.rc-fc-tag{font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);}
.rc-fc-main{display:flex;align-items:center;gap:14px;margin-top:8px;}
.rc-fc-txt{display:flex;flex-direction:column;}
.rc-fc-win{font-size:1.15rem;font-weight:800;color:var(--txt);}
.rc-fc-score{font-size:1.5rem;font-weight:900;}
.rc-fc-reason{margin-top:8px;font-size:.85rem;color:var(--dim);}

/* ============ Récap : barre export + décisions lanceur ============ */
.rc-toolbar{display:flex;gap:10px;justify-content:flex-end;margin-bottom:14px;}
.rc-dech{white-space:nowrap;}
.rc-dec{white-space:nowrap;}
.decb{font:inherit;font-weight:800;font-size:.72rem;cursor:pointer;border:1px solid var(--line2);background:var(--bg2);color:var(--dim);
  border-radius:8px;padding:4px 7px;margin:0 2px;min-width:30px;}
.decb:hover{background:var(--btnHover);}
.decb.on.w{background:var(--green);border-color:transparent;color:#fff;}
.decb.on.l{background:var(--red);border-color:transparent;color:#fff;}
.decb.on.sv{background:var(--blue);border-color:transparent;color:#fff;}

/* ============ Impression : ne garder que le récap (export PDF iPad) ============ */
@media print{
  body.print-recap .topbar,body.print-recap .foot,body.print-recap .hero,
  body.print-recap #tabs,body.print-recap .no-print{display:none !important;}
  body.print-recap{background:#fff;}
  body.print-recap .card{break-inside:avoid;border-color:#ccc;}
}

/* Indicateur haut/bas de manche (triangle) dans la puce Inning */
.inn-half{font-size:.62em;vertical-align:.18em;margin-right:.14em;color:var(--accentA);font-weight:900;}

/* ============ Réglages : règles du match ============ */
.rule-row{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:9px 0;border-top:1px solid var(--line);}
.rule-row:first-of-type{border-top:none;}
.rule-row label{color:var(--txt);font-weight:600;font-size:.95rem;}
.rule-row .sel,.rule-row select{min-width:88px;}
.toggle-sw{position:relative;width:50px;height:29px;border-radius:16px;border:1px solid var(--line2);background:var(--bg2);cursor:pointer;flex:0 0 auto;transition:background .18s;padding:0;}
.toggle-sw .tsw-dot{position:absolute;top:2px;left:2px;width:23px;height:23px;border-radius:50%;background:var(--faint);transition:transform .18s,background .18s;}
.toggle-sw.on{background:var(--accent);border-color:transparent;}
.toggle-sw.on .tsw-dot{transform:translateX(21px);background:#fff;}
.rule-mercy{display:flex;flex-direction:column;gap:8px;padding:6px 0 4px;}
.rule-mercy.off{opacity:.45;}
.mercy-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.mr-lbl{font-size:.82rem;color:var(--dim);font-weight:700;}
.mr-in{width:64px;background:var(--bg2);border:1px solid var(--line2);border-radius:9px;color:var(--txt);font:inherit;font-weight:800;padding:8px 10px;text-align:center;}
.mr-in:focus{outline:none;border-color:var(--accent);}

/* ============ Championnats : sous-onglets ============ */
/* Sous-onglets : même style segmenté que les autres menus (.seg) */
.champtabs{display:inline-flex;gap:4px;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
  background:var(--glass2);border:1px solid var(--glass-brd);border-radius:var(--r-md);padding:4px;margin-bottom:16px;
  box-shadow:inset 0 1px 0 var(--hi);vertical-align:top;}
.champtabs::-webkit-scrollbar{display:none;}
.champtabs button{flex:0 0 auto;font:inherit;font-weight:800;font-size:.92rem;color:var(--dim);background:transparent;
  border:none;border-radius:var(--r-xs);padding:11px 18px;cursor:pointer;transition:.15s;white-space:nowrap;}
.champtabs button:hover{color:var(--txt);}
.champtabs button.on{color:#fff;background:var(--accent);box-shadow:0 4px 14px color-mix(in srgb,var(--accent) 30%,transparent);}
.st-po{font-size:.62rem;font-weight:800;letter-spacing:.05em;color:var(--green);border:1px solid var(--green);border-radius:6px;padding:1px 5px;margin-left:6px;vertical-align:.08em;}

/* À venir */
.res-row.up{opacity:.96;}
.res-vs{color:var(--faint);font-weight:800;font-size:.9rem;}

/* Fiche joueur : barre de sous-onglets (même capsule que les championnats) et volets. */
.pf-tabs{margin:14px 0 16px;}
.pf-pane[hidden]{display:none;}

/* ============ Leaders ============ */
.ld-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin-bottom:6px;}
.ld-card{padding:14px 14px 8px;}
.ld-h{font-weight:900;font-size:1rem;letter-spacing:.02em;margin-bottom:8px;color:var(--txt);}
.ld-row{display:flex;align-items:center;gap:10px;padding:7px 4px;border-top:1px solid var(--line);text-decoration:none;color:var(--txt);}
.ld-row:first-of-type{border-top:none;}
.ld-row:hover{background:var(--rowHover);border-radius:8px;}
.ld-rank{width:18px;text-align:center;font-weight:900;color:var(--faint);font-size:.9rem;flex:0 0 auto;}
.ld-nm{flex:1;font-weight:700;font-size:.92rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ld-team{color:var(--dim);font-weight:800;font-size:.72rem;flex:0 0 auto;}
.ld-val{font-weight:900;font-size:1rem;flex:0 0 auto;min-width:48px;text-align:right;}
.ld-empty{color:var(--faint);padding:6px 4px;}

/* ============ Play-offs (bracket) ============ */
/* Phase finale saisie à la main (élimination à N / super round) */
.po-manual{display:flex;flex-direction:column;gap:16px;}
.po-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;}
.po-block .po-bh{font-weight:900;font-size:1rem;margin-bottom:10px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;}
.po-block .po-sub{font-weight:700;font-size:.78rem;color:var(--dim);}
.po-qual{display:flex;flex-direction:column;gap:6px;}
.po-qrow{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:10px;text-decoration:none;color:var(--txt);
  background:var(--panel);border:1px solid var(--line);}
.po-qrow.mine{border-color:color-mix(in srgb,var(--accent) 55%,var(--line));background:color-mix(in srgb,var(--accent) 8%,var(--panel));}
.po-qrow.tbd{opacity:.7;}
.po-qseed{font-weight:900;font-size:.8rem;width:22px;flex:0 0 auto;color:var(--accent);text-align:center;}
.po-qnm{font-weight:800;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bracket{display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:center;}
.bk-col{display:flex;flex-direction:column;gap:14px;justify-content:center;}
.bk-match{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:12px;box-shadow:0 4px 16px rgba(0,0,0,.18);}
.bk-lbl{font-size:.68rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);margin-bottom:8px;}
.bk-team{display:flex;align-items:center;gap:9px;padding:8px 6px;border-radius:10px;text-decoration:none;color:var(--txt);}
.bk-team+.bk-team{border-top:1px solid var(--line);}
.bk-team:hover{background:var(--rowHover);}
.bk-team.mine{background:linear-gradient(90deg,rgba(30,156,95,.14),transparent);}
.bk-team.tbd{color:var(--faint);}
.bk-seed{width:20px;height:20px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;border-radius:6px;background:var(--bg2);border:1px solid var(--line2);font-size:.72rem;font-weight:900;color:var(--dim);}
.bk-nm{flex:1;font-weight:700;font-size:.9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bk-sc{font-weight:900;color:var(--faint);}
.bk-connect{height:1px;}
.bk-final .bk-match{border-color:var(--accent);box-shadow:0 6px 22px rgba(47,123,255,.22);}
.bk-champ{margin-top:6px;display:flex;flex-direction:column;align-items:center;gap:4px;padding:14px;border:1px dashed var(--line2);border-radius:14px;}
.bk-champ-lbl{font-weight:800;color:var(--txt);}
.bk-champ-tbd{font-size:1.6rem;font-weight:900;color:var(--faint);}
/* Demi-finales pas encore au calendrier : bloc discret (pointillés, pas de fond plein) pour qu'il
   se lise comme « information manquante » et non comme une carte de match vide. */
.bk-pending{border:1px dashed var(--line2);border-radius:16px;padding:14px;background:transparent;}
.bk-pending .bk-lbl{margin-bottom:6px;}
/* Sans demi-finales, la colonne de gauche n'a plus à peser autant que la finale. */
.bracket.no-semis{grid-template-columns:.72fr 1fr;}
/* Score d'une série (victoires) + vainqueur qualifié : l'équipe qui passe est mise en avant,
   les autres restent lisibles (on ne grise pas : la série peut encore se jouer). */
.bk-sc{margin-left:auto;flex:0 0 auto;min-width:22px;text-align:center;font-weight:900;color:var(--faint);}
.bk-sc.w{color:var(--accent);}
.bk-team.won .bk-nm{font-weight:800;}
.bk-team.won{background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 12%,transparent),transparent);}
.bk-match.done{border-color:color-mix(in srgb,var(--accent) 45%,var(--line));}
.bk-match .st-rank{width:18px;flex:0 0 auto;text-align:center;font-weight:900;color:var(--faint);font-size:.78rem;}
.bk-champ.has{border-style:solid;border-color:color-mix(in srgb,var(--accent) 45%,var(--line2));}
.bk-champ-nm{font-weight:900;color:var(--accent);text-decoration:none;text-align:center;}
/* Le bracket peut avoir 2 OU 3 colonnes (nombre de tours publiés) : sur mobile, tout s'empile. */
/* Une colonne sous 820 px. `1fr` ne descend PAS sous la largeur minimale du contenu (les
   éléments de grille valent `min-width:auto`) : la piste se calait à 379 px dans un conteneur
   de 343, et la mention « Au meilleur des N » sortait de l'écran, coupée. `minmax(0,1fr)`
   autorise la piste à se réduire ; l'intitulé passe alors à la ligne au lieu de déborder. */
@media(max-width:820px){
  .bracket{grid-template-columns:minmax(0,1fr) !important;}
  .bk-match{min-width:0;}
  .bk-lbl{flex-wrap:wrap;row-gap:3px;}
}

/* ============ Menus déroulants arrondis (partout, comme le sélecteur de division) ============ */
select.sel,.card select:not(.possel),.rule-row select,#nmOpp,#nmInn,#setHome,#setInn{
  -webkit-appearance:none;appearance:none;
  border:1px solid var(--line2);border-radius:14px;
  padding:11px 40px 11px 15px;font-weight:800;color:var(--txt);cursor:pointer;
  background-image:linear-gradient(120deg,var(--panel2),var(--panel)),url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%238ea0bd' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:center,right 15px center;
  box-shadow:0 3px 12px rgba(0,0,0,.16);transition:border-color .15s;
}
select.sel:hover,.card select:not(.possel):hover,#nmOpp:hover,#nmInn:hover,#setHome:hover,#setInn:hover{border-color:var(--accent);}
.page-head .compsel{-webkit-appearance:none;appearance:none;padding-right:42px;
  background-image:linear-gradient(120deg,var(--panel2),var(--panel)),url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%238ea0bd' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:center,right 18px center;}
.hero-sel{-webkit-appearance:none;appearance:none;background:transparent;border:none;box-shadow:none;padding:0 22px 0 0;border-radius:6px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%238ea0bd' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:right center;background-repeat:no-repeat;}
select.possel{-webkit-appearance:none;appearance:none;border-radius:10px;padding-right:26px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='7' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%238ea0bd' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;}

/* ============ État "ouvert/actif" des boutons du scoreboard (visible sur iPad) ============ */
.sb-ctrls .iconb.on,
.sb-gear.on,
.sb-gear[aria-expanded="true"],
.sb-fs.on{
  background:var(--accent);border-color:transparent;color:#fff;opacity:1;
  box-shadow:0 4px 14px rgba(47,123,255,.32);
}
.sb-ctrls .iconb.on svg{stroke:#fff;}
/* Sur tactile, l'état ouvert prime sur le reset de survol */
@media (hover: none){
  .sb-gear.on,.sb-gear[aria-expanded="true"]{opacity:1;background:var(--accent);color:#fff;}
}

/* ============ Réglages : blocs groupés ============ */
.set-block{padding:14px 0;border-top:1px solid var(--line);}
.set-block:first-child{border-top:none;padding-top:2px;}
.set-block:last-child{padding-bottom:2px;}
.set-lbl{font-weight:700;color:var(--txt);font-size:.95rem;margin-bottom:10px;}

/* Lignes de tableau de stats cliquables (ouvrent la fiche joueur) */
tr.prow{cursor:pointer;}
tr.prow .pl a{color:inherit;text-decoration:none;}

/* ============ Fiche joueur : stats groupées par catégorie ============ */
.statgrp{margin-top:14px;}
.statgrp:first-of-type{margin-top:4px;}
.statgrp-lbl{font-size:.68rem;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--faint);margin-bottom:8px;}

/* Fiche joueur : tableau simple (joueur isolé) */
.pstat{width:100%;border-collapse:collapse;}
.pstat th{font-size:.68rem;font-weight:800;letter-spacing:.04em;color:var(--faint);text-transform:uppercase;padding:8px 12px;text-align:center;white-space:nowrap;border-bottom:1px solid var(--line);}
.pstat td{font-weight:800;font-size:1rem;padding:12px;text-align:center;white-space:nowrap;}
.pstat th.hl,.pstat td.hl{color:var(--accentA);}
.pstat th:first-child,.pstat td:first-child{padding-left:16px;}

/* ======================================================================
   DESIGN SYSTEM UNIFORME — rayons cohérents + surfaces "liquid glass"
   (bloc final : uniformise toutes les "cases" du site)
   ====================================================================== */
/* Grands conteneurs en verre (modales, pop-overs) */
.ui-modal,.adv-modal,.fmap,.statinfo{
  border-radius:var(--r-lg);
  background:var(--glass); border:1px solid var(--glass-brd2);
  -webkit-backdrop-filter:var(--blur); backdrop-filter:var(--blur);
  box-shadow:var(--shadow), inset 0 1px 0 var(--hi);
}
.ui-ov,.adv-ov,.fmap-ov,.statinfo-ov{background:rgba(8,11,18,.5);-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);}

/* Tuiles & cellules : verre secondaire, même rayon partout */
.gc,.sb-chip,.rc-tile{
  border-radius:var(--r-md);
  background:var(--glass2); border:1px solid var(--glass-brd);
  box-shadow:inset 0 1px 0 var(--hi);
}
.sb-team{border-radius:var(--r-md);}

/* Boutons */
.btn{border-radius:var(--r-md);background:var(--glass2);border:1px solid var(--glass-brd);box-shadow:inset 0 1px 0 var(--hi);}
.btn.sm{border-radius:var(--r-sm);}
.btn.primary{background:linear-gradient(135deg,var(--accentA),var(--accent));border-color:transparent;
  box-shadow:0 6px 18px color-mix(in srgb,var(--accent) 34%,transparent), inset 0 1px 0 rgba(255,255,255,.28);}
.obtn{border-radius:var(--r-md);}
.iconb{border-radius:var(--r-sm);background:var(--glass2);border:1px solid var(--glass-brd);}
.decb,.db{border-radius:var(--r-xs);}

/* Saisies & sélecteurs */
input.search,.ui-input,.mr-in,.jersey{border-radius:var(--r-md);background:var(--glass2);border:1px solid var(--glass-brd);}
select.sel,.card select:not(.possel),#nmOpp,#nmInn,#setHome,#setInn{border-radius:var(--r-md);}
select.possel{border-radius:var(--r-sm);}

/* Segments & bascules */
.seg,.toggle{border-radius:var(--r-md);background:var(--glass2);border:1px solid var(--glass-brd);}
.seg button,.toggle button{border-radius:var(--r-xs);}

/* Pastilles / pills */
.nav a,.rchip,.jtag{border-radius:var(--r-pill);}
.badge{border-radius:var(--r-sm);}

/* Rangées & mini-cartes : arrondi cohérent */
.res-row,.bk-match{border-radius:var(--r-md);}
/* La carte de match dans « Mes matchs » est une GRANDE carte : même arrondi que les autres. */
.matchcard{border-radius:var(--r-lg);}

/* Perf : dans les grilles denses de cartes, verre translucide SANS flou individuel */
.ld-grid .card,.bk-match{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--glass2);}

/* ======================================================================
   PLEIN ÉCRAN PAYSAGE — optimisé iPad (tout visible, AUCUN défilement)
   Ce bloc est en fin de fichier : il prime sur les règles .fs-* plus haut.
   ====================================================================== */
/* Tuiles de stats batteur/lanceur : textes CENTRÉS (plus alignés à gauche) */
.sc-grid .gc{text-align:center;}
.sc-grid .gc .k,.sc-grid .gc .v{text-align:center;}

@media (orientation:landscape){
  /* Bandeau score AGRANDI (mais borné pour que tout tienne sans défiler) */
  .fs-scorecard{padding:clamp(10px,2.4vh,22px) 24px;}
  .fs-scorecard .sb-main{padding:6px 12px;gap:clamp(12px,3vw,40px);}
  .fs-scorecard .sb-sc{font-size:clamp(4rem,12.5vh,7rem);}
  .fs-scorecard .sb-nick{font-size:clamp(1.7rem,4.8vh,2.8rem);}
  .fs-scorecard .sb-city{font-size:clamp(1.1rem,2.9vh,1.6rem);}
  /* Colonne jeu (droite) plus large que les stats (gauche) */
  .fs-wrap{grid-template-columns:0.82fr 1.18fr;}
  .fs-side{gap:8px;min-height:0;}
  .fs-batter,.fs-pit{flex:0 0 auto;}
  /* Prochains batteurs : le libellé en haut, les 3 lignes REMPLISSENT la case (jamais rognées) */
  .fs-next{flex:1 1 0;min-height:0;overflow:hidden;display:flex;flex-direction:column;}
  .fs-next .nx-lab{flex:0 0 auto;}
  .fs-next .nx-row{flex:1 1 0;min-height:0;padding:0;}
  /* Le panneau d'actions est géré par le bloc autoritaire « RÉPARTITION DES ACTIONS » (flex
     row-wrap + hauteurs intrinsèques). On NE remet PAS ici de grid-auto-rows:1fr / height:100%
     imbriqués : Safari iOS les résout à zéro et les boutons se superposaient. */
}
/* PORTRAIT : bandeau un peu plus petit */
@media (orientation:portrait){
  .fs-scorecard .sb-sc{font-size:clamp(3.4rem,9vh,5.6rem);}
  .fs-scorecard .sb-nick{font-size:clamp(1.5rem,3.3vh,2.3rem);}
  .fs-scorecard .sb-city{font-size:clamp(1rem,2vh,1.3rem);}
}

/* Journal des plays : long-press pour corriger */
.log-i[data-pid]{cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;border-radius:8px;transition:background .12s;}
.log-i[data-pid]:active,.log-i.lp-armed{background:var(--rowHover);}

/* ============ Plein écran PAYSAGE sur Mac (souris) : plus de place aux stats, moins aux prochains ============ */
@media (orientation:landscape) and (pointer:fine){
  .fs-batter,.fs-pit{flex:1.4 1 0;min-height:0;display:flex;flex-direction:column;justify-content:center;}
  .fs-next{flex:0.85 1 0;}
  .fs-batter .sc-grid,.fs-pit .sc-grid{gap:6px;}
  .fs-batter .sc-grid .gc,.fs-pit .sc-grid .gc{padding:12px 5px;}
  .fs-batter .sc-grid .gc .k,.fs-pit .sc-grid .gc .k{font-size:.62rem;}
  .fs-batter .sc-grid .gc .v,.fs-pit .sc-grid .gc .v{font-size:1.4rem;}
  .fs-batter .sc-name,.fs-pit .sc-name{font-size:1.35rem;}
  .fs-batter .sc-lab,.fs-pit .sc-lab{font-size:.66rem;}
}

/* ============ Spray chart (terrain + balles frappées) ============ */
.field-box{position:relative;width:100%;max-width:520px;margin:6px auto 0;aspect-ratio:475/393;
  background:url("assets/field-ref.svg") center/contain no-repeat;border-radius:14px;overflow:hidden;}
.field-ov{position:absolute;inset:0;width:100%;height:100%;display:block;}
/* BASEBALL5 : même cadre, même géométrie (475x393, marbre au même point), seul le fond change.
   Les points de spray restent donc alignés — c'est pourquoi le terrain a été dessiné aux mêmes
   repères que celui de baseball plutôt qu'à ses propres proportions. */
body[data-b5="1"] .field-box{background-image:url("assets/baseball5-field.png");}
body[data-b5="1"][data-theme="dark"] .field-box{background-image:url("assets/baseball5-field-dark.png");}
.spray-card .side-h{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
.spray-leg{display:flex;align-items:center;gap:12px;font-size:.78rem;font-weight:700;color:var(--dim);}
.spray-leg .lg{display:inline-flex;align-items:center;gap:6px;}
.spray-leg .lg::before{content:"";width:10px;height:10px;border-radius:50%;}
.spray-leg .lg.hit::before{background:#37d07f;}
.spray-leg .lg.out::before{background:#ff6b6b;}
.spray-leg .lg-n{color:var(--faint);font-weight:800;}

/* ============ Détail d'un match (box score) ============ */
.game-head{display:flex;align-items:center;justify-content:center;gap:18px;margin:6px 0 4px;flex-wrap:wrap;}
.gh-team{display:flex;align-items:center;gap:12px;font-weight:900;}
.gh-team.h{flex-direction:row;}
.gh-nm{font-size:1.15rem;color:var(--dim);}
.gh-team.win .gh-nm{color:var(--txt);}
.gh-sc{font-size:2.4rem;line-height:1;}
.gh-team.win .gh-sc{color:var(--accent);}
.gh-at{color:var(--faint);font-weight:800;}
.game-meta{text-align:center;color:var(--dim);font-weight:600;font-size:.9rem;margin-bottom:14px;}
.linescore th,.linescore td{text-align:center;padding:9px 10px;}
.linescore .l,.linescore .ls-team{text-align:left;font-weight:800;white-space:nowrap;}
.linescore .ls-tot{font-weight:900;color:var(--accentA);}
.linescore tr.win td{color:var(--txt);}
.res-row.link{cursor:pointer;text-decoration:none;color:inherit;transition:background .12s;border-radius:12px;}
.res-row.link:hover{background:var(--rowHover);}
.pbp{display:flex;flex-direction:column;gap:2px;max-height:none;}
.pbp-i{display:flex;gap:10px;align-items:baseline;padding:7px 6px;border-top:1px solid var(--line);font-size:.92rem;}
.pbp-i:first-child{border-top:none;}
.pbp-i.hit{color:var(--txt);font-weight:600;}
.pbp-inn{flex:0 0 auto;width:34px;font-weight:900;font-size:.72rem;color:var(--faint);}

/* ============ Plein écran : spray du frappeur en cours (carte batteur) ============ */
@media (orientation:landscape){
  .fs-batter .sc-grid{display:none;}   /* place au spray du frappeur */
  .fs-batter{display:flex;flex-direction:column;min-height:0;}
  .fs-spray{flex:1 1 0;min-height:0;display:flex;flex-direction:column;margin-top:6px;}
  .fs-spray .spraybox{flex:1 1 0;min-height:0;width:100%;max-width:none;margin:0;aspect-ratio:auto;border:none;background:transparent;box-shadow:none;}
  .fs-spray-leg{flex:0 0 auto;display:flex;align-items:center;justify-content:center;gap:4px;font-size:.62rem;font-weight:800;color:var(--dim);padding-top:3px;}
  .fs-spray-leg .d{width:8px;height:8px;border-radius:50%;}
  .fs-spray-leg .d.hit{background:#37d07f;margin-left:4px;}
  .fs-spray-leg .d.out{background:#ff6b6b;margin-left:8px;}
  /* bandeau réduit pour laisser la place au terrain */
  .fs-scorecard{padding:clamp(8px,1.8vh,15px) 24px;}
  .fs-scorecard .sb-sc{font-size:clamp(3.2rem,9.5vh,5rem);}
  .fs-scorecard .sb-nick{font-size:clamp(1.4rem,3.6vh,2rem);}
  .fs-scorecard .sb-city{font-size:clamp(.95rem,2.1vh,1.3rem);}
}

/* Remplacement d'un joueur : liste épurée (bouton Entrer petit à gauche, pas de stats) */
.subrow{display:flex;align-items:center;gap:12px;padding:9px 4px;border-top:1px solid var(--line);}
.subrow:first-child{border-top:none;}
.subnm{font-weight:700;font-size:.98rem;}
.btn.xs{padding:6px 13px;font-size:.8rem;border-radius:var(--r-sm);flex:0 0 auto;min-width:64px;}

/* ============ Plein écran PAYSAGE — nouvelle disposition ============
   GAUCHE : bandeau score (largeur réduite) + suivi des actions dessous.
   DROITE (haut→bas) : lanceur, batteur+stats, terrain (balles frappées), 3 prochains. */
@media (orientation:landscape){
  .fs-wrap{grid-template-columns:1.12fr 1fr;grid-template-rows:auto minmax(0,1fr);grid-template-areas:"score right" "play right";}
  .fs-score{grid-area:score;}
  .fs-play{grid-area:play;}
  .fs-right{grid-area:right;display:flex;flex-direction:column;gap:8px;min-height:0;}
  .fs-right>*{min-height:0;}
  .fs-right .fs-pit,.fs-right .fs-batter{flex:0 0 auto;}
  .fs-batter .sc-grid{display:grid;}                 /* stats du batteur ré-affichées */
  .fs-right .fs-next{flex:0 0 auto;}
  .fs-right .fs-next .nx-row{flex:0 0 auto;padding:6px 0;}
  /* carte terrain (spray) : remplit l'espace restant ; le fond image + les points se centrent ensemble */
  .fs-spray-card{flex:1 1 0;min-height:0;display:flex;flex-direction:column;overflow:hidden;padding:6px 8px;}
  .fs-spray-card .field-box{flex:1 1 0;min-height:0;width:100%;max-width:none;margin:0;aspect-ratio:auto;background-size:contain;}
  .fs-spray-leg{flex:0 0 auto;display:flex;align-items:center;justify-content:center;gap:4px;font-size:.6rem;font-weight:800;color:var(--dim);margin-bottom:2px;}
  .fs-spray-leg .d{width:8px;height:8px;border-radius:50%;}
  .fs-spray-leg .d.hit{background:#37e089;margin-left:4px;}
  .fs-spray-leg .d.out{background:#ff5b5b;margin-left:8px;}
  .fs-nospray{color:var(--faint);font-size:.75rem;text-align:center;padding:18px 8px;margin:auto;}
  /* bandeau compact (largeur réduite) */
  .fs-scorecard{padding:clamp(8px,1.8vh,15px) 18px;}
  .fs-scorecard .sb-sc{font-size:clamp(2.8rem,8vh,4.6rem);}
  .fs-scorecard .sb-nick{font-size:clamp(1.2rem,3vh,1.8rem);}
  .fs-scorecard .sb-city{font-size:clamp(.9rem,1.9vh,1.2rem);}
  .fs-scorecard .sb-main{gap:clamp(8px,2vw,20px);}
}

/* ============ Line-up : vue terrain à droite ============ */
.lu-wrap{display:grid;grid-template-columns:1fr;gap:14px;align-items:start;}
@media(min-width:900px){ .lu-wrap{grid-template-columns:1fr 0.78fr;} }
.lu-fieldcard{align-self:start;}
.lu-fieldh{font-size:.68rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);margin-bottom:8px;}
.lu-fieldcard .field-box{margin:0;max-width:none;}

/* ============ Classement : M V D % (même taille) ============ */
.st-stats{display:grid;grid-template-columns:repeat(4,40px);gap:10px;align-items:center;text-align:center;flex:0 0 auto;}
.st-stats .v{font-weight:900;font-size:1.05rem;font-variant-numeric:tabular-nums;line-height:1.1;}
.st-stats .v.pct{color:var(--accentA);}
.st-stats.head div{font-size:.6rem;font-weight:800;letter-spacing:.5px;color:var(--faint);text-transform:uppercase;}

/* Fiche joueur : carte spray espacée comme les sections bat/pit/fld */
.spray-card .side-h{display:flex;align-items:center;justify-content:space-between;gap:12px;}
.spray-card .field-box{margin:10px auto 0;}

/* ============ Plein écran : le terrain vit DANS la carte du batteur ============ */
@media (orientation:landscape){
  .fs-right .fs-batter{flex:1 1 0;min-height:0;display:flex;flex-direction:column;overflow:hidden;}
  .fs-batter .fs-spray{flex:1 1 0;min-height:0;display:flex;flex-direction:column;margin-top:6px;}
  .fs-batter .fs-spray .field-box{flex:1 1 0;min-height:0;width:100%;max-width:none;margin:0;aspect-ratio:auto;background-size:contain;}
}

/* ============ Line-up : doublon de numéro, remplacement guidé ============ */
.lu-dupe{background:rgba(239,90,90,.14);border:1px solid rgba(239,90,90,.45);color:#ffc9c9;
  border-radius:var(--r-md);padding:9px 14px;font-weight:700;font-size:.88rem;margin-bottom:12px;}
.jersey.dupe{border-color:#ef5a5a!important;background:rgba(239,90,90,.16)!important;color:#ffd5d5;}
.subhint{background:color-mix(in srgb,var(--accent) 14%,transparent);border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);
  color:var(--txt);border-radius:var(--r-md);padding:9px 14px;font-weight:700;font-size:.9rem;margin-bottom:12px;
  display:flex;align-items:center;justify-content:space-between;gap:12px;}
.lurow.subbing{background:color-mix(in srgb,var(--accent) 16%,transparent);box-shadow:inset 3px 0 0 var(--accent);}
.benchrow.out{opacity:.45;}
.benchrow.out .nm{text-decoration:line-through;}
.outtag{font-size:.62rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);
  border:1px solid var(--line2);border-radius:var(--r-sm);padding:3px 8px;flex:0 0 auto;}

/* ============ Comparaison de deux joueurs ============ */
.fiche-head .cmp-open{flex:0 0 auto;align-self:center;font-weight:800;}

.cmp-head{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;margin-bottom:6px;}
.cmp-p{display:flex;flex-direction:column;gap:5px;min-width:0;}
.cmp-p.a{align-items:flex-start;text-align:left;}
.cmp-p.b{align-items:flex-end;text-align:right;}
.cmp-p .nm{font-size:clamp(1.05rem,2.6vw,1.5rem);font-weight:900;letter-spacing:-.4px;line-height:1.1;
  overflow-wrap:anywhere;}
.cmp-p .tm{color:var(--dim);font-weight:700;font-size:.82rem;overflow-wrap:anywhere;}
.cmp-p.a .nm{color:var(--accent);}
.cmp-p.b .nm{color:var(--orange,#f0a11e);}
.cmp-vs{font-size:.72rem;font-weight:900;letter-spacing:.12em;color:var(--faint);
  border:1px solid var(--line2);border-radius:var(--r-pill);padding:5px 11px;flex:0 0 auto;}
.cmp-sub{color:var(--dim);font-weight:700;font-size:.82rem;text-align:center;margin-bottom:14px;}

.cmp-tally{display:flex;align-items:center;gap:8px;font-size:.7rem;font-weight:800;color:var(--faint);
  text-transform:uppercase;letter-spacing:.05em;}
.cmp-tally b{font-size:1rem;font-weight:900;letter-spacing:0;}
.cmp-tally b.a{color:var(--accent);}
.cmp-tally b.b{color:var(--orange,#f0a11e);}

.cmp-rows{padding:6px 0;}
.cmp-row{display:grid;grid-template-columns:1fr 108px 1fr;align-items:center;gap:8px;
  padding:7px 16px;border-bottom:1px solid var(--line);}
.cmp-row:last-child{border-bottom:none;}
.cmp-row .cl{text-align:center;font-size:.7rem;font-weight:800;letter-spacing:.05em;color:var(--faint);
  text-transform:uppercase;}
.cmp-row .cv{font-variant-numeric:tabular-nums;font-weight:800;font-size:1rem;color:var(--dim);
  padding:4px 11px;border-radius:var(--r-sm);border:1px solid transparent;}
.cmp-row .cv.a{justify-self:start;}
.cmp-row .cv.b{justify-self:end;}
.cmp-row .cv.a.win{color:var(--accent);background:color-mix(in srgb,var(--accent) 15%,transparent);
  border-color:color-mix(in srgb,var(--accent) 40%,transparent);}
.cmp-row .cv.b.win{color:var(--orange,#f0a11e);background:color-mix(in srgb,var(--orange,#f0a11e) 15%,transparent);
  border-color:color-mix(in srgb,var(--orange,#f0a11e) 40%,transparent);}
.cmp-row.key .cl{color:var(--txt);}
.cmp-row.key .cv{font-size:1.12rem;font-weight:900;}

.cmp-sprays{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:10px 12px 4px;}
.cmp-sprays .field-box{margin:0;max-width:none;}

/* Sélecteur de joueur (recherche) */
.ui-modal.pick{width:min(520px,100%);display:flex;flex-direction:column;max-height:min(78vh,640px);}
.pk-list{margin-top:12px;overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1 1 auto;min-height:120px;}
.pk-row{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;
  background:var(--glass2,transparent);border:1px solid var(--line);border-radius:var(--r-sm);
  color:var(--txt);font:inherit;text-align:left;padding:11px 13px;margin-bottom:6px;cursor:pointer;}
.pk-row:hover,.pk-row:active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);}
.pk-nm{font-weight:800;overflow-wrap:anywhere;}
.pk-tm{color:var(--dim);font-weight:700;font-size:.78rem;flex:0 0 auto;max-width:45%;text-align:right;}

@media (max-width:560px){
  .cmp-row{grid-template-columns:1fr 84px 1fr;padding:7px 10px;}
  .cmp-row .cv{font-size:.92rem;padding:3px 8px;}
  .cmp-sprays{grid-template-columns:1fr;}
}

/* Comparaison : note explicative + lignes neutres (cumuls liés au temps de jeu) */
.cmp-note{color:var(--faint);font-weight:600;font-size:.74rem;line-height:1.45;text-align:center;
  max-width:640px;margin:0 auto 16px;}
.cmp-row{padding:5px 16px;}
.cmp-row.neutral .cv{opacity:.62;}

/* Comparaison : rapprocher les deux valeurs du libellé central (lecture directe) */
.cmp-rows{max-width:880px;margin:0 auto;}
.cmp-row{grid-template-columns:1fr 120px 1fr;gap:14px;}
.cmp-row .cv.a{justify-self:end;text-align:right;}
.cmp-row .cv.b{justify-self:start;text-align:left;}

/* Play-offs : format (best-of-N) dans le libellé + plage de dates de la série */
.bk-lbl{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.bk-fmt{font-size:.62rem;font-weight:900;letter-spacing:.03em;color:var(--accent);
  background:color-mix(in srgb,var(--accent) 15%,transparent);border:1px solid color-mix(in srgb,var(--accent) 35%,transparent);
  border-radius:var(--r-pill);padding:2px 9px;text-transform:none;white-space:nowrap;}
.bk-dates{margin-top:9px;padding-top:9px;border-top:1px solid var(--line);font-size:.72rem;
  font-weight:700;color:var(--dim);text-align:center;}

/* À venir : heure + stade sous chaque match ; les matchs de phase finale grisés/placeholder */
.res-meta{font-size:.72rem;font-weight:700;color:var(--faint);text-align:center;padding:2px 0 12px;}
.res-row.up.po{opacity:.9;}
.res-row.up.po .res-nm{font-style:italic;color:var(--dim);}

/* Classement / play-offs à poules : ligne championne (finale) surlignée or */
.st-row.champ{background:linear-gradient(90deg,color-mix(in srgb,#f0a11e 22%,transparent),transparent);}
.st-row.champ .st-name{font-weight:900;}

/* ============ Compte (Supabase) ============ */
.acct-form{display:flex;gap:10px;align-items:stretch;flex-wrap:wrap;}
.acct-form .acct-email{margin-top:0;flex:1 1 220px;min-width:0;}
.acct-form .btn{flex:0 0 auto;white-space:nowrap;}
.acct-msg{margin-top:12px;color:var(--fld,#22b56b);font-weight:700;}
.acct-in{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;}
.acct-who{display:flex;flex-direction:column;gap:3px;min-width:0;}
.acct-lbl{font-size:.68rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);}
.acct-mail{font-weight:800;overflow-wrap:anywhere;}
@media(max-width:560px){
  /* En colonne, flex-basis s'applique à la HAUTEUR : remettre auto sinon le champ s'étire. */
  .acct-form{flex-direction:column;}
  .acct-form .acct-email{flex:0 0 auto;width:100%;}
  .acct-form .btn{width:100%;}
  .acct-in{flex-direction:column;align-items:stretch;}
  .acct-in .btn{width:100%;}
}

/* ============================================================================
   VERSION MOBILE (téléphone) — corrige les chevauchements d'informations.
   Sur petit écran les grilles à colonnes fixes ne laissaient plus de place au
   texte, qui débordait alors PAR-DESSUS les chiffres (illisible).
   ============================================================================ */
@media (max-width:560px){

  /* ---- Classement : la colonne nom n'avait plus que ~20px et écrasait les stats ---- */
  .standings{padding:4px 4px;}
  .st-headrow,.st-row{grid-template-columns:24px 30px minmax(0,1fr) auto;gap:7px;padding:10px 8px;}
  .st-headrow .st-hlbl{grid-column:2 / 4;}
  .st-rank{font-size:.98rem;}
  .st-id{min-width:0;}
  .st-name{font-size:.84rem;gap:4px;overflow-wrap:anywhere;line-height:1.2;}
  /* Colonnes de stats un peu plus larges et détachées du bord droit (elles paraissaient tassées). */
  .st-stats{grid-template-columns:repeat(4,minmax(26px,auto));gap:9px;padding-right:2px;}
  .st-stats .v{font-size:.88rem;}
  .st-stats.head div{font-size:.52rem;letter-spacing:.2px;}
  .st-arrow{display:none;}            /* la ligne entière est déjà cliquable */
  .st-mine{display:none;}             /* le fond vert + le liseré signalent déjà mon équipe */
  .st-po{font-size:.55rem;padding:1px 4px;margin-left:0;}
  .tlogo{width:30px;height:30px;}

  /* ---- Tableaux de stats : la colonne nom (nowrap) poussait TOUTES les stats hors écran.
         Plutôt que de rogner les noms, on affiche la forme courte de box score
         ("W. PINO CENTENO") : lisible en entier ET compacte. ---- */
  thead th{padding:10px 7px;font-size:.6rem;letter-spacing:.3px;}
  tbody td{padding:0 7px;height:46px;font-size:.88rem;}
  td.pl{font-size:.86rem;}
  .rk{width:30px;margin-right:5px;font-size:.78rem;}
  td.keyc,th.keyc{padding:0 8px;}

  /* Bascule nom complet -> nom court (aucun JS : les 2 sont dans le HTML) */
  .nm-full{display:none;}
  .nm-short{display:inline;}

  /* Les <select> de création de match prenaient toute la largeur : on les borne. */
  .nm-field select,#nmOpp,#nmInn{width:100%;max-width:100%;}
  .nm-field > label{margin-bottom:6px;}

  /* Vue coach : espace entre les cartes batteur / lanceur / coureurs */
  .cch-bat,.cch-pit{margin-bottom:14px;}
  .cch-bat + .cch-pit{margin-top:0;}

  /* Colonnes chiffrées CENTRÉES sur téléphone (elles étaient alignées à droite : dans des
     colonnes étroites, le chiffre se collait au bord et paraissait décalé sous son en-tête).
     Les colonnes de noms restent à gauche. */
  #app table thead th,#app table tbody td{text-align:center;}
  #app table thead th.l,#app table tbody td.l,
  #app table thead th.pinL,#app table tbody td.pinL{text-align:left;}

  /* ---- Résultats : côte à côte, chaque équipe n'avait que ~110px et son nom était rogné.
         On EMPILE les deux équipes (une par ligne, pleine largeur) avec le score à droite,
         comme sur les apps de résultats sportifs. Plus aucun nom coupé. ---- */
  .res-row{grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto;
    gap:4px 10px;padding:8px 4px;}
  .res-team.a{grid-area:1/1;justify-content:flex-start;text-align:left;}
  .res-team.h{grid-area:2/1;justify-content:flex-start;text-align:left;}
  .res-team .tlogo{order:-1;}                 /* logo toujours à gauche du nom */
  .res-nm{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;
    font-size:.86rem;line-height:1.25;}
  .res-team .tlogo{--sz:24px;width:24px;height:24px;flex:0 0 auto;}
  /* le score occupe la colonne de droite sur les 2 lignes */
  .res-score{grid-area:1/2/3/3;grid-template-columns:auto;grid-template-rows:1fr 1fr;
    min-width:0;gap:4px;align-items:center;justify-items:center;}
  .res-score .res-sep{display:none;}          /* inutile en pile : un chiffre par ligne */
  .res-score b{font-size:1.15rem;text-align:center!important;min-width:26px;}

  /* ---- Scoreboard du match : dimensionné pour iPad, les noms étaient tronqués ---- */
  .sb-main{gap:6px;padding:14px 8px;}
  .sb-city{font-size:.78rem;}
  .sb-nick{font-size:1.05rem;line-height:1.1;overflow-wrap:anywhere;}
  .sb-sc{font-size:2.6rem;margin-top:4px;letter-spacing:-1px;}
  .sb-team{padding:6px 3px;}
  .sb-chip{min-width:0;padding:6px 9px;}
  .sb-chip .v{font-size:1.05rem;}
  .sb-counters{gap:4px 6px;}
  .sb-counters .k{font-size:.55rem;}

  /* ---- Sélecteurs segmentés : les longs noms d'équipe débordaient des boutons ---- */
  .seg{display:flex;width:100%;}
  .seg button{flex:1 1 0;min-width:0;padding:10px 8px;font-size:.8rem;overflow-wrap:anywhere;}

  /* ---- Line-up : nom sur 2 lignes + stats sur 3 = lignes énormes. On passe les contrôles
         (numéro / poste / remplacer / retirer) sur une 2e ligne, sous le nom. ---- */
  .row{grid-template-columns:26px minmax(0,1fr) auto;gap:8px;padding:10px 10px;}
  .row .who .nm{font-size:.9rem;overflow-wrap:anywhere;}
  .row .who .st{font-size:.72rem;margin-top:2px;}
  /* 7 enfants (grip, n°, nom, maillot, poste, remplacer, retirer). En grille à colonnes fixes ils
     se chevauchaient : on passe en FLEX qui les enchaîne et les fait passer à la ligne tout seuls.
     Le nom force le retour à la ligne (flex-basis 100%) -> contrôles alignés en dessous. */
  .lurow{display:flex;flex-wrap:wrap;align-items:center;gap:8px;}
  .lurow > .grip{order:1;}
  .lurow > .n{order:2;min-width:14px;}
  .lurow > .who{order:3;flex:1 1 60%;min-width:0;}
  .lurow > .jersey{order:4;width:64px;flex:0 0 auto;}
  .lurow > .possel{order:5;flex:1 1 auto;min-width:0;max-width:120px;}
  .lurow > .iconb{order:6;flex:0 0 auto;}
  .lurow .iconb{width:34px;height:34px;}
  .rows .row .acts{flex-wrap:wrap;justify-content:flex-end;}

}

/* Lien vers la politique de confidentialité (section Compte) */
.privlink{color:var(--accent);font-weight:700;text-decoration:underline;text-underline-offset:2px;}

/* ============ Espace admin + bandeau d'annonce ============ */
.site-banner{background:color-mix(in srgb,var(--accent) 18%,transparent);
  border-bottom:1px solid color-mix(in srgb,var(--accent) 45%,transparent);
  color:var(--txt);font-weight:700;font-size:.86rem;text-align:center;padding:9px 14px;}
.po-bo.off{display:none!important;}
/* Fréquentation : une barre par jour, avec le nombre au-dessus et la date en dessous
   (sans repères, une barre unique à 100 % ressemblait à un gros bloc bleu inexpliqué). */
.vis-bars{display:flex;align-items:flex-end;gap:6px;height:104px;padding:6px 0;}
.vis-b{flex:1 1 0;max-width:54px;height:100%;display:grid;grid-template-rows:auto minmax(0,1fr) auto;
  justify-items:center;gap:3px;}
.vis-b .vis-fill{align-self:end;width:100%;border-radius:4px 4px 0 0;
  background:linear-gradient(180deg,var(--accentA),var(--accent));min-height:6px;}
.vis-b .vis-n{font-size:.7rem;font-weight:900;color:var(--dim);line-height:1;}
.vis-b .vis-d{font-size:.6rem;font-weight:700;color:var(--faint);line-height:1;white-space:nowrap;}
/* Éditeur de texte de la politique de confidentialité (barre d'outils + zone éditable).
   Le contenu hérite des styles du site (.sec/.t, p, ul) : ce qu'on voit = ce qui sera publié. */
.rte-wrap{border:1px solid var(--glass-brd);border-radius:var(--r-md);overflow:hidden;background:var(--glass2);}
.rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:8px 10px;border-bottom:1px solid var(--line);}
.rte-b{border:1px solid var(--glass-brd);background:var(--glass);color:var(--txt);font-weight:800;
  font-size:.82rem;min-width:34px;height:32px;padding:0 10px;border-radius:var(--r-xs);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;transition:background .12s;}
.rte-b:hover{background:var(--rowHover);}
.rte-b:active{background:var(--accent);color:#fff;}
.rte-sep{width:1px;height:22px;background:var(--line);margin:0 2px;}
.rte-sel{max-width:none!important;width:auto!important;min-width:124px;height:auto!important;
  padding:7px 30px 7px 12px!important;font-size:.82rem;line-height:1.2;}
.rte{min-height:300px;max-height:62vh;overflow:auto;padding:16px 18px;background:var(--panel);
  line-height:1.65;font-size:.95rem;-webkit-user-select:text;user-select:text;}
.rte:focus{outline:none;box-shadow:inset 0 0 0 2px color-mix(in srgb,var(--accent) 45%,transparent);}
.rte p{margin:0 0 10px;}
.rte ul,.rte ol{margin:8px 0 12px 20px;}
.rte li{margin-bottom:4px;}
.rte a{color:var(--accent);text-decoration:underline;}
.rte .sec{margin:16px 0 6px;}
@media(max-width:560px){ .rte-sel{min-width:96px;} .rte{min-height:220px;padding:12px;} }
/* Les <select> ont un max-width:220px global : les sélecteurs admin doivent occuper la largeur. */
.po-kind{max-width:none!important;width:100%;}
.set-block[data-po]{padding-bottom:14px;}

/* ============ Partage du match (QR) + vue coach ============ */
.share-modal{width:min(420px,100%);text-align:center;}
.qr-box{background:#fff;border-radius:var(--r-md);padding:12px;margin:14px auto 0;width:min(240px,70vw);}
.qr-box svg{display:block;width:100%;height:auto;}
.share-code{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:14px;}
.share-code .k{font-size:.66rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);}
.share-code b{font-size:1.5rem;font-weight:900;letter-spacing:.18em;font-variant-numeric:tabular-nums;color:var(--accent);}
.share-link{margin-top:8px;font-size:.7rem;color:var(--faint);overflow-wrap:anywhere;line-height:1.4;}
.share-foot{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin-top:16px;}
.sb-cast{opacity:.7;transition:.15s;}
.sb-cast:hover{opacity:1;}
.sb-cast.on{background:var(--accent);border-color:transparent;color:#fff;opacity:1;}
.sb-cast.on svg{stroke:#fff;}
.follow-card{margin-top:14px;}

.cch-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px;flex-wrap:wrap;}
.cch-code{font-weight:800;font-size:.94rem;}
.cch-code b{letter-spacing:.14em;color:var(--accent);}
.cch-status{font-size:.72rem;font-weight:700;color:var(--faint);margin-top:2px;}
.cch-status.ok{color:var(--fld,#22b56b);}
.cch-score{padding:6px;}
.cch-tabs{margin:14px 0;}
.cch-lbl{font-size:.66rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);margin-bottom:8px;}
.cch-nm{font-size:clamp(1.1rem,4vw,1.5rem);font-weight:900;letter-spacing:-.3px;margin-bottom:12px;overflow-wrap:anywhere;}
.cch-next{margin-top:14px;padding-top:12px;border-top:1px solid var(--line);}
.cch-next .nx-row{display:flex;align-items:center;gap:8px;padding:5px 0;}
.cch-next .nx-i{width:18px;color:var(--faint);font-weight:900;font-size:.8rem;}
.cch-next .nx-n{font-weight:700;overflow-wrap:anywhere;}
.cch-runners{display:flex;flex-wrap:wrap;gap:8px;}
.cch-runners .rchip b{color:var(--accent);margin-right:4px;}
.cch-lu .row{grid-template-columns:24px minmax(0,1fr) auto;}
/* .sc-grid ne déclare pas `display:grid` (il l'hérite du contexte plein écran du match) :
   dans la vue coach il faut le poser explicitement, sinon les tuiles s'empilent. */
.cch-bat .sc-grid,.cch-pit .sc-grid{display:grid;gap:8px;
  grid-template-columns:repeat(auto-fit,minmax(58px,1fr));}
.cch-bat .gc,.cch-pit .gc{background:var(--glass2);border:1px solid var(--line);
  border-radius:var(--r-sm);padding:8px 4px;text-align:center;}
.cch-bat .gc .k,.cch-pit .gc .k{font-size:.6rem;font-weight:900;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);}
.cch-bat .gc .v,.cch-pit .gc .v{font-weight:900;font-size:1.15rem;line-height:1.2;}
.cch-bat{border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);}
.cch-pit{border:1px solid color-mix(in srgb,var(--orange,#f0a11e) 45%,transparent);}
.cch-pit .gc .v{color:var(--orange,#f0a11e);}
@media(max-width:560px){
  .cch-head{gap:8px;}
  .cch-score .sb-main{padding:12px 6px;}
  .cch-tabs button{font-size:.76rem;padding:9px 4px;}
}

/* Coureurs (vue coach) : bandeau simple sous le score, sans encadré */
.cch-onbase{display:flex;flex-wrap:nowrap;gap:8px;margin:10px 0 4px;overflow-x:auto;
  -webkit-overflow-scrolling:touch;scrollbar-width:none;}
.cch-onbase::-webkit-scrollbar{display:none;}
.cch-onbase .ob{flex:0 0 auto;white-space:nowrap;}
.cch-onbase .ob{display:inline-flex;align-items:center;gap:6px;font-weight:700;font-size:.84rem;
  background:var(--glass2);border:1px solid var(--line);border-radius:var(--r-pill);padding:5px 12px;}
.cch-onbase .ob b{color:var(--accent);font-weight:900;font-size:.76rem;letter-spacing:.03em;}
/* Dernier match suivi (carte « Suivre un match ») */
.last-live{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  background:color-mix(in srgb,var(--accent) 10%,transparent);
  border:1px solid color-mix(in srgb,var(--accent) 35%,transparent);
  border-radius:var(--r-md);padding:10px 14px;}
.ll-lbl{font-size:.64rem;font-weight:900;letter-spacing:.07em;text-transform:uppercase;color:var(--faint);}
.ll-code{font-weight:900;font-size:1.15rem;letter-spacing:.16em;color:var(--accent);}
.ll-acts{display:flex;align-items:center;gap:8px;}
@media(max-width:560px){
  .last-live{flex-direction:column;align-items:stretch;}
  .ll-acts{justify-content:space-between;}
}

/* Détail d'un match sur téléphone : l'en-tête (logo + nom + score, côte à côte) était trop
   chargé. On EMPILE une équipe par ligne, comme sur la liste des résultats. */
@media (max-width:560px){
  /* GRILLE (et non flex) avec `grid-auto-rows:1fr` : les deux cartes prennent la MÊME hauteur,
     même si un seul des deux noms passe à la ligne. */
  .game-head{display:grid;grid-template-columns:1fr;grid-auto-rows:1fr;align-items:stretch;
    gap:6px;margin:4px 0 8px;}
  .gh-team,.gh-team.h{flex-direction:row;justify-content:flex-start;align-items:center;gap:10px;
    padding:8px 12px;border-radius:var(--r-md);background:var(--glass2);border:1px solid var(--line);}
  .gh-team .tlogo{order:-1;width:28px;height:28px;flex:0 0 auto;}
  .gh-nm{font-size:.95rem;flex:1 1 auto;min-width:0;overflow-wrap:anywhere;line-height:1.25;}
  .gh-sc{font-size:1.5rem;flex:0 0 auto;order:3;}
  .gh-at{display:none;}                 /* inutile quand les équipes sont empilées */
  .game-meta{font-size:.8rem;margin-bottom:12px;}
  /* Vue coach — onglet Stats : le titre d'équipe était collé au bord, le tableau non. */
  .cch-tabs + .card > .cch-lbl{padding:0 12px;}
}

/* ============ Verrou d'accès (mode « sur invitation ») ============ */
body.gated .nav{display:none;}              /* aucune navigation tant qu'on n'est pas connecté */
body.gated .foot{opacity:.5;}
.gate{display:flex;align-items:center;justify-content:center;min-height:60vh;padding:20px 0;}
.gate-card{width:min(440px,100%);text-align:center;background:var(--glass);border:1px solid var(--glass-brd);
  border-radius:var(--r-lg);padding:32px 26px;box-shadow:var(--shadow);
  -webkit-backdrop-filter:var(--blur);backdrop-filter:var(--blur);}
.gate-logo{font-weight:900;font-size:1.25rem;letter-spacing:-.4px;margin-bottom:20px;}
.gate-title{font-size:1.5rem;font-weight:900;letter-spacing:-.4px;margin:0 0 10px;}
.gate-sub{color:var(--dim);font-weight:600;line-height:1.55;font-size:.92rem;margin:0 0 22px;}
.gate-form{display:flex;flex-direction:column;gap:12px;}
.gate-form .ui-input{margin-top:0;text-align:center;}
.gate-msg{margin-top:16px;font-weight:700;}
.gate-msg.ok{color:var(--fld,#22b56b);}
.gate-msg.err{color:#ef5a5a;}
.gate-foot{margin-top:22px;color:var(--faint);font-size:.76rem;line-height:1.6;font-weight:600;}
.gate-foot a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;}
@media(max-width:560px){
  .gate{min-height:50vh;padding:10px 0;}
  .gate-card{padding:26px 18px;}
  .gate-title{font-size:1.3rem;}
}

/* Plein écran inutile/instable sur téléphone (portrait étroit OU paysage trop court) : le bouton
   n'est même plus rendu (voir isPhone() dans match.js). Les règles restent en filet de sécurité. */
@media (max-width:640px), (max-height:520px){
  .sb-fs{display:none !important;}
}

/* ======================================================================
   TÉLÉPHONE — COUREURS SUR BASE : UNE SEULE LIGNE SOUS LE SCORE
   Avant, les pastilles de coureurs partageaient la ligne des boutons de commande
   et repassaient sur 2-3 lignes dès qu'il y avait deux coureurs. Elles occupent
   maintenant leur propre ligne, pleine largeur, et se partagent la place.
   ====================================================================== */
@media (max-width:560px){
  /* Vue scoreur */
  .sb-bar{flex-direction:column;align-items:stretch;gap:8px;}
  .sb-runners{flex-wrap:nowrap;width:100%;gap:6px;}
  /* flex:1 1 auto (et non 1 1 0) : les pastilles se partagent la ligne au PRORATA du nom,
     donc « DARDINIER » prend la place que « FRAISSE » n'utilise pas. */
  .sb-runners .rchip{flex:1 1 auto;min-width:0;text-align:center;font-size:.62rem;padding:5px 4px;
    letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .sb-ctrls{justify-content:flex-end;}
  /* Vue coach : même principe, plus de défilement horizontal */
  .cch-onbase{overflow:visible;gap:6px;}
  .cch-onbase .ob{flex:1 1 auto;min-width:0;justify-content:center;padding:5px 6px;font-size:.68rem;gap:4px;}
  .cch-onbase .ob-nm{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
}

/* ======================================================================
   PLEIN ÉCRAN — RÉPARTITION DES ACTIONS (26 issues possibles)
   Empiler « On base » (10 cases) puis « Outs » (8) sur toute la largeur donnait des
   cases écrasées et du texte coupé. Nouvelle répartition en paysage :
     ligne 1 : frappeur + Skip
     ligne 2 : Count (Ball / Strike / Foul)
     ligne 3 : On base (5 col) | Outs (4 col)      <- côte à côte
     ligne 4 : Baserunning (5 col, pleine largeur, seulement s'il y a un coureur)
   Chaque case affiche l'abréviation en gros + le libellé complet en petit.
   ====================================================================== */
/* Abréviation en gros + libellé complet en PETIT sur UNE seule ligne (troncature « … » si trop long),
   jamais sur deux lignes : c'est ce qui débordait. La case elle-même clippe son contenu. */
.obtn .ob-s,.obtn .ob-l{display:block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.obtn .ob-s{font-weight:900;letter-spacing:.02em;}
.obtn .ob-l{font-weight:700;font-size:.6rem;color:var(--dim);text-transform:none;letter-spacing:0;line-height:1.15;}
/* .fs-actions n'existe QU'en plein écran. Toutes les cases ont la MÊME hauteur partout (harmonieux),
   dimensionnée avec `svh` = hauteur du viewport quand la barre Safari est VISIBLE. On dimensionne donc
   toujours pour le pire cas (barre affichée) : tout tient sans jamais défiler, et rien n'est tassé.
   Flux naturel (pas d'étirement) : entête, Count, On base (2 rangées), Outs (2), Baserunning. */
.fs-actions{display:flex;flex-direction:column;gap:6px;padding:8px;min-height:0;overflow:hidden;}
.fs-actions>*{min-width:0;}
/* CLÉ : la hauteur de chaque groupe est PROPORTIONNELLE à son nombre de rangées (flex-grow = rangées),
   avec la même base (~26px = le libellé) partout. Résultat : TOUTES les cases ont EXACTEMENT la même
   hauteur (Count comprise), les rangées ne se chevauchent plus, et l'ensemble REMPLIT toute la hauteur
   disponible (donc s'agrandit sur Mac / quand la barre Safari se réduit, et quand Baserunning est absent). */
.fs-actions .act-head{flex:0 0 auto;}
/* La base flex (22px) = EXACTEMENT la hauteur du libellé (18px + 4px de marge). Ainsi tout l'espace
   qui grandit va aux CASES, réparti proportionnellement au nombre de rangées -> hauteur IDENTIQUE partout. */
/* Base = libellé (22px) + les gaps INTERNES entre rangées (6px par rangée en plus). Ainsi la hauteur
   par CASE est identique dans un groupe à 1 ou 2 rangées. */
/* IMPORTANT : les groupes/grilles ne grandissent PAS en flex (flex:0 0 auto). C'est la hauteur px
   posée par le JS (fsSizeActions) qui gouverne la taille des cases ; un flex-grow ici l'absorberait
   et l'écart du bas deviendrait faux. */
.fs-actions .act-grp{display:flex;flex-direction:column;min-height:0;flex:0 0 auto;}
.fs-actions .act-grp .agl{flex:0 0 auto;height:18px;line-height:18px;margin-bottom:4px;overflow:hidden;}
.fs-actions .act-btns{flex:0 0 auto;min-height:0;display:grid;gap:6px;align-items:stretch;}
/* Pleine largeur, à l'horizontale : Count 3 col, On base 5 (10 issues), Outs 4 (8), Baserunning 5. */
.fs-actions .g-count .act-btns{grid-template-columns:repeat(3,minmax(0,1fr));}
.fs-actions .g-onbase .act-btns{grid-template-columns:repeat(5,minmax(0,1fr));}
.fs-actions .g-outs .act-btns{grid-template-columns:repeat(4,minmax(0,1fr));}
.fs-actions .g-run .act-btns{grid-template-columns:repeat(5,minmax(0,1fr));}
.fs-actions .obtn{height:100%;min-height:0;overflow:hidden;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:0;padding:2px 4px;line-height:1.1;
  /* PAS de transition sur la hauteur : sinon la mesure JS (fsSizeActions) lit une valeur en pleine
     animation et se trompe. Le dimensionnement doit être instantané. */
  transition:none;}
.fs-actions .obtn .ob-s{font-size:clamp(.85rem,2.2vh,1.35rem);}
.fs-actions .obtn .ob-l{font-size:clamp(.5rem,1.15vh,.7rem);}
.fs-actions .g-count .obtn{font-size:clamp(.85rem,2vh,1.2rem);font-weight:800;}

/* Gestion des compétitions (Réglages) : la rangée générique attend une colonne de rang de 34px,
   ici il n'y a que le nom + le bouton. Et les <select> ont un max-width:220px global. */
.comp-row{grid-template-columns:minmax(0,1fr) auto;}
#cmpPick,#cmpQual,#cmpInn{max-width:none!important;width:auto;}
/* Onglet Compétitions : chaque méthode d'ajout dans son propre bloc encadré (moins brouillon). */
.comp-block{border:1px solid var(--line);border-radius:var(--r-md);background:var(--glass2);
  padding:14px 16px;margin-top:12px;}
.comp-block:first-of-type{margin-top:0;}
.comp-h{font-weight:900;font-size:.95rem;margin-bottom:10px;display:flex;align-items:center;gap:8px;}
.comp-h .comp-n{font-size:.7rem;font-weight:900;color:#fff;background:var(--accent);border-radius:var(--r-pill);
  padding:2px 9px;}
.comp-sub{font-weight:900;font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);
  margin:14px 0 6px;border-top:1px solid var(--line);padding-top:12px;}
.comp-block .rule-row{margin-top:8px;}
.comp-block #cmpInn,.comp-block #cmpQual{width:auto;min-width:150px;}

/* ======================================================================
   NOTES SUR UN JOUEUR (locales à l'appareil)
   Icône bulle : discrète quand il n'y a pas de note, en accent dès qu'il y en a une.
   ====================================================================== */
.notebtn{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;
  width:26px;height:26px;padding:0;flex:0 0 auto;border:none;background:transparent;cursor:pointer;
  color:var(--faint);opacity:.5;border-radius:var(--r-sm);transition:opacity .12s,color .12s,background .12s;}
.notebtn svg{width:15px;height:15px;display:block;}
.notebtn:hover{opacity:1;background:var(--rowHover);}
.notebtn.has{color:var(--accent);opacity:1;}
.notebtn.has svg{fill:color-mix(in srgb,var(--accent) 22%,transparent);}
/* Cible tactile confortable sur iPad / téléphone sans agrandir l'icône */
@media (hover:none){ .notebtn{width:32px;height:32px;opacity:.6;} }
.note-modal{max-width:520px;}
.note-modal .note-ta{width:100%;min-height:120px;resize:vertical;text-align:left;line-height:1.5;
  font-family:inherit;font-size:.95rem;}
.note-card .note-txt,.note-card>.hint{padding:14px 18px;margin:0;white-space:pre-wrap;line-height:1.6;}
.note-card .side-h{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
/* Fiche joueur : la Note et la Limite de lancers côte à côte (empilées sur mobile). */
.side-pair{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:16px;align-items:stretch;}
.side-pair.one{grid-template-columns:1fr;}
.side-pair .side{margin-top:0;display:flex;flex-direction:column;}
.side-pair .side>.side-h{flex:0 0 auto;}
.side-pair + .side{margin-top:16px;}
@media (max-width:560px){.side-pair{grid-template-columns:1fr;}}
.fiche-head .nm .notebtn{width:30px;height:30px;}
.fiche-head .nm .notebtn svg{width:18px;height:18px;}

/* PORTRAIT — la disposition portrait visait l'ancien bloc `.fs-side`, qui n'existe plus
   (colonne droite = `.fs-right`) : les actions étaient donc poussées HORS de l'écran.
   On replace les trois zones et on retire le terrain (outil de placement en paysage). */
@media (orientation:portrait){
  .fs-wrap{grid-template-columns:1fr;grid-template-rows:auto auto minmax(0,1fr);
    grid-template-areas:"score" "right" "play";}
  .fs-right{grid-area:right;display:grid;grid-template-columns:1fr 1fr;gap:10px;align-items:start;}
  .fs-right .fs-next{display:none;}
  .fs-batter .fs-spray{display:none;}
  .fs-batter .sc-grid{display:grid;}
  .fs-actions .obtn{padding:10px 4px;}
}

/* ======================================================================
   PLEIN ÉCRAN PAYSAGE — COMPACITÉ FINALE (placé en toute fin : gagne sur les blocs
   `.fs-scorecard`/`.fs-actions` définis plus haut). But : les 26 actions tiennent
   SANS défilement même quand la barre Safari réduit la hauteur (iPad ~720px de haut).
   ====================================================================== */
@media (orientation:landscape){
  /* Bandeau de score AGRANDI (comme avant) — c'était bien sur Mac. La place pour les actions est
     gérée en les faisant REMPLIR l'espace (pas en rétrécissant le bandeau). */
  .fs-scorecard{padding:clamp(8px,2vh,18px) 22px;}
  .fs-scorecard .sb-sc{font-size:clamp(3rem,9vh,5.4rem);}
  .fs-scorecard .sb-nick{font-size:clamp(1.4rem,3.4vh,2.2rem);}
  .fs-scorecard .sb-city{font-size:clamp(.95rem,2.1vh,1.4rem);}
  .fs-scorecard .sb-atbat{font-size:clamp(.6rem,1.5vh,.8rem);}
}

/* ======================================================================
   HARMONISATION "LIQUID GLASS" — inspiration Apple : FORMES (capsules, rond sur les
   côtés) + ANIMATIONS (ressort à l'appui), SANS transparence (fonds pleins conservés).
   S'applique à TOUS les boutons / onglets / bascules CLIQUABLES, SAUF :
   - les boutons d'ACTION du scoring (.obtn),
   - les blocs d'INFO (cartes, tuiles, badges, chips, champs de saisie, sélecteurs).
   Bloc en toute fin : prime sur les rayons définis plus haut.
   ====================================================================== */
.btn,.btn.sm,.iconb,.decb,.notebtn,.sw,
.seg,.seg button,.toggle,.toggle button,
.scope-seg,.scope-seg button,
.champtabs,.champtabs button,.cch-tabs,.cch-tabs button,
.db,.err-toggle,
select,select.sel,select.possel,.hero-sel,.compsel,
.nav a{ border-radius:var(--r-pill)!important; }

/* EXCEPTION : les 4 contrôles sous le bandeau de score (annuler / caster / corriger / plein écran)
   restent comme avant (carré arrondi), pas en cercle. */
.sb-ctrls .iconb{ border-radius:var(--r-sm)!important; }

/* Ressort type iOS : léger rebond à la transition, enfoncement à l'appui. */
.btn,.iconb,.decb,.notebtn,.sw,.db,.err-toggle,
.seg button,.toggle button,.scope-seg button,
.champtabs button,.cch-tabs button,.nav a{
  transition:transform .2s cubic-bezier(.34,1.56,.64,1),background .18s ease,color .18s ease,box-shadow .18s ease,border-color .18s ease;
}
.btn:active,.iconb:active,.decb:active,.notebtn:active,.sw:active,.db:active,.err-toggle:active,
.seg button:active,.toggle button:active,.scope-seg button:active,
.champtabs button:active,.cch-tabs button:active,.nav a:active{ transform:scale(.93); }
/* Petit relèvement au survol UNIQUEMENT à la souris (évite le hover collant sur tactile). */
@media (hover:hover) and (pointer:fine){
  .btn:hover,.iconb:hover{ transform:translateY(-1px); }
}

/* ======================================================================
   TAILLE DE BOUTON UNIFORME sur TOUT le site : même hauteur, capsule, largeur
   selon le texte (jamais rogné) avec un minimum. Plus de bouton pleine largeur
   ni de mini-bouton. Bloc final : prime sur les tailles définies plus haut.
   Exceptions volontaires : .btn.icon (bouton icône carré), les cases d'action
   du scoring (.obtn) et les 4 contrôles du score (.sb-ctrls .iconb).
   ====================================================================== */
.btn,.btn.sm,.btn.xs{
  width:auto!important;              /* annule .block / width:100% */
  min-width:120px; min-height:44px;
  align-self:center;                /* ne s'étire jamais à la hauteur d'un champ voisin */
  padding:0 22px; font-size:.9rem; line-height:1.15; white-space:nowrap;
}
.btn.icon{ min-width:0; width:36px; height:36px; min-height:0; padding:0; }

/* ======================================================================
   COMPTE DE LANCERS — bandeau d'alerte sur la carte lanceur (limite configurable
   dans Réglages → Règles du match). Vert < 85% · orange dès 85% · rouge à la limite.
   ====================================================================== */
.pc-alert{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:12px;
  padding:9px 14px;border-radius:var(--r-md);font-weight:800;font-size:.85rem;line-height:1.2;}
.pc-alert .pc-val{font-variant-numeric:tabular-nums;font-weight:900;flex:0 0 auto;}
.pc-alert.ok{background:color-mix(in srgb,var(--fld,#22b56b) 14%,transparent);color:var(--fld,#22b56b);}
.pc-alert.warn{background:color-mix(in srgb,var(--orange,#f0a11e) 20%,transparent);color:#8a5800;}
.pc-alert.over{background:color-mix(in srgb,var(--red,#ef5a5a) 20%,transparent);color:#b02020;}
:root[data-theme="dark"] .pc-alert.warn{color:var(--orange,#f0a11e);}
:root[data-theme="dark"] .pc-alert.over{color:#ff9a9a;}

/* ======================================================================
   FORME & TENDANCES D'ÉQUIPE (page équipe) — forme récente, splits domicile/
   extérieur, marquées/encaissées, meilleurs joueurs.
   ====================================================================== */
.tt .tt-row{display:flex;align-items:center;gap:12px;margin-bottom:14px;flex-wrap:wrap;}
.tt .tt-lbl{font-weight:900;font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);flex:0 0 auto;}
.form-strip{display:flex;gap:6px;flex-wrap:wrap;}
.form-dot{width:28px;height:28px;border-radius:var(--r-pill);display:inline-flex;align-items:center;justify-content:center;
  font-weight:900;font-size:.78rem;color:#fff;}
.form-dot.w{background:var(--fld,#22b56b);}
.form-dot.l{background:var(--red,#ef5a5a);}
.tt-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;}
.tt-tile{padding:12px 14px;text-align:center;}   /* .gc fournit le fond verre + le rayon */
.tt-tile .gc-k{font-size:.66rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--dim);}
.tt-tile .gc-v{font-size:1.5rem;font-weight:900;line-height:1.1;margin-top:4px;}
.tt-tile .gc-sub{font-size:.68rem;color:var(--faint);font-weight:700;margin-top:3px;}
.tt-bests{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px;margin-top:14px;}
.tt-best-row{display:flex;align-items:center;gap:10px;padding:11px 14px;border:1px solid var(--line);
  border-radius:var(--r-md);background:var(--glass2);}
.tt-best-lbl{font-size:.64rem;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--dim);flex:0 0 auto;}
.tt-best-nm{font-weight:800;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tt-best-v{font-weight:900;color:var(--accent);flex:0 0 auto;font-variant-numeric:tabular-nums;}

/* Limite de lancers par joueur (fiche joueur) */
.pl-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:16px 18px;}
.pl-row .ui-input{width:96px;min-height:44px;margin:0;text-align:center;border-radius:var(--r-pill);}
.pl-row .hint{flex:1 1 100%;margin-top:2px;}
/* Champs numériques du dashboard/fiche : retire les flèches natives (forme incohérente avec les boutons). */
.pl-row .ui-input,.td-fld input[type=number]{-moz-appearance:textfield;appearance:textfield;}
.pl-row .ui-input::-webkit-outer-spin-button,.pl-row .ui-input::-webkit-inner-spin-button,
.td-fld input[type=number]::-webkit-outer-spin-button,.td-fld input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0;}

/* ================= TABLEAU DE BORD « Mon équipe » ================= */
.td-hero{align-items:center;}
.td-name{font-size:clamp(1.5rem,4vw,2.1rem);font-weight:900;letter-spacing:-.5px;line-height:1.05;}
.td-syncrow{margin-top:10px;}
.td-sync{font-weight:800;font-size:.8rem;color:var(--dim);}
.td-sync.on{color:var(--fld);}
.td-tabs{margin:14px 0 4px;}
.td-body{margin-top:8px;}
.td-head{display:flex;justify-content:flex-end;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px;}
.td-empty{display:flex;flex-direction:column;align-items:center;gap:14px;padding:34px 18px;}
.td-empty .empty{margin:0;}
.td-list{padding:4px 0;}
.td-picker{margin-bottom:12px;}
.td-matchsel{width:100%;max-width:none;}

/* Agenda */
.td-mrow{display:grid;grid-template-columns:minmax(120px,1fr) minmax(0,1.4fr) auto;align-items:center;gap:12px;
  padding:12px 14px;border-bottom:1px solid var(--line);cursor:pointer;transition:background .12s;}
.td-mrow:last-child{border-bottom:none;}
.td-mrow:hover{background:var(--rowHover);}
.td-mdate{display:flex;flex-direction:column;gap:2px;}
.td-mdate b{font-weight:900;}
.td-mdate span{color:var(--dim);font-size:.82rem;font-weight:700;}
.td-mopp{display:flex;align-items:center;gap:9px;min-width:0;font-weight:800;}
.td-mopp>span:not(.badge){overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.td-mcnt{display:flex;align-items:center;gap:8px;justify-self:end;}

/* Puces de comptage / statut */
.td-pill{font-weight:800;font-size:.8rem;padding:5px 11px;border-radius:var(--r-pill);
  background:var(--panel2);color:var(--dim);border:1px solid var(--line);white-space:nowrap;}
.td-pill.yes{background:color-mix(in srgb,var(--fld) 16%,transparent);color:var(--fld);border-color:transparent;}
.td-pill.no{background:color-mix(in srgb,var(--red,#ef4444) 15%,transparent);color:var(--red,#ef4444);border-color:transparent;}
.td-pill.maybe{background:color-mix(in srgb,var(--orange,#f0a11e) 16%,transparent);color:var(--orange,#f0a11e);border-color:transparent;}

/* Présences */
.td-presence-head{justify-content:space-between;}
.td-counts{display:flex;gap:7px;flex-wrap:wrap;}
.td-prow{display:flex;align-items:center;gap:12px;padding:11px 14px;border-bottom:1px solid var(--line);}
.td-prow:last-child{border-bottom:none;}
.td-pnm{font-weight:800;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;}
.td-avset{display:inline-flex;gap:6px;flex:0 0 auto;}
.td-av{font:inherit;font-weight:800;font-size:.82rem;cursor:pointer;border:1px solid var(--line);background:var(--panel2);
  color:var(--dim);padding:7px 12px;border-radius:var(--r-pill);transition:.12s;}
.td-av.on.yes{background:var(--fld);color:#fff;border-color:transparent;}
.td-av.on.maybe{background:var(--orange,#f0a11e);color:#fff;border-color:transparent;}
.td-av.on.no{background:var(--red,#ef4444);color:#fff;border-color:transparent;}

/* Lancers & récup */
.td-pitchrow{flex-wrap:wrap;}
.td-pit-main{display:flex;align-items:center;gap:9px;flex:1 1 160px;min-width:0;}
.td-cat{font-weight:800;font-size:.74rem;padding:3px 9px;border-radius:var(--r-pill);background:var(--panel2);color:var(--dim);border:1px solid var(--line);}
.td-pit-info{display:flex;flex-direction:column;gap:2px;flex:2 1 200px;min-width:0;}
.td-kv{color:var(--dim);font-weight:700;font-size:.84rem;}
.td-kv b{color:var(--txt);font-variant-numeric:tabular-nums;}
.td-status{font-weight:900;font-size:.78rem;padding:5px 12px;border-radius:var(--r-pill);flex:0 0 auto;}
.td-status.ok{background:color-mix(in srgb,var(--fld) 16%,transparent);color:var(--fld);}
.td-status.rest{background:color-mix(in srgb,var(--red,#ef4444) 15%,transparent);color:var(--red,#ef4444);}
/* Lancers & récup — alerte plafond + courbe de saison */
.td-pitchwrap{border-bottom:1px solid var(--line);}
.td-pitchwrap:last-child{border-bottom:none;}
.td-pitchwrap .td-pitchrow{border-bottom:none;}
.td-pit-btns{display:flex;align-items:center;gap:8px;flex:0 0 auto;}
.td-graphb.on{background:var(--blue);color:#fff;}
.td-limit-badge{display:inline-flex;align-items:center;gap:4px;font-weight:800;font-size:.72rem;padding:3px 9px;border-radius:var(--r-pill);}
.td-limit-badge svg{width:13px;height:13px;}
.td-limit-badge.near{background:color-mix(in srgb,var(--orange,#f59e0b) 16%,transparent);color:var(--orange,#f59e0b);}
.td-limit-badge.over{background:color-mix(in srgb,var(--red,#ef4444) 16%,transparent);color:var(--red,#ef4444);}
.td-pitchgraph{padding:6px 14px 16px;}
.td-pg-head{font-weight:800;font-size:.82rem;color:var(--dim);margin-bottom:8px;}
.pc-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
.pc-svg{display:block;height:130px;min-width:100%;}
.pc-bar{fill:var(--blue);}
.pc-bar.near{fill:var(--orange,#f59e0b);}
.pc-bar.over{fill:var(--red,#ef4444);}
.pc-val{fill:var(--txt);font-size:11px;font-weight:800;font-variant-numeric:tabular-nums;}
.pc-x{fill:var(--dim);font-size:9.5px;font-weight:700;}
.pc-ref{stroke:var(--red,#ef4444);stroke-width:1.5;stroke-dasharray:5 4;opacity:.75;}
.pc-reflbl{fill:var(--red,#ef4444);font-size:10px;font-weight:800;}

/* Convocation & relance (coach) */
.td-convoc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:12px;}
.td-convoc-badge{display:inline-flex;align-items:center;gap:6px;font-weight:800;font-size:.82rem;padding:5px 12px;border-radius:var(--r-pill);background:color-mix(in srgb,var(--blue) 15%,transparent);color:var(--blue);}
.td-convoc-badge svg{width:15px;height:15px;}
.td-convoc-count{font-weight:800;font-size:.82rem;padding:5px 12px;border-radius:var(--r-pill);}
.td-convoc-count.ok{background:color-mix(in srgb,var(--fld) 15%,transparent);color:var(--fld);}
.td-convoc-count.warn{background:color-mix(in srgb,var(--orange,#f59e0b) 16%,transparent);color:var(--orange,#f59e0b);}
.td-late{color:var(--red,#ef4444);}
.td-convoc-pending{margin-top:12px;font-size:.85rem;color:var(--dim);line-height:1.5;}
.td-convoc-pl{font-weight:800;color:var(--txt);}

/* Bannière de convocation (compte joueur, page dispos) */
.dispo-convoc{display:flex;align-items:center;gap:11px;padding:12px 14px;border-radius:14px;margin:0 0 12px;border:1px solid var(--line);}
.dispo-convoc .dc-ic{flex:0 0 auto;display:inline-flex;}
.dispo-convoc .dc-txt{display:flex;flex-direction:column;gap:2px;}
.dispo-convoc .dc-dl{font-size:.82rem;opacity:.85;font-weight:700;}
.dispo-convoc.urgent{background:color-mix(in srgb,var(--orange,#f59e0b) 15%,transparent);border-color:color-mix(in srgb,var(--orange,#f59e0b) 40%,transparent);color:var(--orange,#f59e0b);}
.dispo-convoc.urgent.relanced{background:color-mix(in srgb,var(--red,#ef4444) 15%,transparent);border-color:color-mix(in srgb,var(--red,#ef4444) 42%,transparent);color:var(--red,#ef4444);}
.dispo-convoc.done{background:color-mix(in srgb,var(--fld) 14%,transparent);border-color:color-mix(in srgb,var(--fld) 34%,transparent);color:var(--fld);}

/* Accueil équipe */
/* Accueil : les cartes de rendez-vous doivent respirer autant que celles de l'Agenda —
   l'espacement n'avait ete corrige que dans l'Agenda, les deux deplacements se touchaient ici. */
.th-next{cursor:pointer;}
.th-next+.th-next{margin-top:22px;}
.th-next-head{display:flex;align-items:center;gap:12px;margin-bottom:12px;}
.th-next-id{flex:1 1 auto;min-width:0;}
.th-next-opp{font-weight:900;font-size:1.2rem;overflow:hidden;text-overflow:ellipsis;}
.th-next-meta{color:var(--dim);font-weight:700;font-size:.86rem;margin-top:2px;}
.th-next-counts{display:flex;flex-wrap:wrap;gap:8px;}
.th-next-convoc{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:12px;}
.th-convoc-off{display:inline-flex;align-items:center;gap:6px;font-weight:700;font-size:.82rem;padding:5px 12px;border-radius:var(--r-pill);background:var(--panel2);color:var(--dim);border:1px solid var(--line);}
.th-convoc-off svg{width:15px;height:15px;}
.th-next-maps{margin-top:12px;}
.th-actions{margin:12px 0 4px;}
.td-pill.und{background:var(--panel2);color:var(--dim);}
.th-chips{display:flex;flex-wrap:wrap;gap:8px;padding:14px;}
.th-chip{display:inline-flex;align-items:center;gap:5px;font-weight:800;font-size:.86rem;padding:7px 13px;border-radius:var(--r-pill);border:1px solid var(--line);background:var(--panel2);}
.th-chip.yes{background:color-mix(in srgb,var(--fld) 13%,transparent);color:var(--fld);border-color:color-mix(in srgb,var(--fld) 30%,transparent);}
.th-chip.und{color:var(--dim);}
.th-chip .td-st-ic svg{width:13px;height:13px;}

/* Déplacements */
.td-meet{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.td-drow{display:flex;align-items:center;gap:12px;padding:11px 14px;border-bottom:1px solid var(--line);}
.td-drow:last-child{border-bottom:none;}
.td-dname{font-weight:800;flex:1 1 auto;}
.td-dseats{color:var(--dim);font-weight:700;font-size:.84rem;font-variant-numeric:tabular-nums;}
.td-adddrv{padding:12px 14px;}
.td-asel{flex:0 0 auto;min-width:140px;max-width:180px;}
/* Déplacements : lien Maps + sélecteur de mode */
.td-meet .td-fld2{grid-column:1/-1;}
.td-maps-row{grid-column:1/-1;display:flex;}
.td-maps{display:inline-flex;align-items:center;gap:6px;text-decoration:none;}
.td-maps svg{width:15px;height:15px;}
.td-mhead-maps{margin-top:6px;}
.td-modeseg{display:flex;width:100%;margin:0 0 4px;}
.td-modeseg button{flex:1 1 0;padding:10px 8px;}

/* Effectif — barre de filtres */
.td-filterbar{display:flex;flex-direction:column;gap:10px;margin-bottom:12px;}
.td-search .ui-input{width:100%;}
.td-filters{display:flex;flex-wrap:wrap;align-items:center;gap:8px;}
.td-filters .td-fsel{flex:0 1 auto;min-width:120px;max-width:200px;}
.td-sortlbl{font-weight:800;font-size:.82rem;color:var(--dim);margin-left:auto;}
.td-pos{font-weight:800;font-size:.74rem;padding:3px 9px;border-radius:var(--r-pill);background:color-mix(in srgb,var(--blue) 14%,transparent);color:var(--blue);border:1px solid color-mix(in srgb,var(--blue) 30%,transparent);}

/* Effectif & contacts */
.td-rrow{display:flex;align-items:center;gap:12px;padding:11px 14px;border-bottom:1px solid var(--line);}
.td-rrow:last-child{border-bottom:none;}
.td-rmain{display:flex;align-items:center;gap:9px;flex:1 1 auto;min-width:0;}
.td-jersey{font-weight:900;color:var(--accent);font-variant-numeric:tabular-nums;}
.td-rlinks{display:inline-flex;align-items:center;gap:8px;flex:0 0 auto;}
.td-link{font-size:1.1rem;text-decoration:none;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;
  border-radius:var(--r-pill);background:var(--panel2);border:1px solid var(--line);color:var(--accent);}

/* Détail d'un match (présences + covoiturage) + chevron agenda */
.td-chev{color:var(--dim);font-size:1.25rem;font-weight:700;margin-left:2px;}
.td-mhead{display:flex;align-items:center;gap:12px;margin-bottom:6px;}
.td-mhead-l{display:flex;align-items:center;gap:12px;flex:1 1 auto;min-width:0;}
.td-mhead-opp{font-weight:900;font-size:1.15rem;overflow:hidden;text-overflow:ellipsis;}
.td-mhead-meta{color:var(--dim);font-weight:700;font-size:.85rem;margin-top:2px;}

/* Infirmerie / blessures */
.td-inj{font-weight:800;font-size:.78rem;color:var(--red,#ef4444);white-space:nowrap;}
.td-inj.sm{font-size:.95rem;}
.td-injnote{color:var(--dim);font-weight:600;font-size:.8rem;}
.td-rrow.hurt{background:color-mix(in srgb,var(--red,#ef4444) 7%,transparent);}
.td-hurt-banner{border:1px solid color-mix(in srgb,var(--red,#ef4444) 35%,var(--line));background:color-mix(in srgb,var(--red,#ef4444) 6%,transparent);margin-bottom:12px;}
.td-hurt-h{font-weight:900;color:var(--red,#ef4444);margin-bottom:8px;}
.td-hurt-row{display:flex;align-items:center;gap:10px;padding:6px 0;border-top:1px solid var(--line);flex-wrap:wrap;}
.td-hurt-row:first-of-type{border-top:none;}
.td-hurt-row .td-pnm{flex:1 1 auto;min-width:0;}
/* 2 champs maillot côte à côte (domicile / extérieur) dans la modale contact */
.td-fld2{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.td-fld2 .td-fld{margin-bottom:12px;}

/* Pictogrammes (SVG, pas d'emoji) */
.td-sync .td-dot{width:9px;height:9px;border-radius:50%;background:var(--dim);display:inline-block;margin-right:7px;vertical-align:middle;}
.td-sync.on .td-dot{background:var(--fld);}
.iconb svg,.td-link svg,.btn svg,.date-btn svg,.comp-sub svg{width:16px;height:16px;flex:0 0 auto;vertical-align:middle;}
.btn svg{margin-right:6px;}
.td-status-ic{display:inline-flex;align-items:center;gap:5px;margin-left:2px;}
.td-st-ic{display:inline-flex;align-items:center;}
.td-st-ic.inj{color:var(--red,#ef4444);}
.td-st-ic.susp{color:var(--orange,#f0a11e);}
.td-st-ic.gone{color:var(--dim);}
.td-rrow.gone{opacity:.5;}
.td-rrow.gone .td-pnm{text-decoration:line-through;}
.comp-sub.st-inj,.comp-sub.st-susp{display:flex;align-items:center;gap:7px;}
.comp-sub.st-inj .td-st-ic{color:var(--red,#ef4444);}
.comp-sub.st-susp .td-st-ic{color:var(--orange,#f0a11e);}
.td-left{margin-top:6px;}

/* Champ date maison (ouvre le vrai calendrier) */
.date-btn{display:flex;align-items:center;justify-content:space-between;gap:10px;cursor:pointer;text-align:left;color:var(--txt);}
.date-btn .date-ph{color:var(--faint);}
.date-btn svg{color:var(--dim);}

/* Vrai calendrier */
.cal-modal{max-width:340px;}
.cal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px;}
.cal-title{font-weight:900;font-size:1.05rem;text-transform:capitalize;}
.cal-nav{width:36px;height:36px;}
.cal-wd{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:6px;}
.cal-wd span{text-align:center;font-weight:800;font-size:.72rem;color:var(--dim);text-transform:capitalize;}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;}
.cal-e{aspect-ratio:1;}
.cal-d{aspect-ratio:1;border:none;background:transparent;color:var(--txt);font:inherit;font-weight:700;border-radius:var(--r-sm);cursor:pointer;transition:.12s;}
.cal-d:hover{background:var(--rowHover);}
.cal-d.today{box-shadow:inset 0 0 0 1.5px var(--line2);}
.cal-d.on{background:var(--accent);color:#fff;}

/* Modale contact : sections séparées + corps défilable (jamais coupé) */
.contact-modal{max-height:88vh;display:flex;flex-direction:column;}
.contact-modal>.ui-title,.contact-modal>.ui-foot{flex:0 0 auto;}
.contact-body{overflow-y:auto;overflow-x:hidden;margin:0 -4px;padding:0 4px;}
.cm-sec{border-top:1px solid var(--line);padding-top:14px;margin-top:8px;}
.cm-sec:first-child{border-top:none;padding-top:0;margin-top:0;}
.cm-sec-h{font-weight:900;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--dim);margin:0 0 12px;}
.cm-sub{display:flex;align-items:center;gap:7px;font-weight:800;margin:14px 0 8px;font-size:.92rem;}
.cm-sub.st-inj .td-st-ic{color:var(--red,#ef4444);}
.cm-sub.st-susp .td-st-ic{color:var(--orange,#f0a11e);}
.cm-clear{margin-left:auto;color:var(--dim);}

/* Surlignage des lignes d'effectif selon le statut */
.td-rrow.hurt{background:color-mix(in srgb,var(--red,#ef4444) 9%,transparent);box-shadow:inset 3px 0 0 var(--red,#ef4444);}
.td-rrow.susp{background:color-mix(in srgb,var(--orange,#f0a11e) 11%,transparent);box-shadow:inset 3px 0 0 var(--orange,#f0a11e);}

/* Page publique de disponibilités (#/dispo/CODE) */
.dispo-wrap{width:min(720px,100%);margin:0 auto;padding:clamp(16px,3vw,26px) clamp(14px,3vw,22px) 60px;}
.dispo-head{display:flex;gap:14px;align-items:center;margin-bottom:18px;}
.dispo-match{margin-bottom:20px;}
.dispo-mhead{display:flex;gap:10px;align-items:center;margin-bottom:8px;}
.dispo-link{display:flex;gap:8px;align-items:center;}
.dispo-link input{flex:1 1 auto;margin:0;}
.dispo-foot{text-align:center;margin-top:18px;}
/* Compétitions suivies (choix par utilisateur) */
.fc-list{display:flex;flex-direction:column;gap:8px;}
.fc-row{display:flex;align-items:center;gap:10px;padding:11px 13px;border-radius:var(--r-sm,10px);background:var(--panel2);border:1px solid var(--line);cursor:pointer;}
.fc-row input{flex:0 0 auto;width:18px;height:18px;accent-color:var(--accent);}
/* La rangee n'est plus un <label> : elle contient le label cliquable ET un bouton de
   retrait. Imbriquer un <button> dans un <label> ferait basculer la case a cocher a
   chaque clic sur la croix. */
/* Selecteur de saison, a cote du selecteur de competition dans l'en-tete du classement.
   Toutes ses options font exactement 4 chiffres : `width:auto` lui donne donc la largeur
   juste, ni plus ni moins, sans avoir a deviner une valeur en pixels. Le `max-width` de
   .sel doit etre neutralise, sinon il l'emporterait sur ce calcul. */
/* Selecteur de saison : une annee fait TOUJOURS 4 chiffres, jamais plus ni moins.
   La regle generale `select.sel` reserve 40 px a droite pour sa fleche, ce qui gonflait
   la boite a 98 px pour 40 px de texte. On retire la fleche ici et on met un padding
   symetrique : la boite fait alors exactement le texte plus sa marge.
   Il FAUT ecrire `select.seasonsel` : `.seasonsel` seul perd en specificite contre
   `select.sel`, et le padding de 40 px l'emportait. */
select.seasonsel{width:auto;max-width:none;padding:11px 12px;text-align:center;
  background-image:linear-gradient(120deg,var(--panel2),var(--panel));}
.fc-lab{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0;cursor:pointer;}
.fc-x{flex:0 0 auto;width:44px;height:44px;margin:-11px -8px -11px 0;border:0;background:none;
  color:var(--faint);font-size:20px;line-height:1;cursor:pointer;border-radius:var(--r-sm,10px);}
.fc-x:hover,.fc-x:focus-visible{color:var(--red,#e5484d);background:var(--panel);}
.fc-nm{flex:1 1 auto;font-weight:800;min-width:0;}
.fc-n{flex:0 0 auto;color:var(--dim);font-weight:700;font-size:.8rem;font-variant-numeric:tabular-nums;}

/* Espace d'équipe (multi-clubs) */
.ts-list{display:flex;flex-direction:column;gap:8px;margin-bottom:4px;}
.ts-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 13px;border-radius:var(--r-sm,10px);background:var(--panel2);border:1px solid var(--line);}
.ts-row.on{border-color:color-mix(in srgb,var(--accent) 45%,transparent);background:color-mix(in srgb,var(--accent) 8%,transparent);}
.ts-info{display:flex;align-items:center;gap:9px;min-width:0;}
.ts-name{font-weight:800;overflow:hidden;text-overflow:ellipsis;}
.ts-role{font-weight:800;font-size:.68rem;padding:2px 8px;border-radius:var(--r-pill);}
.ts-role.adm{background:color-mix(in srgb,var(--blue) 15%,transparent);color:var(--blue);}
.ts-role.mem{background:var(--panel2);color:var(--dim);border:1px solid var(--line);}
.ts-active{font-weight:800;font-size:.72rem;color:var(--fld);}
.ts-code{margin-top:14px;padding-top:14px;border-top:1px solid var(--line);}

/* Carte « Mes stats » (espace joueur) */
.ms-card{display:flex;flex-direction:column;gap:16px;}
.ms-grp-t{font-weight:800;font-size:.82rem;color:var(--dim);margin-bottom:8px;letter-spacing:.02em;}
.ms-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(72px,1fr));gap:8px;}
.ms-tile{display:flex;flex-direction:column;align-items:center;gap:2px;padding:10px 6px;border-radius:var(--r-sm,10px);background:var(--panel2);border:1px solid var(--line);}
.ms-v{font-weight:900;font-size:1.05rem;font-variant-numeric:tabular-nums;}
.ms-k{font-weight:700;font-size:.68rem;color:var(--dim);letter-spacing:.02em;}
.ms-full{margin-top:2px;text-align:center;text-decoration:none;}
.dispo-me{margin-bottom:16px;border-left:3px solid var(--accent);}
.dispo-warn{margin-bottom:16px;border-left:3px solid var(--orange,#f0a11e);}
.dispo-signin{margin-bottom:18px;}
.dispo-signin-h{font-weight:900;font-size:1.02rem;}
.dispo-msg{margin:10px 0 0;color:var(--dim);}
.dispo-my{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:8px 0 10px;}
.dispo-my-l{font-weight:800;font-size:.9rem;}
.dispo-summary{padding:12px 14px;}
.dispo-grp{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;padding:4px 0;}
.dispo-grp + .dispo-grp{border-top:1px solid var(--line);}
.dispo-names{color:var(--dim);font-size:.86rem;}

/* Extras */
.td-items{display:flex;flex-direction:column;gap:8px;}
.td-item{display:flex;align-items:center;gap:10px;font-weight:700;}
.td-item span{flex:1 1 auto;}
.td-item input[type=checkbox]{width:20px;height:20px;accent-color:var(--accent);}
.td-notes{width:100%;min-height:110px;resize:vertical;text-align:left;line-height:1.5;font-family:inherit;}
.td-bar{flex:1 1 auto;height:8px;border-radius:var(--r-pill);background:var(--panel2);overflow:hidden;max-width:160px;}
.td-barfill{height:100%;background:var(--fld);border-radius:var(--r-pill);}

/* Champs de formulaire (modales du dashboard) — input aligné visuellement avec les boutons */
.td-fld{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;text-align:left;}
.td-fld>span{font-weight:800;font-size:.85rem;color:var(--dim);}
.td-fld .ui-input,.td-fld select{width:100%;margin:0;}
.td-check{flex-direction:row;align-items:center;gap:10px;}
.td-check input{width:20px;height:20px;accent-color:var(--accent);}
.btn.danger{background:color-mix(in srgb,var(--red,#ef4444) 88%,#000);color:#fff;}

@media (max-width:560px){
  .td-mrow{grid-template-columns:1fr auto;grid-template-rows:auto auto;column-gap:10px;}
  .td-mdate{grid-column:1;grid-row:1;}
  .td-mcnt{grid-column:2;grid-row:1;justify-self:end;}
  .td-mopp{grid-column:1 / -1;grid-row:2;min-width:0;flex-wrap:wrap;}
  .td-mopp>span:not(.badge){white-space:normal;overflow:visible;}
  .td-meet{grid-template-columns:1fr;}
  .td-prow{flex-wrap:wrap;}
  .td-avset{width:100%;justify-content:flex-start;}
  .td-pit-info{flex-basis:100%;}
  .td-asel{min-width:120px;}
  /* La barre de nav passe à 4 onglets : sur petit écran, items compacts + défilement
     horizontal en secours (max-width:100% évite tout débordement de la page). */
  .nav{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;max-width:100%;}
  .nav::-webkit-scrollbar{display:none;}
  .nav a{padding:10px 13px;font-size:.9rem;white-space:nowrap;flex:0 0 auto;}
}

/* ── Correctifs petits écrans (audit 2026-08-07) ─────────────────────────────
   Constatés à 375 px (iPhone SE/mini) et aggravés à 320 px :
   1) `.btn` est en `white-space:nowrap` : un libellé long (« Préparer un match
      contre <équipe> ») était COUPÉ au lieu de passer à la ligne.
   2) L'en-tête du détail d'un match ne pouvait pas rétrécir : le bloc interne
      n'avait pas `min-width:0`, donc la date+lieu forçait la largeur.
   3) Le sélecteur Batting/Pitching/Fielding débordait la page sous 360 px. */
@media (max-width:560px){
  /* Même spécificité que la règle `.btn,.btn.sm,.btn.xs` du design system (sinon elle gagne),
     et placée APRÈS elle : le texte passe à la ligne au lieu d'être rogné. */
  .btn,.btn.sm,.btn.xs{white-space:normal;}
  .td-mhead-l>div{min-width:0;}                   /* autorise l'ellipse du nom + de la ligne date/lieu */
  .td-mhead-meta{overflow:hidden;text-overflow:ellipsis;}
  /* `min-width:120px` forçait ce bouton à dépasser son conteneur (128 px) : on le laisse rétrécir. */
  .td-mhead-maps .btn,.td-mhead-maps .btn.xs{min-width:0;max-width:100%;}
  /* Une seule ligne : les boutons rétrécissent au lieu de passer à la ligne. */
  .toggle{max-width:100%;display:flex;}
  .toggle button{flex:1 1 0;min-width:0;padding-left:8px;padding-right:8px;}
  .acct-form{flex-wrap:wrap;}
  .acct-form .btn{flex:1 1 100%;white-space:normal;}
  /* Comparaison : plutôt défiler que rogner une valeur sur les très petits écrans. */
  .cmp-rows{overflow-x:auto;-webkit-overflow-scrolling:touch;}
}
/* Écrans très étroits (iPhone SE 1re génération, 320 px) : on resserre le bouton
   « Itinéraire », dont le rembourrage fixe le faisait déborder de son conteneur. */
/* Cohérence : tout bouton hérite de la police de l'application. Sans cela, les boutons
   qui affichent un caractère (ex. le « ✕ » de suppression d'un match) tombaient sur la
   police par défaut du navigateur (Arial), visiblement différente du reste. */
button{font-family:inherit;}
.iconb{font-weight:800;}

@media (max-width:360px){
  .td-mhead-maps .btn,.td-mhead-maps .btn.xs{padding:0 12px;gap:5px;font-size:.82rem;}
  /* L'en-tête (logo + nom + badge Domicile + crayon) ne tient plus sur une ligne :
     on le laisse passer à la ligne pour que le bloc nom/lieu retrouve toute la largeur. */
  .td-mhead{flex-wrap:wrap;}
  .td-mhead-l{flex:1 1 100%;}
}

/* Journal des erreurs (espace admin) — le visiteur ne voit jamais ce détail. */
.err-list{display:flex;flex-direction:column;gap:8px;max-height:340px;overflow-y:auto;}
.err-row{padding:10px 12px;border-radius:var(--r-sm,10px);background:var(--panel2);border:1px solid var(--line);}
.err-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px;}
.err-when{font-weight:800;font-size:.74rem;color:var(--dim);}
.err-n{font-weight:800;font-size:.7rem;padding:1px 7px;border-radius:var(--r-pill);background:color-mix(in srgb,var(--red,#ef4444) 16%,transparent);color:var(--red,#ef4444);}
.err-page{font-weight:700;font-size:.72rem;color:var(--blue);margin-left:auto;}
.err-msg{font-size:.84rem;line-height:1.45;word-break:break-word;}
.err-ctx{color:var(--dim);font-weight:700;}

/* Espace d'équipe : actions par ligne (choisir / quitter) */
.ts-acts{display:flex;align-items:center;gap:8px;flex:0 0 auto;}

/* Stats d'équipe : pastille de résultat V/D */
.ts-res{flex:0 0 auto;width:26px;height:26px;border-radius:var(--r-pill);display:inline-flex;align-items:center;justify-content:center;font-weight:900;font-size:.8rem;color:#fff;}
.ts-res.w{background:var(--fld);}
.ts-res.l{background:var(--red,#ef4444);}

/* Tuiles de stats : les libellés longs (« Points marqués/match ») doivent passer à la
   ligne au lieu d'être rognés sur les petits écrans. */
.ms-k{text-align:center;white-space:normal;line-height:1.25;overflow-wrap:anywhere;}
.ms-tile{min-width:0;}
@media (max-width:560px){ .ms-tiles{grid-template-columns:repeat(auto-fit,minmax(88px,1fr));} }

/* Page Match : « Nouveau match » et « Suivre un match » côte à côte sur écran large.
   Les cartes s'alignent en hauteur ; les matchs enregistrés restent en dessous. */
.match-top{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:stretch;}
.match-top>.card{margin:0;}
@media (max-width:820px){ .match-top{grid-template-columns:1fr;} }

/* ── Correctifs 2026-08-08 (retours iPhone) ────────────────────────────────
   1) La page pouvait glisser horizontalement sur iOS (balayage dans la barre
      d'onglets défilante) : le contenu apparaissait décalé vers la gauche.
      `overflow-x:clip` bloque ce glissement SANS casser les zones qui
      défilent volontairement à l'intérieur (nav, sous-onglets, tableaux). */
html,body{overflow-x:clip;max-width:100%;}

/* 2) Boutons d'en-tête dépareillés sur mobile : `justify-content:flex-end`
      + retour à la ligne alignait chaque bouton à droite avec des largeurs
      différentes. Sur petit écran on les empile, pleine largeur. */
@media (max-width:560px){
  .td-head{flex-direction:column;align-items:stretch;}
  .td-head>.btn,.td-head>.btn.sm,.td-head>.btn.xs{width:100%!important;}
}

/* Onglet Extras : repères en tête, progression de la check-list, présences colorées */
.ex-top{margin-bottom:12px;}
.ex-bar{height:8px;border-radius:var(--r-pill);background:var(--panel2);border:1px solid var(--line);overflow:hidden;margin-bottom:14px;}
.ex-fill{height:100%;background:var(--accent);transition:width .2s;}
.td-barfill.hi{background:var(--fld);}
.td-barfill.mid{background:var(--orange,#f59e0b);}
.td-barfill.lo{background:var(--red,#ef4444);}

/* Forme récente : les matchs avec box score sont cliquables */
.form-dot.link{text-decoration:none;cursor:pointer;transition:transform .12s;}
.form-dot.link:hover{transform:scale(1.12);}

/* Déplacement groupé (plusieurs matchs au même endroit) */
.trip-band{margin-bottom:12px;border-left:3px solid var(--accent);}
.trip-h{display:flex;align-items:center;gap:8px;font-weight:800;margin-bottom:10px;}
.trip-h svg{width:16px;height:16px;color:var(--accent);}
.trip-list{display:flex;flex-wrap:wrap;gap:8px;}
.trip-chip{font-weight:700;font-size:.82rem;padding:6px 11px;border-radius:var(--r-pill);background:var(--panel2);border:1px solid var(--line);}
.trip-chip.on{background:color-mix(in srgb,var(--accent) 14%,transparent);border-color:color-mix(in srgb,var(--accent) 40%,transparent);color:var(--accent);}
.td-meet .td-fld-wide{grid-column:1/-1;}

/* ── Finitions 2026-08-08 (retours captures) ─────────────────────────────── */
/* Présences : les trois boutons doivent avoir la MÊME largeur (Présent /
   Incertain / Absent ont des libellés de longueurs différentes). */
.td-avset{display:grid;grid-template-columns:repeat(3,minmax(84px,1fr));gap:6px;}
.td-av{width:100%;text-align:center;}

/* Survol d'une ligne d'agenda : le fond ignorait les angles de la carte.
   On arrondit, et la première/dernière ligne épouse le coin de la carte. */
.td-mrow{border-radius:var(--r-sm,10px);}
.reslist .td-mrow:first-child{border-top-left-radius:var(--r-lg,22px);border-top-right-radius:var(--r-lg,22px);}
.reslist .td-mrow:last-child{border-bottom-left-radius:var(--r-lg,22px);border-bottom-right-radius:var(--r-lg,22px);}

/* Espace entre les cartes qui se suivaient sans respiration. */
.trip-band{margin-top:14px;}
#tdTravel .td-meet{margin-bottom:4px;}

/* Détails du trajet : libellés longs sur deux lignes -> les champs se
   désalignaient. On aligne les colonnes par le bas. */
.td-meet .td-fld2{align-items:end;}
.td-meet .td-fld>span{min-height:2.4em;display:flex;align-items:flex-end;}

/* Agenda : carte de déplacement regroupant plusieurs matchs */
/* Deux déplacements distincts (ex. finale sur deux week-ends chez deux hôtes) ne doivent pas
   se toucher : 12 px entre deux cartes hautes les faisaient lire comme un seul bloc. */
.trip-card{margin-bottom:22px;border-left:3px solid var(--accent);}
.trip-card+.trip-card{margin-top:22px;}
.trip-head{display:flex;align-items:center;gap:9px;padding:13px 15px;border-bottom:1px solid var(--line);flex-wrap:wrap;}
.trip-head svg{width:16px;height:16px;color:var(--accent);flex:0 0 auto;}
.trip-head-t{font-weight:800;flex:1 1 auto;min-width:0;}
.trip-head-s{color:var(--dim);font-weight:700;font-size:.82rem;}
.reslist+.reslist{margin-top:12px;}

/* Accueil : ligne « déplacement groupé » + alerte de dispo incohérente */
.th-trip{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:12px;padding:9px 12px;border-radius:var(--r-sm,10px);
  background:color-mix(in srgb,var(--accent) 9%,transparent);color:var(--accent);font-weight:700;font-size:.84rem;}
.th-trip svg{width:15px;height:15px;flex:0 0 auto;}
.th-mixed-note{display:flex;align-items:center;gap:7px;margin:0 2px 8px;color:var(--orange,#f59e0b);font-weight:700;}
.th-mixed-note svg{width:15px;height:15px;flex:0 0 auto;}
.th-chip.mixed{border-color:color-mix(in srgb,var(--orange,#f59e0b) 55%,transparent);}
.th-warn{display:inline-flex;color:var(--orange,#f59e0b);}
.th-warn svg{width:13px;height:13px;}

/* ── Finitions 2026-08-09 ─────────────────────────────────────────────────── */
/* Accueil : la période du déplacement, sobre (le bandeau bleu faisait trop lourd). */
.th-trip-txt{margin-top:6px;color:var(--dim);font-weight:700;font-size:.84rem;}

/* Téléphone : les tuiles de bilan en 2×2 (elles tombaient en 3+1, déséquilibré). */
@media (max-width:560px){
  .ms-tiles{grid-template-columns:repeat(2,1fr);}
  .tt-grid{grid-template-columns:repeat(2,1fr);}
}

/* En-tête d'équipe sur téléphone : le logo tombait à 30 px ET passait seul sur sa
   ligne — il ressemblait à une vignette perdue. On le garde à côté du nom, à une
   taille lisible, et le bloc texte occupe le reste de la largeur. */
@media (max-width:560px){
  /* Le logo est COLLÉ AU NOM (il flotte à gauche) : le nom se place à côté, et les
     badges/infos reprennent toute la largeur en dessous. Le centrage vertical
     précédent décalait le texte et l'étirait sur trop de hauteur. */
  .td-hero{display:block;}
  .td-hero .tlogo{--sz:48px;width:48px;height:48px;}
}

/* ── Retours captures 2026-08-09 ─────────────────────────────────────────── */
@media (max-width:560px){
  /* Logo d'équipe sur la page Compétitions : il restait à 30 px, seul sur sa ligne.
     Ici le bloc contient un SÉLECTEUR (largeur propre) : on garde `wrap` mais on met
     le logo et le sélecteur sur la même ligne sans forcer le bloc à 0. */
  .hero{display:block;}
  .hero .tlogo{--sz:48px;width:48px;height:48px;float:left;margin:0 12px 6px 0;}
  .hero>.id{display:block;min-width:0;}
  .hero .meta{clear:left;}
  .hero-sel{max-width:100%;}

  /* Sélecteur Batting/Pitching/Fielding : centré et sur toute la largeur. */
  .toggle{width:100%;justify-content:center;}
  .toggle button{flex:1 1 0;}

  /* Hébergement : les deux champs de date se chevauchaient (grille sans espace). */
  .td-meet .td-fld2{grid-template-columns:1fr 1fr;gap:12px;align-items:end;}
  .td-meet .td-fld2>.td-fld{min-width:0;}
  .td-meet input[type=date]{width:100%;min-width:0;}
}
/* Forme récente cliquable (Mon équipe) */
a.td-prow.link{text-decoration:none;color:inherit;cursor:pointer;}
a.td-prow.link:hover{background:var(--rowHover);}

/* Onglet Stats de Mon équipe : sélecteur de discipline */
.td-statseg{display:flex;width:100%;margin-bottom:12px;}
.td-statseg button{flex:1 1 0;min-width:0;}
.td-detail-acts{margin-bottom:12px;}

/* En-tête « Mon équipe » : logo et nom sur une ligne, infos en dessous.
   Le nom peut contenir un mot très long (« Montigny-le-Bretonneux ») : on l'autorise
   à se couper plutôt que de le rejeter sous le logo. */
.td-hero-top{display:flex;align-items:center;gap:12px;margin-bottom:10px;}
.td-hero-top .tlogo{flex:0 0 auto;}
.td-hero-top .td-name{flex:1 1 auto;min-width:0;overflow-wrap:anywhere;line-height:1.15;}

/* Modale de création d'équipe */
.ct-modal{max-width:520px;width:min(520px,92vw);}
.ct-seg{display:flex;width:100%;margin-bottom:14px;}
.ct-seg button{flex:1 1 0;min-width:0;}
.ct-list{max-height:240px;overflow-y:auto;display:flex;flex-direction:column;gap:6px;margin-top:6px;}
.ct-list .pk-row.on{background:color-mix(in srgb,var(--accent) 15%,transparent);color:var(--accent);}
.ct-roster{min-height:120px;resize:vertical;font:inherit;}
/* Sélecteur d'espace dans « Mon équipe » */

/* ============ Catalogue des compétitions (Réglages → Parcourir) ============ */
.cat-modal{max-width:640px;width:min(94vw,640px);}
.cat-seg{margin:10px 0;}
.cat-list{max-height:52vh;overflow:auto;border:1px solid var(--line);border-radius:var(--r-md,14px);padding:6px;}
/* En-tete de pays : une pastille arrondie comme le reste de l'interface, et non une bande
   carree collee aux bords. `top:6px` la decale du padding de la liste pour que l'arrondi reste
   visible quand elle se fige au defilement. */
.cat-fed{position:sticky;top:6px;z-index:1;font-size:.7rem;font-weight:900;
  letter-spacing:.08em;text-transform:uppercase;color:var(--dim);
  background:var(--glass2,var(--bg2));border:1px solid var(--line);
  border-radius:var(--r-pill,999px);padding:7px 14px;margin:10px 2px 6px;
  -webkit-backdrop-filter:var(--blur);backdrop-filter:var(--blur);}
.cat-fed:first-child{margin-top:2px;}
.cat-n{color:var(--dim);font-weight:700;letter-spacing:0;}
.cat-row{display:flex;align-items:center;gap:10px;padding:9px 8px;border-radius:var(--r-sm,10px);cursor:pointer;}
.cat-row:hover{background:var(--rowHover);}
.cat-row input{flex:0 0 auto;}
.cat-nm{flex:1 1 auto;min-width:0;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* Une compétition pas encore récupérée est cochable, mais on dit franchement qu'elle n'est
   pas là : la cocher déclenche une demande, pas un affichage immédiat. */
.cat-tag{flex:0 0 auto;font-size:.7rem;font-weight:800;color:var(--faint);
  border:1px dashed var(--line2);border-radius:var(--r-pill,999px);padding:2px 9px;}
.cat-tag.ok{border-style:solid;color:var(--dim);}
.cat-row.pending .cat-nm{color:var(--dim);}
@media(max-width:560px){.cat-list{max-height:60vh;}.cat-tag{display:none;}}

/* Verdict de sante du robot : une couleur porte l'information au premier coup d'oeil. */
.ms-tile.pi-ok .ms-v{color:var(--green,#1e9c5f);}
.ms-tile.pi-warn .ms-v{color:var(--orange,#d98324);}
.ms-tile.pi-ko .ms-v{color:var(--red,#d2453c);}

/* ============ TÉLÉPHONE : pendant un match, l'écran sert à MARQUER ============
   Constat mesuré sur 390×844 : le bouton retour (44 px), le bandeau adversaire (192 px) et la
   barre d'onglets (60 px) repoussaient le tableau de score à 490 px — hors écran. Il fallait
   défiler pour voir le score au moment même de le saisir.
   Le bandeau répétait des informations déjà connues du scoreur (nom de l'adversaire, son
   bilan, la compétition, domicile/extérieur), et le tableau de score affiche déjà les deux
   équipes. On le réduit donc à une ligne, sans rien retirer d'indispensable : le nom reste,
   le bilan aussi. Uniquement sous 560 px et uniquement sur la page Match (`body.m-blue`). */
@media (max-width:560px){
  body.m-blue #toList{margin-bottom:6px !important;padding:6px 12px;font-size:.82rem;}
  body.m-blue .hero{padding:10px 14px;}
  body.m-blue .hero .hlab{display:none;}                 /* « Match · adversaire » : redondant */
  body.m-blue .hero .name{font-size:1.05rem !important;line-height:1.25;margin-top:0 !important;}
  /* Bilan conservé (utile), compétition et domicile/extérieur masqués : déjà lisibles ailleurs
     (le tableau de score nomme les deux équipes, et le camp se voit à l'ordre d'affichage). */
  body.m-blue .hero .meta{margin-top:4px;gap:6px;}
  body.m-blue .hero .meta .badge.info,
  body.m-blue .hero .meta .badge.ha{display:none;}
  body.m-blue .hero .meta .badge.rec{padding:1px 9px;font-size:.76rem;}
  body.m-blue #tabs{margin:10px 0 !important;}
  body.m-blue #tabs button{padding:8px 6px;font-size:.86rem;}
}

/* ============ TÉLÉPHONE : lignes « Espace d'équipe » ============
   `.ts-row` était en flex SANS retour à la ligne : sur 390 px, les boutons réclamaient 394 px
   dans une ligne de 320, ce qui écrasait le nom de l'équipe à 0 px de large (il passait sous
   les boutons) et faisait déborder « Quitter » hors de la carte. Comme pour `.lurow`, la
   solution est le retour à la ligne — surtout pas une grille à colonnes fixes. */
@media (max-width:560px){
  .ts-row{flex-wrap:wrap;row-gap:10px;}
  .ts-info{flex:1 1 100%;min-width:0;}
  .ts-name{overflow:hidden;text-overflow:ellipsis;}
  .ts-acts{flex:1 1 100%;flex-wrap:wrap;gap:8px;justify-content:flex-start;}
  .ts-acts .btn{flex:0 1 auto;}
}

/* ============ Bandeau de match FIXE au défilement (téléphone d'abord) ============
   Pendant la saisie on descend vers les actions et le play-by-play, et l'état du match
   (score, manche, retraits, compte) sortait de l'écran — or c'est précisément ce qu'on doit
   garder sous les yeux. Ce bandeau n'apparaît QUE lorsque le vrai tableau de score est sorti
   du champ, pour ne rien encombrer sinon. */
.m-sticky{
  position:fixed;left:0;right:0;top:0;z-index:60;display:none;
  align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;
  padding:7px 12px;font-weight:800;font-size:.88rem;
  background:var(--glass2,var(--panel));border-bottom:1px solid var(--line);
  -webkit-backdrop-filter:var(--blur);backdrop-filter:var(--blur);
  box-shadow:0 4px 14px rgba(0,0,0,.14);
}
.m-sticky.on{display:flex;}
.m-sticky .ms-t{color:var(--dim);font-weight:700;font-size:.78rem;}
.m-sticky .ms-s{font-size:1.15rem;font-weight:900;}
.m-sticky .ms-sep{color:var(--faint);}
.m-sticky .ms-x{color:var(--dim);font-size:.76rem;font-weight:700;
  border-left:1px solid var(--line2);padding-left:8px;margin-left:2px;}
/* Le bandeau du site (« VERSION BETA ») et la barre de nav sont au-dessus : on se place dessous. */
body.m-blue .m-sticky{top:0;}
.nextcard .nx-lab,.spraycard .nx-lab{font-size:.7rem;font-weight:900;letter-spacing:.08em;
  text-transform:uppercase;color:var(--faint);margin-bottom:8px;}
.spraycard .field-box{max-width:340px;margin:0 auto;}

/* ============ TÉLÉPHONE : les lignes passent À LA LIGNE plutôt que de s'écraser ============
   Principe retenu après plusieurs incidents (`.lurow`, `.ts-row`, et `.row` ci-dessous) : sur
   un écran étroit, une rangée à COLONNES FIXES ne peut pas rétrécir — c'est le contenu
   variable (un nom de joueur, un nom de club) qui est écrasé jusqu'à disparaître, ou les
   boutons qui débordent. Mesuré sur `.row` (grille `34px 1fr auto auto`) : avec un nom long,
   le dernier bouton tombait à 26 px de large.
   La solution qui a marché à chaque fois est le RETOUR À LA LIGNE, jamais une grille plus
   fine : le contenu long occupe sa ligne, les commandes passent en dessous. */
@media (max-width:560px){
  /* Sur écran étroit, le nom occupe sa propre ligne et les commandes passent en dessous. */
  .row > .who{flex:1 1 100%;}
}

/* ==========================================================================================
   ALLÈGEMENT VISUEL — ÉCRANS ÉTROITS
   Constat mesuré à 390×844 avant ce bloc : sur « Mon équipe », UN SEUL élément utile tenait
   dans le premier écran. L'échelle (titres, rembourrages, rayons de 30 px) et surtout les
   ombres (14 px de décalage, 40 px de flou empilés sur chaque carte) sont celles d'un iPad,
   appliquées telles quelles au téléphone — d'où la sensation de lourdeur.
   Trois leviers, uniquement sous 560 px, sans rien retirer de fonctionnel.
   ========================================================================================== */
@media (max-width:560px){
  /* ① ÉCHELLE — rayons et ombres.
     30 px de rayon sur une carte large de 358 px donne des coins très bombés qui rognent les
     angles utiles et grossissent la perception de chaque bloc. */
  :root,body[data-theme="light"],body[data-theme="dark"]{
    --r-lg:20px; --r-md:14px; --r-sm:11px; --r-xs:9px;
  }
  :root{ --shadow:0 4px 14px rgba(0,0,0,.30); --shadow-sm:0 2px 8px rgba(0,0,0,.22); }
  body[data-theme="light"]{ --shadow:0 3px 10px rgba(30,50,90,.10); --shadow-sm:0 1px 5px rgba(30,50,90,.07); }

  /* ② EN-TÊTES DE PAGE — ils répètent souvent ce que la navigation dit déjà. */
  .page-title{font-size:1.25rem;}
  .page-head{margin-bottom:10px;}
  .sec{margin:14px 0 8px;}
  .sec .t{font-size:.98rem;}
  .hero{padding:13px 15px;gap:11px;border-radius:var(--r-lg);}
  .hero .name{font-size:1.25rem !important;line-height:1.15;}
  /* Le tableau de bord d'équipe a son propre titre (`.td-name`) : même traitement, sinon il
     restait à 24 px et occupait trois lignes à lui seul. */
  .td-name{font-size:1.2rem !important;line-height:1.18;}
  .td-hero{padding:12px 14px;gap:10px;}
  .td-hero .tlogo{--sz:38px;width:38px;height:38px;}
  .hero .meta{margin-top:7px;gap:6px;}
  .badge{font-size:.76rem;padding:4px 9px;}

  /* ③ DENSITÉ — rembourrages des cartes et des rangées. */
  .card.pad{padding:13px 14px;}
  .row{padding:9px 12px;}
  .th-next{padding:13px 14px;}
  .btn{padding:9px 14px;}
  .btn.sm{padding:7px 12px;font-size:.84rem;}

  /* Le fond porte plusieurs halos radiaux : sur un petit écran ils se chevauchent et
     brouillent la lecture sans rien apporter. */
  body{background-attachment:scroll;}
}

/* ==========================================================================================
   HAUT D'ÉCRAN — récupérer la place perdue en décor
   Mesuré à 390×844 : le premier contenu réellement exploitable commençait à 379 px, soit 45 %
   de l'écran. Décomposition : bandeau bêta 36 px, barre logo+navigation 98 px (les deux
   empilées), en-tête de page 102 px, onglets 49 px.
   On ne retire QUE de la redondance : le titre de page répète l'onglet actif de la navigation,
   et le sous-titre répète le sélecteur de compétition placé juste à côté.
   ========================================================================================== */
@media (max-width:560px){
  /* ① Logo et navigation sur UNE seule ligne. Le mot « Flash Scout » est masqué — l'icône
     suffit à identifier l'application, et elle libère la largeur dont la navigation a besoin
     (celle-ci défile déjà horizontalement). */
  .topbar{flex-wrap:nowrap;gap:10px;padding:7px 12px;padding-top:max(7px,env(safe-area-inset-top));}
  .brand .btxt{display:none;}
  .brand{flex:0 0 auto;}
  .nav{order:0;margin-left:0;flex:1 1 auto;min-width:0;}

  /* ② Bandeau d'annonce : une bande fine suffit à informer, elle n'a pas à peser 36 px en
     permanence sur un petit écran. */
  .site-banner{padding:4px 12px;font-size:.72rem;font-weight:800;letter-spacing:.04em;}

  /* ③ En-tête de page : on garde ce qui sert (le sélecteur de compétition), on retire ce qui
     est déjà dit ailleurs (le titre = l'onglet actif ; le sous-titre = le sélecteur). */
  .page-head .page-title{display:none;}
  /* Le sous-titre annonce « Baseball · Division 2 · 10 équipes » juste au-dessus d'un
     sélecteur qui affiche déjà « Baseball · Division 2 » : seul le nombre d'équipes est
     nouveau, et il ne vaut pas une ligne d'écran. */
  .page-head .page-sub{display:none;}
  .page-head{margin-bottom:8px;gap:6px;}
  .compsel{width:100%;}

  /* Lignes de classement : les noms de club sur trois lignes gonflaient chaque rangée. On
     resserre l'interligne et le logo SANS tronquer les noms — ils restent lisibles en entier,
     ce qui avait été demandé explicitement pour les noms de joueurs. */
  .st-row,.st-headrow{gap:8px;}
  .st-row .st-nm{line-height:1.18;}
  .st-row .tlogo{--sz:26px;width:26px;height:26px;}
}

/* ============ NAVIGATION : les QUATRE onglets doivent être visibles ============
   La barre défile horizontalement : le dernier onglet (« Réglages ») était coupé, donc
   invisible tant qu'on ne devinait pas qu'il fallait faire glisser. Sur un écran étroit on
   resserre l'échelle des onglets pour que les quatre tiennent d'un coup — c'est la navigation
   principale, elle doit être découvrable sans geste. */
@media (max-width:560px){
  .nav{gap:2px;}
  /* Zone tactile : en resserrant les onglets, ils étaient tombés à 28 px de haut — trop peu
     pour un doigt. On les fait remplir la hauteur disponible (la barre n'en gagne que 5),
     ce qui est nettement plus confortable sans reprendre de place à l'écran. */
  .nav a{padding:9px 9px;font-size:.82rem;letter-spacing:-.2px;min-height:36px;display:flex;align-items:center;}
  .topbar{gap:7px;padding:4px 9px;padding-top:max(4px,env(safe-area-inset-top));}
  .brand .blogo{width:22px;height:22px;}
}
@media (max-width:380px){
  /* Très petits écrans : on descend encore d'un cran plutôt que de tronquer un onglet.
     La hauteur tactile, elle, est préservée. */
  .nav a{padding:9px 7px;font-size:.78rem;}
  .brand{display:none;}
}

/* ============ Zones tactiles : bascule MATCH / SAISON ============
   Ces boutons faisaient 19 px de haut — insuffisant pour un doigt, et on les utilise en plein
   match, debout, sur le terrain. Défaut préexistant, révélé par l'audit systématique des
   cibles tactiles. On les agrandit sur écran étroit sans changer leur apparence. */
@media (max-width:560px){
  .scope-seg button{padding:8px 11px;font-size:.66rem;min-height:30px;}
  .statcard .scope-seg{top:12px;right:12px;}
  .statcard .sc-head{padding-right:118px;}
}

/* ============ Fiche joueur : bandeau de profil + carrière (scrape_players.py) ============ */
.prof-bar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;margin:2px 0 12px;
  padding:11px 14px;background:var(--panel2);border:1px solid var(--line);border-radius:var(--r-sm,10px);}
.pf-num{font-weight:800;font-size:1.15rem;color:var(--accent);}
.pf-i{font-size:.88rem;color:var(--txt);}
.pf-i b{color:var(--dim);font-weight:600;margin-right:5px;font-size:.8rem;text-transform:uppercase;letter-spacing:.02em;}
/* La table déborde sur mobile : on la fait défiler DANS sa carte plutôt que la page entière. */
.car-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-top:10px;}
.car-tab{width:100%;border-collapse:collapse;font-size:.86rem;white-space:nowrap;}
.car-tab th,.car-tab td{padding:7px 9px;text-align:right;border-bottom:1px solid var(--line);}
.car-tab th{color:var(--dim);font-weight:600;font-size:.76rem;text-transform:uppercase;letter-spacing:.02em;}
.car-tab td.yr{font-weight:800;text-align:left;}
.car-tab th:nth-child(2),.car-tab td:nth-child(2),
.car-tab th:nth-child(3),.car-tab td.cat{text-align:left;}
.car-tab td.cat{color:var(--dim);max-width:190px;overflow:hidden;text-overflow:ellipsis;}
.car-tab td.avg{font-weight:700;color:var(--accent);}
.car-tab tfoot td{font-weight:800;border-top:2px solid var(--line2);border-bottom:0;background:var(--panel2);}

/* Petite finale : le vainqueur prend la 3e place, pas le titre. On le marque comme un podium
   (bronze) sans la mise en avant réservée au champion. */
.st-row.third{background:linear-gradient(90deg,color-mix(in srgb,#cd7f32 12%,transparent),transparent);}
.st-row.third .st-rank{color:#cd7f32;font-weight:800;}

/* ==========================================================================================
   TÉLÉPHONE — ERGONOMIE MESURÉE (audit page par page à 375×812)
   Quatre défauts constatés à la mesure, pas à l'estime. Aucun changement de balisage, aucun
   effet au-dessus de 560 px : tout ce bloc relève de la présentation.
   ========================================================================================== */

/* ① ÉCRAN DE SCORE — les commandes venaient APRÈS deux écrans de statistiques.
   Mesuré sur un match réel : le premier bouton d'action (« 1B ») commençait à 1 284 px pour
   une fenêtre de 812 px. Il fallait donc défiler une fois et demie avant de pouvoir noter le
   moindre lancer — sur le terrain, debout, à une main.
   Décomposition de #body : tableau d'affichage 283 px, PUIS statistiques frappeur + lanceur
   530 px, PUIS les actions. Les statistiques sont de la consultation, les actions sont le
   travail : sur téléphone on remet le travail devant.
   Aucun élément n'est retiré ni déplacé dans le HTML — seul l'ordre visuel change, et
   uniquement sous 560 px. */
@media (max-width:560px){
  #body{display:flex;flex-direction:column;gap:14px;}
  #body>*+*{margin-top:0;}          /* l'écart est repris par `gap` */
  #body>#sbCard   {order:1;}        /* le score et le compte : le contexte */
  #body>#actions  {order:2;}        /* les boutons de saisie : l'essentiel */
  #body>#fsNext   {order:3;}        /* le frappeur suivant, utile pendant l'action */
  #body>.statduo  {order:4;}        /* statistiques : consultation */
  #body>#sprayNow {order:5;}
  #body>*         {order:6;}        /* le reste conserve sa position relative */
}

/* ② ONGLETS DE CONTENU — la barre DÉFILE, elle ne se replie pas.
   Deux tentatives écartées à l'usage : le passage à la ligne (la capsule se refermait autour de
   deux rangées et donnait un bloc informe), puis un dégradé de bord censé signaler qu'il reste
   des onglets hors champ. Ce dernier alourdissait la barre plus qu'il n'informait — retiré.
   Le geste ne change pas : la barre défile, et l'onglet actif est ramené au centre. */
@media (max-width:560px){
  .champtabs button{min-height:40px;}
}

/* ③ APPEL ET BANC — la case à cocher se retrouvait SEULE au-dessus du nom.
   Cause : la règle générale « sur écran étroit, le nom prend sa ligne » (`.row > .who`) a été
   écrite pour les rangées dont la commande SUIT le nom. Quand la commande OUVRE la rangée —
   la case de l'appel, le bouton du banc — la même règle isole ce contrôle sur une ligne vide
   et double la hauteur : 88 px par joueur mesurés, soit 1 760 px de défilement pour appeler
   un effectif de vingt. On rétablit l'alignement sur une seule ligne pour ces deux cas. */
@media (max-width:560px){
  .appel-row>.who,.benchrow>.who{flex:1 1 auto;}
}

/* ④ ZONES TACTILES restées sous le seuil du doigt, relevées sans changer l'apparence.
   `.back` : 17 px de haut, aucun rembourrage — c'est pourtant le retour de chaque fiche.
   `.hero-sel` : 20 px — c'est le sélecteur d'équipe, en tête de la fiche équipe.
   La marge basse de `.back` est réduite d'autant : la page ne s'allonge pas. */
@media (max-width:560px){
  .back{padding:9px 4px 9px 0;margin-bottom:5px;min-height:40px;}
  .hero-sel{padding-top:9px;padding-bottom:9px;min-height:40px;}
}

/* ⑤ EN-TÊTE DE PAGE — le nom de compétition était coupé en plein mot.
   « Baseball · Division 1 » s'affichait « Baseball · Divisi ». Cause : le sélecteur d'année et
   celui de compétition partagent une rangée en `flex:1 1 0%` (via `.sel` du bloc 620 px), donc
   la place est partagée À PARTS ÉGALES sans regarder le contenu — 150 px pour quatre chiffres,
   188 px pour un intitulé qui en demande 240.
   La règle `select.seasonsel{width:auto}` juste au-dessus visait déjà ce calage, mais `flex:1`
   la neutralisait. On rend donc l'année incompressible à sa largeur naturelle (67 px mesurés)
   et on laisse la compétition prendre le reste (300 px) : plus rien n'est tronqué. */
@media (max-width:560px){
  /* Une seule rangée : sur téléphone l'en-tête ne contient QUE ces deux menus (le titre et le
     sous-titre y sont masqués), donc interdire le retour à la ligne ne peut rien pousser
     dehors. Sans cela les deux menus totalisent 367 px pour 341 disponibles et se dépilent :
     avec `flex-wrap`, un élément passe à la ligne AVANT de se comprimer. */
  .page-head{flex-wrap:nowrap;}
  .page-head .compsel{flex:1 1 auto;width:auto;min-width:0;max-width:none;}
  .page-head select.seasonsel{flex:0 0 auto;width:auto;min-width:0;}
}

/* ⑥ « MEILLEUR FRAPPEUR / LANCEUR » — le nom du joueur était le seul à être écrasé.
   Mesuré sur une rangée de 313 px : l'étiquette prend 123 px et la valeur 87 px, toutes deux
   en `flex:0 0 auto` donc incompressibles ; il restait 53 px au nom, réduit à « I. A… ».
   La priorité était inversée : le nom EST le sujet de la ligne, la valeur et l'étiquette ne
   sont que sa qualification. L'étiquette a déjà un style de légende (.64rem, majuscules,
   atténuée) — on la passe simplement sur sa propre ligne. Le nom dispose alors de ~215 px et
   s'affiche en entier, pour deux rangées et une trentaine de pixels de hauteur en plus. */
@media (max-width:560px){
  .tt-best-row{flex-wrap:wrap;row-gap:2px;}
  .tt-best-lbl{flex:1 1 100%;}
}

/* ⑦ PAGES AUTONOMES — leur titre disparaissait sur téléphone.
   La règle « le titre de page répète l'onglet actif » (bloc « HAUT D'ÉCRAN » plus haut) vaut
   dans l'application, où la navigation nomme déjà l'écran. Les mentions légales et la
   politique de confidentialité, elles, sont des pages servies seules : leur navigation ne
   contient que « Retour à l'app ». Le titre y est donc le SEUL repère — et il était masqué,
   sur deux pages précisément soumises à une obligation d'information. On le rétablit. */
@media (max-width:560px){
  .page-head-solo .page-title{display:block;font-size:1.25rem;}
}

/* ⑧ ACTION PRINCIPALE DE CARTE — `.block` ne faisait plus rien, d'où un bouton collé à gauche.
   Historique : `.btn.block{width:100%}` rendait le bouton pleine largeur. Le bloc « TAILLE DE
   BOUTON UNIFORME » a plus tard imposé `width:auto!important` à TOUS les boutons — décision
   volontaire — ce qui a neutralisé `.block` sans retirer la classe. Résultat : les cinq
   actions principales du site retombaient au bord gauche de leur carte, alors que le bouton
   voisin « Suivre un match » est centré par un parent en flex. Deux boutons principaux, deux
   alignements, sur le même écran.
   On redonne à `.block` un sens compatible avec la règle uniforme : non plus « pleine
   largeur », mais « centré dans sa carte ». La largeur reste celle du texte. */
.btn.block{display:flex;width:fit-content!important;margin-left:auto;margin-right:auto;}

/* ⑨ SÉLECTEURS SEGMENTÉS — une seule étiquette longue gonflait toute la barre.
   Cause : `.seg button{flex:1 1 0}` (bloc 560 px plus haut) impose des colonnes ÉGALES sans
   regarder le contenu. Sur l'écran de match, « Score en direct » ne tenait pas dans son tiers
   (108 px) et passait sur deux lignes ; « Line-up » et « Récap », qui n'en demandaient qu'une,
   étaient alignés sur cette hauteur. Résultat : 59 px pour trois mots — et le défaut n'apparaît
   QUE si une étiquette dépasse, d'où son côté intermittent.
   Même cause racine que les sélecteurs année/compétition traités en ⑤ : une base de 0 ignore
   le texte. On passe la base à `auto` — chaque bouton part de sa largeur naturelle puis se
   partage le reste. Mesuré après : la barre tombe à 50 px sur une seule ligne, et le sélecteur
   d'équipes (« Béziers Pirates » / « Savigny-sur-Orge Lions ») cesse lui aussi de se plier en
   deux, sans aucun débordement.
   Le retour à la ligne reste possible : si les intitulés dépassent vraiment, ils se replient
   proportionnellement au lieu d'être écrasés à parts égales. `min-height` garantit la cible
   tactile, que le texte tienne sur une ligne ou deux. */
@media (max-width:560px){
  .seg button{flex:1 1 auto;min-height:40px;}
}

/* ⑩ TABLEAU DE BORD — le titre EST le sélecteur d'espace.
   Le nom d'équipe était affiché en titre, puis répété à l'identique dans un menu déroulant
   placé juste en dessous. On supprime la répétition : le titre porte le chevron et ouvre la
   liste, comme sur la fiche équipe. `.hero-sel` fournit déjà l'apparence (fond transparent,
   pas de bordure, chevron à droite) ; il ne reste qu'à lui rendre la taille du titre, que la
   règle générale des `select` ramenait à la taille d'un champ. */
.td-name-sel{position:relative;padding-right:26px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%238ea0bd' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right center;}
/* Le menu couvre tout le titre et reste invisible : c'est lui qui reçoit le geste, donc la
   liste native s'ouvre en touchant le nom, où qu'on le touche. */
.td-name-sel select{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;
  font:inherit;-webkit-appearance:none;appearance:none;border:0;background:transparent;}
.td-name-sel:focus-within{outline:2px solid var(--accent);outline-offset:4px;border-radius:6px;}

/* ⑪ RÉGLAGES — une seule règle d'alignement pour les actions.
   `align-self:center` (bloc « TAILLE DE BOUTON UNIFORME ») centre un bouton dès qu'il se
   trouve dans une colonne étirée. Dans les Réglages, où tout le reste — libellés, cases,
   rangées de boutons — est aligné à gauche, cela produisait un bouton centré au milieu de
   voisins alignés à gauche. On aligne à gauche, comme la page. */
.acct-form .btn{align-self:flex-start;}

/* ==========================================================================================
   BARRE D'ONGLETS (téléphone) — la navigation passe en bas, à portée du pouce
   Motif iOS : trois à cinq destinations, icône + libellé, barre fixe au ras du bord bas.
   QUATRE onglets ici, comme la navigation qu'elle remplace : l'application n'a pas de
   cinquième destination de premier niveau (l'administration est réservée au propriétaire, le
   suivi en direct et la comparaison s'ouvrent depuis une page). Une barre à quatre est prévue
   par le motif ; en inventer une cinquième aurait été remplir un trou plutôt que naviguer.
   Au-dessus de 560 px la barre du haut reprend la main : une barre d'onglets basse n'a pas de
   sens sur un écran large, où le pouce n'atteint pas le bas.
   ========================================================================================== */
.tabbar{display:none;}
@media (max-width:560px){
  /* La barre du haut disparaît entièrement : elle ne portait plus que le logo, soit 45 px de
     décor permanent en haut d'un écran où chaque ligne compte.
     UNIQUEMENT là où la barre d'onglets existe : les mentions légales et la politique de
     confidentialité chargent la même feuille de style mais sont servies seules, et leur barre
     du haut porte leur seul lien de retour. Le test se fait donc sur la présence de la barre
     basse — et s'il échoue, la barre du haut reste affichée : on duplique la navigation plutôt
     que de la supprimer. */
  body:has(.tabbar) .topbar{display:none;}
  .tabbar{
    display:flex; position:fixed; left:0; right:0; bottom:0; z-index:60;
    background:color-mix(in srgb,var(--bg2) 88%,transparent);
    -webkit-backdrop-filter:saturate(180%) blur(20px); backdrop-filter:saturate(180%) blur(20px);
    border-top:1px solid var(--line);
    padding:6px 4px max(6px,env(safe-area-inset-bottom));
  }
  .tabbar a{
    flex:1 1 0; min-width:0; display:flex; flex-direction:column; align-items:center; gap:3px;
    padding:5px 2px; color:var(--faint); text-decoration:none;
    font-size:.62rem; font-weight:700; letter-spacing:-.1px; line-height:1.1;
    transition:color .15s;
  }
  .tabbar a svg{
    width:25px; height:25px; flex:0 0 auto;
    fill:none; stroke:currentColor; stroke-width:1.7; stroke-linecap:round; stroke-linejoin:round;
  }
  /* Le libellé est étroit : on le laisse rétrécir plutôt que déborder sur l'onglet voisin. */
  .tabbar a span{max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
  .tabbar a.on{color:var(--accent);}
  .tabbar a:active{transform:scale(.92);}

  /* Le contenu doit pouvoir défiler AU-DESSUS de la barre, sinon elle masque la fin de page
     (mentions légales, dernier joueur d'un effectif, dernier bouton d'un formulaire). */
  /* Le pied de page doit passer AU-DESSUS de la barre d'onglets, pas dessous. Mesuré : les
     liens « Mentions légales » et « Confidentialité » finissaient à 838 px alors que la barre
     commence à 790 — ils étaient donc recouverts, et ce sont précisément les deux liens qu'on
     doit pouvoir atteindre. Le rembourrage du CORPS ne suffisait pas : c'est au pied lui-même
     de réserver la hauteur de la barre (62 px) plus le retrait de l'indicateur d'accueil. */
  body:has(.tabbar){padding-bottom:0;}
  body:has(.tabbar) .foot{padding-bottom:calc(78px + env(safe-area-inset-bottom));}

  /* Plein écran de match et écran d'accès verrouillé : aucune navigation, comme la barre
     du haut qu'elle remplace. */
  body.fs .tabbar, body.gated .tabbar{display:none;}
  body.fs{padding-bottom:0;}
}

/* `.m-head` n'existe QUE pour donner une prise à l'apparence « planche » (styles-v2.css), qui
   en fait une bande sombre pleine largeur. Ici elle ne doit rien changer : `display:contents`
   la retire de la mise en page, ses trois enfants restent exactement où ils étaient. */
.m-head{display:contents;}

/* ============ Fiche joueur : évaluation « 5 outils » (échelle 20-80) ============
   Une rangée par outil : intitulé, barre, note, et un curseur POSÉ SUR la barre — invisible
   mais actif, ce qui donne une cible tactile de la largeur entière plutôt qu'un petit bouton
   de curseur natif. La note reste lisible pendant qu'on fait glisser. */
.tool-row{display:grid;grid-template-columns:88px 1fr 34px;align-items:center;gap:10px;
  position:relative;padding:7px 0;}
.tool-nm{font-weight:800;font-size:.86rem;color:var(--dim);}
.tool-bar{height:8px;border-radius:999px;background:var(--panel2);border:1px solid var(--line);overflow:hidden;}
.tool-fill{display:block;height:100%;background:var(--accent);transition:width .1s;}
.tool-v{font-weight:900;font-size:.92rem;text-align:right;font-variant-numeric:tabular-nums;color:var(--txt);}
/* Le curseur couvre la rangée entière : on règle en glissant n'importe où sur la ligne. */
.tool-in{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;margin:0;}
.tool-row:focus-within .tool-bar{border-color:var(--accent);}
@media (max-width:560px){ .tool-row{grid-template-columns:76px 1fr 30px;gap:8px;} }

/* Colonnes « Diff » et « 5 derniers » du classement : rendues dans le HTML mais MASQUÉES par
   défaut. Elles ne s'affichent que sur grand écran et seulement sur l'apparence « planche »
   (cf. styles-v2.css) — l'apparence d'origine reste exactement ce qu'elle était. */
.st-x{display:none;}

/* ============ Bouton « avertissement » : coloré, mais pas destructeur ============
   `.danger` (rouge plein) est réservé aux actes irréversibles — quitter une équipe, supprimer.
   Se déconnecter n'est ni l'un ni l'autre : on le distingue par la couleur SANS lui donner le
   poids d'un bouton plein, sinon les deux actions se ressemblent alors qu'elles n'engagent pas
   du tout la même chose. */
.btn.warn{color:var(--red);border-color:color-mix(in srgb,var(--red) 40%,transparent);
  background:color-mix(in srgb,var(--red) 8%,transparent);}
.btn.warn:hover{background:color-mix(in srgb,var(--red) 15%,transparent);}

/* ============ COMPOSITION ET BANC : rangées lisibles ============
   Trois défauts constatés à la mesure sur un iPhone (393 px) :
   ① la rangée de composition faisait 147 px de haut. La règle générale « le nom prend sa
      ligne » (`.row > .who`, plus bas dans le fichier) écrasait celle de `.lurow` — même
      spécificité, déclarée après — et éjectait le nom sous le numéro. Le nom revient donc à
      côté de son numéro, comme sur une vraie feuille de match ;
   ② les quatre commandes avaient TROIS hauteurs différentes (numéro 38, poste 42, icônes 34),
      ce qui donnait une rangée en dents de scie. Elles sont toutes calées sur 40 px ;
   ③ sur le banc, un `<span>` vide réservait 26 px devant chaque nom (retiré du HTML) et le
      bouton passait à la ligne dès qu'un nom était long. Il reste désormais à droite, le nom
      se repliant à sa gauche. */
/* ② s'applique à TOUTES les largeurs : sur iPad et sur Mac les quatre commandes mesuraient
   encore 37, 41 et 38 px. Une rangée de commandes ne se lit bien que si elles sont d'aplomb. */
.lurow > .jersey,
.lurow > .possel{height:40px;min-height:40px;padding-top:0;padding-bottom:0;}
.lurow .iconb{width:40px;height:40px;}

@media (max-width:560px){
  /* Le nom occupe TOUTE la place restante de la première ligne, moins la poignée et le numéro
     (60 px). Conséquence voulue : le champ « # » ne tient plus à côté et bascule sur la ligne
     suivante, avec le poste et les deux icônes. Sans cela il restait seul en haut à droite,
     séparé des trois commandes auxquelles il appartient. */
  .lurow > .who{flex:1 1 calc(100% - 60px);min-width:0;}

  /* Banc : le nom occupe la place libre, le bouton reste ancré à droite. */
  .benchrow{flex-wrap:nowrap;justify-content:space-between;padding:12px;}
  .benchrow > .who{flex:1 1 auto;min-width:0;}
  .benchrow > .who .nm{overflow-wrap:anywhere;}
  .benchrow > .btn,.benchrow > .outtag{flex:0 0 auto;margin-left:10px;}
}

/* Le sélecteur de mode portait un texte sombre pensé pour un fond orange ou vert clair
   (`#2a1400`, `#04240f`). Les trois modes partagent désormais la couleur d'accent : le texte
   repasse en blanc, seule valeur lisible sur un aplat d'accent quel qu'il soit. */
body[data-mode="pit"] .toggle button.on,
body[data-mode="fld"] .toggle button.on{color:#fff;}

/* ============ RANGÉES DE BOUTONS : des parts égales, pas des largeurs de texte ============
   Sur un téléphone, deux boutons côte à côte doivent occuper une moitié chacun. Tant qu'ils
   étaient dimensionnés par leur texte, la rangée était bancale — « Se déconnecter » contre
   « Changer d'e-mail », « Copier le code » contre « Choisir » — et le troisième bouton partait
   se coller n'importe où.
   La grille règle les deux à la fois : colonnes égales, et une commande seule sur sa ligne
   prend toute la largeur plutôt que de flotter. `width:auto` suffit à remplir la cellule (les
   éléments de grille s'étirent par défaut), ce qui contourne le `width:auto!important` de la
   règle de taille uniforme sans la contredire.
   Au-dessus de 560 px, les boutons retrouvent leur largeur de texte : la place ne manque plus. */
@media (max-width:560px){
  .btn-row,.ts-acts{display:grid;grid-template-columns:1fr 1fr;gap:8px;align-items:stretch;}
  .btn-row > .btn,.ts-acts > .btn{width:auto;min-width:0;}
  .btn-row > .btn:last-child:nth-child(odd),
  .ts-acts > .btn:last-child:nth-child(odd){grid-column:1 / -1;}
  /* Un libellé trop long pour sa moitié se replie au lieu de déborder. */
  .btn-row > .btn,.ts-acts > .btn{white-space:normal;line-height:1.15;}
}

/* ============ FAVORIS ============
   Une étoile sur la fiche d'une équipe ou d'un joueur, et un bandeau de raccourcis en tête de
   l'accueil. Local à l'appareil : c'est un confort de navigation, pas une donnée partagée. */
/* L'étoile est posée à côté du sélecteur Batting/Pitching/Fielding : elle doit faire la MÊME
   hauteur que lui, sinon la rangée paraît de guingois. `.toggle` mesure 56 px (deux fois son
   rembourrage de 5 px plus un bouton de 46) ; on aligne dessus au lieu d'un carré de 40. */
.favbtn{flex:0 0 auto;width:56px;height:56px;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--line);background:var(--panel2);border-radius:var(--r-md,14px);cursor:pointer;
  color:var(--faint);transition:.14s;align-self:center;}
.favbtn svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linejoin:round;}
.favbtn:hover{color:var(--txt);background:var(--btnHover);}
/* En favori : l'étoile se remplit. La couleur suit l'accent choisi — un seul accent partout. */
.favbtn.on{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 40%,transparent);
  background:color-mix(in srgb,var(--accent) 10%,transparent);}
.favbtn.on svg{fill:currentColor;}
.fiche-acts{display:flex;align-items:center;gap:8px;flex:0 0 auto;}

.favstrip{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 2px 12px;}
.fav-lbl{font-size:.66rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);}
.fav-chip{padding:7px 12px;border-radius:var(--r-sm,10px);background:var(--panel);border:1px solid var(--line);
  font-weight:800;font-size:.86rem;color:var(--txt);white-space:nowrap;}
.fav-chip:hover{border-color:var(--accent);color:var(--accent);}
@media (max-width:560px){
  /* Sur téléphone le sélecteur de mode s'étire sur toute la largeur et l'étoile se retrouve
     seule sur sa ligne : elle reprend alors une taille de bouton ordinaire. */
  .favbtn{width:44px;height:44px;}
  /* Le bandeau défile plutôt que de s'empiler : il ne doit pas repousser le classement. */
  .favstrip{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .favstrip::-webkit-scrollbar{display:none;}
  .fav-chip,.fav-lbl{flex:0 0 auto;}
}

/* ============ LA JOURNÉE — direct, résultats et à-venir du jour (planche 1a) ============
   Reprise fidèle de la planche : UNE carte pour la journée, dont chaque rencontre est une
   ligne. Le direct n'est pas un bandeau à part, c'est une ligne avec un fond — l'état se lit
   à la teinte et à la pastille, pas à un cadre supplémentaire.

   Le rouge est ici SIGNIFIANT (« ça se joue maintenant ») et non décoratif : c'est la seule
   raison pour laquelle il échappe à la règle de la couleur d'accent unique.

   L'équipe en tête garde l'encre pleine, celle qui suit est atténuée : on lit qui mène sans
   comparer les deux chiffres. */
.jn{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:6px;margin:0 0 14px;}
.jn-h{padding:8px 10px 4px;font-size:.6rem;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);}
.jn-row{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--r-md);
  color:inherit;text-decoration:none;}
.jn-row.link{cursor:pointer;}
.jn-row.link:hover{background:var(--rowHover);}
/* La rencontre en cours : un lavis, pas un cadre. */
.jn-row.live{background:color-mix(in srgb,var(--red) 9%,transparent);}
.jn-row.live:hover{background:color-mix(in srgb,var(--red) 14%,transparent);}
.jn-teams{flex:1 1 auto;min-width:0;display:block;}
.jn-t{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-weight:800;font-size:.9rem;}
.jn-t + .jn-t{margin-top:3px;}
/* Celle qui suit au score s'efface — d'un cran seulement quand ça se joue encore, davantage
   quand c'est joué : un retard en cours de match n'est pas un verdict. */
.jn-t.dim{color:var(--faint);}
.jn-row.live .jn-t.dim{color:var(--dim);}
.jn-nm{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.jn-sc{flex:0 0 auto;font-size:.98rem;font-variant-numeric:tabular-nums;}
.jn-bar{flex:0 0 auto;width:1px;height:30px;background:var(--line);}
.jn-row.live .jn-bar{background:color-mix(in srgb,var(--red) 22%,transparent);}
.jn-state{flex:0 0 auto;width:70px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:4px;}
.jn-pill{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:8px;
  background:var(--red);color:#fff;font-size:.58rem;font-weight:800;letter-spacing:.04em;
  text-transform:uppercase;white-space:nowrap;}
.jn-dot{width:5px;height:5px;border-radius:50%;background:#fff;animation:jnpulse 1.6s ease-in-out infinite;}
@keyframes jnpulse{0%,100%{opacity:1}50%{opacity:.35}}
.jn-when{font-size:.66rem;font-weight:700;color:var(--faint);line-height:1.3;}
.jn-when.live{color:var(--red);font-weight:800;}
.jn-when.strong{color:var(--txt);font-weight:800;font-size:.72rem;}
/* Le battement s'arrête si l'utilisateur a demandé moins d'animations (réglage système). */
@media (prefers-reduced-motion:reduce){ .jn-dot{animation:none;} }
@media(max-width:380px){
  .jn-state{width:62px;}
  .jn-t{font-size:.84rem;}
}

/* ============ RECHERCHE GLOBALE ============
   Une loupe dans l'en-tête, à côté des menus. Elle ouvre une fenêtre qui balaie toutes les
   compétitions suivies — équipes et joueurs — et bascule sur la bonne avant d'ouvrir la fiche. */
.srchbtn{flex:0 0 auto;width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--line);background:var(--panel);border-radius:var(--r-sm,10px);cursor:pointer;
  color:var(--dim);transition:.14s;}
.srchbtn svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;}
.srchbtn:hover{color:var(--accent);border-color:var(--accent);}
/* Intitulés de section dans la liste de résultats (Équipes / Joueurs). */
.sq-h{font-size:.66rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);
  margin:10px 2px 4px;}
.sq-h:first-child{margin-top:2px;}
/* RÉSULTATS DE RECHERCHE. `.pick-row` n'avait AUCUN style de base : c'étaient des <button>
   bruts, avec le fond gris, le liseré et le centrage que le navigateur leur donne — et
   chacun à la largeur de son propre texte. D'où une liste de cases de tailles et de formes
   différentes, illisible sur un téléphone. Ils prennent la même ligne que le sélecteur de
   joueur (.pk-row), dont ils n'auraient jamais dû s'écarter : pleine largeur, texte à
   gauche, deux lignes — le nom, puis d'où il vient. */
.pick-list{margin-top:12px;overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1 1 auto;}
.pick-row{display:block;width:100%;text-align:left;font:inherit;color:var(--txt);cursor:pointer;
  background:var(--glass2,transparent);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:11px 13px;margin-bottom:6px;}
.pick-row:hover,.pick-row:active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);}
.pick-row .pick-sub{display:block;font-size:.76rem;color:var(--faint);font-weight:600;margin-top:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pick-row .pick-nm{display:block;font-weight:800;overflow-wrap:anywhere;}
.srch .pick-list{max-height:52vh;overflow-y:auto;}
.srch .empty{padding:22px 12px;}

/* Tableau de manches d'un match en direct. Il défile DANS la carte : au-delà de neuf manches
   sur un téléphone étroit, c'est lui qui glisse, jamais la page. */
.ls-wrap{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:2px 0 8px;}
.ls{border-collapse:collapse;font-variant-numeric:tabular-nums;font-size:.78rem;white-space:nowrap;}
.ls th,.ls td{padding:3px 6px;text-align:center;color:var(--dim);font-weight:700;}
.ls th{color:var(--faint);font-size:.66rem;font-weight:800;}
.ls .ls-nm{text-align:left;color:var(--txt);font-weight:800;padding-right:10px;
  max-width:120px;overflow:hidden;text-overflow:ellipsis;}
/* R, H, E : détachés des manches par un filet, et en pleine encre — ce sont les totaux. */
.ls .ls-t{color:var(--txt);font-weight:900;}
.ls th.ls-t:first-of-type,.ls td.ls-t:first-of-type{border-left:1px solid var(--line);padding-left:9px;}

/* ============ ESPACE JOUEUR : sa fiche ============
   Le joueur renseigne ce que la fédération ne publie pas — numéro, poste, côté de frappe et de
   lancer. Deux colonnes sur téléphone : quatre champs courts n'ont pas besoin d'une pleine
   largeur chacun, et l'ensemble tient alors sous le pouce. */
.myinfo .mi-nm{font-weight:900;font-size:1.05rem;margin-bottom:12px;}
.mi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;}
.mi-f{display:flex;flex-direction:column;gap:5px;min-width:0;}
.mi-f > span{font-size:.68rem;font-weight:900;letter-spacing:.05em;text-transform:uppercase;color:var(--faint);}
.mi-f .ui-input,.mi-f .sel{width:100%;margin:0;max-width:none;}
.mi-msg{min-height:1.2em;}

/* Champ de saisie d'un CODE (invitation, suivi d'un match). Les codes ne contiennent que des
   majuscules : le clavier s'ouvre dessus (`autocapitalize="characters"`, dans le HTML) et le
   champ les AFFICHE pendant la frappe. Sans cette seconde moitié, on tapait en minuscules, on
   voyait des minuscules, et la conversion n'arrivait qu'à la validation — de quoi croire à une
   erreur de saisie. L'espacement des lettres aide à relire un code dicté. */
.codefield{text-transform:uppercase;letter-spacing:.14em;font-weight:800;}
.codefield::placeholder{text-transform:none;letter-spacing:normal;font-weight:600;}

/* ============ PAGE D'UN MATCH EN DIRECT ============ */
.lg-head{text-align:center;}
.lg-live{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:12px;}
/* Les lignes « Situation » : l'intitulé en petit, la valeur à la suite. */
.lg-row{display:block;font-size:.88rem;color:var(--txt);padding:4px 0;}
.lg-row b{display:inline-block;min-width:76px;color:var(--faint);font-weight:800;font-size:.68rem;
  letter-spacing:.05em;text-transform:uppercase;}
.lg-score{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;}
.lg-score > b{font-size:2.2rem;font-variant-numeric:tabular-nums;letter-spacing:-1px;}
.lg-t{display:flex;flex-direction:column;align-items:center;gap:6px;min-width:0;}
.lg-t span{font-weight:800;font-size:.9rem;line-height:1.15;overflow-wrap:anywhere;}
.lg-comp{margin-top:12px;font-size:.78rem;color:var(--faint);font-weight:700;}
/* Sur la page dédiée, le tableau de manches respire : il a la largeur pour lui. */
.lg-head + .sec + .card .ls{width:100%;}
.lg-head + .sec + .card .ls td,.lg-head + .sec + .card .ls th{padding:5px 7px;}
@media (max-width:560px){ .lg-score > b{font-size:1.8rem;} }

/* « Mon équipe » dans les Réglages : deux champs étiquetés, chacun sur sa ligne et à la largeur
   de la carte. Les `select` y perdent le plafond de 220 px qui coupait les noms de club. */
.set-duo{display:grid;gap:14px;}
.set-duo .sel{width:100%;max-width:none;}

/* En-tête de match partagé (direct et match passé). Le vainqueur se marque discrètement. */
.lg-tag{display:flex;justify-content:center;margin-bottom:12px;}
.lg-date{font-size:.72rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);}
.lg-t.win span{color:var(--txt);}
.lg-t:not(.win) span{color:var(--dim);}
.lg-head:has(.lg-t.win) .lg-t:not(.win) span{opacity:.7;}

/* ============ VIE DU CLUB (mur, photos, documents, événements, notes de frais) ============
   Ces écrans réemploient les briques existantes — .card, .rows/.row, .sec — et n'ajoutent
   que ce qui leur est propre : la grille de l'album, la bulle d'un message, la pastille
   d'un statut. Rien n'y est peint d'une couleur nouvelle : l'accent choisi suffit. */
.wall-in{width:100%;resize:vertical;min-height:74px;line-height:1.5;}
.wall-list{display:flex;flex-direction:column;gap:10px;margin-top:14px;}
.wall-msg{padding:14px 16px;}
.wall-h{display:flex;align-items:center;gap:10px;margin-bottom:6px;}
.wall-who{font-weight:800;font-size:.92rem;color:var(--txt);}
.wall-at{font-size:.76rem;color:var(--faint);font-weight:700;}
.wall-h .iconb{margin-left:auto;}
.wall-txt{margin:0;line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere;}

/* Album : des carrés, parce qu'une grille de photos de club mêle portrait et paysage et
   qu'un alignement régulier se parcourt mieux qu'une mosaïque. */
.ph-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(108px,1fr));gap:10px;margin-top:14px;}
.ph-cell{margin:0;}
.ph-img{position:relative;aspect-ratio:1;border-radius:var(--r-md);overflow:hidden;background:var(--bg2);
  display:flex;align-items:center;justify-content:center;cursor:zoom-in;}
.ph-img img{width:100%;height:100%;object-fit:cover;display:block;}
.ph-load{width:20px;height:20px;border-radius:50%;border:2px solid var(--line2);border-top-color:var(--accent);
  animation:phspin .8s linear infinite;}
@keyframes phspin{to{transform:rotate(360deg);}}
.ph-fail{color:var(--faint);font-weight:800;}
.ph-cell figcaption{display:flex;align-items:center;gap:6px;padding:5px 2px 0;}
.ph-who{font-size:.72rem;color:var(--faint);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ph-cell figcaption .iconb{margin-left:auto;}
.ph-ov{background:rgba(8,11,18,.92);cursor:zoom-out;}
.ph-ov img{max-width:94vw;max-height:92vh;object-fit:contain;border-radius:var(--r-md);}

/* Documents et notes de frais : des lignes, la même que l'effectif. */
.doc-list,.exp-list,.ev-list,.mb-list{margin-top:14px;}
.doc-row .acts,.exp-row .acts,.mb-row .acts{display:flex;align-items:center;gap:8px;flex:0 0 auto;}
.exp-amt{font-weight:900;white-space:nowrap;}
.exp-st{font-size:.66rem;font-weight:800;letter-spacing:.04em;text-transform:uppercase;padding:3px 7px;
  border-radius:var(--r-xs);border:1px solid var(--line2);color:var(--dim);white-space:nowrap;}
.exp-st.st-ok{color:var(--green);border-color:var(--green);}
.exp-st.st-refused{color:var(--red);border-color:var(--red);}
.sel.xs{height:auto;padding:6px 26px 6px 9px;font-size:.8rem;min-width:0;max-width:150px;}

/* Événements : le type d'abord, en pastille, parce que c'est lui qu'on cherche du regard. */
.ev-row{cursor:default;}
.ev-row[data-evedit]{cursor:pointer;}
.ev-badge{flex:0 0 auto;font-size:.64rem;font-weight:800;letter-spacing:.04em;text-transform:uppercase;
  padding:4px 8px;border-radius:var(--r-xs);background:var(--bg2);color:var(--dim);white-space:nowrap;}
.ev-note{opacity:.85;}
.ev-2{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
@media(max-width:420px){ .ev-2{grid-template-columns:1fr;} }
/* Sur un téléphone, montant + suivi ne tiennent pas à côté d'un objet de note de frais :
   la ligne passe en deux étages plutôt que de comprimer les deux. */
@media(max-width:520px){
  .exp-row{flex-wrap:wrap;}
  .exp-row .who{flex:1 1 100%;}
  .exp-row .acts{flex:1 1 100%;justify-content:space-between;margin-top:8px;}
  .sel.xs{max-width:none;flex:0 1 170px;}
}

/* ============ ANALYSE DU JOUEUR (ce que les feuilles de match savent en plus) ============ */
.an-block{margin-top:14px;}
.an-note{margin:10px 14px 2px;font-size:.76rem;line-height:1.5;}
/* Tuiles : une valeur, son nom au-dessus, sa définition dessous. Le lecteur n'est pas censé
   savoir ce qu'est un BABIP — l'expliquer là où il est vaut mieux qu'une légende à part. */
.an-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:10px;padding:14px;}
.an-tile{background:var(--bg2);border:1px solid var(--line);border-radius:var(--r-md);padding:11px 12px;}
.an-l{font-size:.66rem;font-weight:900;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);}
.an-v{font-size:1.42rem;font-weight:900;line-height:1.15;margin-top:3px;color:var(--txt);}
.an-s{font-size:.7rem;color:var(--dim);line-height:1.35;margin-top:3px;}
/* Poste principal : la réponse d'abord, la répartition ensuite. */
.an-main{padding:16px 14px 4px;text-align:center;}
.an-mainv{font-size:2.6rem;font-weight:900;letter-spacing:-1px;line-height:1;color:var(--accent);}
.an-mainl{font-size:.72rem;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--faint);margin-top:5px;}
.an-poslist{padding:12px 14px 14px;display:flex;flex-direction:column;gap:7px;}
.an-pos{display:flex;align-items:center;gap:10px;}
.an-pn{flex:0 0 46px;font-weight:900;font-size:.82rem;}
.an-pb{flex:1 1 auto;height:8px;border-radius:4px;background:var(--bg2);overflow:hidden;}
.an-pf{display:block;height:100%;background:var(--accent);border-radius:4px;}
.an-pf.alt{background:var(--line2);}   /* PH / PR / DH : comptés, mais pas un poste de défense */
.an-pc{flex:0 0 30px;text-align:right;font-weight:800;font-size:.82rem;color:var(--dim);}
/* Lignes à trois temps : l'intitulé, la valeur qui compte, le détail. */
.an-rows{padding:6px 14px 14px;}
.an-row{display:flex;align-items:baseline;gap:10px;padding:9px 0;border-top:1px solid var(--line);flex-wrap:wrap;}
.an-row:first-child{border-top:none;}
.an-rl{flex:0 0 auto;font-weight:800;font-size:.88rem;}
.an-rv{margin-left:auto;font-weight:900;font-size:1.05rem;}
.an-rd{flex:1 1 100%;font-size:.76rem;color:var(--dim);}
.an-log th,.an-log td{white-space:nowrap;}
.an-log .jd,.an-log .jo,.an-log .jp{text-align:left;}
.an-log .jo{max-width:130px;overflow:hidden;text-overflow:ellipsis;}
.an-log .jp{font-size:.78rem;color:var(--dim);}
@media(max-width:420px){
  .an-grid{grid-template-columns:1fr 1fr;gap:8px;padding:12px;}
  .an-v{font-size:1.2rem;}
  .an-mainv{font-size:2.1rem;}
}
/* Véhicule : le type en pastille discrète à côté du conducteur. */
.td-vtype{font-size:.64rem;font-weight:800;letter-spacing:.03em;text-transform:uppercase;color:var(--dim);
  background:var(--bg2);border-radius:var(--r-xs);padding:2px 6px;margin-left:6px;white-space:nowrap;}
.td-drow[data-drv-edit]{cursor:pointer;}
.veh-costs{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
@media(max-width:420px){ .veh-costs{grid-template-columns:1fr;} }
/* Cotisations : le montant reste modifiable en ligne, le statut se bascule d'un bouton. */
.dues-list{margin-top:14px;}
.dues-row .acts{display:flex;align-items:center;gap:8px;flex:0 0 auto;}
.dues-in{width:88px;padding:7px 9px;font-size:.9rem;text-align:right;}
.dues-row.paid .nm{opacity:.8;}
@media(max-width:520px){
  .dues-row{flex-wrap:wrap;}
  .dues-row .who{flex:1 1 100%;}
  .dues-row .acts{flex:1 1 100%;justify-content:flex-end;margin-top:8px;}
}
/* Rang dans la compétition : la mesure, sa valeur, le rang. Le rang seul est coloré —
   c'est lui qui porte le jugement, et il n'en faut qu'un par ligne. */
.cr-list{padding:4px 0;}
.cr-row{display:flex;align-items:center;gap:12px;padding:11px 16px;border-top:1px solid var(--line);}
.cr-row:first-child{border-top:none;}
.cr-l{flex:1 1 auto;font-size:.88rem;font-weight:700;min-width:0;}
.cr-v{flex:0 0 auto;font-weight:900;font-size:1rem;}
.cr-r{flex:0 0 auto;min-width:62px;text-align:right;font-size:.78rem;font-weight:800;color:var(--dim);}
.cr-r.bon{color:var(--green);}
.cr-r.faible{color:var(--red);}
