/* ============================================================================
 * FILE GENERATO — NON MODIFICARE A MANO.
 * Lo scrive: manage.py costruisci_css_casa   (dai fogli in player_ui/mobile.py)
 * Una regola aggiunta QUI sparisce alla prossima ricostruzione, senza dire niente:
 * mettila nel foglio sorgente che le compete, poi rilancia il comando.
 * Controllo: manage.py costruisci_css_casa --verifica
 * ==========================================================================*/
/* player/app_mobile.css */
/* ═══════════════════════════════════════════════════════════════════════════
   TIMERBET PLAYER — IL LAYER MOBILE COMUNE
   Autore: D (design). Ordine GC 19/07: su telefono il player deve sembrare
   un'APP, non un sito rimpicciolito, e deve valere su TUTTI i temi.

   PERCHÉ UN FILE SOLO. I temi sono quattro sistemi diversi (base classico,
   layout-libreria, temi importati «fedeli», temi sanificati) e ognuno porta il
   CSS del suo grafico. Aggiustarli uno per uno significa rifarlo quattro volte
   e vederlo rompersi al quinto tema. Qui invece: un foglio, caricato in coda a
   `<head>` così vince per cascata, che parla ai GANCI DI CLASSE che i temi già
   espongono.

   COME SI RITINGE. Niente colori sparsi nelle regole: tutto passa dalle
   variabili qui sotto. Un tema che vuole la sua tinta ridefinisce quelle, in
   `<head>` o nel proprio foglio, e il resto si adegua:

       :root { --tbm-bg:#101820; --tbm-accent:#00d4a0 }

   REGOLA DELLA CASA rispettata: l'ORO è il denaro. Nella barra in basso l'unica
   cosa dorata è la schedina — l'unico posto dove ci sono i tuoi soldi.

   Il markup della barra sta in `player/_bottom_nav.html` (frammento a sé).
   ═══════════════════════════════════════════════════════════════════════════ */

:root{
  /* la soglia: sotto questa larghezza il player diventa un'app */
  --tbm-bar-h: 56px;
  /* LA BARRA È VETRO SCURO, NON IL BLU DI UN TEMA.
     Verificata sui 4 temi importati: il n.1 è blu, il n.2 verde/nero, il n.4 chiaro con
     oro. Una barra blu fissa, su quelli, sembrava incollata sopra da un'altra app. Non si
     rincorrono quattro tavolozze: la barra è cromo persistente e si comporta come tale —
     un velo scuro traslucido che sfoca ciò che ci scorre sotto e sta bene su qualunque
     fondo. Un tema che voglia la sua tinta ridefinisce queste variabili e vince. */
  --tbm-bg: rgba(12,20,30,.90);
  --tbm-bg-2: rgba(8,14,22,.94);
  --tbm-ring: #101a26;            /* tinta PIENA: anelli e contorni, dove il velo non va */
  --tbm-ink: #ffffff;
  --tbm-dim: rgba(255,255,255,.60);
  --tbm-accent: #F5B301;          /* oro TimerBet = il denaro */
  --tbm-accent-ink: #1a1205;
  --tbm-live: #ff3b3b;
  --tbm-line: rgba(255,255,255,.12);
  --tbm-r: 14px;
  /* la tacca dei telefoni recenti: si somma, non si indovina */
  --tbm-safe: env(safe-area-inset-bottom, 0px);
}

/* ═══ 1. LA REGOLA CHE VIENE PRIMA DI TUTTE ═══
   Niente scorrimento orizzontale. Non è una preferenza estetica: se il
   documento è più largo del telefono, il browser rimpicciolisce l'intera
   pagina per farcela stare e il testo diventa illeggibile — che è esattamente
   il difetto segnalato (il player si allargava a 473px su uno schermo da 390).
   Le cause vere erano due elementi a larghezza fissa nell'intestazione. */
@media (max-width: 900px){
  html, body{max-width:100%; overflow-x:hidden}
  /* media e tabelle non sfondano mai il contenitore */
  img, video, iframe, canvas, svg{max-width:100%; height:auto}
  table{max-width:100%}
  /* il velo di caricamento seguiva la larghezza sfondata invece dello schermo */
  #loaderCtm, .loader-ctm{width:100% !important; max-width:100vw}
}

/* ═══ 2. INTESTAZIONE COMPATTA ═══
   Sul telefono l'intestazione deve dire tre cose e basta: chi sei, quanto hai,
   e come si ricarica. La barra dei menu del desktop sparisce — le sue voci
   vivono nella barra in basso, dove ci arriva il pollice. */
@media (max-width: 900px){
  .hd-ctm{position:sticky; top:0; z-index:900}
  .hd-top-header{padding:6px 10px !important; gap:8px}
  .hd-ctm--logo img, .nav-logo--img{max-height:26px; width:auto}

  /* ERA IL COLPEVOLE DELL'ALLARGAMENTO: 433px fissi, in position:fixed.
     Sul telefono non serve: è la nav desktop, sostituita dalla barra in basso. */
  .hd-ctm--menu{display:none !important}
  /* i cartellini «promo/agente/deposita» dell'intestazione: via, sono desktop */
  .hd-menu--top{display:none !important}

  /* saldo e deposita restano, ma stretti e leggibili */
  .hd-top-header--right{gap:6px; flex-wrap:nowrap; min-width:0}
  .hd-ctm--auth{gap:6px; min-width:0}
  .hd-ctm--auth .btn-ctm{
    min-height:36px; padding:6px 10px; font-size:12.5px; white-space:nowrap}
  .hd-ctm--auth .btn-text{font-variant-numeric:tabular-nums}
  .text-separator{display:none}
  /* L'orologio dell'intestazione sfondava lo schermo (arrivava a 447px su 390) ed e'
     l'unica cosa li' dentro che il telefono ha gia' nella sua barra di stato. */
  #tbClock{display:none}
}

/* ═══ 3. IL CORPO: CARD, NON TABELLE STRETTE ═══ */
@media (max-width: 900px){
  .page-container, .main-wrapper, .main-container{
    display:block !important; width:100% !important; max-width:100% !important;
    margin:0 !important; padding-left:0 !important; padding-right:0 !important}

  /* lo spazio che la barra in basso occupa: il contenuto non ci finisce sotto */
  body{padding-bottom:calc(var(--tbm-bar-h) + var(--tbm-safe) + 8px) !important}

  /* i pannelli diventano card a tutta larghezza con un filo d'aria */
  .box-main, .ctm-panel, .box-sidebar{border-radius:12px; margin:8px 8px 10px}

  /* La riga «filtri + tab sport» è un flex che sul telefono si schiaccia: il testo
     del selettore va a capo su tre righe e le tab si tagliano a metà parola.
     Si impila invece di comprimere. */
  .box-main--wrapper{flex-wrap:wrap}
  .box-main--left, .box-main--middle, .box-main--right{
    min-width:0; max-width:100%; flex-basis:100%}
  .box-main--left{display:flex; align-items:center; gap:8px; white-space:nowrap}

  /* IL BERSAGLIO DEL POLLICE. 44px è la misura sotto la quale si sbaglia tasto —
     e qui sbagliare tasto significa piazzare la quota sbagliata. Non si applica ai
     bottoni dell'intestazione: là lo spazio verticale è prezioso e non si scommette. */
  .qt-btn, .menu-button, .tabs-ctm--item, .menu-item > a, .tab-item--btn{
    min-height:44px; display:flex; align-items:center; justify-content:center}
  .qt-btn{font-size:15px; font-weight:800}

  /* le quote: tre colonne uguali, non una fila che deborda */
  .tb-btns, .odds-select, .odds-row{
    display:grid !important; grid-template-columns:repeat(3,1fr); gap:6px}
  .tb-btns > *, .odds-select > *{min-width:0}

  /* Le liste orizzontali scorrono col dito invece di tagliarsi a metà parola.
     ⚠ NON si tocca il `display` dei contenitori `owl-carousel`: quel carosello è
     gestito da uno script del tema che si costruisce la sua riga scorrevole da sé —
     forzarlo a flex gliela svuota (provato: le tab degli sport sparivano). Si dà solo
     il permesso di scorrere a chi non è un carosello. */
  .top-menu--horizontal, .top-menu--wrapper, .coupon-tabs, .tabs-ctm{
    overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none}
  .top-menu--horizontal::-webkit-scrollbar, .tabs-ctm::-webkit-scrollbar{display:none}
  .tab-items--ctm:not(.owl-carousel){
    display:flex; flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none}
  .tab-items--ctm:not(.owl-carousel) .tab-item--ctm{flex:none}
}

/* ═══ 4. IL MENU SPORT COME CASSETTO ═══
   Il tema ha già l'aside e il suo velo cliccabile: non serve markup nuovo,
   basta ridefinire cosa vuol dire «aperto» sotto la soglia. */
@media (max-width: 900px){
  #leftSidebarSport.left-sidebar{
    position:fixed; inset:0 auto 0 0; z-index:1000; width:min(84vw, 340px);
    max-width:340px; transform:translateX(-102%);
    transition:transform .26s cubic-bezier(.22,.61,.36,1);
    overflow-y:auto; overscroll-behavior:contain;
    box-shadow:2px 0 24px rgba(0,0,0,.4)}
  #leftSidebarSport.left-sidebar.active{transform:translateX(0)}
  .sidebar--overlay{
    position:fixed; inset:0; z-index:999; background:rgba(4,14,24,.55);
    opacity:0; pointer-events:none; transition:opacity .22s}
  .left-sidebar.active .sidebar--overlay,
  .right-sidebar.active .sidebar--overlay{opacity:1; pointer-events:auto}
  /* i bottoni «richiudi» del desktop non hanno senso in un cassetto */
  .button-collapse{display:none}
}

/* ═══ 5. LA SCHEDINA COME PANNELLO DAL BASSO ═══
   Su telefono una colonna laterale schiacciata è illeggibile proprio quando
   conta di più: al momento di giocare. Diventa un foglio che sale dal basso,
   con la maniglia, che si chiude trascinando o toccando fuori.

   ⚠ Lo stato sta su #rightSidebarSport, MAI su .box-sidebar--coupon: quel nodo
   viene rimpiazzato per intero a ogni gamba aggiunta o tolta, e con lui
   sparirebbe la classe di apertura. */
@media (max-width: 900px){
  #rightSidebarSport.right-sidebar{
    position:fixed; inset:auto 0 0 0; z-index:1000; width:100%; max-width:100%;
    height:auto; max-height:84vh; transform:translateY(102%);
    transition:transform .28s cubic-bezier(.22,.61,.36,1);
    border-radius:var(--tbm-r) var(--tbm-r) 0 0;
    background:var(--tbm-bg); box-shadow:0 -8px 30px rgba(4,14,24,.45);
    display:flex; flex-direction:column; overflow:hidden}
  #rightSidebarSport.right-sidebar.active{transform:translateY(0)}

  /* la maniglia: dice «questo si trascina» senza scriverlo */
  #rightSidebarSport.right-sidebar:before{
    content:""; flex:none; width:38px; height:4px; border-radius:99px;
    margin:8px auto 4px; background:var(--tbm-dim)}

  #rightSidebarSport .right-sidebar--wrapper{
    overflow-y:auto; overscroll-behavior:contain; padding-bottom:12px;
    padding-bottom:calc(12px + var(--tbm-safe))}
  /* il gancio desktop per aprire la colonna: sul telefono ci pensa la barra */
  #rightSidebarSport .right-sidebar--openmenu{display:none}
  .box-sidebar.box-sidebar--coupon{margin:0 8px 8px; border-radius:12px}
}

/* ═══ 6. LA BARRA IN BASSO ═══
   Cinque voci, il pollice ci arriva tutto. La schedina sta in mezzo e sporge:
   è l'azione che vale soldi, e l'unica dorata. */
.tbm-nav{display:none}

@media (max-width: 900px){
  .tbm-nav{
    display:grid; grid-template-columns:repeat(5,1fr); align-items:end;
    position:fixed; inset:auto 0 0 0; z-index:1100;
    height:calc(var(--tbm-bar-h) + var(--tbm-safe));
    padding-bottom:var(--tbm-safe);
    background:linear-gradient(180deg,var(--tbm-bg),var(--tbm-bg-2));
    -webkit-backdrop-filter:blur(14px) saturate(1.3);
    backdrop-filter:blur(14px) saturate(1.3);
    border-top:1px solid var(--tbm-line);
    box-shadow:0 -2px 14px rgba(4,14,24,.35)}
  /* dove la sfocatura non c'è, il velo si fa quasi pieno: se no si legge il testo sotto */
  @supports not (backdrop-filter: blur(1px)){
    .tbm-nav{background:linear-gradient(180deg,#0d1520,#080e16)}
  }

  .tbm-nav a{
    display:flex; flex-direction:column; align-items:center; justify-content:center;
    gap:3px; height:var(--tbm-bar-h); min-width:0; padding:0 2px;
    color:var(--tbm-dim); text-decoration:none; font-weight:700;
    -webkit-tap-highlight-color:transparent}
  .tbm-nav a svg{width:22px; height:22px; flex:none; display:block}
  /* Le ETICHETTE si troncano se non ci stanno. `:not(.tbm-slip-btn)` non è pignoleria:
     anche il tondo della schedina è uno <span>, e con `overflow:hidden` addosso ritagliava
     via il contatore delle selezioni, che sporge apposta dal bordo. */
  .tbm-nav a > span:not(.tbm-slip-btn){
    font-size:10px; line-height:1; letter-spacing:.01em;
    max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
  .tbm-nav a.is-on{color:var(--tbm-ink)}
  /* il filo sopra la voce attiva: dice dove sei senza rubare spazio */
  .tbm-nav a.is-on:before{
    content:""; position:absolute; top:0; width:26px; height:3px;
    border-radius:0 0 3px 3px; background:var(--tbm-accent)}
  .tbm-nav a{position:relative}
  .tbm-nav a:focus-visible{outline:2px solid var(--tbm-accent); outline-offset:-3px}

  /* il pallino rosso del live: pulsa piano, come il minuto che scorre */
  .tbm-nav .tbm-live-dot{
    position:absolute; top:9px; margin-left:17px; width:7px; height:7px;
    border-radius:50%; background:var(--tbm-live);
    box-shadow:0 0 0 2px var(--tbm-bg); animation:tbm-pulse 2s ease-in-out infinite}
  @keyframes tbm-pulse{50%{opacity:.35}}

  /* ── la schedina: il tasto rialzato ── */
  .tbm-nav .tbm-slip{justify-content:flex-end; padding-bottom:5px}
  .tbm-nav .tbm-slip .tbm-slip-btn{
    position:absolute; bottom:calc(var(--tbm-bar-h) - 28px); left:50%;
    transform:translateX(-50%);
    width:52px; height:52px; border-radius:50%;
    display:flex; align-items:center; justify-content:center;
    background:linear-gradient(180deg,#ffcb3d,var(--tbm-accent));
    color:var(--tbm-accent-ink);
    /* l'anello della barra stacca il tondo; l'ombra sotto è corta, non un alone —
       una sfocatura larga di colore su fondo scuro sembra un difetto di stampa */
    box-shadow:0 0 0 4px var(--tbm-ring), 0 3px 8px rgba(4,14,24,.45)}
  /* il contatore sporge dal bordo del tondo APPOSTA: qui niente ritaglio, mai */
  .tbm-nav .tbm-slip-btn{overflow:visible !important}
  .tbm-nav .tbm-slip .tbm-slip-btn svg{width:24px; height:24px}
  /* l'etichetta della schedina sta sotto il tondo: va tenuta leggibile, non in ombra */
  .tbm-nav .tbm-slip > span{margin-top:auto; color:var(--tbm-ink)}

  /* il contatore delle selezioni: compare solo se c'è davvero qualcosa dentro */
  .tbm-nav .tbm-count{
    /* sporge in alto a destra del tondo e sta SOPRA a tutto: se finisce sotto il bordo
       il numero si perde a metà, ed è il numero che dice quante giocate hai in mano */
    position:absolute; top:-5px; right:-7px; z-index:3;
    min-width:19px; height:19px;
    padding:0 5px; border-radius:99px;
    background:var(--tbm-live); color:#fff;
    font-size:11px; font-weight:900; line-height:19px; text-align:center;
    box-shadow:0 0 0 2px var(--tbm-ring); display:none}
  .tbm-nav.has-slip .tbm-count{display:block}

  /* ── i pulsanti flottanti che c'erano già finirebbero SOTTO la barra ── */
  .pa-fab, .tbtour-fab{
    bottom:calc(var(--tbm-bar-h) + var(--tbm-safe) + 12px) !important}

  @media (prefers-reduced-motion: reduce){
    .tbm-nav .tbm-live-dot{animation:none}
    #leftSidebarSport.left-sidebar, #rightSidebarSport.right-sidebar,
    .sidebar--overlay{transition:none}
  }
}

/* ═══ 7. TABLET ═══
   A 768px non serve la barra da telefono: ci sta ancora una colonna in più.
   Si toglie solo ciò che deborda e si allarga il tocco. */
@media (min-width: 901px) and (max-width: 1024px){
  .hd-menu--list{flex-wrap:wrap}
  .qt-btn{min-height:40px}
  .left-sidebar{width:240px; min-width:0}
}

/* ── LA BANDA SPORT DEL TEMA SCORRE NEL SUO CONTENITORE (bug GC 20/07) ─────────────────
   `.tab-items--c` (markup del tema, vive nel DB) è un flex NOWRAP largo quanto la somma
   degli sport (1086px con l'offerta di oggi): senza questo, o un antenato la clippa (gli
   sport oltre il bordo diventano IRRAGGIUNGIBILI) o — dove il clip non c'è — trascina la
   pagina in overflow-x. Vale a ogni larghezza: anche la colonna desktop è più stretta
   della banda. La pagina non scrolla MAI di lato: già garantito dal guard html/body. */
.box-main--sports-tab .tab-items--ctm,
.box-main--sports-tab .box-main--typemarket-container{
  overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none}
.box-main--sports-tab .tab-items--ctm::-webkit-scrollbar{display:none}

/* ── IL CAMPO RICERCA DELLA NAVBAR SPORT VA A CAPO SU MOBILE (bug GC 20/07) ────────────
   `.box-main--top` è flex NOWRAP e largo ~1307px: la strip sport scorre nel suo box (fix
   precedente), ma il `.search-box--ctm` — fratello FUORI dallo scroll, largo fisso 443px —
   restava tagliato/fuori dal viewport a 390/360. Qui, sotto i 900px, la riga va a capo: la
   strip tiene la prima riga (e scorre), il search scende sotto a piena larghezza e si
   comprime nel contenitore. Il body non scrolla mai di lato (guard html/body sopra). */
@media (max-width: 900px){
  /* prima: il contenitore della navbar sport NON deve essere più largo del viewport, se no
     le % dei figli si calcolano su 1307px (il search diventava 1117px). */
  .box-main--sports-tab,
  .box-main--sports-tab .box-main--wrapper,
  .box-main--sports-tab .box-main--top{max-width:100%;min-width:0;box-sizing:border-box}
  .box-main--sports-tab .box-main--top{flex-wrap:wrap;width:100%}
  /* la strip tiene la prima riga e scorre nel suo box; il search scende sotto a piena
     larghezza del VIEWPORT (ora che il contenitore è vincolato) e si comprime. */
  .box-main--sports-tab .box-main--center{flex:1 1 100%;min-width:0;max-width:100%;overflow-x:auto}
  .box-main--sports-tab .box-main--left{flex:0 0 auto;min-width:0}
  .box-main--sports-tab .box-main--right{flex:1 1 100%;width:100%;max-width:100%;min-width:0;margin-top:6px}
  .box-main--sports-tab .search-box--ctm{width:100%;max-width:100%;min-width:0;box-sizing:border-box}
  .box-main--sports-tab .search-box--ctm input{width:100%;min-width:0;box-sizing:border-box}
}

/* ============================================================================
   MENU SINISTRO COLLASSATO — «live» diventa solo un pallino (richiesta Dav 22/07)
   «quando é collapsed/minimizzato togli la scritta live e lascia solo il pallino
   rosso (font size 0, border-radius 50%) così non fa sballare il layout».

   Stato: il tema mette `.active` sulla sidebar ESPANSA → il collassato è
   `.left-sidebar:not(.active)`. Da espanso resta tutto com'è (testo + pallino).

   ⚠️ Perché questa regola sta QUI e non in tb.css: sulle pagine a tema importato
   `tb.css` NON è caricato — i fogli sono quelli del tema (`/player/theme-asset/…`)
   più questo `app_mobile.css`, iniettato con <link> nell'head dalla middleware.
   Questo è l'unico nostro foglio che arriva a quelle pagine. (Regola di casa
   rispettata: file .css collegato, nessun inline.) Se un domani la middleware
   inietterà più fogli, questa sezione può traslocare in `tb_components.css`.
   Design D.
   ========================================================================== */

.left-sidebar:not(.active) .ms-tag.live,
.left-sidebar:not(.active) .ms-live{
  /* la scritta sparisce senza togliere il nodo (niente salti di layout) */
  font-size:0;
  line-height:0;
  /* … e l'indicatore diventa un pallino tondo */
  display:inline-block;
  width:9px;
  height:9px;
  min-width:0;
  padding:0;
  border-radius:50%;
  flex:none;
  vertical-align:middle;
  /* il rosso resta quello del tema: se il badge aveva già il suo fondo lo tiene,
     altrimenti questo fallback lo rende comunque visibile */
  background:#ff3b3b;
  color:transparent;
  border:0;
  box-shadow:0 0 0 2px rgba(255,59,59,.22);
}
/* il pallino non deve allargare la riga né spingere il chevron */
.left-sidebar:not(.active) .btn-menu--group,
.left-sidebar:not(.active) .menu-group > a{ gap:6px; }

/* ============================================================================
   FIX header submenu — hover-gap (BUG Dav 22/07) + spazio voci
   Il tema (template_c_header.css, servito dal DB) apre il submenu con
   `position:absolute; top:100px → 36px; transition:all .5s`: tra la voce e il
   pannello resta un VUOTO e lo slide di mezzo secondo fa perdere l'hover → il
   submenu si chiude prima di poterci cliccare. Questo foglio è iniettato DOPO il
   CSS del tema, quindi vince a parità di selettore (stessa specificità, regola
   più recente). Niente JS. Design D.
   ========================================================================== */

/* il <li> è il contenitore dell'hover: assicuriamoci che il submenu si posizioni
   rispetto a lui e stia ATTACCATO alla voce (niente più top:100px/36px). */
.hd-ctm.hd-ctm--c .hd-ctm--menu ul.hd-menu--list > li{ position:relative; }

.hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container{
  top:100%;                       /* flush sotto la voce: nessun gap verticale */
  z-index:15;
  /* niente slide di posizione: solo un fade rapido, così non "scappa" */
  transition:opacity .12s ease, visibility .12s ease;
  opacity:0; visibility:hidden;   /* nascosto ma pronto (no display:none: serve l'hover) */
}
.hd-ctm.hd-ctm--c .hd-ctm--menu ul.hd-menu--list > li:hover .hd-submenu--container{
  top:100%;                       /* resta attaccato, non salta */
  opacity:1; visibility:visible;
  transition:opacity .12s ease;
}

/* PONTE invisibile che copre l'eventuale micro-gap tra la voce e il pannello:
   così spostando il cursore verso il basso non si esce mai dall'area in hover. */
.hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container::before{
  content:""; position:absolute; inset-inline:0; top:-10px; height:12px;
  background:transparent;
}
/* mentre il submenu è aperto, tieni la freccia/voce in stato attivo (feedback) */
.hd-ctm.hd-ctm--c .hd-ctm--menu ul.hd-menu--list > li:hover > a .mdi-chevron-down{
  transform:rotate(180deg);
}

/* --- SPAZIO VOCI: righe COMPATTE (Angelo Repoli 24/07): meno padding verticale, più dense, così
   ne entrano di più senza scroll — coerente con la tendina LIVE qui sotto. --- */
.hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container ul > li{
  text-align:left; font-size:12.5px; padding:0; border-radius:0;
}
.hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container ul > li + li{
  border-top:1px solid rgba(255,255,255,.06);   /* separatore leggibile */
}
.hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container ul > li a{
  display:flex; align-items:center;
  padding:.28rem .8rem;           /* righe più strette/dense (prima .5rem) */
  font-size:12.5px; line-height:1.2; font-weight:400;
  border-left:0;                  /* il filetto a sinistra affollava: via */
  white-space:nowrap;
}
.hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container ul > li a:hover{
  background:rgba(47,127,209,.10);   /* hover BLU come la tendina LIVE: uniforme su tutte e 5 le voci
                                        e leggibile sul fondo bianco/blu dei submenu (Angelo 24/07) */
}
.hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container{
  min-width:210px; padding:4px 0; border-radius:6px;
  box-shadow:0 12px 30px rgba(0,0,0,.35);
}

@media (prefers-reduced-motion:reduce){
  .hd-ctm.hd-ctm--c .hd-ctm--menu .hd-submenu--container{transition:none}
}

/* ============================================================================
   ICONA CALENDARIO chiara sui campi data SCURI (Dav 22/07)
   Nei filtri con campo navy (`.tb-filtri`, e `.bl--scuro`), l'indicatore nativo
   del date input è scuro su fondo scuro → invisibile. Lo schiariamo. NON tocchiamo
   i filtri a campo bianco (`.bl` chiaro di «Le mie scommesse»): lì l'icona scura si
   vede già, e invertirla la renderebbe bianco-su-bianco. CSS via <link>. Design D.
   ========================================================================== */
.tb-filtri input[type=date]::-webkit-calendar-picker-indicator,
.bl--scuro .bl-campo input[type=date]::-webkit-calendar-picker-indicator{
  filter:invert(1) opacity(.7);   /* bianco/grigio chiaro come il testo del campo */
  cursor:pointer;
}
.tb-filtri input[type=date]:hover::-webkit-calendar-picker-indicator,
.bl--scuro .bl-campo input[type=date]:hover::-webkit-calendar-picker-indicator{
  filter:invert(1) opacity(1);
}

/* ============================================================================
   A32 — INTESTAZIONE LOGGATA COMPATTA E RESPONSIVE (22/07)
   Segnalazione: su telefono i pulsanti dell'header (CONTO, DEPOSITA, PREMI,
   saldo, ESCI, ingranaggio) sono troppo grandi, sbordano e si TAGLIANO — l'ESCI
   a sinistra e il saldo a destra.

   CAUSA. Il tema importato veste il mobile solo per `.hd-ctm--a`; per la skin
   servita `.hd-ctm--c` lo stato LOGGATO non ha regole per telefono. Lì il
   contenitore ha `justify-content:center` e gli item misure fisse (btn
   `min-width:100px`, account-menu 40px, account-info `margin:0 1rem`): a ~390px
   la fila è più larga dello schermo e, essendo CENTRATA, viene tagliata da
   ENTRAMBI i lati.

   RIMEDIO. Fila ancorata a destra, item compatti, SALDO sempre per intero e
   leggibile. Sotto i 430px le icone secondarie (conto/premi/messaggi) — già
   raggiungibili dal menu account — si ritirano e l'ESCI resta come sola icona,
   così saldo + deposita + menu + esci ci stanno tutti senza clipping. Niente
   scroll-container: aprirebbe il taglio sui menu a tendina (account/lingua) che
   ricadono verso il basso. CSS via <link> (regola di casa), non inline. Design D.
   ========================================================================== */
@media (max-width:768px){
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged{overflow:visible; min-width:0}
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .hd-ctm--auth-wrapper{
    padding:0 4px; gap:6px; flex-wrap:nowrap; min-width:0;
    justify-content:flex-end;   /* la fila abbraccia il bordo destro, non è più centrata */
  }
  /* SALDO: intero, in grassetto, non va mai a capo */
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .account-info{
    margin:0 4px 0 0; min-width:0; flex:0 0 auto;
  }
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .account-info span.info-amount{
    font-size:13px; font-weight:800; white-space:nowrap;
  }
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .account-info span.info-user{
    font-size:10.5px; max-width:22vw; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  }
  /* icone (conto/deposita/messaggi) e ingranaggio: compatte, misura fissa piccola */
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .account-icon{
    height:30px; min-width:30px; padding:0 7px; font-size:18px; flex:0 0 auto; border-radius:8px;
  }
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .account-menu{
    width:30px; min-width:30px; height:30px; font-size:19px; flex:0 0 auto;
  }
  /* ESCI/logout: via i 100px fissi */
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .btn-ctm,
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged ~ .hd-ctm--auth .btn-ctm{
    min-width:auto; padding:6px 9px; flex:0 0 auto;
  }
}

/* fascia stretta dei telefoni: si libera lo spazio che serve al saldo */
@media (max-width:430px){
  /* l'username si legge nel menu account: sul saldo pesa e basta */
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .account-info span.info-user{display:none}
  /* conto / premi / messaggi restano nel menu account, non nella barra */
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .account-icon:not(.account-deposit){display:none}
  /* ESCI diventa sola icona (il testo starebbe stretto); ACCEDI/REGISTRATI da sloggato NON è toccato */
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .btn-ctm .btn-text,
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged ~ .hd-ctm--auth .btn-ctm .btn-text{display:none}
  .hd-ctm.hd-ctm--c .hd-ctm--auth.hd-ctm--auth-logged .hd-ctm--auth-wrapper{gap:4px}
}

/* ════════════════════════════════════════════════════════════════════════════
   DROPDOWN «LIVE» dell'header UNIFORMATO agli altri submenu del nav (Dav 24/07).
   Il menu live (`.tb-livedd-menu`, «Tutti gli sport/…») era SCURO mentre SPORT/CASINO
   (`.hd-submenu--container`) sono BIANCO/BLU. Qui gli stessi colori/sfondo, in FILE
   (regola Dav: niente inline). Struttura (fixed, coordinate dal JS) invariata.
   ──────────────────────────────────────────────────────────────────────────── */
.tb-livedd{position:relative;display:inline-flex;align-items:center;gap:5px;cursor:pointer}
.tb-livedd-car{font-size:.62em;opacity:.8;transition:transform .15s}
.tb-livedd.is-open .tb-livedd-car{transform:rotate(180deg)}
.tb-livedd-menu{position:fixed;z-index:5000;display:none;min-width:240px;max-height:70vh;overflow:auto;
  background:#fff;color:#2f7fd1;border-radius:12px;box-shadow:0 10px 28px rgba(0,0,0,.25);
  padding:4px 0;font-size:12.5px;font-weight:600;text-align:left}   /* font come i submenu tema (12.5px) — 5 voci uniformi */
.tb-livedd.is-open .tb-livedd-menu{display:block}
/* RIGHE COMPATTE (Angelo Repoli 24/07): meno padding verticale, righe più dense → ne entrano di più
   prima di dover scrollare. */
.tb-livedd-menu a{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:4px 14px;margin:0 8px;line-height:1.2;font-size:12.5px !important;color:#2f7fd1;text-decoration:none;white-space:nowrap;font-weight:600;
  border-left:2px solid rgba(29,59,90,.15)}   /* !important: batte la regola nav del tema (14px), 5 voci uniformi */
.tb-livedd-menu a:hover{background:rgba(47,127,209,.08);border-left-color:#2f7fd1}
.tb-livedd-menu a.on{color:#12456f;background:rgba(47,127,209,.10);border-left-color:#2f7fd1}
.tb-livedd-menu a b{font-weight:800;color:#1a5da6;font-size:.86em}   /* il contatore, leggibile su bianco */
.tb-livedd-menu .tb-livedd-vuoto{padding:12px 14px;opacity:.7;font-weight:500;color:#5b7793}
.tb-livedd-menu .tb-livedd-sep{height:1px;background:rgba(29,59,90,.12);margin:5px 0}

/* ═══ 8. DESKTOP: LA COLONNA DEL COUPON DEVE AVERE UNA MISURA ═══
   A32, 04/08 08:09, con la foto: «ho selezionato GG a 1.85 e non vedo cosa sto giocando». La
   colonna destra è ridotta a una striscia col testo tagliato («Comprimi la barra», «LE M…»).

   Misurato sul vivo (skin 11): coupon largo 237px a 1913, **156px a 1400**, 138 a 1280, 109 a
   1100. Non è un restringimento: è che a desktop NESSUNA regola nostra gli dà una larghezza, e
   il tema importato gliela toglie —

       template_c.css   .page-container--sport .main-wrapper .right-sidebar { width: 0 }
       template_c.css   .box-sidebar--coupon.box-sidebar--coupon           { width: 10px }

   — quindi quel che si vede sono i soli pixel di traboccamento del contenuto. Sotto i 900px il
   coupon è il foglio che sale dal basso ed è largo quanto lo schermo (sezione 5 qui sopra):
   mancava **solo** il caso desktop, e per questo non l'aveva visto nessuno misurando stretto.

   ⚠️ NON è una regressione delle CSS di stanotte: confrontati i selettori del pacchetto con
   cinque versioni precedenti → zero regole di sidebar perse; il tema della skin non cambia dal
   28/07 e questo foglio non era stato toccato. Il difetto c'era da prima, su ogni skin che monta
   questo tema.

   L'id batte le classi del tema (specificità 1,1,1 contro 0,3,0): niente `!important`, così un
   cliente può ancora scavalcarla dal suo tema. La misura è quella che il tema usa altrove per la
   colonna a tre (`page-3--columns` → 270px), arrotondata ai 300 del coupon di famiglia.

   ⚠️ La soglia è **1024, non 901**: fra 901 e 1023 il tema il coupon non lo disegna affatto
   (misurato: coupon 0 a 901, 920 e 1000; compare a 1024). Con 901 avrei riservato una colonna
   VUOTA da 300px su quella fascia — cioè avrei curato il desktop rompendo il tablet. */
@media (min-width: 1024px) {
  #rightSidebarSport.right-sidebar { width: 300px; max-width: 300px; flex: 0 0 300px; }
  #rightSidebarSport .right-sidebar--wrapper { width: 100%; }
  #rightSidebarSport .box-sidebar--coupon { width: 100%; max-width: 100%; }
}

/* player/coupon.css */
/* ============================================================================
   IL COUPON (schedina) — foglio unico, servito su ogni pagina del giocatore
   dal middleware `AppMobileShell` (quindi DOPO il CSS del tema: vince di cascata).

   Nasce da due `<style>` che stavano dentro i template (`schedina.html` e
   `_gambe_coupon.html`): stessi selettori, portati fuori come vuole la regola di
   Dav — CSS in un `.css` col `<link>`, mai inline.

   ⚠️ E con la DENSITÀ ridotta che Dav chiede da giorni. Il compatto era finito solo
   in `tb.css`, che veste il NOSTRO tema scuro: il coupon vivo gira sul tema
   IMPORTATO e quelle regole non lo toccavano nemmeno. Da qui invece sì.
   Cosa cala (nient'altro: colori, disegno e comportamento restano identici):
     · card della selezione:  76px → ~56px di altezza
     · testata, riga «accetta riproposte», righe importi/quote: padding e corpo
     · bottoni e zona prenotatore: un filo più bassi
   D, 22-07-2026.
   ========================================================================== */

/* la radice del tema è FLEX e il wrapper figlio ha min-width:auto: un nome partita
   lungo gonfiava la larghezza minima e il pannello sbordava dal rail. */
.box-sidebar--coupon>.box-sidebar--wrapper{width:100%;max-width:100%;min-width:0}
/* 🔴 I COLORI DEL COUPON VENGONO DALLA SKIN, NON DA CASA NOSTRA (Angelo, 06/08, su studio5:
   «non prende oltretutto tutti i colori»).

   Qui c'era `--tb-blu:var(--primary-color,#1d3b5a)`: studio5 non definisce `--primary-color`
   (misurato sul servito: 0 definizioni), quindi cadeva sempre sul ripiego e il coupon portava
   il blu di casa dentro un sito arancio/navy.

   ⚠️ E il tentativo di ieri (`var(--primary-color,var(--or,#1d3b5a))`) NON va bene, benché sia
   già pubblicato: leggeva `--or` sperando che la skin 11 non la definisse. Oggi la definisce
   (`#e11d48`, arrivata con i colori del composer sulle skin vestite), quindi quella catena
   **ha già cambiato timerbet**: accento da `#1d3b5a` a rosso. Misurato sul servito il 06/08.
   Una regola appoggiata a un'ASSENZA scade da sola, di notte, senza che nessuno la tocchi.

   Adesso la catena passa dai nomi `--tb-coupon-*`, che stanno in `tb.css` — **il foglio che una
   pagina vestita da un tema importato non carica**, per decisione scritta (Angelo 29/07,
   `views.py`: «NIENTE tb.css/layout.css su una pagina vestita»). Quindi:
     · studio5 (vestita di casa)  → i nomi ci sono → il coupon prende i suoi colori;
     · timerbet (tema importato)  → i nomi non esistono → si resta sul ripiego, che è il valore
       di sempre: `#1d3b5a` e `#e6d2a8`. Identico al byte, e non per fortuna.
   Una skin con tema importato che voglia i suoi colori ha ancora `--primary-color`, come prima.

   📌 Ogni ripiego qui sotto è il valore cablato di oggi: chi non ha `tb.css` non si muove. */
.box-sidebar--coupon{--tb-blu:var(--primary-color,var(--tb-coupon-accento,#1d3b5a));
  --tb-oro:var(--tb-coupon-oro,#e6d2a8);
  font-variant-numeric:tabular-nums;padding:6px}
.box-sidebar--coupon .tb-head{display:flex;justify-content:space-between;align-items:center;
  padding:6px 10px 3px;font-weight:800;letter-spacing:.02em;font-size:.94em}
.box-sidebar--coupon .tb-head small{font-weight:600;opacity:.75}
.box-sidebar--coupon .tb-accetta{display:flex;gap:6px;align-items:flex-start;margin:1px 10px 6px;
  font-size:.78em;line-height:1.2;opacity:.9;cursor:pointer}
.box-sidebar--coupon .tb-accetta input{margin-top:2px}

/* card evento (scheda "tb-", usata dai temi che non montano le .cpn-) */
.tb-ev{margin:0 8px 5px;border:1px solid rgba(0,0,0,.09);border-radius:8px;overflow:hidden;
  background:var(--box-background-b,var(--tb-coupon-foglio,#fff));box-shadow:0 1px 2px rgba(0,0,0,.06)}
.tb-ev-h{display:flex;align-items:center;gap:6px;background:var(--tb-oro);
  color:#3a2f14;padding:4px 8px;font-weight:700;font-size:.84em}
/* 🔴 NEL COUPON NON SI TAGLIA PIU' IL TESTO. Stefano, 30/07 13:28, con la foto: «il coupon non si
   puo' allargare un po'? non si vede niente delle info messe dentro». Nella sua schermata si legge
   «Odd/even…», «Winner: K…», «Import…»: tre puntini al posto del dato.
   Allargare la colonna e' una decisione di impaginazione di TUTTE le pagine, e non e' mia — quella
   gliel'ho chiesta. Ma il taglio del testo si toglie subito: la riga va a capo invece di finire in
   puntini. Il nome dell'incontro sta su due righe al massimo, il resto va a capo quanto serve.
   Un'informazione su due righe si legge; una tagliata a meta' no. */
.tb-ev-name{flex:1;min-width:0;overflow:hidden;white-space:normal;line-height:1.2;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.tb-live{flex:none;background:#e33;color:#fff;font-size:.72em;font-weight:800;
  text-transform:uppercase;padding:1px 5px;border-radius:4px;letter-spacing:.04em}
.tb-banker{flex:none;width:20px;height:20px;border-radius:5px;display:flex;align-items:center;
  justify-content:center;font-weight:900;font-size:.82em;cursor:pointer;
  background:rgba(29,59,90,.25);color:#fff;transition:background .15s}
.tb-banker:hover{background:rgba(29,59,90,.5)}
.tb-banker.on{background:#f60;box-shadow:0 0 0 2px rgba(255,102,0,.25)}
.tb-leg{display:flex;align-items:center;gap:6px;padding:4px 8px 4px 12px;font-size:.84em}
.tb-leg+.tb-leg{border-top:1px dashed rgba(0,0,0,.08)}
.tb-leg-chiusa{opacity:.5}
/* 🔴 TRE RIGHE, non due, sul nome del MERCATO — e non è un capriccio: le traduzioni del
   30-31/07 hanno allungato migliaia di nomi («Marcatore in qualsiasi momento & Risultato
   esatto» contro «Anytime goalscorer & correct score»), e a due righe cominciavano a
   tagliarsi proprio i mercati appena tradotti. Resta un tetto, perché la ragione per cui
   il taglio esiste è ancora vera (Stefano, 30/07: un coupon da otto eventi non deve
   diventare una pagina): si alza di una riga, non si toglie.
   ⚠️ Il nome dell'INCONTRO resta a due righe: lì il testo è «Casa - Ospite» e ci sta. */
.tb-leg-name{flex:1;min-width:0;overflow:hidden;white-space:normal;line-height:1.25;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}
.tb-leg-odds{flex:none;background:rgba(29,59,90,.09);color:var(--tb-blu);
  padding:2px 6px;border-radius:5px;font-size:.95em}
.tb-x{all:unset;cursor:pointer;color:#d33;line-height:1;padding:2px;border-radius:4px}
.tb-x:hover{background:rgba(221,51,51,.12)}

/* schede */
.box-sidebar--coupon .coupon-tabs{margin:2px 8px 0}
/* pannello campi */
.tb-panel{margin:5px 8px;border:1px solid rgba(0,0,0,.09);border-radius:8px;
  background:var(--box-background-b,var(--tb-coupon-foglio,#fff));padding:3px 0;box-shadow:0 1px 2px rgba(0,0,0,.06)}
.tb-cp-row{display:flex;justify-content:space-between;align-items:center;gap:8px;
  padding:3px 10px;min-width:0;font-size:.86em}
/* Le etichette dei totali (Importo, Import totale x4, Quota Tutte Comb.) non si tagliano piu':
   erano proprio quelle che Stefano non riusciva a leggere — e su «Import totale ×4» il pezzo
   tagliato era il NUMERO DI COMBINAZIONI che ci aveva chiesto di far vedere. */
.tb-cp-row>:first-child{flex:1;min-width:0;opacity:.85;white-space:normal;line-height:1.25}
.tb-cp-row>:last-child{font-weight:700;color:var(--tb-blu);white-space:nowrap}
.tb-cp-row.tot{border-top:1px solid rgba(0,0,0,.09);margin-top:2px;padding-top:6px;
  font-size:.94em}
.tb-cp-row.tot>:first-child{opacity:1;font-weight:800}
.tb-amount{width:82px;flex:none;text-align:right;border:1px solid rgba(29,59,90,.35);
  border-radius:6px;padding:3px 7px;font-weight:700;background:#fff;color:#123}
.tb-amount:focus{outline:2px solid rgba(255,102,0,.4);border-color:#f60}

/* righe del sistema */
.tb-sys-row{display:grid;grid-template-columns:minmax(0,1fr) 32px 66px;gap:6px;
  align-items:center;padding:3px 10px;font-size:.86em}
.tb-sys-row.hd{font-weight:800;font-size:.74em;letter-spacing:.05em;opacity:.7;
  padding-bottom:1px;text-transform:uppercase}
.tb-sys-row label{display:flex;gap:6px;align-items:center;cursor:pointer;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tb-sys-row .n{justify-self:center;background:rgba(29,59,90,.09);color:var(--tb-blu);
  font-weight:700;min-width:22px;text-align:center;border-radius:5px;padding:1px 5px;font-size:.9em}
.tb-sys-row .tb-amount{width:100%;padding:2px 5px}
.tb-cp-sub{display:flex;justify-content:space-between;gap:8px;padding:0 10px 4px 30px;
  opacity:.62;font-size:.75em}
.box-sidebar--coupon input[type=checkbox]{accent-color:#f60}

/* bottoni */
.box-sidebar--coupon #placeForm{width:100%}
.box-sidebar--coupon .tb-btns{display:flex;gap:6px;margin:8px 7px 6px}
.box-sidebar--coupon .tb-btns button{flex:1;min-width:0;border:0;cursor:pointer;
  padding:7px 0;font-weight:800;font-size:.72em;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;letter-spacing:.02em;border-radius:999px;
  color:#fff;transition:filter .15s}
.box-sidebar--coupon .tb-btns button:hover{filter:brightness(1.08)}
.box-sidebar--coupon .tb-btns .tb-annulla{background:linear-gradient(180deg,#f0503a,#dd3322)}
.box-sidebar--coupon .tb-btns .tb-scommetti{background:linear-gradient(180deg,#ff8a1e,#f56a00)}
.box-sidebar--coupon .tb-btns button:disabled{opacity:.45;cursor:default;filter:none}

/* PRENOTATORE (classi .pb-/.rd-): il Prenota è SECONDARIO (l'oro resta sul bottone
   che muove soldi), il codice è una card tratteggiata oro, il riscatto un input
   mono maiuscolo. */
.pb-zone{margin:0 8px 8px}
.pb-btn{width:100%;border:1.5px solid var(--tb-blu);background:var(--box-background-b,var(--tb-coupon-foglio,#fff));
  color:var(--tb-blu);border-radius:999px;padding:7px 0;font-weight:800;font-size:.76em;
  letter-spacing:.03em;cursor:pointer;display:inline-flex;align-items:center;
  justify-content:center;gap:7px}
.pb-btn svg{width:14px;height:14px}
.pb-btn:hover{background:rgba(28,66,103,.06)}
.pb-note{font-size:.68em;opacity:.65;margin:5px 2px 0;text-align:center;line-height:1.3}
.pb-done{border:1.5px dashed #F5B301;border-radius:9px;background:#FFFBEE;color:#23303F;
  padding:10px;text-align:center}
.pb-done h4{margin:0 0 2px;font-size:.82em}
.pb-code{font:800 1.45em/1.2 ui-monospace,'SF Mono',Menlo,monospace;
  letter-spacing:.1em;color:#1c4267;margin:5px 0 2px}
.pb-exp{font-size:.72em;color:#6B7A8C;margin:0 0 7px;line-height:1.3}
.pb-exp b{color:#b3651e}
.pb-copy{border:0;cursor:pointer;background:#1c4267;color:#fff;border-radius:999px;
  padding:6px 20px;font-weight:800;font-size:.76em}
.rd-in{display:grid;grid-template-columns:1fr auto;gap:6px;margin:7px 0 0}
.rd-in input{border:1.5px solid rgba(28,66,103,.25);border-radius:7px;padding:8px 9px;
  font:700 .92em/1 ui-monospace,Menlo,monospace;letter-spacing:.08em;
  text-transform:uppercase;min-width:0;background:var(--box-background-b,var(--tb-coupon-foglio,#fff));color:#123}
.rd-in input:focus{outline:2px solid #F5B301;border-color:#F5B301}
.rd-in button{border:0;cursor:pointer;background:#F5B301;color:#23303F;border-radius:7px;
  padding:0 14px;font-weight:800;font-size:.78em}
.tb-msg{margin:0 8px 6px;padding:8px 10px;font-size:.8em;border-radius:0 7px 7px 0;line-height:1.3}
.tb-msg.ok{border-left:3px solid #1f7a3f;background:#F0F9F3;color:#14532d}
.tb-msg.err{border-left:3px solid #d23c3c;background:#FBF1F1;color:#7f1d1d}
[data-tip]{cursor:help}
.tb-cp-row [data-tip], .tb-accetta [data-tip]{border-bottom:1px dotted rgba(0,0,0,.3)}
.tb-vuoto{padding:12px 10px;text-align:center;opacity:.8;font-size:.88em}
.tb-vuoto .input-box{margin-top:8px}

/* ── LE CARD DELLE SELEZIONI (.cpn-, quelle che si vedono dal vivo) ──────────
   Erano il pezzo più arioso del coupon: qui perdono ~20px per selezione senza
   perdere una virgola d'informazione. */
.cpn-card{background:var(--box-background-b,var(--tb-coupon-foglio,#fff));border:1px solid rgba(0,0,0,.10);
  border-radius:8px;margin:0 8px 4px;overflow:hidden;box-shadow:0 1px 2px rgba(0,0,0,.07)}
.cpn-card.is-live{border-left:3px solid #2f9e44}
.cpn-card.cpn-dead{opacity:.55}
.cpn-top{display:flex;align-items:center;gap:6px;padding:2px 8px 0;min-width:0;line-height:1.1}
.cpn-live{flex:none;background:#2f9e44;color:#fff;font-size:.55em;font-weight:900;
  letter-spacing:.05em;text-transform:uppercase;padding:1px 4px;border-radius:3px}
.cpn-comp{flex:1;min-width:0;font-size:.62em;color:#8a97a6;font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cpn-banker{flex:none;width:16px;height:16px;border-radius:5px;display:flex;
  align-items:center;justify-content:center;font-weight:900;font-size:.72em;cursor:pointer;
  background:rgba(29,59,90,.22);color:#123;transition:background .15s}
.cpn-banker.on{background:#f60;color:#fff;box-shadow:0 0 0 2px rgba(255,102,0,.25)}
.cpn-match{padding:0 8px 2px;font-weight:700;font-size:.78em;color:#12314f;
  display:flex;align-items:baseline;gap:5px;flex-wrap:nowrap;line-height:1.15}
/* il nome sta su UNA riga: andando a capo si portava dietro 14px per selezione, ed è
   la ragione per cui il coupon restava alto anche coi padding ridotti. Tagliato con
   i puntini — il nome intero resta nel `title` e nella pagina dell'evento. */
.cpn-match>span:first-child{min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.cpn-match .cpn-score{color:#d98a15;font-weight:800;font-size:.92em;font-variant-numeric:tabular-nums}
.cpn-leg{display:flex;align-items:center;gap:7px;padding:1px 8px 2px;
  border-top:1px dashed rgba(0,0,0,.08)}
.cpn-odds{flex:none;min-width:40px;text-align:center;background:rgba(29,59,90,.08);
  color:#12314f;font-weight:800;font-size:.8em;padding:1px 6px;border-radius:5px;
  font-variant-numeric:tabular-nums}
.cpn-leg-txt{flex:1;min-width:0;font-size:.7em;line-height:1.2;color:#5b6b7c;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cpn-leg-txt b{color:#12314f}
.cpn-leg-txt .cpn-closed{color:#d33;font-weight:700}
/* LA «X» CHE TOGLIE UNA SELEZIONE (Jesper, 08/08). Misurata prima di toccarla, su un coupon
   vero servito da studio5: era **4×4 px** — il font-icona `mdi` su questa skin non c'è, lo
   `<span>` vuoto collassava e restavano i 2px di padding. Adesso porta un SVG.

   🔴 IL BERSAGLIO È 32×32, e il numero non è estetico. Il minimo raccomandato per un dito è
   ~44px (WCAG 2.5.8 ne chiede 24 come soglia dura); qui la riga della selezione è alta ~22px
   e un bersaglio da 44 la sfonderebbe, allungando un coupon che è già stato accorciato apposta
   (vedi `.cpn-match`, «il nome sta su UNA riga»). 32 sta dentro la riga, è sopra la soglia dura,
   ed è otto volte l'area di prima.
   ⚠️ Il `margin` negativo tiene il bersaglio GRANDE senza far crescere la riga: l'area
   cliccabile esce dai bordi del testo, l'altezza della card no. È la differenza fra quello che
   si vede e quello che si tocca — e per un dito conta il secondo.

   📌 E NON SI RAGGIUNGE PER SBAGLIO da dove si aggiunge (punto 3 della card): la «x» sta nel
   PANNELLO del coupon, i bersagli che aggiungono una quota stanno nel palinsesto. Misurato sul
   servito a 390px e a 1440px: nel pannello non c'è **nessun** comando che aggiunga — zero
   bersagli di aggiunta a qualunque distanza. Non si toccano perché non convivono. */
.cpn-x{all:unset;flex:none;cursor:pointer;color:#8b9bab;line-height:0;
  display:inline-flex;align-items:center;justify-content:center;
  width:32px;height:32px;margin:-5px -6px -5px 0;border-radius:8px;
  -webkit-tap-highlight-color:transparent;transition:background .15s,color .15s}
.cpn-x:hover,.cpn-x:focus-visible{background:rgba(221,51,51,.12);color:#d33}
.cpn-x:focus-visible{outline:2px solid #d33;outline-offset:-2px}
.cpn-x:active{background:rgba(221,51,51,.22);color:#b02525}

/* ── STATI DELLO SLIP VELOCE (li mette e li toglie il JS in schedina.html) ────
   La selezione che togli sparisce SUBITO (non aspetta il giro sul server) e i
   NUMERI del pannello si velano finché non arrivano quelli veri dal motore:
   il coupon non mostra mai una cifra inventata, e non resta mai fermo a mentire. */
.cpn-card.cpn-va{opacity:0;transform:translateX(14px);height:0;margin:0 8px;
  transition:opacity .12s ease,transform .12s ease,height .12s ease}
.box-sidebar--coupon.tb-aggiorna .tb-panel,
.box-sidebar--coupon.tb-aggiorna .tb-cp-row>:last-child{opacity:.45;
  transition:opacity .12s ease}
.box-sidebar--coupon.tb-aggiorna .tb-btns button{pointer-events:none;opacity:.6}
/* filo di avanzamento sotto la testata: dice «sto aggiornando» senza rubare spazio */
.box-sidebar--coupon.tb-aggiorna .tb-head{position:relative}
.box-sidebar--coupon.tb-aggiorna .tb-head::after{
  content:"";position:absolute;left:10px;right:10px;bottom:0;height:2px;border-radius:2px;
  background:linear-gradient(90deg,transparent,#f60,transparent);
  animation:tb-filo 900ms linear infinite}
@keyframes tb-filo{0%{transform:translateX(-40%)}100%{transform:translateX(40%)}}
@media (prefers-reduced-motion:reduce){
  .cpn-card.cpn-va{transition:none}
  .box-sidebar--coupon.tb-aggiorna .tb-head::after{animation:none}
}

/* ════════════════════════════════════════════════════════════════════════════
   COUPON VUOTO — layout del mock Dav (23/07): messaggio + «Codice evento» con
   Salva / Carica. «Carica» = riscatto attuale; «Salva» crea il codice dal coupon
   (disabilitato a coupon vuoto). CSS in file (regola Dav). Colori dalle var del tema.
   ──────────────────────────────────────────────────────────────────────────── */
.cpn-save-form{display:contents}
.cpn-code{padding:0 10px 12px}
.cpn-code-h{font-size:.72em;font-weight:800;letter-spacing:.08em;text-transform:uppercase;
  color:#5b7793;margin:2px 0 6px}
.cpn-code-in{width:100%;border:1.5px solid rgba(28,66,103,.25);border-radius:8px;
  padding:9px 10px;font:700 .92em/1 ui-monospace,Menlo,monospace;letter-spacing:.08em;
  text-transform:uppercase;background:var(--box-background-b,var(--tb-coupon-foglio,#fff));color:#123;min-width:0}
.cpn-code-in::placeholder{text-transform:none;letter-spacing:0;color:#9fb0c2;font-weight:600}
.cpn-code-in:focus{outline:2px solid #F5B301;border-color:#F5B301}
.cpn-code-btns{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px}
.cpn-code-btns button{border:0;cursor:pointer;border-radius:8px;padding:10px 8px;
  font-weight:800;font-size:.82em}
/* Salva = azione verde (crea codice); Carica = riscatta (grigio-navy, come il mock) */
.cpn-save{background:#7dac2e;color:#fff}
.cpn-save:hover{filter:brightness(1.05)}
.cpn-save:disabled{background:#cdd9e6;color:#8aa0b4;cursor:not-allowed}
.cpn-load{background:#dfe9f4;color:#1c4267}
.cpn-load:hover{background:#cfe0f0}

/* NIENTE LIVE NELLA PRENOTAZIONE (Angelo 29/07): il perché, accanto al bottone spento. Non è un
   errore rosso da allarme — è un'istruzione: dice quale evento togliere, e si legge in un colpo. */
.cpn-live-blocco{margin:8px 0 0;padding:8px 10px;border-radius:8px;font-size:.78em;
  line-height:1.45;font-weight:700;background:#fff4d6;color:#7a4a00;border:1px solid #f0c86a}


/* Come in casa.css: i nomi nelle carte «cpn-» vanno a capo invece di finire in puntini
   (Stefano 30/07). Due righe al massimo — un coupon da otto eventi non deve diventare una
   pagina. Tenerlo in un foglio solo vorrebbe dire due coupon diversi a seconda del tema. */
.cpn-match>span:first-child{white-space:normal;line-height:1.15;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.cpn-leg-txt{white-space:normal;line-height:1.2;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}

/* IL PERCHE' DEL TAGLIO sotto la vincita, nella schedina (Alessio 30/07): la riga sta stretta e
   piccola, perche' e' una spiegazione — il numero resta la cosa che si legge per prima. */
.tb-cp-row.tb-limite-perche{font-size:.78em;opacity:.85;line-height:1.25}
.tb-cp-row.tb-limite-perche span{white-space:normal}


/* «GIOCHI PER»: L'ELENCO VA A CAPO, NON SI STRINGE (Angelo, 31/07 22:35: «sistema meglio nello
   spazio», con la foto in cui il saldo era tagliato a metà — «€ 45C…» invece dell'importo).

   La riga era etichetta + tendina sulla STESSA linea: in una colonna stretta come il coupon la
   tendina veniva schiacciata e mangiava proprio la fine, cioè il SALDO. Ed è il pezzo per cui
   quel saldo era stato messo lì (Stefano, 30/07: «si tratta di denaro», serve a decidere se
   spuntare la ricarica automatica). Un numero tagliato a metà è peggio di un numero assente:
   «€ 45» e «€ 450» si leggono uguale finché non ci si fa male.

   🔴 RIMESSO IL 03/08 DAL PM — è la SECONDA volta che questa regola sparisce. La prima si era
   persa perché viveva solo nel pacchetto generato; questa volta è stata cancellata dal sorgente
   (vedi il registro, voce L2). Dav e Stefano l'hanno rivista tornata indietro lo stesso giorno.
   Se la tocchi, il posto giusto è QUI — `casa.css` è generato e riscritto da capo. */
.tb-cp-row.tb-per-conto{ flex-direction:column; align-items:stretch; gap:3px; }
.tb-cp-row.tb-per-conto > select{ width:100%; max-width:100%; }

/* player/sport_albero.css */
/* IL VESTITO DELLA TENDINA SPORT A TRE LIVELLI — sport → area → campionato.

   🔴 PERCHÉ È UN FOGLIO E NON UNO `<style>` (08/08). Queste regole stavano nello `<style>` di
   `widgets/_cms.html`, cioè **solo nella pagina composta**. Quando Jesper ha chiesto lo stesso
   menu anche su `/player/eventi-giorno/scegli` e `…/selezione` (08/08 08:55, «un solo menu
   riusabile, non tre copie»), il markup ci è arrivato — misurato, tre livelli su tutt'e due —
   e il vestito no: quelle pagine non hanno quello `<style>`.

   È la stessa famiglia già pagata due volte qui: il marchio a 100px (regola nello `<style>`
   della composizione, pagina non composta) e il «Campionati Top» (markup condiviso, foglio che
   non lo seguiva). **Un markup che si riusa vuole un foglio che si riusa.**

   ⚠️ SONO VENUTE VIA ANCHE LE TRE REGOLE BASE (`.wdg-sports-menu`, `.wdg-sport`, `.wdg-sport.on`)
   e non è un di più: la base diceva `flex-wrap:wrap` e la tendina la ribalta a `column`. Lasciando
   la base nello `<style>` — che sulla pagina composta si carica DOPO i fogli — avrebbe vinto lei,
   e la home sarebbe tornata alle pastiglie a capo con l'albero dentro. Le due regole si
   contraddicono di mestiere: devono stare dalla stessa parte.

   📌 Il markup sta in `player/_sport_albero.html`, incluso dal widget e da `_rail_sport.html`.
   ⚠️ Questo foglio entra nel pacchetto `casa.css` (`mobile.FOGLI`): chi lo tocca deve rilanciare
   `manage.py costruisci_css_casa`, o la regola resta fuori dal pacchetto senza un errore. */
.wdg-sports-menu{display:flex;flex-wrap:wrap;gap:6px}
.wdg-sport{padding:7px 12px;border-radius:999px;background:var(--navy-1,#0a3350);color:var(--ink,#eaf2f8);
  text-decoration:none;font-size:13px}
.wdg-sport.on,.wdg-sport:hover{background:var(--or,#ff7900);color:var(--on-or,#2b1400)}
/* 🔴 LA TENDINA SPORT A TRE LIVELLI — sport → area → campionato (Jesper, 08/08).
   Lui ha scritto `<ul><li><a>`; il gesto è quello di casa (`<details>/<summary>`, nessun JS).
   Qui sotto c'è solo l'impaginazione: chi apre e chi chiude lo fa il browser.

   ⚠️ IL CONTENITORE PASSA DA «CHIP A CAPO» A COLONNA, e va detto perché è la riga che cambia
   l'aspetto di tutto il blocco: `.wdg-sports-menu` era `flex-wrap`, cioè gli sport erano
   pastiglie che andavano a capo (è quello che si vede nello scatto «prima»). Un albero dentro
   un contenitore che manda a capo esce a scale. Le due voci di B45 sopra la tendina restano
   dove sono: sono figlie dello stesso `<nav>` e la colonna le impila per prime, com'erano.

   📌 I tre `<ul>` non hanno pallini e rientrano di poco: il rientro **dice il livello**, ed è
   l'unica cosa che distingue a occhio un'area da un campionato quando i nomi sono lunghi. */
.wdg-sports-menu{flex-direction:column;flex-wrap:nowrap;align-items:stretch}
.wdg-sport-l1,.wdg-sport-l2,.wdg-sport-l3{list-style:none;margin:0;padding:0}
.wdg-sport-l2{padding-inline-start:10px}
.wdg-sport-l3{padding-inline-start:12px}
/* la riga dello sport resta la pastiglia di prima, ma ora è un `<summary>`: `list-style:none`
   toglie il triangolino nativo (che su Safari vuole anche `::-webkit-details-marker`), e
   `cursor:pointer` dice che si apre. Il NOME dentro è un `<a>` e si deve poter cliccare: eredita
   il colore invece di prendere quello dei link, o sulla pastiglia arancione sparirebbe. */
.wdg-sport-tendina .wdg-sport{display:flex;align-items:center;gap:8px;cursor:pointer;
  margin-block-end:2px}
.wdg-sport-tendina .wdg-sport::-webkit-details-marker{display:none}
.wdg-sport-tendina summary{list-style:none}
.wdg-sport-tendina summary::-webkit-details-marker{display:none}
.wdg-sport-nome{color:inherit;text-decoration:none}
/* area e campionato: righe basse, il numero delle partite a destra e in tono minore — è un
   conteggio, non un titolo. `justify-content:space-between` incolonna i numeri fra loro. */
.wdg-sport-area,.wdg-sport-lega{display:flex;align-items:center;gap:8px;padding:6px 10px;
  border-radius:8px;color:var(--ink,#eaf2f8);text-decoration:none;font-size:13px}
.wdg-sport-area{cursor:pointer}
.wdg-sport-area:hover,.wdg-sport-lega:hover{background:var(--navy-2,#0f3f61)}
/* 🔴 IL NOME SPINGE IL NUMERO A DESTRA anche sulla riga dello SPORT (Jesper, 08/08: il totale
 * eventi accanto allo sport). Questa regola c'era per l'area e il campionato e non per lo sport,
 * perché lo sport un numero non ce l'aveva: senza, «Calcio» e «175» restano appiccicati e i tre
 * numeri dei tre livelli non si incolonnano — che è tutto il motivo per cui hanno la stessa classe.
 * ⚠️ `.wdg-sport-tendina` davanti: `.wdg-sport-nome` da solo vive anche fuori dalla tendina. */
.wdg-sport-tendina .wdg-sport > .wdg-sport-nome{flex:1;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.wdg-sport-area .wdg-sport-nome,.wdg-sport-lega .wdg-sport-nome{flex:1;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wdg-sport-n{color:var(--mute,#9fbdd2);font-size:12px;font-variant-numeric:tabular-nums}
/* ⛔ La bandiera/logo esce SOLO se il template ne ha una: mai un riquadro rotto. La misura sta
   qui perché `.ico img{width:100%}` di `tb.css` gonfierebbe l'immagine — è il difetto dei
   «palloni giganti», già curato tre volte altrove.
   ⚠️ E niente tag di template dentro questi commenti CSS: `_cms.html` È un template Django,
   quindi un `{`+`% if %}` scritto «per spiegare» verrebbe eseguito, non letto. */
.wdg-sport-flag{width:18px;height:13px;object-fit:contain;flex:0 0 auto;border-radius:2px}
/* ─────────────────── IL FILTRO DEL MENU SPORT (Dav, 11/08 09:25) ───────────────────
   Un campo, dentro il widget del menu, che nasconde i rami che non contengono la parola —
   le voci di questo menu e, sulla pagina «scegli», l'albero Sport › Nazione › Competizione.

   ⛔ NESSUN COLORE PROPRIO: eredita quelli del menu in cui vive (`currentColor` e uno sfondo
   appena percettibile), così esce giusto su tutte le skin di casa senza una palette in più —
   e non si ripete il difetto del riquadro chiaro su tema scuro.
   📌 `appearance:none` toglie la lente grigia che Safari disegna dentro i `type=search`. */
.wdg-sport-filtro{padding:6px 8px}
.wdg-sport-filtro input{
  width:100%;box-sizing:border-box;padding:7px 10px;border-radius:8px;
  border:1px solid rgba(127,127,127,.35);background:rgba(127,127,127,.10);
  color:inherit;font:inherit;font-size:.92em;-webkit-appearance:none;appearance:none}
.wdg-sport-filtro input::placeholder{color:currentColor;opacity:.55}
.wdg-sport-filtro input:focus{outline:2px solid rgba(127,127,127,.45);outline-offset:1px}

/* player/footer_tb.css */
/* Footer TimerBet (partial _footer_tb.html)
   Estratto dal partial (regola di casa Dav 22/07: il CSS sta in un .css
   collegato con <link> nell'head, mai in <style> nel template).
   Design D. */

.tbf { background: linear-gradient(180deg, #0b1826, #0a1220); color: #C7D3E2;
    font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    border-top: 2px solid #F5B301; margin-top: 32px; }
  .tbf * { box-sizing: border-box; }
  .tbf a { color: #C7D3E2; text-decoration: none; }
  .tbf a:hover { color: #F5B301; }
  .tbf :focus-visible { outline: 2px solid #F5B301; outline-offset: 2px; border-radius: 4px; }
  .tbf-in { max-width: 1200px; margin: 0 auto; padding: 30px 20px 18px; }

  .tbf-brand { margin-bottom: 22px; }
  .tbf-logo { display: inline-flex; align-items: center; gap: 10px;
    font-size: 22px; font-weight: 800; letter-spacing: 0.02em; color: #fff; }
  .tbf-logo b { color: #F5B301; font-weight: 800; }
  .tbf-min { display: inline-grid; place-items: center; min-width: 34px; height: 34px;
    padding: 0 4px; border: 2px solid #F5B301; border-radius: 50%;
    font: 700 13px/1 ui-monospace, "SF Mono", Menlo, monospace; color: #F5B301; }
  .tbf-tag { margin: 8px 0 0; font-size: 12.5px; color: #7E8CA0; }

  /* ⚠️ `minmax(0, 1fr)` e non `1fr`: una traccia `1fr` ha larghezza minima AUTO, cioè non
     scende mai sotto il suo contenuto — una voce lunga («Gioco responsabile») allarga la
     colonna, la griglia sfonda il contenitore e a 320px il piede esce dallo schermo con dentro
     «Deposita», «Preleva», «Le mie scommesse». Misurato il 04/08: colonne da 123px col bordo
     destro a 361 su uno schermo da 320. Con `minmax(0, …)` la traccia può stringersi e il
     testo va a capo. */
  .tbf-cols { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 18px;
    padding: 18px 0 22px; border-top: 1px solid #16283C; }
  .tbf-col { min-width: 0; }
  .tbf-col a, .tbf-col h3 { overflow-wrap: anywhere; }
  .tbf-col { display: flex; flex-direction: column; gap: 9px; }
  .tbf-col h3 { margin: 0 0 3px; font-size: 11px; font-weight: 700;
    letter-spacing: 0.12em; text-transform: uppercase; color: #F5B301; }
  .tbf-col a { font-size: 13.5px; line-height: 1.4; }
  .tbf-col a[href="#"] { color: #7E8CA0; cursor: default; }

  .tbf-legal { display: flex; align-items: center; gap: 14px;
    padding: 16px 0; border-top: 1px solid #16283C; }
  .tbf-18 { flex: 0 0 auto; display: grid; place-items: center; width: 42px; height: 42px;
    border: 2.5px solid #F5B301; border-radius: 50%;
    font: 800 15px/1 system-ui, sans-serif; color: #F5B301; }
  .tbf-legal p { margin: 0; font-size: 12.5px; line-height: 1.5; color: #93A2B5; }

  .tbf-fine { padding-top: 12px; border-top: 1px solid #16283C;
    font-size: 11.5px; color: #5D6B80; }

  @media (max-width: 760px) {
    .tbf-cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .tbf-in { padding-bottom: 84px; } /* aria per la bottom-nav mobile */
  }

  /* Sotto i 430px due colonne non ci stanno più: 320 meno i margini lascia ~140px a colonna,
     e le voci del piede sono frasi, non parole. Una sotto l'altra si leggono; affiancate no. */
  @media (max-width: 430px) {
    .tbf-cols { grid-template-columns: minmax(0, 1fr); gap: 14px; }
    .tbf-in { padding-left: 14px; padding-right: 14px; }
  }

/* player/tooltip.css */
/* Tooltip del player (partial _tooltip.html)
   Estratto dal partial (regola di casa Dav 22/07: il CSS sta in un .css
   collegato con <link> nell'head, mai in <style> nel template).
   Design D. */

/* la bolla vive su un pseudo-elemento: zero nodi in più nel DOM di B */
  .tb-tip { position: relative; }
  .tb-tip[data-tb-tip]::after,
  .tb-tip[data-tb-tip]::before {
    position: absolute; left: 50%; bottom: 100%;
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: opacity .12s ease, transform .12s ease;
    transform: translate(-50%, 4px); z-index: 60;
  }
  /* la bolla.
     ⚠️ CONTRASTO: la bolla è CROMO, colori FISSI (non var di tema). Il tema chiaro
     del prematch definisce `--ink:#1c2733` (scuro): usarlo qui dava testo scuro su
     bolla scura = illeggibile (segnalazione Angelo). Qui fondo scuro + testo chiaro,
     garantiti su ogni skin. */
  .tb-tip[data-tb-tip]::after {
    content: attr(data-tb-tip);
    margin-bottom: 9px;
    max-width: min(240px, 86vw); width: max-content;   /* mai più largo dello schermo */
    padding: 7px 10px; border-radius: 8px;
    background: #0c2740;
    color: #f2f8ff;
    border: 1px solid #1c4f78;
    border-top: 2px solid #ff7900;   /* filo del brand */
    box-shadow: 0 8px 22px rgba(2, 12, 22, .55);
    font: 600 12px/1.35 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    letter-spacing: .01em;
    text-align: center; white-space: normal; overflow-wrap: anywhere;
  }
  /* la freccina — un rombo ruotato, stesso fondo e bordo della bolla */
  .tb-tip[data-tb-tip]::before {
    content: ""; margin-bottom: 4px;
    width: 9px; height: 9px; transform: translate(-50%, 4px) rotate(45deg);
    background: #0c2740;
    border-right: 1px solid #1c4f78;
    border-bottom: 1px solid #1c4f78;
  }
  /* comparsa su hover E focus (tastiera / tap mobile) */
  .tb-tip[data-tb-tip]:hover::after,
  .tb-tip[data-tb-tip]:hover::before,
  .tb-tip[data-tb-tip]:focus-visible::after,
  .tb-tip[data-tb-tip]:focus-visible::before,
  .tb-tip[data-tb-tip].is-tip-open::after,
  .tb-tip[data-tb-tip].is-tip-open::before {
    opacity: 1; visibility: visible; transform: translate(-50%, 0);
  }
  .tb-tip[data-tb-tip]:hover::before,
  .tb-tip[data-tb-tip]:focus-visible::before,
  .tb-tip[data-tb-tip].is-tip-open::before {
    transform: translate(-50%, 0) rotate(45deg);
  }

  /* variante che scende (header colonne mercato, in cima alla pagina) */
  .tb-tip[data-tb-tip-pos="down"]::after,
  .tb-tip[data-tb-tip-pos="down"]::before { bottom: auto; top: 100%; }
  .tb-tip[data-tb-tip-pos="down"]::after { margin: 9px 0 0; }
  .tb-tip[data-tb-tip-pos="down"]::before {
    margin: 4px 0 0; border: 0;
    border-left: 1px solid var(--line, #16496b);
    border-top: 1px solid var(--line, #16496b);
  }

  /* nome troncato: l'ellissi vive sull'inner .tb-trunc (che PUÒ clippare, non porta la
     bolla); il wrapper .tb-tip resta senza overflow, così la bolla non viene ritagliata. */
  .tb-trunc { overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    display: block; max-width: 100%; min-width: 0; }
  .tb-tip:has(> .tb-trunc) { display: block; min-width: 0; }
  .tb-tip[data-tb-tip] .tb-trunc { cursor: help; }

  /* ANCORAGGIO ORIZZONTALE per le celle a filo schermo: la bolla si aggancia al
     bordo sinistro (start) o destro (end) dell'elemento invece di centrarsi, così
     non esce dallo schermo e non viene tagliata. La FRECCIA resta centrata sulla
     cella (punta sempre al numero). Lo mette chi conosce la colonna (prematch:
     prima colonna=start, ultima=end; vedi prematch.css). */
  .tb-tip[data-tb-tip][data-tb-tip-align="start"]::after { left: 0; right: auto; transform: translate(0, 4px); }
  .tb-tip[data-tb-tip][data-tb-tip-align="end"]::after   { left: auto; right: 0; transform: translate(0, 4px); }
  .tb-tip[data-tb-tip][data-tb-tip-align="start"]:hover::after,
  .tb-tip[data-tb-tip][data-tb-tip-align="start"]:focus-visible::after,
  .tb-tip[data-tb-tip][data-tb-tip-align="start"].is-tip-open::after,
  .tb-tip[data-tb-tip][data-tb-tip-align="end"]:hover::after,
  .tb-tip[data-tb-tip][data-tb-tip-align="end"]:focus-visible::after,
  .tb-tip[data-tb-tip][data-tb-tip-align="end"].is-tip-open::after { transform: translate(0, 0); }

  @media (prefers-reduced-motion: reduce) {
    .tb-tip[data-tb-tip]::after, .tb-tip[data-tb-tip]::before { transition: none; }
  }

/* player/bottom_nav.css */
/* Barra in basso (partial _bottom_nav.html)
   Estratto dal partial (regola di casa Dav 22/07: il CSS sta in un .css
   collegato con <link> nell'head, mai in <style> nel template).
   Design D. */

@media (hover: none){
  .hd-ctm--menu ul.hd-menu--list > li:hover > .hd-submenu--container{display:none}
  .hd-ctm--menu ul.hd-menu--list > li.tbm-open > .hd-submenu--container{display:block}
}

/* player/home_tabs.css */
/* ============================================================================
   HOME — PIECE 1: riga RAGGRUPPAMENTI + riga SPORT
   Richiesta Dav (rif. Dav_modifica_non_fatta.png). Tema scuro nostro.
   Solo struttura vestita: il comportamento (click raggruppamento → sport,
   click sport → contenuto) lo wira B col partial-load.
   Design D, 22-07-2026.

   ⚠️ Due varianti di colore, si sceglie con UNA classe sul contenitore:
     .hm            → tema scuro nostro (accento arancio)   ← default
     .hm.hm--vivid  → lettura letterale del riferimento: raggruppamenti ROSSI
                      e sport VERDE fluo
   (Nel riferimento i rettangoli rosso/verde sono le ANNOTAZIONI di Dav sopra
   lo screenshot, non i colori del sito: lì i tab sono bianchi su blu. Lascio
   entrambe pronte, sceglie Dav/GC.)
   ========================================================================== */

.hm{
  --hm-bg:#0a3350;          /* fondo delle due righe */
  --hm-bg2:#052033;         /* riga sport, un gradino più scura */
  --hm-line:#16496b;
  --hm-ink:#eaf2f8;
  --hm-dim:#9fbdd2;
  --hm-acc:#ff7900;         /* accento: attivo */
  --hm-acc-ink:#2b1400;     /* testo sopra l'accento */
  --hm-live:#ff3b3b;
  background:var(--hm-bg);
  border:1px solid var(--hm-line);
  border-radius:10px;
  overflow:visible;   /* i dropdown (cascata) devono poter uscire */
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  color:var(--hm-ink);
}
.hm *{box-sizing:border-box}

/* variante "come le annotazioni": rosso + verde fluo */
.hm.hm--vivid{ --hm-acc:#e0322b; --hm-acc-ink:#fff; }
.hm.hm--vivid .hm-sports{ --hm-acc:#3ef07a; --hm-acc-ink:#042312; }

/* ───────────────────────── riga 1 · RAGGRUPPAMENTI ───────────────────────── */
.hm-groups{
  display:flex; align-items:stretch; gap:2px;
  padding:0 8px; border-radius:10px 10px 0 0;
  border-block-end:1px solid var(--hm-line);
  overflow-x:auto; scrollbar-width:none;
}
.hm-groups::-webkit-scrollbar{display:none}

/* le briciole a sinistra (casa › sport › torneo) come nel riferimento */
.hm-crumbs{
  display:flex; align-items:center; gap:7px; flex:none;
  padding-inline-end:10px; margin-inline-end:4px;
  border-inline-end:1px solid var(--hm-line);
  color:var(--hm-dim);
}
.hm-crumbs span{display:grid;place-items:center;width:22px;height:22px;cursor:pointer}
.hm-crumbs span:hover{color:var(--hm-ink)}

.hm-g{
  flex:none; position:relative; cursor:pointer;
  padding:12px 14px 11px;
  font-size:13.5px; font-weight:700; white-space:nowrap;
  color:var(--hm-dim); background:transparent; border:0;
  transition:color .12s;
}
.hm-g:hover{color:var(--hm-ink)}
/* attivo: testo pieno + filo d'accento sotto (non un pill: la riga resta pulita) */
.hm-g.on{color:var(--hm-ink)}
.hm-g.on::after{
  content:""; position:absolute; inset-inline:10px; inset-block-end:0;
  height:3px; border-radius:3px 3px 0 0; background:var(--hm-acc);
}
.hm-g:focus-visible{outline:2px solid var(--hm-acc);outline-offset:-3px;border-radius:6px}

/* nella variante vivid l'attivo è una pastiglia piena, come i tab del riferimento */
.hm--vivid .hm-g.on{
  background:var(--hm-acc); color:var(--hm-acc-ink); border-radius:6px;
  margin-block:6px; padding-block:6px;
}
.hm--vivid .hm-g.on::after{display:none}

/* ───────────────────────────── riga 2 · SPORT ───────────────────────────── */
.hm-sports{
  display:flex; align-items:center; gap:6px;
  padding:0 8px; background:var(--hm-bg2); border-radius:0 0 10px 10px;
}
/* SOLO gli sport scorrono; interruttore a sx e controlli a dx restano FISSI */
.hm-s-scroll{
  flex:1 1 auto; min-width:0;
  display:flex; align-items:center; gap:2px;
  overflow-x:auto; scrollbar-width:none;
}
.hm-s-scroll::-webkit-scrollbar{display:none}

/* interruttore «Con live streaming», a sinistra come nel riferimento */
.hm-stream{
  display:flex; align-items:center; gap:8px; flex:none;
  padding-inline-end:12px; margin-inline-end:6px;
  border-inline-end:1px solid var(--hm-line);
  color:var(--hm-dim); font-size:12.5px; font-weight:600; white-space:nowrap;
  cursor:pointer;
}
.hm-stream i{
  width:32px; height:18px; border-radius:999px; background:#123c5c;
  border:1px solid var(--hm-line); position:relative; flex:none; transition:background .15s;
}
.hm-stream i::after{
  content:""; position:absolute; inset-block-start:2px; inset-inline-start:2px;
  width:12px; height:12px; border-radius:50%; background:var(--hm-dim); transition:.15s;
}
.hm-stream.on i{background:var(--hm-acc);border-color:var(--hm-acc)}
.hm-stream.on i::after{inset-inline-start:16px;background:#fff}
.hm-stream.on{color:var(--hm-ink)}

.hm-s{
  flex:none; display:inline-flex; align-items:center; gap:7px; cursor:pointer;
  padding:9px 12px; border:0; background:transparent;
  font-size:13px; font-weight:700; white-space:nowrap; color:var(--hm-dim);
  border-radius:7px; transition:color .12s,background .12s;
}
.hm-s img,.hm-s svg{width:18px;height:18px;flex:none;opacity:.85}
.hm-s:hover{color:var(--hm-ink);background:rgba(255,255,255,.06)}
.hm-s:hover img,.hm-s:hover svg{opacity:1}
.hm-s.on{color:var(--hm-acc)}
.hm-s.on img,.hm-s.on svg{opacity:1}
.hm-s.on::after{
  content:""; position:absolute; inset-inline:8px; inset-block-end:2px; height:2px;
  border-radius:2px; background:var(--hm-acc);
}
.hm-s{position:relative}
.hm-s:focus-visible{outline:2px solid var(--hm-acc);outline-offset:-2px}
/* pallino LIVE sullo sport che ha eventi in corso */
.hm-s .hm-dot{
  width:7px;height:7px;border-radius:50%;background:var(--hm-live);flex:none;
  box-shadow:0 0 0 2px rgba(255,59,59,.22);
}
/* nella variante vivid lo sport attivo è pieno di verde fluo */
.hm--vivid .hm-s.on{background:var(--hm-acc);color:var(--hm-acc-ink)}
.hm--vivid .hm-s.on::after{display:none}

/* le due icone a destra (altri sport / e-sport) — FISSE, non scorrono */
.hm-more{display:flex;align-items:center;gap:4px;flex:none;
  padding-inline-start:10px;border-inline-start:1px solid var(--hm-line)}
.hm-more button{
  display:inline-flex;align-items:center;gap:4px;cursor:pointer;
  background:transparent;border:0;color:var(--hm-dim);padding:7px 9px;border-radius:7px;
  font-size:13px;
}
.hm-more button:hover{color:var(--hm-ink);background:rgba(255,255,255,.06)}

/* ─────────────────────────────── responsive ─────────────────────────────── */
@media (max-width:760px){
  .hm-crumbs{display:none}                 /* le briciole non servono sul telefono */
  .hm-g{padding:10px 11px;font-size:12.5px}
  .hm-s{padding:8px 10px;font-size:12.5px}
  .hm-stream span{display:none}            /* resta solo l'interruttore */
}
@media (prefers-reduced-motion:reduce){
  .hm-g,.hm-s,.hm-stream i,.hm-stream i::after{transition:none}
}

/* ============================================================================
   PREMATCH — lato DESTRO della barra sport: SELECT vestita + toolbar icone
   (dalla prematch.html di Dav: select `.select-input` in alto a destra + icone
   print/view/sorting/largeView…). Usa l'icon-pack (`iconpack.css`, classi .ic-ui--*).
   Va DENTRO `.hm-sports`, dopo `.hm-more` (o al posto suo). Design D, 22-07-2026.
   ========================================================================== */

/* la select vestita del tema, portata sul nostro scuro */
.hm-select{position:relative;flex:none;margin-inline-start:8px}
.hm-select select{
  appearance:none;-webkit-appearance:none;
  background:var(--navy-2,#0f3f61);color:var(--hm-ink,#eaf2f8);
  border:1px solid var(--hm-line,#16496b);border-radius:7px;
  padding:7px 30px 7px 11px;font:inherit;font-size:12.5px;font-weight:600;
  cursor:pointer;outline:none;
}
.hm-select select:hover{border-color:var(--hm-dim,#9fbdd2)}
.hm-select select:focus{border-color:var(--hm-acc,#ff7900)}
.hm-select .ic{position:absolute;inset-block-start:50%;inset-inline-end:9px;
  transform:translateY(-50%);pointer-events:none;color:var(--hm-dim,#9fbdd2);font-size:16px}

/* la barra di icone (view/print/sorting…) */
.hm-tools{display:flex;align-items:center;gap:2px;flex:none;margin-inline-start:6px}
.hm-tool{
  width:32px;height:32px;flex:none;cursor:pointer;border:0;border-radius:7px;
  background:transparent;color:var(--hm-dim,#9fbdd2);
  display:grid;place-items:center;transition:background .12s,color .12s;
}
.hm-tool .ic{font-size:18px}
.hm-tool:hover{background:rgba(255,255,255,.06);color:var(--hm-ink,#eaf2f8)}
.hm-tool.on{color:var(--hm-acc,#ff7900)}          /* vista attiva (es. largeView) */
.hm-tool.on{background:rgba(255,121,0,.12)}
.hm-tool:focus-visible{outline:2px solid var(--hm-acc,#ff7900);outline-offset:-2px}
.hm-tools .sep{width:1px;height:20px;background:var(--hm-line,#16496b);margin:0 4px;flex:none}

@media (max-width:760px){
  .hm-select select{padding-block:6px;font-size:12px}
  .hm-tool{width:30px;height:30px}
}

/* ============================================================================
   HOME — PIECE 2: «Cerca» in alto a destra (riga raggruppamenti) + PIECE 3: box
   con le 2 icone a CASCATA (altri sport / e-sport) sulla riga sport.
   Estende home_tabs.css. Design D, 22-07-2026. Comportamento (apri/filtra) = B.
   ========================================================================== */

/* --- riga raggruppamenti: i gruppi scorrono, il CERCA resta FISSO a destra --- */
.hm-groups{gap:6px}
.hm-g-scroll{
  flex:1 1 auto;min-width:0;display:flex;align-items:stretch;gap:2px;
  overflow-x:auto;scrollbar-width:none;
}
.hm-g-scroll::-webkit-scrollbar{display:none}
.hm-search{
  flex:none;margin-inline-start:8px;align-self:center;position:relative;
}
.hm-search input{
  width:200px;max-width:38vw;
  background:var(--navy-2,#0f3f61);border:1px solid var(--hm-line,#16496b);border-radius:999px;
  color:var(--hm-ink,#eaf2f8);font:inherit;font-size:12.5px;
  padding:8px 34px 8px 14px;outline:none;
}
.hm-search input::placeholder{color:var(--hm-dim,#9fbdd2)}
.hm-search input:focus{border-color:var(--hm-acc,#ff7900)}
.hm-search .ic{
  position:absolute;inset-block-start:50%;inset-inline-end:12px;transform:translateY(-50%);
  color:var(--hm-dim,#9fbdd2);pointer-events:none;font-size:15px;
}

/* --- le 2 icone a destra della riga sport: ognuna apre un menu a CASCATA --- */
.hm-more button{position:relative}
.hm-menu{
  position:absolute;inset-block-start:100%;inset-inline-end:0;z-index:40;margin-block-start:6px;
  min-width:214px;max-height:60vh;overflow-y:auto;
  background:var(--hm-bg,#0a3350);border:1px solid var(--hm-line,#16496b);border-radius:10px;
  box-shadow:0 14px 34px rgba(2,12,22,.55);padding:5px;
  opacity:0;visibility:hidden;transform:translateY(4px);
  transition:opacity .12s ease,transform .12s ease;
}
/* B: apri col hover del contenitore o con .is-open sul button (tap mobile) */
.hm-more button:hover > .hm-menu,
.hm-more button.is-open > .hm-menu{opacity:1;visibility:visible;transform:translateY(0)}
/* ponte anti-gap (stessa lezione dell'header submenu) */
.hm-menu::before{content:"";position:absolute;inset-inline:0;top:-8px;height:10px}

.hm-menu-it{
  display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:7px;cursor:pointer;
  color:var(--hm-ink,#eaf2f8);font-size:12.5px;font-weight:600;position:relative;
}
.hm-menu-it:hover{background:rgba(255,255,255,.07)}
.hm-menu-it .ic,.hm-menu-it img{width:18px;height:18px;flex:none;opacity:.9}
.hm-menu-it .n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hm-menu-it .cnt{font-size:11px;color:var(--hm-dim,#9fbdd2);font-weight:700}
/* la freccina "ha un sottomenu" */
.hm-menu-it.has-sub > .car{color:var(--hm-dim,#9fbdd2);font-size:11px}

/* il SOTTOMENU (competizioni dello sport): si apre a fianco */
.hm-menu-sub{
  position:absolute;inset-block-start:-5px;inset-inline-end:100%;margin-inline-end:4px;
  min-width:200px;max-height:56vh;overflow-y:auto;
  background:var(--hm-bg,#0a3350);border:1px solid var(--hm-line,#16496b);border-radius:10px;
  box-shadow:0 14px 34px rgba(2,12,22,.55);padding:5px;
  opacity:0;visibility:hidden;transform:translateX(4px);
  transition:opacity .12s ease,transform .12s ease;
}
.hm-menu-it.has-sub:hover > .hm-menu-sub,
.hm-menu-it.has-sub.is-open > .hm-menu-sub{opacity:1;visibility:visible;transform:translateX(0)}
.hm-menu-sub::before{content:"";position:absolute;inset-block:0;inset-inline-end:-6px;width:8px}
/* gruppo "Leghe popolari" nel sottomenu */
.hm-menu-grp{padding:8px 10px 4px;font:800 9.5px/1 ui-monospace,Menlo,monospace;
  letter-spacing:.1em;text-transform:uppercase;color:var(--hm-dim,#9fbdd2)}

@media (max-width:760px){
  .hm-search input{width:150px}
  /* su mobile il sottomenu si apre SOTTO invece che a fianco (spazio) */
  .hm-menu-sub{position:static;inset:auto;margin:2px 0 2px 10px;box-shadow:none;
    border:0;border-left:2px solid var(--hm-line,#16496b);border-radius:0;
    opacity:1;visibility:visible;transform:none;display:none}
  .hm-menu-it.has-sub.is-open > .hm-menu-sub{display:block}
}
@media (prefers-reduced-motion:reduce){.hm-menu,.hm-menu-sub{transition:none}}

/* ── Widget LOGO (Dav 24/07): logo skin cliccabile → home, posizionabile ── */
.wg-logo{display:inline-flex;align-items:center;text-decoration:none;line-height:0}
.wg-logo-img{max-height:44px;max-width:200px;width:auto;height:auto;object-fit:contain}
.wg-logo-word{font:800 22px/1 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  letter-spacing:.02em;color:var(--header-color-menu,#f5b301);line-height:1}

/* IL NOME DI RISERVA sotto il logo: c'è sempre nel markup, si vede solo se l'immagine non arriva
   (`chrome.js` marca `.tb-img-rotta`). Un'intestazione senza marchio è peggio di un marchio
   scritto: su studio5 il logo punta a un host che risponde 403 e lì non c'era più niente. */
.wg-logo-word--riserva{display:none}
.wg-logo-img.tb-img-rotta + .wg-logo-word--riserva{display:inline}

/* player/betlist.css */
/* ============================================================================
   CRONOLOGIA SCOMMESSE (Account Betlist) — vestito completo
   Richiesta Dav 22/07, rif. `inbox/new/Dav_lista_scommesse_ref.png`:
   «deve essere così, ma lascia il menu account a sinistra come adesso».
   Quindi: la RICCHEZZA del template (filtri, toggle area, tabella larga,
   pallini d'esito con legenda, totali, paginazione) DENTRO la nostra pagina,
   con la sidebar account a sinistra invariata.

   Design D, 22-07-2026. Solo struttura vestita: i filtri, il caricamento e la
   paginazione li wira B (form GET, come `_filtri_data.html`).

   ⚠️ DUE PELLI, si sceglie con UNA classe sul contenitore `.bl`:
     .bl              → chiara, come il template di Dav (pagine a tema importato,
                        dove la card `.pg-card` è bianca)     ← default
     .bl.bl--scuro    → il nostro tema scuro (player/base.html, tb.css)
   Nessun colore è scritto due volte: tutto passa dalle variabili qui sotto.
   ========================================================================== */

.bl{
  /* — pelle chiara (default), i toni del template — */
  --bl-ink:#1c4267;          /* testo forte */
  --bl-dim:#5b7793;          /* testo debole (etichette, legenda) */
  --bl-line:rgba(28,66,103,.14);
  --bl-line-2:rgba(28,66,103,.28);
  --bl-head:#276aa6;         /* fondo intestazione tabella */
  --bl-head-ink:#fff;
  --bl-zebra:rgba(28,66,103,.035);
  --bl-hover:rgba(39,106,166,.08);
  --bl-field:#fff;           /* fondo dei campi */
  --bl-field-ink:#12314e;
  --bl-bar:rgba(39,106,166,.06);   /* fondo barra filtri e riga totali */
  --bl-acc:#276aa6;          /* azione principale (Cerca) */
  --bl-acc-ink:#fff;
  --bl-link:#1a5da6;
  --bl-money:#1c4267;

  /* — i sei esiti: gli stessi colori del template — */
  --bl-lose:#e8402a;
  --bl-win:#1f8a2f;
  --bl-pending:#f08c00;
  --bl-payed:#7ec93f;
  --bl-running:#f2d024;
  --bl-rejected:#2b4fd6;

  color:var(--bl-ink);
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
}

/* il nostro tema scuro: cambiano SOLO le variabili */
.bl.bl--scuro{
  --bl-ink:#eaf0f7;
  --bl-dim:#9fbdd2;
  --bl-line:rgba(255,255,255,.10);
  --bl-line-2:rgba(255,255,255,.20);
  --bl-head:#0e2140;
  --bl-head-ink:#eaf0f7;
  --bl-zebra:rgba(255,255,255,.035);
  --bl-hover:rgba(255,255,255,.07);
  --bl-field:#0e2140;
  --bl-field-ink:#eaf0f7;
  --bl-bar:rgba(255,255,255,.05);
  --bl-acc:#f5c451;
  --bl-acc-ink:#0e2140;
  --bl-link:#7fb7ff;
  --bl-money:#f5c451;        /* l'oro è il denaro */
}

/* ── intestazione della pagina ───────────────────────────────────────────── */
.bl-intro{margin:0 0 12px;color:var(--bl-dim);font-size:.92rem}

/* ── barra FILTRI ────────────────────────────────────────────────────────────
   Stato scommessa · Dal giorno · Al giorno · Da · A (importo) · Esito · Cerca
   È un <form method="get">: i filtri restano nell'URL (ricaricabile, linkabile,
   il tasto «indietro» fa quel che uno si aspetta). Stessa regola di `_filtri_data`. */
.bl-filtri{
  display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;
  padding:12px 14px;margin:0 0 10px;
  background:var(--bl-bar);border:1px solid var(--bl-line);border-radius:10px;
}
.bl-campo{display:flex;flex-direction:column;gap:4px;min-width:0}
.bl-campo label{
  font-size:.7rem;text-transform:uppercase;letter-spacing:.5px;
  font-weight:700;color:var(--bl-dim);
}
.bl-campo input,.bl-campo select{
  padding:8px 10px;border-radius:7px;border:1px solid var(--bl-line-2);
  background:var(--bl-field);color:var(--bl-field-ink);
  font:inherit;font-size:.9rem;min-width:150px;
}
.bl-campo input:focus-visible,.bl-campo select:focus-visible,
.bl-cerca:focus-visible,.bl-reset:focus-visible,
.bl-area input:focus-visible+.bl-sw{outline:2px solid var(--bl-acc);outline-offset:2px}
/* i due importi sono corti: non meritano la larghezza di una data */
.bl-campo--num input{min-width:92px;max-width:110px}

.bl-azioni{display:flex;gap:8px;margin-left:auto}
.bl-cerca,.bl-reset{
  padding:9px 18px;border-radius:7px;border:0;line-height:1.2;
  font:inherit;font-weight:800;font-size:.88rem;cursor:pointer;text-decoration:none;
  display:inline-flex;align-items:center;gap:6px;
}
.bl-cerca{background:var(--bl-acc);color:var(--bl-acc-ink)}
.bl-cerca:hover{filter:brightness(1.06)}
.bl-reset{background:transparent;color:var(--bl-dim);border:1px solid var(--bl-line-2)}
.bl-reset:hover{color:var(--bl-ink);border-color:var(--bl-acc)}

/* ── riga TOGGLE d'area: Sport / Live / Casino ───────────────────────────────
   Interruttori veri (checkbox nascosta + <span class="bl-sw">): funzionano da
   tastiera e si leggono con lo screen reader. B li manda nel GET. */
.bl-aree{
  display:flex;flex-wrap:wrap;gap:18px;align-items:center;
  padding:10px 14px;margin:0 0 12px;
  background:var(--bl-bar);border:1px solid var(--bl-line);border-radius:10px;
}
.bl-area{display:inline-flex;align-items:center;gap:8px;cursor:pointer;
  font-size:.9rem;font-weight:700;color:var(--bl-ink)}
.bl-area input{position:absolute;opacity:0;width:0;height:0}
.bl-sw{
  width:38px;height:20px;border-radius:999px;flex:none;position:relative;
  background:var(--bl-line-2);transition:background .15s ease;
}
.bl-sw::after{
  content:"";position:absolute;inset:2px auto 2px 2px;width:16px;border-radius:50%;
  background:#fff;transition:transform .15s ease;
}
.bl-area input:checked+.bl-sw{background:var(--bl-acc)}
.bl-area input:checked+.bl-sw::after{transform:translateX(18px)}

/* ── LE RIGHE (una per giocata, CHIUSA) ──────────────────────────────────────
   Il vestito della lista `<details>`. La GRIGLIA delle colonne non è qui: sta in
   `betlist_struttura.css`, che è fra i fogli strutturali e quindi arriva anche
   sulle skin col tema importato — dove questo foglio non si carica affatto (è
   colore, e il colore è del tema). Qui si dà solo l'aspetto. */
.bl-lista{border:1px solid var(--bl-line);border-radius:10px;overflow:hidden;
  font-size:.88rem}
.bl-intesta{
  font-size:.74rem;letter-spacing:.05em;text-transform:uppercase;font-weight:800;
  background:var(--bl-head);color:var(--bl-head-ink);
}
.bl-riga{border-bottom:1px solid var(--bl-line)}
.bl-riga:last-child{border-bottom:0}
.bl-riga:nth-of-type(even){background:var(--bl-zebra)}
.bl-riga > .bl-linea:hover{background:var(--bl-hover)}
/* la freccetta: nostra, così ruota e non dipende dal segno di sistema */
.bl-riga > .bl-linea .bl-id::before{
  content:"›";display:inline-block;margin-right:6px;font-weight:900;
  color:var(--bl-dim);transition:transform .12s ease;
}
.bl-riga[open] > .bl-linea .bl-id::before{transform:rotate(90deg)}
.bl-riga[open] > .bl-linea{background:var(--bl-hover)}
.bl-id{font-weight:800;color:var(--bl-link)}

/* il dettaglio, dentro la riga */
.bl-dett{border-top:1px dashed var(--bl-line-2);background:var(--bl-bar)}
.bl-gamba{border-bottom:1px solid var(--bl-line);font-size:.85rem}
.bl-gamba:last-of-type{border-bottom:0}
.bl-g-ev{font-weight:700;color:var(--bl-ink)}
.bl-g-mk{color:var(--bl-dim)}
.bl-g-mk b{color:var(--bl-ink)}
.bl-g-q{font-weight:800;color:var(--bl-money)}
.bl-apri{color:var(--bl-link);font-weight:700;font-size:.83rem;text-decoration:none}
.bl-apri:hover{text-decoration:underline}
.bl-num{text-align:right;font-variant-numeric:tabular-nums}
.bl-money{text-align:right;font-weight:800;color:var(--bl-money);
  font-variant-numeric:tabular-nums}
.bl-ctx{color:var(--bl-dim)}
.bl-live{background:var(--bl-lose);color:#fff;font-size:.7em;font-weight:800;
  padding:1px 6px;border-radius:4px;letter-spacing:.04em;vertical-align:1px}

/* ── il PALLINO d'esito + la LEGENDA ─────────────────────────────────────────
   Il colore da solo non è un'informazione (daltonismo, stampa): ogni pallino
   porta il suo `title`/`aria-label` in parole, e la legenda sta sempre sotto. */
.bl-dot{
  display:inline-block;width:14px;height:14px;border-radius:50%;
  background:var(--bl-dim);box-shadow:0 0 0 1px rgba(0,0,0,.18) inset;
}
.bl-dot.lose{background:var(--bl-lose)}
.bl-dot.win{background:var(--bl-win)}
.bl-dot.pending{background:var(--bl-pending)}
.bl-dot.payed{background:var(--bl-payed)}
.bl-dot.running{background:var(--bl-running)}
.bl-dot.rejected{background:var(--bl-rejected)}
.bl-tab td.bl-esito{text-align:center}

/* 🔴 LA PAROLA DELL'ATTESA, quando c'è, deve STARE (PM 06/08). La colonna «Esito» è nata per
   un pallino da 14px: infilarci «In attesa del risultato» la troncava a «In att…» — misurato
   guardando lo scatto, non il CSS. Il pallino resta dov'è e la frase va A CAPO sotto di lui:
   così non serve rubare larghezza alle colonne del denaro, che sono quelle che il giocatore
   legge per prime. Compare solo sulle schedine in attesa, quindi la tabella normale non cambia
   di un pixel. */
.bl-attesa{
  display:block;margin-top:2px;line-height:1.15;font-size:.72rem;
  white-space:normal;opacity:.85;
}
.bl-tab td.bl-esito:has(.bl-attesa){min-width:9.5em}

/* riga finale: legenda a sinistra, TOTALI a destra (come nel template) */
.bl-piede{
  display:flex;flex-wrap:wrap;align-items:center;gap:10px 22px;
  padding:11px 14px;margin-top:-1px;
  background:var(--bl-bar);border:1px solid var(--bl-line);
  border-radius:0 0 10px 10px;
}
.bl-legenda{display:flex;flex-wrap:wrap;gap:6px 16px;align-items:center;
  font-size:.8rem;color:var(--bl-dim);font-weight:600}
.bl-legenda span{display:inline-flex;align-items:center;gap:6px}
.bl-totali{display:flex;flex-wrap:wrap;gap:6px 22px;margin-left:auto;
  font-size:.85rem;color:var(--bl-dim);font-weight:700}
.bl-totali b{color:var(--bl-money);font-weight:900;font-variant-numeric:tabular-nums}
/* quando c'è il piede, la lista non arrotonda in basso */
.bl-lista:has(+.bl-piede){border-radius:10px 10px 0 0;border-bottom:0}

/* ── PAGINAZIONE ─────────────────────────────────────────────────────────── */
.bl-pag{display:flex;justify-content:center;gap:6px;margin:14px 0 4px;flex-wrap:wrap}
.bl-pag a,.bl-pag span{
  min-width:34px;height:34px;padding:0 9px;border-radius:7px;
  display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--bl-line-2);background:var(--bl-field);color:var(--bl-ink);
  font-size:.86rem;font-weight:700;text-decoration:none;
}
.bl-pag a:hover{border-color:var(--bl-acc);color:var(--bl-acc)}
.bl-pag .on{background:var(--bl-acc);color:var(--bl-acc-ink);border-color:var(--bl-acc)}
.bl-pag .off{opacity:.4;pointer-events:none}

/* ── vuoto ───────────────────────────────────────────────────────────────── */
.bl-vuoto{padding:28px 14px;text-align:center;color:var(--bl-dim)}

/* ── piccolo ─────────────────────────────────────────────────────────────────
   La riga si impila da sé (la griglia sta in `betlist_struttura.css`): non c'è
   più una SECONDA lista `.bl-cards` da tenere allineata a questa — era la copia
   che, senza foglio, si vedeva insieme alla tabella. */
@media (max-width:820px){
  .bl-campo input,.bl-campo select{min-width:0;width:100%}
  .bl-campo{flex:1 1 45%}
  .bl-azioni{margin-left:0;width:100%}
  .bl-totali{margin-left:0;width:100%}
  .bl-c::before{color:var(--bl-dim)}
}

/* ============================================================================
   FILTRI DENTRO LA CARD (Dav 22/07) — Cronologia scommesse
   La barra `_filtri_data` (`.tb-filtri`) nasce per la fascia BLU dell'header conto:
   testo chiaro, fondo translucido. Dav l'ha voluta DENTRO la card bianca, sopra la
   tabella (`.pg-card-flt`). Qui la rivesto per il fondo chiaro — più specifico di
   `.tb-filtri`, quindi vince senza toccare il partial condiviso.
   ========================================================================== */
.pg-card-flt{padding:12px 14px 0}
.pg-card .pg-card-flt .tb-filtri{
  background:transparent;border:0;border-bottom:1px solid rgba(28,66,103,.12);
  border-radius:0;margin:0 0 4px;padding:0 0 12px;
}
/* etichette leggibili sul bianco (erano bianche su blu → invisibili) */
.pg-card .pg-card-flt .tb-filtri label{color:#5b7793;opacity:1}
/* CAMPI BIANCHI, identici a «Le mie scommesse» (target `.bl` chiaro: --bl-field:#fff /
   --bl-field-ink:#12314e). Erano navy (#0e2140): la parità che D aveva segnalato. Ora i filtri
   transazioni e quelli delle scommesse hanno lo STESSO campo, come chiedeva Angelo. */
.pg-card .pg-card-flt .tb-filtri input,
.pg-card .pg-card-flt .tb-filtri select{
  border-color:rgba(28,66,103,.28);background:#fff;color:#12314e;
}
/* icona calendario: ora che il campo è BIANCO, l'indicatore nativo (scuro) si vede già; annullo
   l'invert che `app_mobile.css` applica ai `.tb-filtri` scuri (più specifico → vince), sennò
   sarebbe bianco-su-bianco. */
.pg-card .pg-card-flt .tb-filtri input[type=date]::-webkit-calendar-picker-indicator{
  filter:none;
}
/* Filtra resta oro; Pulisci diventa un contorno scuro sul bianco */
.pg-card .pg-card-flt .tb-filtri button{background:#f5c451;color:#0e2140}
.pg-card .pg-card-flt .tb-filtri .tbf-pulisci{
  background:transparent;color:#5b7793;border:1px solid rgba(28,66,103,.28);
}
.pg-card .pg-card-flt .tb-filtri .tbf-pulisci:hover{color:#1c4267;border-color:#276aa6}

/* player/betlist_struttura.css */
/* ============================================================================
   CRONOLOGIA SCOMMESSE — la STRUTTURA, e solo quella.

   Perché questo foglio esiste (Stefano AR, 03/08: «le giocate arrivano di nuovo
   aperte»). Su una skin con TEMA IMPORTATO il middleware non serve `casa.css`:
   si caricano solo i `FOGLI_STRUTTURALI` (decisione di Angelo del 29/07,
   commit 716360fb — il vestito è del tema). `betlist.css` non era fra quelli,
   quindi la cronologia arrivava SENZA una riga del suo stile: la tabella e le
   schede si vedevano tutte e due, ogni giocata stampata due volte e per intero.

   Qui c'è solo ciò che serve perché la pagina sia LEGGIBILE anche se il tema non
   sa niente di noi: la griglia delle colonne e l'impilamento sul telefono.
   ⚠️ NIENTE COLORE — gli strutturali si caricano PRIMA dello `<style>` del tema,
   e il colore resta l'ultima parola del tema. Il vestito sta in `betlist.css`.
   C'è un test che lo tiene fermo (`tests/test_betlist_righe_chiuse.py`).

   La riga resta CHIUSA da sola: è un `<details>`, cioè HTML. Questo foglio non
   la chiude e non potrebbe riaprirla — è il punto di tutta la correzione.
   ========================================================================== */

.bl-lista { display: block; }

/* — le nove colonne, una griglia sola per l'intestazione e per ogni riga — */
.bl-intesta,
.bl-riga > .bl-linea {
  display: grid;
  grid-template-columns:
    minmax(5.5em, .8fr)   /* ID */
    minmax(7em, 1fr)      /* Tipo */
    minmax(3.5em, .4fr)   /* Eventi */
    minmax(5.5em, .6fr)   /* Contesto */
    minmax(9em, 1fr)      /* Data scommessa */
    minmax(9em, 1fr)      /* Data ultimo evento */
    minmax(6em, .7fr)     /* Importo */
    minmax(6em, .7fr)     /* Vincita */
    minmax(3.5em, .35fr); /* Esito */
  align-items: center;
  gap: 0 10px;
  padding: 9px 12px;
}

/* — LA VARIANTE DELLA RETE: le stesse nove colonne PIÙ «Utente» (Angelo, 04/08) —
 * La colonna in più va DICHIARATA anche qui: una griglia a nove colonne con dieci celle dentro
 * manda l'ultima a capo — misurato nel proof, «Resultado» finiva su una seconda riga e la
 * tabella sembrava rotta. La lista è la stessa (`_lista_giocate.html`): cambia solo quante
 * colonne dichiara chi la ospita. */
.bl-lista--rete .bl-intesta,
.bl-lista--rete .bl-riga > .bl-linea {
  grid-template-columns:
    minmax(5.5em, .8fr)   /* ID */
    minmax(6em, .8fr)     /* Utente — solo in rete: distingue i sottoconti */
    minmax(7em, 1fr)      /* Tipo */
    minmax(3.5em, .4fr)   /* Eventi */
    minmax(5.5em, .6fr)   /* Contesto */
    minmax(9em, 1fr)      /* Data scommessa */
    minmax(9em, 1fr)      /* Data ultimo evento */
    minmax(6em, .7fr)     /* Importo */
    minmax(6em, .7fr)     /* Vincita */
    minmax(3.5em, .35fr); /* Esito */
}

/* LE GAMBE stese sotto la riga (34-r): una fila per gamba, non una tabella dentro la tabella. */
/* LE GAMBE ESPANDIBILI (Angelo, 04/08 22:43): sulla rete stavano sempre stese e con 1.788
   coupon la pagina diventava un muro. Il riassunto dice quante sono, così si sa cosa si apre. */
/* ⛔ NESSUN COLORE QUI. Gli strutturali si caricano PRIMA dello <style> del tema: un colore
   qui dentro ridipinge la pagina di un tema che non l'ha chiesto (stessa regola di
   chrome_struttura.css e casino_struttura.css). Il separatore delle gambe espandibili
   (Angelo, 04/08 22:43) era nato qui con un rgba: la STRUTTURA resta, il colore lo mette
   il vestito con `--bl-line` — la variabile che `betlist.css` usa GIÀ per gli altri separatori
   di questa lista, definita per tutt'e due le pelli (chiara e scura). Così il bordo delle gambe
   segue la skin invece di avere un grigio suo, e senza tema resta TRASPARENTE: non si vede e non
   ridipinge niente. */
.bl-gambe-d { border-top: 1px solid var(--bl-line, transparent); }
.bl-gambe-s { list-style: none; cursor: pointer; padding: 6px 12px; font-size: .78rem;
  opacity: .7; user-select: none; }
.bl-gambe-s::-webkit-details-marker { display: none; }
.bl-gambe-s::before { content: '\203A'; display: inline-block; width: 12px;
  transition: transform .15s; }
.bl-gambe-d[open] > .bl-gambe-s::before { transform: rotate(90deg); }
.bl-gambe-s:hover { opacity: 1; }
.bl-gambe { padding: 0 12px 8px 12px; display: flex; flex-direction: column; gap: 2px; }
.bl-gamba {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) minmax(0, .8fr) minmax(3.5em, .3fr);
  gap: 0 10px; font-size: .86em; opacity: .92; padding: 2px 0;
}
.bl-gamba .bl-g-qt { text-align: right; font-variant-numeric: tabular-nums; }
.bl-gamba .bl-g-quando { opacity: .7; }

/* La LEGENDA in fondo: le voci in fila, non incollate una all'altra (misurato nel proof:
 * «In giocoGanadaPerdida…» tutto attaccato, perché senza questa riga sono <span> di seguito). */
.bl-piede { display: flex; flex-wrap: wrap; gap: 10px 18px; justify-content: space-between;
  padding: 10px 12px; }
.bl-legenda { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: center;
  font-size: .82em; }
.bl-legenda span { display: inline-flex; align-items: center; gap: 5px; }

.bl-riga > .bl-linea { cursor: pointer; list-style: none; }
/* LA RIGA È UN LINK (Stefano 03/08 22:11, Angelo 04/08 01:44): un clic e si apre la giocata per
   intero. Senza queste due proprietà la riga uscirebbe blu e sottolineata — l'aspetto attuale è
   già stato approvato, e cambiarlo mentre si cambia il clic sarebbe due modifiche per una. */
.bl-riga > a.bl-linea { color: inherit; text-decoration: none; }
/* la freccetta di sistema starebbe FUORI dalla griglia e sfalserebbe le colonne */
.bl-riga > .bl-linea::-webkit-details-marker { display: none; }
.bl-riga > .bl-linea::marker { content: ""; }

.bl-c { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bl-num, .bl-money { text-align: right; }
.bl-esito { text-align: center; }

/* — il dettaglio dentro la riga — */
.bl-dett { padding: 4px 12px 12px; }
.bl-gamba {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) auto;
  gap: 2px 12px;
  padding: 7px 0;
}
.bl-g-q { text-align: right; font-variant-numeric: tabular-nums; }
.bl-apri { display: inline-block; margin-top: 6px; }

/* — piccolo: la riga si impila, e ogni campo si presenta da sé —
   Le etichette arrivano dai `data-t` del markup: la stessa riga serve le due
   misure, senza una seconda copia della lista da tenere allineata. */
@media (max-width: 820px) {
  .bl-intesta { display: none; }
  .bl-riga > .bl-linea {
    grid-template-columns: 1fr 1fr;
    gap: 3px 10px;
    padding: 10px 12px;
  }
  .bl-c { white-space: normal; }
  .bl-c::before {
    content: attr(data-t) ": ";
    font-size: .78em;
    opacity: .7;
  }
  .bl-num, .bl-money, .bl-esito { text-align: left; }
  .bl-gamba { grid-template-columns: 1fr auto; }
}

/* player/eventi_struttura.css */
/* LA SCELTA DELLE COMPETIZIONI — struttura, e basta.
 *
 * Dav, 04/08: «in eventi del giorno mantieni le TRE COLONNE come nei widget, e sistema il layout
 * della parte centrale che si vede male». Nello screenshot che ha mandato ogni competizione si
 * prendeva una riga intera larga tutta la pagina, col numero delle partite a un palmo di distanza
 * dal nome: trentuno righe per trentuno partite. Qui le competizioni di una nazione stanno in tre
 * colonne, come nei riquadri dei widget, e ogni nazione è un pannello.
 *
 * 🔴 QUESTE REGOLE STAVANO DENTRO LA PAGINA, in un `<style>` in cima al frammento. Vincolo scritto
 * da Dav sul casinò, che vale qui uguale: «non hardcodare codice nella pagina ma in caso
 * aggiungilo in un css separato». Spostate, non riscritte: chi guardava la pagina ieri ritrova le
 * stesse misure, più la griglia.
 *
 * ⛔ SOLO STRUTTURA, nessun colore. Il foglio sta fra gli STRUTTURALI perché il frammento della
 * scelta è lo stesso anche sulle skin VESTITE (misurato: 54 blocchi-nazione su timerbet come su
 * studio5) — finché lo stile era dentro la pagina viaggiava con lei; da fuori deve caricarsi
 * anche là, o la pagina vestita resta senza. È la quinta volta che questa catena morde: vedi le
 * note di `betlist_struttura.css` e `casino_struttura.css`. Colori e sfondi restano del tema, che
 * si carica dopo e ha l'ultima parola.
 *
 * ══════════════════════════════════════════════════════════════════════════════════════════════
 * 🎯 05/08 — A BLOCCHI, come lo screen 2 di Dav (04/08 18:02: «la parte centrale riesci a farla
 * come nello screen 2, senza hardcodare css nell html»).
 *
 * ⚠️ E QUI SOTTO ORA CI SONO DEI COLORI, che la riga «SOLO STRUTTURA» vietava: la scheda dello
 * screen 2 ha un fondo suo, più chiaro della pagina, e senza quello non è una scheda — è un
 * bordo. Non è una deroga, è l'altra metà della richiesta di Dav, scritta da lui il 04/08:
 * *«non dobbiamo usare variabili diverse, ma solo quelle del tema»*. Quindi ogni colore qui
 * dentro è **una variabile del tema** (`--qt-background`, `--primary-border`, `--secondary-text`,
 * `--btn-primary`, `--hdr-grad`): su una skin vestita li riempie il suo tema, e la scheda esce
 * dei suoi colori senza che questo foglio sappia quali siano.
 * 👉 La regola che resta: **nessun valore di colore scritto a mano**. Se serve una tinta che non
 * ha un nome nel tema, non la si inventa qui — si chiede che il tema la dichiari.
 */

.sc-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin:0 0 10px}
.sc-titolo{font-weight:800;font-size:1.1rem}
.sc-conta{opacity:.8;font-size:.9rem}

.sc-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px}
.sc-chip{padding:4px 10px;border-radius:999px;border:1px solid currentColor;opacity:.65;
  text-decoration:none;font-size:.85rem}
.sc-chip.on{opacity:1;font-weight:700}

/* ══ LA BARRA DELLO SPORT ══
 * In cima al primo blocco di ogni sport, come nello screen 2. Il gradiente è quello che la casa
 * usa già per le barre-sezione (`--hdr-grad`), non uno nuovo: così una skin che ridipinge l'azione
 * ridipinge anche questa, ed è la ragione per cui quella variabile esiste. */
/* 🔴 IL RIPIEGO DI `--hdr-grad` NON È UN DI PIÙ — misurato sulle due skin servite, il 05/08:
 *     studio5    --hdr-grad = linear-gradient(180deg,#ff7e26,#c45000)   ✅
 *     timerbet   --hdr-grad = NON DEFINITA                              ❌
 * Su timerbet questa barra sarebbe uscita senza fondo, con il suo testo bianco
 * (`--btn-primary-text` = #ffffff) sopra un tema CHIARO (`--qt-background` = #d4dee8):
 * bianco su bianco, cioè una barra invisibile. Il ripiego è un ALTRO NOME DEL TEMA
 * (`--btn-primary`, che lì vale #1c4267), non un colore scritto a mano: la regola resta
 * «nessun valore di colore qui dentro» e la barra si vede su tutt'e due. */
.sc-sport{display:flex;align-items:center;gap:10px;margin:14px 0 8px;padding:8px 12px;
  border-radius:var(--r-s,9px);background:var(--hdr-grad,var(--btn-primary));
  color:var(--btn-primary-text,#fff);
  font-weight:800;text-transform:uppercase;letter-spacing:.04em}
.sc-sport .ic{width:18px;height:18px;flex:none}
/* 🔴 L'ICONA DEL CENTRO VA MISURATA, come quella del menu di sinistra (Dav, 07/08: «le icone
   dello sport devono essere uguali a quelle di sinistra»). Il centro adesso passa da
   `player/_ico.html`, che emette un <img class="ico"> — e `.ico img` in tb.css è `width:100%`:
   senza questa riga esce il pallone grande mezzo schermo, che è il difetto del 01/08 già curato
   tre volte altrove (`.wdg-sports-menu .ico`, `.lvm .ico`). Stessa misura del `.ic` qui sopra. */
.sc-sport .ico{width:18px;height:18px;flex:none;object-fit:contain}

/* IL PANNELLO DELLA NAZIONE. Il bordo tiene insieme le sue competizioni: con la lista piatta di
 * prima, a metà pagina non si sapeva più sotto quale nazione si stesse leggendo.
 * Dallo screen 2 è una SCHEDA: fondo proprio, più chiaro della pagina. `--qt-background` è il
 * fondo che la casa dà ai riquadri delle quote — lo stesso gradino di chiaro, già nel tema. */
.sc-naz{margin:0 0 12px;border:1px solid var(--primary-border,currentColor);
  border-radius:var(--r,12px);overflow:hidden;background:var(--qt-background,transparent)}
.sc-naz-h{display:flex;align-items:center;gap:10px;font-weight:800;text-transform:uppercase;
  letter-spacing:.03em;padding:9px 12px;cursor:pointer;list-style:none}
/* la freccina di serie del browser se ne va: il segno di apertura è l'icona nostra, a destra */
.sc-naz-h::-webkit-details-marker{display:none}
.sc-naz-nome{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* i comandi stanno a destra, e il conto delle partite resta dov'era, prima di loro */
.sc-naz-h .sc-comp-n{margin-left:auto}
.sc-naz-vai,.sc-naz-apri,.sc-naz-tutte{flex:none;display:flex;align-items:center;
  color:var(--secondary-text)}
.sc-naz-vai:hover{color:var(--btn-primary)}
/* 🔴 «SCEGLI TUTTE» (Dav, 08/08): il bottone della selezione massiva, accanto al «vai».
 * È un `<button>` vero e non uno `<span>` — si raggiunge col tasto TAB e risponde a Invio, che
 * per un comando che spunta venti caselle conta più che per un'icona qualsiasi. Ma un bottone
 * porta con sé lo sfondo, il bordo e il padding del browser: qui si azzerano, o in mezzo a due
 * icone piatte comparirebbe un tasto grigio.
 * ⚠️ `line-height:0` insieme a `padding:0`: senza, il `<button>` si tiene l'altezza della riga di
 * testo e la riga della nazione cresce di qualche pixel solo dove il bottone c'è.
 * 📌 `[hidden]` esce dal flex: `display:flex` qui sopra vincerebbe su `display:none` di serie e
 * il bottone si vedrebbe anche senza JavaScript — cioè un comando che non risponde, che è
 * esattamente quello che nascere `hidden` doveva evitare. È una riga che sembra inutile e non lo
 * è: è la stessa forma di difetto del `.ico img{width:100%}` dei palloni giganti, una regola
 * generica che ne scavalca una specifica. */
.sc-naz-tutte{background:none;border:0;padding:0;line-height:0;cursor:pointer;
  -webkit-appearance:none;appearance:none}
.sc-naz-tutte[hidden]{display:none}
.sc-naz-tutte:hover{color:var(--btn-primary)}
/* Spento e acceso si distinguono a colpo d'occhio: quando sono già tutte spuntate il segno è
 * pieno, e il clic seguente le toglie. Lo stato lo dice `aria-pressed`, che è anche quello che
 * sente chi legge con la voce: un solo attributo per il colore e per la parola. */
.sc-naz-tutte[aria-pressed="true"]{color:var(--btn-primary)}
/* aperta in giù, chiusa a sinistra: è il verso dello screen, e lo dice la scheda stessa */
.sc-naz-apri{transition:transform .15s ease}
.sc-naz:not([open]) .sc-naz-apri{transform:rotate(-90deg)}
.sc-naz:not([open]) .sc-naz-h{border-bottom:0}
.sc-naz[open] .sc-naz-h{border-bottom:1px solid var(--primary-border,currentColor)}
.sc-naz-sport{font-weight:500;text-transform:none;color:var(--secondary-text);font-size:.85rem}

/* ══ LE TRE COLONNE ══
 * Numero FISSO, non `auto-fill`: la stessa lezione pagata sulla griglia del casinò il 04/08 —
 * `repeat(auto-fill, minmax(...))` dà il numero di colonne che ci sta, che a 1320px non è tre.
 * Dav ha chiesto tre come nei widget, e tre sono a qualunque larghezza da tablet in su. */
.sc-comps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:2px 16px;padding:8px 12px}
.sc-comp{display:flex;align-items:flex-start;gap:10px;padding:6px 2px;min-width:0}
.sc-comp label{display:flex;align-items:flex-start;gap:10px;cursor:pointer;flex:1;min-width:0}
.sc-comp label > input{margin-top:2px;flex:none}
/* 🔴 IL NOME VA A CAPO, NON SI TAGLIA — e prima si tagliava, di proposito («il nome non deve
 * spingere il numero fuori dalla colonna: taglia lui, non la riga»). Due cose l'hanno cambiato:
 *  1. col nome della nazione davanti («Argentina – Primera LPF, Reserves») i puntini si mangiano
 *     proprio la competizione, cioè l'unica parte che distingue una riga dall'altra. Misurato sul
 *     servito il 05/08, subito dopo la pubblicazione delle 18:20: «Argentina – Primera L…»,
 *     «International Clubs – …», «Denmark – A Liga, Wo…».
 *  2. nello screen 2 di Dav i nomi lunghi VANNO A CAPO: «Francia – Trophee des Champions» sta su
 *     due righe. Quindi non è una scelta mia, è quello che c'è nell'immagine.
 * Il numero resta al suo posto: `align-items:flex-start` lo tiene in alto, allineato alla prima
 * riga del nome, invece di farlo scivolare a metà di un nome su due righe. */
/* `white-space` e `overflow` si dichiarano invece di limitarsi a togliere le righe vecchie: un
 * tema che mettesse `nowrap` sulle sue etichette rimetterebbe i puntini senza che nessuno abbia
 * cambiato questo foglio. Detto qui, la riga va a capo comunque. */
.sc-comp label > span{white-space:normal;overflow:visible;overflow-wrap:anywhere}
.sc-comp-n{margin-left:auto;color:var(--secondary-text);font-size:.85rem;white-space:nowrap}

/* la barra di conferma resta a vista mentre si scorre: con trenta nazioni, un bottone in fondo
   alla pagina è un bottone che non si trova */
.sc-vai{position:sticky;bottom:0;display:flex;gap:10px;align-items:center;
  padding:10px 0;backdrop-filter:blur(3px)}
/* 🔴 …ma una barra appiccicata in fondo COPRE l'ultimo pannello: nella foto del 04/08 l'ultima
 * nazione (RUSSIA) si leggeva attraverso il velo sfocato, con la sua casella sotto il bottone —
 * spuntabile solo scorrendo alla cieca. Lo spazio lo deve fare il form, non l'occhio di chi
 * guarda: `sticky` non toglie ingombro al flusso, e nessuno se ne accorge finché la pagina non è
 * abbastanza lunga da scorrere. */
.sc{padding-block-end:56px}
.sc-vai button{padding:10px 22px;border:0;border-radius:8px;font-weight:800;cursor:pointer}
.sc-vuoto{padding:26px 12px;text-align:center;opacity:.85}

/* Sotto i 1000px tre colonne di nomi di campionato diventano tre colonne di puntini di
 * sospensione: si scende a due, e sul telefono a una. Misurato sui nomi veri («UEFA Champions
 * League Women», «Campeonato De Reserva De Primera Division C»), non su nomi corti di comodo. */
@media (max-width: 1000px){
  .sc-comps{grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 12px}
}
@media (max-width: 640px){
  .sc-comps{grid-template-columns:minmax(0,1fr)}
}

/* player/rete_filtri.css */
/* LA RICERCA UTENTE A CASCATA — il vestito che non aveva nessuno.
 *
 * Stefano, 06/08 01:05, con lo scatto: *«sistema bene la grafica di questo menu a cascata, così
 * non si capisce niente»*. Misurato prima di scrivere: `.ruc` e `.ruc-campo` avevano **zero
 * regole in tutti i fogli**, mentre i campi VICINI sulla stessa riga — «Tipologia movimento»,
 * «Dal giorno», «Al giorno» — sono vestiti da `.tx-campo`. Quindi la cascata usciva coi `<select>`
 * nudi del browser accanto a campi disegnati, ed è il **contrasto** che la rendeva illeggibile:
 *
 *   · le frecce delle tendine galleggiavano lontano dalle etichette — un `select` senza larghezza
 *     minima è largo quanto il suo testo, quindi ogni riga finiva in un punto diverso;
 *   · «— tutta la mia rete —» sembrava testo e non un menu: senza bordo né sfondo un `select`
 *     trasparente non si legge come campo;
 *   · le cinque righe non erano allineate fra loro, e il blocco restava impilato a sinistra
 *     mentre gli altri filtri stavano in riga.
 *
 * 🔑 PERCHÉ UN FOGLIO E NON UN `<style>` NELLA PAGINA. Le regole `.tx-*` stanno dentro
 * `rete_transazioni.html`, ed è il motivo per cui il componente **condiviso** non poteva
 * ereditarle: vivono in una pagina sola. Dav l'ha vietato per iscritto (*«non hardcodare codice
 * nella pagina ma in caso aggiungilo in un css separato»*), e qui la ragione si tocca con mano —
 * il giorno che una seconda pagina include la cascata, con lo stile nella pagina ricomincia da capo.
 *
 * ⚠️ NON SI CHIAMA `*_struttura.css`, ED È VOLUTO. Quei fogli hanno una regola severa — zero
 * colore, nemmeno un `rgb()` — perché su una pagina vestita il colore è del tema. Questo foglio
 * invece un velo lo porta: bordo e fondo `rgba(128,128,128,…)`. Non è una deroga di comodo: senza
 * bordo il campo **non si vede**, ed è esattamente il difetto che Stefano ha fotografato. Il velo
 * è neutro — lo stesso grigio dei campi accanto — quindi funziona su fondo chiaro e su fondo
 * scuro e non porta la tavolozza di nessuna skin. Chiamarlo «struttura» sarebbe stato promettere
 * una cosa che non fa.
 *
 * 📌 Dove morde, misurato il 06/08: il componente lo include **una pagina sola**,
 * `theme_family/rete_transazioni.html` (Transazioni rete, area agenzia). Nessun'altra pagina
 * cambia faccia. Il giorno che un'altra lo include, se lo trova già vestito — ed è il motivo per
 * cui queste regole non stanno dentro quella pagina.
 */

/* I cinque livelli in riga, e a capo da soli quando lo spazio finisce. `.ruc` è un elemento solo
   dentro la riga dei filtri: così si comporta bene sia lì dentro sia da solo, se un domani
   qualcuno lo mette in una pagina che non ha una riga di filtri. */
.ruc {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: flex-end;
}

.ruc-campo {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

/* L'etichetta come quella dei campi accanto: piccola, maiuscola, un po' spenta — così si legge
   come «nome del campo» e non come una frase. */
.ruc-campo label {
  font-size: .72rem;
  opacity: .75;
  text-transform: uppercase;
  letter-spacing: .04em;
}

/* Il campo: bordo, fondo appena accennato e una larghezza MINIMA. La larghezza minima è la regola
   che raddrizza la colonna delle frecce — senza, ogni tendina è larga quanto la parola che
   contiene, ed è il disallineamento che si vede nello scatto di Stefano. */
.ruc-campo select {
  padding: 8px 10px;
  border-radius: 8px;
  border: 1px solid rgba(128, 128, 128, .35);
  background: rgba(128, 128, 128, .06);
  color: inherit;
  min-width: 170px;
}

/* Un livello senza nodi resta a video e lo dice (regola di Angelo, 04/08): nasconderlo farebbe
   credere che il filtro non esista. Ma si vede che non si può usare, invece di sembrare un campo
   rotto — `disabled` da solo, su alcuni temi, non cambia niente a schermo. */
.ruc-campo select:disabled {
  opacity: .55;
  cursor: not-allowed;
}

/* Sullo stretto i cinque livelli si impilano e prendono tutta la larghezza: una tendina larga
   170px dentro uno schermo da 390 costringerebbe a scorrere in orizzontale per leggere il nome di
   un'agenzia. */
@media (max-width: 620px) {
  .ruc { gap: 8px; }
  .ruc-campo { flex: 1 1 100%; }
  .ruc-campo select { width: 100%; min-width: 0; }
}

/* player/menu_sezioni.css */
/* IL MENU ORIZZONTALE A TRE VOCI — Jesper 19 (09/08 07:00 · «anche su mobile», 07:13).
   Markup: player/templates/player/_menu_sezioni.html

   Sta su tre pagine: «in diretta», evento singolo live, calendario. Due sono nostre, la terza la
   fa un'altra lane — quindi il foglio deve arrivare da solo, senza che quella pagina si ricordi
   di collegarlo. Per questo entra nel pacchetto di casa E fra gli strutturali (`mobile.py`),
   come `betlist_struttura.css` prima di lui.

   ⚠️ SOLO STRUTTURA E IL SEGNO DELL'ACCESO. Niente fondi, niente gradienti, e nemmeno un
   colore di testo: quello si eredita dalla pagina (vedi `.msz-v`): su una skin col
   tema importato il vestito resta del tema, e questo foglio deve solo far stare in piedi il
   nostro markup — è la regola di `chrome_struttura.css`, scritta dopo che testata e menu erano
   usciti come testo nudo su una pagina vestita. */

.msz{
  /* 🔴 L'ACCENTO DELL'ACCESO È UN TOKEN NOSTRO, non uno del tema — e non è pignoleria:
     è un difetto MISURATO col browser sulla pagina servita di timerbet (09/08 08:0x).
     La prima versione diceva `color: var(--btn-primary, #f0801a)`, cioè «il colore del marchio,
     così una skin che lo cambia cambia anche questo». Sembrava la cosa giusta. Sul tema
     importato di timerbet i due token valgono questo:

         --btn-primary    → rgb(28, 66, 103)     ← il blu del tema
         --secondary-text → rgb(28, 66, 103)     ← LO STESSO blu
         --or             → non definito          (il ripiego non scattava mai: la var esiste)

     Cioè acceso e spento uscivano **identici**: le tre voci tutte dello stesso colore, e la
     voce attiva non diceva più dove sei — che è l'unica cosa che questo menu deve fare.
     ⚠️ E la regola vincente era la MIA: non è un problema di specificità, è che il valore
     dentro la variabile non era quello che credevo. Un `!important` non avrebbe cambiato nulla.
     👉 Quindi: token proprio, con un valore vero dentro. Una skin che vuole un altro accento
     scrive `--msz-on`: una riga, dichiarata — invece di scoprire per caso quale token del tema
     oggi contiene un arancione. */
  /* 🔴 09/08 08:5x — LA BARRA SI PORTA FONDO E INCHIOSTRO SUOI. Non è una scelta di gusto: è
     un difetto MISURATO. La versione di prima diceva `color:inherit` ragionando «il testo prende
     il colore che quella pagina usa già, così è leggibile contro il SUO fondo». Falso: eredita
     dall'ANTENATO, che non è per forza il fondo che si vede. Sul calendario di timerbet:

         testo ereditato   rgb(34, 79, 124)     blu
         fondo vero        rgb(28, 66, 103)     lo STESSO blu, un tono più scuro
         contrasto                 1.16 : 1     ← invisibile (WCAG AA chiede 4.5)

     Cioè il menu c'era nel markup e non si vedeva — e per chi guarda è identico a non esserci.
     È lo stesso difetto chiuso stanotte sul riquadro fedeltà, e Jesper l'ha visto nella foto
     prima che lo misurassi io.
     👉 Controllando ENTRAMBI i colori il contrasto non dipende più da quale antenato capita
     sopra: è una proprietà della barra. Ed è anche la barra del suo mockup — fondo scuro,
     etichette chiare, acceso arancione. Una skin che ne vuole un'altra sovrascrive i tre token. */
  --msz-fondo:#0e2c47;
  --msz-ink:#e8eef5;
  --msz-on:#ff8a1f;
  background:var(--msz-fondo);
  color:var(--msz-ink);
  display:flex;
  align-items:stretch;
  gap:0;
  border-bottom:1px solid rgba(255,255,255,.14);
  /* Il menu è una BARRA, non tre bottoni che galleggiano: occupa la riga intera e le tre voci
     se la dividono. Senza `width:100%` su un contenitore flex più largo le voci si stringono
     attorno al testo e «Calendario» finisce a metà pagina. */
  width:100%;
  margin:0 0 10px;
  /* ⛔ NIENTE `overflow-x:auto` qui: una barra di tre voci che scorre di lato è il modo in cui
     la terza voce diventa invisibile su un telefono. Le tre ci stanno — vedi il riquadro a 390
     in fondo — e se un giorno non ci stessero va cambiata la soluzione, non aggiunta una barra
     di scorrimento che nasconde il problema. */
}

.msz-v{
  /* Tre colonne uguali, sempre. `flex:1 1 0` + `min-width:0` è la coppia che le tiene uguali
     ANCHE quando un'etichetta è più lunga delle altre: con `flex-basis:auto` «Evento singolo»
     si prenderebbe metà barra e le altre due si schiaccerebbero. */
  flex:1 1 0;
  min-width:0;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:5px;
  padding:9px 6px 8px;
  text-decoration:none;
  /* Eredita da `.msz`, cioè dall'inchiostro che la BARRA si è dichiarata — non dalla pagina.
     È la differenza fra «un colore che di solito va bene» e «un colore misurato contro il fondo
     su cui finisce davvero». La differenza fra acceso e spento la fanno tre cose che non
     dipendono dal tema: opacità, peso, e la riga arancione sotto. */
  color:inherit;
  opacity:.72;
  font-weight:500;
  /* Il bordo dell'acceso è già qui, TRASPARENTE: così quando una voce si accende la riga non
     cresce di 3px e il contenuto sotto non salta. */
  border-bottom:3px solid transparent;
  text-align:center;
  line-height:1.15;
}

/* I separatori sono sul fondo NOSTRO, quindi si scrivono in chiaro qui e non con un token
   del tema: un `--primary-border` pensato per un fondo bianco su questa barra sparisce. */
.msz-v + .msz-v{ border-left:1px solid rgba(255,255,255,.12); }

.msz-ic{
  width:20px; height:20px;
  flex:none;
}

.msz-et{
  font-size:13px;
  /* 🔴 A 390 LE TRE VOCI STANNO, E NON PERCHÉ IL TESTO SIA STATO RIMPICCIOLITO.
     390 / 3 = 130px per voce, meno 12px di respiro = 118px utili. «Evento singolo» a 13px non
     ci sta su una riga (~95px «Evento», ~52px «singolo»): va a capo NELLO SPAZIO, in due righe
     da 13px che si leggono, invece di stare su una riga da 9px che non si legge.
     ⛔ La strada scartata è proprio quella: rimpicciolire il carattere finché la parola entra è
     il modo di far sparire il problema dalla vista senza risolverlo.
     📌 MISURATO, non sperato: 13px a 1440 e **12,5px a 390** (il riquadro in fondo), e a 390 le
     tre etichette chiedono 63 · 92 · 67 px dentro 130 px di voce — nessuna troncata, la barra
     non scorre di lato. Il mezzo punto in meno è respiro, non è la parola che non ci stava. */
  overflow-wrap:normal;      /* si spezza fra le parole, MAI dentro una parola */
  word-break:normal;
  hyphens:none;              /* niente sillabazione: «Calenda-rio» è peggio di due righe */
  /* Due righe di spazio riservate a TUTTE e tre, così l'etichetta che va a capo non alza la sua
     voce rispetto alle altre due. È l'allineamento che nella foto di Jesper si vede e non si
     nota: le tre icone sono sulla stessa linea. */
  min-height:calc(2 * 1.15em);
  display:flex;
  align-items:center;
}

/* L'ACCESO — la riga arancione sotto, come nel mockup di Jesper («Event view» acceso).
   TRE segnali insieme, non uno: piena opacità · grassetto · la riga arancione. Uno solo non
   basterebbe — il colore da solo non arriva a chi non distingue l'arancione dal blu, e il
   grassetto da solo si perde in mezzo a una barra di tre voci. Con tre, l'acceso si vede
   comunque, su qualunque fondo e con qualunque vista. */
.msz-v.on{
  opacity:1;
  font-weight:700;
  border-bottom-color:var(--msz-on);
}
.msz-v:hover{ opacity:1; }

/* La tastiera deve vedere dove si trova: senza questo il contorno del browser sparisce sotto il
   bordo della barra e chi naviga a TAB non sa più su quale voce sta. */
.msz-v:focus-visible{ outline:2px solid var(--msz-on); outline-offset:-2px; opacity:1; }

@media (max-width:480px){
  .msz-v{ padding:8px 4px 7px; gap:4px; }
  .msz-ic{ width:19px; height:19px; }
  /* ⚠️ 12.5px è il PAVIMENTO, non un ripiego: sotto i 12px un'etichetta di navigazione smette di
     essere leggibile a distanza di braccio. Se un domani servisse scendere sotto, la risposta
     giusta è cambiare le parole, non il corpo del carattere. */
  .msz-et{ font-size:12.5px; }
}

/* player/header_user.css */
/* ============================================================================
   HEADER PLAYER — area utente in alto a DESTRA
   Richiesta Angelo (21/07 23:40), rif. `inbox/new/header_player_angelo.png`:
     · username e ESCI vanno SPOSTATI su, nella barra dell'header (oggi stanno in
       una strisciolina al centro, sotto il menu: i tre segni rossi di Angelo sono
       proprio lo spazio vuoto della barra dove devono andare);
     · SALDO visibile nell'header, con l'occhio per NASCONDERLO;
     · BANDIERE (lingua) e ROTELLINA (impostazioni) allineate e della stessa taglia
       degli altri bottoncini (le due frecce rosse indicano quelle due).

   Design D, 22-07-2026. Vestito + stati; il wiring (menu, POST logout, cambio
   lingua, memoria dell'occhio) è di B — vedi `design_reference/header_user/markup.html`.

   Convive col tema importato: tutto è dentro `.hu`, nessun selettore globale,
   niente `!important`. Sulle pagine a tema importato va servito col `<link>`
   iniettato da `AppMobileShell` (come gli altri fogli in B-css-esterno-partial-D.md).
   ========================================================================== */

.hu{
  --hu-ink:#ffffff;
  --hu-dim:rgba(255,255,255,.72);
  --hu-line:rgba(255,255,255,.22);
  --hu-soft:rgba(255,255,255,.10);   /* fondo dei bottoncini */
  --hu-soft-h:rgba(255,255,255,.20); /* … al passaggio del mouse */
  --hu-acc:#f5c451;                  /* oro = denaro e azione principale */
  --hu-acc-ink:#0e2140;
  --hu-live:#e8402a;
  --hu-menu:#0e2140;                 /* fondo delle tendine */

  display:flex;align-items:center;gap:8px;flex-wrap:nowrap;
  margin-left:auto;                  /* sta SEMPRE a destra nella barra */
  color:var(--hu-ink);
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  font-size:.86rem;line-height:1;
}

/* ── SALDO + occhio ──────────────────────────────────────────────────────────
   Un pezzo solo: cliccando la cifra si va al portafoglio, l'occhio nasconde.
   L'oro è il denaro, come in tutto il resto del prodotto. */
.hu-saldo{
  display:inline-flex;align-items:center;gap:6px;
  padding:6px 8px 6px 10px;border-radius:999px;
  background:var(--hu-soft);border:1px solid var(--hu-line);
}
.hu-saldo a{
  color:var(--hu-acc);font-weight:900;text-decoration:none;letter-spacing:.2px;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.hu-saldo a:hover{filter:brightness(1.1)}
/* 15px e non 24 (Dav, 31/07 06:12: «modifica .hu-eye width e height a 15px, così riduciamo
   gli spazi»). È il tondo dell'occhio che nasconde il saldo: stringendolo, il box del conto
   nell'header si accorcia — che è il seguito della sua 11-d. Numero dettato da lui. */
.hu-eye{
  width:15px;height:15px;flex:none;border:0;border-radius:50%;cursor:pointer;
  background:transparent;color:var(--hu-dim);font-size:14px;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;
}
.hu-eye:hover{background:var(--hu-soft-h);color:var(--hu-ink)}
/* saldo nascosto: la cifra diventa pallini, la larghezza NON balla
   (`.hu--celato` la mette e la toglie B, ricordandola per il giocatore) */
.hu-saldo.hu--celato .hu-cifra{visibility:hidden}
.hu-saldo.hu--celato .hu-cifra::after{
  content:"••••";visibility:visible;position:absolute;inset:0;
  display:flex;align-items:center;justify-content:center;letter-spacing:1px;
}
.hu-cifra{position:relative;display:inline-flex;align-items:center;min-width:64px;
  justify-content:flex-end}

/* ── UTENTE (username) + tendina del conto ──────────────────────────────────
   Era la pillola al centro sotto il menu: qui sale nella barra, accanto al saldo. */
.hu-user{
  display:inline-flex;align-items:center;gap:7px;
  /* ALTEZZA DEL CHIP CONTO — misura dettata da Dav (11-d, 31/07 07:36: «su .hu-user
     nell'header metti padding 0 12px»). Era 6+6: il box si vedeva troppo alto accanto
     agli altri comandi della barra. Il numero e' suo, non una mia interpretazione. */
  padding:0 12px;border-radius:999px;cursor:pointer;
  background:var(--hu-soft);border:1px solid var(--hu-line);
  color:var(--hu-ink);text-decoration:none;font-weight:700;
  max-width:220px;
}
.hu-user:hover{background:var(--hu-soft-h)}
.hu-user .hu-nome{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hu-user .hu-caret{opacity:.7;font-size:.7em}

/* ── bottoni parlanti (Deposita, Premi, Esci) ───────────────────────────── */
.hu-btn{
  display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
  padding:7px 13px;border-radius:999px;border:1px solid var(--hu-line);
  background:var(--hu-soft);color:var(--hu-ink);text-decoration:none;
  font:inherit;font-weight:800;cursor:pointer;
}
.hu-btn:hover{background:var(--hu-soft-h)}
.hu-btn--acc{background:var(--hu-acc);border-color:var(--hu-acc);color:var(--hu-acc-ink)}
.hu-btn--acc:hover{filter:brightness(1.06);background:var(--hu-acc)}
/* Esci: si legge come uscita, senza urlare */
.hu-btn--esci{color:#ffd9d4;border-color:rgba(232,64,42,.55)}
.hu-btn--esci:hover{background:rgba(232,64,42,.22);color:#fff}

/* ── bottoncini tondi: regali, messaggi, valuta, ROTELLINA, BANDIERA ─────────
   Tutti della STESSA taglia e sulla STESSA linea (era il disallineamento che
   Angelo segnava con le frecce). */
.hu-ic{
  width:32px;height:32px;flex:none;border-radius:50%;border:1px solid var(--hu-line);
  background:var(--hu-soft);color:var(--hu-ink);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:15px;line-height:1;position:relative;text-decoration:none;padding:0;
}
.hu-ic:hover{background:var(--hu-soft-h)}
.hu-ic .hu-badge{
  position:absolute;top:-3px;right:-3px;min-width:16px;height:16px;padding:0 4px;
  border-radius:999px;background:var(--hu-live);color:#fff;
  font-size:10px;font-weight:900;display:flex;align-items:center;justify-content:center;
}
/* la bandiera riempie il tondo e non si deforma mai */
.hu-ic--flag{overflow:hidden;padding:0}
.hu-ic--flag img{width:100%;height:100%;object-fit:cover;display:block}
/* la fascetta con la sigla («IT») sopra la bandiera NON esiste più nel markup (Dav 3-d,
   31/07: «dove compare la lingua solo la bandiera»): copriva il terzo basso del tondo per
   ripetere quello che la bandiera dice già. Il nome per esteso sta nel menu che si apre. */

/* focus da tastiera: visibile su tutto, non solo sui link */
.hu a:focus-visible,.hu button:focus-visible{outline:2px solid var(--hu-acc);outline-offset:2px}

/* ── tendine (conto, lingua, impostazioni) ──────────────────────────────────
   Aperte da B con la classe `.on` sul contenitore `.hu-wrap`. */
.hu-wrap{position:relative;display:inline-flex}
/* 🔴 IL TAGLIO CHE UCCIDEVA LE TENDINE (video di Angelo, 26/07 — riaperta 27/07).
   Il contenitore del TEMA che ci ospita (`.hd-ctm--auth`) è alto quanto la riga della
   testata (52px) e ha `overflow:hidden`. Le tendine si aprono SOTTO quella riga: il
   browser le apriva davvero (classe `.on`, `display:block`, nessun errore in console) ma
   non se ne vedeva un pixel. Da loggato erano morte TUTTE E TRE — conto, ingranaggio e
   lingua — a OGNI larghezza: «li premi e non fanno nulla». Da sloggato non si vedeva
   perché lì `.hu` non c'è e i pannelli sono quelli della pillola, che sta fuori da quel box.
   Il taglio si toglie SOLO nel contenitore che ospita la nostra testata (`-hu`), non su
   tutte le testate del tema. `!important` non per abitudine ma PROVATO necessario: la stessa
   regola senza, iniettata sulla produzione viva, lascia `overflow` calcolato a `hidden` —
   quella del grafico vince comunque. È l'unico `!important` di questo foglio. */
.hd-ctm--auth.hd-ctm--auth-hu{overflow:visible !important}
.hu-drop{
  position:absolute;top:calc(100% + 8px);right:0;z-index:60;display:none;
  min-width:210px;padding:6px;border-radius:10px;white-space:nowrap;
  background:var(--hu-menu);border:1px solid var(--hu-line);
  box-shadow:0 12px 28px rgba(0,0,0,.38);
}
.hu-wrap.on .hu-drop{display:block}
/* VOCI A RIQUADRO, TUTTE DELLA STESSA ALTEZZA (modello di Dav, 27/07 07:09). Erano righe
   trasparenti di altezza variabile: una voce su due righe (es. «Limiti e gioco responsabile»)
   era più alta delle sorelle e la tendina sembrava sfilacciata. Ora ogni voce è un riquadro
   arrotondato con la sua icona, e `min-height` uguale per tutte — anche per quelle che vanno
   a capo. Il testo NON si tronca: una voce accorciata con i puntini è una voce che non si
   legge; il riquadro cresce, restando allineato alle altre. */
.hu-drop a,.hu-drop button{
  display:flex;align-items:center;gap:10px;width:100%;
  min-height:40px;padding:8px 11px;border:0;border-radius:9px;
  background:var(--hu-soft);
  color:var(--hu-ink);text-decoration:none;font:inherit;font-weight:600;
  cursor:pointer;text-align:left;
}
.hu-drop a + a,.hu-drop form,.hu-drop button{margin-top:5px}
.hu-drop a:hover,.hu-drop button:hover{background:var(--hu-soft-h)}
/* La colonna dell'icona è FISSA: così le etichette partono tutte dallo stesso punto e la
   tendina si legge in colonna, come nel modello. */
/* `display` dichiarato invece che lasciato al caso: l'icona è un elemento di flex e va
   centrata nella sua colonna. (Sul banco sembrava servire un `!important`: era un falso
   allarme — lì il foglio delle icone rispondeva 404, quindi `.mdi` non aveva nessuna regola.
   Con le icone servite davvero la cascata basta, e questo foglio resta senza `!important`
   dove non serve.) */
.hu-drop .mdi{
  display:inline-flex;align-items:center;justify-content:center;
  flex:none;width:20px;text-align:center;font-size:17px;line-height:1;
  color:var(--hu-dim);
}
.hu-drop a:hover .mdi,.hu-drop button:hover .mdi{color:var(--hu-ink)}
/* L'USCITA si vede che è l'uscita, come in tutto il resto del prodotto. */
.hu-drop form button{background:rgba(232,64,42,.16);color:#ffd9d4}
.hu-drop form button:hover{background:rgba(232,64,42,.28);color:#fff}
.hu-drop form button .mdi{color:#ffb3aa}
/* Il modello di Dav è più largo della tendina di prima: le etichette lunghe ci stanno. */
.hu-drop--conto{min-width:248px}
.hu-drop hr{border:0;border-top:1px solid var(--hu-line);margin:5px 4px}
.hu-drop img{width:18px;height:13px;object-fit:cover;border-radius:2px;flex:none}
.hu-drop .on{color:var(--hu-acc);font-weight:800}

/* ── responsive: si spoglia per gradi, il denaro resta per ultimo ──────────── */
@media (max-width:1180px){
  .hu-btn .hu-txt{display:none}          /* i bottoni restano, solo icona */
  .hu-btn{padding:7px 10px}
}
@media (max-width:900px){
  .hu-user{max-width:130px}
  .hu-ic--gift,.hu-ic--cur{display:none} /* i secondari se ne vanno */
}
@media (max-width:640px){
  .hu{gap:6px}
  .hu-user .hu-nome{display:none}        /* resta l'omino: apre il conto */
  /* restano SALDO · Deposita · omino · bandiera. Esci, messaggi e rotellina non
     spariscono: vivono nella tendina dell'omino (vedi markup). */
  .hu-btn--premi,.hu-btn--esci,.hu-ic--msg,.hu-ic--set{display:none}
  /* 🔴 E QUI SE NE VA ANCHE L'ORA (31/07, misurato a 390px prima che lo segnalasse
     qualcuno). Uscita dal tondo della bandiera, l'ora e' diventata larga per davvero: 37px
     veri al posto di zero. Su uno schermo stretto quei 37px spingono l'«Esci» a destra —
     misurato: senza ora sta a 315-357, con l'ora a 332-374 — e li' sotto c'e' il menu
     «Formato delle quote» del tema, che occupa 345-400 e sta DAVANTI. La sovrapposizione
     c'era gia' (12px), l'ora l'aveva portata a 29: l'«Esci» diventava mezzo non premibile,
     ed e' esattamente il difetto «comandi visibili e non premibili» gia' visto tre volte.
     L'ora e' il pezzo piu' sacrificabile della fila — sullo stretto il fuso non lo si guarda
     dalla testata — e sopra i 640px, dove lo spazio c'e', resta dov'e'. */
  .hu .hu-clock{display:none}
}

/* ════════════════════════════════════════════════════════════════════════════
   TEMA IMPORTATO — HEADER LOGGATO (rifiniture Dav 23/07). Il tema (`.hd-ctm--c`)
   rende la barra utente; qui la RIVESTIAMO via CSS (regola Dav: niente inline):
   1) sul SALDO l'icona diventa un OCCHIO (mostra/nascondi) al posto della freccia ↻;
   2) il MENU account uniformato agli altri: SFONDO BIANCO, testi BLU, pillole azzurre.
   Scoped a `.hd-ctm--c`, nessun !important non necessario. Il COMPORTAMENTO (toggle
   nascondi-saldo con memoria) è di B — vedi COORDINATION.
   ──────────────────────────────────────────────────────────────────────────── */

/* 1) SALDO: la freccia/reload → OCCHIO (mdi). Stesso glifo-font del tema. */
.hd-ctm.hd-ctm--c .account-info .info-amount .mdi-reload::before{content:"\F0208"}   /* mdi-eye */
.hd-ctm.hd-ctm--c .account-info .info-amount .mdi-reload{cursor:pointer;opacity:.85}
.hd-ctm.hd-ctm--c .account-info .info-amount .mdi-reload:hover{opacity:1}
/* saldo nascosto: B mette `.saldo-hidden` sul wrapper → la cifra si oscura, l'occhio si barra */
.hd-ctm.hd-ctm--c .account-info.saldo-hidden .info-amount{color:transparent;text-shadow:0 0 9px rgba(0,0,0,.55)}
.hd-ctm.hd-ctm--c .account-info.saldo-hidden .info-amount .mdi-reload{color:inherit;-webkit-text-fill-color:currentColor}
.hd-ctm.hd-ctm--c .account-info.saldo-hidden .info-amount .mdi-reload::before{content:"\F06D1"}   /* mdi-eye-off */

/* 2) MENU account (submenu) come gli altri: BIANCO + testi BLU + pillole azzurre */
.hd-ctm.hd-ctm--c .account-menu .menu-list--submenu{
  background:#fff;border:1px solid rgba(28,66,103,.14);border-radius:12px;
  box-shadow:0 14px 34px rgba(18,40,66,.20);padding:8px}
.hd-ctm.hd-ctm--c .account-menu .menu-list--submenu ul{list-style:none;margin:0;padding:0}
.hd-ctm.hd-ctm--c .account-menu .menu-list--submenu ul>li{margin:0 0 6px}
.hd-ctm.hd-ctm--c .account-menu .menu-list--submenu ul>li:last-child{margin-bottom:0}
.hd-ctm.hd-ctm--c .account-menu .menu-list--submenu ul>li>a{
  display:flex;align-items:center;gap:9px;padding:9px 12px;border-radius:999px;
  background:#eaf2fb;color:#1c4267;font-weight:700;font-size:.9rem;text-decoration:none}
.hd-ctm.hd-ctm--c .account-menu .menu-list--submenu ul>li>a .mdi{color:#2a6bb0}
.hd-ctm.hd-ctm--c .account-menu .menu-list--submenu ul>li>a:hover{background:#d9e8f8;color:#12456f}

/* player/header_var_dav.css */
/* ===========================================================================
   LA VARIANTE DELL'HEADER CHIESTA DA DAV — card `HEADER-DAV` (03/08 21:48/21:49)

   Le sue parole, alla lettera:
     «nell header il link bonus mettilo sopra accanto messaggi (con un icona). E il saldo lo
      sposti sotto. Il tasto il mio conto fallo con un icona. Fai che metti l icona account e
      accanto il saldo. Sopra il saldo metti l username»

   Cinque punti che sono UN riassetto solo dell'angolo in alto a destra:

       [🎁] [✉] [👛] [⚙]                    [ username          ▾ ]
                                            [ 👤   € 124,50       ]

   🔴 PERCHÉ È UNA VARIANTE E NON UNA MODIFICA.
   Questa barra la indossano TUTTE le skin. La card lo dice: «verificare che il riassetto non
   rompa quelle che oggi funzionano — è già successo con le due cornici di studio5». Quindi tutto
   quello che segue sta sotto `.hu--dav` / `.tbl-acct--dav`: su ogni altra skin **non c'è un solo
   selettore che combacia**, e questo foglio può viaggiare con gli altri senza cambiare niente a
   nessuno.

   Il markup NON è duplicato: gli stessi elementi di sempre, in un ordine diverso. Un secondo
   template sarebbe stato un secondo padrone per lo stesso angolo di pagina — lo stesso errore
   che ho appena raccomandato a Dav di evitare sul composer.
   =========================================================================== */

/* ── 1 · L'ORDINE DELLA RIGA: i comandi a sinistra, il conto a destra ──────────
   `.hu` è già un flex (header_user.css): qui si riordina, non si ricostruisce. Il bonus per
   primo perché è la voce che Dav ha chiesto di mettere «sopra accanto messaggi». */
.hu--dav .hu-ic--bonus            { order: 1 }
.hu--dav .hu-ic--msg              { order: 2 }
.hu--dav .hu-ic--wallet           { order: 3 }
.hu--dav .hu-wrap:not(.hu-wrap--acc) { order: 4 }   /* l'ingranaggio */
.hu--dav .hu-wrap--acc            { order: 9; margin-left: auto }

/* ── 2 · IL CHIP DEL CONTO: username sopra, [icona + saldo] sotto ──────────────
   Punti 2, 4 e 5 insieme, perché sono la stessa scatola. Oggi l'icona 👤 sta a SINISTRA di
   tutta la colonna; Dav la vuole **accanto al saldo**, cioè nella riga di sotto.

   `display:contents` su `.hu-acc-col` fa sparire il contenitore dal box tree senza toccare il
   markup: username e saldo diventano figli della griglia e si possono posare uno per riga.
   Serve proprio perché il markup non lo tocchiamo. */
.hu--dav .hu-user {
  display: grid;
  grid-template-columns: auto 1fr auto;
  grid-template-areas: "nome  nome   caret"
                       "ico   saldo  caret";
  align-items: center;
  column-gap: 7px;
  row-gap: 1px;
  padding: 4px 12px;          /* il 12px orizzontale è la misura di Dav (31/07), non si tocca */
  max-width: 240px;
}
.hu--dav .hu-acc-col          { display: contents }
.hu--dav .hu-user > .mdi-account { grid-area: ico; font-size: 15px; line-height: 1 }
.hu--dav .hu-nome             { grid-area: nome; font-size: .82em; opacity: .85; font-weight: 600 }
.hu--dav .hu-saldo            { grid-area: saldo; font-weight: 800 }
.hu--dav .hu-caret            { grid-area: caret }

/* ── 3 · «Il mio conto» diventa un'icona ──────────────────────────────────────
   L'icona c'è già (`.mdi-account-circle`): il punto 3 è togliere la SCRITTA, non aggiungere
   un'immagine. Si nasconde il testo, non il link — e resta leggibile a chi usa un lettore di
   schermo, perché il `title` sul link è rimasto al suo posto. Un comando che sparisce del tutto
   sarebbe una funzione tolta; qui è la stessa funzione, più stretta. */
.tbl-acct--dav .tbl-me-txt {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
.tbl-acct--dav .tbl-me { gap: 0 }

/* ── Sotto i 560px la barra è già stretta: si torna in fila, come prima ────────
   A quella misura la griglia su due righe alzerebbe la testata di 14px su ogni pagina, e Dav il
   riassetto l'ha chiesto guardando il desktop. Meglio la barra di sempre che una barra sua
   rotta. */
@media (max-width: 560px) {
  .hu--dav .hu-user   { display: inline-flex; padding: 0 12px }
  .hu--dav .hu-acc-col{ display: flex; flex-direction: column }
  .hu--dav .hu-wrap--acc { margin-left: 0 }
}

/* player/auth_modal.css */
/* ============================================================================
   AUTH — avviso «accedi per scommettere» nel coupon + MODALE login/registrazione
   Vestito sul tema del player (navy + oro). Design D per il task di B
   (Angelo_scommetti_nonauth). Testi ITALIANI; NIENTE testi/immagini della reference.
   CSS via <link> (regola di casa). B: trigger sul click Scommetti da sloggato + wiring
   del form (riusa il login/registrazione esistente). Design D, 22-07-2026.
   ========================================================================== */

:root{
  --am-navy:#0b1826; --am-navy2:#0a1220; --am-card:#10233a; --am-raise:#16304d;
  --am-line:#1d3a58; --am-ink:#eef4fb; --am-dim:#93aec7;
  --am-gold:#F5B301; --am-gold-d:#d99e00; --am-on-gold:#231400;
  --am-field:#1f7a3f; --am-warn:#ff9d1e; --am-warn-bg:#3a2a12;
}

/* ── 1) AVVISO nel coupon ──────────────────────────────────────────────── */
.tb-authwarn{
  display:flex;align-items:center;gap:9px;
  margin:8px 10px;padding:9px 11px;border-radius:8px;
  background:var(--am-warn-bg);border:1px solid rgba(255,157,30,.5);
  color:#ffd9a6;font-size:12.5px;font-weight:700;line-height:1.3;
}
.tb-authwarn .ic{flex:none;width:20px;height:20px;border-radius:50%;
  display:grid;place-items:center;background:var(--am-warn);color:#2a1600;
  font-weight:900;font-size:13px}
.tb-authwarn a{color:#ffe6c2;text-decoration:underline;font-weight:800}

/* ── 2) MODALE ─────────────────────────────────────────────────────────── */
.tb-authov{
  position:fixed;inset:0;z-index:120;display:none;place-items:center;padding:18px;
  background:rgba(4,10,18,.72);backdrop-filter:blur(3px);
}
.tb-authov.on{display:grid}   /* B: apre/chiude con la classe .on */
.tb-authm{
  width:100%;max-width:390px;max-height:calc(100vh - 36px);overflow:auto;
  background:var(--am-card);border:1px solid var(--am-line);border-radius:16px;
  box-shadow:0 24px 60px rgba(0,0,0,.6);color:var(--am-ink);position:relative;
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
}
.tb-authm *{box-sizing:border-box}

/* HERO del BRAND (non una foto della reference): navy + oro + il minuto «78'» */
.tb-authm .hero{
  position:relative;height:118px;border-radius:16px 16px 0 0;overflow:hidden;
  background:
    radial-gradient(120% 140% at 80% -10%, rgba(245,179,1,.22), transparent 55%),
    linear-gradient(135deg,#0d2136,#0a1220);
  display:flex;align-items:center;justify-content:center;gap:12px;
}
.tb-authm .hero::before{         /* riga campo verde, firma sportiva */
  content:"";position:absolute;inset-block-end:0;inset-inline:0;height:3px;
  background:linear-gradient(90deg,var(--am-gold),var(--am-field),transparent)
}
.tb-authm .hero .min{            /* il badge del minuto live: firma del brand */
  min-width:44px;height:44px;padding:0 6px;border:2.5px solid var(--am-gold);
  border-radius:50%;display:grid;place-items:center;color:var(--am-gold);
  font:800 15px/1 ui-monospace,"SF Mono",Menlo,monospace;
}
.tb-authm .hero .word{font:800 24px/1 system-ui;letter-spacing:.02em;color:#fff}
.tb-authm .hero .word b{color:var(--am-gold)}

.tb-authm .x{
  position:absolute;inset-block-start:10px;inset-inline-end:10px;z-index:2;
  width:32px;height:32px;border:0;border-radius:50%;cursor:pointer;
  background:rgba(0,0,0,.35);color:#fff;font-size:16px;display:grid;place-items:center;
}
.tb-authm .x:hover{background:rgba(0,0,0,.55)}

.tb-authm .body{padding:16px 18px 18px}
.tb-authm h2{margin:2px 0 3px;font-size:19px;font-weight:800;text-align:center}
.tb-authm .sub{margin:0 0 16px;text-align:center;color:var(--am-dim);font-size:12.5px}

/* campi */
.tb-authm .field{position:relative;margin-bottom:11px}
.tb-authm .field .ic{
  position:absolute;inset-block-start:50%;inset-inline-start:12px;transform:translateY(-50%);
  color:var(--am-dim);pointer-events:none;font-size:16px
}
.tb-authm .field input{
  width:100%;background:var(--am-navy2);border:1px solid var(--am-line);border-radius:10px;
  color:var(--am-ink);font:inherit;font-size:14px;padding:13px 40px 13px 40px;outline:none;
  transition:border-color .12s,box-shadow .12s;
}
.tb-authm .field input::placeholder{color:var(--am-dim)}
.tb-authm .field input:focus{border-color:var(--am-gold);box-shadow:0 0 0 3px rgba(245,179,1,.16)}
.tb-authm .field .eye{
  position:absolute;inset-block-start:50%;inset-inline-end:8px;transform:translateY(-50%);
  width:30px;height:30px;border:0;background:transparent;color:var(--am-dim);cursor:pointer;
  border-radius:7px;display:grid;place-items:center;font-size:15px
}
.tb-authm .eye:hover{color:var(--am-ink)}

.tb-authm .forgot{display:block;text-align:end;margin:2px 2px 14px;
  color:var(--am-dim);font-size:12px;text-decoration:none}
.tb-authm .forgot:hover{color:var(--am-gold)}

/* bottone ACCEDI: oro = l'azione che vale (regola della casa, l'oro è il denaro) */
.tb-authm .cta{
  width:100%;border:0;border-radius:11px;cursor:pointer;
  padding:14px;font:800 14px/1 inherit;letter-spacing:.04em;
  background:linear-gradient(180deg,var(--am-gold),var(--am-gold-d));color:var(--am-on-gold);
  box-shadow:0 6px 18px rgba(245,179,1,.28);transition:filter .12s;
}
.tb-authm .cta:hover{filter:brightness(1.05)}

.tb-authm .sep{display:flex;align-items:center;gap:12px;margin:16px 0 12px;
  color:var(--am-dim);font-size:12px}
.tb-authm .sep::before,.tb-authm .sep::after{content:"";flex:1;height:1px;background:var(--am-line)}

/* registrati: SECONDARIO (bordo oro, fondo navy) — non compete con Accedi */
.tb-authm .cta2{
  width:100%;border:1.5px solid var(--am-gold);border-radius:11px;cursor:pointer;
  padding:13px;font:800 13px/1 inherit;letter-spacing:.04em;
  background:transparent;color:var(--am-gold);transition:background .12s;
}
.tb-authm .cta2:hover{background:rgba(245,179,1,.10)}

.tb-authm .fine{margin:14px 0 0;text-align:center;color:var(--am-dim);font-size:11px;line-height:1.5}

@media (prefers-reduced-motion:reduce){.tb-authm .cta,.tb-authm input{transition:none}}

/* ────────────────────────────────────────────────────────────────────────────────────────────
 * L'AVVISO «Credenziali errate»: GALLEGGIA, non spinge — e si può chiudere.
 *
 * Segnalazione del 04/08: «la notifica SPOSTA gli altri elementi della pagina e non si può
 * chiudere, resta lì per sempre». Erano due difetti in uno, e tutti e due veri: il riquadro
 * veniva creato in JS e APPESO al form (`f.appendChild`) con un `margin-top`, quindi entrava
 * nel flusso e faceva scendere tutto quello che stava sotto — il dialog si riassestava sotto
 * le dita di chi sta sbagliando la password, che è il momento peggiore per muovere i bersagli.
 * E si azzerava solo al submit successivo: chi rinunciava se lo teneva in faccia.
 *
 * Perciò: `position:absolute` ancorato al form (che qui prende `position:relative`, senza la
 * quale l'assoluto risalirebbe fino al primo antenato posizionato e finirebbe in un angolo
 * qualunque della pagina) e uno `z-index` che lo tiene sopra i campi.
 *
 * ⚠️ IL FONDO NON È DECORAZIONE: un avviso che galleggia SOPRA altro testo, senza fondo, si
 * legge sovrapposto a quello che copre. Chi toglie il `background` non semplifica: rende
 * illeggibile proprio il messaggio che deve farsi leggere.
 * ──────────────────────────────────────────────────────────────────────────────────────────── */
form[action="/player/entrar"]{position:relative}
.tb-login-err{
  position:absolute;z-index:70;inset-inline:0;top:100%;margin-top:6px;
  display:flex;align-items:flex-start;gap:8px;
  padding:8px 10px;border-radius:9px;text-align:start;
  background:var(--am-bg,#12283f);border:1px solid rgba(230,73,58,.45);
  box-shadow:0 10px 26px rgba(0,0,0,.35);
}
.tb-login-err-t{flex:1}
/* la «x»: bersaglio vero (non un carattere da centrare col mouse), colore ereditato dall'avviso */
.tb-login-err-x{
  flex:none;background:none;border:0;cursor:pointer;color:inherit;
  font:inherit;font-size:18px;line-height:1;padding:0 2px;opacity:.75;
}
.tb-login-err-x:hover{opacity:1}

/* player/iconpack.css */
/* 🔴 LE 605 REGOLE `.ic-flag--` SONO STATE TOLTE (06/08, misurato).
   Pesavano 52,0 KB su 84,1 — il 61% di questo foglio — e `iconpack.css` è STRUTTURALE
   (`player_ui.mobile.FOGLI_STRUTTURALI`): lo scarica ogni giocatore di ogni skin, vestita
   o no. Usi nel prodotto: **zero** — né la classe `ic-flag` né le PNG di
   `iconpack/flags/` sono nominate in un template, in un JS o in un file Python.
   ⚠️ Le bandiere che le pagine mostrano DAVVERO sono un'altra cosa e restano dove sono:
   `player/flags/<iso2>.svg` (257 file), chieste per codice paese dal dato
   (`theme_family.competitor_flag`, che ripiega su stringa vuota se il file non c'è).
   Nessun percorso può chiedere quelle tolte: il nome della classe non si compone da
   nessuna parte, quindi non è «non usata oggi», è irraggiungibile.
   📌 Fra quelle tolte c'erano anche le due regole non valide `gosford(aus)` e
   `menangle(aus)`: parentesi nude in un selettore, che il parser scartava comunque. */
/* ============================================================================
   ICON-PACK del player — integrato da D (asset di Dav, 22-07-2026).
   Struttura + CLASSI condivise; il CSS è per-skin: una skin nuova = solo cambio
   del <link>, il markup non cambia (direttiva Dav). CSS via <link>, zero inline.

   COME SI USA (markup di B):
     <i class="ic ic-sport--soccer"></i>      icona sport monocroma → prende il
                                               COLORE del testo (currentColor), quindi
                                               si tinge da sola nel tema scuro. Aggiungi
                                               .is-solid per la variante piena.
     <i class="ic ic-sport--soccer is-colour"></i>  variante a colori (non tingibile)
     <i class="ic ic-campo--soccer-filed"></i> il "campo" dello sport (grande)
     <i class="ic ic-ui--print"></i>          icona d'interfaccia (print/view/sorting…)
     <i class="ic ic-flag--it"></i>           bandiera (PNG, a colori)
     <i class="ic ic-prov--light"></i>        loghi provider casinò
   Dimensione: default 20px; cambia con font-size sul contenitore o .ic--lg / .ic--sm.
   ========================================================================== */

.ic{display:inline-block;width:1.25em;height:1.25em;flex:none;vertical-align:-.25em;
  background-repeat:no-repeat;background-position:center;background-size:contain}
.ic--sm{font-size:14px}.ic--lg{font-size:28px}.ic--xl{font-size:44px}

/* --- monocrome (sport outline/solid, campi, ui): MASK → seguono currentColor --- */
.ic-sport,.ic-campo,.ic-ui,[class*="ic-sport--"],[class*="ic-campo--"],[class*="ic-ui--"]{
  background-color:currentColor;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center;
  -webkit-mask-size:contain;mask-size:contain;
}

/* ---- SPORT (outline = default, tingibile) ---- */
.ic-sport--american-football{-webkit-mask-image:url("/static/player/iconpack/sport/outline/american-football.9bdacf2d4213.svg");mask-image:url("/static/player/iconpack/sport/outline/american-football.9bdacf2d4213.svg")}
.ic-sport--athletics{-webkit-mask-image:url("/static/player/iconpack/sport/outline/athletics.5715cc3b8d1e.svg");mask-image:url("/static/player/iconpack/sport/outline/athletics.5715cc3b8d1e.svg")}
.ic-sport--badminton{-webkit-mask-image:url("/static/player/iconpack/sport/outline/badminton.138525e0b969.svg");mask-image:url("/static/player/iconpack/sport/outline/badminton.138525e0b969.svg")}
.ic-sport--bandy{-webkit-mask-image:url("/static/player/iconpack/sport/outline/bandy.8d7da3186571.svg");mask-image:url("/static/player/iconpack/sport/outline/bandy.8d7da3186571.svg")}
.ic-sport--baseball{-webkit-mask-image:url("/static/player/iconpack/sport/outline/baseball.46cb78e9e3b9.svg");mask-image:url("/static/player/iconpack/sport/outline/baseball.46cb78e9e3b9.svg")}
.ic-sport--basketball{-webkit-mask-image:url("/static/player/iconpack/sport/outline/basketball.11326a9f5532.svg");mask-image:url("/static/player/iconpack/sport/outline/basketball.11326a9f5532.svg")}
.ic-sport--beachvolley{-webkit-mask-image:url("/static/player/iconpack/sport/outline/beachvolley.446af7a64b20.svg");mask-image:url("/static/player/iconpack/sport/outline/beachvolley.446af7a64b20.svg")}
.ic-sport--biathlon{-webkit-mask-image:url("/static/player/iconpack/sport/outline/biathlon.123f464b7af5.svg");mask-image:url("/static/player/iconpack/sport/outline/biathlon.123f464b7af5.svg")}
.ic-sport--billiards{-webkit-mask-image:url("/static/player/iconpack/sport/outline/billiards.b065485141e1.svg");mask-image:url("/static/player/iconpack/sport/outline/billiards.b065485141e1.svg")}
.ic-sport--bowling{-webkit-mask-image:url("/static/player/iconpack/sport/outline/bowling.c22e20aae351.svg");mask-image:url("/static/player/iconpack/sport/outline/bowling.c22e20aae351.svg")}
.ic-sport--boxing{-webkit-mask-image:url("/static/player/iconpack/sport/outline/boxing.716bb475261e.svg");mask-image:url("/static/player/iconpack/sport/outline/boxing.716bb475261e.svg")}
.ic-sport--calendar{-webkit-mask-image:url("/static/player/iconpack/sport/outline/calendar.7bf629d40229.svg");mask-image:url("/static/player/iconpack/sport/outline/calendar.7bf629d40229.svg")}
.ic-sport--casino-play{-webkit-mask-image:url("/static/player/iconpack/sport/outline/casino-play.6a6d78273ebb.svg");mask-image:url("/static/player/iconpack/sport/outline/casino-play.6a6d78273ebb.svg")}
.ic-sport--chart{-webkit-mask-image:url("/static/player/iconpack/sport/outline/chart.99fc3cebe123.svg");mask-image:url("/static/player/iconpack/sport/outline/chart.99fc3cebe123.svg")}
.ic-sport--chart-2{-webkit-mask-image:url("/static/player/iconpack/sport/outline/chart-2.d432d27fd3ba.svg");mask-image:url("/static/player/iconpack/sport/outline/chart-2.d432d27fd3ba.svg")}
.ic-sport--chess{-webkit-mask-image:url("/static/player/iconpack/sport/outline/chess.7412aa268eb3.svg");mask-image:url("/static/player/iconpack/sport/outline/chess.7412aa268eb3.svg")}
.ic-sport--cricket{-webkit-mask-image:url("/static/player/iconpack/sport/outline/cricket.2b09d1a1a79e.svg");mask-image:url("/static/player/iconpack/sport/outline/cricket.2b09d1a1a79e.svg")}
.ic-sport--cup{-webkit-mask-image:url("/static/player/iconpack/sport/outline/cup.62e23f8c823b.svg");mask-image:url("/static/player/iconpack/sport/outline/cup.62e23f8c823b.svg")}
.ic-sport--cycling{-webkit-mask-image:url("/static/player/iconpack/sport/outline/cycling.23d4c4048938.svg");mask-image:url("/static/player/iconpack/sport/outline/cycling.23d4c4048938.svg")}
.ic-sport--darts{-webkit-mask-image:url("/static/player/iconpack/sport/outline/darts.c8eb6be18ffb.svg");mask-image:url("/static/player/iconpack/sport/outline/darts.c8eb6be18ffb.svg")}
.ic-sport--e-sports{-webkit-mask-image:url("/static/player/iconpack/sport/outline/e-sports.56ca489c597e.svg");mask-image:url("/static/player/iconpack/sport/outline/e-sports.56ca489c597e.svg")}
.ic-sport--f-e{-webkit-mask-image:url("/static/player/iconpack/sport/outline/f-e.dd4cad9ea919.svg");mask-image:url("/static/player/iconpack/sport/outline/f-e.dd4cad9ea919.svg")}
.ic-sport--f1{-webkit-mask-image:url("/static/player/iconpack/sport/outline/f1.a77e6a67b982.svg");mask-image:url("/static/player/iconpack/sport/outline/f1.a77e6a67b982.svg")}
.ic-sport--floorball{-webkit-mask-image:url("/static/player/iconpack/sport/outline/floorball.d6352c69ac20.svg");mask-image:url("/static/player/iconpack/sport/outline/floorball.d6352c69ac20.svg")}
.ic-sport--floorball-2{-webkit-mask-image:url("/static/player/iconpack/sport/outline/floorball-2.8c9cb5462f67.svg");mask-image:url("/static/player/iconpack/sport/outline/floorball-2.8c9cb5462f67.svg")}
.ic-sport--formula-e{-webkit-mask-image:url("/static/player/iconpack/sport/outline/formula-e.dd4cad9ea919.svg");mask-image:url("/static/player/iconpack/sport/outline/formula-e.dd4cad9ea919.svg")}
.ic-sport--gaelic-football{-webkit-mask-image:url("/static/player/iconpack/sport/outline/gaelic-football.9f817139c21a.svg");mask-image:url("/static/player/iconpack/sport/outline/gaelic-football.9f817139c21a.svg")}
.ic-sport--gaelic-hurling{-webkit-mask-image:url("/static/player/iconpack/sport/outline/gaelic-hurling.2d54bac62d74.svg");mask-image:url("/static/player/iconpack/sport/outline/gaelic-hurling.2d54bac62d74.svg")}
.ic-sport--golf{-webkit-mask-image:url("/static/player/iconpack/sport/outline/golf.44c122306059.svg");mask-image:url("/static/player/iconpack/sport/outline/golf.44c122306059.svg")}
.ic-sport--graph{-webkit-mask-image:url("/static/player/iconpack/sport/outline/graph.d3e598f1a0aa.svg");mask-image:url("/static/player/iconpack/sport/outline/graph.d3e598f1a0aa.svg")}
.ic-sport--handball{-webkit-mask-image:url("/static/player/iconpack/sport/outline/handball.38e3b327a825.svg");mask-image:url("/static/player/iconpack/sport/outline/handball.38e3b327a825.svg")}
.ic-sport--helmet{-webkit-mask-image:url("/static/player/iconpack/sport/outline/helmet.f9e25dbf352a.svg");mask-image:url("/static/player/iconpack/sport/outline/helmet.f9e25dbf352a.svg")}
.ic-sport--helmet-2{-webkit-mask-image:url("/static/player/iconpack/sport/outline/helmet-2.0d4ae3ce007c.svg");mask-image:url("/static/player/iconpack/sport/outline/helmet-2.0d4ae3ce007c.svg")}
.ic-sport--hockey{-webkit-mask-image:url("/static/player/iconpack/sport/outline/hockey.09bf76c89d45.svg");mask-image:url("/static/player/iconpack/sport/outline/hockey.09bf76c89d45.svg")}
.ic-sport--horse{-webkit-mask-image:url("/static/player/iconpack/sport/outline/horse.2052564c2802.svg");mask-image:url("/static/player/iconpack/sport/outline/horse.2052564c2802.svg")}
.ic-sport--horse-racing{-webkit-mask-image:url("/static/player/iconpack/sport/outline/horse-racing.2052564c2802.svg");mask-image:url("/static/player/iconpack/sport/outline/horse-racing.2052564c2802.svg")}
.ic-sport--hound{-webkit-mask-image:url("/static/player/iconpack/sport/outline/hound.b03ce40de1e9.svg");mask-image:url("/static/player/iconpack/sport/outline/hound.b03ce40de1e9.svg")}
.ic-sport--mma{-webkit-mask-image:url("/static/player/iconpack/sport/outline/mma.2767c90a8d49.svg");mask-image:url("/static/player/iconpack/sport/outline/mma.2767c90a8d49.svg")}
.ic-sport--mma-1{-webkit-mask-image:url("/static/player/iconpack/sport/outline/mma-1.69f6bd879e4a.svg");mask-image:url("/static/player/iconpack/sport/outline/mma-1.69f6bd879e4a.svg")}
.ic-sport--mma-2{-webkit-mask-image:url("/static/player/iconpack/sport/outline/mma-2.e276a0ea2424.svg");mask-image:url("/static/player/iconpack/sport/outline/mma-2.e276a0ea2424.svg")}
.ic-sport--most-played{-webkit-mask-image:url("/static/player/iconpack/sport/outline/most-played.82ad4ee57f2f.svg");mask-image:url("/static/player/iconpack/sport/outline/most-played.82ad4ee57f2f.svg")}
.ic-sport--moto{-webkit-mask-image:url("/static/player/iconpack/sport/outline/moto.b6b8b6e70d1a.svg");mask-image:url("/static/player/iconpack/sport/outline/moto.b6b8b6e70d1a.svg")}
.ic-sport--nordi-combined{-webkit-mask-image:url("/static/player/iconpack/sport/outline/nordi-combined.af027fb5ea8b.svg");mask-image:url("/static/player/iconpack/sport/outline/nordi-combined.af027fb5ea8b.svg")}
.ic-sport--piu{-webkit-mask-image:url("/static/player/iconpack/sport/outline/piu.57518dee5e32.svg");mask-image:url("/static/player/iconpack/sport/outline/piu.57518dee5e32.svg")}
.ic-sport--regulation-rugby{-webkit-mask-image:url("/static/player/iconpack/sport/outline/regulation-rugby.1008340fc4f7.svg");mask-image:url("/static/player/iconpack/sport/outline/regulation-rugby.1008340fc4f7.svg")}
.ic-sport--rugby{-webkit-mask-image:url("/static/player/iconpack/sport/outline/rugby.321800811b0a.svg");mask-image:url("/static/player/iconpack/sport/outline/rugby.321800811b0a.svg")}
.ic-sport--sailing{-webkit-mask-image:url("/static/player/iconpack/sport/outline/sailing.bfeee4c32a1f.svg");mask-image:url("/static/player/iconpack/sport/outline/sailing.bfeee4c32a1f.svg")}
.ic-sport--simulated-reality{-webkit-mask-image:url("/static/player/iconpack/sport/outline/simulated-reality.e6f342ae465a.svg");mask-image:url("/static/player/iconpack/sport/outline/simulated-reality.e6f342ae465a.svg")}
.ic-sport--ski{-webkit-mask-image:url("/static/player/iconpack/sport/outline/ski.878731c8495b.svg");mask-image:url("/static/player/iconpack/sport/outline/ski.878731c8495b.svg")}
.ic-sport--skiing{-webkit-mask-image:url("/static/player/iconpack/sport/outline/skiing.878731c8495b.svg");mask-image:url("/static/player/iconpack/sport/outline/skiing.878731c8495b.svg")}
.ic-sport--snooker{-webkit-mask-image:url("/static/player/iconpack/sport/outline/snooker.b065485141e1.svg");mask-image:url("/static/player/iconpack/sport/outline/snooker.b065485141e1.svg")}
.ic-sport--soccer{-webkit-mask-image:url("/static/player/iconpack/sport/outline/soccer.3db76821cc98.svg");mask-image:url("/static/player/iconpack/sport/outline/soccer.3db76821cc98.svg")}
.ic-sport--special{-webkit-mask-image:url("/static/player/iconpack/sport/outline/special.a152e11f4e58.svg");mask-image:url("/static/player/iconpack/sport/outline/special.a152e11f4e58.svg")}
.ic-sport--squash{-webkit-mask-image:url("/static/player/iconpack/sport/outline/squash.1e71f464b573.svg");mask-image:url("/static/player/iconpack/sport/outline/squash.1e71f464b573.svg")}
.ic-sport--star{-webkit-mask-image:url("/static/player/iconpack/sport/outline/star.5b113ac6a528.svg");mask-image:url("/static/player/iconpack/sport/outline/star.5b113ac6a528.svg")}
.ic-sport--swimming{-webkit-mask-image:url("/static/player/iconpack/sport/outline/swimming.e618db3ec23f.svg");mask-image:url("/static/player/iconpack/sport/outline/swimming.e618db3ec23f.svg")}
.ic-sport--table-tennis{-webkit-mask-image:url("/static/player/iconpack/sport/outline/table-tennis.8a8e91226882.svg");mask-image:url("/static/player/iconpack/sport/outline/table-tennis.8a8e91226882.svg")}
.ic-sport--tennis{-webkit-mask-image:url("/static/player/iconpack/sport/outline/tennis.fecac32329b0.svg");mask-image:url("/static/player/iconpack/sport/outline/tennis.fecac32329b0.svg")}
.ic-sport--timer{-webkit-mask-image:url("/static/player/iconpack/sport/outline/timer.b19207b70204.svg");mask-image:url("/static/player/iconpack/sport/outline/timer.b19207b70204.svg")}
.ic-sport--ultimo-minuto{-webkit-mask-image:url("/static/player/iconpack/sport/outline/ultimo-minuto.1c2f4990f2eb.svg");mask-image:url("/static/player/iconpack/sport/outline/ultimo-minuto.1c2f4990f2eb.svg")}
.ic-sport--volley{-webkit-mask-image:url("/static/player/iconpack/sport/outline/volley.b53710d23e1d.svg");mask-image:url("/static/player/iconpack/sport/outline/volley.b53710d23e1d.svg")}
.ic-sport--volleyball{-webkit-mask-image:url("/static/player/iconpack/sport/outline/volleyball.bd2eef3d59dd.svg");mask-image:url("/static/player/iconpack/sport/outline/volleyball.bd2eef3d59dd.svg")}
.ic-sport--vr{-webkit-mask-image:url("/static/player/iconpack/sport/outline/vr.e6f342ae465a.svg");mask-image:url("/static/player/iconpack/sport/outline/vr.e6f342ae465a.svg")}
.ic-sport--waterpolo{-webkit-mask-image:url("/static/player/iconpack/sport/outline/waterpolo.54e8153b3196.svg");mask-image:url("/static/player/iconpack/sport/outline/waterpolo.54e8153b3196.svg")}
.ic-sport--weather{-webkit-mask-image:url("/static/player/iconpack/sport/outline/weather.a8aa7f4097d9.svg");mask-image:url("/static/player/iconpack/sport/outline/weather.a8aa7f4097d9.svg")}
.ic-sport--winter{-webkit-mask-image:url("/static/player/iconpack/sport/outline/winter.958d98cfc5d0.svg");mask-image:url("/static/player/iconpack/sport/outline/winter.958d98cfc5d0.svg")}
.ic-sport--wrestling{-webkit-mask-image:url("/static/player/iconpack/sport/outline/wrestling.94979fd01cfe.svg");mask-image:url("/static/player/iconpack/sport/outline/wrestling.94979fd01cfe.svg")}
/* variante piena: .ic-sport--X.is-solid */
.ic-sport--alarm.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/alarm.0ae3c3f48e34.svg");mask-image:url("/static/player/iconpack/sport/solid/alarm.0ae3c3f48e34.svg")}
.ic-sport--american-football.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/american-football.a4445d4792f4.svg");mask-image:url("/static/player/iconpack/sport/solid/american-football.a4445d4792f4.svg")}
.ic-sport--arrow-1.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/arrow-1.37dfbd1a1da8.svg");mask-image:url("/static/player/iconpack/sport/solid/arrow-1.37dfbd1a1da8.svg")}
.ic-sport--badminton.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/badminton.25c9ced3ca6c.svg");mask-image:url("/static/player/iconpack/sport/solid/badminton.25c9ced3ca6c.svg")}
.ic-sport--bandy.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/bandy.9c2c9ccf601f.svg");mask-image:url("/static/player/iconpack/sport/solid/bandy.9c2c9ccf601f.svg")}
.ic-sport--baseball.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/baseball.9257136fadb4.svg");mask-image:url("/static/player/iconpack/sport/solid/baseball.9257136fadb4.svg")}
.ic-sport--basketball.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/basketball.d42831f6fe86.svg");mask-image:url("/static/player/iconpack/sport/solid/basketball.d42831f6fe86.svg")}
.ic-sport--bowling.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/bowling.04c1aed097a9.svg");mask-image:url("/static/player/iconpack/sport/solid/bowling.04c1aed097a9.svg")}
.ic-sport--boxing.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/boxing.f9a250711511.svg");mask-image:url("/static/player/iconpack/sport/solid/boxing.f9a250711511.svg")}
.ic-sport--calendar.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/calendar.5f27816a33e9.svg");mask-image:url("/static/player/iconpack/sport/solid/calendar.5f27816a33e9.svg")}
.ic-sport--chess.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/chess.d47093e5dd56.svg");mask-image:url("/static/player/iconpack/sport/solid/chess.d47093e5dd56.svg")}
.ic-sport--cricket.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/cricket.32840e9ee40b.svg");mask-image:url("/static/player/iconpack/sport/solid/cricket.32840e9ee40b.svg")}
.ic-sport--cup.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/cup.338f8ec16e1d.svg");mask-image:url("/static/player/iconpack/sport/solid/cup.338f8ec16e1d.svg")}
.ic-sport--cycling.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/cycling.fca1803ddba4.svg");mask-image:url("/static/player/iconpack/sport/solid/cycling.fca1803ddba4.svg")}
.ic-sport--darts.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/darts.ee074fc51d8d.svg");mask-image:url("/static/player/iconpack/sport/solid/darts.ee074fc51d8d.svg")}
.ic-sport--f-e.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/f-e.7d0874f2f7a2.svg");mask-image:url("/static/player/iconpack/sport/solid/f-e.7d0874f2f7a2.svg")}
.ic-sport--f1.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/f1.ef42022cb428.svg");mask-image:url("/static/player/iconpack/sport/solid/f1.ef42022cb428.svg")}
.ic-sport--floorball.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/floorball.b0216a96b693.svg");mask-image:url("/static/player/iconpack/sport/solid/floorball.b0216a96b693.svg")}
.ic-sport--gaelic-football.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/gaelic-football.cd7b7de794d2.svg");mask-image:url("/static/player/iconpack/sport/solid/gaelic-football.cd7b7de794d2.svg")}
.ic-sport--gaelic-hurling.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/gaelic-hurling.640a4480404b.svg");mask-image:url("/static/player/iconpack/sport/solid/gaelic-hurling.640a4480404b.svg")}
.ic-sport--golf.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/golf.10cab70006fb.svg");mask-image:url("/static/player/iconpack/sport/solid/golf.10cab70006fb.svg")}
.ic-sport--handball.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/handball.41b7f3d0b203.svg");mask-image:url("/static/player/iconpack/sport/solid/handball.41b7f3d0b203.svg")}
.ic-sport--hockey.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/hockey.327688dbe557.svg");mask-image:url("/static/player/iconpack/sport/solid/hockey.327688dbe557.svg")}
.ic-sport--horse.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/horse.072790b0054c.svg");mask-image:url("/static/player/iconpack/sport/solid/horse.072790b0054c.svg")}
.ic-sport--live-betting.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/live-betting.03000d1736ec.svg");mask-image:url("/static/player/iconpack/sport/solid/live-betting.03000d1736ec.svg")}
.ic-sport--market-movers.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/market-movers.25ac966e450a.svg");mask-image:url("/static/player/iconpack/sport/solid/market-movers.25ac966e450a.svg")}
.ic-sport--mma.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/mma.5abc14277bc0.svg");mask-image:url("/static/player/iconpack/sport/solid/mma.5abc14277bc0.svg")}
.ic-sport--most-played.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/most-played.e188c394d64d.svg");mask-image:url("/static/player/iconpack/sport/solid/most-played.e188c394d64d.svg")}
.ic-sport--moto.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/moto.07ae7ad41c5d.svg");mask-image:url("/static/player/iconpack/sport/solid/moto.07ae7ad41c5d.svg")}
.ic-sport--regulation-rugby.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/regulation-rugby.f30ac6d0090f.svg");mask-image:url("/static/player/iconpack/sport/solid/regulation-rugby.f30ac6d0090f.svg")}
.ic-sport--rugby.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/rugby.62831296b102.svg");mask-image:url("/static/player/iconpack/sport/solid/rugby.62831296b102.svg")}
.ic-sport--sailing.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/sailing.f564df4705cb.svg");mask-image:url("/static/player/iconpack/sport/solid/sailing.f564df4705cb.svg")}
.ic-sport--skiing.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/skiing.874b169da71d.svg");mask-image:url("/static/player/iconpack/sport/solid/skiing.874b169da71d.svg")}
.ic-sport--snooker.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/snooker.1340ac958cc2.svg");mask-image:url("/static/player/iconpack/sport/solid/snooker.1340ac958cc2.svg")}
.ic-sport--soccer.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/soccer.85c491dfebe5.svg");mask-image:url("/static/player/iconpack/sport/solid/soccer.85c491dfebe5.svg")}
.ic-sport--special.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/special.d8fdb87298d6.svg");mask-image:url("/static/player/iconpack/sport/solid/special.d8fdb87298d6.svg")}
.ic-sport--sport.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/sport.a2085fbd84b3.svg");mask-image:url("/static/player/iconpack/sport/solid/sport.a2085fbd84b3.svg")}
.ic-sport--squash.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/squash.9f8663401a40.svg");mask-image:url("/static/player/iconpack/sport/solid/squash.9f8663401a40.svg")}
.ic-sport--star.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/star.cf114ac61203.svg");mask-image:url("/static/player/iconpack/sport/solid/star.cf114ac61203.svg")}
.ic-sport--swimming.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/swimming.4c1b25deed7e.svg");mask-image:url("/static/player/iconpack/sport/solid/swimming.4c1b25deed7e.svg")}
.ic-sport--table-tennis.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/table-tennis.03f912d190d0.svg");mask-image:url("/static/player/iconpack/sport/solid/table-tennis.03f912d190d0.svg")}
.ic-sport--tennis.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/tennis.4c921a490807.svg");mask-image:url("/static/player/iconpack/sport/solid/tennis.4c921a490807.svg")}
.ic-sport--timer.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/timer.6307b83f200f.svg");mask-image:url("/static/player/iconpack/sport/solid/timer.6307b83f200f.svg")}
.ic-sport--top-league.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/top-league.1a58426cd1ae.svg");mask-image:url("/static/player/iconpack/sport/solid/top-league.1a58426cd1ae.svg")}
.ic-sport--ultimo-minuto.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/ultimo-minuto.1c2f4990f2eb.svg");mask-image:url("/static/player/iconpack/sport/solid/ultimo-minuto.1c2f4990f2eb.svg")}
.ic-sport--volleyball.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/volleyball.1812f4273a38.svg");mask-image:url("/static/player/iconpack/sport/solid/volleyball.1812f4273a38.svg")}
.ic-sport--vr.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/vr.e9163a19c8a2.svg");mask-image:url("/static/player/iconpack/sport/solid/vr.e9163a19c8a2.svg")}
.ic-sport--waterpolo.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/waterpolo.15bee1f57382.svg");mask-image:url("/static/player/iconpack/sport/solid/waterpolo.15bee1f57382.svg")}
.ic-sport--weather.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/weather.c5546fd86fe0.svg");mask-image:url("/static/player/iconpack/sport/solid/weather.c5546fd86fe0.svg")}
.ic-sport--winter.is-solid{-webkit-mask-image:url("/static/player/iconpack/sport/solid/winter.4360d8756fc8.svg");mask-image:url("/static/player/iconpack/sport/solid/winter.4360d8756fc8.svg")}
/* variante a COLORI: .ic-sport--X.is-colour (background, non tingibile) */
.ic-sport.is-colour,[class*="ic-sport--"].is-colour{background-color:transparent;-webkit-mask-image:none;mask-image:none}
.ic-sport--alarm.is-colour{background-image:url("/static/player/iconpack/sport/colour/alarm.c83df7913b9b.svg")}
.ic-sport--american-football.is-colour{background-image:url("/static/player/iconpack/sport/colour/american-football.a72f2ca8b995.svg")}
.ic-sport--american-football-helmet.is-colour{background-image:url("/static/player/iconpack/sport/colour/american-football-helmet.b748479d9054.svg")}
.ic-sport--athletics.is-colour{background-image:url("/static/player/iconpack/sport/colour/athletics.a2d3cd2283e0.svg")}
.ic-sport--badminton.is-colour{background-image:url("/static/player/iconpack/sport/colour/badminton.e1574b88e47d.svg")}
.ic-sport--baseball.is-colour{background-image:url("/static/player/iconpack/sport/colour/baseball.e735eb2fb9ba.svg")}
.ic-sport--basketball.is-colour{background-image:url("/static/player/iconpack/sport/colour/basketball.4adf70d4b34f.svg")}
.ic-sport--beachvolley.is-colour{background-image:url("/static/player/iconpack/sport/colour/beachvolley.446af7a64b20.svg")}
.ic-sport--biathlon.is-colour{background-image:url("/static/player/iconpack/sport/colour/biathlon.123f464b7af5.svg")}
.ic-sport--bowling.is-colour{background-image:url("/static/player/iconpack/sport/colour/bowling.4189c9f6be22.svg")}
.ic-sport--boxing.is-colour{background-image:url("/static/player/iconpack/sport/colour/boxing.ee40bce89bef.svg")}
.ic-sport--calendar.is-colour{background-image:url("/static/player/iconpack/sport/colour/calendar.535056324eee.svg")}
.ic-sport--chess.is-colour{background-image:url("/static/player/iconpack/sport/colour/chess.f7a3b7629838.svg")}
.ic-sport--cricket.is-colour{background-image:url("/static/player/iconpack/sport/colour/cricket.57c098bafa6c.svg")}
.ic-sport--cup.is-colour{background-image:url("/static/player/iconpack/sport/colour/cup.1da8bbcfb861.svg")}
.ic-sport--cycling.is-colour{background-image:url("/static/player/iconpack/sport/colour/cycling.c43cd82d7e2f.svg")}
.ic-sport--darts.is-colour{background-image:url("/static/player/iconpack/sport/colour/darts.cded53214caf.svg")}
.ic-sport--e-sports.is-colour{background-image:url("/static/player/iconpack/sport/colour/e-sports.56ca489c597e.svg")}
.ic-sport--floorball.is-colour{background-image:url("/static/player/iconpack/sport/colour/floorball.a5df677b7a44.svg")}
.ic-sport--floorball-2.is-colour{background-image:url("/static/player/iconpack/sport/colour/floorball-2.8c9cb5462f67.svg")}
.ic-sport--formula-e.is-colour{background-image:url("/static/player/iconpack/sport/colour/formula-e.82c3adff2c07.svg")}
.ic-sport--gaelic-football.is-colour{background-image:url("/static/player/iconpack/sport/colour/gaelic-football.5bc55111a609.svg")}
.ic-sport--gaelic-hurling.is-colour{background-image:url("/static/player/iconpack/sport/colour/gaelic-hurling.365b0e504c29.svg")}
.ic-sport--golf.is-colour{background-image:url("/static/player/iconpack/sport/colour/golf.77897dc0d13c.svg")}
.ic-sport--handball.is-colour{background-image:url("/static/player/iconpack/sport/colour/handball.4385a0a8d644.svg")}
.ic-sport--helmet.is-colour{background-image:url("/static/player/iconpack/sport/colour/helmet.f9e25dbf352a.svg")}
.ic-sport--helmet-2.is-colour{background-image:url("/static/player/iconpack/sport/colour/helmet-2.0d4ae3ce007c.svg")}
.ic-sport--hockey.is-colour{background-image:url("/static/player/iconpack/sport/colour/hockey.b7776126531e.svg")}
.ic-sport--horse-racing.is-colour{background-image:url("/static/player/iconpack/sport/colour/horse-racing.7a259de66e7f.svg")}
.ic-sport--hound.is-colour{background-image:url("/static/player/iconpack/sport/colour/hound.bc66b65c89b9.svg")}
.ic-sport--mma-1.is-colour{background-image:url("/static/player/iconpack/sport/colour/mma-1.69f6bd879e4a.svg")}
.ic-sport--mma-2.is-colour{background-image:url("/static/player/iconpack/sport/colour/mma-2.e276a0ea2424.svg")}
.ic-sport--moto.is-colour{background-image:url("/static/player/iconpack/sport/colour/moto.439c709c2f92.svg")}
.ic-sport--nordi-combined.is-colour{background-image:url("/static/player/iconpack/sport/colour/nordi-combined.fbd877bb3ee2.svg")}
.ic-sport--rugby.is-colour{background-image:url("/static/player/iconpack/sport/colour/rugby.2421e2b499dd.svg")}
.ic-sport--sailing.is-colour{background-image:url("/static/player/iconpack/sport/colour/sailing.6d36ca0a076d.svg")}
.ic-sport--simulated-reality.is-colour{background-image:url("/static/player/iconpack/sport/colour/simulated-reality.f5d2753a75bf.svg")}
.ic-sport--ski.is-colour{background-image:url("/static/player/iconpack/sport/colour/ski.9e8efd1721b0.svg")}
.ic-sport--snooker.is-colour{background-image:url("/static/player/iconpack/sport/colour/snooker.15c169c04359.svg")}
.ic-sport--soccer.is-colour{background-image:url("/static/player/iconpack/sport/colour/soccer.fc4eb1655104.svg")}
.ic-sport--special.is-colour{background-image:url("/static/player/iconpack/sport/colour/special.fe7870e3c4f7.svg")}
.ic-sport--squash.is-colour{background-image:url("/static/player/iconpack/sport/colour/squash.eadf49212451.svg")}
.ic-sport--star.is-colour{background-image:url("/static/player/iconpack/sport/colour/star.ad56e68994bc.svg")}
.ic-sport--swimming.is-colour{background-image:url("/static/player/iconpack/sport/colour/swimming.a114b314a129.svg")}
.ic-sport--table-tennis.is-colour{background-image:url("/static/player/iconpack/sport/colour/table-tennis.77cf75d8bec9.svg")}
.ic-sport--tennis.is-colour{background-image:url("/static/player/iconpack/sport/colour/tennis.5bbe84098b75.svg")}
.ic-sport--timer.is-colour{background-image:url("/static/player/iconpack/sport/colour/timer.26662b926388.svg")}
.ic-sport--volley.is-colour{background-image:url("/static/player/iconpack/sport/colour/volley.b50b1c14b33b.svg")}
.ic-sport--waterpolo.is-colour{background-image:url("/static/player/iconpack/sport/colour/waterpolo.196ece8cc23d.svg")}
.ic-sport--weather.is-colour{background-image:url("/static/player/iconpack/sport/colour/weather.4093dd6c356f.svg")}
.ic-sport--winter.is-colour{background-image:url("/static/player/iconpack/sport/colour/winter.453efc0166a7.svg")}
.ic-sport--wrestling.is-colour{background-image:url("/static/player/iconpack/sport/colour/wrestling.585ab6911e5c.svg")}
/* ---- CAMPI (il terreno di gioco per sport, grandi) ---- */
.ic-campo--baseball-field{-webkit-mask-image:url("/static/player/iconpack/sport/campi/baseball-field.82ab8336a375.svg");mask-image:url("/static/player/iconpack/sport/campi/baseball-field.82ab8336a375.svg")}
.ic-campo--basketball-court{-webkit-mask-image:url("/static/player/iconpack/sport/campi/basketball-court.9910fc379fdb.svg");mask-image:url("/static/player/iconpack/sport/campi/basketball-court.9910fc379fdb.svg")}
.ic-campo--cricket-field{-webkit-mask-image:url("/static/player/iconpack/sport/campi/cricket-field.fbe0128bd10c.svg");mask-image:url("/static/player/iconpack/sport/campi/cricket-field.fbe0128bd10c.svg")}
.ic-campo--darts-board{-webkit-mask-image:url("/static/player/iconpack/sport/campi/darts-board.f5ddab39b364.svg");mask-image:url("/static/player/iconpack/sport/campi/darts-board.f5ddab39b364.svg")}
.ic-campo--futsal-court{-webkit-mask-image:url("/static/player/iconpack/sport/campi/futsal-court.ab0bf3e7edc2.svg");mask-image:url("/static/player/iconpack/sport/campi/futsal-court.ab0bf3e7edc2.svg")}
.ic-campo--handball-court{-webkit-mask-image:url("/static/player/iconpack/sport/campi/handball-court.196f9a6146af.svg");mask-image:url("/static/player/iconpack/sport/campi/handball-court.196f9a6146af.svg")}
.ic-campo--ice-hockey-rink{-webkit-mask-image:url("/static/player/iconpack/sport/campi/ice-hockey-rink.4644b342076a.svg");mask-image:url("/static/player/iconpack/sport/campi/ice-hockey-rink.4644b342076a.svg")}
.ic-campo--rugby-field{-webkit-mask-image:url("/static/player/iconpack/sport/campi/rugby-field.69a0e7eea769.svg");mask-image:url("/static/player/iconpack/sport/campi/rugby-field.69a0e7eea769.svg")}
.ic-campo--snooker-table{-webkit-mask-image:url("/static/player/iconpack/sport/campi/snooker-table.9eed05539d52.svg");mask-image:url("/static/player/iconpack/sport/campi/snooker-table.9eed05539d52.svg")}
.ic-campo--soccer-filed{-webkit-mask-image:url("/static/player/iconpack/sport/campi/soccer-filed.b66e0c5dc026.svg");mask-image:url("/static/player/iconpack/sport/campi/soccer-filed.b66e0c5dc026.svg")}
.ic-campo--table-tennis{-webkit-mask-image:url("/static/player/iconpack/sport/campi/table-tennis.7457407a0565.svg");mask-image:url("/static/player/iconpack/sport/campi/table-tennis.7457407a0565.svg")}
.ic-campo--tennis-court{-webkit-mask-image:url("/static/player/iconpack/sport/campi/tennis-court.be476d22ebd7.svg");mask-image:url("/static/player/iconpack/sport/campi/tennis-court.be476d22ebd7.svg")}
.ic-campo--volleyball-court{-webkit-mask-image:url("/static/player/iconpack/sport/campi/volleyball-court.0ec28d38a8be.svg");mask-image:url("/static/player/iconpack/sport/campi/volleyball-court.0ec28d38a8be.svg")}
/* ---- UI (print, view, sorting, menu, calendar…) ---- */
.ic-ui--calendar-outline{-webkit-mask-image:url("/static/player/iconpack/ui/calendar-outline.7bf629d40229.svg");mask-image:url("/static/player/iconpack/ui/calendar-outline.7bf629d40229.svg")}
.ic-ui--casino-outline{-webkit-mask-image:url("/static/player/iconpack/ui/casino-outline.c6cd7f5d23d4.svg");mask-image:url("/static/player/iconpack/ui/casino-outline.c6cd7f5d23d4.svg")}
.ic-ui--casinolive-outline{-webkit-mask-image:url("/static/player/iconpack/ui/casinolive-outline.a99fa0f74566.svg");mask-image:url("/static/player/iconpack/ui/casinolive-outline.a99fa0f74566.svg")}
.ic-ui--event-outline{-webkit-mask-image:url("/static/player/iconpack/ui/event-outline.219a263a6c7f.svg");mask-image:url("/static/player/iconpack/ui/event-outline.219a263a6c7f.svg")}
.ic-ui--exchange{-webkit-mask-image:url("/static/player/iconpack/ui/exchange.e2a8dd36298b.svg");mask-image:url("/static/player/iconpack/ui/exchange.e2a8dd36298b.svg")}
.ic-ui--home-outline{-webkit-mask-image:url("/static/player/iconpack/ui/home-outline.425154e69d14.svg");mask-image:url("/static/player/iconpack/ui/home-outline.425154e69d14.svg")}
.ic-ui--horses-outline{-webkit-mask-image:url("/static/player/iconpack/ui/horses-outline.c8938dd100df.svg");mask-image:url("/static/player/iconpack/ui/horses-outline.c8938dd100df.svg")}
.ic-ui--largeview-outline{-webkit-mask-image:url("/static/player/iconpack/ui/largeview-outline.139f174e9a47.svg");mask-image:url("/static/player/iconpack/ui/largeview-outline.139f174e9a47.svg")}
.ic-ui--leftmenu-outline{-webkit-mask-image:url("/static/player/iconpack/ui/leftmenu-outline.0b458962fdf4.svg");mask-image:url("/static/player/iconpack/ui/leftmenu-outline.0b458962fdf4.svg")}
.ic-ui--liveplay-outline{-webkit-mask-image:url("/static/player/iconpack/ui/liveplay-outline.917db93a62e7.svg");mask-image:url("/static/player/iconpack/ui/liveplay-outline.917db93a62e7.svg")}
.ic-ui--overview-outline{-webkit-mask-image:url("/static/player/iconpack/ui/overview-outline.4608600d8961.svg");mask-image:url("/static/player/iconpack/ui/overview-outline.4608600d8961.svg")}
.ic-ui--poker-outline{-webkit-mask-image:url("/static/player/iconpack/ui/poker-outline.1781157d3401.svg");mask-image:url("/static/player/iconpack/ui/poker-outline.1781157d3401.svg")}
.ic-ui--resetview-outline{-webkit-mask-image:url("/static/player/iconpack/ui/resetview-outline.61191e7b3a42.svg");mask-image:url("/static/player/iconpack/ui/resetview-outline.61191e7b3a42.svg")}
.ic-ui--smallview-outline{-webkit-mask-image:url("/static/player/iconpack/ui/smallview-outline.43f48a919051.svg");mask-image:url("/static/player/iconpack/ui/smallview-outline.43f48a919051.svg")}
.ic-ui--sorrtingview-outline{-webkit-mask-image:url("/static/player/iconpack/ui/sorrtingview-outline.517d7f77c008.svg");mask-image:url("/static/player/iconpack/ui/sorrtingview-outline.517d7f77c008.svg")}
.ic-ui--sport-outline{-webkit-mask-image:url("/static/player/iconpack/ui/sport-outline.72930ccb1e0d.svg");mask-image:url("/static/player/iconpack/ui/sport-outline.72930ccb1e0d.svg")}
.ic-ui--virtual-outline{-webkit-mask-image:url("/static/player/iconpack/ui/virtual-outline.61e4733c638a.svg");mask-image:url("/static/player/iconpack/ui/virtual-outline.61e4733c638a.svg")}
/* ---- BANDIERE (PNG a colori) ---- */
/* ---- PROVIDER casinò ---- */
.ic-prov--dark{background-image:url("/static/player/iconpack/provider/providers-dark-.c9a8dcfb4db0.png")}
.ic-prov--dark{background-image:url("/static/player/iconpack/provider/providers-dark.32fd50dbb751.png")}
.ic-prov--light{background-image:url("/static/player/iconpack/provider/providers-light-.dbaf84603361.png")}
.ic-prov--light{background-image:url("/static/player/iconpack/provider/providers-light.ca38db9a318f.png")}

/* ============================================================================
   LA STELLA DEI PREFERITI (`.tb-fav`) — il vestito del disegno, non del font.
   Il disegno è un SVG nel markup (`player/_stella_fav.html`); qui c'è solo chi lo
   riempie e chi zittisce il glifo.

   🔴 PERCHÉ STA IN `iconpack.css` e non altrove — misurato sul servito l'11/08, sui fogli
   che le quattro pagine caricano DAVVERO (home ed eventi-giorno, studio5 e timerbet):
   l'unico foglio comune a tutte e quattro è `casa.css`, e `iconpack.css` è dentro quel
   pacchetto ED è fra gli strutturali (le due liste di `mobile.py`) — cioè arriva sia alle
   pagine vestite sia a quelle senza tema. `layout.css` e `tb.css`, dove la cura era stata
   provata la prima volta, su timerbet **non arrivano affatto**: lì la regola sarebbe stata
   scritta, committata, pubblicata e invisibile.

   ⚠️ `content:none` NON è un di più: dove il font delle icone c'è (timerbet lo carica, e la
   sua `<link>` sta PRIMA di `casa.css`, quindi questa vince a parità di specificità) senza
   di lui si vedrebbero due stelle, il glifo e l'SVG. */
.tb-fav::before{content:none}
.tb-fav svg{display:block;fill:none}
.tb-fav.mdi-star svg{fill:currentColor}

/* player/loader.css */
/* ============================================================================
   LOADER col LOGO della skin in trasparenza (richiesta Dav/Angelo, urgente test).
   Overlay dei caricamenti parziali: mostra il logo della skin corrente in filigrana
   con un pulse discreto. Tema-agnostico: fondo = token della skin. CSS via <link>.
   Il LOGO per-skin arriva dal branding (`logoUrl`) → messo come var --tb-logo dal
   markup/JS di B/M; se manca, fallback al wordmark testuale (`brand`) o allo spinner.
   Design D, 22-07-2026.
   ========================================================================== */

.tb-loader{
  position:absolute;inset:0;z-index:40;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;
  background:var(--tb-loader-bg, var(--navy-0, #052033));   /* il fondo della skin */
  color:var(--tb-loader-ink, var(--mute, #9fbdd2));
}
/* overlay a schermo: quando copre l'app/pagina intera invece della sola colonna.
   z-index alto: al PRIMO caricamento deve coprire TUTTO (header, menu, contenuto) —
   così si vede prima il loader e il sito appare solo a pronto (Dav 23/07). Il markup
   iniziale (`<div class="tb-loader is-fixed">` subito dentro <body>) + la rimozione al
   `load`/pronto li mette B nella shell; qui il velo che copre. */
.tb-loader.is-fixed{position:fixed;z-index:99999}
/* si dissolve quando B/M lo tolgono: aggiungi .is-hiding e rimuovi a transizione finita */
.tb-loader{transition:opacity .25s ease}
.tb-loader.is-hiding{opacity:0;pointer-events:none}

/* IL LOGO in trasparenza. B/M passano l'immagine con:
     style="--tb-logo:url("/static/player/<logoUrl della skin>")"
   Se --tb-logo non è impostata, resta il fallback (wordmark) qui sotto. */
.tb-loader__logo{
  width:min(46%, 180px);aspect-ratio:2/1;max-height:96px;
  background:var(--tb-logo) center/contain no-repeat;
  opacity:.14;                         /* filigrana */
  animation:tb-logo-pulse 1.8s ease-in-out infinite;
}
@keyframes tb-logo-pulse{
  0%,100%{opacity:.10;transform:scale(.985)}
  50%    {opacity:.22;transform:scale(1)}
}

/* fallback WORDMARK quando la skin non ha logoUrl: mettere .no-logo sul .tb-loader
   e il testo del brand dentro .tb-loader__word (lo riempie B col `brand`). */
.tb-loader.no-logo .tb-loader__logo{display:none}
.tb-loader__word{
  display:none;font:800 26px/1 system-ui;letter-spacing:.03em;
  color:var(--tb-loader-ink, #9fbdd2);opacity:.16;
  animation:tb-logo-pulse 1.8s ease-in-out infinite;
}
.tb-loader.no-logo .tb-loader__word{display:block}

/* piccolo indicatore di attività sotto il logo (arco che gira, accento della skin) */
.tb-loader__spin{
  width:26px;height:26px;border-radius:50%;
  border:2.5px solid var(--tb-loader-line, rgba(255,255,255,.12));
  border-top-color:var(--tb-loader-accent, var(--or, #F5B301));
  animation:tb-spin .8s linear infinite;
}
@keyframes tb-spin{to{transform:rotate(360deg)}}

.tb-loader__msg{font-size:12px;opacity:.7}

@media (prefers-reduced-motion:reduce){
  .tb-loader__logo,.tb-loader__word,.tb-loader__spin{animation:none}
  .tb-loader__logo{opacity:.16}
}

/* player/prematch.css */
/* ============================================================================
   PREMATCH — restyle «look di Dav» (v0.0.1) sulla nostra lista
   Scelta operatore (22/07): l'ASPETTO di Dav (heading sport/lega, celle quota pulite,
   riga squadre+bandiere+«+N») SOPRA la nostra lista già viva raggruppata per lega —
   NIENTE checkbox-leghe (domanda ancora aperta a Dav) né menu «Today +» (spec a parte).

   Rif. `A32_prematch_2` + `dav-prematch/prematch/css/styles.css` (`.qt-box`/`.qt-btn`).
   Tutto scoped a `.lc--pm` (solo momento=prematch): la LIVE non si tocca. CSS in file,
   servito dal middleware dopo lo style del tema (regola Dav). Design D, 22-07-2026.
   ========================================================================== */

/* ── heading di lega: più netto, come le testate del design di Dav ─────────── */
/* NB: overflow VISIBILE (era hidden): l'hidden ritagliava i tooltip delle
   intestazioni mercato che sporgono dalla card (segnalazione Angelo). Gli angoli
   si arrotondano dall'header in cima; le righe sotto sono trasparenti e non
   sbordano dai bordi tondi. */
.lc.lc--pm .lc-group{margin-bottom:10px;border:1px solid rgba(28,66,103,.10);
  border-radius:10px;overflow:visible;background:#fff;box-shadow:0 1px 3px rgba(18,40,66,.06)}
.lc.lc--pm .lc-group-h{background:linear-gradient(180deg,#f4f8fc,#eaf1f8);
  border-bottom:1px solid rgba(28,66,103,.12);border-radius:10px 10px 0 0}
.lc.lc--pm .lc-group-name{font-weight:800;color:#12314f;letter-spacing:.01em}
.lc.lc--pm .lc-group-name .item-img{filter:saturate(1.05)}
/* le etichette colonna (1 · X · 2 / Over · Under) in maiuscoletto tenue come nel design */
.lc.lc--pm .lc-cols span{font-size:.72em;letter-spacing:.03em;color:#5b7793;font-weight:700}
/* i tooltip delle intestazioni mercato di BORDO non escano dallo schermo:
   la prima colonna àncora la bolla a sinistra, l'ultima a destra (freccia al centro).
   Riusa le regole align di tooltip.css senza dover mettere l'attributo nel markup. */
.lc.lc--pm .lc-cols [data-tb-tip]:first-of-type::after{left:0;right:auto;transform:translate(0,4px)}
.lc.lc--pm .lc-cols [data-tb-tip]:last-of-type::after{left:auto;right:0;transform:translate(0,4px)}
.lc.lc--pm .lc-cols [data-tb-tip]:first-of-type:hover::after,
.lc.lc--pm .lc-cols [data-tb-tip]:first-of-type:focus-visible::after,
.lc.lc--pm .lc-cols [data-tb-tip]:last-of-type:hover::after,
.lc.lc--pm .lc-cols [data-tb-tip]:last-of-type:focus-visible::after{transform:translate(0,0)}

/* ── celle quota: valori di Dav (min-width ~80, angoli 6, bold navy su azzurro) ── */
.lc.lc--pm .lc-q{min-height:38px;border-radius:6px;background:#eef3f9;
  color:#12314f;font-weight:800;font-size:13px;
  box-shadow:inset 0 0 0 1px rgba(28,66,103,.06)}
.lc.lc--pm .lc-q:hover{background:#e0e9f4}
/* la selezione: SFONDO ORO pieno (Dav 23/07: la cella selezionata è evidenziata) */
.lc.lc--pm .lc-q.qt-btn--active{background:var(--tb-quota-sel);color:var(--tb-quota-sel-ink);
  box-shadow:inset 0 0 0 1px var(--tb-quota-sel-line)}
.lc.lc--pm .lc-odds{gap:7px;padding:9px 6px}

/* ── riga evento: un filo più d'aria, come nel riferimento ─────────────────── */
.lc.lc--pm .lc-ev{padding-top:2px;padding-bottom:2px}
.lc.lc--pm .lc-team-name{font-weight:700;color:#17324d}
.lc.lc--pm .lc-extra{color:#5b7793}

/* ── «+N» altri mercati: pill col chevron, come il «+220» di Dav ──────────── */
.lc.lc--pm .lc-plus{display:inline-flex;align-items:center;gap:3px;
  padding:3px 9px;border-radius:999px;background:#eef3f9;color:#1a5da6;
  font-weight:800;font-size:.82em;text-decoration:none;
  box-shadow:inset 0 0 0 1px rgba(28,66,103,.08)}
.lc.lc--pm .lc-plus:hover{background:#e0e9f4;color:#12456f}

/* ── la barra di ricerca evento sopra la lista, coerente col fondo chiaro ──── */
.lc--pm ~ * .tb-evsearch--in,
.tb-evsearch--in{border-radius:8px}

@media (max-width:680px){
  .lc.lc--pm .lc-group{border-radius:8px}
  .lc.lc--pm .lc-q{min-height:34px}
}

/* ════════════════════════════════════════════════════════════════════════════
   PREMATCH — menu «Oggi +» (spec Dav 21/07 15:36): filtro FINESTRA TEMPORALE in
   alto a DESTRA della lista prematch. Design D, 22/07.
   COSA FA D (qui): il controllo + la tendina delle opzioni, nel look chiaro del
   prematch (bianco/navy, oro sull'attivo come le celle quota).
   COSA FA B (wiring): apre/chiude la tendina (classe `.is-open` sul `.pm-today`),
   al click di un'opzione aggiorna l'etichetta e FILTRA gli eventi per orario di
   inizio (`starts_at`) nella finestra scelta (`data-tb-win`: all/today/1h/3h/6h/
   tomorrow, o una data da `data-tb-win-date`). Nessun handler nel CSS: solo classi.
   Markup pronto in `design_reference/prematch_today/markup.html`.
   ──────────────────────────────────────────────────────────────────────────── */

/* la toolbar (barra ricerca) diventa una riga: ricerca a sinistra, «Oggi +» a destra */
.tb-evsearch:has(.pm-today){display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tb-evsearch:has(.pm-today) .tb-evsearch--in{flex:1 1 180px;min-width:0}
.tb-evsearch:has(.pm-today) .tb-evsearch--none{flex:1 0 100%}

.pm-today{position:relative;display:inline-flex;flex:0 0 auto}
.pm-today-btn{display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 10px;
  border-radius:8px;border:1px solid rgba(28,66,103,.14);background:#fff;color:#12314f;
  font-weight:800;font-size:13px;cursor:pointer;box-shadow:0 1px 2px rgba(18,40,66,.06);
  transition:background .12s,border-color .12s}
.pm-today-btn:hover{background:#f4f8fc;border-color:rgba(28,66,103,.24)}
.pm-today-cal{font-size:14px;line-height:1}
.pm-today-lbl{white-space:nowrap}
/* il «+»: tondo azzurro; a menu aperto ruota in «×» */
.pm-today-plus{display:inline-flex;align-items:center;justify-content:center;
  width:18px;height:18px;border-radius:50%;background:#eef3f9;color:#1a5da6;
  font-weight:900;font-size:13px;line-height:1;transition:transform .18s}
.pm-today.is-open .pm-today-plus{transform:rotate(45deg)}

/* la tendina */
.pm-today-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:50;min-width:214px;
  background:#fff;border:1px solid rgba(28,66,103,.14);border-radius:10px;
  box-shadow:0 14px 34px rgba(18,40,66,.20);padding:6px}
.pm-today-menu[hidden]{display:none}
.pm-today-grp{font-size:11px;font-weight:800;color:#5b7793;text-transform:uppercase;
  letter-spacing:.04em;padding:6px 8px 4px}
.pm-today-opt{display:flex;align-items:center;width:100%;gap:8px;padding:8px;border:0;
  background:none;border-radius:7px;color:#17324d;font-weight:700;font-size:13px;
  text-align:left;cursor:pointer}
.pm-today-opt:hover{background:#f4f8fc}
/* check a destra sempre presente (trasparente) → l'allineamento non salta */
.pm-today-opt::after{content:"✓";margin-left:auto;font-weight:900;color:#f5a623;opacity:0}
.pm-today-opt.is-sel{background:#fff7e9;color:#b3651e;box-shadow:inset 0 0 0 1px #f5a623}
.pm-today-opt.is-sel::after{opacity:1}
.pm-today-sep{height:1px;background:rgba(28,66,103,.10);margin:5px 4px}
.pm-today-date{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:6px 8px;font-weight:700;color:#17324d;font-size:13px}
.pm-today-date input[type=date]{border:1px solid rgba(28,66,103,.18);border-radius:7px;
  padding:5px 7px;color:#12314f;background:#fff;font:inherit;cursor:pointer}

@media (max-width:680px){
  .pm-today-menu{right:auto;left:0;min-width:200px}
}

/* ════════════════════════════════════════════════════════════════════════════
   PREMATCH — HEADER DI SEZIONE SPORT sopra i gruppi-lega (Dav `.box-match--heading`).
   Step «resto pagina» n.2, design D 22/07 (ordine Angelo). Sport + chevron a sinistra,
   conteggio, e a destra le azioni del design di Dav (stampa quote, seleziona-tutte,
   espandi tutto). Look coerente con la banda sport della directory leghe (navy).
   Scoped `.pm-sporthead`; classi di Dav riusate 1:1. Markup:
   `design_reference/prematch_sporthead/markup.html`. WIRING B: chevron→cambia sport,
   `.btn-icon--print-odds`→stampa, `.btn-icon--select-all`→seleziona, `.btn-icon--go-over`
   →espandi/collassa i gruppi. Nel CSS solo classi.
   ──────────────────────────────────────────────────────────────────────────── */
.pm-sporthead{display:flex;align-items:center;gap:10px;padding:.5rem .75rem;margin:12px 0 8px;
  background:linear-gradient(180deg,#12314f,#0f2a45);color:#fff;border-radius:10px;
  box-shadow:0 1px 3px rgba(18,40,66,.10)}
.pm-sporthead .box-match--left{display:flex;align-items:center;min-width:0}
.pm-sporthead .menu-list--sport{display:inline-flex;align-items:center;gap:8px;border:0;
  background:none;color:#fff;font-weight:800;font-size:14px;cursor:pointer;padding:0;line-height:1}
.pm-sporthead .menu-list--sport .ic{width:18px;height:18px;color:#cfe3ff;flex:0 0 auto}
.pm-sporthead .menu-list--sport .chev{font-size:11px;opacity:.85}
.pm-sporthead .pml-sport-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pm-sporthead .cnt{font-size:12px;font-weight:800;color:#0f2a45;background:#f5b301;
  border-radius:999px;padding:1px 9px;line-height:1.5;flex:0 0 auto}
.pm-sporthead .box-match--center{flex:1 1 auto}
.pm-sporthead .box-match--right{display:flex;align-items:center;gap:.4rem;margin-left:auto}
.pm-sporthead .icon-box{width:28px;height:28px;border-radius:7px;border:1px solid rgba(255,255,255,.16);
  background:rgba(255,255,255,.06);color:#dfeaf6;cursor:pointer;display:flex;align-items:center;
  justify-content:center;font-size:15px;text-decoration:none;transition:background .12s,border-color .12s}
.pm-sporthead .icon-box:hover{background:rgba(255,255,255,.14);color:#fff;border-color:rgba(255,255,255,.3)}
@media (max-width:560px){
  .pm-sporthead{gap:7px;padding:.45rem .6rem}
  .pm-sporthead .icon-box{width:26px;height:26px}
}

/* ════════════════════════════════════════════════════════════════════════════
   PREMATCH — GRID TABELLARE per-lega (design Dav, rif Angelo_prematch_riferimento).
   Integrazione 23/07 (ordine Angelo/GC): la pagina VERA /player/?momento=prematch
   mostra la tabella per lega coi dati veri. Look chiaro navy/oro. Scoped `.pmg`.
   ──────────────────────────────────────────────────────────────────────────── */
.pmg{background:#fff;color:#12314f;font-size:13px}
.pmg-league{border:1px solid rgba(28,66,103,.12);border-radius:10px;margin:0 0 14px;
  overflow:hidden;box-shadow:0 1px 3px rgba(18,40,66,.06)}
/* banda sport (⚽ Calcio) — navy come il riferimento */
.pmg-sport{display:flex;align-items:center;gap:8px;padding:.5rem .75rem;
  background:linear-gradient(180deg,#12314f,#0f2a45);color:#fff;font-weight:800;font-size:13px}
.pmg-sport-ic{font-size:15px;line-height:1}
/* testata lega: bandiera + nome + scheda «Principale» */
.pmg-lg{display:flex;align-items:center;gap:10px;padding:.5rem .75rem;
  background:linear-gradient(180deg,#f4f8fc,#eaf1f8);border-bottom:1px solid rgba(28,66,103,.12)}
.pmg-lg-name{display:flex;align-items:center;gap:8px;font-size:13.5px}
.pmg-lg-name b{color:#12314f;font-weight:800}
.pmg-lg-flag{font-size:11px;font-weight:800;color:#5b7793;background:#e6eef7;
  border-radius:4px;padding:1px 6px;letter-spacing:.02em}
.pmg-tabs{display:flex;gap:6px;margin-left:auto}
.pmg-tab{font-weight:800;font-size:12.5px;color:#5b7793;padding:4px 12px;border-radius:999px}
.pmg-tab.is-on{color:#0f2a45;background:#fff;box-shadow:inset 0 0 0 1px rgba(28,66,103,.16)}
/* etichetta giorno */
.pmg-day{padding:7px 12px;font-weight:800;font-size:12.5px;color:#12314f;
  background:#eef3f9;border-bottom:1px solid rgba(28,66,103,.08)}
/* la tabella scrolla in orizzontale su schermi stretti senza sfondare la pagina */
.pmg-scroll{overflow-x:auto}
.pmg-tab-t{width:100%;border-collapse:collapse;min-width:820px}
.pmg-tab-t thead th{font-weight:700;color:#5b7793;font-size:11px;text-align:center;
  padding:5px 3px;border-bottom:1px solid rgba(28,66,103,.10);white-space:nowrap}
.pmg-tab-t .pmg-grp th{font-size:11.5px;color:#12456f;font-weight:800;
  border-left:1px solid rgba(28,66,103,.08);background:#f7fafd}
.pmg-tab-t .pmg-sub th{background:#fbfdff}
.pmg-c-id{width:52px;text-align:left !important;padding-left:10px !important}
.pmg-c-time{width:48px}
.pmg-c-name{min-width:180px;text-align:left !important}
.pmg-c-chart{width:30px}
.pmg-c-oth{width:34px}
.pmg-row{border-bottom:1px solid #eef2f7}
.pmg-row:hover{background:#fbfcfe}
.pmg-row>td{padding:5px 3px;text-align:center;font-size:12.5px;vertical-align:middle}
.pmg-c-id{color:#5b7793;font-variant-numeric:tabular-nums}
.pmg-c-time{color:#5b7793;font-variant-numeric:tabular-nums}
.pmg-c-name a{color:#17324d;font-weight:700;text-decoration:none}
.pmg-c-name a:hover{color:#1a5da6}
.pmg-chart,.pmg-more{color:#1a5da6;text-decoration:none;font-weight:800}
/* celle-quota: il form non deve occupare spazio; il bottone riempie la cella */
.pmg-q{padding:3px 4px !important}
.pmg-q form{margin:0;display:block}
.pmg-q .qt-btn{display:flex;align-items:center;justify-content:center;width:100%;min-height:30px;
  border:0;border-radius:6px;background:#eef3f9;color:#12314f;font-weight:800;font-size:12.5px;
  cursor:pointer;font-variant-numeric:tabular-nums;box-shadow:inset 0 0 0 1px rgba(28,66,103,.06)}
.pmg-q .qt-btn:hover{background:#e0e9f4}
.pmg-q .qt-btn.qt-btn--active{background:var(--tb-quota-sel);color:var(--tb-quota-sel-ink);
  box-shadow:inset 0 0 0 1px var(--tb-quota-sel-line)}
/* posto vuoto onesto / quota bloccata / linea HND: niente bottone, solo il segno */
.pmg-q.is-void,.pmg-q.is-locked,.pmg-q.pm-hnd{color:#9fb0c2;font-weight:700}
.pmg-q.pm-hnd{color:#5b7793;font-weight:800}
@media (max-width:680px){
  .pmg-tabs{display:none}
  .pmg-q .qt-btn{min-height:28px;font-size:12px}
}

/* avviso «categoria in arrivo» delle tab-mercato non ancora popolate (grid WIDE .lcw) */
.lcw-soon{font-size:12px;font-weight:700;color:#b3651e;background:#fff7e9;
  border:1px solid #f5a623;border-radius:6px;padding:3px 10px;align-self:center;margin-left:4px}

/* ════════════════════════════════════════════════════════════════════════════
   PREMATCH GRID — RIFINITURA colonne fisse (D 23/07, assegnata da B in COORDINATION).
   Rende i GRUPPI-mercato più leggibili come nel riferimento: un filo verticale a
   separare 1X2 · Doppia chance · Over/Under · O/U 2.5 · GG/NG, e una zebra tenue
   sulle righe. Ordine celle: 1=ID 2=Orario 3=Evento 4=chart, poi i gruppi.
   ──────────────────────────────────────────────────────────────────────────── */
.pmg-tab-t tbody td:nth-child(5),   /* 1  → inizio 1X2 */
.pmg-tab-t tbody td:nth-child(8),   /* 1X → inizio Doppia chance */
.pmg-tab-t tbody td:nth-child(11),  /* Over → inizio Over/Under */
.pmg-tab-t tbody td:nth-child(14),  /* Over → inizio Over/Under 2.5 */
.pmg-tab-t tbody td:nth-child(17){  /* GG → inizio GG/NG */
  box-shadow:inset 1px 0 0 rgba(28,66,103,.10);
}
.pmg-row:nth-child(even){background:#f7fafd}
.pmg-tab-t .pmg-grp th{border-left:1px solid rgba(28,66,103,.12)}

/* ════════════════════════════════════════════════════════════════════════════
   QUOTA SELEZIONATA — un SOLO colore, OVUNQUE (Dav 23/07, ritinta 27/07).
   Quando una quota è nel coupon la cella ha lo sfondo pieno dello stato
   «selezionato»: prematch/live LISTA (.lc-q.qt-btn--active), GRIGLIA
   (.pmg-q .qt-btn--active, già sopra) e DETTAGLIO evento (.chip.on).
   `!important` per battere il contorno VERDE inline della lista base (palinsesto)
   e il `.chip.on` bianco del tema importato (tb.css non veste skin 11).
   ⚠️ 27/07, Dav: «le quote selezionate mettile con il blu, non mischiamo colori».
   Il colore NON si scrive qui: è `--tb-quota-sel`, dichiarata una volta sola in
   `skin_fixes.css`, dove c'è anche il perché e come una skin la ridipinge.
   TOGGLE della classe = B: il server la mette già da `chosen`; per il feedback
   IMMEDIATO al click, B aggiunge/toglie `qt-btn--active`/`on` via JS all'inserimento
   nel coupon (e la toglie alla rimozione). Nel CSS solo lo stato.
   ──────────────────────────────────────────────────────────────────────────── */
.lc .lc-q.qt-btn--active,
.chip.on{
  background:var(--tb-quota-sel) !important;
  color:var(--tb-quota-sel-ink) !important;
  border-color:var(--tb-quota-sel-line) !important;
  outline:none !important;
  box-shadow:inset 0 0 0 1px var(--tb-quota-sel-line) !important;
  font-weight:800 !important;
}
.chip.on .lbl,.chip.on .px{color:var(--tb-quota-sel-ink) !important}

/* player/prematch_wide.css */
/* ════════════════════════════════════════════════════════════════════════════
   PREMATCH — TABELLA LARGA MULTI-MERCATO per lega (come Angelo_prematch_riferimento).
   Design D 23/07. Guscio VISIVO self-contained `.lcw` (non tocca la lista `.lc--pm`
   attuale finché B non commuta). Colonne fisse del riferimento:
     ID · ORARIO · EVENTO · 1X2(1/X/2) · DC(1X/12/X2) · Over-Under(O/U/HND) ·
     Over-Under 2.5(O/U/HND) · GG-NG(GG/NG) · Oth(+)
   Intestazioni-gruppo allineate ESATTAMENTE sopra le celle (stessa griglia).

   ⚠️ RICHIEDE DATI DA B (vista): per allineare le colonne servono COLONNE-BANDA
   ordinate per market_ref, uguali per tutti gli eventi della lega, con le celle
   di ogni evento allineate (mancante = `is-locked`). Vedi la spec in
   `design_reference/prematch_wide/markup.html`. Foglio da mettere in FOGLI.
   ──────────────────────────────────────────────────────────────────────────── */
.lcw{--lcw-line:rgba(28,66,103,.10);--lcw-ink:#12314f;--lcw-dim:#5b7793;
  --lcw-cell:#eef3f9;--lcw-accent:#f5a623;
  /* 4 colonne fisse (icona/id/ora/evento) + i blocchi mercato + Oth */
  --lcw-grid:24px 42px 56px minmax(150px,1.3fr)
             repeat(3,minmax(44px,1fr)) repeat(3,minmax(44px,1fr))
             repeat(3,minmax(44px,1fr)) repeat(3,minmax(44px,1fr))
             repeat(2,minmax(44px,1fr)) 38px;
  color:var(--lcw-ink);font-size:12.5px}

/* la banda-lega è una card; su schermo stretto scorre in orizzontale */
.lcw-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.lcw-group{min-width:940px;background:#fff;border:1px solid var(--lcw-line);
  border-radius:10px;margin-bottom:12px;box-shadow:0 1px 3px rgba(18,40,66,.06)}

/* header lega: bandiera + nome + «+ Principale» */
.lcw-lh{display:flex;align-items:center;gap:8px;padding:.5rem .7rem;
  background:#dfe9f4;border-radius:10px 10px 0 0;font-weight:800}
.lcw-lh .fl{width:18px;height:13px;border-radius:2px;background:#26456b;flex:0 0 auto}
.lcw-lh .lcw-add{margin-left:auto;display:inline-flex;align-items:center;gap:6px;
  font-size:12px;font-weight:700;color:#1a5da6;background:#fff;border:1px solid var(--lcw-line);
  border-radius:999px;padding:2px 10px;cursor:pointer}
.lcw-lh .lcw-x{color:#c0392b;cursor:pointer;font-weight:800}

/* sotto-tab mercati (Principali/Primo tempo) + pill (Principale/Over-Under/…) */
.lcw-subtabs{display:flex;gap:14px;padding:8px 10px 0}
.lcw-subtab{border:0;background:none;font-weight:800;font-size:13px;color:var(--lcw-dim);
  padding:0 0 8px;border-bottom:2px solid transparent;cursor:pointer}
.lcw-subtab.is-on{color:var(--lcw-ink);border-bottom-color:#1a5da6}
.lcw-tabs{display:flex;gap:8px;flex-wrap:wrap;padding:8px 10px}
.lcw-tab{border:1px solid var(--lcw-line);background:#f4f8fc;border-radius:999px;
  padding:6px 14px;font-weight:700;font-size:12.5px;color:#26557f;cursor:pointer;white-space:nowrap}
.lcw-tab.is-on{background:#12314f;color:#fff;border-color:#12314f}

/* intestazione «Principale» */
.lcw-sech{padding:8px 10px 2px;font-weight:800;color:var(--lcw-ink)}

/* ── righe (griglia condivisa header↔celle) ──────────────────────────────── */
.lcw-thead,.lcw-day,.lcw-row{display:grid;grid-template-columns:var(--lcw-grid);align-items:center}
/* riga1 intestazioni-GRUPPO (nomi mercato, span sulle loro colonne) */
.lcw-gh{display:grid;grid-template-columns:var(--lcw-grid);background:#f4f8fc;
  border-top:1px solid var(--lcw-line);font-size:11px;font-weight:800;color:var(--lcw-dim);text-transform:uppercase}
.lcw-gh>span{padding:5px 0;text-align:center;border-left:1px solid var(--lcw-line)}
.lcw-gh .g-id{grid-column:1/5;border-left:0}         /* copre icona+id+ora+evento */
.lcw-gh .g-1x2{grid-column:5/8}
.lcw-gh .g-dc{grid-column:8/11}
.lcw-gh .g-ou{grid-column:11/14}
.lcw-gh .g-ou2{grid-column:14/17}
.lcw-gh .g-gg{grid-column:17/19}
.lcw-gh .g-oth{grid-column:19/20}
/* riga2 sotto-etichette colonna */
.lcw-thead{background:#eef3f9;font-size:10.5px;font-weight:800;color:var(--lcw-dim);
  border-top:1px solid var(--lcw-line)}
.lcw-thead>span{padding:5px 2px;text-align:center}
.lcw-thead .t-ev{text-align:left;padding-left:8px}

/* separatore GIORNO */
.lcw-day{background:#e7eef6;font-weight:800;color:#28527d;font-size:12px}
.lcw-day>span{grid-column:1/-1;padding:6px 10px}

/* riga EVENTO */
.lcw-row{border-top:1px solid var(--lcw-line);min-height:40px}
.lcw-row:hover{background:#f7fafd}
.lcw-row .c-ico{display:flex;justify-content:center;color:#8aa3bd;cursor:pointer}
.lcw-row .c-id{color:var(--lcw-dim);font-weight:700;text-align:center;font-variant-numeric:tabular-nums}
.lcw-row .c-time{color:var(--lcw-ink);text-align:center;font-variant-numeric:tabular-nums}
.lcw-row .c-ev{padding:4px 8px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lcw-row .c-ev a{color:inherit;text-decoration:none}
.lcw-row .c-ev:hover a{color:#1a5da6}

/* cella quota */
.lcw-q{margin:3px 2px;min-height:30px;display:flex;align-items:center;justify-content:center;
  background:var(--lcw-cell);border:1px solid rgba(28,66,103,.06);border-radius:6px;
  font-weight:800;color:var(--lcw-ink);font-variant-numeric:tabular-nums;cursor:pointer;
  transition:border-color .12s,background .12s,color .12s}
.lcw-q:hover{border-color:var(--tb-quota-sel);background:#e3ecf6}
/* selezionata nel coupon = SFONDO PIENO, come lista/dettaglio (Dav 23/07; dal 27/07 il
   colore è quello unico dello stato «selezionato», `--tb-quota-sel` in skin_fixes.css) */
.lcw-q.on{background:var(--tb-quota-sel);border-color:var(--tb-quota-sel-line);
  color:var(--tb-quota-sel-ink);box-shadow:inset 0 0 0 1px var(--tb-quota-sel-line)}
.lcw-q.is-locked{color:#b6c2d1;cursor:not-allowed;background:#f1f4f8}
.lcw-q.is-hnd{background:transparent;border-color:transparent;color:var(--lcw-dim);font-weight:700;cursor:default}
.lcw-oth{display:flex;justify-content:center}
.lcw-oth a{color:#1a5da6;font-weight:900;text-decoration:none;font-size:15px}

@media (max-width:900px){
  .lcw{font-size:12px}
  .lcw-group{min-width:900px}   /* sotto questa larghezza scorre in orizzontale */
}

/* player/prematch_leagues.css */
/* ════════════════════════════════════════════════════════════════════════════
   PREMATCH — DIRECTORY LEGHE (sport → nazione → leghe con checkbox) come da
   design Dav v0.0.1. Guscio VISIVO, design D 22/07 (ordine Angelo: integrare il
   resto della pagina prematch).

   Riproduce il blocco di Dav (`.qt-box--heading` nazione + `.ev-list` leghe con
   checkbox) nel LOOK CHIARO del prematch (bianco/navy, selezione in oro come le
   celle quota). Classi di Dav RIUSATE (1:1 per B), ma tutto SCOPED sotto
   `.pm-leagues` così non collide con lo style del tema importato.

   ⚠️ SEMANTICA non decisa (domanda ancora aperta a Dav, deferred n.1): questo
   pannello va bene SIA come FILTRO (spunta = mostra quella lega nella lista quote)
   SIA come INDICE (spunta/clic = vai alla lega). Il markup è neutro: B collega
   l'uno o l'altro. Nel CSS nessun handler: solo classi/stati
   (`.is-collapsed` sul blocco nazione, `:checked` sulla checkbox lega).
   Markup: `design_reference/prematch_leagues/markup.html`. Foglio da mettere in FOGLI.
   ──────────────────────────────────────────────────────────────────────────── */

.pm-leagues{background:#fff;border:1px solid rgba(28,66,103,.12);border-radius:10px;
  overflow:hidden;box-shadow:0 1px 3px rgba(18,40,66,.06);color:#12314f;
  font-family:inherit}

/* ── banda SPORT ─────────────────────────────────────────────────────────── */
.pm-leagues .pml-sport{display:flex;align-items:center;gap:9px;padding:.55rem .75rem;
  background:linear-gradient(180deg,#12314f,#0f2a45);color:#fff;font-weight:800;font-size:14px}
.pm-leagues .pml-sport .ic{width:18px;height:18px;color:#cfe3ff;flex:0 0 auto}
.pm-leagues .pml-sport .pml-sport-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pm-leagues .pml-sport .cnt{margin-left:auto;font-size:12px;font-weight:800;color:#0f2a45;
  background:#f5b301;border-radius:999px;padding:1px 9px;line-height:1.5}

/* ── heading NAZIONE (= .qt-box--heading di Dav) ─────────────────────────── */
.pm-leagues .qt-box--heading{display:flex;align-items:center;justify-content:space-between;
  padding:.42rem .75rem;font-size:14px;font-weight:800;color:#12314f;
  background:linear-gradient(180deg,#f4f8fc,#eaf1f8);border-top:1px solid rgba(28,66,103,.10)}
.pm-leagues .qt-heading--left{display:flex;align-items:center;gap:8px;line-height:1}
.pm-leagues .qt-heading--left .fl{width:18px;height:13px;border-radius:2px;background:#26456b;flex:0 0 auto}
.pm-leagues .qt-heading--right{display:flex;align-items:center;gap:.4rem}
.pm-leagues .qt-heading--right button,
.pm-leagues .btn-icon--select-all{width:26px;height:26px;border-radius:7px;
  border:1px solid rgba(28,66,103,.14);background:#fff;color:#3a5a7d;cursor:pointer;
  display:flex;align-items:center;justify-content:center;font-size:15px;line-height:1;padding:0}
.pm-leagues .qt-heading--right button:hover,
.pm-leagues .btn-icon--select-all:hover{background:#f4f8fc;border-color:rgba(28,66,103,.26);color:#12456f}
/* il «−» del toggle diventa «+» quando la nazione è collassata (B mette .is-collapsed) */
.pm-leagues .pml-country.is-collapsed .btn-menu--group .lbl-min{display:none}
.pm-leagues .btn-menu--group .lbl-plus{display:none}
.pm-leagues .pml-country.is-collapsed .btn-menu--group .lbl-plus{display:inline}

/* ── lista LEGHE con checkbox (= .ev-list di Dav) ────────────────────────── */
.pm-leagues .ev-list{list-style:none;margin:0;padding:6px;display:grid;
  grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:2px}
.pm-leagues .ev-list li{margin:0}
.pm-leagues .input-box--container{display:flex;align-items:center;gap:9px;padding:7px 9px;
  border-radius:7px;cursor:pointer}
.pm-leagues .input-box--container:hover{background:#f4f8fc}
.pm-leagues .input-checkbox{width:17px;height:17px;flex:0 0 auto;accent-color:#f5a623;cursor:pointer;margin:0}
.pm-leagues .subgroup-text{flex:1 1 auto;min-width:0;font-weight:700;font-size:13px;color:#17324d;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pm-leagues .subgroup-count{flex:0 0 auto;font-size:12px;font-weight:700;color:#5b7793;
  background:#eef3f9;border-radius:999px;padding:0 8px;line-height:18px}
/* lega selezionata: filo d'oro come le celle quota attive */
.pm-leagues .input-box--container:has(.input-checkbox:checked){background:#fff7e9;
  box-shadow:inset 0 0 0 1px #f5a623}
.pm-leagues .input-box--container:has(.input-checkbox:checked) .subgroup-text{color:#b3651e}

/* nazione collassata: la lista sparisce */
.pm-leagues .pml-country.is-collapsed .ev-list{display:none}

@media (max-width:560px){
  .pm-leagues .ev-list{grid-template-columns:1fr}
}

/* selezione campionati sotto Prematch: bandiera come <img> (niente inline) + il divisore sport */
.pm-leagues .qt-heading--left .pml-flag{width:18px;height:13px;border-radius:2px;flex:0 0 auto;object-fit:cover}
.pm-leagues .pml-country + .pml-sport{margin-top:2px}

/* player/live_frame.css */
/* ============================================================================
   FRAME LIVE dell'evento — come il template (richiesta Dav, priorità).
   Hero con "stadio" (glow campo + fari), competizione centrata, minuto/fase,
   squadre con LOGO ai lati e PUNTEGGIO grande al centro, riga azioni, tabellina
   tempi. Tema scuro nostro (navy + oro), geometria del template.
   ⚠️ Il frame oggi vive di 24 stili INLINE in `intestazione_evento.html`: B li
   toglie (lista nel task) così queste classi prendono il comando. CSS via <link>.
   Design D, 22-07-2026.
   ========================================================================== */

.match-list--single-wrapper{ margin:0 0 10px; }

/* ── HERO: lo "stadio" senza foto pesante — glow del campo + navy + fari ── */
.match-list--event{
  position:relative; overflow:hidden; isolation:isolate;
  padding:12px 16px 14px; border-radius:12px;
  color:#eaf4ff;
  background:
    radial-gradient(120% 80% at 50% 118%, rgba(31,122,63,.42), transparent 60%),
    radial-gradient(90% 60% at 50% -20%, rgba(63,140,255,.16), transparent 60%),
    linear-gradient(180deg,#0e2a45,#0a1c30);
  border:1px solid #163a5c;
}
/* la "linea di centrocampo" appena accennata, sotto il punteggio */
.match-list--event::after{
  content:""; position:absolute; z-index:-1; inset-inline:12%; inset-block-start:52%;
  height:1px; background:linear-gradient(90deg,transparent,rgba(255,255,255,.18),transparent);
}
/* i fari già nel markup (.stadium-lights .light): tenui bagliori in alto */
.stadium-lights{position:absolute;inset-block-start:0;inset-inline:0;height:60%;z-index:-1;
  display:flex;justify-content:space-around;pointer-events:none;opacity:.5}
.stadium-lights .light{width:2px;height:100%;
  background:linear-gradient(180deg,rgba(255,255,255,.5),transparent 70%);
  filter:blur(2px);animation:lf-flash 3.5s ease-in-out infinite}
.stadium-lights .flash2{animation-delay:.5s}.stadium-lights .flash3{animation-delay:1s}
.stadium-lights .flash4{animation-delay:1.5s}.stadium-lights .flash5{animation-delay:2s}
@keyframes lf-flash{0%,100%{opacity:.25}50%{opacity:.7}}

/* riga INFO in cima all'hero: sport/nazione/stat a sx, stadio a dx */
.match-list--info-top{
  display:flex;justify-content:space-between;align-items:center;gap:10px;
  font-size:11.5px;color:#a8c6e0;
}
.match-list--info-top a{color:inherit;text-decoration:none}
.match-list--info-top a:hover{color:#fff}
.match-list--left-bar{display:flex;align-items:center;gap:6px;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.match-list--right-bar{white-space:nowrap;display:flex;align-items:center;gap:6px}

/* competizione (con icona sport) — centrata sopra le squadre */
.match-list--single-top{
  display:flex;align-items:center;justify-content:center;gap:8px;
  margin-top:8px;font-size:12.5px;font-weight:700;color:#cfe0f2;
}
.match-list--single-top .btn-icon--sport img{width:16px;height:16px;opacity:.85}

/* minuto/fase — in oro, centrato, sopra il punteggio */
.tb-ev-clock{
  text-align:center;margin-top:3px;
  font:800 12.5px/1 ui-monospace,"SF Mono",Menlo,monospace;
  color:var(--money,#F5B301);letter-spacing:.03em;
}

/* ── la riga SQUADRE + PUNTEGGIO: griglia 1fr · auto · 1fr, centrata ── */
.match-list--single-bottom{
  display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:14px;
  margin-top:6px;
}
.match-list--single-left,.match-list--single-right{
  display:flex;align-items:center;gap:10px;min-width:0;
}
.match-list--single-left{justify-content:flex-end;text-align:end}
.match-list--single-right{justify-content:flex-start;text-align:start}
.match-list--single-left .match-text,.match-list--single-right .match-text{
  font-weight:800;font-size:15px;color:#fff;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* ── NOME + NAZIONE, in colonna (Jesper 10/08 14:31) ───────────────────────
   La riga delle squadre è un flex orizzontale: senza questo involucro la nazione uscirebbe
   ACCANTO al nome invece che sotto. `min-width:0` è la riga che tiene vivo il troncamento del
   nome lungo — un figlio di flex senza non si stringe, e il nome sborderebbe invece di finire
   coi puntini. La colonna si allinea come il suo lato (destra a sinistra dello score, sinistra
   a destra), così le due nazioni guardano il punteggio come i nomi. */
.match-nome{display:flex;flex-direction:column;min-width:0}
.match-list--single-left .match-nome{align-items:flex-end}
.match-list--single-right .match-nome{align-items:flex-start}
/* ⛔ `max-width:100%` sul nome, e senza questa riga il difetto è VISIBILE: in una colonna flex
   con `align-items`, il figlio è largo quanto il suo contenuto e può uscire dal genitore. Il
   troncamento coi puntini che `.match-text` ha già non scattava — misurato prima della
   correzione: nome 202px dentro un blocco da 167, e a schermo «Kongsvinger IL Toppfotball 2»
   passava SOPRA la bandiera. Il `min-width:0` qui sopra serve al blocco, questa riga al nome:
   sono due cose diverse e servono tutt'e due. */
.match-nome .match-text{max-width:100%}
/* Piccola e smorzata: è un contorno del nome, non un secondo nome. */
.match-nazione{font-size:11px;font-weight:600;line-height:1.25;opacity:.72;
  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* i LOGO/bandiere ai lati del punteggio (grandi come nel template) */
.match-list--single-bottom .icon-sport img{
  width:34px;height:34px;border-radius:50%;object-fit:cover;flex:none;
  background:#0a1c30;border:1px solid #1f4a72;padding:2px;
}
/* PUNTEGGIO grande e bicolore al centro */
.match-list--single-center{display:flex;flex-direction:column;align-items:center;gap:2px}
.match-list--single-center .date-time{
  font-size:34px !important;font-weight:900;line-height:1;letter-spacing:.02em;
  font-variant-numeric:tabular-nums;
}
.match-list--single-center .date-time > span:first-child{color:#4aa3ff}   /* casa */
.match-list--single-center .date-time > span:last-child{color:#4fd47a}    /* ospite */

/* tabellina tempi: compatta, attaccata sotto lo score */
.tb-ev-sets{border-collapse:collapse;margin-top:2px;font-size:11px;color:#a8c6e0}
.tb-ev-sets td{padding:1px 7px;text-align:center;font-variant-numeric:tabular-nums}
.tb-ev-sets td.h{color:#7fa8cc;font-weight:700}

/* ── riga AZIONI sotto l'hero (Formazioni / Statistiche / Classifica) ── */
.ev-actions{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:8px 14px;background:#0c2740;border:1px solid #163a5c;border-top:0;
}
.ev-actions button,.ev-actions a{
  display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  background:transparent;border:0;color:#a8c6e0;font:inherit;font-size:12.5px;font-weight:600;
  padding:5px 8px;border-radius:7px;text-decoration:none;
}
.ev-actions button:hover,.ev-actions a:hover{background:rgba(255,255,255,.06);color:#fff}

/* ── barra TAB MERCATI, pulita — sulle CLASSI REALI del template
   (`.box-match--heading > .box-match--center > .match-list--tabs > .tabs-list > .tab-item`).
   B: basta togliere il <style> inline in evento.html; qui c'è il vestito. ── */
.box-match--heading{
  background:#0a1c30;border:1px solid #163a5c;border-top:0;border-radius:0 0 10px 10px;
  padding:0 8px;
}
.match-list--tabs .tabs-list{
  display:flex;align-items:center;gap:2px;flex-wrap:nowrap;
  overflow-x:auto;scrollbar-width:none;
}
.match-list--tabs .tabs-list::-webkit-scrollbar{display:none}

/* ── 🔴 E SUL TELEFONO LA BARRA DEVE RESTARE ACCESA (Ciro 09/08, punto 12) ─────────────────
   Sotto i 768px il tema importato della skin 11 spegne il contenitore che porta questa barra:

       template_c.css  ·  @media screen and (max-width: 768px)
       .body--single-event .box-match--heading .box-match--center,
       .body--single-event .box-match--heading .box-match--right .box-match--match-style p
           { display: none }

   Misurato sul servito, a 390 con touch: le linguette ARRIVANO tutte e dieci coi conteggi
   giusti, il filtro funziona (129 blocchi, 33 visibili = «Principali»), e la barra misura
   **0×0** perché il genitore è spento. Su studio5, che non carica asset di tema importato,
   la stessa pagina le mostra tutte e dieci.

   ⚠️ E NON È UNA DECISIONE CHE STIAMO DISFANDO — è la domanda che il PM ha chiesto di fare
   prima di toccare, e la risposta è nei file. Quella riga arriva **dal tema originale di
   Davide** (`design_reference/davide/timer-new-skin-master/a/css/template_c.css:4443`),
   entrata con l'importazione e mai scritta da noi. Nel SUO markup era uno **scambio**, non
   una sottrazione: `.box-match--center` teneva le linguette (`Todas (120) · Principales (43)
   · Goal (22)…`, `single-event.html:1723`) e al loro posto sul telefono restava la tendina
   «List of markets» in `.box-match--right`. **Quella metà noi non l'abbiamo mai costruita**:
   `.box-match--right` non esiste in nessun nostro template, e sulla pagina servita
   `.box-match--heading` ha UN SOLO figlio. Misurato: a 390 dentro la testata resta visibile
   `[]` — niente. Lo scambio è diventato una sottrazione, ed è un residuo dell'importazione.

   📌 Rimettiamo in piedi SOLO il contenitore delle linguette. La seconda metà della regola
   del tema (`.box-match--match-style p`) resta spenta e non la nominiamo: quell'elemento non
   esiste da noi, e il giorno che qualcuno costruisse la tendina di Davide la sua intenzione
   deve valere ancora.

   Perché qui e non nel tema: `casa.css` è servito **dopo** i `<link>` del tema (ordine letto
   nella testa del servito), quindi a pari specificità — 0,3,0, la stessa del tema — vince
   l'ultimo. È il meccanismo che D ha scritto per il foglio mobile, non un `!important`: se
   un giorno il tema alza la specificità, questa riga smette di funzionare **in modo visibile**
   invece di restare aggrappata con la forza. E toccare l'asset importato sarebbe peggio: la
   prossima re-importazione del tema se lo riprende. */
@media screen and (max-width:768px){
  .body--single-event .box-match--heading .box-match--center{display:block}
}

/* ── LE FRECCE DELLA BARRA (Jesper, punto 8: nel suo scatto c'è un «‹» a sinistra) ──────────
   Perché servono: la barra scorre già, ma la sua barra di scorrimento è NASCOSTA apposta
   (`scrollbar-width:none` qui sopra). Senza un indizio, le linguette oltre il bordo sono
   invisibili E non si sa che esistono: su un evento con molti gruppi il giocatore vede quattro
   voci e crede che siano tutte.
   🔴 Nascoste di serie, e le accende il gesto SOLO dal lato dove c'è davvero qualcosa da
   scorrere: una freccia sempre accesa che a volte non fa niente è un bottone di scena, ed è il
   difetto che questa casa ha già pagato («un menu che porta a "non c'è niente"»). */
.match-list--tabs{position:relative}
.match-list--tabs .tabs-nav{
  display:none;position:absolute;top:0;bottom:0;width:26px;z-index:2;
  align-items:center;justify-content:center;cursor:pointer;border:0;padding:0;
  color:#a8c6e0;background:linear-gradient(90deg,#0a1c30 60%,rgba(10,28,48,0));
}
.match-list--tabs .tabs-nav.on{display:flex}
.match-list--tabs .tabs-nav:hover{color:#fff}
.match-list--tabs .tabs-nav--prev{left:0}
.match-list--tabs .tabs-nav--next{
  right:0;background:linear-gradient(270deg,#0a1c30 60%,rgba(10,28,48,0));
}
.match-list--tabs .tab-item{
  flex:none;cursor:pointer;position:relative;
  padding:11px 12px;color:#a8c6e0;font-weight:700;font-size:12.5px;white-space:nowrap;
  border-bottom:0;opacity:1;background:transparent;
}
.match-list--tabs .tab-item:hover{color:#fff;background:rgba(255,255,255,.05)}
.match-list--tabs .tab-item.active{color:#fff;font-weight:800}
/* Dav 25/07: QUI c'era un ::after giallo (var(--money)) sotto il tab attivo — si sommava
   alla sottolineatura VERDE del template base. Via il giallo: resta solo il verde. */
/* icone strumenti + ricerca mercato (se presenti nella heading) */
.tb-mkt-ico{
  width:30px;height:30px;display:inline-grid;place-items:center;cursor:pointer;
  color:#a8c6e0;border-radius:7px
}
.tb-mkt-ico:hover{background:rgba(255,255,255,.06);color:#fff}
.box-match--heading .input-box{
  background:#0e2a45;border:1px solid #163a5c;border-radius:7px;color:#eaf4ff;
  font-size:12px;padding:6px 10px;outline:none
}
.box-match--heading .input-box:focus{border-color:var(--money,#F5B301)}

/* riga AZIONI (Formazioni/Statistiche/Classifica) — OPZIONALE: solo se il widget la
   fornisce. B: avvolgila in `.ev-actions` per vestirla, altrimenti si salta. */
.ev-actions{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:8px 14px;background:#0c2740;border:1px solid #163a5c;border-top:0;
}
.ev-actions button,.ev-actions a{
  display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  background:transparent;border:0;color:#a8c6e0;font:inherit;font-size:12.5px;font-weight:600;
  padding:5px 8px;border-radius:7px;text-decoration:none
}
.ev-actions button:hover,.ev-actions a:hover{background:rgba(255,255,255,.06);color:#fff}

@media (max-width:640px){
  .match-list--single-bottom{gap:8px}
  .match-list--single-left .match-text,.match-list--single-right .match-text{font-size:12.5px}
  .match-list--single-bottom .icon-sport img{width:26px;height:26px}
  .match-list--single-center .date-time{font-size:26px !important}
}
@media (prefers-reduced-motion:reduce){.stadium-lights .light{animation:none}}

/* ============================================================================
   DROPDOWN Formazioni / Statistiche / Posizioni — resa coerente col frame scuro
   (BUG Dav: "si vedono male in alcuni punti"). I pannelli `.tb-ev-pan` erano
   BIANCHI (background:#fff) e si aprivano sotto l'hero navy → stonavano; l'empty
   state era slavato. Qui li rendo scuri come il frame. Specificità `.tb-ev-pan[id]`
   così vince anche PRIMA che B tolga lo <style> inline in intestazione_evento.html
   (quello va tolto: regola casa). Design D.
   ========================================================================== */

/* riga azioni: i tre raccolti al centro, cliccabili, con stato aperto */
.match-list--event .match-list--info-bottom{
  display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;
  margin-top:10px;padding-top:8px;border-top:1px solid rgba(255,255,255,.10);
}
.match-list--info-bottom > span{
  display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  padding:6px 12px;border-radius:8px;
  color:#cfe0f2 !important;font-weight:700;font-size:12.5px;
  transition:background .12s,color .12s;
}
.match-list--info-bottom > span:hover{background:rgba(255,255,255,.08);color:#fff !important}
.match-list--info-bottom > span.on{background:rgba(63,140,255,.18);color:#fff !important}
.match-list--info-bottom .mdi-chevron-down{transition:transform .15s}
.match-list--info-bottom > span.on .mdi-chevron-down{transform:rotate(180deg)}

/* IL PANNELLO: da bianco a NAVY come il frame */
.tb-ev-pan[id]{
  background:#0c2740 !important;color:#dbe8f6 !important;
  border:1px solid #163a5c;border-top:0;
  border-radius:0 0 12px 12px;
  padding:14px 16px;margin:0 0 10px;
  box-shadow:0 10px 26px rgba(2,10,24,.5);
}
.tb-ev-pan[id] h4{color:#fff !important;margin:0 0 10px;font-weight:800;font-size:14px}
.tb-ev-pan[id] h4 + *{margin-top:0}

/* stato "in attivazione": leggibile, non slavato */
.tb-ev-pan[id] .tb-ev-vuoto{
  opacity:1 !important;color:#a8c6e0;
  background:rgba(255,255,255,.04);border:1px dashed rgba(255,255,255,.14);
  border-radius:8px;padding:16px;text-align:center;font-size:12.5px;line-height:1.5;
}

/* formazioni: due colonne leggibili su scuro */
.tb-ev-pan[id] .tb-lineup .col b{color:#fff !important}
.tb-ev-pan[id] .tb-lineup .g{color:#dbe8f6;border-bottom:1px solid rgba(255,255,255,.06)}
.tb-ev-pan[id] .tb-lineup .g em{color:#8fb2d4 !important;opacity:1}

/* statistiche: righe leggibili */
.tb-ev-pan[id] .tb-stat-row{color:#dbe8f6}

/* posizioni: la tabella classifica su scuro */
.tb-ev-pan[id] .pg-table th{background:#123a5c !important;color:#cfe0f2 !important;
  border-color:#1d466f !important}
.tb-ev-pan[id] .pg-table td{color:#dbe8f6 !important;border-color:rgba(255,255,255,.08) !important}
.tb-ev-pan[id] .pg-table tr:nth-child(even) td{background:rgba(255,255,255,.03) !important}
.tb-ev-pan[id] .pg-table td b{color:var(--money,#F5B301) !important}

/* ── VIA la barra bianca VUOTA in alto (Dav 22/07) — ma solo se è VUOTA davvero ──
   Nata così: sulla scheda evento il tema rendeva `.top-menu--sports` (il menu sport
   orizzontale delle liste) SENZA NIENTE DENTRO — una striscia chiara inutile sopra il
   breadcrumb. Si toglieva, e faceva bene.

   🔴 Da allora quella striscia non è più vuota: `_event.html` porta `{{ tb.sport_tabs }}`
   e il frammento `sport_tabs.html` ci mette gli sport VERI della skin, coi nostri nomi
   tradotti e le icone del tema. Misurato il 28/07 sulla scheda evento di produzione:
   **26 bottoni**, con i link giusti (`/player/?sport=sr:sport:21` → Cricket), già dentro
   il carosello owl del tema (`owl-loaded owl-drag`) — e tutto questo `display:none`.
   Cioè la giostra degli sport che Dav chiedeva (card 27/07 11:18) **c'era già e la
   stavamo spegnendo noi**.

   Quindi la regola diventa quella che Dav voleva davvero: si nasconde la striscia
   **senza sport dentro**, non la striscia in quanto tale. `:not(:has(.menu-button))` è
   la differenza fra «togli il vuoto» e «togli il menu». */
.main-container:has(.match-list--single-wrapper)
  .top-menu--sports:not(:has(.menu-button)){display:none !important}

/* ════════════════════════════════════════════════════════════════════════════
   EVENTO LIVE — hero + pannelli F/S/P (Dav 23/07). Stili SPOSTATI dall'inline
   `<style>` di intestazione_evento.html (regola casa: niente inline nella pagina).
   • I pannelli Formazioni/Statistiche/Posizioni sono OVERLAY `position:absolute`
     ancorati SOTTO l'hero (`.tb-ev-live{position:relative}` + `top:100%`): si aprono
     nello spazio sotto il box live e NON spingono i mercati (task 1+2 Dav).
   • Colori del brand dalle VARIABILI `:root` del tema (task 3): il navy dei pannelli
     usa `--header-background-color` (fallback #1c4267), niente hardcoded sparsi.
   ──────────────────────────────────────────────────────────────────────────── */
.tb-ev-live{position:relative}
/* «LIVE» IN-FLOW nell'header evento (A32 23/07): il tema stila `.btn-live--ctm` come badge
   ASSOLUTO (top/left dentro `.tb-ev-live`) e finiva ad ACCAVALLARE la tabellina dei parziali sotto
   il punteggio (bug «spazio storto»). Qui, SOLO nell'header evento, torna una pillola normale nel
   flusso — nella barra info a destra accanto allo stadio — senza sovrapporsi a niente. */
.tb-ev-live .btn-live--ctm{position:static;top:auto;left:auto;right:auto;bottom:auto;
  display:inline-block;vertical-align:middle;margin-left:6px}

/* colori testo dell'hero sul fondo scuro (valgono anche nel caricamento parziale) */
.match-list--event,
.match-list--event .match-text,
.match-list--info-top,.match-list--info-top a,
.match-list--info-bottom{color:#e8f1fb}
.match-list--info-top{opacity:1}
.match-list--event .match-list--single-top{color:#b9d0e8;font-weight:700}
.match-list--event .match-text{font-weight:800;text-shadow:0 1px 2px rgba(3,14,30,.45)}
.match-list--event .tb-ev-clock{color:#ffd25a;opacity:1;font-weight:800}
.match-list--single-top .btn-icon--sport img{max-width:20px;max-height:20px}

/* barra azioni Formazioni | Statistiche | Posizioni (era inline) */
.match-list--info-bottom{display:flex;justify-content:space-between;gap:8px;
  font-size:.86em;margin-top:8px}
.tb-ev-act{cursor:pointer;color:#dbe8f6}
.tb-ev-act:hover{color:#fff}

/* parziali dei tempi, compatti sotto lo score */
.tb-ev-sets{border-collapse:collapse;background:rgba(6,22,45,.66);border-radius:8px;
  border:1px solid rgba(255,255,255,.16);box-shadow:0 4px 14px rgba(2,10,24,.30);
  overflow:hidden;font-size:.74em;line-height:1.15;color:#e8f1fb}
.tb-ev-sets td{padding:3px 9px}
.tb-ev-sets td.h{font-weight:800;opacity:1;color:#a8c4e2;text-align:center}
.tb-ev-sets td.nm{opacity:1;color:#dce9f7;font-weight:600;max-width:96px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.tb-ev-sets td.hm{text-align:center;color:#3aa0ff;font-weight:800}
.tb-ev-sets td.aw{text-align:center;color:#7dda58;font-weight:800}

/* ── PANNELLI F/S/P: OVERLAY assoluto sotto l'hero (non spinge i mercati) ── */
.tb-ev-pan{display:none;position:absolute;left:0;right:0;top:100%;z-index:40;
  background:#fff;color:var(--header-background-color,#1c4267);
  border-radius:0 0 12px 12px;padding:14px 16px;
  box-shadow:0 12px 30px rgba(10,25,45,.30)}
.tb-ev-pan.on{display:block}
.tb-ev-pan h4{margin:0 0 10px;font-weight:900}
.tb-stat-row{display:grid;grid-template-columns:44px 1fr 110px 1fr 44px;gap:8px;
  align-items:center;padding:5px 0;font-weight:700}
.tb-stat-row .lbl{text-align:center;font-size:.82em;opacity:.65;font-weight:700}
.tb-stat-row .bar{height:8px;border-radius:99px;background:rgba(28,66,103,.10);overflow:hidden;display:flex}
.tb-stat-row .bar.sx{justify-content:flex-end}
.tb-stat-row .bar i{display:block;height:100%}
.tb-ev-vuoto{text-align:center;padding:18px;opacity:.65}
.tb-lineup{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.tb-lineup .col b{display:block;margin-bottom:6px;color:var(--header-background-color,#1c4267)}
.tb-lineup .g{display:flex;gap:8px;padding:3px 0;font-weight:600}
.tb-lineup .g em{font-style:normal;opacity:.5;min-width:22px;text-align:right}

/* player/register.css */
/* ============================================================================
   REGISTRAZIONE — selettore modalità (Angelo 22/07)
   La pagina mostra solo le modalità abilitate per la skin; con più di una, il player
   sceglie con le linguette. Vestito minimale e neutro (si posa sul form del tema).
   CSS in file (regola Dav). Design D, 22-07-2026.
   ========================================================================== */

.reg-tabs{
  display:flex;gap:6px;flex-wrap:wrap;margin:2px 0 14px;
}
.reg-tab{
  flex:1 1 auto;min-width:90px;cursor:pointer;
  padding:9px 12px;border-radius:9px;
  border:1px solid rgba(28,66,103,.28);background:transparent;
  color:#26456b;font:inherit;font-weight:800;font-size:.9rem;
  transition:background .12s,border-color .12s,color .12s;
}
.reg-tab:hover{background:rgba(28,66,103,.06)}
.reg-tab.on{background:#276aa6;border-color:#276aa6;color:#fff}
.reg-tab:focus-visible{outline:2px solid #f5a623;outline-offset:2px}

.reg-hint{
  margin:2px 0 8px;font-size:.82rem;line-height:1.35;opacity:.75;
}

/* ── modalità NON ancora pronte (telefono/social): «in arrivo», niente bottone finto ── */
.reg-soon{color:#a06a08;font-weight:700}
.reg-social{display:flex;gap:10px;flex-wrap:wrap;margin:6px 0 4px}
.reg-soc{flex:1 1 auto;min-width:130px;display:inline-flex;align-items:center;justify-content:center;
  gap:8px;padding:11px 14px;border-radius:10px;border:1px solid rgba(28,66,103,.28);
  background:#fff;color:#26456b;font:inherit;font-weight:800;cursor:not-allowed;opacity:.6}
.reg-panel .btn-continue:disabled{opacity:.5;cursor:not-allowed;filter:grayscale(.3)}

/* ══ I DUE CONSENSI SI DEVONO POTER SPUNTARE (09/08, w-lane5) ═══════════════════════════
   🔴 Misurato sul servito: su timerbet «Accetto i termini» e «Ho più di 18 anni» NON si
   spuntavano — clic in timeout a 360·390·414·768·1024·1280·1440px. Sono `required` tutte e
   due, quindi il modulo non partiva: **registrazione nuova bloccata**, e la registrazione è
   l'imbuto da cui entra la gente.

   La causa è UNA riga del tema del cliente (`styles.css`, `.input-col > label`):

       position:absolute; top:-4px; pointer-events:none;

   ⚠️ E per il tema è giusta: lì la `label` è l'etichetta FLOTTANTE sopra un campo di testo, e
   non deve rubare il clic all'input che le sta sotto. Ma nelle due righe del consenso la label
   **contiene** la casella — quindi `pointer-events:none` spegne l'unico comando cliccabile, e
   `position:absolute` fa collassare `.input-col` a zero, tanto che il bottone «Registrati» sale
   e le si siede sopra (9px a 1440).

   👉 Non si tocca il tema (è del cliente) e non si tocca il modulo: si dice solo che UNA label
   che contiene una casella non è un'etichetta flottante. `:has()` è già usato in cinque fogli
   di casa.

   ⚠️ Specificità, non ordine: il tema vince con 0,4,2 (`.register-container … .input-col
   label`). La classe raddoppiata porta questa a 0,5,2. A parità vincerebbe l'ultimo foglio
   caricato — ed è esattamente l'inganno che stanotte mi ha fatto uscire le skin due per riga:
   la misura passava e la forma era sbagliata. Qui la specificità è dichiarata, non sperata. */
.reg-panel.reg-panel .input-box--row .input-col label:has(> input[type="checkbox"]){
  position:static;top:auto;left:auto;height:auto;overflow:visible;white-space:normal;
  display:flex;align-items:center;gap:8px;line-height:1.3;
  pointer-events:auto;cursor:pointer;
}
/* la riga e la colonna erano alte 0: la label assoluta le lasciava senza contenuto in flusso */
.reg-panel.reg-panel .input-box--row:has(input[type="checkbox"]),
.reg-panel.reg-panel .input-col:has(> label > input[type="checkbox"]){height:auto;min-height:0}
.reg-panel.reg-panel label > input[type="checkbox"]{
  flex:0 0 auto;margin:0;pointer-events:auto;cursor:pointer;
}

/* player/cashout.css */
/* ============================================================================
   INCASSO PARZIALE (cashout con slider) — Angelo 22/07. Lo slider sceglie quanta
   parte incassare adesso; sotto, la stima di quanto si incassa e quanto resta in
   gioco. Look coerente con le card del conto (navy/oro, l'oro è l'azione). CSS in
   file servito da FOGLI (regola Dav), scoped `.pcash`. Design 23-07-2026.
   ========================================================================== */
.pcash .pcash-range{width:100%;margin:6px 0 10px;accent-color:#f5a623;cursor:pointer}
/* ⛔ IL COLORE LO DÀ LA SCHEDA, NON QUESTO FOGLIO (Angelo, 10/08 13:35: «su studio51 non si
   vedono le scritte», con la foto e due frecce rosse su «Incassi» e «Resta in gioco»).

   Qui c'era `color:#1c4267` sulle etichette e `#12314f` sui numeri: due blu scuri FISSI, scelti
   il 23/07 quando questa scheda era chiara — c'è scritto in cima al file, «look coerente con le
   card del conto (navy/oro)». Le skin di oggi hanno la scheda SCURA, e su quel fondo i numeri
   sparivano del tutto: nella foto di Angelo si legge «Incassi» e accanto il nulla.

   👉 `inherit` non è una scelta di colore: è il rifiuto di farne una. La cifra prende il colore
   del testo della scheda che la ospita, quindi si legge su una chiara come su una scura, e il
   giorno che una skin cambia palette non serve tornare qui.
   📌 La gerarchia fra etichetta e numero resta, ma la fa il GRASSETTO invece di un secondo
   colore: un colore in meno è un modo in meno di sbagliare fondo.
   ⚠️ La pillola della percentuale tiene i suoi colori e fa bene: ha un fondo suo (`#fff7e9`), che
   se lo porta dietro su qualunque scheda — infatti nella foto di Angelo il «50%» si legge. */
.pcash-read{display:flex;align-items:center;justify-content:space-between;gap:10px;
  flex-wrap:wrap;font-size:.92em;color:inherit;margin-bottom:10px}
.pcash-read b{color:inherit;font-weight:800;font-variant-numeric:tabular-nums}
.pcash-pct{font-weight:900;color:#b3651e;background:#fff7e9;border-radius:999px;
  padding:2px 12px;box-shadow:inset 0 0 0 1px #f5a623}
.pcash-go{width:100%}
@media (max-width:520px){
  .pcash-read{font-size:.86em;gap:6px}
  .pcash-pct{order:-1;flex:1 0 100%;text-align:center}
}

/* player/esito_riserva.css */
/* ════════════════════════════════════════════════════════════════════════════
   L'ESITO DELLA RISERVA, quando l'operatore decide — A32, 27/07:
   «altra cosa lato player quando accetto si deve aggiornare automaticamente».

   Il giocatore che ha una schedina in riserva sta aspettando di sapere se la sua
   scommessa è valida: è il momento in cui il silenzio costa di più. Quando la
   risposta arriva non deve SCOPRIRLA — deve VEDERLA. Quindi due segnali:
   · la riga della giocata cambia colore e parola, sul posto;
   · una fascia in alto lo dice a chiare lettere.

   Il RIFIUTO non si chiude da solo: quello è denaro tornato indietro e una
   scommessa che non c'è più — resta finché non lo si è letto. L'accettazione, che
   è la buona notizia, si ritira dopo qualche secondo.
   Regola Dav: il CSS sta in un file, mai dentro il template.
   ──────────────────────────────────────────────────────────────────────────── */

/* ── la fascia ─────────────────────────────────────────────────────────────── */
.tb-avviso{
  position:fixed; left:50%; transform:translateX(-50%);
  top:14px; z-index:4100;
  max-width:min(92vw,560px); padding:13px 44px 13px 18px;
  border-radius:12px; border:1px solid transparent;
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  font-size:.94rem; font-weight:700; line-height:1.35;
  box-shadow:0 14px 38px rgba(2,10,24,.42);
  animation:tb-avviso-in .22s ease;
}
@keyframes tb-avviso-in{from{transform:translate(-50%,-10px);opacity:0}
                        to{transform:translateX(-50%);opacity:1}}
.tb-avviso--accettata{background:#0f5132;border-color:#1c7a4d;color:#d7f5e6}
.tb-avviso--rifiutata{background:#5c1a17;border-color:#8f2c26;color:#ffdcd8}
.tb-avviso-x{
  position:absolute; top:6px; right:8px;
  background:none; border:0; cursor:pointer; padding:4px 8px;
  color:inherit; opacity:.7; font-size:1.15rem; line-height:1;
}
.tb-avviso-x:hover{opacity:1}

/* La fascia non deve mai coprire il coupon su cui si sta lavorando: sugli schermi
   stretti si appoggia in alto a tutta larghezza e lascia libero il resto. */
@media (max-width:640px){
  .tb-avviso{left:8px; right:8px; max-width:none; transform:none; padding-right:40px}
  @keyframes tb-avviso-in{from{transform:translateY(-10px);opacity:0}
                          to{transform:none;opacity:1}}
}

/* ── la riga della giocata, sul posto ──────────────────────────────────────── */
/* Il dettaglio coupon: la scritta «In revisione» diventa l'esito, con il suo colore. */
[data-tb-esito="accettata"]{color:#1c7a4d; font-weight:800}
[data-tb-esito="rifiutata"]{color:#c0392b; font-weight:800}

/* Il pannello «Schedine in gioco»: la riga si accende senza cambiare struttura —
   il pallino dice lo stato, che è il posto dove il giocatore lo cerca. */
a.us-row.tb-esito{position:relative}
a.us-row.tb-esito--accettata .us-dot{background:#1c7a4d}
a.us-row.tb-esito--rifiutata .us-dot{background:#c0392b}
a.us-row.tb-esito--rifiutata{opacity:.72; text-decoration:line-through}

/* player/header_prefs.css */
/* ════════════════════════════════════════════════════════════════════════════
   HEADER — INGRANAGGIO (preferenze) e BANDIERINA (lingua/fuso), popover del
   player. Era un <style> inline dentro theme_family/lingua.html: spostato qui
   (regola Dav: CSS in file, mai inline) quando l'ingranaggio ha preso il blocco
   «Orologio e fuso» e la lista lingue i codici-bandiera (Angelo 24/07).
   Servito su ogni pagina /player via FOGLI (dopo il CSS del tema: vince).
   ──────────────────────────────────────────────────────────────────────────── */

/* DA LOGGATO l'header è quello del TEMA (icone .hu-ic) e la nostra pill lingua è nascosta
   (il tema ha già la sua bandiera): resta la nostra ⚙ rotellina, vestita come icona-pillola
   del tema, centrata, col pannello sempre sopra tutto. Scoped a .hd-top-header--right →
   non tocca la resa da sloggato. */
.hd-top-header--right .menu-list{display:inline-flex;align-items:center;flex:0 0 auto}
.hd-top-header--right .menu-list .menu-activator{display:inline-flex;align-items:center;gap:3px;
  padding:6px 9px;border-radius:999px;background:rgba(255,255,255,.12);cursor:pointer;
  transition:background .15s;line-height:1}
.hd-top-header--right .menu-list .menu-activator:hover{background:rgba(255,255,255,.22)}
.hd-top-header--right .menu-list .menu-activator .mdi{font-size:17px;line-height:1}
#menuPrefsHeader.tb-hd-pop{z-index:200 !important}

/* trigger nell'header: pillole coerenti, non icone nude */
.tb-hd-trig{display:inline-flex;align-items:center;gap:7px;padding:6px 12px;border-radius:999px;
  background:rgba(255,255,255,.12);cursor:pointer;font-weight:700;transition:background .15s;
  white-space:nowrap}
.tb-hd-trig:hover{background:rgba(255,255,255,.22)}
.tb-hd-pop{background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:14px;
  box-shadow:0 14px 40px rgba(10,25,45,.30);width:288px;z-index:70;color:#1c4267;
  overflow:hidden}

/* i pannelli header si ancorano al loro trigger e si aprono verso SINISTRA: così non escono
   mai dal bordo destro (era quello a tagliare «Americane», «Completo»). `!important` +
   `left:auto` battono la regola del tema (.menu-list--submenu); `max-width` li tiene dentro
   il viewport. Sempre fuori-flusso (absolute): un pannello chiuso non allarga la riga
   dell'header — era quello a far scrollare la pagina di lato (~82px a 1280). */
.menu-list--language .tb-hd-pop, #menuPrefsHeader{position:absolute !important;right:0 !important;
  left:auto !important;top:calc(100% + 8px);max-width:calc(100vw - 24px)}
/* il tema clampa i submenu a ~350px e la lista lingue usciva TAGLIATA a 5 righe: il pannello
   può crescere fino al viewport, e a scrollare — se serve — è la lista, non il pannello. */
#menuLanguageHeader{max-height:calc(100vh - 90px) !important;overflow:visible}
#menuLanguageHeader ul{max-height:calc(100vh - 240px) !important}
/* i contenitori del selettore non devono mai sforare: se lo spazio è poco, si stringono. */
.menu-list--language, .menu-list--language .tb-hd-trig{max-width:100%;min-width:0}
/* B54: overflow orizzontale @1280 (QA di D). Sotto i 1360 si sacrifica la SIGLA lingua
   (bandiera e orologio restano): l'ORA DEL SITO è sempre visibile (Angelo 25/07 —
   prima qui si nascondeva #tbClock). `overflow-x:clip` toglie definitivamente lo
   scroll orizzontale senza toccare quello verticale. */
@media (max-width:1360px){ .menu-list--language .tb-lang-abbr{display:none} }
html, body{ overflow-x:clip }

.tb-hd-pop *{color:#1c4267}
.tb-hd-pop .ttl{font-size:.7em;font-weight:800;letter-spacing:.07em;opacity:.6;
  text-transform:uppercase;margin:14px 16px 6px}
.tb-hd-pop select{width:calc(100% - 32px);margin:0 16px;border:1px solid rgba(28,66,103,.3);
  border-radius:9px;padding:8px 10px;background:#fff;font-weight:600}
/* le tendine che seggono ACCANTO a una scritta (Vista mercati, Fuso orario) non prendono
   tutta la riga: si stringono sul contenuto e vivono nella stessa riga dell'etichetta. */
.tb-hd-pop label.sel{display:flex;gap:8px;align-items:center;margin:4px 16px;font-weight:600}
.tb-hd-pop label.sel select{flex:1;width:auto;margin:0;min-width:0}

/* il FORMATO QUOTE: bottoni segmentati, non una tendina */
.tb-seg{display:flex;gap:5px;margin:0 16px;flex-wrap:wrap}
.tb-seg label{flex:1 1 30%;text-align:center;border:1px solid rgba(28,66,103,.28);border-radius:9px;
  padding:8px 4px;font-weight:800;cursor:pointer;font-size:.85em;transition:all .12s}
.tb-seg label small{display:block;font-weight:600;opacity:.55;font-size:.82em}
.tb-seg input{display:none}
.tb-seg input:checked+span, .tb-seg label:has(input:checked){background:linear-gradient(135deg,#1c4267,#276aa6);color:#fff;border-color:transparent}
.tb-seg label:has(input:checked) small{opacity:.8;color:#fff}
.tb-hd-pop label.rad{display:inline-flex;gap:6px;align-items:center;margin:4px 0 4px 16px;
  cursor:pointer;font-weight:600}
.tb-hd-pop .salva{display:block;width:calc(100% - 32px);margin:14px 16px 16px;border:0;
  cursor:pointer;background:linear-gradient(180deg,#8cc63e,#7ab829);color:#fff !important;
  font-weight:900;border-radius:10px;padding:10px 0;letter-spacing:.04em}
.tb-hd-pop .salva:hover{filter:brightness(1.06)}

/* lingua: tab pieni, ricerca col bordo, righe con hover */
.tb-lang-tabs{display:flex;background:rgba(28,66,103,.07)}
.tb-lang-tabs span{flex:1;text-align:center;padding:11px 4px;font-weight:800;cursor:pointer;
  border-bottom:3px solid transparent;transition:all .12s}
.tb-lang-tabs span.on{background:#fff;border-bottom-color:#f60}
.tb-hd-pop input[type=text]{width:calc(100% - 32px);margin:10px 16px 4px;
  border:1px solid rgba(28,66,103,.3);border-radius:9px;padding:8px 12px;font-weight:600}
.tb-hd-pop ul{margin:4px 0 8px;padding:0;list-style:none;max-height:70vh;overflow-y:auto}
/* il nome sta ATTACCATO al codice (il tema mette justify space-between e lo spingeva
   al bordo destro: «IT ......... Italiano» non si legge come una riga sola) */
.tb-hd-pop li a{display:flex;align-items:center;justify-content:flex-start !important;
  gap:10px;padding:9px 16px;font-weight:600}
.tb-hd-pop li a:hover{background:rgba(39,106,166,.08)}
/* 🔴 `max-width:none` E `flex:none` NON SONO PIGNOLERIA: senza, la bandiera in testata esce
 * larga ZERO. Misurato sul servito (timerbet.digitaltre.com, skin 11 «24248»), ed è lo scatto
 * che ha mandato Dav il 04/08 — il quadratino vuoto accanto all'orologio è QUESTO.
 * La catena, tutta misurata: `.tb-hd-trig` si ritrova largo 18px con `padding:6px 9px`, quindi
 * la sua scatola di contenuto è 0; la reimpostazione del tema porta `img{max-width:100%}`, e
 * 100% di zero è zero. Risultato: `width:22px` qui sotto veniva scavalcato e l'immagine
 * spariva pur essendo ARRIVATA (`naturalWidth` > 0: non è un 404, non è un font).
 * ⚠️ Non si tocca il `min-width:0` qui sopra: è la correzione B54 dell'overflow a 1280, e
 * rimetterlo in discussione riaprirebbe quel difetto. Si rende INCOMPRIMIBILE la bandiera,
 * che è il pezzo che non ha senso rimpicciolire: una bandiera a 0px non informa nessuno. */
.tb-flag-r{width:22px;height:22px;max-width:none;flex:none;border-radius:50%;object-fit:cover;
  box-shadow:0 0 0 2px rgba(28,66,103,.15)}
/* Sotto i 900 la testata è davvero stretta e la bandiera incomprimibile chiede 6px che non ci
 * sono: si scende a 18px e ne restano 2. Stessa logica della riga qui sopra sulla sigla —
 * quando lo spazio finisce si sacrifica la DIMENSIONE, non la presenza. */
@media (max-width:900px){ .menu-list--language .tb-flag-r{width:18px;height:18px} }
.tb-lang-code{min-width:28px;font-weight:900;border-right:1px solid rgba(28,66,103,.2);
  padding-right:9px;font-size:.85em}

/* ── L'OROLOGIO FUORI DAL BOTTONE DELLA LINGUA (lavorazione 3-d, Dav 30/07 09:54) ──────────
   «Qui dove compare la lingua metti solo immagine della lingua. L'orario mettilo in un div a
   parte.» Il bottone apre la tendina delle lingue: tenerci dentro l'ora significava mettere
   un'informazione da leggere dentro un bersaglio da premere.
   Qui l'ora sta accanto, allineata alla stessa riga, e NON è cliccabile — così leggerla non
   apre più niente. Le misure sono quelle del resto della testata, non inventate. */
.menu-list--language + .tb-hd-clock,
.tb-hd-clock{display:inline-flex;align-items:center;padding:0 8px;font-variant-numeric:tabular-nums;
  font-weight:700;font-size:.82em;line-height:1;white-space:nowrap;opacity:.9;cursor:default}
/* Sotto i 1360px la sigla della lingua era già nascosta per far stare la testata: l'ora resta,
   perché è un dato che serve a chi gioca (Angelo, 25/07) e occupa meno di una parola. */
@media (max-width:520px){ .tb-hd-clock{padding:0 5px;font-size:.78em} }

/* player/evsearch.css */
/* ════════════════════════════════════════════════════════════════════════════
   CERCA EVENTO (tb-evsearch) — Dav 25/07, ri-segnalato: il campo era rimasto
   ORFANO sotto la navbar sport dopo la rimozione della topbar blu coi tab (dove
   il cerca viveva, a destra). Ora un piccolo JS nei palinsesti lo RICOLLOCA
   dentro `.box-main--middle` (la barra che ha sostituito la topbar) e queste
   regole lo vestono nei due assetti. Stili PRIMA inline nei template: spostati
   qui per la regola Dav (mai style dentro le pagine: sovrascrivono il CSS del
   template della skin e si rompono col multi-skin).
   ──────────────────────────────────────────────────────────────────────────── */

/* fallback: dove la barra del tema non c'è, il campo resta in colonna, com'era */
.tb-evsearch{padding:8px 10px 6px}
.tb-evsearch--in{width:100%;box-sizing:border-box;padding:9px 12px;border-radius:8px;
  border:1px solid rgba(0,0,0,.15);font-size:.95em}
.tb-evsearch--none{padding:12px;opacity:.6;font-size:.9em}

/* DENTRO la barra sport (come il riferimento: tab a sinistra, cerca a destra):
   pillola compatta, allineata a destra, alta quanto la riga */
.box-main--middle .tb-evsearch{margin-left:auto;flex:0 1 240px;min-width:120px;
  padding:0;display:flex;align-items:center}
.box-main--middle .tb-evsearch--in{padding:4px 10px;border-radius:999px;font-size:.82em;
  border:1px solid rgba(255,255,255,.25);background:rgba(255,255,255,.92)}
.box-main--middle .tb-evsearch--in:focus{outline:none;background:#fff}

/* su mobile la barra va a capo (regola già esistente per la strip): il cerca
   scende sotto a piena larghezza invece di schiacciarsi */
@media (max-width:900px){
  .box-main--middle .tb-evsearch{flex:1 1 100%;margin:4px 0 2px}
}

/* player/eventi_giorno.css */
/* ════════════════════════════════════════════════════════════════════════════
   EVENTI DEL GIORNO (.eg) — stili PRIMA inline in _eventi_giorno_body.html e
   eventi_giorno.html, spostati qui per la regola Dav 25/07 («niente style inline
   o nelle pagine: sovrascrive il CSS del template della skin e con più skin si
   rischiano problemi»). Una skin può ridefinire tutto da qui in giù.

   FULL-WIDTH (Dav 25/07): il box centrale occupa TUTTA la larghezza disponibile.
   Prima: max-width:1240px + margin auto inline → fasce vuote ai lati. Il padding
   della cornice resta solo VERTICALE, così di lato non c'è nessuna fascia.
   ──────────────────────────────────────────────────────────────────────────── */
.eg{width:100%}
.eg-page{padding:14px 0}

.eg-head{background:linear-gradient(90deg,#e8952b 0%,#8a5a1c 32%,#12314f 70%);
  color:#fff;font-weight:800;letter-spacing:.03em;padding:11px 16px;border-radius:8px 8px 0 0;
  font-size:.98em}
.eg-chips{display:flex;flex-wrap:wrap;gap:9px;padding:14px 16px;background:#12314f}
.eg-chip{border:1px solid rgba(255,255,255,.14);border-radius:999px;padding:8px 18px;
  text-decoration:none;color:#cfe0f2;font-weight:700;font-size:.86em;letter-spacing:.02em;
  background:#173a5c;transition:background .12s,border-color .12s}
.eg-chip:hover{border-color:#e8952b}
.eg-chip.on{background:#cfe0f2;color:#12314f;border-color:#cfe0f2}
.eg-empty{padding:26px 16px;text-align:center;color:#9fb4cc;background:#12314f}

/* player/asiatica.css */
/* ════════════════════════════════════════════════════════════════════════════
   VISTA ASIATICA (.as-*) — stili PRIMA nel <style> inline di asiatica.html,
   spostati qui per la regola Dav 25/07 (niente CSS dentro le pagine).
   FIX Dav 25/07 (.pg rompe il layout): la pagina NON usa più la classe .pg —
   senza .pg-side la sua griglia a 2 colonne (248px + contenuto) lasciava una
   colonna VUOTA a sinistra. Scelta l'opzione «rimuovi la classe» (il flex nella
   media query globale avrebbe messo in riga le card delle pagine conto).
   .as-page riporta il solo guscio che serviva di .pg (padding e testo).
   ──────────────────────────────────────────────────────────────────────────── */
.as-page{padding:14px 12px 44px;color:#22303f;font-variant-numeric:tabular-nums}
.as-page a{color:#276aa6}
.as-card-b{padding:12px 14px}
.as-wrap{--gold:#f5b301;--dim:#93a6bd;--line:rgba(128,128,128,.16);max-width:1080px;margin:0 auto}
  .as-top{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between;margin-bottom:12px}
  .as-toggle{display:inline-flex;border:1px solid var(--primary-border, var(--line));border-radius:999px;overflow:hidden}
  .as-toggle a{padding:7px 16px;text-decoration:none;color:inherit;font-weight:800;font-size:.85rem}
  .as-toggle a.on{background:#8DC63F;color:#0b2038}
  .as-hint{font-size:.78rem;opacity:.7}
  .as-scr{overflow-x:auto}
  /* GRIGLIA coerente (Angelo 24/07): stesse colonne su header e righe; le 3 colonne mercato hanno
     larghezza uguale, l'evento è la colonna elastica. `align-items:stretch` + min-height uniforme
     tengono celle piene e «—» della stessa altezza, senza collassi. */
  .as-head,.as-row{display:grid;grid-template-columns:minmax(150px,1.7fr) 1.15fr 1.15fr 1.15fr;
    gap:8px;min-width:680px}
  .as-head{padding:4px 10px;color:var(--dim);font-size:.68rem;text-transform:uppercase;letter-spacing:.05em;align-items:center}
  .as-head .c{text-align:center}
  .as-row{padding:7px 10px;margin-bottom:5px;border:1px solid var(--primary-border, var(--line));border-radius:10px;
    background:rgba(128,128,128,.05);align-items:stretch}
  .as-teams{min-width:0;display:flex;flex-direction:column;gap:1px;justify-content:center}
  .as-teams b{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .as-teams .t2{opacity:.7}
  .as-when{font-size:.7rem;opacity:.55;margin-top:1px}
  .as-when .lv{color:#e0261a;font-weight:800}
  /* ogni colonna-mercato è SEMPRE una griglia interna a larghezze uguali: 3 celle (1X2) o 2 (AH/OU);
     un «—» a mercato assente OCCUPA l'intera colonna (grid-column:1/-1), stesso spazio della piena. */
  .as-pair{display:grid;gap:4px}
  .as-pair.p3{grid-template-columns:1fr 1fr 1fr}.as-pair.p2{grid-template-columns:1fr 1fr}
  .as-cell{display:flex}
  .as-cell form{display:flex;width:100%}
  /* Dav 26/07 («fallo come gli altri, non con sfondo nero»): fondo, testo, bordo, hover e
     stato attivo li dà la classe del TEMA `qt-btn` (la stessa della vista classica) — qui
     restano SOLO le misure di layout della griglia asiatica. Niente copie di grafica. */
  .as-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:1px;min-width:0;min-height:40px}
  .as-btn .lab{font-size:.64rem;opacity:.6;white-space:nowrap}
  /* il numero BLU della vista classica è il token del tema (--qt-color-b, lo stesso che
     template_c dà ai .qt-btn della lista): si riusa la VARIABILE, mai il valore copiato */
  .as-btn .od{font-variant-numeric:tabular-nums;color:var(--qt-color-b,inherit)}
  .as-btn[disabled]{opacity:.45;cursor:not-allowed}   /* sospeso: velo, come le celle bloccate */
  .as-mt{grid-column:1 / -1;display:flex;align-items:center;justify-content:center;min-height:40px;
    opacity:.3;border:1px dashed var(--primary-border, var(--line));border-radius:8px}
  .as-lg{margin:14px 0 6px;font-weight:800;color:var(--gold);font-size:.88rem}
  .as-none{padding:26px 10px;text-align:center;opacity:.7}

/* player/casino_struttura.css */
/* LA VETRINA DEL CASINÒ DENTRO UN TEMA IMPORTATO — solo la STRUTTURA, mai i colori.
 *
 * Angelo, 31/07: «sistema il casinò, attiva i giochi su studio51». Attivati i 3.613 giochi la
 * pagina è passata da 404 a 200 — e le schede uscivano UNA PER RIGA a schermo intero: pagina
 * alta 16.824px, un gioco per schermata.
 *
 * ⚠️ Le regole per queste classi ESISTONO, in `player/skin_fixes.css`, e sono anche belle. Ma
 * quel foglio le pagine vestite non lo caricano, e non si può aggiungerlo agli strutturali:
 * dentro ci sono gradienti, fondi e un bottone «Gioca» dorato: sono SCELTE DI COLORE, e su una
 * pagina vestita il colore è del tema. Aggiungerlo vorrebbe dire che ogni skin, con qualunque
 * tema, si ritrova le card blu-navy di casa.
 *
 * Quindi qui c'è solo quello che senza rompe: la griglia, la proporzione della card e
 * l'immagine che la riempie. Nessun `background`, nessun `color`. Una card senza gradiente si
 * vede benissimo — è l'immagine del gioco a occuparla tutta; una card senza griglia no.
 *
 * ⚠️ E il giorno che si vorranno anche i gradienti su un tema preciso, la strada è il CSS di
 * QUEL tema (`.tb-cg` sta nel contratto delle classi nostre), non questo foglio.
 */

.tb-cas { box-sizing: border-box; width: 100%; }

/* ── LA BARRA: ricerca, tab delle categorie, tipi ── */
.tb-cas-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px;
  padding: 10px 0 12px; }
.tb-cas-search { flex: 1 1 220px; min-width: 0; }
.tb-cas-search input { box-sizing: border-box; width: 100%; }
.tb-cas-tabs, .tb-cas-tipi { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0;
  list-style: none; }
.tb-cas-tab { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap;
  padding: 6px 12px; border-radius: 999px; font-size: 12.5px; font-weight: 600; }

/* ── LA GRIGLIA: è la riga che mancava ──
   `auto-fill` con una misura minima: sei-sette card per riga su un monitor, tre sul telefono,
   senza che nessuno decida un numero — e senza rompersi quando la colonna centrale del tema è
   più stretta della nostra. */
.tb-cas-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 12px;
  align-items: start;
}
@media (max-width: 560px) {
  .tb-cas-grid { grid-template-columns: repeat(3, 1fr); gap: 8px; }
}

/* ── LA CARD: la proporzione e l'immagine che la riempie ──
   `aspect-ratio` è ciò che tiene la card alta quanto deve: senza, l'altezza la decideva
   l'immagine alla sua misura naturale — ed è così che una pagina diventa alta 16.824px. */
.tb-cg { position: relative; display: block; aspect-ratio: 4 / 3; overflow: hidden;
  border-radius: 12px; text-decoration: none; }
.tb-cg-img { position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; display: block; z-index: 1; }
.tb-cg-ph { position: absolute; inset: 0; display: flex; align-items: center;
  justify-content: center; font-size: 2.4em; font-weight: 900; }
.tb-cg-foot { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  display: flex; flex-direction: column; gap: 5px; padding: 22px 8px 7px; }
/* il nome sta su due righe e poi taglia: i nomi dei giochi arrivano lunghissimi dal fornitore
   e senza questo la card si allunga o il testo esce dal bordo. */
.tb-cg-name { font-size: .8em; font-weight: 700; line-height: 1.15; overflow: hidden;
  text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2;
  -webkit-box-orient: vertical; max-height: 2.3em; }
.tb-cg-play { align-self: flex-start; font-size: .68em; font-weight: 800;
  padding: 4px 10px; border-radius: 7px; }

/* ── il fondo della vetrina ── */
.tb-cas-empty { padding: 30px 12px; text-align: center; }
.tb-cas-more { display: flex; align-items: center; justify-content: center; gap: 10px;
  padding: 20px 0 6px; }
.tb-cas-more[hidden] { display: none; }

/* ═══════════════════════════════════════════════════════════════════════════
   LE BARRE DELLA VETRINA — provider, gruppi, cerca, viste (Dav, 03/08 21:19)

   Sta qui e non nella pagina perché l'ha chiesto lui: «non hardcodare codice nella pagina ma in
   caso aggiungilo in un css separato». Questo foglio è già fra i FOGLI_STRUTTURALI, quindi arriva
   su ogni skin — vestita o no — ed è l'unico posto in cui queste classi esistono.

   ⚠️ STESSA REGOLA DEL RESTO DEL FILE: solo STRUTTURA, mai colori. Niente `background`, niente
   `color`: su una pagina vestita il colore è del tema, e un chip blu-navy di casa in mezzo al
   design di un cliente è il difetto delle «due cornici di studio5». Qui c'è quello che senza
   rompe — la fila che scorre, la spaziatura, la griglia che cambia forma.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════════════════════════════════
   LA COLONNA A SINISTRA — la strada A di Jesper (09/08 16:55: «vai con la A»)

   🔴 IL DIFETTO, col numero, misurato sulla skin 150 prima di toccare niente:

       a 1440   il primo gioco a  y=730   su una finestra di  900
       a  390   il primo gioco a  y=2709  su una finestra di  844   ← tre schermate e mezza

   Cinquanta riquadri fornitore larghi quanto la pagina, prima di un gioco. Sul telefono era il
   difetto vero, ed e' li' che si misura il rimedio.

   ⛔ QUESTE REGOLE NON POSSONO TOCCARE TIMERBET, e non e' una speranza: `.cb-lay`, `.cb-col` e
   `.cb-giochi` esistono SOLO in `player/casino.html`, cioe' nel ramo che prende una skin SENZA
   tema importato (57 su 58). Su una pagina vestita quelle classi non compaiono e le regole sono
   inerti — anche se questo foglio, essendo STRUTTURALE, arriva su ogni skin.
   ⚠️ Per la stessa ragione qui NON si tocca `.tb-cg` ne' `.tb-cas-grid`: quelle sono condivise
   con la lobby vestita, e cambiarle entrerebbe nel disegno di un cliente.

   📌 E come sempre in questo foglio: solo STRUTTURA, mai colori.
   ═══════════════════════════════════════════════════════════════════════════ */

.cb-lay{display:block}
.cb-col{display:flex;flex-direction:column;gap:10px;min-width:0}
.cb-col-gruppo{display:flex;flex-direction:column;gap:4px}
.cb-col-tit{display:flex;align-items:center;justify-content:space-between;gap:8px;
            padding:6px 2px 2px;font-size:12px;font-weight:800;letter-spacing:.04em;
            text-transform:uppercase;opacity:.75}
.cb-col-tutti{font-size:11px;font-weight:600;text-transform:none;letter-spacing:0;
              text-decoration:underline;opacity:.85}
/* ── LA COLONNA A DUE COLONNE (Jesper, 10/08 07:27, con lo scatto di Timerbet) ─────────────────
   Il secondo messaggio ha cambiato il bersaglio: non erano «i loghi due per riga», era **tutta la
   colonna a due colonne** — riquadri, categorie e provider. Fare solo i loghi sarebbe stata meta'
   della richiesta, e la meta' che si vede meno.

   👉 E qui il 287px trova la sua ragione: e' la larghezza che serve perche' DUE riquadri ci stiano
   dentro. Non era un numero a caso, e infatti non si negozia — se due non tornano, il posto dove
   guardare sono i margini interni, non la larghezza.

   📌 Solo STRUTTURA, come tutto questo foglio: la sottolineatura della voce attiva e' in
   `currentColor`, cioe' prende il colore del tema. Nello scatto e' azzurra perche' e' azzurro il
   tema di Timerbet — copiare quell'azzurro qui vorrebbe dire entrare nel disegno di 57 skin. */
.cb-col-lista{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;
              align-content:start}
.cb-voce{position:relative;display:flex;align-items:center;justify-content:center;gap:5px;
         padding:9px 8px;border-radius:8px;
         text-decoration:none;border:1px solid currentColor;font-size:13.5px;line-height:1.2;
         opacity:.8;min-width:0;text-align:center;overflow-wrap:anywhere}
/* ⛔ Il conteggio NON e' piu' spinto a destra (`margin-inline-start:auto`): in un riquadro stretto
   e centrato quel margine lo staccava dal nome e lo appiccicava al bordo. Adesso sta accanto, con
   un filo d'aria — 5px: nello scatto di Timerbet «Tutte405» e «Live403» sono incollati, ma quello
   e' il loro prodotto di adesso, non necessariamente cio' che Jesper vuole qui. Se lo vuole
   incollato e' un `gap:0`, ed e' una riga. */
.cb-voce small{margin-inline-start:0;opacity:.7;font-size:.85em}
.cb-voce.on{opacity:1;font-weight:700}
/* La voce attiva si riconosce dalla SOTTOLINEATURA in basso, come nello scatto: e' piu' leggibile
   del solo bordo, che a due colonne si confonde con quello delle sorelle. */
.cb-voce.on::after{content:"";position:absolute;inset-inline:20%;bottom:-1px;height:2px;
                   background:currentColor;border-radius:2px}
.cb-col-voce{display:block;padding:8px 10px;border-radius:8px;border:1px solid currentColor;
             text-decoration:none;font-size:13.5px;font-weight:700}
/* I provider sono tanti (cinquanta sulla 150): scorrono DENTRO il loro riquadro invece di
   allungare la colonna. E' la riga che tiene i giochi dove sono. */
.cb-col-lista--prov{max-height:340px;overflow-y:auto;overscroll-behavior:contain}
/* ⛔ QUI AVEVO SCRITTO UN DIFETTO, e lo scatto l'ha mostrato. Avevo rimpicciolito il logo nella
   colonna (`width:104px;background-size:1040px 1625px`) per farlo stare piu' comodo. Ma le
   `background-position` dei ~50 provider sono calcolate sullo sprite NATIVO 1280x2000: scalare lo
   sfondo senza ricalcolarle ritaglia il pezzo sbagliato di immagine, e in pagina uscivano loghi
   tagliati e sovrapposti.
   👉 Il logo resta alla sua misura nativa (128x48) e la colonna e' larga abbastanza. E' la stessa
   lezione dei 38 riquadri vuoti del 04/08: una classe si puo' usare dove i suoi numeri non
   valgono, e il template non se ne lamenta — lo dice solo la foto. */
.cb-voce--prov{padding-block:4px}

/* ── L'INTERRUTTORE, che e' una casella di spunta e non uno script ──
   Sotto i 900px la colonna nasce CHIUSA: i giochi sono la prima cosa che si vede, che e'
   esattamente la richiesta. Sopra, sta sempre aperta e il bottone sparisce.
   Senza JavaScript funziona identico — e' il motivo per cui non e' uno script. */
.cb-sw-lbl{display:inline-flex;align-items:center;gap:6px;margin-block-end:10px;
           padding:8px 14px;border-radius:999px;border:1px solid currentColor;
           font-size:13px;font-weight:700;cursor:pointer;user-select:none}
.cb-sw-chiudi{display:none}
.cb-sw:checked ~ .cb-lay .cb-sw-apri{display:none}
.cb-sw:checked ~ .cb-lay .cb-sw-chiudi{display:inline}

@media (max-width:899px){
  .cb-col{display:none}
  .cb-sw:checked ~ .cb-lay .cb-col{display:flex;margin-block-end:12px}
  /* aperta sul telefono la lista dei provider non deve mangiarsi lo schermo lei */
  .cb-col-lista--prov{max-height:260px}
}

@media (min-width:900px){
  .cb-sw-lbl{display:none}
  /* 🔴 287px — LA MISURA E' DI JESPER (10/08 07:25), e si scrive 287 esatti: e' un numero suo,
     probabilmente allineato a qualcosa che da qui non si vede, e arrotondarlo a «circa 290»
     vorrebbe dire rispondere a una domanda diversa da quella che ha fatto.
     ⛔ `.cb-giochi` NON si tocca: e' la seconda colonna `minmax(0,1fr)`, quindi si restringe da
     sola dei 57px che la colonna guadagna. Dargli una larghezza esplicita creerebbe due numeri
     che devono restare d'accordo — e prima o poi non lo sono piu'. */
  .cb-lay{display:grid;grid-template-columns:287px minmax(0,1fr);gap:16px;align-items:start}
  .cb-col{position:sticky;top:8px;max-height:calc(100vh - 16px);overflow-y:auto;
          overscroll-behavior:contain}
}

/* ── I LOGHI DEI PROVIDER, DUE PER RIGA (Jesper, 10/08) ───────────────────────
   La lista era una colonna: un logo per riga, e 50 provider facevano una striscia lunghissima
   dentro il suo riquadro. Due per riga la dimezzano.

   📏 IL CONTO, perche' 287 non e' un numero a caso una volta che i loghi sono due:

       287  la colonna
       -15  la barra di scorrimento della lista (`overflow-y:auto`, sta DENTRO la larghezza)
       ---
       272  utili
       -8   il vuoto fra le due colonne
       ---
       264  per due loghi  →  132 a testa, e il logo nativo ne occupa 128. Ci sta, con 4 di aria.

   ⛔ E IL LOGO NON SI RIMPICCIOLISCE, mai: le `background-position` dei ~50 provider sono
   calcolate sullo sprite NATIVO 1280x2000 (`.cb-logo`, box 128x48). Scalarlo ritaglia il pezzo
   sbagliato — e' il difetto gia' preso in faccia il 05/08, scritto venti righe piu' su. Percio'
   qui si toglie il PADDING attorno al logo, non si tocca il logo: ed e' esattamente quello che
   Jesper aveva previsto — «cb-voce cb-voce--prov verra' piu' piccola».

   📌 E il conteggio va SOTTO, non di fianco: a 128px il numero non ci sta accanto al logo, e
   toglierlo non era un'opzione — «Pragmatic Play 80» senza l'80 e' una voce che dice meno di
   prima. Impilato si legge e non ruba larghezza. */
/* La griglia a due ora e' della BASE `.cb-col-lista` (categorie e provider insieme): qui resta
   solo cio' che e' proprio dei provider — l'altezza massima con lo scorrimento. */
.cb-voce--prov{flex-direction:column;justify-content:center;gap:2px;
               padding-block:6px;padding-inline:0;text-align:center;min-width:0}
/* il conteggio non e' piu' spinto a destra dal `margin-inline-start:auto` di `.cb-voce small`:
   in colonna quel margine lo staccherebbe dal logo invece di allinearlo. */
.cb-voce--prov small{margin-inline-start:0}
/* Chi non ha il logo mostra il nome: dentro 132px deve andare a capo invece di sfondare. */
.cb-voce--prov span:not(.sr-only){overflow-wrap:anywhere;line-height:1.15}
.cb-giochi{min-width:0}

.cb{display:flex;flex-direction:column;gap:8px;margin-block-end:12px}

/* Le due barre scorrono in orizzontale invece di andare a capo: con 30 provider una fila che va
   a capo diventa un muro alto mezzo schermo, e i giochi finiscono sotto la piega. */
.cb-barra{display:flex;gap:6px;overflow-x:auto;overflow-y:hidden;
          scrollbar-width:none;-webkit-overflow-scrolling:touch}
.cb-barra::-webkit-scrollbar{display:none}
.cb-chip{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;
         padding:6px 12px;border-radius:999px;text-decoration:none;
         border:1px solid currentColor;font-size:13px;line-height:1.2;opacity:.72}
.cb-chip.on{opacity:1;font-weight:700}
.cb-chip small{opacity:.7;font-size:.85em}
/* ⛔ `.cb-logo` è stata TOLTA il 04/08: disegnava un riquadro vuoto su ogni provider, perché lo
   sprite dei loghi vive dentro il tema importato e queste skin non ce l'hanno. Se un domani lo
   sprite arriva anche qui, la regola torna — ma insieme al file, non da sola. */

.cb-cerca{display:flex;gap:6px}
.cb-cerca-in{flex:1;min-width:0;padding:7px 12px;border-radius:999px;
             border:1px solid currentColor;background:transparent;color:inherit;font-size:14px}
.cb-cerca-go{flex:none;padding:7px 14px;border-radius:999px;border:1px solid currentColor;
             background:transparent;color:inherit;cursor:pointer;font-size:13px}

.cb-viste{display:flex;gap:4px;align-self:flex-end}
.cb-vista{width:32px;height:32px;border-radius:8px;border:1px solid currentColor;
          background:transparent;color:inherit;cursor:pointer;opacity:.6;font-size:15px;line-height:1}
.cb-vista.on{opacity:1}

/* LA VISTA A ELENCO: la stessa griglia, una colonna sola e le card basse — più giochi a schermo
   per chi cerca un titolo invece di guardare le figure. Non è un secondo markup: è la stessa
   griglia con una classe sopra. */
/* 🔑 DUE GRIGLIE, UNA REGOLA (05/08). Le due lobby hanno il contenitore con due nomi diversi —
   `.casino-grid` quella di ripiego, `.tb-cas-grid` quella vestita — ma le CARD dentro sono le
   stesse (`.tb-cg`). Scrivere due blocchi uguali con un selettore diverso è il modo in cui due
   pagine che «fanno la stessa cosa» cominciano a non farla più: si elencano i due contenitori
   davanti alla stessa regola, e chi ne aggiunge un terzo lo aggiunge qui. */
.casino-grid.is-elenco,
.tb-cas-grid.is-elenco{grid-template-columns:1fr}
.casino-grid.is-elenco .tb-cg,
.tb-cas-grid.is-elenco .tb-cg{aspect-ratio:auto;min-height:56px;
                              display:flex;align-items:center;gap:10px;padding:6px}
.casino-grid.is-elenco .tb-cg-img,
.tb-cas-grid.is-elenco .tb-cg-img{width:56px;height:56px;object-fit:cover;position:static;flex:none}
.casino-grid.is-elenco .tb-cg-foot,
.tb-cas-grid.is-elenco .tb-cg-foot{position:static;flex:1;min-width:0;text-align:start}
/* Il segnaposto della lobby vestita (la lettera del gioco) è posizionato in assoluto: a elenco
   deve stare nella riga come l'immagine, o la card si accartoccia. */
.tb-cas-grid.is-elenco .tb-cg-ph{position:static;width:56px;height:56px;flex:none;
                                 display:flex;align-items:center;justify-content:center}

/* Il margine dei due blocchi della vetrina, che stava in linea nella pagina (Dav: niente stile
   nella pagina). Una classe, non un attributo: si cambia in un posto per tutte le skin. */
.cas-blocco{margin-block-end:12px}

/* «Mostra altri giochi»: lo accende lo script, quindi senza JavaScript non compare — meglio
   niente che un comando che non risponde. In attesa resta cliccabile ma si spegne un po', così
   si vede che sta lavorando senza saltare la pagina. */
.cb-altri{display:block;width:100%;margin-block-start:10px;padding:10px 14px;
          border-radius:999px;border:1px solid currentColor;background:transparent;
          color:inherit;cursor:pointer;font-size:14px}
.cb-altri--attesa{opacity:.5;pointer-events:none}
/* ⛔ `[hidden]` DEVE VINCERE, e senza questa riga non vinceva: `display:block` qui sopra batte il
   `display:none` che il browser dà a `[hidden]`, quindi un bottone marcato nascosto restava a
   schermo. Due conseguenze vere, misurate su tutt'e due i rami (casa e betslot):
     · finiti i giochi lo script fa `altri.hidden = true` → il bottone resta lì e chi lo preme
       non ottiene niente, che è il difetto da cui veniamo tutto il giorno;
     · senza JavaScript il template lo rende già `hidden` («meglio niente che un comando che non
       risponde», scritto in `casino.html`) — e quella promessa non era mantenuta.
   📌 w-arcanus aveva visto lo stesso incidente dal lato dell'ACCENSIONE e l'ha risolto nello
   script (`altri.hidden = false`, 9d789b675). Questa è l'altra metà: lo SPEGNIMENTO. */
.cb-altri[hidden]{display:none}

/* LO SLIDER DELLA VETRINA: solo la forma, mai i colori (la regola di questo foglio). Una
   diapositiva per volta, le altre spente; senza JavaScript resta la prima — che è un banner, e
   un banner fermo è meglio di una pila di immagini una sotto l'altra. */
.cb-slider{position:relative;overflow:hidden;border-radius:8px}
.cb-slide{display:block}
.cb-slide img{display:block;width:100%;height:auto}
.cb-slide--off{display:none}

/* ⤵︎ LOGHI PROVIDER — blocco GENERATO da `costruisci_loghi_provider`. Non a mano. */
/* Un foglio solo, ritagliato: il logo si accende SOLO se la pagina trova lo slug
   in `casino_svc/loghi_provider.py`, che nasce dallo stesso giro di queste regole.
   Il nome del provider resta SEMPRE nel markup: il logo lo affianca, non lo
   sostituisce — chi legge con la voce, o chi il foglio non lo scarica, legge il nome. */
/* Nessun colore qui: questo foglio è STRUTTURALE e su una pagina vestita
   vincerebbe sul tema del cliente. Il fondo scuro che serve ai marchi bianchi
   è cotto dentro il PNG, dove è parte dell'immagine e non una scelta di stile. */
.cb-logo{display:block;width:128px;height:48px;flex:none;border-radius:6px;background-repeat:no-repeat;background-size:1280px 2000px;background-image:url("/static/player/iconpack/provider/providers-dark.32fd50dbb751.png")}
/* Sprite provider di Jesper (providers-dark.png, 1280x2000, box nativo 128x48) — sostituisce
   loghi-dark.png (05/08): ha piu provider e i loghi giusti. Posizioni SUE, native (niente scaling
   -> nitide). Il nome resta nel DOM (.sr-only). Chi non sta nel suo sprite (es. greentube) e tolto
   dal registro loghi_provider e mostra il NOME, non un logo sbagliato. Chip usa lo stesso box. */
.cb-logo--1x2{background-position:-128px -96px}
.cb-logo--amatic{background-position:-384px 0px}
.cb-logo--aristocrat{background-position:-768px -480px}
.cb-logo--aviator{background-position:0px -528px}
.cb-logo--betsoft{background-position:-256px -48px}
.cb-logo--bgaming{background-position:-256px -144px}
.cb-logo--blueprint{background-position:-768px -192px}
.cb-logo--bomba{background-position:-505px -1247px}
.cb-logo--booongo{background-position:0px -48px}
.cb-logo--btg{background-position:-256px -1336px}
.cb-logo--egt{background-position:-384px -96px}
.cb-logo--evoplay{background-position:-1152px -528px}
.cb-logo--gaminator{background-position:-899px -1249px}
.cb-logo--goldenrace{background-position:-896px -336px}
.cb-logo--habanero{background-position:-640px 0px}
.cb-logo--igrosoft{background-position:-768px -144px}
.cb-logo--igt{background-position:-395px -1336px}
.cb-logo--irondog{background-position:-256px -96px}
.cb-logo--isoftbet{background-position:-640px -48px}
.cb-logo--leap{background-position:-640px -624px}
.cb-logo--merkur{background-position:-768px -288px}
.cb-logo--netent{background-position:0px 0px}
.cb-logo--novomatic{background-position:-384px -192px}
.cb-logo--octavian{background-position:1px -1337px}
.cb-logo--platipus{background-position:-384px -144px}
.cb-logo--playngo{background-position:-128px 0px}
.cb-logo--playson{background-position:-128px -48px}
.cb-logo--playtech{background-position:-512px -192px}
.cb-logo--pragmatic{background-position:-384px -48px}
.cb-logo--pragmaticplaylive{background-position:-384px -432px}
.cb-logo--quickspin{background-position:-512px 0px}
.cb-logo--redrake{background-position:-512px -768px}
.cb-logo--redtiger{background-position:-896px 0px}
.cb-logo--skywind{background-position:-386px -1293px}
.cb-logo--spaceman{background-position:-256px -1294px}
.cb-logo--spinomenal{background-position:-768px -48px}
.cb-logo--yggdrasil{background-position:-256px 0px}
/* Provider aggiunti 05/08 dal CSS completo di Jesper (mancavano nel vecchio sprite; ci sono nel suo). */
.cb-logo--amusnet{background-position:-125px -1383px}
.cb-logo--booming{background-position:-1152px -48px}
.cb-logo--egtdigital{background-position:-123px -1419px}
.cb-logo--evolutionlive{background-position:-1024px 0px}
.cb-logo--greentube{background-position:-1152px -190px}
.cb-logo--jetx{background-position:-388px -1387px}
.cb-logo--netentextreme{background-position:-645px -1387px}
.cb-logo--racing{background-position:-1024px -1388px}
.cb-logo--rocketman{background-position:-766px -1388px}
.cb-logo--virtual{background-position:-892px -1386px}
/* 🔴 I quattro aggiunti da Jesper il 09/08 (foglio buono): riga 34 (y1632), colonne 0-3. Verificato
   ritagliando la cella 128x48: ogni logo è incorniciato pulito, senza sbordare sul vicino. */
.cb-logo--atg{background-position:0px -1632px}
.cb-logo--mobilots{background-position:-128px -1632px}
.cb-logo--stallionbet{background-position:-256px -1632px}
.cb-logo--vivogaminglive{background-position:-384px -1632px}
/* ⤴︎ fine del blocco generato dei loghi provider. */

/* ── L'ICONA DELLA CATEGORIA (Jesper 10/08) ───────────────────────────────────
   Il glifo lo porta il font di Jesper; qui c'e' il POSTO che occupa e la forma neutra del
   ripiego, che deve dire «categoria senza icona» senza dire «guasto»: un cerchietto vuoto della
   stessa famiglia, non un quadratino.
   📌 `aria-hidden` sull'icona: il nome della categoria e' li' accanto ed e' quello che si legge. */
.cat-ico{flex:none;width:18px;height:18px;display:inline-flex;align-items:center;
         justify-content:center;font-size:16px;line-height:1;opacity:.85}
.cat-ico--generica{border:1.5px solid currentColor;border-radius:50%;width:13px;height:13px;
                   opacity:.45}

/* ── IL FONT DELLE ICONE — e la cosa da sapere: NON ci mancava ────────────────
   Lo zip che Jesper ha mandato alle 08:33 contiene `fontNEW.css` + `Linearicons-Free.*`, e il
   font delle icone non c'e'; alle 11:04 ha aggiunto «non ho il woff2». Ma il file NON serviva
   chiederglielo: `icomoon.ttf` sta nel nostro albero dal 07/08, dentro lo specchio del sito
   legacy, ed e' lo STESSO build — non uno somigliante. La prova non e' che i codici esistono
   (due font qualunque possono avere un glifo a \e958): e' che lo specchio porta anche il CSS che
   li ASSEGNA, `sass3/style-prematch3.css`, con le stesse classi `.icon-casino-filter-*` e gli
   stessi codici che ha mandato lui — \e939 sul filtro 0, \e958 sul 16, \e95f sull'11, \e94f sul
   21, \e94c sul 22, \e945 sul -1, \e953 sul 20. Sette su sette.
   👁 E li ho GUARDATI, non solo contati: griglia, slot machine, joypad, gettoni, ruota della
   fortuna, stella, tavolo da roulette. Un codice presente nella mappa non dice che disegno sia.

   ⛔ Percorso: si serve dallo specchio, come gia' fa `tb.css` per Gilroy — stessa cartella,
   stesso `../playersite/…`. Copiarlo in `player/fonts/` avrebbe fatto due copie dello stesso
   font, e fra sei mesi una delle due sarebbe stata quella sbagliata.
   ✅ E ALLE 11:04 IL PACCHETTO E' ARRIVATO («non ho il woff2, ti passo tutti i font che
   usiamo»): dentro c'e' `fonts/icomoon.ttf`, ed e' il NOSTRO byte per byte —
   sha256 6250b9e4…aab3fa su tutt'e due. Non «lo stesso build»: lo stesso file.

   ⚠️ E nello stesso zip ce n'e' un SECONDO che si chiama identico, dentro una cartella che si
   chiama pure `icomoon/` — `fonts/icomoon/fonts/icomoon.ttf`, 4 KB invece di 94. Sembra il posto
   piu' ovvio dove cercarlo ed e' quello sbagliato: ha 13 glifi e **nessuno** degli otto nostri.
   Chi un domani rifa' questo lavoro dallo zip prenda quello SCIOLTO nella radice di `fonts/`.

   ⛔ NIENTE eot/svg: il `@font-face` legacy li elenca, nello specchio non ci sono, e un `src` che
   nomina file inesistenti e' un 404 a ogni pagina. Restano due voci, e tutt'e due esistono.
   📌 IL WOFF2 L'ABBIAMO GENERATO NOI, e va detto perche' NON e' un file di Jesper: nasce da quel
   `icomoon.ttf` (sha256 qui sopra) con fontTools 4.63, ed e' una conversione — stessi 130 glifi,
   stessi disegno per disegno, nessuno perso e nessuno inventato, verificato riaprendolo. 94.740
   byte → 48.824, il 49% in meno su ogni pagina del casino'. La prova
   `test_il_woff2_nasce_da_QUEL_ttf` tiene legate le due cose: se il .ttf cambia, diventa rossa e
   dice di rigenerarlo, invece di lasciar servire un woff2 che non corrisponde piu'.
   ⛔ Famiglia `tb_icone`, NON `ctm_icons`: nello specchio quel nome e' gia' preso da un
   `@font-face` che punta a quattro file che qui non esistono. Stesso nome, due dichiarazioni,
   e chi legge non sa piu' quale vince.
   ⛔ `font-display:block` e non `swap`: con `swap` il browser disegna subito il carattere di
   ripiego, e per un font di ICONE quel ripiego e' il tofu ▯ — un quadratino a fianco di ogni
   voce, che e' esattamente la cosa che il ripiego generico esiste per evitare. */
@font-face{
  font-family:'tb_icone';
  /* il woff2 e' NOSTRO (generato dal ttf qui sotto), il ttf e' l'originale di Jesper: la
     provenienza si legge dal percorso, senza dover aprire un registro. Il woff2 per primo — chi
     lo sa leggere si ferma li' e non scarica i 94 KB; a chi non lo sa leggere resta il ttf. */
  src:url("/static/player/fonts/icomoon.464ab20ef7d2.woff2") format("woff2"),
      url("/static/player/../playersite/assets/global.cdn000.net/css/new/fonts/icomoon.faa8152924ab.ttf") format("truetype");
  font-weight:normal;font-style:normal;font-display:block;
}
.cat-ico[class*="cat-ico--"]:not(.cat-ico--generica)::before{
  font-family:'tb_icone';speak:none;font-style:normal;font-weight:normal;font-variant:normal;
  text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  content:var(--cat-glifo);
}
/* I codici sono di Jesper (08:33), copiati e non scelti. Il nome della classe e' la parola che
   ha usato lui — «slot», «virtual», «crash», «mini» — non un numero: `.icon-casino-filter-16`
   del legacy e' l'id di categoria del VECCHIO sistema, e qui varrebbe come una data sbagliata. */
.cat-ico--tutti{--cat-glifo:"\e939"}
.cat-ico--slot{--cat-glifo:"\e958"}
.cat-ico--virtual{--cat-glifo:"\e95f"}
.cat-ico--crash{--cat-glifo:"\e94f"}
.cat-ico--mini{--cat-glifo:"\e94c"}
/* «instant» arrivata per ultima (14:00), e il codice si conferma da solo: nel CSS legacy \e951 e'
   la classe `.icon-casino-filter-lblInstantWin`. Il nome del glifo dice «instant win». */
.cat-ico--instant{--cat-glifo:"\e951"}
/* Le ULTIME DUE (Jesper, 18:49 e 18:51) — ed erano esattamente le due che la sorveglianza aveva
   segnalato nel registro («la categoria «live» non ha un'icona… chiedere a Jesper quale glifo»).
   Il giro si chiude come era stato disegnato: il codice se ne accorge, lo dice, e la risposta
   arriva.
   ⚠️ E su `\e944` la controprova dei NOMI avrebbe dato un falso allarme: nel CSS legacy quel
   glifo è `.icon-casino-filter-lblDragonTiger`, che con l'ippica non c'entra niente. Ma il
   DISEGNO è una testa di cavallo — guardato a schermo prima di metterlo. Il nome della classe
   legacy mente, il glifo no: e' la ragione per cui questi si guardano e non si contano. */
.cat-ico--live{--cat-glifo:"\e94a"}
.cat-ico--ippica{--cat-glifo:"\e944"}
/* «per il futuro se escono» (Jesper, 08:33): pronte, e oggi nessuna categoria le chiede. Restano
   qui perche' il giorno che una esce bastera' la riga in `_CAT_ICONE`, senza ricercare il codice
   in una chat di un mese fa. */
.cat-ico--consigliati{--cat-glifo:"\e945"}
.cat-ico--megaways{--cat-glifo:"\e953"}

/* ── SOLO LA GRIGLIA SCORRE, CERCA E FILTRI RESTANO A VISTA (Jesper, 10/08 09:55 e 10:14) ──
   *«cerca e filtri restano SEMPRE A VISTA e sotto scorrono solo i giochi»*.

   ⚠️ SOLO DA 900px IN SU, ed e' una scelta, non una dimenticanza. Su schermo stretto una zona che
   scorre dentro una che non scorre e' una trappola: il dito prende la cosa sbagliata, e per
   uscire dal riquadro bisogna indovinare dove appoggiarlo. Sul telefono scorre la pagina, come
   adesso — che li' e' anche il gesto giusto, perche' la testata sparisce e i giochi si prendono
   tutto lo schermo.

   ⛔ E `max-height`, MAI `height`: con tre risultati un'altezza fissa lascerebbe un riquadro
   mezzo vuoto — e succederebbe proprio mentre uno cerca, cioe' nel momento peggiore. Con
   `max-height` la griglia e' alta quanto i giochi che ha, e scorre solo quando serve.

   📌 `overscroll-behavior: contain`: arrivato in fondo alla griglia, la rotella non prosegue
   trascinando la pagina — e' la stessa riga che questo foglio usa gia' per la lista dei provider,
   che e' proprio il comportamento a cui Jesper si e' riferito. */
@media (min-width:900px){
  .cb-giochi .cas-blocco{display:flex;flex-direction:column;min-height:0}
  .cb-giochi .casino-grid{
    max-height:calc(100vh - var(--cb-testa, 210px));
    overflow-y:auto;overscroll-behavior:contain;
    padding-inline-end:4px;   /* la barra di scorrimento non si mangia l'ultima colonna */
  }
  .cb-giochi .casino-grid::-webkit-scrollbar{width:8px}
}

/* Il messaggio di «non ho trovato niente»: e' una FRASE, non un riquadro vuoto che sembra un
   caricamento che non finisce. Vale mentre si scrive, che e' quando capita piu' spesso. */
.cb-vuoto{padding:28px 12px;text-align:center;line-height:1.5}
.cb-vuoto b{display:block;font-size:15px;margin-block-end:4px}
.cb-vuoto span{opacity:.75;font-size:13px}
/* mentre la ricerca e' in volo la griglia si smorza: dice «sto lavorando» senza spostare niente */
.casino-grid.cb-cerca-attesa{opacity:.55;transition:opacity .12s}

/* player/skin_fixes.css */
/* ════════════════════════════════════════════════════════════════════════════
   SKIN FIXES — il file UNICO dei fix CSS di Dav (creato 25/07 su sua istruzione:
   «non inserirlo nella pagina ma crea un css separato con tutti i fix css così
   poi li integriamo nel css globale che useremo per tutte le skin»).

   REGOLE DELLA CASA per questo file:
   - ogni fix nuovo di Dav va QUI, non sparso in altri fogli né inline nelle pagine;
   - niente stili di pagina/feature (quelli hanno i loro fogli): solo i FIX che
     domani confluiranno nel css globale multi-skin;
   - ogni blocco porta data e richiesta, così la fusione nel globale è tracciabile.
   Caricato per ultimo in FOGLI: vince sulla cascata di tema e fogli app.
   ──────────────────────────────────────────────────────────────────────────── */

/* Dav 25/07 08:40 — breadcrumb pagina evento (.box-main--left): font più piccolo,
   una riga con ellissi, come lo screen di riferimento. CSS DETTATO DA DAV, valori
   suoi alla lettera. */
.box-main--left span:not(.mdi) {
  font-size: 11px;
  line-height: 1;
  max-width: 160px;
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}

/* Dav 25/07 08:42 — tab pagina evento: il bordo GIALLO in basso era un nostro
   ::after in live_frame.css (var(--money,#F5B301)) sovrapposto al verde del
   template base. RIMOSSO alla fonte (live_frame.css), non coperto da qui:
   resta solo il verde del template. Questo blocco è solo memoria del fix. */

/* ────────────────────────────────────────────────────────────────────────────
   Dav 25/07 08:20/08:26 (ri-segnalato) — COUPON come il mockup del template:
   font/padding/colori del mockup originale (BET SLIP). Il mockup è una GUIDA:
   qui si riallinea ciò che ESISTE (niente Accumulator/steppers/promo inventati).
   Palette del mockup: etichette blu #1E63A4, valori navy #12314f, chip quota
   azzurra #d9e8f6, CTA verde #8DC63F (come REGISTRATION), ✕ rossa.
   ──────────────────────────────────────────────────────────────────────────── */
/* testata: «COUPON» blu come YOUR BET, contatore blu */
.box-sidebar--coupon .tb-head span{color:#1E63A4;font-size:13px;font-weight:800;letter-spacing:.02em}
.box-sidebar--coupon .tb-head small{color:#1E63A4;opacity:1;font-weight:700;font-size:11.5px}
/* card evento: nome match BLU in evidenza (12.5px), lega piccola, punteggio oro invariato */
.box-sidebar--coupon .cpn-match{font-size:12.5px;color:#1E63A4}
.box-sidebar--coupon .cpn-comp{font-size:10px}
/* riga segno: chip quota AZZURRA con testo blu bold, testo mercato navy, ✕ ROSSA */
.box-sidebar--coupon .cpn-odds{background:#d9e8f6;color:#1E63A4;font-weight:800;font-size:12.5px;
  border-radius:6px;padding:3px 7px}
.box-sidebar--coupon .cpn-leg-txt{font-size:12px;color:#22303f}
.box-sidebar--coupon .cpn-x{color:#e03a2f}
.box-sidebar--coupon .cpn-x:hover{background:rgba(224,58,47,.12);color:#c22315}
.box-sidebar--coupon .cpn-leg form{display:flex}
/* righe quota/importo/vincita: SUL FONDO come il mockup (niente pannello bordato),
   etichetta blu, valore navy bold a destra */
.box-sidebar--coupon .tb-panel{background:transparent;border:0;margin:2px 10px;padding:0}
.box-sidebar--coupon .tb-cp-row{font-size:12.5px;padding:5px 0}
.box-sidebar--coupon .tb-cp-row>:first-child{color:var(--tb-coupon-testo-2,#1E63A4);opacity:1}
.box-sidebar--coupon .tb-cp-row>:last-child{color:var(--tb-coupon-testo,#12314f);font-weight:800}
.box-sidebar--coupon .tb-cp-row.tot>:first-child{color:var(--tb-coupon-testo,#12314f)}
.box-sidebar--coupon .tb-cp-row.tot>:last-child{font-size:13.5px}
/* input importo: bianco, bordo azzurro, testo navy (come Stake Amount) */
.box-sidebar--coupon .tb-amount{background:var(--tb-coupon-rialzo,#fff);
  border:1px solid var(--tb-coupon-bordo,#bcd4ea);border-radius:6px;
  color:var(--tb-coupon-testo,#12314f);font-weight:700;font-size:13px;padding:5px 8px}
/* CTA: SCOMMETTI VERDE pieno come «Place Bet»/«REGISTRATION»; ANNULLA neutro
   azzurrino (nel mockup non esiste un bottone rosso) */
.box-sidebar--coupon .tb-btns .tb-scommetti{background:#8DC63F;color:#fff}
.box-sidebar--coupon .tb-btns .tb-scommetti:hover{background:#7ab829}
.box-sidebar--coupon .tb-btns .tb-annulla{background:var(--tb-coupon-rialzo,#d9e8f6);color:var(--tb-coupon-accento,#1E63A4)}
.box-sidebar--coupon .tb-btns .tb-annulla:hover{background:var(--tb-coupon-hover,#c7dcf0)}
/* STATO VUOTO come il mockup: messaggio in CARD BIANCA centrata */
.box-sidebar--coupon .tb-vuoto{background:var(--tb-coupon-foglio,#fff);border-radius:8px;
  margin:10px;padding:20px 12px;color:var(--tb-coupon-testo-2,#6b86a3);font-size:12.5px;opacity:1}
.box-sidebar--coupon .tb-blocco{background:transparent;margin:0}
/* zona «Save/load events»: titolo-link blu centrato sopra divisore tratteggiato,
   input bianco, Salva VERDE (grigio solo da disabilitato), Carica azzurro */
.box-sidebar--coupon .cpn-code{border-top:1px dashed var(--tb-coupon-bordo,#b7c9db);margin-top:4px;padding-top:8px}
.box-sidebar--coupon .cpn-code-h{text-align:center;color:var(--tb-coupon-accento,#1E63A4);
  font-weight:700;font-size:12px;
  text-decoration:underline;text-underline-offset:2px;text-transform:none;letter-spacing:0}
.box-sidebar--coupon .cpn-code-in{background:var(--tb-coupon-rialzo,#fff);
  border:1px solid var(--tb-coupon-bordo,#bcd4ea);border-radius:6px;
  color:var(--tb-coupon-testo,#12314f);font-size:12.5px}
.box-sidebar--coupon .cpn-save{background:#8DC63F;color:#fff;font-weight:800}
.box-sidebar--coupon .cpn-save:hover{background:#7ab829}
.box-sidebar--coupon .cpn-save:disabled{background:var(--tb-coupon-rialzo,#dbe4ee);color:var(--tb-coupon-testo-2,#93a6bd)}
.box-sidebar--coupon .cpn-load{background:var(--tb-coupon-rialzo,#d9e8f6);color:var(--tb-coupon-accento,#1E63A4);font-weight:800}
.box-sidebar--coupon .cpn-load:hover{background:var(--tb-coupon-hover,#c7dcf0)}
/* micro-classi nate spostando gli style= inline di schedina.html (regola Dav) */
.box-sidebar--coupon .tb-dim{opacity:.6}
.box-sidebar--coupon .tb-val-in{display:inline-flex;align-items:center;gap:4px;justify-content:flex-end}
.box-sidebar--coupon .tb-val-in .tb-amount{max-width:88px}
.box-sidebar--coupon .tb-sys-row.una{grid-template-columns:1fr}
.box-sidebar--coupon .tb-note-pad{padding:0 12px 8px;margin:0}
.box-sidebar--coupon .tb-ta-r{text-align:right}

/* ────────────────────────────────────────────────────────────────────────────
   Dav 25/07 09:05 (ri-segnalato) — HEADER DA LOGGATO come lo screen 2 del mockup.
   Blocco ACCOUNT a due righe (nome utente sopra, saldo+occhio sotto), click sul
   blocco = submenu (Esci sta lì dentro); Deposita = icona «$» del tema; Premi =
   sola icona regalo del tema (ritargata a /player/premios dal wiring). L'EMAIL
   non compare mai nell'header (riservatezza): senza username → «Il mio conto».
   ──────────────────────────────────────────────────────────────────────────── */
/* ⚠️ IL TETTO DEVE COMPRENDERE L'IMBOTTITURA (Dav 27/07, trappola misurata dal vivo: con un
   nome lungo il chip passava da 171px a 212px e spingeva sul resto della testata). Il tetto era
   `max-width:200px` ma `.hu-user` ha `padding:6px 12px`: senza `border-box` i 24px si sommavano
   al tetto invece di starci dentro. E il nome non ha più una misura PROPRIA (erano 150px fissi,
   che con avatar e freccina sfondavano comunque i 200): si stringe fino a quanto gli lascia la
   colonna, e i puntini fanno il resto. Il nome intero resta nel `title` (vedi barra_utility). */
.hu .hu-user{display:flex;align-items:center;gap:7px;box-sizing:border-box;max-width:200px;min-width:0}
.hu .hu-user > .mdi,
.hu .hu-user > .hu-caret{flex:none}     /* avatar e freccina non si schiacciano mai */
.hu .hu-acc-col{display:flex;flex-direction:column;align-items:flex-start;min-width:0;line-height:1.15}
.hu .hu-acc-col .hu-nome{font-weight:800;font-size:12.5px;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* il saldo sotto il nome: cifra piccola + occhio mini, niente sfondo proprio */
.hu .hu-acc-col .hu-saldo{display:inline-flex;align-items:center;gap:4px;background:none;
  border:0;padding:0;margin:0;font-size:11px;opacity:.85}
.hu .hu-acc-col .hu-cifra{font-weight:700;font-variant-numeric:tabular-nums}
.hu .hu-acc-col .hu-eye{padding:0 2px;font-size:11px;line-height:1}
/* l'icona portafoglio accanto all'account (il 💳 del mockup) */
.hu .hu-ic--wallet .mdi{font-size:15px;line-height:1}
/* Angelo 25/07 — ORA DEL SITO nell'header loggato («IT / 02:39» dello screen 2):
   cifre tabellari, un filo a separarla da quello che le sta a sinistra.
   🔴 ELEMENTO SUO, ACCANTO ALLA BANDIERA — non più dentro (Dav 3-d, foto 31/07). Stava in un
   `.hu-ic`: 32px tondi con overflow:hidden, la taglia di UNA icona, e il tondo le tagliava le
   cifre — nella foto si legge un «08» mozzato. `flex:none` perché in una barra stretta l'ora
   non si schiaccia: o si legge intera o non serve. */
.hu .hu-clock{font-variant-numeric:tabular-nums;font-weight:700;font-size:11.5px;opacity:.9;
  flex:none;white-space:nowrap;align-self:center;
  border-left:1px solid rgba(255,255,255,.25);padding-left:6px;margin-left:2px}
/* i vecchi elementi rimossi non esistono più nel markup; qui nessuna regola-zombie. */

/* (spostati da _header_fixes.html — regola «niente <style> nelle pagine») */
/* ⚠️ RICORRENTE (Dav): in HOME niente barra sport-tipo sopra il contenuto. Scoped a
   body--index così non tocca sport/evento dove il carosello serve. */
body.body--index .box-main--typemarket-container{display:none !important}
body.body--index .box-main--top:has(> .box-main--center.box-main--typemarket-container){display:none !important}
/* CASINO: banner tornei/promo demo importati NASCOSTI per ora (Angelo 24/07). REVERSIBILE.
   Dav 25/07: la pagina Promozioni VERA usa il wrapper del tema per farsi vestire — il
   marcatore .tb-promo-vera la salva dallo spegni-demo. */
.casino-promo--carousel{display:none !important}
.casino-promo:not(.tb-promo-vera){display:none !important}

/* ────────────────────────────────────────────────────────────────────────────
   Dav 25/07 09:30 — la strip sport della barra: lo sport ATTIVO porta il bordo
   verde sotto, STESSO effetto dell'hover. Il tema ha GIÀ hover+active nella
   stessa regola, ma poi ANNULLA l'active proprio qui con
   «.tab-item--active:not(:hover){border-color:var(--trasp)}».
   Qui si neutralizza quella riga RIUSANDO la variabile dell'hover del tema:
   misurato dal vivo, su questa strip l'hover rende var(--tertiary-border)
   (#7dac2e, il verde) — NON --secondary-border, che in questo tema è navy.
   Stesso verde per costruzione, nessun secondo verde inventato. */
.box-main--type-c .box-main--wrapper .box-main--middle .tab-items--ctm .tab-item--ctm.tab-item--active:not(:hover){
  border-color:var(--tertiary-border)}

/* Angelo 25/07 — tabellina parziali della testata evento: il wrapper era uno style inline;
   ora è la classe-gancio che lo swap 60s rimpiazza per la colonna del nuovo set. */
.tb-ev-sets-wrap{display:flex;justify-content:center;margin:2px 0 0}

/* ────────────────────────────────────────────────────────────────────────────
   Dav 25/07 10:50 — QUOTA AUMENTATA col design dello screen 2 (mockup LOCALE
   a/live-betting.html): la card è ora `carousel-item` + carousel-item--topinfo/
   match/odds + qt-btn — CLASSI DELLA FAMIGLIA, vestite dal CSS del tema di ogni
   skin. Qui SOLO la colla: striscia scrollabile, frecce, larghezza card, prezzo
   vecchio barrato. (Era il <style> scoped del widget quota_boost: spostato qui,
   regola «niente CSS nelle pagine».) La barra-progresso «1st Half» del mockup
   NON si applica ai boost (nessun dato periodo) — non inventata.
   ──────────────────────────────────────────────────────────────────────────── */
.qbrow{margin:10px auto;max-width:100%;min-width:0;position:relative}
.qbrow-h{display:flex;align-items:center;gap:8px;padding:0 4px 8px;font-weight:900;
  color:#e7edf5;font-size:.95em;letter-spacing:.02em}
.qbrow-h .fire{color:#ff5a3c}
.qbrow-scroll{display:flex;gap:12px;overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth;
  padding:2px 2px 6px;min-width:0;scrollbar-width:thin;-webkit-overflow-scrolling:touch;
  overscroll-behavior-x:contain}
.qbrow-scroll::-webkit-scrollbar{height:6px}
.qbrow-scroll::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25);border-radius:6px}
.qbrow:not(.qb-atend)::after{content:"";position:absolute;top:26px;right:0;bottom:8px;width:38px;
  pointer-events:none;background:linear-gradient(90deg,rgba(11,22,38,0),rgba(11,22,38,.55));z-index:2}
/* la card: GUSCIO BIANCO dello screen 2 (fuori dal carosello del tema le classi
   carousel-item non prendono il fondo: qui la si veste come nel mockup) */
.qbrow .qbcard{flex:0 0 300px;max-width:300px;cursor:pointer;background:#fff;color:#12314f;
  border:1px solid rgba(28,66,103,.14);border-radius:10px;padding:9px 11px 10px;
  box-shadow:0 4px 14px rgba(6,16,30,.25);transition:transform .12s,box-shadow .12s;
  display:flex;flex-direction:column;gap:6px}
.qbrow .qbcard:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(6,16,30,.4)}
.qbrow .qbcard .carousel-item--topinfo{display:flex;align-items:center;gap:7px;
  font-size:11px;font-weight:700;color:#5b7793;text-transform:uppercase;letter-spacing:.03em}
.qbrow .qbcard .carousel-item--topinfo .btn-live--ctm{margin-left:auto}
.qbrow .qbcard .carousel-item--match{display:flex;flex-direction:column;gap:3px;min-height:44px}
.qbrow .qbcard .match-home b{color:#1E63A4;font-size:13px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;display:block}
.qbrow .qb-leg{display:flex;align-items:baseline;gap:5px;font-size:12px;color:#22303f;min-width:0}
.qbrow .qb-leg .mdi{color:#5b7793;font-size:12px}
.qbrow .qb-leg .qb-ev{opacity:.55;font-size:.9em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qbrow .qb-fire{font-size:14px;line-height:1}
.qbrow .qb-orig{opacity:.5;font-weight:600;margin-right:4px}
.qbrow .qb-go{width:100%}
.qbrow-arrow{position:absolute;top:50%;transform:translateY(-6px);z-index:3;width:34px;height:34px;
  border-radius:50%;border:0;background:rgba(11,22,38,.9);color:#fff;font-size:18px;cursor:pointer;
  box-shadow:0 4px 14px rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center}
.qbrow-arrow--l{left:4px}.qbrow-arrow--r{right:4px}
.qbrow-arrow[hidden]{display:none}

/* ────────────────────────────────────────────────────────────────────────────
   Dav 27/07 11:15 — PREMATCH IN EVIDENZA **con lo stesso design di Quota
   Aumentata**: *«puoi farli con lo stesso design del box sotto»*.
   Prima erano riquadri SCURI squadrati appoggiati sul fondo blu: sembravano un
   pezzo della pagina, non degli oggetti. Ora vestono come `.qbcard` — guscio
   BIANCO, angoli arrotondati, ombra, stacco dal fondo.

   🔴 IL PUNTO DELLA CARD è che le due sezioni SI SOMIGLINO: quindi i valori qui
   sotto NON sono scelti da capo, sono gli stessi di `.qbrow .qbcard` (fondo
   #fff, bordo rgba(28,66,103,.14), raggio 10px, ombra 0 4px 14px, il sollevarsi
   di 2px al passaggio). Ogni scostamento sarebbe un errore, non una variante.

   ⚠️ IL FONDO CHIARO CAMBIA IL CONTRASTO: il testo di queste card era scritto
   per fondo scuro (#e7edf5 e opacità basse). Riletto TUTTO, non solo il titolo —
   lega, orario, nomi squadra, nome mercato e i numeri delle quote — sulla stessa
   scala di grigi/blu della card modello (#12314f testo, #5b7793 etichette,
   #1E63A4 il nome squadra come `.match-home b`).

   ⚠️ LE PASTIGLIE DELLE QUOTE restano quelle: stessa struttura, stesso clic,
   stesso stato «selezionato» — che resta `var(--tb-quota-sel)` e NON un blu
   scritto a mano (Dav 27/07: un colore solo per il selezionato). Cambia solo
   ciò che serve per vedersi su bianco: bordo e fondo passano dal bianco
   trasparente al blu trasparente.
   ──────────────────────────────────────────────────────────────────────────── */
.pmrow{margin:10px auto;max-width:100%;min-width:0;position:relative}
.pmrow-h{display:flex;align-items:center;gap:8px;padding:0 4px 8px;font-weight:900;
  color:#e7edf5;font-size:.95em;letter-spacing:.02em}
.pmrow-h .ball{filter:saturate(1.2)}
/* 📌 lo scorrimento resta (Dav: si vede la sesta card tagliata col chevron). Il padding
   verticale è più largo del vecchio: con l'ombra serve spazio, o le ombre si tagliano. */
.pmrow-scroll{display:flex;gap:12px;overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth;
  padding:6px 2px 12px;min-width:0;scrollbar-width:thin;-webkit-overflow-scrolling:touch;
  overscroll-behavior-x:contain}
.pmrow-scroll::-webkit-scrollbar{height:6px}
.pmrow-scroll::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25);border-radius:6px}
.pmrow:not(.pm-atend)::after{content:"";position:absolute;top:26px;right:0;bottom:8px;width:38px;
  pointer-events:none;background:linear-gradient(90deg,rgba(11,22,38,0),rgba(11,22,38,.55));z-index:2}

/* la card: lo stesso guscio bianco di `.qbrow .qbcard` */
.pmcard{flex:0 0 280px;max-width:280px;cursor:pointer;background:#fff;color:#12314f;
  border:1px solid rgba(28,66,103,.14);border-radius:10px;overflow:hidden;
  box-shadow:0 4px 14px rgba(6,16,30,.25);transition:transform .12s,box-shadow .12s}
.pmcard:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(6,16,30,.4)}
/* l'intestazione a pastiglia con l'icona: le stesse misure di `.carousel-item--topinfo` */
.pmcard-h{display:flex;align-items:center;gap:7px;padding:8px 11px;font-size:11px;font-weight:700;
  letter-spacing:.03em;text-transform:uppercase;color:#5b7793;background:rgba(28,66,103,.06);
  border-bottom:1px solid rgba(28,66,103,.10);white-space:nowrap;overflow:hidden}
.pmcard-h img{width:16px;height:12px;object-fit:cover;border-radius:2px;flex:0 0 auto}
.pmcard-h .lg{overflow:hidden;text-overflow:ellipsis}
.pmcard-h .dt{margin-left:auto;flex:0 0 auto;color:#7d93aa;font-variant-numeric:tabular-nums}
.pmcard-b{padding:10px 11px 11px}
.pmcard-team{display:flex;align-items:center;gap:7px;font-weight:800;font-size:13px;
  color:#1E63A4;margin-bottom:4px;min-width:0}
.pmcard-team img{width:16px;height:12px;object-fit:cover;border-radius:2px;flex:0 0 auto}
.pmcard-team .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pmcard-mkt{font-size:11px;color:#5b7793;font-weight:700;margin:7px 0 5px;letter-spacing:.04em;
  text-transform:uppercase}
.pmcard-odds{display:flex;gap:6px}
.pmcard-odd{flex:1 1 0;border:1px solid rgba(28,66,103,.18);border-radius:8px;
  background:rgba(28,66,103,.05);color:#12314f;cursor:pointer;padding:7px 4px 6px;
  text-align:center;transition:background .12s,border-color .12s}
.pmcard-odd:hover{background:color-mix(in srgb, var(--tb-quota-sel) 16%, transparent);
  border-color:color-mix(in srgb, var(--tb-quota-sel) 60%, transparent)}
/* lo stato «selezionato» viene dalla variabile del tema, mai un blu scritto a mano */
.pmcard-odd.on{background:var(--tb-quota-sel);border-color:var(--tb-quota-sel-line);
  color:var(--tb-quota-sel-ink)}
.pmcard-odd .lbl{display:block;font-size:10px;font-weight:700;color:#7d93aa;margin-bottom:2px}
.pmcard-odd.on .lbl{color:inherit;opacity:.85}
.pmcard-odd .val{display:block;font-size:14px;font-weight:900;font-variant-numeric:tabular-nums}
.pmrow-arrow{position:absolute;top:50%;transform:translateY(-6px);z-index:3;width:34px;height:34px;
  border-radius:50%;border:0;background:rgba(11,22,38,.9);color:#fff;font-size:18px;cursor:pointer;
  box-shadow:0 4px 14px rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center}
.pmrow-arrow--l{left:4px}.pmrow-arrow--r{right:4px}
.pmrow-arrow[hidden]{display:none}

/* ═══ CASINÒ a caricamento progressivo (Dav 25/07) — griglia, card, filtri, segnaposto ═══ */
.tb-cas{padding:2px 2px 40px}
.tb-cas-bar{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:center;padding:10px 4px 14px}
.tb-cas-search{position:relative;flex:1 1 220px;min-width:180px}
.tb-cas-search .mdi{position:absolute;left:11px;top:50%;transform:translateY(-50%);opacity:.55;font-size:15px}
.tb-cas-search input{width:100%;box-sizing:border-box;padding:9px 12px 9px 34px;border-radius:999px;
  border:1px solid rgba(128,150,180,.28);background:rgba(255,255,255,.04);color:inherit;font-size:.95em}
.tb-cas-tabs{display:flex;flex-wrap:wrap;gap:6px}
.tb-cas-tab{border:1px solid rgba(128,150,180,.28);background:transparent;color:inherit;cursor:pointer;
  border-radius:999px;padding:6px 14px;font-weight:700;font-size:.85em;transition:all .12s;white-space:nowrap}
.tb-cas-tab:hover{background:rgba(128,150,180,.12)}
.tb-cas-tab.on{background:linear-gradient(135deg,#1c4267,#276aa6);color:#fff;border-color:transparent}
.tb-cas-tab small{opacity:.65;font-weight:600;margin-left:3px}
.tb-cas-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));align-items:start}
@media(max-width:560px){.tb-cas-grid{grid-template-columns:repeat(3,1fr);gap:8px}}
.tb-cg{position:relative;display:block;aspect-ratio:4/3;border-radius:12px;overflow:hidden;
  background:linear-gradient(150deg,#16283e,#0d1826);border:1px solid rgba(255,255,255,.06);
  text-decoration:none;color:#eaf2f8;box-shadow:0 6px 16px rgba(2,10,20,.35);transition:transform .12s,box-shadow .12s}
.tb-cg:hover{transform:translateY(-3px);box-shadow:0 14px 30px rgba(2,10,20,.55)}
/* SEGNAPOSTO: iniziale del nome su fondo tema — visibile finché l'immagine non c'è/carica */
.tb-cg-ph{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:2.4em;font-weight:900;color:rgba(255,255,255,.14);letter-spacing:.02em;
  background:radial-gradient(120% 90% at 50% 0,rgba(39,106,166,.30),transparent 70%)}
.tb-cg-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;z-index:1;background:transparent}
/* ── IL VELO SOTTO IL NOME (Jesper, 10/08 12:33: «le thumbnail non si vedono bene») ────────
   Il velo c'era già, ma il testo cadeva nella sua parte TRASPARENTE. Misurato sulla pagina viva
   a 1440px, prima della correzione:

       card                115px
       velo (.tb-cg-foot)   67px  = 58% della card
       il nome comincia     22px DENTRO il velo, cioè al 33% della sua altezza
       gradiente            da trasparente (0%) a .86 (100%)  →  al 33% l'opacità è ~.28

   Cioè: quasi niente, proprio dove il testo inizia. E il caso peggiore non è un fondo chiaro
   qualunque — è che le slot hanno il PROPRIO titolo stampato dentro l'artwork: «10 Action
   Diamond» finiva sopra la scritta «ACTION DIAMOND» del gioco, e si leggevano due volte le
   stesse parole sovrapposte. Lo scatto di Jesper è esattamente questo.

   👉 La correzione non è alzare l'opacità in fondo (lì era già .86 e bastava): è farla salire
   PRIMA, dove il testo comincia davvero. Le tappe sono scelte sulla misura: al 28% il nome non
   è ancora iniziato e il velo resta leggero, al 62% il nome è dentro e il fondo è pieno.
   ⛔ NON si allunga il velo verso l'alto: coprirebbe l'artwork, che è la cosa che il giocatore
   guarda per riconoscere il gioco. Si copre solo la fascia dove c'è scritto qualcosa.
   📌 E l'ombra sul testo è la SECONDA difesa, non un ornamento: questo foglio le pagine vestite
   non lo caricano (`casino_struttura.css` porta solo struttura, mai colori — è scritto lì), e
   su un tema senza velo l'ombra è l'unica cosa che tiene il nome leggibile. */
.tb-cg-foot{position:absolute;left:0;right:0;bottom:0;z-index:2;padding:22px 8px 7px;
  background:linear-gradient(180deg,transparent 0%,rgba(6,12,22,.45) 28%,
    rgba(6,12,22,.88) 62%,rgba(6,12,22,.95) 100%);display:flex;flex-direction:column;gap:5px}
.tb-cg-name{font-size:.8em;font-weight:700;line-height:1.15;overflow:hidden;text-overflow:ellipsis;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;max-height:2.3em;
  text-shadow:0 1px 3px rgba(2,8,16,.9)}
.tb-cg-prov{text-shadow:0 1px 3px rgba(2,8,16,.9)}
.tb-cg-play{align-self:flex-start;font-size:.68em;font-weight:800;color:#0b1626;
  background:linear-gradient(180deg,#f5b301,#e79a00);border-radius:7px;padding:4px 10px;opacity:0;transition:opacity .12s}
.tb-cg:hover .tb-cg-play,.tb-cg:focus-visible .tb-cg-play{opacity:1}
.tb-cas-empty{padding:30px 12px;text-align:center;opacity:.6}
.tb-cas-more{display:flex;align-items:center;justify-content:center;gap:10px;padding:20px 0 6px}
.tb-cas-more[hidden]{display:none}
.tb-cas-more-btn,#tb-cas-more-btn{border:1px solid rgba(128,150,180,.35);background:rgba(255,255,255,.05);
  color:inherit;cursor:pointer;border-radius:999px;padding:9px 20px;font-weight:700;font-size:.9em}
.tb-cas-more-btn:hover,#tb-cas-more-btn:hover{background:rgba(128,150,180,.15)}
.tb-cas-spin{width:18px;height:18px;border-radius:50%;border:2px solid rgba(128,150,180,.35);
  border-top-color:#f5b301;animation:tbcasspin .7s linear infinite;display:none}
.tb-cas-more.busy .tb-cas-spin{display:inline-block}
.tb-cas-more.busy #tb-cas-more-btn{opacity:.5;pointer-events:none}
@keyframes tbcasspin{to{transform:rotate(360deg)}}

/* ═══ PAGINA PROMOZIONI come mockup (Dav 25/07) — tab, card, countdown, segnaposto ═══ */
.tb-promo{padding:2px 2px 40px}
.tb-promo-tabs{display:flex;gap:8px;justify-content:center;padding:6px 0 18px;border-bottom:1px solid rgba(128,150,180,.18);margin-bottom:18px}
.tb-promo-tab{border:0;background:transparent;color:inherit;cursor:pointer;font-weight:800;font-size:.95em;
  padding:8px 16px;border-radius:999px;opacity:.7;transition:all .12s}
.tb-promo-tab:hover{opacity:1;background:rgba(128,150,180,.10)}
.tb-promo-tab.on{opacity:1;color:#f5b301;box-shadow:inset 0 -2px 0 #f5b301;border-radius:0}
.tb-promo-tab small{opacity:.6;font-weight:600;margin-left:3px}
.tb-promo-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));align-items:start}
.tb-promo-card{position:relative;border-radius:14px;overflow:hidden;background:linear-gradient(160deg,#16283e,#0d1826);
  border:1px solid rgba(255,255,255,.07);box-shadow:0 8px 22px rgba(2,10,20,.4)}
.tb-promo-ph{height:150px;display:flex;align-items:center;justify-content:center;position:relative;
  background:radial-gradient(120% 100% at 50% 0,rgba(39,106,166,.5),#0d1826 72%)}
.tb-promo-ph span{font-size:3.4em;font-weight:900;color:rgba(255,255,255,.22)}
.tb-promo-ph--cup span{font-size:3em;opacity:.85}
.tb-promo-badge{position:absolute;top:10px;right:10px;z-index:2;font-size:.66em;font-weight:900;letter-spacing:.06em;
  text-transform:uppercase;color:#0b1626;background:linear-gradient(180deg,#8ce06b,#4fb52b);border-radius:6px;padding:4px 9px}
.tb-promo-amt{position:absolute;top:130px;left:10px;z-index:2;font-weight:900;font-size:.9em;color:#0b1626;
  background:linear-gradient(180deg,#f5b301,#e79a00);border-radius:7px;padding:4px 11px}
.tb-promo-body{padding:16px 14px 14px}
.tb-promo-title{margin:0 0 6px;font-size:1.02em;font-weight:900;letter-spacing:.02em}
.tb-promo-desc{margin:0 0 12px;font-size:.86em;opacity:.75;line-height:1.45}
.tb-promo-count{margin:0 0 12px}
.tb-promo-count-lab{display:block;font-size:.66em;text-transform:uppercase;letter-spacing:.08em;opacity:.55;font-weight:800;margin-bottom:5px}
.tb-promo-count-v{display:flex;gap:8px;align-items:baseline;font-variant-numeric:tabular-nums}
.tb-promo-count-v b{font-size:1.25em;font-weight:900;background:rgba(255,255,255,.07);border-radius:7px;padding:3px 8px;min-width:34px;text-align:center;display:inline-block}
.tb-promo-count-v i{font-style:normal;font-size:.62em;opacity:.55;font-weight:700;margin-right:4px}
.tb-promo-acts{display:flex;flex-direction:column;gap:8px}
.tb-promo-btn{border:0;cursor:pointer;border-radius:8px;padding:9px 12px;font-weight:800;font-size:.82em;text-align:center}
.tb-promo-btn--more{background:linear-gradient(180deg,#8ce06b,#4fb52b);color:#0b1626}
.tb-promo-btn--more:hover{filter:brightness(1.05)}
.tb-promo-reg{margin-top:8px;font-size:.8em;opacity:.8;line-height:1.5;padding:10px 12px;border-radius:8px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.06)}
.tb-promo-none{grid-column:1/-1;padding:34px 12px;text-align:center;opacity:.6}
/* copertina promo opzionale: se c'è copre il segnaposto; se manca/rompe resta il segnaposto */
.tb-promo-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1}

/* ────────────────────────────────────────────────────────────────────────────
   Dav 25/07 15:18-15:23 — quattro punti riaperti (card «non corrispondono»).
   1) PROMOZIONI: card riallineata alle CLASSI DEL TEMPLATE (casino-promo--item
   del mockup casino-promo.html): il vestito lo dà il CSS del tema; qui solo la
   colla della griglia e il segnaposto per le promo senza immagine. NB: la regola
   sopra che spegne i banner demo colpisce SOLO i wrapper .casino-promo/.--carousel,
   non le card sciolte. */
/* griglia = la variante --grid DEL TEMA (larghezze 25/33/50/100% responsive sue);
   qui solo il wrap di sicurezza se il tema non lo dichiara */
.tb-promo-vera .casino-promo--wrapper{display:flex;flex-wrap:wrap}
/* SEGNAPOSTO promo senza immagine: il tema mette position:absolute su OGNI span dentro
   --img (è pensato per i badge prize/status) e il segnaposto usciva dal flusso facendo
   collassare la card: qui torna in flusso, con la specificità per vincere. */
.tb-promo-vera .casino-promo--item .casino-promo--img .tb-promo-ph{position:static !important;
  display:flex !important;align-items:center;justify-content:center;width:100%;height:150px;
  background:radial-gradient(120% 90% at 50% 0,rgba(39,106,166,.35),rgba(12,26,44,.9));
  border-radius:5px}
.tb-promo-vera .casino-promo--img .tb-promo-ph i{font-style:normal;font-size:2.6em;
  font-weight:900;color:rgba(255,255,255,.35)}
.tb-promo-reg{padding:10px 14px;font-size:12.5px;opacity:.85}

/* 4a) BREADCRUMB EVENTO: la regola dettata da Dav copriva gli <span> — ma nel
   breadcrumb ci sono anche <a> (la lega, la partita) rimasti a 16px («il secondo
   span si vede ancora grande»). STESSI valori dettati, estesi agli anchor. */
.box-main--left a:not(.mdi) {
  font-size: 11px;
  line-height: 1;
  max-width: 160px;
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}

/* 4b) TAB SPORT SULL'EVENTO: aprendo un evento dalla lista (swap parziale) la
   strip sport della home restava sopra il tabellone («le tabs sopra che non
   devono esserci»). Il body porta già tb-su-evento (lo mette _central_swap, anche
   al primo load): qui la strip si spegne — e ricompare tornando alla lista. */
body.tb-su-evento .box-main--sports-tab{display:none !important}

/* Countdown riserva nel dettaglio coupon (A32 26/07): i secondi che restano all'operatore
   per accettare la giocata live — indicazione, mai un esito. */
.tb-refuse-cd { margin-left: 8px; color: #b8860b; font-variant-numeric: tabular-nums; }

/* Countdown riserva nella riga Importo dello slip (A32 26/07): dentro l'etichetta, riga
   stretta — il campo dei soldi NON si comprime mai, semmai si tronca il contatore. */
.tb-cp-row .tb-cd-slot{margin-left:6px;color:#c79212;font-size:11px;font-weight:700;
  font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;max-width:64px;
  display:inline-block;vertical-align:baseline}
.tb-cp-row .tb-cd-slot:empty{display:none}
.tb-cp-row .tb-amount{flex-shrink:0}

/* ────────────────────────────────────────────────────────────────────────────
   26/07 (giro di controllo → card «la scheda sport e la lista non si parlano»):
   la STRIP SPORT DEMO del grafico (Soccer/Basket/Golf/MMA, tutti href="#",
   «Soccer» attivo DI FABBRICA nel markup) conviveva con la strip vera: chi
   guardava credeva il filtro calcio, con la lista mista sotto — e avrebbe
   potuto giocare un altro sport senza accorgersene. Bottoni finti = spenti.
   LA CLASSE, NON L'ESEMPIO: qualunque strip di tab senza NESSUN link vero ai
   filtri (/player/) è demo e sparisce; le strip vere (sport_tabs_box, menu
   sport) hanno sempre href reali e non vengono toccate. */
.tab-items--ctm:not(:has(a[href*="/player/"])){display:none !important}

/* ────────────────────────────────────────────────────────────────────────────
   26/07 URGENTE (card «promesse false al giocatore»): residui di MOCKUP che un
   giocatore CREDE veri. Via dalla vista — la testata regge, sotto c'è il casinò vero.
   Stessa filosofia della strip sport demo qui sopra: si nasconde ciò che è finto.

   1) BANNER-TESTATA del casinò (top-hero--casino): carosello di immagini mockup coi
      bottoni finti «Play Now! / Get Bonus! / Find out more» e la falsa promessa del
      «50% di bonus il martedì». Quel bonus NON esiste (ed è pure in inglese): un
      giocatore che deposita aspettandoselo è un reclamo certo. Nascosto finché non c'è
      lo slot promo VERO (le promozioni esistono nel backoffice).
   2) «SPINO LEAGUE» (casino-promo--carousel): 6 tornei INVENTATI col conto alla rovescia
      che scorre davvero — il pezzo più credibile di tutti. Nessun torneo esiste. Via;
      resta lo spazio per i tornei veri, semmai ci saranno. Nessuna funzione nostra lo usa. */
.top-hero--casino,
.casino-promo--carousel { display: none !important; }

/* ════════════════════════════════════════════════════════════════════════════
   27/07 — Dav, i due difetti della SCHEDA PARTITA.
   ════════════════════════════════════════════════════════════════════════════

   1 · LA QUOTA SELEZIONATA È BLU, E LO STESSO BLU DAPPERTUTTO
   ────────────────────────────────────────────────────────────────────────────
   «Le quote selezionate/attive mettile con il blu, non mischiamo colori». Non era
   un capriccio: misurato prima della modifica, lo stesso stato «questa quota è nel
   coupon» usciva di TRE colori diversi a seconda di dove lo guardavi — azzurro
   slavato con testo bianco nella scheda partita (illeggibile), grigino con testo
   VERDE nell'elenco partite, oro pieno in «Prematch in evidenza».

   IL COLORE NON È SCRITTO NELLE REGOLE: sta nelle variabili qui sotto, una volta.
   Una skin che vuole il suo blu dichiara `--qt-selected` (e la coppia) nel proprio
   foglio o nel <head>. Noi `--qt-selected` non la dichiariamo MAI: così la sua
   vince sempre e tutte le superfici si spostano insieme, che è esattamente ciò che
   scrivere un codice colore a mano impedirebbe. Il ripiego è il blu del prodotto,
   quello che la scheda partita già usa per il selettore delle linee Over/Under.

   ⚠️ L'ORO RESTA IL DENARO (regola della casa): qui cambia solo lo stato
   «selezionato», non gli importi.

   `!important` è necessario: il tema importato si dipinge da solo
   `.qt-box .qt-btn:not(.qt-btn--number).active` (specificità più alta della
   nostra) e arriva da un foglio caricato prima del nostro.

   NON sono quote e restano com'erano: i filtri di data (`.pm-today-opt`,
   `.eg-chip`) e il selettore di linea Over/Under — quelli scelgono cosa guardi,
   non cosa giochi. */
:root{
  --tb-quota-sel:      var(--qt-selected,      #276aa6);
  --tb-quota-sel-ink:  var(--qt-selected-ink,  #ffffff);
  --tb-quota-sel-line: var(--qt-selected-line, #1c4267);
}

/* scheda partita e liste del tema (.qt-btn), dettaglio base (.chip), griglia WIDE
   (.lcw-q), elenco home (.he-od), mercati evento (.evm-od), Prematch in evidenza
   (.pmcard-odd). La vista asiatica usa `.qt-btn` del tema: è già dentro. */
.qt-btn.qt-btn--active,
.qt-btn.active,
.chip.on,
.lcw-q.on,
.he-od.on,
.evm-od.on,
.pmcard-odd.on{
  background:var(--tb-quota-sel) !important;
  background-image:none !important;          /* spegne le vecchie tinte a gradiente */
  border-color:var(--tb-quota-sel-line) !important;
  color:var(--tb-quota-sel-ink) !important;
  box-shadow:inset 0 0 0 1px var(--tb-quota-sel-line) !important;
  outline:none !important;
  font-weight:800;
}
/* nome e valore dentro il bottone: il tema li colora a parte (`.qt-btn.active > span`,
   `> label`), quindi senza questo restavano della tinta di prima sopra il blu */
.qt-btn.qt-btn--active > *,
.qt-btn.active > *,
.chip.on .lbl, .chip.on .px,
.he-od.on *, .evm-od.on *, .pmcard-odd.on *{color:var(--tb-quota-sel-ink) !important}

/* Anche il PASSAGGIO DEL MOUSE su una quota segue lo stesso colore: un alone oro accanto
   a una selezione blu è di nuovo «mischiamo colori». Le altre superfici lo prendono dal
   proprio foglio; «Prematch in evidenza» ha il suo <style> dentro al template — che nel
   corpo della pagina viene DOPO questo foglio — quindi qui serve `!important`. */
.pmcard-odd:not(.on):hover{
  background:color-mix(in srgb, var(--tb-quota-sel) 22%, transparent) !important;
  border-color:color-mix(in srgb, var(--tb-quota-sel) 60%, transparent) !important;
}

/* 2 · IL CENTRO HA UNA PARTITA: VIA I RESTI DELLA VETRINA
   ────────────────────────────────────────────────────────────────────────────
   «Selezionando il menu Under/Over dentro una partita ricompare il menu sport
   bianco in alto» · «vale per QUALSIASI voce nei tabs».

   La causa non è nei tab. Aprendo una partita dalla lista si carica SOLO la colonna
   centrale (`_central_swap`): la scheda entra dentro `.match-list--main` e tutto ciò
   che nella vetrina le sta SOPRA — dentro `.main-container` ma fuori da quel
   riquadro — resta appeso lì. Sono tre blocchi: la barra sport col riquadro bianco
   («Con live streaming» + la strip demo del tema + la ricerca), «Quota aumentata»
   e «Prematch in evidenza». Aprendo la stessa partita per indirizzo diretto non c'è
   nessuno dei tre: la pagina intera non li rende proprio. Quindi qui non si
   inventa una regola nuova, si RIMETTE LA PARITÀ col caricamento pieno.

   Si NASCONDE, non si toglie dal DOM: tornando alla vetrina il caricamento parziale
   rimpiazza solo `.match-list--main`, e ciò che avessimo rimosso non tornerebbe più.
   La classe `tb-su-evento` la mette e la toglie `_central_swap` a ogni cambio di
   centro (anche al primo caricamento), quindi la vetrina resta intera.

   Niente `:has()` qui: verificato dal vivo su questa pagina che una regola
   `:not(:has(...))` presente in questo stesso foglio NON viene applicata dal
   browser (il selettore combacia in JS, ma il motore CSS non la fa vincere). */
body.tb-su-evento .box-main--sports-tab,
body.tb-su-evento .qbrow,
body.tb-su-evento .pmrow,
body.tb-su-evento .carousel-sliderhome,
body.tb-su-evento .carousel-slidermini{display:none !important}

/* ⚖️ IL TAGLIO DA CONFERMARE (A32, 28/07) — la vincita vera PRIMA di giocare.
   Deve saltare all'occhio senza sembrare un errore: è un'informazione, non un rifiuto. Il
   numero vecchio resta barrato accanto al nuovo, così si vede COSA cambia e non solo che
   qualcosa è cambiato. */
.tb-taglio{margin:8px 0;padding:10px 12px;border-radius:10px;
  background:rgba(245,179,1,.10);border:1px solid rgba(245,179,1,.45)}
.tb-taglio-h{font-weight:800;font-size:.86em;color:#F5B301;margin-bottom:6px}
.tb-taglio-riga{font-size:.9em;display:flex;gap:8px;align-items:baseline;margin:2px 0}
.tb-taglio-riga s{opacity:.55}
.tb-taglio-riga b{font-size:1.05em;font-variant-numeric:tabular-nums}
.tb-taglio-perche{font-size:.8em;opacity:.8;margin-top:4px}
.tb-taglio .tb-scommetti{width:100%;margin-top:9px}

