
  :root{
    /* v65 — rosso allineato al brand ufficiale (galathletics.ch: #DB0C1C, era
       #e30613 — differenza impercettibile, ma ora e' LO STESSO rosso del sito
       e della locandina). --giallo e' l'accento raro del brand (#FBDB04): si
       usa nei punti dichiarati dalla sezione v65 in fondo, non e' un colore di
       sistema. --font-display e' il carattere dei TITOLI (Roboto Condensed,
       la firma tipografica del brand): Montserrat resta il font di lavoro. */
    --rosso:#db0c1c;--rosso-d:#b40a17;--navy:#1f1d4d;--giallo:#fbdb04;
    --ink:#15151c;--ink2:#4b4b55;--mut:#7e7e8a;--bg:#f1f1f5;--carta:#ffffff;--linea:#e8e8ef;
    --font-display:"Roboto Condensed","Montserrat","Segoe UI",system-ui,sans-serif;
    --warn:#c2410c;--err:#dc2626;--ok:#128a41;
    --sh-1:0 1px 2px rgba(21,21,40,.05),0 2px 8px rgba(21,21,40,.05);
    --sh-2:0 2px 6px rgba(21,21,40,.07),0 10px 28px rgba(21,21,40,.12);
    --r1:9px;--r2:13px;--panel-w:442px;
    /* v54.1 — ALTEZZA DELLA BARRA DI NAVIGAZIONE, una volta sola.
       Era scritta a mano (52px) in cinque punti: #app, #panelToggle, .lyrDrawer
       e le due correzioni per il cantiere. Il risultato è che quando la barra
       cambia altezza qualcuno resta indietro — ed è successo: sul sito
       -dev la striscia #cantiereBar spinge la nav a 84px, il pannello di destra
       era stato corretto e il cassetto Layer di sinistra no, così copriva metà
       delle voci di menu. Da qui in avanti si corregge `--nav-h` e basta. */
    --nav-h:52px;
  }
  *{margin:0;padding:0;box-sizing:border-box}
  html,body{height:100%;font-family:"Montserrat","Segoe UI",system-ui,sans-serif;color:var(--ink);background:var(--bg)}
  #app{display:flex;height:100%}
  #map{flex:1;background:#232329;min-width:0}
  #panel{width:var(--panel-w);min-width:390px;background:var(--bg);border-left:1px solid var(--linea);display:flex;flex-direction:column;position:relative}
  .sheetGrab{display:none}
  /* v25: maniglia per ridimensionare il pannello in larghezza (solo desktop,
     vedi @media min-width:821px più sotto per i limiti) */
  #panelResizer{display:none}
  @media(min-width:821px){
    #panelResizer{display:block;position:absolute;left:-4px;top:0;bottom:0;width:8px;cursor:col-resize;z-index:50;touch-action:none}
    #panelResizer:hover,#panelResizer.active{background:rgba(227,6,19,.18)}
  }
  /* linguetta per collassare la tabella a destra (come i Livelli) */
  #panelToggle{position:fixed;top:calc(var(--nav-h) + 14px);right:var(--panel-w);z-index:1600;width:24px;height:52px;
    display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;
    background:var(--carta);color:var(--ink);border:1px solid var(--linea);border-right:none;
    border-radius:9px 0 0 9px;box-shadow:var(--sh-2);transition:right .28s cubic-bezier(.22,.9,.3,1)}
  #panelToggle svg{width:17px;height:17px;transition:transform .28s}
  #panelToggle:hover{background:var(--bg)}
  body.panelHidden #panel{display:none}
  body.panelHidden #panelToggle{right:0}
  body.panelHidden #panelToggle svg{transform:rotate(180deg)}
  /* v26: barra per richiudere la testata del pannello (statistiche+avvisi+
     ricerca) e ingrandire la tabella sotto */
  #headCollapse{flex-shrink:0;width:100%;border:none;border-bottom:1px solid var(--linea);
    background:var(--carta);color:var(--mut);font-family:inherit;font-size:10.5px;font-weight:800;
    letter-spacing:.03em;padding:5px 10px;cursor:pointer;text-align:center;transition:background .13s}
  #headCollapse:hover{background:var(--bg);color:var(--ink)}
  #panel.headCollapsed>header{display:none}
  /* durante il trascinamento della maniglia: niente transizione (altrimenti
     la linguetta insegue con ritardo, sembra "a scatti") e blocco la
     selezione del testo sulla pagina */
  body.resizingPanel,body.resizingPanel *{cursor:col-resize!important;user-select:none!important}
  body.resizingPanel #panelToggle{transition:none}
  header{padding:14px 18px 12px;background:var(--carta);border-bottom:1px solid var(--linea);border-top:3px solid var(--rosso)}
  #logo img{display:block;height:44px;width:auto}
  /* `wrap` per l'avviso a tutta larghezza di .statWarn (v55): finché non c'è,
     riga e pastiglia stanno in linea come prima, in tutti i moduli */
  #stats{display:flex;flex-wrap:wrap;gap:10px;margin-top:13px}
  .stat{flex:1;background:var(--bg);border-radius:var(--r1);padding:8px 12px 7px;position:relative;overflow:hidden}
  .stat::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--rosso);opacity:.85}
  .stat b{display:block;font-size:17px;font-weight:800;line-height:1.15;font-variant-numeric:tabular-nums}
  .stat b small{font-size:10px;color:var(--mut);font-weight:700}
  .stat b.err{color:var(--err)}
  .stat b.ok{color:var(--ok)}
  .stat span{font-size:8.5px;color:var(--mut);text-transform:uppercase;letter-spacing:.09em;font-weight:800}
  /* blocco unico dei metri (Striscioni): un solo riquadro a tutta larghezza col
     totale grande e il dettaglio per tratto dentro — stesso schema della card
     della home. Le regole vengono dopo .stat b apposta: stessa specificità,
     vince l'ultima, così i numeri del dettaglio restano piccoli e in riga. */
  #stats .statOne{flex:1 1 100%}
  .statSub{display:flex;flex-wrap:wrap;gap:3px 14px;margin-top:7px;padding-top:6px;border-top:1px solid var(--linea)}
  .statSub i{font-style:normal;display:flex;align-items:baseline;gap:4px;font-size:8.5px;
    color:var(--mut);text-transform:uppercase;letter-spacing:.09em;font-weight:800}
  .statSub em{font-style:normal}
  .statSub b{display:inline;font-size:13px;line-height:1;color:var(--ink);text-transform:none;letter-spacing:0}
  .statSub small{font-size:10px;color:var(--mut);font-weight:700;text-transform:none;letter-spacing:0}
  .statSub i.ok b{color:var(--ok)}
  .statSub i.warn b{color:var(--warn)}
  .statSub i.err b{color:var(--err)}
  #issues{font-size:11px;margin-top:10px;line-height:1.55;max-height:64px;overflow-y:auto}
  #issues .ok{color:var(--ok);font-weight:700}
  #issues .warn{color:var(--warn);font-weight:600}
  #issues .err{color:var(--err);font-weight:600}
  .camLegend{display:flex;align-items:center;gap:5px;font-size:11.5px;color:var(--mut);margin-top:11px}
  .camLegend b{color:var(--ink);font-size:13px}
  .camList{display:flex;flex-direction:column;background:var(--carta);border-radius:var(--r1);overflow:hidden;box-shadow:var(--sh-1)}
  .camRow{display:flex;align-items:center;gap:7px;padding:4px 9px;font-size:11px;cursor:pointer;border-bottom:1px solid var(--bg)}
  .camRow:last-child{border-bottom:none}
  .camRow:hover{background:var(--bg)}
  .camRowId{width:24px;flex:none;font-size:11px}
  .camRowOp{flex:none;max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--mut);font-size:10.5px}
  .camRowNote{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#83838d;font-size:10.5px}
  #bar{display:flex;gap:6px;padding:10px 14px;flex-wrap:wrap;align-items:center;background:var(--carta);border-bottom:1px solid var(--linea)}
  #bar .sep{width:1px;height:20px;background:var(--linea);margin:0 3px}
  #bar button,#bar select{font-size:11px;font-weight:700;font-family:inherit;color:var(--ink);padding:6px 12px;border:1px solid var(--linea);background:var(--carta);cursor:pointer;border-radius:var(--r1);transition:border-color .15s,transform .08s;box-shadow:var(--sh-1)}
  #bar button:hover{border-color:#b9b9c6}
  #bar button:active{transform:translateY(1px)}
  #bar select{max-width:118px}
  #bar button.primary{background:var(--rosso);border-color:var(--rosso);color:#fff}
  #bar button.primary:hover{background:var(--rosso-d)}
  #tabs{display:flex;gap:4px;margin:12px 14px 0;background:#e6e6ec;border-radius:99px;padding:3px;flex-shrink:0}
  #tabs div{flex:1;text-align:center;font-size:11.5px;font-weight:800;padding:7px 0;cursor:pointer;color:var(--mut);border-radius:99px;transition:all .18s ease}
  #tabs div:hover{color:var(--ink)}
  #tabs div.on{color:var(--ink);background:var(--carta);box-shadow:var(--sh-1)}
  .pane{flex:1;overflow-y:auto;padding:10px 14px 18px;display:none}
  .show{display:block!important}
  .row{display:flex;align-items:center;gap:6px;background:var(--carta);border-radius:var(--r1);margin-bottom:4px;padding:6px 9px;font-size:12px;box-shadow:var(--sh-1);transition:box-shadow .15s}
  .row:hover{box-shadow:var(--sh-2)}
  .row.drag{opacity:.35}
  .row .grip{cursor:grab;color:#c6c6cf;user-select:none}
  .row .pos{color:var(--mut);font-size:10px;min-width:56px;font-variant-numeric:tabular-nums}
  .row .nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:text;font-weight:700}
  .row .nm.gr{color:var(--mut);font-style:italic;font-weight:400}
  .row .tt{font-size:10px;color:var(--mut);white-space:nowrap}
  .row input{width:44px;font-size:12px;font-family:inherit;font-weight:600;text-align:right;border:1px solid var(--linea);border-radius:6px;padding:2px 3px}
  .row .bt{border:none;background:none;cursor:pointer;color:#b6b6c2;font-size:12px;padding:0 1px;transition:color .12s}
  .row .bt:hover{color:var(--ink)}
  .bt.loc{font-size:11px}
  .row.dragover,.bhdr.dragover{outline:2px dashed var(--rosso);outline-offset:-2px}
  .bhdr{display:flex;align-items:center;gap:8px;background:var(--carta);border-radius:var(--r1);margin:14px 0 5px;padding:8px 10px;font-size:11.5px;cursor:grab;user-select:none;box-shadow:var(--sh-1)}
  .bhdr .n{border-radius:6px;padding:3px 10px;font-weight:800;font-size:13.5px;color:#fff;letter-spacing:.01em}
  .bhdr .z{flex:1;color:var(--mut);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .bhdr .btot{font-weight:800;font-size:13px;font-variant-numeric:tabular-nums}
  .bhdr .btot.bad{color:var(--err)}
  .bhdr .grip{color:#c6c6cf}
  .stc{font-size:9px;font-weight:800;padding:2px 8px;border-radius:99px;cursor:pointer;white-space:nowrap;border:1px solid transparent}
  .stc:hover{border-color:currentColor}
  #seqstat{font-size:10.5px;margin:2px 0 6px;display:flex;gap:6px;flex-wrap:wrap;align-items:center}
  #add{width:100%;margin-top:10px;font-size:12px;font-weight:700;font-family:inherit;padding:9px;border:1.5px dashed #c9c9d4;color:var(--mut);background:none;cursor:pointer;border-radius:var(--r1);transition:all .15s}
  #add:hover{border-color:var(--rosso);color:var(--rosso);background:#fff}
  .b25{background:var(--carta);border-radius:var(--r1);margin-bottom:8px;padding:9px 12px;font-size:12px;box-shadow:var(--sh-1)}
  .b25 h3{font-size:12px;display:flex;gap:8px;align-items:baseline}
  .b25 h3 .n{color:#fff;border-radius:6px;padding:1px 8px}
  .b25 h3 .z{color:var(--mut);font-weight:600;font-size:11px;flex:1}
  .b25 .it{display:flex;justify-content:space-between;border-top:1px solid var(--bg);padding:3px 0}
  .split{color:var(--err);font-weight:800}
  .gap{color:var(--warn)}
  em{color:var(--mut)}
  table{width:100%;border-collapse:collapse;font-size:12px;background:var(--carta);border-radius:var(--r1);overflow:hidden;box-shadow:var(--sh-1)}
  th{text-align:left;padding:8px 9px;font-size:9px;text-transform:uppercase;letter-spacing:.07em;color:var(--mut);font-weight:800;border-bottom:1px solid var(--linea)}
  /* v25: tabelle a colonne ridimensionabili (tab Totali sponsor) — solo qui
     serve table-layout:fixed perché lo scostamento della maniglia sposti
     davvero la larghezza della colonna e non venga riassorbito dal contenuto */
  table.resizableCols{table-layout:fixed}
  table.resizableCols th{position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .colResizer{position:absolute;right:-3px;top:0;bottom:0;width:6px;cursor:col-resize;z-index:2}
  .colResizer:hover,.colResizer:active{background:rgba(227,6,19,.25)}
  td{border-bottom:1px solid var(--bg);padding:5px 9px}
  td.num{text-align:right;font-variant-numeric:tabular-nums}
  tr.diff td{color:var(--err);font-weight:700}
  tr.locRow{cursor:pointer}
  tr.locRow:hover td{background:#fafafc}
  #camReset{margin-top:10px;font-size:12px;font-weight:700;font-family:inherit;padding:8px 15px;border:1px solid var(--linea);background:var(--carta);border-radius:99px;cursor:pointer;box-shadow:var(--sh-1)}
  #camReset:hover{border-color:var(--ink)}
  #alert{position:absolute;top:12px;left:50%;transform:translateX(-50%);z-index:1000;background:#fff;border-left:4px solid var(--warn);box-shadow:var(--sh-2);padding:8px 12px;font-size:12px;border-radius:10px;display:none;max-width:420px}
  #toasts{position:absolute;left:12px;bottom:26px;z-index:1200;display:flex;flex-direction:column;gap:6px;max-width:400px;pointer-events:none}
  .toast{background:#fff;border-left:4px solid var(--navy);border-radius:10px;box-shadow:var(--sh-2);padding:8px 12px;font-size:12px;line-height:1.45;animation:tin .18s}
  .toast.ok{border-left-color:var(--ok)}
  .toast.warn{border-left-color:var(--warn)}
  .toast.err{border-left-color:var(--err)}
  @keyframes tin{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
  #dragTip{position:absolute;z-index:1100;background:var(--ink);color:#fff;font-size:11.5px;padding:4px 10px;border-radius:99px;pointer-events:none;display:none;white-space:nowrap;box-shadow:var(--sh-2)}
  #brandChip{position:absolute;right:12px;bottom:26px;z-index:900;background:rgba(255,255,255,.92);border-radius:99px;padding:4px 12px;font-size:10px;font-weight:800;color:var(--ink);box-shadow:var(--sh-1);pointer-events:none;letter-spacing:.02em}
  #brandChip b{color:var(--rosso)}
  /* Selettore doppio e non `.lbl` da solo: Leaflet mette sull'elemento ANCHE
     la classe `leaflet-tooltip`, la cui regola più sotto ha la stessa
     specificità e viene dopo — vinceva lei, e il peso 800 dichiarato qui
     valeva in realtà 600 (tornava 800 solo in stampa, dov'è !important). */
  /* `--mtx` (v54.1): il fattore che lega il corpo delle scritte allo zoom, uno
     per tutte le famiglie di etichette — lo scrive `applyMapTxt` in common.js
     su ogni `zoomend`. In stampa non conta: là i corpi sono dichiarati a mano
     con più specificità (e `!important`), perché il foglio ha una sua scala. */
  /* v58.2 — la pastiglia si e' ALLEGGERITA: peso 700 invece di 800, bordo piu'
     chiaro, ombra quasi tolta. Su una mappa con cinquanta scritte l'inchiostro
     delle etichette copriva il disegno che dovevano descrivere — e su un piano
     dello stadio la cosa da guardare e' il piano. Forma, font e colore restano
     quelli (identita' invariata): cambia solo quanto pesano. */
  /* v62.5 — `--lsz` e' la grandezza della SINGOLA scritta (f.s.ls, o quella
     della vista): un FATTORE, non un corpo. Moltiplica il corpo di base, che a
     schermo segue gia' lo zoom con `--mtx` e in stampa e' l'altezza scelta nel
     dialogo — cosi' una scritta rimpicciolita resta un gradino sotto le altre
     ovunque, invece di scollegarsi da loro. */
  .leaflet-tooltip.lbl{background:rgba(255,255,255,.92);border:1px solid #b4b4be;border-radius:5px;padding:0 5px;font-size:calc(10px * var(--mtx,1) * var(--lsz,1));font-weight:700;color:var(--ink);white-space:nowrap;box-shadow:0 1px 2px rgba(0,0,0,.14)}
  /* v26: pastiglia col numero del blocco al centro del blocco (livello Livelli) */
  .blklbl{transform:translate(-50%,-50%);display:inline-block;color:#fff;font-family:Montserrat,sans-serif;font-weight:800;font-size:calc(13px * var(--mtx,1));line-height:1;padding:3px 8px;border-radius:99px;border:2px solid #fff;box-shadow:0 1px 5px rgba(0,0,0,.5);white-space:nowrap}
  body.printing .blklbl{font-size:15px}
  .leaflet-tooltip.lbl::before{display:none}
  /* i nomi dei singoli elementi del piano si ritirano sotto la soglia comune,
     come quelli di striscioni e villaggio. In stampa mai: là l'inquadratura è
     decisa dal foglio, non dallo zoom di schermo, e una scritta che sparisce
     dal PDF perché la mappa era larga sarebbe una sorpresa */
  body.lblFar:not(.printing) .plbl{display:none}
  .leaflet-interactive{cursor:grab}
  .locateFlash{animation:locFlash .35s ease-in-out 3}
  @keyframes locFlash{50%{stroke-width:16px}}
  .warnic{display:flex;align-items:center;justify-content:center;width:26px;height:26px;font-size:19px;filter:drop-shadow(0 1px 3px rgba(0,0,0,.6));animation:wpulse 1.2s ease-in-out 6}
  @keyframes wpulse{50%{transform:scale(1.25)}}
  .camic{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;color:#fff;font-family:Montserrat,sans-serif;font-weight:800;font-size:10.5px;border:2px solid #fff;box-shadow:0 1px 6px rgba(0,0,0,.5);cursor:grab}
  .camwrap{position:relative;width:26px;height:26px}
  .camwrap .camic{position:absolute;inset:0}
  .camptr{position:absolute;inset:0;pointer-events:none;transform-origin:center}
  .camptr i{position:absolute;left:50%;top:-10px;margin-left:-6px;width:0;height:0;display:block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:10px solid #16161c;filter:drop-shadow(0 1px 1px rgba(0,0,0,.45))}
  .camptr-drag{cursor:grab;touch-action:none}
  .camptr-drag:active{cursor:grabbing}
  .camptr-drag::before{content:'';position:absolute;left:50%;top:-10px;width:22px;height:22px;margin:-11px 0 0 -11px;border-radius:50%;pointer-events:auto}
  .entic{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;color:#fff;font-family:Montserrat,sans-serif;font-weight:800;font-size:11px;border:2px solid #fff;box-shadow:0 1px 5px rgba(0,0,0,.5)}
  .srvic{display:inline-block;padding:1px 7px;border-radius:99px;color:#fff;font-family:Montserrat,sans-serif;font-weight:700;font-size:9.5px;border:1.5px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.45);white-space:nowrap;transform:translate(-50%,-50%)}
  .leaflet-bar{border:none!important;box-shadow:var(--sh-2)!important;border-radius:10px!important;overflow:hidden}
  .leaflet-bar a{width:32px!important;height:32px!important;line-height:32px!important;color:var(--ink)!important;font-weight:700;border-bottom:1px solid var(--linea)!important}
  .leaflet-bar a:last-child{border-bottom:none!important}
  /* v54.3 — «torna alla vista d'insieme»: il glifo ⤢ nasce piccolo accanto al
     +/- dello zoom, che sono caratteri di testo. Nient'altro: essendo un
     .leaflet-bar eredita misure, ombra e sparizione in stampa. */
  .mapAllBtn a{font-size:17px;text-align:center}
  .leaflet-control-scale-line{background:rgba(255,255,255,.85)!important;border:none!important;border-radius:5px;box-shadow:var(--sh-1);font-family:Montserrat,sans-serif;font-size:9px!important;font-weight:700;color:var(--ink);padding:2px 6px!important}
  .leaflet-popup-content-wrapper{border-radius:12px!important;box-shadow:var(--sh-2)!important;font-family:Montserrat,sans-serif}
  .leaflet-popup-content{font-size:12px!important;line-height:1.55!important;margin:12px 15px!important}
  /* v53: popup dei layer di riferimento — dice cos'è la forma e porta al modulo
     dove si modifica (qui sono di sola lettura) */
  .refPop>b{font-size:12.5px;display:block}
  .refPop .refR{font-size:11.5px;color:var(--mut)}
  .refGo{display:inline-block;margin-top:7px;padding:5px 9px;border-radius:8px;background:var(--rosso);color:#fff;
    text-decoration:none;font-size:11px;font-weight:700}
  .refGo b{font-weight:800}
  .refGo:hover{filter:brightness(1.08)}
  .popEdit{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:9px;padding-top:9px;border-top:1px solid var(--linea)}
  .popEL{display:inline-flex;align-items:center;font-size:11px;font-weight:800;color:var(--mut)}
  .popER{display:inline-flex;align-items:center;gap:5px}
  .popER input{width:52px;font-family:inherit;font-size:12px;font-weight:700;text-align:right;border:1px solid var(--linea);border-radius:7px;padding:4px 6px;background:var(--carta)}
  .popER input:focus{border-color:var(--rosso);outline:none}
  .popU{font-size:11px;font-weight:700;color:var(--mut)}
  .popRm{font-family:inherit;font-size:12px;font-weight:800;color:#fff;background:var(--rosso);border:none;border-radius:99px;padding:4px 9px;cursor:pointer;line-height:1}
  .popRm:hover{background:var(--rosso-d)}
  .leaflet-tooltip{font-family:Montserrat,sans-serif;font-weight:600;border-radius:7px;box-shadow:var(--sh-1)}
  .leaflet-container{font-family:Montserrat,sans-serif!important}
  .lyrPanel{background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-2);font-family:Montserrat,sans-serif;color:var(--ink);min-width:176px;overflow:hidden}
  .lyrHead{padding:9px 13px;font-weight:800;font-size:12px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:10px}
  .lyrHead .lyrCar{color:var(--mut);transition:transform .18s}
  .lyrPanel.closed .lyrHead .lyrCar{transform:rotate(-90deg)}
  .lyrPanel:not(.closed) .lyrHead{border-bottom:1px solid var(--linea)}
  .lyrBody{padding:4px 13px 11px;max-height:64vh;overflow-y:auto}
  .lyrPanel.closed .lyrBody{display:none}
  .lyrSec{font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);font-weight:800;margin:9px 0 3px}
  .lyrSec .lyrMaster{display:flex;align-items:center;gap:6px;text-transform:uppercase;cursor:pointer;font-size:8.5px!important;letter-spacing:.1em;color:var(--mut)}
  .lyrBody label{display:flex;align-items:center;gap:6px;padding:3px 0;cursor:pointer;font-weight:600;font-size:11.5px}
  .lyrBody label.sub{margin-left:6px}
  .lyrBody input[type=checkbox],.lyrBody input[type=radio]{accent-color:var(--rosso);margin:0}
  .ldot{width:9px;height:9px;border-radius:3px;flex-shrink:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.12)}
  .lyrOp{margin:0 0 3px 21px;display:none}
  .lyrOp.on{display:block}
  .lyrOp input[type=range]{width:112px;accent-color:var(--rosso)}
  .lyrOp label{font-size:10.5px!important;font-weight:600}
  /* --- v53: riga di modulo col collegamento alla sua pagina (opt-in cfg.links).
     Il ↗ sta FUORI dalla <label>, o un clic sul link accenderebbe anche il layer. */
  .lyrRow{display:flex;align-items:center;gap:4px}
  .lyrRow>label{flex:1;min-width:0}
  .lyrGo{text-decoration:none;color:var(--mut);font-size:12px;line-height:1;padding:3px 4px;border-radius:6px;flex-shrink:0}
  .lyrGo:hover{background:var(--bg);color:var(--rosso)}
  /* --- v53: pannello Layer come CASSETTO a scomparsa (opt-in cfg.drawer, oggi
     solo il Generale stadio) — è lo SPECCHIO del pannello destro: scorre dentro
     e fuori dal bordo e porta con sé la stessa linguetta col chevron di
     #panelToggle. Vive in <body>, non fra i control Leaflet (v. common.js).
     Aprendosi NON copre la barra strumenti: la fa scorrere di lato. */
  /* --lyr-tab = larghezza della linguetta. La colonna dei control Leaflet deve
     scorrere di TUTTO il cassetto PIÙ la linguetta: la linguetta sporge a
     left:100%, quindi con il solo --lyr-w finiva sopra l'angolo dei comandi di
     zoom (misurati 5px di sovrapposizione, col chevron cliccabile al posto del
     «+»). Vale per ogni modulo che usa il cassetto. */
  :root{--lyr-w:238px;--lyr-tab:24px}
  .lyrDrawer{position:fixed;left:0;top:var(--nav-h);bottom:0;width:var(--lyr-w);z-index:1600;
    border-radius:0;border-right:1px solid var(--linea);min-width:0;overflow:visible;
    transition:transform .28s cubic-bezier(.22,.9,.3,1)}
  .lyrDrawer.closed{transform:translateX(-100%)}
  .lyrDrawer .lyrHead{display:flex}
  .lyrDrawer .lyrBody{max-height:none;height:calc(100% - 38px);overflow-y:auto}
  /* stessa misura e stesso disegno di #panelToggle, sul lato opposto */
  .lyrTab{position:absolute;left:100%;top:14px;width:24px;height:52px;
    display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;
    background:var(--carta);color:var(--ink);border:1px solid var(--linea);border-left:none;
    border-radius:0 9px 9px 0;box-shadow:var(--sh-2)}
  .lyrTab svg{width:17px;height:17px;transition:transform .28s}
  .lyrTab:hover{background:var(--bg)}
  .lyrDrawer:not(.closed) .lyrTab svg{transform:rotate(180deg)}
  /* v55 — la barra delle ZONE PASS (.pzones/.pzTit/.pzC, v54.1) è stata tolta:
     era un attrezzo sempre acceso in un angolo della mappa, e per giunta finiva
     stampata sul foglio. La zona si assegna dalla scheda dell'elemento e dal
     badge dell'albero. Con lei se ne va anche il caso, sempre dichiarato ma mai
     bello, del cassetto aperto sotto i ~500px di viewport. */
  /* la colonna dei control Leaflet (zoom + barra strumenti) si sposta con il
     cassetto, così resta raggiungibile anche a cassetto aperto */
  .page-planimetria .leaflet-top.leaflet-left,
  .page-elettrico .leaflet-top.leaflet-left{transition:transform .28s cubic-bezier(.22,.9,.3,1)}
  body.lyrOpen .leaflet-top.leaflet-left{transform:translateX(calc(var(--lyr-w) + var(--lyr-tab)))}
  /* v57 — il bottone del PIANO INTERNO DELLA TRIBUNA, in alto a destra sulla
     mappa. Non e' un control Leaflet, e non per gusto: in questo portale `#map`
     non e' posizionato, quindi il livello dei control si dispone sul VIEWPORT e
     non sulla mappa (misurato: la colonna `topleft` sta a 10,10, sotto la barra
     del cantiere). Vive in <body> come #panelToggle, di cui segue --nav-h,
     l'altezza e lo scorrimento con --panel-w. Sta 34px piu' a sinistra della
     linguetta (24 di linguetta + 10 di respiro), o le finirebbe sotto: quella
     ha z-index 1600 come lui. */
  /* v58.1 — i bottoni stanno in un CONTENITORE: la larghezza di «Interno
     tribuna» dipende dal testo, quindi un secondo bottone posizionato con un
     `right:` calcolato a mano gli finirebbe sopra. Il contenitore porta la
     posizione e la transizione, i bottoni solo l'aspetto. */
  #mapBtns{position:fixed;top:calc(var(--nav-h) + 14px);right:calc(var(--panel-w) + 34px);z-index:1600;
    display:flex;gap:8px;align-items:flex-start;
    transition:right .28s cubic-bezier(.22,.9,.3,1)}
  #mapBtns>button{height:34px;display:flex;align-items:center;justify-content:center;padding:0 12px;cursor:pointer;
    background:var(--carta);color:var(--ink);border:1px solid var(--linea);border-radius:10px;
    font-family:inherit;font-size:11.5px;font-weight:800;line-height:1;white-space:nowrap;
    box-shadow:var(--sh-2)}
  #mapBtns>button:hover{background:var(--bg)}
  /* v62.2 — una VISTA attiva mostra il piano a meta': il bottone deve dirlo da
     solo, come il badge rosso dei filtri. Il nome puo' essere lungo («Solo
     «Ristorazione», coi nomi»), quindi si tronca invece di spingere fuori
     schermo gli altri bottoni. */
  #mapBtns>button.on{background:var(--rosso);color:#fff;border-color:var(--rosso);
    max-width:230px;overflow:hidden;text-overflow:ellipsis;display:block;line-height:32px}
  #mapBtns>button.on:hover{background:var(--rosso);filter:brightness(1.08)}
  body.panelHidden #mapBtns{right:34px}
  /* il badge del filtro attivo: un numero rosso, o un filtro dimenticato
     diventa una pianta a cui manca un pezzo consegnata senza dirlo */
  #filtBtn.on{border-color:var(--rosso);color:var(--rosso)}
  #filtBtn.on::after{content:attr(data-n);margin-left:6px;background:var(--rosso);color:#fff;
    border-radius:9px;padding:1px 6px;font-size:10px;font-weight:800}
  /* il pannello: stessa ancora dei bottoni (--panel-w e --nav-h), così scorre
     con loro senza una riga di JS che lo riposizioni. `.cbPick` gli dà
     position:fixed, lo scroll interno e la soppressione in stampa. */
  .filtBox{top:calc(var(--nav-h) + 56px)!important;right:calc(var(--panel-w) + 34px)!important;left:auto!important;
    width:280px;max-width:calc(100vw - 20px);z-index:1600;padding:0;
    transition:right .28s cubic-bezier(.22,.9,.3,1)}
  body.panelHidden .filtBox{right:34px!important}
  .filtHd{display:flex;align-items:center;gap:6px;padding:8px 10px;border-bottom:1px solid var(--linea);
    position:sticky;top:0;background:var(--carta);border-radius:12px 12px 0 0}
  .filtHd b{flex:1;font-size:12px}
  .filtHd button{background:var(--bg);border:1px solid var(--linea);border-radius:7px;padding:3px 8px;
    font-family:inherit;font-size:10.5px;font-weight:700;cursor:pointer;color:var(--ink2)}
  .filtHd button:hover{background:var(--carta);color:var(--ink)}
  .filtHd .filtX{padding:3px 7px}
  .filtBody{padding:4px 0}
  .filtGrp{padding:6px 10px 2px;font-size:10px;font-weight:800;letter-spacing:.04em;
    text-transform:uppercase;color:var(--ink2)}
  .filtRow{display:flex;align-items:center;gap:6px;padding:3px 10px;min-height:26px}
  .filtRow.off .filtNm,.filtRow.off .filtCn{opacity:.45;text-decoration:line-through}
  .filtExp{width:16px;flex:none;background:none;border:0;padding:0;cursor:pointer;color:var(--ink2);font-size:10px}
  .filtSw{width:9px;height:9px;flex:none;border-radius:3px}
  .filtNm{flex:1;font-size:11.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .filtCn{font-size:10px;color:var(--ink2);font-variant-numeric:tabular-nums}
  .filtCk{flex:none;cursor:pointer;font-size:11px;display:flex;align-items:center;gap:3px}
  .filtSub{padding:2px 10px 6px 32px;display:flex;flex-direction:column;gap:2px}
  .filtSub label{display:flex;align-items:center;gap:5px;font-size:11px;cursor:pointer;color:var(--ink2)}
  .filtSub label.off{opacity:.45}
  .filtSub label b{margin-left:auto;font-variant-numeric:tabular-nums;font-size:10px}
  .filtFoot{display:flex;align-items:center;gap:8px;padding:8px 10px;border-top:1px solid var(--linea);
    font-size:11px;color:var(--ink2)}
  .filtFoot button{margin-left:auto;background:var(--bg);border:1px solid var(--linea);border-radius:7px;
    padding:4px 9px;font-family:inherit;font-size:10.5px;font-weight:700;cursor:pointer;color:var(--rosso)}
  /* dialogo stampa NON bloccante: pannello ancorato a destra, la mappa resta
     navigabile sotto (serve per la cornice-foglio live stile map.geo.ti.ch) */
  #printDlg{position:fixed;top:10px;right:10px;bottom:10px;z-index:3000;pointer-events:none;display:flex;align-items:flex-start}
  #printDlg[hidden]{display:none}
  #printDlg .pcard{pointer-events:auto;background:var(--carta);border-radius:16px;box-shadow:var(--sh-2);padding:18px 20px;width:430px;max-width:92vw;max-height:100%;overflow:auto}
  #printDlg .psec{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);border-top:1px solid var(--linea);padding-top:12px;margin-top:12px}
  #pObsTxt{width:100%;font-family:inherit;font-size:11.5px;font-weight:600;border:1px solid var(--linea);border-radius:9px;padding:7px 9px;resize:vertical;margin:2px 0 4px;background:var(--bg)}
  #pObsTxt:focus{outline:none;border-color:var(--ink);background:#fff}
  /* freccia nord: in basso a destra DENTRO il riquadro del disegno, ruotata
     come il foglio. Era position:fixed, quindi si ripeteva su ogni pagina —
     anche sopra l'elenco stand della seconda. */
  #pNorth{display:none;position:absolute;right:6mm;bottom:6mm;width:34px;z-index:4000}
  /* barra di scala del foglio (v44): la larghezza in mm la scrive il JS a
     partire dalla scala vera, quindi misurandola col righello torna */
  #pScaleBar{display:none;position:absolute;left:6mm;bottom:6mm;z-index:4000;align-items:center;gap:5px;
    background:rgba(255,255,255,.88);border-radius:4px;padding:3px 6px}
  #pScaleBar i{display:block;height:4px;background:#16161c;border:1px solid #16161c;
    border-top-color:transparent;box-shadow:inset 0 -4px 0 0 #16161c}
  #pScaleBar b{font-family:Montserrat,sans-serif;font-size:9px;font-weight:800;color:#16161c;white-space:nowrap}
  #pScaleBar em{font-family:Montserrat,sans-serif;font-size:7px;font-style:normal;font-weight:600;color:#5a5a64;white-space:nowrap;margin-left:3px}
  #pNorth svg{width:100%;display:block;filter:drop-shadow(0 1px 2px rgba(0,0,0,.35))}
  /* legenda zone pass (solo in stampa): sopra la barra di scala, stesso angolo.
     Bordo, non fondo colorato: sopravvive a «Grafica di sfondo» disattivata */
  #passLeg{display:none;position:absolute;left:6mm;bottom:13mm;z-index:4000;background:rgba(255,255,255,.92);
    border:1.5px solid #16161c;border-radius:6px;padding:6px 10px 7px;font-family:Montserrat,sans-serif}
  #passLeg .plgTit{display:block;font-size:8.5px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:#16161c;margin-bottom:4px}
  #passLeg .plgRow{display:flex;align-items:center;gap:6px;margin-top:2px}
  #passLeg .plgRow>span:last-child{font-size:8.5px;font-weight:700;color:#16161c;white-space:nowrap}
  #passLeg .pzB{width:15px;height:15px;font-size:9px;border-width:1.5px;flex:none}
  #printDlg h3{font-size:16px;font-weight:800;margin-bottom:2px}
  #printDlg .psub{font-size:11px;color:var(--mut);margin-bottom:14px}
  .popt{display:block;width:100%;text-align:left;background:var(--bg);border:1.5px solid transparent;border-radius:12px;padding:11px 14px;margin-bottom:8px;cursor:pointer;font-family:inherit;transition:all .15s}
  .popt:hover{border-color:var(--rosso);background:#fff;box-shadow:var(--sh-1)}
  .popt b{display:block;font-size:13px;font-weight:800}
  .popt span{font-size:11px;color:var(--mut)}
  .pchk{display:flex;align-items:center;gap:7px;font-size:11.5px;font-weight:600;margin:10px 0 14px;cursor:pointer}
  .pchk input{accent-color:var(--rosso)}
  /* v58 — VISTE DI STAMPA e riquadro «Cosa si stampa».
     Il dialogo è largo 430px e alto quanto lo schermo: l'elenco delle
     categorie, con le tipologie aperte, sarebbe più alto del dialogo intero e
     spingerebbe fuori formato, scala e il bottone Stampa. Quindi scorre lui
     (max-height + overflow), come le righe `lst` di #pprops. */
  .pVista[hidden],.pCont[hidden]{display:none}
  .pVistaBar{display:flex;align-items:center;gap:7px;margin-bottom:12px}
  .pVistaBar>b{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);flex:none}
  #pVistaSel{flex:1;min-width:0;font-family:inherit;font-size:11.5px;font-weight:700;padding:6px 8px;
    border:1px solid var(--linea);border-radius:9px;background:var(--bg);color:var(--ink)}
  .pVb{flex:none;width:30px;height:30px;border:1px solid var(--linea);border-radius:9px;background:var(--bg);
    cursor:pointer;font-size:13px;line-height:1;display:flex;align-items:center;justify-content:center}
  .pVb:hover{border-color:var(--rosso);background:#fff}
  .pVistaQ{border:1px solid var(--linea);border-radius:11px;padding:8px 11px;margin:-6px 0 12px;background:var(--bg)}
  .pVistaQ[hidden]{display:none}
  .pVistaQh{font-size:10.5px;color:var(--mut);margin-bottom:6px}
  .pVistaQ .pchk{margin:5px 0}
  .pVistaQb{margin-top:8px}
  .pVistaQb .pgo{width:100%;padding:8px}
  .pCont{border:1px solid var(--linea);border-radius:12px;margin-bottom:14px;overflow:hidden}
  .pContHd{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 11px;
    border-bottom:1px solid var(--linea);background:var(--bg)}
  .pContHd>b{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut)}
  .pContHd button{background:none;border:none;cursor:pointer;font-family:inherit;font-size:10.5px;font-weight:700;
    color:var(--mut);padding:2px 5px;border-radius:6px}
  .pContHd button:hover{color:var(--rosso);background:#fff}
  .pContBody{max-height:34vh;overflow:auto;padding:4px 0}
  .pContGrp{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);
    padding:7px 11px 2px}
  .pContSep{border-top:1px solid var(--linea);margin:7px 11px 3px}
  .pContRow{display:flex;align-items:center;gap:6px;padding:3px 9px 3px 4px;min-height:26px}
  .pContRow.off .pContNm,.pContRow.off .pContN{opacity:.4;text-decoration:line-through}
  .pContExp{flex:none;width:18px;height:18px;border:none;background:none;cursor:pointer;color:var(--mut);
    font-size:10px;line-height:1;padding:0}
  .pContSw{flex:none;width:9px;height:9px;border-radius:50%}
  .pContNm{flex:1;min-width:0;font-size:11.5px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .pContN{flex:none;font-size:10px;font-weight:700;color:var(--mut);min-width:20px;text-align:right}
  .pContCk{flex:none;display:flex;align-items:center;gap:2px;font-size:11px;cursor:pointer;
    padding:2px 3px;border-radius:6px}
  .pContCk:hover{background:var(--bg)}
  .pContCk input{accent-color:var(--rosso);margin:0}
  /* il 🏷 a tre stati: si deve CAPIRE da lontano quale dei tre è attivo, e il
     carattere da solo non basta — il fondo lo dice prima del simbolo */
  .pContLab{flex:none;width:28px;height:22px;border:1px solid var(--linea);border-radius:7px;background:var(--bg);
    cursor:pointer;font-size:11px;line-height:1;padding:0;font-family:inherit}
  .pContLab.m0{opacity:.45}
  .pContLab.m2{border-color:var(--rosso);background:#fff;color:var(--rosso);font-weight:800}
  .pContLab:disabled{opacity:.25;cursor:default}
  .pContSub{padding:2px 10px 6px 32px;display:flex;flex-wrap:wrap;gap:3px 12px}
  .pContSub label{display:flex;align-items:center;gap:5px;font-size:10.5px;font-weight:600;cursor:pointer}
  .pContSub label.off{opacity:.4}
  .pContSub b{font-weight:700;color:var(--mut)}
  .pContSub input{accent-color:var(--rosso);margin:0}
  /* col dito il bersaglio è il BOTTONE, non la riga che lo contiene: una riga
     alta 38 con dentro un tasto da 22 è comunque un tasto da 22 */
  @media(pointer:coarse){.pContRow{min-height:38px}.pContCk{padding:8px 5px}
    .pContLab{width:34px;height:32px;font-size:13px}.pContSub label{min-height:30px}}
  .popts2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:10px 0 4px}
  .pfield>b{display:block;font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);margin-bottom:6px}
  .pseg{display:flex;background:var(--bg);border-radius:9px;padding:2px;gap:2px}
  .pseg button{flex:1;font-family:inherit;font-size:11px;font-weight:800;padding:6px 4px;border:none;background:none;color:var(--mut);border-radius:7px;cursor:pointer;transition:all .12s}
  .pseg button.on{background:var(--carta);color:var(--ink);box-shadow:var(--sh-1)}
  .pfield select{width:100%;font-family:inherit;font-size:12px;font-weight:600;padding:8px 9px;border:1px solid var(--linea);border-radius:9px;background:var(--carta);cursor:pointer}
  .pfield input[type=text]{width:100%;font-family:inherit;font-size:12px;font-weight:600;padding:8px 9px;border:1px solid var(--linea);border-radius:9px;background:var(--bg)}
  .pfield input[type=text]:focus{outline:none;border-color:var(--ink);background:#fff}
  /* v39: sotto-scelta della modalità di inquadratura (Contenuto/Stadio o Scala) */
  .psub{margin-top:8px}
  .psub[hidden]{display:none}
  /* v43: "Inquadratura" a tutta larghezza, ora che la rotella è finita sotto
     «Altre opzioni» e non le fa più da colonna gemella */
  .pfWide{margin:10px 0 4px}
  /* v44: riscontro dal vivo della scala che uscirà dal foglio */
  .preadout{margin-top:8px;font-size:11px;font-weight:800;color:var(--ink);background:var(--bg);border-radius:8px;padding:6px 9px;line-height:1.4}
  #pScreenSub{font-size:10px;color:var(--mut);font-weight:600;line-height:1.45}
  /* v43: secondo livello del dialogo di stampa — nessuna opzione rimossa, solo
     richiusa. <details> nativo: funziona anche in file:// senza JS. */
  .padv{border-top:1px solid var(--linea);margin-top:14px}
  .padv>summary{list-style:none;cursor:pointer;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);padding:11px 0 3px;display:flex;align-items:center;gap:6px}
  .padv>summary::-webkit-details-marker{display:none}
  .padv>summary::before{content:'▸';font-size:11px;transition:transform .15s}
  .padv[open]>summary::before{transform:rotate(90deg)}
  .padv>summary:hover{color:var(--ink)}
  /* v39: modalità sponsor, evidenziata a parte dalle altre opzioni di stampa */
  .psponsor{background:var(--bg);border:1.5px solid var(--rosso);border-radius:12px;padding:10px 14px;margin:2px 0 14px}
  .psponsor .pchk{margin:0;font-weight:800}
  .psponsorHint{font-size:10px;color:var(--mut);font-weight:600;margin-top:4px;line-height:1.4}
  /* v26: rotella di rotazione libera (stile map.geo.ti.ch), sostituisce i soli 4 bottoni fissi */
  .pdWrap{display:flex;align-items:center;gap:8px}
  .pdial{width:56px;height:56px;flex-shrink:0;cursor:grab;touch-action:none;user-select:none}
  .pdial:active{cursor:grabbing}
  .pdial svg{width:100%;height:100%;display:block}
  .pdBg{fill:var(--bg);stroke:var(--linea);stroke-width:2}
  .pdTickMaj{stroke:var(--ink);stroke-width:2;stroke-linecap:round}
  .pdTickMin{stroke:var(--mut);stroke-width:1.2;stroke-linecap:round}
  .pdNeedle line{stroke:var(--rosso);stroke-width:2.5;stroke-linecap:round}
  .pdNeedle text{fill:var(--rosso);font-family:Montserrat,sans-serif;font-size:9px;font-weight:800}
  .pdHub{fill:var(--carta);stroke:var(--ink);stroke-width:1.5}
  .pdSide{display:flex;flex-direction:column;gap:6px;flex:1;min-width:0}
  .pdVal{display:flex;align-items:center;gap:3px;background:var(--bg);border-radius:9px;padding:2px 4px}
  .pdVal input{width:100%;font-family:inherit;font-size:13px;font-weight:800;text-align:right;border:none;background:none;color:var(--ink);padding:4px 2px}
  .pdVal input:focus{outline:none}
  .pdVal b{font-size:12px;color:var(--mut);padding-right:4px}
  /* v62.2 — altezza e angolo delle scritte sulla mappa: due numeri affiancati.
     Riusa l'aspetto di `.pdVal` (la casella dei gradi della rotella) invece di
     inventare una quarta famiglia di campi nel dialogo. */
  .ptxtRow{display:flex;gap:6px}
  .ptxtRow label{flex:1;min-width:0;display:flex;align-items:center;gap:3px;
    background:var(--bg);border-radius:9px;padding:2px 4px;font-size:10px;font-weight:700;color:var(--mut)}
  .ptxtRow input{width:100%;min-width:0;font-family:inherit;font-size:13px;font-weight:800;text-align:right;
    border:none;background:none;color:var(--ink);padding:4px 2px}
  .ptxtRow input:focus{outline:none}
  .ptxtRow b{font-size:12px;color:var(--mut)}
  .pdQuick{display:flex;gap:2px}
  .pdQuick button{flex:1;font-family:inherit;font-size:9px;font-weight:800;padding:4px 2px;border:none;background:var(--bg);color:var(--mut);border-radius:6px;cursor:pointer}
  .pdQuick button.on{background:var(--rosso);color:#fff}
  .phint{font-size:10.5px;color:var(--mut);font-weight:600;line-height:1.5;margin:10px 0 2px;background:var(--bg);border-radius:9px;padding:8px 11px}
  .phint b{color:var(--ink)}
  .pcanc{width:100%;font-family:inherit;font-size:12px;font-weight:700;padding:8px;border:1px solid var(--linea);background:var(--carta);border-radius:10px;cursor:pointer}
  .pcanc:hover{border-color:var(--ink)}
  #printHead,#printFoot{display:none;background:#fff;color:#111}
  /* v47 — testata condivisa da TUTTE le stampe (mappe e documenti): niente più
     prefisso #printHead, così le stesse regole valgono dentro #lvPrint e
     #cbPrint. Il logo è un <img> e il filetto un border: si stampano anche con
     "Grafica di sfondo" disattivata nel dialogo del browser. */
  .pHead{display:flex;align-items:center;justify-content:space-between;gap:14px;
    border-bottom:2.5px solid var(--rosso);padding-bottom:8px;margin-bottom:6px}
  .pHead .pLogo{height:38px;width:auto;flex:none}
  .pHead .pTitle{text-align:center;flex:1;min-width:0}
  .pHead .pTitle b{display:block;font-size:19px;font-weight:800;line-height:1.2}
  .pHead .pKick{display:block;font-size:8.5px;color:var(--rosso);font-weight:800;
    text-transform:uppercase;letter-spacing:.1em;margin-top:2px}
  .pHead .pSub{display:block;font-size:10px;color:#666;font-weight:600;
    text-transform:uppercase;letter-spacing:.12em}
  .pHead .pMeta{text-align:right;font-size:9.5px;color:#444;line-height:1.6;font-weight:600;flex:none}
  /* box osservazioni sotto l'intestazione (spuntabile dal dialogo di stampa) */
  #printHead .pobs{border-left:3px solid var(--rosso);background:#faf7f7;border-radius:0 8px 8px 0;padding:6px 10px;margin:6px 0 4px;font-size:10px;line-height:1.55;color:#333;font-weight:600}
  #printHead .pobs b{display:block;font-size:8px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--rosso);margin-bottom:2px}
  #printFoot{padding-top:8px;font-size:9.5px}
  #printFoot h4{font-size:11px;font-weight:800;margin:8px 0 5px;text-transform:uppercase;letter-spacing:.06em}
  .pleg{display:flex;gap:12px;flex-wrap:wrap;align-items:center;font-weight:600;margin:6px 0}
  .pleg .sw{display:inline-flex;align-items:center;gap:5px;margin-right:4px}
  .pleg .sw i{width:12px;height:12px;border-radius:3px;display:inline-block;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2)}
  .pblocks{display:grid;grid-template-columns:repeat(6,1fr);gap:6px}
  .pblk{border:1px solid #ddd;border-radius:6px;padding:4px 6px;page-break-inside:avoid}
  .pblk .pbh{display:flex;gap:4px;font-weight:800;font-size:9px;border-bottom:1px solid #eee;padding-bottom:2px;margin-bottom:2px;align-items:center}
  .pblk .pbh i{color:#fff;border-radius:3px;padding:0 4px;font-style:normal}
  .pblk .pit{display:flex;justify-content:space-between;font-size:8.5px;line-height:1.5}
  .ptbl{width:100%;border-collapse:collapse;font-size:9px;box-shadow:none;border-radius:0}
  .ptbl th{padding:3px 5px;font-size:7.5px;border-bottom:1.5px solid #333;color:#333}
  .ptbl td{padding:2.5px 5px;border-bottom:.5px solid #ddd}
  /* ---- v55: i CORPI delle scritte in stampa stanno FUORI da @media print ----
     Erano dentro, e quindi a schermo non valevano nulla: la classe `.printing`
     c'è già mentre la pagina si prepara al foglio, ma le etichette restavano
     alla misura da schermo fino allo scatto. Due conseguenze, la seconda seria:
     ciò che si vedeva prima di stampare non era ciò che usciva, e soprattutto
     il diradamento (`_declutter`, common.js) MISURA i rettangoli col DOM — con
     i corpi sbagliati misurava un foglio che non esiste, e i suoi due gradini
     di riduzione non avevano alcun effetto sulla larghezza.
     È lo stesso motivo per cui la geometria del foglio (#app/#map) la scrive il
     JS fuori da @media print: quello che si misura dev'essere quello che si
     stampa. Vale per `.lbl`, `.vlab`, `.blklbl`, `.pedge` e per i tre gradini
     di «Grandezza testi». */
  /* v58.2 — CORPI RIDOTTI IN STAMPA. 14px su un A3 sono una scritta da titolo:
     con qualche decina di elementi il foglio era piu' pastiglie che disegno, e
     il diradamento non poteva farci niente perche' il problema non era la
     sovrapposizione ma l'ingombro. 12px si leggono a braccio teso, che e' la
     distanza a cui si guarda un piano appeso o appoggiato su un tavolo.
     L'ombra sul foglio non serve a nulla — la stampa non ha profondita' — e
     aggiunge solo sporco intorno a ogni scritta. */
  body.printing .lbl{font-size:calc(var(--ptxt,12px) * var(--lsz,1))!important;padding:1.5px 6px!important;font-weight:700!important;box-shadow:none!important}
  body.printing.pNoLbl .lbl,body.printing.pNoLbl .vlab,body.printing.pNoLbl .blklbl,body.printing.pNoLbl .pedge{display:none!important}
  /* v62.1 — IL CONTESTO IN BIANCO E NERO. Lo sfondo sta in due pane suoi
     (`tile` e `ortho`, quest'ultimo creato in common.js con zIndex 350), quindi
     si desatura con un filtro senza toccare niente altro; la leggera schiarita
     serve perche' il contesto stia SOTTO al piano invece di fargli concorrenza
     in grigio scuro - e' quello che si vede nelle tavole fatte a mano.
     Le scritte e le icone dei MODULI sono HTML e si scolorano qui; i loro
     vettori no, vivono nello stesso <svg> del piano e li scolora REF.bn().
     `.lbl:not(.plbl)` e' la riga da leggere due volte: le etichette degli
     striscioni portano solo `lbl`, quelle del piano `lbl plbl` - senza il
     `:not` andrebbero in grigio anche i nomi che si vogliono a colori. */
  body.printing.pBN .leaflet-tile-pane,
  body.printing.pBN .leaflet-ortho-pane{filter:grayscale(1) brightness(1.06) contrast(.9)}
  body.printing.pBN .vlab,
  body.printing.pBN .camic,
  body.printing.pBN .lbl:not(.plbl){filter:grayscale(1)}
  /* v62.2 — L'ALTEZZA DELLE SCRITTE SULLA MAPPA E' UN NUMERO, non piu' tre
     gradini: la scrive `doPrint` in `--ptxt`. I tre bottoni Piccoli/Medi/Grandi
     restano, ma da qui in poi valgono per il CARTIGLIO (testata e tabelle, piu'
     sotto), dove tre gradini bastano e dove `_headMM` li legge per riservare
     l'altezza giusta; sulla mappa scrivono solo il valore di partenza. */
  /* i due gradini del diradamento: doppia classe e ultima posizione, così
     vincono sia sulla regola base sia su «Testi piccoli/grandi», che hanno la
     stessa specificità.
     Per `.lbl` e `.vlab` sono FRAZIONI dell'altezza scelta, o con le scritte a
     20px il primo rimedio sarebbe un salto a 10 invece di una riduzione.
     `.blklbl` e `.pedge` restano in px: la loro base non dipende da `--ptxt`,
     e legarli darebbe un «piu' piccolo» piu' GRANDE della base appena si alza
     il numero. */
  body.printing .lbl.pLblS,body.printing .vlab.pLblS{font-size:calc(var(--ptxt,12px) * var(--lsz,1) * .83)!important;padding:1px 5px!important}
  body.printing .lbl.pLblXS,body.printing .vlab.pLblXS{font-size:calc(var(--ptxt,12px) * var(--lsz,1) * .67)!important;padding:0 4px!important}
  body.printing .blklbl.pLblS,body.printing .pedge.pLblS{font-size:10px!important;padding:1px 5px!important}
  body.printing .blklbl.pLblXS,body.printing .pedge.pLblXS{font-size:8px!important;padding:0 4px!important}
  /* LA ROTAZIONE DEI TESTI gira un INVOLUCRO INTERNO, mai la pastiglia.
     Misurato: un `rotate:` sul contenitore di un tooltip lo sposta di 206px,
     perche' Leaflet ci scrive il proprio `transform` di posizionamento e le
     due trasformazioni si compongono nell'ordine sbagliato. E' la stessa
     ragione per cui la rotazione del singolo elemento (`.lblRot`) gira gia' uno
     span: qui l'involucro lo crea `_txtRotApply` a inizio stampa e lo toglie
     alla fine. I due si compongono — l'angolo generale piu' quello messo a mano
     sul singolo — invece di scavalcarsi.
     Fondo, bordo e ombra passano all'involucro: ruotando il contenitore
     resterebbe una pastiglia dritta con dentro il testo storto. */
  body.printing.pTxtRot .lbl,body.printing.pTxtRot .vlab,
  body.printing.pTxtRot .blklbl,body.printing.pTxtRot .pedge{
    background:none!important;border:none!important;box-shadow:none!important;padding:0!important}
  body.printing.pTxtRot .ptxtRot{display:inline-block;rotate:var(--ptxtrot,0deg);transform-origin:center center;
    background:rgba(255,255,255,.93);border:1px solid #9a9aa4;border-radius:5px;padding:1.5px 6px}
  body.printing .pLblOff{display:none!important}
  @media print{
    /* v47 — niente più `size` qui: il formato lo dichiara SEMPRE printPageCss()
       in common.js, unico generatore di @page del portale. Prima questo size
       globale vinceva sui fogli che non ne dichiaravano uno, e la scheda
       personale dei collaboratori usciva stampata in orizzontale.
       Il fondo è più alto per lasciare posto alla barra di piè fissa: deve
       restare allineato a PRINT_MARGIN in common.js. */
    @page{margin:8mm 8mm 14mm}
    body{background:#fff;-webkit-print-color-adjust:exact;print-color-adjust:exact}
    body.printing #panel,body.printing #panelToggle,body.printing #toasts,body.printing #dragTip,body.printing #alert,body.printing #brandChip,
    body.printing .lyrPanel,body.printing .leaflet-bar,body.printing #printDlg,body.printing #wsSwitch,
    body.printing .vtools,body.printing #vprops,body.printing .leaflet-popup-pane,
    /* v57 — sta in <body> come #panelToggle, quindi va spento a mano: non e' un
       .leaflet-bar e non sparisce da se' */
    body.printing #mapBtns,body.printing .filtBox{display:none!important}
    body.printing #app{display:block}
    /* v44 — la geometria del riquadro (#app) e della mappa la scrive il JS in
       <style id="pgStyle">, insieme alla regola @page: prima le altezze stavano
       qui e il calcolo della cornice rossa stava in common.js, due numeri liberi
       di divergere. #app ritaglia, #map dentro è sovradimensionato quanto basta
       a coprirlo una volta ruotato — così una rotazione qualunque non taglia gli
       angoli e non serve più la vecchia "gabbia quadrata". */
    /* v44 — la barra di Leaflet era ingrandita del 40% SENZA cambiare la sua
       etichetta: una barra "50 m" a 1:200 misurava 35mm invece di 25, e chi la
       misurava col righello deduceva 1:143. In più, stando dentro #map, ruotava
       con la mappa. In stampa si nasconde: al suo posto #pScaleBar, disegnata
       nel foglio a partire dalla scala vera. Stessa sorte per l'attribuzione,
       che ruotava e si troncava: finisce nel cartiglio. */
    body.printing .leaflet-control-scale,body.printing .leaflet-control-attribution{display:none!important}
    body.printing #pScaleBar{display:flex}
    body.printing #printHead{display:block}
    /* v44 — foglio 1 il disegno, foglio 2+ l'elenco. Prima non c'era NESSUNA
       regola di impaginazione: con 23 stand la tabella sborda su tutti e
       quattro i formati (A4 orizzontale ha 194mm utili contro ~245mm di
       contenuto) e si spezzava a metà pagina. */
    body.printing #printFoot{display:block;page-break-before:always;break-before:page}
    body.printing #printFoot:empty{display:none;page-break-before:auto;break-before:auto}
    .ptbl thead{display:table-header-group}   /* intestazione ripetuta a ogni pagina */
    .ptbl tr{page-break-inside:avoid;break-inside:avoid}
    body.printing .leaflet-control-attribution{font-size:7px}
    /* v-fase6: elementi del cartiglio spuntabili dal dialogo di stampa */
    body.printing #pNorth.show{display:block}
    body.printing #passLeg.show{display:block}
    body.printing.pNoScale .leaflet-control-scale{display:none!important}
    /* taglia testi globale P/M/G (M = valori storici). NB: i corpi delle
       ETICHETTE SULLA MAPPA non stanno più qui — v. il blocco v55 qui sopra,
       fuori da @media print, perché il diradamento li deve poter misurare. */
    body.printing.pTxt-s .pHead .pTitle b{font-size:15px}
    body.printing.pTxt-s .pHead .pMeta{font-size:8px}
    body.printing.pTxt-s #printHead .pobs{font-size:8.5px}
    body.printing.pTxt-s .ptbl{font-size:7.5px}
    body.printing.pTxt-g .pHead .pTitle b{font-size:24px}
    body.printing.pTxt-g .pHead .pMeta{font-size:11.5px}
    body.printing.pTxt-g #printHead .pobs{font-size:12px}
    body.printing.pTxt-g .ptbl{font-size:11px}
    body.printing.pTxt-g .ptbl th{font-size:9px}
  }
  /* mobile/tablet: pannello a BOTTOM SHEET (foglio trascinabile) — v13.3 */
  @media(max-width:820px){
    body.haspanel #app{position:relative}
    #app{display:block}
    #map{position:absolute;inset:0;width:100%;height:100%}
    #panel{position:absolute;left:0;right:0;bottom:0;top:auto;width:auto;min-width:0;height:88%;
      background:var(--carta);border-left:none;border-radius:20px 20px 0 0;
      box-shadow:0 -8px 30px rgba(21,21,40,.20);
      transform:translateY(calc(100% - 150px));
      transition:transform .3s cubic-bezier(.22,.9,.3,1);
      z-index:1400;touch-action:none;overflow:hidden}
    #panel.sheetDrag{transition:none}
    /* v57 — col foglio a fondo schermo la mappa e' larga tutta: i bottoni della
       mappa tornano sul bordo, e col dito si alzano a 40px */
    #mapBtns{right:10px;top:calc(var(--nav-h) + 10px)}
    #mapBtns>button{height:40px;padding:0 14px}
    .filtBox{right:10px!important;top:calc(var(--nav-h) + 58px)!important}
    .sheetGrab{display:none}
    body.haspanel .sheetGrab{display:flex;flex-direction:column;align-items:center;justify-content:center;
      padding:9px 0 5px;cursor:grab;flex-shrink:0;touch-action:none}
    .sheetGrab::before{content:"";width:42px;height:5px;border-radius:99px;background:#d2d2da}
    #panelToggle{display:none}
  }

/* ===================== v11 â€” portale multi-pagina ===================== */
/* nav condivisa */
#topnav{display:flex;align-items:center;gap:18px;height:52px;padding:0 16px;background:var(--carta);border-bottom:1px solid var(--linea);border-top:3px solid var(--rosso);position:relative;z-index:1500}
#topnav .brand img{display:block;height:30px;width:auto}
#topnav .links{display:flex;gap:2px}
#topnav .links a{text-decoration:none;color:var(--mut);font-weight:800;font-size:12.5px;padding:7px 13px;border-radius:99px;transition:all .15s}
#topnav .links a:hover{color:var(--ink);background:var(--bg)}
#topnav .links a.on{color:#fff;background:var(--ink)}
#topnav .navright{margin-left:auto;display:flex;align-items:center;gap:10px}
#topnav .vchip{font-size:10px;font-weight:800;color:var(--mut);letter-spacing:.04em}
#topnav .vchip b{color:var(--rosso)}
body.haspanel #app{height:calc(100% - var(--nav-h))}
html,body{height:100%}

/* toast: chiusura manuale */
.toast{display:flex;align-items:flex-start;gap:8px;pointer-events:auto}
.toast .tmsg{flex:1}
.toast .tclose{border:none;background:none;cursor:pointer;color:var(--mut);font-size:11px;font-weight:800;padding:1px 2px;line-height:1.4}
.toast .tclose:hover{color:var(--ink)}
.fixedToasts{position:fixed;left:14px;bottom:18px;z-index:2500;display:flex;flex-direction:column;gap:6px;max-width:420px}

/* zone libere: segnale ambra leggero (â‰  conflitto rosso) */
.freeic{display:flex;align-items:center;justify-content:center;width:20px;height:20px;font-size:13px;opacity:.92;filter:drop-shadow(0 1px 2px rgba(0,0,0,.45)) grayscale(.15)}
/* v27: etichetta metri permanente accanto al simbolo dei buchi (su iPad il
   tooltip non compare mai). Il wrapper lascia passare i tocchi
   (pointer-events:none): solo il triangolo apre il popup, l'etichetta non
   ruba mai il drag ai pezzi sottostanti. */
.freewrap{display:flex;align-items:center;gap:3px;pointer-events:none;width:max-content}
.freewrap .freeic{pointer-events:auto;cursor:pointer}
.freem{background:rgba(255,255,255,.92);border:1px solid #d9930d;color:#8a5a00;border-radius:99px;padding:1px 7px;font-family:Montserrat,sans-serif;font-size:10.5px;font-weight:800;white-space:nowrap;box-shadow:0 1px 2px rgba(0,0,0,.25)}

/* v12.5: ricerca sponsor, vetrina "da sistemare", suggerimenti, riepilogo totali */
#spSearch{width:100%;margin-top:9px;font-family:inherit;font-size:12px;font-weight:600;padding:7px 12px;border:1.5px solid var(--linea);border-radius:99px;background:var(--bg);outline:none;transition:border-color .15s}
#spSearch:focus{border-color:var(--rosso);background:var(--carta)}
.row.unrow{flex-wrap:wrap}
.tagchip{font-size:8.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;padding:2px 7px;border-radius:99px;white-space:nowrap}
.tagchip.t-np{color:#92400e;background:#fdf0d3}
.tagchip.t-fp{color:#991b1b;background:#fee2e2}
.tagchip.t-sm{color:#52525f;background:#e8e8ef}
.sugg{flex-basis:100%;display:flex;align-items:center;gap:6px;font-size:10.5px;font-weight:600;color:#8a6d1a;background:#fdf7e2;border-radius:7px;padding:3px 5px 3px 9px;margin-top:3px;transition:background .12s}
.sugg .suggTxt{flex:1;cursor:pointer}
.sugg:hover{background:#faedc0}
.sugg.none{color:var(--mut);background:var(--bg)}
.sugg .suggOk{flex-shrink:0;font-size:10px;font-weight:800;color:#fff;background:var(--ok);border:none;border-radius:99px;padding:3px 10px;cursor:pointer;transition:background .12s,transform .08s}
.sugg .suggOk:hover{background:#0f7537}
.sugg .suggOk:active{transform:translateY(1px)}
.totsSum{display:flex;gap:8px;margin:2px 0 14px}
.totsSum div{flex:1;background:var(--carta);border-radius:var(--r1);padding:8px 12px 7px;box-shadow:var(--sh-1)}
.totsSum b{display:block;font-size:16px;font-weight:800;font-variant-numeric:tabular-nums}
.totsSum b small{font-size:10px;color:var(--mut);font-weight:700}
.totsSum b.ok{color:var(--ok)}
.totsSum b.warnc{color:var(--warn)}
.totsSum span{font-size:8.5px;color:var(--mut);text-transform:uppercase;letter-spacing:.08em;font-weight:800}

/* command palette (Ctrl+K) */
#cmdPal{position:fixed;inset:0;z-index:5000}
#cmdPal[hidden]{display:none}
#cmdPal .palBack{position:absolute;inset:0;background:rgba(21,21,30,.5);backdrop-filter:blur(3px);animation:palFade .12s}
#cmdPal .palBox{position:absolute;top:14vh;left:50%;transform:translateX(-50%);width:560px;max-width:92vw;background:var(--carta);border-radius:16px;box-shadow:0 20px 60px rgba(21,21,40,.35);overflow:hidden;animation:palPop .14s cubic-bezier(.2,.9,.3,1.2)}
@keyframes palFade{from{opacity:0}to{opacity:1}}
@keyframes palPop{from{opacity:0;transform:translateX(-50%) translateY(-8px) scale(.98)}to{opacity:1;transform:translateX(-50%) translateY(0) scale(1)}}
#palInput{width:100%;border:none;border-bottom:1px solid var(--linea);padding:16px 20px;font-family:inherit;font-size:15px;font-weight:600;color:var(--ink);outline:none;background:transparent}
#palInput::placeholder{color:#b6b6c2;font-weight:500}
#palList{max-height:46vh;overflow-y:auto;padding:6px}
.palRow{display:flex;align-items:center;gap:11px;padding:10px 14px;border-radius:10px;cursor:pointer;font-size:13px}
.palRow.on{background:var(--rosso);color:#fff}
.palRow .palIc{font-size:15px;width:20px;text-align:center;flex-shrink:0}
.palRow .palLab{flex:1;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.palRow .palHint{font-size:10.5px;font-weight:700;opacity:.6;text-transform:uppercase;letter-spacing:.05em}
.palRow.on .palHint{opacity:.85}
.palEmpty{padding:22px;text-align:center;color:var(--mut);font-size:13px;font-weight:600}
.palFoot{padding:9px 18px;border-top:1px solid var(--linea);font-size:10.5px;font-weight:700;color:var(--mut);letter-spacing:.02em;display:flex;justify-content:space-between}

.totInp{width:48px;font-family:inherit;font-size:12px;font-weight:600;text-align:right;border:1px solid var(--linea);border-radius:6px;padding:2px 4px;background:var(--carta)}
.totInp:focus{border-color:var(--rosso);outline:none}
tr.diff .totInp{border-color:var(--err)}

/* dialog stampa: griglia opzioni */
.pgrid{display:grid;grid-template-columns:1fr 1fr;gap:2px 14px}
.pbtns{display:flex;gap:8px;margin-top:14px}
.pgo{flex:1;font-family:inherit;font-size:13px;font-weight:800;padding:10px;border:none;background:var(--rosso);color:#fff;border-radius:10px;cursor:pointer}
.pgo:hover{background:var(--rosso-d)}
.pbtns .pcanc{flex:0 0 auto;width:auto;padding:10px 16px}

/* ===================== v13 — PIATTAFORMA (home a moduli) ===================== */
body.page-dash{background:var(--bg)}
.dash{max-width:1080px;margin:0 auto;padding:26px 22px 64px}
.dashHead{display:flex;align-items:center;gap:16px;margin-bottom:22px}
.dashHead .dhLogo{height:46px;width:auto;flex-shrink:0}
.dashHead .dhTitle h1{font-size:22px;font-weight:800;letter-spacing:-.02em;line-height:1.1}
.dashHead .dhTitle p{font-size:12.5px;color:var(--mut);font-weight:600;margin-top:3px}
.dashHead .dhRight{margin-left:auto;display:flex;align-items:center;gap:10px}
.dhChip{font-size:11px;font-weight:800;color:var(--mut);background:var(--carta);border:1px solid var(--linea);border-radius:99px;padding:6px 13px;white-space:nowrap}
.dhChip b{color:var(--rosso)}

.dashSecTitle{font:inherit;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.09em;color:var(--mut);margin:0;border:1px solid transparent;background:transparent;border-radius:6px;padding:3px 6px;width:min(320px,60vw);transition:border-color .13s,background .13s}
.dashSecTitle:hover{border-color:var(--linea)}
.dashSecTitle:focus{outline:none;border-color:var(--rosso);background:var(--carta);color:var(--ink)}
.dashSecRow{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:6px 2px 11px}
.dashSecDel{display:none;flex-shrink:0;width:26px;height:26px;align-items:center;justify-content:center;border-radius:50%;border:1px solid var(--linea);background:var(--carta);color:var(--mut);font-size:15px;line-height:1;cursor:pointer;transition:all .13s}
.dashSecDel:hover{border-color:var(--err);color:var(--err);background:#fdeaea}
#modSections.organizing .dashSecDel{display:inline-flex}
/* sezione successiva più ravvicinata alla griglia sopra (v31): con
   margin-bottom pieno di .modGrid + margin-top del titolo, il blocco
   leggeva come staccato invece che come continuazione della stessa
   sequenza di sezioni */
.modGrid + .dashSecRow{margin-top:-10px}

.modToolbar{display:flex;justify-content:flex-end;margin-bottom:8px}
.dashOrganize{font-family:inherit;font-size:11px;font-weight:800;padding:7px 14px;border-radius:99px;border:1px solid var(--linea);background:var(--carta);color:var(--mut);cursor:pointer;transition:all .13s;white-space:nowrap}
.dashOrganize:hover{border-color:var(--rosso);color:var(--rosso)}
.dashOrganize.on{background:var(--ink);color:#fff;border-color:var(--ink)}

/* modalità "Personalizza moduli" — riordino iPhone-style delle card,
   trascinabili anche fra sezioni diverse (anche vuote) */
@keyframes mtJiggle{0%{transform:rotate(-.9deg)}100%{transform:rotate(.9deg)}}
.modGrid.organizing .modTile{animation:mtJiggle .22s ease-in-out infinite alternate;cursor:grab;user-select:none}
.modGrid.organizing .modTile:nth-child(even){animation-direction:alternate-reverse}
.modGrid.organizing .mtStretch{pointer-events:none}
.modGrid.organizing .modTile.dragging{animation:none;opacity:.35;cursor:grabbing;box-shadow:var(--sh-2)}
.modGrid.organizing:empty{min-height:64px;border:2px dashed var(--linea);border-radius:16px;margin-bottom:26px;display:flex;align-items:center;justify-content:center}
.modGrid.organizing:empty::after{content:"Trascina qui una card";font-size:11.5px;font-weight:700;color:var(--mut)}
@media(prefers-reduced-motion:reduce){.modGrid.organizing .modTile{animation:none}}

.modAddSection{display:none;width:100%;font-family:inherit;font-size:12.5px;font-weight:800;color:var(--mut);background:transparent;border:2px dashed var(--linea);border-radius:16px;padding:14px;cursor:pointer;transition:all .13s;margin-bottom:26px}
.modAddSection:hover{border-color:var(--rosso);color:var(--rosso)}
#modSections.organizing ~ .modAddSection{display:block}

/* BANNER in evidenza: Generale stadio (la mappa unica) */
.hubBanner{position:relative;display:flex;align-items:center;gap:20px;text-decoration:none;background:var(--ink);color:#fff;border-radius:20px;padding:26px 28px;margin-bottom:24px;overflow:hidden;transition:transform .12s,box-shadow .18s;box-shadow:var(--sh-2)}
.hubBanner:hover{transform:translateY(-2px)}
.hubBanner::after{content:"";position:absolute;right:-40px;top:-40px;width:220px;height:220px;border-radius:50%;background:rgba(227,6,19,.16)}
.hubBanner .hbIc{width:60px;height:60px;border-radius:16px;background:rgba(255,255,255,.1);display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;z-index:1;color:#fff}
.hubBanner .hbIc svg{width:30px;height:30px}
.hubBanner .hbTxt{position:relative;z-index:1;flex:1}
.hubBanner .hbKick{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;opacity:.7}
.hubBanner .hbTxt h2{font-size:22px;font-weight:800;letter-spacing:-.01em;margin:4px 0 5px}
.hubBanner .hbTxt p{font-size:12.5px;font-weight:600;opacity:.82;line-height:1.45;max-width:52ch}
.hubBanner .hbGo{position:relative;z-index:1;flex-shrink:0;font-size:13px;font-weight:800;display:inline-flex;align-items:center;gap:7px;background:var(--rosso);padding:11px 18px;border-radius:99px;white-space:nowrap}

/* GRIGLIA MODULI */
.modGrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(248px,1fr));gap:16px;margin-bottom:26px}
.modTile{position:relative;display:flex;flex-direction:column;background:var(--carta);border-radius:16px;border:1px solid var(--linea);box-shadow:var(--sh-1);padding:20px;min-height:172px;text-decoration:none;color:var(--ink);transition:border-color .15s,transform .1s,box-shadow .15s}
.modTile.attivo{cursor:pointer}
.modTile.attivo:hover{border-color:var(--rosso);transform:translateY(-2px);box-shadow:var(--sh-2)}
.mtStretch{color:inherit;text-decoration:none}
.mtStretch::after{content:"";position:absolute;inset:0;z-index:1;border-radius:16px}
.modTile .mtHead{display:flex;align-items:flex-start;gap:12px}
.modTile .mtIc{width:44px;height:44px;border-radius:12px;background:var(--bg);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--ink)}
.modTile .mtIc svg{width:22px;height:22px}
.modTile.attivo .mtIc{background:#fdeaec;color:var(--rosso)}
.modTile h2{font-size:16px;font-weight:800;letter-spacing:-.01em;line-height:1.15;margin-top:2px}
.modTile .mtDesc{font-size:12px;color:var(--mut);font-weight:600;line-height:1.5;margin-top:10px;flex:1}
.badge{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;padding:3px 9px;border-radius:99px;white-space:nowrap}
.badge.on{color:#0f7537;background:#dcf5e6}
.badge.soon{color:#8a6d1a;background:#faf1d4}
.modTile .mtFoot{margin-top:14px;padding-top:13px;border-top:1px solid var(--bg);display:flex;align-items:center;gap:12px;min-height:22px}
.modTile .mtStat b{font-size:19px;font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.modTile .mtStat b.okc{color:var(--ok)}
.modTile .mtStat span{font-size:10px;color:var(--mut);font-weight:700;margin-left:5px}
.modTile .mtStat+.mtStat{padding-left:12px;border-left:1px solid var(--bg)}
.modTile .mtWarn{color:var(--warn);font-size:11.5px;font-weight:800}
.modTile .mtGo{margin-left:auto;color:var(--mut);display:flex}
.modTile .mtGo svg{width:18px;height:18px}
a.modTile:hover .mtGo{color:var(--rosso)}
.modTile.soon{opacity:.72;cursor:default}
.modTile.soon .mtFoot{color:var(--mut);font-size:11.5px;font-weight:700;border-top-color:var(--bg)}
/* riga meta del modulo: data ultima modifica + link sola lettura */
.mtMeta{display:flex;align-items:center;gap:10px;margin-top:11px;padding-top:11px;border-top:1px solid var(--bg)}
.mtDate{font-size:10.5px;color:var(--mut);font-weight:700;display:flex;align-items:center;gap:5px}
.mtDate svg{width:13px;height:13px}
.mtShare{margin-left:auto;display:inline-flex;align-items:center;gap:5px;text-decoration:none;color:var(--mut);font-size:10.5px;font-weight:800;background:var(--bg);border-radius:99px;padding:5px 11px;transition:all .13s;z-index:2;position:relative}
.mtShare svg{width:13px;height:13px}
.mtShare:hover{color:#fff;background:var(--ink)}

@media(max-width:640px){
  .dash{padding:18px 14px 44px}
  .dashHead .dhRight{display:none}
  .hubBanner{flex-direction:column;align-items:flex-start;gap:14px;padding:20px}
  .hubBanner .hbGo{align-self:stretch;justify-content:center}
}

/* workspace: switcher di modulo sopra il pannello */
#wsSwitch{display:flex;align-items:center;gap:5px;padding:10px 14px 9px;background:var(--carta);border-bottom:1px solid var(--linea)}
#wsSwitch button{font-family:inherit;font-size:12px;font-weight:800;padding:7px 15px;border:1px solid var(--linea);background:var(--carta);color:var(--mut);border-radius:99px;cursor:pointer;transition:all .13s}
#wsSwitch button.on{background:var(--ink);color:#fff;border-color:var(--ink)}
#wsSwitch button:not(.on):hover{border-color:var(--ink);color:var(--ink)}
#wsSwitch .wsSoon{margin-left:auto;font-size:9.5px;font-weight:800;color:var(--mut);text-transform:uppercase;letter-spacing:.06em}
#panel.wsCamMode #bar,#panel.wsCamMode #tabs,#panel.wsCamMode #seq,
#panel.wsCamMode #tots,#panel.wsCamMode #warns,#panel.wsCamMode #spSearch{display:none!important}
#wsCamReset{margin-top:12px;font-size:12px;font-weight:700;font-family:inherit;padding:8px 15px;border:1px solid var(--linea);background:var(--carta);border-radius:99px;cursor:pointer;box-shadow:var(--sh-1)}
#wsCamReset:hover{border-color:var(--ink)}

/* pagina camere: pannello lista piena */
.pane .hint{font-size:11px;color:var(--mut);font-weight:600;margin:2px 0 10px;line-height:1.55}

/* ===== villaggio: etichette mappa, sezioni, schede dettagli, form nuovo stand ===== */
/* Etichetta al centro della sagoma, al posto della vecchia pillola colorata
   piena (bordo bianco + ombra) che con 25+ stand rendeva la planimetria
   illeggibile: il colore di categoria ce l'ha già la sagoma sotto.
   Il padding serve a dare un bersaglio di presa decente al trascinamento. */
/* v54 — UNA SOLA famiglia di scritte sulla mappa. Fino alla v53 questa era
   l'unica etichetta "cartografica" del portale (testo nudo su alone bianco a
   9 direzioni) mentre tutte le altre — `.lbl`, `.pedge`, `.blklbl`, `.camic` —
   sono pastiglie: due linguaggi diversi che nel Generale stadio si vedono
   affiancati (nomi stand + nomi elementi). Scelta esplicita di Giacomo: è il
   Villaggio ad adattarsi al resto, non il contrario.
   Il CSS è condiviso, quindi questa regola vale sia per il modulo Villaggio
   (`labelIcon` in villaggio.js) sia per il layer di riferimento del Generale
   stadio (`vLabIcon` in ref-moduli.js): una sola definizione, nessuna copia.
   Conseguenza dichiarata, non nascosta: la pastiglia ha un FONDO, che sparisce
   se in stampa si disattiva «Grafica di sfondo» — resta il bordo, esattamente
   come per `.lbl` e per i badge `.pzB`. L'alone si stampava sempre; è il
   prezzo dell'uniformità. */
/* v58.2 — alleggerita insieme a `.lbl`: e' la stessa famiglia di scritte (v54),
   quindi peso, bordo e ombra cambiano insieme o le due tornano a somigliarsi
   solo per caso. */
.vlab{transform:translate(-50%,-50%);display:inline-flex;flex-direction:column;align-items:center;gap:1px;
  background:rgba(255,255,255,.92);border:1px solid #b4b4be;border-radius:5px;box-shadow:0 1px 2px rgba(0,0,0,.14);
  color:var(--ink);font-family:Montserrat,sans-serif;font-weight:700;font-size:calc(10px * var(--mtx,1));line-height:1.15;
  white-space:nowrap;cursor:grab;padding:1px 5px}
.vlab:active{cursor:grabbing}
.vlab .nm{display:inline-flex;align-items:center;gap:4px}
.vlab .m2{font-weight:600;font-size:9px;color:#5a5a66}
.vlab.far .m2{display:none} /* le misure compaiono solo da vicino (zoom ≥ 19) o se selezionato */
.vlab.locked{opacity:.62;cursor:default} /* bloccato: smorzato, non trascinabile */
.vlab .vlk{font-size:10px}
/* in stampa cresce come `.lbl` (riga 402): stessa misura, stesso padding */
/* v62.2 — `--ptxt` e' l'altezza scelta nel dialogo di stampa. Queste due righe
   stanno DOPO il blocco di stampa in cima al file e hanno la stessa
   specificita': senza il var qui, il numero non varrebbe per i nomi degli
   stand — vincerebbe l'ultima regola scritta, cioe' questa. */
body.printing .vlab{font-size:var(--ptxt,12px);padding:1.5px 6px;color:#000;box-shadow:none}
body.printing .vlab .m2{font-size:calc(var(--ptxt,12px) * .79);color:#333}
/* niente lucchetti sul foglio: sono uno stato dell'editor, non del piano */
body.printing .vlab .vlk{display:none!important}
/* stato Cliente/Posizione a tendina — stessa "pillola" colorata di prima, ora un <select>.
   Niente appearance:none/freccia disegnata: i consumatori impostano il colore
   via style="background:…" inline, che azzererebbe un background-image CSS —
   si tiene la freccina nativa del browser, comunque leggibile sul colore pieno. */
.stsel,.vpsel{font-size:9px;font-weight:800;padding:2px 6px;border-radius:99px;cursor:pointer;white-space:nowrap;border:1px solid transparent;font-family:inherit}
.stsel:hover,.vpsel:hover{border-color:currentColor}
.vpsel{font-size:11px;padding:4px 8px}
/* badge lucchetto in tabella (accanto al nome) */
.vlk{font-size:11px;vertical-align:middle}
/* header di sezione categoria — card in stile .bhdr degli striscioni */
.vsec{display:flex;align-items:center;gap:8px;background:var(--carta);border-radius:var(--r1);margin:14px 0 5px;padding:7px 10px;font-size:11.5px;box-shadow:var(--sh-1)}
.vsec .n{border-radius:6px;padding:3px 10px;font-weight:800;font-size:12px;color:#fff;letter-spacing:.01em}
.vsec .z{flex:1;color:var(--mut);font-weight:700}
.vsec label{display:flex;align-items:center;gap:5px;font-weight:700;font-size:10.5px;color:var(--mut);cursor:pointer;text-transform:uppercase;letter-spacing:.03em}
/* scheda dettagli espandibile — card come le .row degli striscioni */
.vdetcard{background:var(--carta);border:1px solid var(--linea);border-radius:var(--r1);box-shadow:var(--sh-1);padding:9px 11px;margin:2px 0 7px;font-size:12px}
.vdr{display:flex;gap:10px;line-height:1.7}
.vdr>span{color:var(--mut);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;min-width:110px;flex:none;padding-top:3px}
.vdetgrid{display:grid;grid-template-columns:1fr 1fr;gap:7px 12px}
.vdetf{display:flex;flex-direction:column;gap:3px;min-width:0}
.vdetf>span{font-size:9px;font-weight:800;color:var(--mut);text-transform:uppercase;letter-spacing:.04em}
.vdetf>input,.vdetf>select{width:100%;border:1px solid var(--linea);border-radius:6px;padding:4px 7px;font-family:inherit;font-size:12px;background:#fff}
.vdetf>input:focus,.vdetf>select:focus{outline:none;border-color:var(--ink)}
/* v43: coppia di campi L×P dentro una scheda dettagli (misure adattive) */
.vdimpair{display:flex;align-items:center;gap:5px}
.vdimpair input{width:100%;min-width:0;border:1px solid var(--linea);border-radius:6px;padding:4px 7px;font-family:inherit;font-size:12px;background:#fff;text-align:center}
.vdimpair input:focus{outline:none;border-color:var(--ink)}
.vdimpair i{font-style:normal;color:var(--mut);font-size:11px;font-weight:700}
@media(max-width:520px){.vdetgrid{grid-template-columns:1fr}}
/* toolbar editor sulla mappa (.vtools/.vtsep): stile condiviso con la
   Planimetria generale, definito una volta sola più sotto (.ptools/.ptsep) */
/* maniglie di ridimensionamento (selezione) */
.vhnd{width:12px;height:12px;background:#fff;border:2.5px solid #16161c;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.45);cursor:nwse-resize}
.vhnd:hover{background:var(--rosso);border-color:#fff}
/* scheda proprietà flottante (selezione) */
#vprops{position:absolute;left:56px;top:12px;z-index:1200;background:var(--carta);border-radius:13px;box-shadow:var(--sh-2);padding:11px 12px;width:250px;font-size:12px;display:flex;flex-direction:column;gap:8px}
#vprops .vphead{display:flex;gap:6px;align-items:center}
#vprops .vphead input{flex:1;min-width:0;border:1px solid transparent;border-radius:7px;padding:4px 7px;font-family:inherit;font-weight:800;font-size:13.5px;background:var(--bg)}
#vprops .vphead input:focus{outline:none;border-color:var(--ink);background:#fff}
#vprops .vphead button{border:none;background:none;font-size:13px;color:var(--mut);cursor:pointer;padding:2px 4px}
#vprops .vphead button:hover{color:var(--ink)}
#vprops .vprow{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
#vprops .vpcat{color:#fff;font-weight:800;font-size:9px;padding:3px 9px;border-radius:99px;letter-spacing:.02em}
#vprops select{border:1px solid var(--linea);border-radius:7px;padding:3px 6px;font-family:inherit;font-size:11.5px;font-weight:700;background:#fff}
#vprops .vpdim{display:flex;align-items:center;gap:4px;font-weight:700;color:var(--mut)}
#vprops .vpdim input{width:52px;border:1px solid var(--linea);border-radius:7px;padding:3px 5px;font-family:inherit;font-size:12px;font-weight:700;text-align:center}
#vprops .vpdim input:focus{outline:none;border-color:var(--ink)}
#vprops .vpdim i{font-style:normal;font-size:11px}
#vprops .vparea{font-weight:700;color:var(--mut)}
#vprops .vpacts{border-top:1px solid var(--linea);padding-top:8px}
#vprops .vpacts button{flex:1;border:1px solid var(--linea);background:#fff;border-radius:8px;padding:5px 4px;font-family:inherit;font-weight:700;font-size:10.5px;cursor:pointer;white-space:nowrap}
#vprops .vpacts button:hover{border-color:var(--ink)}
#vprops .vpacts #vpDel:hover{border-color:var(--err);color:var(--err)}
/* quote di lato in sola lettura sull'elemento selezionato (v43): stessa
   pastiglia .pedge della Planimetria, definita più sotto */
/* marker per la modifica vertici delle forme disegnate (.vvtx/.vmid): stile
   condiviso con la Planimetria, definito una volta sola più sotto */

/* ---------- Planimetria generale (editor GIS) ----------
   v43: toolbar e marker vertici sono condivisi col modulo Villaggio (.vtools/
   .vtsep/.vvtx/.vmid), che aveva copie byte-identiche di queste stesse regole */
.ptools,.vtools{display:flex;flex-direction:column;gap:2px;background:var(--carta);border-radius:11px;padding:4px;box-shadow:var(--sh-2)}
.ptools button,.vtools button{width:32px;height:32px;border:none;background:none;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#5a5a64;padding:0}
.ptools button svg,.vtools button svg{width:19px;height:19px;display:block}
.ptools button:hover,.vtools button:hover{background:var(--bg);color:var(--ink)}
.ptools button.on,.vtools button.on{background:var(--rosso);color:#fff;box-shadow:var(--sh-1)}
/* v61.1 — il separatore era un filo (1px, colore --linea #e8e8ef su sfondo
   bianco) con appena 2px di margine: su una barra di 12+ bottoni impilati la
   differenza fra "dentro un gruppo" e "fra due gruppi" era troppo piccola per
   vedersi, specie compressa su un telefono ("non vedo bene la barra degli
   strumenti"). Il gruppo non cambia — pan/righello, poi le forme di disegno,
   poi orto/snap/extra/stampa — cambia solo quanto si VEDE: margine verticale
   raddoppiato e colore preso da --mut (piu' scuro di --linea) invece che
   ridefinire una variabile nuova. */
.ptools .ptsep,.vtools .vtsep{height:1px;background:var(--mut);opacity:.3;margin:7px 6px}
/* v56 — l'ORTO scavalcato da Shift: acceso ma momentaneamente inerte. Serve un
   terzo stato visibile, o premendo Shift il bottone continuerebbe a dire che
   il vincolo c'e' mentre non c'e'. */
.ptools button.on.mtOff{background:#cfcfd6;color:#5a5a64;box-shadow:none}
/* v56 — la quota che segue il puntatore mentre si disegna o si misura. Classe
   PROPRIA e non .lbl: quella in stampa si vede, e una misura provvisoria sul
   foglio sarebbe un errore. `pointer-events:none` o si mangerebbe i click. */
.mtQuota{background:var(--ink);color:#fff;border:none;border-radius:7px;padding:3px 7px;
  font-family:inherit;font-weight:800;font-size:11.5px;white-space:nowrap;
  box-shadow:0 2px 8px rgba(0,0,0,.35);pointer-events:none}
.mtQuota::before{display:none}
body.printing .mtQuota{display:none!important}
/* mentre si DIGITA una misura: il riquadro cambia colore, o non si capisce che
   comanda la tastiera e non piu' il mouse */
.mtQuota.mtQuotaIn{background:var(--rosso)}
/* v56.1 — CROCE DI MIRA. Il cursore `crosshair` del sistema e' una crocetta di
   20px: per vedere se un punto e' allineato con qualcosa dall'altra parte del
   campo non serve a niente. Queste sono due righe a tutta mappa, come nei CAD.
   Ogni braccio e' una striscia bianca semitrasparente con dentro un filetto
   scuro tratteggiato: cosi' si legge sull'erba, sull'asfalto e sulle righe
   bianche della pista — un solo colore sparirebbe su qualcosa.
   Sta in un <div> dentro il container Leaflet, sopra i pane (400) e sotto i
   controlli (800), e non intercetta i click. */
.mtCross{position:absolute;inset:0;z-index:450;pointer-events:none;overflow:hidden}
.mtCross.mtCrossOff{display:none}
.mtCrossV,.mtCrossH{position:absolute;background:rgba(255,255,255,.5)}
.mtCrossV{top:0;bottom:0;left:calc(var(--cx,-99px) - 1px);width:3px}
.mtCrossH{left:0;right:0;top:calc(var(--cy,-99px) - 1px);height:3px}
.mtCrossV::before,.mtCrossH::before{content:'';position:absolute}
.mtCrossV::before{top:0;bottom:0;left:1px;border-left:1px dashed rgba(0,0,0,.55)}
.mtCrossH::before{left:0;right:0;top:1px;border-top:1px dashed rgba(0,0,0,.55)}
body.printing .mtCross{display:none!important}
/* col dito non esiste un puntatore da seguire: la croce sarebbe una croce
   ferma dove hai toccato l'ultima volta */
@media(pointer:coarse){.mtCross{display:none}}
/* v56.3 — con uno strumento in mano le superfici gia' disegnate diventano
   trasparenti al click: si disegna SOPRA di loro. Senza, il popup di una
   pedana o di una tribuna si apriva al primo clic e copriva il punto dei clic
   successivi — la forma non si chiudeva mai. Solo i `path`: i marker (badge,
   vertici, maniglie) stanno nel markerPane e devono restare vivi. */
body.mtDrawing .leaflet-overlay-pane path{pointer-events:none!important}
/* ...e nemmeno le SCRITTE, che non sono path. La scritta dell'elemento
   selezionato e' trascinabile (`pointer-events:auto`, v. wireLabDrag): senza
   questa riga, appena si comincia a disegnare vicino a un'etichetta gia' sulla
   mappa il clic finisce su di lei invece che sulla mappa, e il vertice non si
   posa. Verificato: con lo strumento in mano il bersaglio sotto la scritta era
   ancora `.leaflet-tooltip`. */
body.mtDrawing .leaflet-tooltip{pointer-events:none!important}
/* v62 — la gemella per i nomi degli stand: `.vlab` e' un divIcon, non un
   tooltip, quindi la riga sopra non lo copriva. Da quando la pastiglia
   risponde al clic (ref-moduli.js), senza questa il vertice non si poserebbe
   sotto una scritta di stand. */
body.mtDrawing .vlab,body.mtDrawing .leaflet-marker-icon:has(>.vlabRef){pointer-events:none!important}
/* `.vlab` porta `cursor:grab` fisso (riga 859), messo li' per il modulo
   Villaggio dove ogni scritta si trascina sempre. Nei layer di RIFERIMENTO si
   trascinano solo con «Sposta le scritte» acceso: fuori da quella modalita' il
   cursore prometterebbe una presa che non c'e'. Classe propria, cosi' il
   modulo Villaggio non cambia di un pixel. */
.vlabRef{cursor:default}
body.mtMoveLbl .vlabRef{cursor:grab}
body.mtMoveLbl .vlabRef:active{cursor:grabbing}
/* v56.3 — la scritta dell'elemento selezionato si prende e si sposta. Il
   cursore lo dice; la pastiglia resta quella di sempre. */
.leaflet-tooltip.lblGrab{cursor:move}
/* v60 — «Sposta le scritte»: col tasto attivo il cursore lo dice su TUTTE le
   scritte del progetto, non solo su quella selezionata (wireLabTouch abilita
   il trascinamento di ciascuna, questa e' solo la spia). */
body.mtMoveLbl .leaflet-tooltip.lbl{cursor:grab}
body.mtMoveLbl .leaflet-tooltip.lbl:active{cursor:grabbing}
/* ROTAZIONE: gira lo SPAN interno, non il contenitore — quello Leaflet lo
   riposiziona con un `transform` suo a ogni aggiornamento, e un secondo
   transform lo cancellerebbe. Per far girare la pastiglia intera e non solo il
   testo, quando c'e' una rotazione fondo, bordo e ombra passano allo span. */
.leaflet-tooltip.lbl.lblHasRot{background:none;border:none;box-shadow:none;padding:0}
.lblRot{display:inline-block;transform:rotate(var(--rot,0deg));transform-origin:center center}
.leaflet-tooltip.lbl.lblHasRot .lblRot{background:rgba(255,255,255,.93);border:1px solid #9a9aa4;
  border-radius:5px;padding:2px 6px;box-shadow:0 1px 3px rgba(0,0,0,.18)}
/* v58.2 — SPOSTARE UNA SCRITTA: una proprieta' sola, due contributori che si
   sommano. `--lox/--loy` e' la posizione decisa a mano trascinando la scritta
   (planimetria.js, campo `f.s.lo`); `--ddx/--ddy` e' lo scostamento del
   diradamento automatico (`_declutter`, common.js).
   Prima erano due meccanismi su due proprieta' diverse — `translate` il primo,
   `margin` il secondo — e si guastavano a vicenda: il margine cancellava quello
   di leaflet.css (`.leaflet-tooltip-top{margin-top:-6px}`) e l'ancora inline dei
   divIcon, e il ripristino del diradamento azzerava `translate`, cioe' proprio
   la posizione messa a mano, senza azzerare i margini suoi.
   `translate` e' una proprieta' a se': si compone col `transform` che Leaflet
   riscrive a ogni aggiornamento (e con quello di `.vlab`) senza toccarlo. Con
   entrambe le coppie assenti il calcolo vale `0px 0px`, cioe' non fa nulla. */
.leaflet-tooltip.lbl,.vlab,.blklbl,.pedge{
  translate:calc(var(--lox,0px) + var(--ddx,0px)) calc(var(--loy,0px) + var(--ddy,0px))}
/* v58.2 — I DUE GRADINI DEL DIRADAMENTO VALGONO ANCHE A SCHERMO. Erano
   dichiarati solo sotto `body.printing`: a schermo aggiungere `.pLblS` non
   cambiava un pixel, quindi il rimedio «resta dov'è, un po' più piccola» non
   riusciva mai e restavano solo «spostati» e «sparisci». Due conseguenze, e la
   seconda è quella che si vedeva: mentre si lavora le scritte si spostavano
   dove sarebbe bastato stringersi, e la mappa diradata a schermo non poteva
   assomigliare al foglio — che è invece la ragione per cui dalla v56.3 la si
   dirada anche a schermo.
   Seguono `--mtx` come i corpi di partenza: sono gradini della stessa scala,
   non misure fisse. In stampa continuano a comandare le regole `body.printing`,
   che sono `!important`. */
.leaflet-tooltip.lbl.pLblS,.vlab.pLblS,.blklbl.pLblS,.pedge.pLblS{font-size:calc(8.5px * var(--mtx,1))}
.leaflet-tooltip.lbl.pLblXS,.vlab.pLblXS,.blklbl.pLblXS,.pedge.pLblXS{font-size:calc(7px * var(--mtx,1))}
.pvtx,.vvtx{width:11px;height:11px;background:#fff;border:2.5px solid var(--rosso);border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.4);cursor:grab}
.pmid,.vmid{width:9px;height:9px;background:var(--rosso);border:2px solid #fff;border-radius:50%;opacity:.75;box-shadow:0 1px 2px rgba(0,0,0,.35);cursor:copy}
.pmid:hover,.vmid:hover{opacity:1}
.pmove{width:22px;height:22px;display:flex;align-items:center;justify-content:center;background:var(--ink);color:#fff;border:2px solid #fff;border-radius:50%;font-size:12px;box-shadow:0 1px 4px rgba(0,0,0,.5);cursor:move}
/* badge zona pass (punti con campo `zona`): numero bianco su cerchio del
   colore di zona — bordo bianco, non fondo, così resta visibile in stampa */
/* v56 — ANNOTAZIONI. La punta della freccia e' un divIcon ruotato, come la
   freccia di direzione delle camere RSI: niente librerie esterne (Regola 1).
   Il filetto bianco attorno al triangolo serve sull'ortofoto, dove un colore
   pieno su uno sfondo mosso si perde — stessa ragione del bordo dei badge. */
.parwW{background:none;border:none}
.parwW svg{display:block;filter:drop-shadow(0 1px 2px rgba(0,0,0,.35))}
/* il TESTO e' l'etichetta di sempre (una sola famiglia di scritte, v54), ma e'
   il bersaglio del clic — sotto non c'e' nessun pallino da prendere */
.leaflet-tooltip.ptxt{cursor:pointer}
.leaflet-tooltip.ptxt:hover{border-color:var(--ink)}
/* v62.5 — un'annotazione si VESTE COME TUTTE LE ALTRE SCRITTE (richiesta di
   Giacomo: «stesso carattere e font»). La v58.2 le aveva abbassate la voce -
   fondo velato, peso 600, testo smorzato - perche' essendo frasi intere erano
   l'inchiostro piu' ingombrante del foglio. La risposta a quel problema non e'
   un secondo vestito: e' la GRANDEZZA PER ELEMENTO (v62.5, `f.s.ls`), che si
   rimpicciolisce dove serve invece di smorzare tutto per principio.
   Resta solo cio' che dice che e' cliccabile, non come si legge. */
.leaflet-tooltip.lbl.ptxt{cursor:pointer}
.pzBW{background:none;border:none}
.pzB{display:flex;width:26px;height:26px;align-items:center;justify-content:center;border-radius:50%;border:2.5px solid #fff;color:#fff;font-weight:900;font-size:14px;font-family:inherit;box-shadow:0 1px 4px rgba(0,0,0,.45);box-sizing:border-box;print-color-adjust:exact;-webkit-print-color-adjust:exact}
#pprops{position:absolute;left:56px;top:12px;z-index:1200;background:var(--carta);border-radius:13px;box-shadow:var(--sh-2);padding:11px 12px;width:250px;font-size:12px;display:flex;flex-direction:column;gap:8px}
#pprops .pphead{display:flex;gap:6px;align-items:center}
#pprops .pphead input{flex:1;min-width:0;border:1px solid transparent;border-radius:7px;padding:4px 7px;font-family:inherit;font-weight:800;font-size:13.5px;background:var(--bg)}
#pprops .pphead input:focus{outline:none;border-color:var(--ink);background:#fff}
#pprops .pphead button{border:none;background:none;font-size:13px;color:var(--mut);cursor:pointer;padding:2px 4px}
#pprops .pphead button:hover{color:var(--ink)}
#pprops .pprow{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
#pprops .ppcat{color:#fff;font-weight:800;font-size:9px;padding:3px 9px;border-radius:99px;letter-spacing:.02em}
#pprops .ppmeta{color:var(--mut);font-weight:700;font-size:11px}
/* Classificazione nella scheda flottante: etichetta stretta e controllo che
   prende tutto il resto, così restano leggibili anche a 375px */
#pprops .pptipo{gap:6px;flex-wrap:nowrap}
#pprops .pplab{font-size:10px;font-weight:800;color:var(--mut);flex:none;min-width:64px}
#pprops .pptipo select,#pprops .pptipo input{flex:1;min-width:0;border:1px solid var(--linea);border-radius:7px;padding:4px 6px;font-family:inherit;font-size:11.5px;background:#fff}
/* v54 — i tre gradini (Categoria → Tipologia → Variante) in un riquadro solo.
   Prima «Tipologia» e «↔ Sposta in» erano due tendine identiche e affiancate,
   e la seconda cambiava il LIVELLO: da fuori sembravano la stessa scelta. */
#pprops .ppclass{display:flex;flex-direction:column;gap:5px;border:1px solid var(--linea);border-radius:9px;padding:7px;background:var(--bg)}
#pprops .ppclass .pptipo select{background:#fff}
/* ＋ / 🗑 accanto a ciascuno dei tre gradini: aggiungere ed eliminare una
   tipologia si fa da dove la si sceglie, non solo dall'albero (v54.1) */
#pprops .ppmini{flex:none;width:22px;height:22px;padding:0;display:flex;align-items:center;justify-content:center;
  border:1px solid var(--linea);background:#fff;border-radius:6px;font-family:inherit;font-size:11px;line-height:1;cursor:pointer}
#pprops .ppmini:hover:not(:disabled){border-color:var(--ink);background:var(--bg)}
#pprops .ppmini:disabled{opacity:.35;cursor:default}
#pprops .pphint{font-size:9.5px;line-height:1.4;color:var(--mut);font-weight:600}
#pprops .pphint b{color:var(--ink);font-weight:800}
/* «i dettagli vari»: i campi che valgono per la tipologia scelta, qui invece
   che nella Tabella del livello (v. fieldOn in planimetria.js) */
#pprops .ppdet{display:flex;flex-direction:column;gap:5px;border-top:1px solid var(--linea);padding-top:7px}
#pprops .ppdrow{gap:6px;flex-wrap:nowrap}
#pprops .ppdrow select,#pprops .ppdrow input{flex:1;min-width:0;border:1px solid var(--linea);border-radius:7px;padding:4px 6px;font-family:inherit;font-size:11.5px;background:#fff}
#pprops .ppdrow input[type=checkbox]{flex:none;accent-color:var(--rosso)}
/* v53 — Aspetto del singolo elemento: nome sulla mappa, trasparenza, ordine di
   disegno. Righe strette e senza a capo: la scheda resta larga 250px. */
#pprops .ppasp,#pprops .ppord,#pprops .ppcol,#pprops .pptratto,#pprops .pptrasp,#pprops .ppcolp{gap:5px;flex-wrap:nowrap;border-top:1px solid var(--linea);padding-top:7px}
#pprops .ppord,#pprops .ppcol,#pprops .pptratto,#pprops .pptrasp,#pprops .ppcolp{border-top:none;padding-top:0}
#pprops .ppasp .pplab,#pprops .ppord .pplab,#pprops .ppcol .pplab,#pprops .pptratto .pplab,#pprops .pptrasp .pplab{min-width:56px}
/* v56.3 — una riga, una cosa. `flex-wrap:nowrap` vuol dire che quello che
   avanza non va a capo ma si SCHIACCIA: con la tendina del nome accanto al
   cursore della trasparenza, quest'ultimo finiva a dieci pixel. Chi aggiunge un
   controllo qui gli dia una riga sua. */
#pprops .ppgrow{flex:1;min-width:0}
#pprops .pptrasp input[type=range]{flex:1;min-width:0;accent-color:var(--rosso)}
#pprops .pptrasp button{border:1px solid var(--linea);background:#fff;border-radius:7px;padding:3px 7px;font-family:inherit;font-size:11px;line-height:1.3;cursor:pointer;flex:none}
#pprops .pptrasp button:hover{border-color:var(--ink)}
/* la tavolozza su una riga sua: in linea con l'etichetta andava a capo e la
   riga diventava alta il doppio (misurato: 38px invece di 19) */
#pprops .ppcolp{padding-bottom:2px}
#pprops .ppcolp .plpal{flex:1;min-width:0;gap:4px;flex-wrap:nowrap}
#pprops .pphint2{font-size:10px;color:var(--mut);font-weight:600;line-height:1.35}
/* la scheda non deve mai uscire dallo schermo: con freccia, tratto, colore e
   un elenco di righe diventa alta, e su un portatile finiva sotto il bordo */
#pprops{max-height:calc(100vh - var(--nav-h) - 26px);overflow:auto}
/* v56.1 — tratto e punta della freccia. Gli slider si dividono lo spazio che
   resta: la scheda e' larga 250px e le righe non devono andare a capo. */
#pprops .pptratto input[type=range],#pprops .pparw input[type=range]{flex:1;min-width:0;accent-color:var(--rosso)}
#pprops .pptratto button,#pprops .pparw button,#pprops .ppasp select,#pprops .pparw select{flex:none}
#pprops .ppasp select,#pprops .pparw select{border:1px solid var(--linea);border-radius:7px;padding:2px 4px;font-family:inherit;font-size:10.5px;background:#fff;max-width:96px}
#pprops .pptratto button,#pprops .pparw button{border:1px solid var(--linea);background:#fff;border-radius:7px;padding:3px 7px;font-family:inherit;font-size:11px;line-height:1.3;cursor:pointer}
#pprops .pptratto button:hover,#pprops .pparw button:hover{border-color:var(--ink)}
#pprops .pptratto button[disabled],#pprops .pparw button[disabled]{opacity:.4;cursor:default}
#pprops .pptratto button[disabled]:hover,#pprops .pparw button[disabled]:hover{border-color:var(--linea)}
#pprops .ppchk{display:flex;align-items:center;gap:4px;font-size:10.5px;font-weight:700;cursor:pointer;white-space:nowrap}
#pprops .ppchk input{accent-color:var(--rosso);margin:0}
#pprops .ppasp input[type=range]{flex:1;min-width:0;accent-color:var(--rosso)}
#pprops .ppasp button,#pprops .ppord button,#pprops .ppcol>button{border:1px solid var(--linea);background:#fff;border-radius:7px;padding:3px 7px;font-family:inherit;font-size:11px;line-height:1.3;cursor:pointer;flex:none}
#pprops .ppasp button:hover,#pprops .ppord button:hover,#pprops .ppcol>button:hover{border-color:var(--ink)}
#pprops .ppcol>button[disabled]{opacity:.4;cursor:default}
#pprops .ppcol>button[disabled]:hover{border-color:var(--linea)}
/* v56 — colore del singolo elemento. Le pastiglie sono le .plpc del pannello
   stile del livello (stessa cosa, stesso aspetto), qui piu' piccole perche' la
   scheda e' larga 250px e la riga non deve andare a capo. */
#pprops .ppcol .plpal{flex:1;min-width:0;gap:4px}
#pprops .ppcol .plpc{width:17px;height:17px;border-radius:5px}
/* il selettore libero e' un <input type=color>: si traveste da pastiglia, ma
   il riquadro interno lo disegna il browser e va tolto o resta un bordo bianco */
.plpx{width:17px;height:17px;padding:0;border:2px solid #fff;border-radius:5px;box-shadow:0 0 0 1px var(--linea);background:none;cursor:pointer;flex:none}
.plpx::-webkit-color-swatch-wrapper{padding:0}
.plpx::-webkit-color-swatch{border:none;border-radius:3px}
.plpx::-moz-color-swatch{border:none;border-radius:3px}
#pprops .ppacts{border-top:1px solid var(--linea);padding-top:8px}
#pprops .ppacts button{flex:1;border:1px solid var(--linea);background:#fff;border-radius:8px;padding:5px 4px;font-family:inherit;font-weight:700;font-size:10.5px;cursor:pointer;white-space:nowrap}
#pprops .ppacts button:hover{border-color:var(--ink)}
#pprops .ppacts #ppDel:hover{border-color:var(--err);color:var(--err)}
/* v55 — «＋ campo per questa tipologia»: si allega un campo alla tipologia da
   dove la si sceglie, invece di andarlo a creare nella Tabella */
#pprops .ppaddf{gap:6px;flex-wrap:nowrap;padding-top:5px}
#pprops .ppaddf .ppmeta{font-size:10px}
/* v55 — campo «elenco di righe»: in cima il CONTO (è la domanda vera: quanti
   me ne restano), sotto le righe. Le righe SCORRONO: #pprops non ha altezza
   massima, e 24 persone uscirebbero dal fondo della mappa. */
#pprops .pplst{display:flex;flex-direction:column;gap:5px;border-top:1px solid var(--linea);padding-top:7px;margin-top:7px}
#pprops .pplsthd{gap:6px;flex-wrap:nowrap;justify-content:space-between}
#pprops .pplstn{font-size:10.5px;font-weight:700;color:var(--mut);white-space:nowrap}
#pprops .pplstn b{color:var(--ink);font-size:12.5px;font-weight:800;font-variant-numeric:tabular-nums}
#pprops .pplstn.full b{color:#9a3412}
#pprops .pplstn.over b{color:var(--err)}
#pprops .pplstrows{display:flex;flex-direction:column;gap:4px;max-height:34vh;overflow:auto}
#pprops .pplstrow{display:flex;gap:4px;align-items:center}
#pprops .pplstnum{flex:none;width:15px;text-align:right;font-size:9.5px;font-weight:800;color:var(--mut);font-variant-numeric:tabular-nums}
#pprops .pplsti{flex:1;min-width:0;border:1px solid var(--linea);border-radius:7px;padding:3px 6px;font-family:inherit;font-size:11.5px;background:#fff}
#pprops .pplsti.pplstt{flex:.75;color:var(--mut)}
#pprops .pplstro{flex:1;min-width:0;font-size:11.5px}
#pprops .pplstfoot{display:flex;gap:4px}
#pprops .pplstfoot .pplstadd{flex:1;min-width:0}
#pprops .pplstfoot .pplstpr{flex:none;border-style:solid}
#pprops .pplstadd{border:1px dashed var(--linea);background:none;border-radius:7px;padding:4px;font-family:inherit;font-size:10.5px;font-weight:800;color:var(--mut);cursor:pointer}
#pprops .pplstadd:hover{border-color:var(--ink);color:var(--ink)}
@media(pointer:coarse){#pprops .pplsti{padding:6px}#pprops .pplstadd{padding:8px}}
.budget{font-size:10px;font-weight:800;padding:3px 9px;border-radius:99px;background:var(--bg);color:var(--mut);align-self:center}
.budget.ok{background:#dcfce7;color:#166534}
.budget.warn{background:#ffedd5;color:#9a3412}
.budget.bad{background:#fee2e2;color:#b91c1c}
#pLayers,#pTable{padding:12px 14px}
/* pannello Livelli v52: albero con gruppi, righe minime, menu ⋯, espansione */
.plHead{display:flex;align-items:center;gap:6px;margin-bottom:8px}
.plHact{flex:1;min-width:0;font-size:11px;font-weight:700;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.plHact b{color:var(--ink)}
.plHbtn{flex:none;width:30px;height:30px;border:1px solid var(--linea);background:var(--carta);border-radius:9px;cursor:pointer;font-size:13px;line-height:1;color:var(--ink)}
.plHbtn:hover{border-color:var(--ink)}
.plMenuWrap{position:relative;flex:none}
.plMenu{position:absolute;right:0;top:calc(100% + 3px);z-index:1300;background:var(--carta);border:1px solid var(--linea);border-radius:11px;box-shadow:var(--sh-2);padding:4px;min-width:200px;display:flex;flex-direction:column}
.plMenu button{display:flex;align-items:center;gap:8px;border:none;background:none;text-align:left;padding:8px 10px;font-family:inherit;font-size:12px;font-weight:700;color:var(--ink);border-radius:8px;cursor:pointer;white-space:nowrap}
.plMenu button:hover{background:var(--bg)}
.plMenu button.danger{color:var(--err)}
.plMenu .sep{border-top:1px solid var(--linea);margin:3px 6px}
#plTree{display:flex;flex-direction:column}
.plGrpHd{position:relative;display:flex;align-items:center;gap:6px;padding:6px 4px;border-radius:9px;cursor:pointer;color:var(--mut);font-weight:800;font-size:11.5px;user-select:none}
.plGrpHd:hover{background:var(--carta)}
.plGnm{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.plGrpHd .plGeye{margin-left:auto}
.plGrpBox{margin:0 0 2px 9px;border-left:1px solid var(--linea);padding-left:5px;display:flex;flex-direction:column}
.plRow{position:relative;display:flex;align-items:center;gap:6px;padding:6px 4px;border-radius:9px;border-left:3px solid transparent;cursor:pointer;min-height:32px}
.plRow:hover{background:var(--carta)}
.plRow.act{border-left-color:var(--rosso);background:var(--carta)}
.plRow.dropB,.plGrpHd.dropB{box-shadow:0 -2px 0 0 var(--rosso)}
.plGrip{flex:none;width:14px;text-align:center;color:var(--mut);opacity:0;cursor:grab;font-size:11px}
.plRow:hover .plGrip{opacity:.7}
.plDot{flex:none;width:14px;height:14px;border-radius:50%;border:1px solid rgba(0,0,0,.15);cursor:pointer;padding:0}
.plRow.act .plDot{box-shadow:0 0 0 2px var(--carta),0 0 0 3.5px var(--rosso)}
.plNm{flex:1;min-width:0;font-weight:800;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.plRow.hid .plNm{color:var(--mut);font-weight:600}
.plLk{flex:none;font-size:10px}
.plN{flex:none;font-size:10.5px;font-weight:800;color:var(--mut)}
.plRow.act .plN{color:var(--rosso)}
.plIco{flex:none;border:none;background:none;color:var(--mut);cursor:pointer;font-size:12px;padding:3px 4px;line-height:1}
.plIco:hover{color:var(--ink)}
.plIco.dim{opacity:.35}
.plCar{font-size:10px}
.plEdit{flex:1;min-width:0;width:100%;border:none;border-radius:6px;padding:2px 6px;font-family:inherit;font-weight:700;font-size:12px;background:#fff;box-shadow:0 0 0 1.5px var(--rosso);outline:none}
.plEx{margin:0 2px 8px 20px;display:flex;flex-direction:column}
.plExEmpty{color:var(--mut);font-size:11.5px;padding:4px 6px}
.plTgrp{display:flex;align-items:center;gap:6px;padding:6px 4px 2px;color:var(--mut);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.04em}
/* v55 — tipologia dichiarata ma ancora senza elementi: si vede che c'è (era il
   motivo per cui una tipologia appena creata sembrava non salvata) ma si legge
   che è vuota, senza confondersi con quelle in uso */
.plTgrp.vuota{opacity:.55}
.plTgrp.vuota .plN{background:none;border:1px dashed var(--linea)}
/* v58.1 — tipologia FILTRATA: non è vuota, è nascosta. Il barrato la distingue
   dal grigio di «vuota», e gli elementi sotto restano leggibili ma sbiaditi —
   sono la via da cui si torna a vederla. */
.plTgrp.hid .plTn{text-decoration:line-through;opacity:.6}
.plFrow.hid{opacity:.45}
.plFrow.hid .plFn{text-decoration:line-through}
.plTn[title]{border-bottom:1px dashed var(--linea);cursor:text}
/* v54 — secondo gradino: le VARIANTI dentro una tipologia. Rientrata e in
   minuscolo, così a colpo d'occhio si vede che dipende dalla riga sopra. */
.plStgrp{display:flex;align-items:center;gap:6px;padding:4px 4px 1px 16px;color:var(--mut);font-size:10px;font-weight:700;letter-spacing:.01em}
.plStn[title]{border-bottom:1px dashed var(--linea);cursor:text}
/* la variante è subordinata alla tipologia: più stretta e senza bordo pieno.
   Con due tendine sulla stessa riga la prima si restringe, o il nome
   dell'elemento resterebbe schiacciato a due lettere (`:has` non supportato →
   il nome tronca, nient'altro si rompe) */
.plFs{max-width:76px;background:transparent;font-style:italic}
.plFrow:has(.plFs) .plFt:not(.plFs){max-width:76px}
.plFrow{display:flex;align-items:center;gap:7px;padding:3px 4px;border-radius:8px;cursor:pointer;min-height:28px}
.plFrow:hover{background:var(--carta)}
.plFrow.selrow{background:#fff2f3}
.plFz{flex:none;width:17px;height:17px;border-radius:50%;color:#fff;font-weight:800;font-size:10px;display:flex;align-items:center;justify-content:center;cursor:pointer;print-color-adjust:exact;-webkit-print-color-adjust:exact}
.plFz.none{background:var(--bg);color:var(--mut)}
.plFd{flex:none;width:9px;height:9px;border-radius:50%;margin:0 4px}
.plFn{flex:1;min-width:0;font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.plFn.anon{color:var(--mut);font-style:italic}
.plFt{flex:none;max-width:96px;font-size:10.5px;border:1px solid var(--linea);border-radius:99px;padding:1px 4px;background:var(--carta);color:var(--mut);font-family:inherit}
.plFzoom{opacity:0}
.plFrow:hover .plFzoom{opacity:1}
.plAddT{align-self:flex-start;border:none;background:none;color:var(--mut);font-family:inherit;font-size:11px;font-weight:800;cursor:pointer;padding:4px}
.plAddT:hover{color:var(--ink)}
@media (pointer:coarse){.plGrip,.plFzoom{opacity:.6}.plRow{min-height:40px}.plFrow{min-height:34px}}
.pladd{margin-top:6px}
#plAdd{width:100%;border:1px dashed var(--linea);background:var(--carta);border-radius:9px;padding:8px;font-family:inherit;font-weight:800;font-size:12px;color:var(--ink);cursor:pointer}
#plAdd:hover{border-color:var(--rosso);color:var(--rosso)}
#plStd{width:100%;margin-top:5px;border:1px dashed var(--rosso);background:#fff;border-radius:9px;padding:7px;font-family:inherit;font-weight:800;font-size:11.5px;color:var(--rosso);cursor:pointer}
#plStd:hover{background:#fff2f3}
#plAddForm{border:1px solid var(--linea);border-radius:10px;padding:9px;margin-top:6px;display:flex;flex-direction:column;gap:7px;background:var(--carta)}
#plAddForm input,#plAddForm select{border:1px solid var(--linea);border-radius:7px;padding:5px 7px;font-family:inherit;font-size:12px}
.plpal{display:flex;flex-wrap:wrap;gap:5px}
.plpc{width:22px;height:22px;border-radius:6px;border:2px solid #fff;box-shadow:0 0 0 1px var(--linea);cursor:pointer;padding:0}
.plpc.on{box-shadow:0 0 0 2px var(--ink)}
.pladdacts{display:flex;gap:6px}
.pladdacts button{flex:1;border:1px solid var(--linea);border-radius:8px;padding:6px;font-family:inherit;font-weight:700;font-size:11.5px;cursor:pointer;background:#fff}
#plAddOk{background:var(--rosso);color:#fff;border-color:var(--rosso)}
.pstyle{display:flex;flex-direction:column;gap:8px;min-width:180px}
.pstyle .plpc{width:20px;height:20px}
.psrow{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11.5px;font-weight:700;color:var(--ink)}
.psrow input[type=range]{accent-color:var(--rosso)}
#pTable .ptbl{width:100%;border-collapse:collapse;font-size:12px}
#pTable .ptbl th{text-align:left;color:var(--mut);font-size:10px;text-transform:uppercase;letter-spacing:.03em;padding:4px 6px;border-bottom:1px solid var(--linea)}
#pTable .ptbl td{padding:5px 6px;border-bottom:1px solid var(--linea)}
#pTable .ptbl td.num{text-align:right}
#pTable .ptbl tr[data-fid]{cursor:pointer}
#pTable .ptbl tr[data-fid]:hover{background:var(--bg)}
#pTable .ptbl tr.selrow{background:#fff2f3}
.tdel{border:none;background:none;color:var(--mut);cursor:pointer;font-size:11px}
.tdel:hover{color:var(--err)}
/* v59 — 👁/🚫 per riga: elemento spento a mano dalla Tabella (v. setFeatOff) */
.toff{border:none;background:none;color:var(--mut);cursor:pointer;font-size:12px;margin-right:2px}
.toff:hover{color:var(--ink)}
.toff.isoff{color:var(--err)}
#pTable .ptbl tr.rowoff{opacity:.5}
#pTable .ptbl tr.rowoff td:first-child{text-decoration:line-through}
body.printing .ptools,body.printing #pprops{display:none!important}
.ptblwrap{overflow-x:auto;margin-top:6px}
.tnm,.tin,.tsel{border:1px solid transparent;background:var(--bg);border-radius:6px;padding:3px 5px;font-family:inherit;font-size:11.5px;min-width:60px;max-width:150px;box-sizing:border-box}
.tnm{font-weight:700}
.tnm:focus,.tin:focus,.tsel:focus{outline:none;border-color:var(--ink);background:#fff}
#pTable .ptbl td.num .tin{text-align:right}
.tcolor{width:26px;height:22px;border:1px solid var(--linea);border-radius:5px;padding:0;background:none;cursor:pointer}
.tcb{accent-color:var(--rosso);width:15px;height:15px;cursor:pointer}
.tcalc{font-weight:700;color:var(--ink)}
.tcalc.err{color:var(--err);font-weight:800}
/* v54 — cella di un campo che non appartiene a questa tipologia: spenta, non
   un editor che invita a scrivere un dato senza significato */
.tcalc.off{color:var(--linea);font-weight:800;cursor:help}
.pschema{margin:6px 0 4px}
.schbtn{width:100%;text-align:left;border:1px solid var(--linea);background:var(--carta);border-radius:9px;padding:7px 10px;font-family:inherit;font-weight:800;font-size:11.5px;color:var(--ink);cursor:pointer}
.schbtn:hover{border-color:var(--rosso);color:var(--rosso)}
.scheditor{border:1px solid var(--linea);border-top:none;border-radius:0 0 9px 9px;padding:9px;display:flex;flex-direction:column;gap:6px;background:var(--carta)}
.schf{display:flex;align-items:center;gap:7px;font-size:11.5px;padding:4px 6px;border:1px solid var(--linea);border-radius:7px;background:var(--bg)}
.schf b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.schty{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.02em;color:#fff;background:var(--mut);border-radius:99px;padding:2px 7px;white-space:nowrap;max-width:160px;overflow:hidden;text-overflow:ellipsis;flex:none}
/* v54 — campo legato a una tipologia sola: si dichiara nell'elenco dei campi,
   o resterebbe una regola invisibile che fa sparire colonne senza motivo */
.schonly{font-size:9px;font-weight:800;color:var(--mut);border:1px solid var(--linea);border-radius:99px;padding:1px 6px;white-space:nowrap;max-width:150px;overflow:hidden;text-overflow:ellipsis;flex:none}
/* v55 — la pastiglia «solo …» era inerte: ora è il bottone che apre le
   caselle di spunta delle tipologie (un campo può appartenere a più d'una, e
   la scelta si cambia anche dopo) */
button.schonly{font-family:inherit;background:none;cursor:pointer}
button.schonly:hover{border-color:var(--ink);color:var(--ink)}
button.schonly.vuoto{opacity:.55}
/* v58.1 — «pezzi»: il campo che conta gli oggetti da posare nella Distinta.
   Acceso è pieno, spento è una pastiglia vuota come «solo …». */
.schpz{font-family:inherit;font-size:9px;font-weight:800;border-radius:99px;padding:1px 7px;flex:none;
  cursor:pointer;white-space:nowrap;background:var(--rosso);border:1px solid var(--rosso);color:#fff}
.schpz.vuoto{background:none;color:var(--mut);border-color:var(--linea)}
.schpz.vuoto:hover{border-color:var(--ink);color:var(--ink)}
.schf.schfonly{flex-direction:column;align-items:stretch;gap:6px}
.schonlyBox{display:flex;flex-direction:column;gap:3px}
.schonlyC{display:flex;align-items:center;gap:5px;font-size:11px;font-weight:700;cursor:pointer}
.schonlyC input{accent-color:var(--rosso);margin:0}
.schonlyOk{align-self:flex-start;border:1px solid var(--linea);background:#fff;border-radius:7px;padding:3px 10px;font-family:inherit;font-weight:800;font-size:10.5px;cursor:pointer}
.schonlyOk:hover{border-color:var(--ink)}
/* v55 — conto di un campo «elenco di righe» nella Tabella: porta alla scheda,
   che è dove le righe si scrivono davvero */
.tlst{border:1px solid var(--linea);background:#fff;border-radius:7px;padding:2px 8px;font-family:inherit;font-weight:800;font-size:11.5px;cursor:pointer;font-variant-numeric:tabular-nums}
.tlst:hover{border-color:var(--ink)}
.tlst.full{color:#9a3412}
.tlst.over{color:var(--err);border-color:var(--err)}
.fdel{border:none;background:none;color:var(--mut);cursor:pointer;font-size:12px;padding:0 3px;flex:none}
.fdel:hover{color:var(--err)}
.schadd{display:flex;flex-direction:column;gap:6px;margin-top:4px;border-top:1px dashed var(--linea);padding-top:8px}
.schadd input,.schadd select{border:1px solid var(--linea);border-radius:7px;padding:5px 7px;font-family:inherit;font-size:12px;width:100%;box-sizing:border-box}
.schadd2{display:flex;gap:6px}
.schadd2 #schUnit{flex:1;min-width:0}
#schOk{border:1px solid var(--rosso);background:var(--rosso);color:#fff;border-radius:7px;padding:5px 12px;font-family:inherit;font-weight:700;font-size:11.5px;cursor:pointer;white-space:nowrap;flex:none}
.schchk{font-size:10.5px;font-weight:700;min-height:14px}
.schchk.good{color:#166534}
.schchk.bad{color:var(--err)}
.pedge{display:inline-block;transform:translate(-50%,-50%);background:var(--ink);color:#fff;font-size:calc(10px * var(--mtx,1));font-weight:800;padding:2px 7px;border-radius:99px;cursor:pointer;white-space:nowrap;box-shadow:0 1px 3px rgba(0,0,0,.4);border:1.5px solid #fff}
.pedge:hover{background:var(--rosso)}
/* barra: menu ⋯ (strumenti rari) + riga stats compatta */
#barMore{position:relative;display:inline-flex}
#barMenu{position:absolute;top:calc(100% + 5px);right:0;z-index:1500;background:var(--carta);border:1px solid var(--linea);border-radius:var(--r1);box-shadow:var(--sh-2);padding:5px;display:flex;flex-direction:column;gap:3px;min-width:190px}
#barMenu.hide{display:none}
#barMenu button{text-align:left;border:none;box-shadow:none;background:none}
#barMenu button:hover{background:var(--bg)}
.statline{flex:1;font-size:12px;color:var(--mut);font-weight:700;align-self:center}
.statline b{color:var(--ink);font-weight:800;font-variant-numeric:tabular-nums}
/* v55 — oltre il tetto del cloud l'avviso non è un toast che passa: resta */
.statWarn{flex-basis:100%;margin-top:6px;background:#fee2e2;color:#b91c1c;border-radius:9px;padding:7px 10px;font-size:11px;font-weight:700;line-height:1.35}
#gpkgDlg{position:fixed;inset:0;z-index:3000;display:flex;align-items:center;justify-content:center}
#gpkgDlg .ccBack{position:absolute;inset:0;background:rgba(20,20,28,.45)}
.gpkgCard{position:relative;z-index:1;background:var(--carta);border-radius:14px;box-shadow:var(--sh-2);padding:18px 20px;width:min(470px,92vw);max-height:86vh;overflow:auto;font-family:Montserrat,sans-serif}
.gpkgCard h3{margin:0 0 4px;font-size:15px;color:var(--ink)}
.gpkgSub{font-size:11.5px;color:var(--mut);margin-bottom:12px;line-height:1.45}
.gpkgList{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.gpkgRow{display:flex;align-items:center;gap:8px;padding:7px 9px;border:1px solid var(--linea);border-radius:9px;font-size:12px;cursor:pointer}
.gpkgRow input{accent-color:var(--rosso);flex:none}
.gpkgRow b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gpkgTy{font-size:9px;font-weight:800;text-transform:uppercase;color:#fff;background:var(--mut);border-radius:99px;padding:2px 7px;flex:none}
.gpkgN,.gpkgF{font-size:10.5px;color:var(--mut);font-weight:700;white-space:nowrap;flex:none}
.gpkgDst{flex:none;max-width:150px;font-family:inherit;font-size:10.5px;font-weight:700;border:1px solid var(--linea);border-radius:7px;padding:3px 5px;background:var(--bg);color:var(--ink)}
.gpkgActs{display:flex;gap:8px;justify-content:flex-end}
.gpkgActs button{border:1px solid var(--linea);background:#fff;border-radius:9px;padding:8px 16px;font-family:inherit;font-weight:700;font-size:12px;cursor:pointer}
.gpkgActs #gpkgOk{background:var(--rosso);border-color:var(--rosso);color:#fff}
.gpkgActs #gpkgOk:hover{background:var(--rosso-d)}
/* v57 — PIANO INTERNO DELLA TRIBUNA. Stessa famiglia di #verDlg/#gpkgDlg, ma
   la card e' larga: quelle due sono da 470px perche' contengono un elenco,
   qui dentro c'e' uno schema orizzontale e a 470 sarebbe illeggibile.
   In stampa il modale si nasconde da se' (regola body.pPrinting in fondo al
   file): vive in <body>, non dentro #app. */
/* v70 — #matDlg (le liste del materiale) riusa questo guscio: .tribCard e
   compagne descrivono un MODALE, non la tribuna. Chi ne aggiunge un terzo
   allunga queste due righe e quella di body.pPrinting in fondo al file. */
#tribDlg,#matDlg{position:fixed;inset:0;z-index:3000;display:flex;align-items:center;justify-content:center}
#tribDlg .ccBack,#matDlg .ccBack{position:absolute;inset:0;background:rgba(20,20,28,.45)}
.tribCard{position:relative;z-index:1;background:var(--carta);border-radius:14px;box-shadow:var(--sh-2);padding:16px 18px;width:min(1040px,94vw);max-height:88vh;overflow:auto;font-family:Montserrat,sans-serif}
.tribHd{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.tribHd h3{margin:0;flex:1;font-size:15px;color:var(--ink)}
.tribHd button{border:1px solid var(--linea);background:#fff;border-radius:8px;width:30px;height:30px;font-size:13px;cursor:pointer;color:var(--ink);padding:0;flex:none}
.tribHd button:hover{border-color:var(--rosso);color:var(--rosso)}
/* lo schema scorre dentro il SUO riquadro e non con tutta la card: cosi' su uno
   schermo basso la testata e il bottone «Stampa» restano sempre raggiungibili */
.tribBox{overflow:auto;max-height:calc(88vh - 132px)}
.tribFt{display:flex;align-items:center;gap:10px;margin-top:12px;font-size:11px;color:var(--mut);font-weight:600;line-height:1.4}
.tribFt span{flex:1}
.tribGo{border:1px solid var(--linea);background:#fff;border-radius:9px;padding:8px 14px;font-family:inherit;font-weight:700;font-size:12px;cursor:pointer;color:var(--ink);flex:none}
.tribGo:hover{border-color:var(--rosso);color:var(--rosso)}
/* Col telefono lo schema NON si rimpicciolisce fino a sparire: a 375px un
   `width:100%` porterebbe i nomi delle stanze a 6px e la legenda a 5 — e la
   legenda, che e' dentro l'SVG, si rimpicciolirebbe con lui. Si tiene una
   larghezza minima leggibile e si scorre di lato DENTRO .tribBox, che e' gia'
   un riquadro con overflow: la pagina non scorre. */
@media(max-width:640px){
  .tribFt{flex-direction:column;align-items:stretch}
  .tribGo{width:100%;padding:11px 14px}
  .tribBox svg{width:auto;min-width:860px}
}
#verDlg{position:fixed;inset:0;z-index:3000;display:flex;align-items:center;justify-content:center}
#verDlg .ccBack{position:absolute;inset:0;background:rgba(20,20,28,.45)}
.verCard{position:relative;z-index:1;background:var(--carta);border-radius:14px;box-shadow:var(--sh-2);padding:18px 20px;width:min(470px,92vw);max-height:86vh;overflow:auto;font-family:Montserrat,sans-serif}
.verCard h3{margin:0 0 4px;font-size:15px;color:var(--ink)}
.verList{display:flex;flex-direction:column;gap:6px;margin:10px 0 14px}
.verRow{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--linea);border-radius:9px}
.verInfo{flex:1;min-width:0;display:flex;flex-direction:column}
.verInfo b{font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.verInfo span{font-size:10.5px;color:var(--mut);font-weight:600}
.verActs{display:flex;gap:3px;flex:none}
.verActs button{border:1px solid var(--linea);background:#fff;border-radius:7px;width:26px;height:26px;font-size:12px;cursor:pointer;color:var(--ink);padding:0}
.verActs button:hover{border-color:var(--rosso);color:var(--rosso)}
.verBottom{display:flex;gap:6px;flex-wrap:wrap}
.verBottom button{border:1px solid var(--linea);background:#fff;border-radius:9px;padding:8px 12px;font-family:inherit;font-weight:700;font-size:11.5px;cursor:pointer}
.verBottom #verSave{background:var(--rosso);border-color:var(--rosso);color:#fff}
#pComputo{padding:12px 14px}
.compbtn{border:1px solid var(--linea);background:#fff;border-radius:7px;padding:2px 8px;font-family:inherit;font-weight:700;font-size:10.5px;cursor:pointer;margin-left:4px}
.compbtn:hover{border-color:var(--rosso);color:var(--rosso)}
.compSec{margin-bottom:12px}
.compHd{display:flex;align-items:center;gap:7px;margin-bottom:4px}
.compSw{width:12px;height:12px;border-radius:4px;flex:none}
.compHd b{flex:1;font-size:12.5px}
.compN{font-size:10.5px;color:var(--mut);font-weight:700}
/* filtro Tipologia sopra la tabella del livello attivo */
.tfilt{margin:6px 0 2px;font-size:11px;color:var(--mut);font-weight:700}
.tfilt select{margin-left:5px;border:1px solid var(--linea);border-radius:7px;padding:4px 6px;font-family:inherit;font-size:11.5px;background:#fff;max-width:100%}
.compEmpty{font-size:11px;color:var(--mut);padding:2px 0 4px}
/* dettaglio per Tipologia dentro ogni macro-categoria (<details> nativo) */
.compTipi{margin-top:4px}
.compTipi>summary{font-size:10.5px;font-weight:800;color:var(--mut);cursor:pointer;padding:3px 0;list-style:none}
.compTipi>summary::-webkit-details-marker{display:none}
.compTipi>summary::before{content:'▸ ';display:inline-block;transition:transform .15s}
.compTipi[open]>summary::before{content:'▾ '}
.compTipi>summary:hover{color:var(--ink)}
.compTipi .ptbl td{font-size:11px}
.compDet{font-size:10.5px;color:var(--mut);text-align:right}
.compTot{border-top:2px solid var(--linea);padding-top:8px;margin-top:6px;font-size:12px;display:flex;flex-direction:column;gap:3px}
.compTot b{color:var(--ink)}
/* v58.1 — LA DISTINTA: i pezzi da posare. Il numero grande a destra e' la
   risposta, i metri accanto servono a ordinare (le transenne si comprano a
   metri, si posano a pezzi). */
.distHead{margin-bottom:8px}
.distHead .compHd b{flex:none}
.distHead .compN{flex:1}
.distSec{margin-bottom:10px}
.distTbl td{padding:3px 0}
.distPz{font-weight:800;font-size:13px;color:var(--ink);width:52px}
.distM{font-size:10.5px;color:var(--mut);text-align:right;white-space:nowrap;padding-right:8px!important}
/* il Computo di sempre, ripiegato: non si perde niente, smette solo di essere
   la prima cosa che si legge */
.compMis{margin-top:14px;border-top:1px dashed var(--linea);padding-top:8px}
.compMis>summary{font-size:11px;font-weight:800;color:var(--mut);cursor:pointer;padding:4px 0;list-style:none}
.compMis>summary::-webkit-details-marker{display:none}
.compMis>summary::before{content:'▸ '}
.compMis[open]>summary::before{content:'▾ '}
.compMis>summary:hover{color:var(--ink)}
.compTotMis{border-top-width:1px;font-size:11.5px;color:var(--mut)}
/* v56 — riquadro Parcheggi in cima al Computo. Sta sopra a tutto perche' e' la
   domanda che si fa piu' spesso («quanti posti restano?»), e per lo stesso
   motivo il numero che conta e' nell'intestazione, non in fondo alla tabella. */
.parkSec{border-bottom:2px solid var(--linea);padding-bottom:10px}
.parkSec .compHd b{flex:none}
.parkSec .compN{flex:1}
.parkTbl{width:100%;border-collapse:collapse;font-size:11.5px}
.parkTbl th{text-align:left;color:var(--mut);font-size:10px;text-transform:uppercase;letter-spacing:.03em;padding:3px 5px;border-bottom:1px solid var(--linea);font-weight:800}
.parkTbl td{padding:4px 5px;border-bottom:1px solid var(--linea)}
.parkTbl td.num,.parkTbl th.num{text-align:right}
.parkTbl td:first-child{display:flex;align-items:center;gap:6px}
.parkTip{color:var(--mut);font-size:10.5px}
.parkRow{cursor:pointer}
.parkRow:hover{background:var(--bg)}
/* v57 — riquadro Tribuna: SOLO i nomi dei locali. Non e' un conto, quindi non
   e' una tabella — la domanda a cui risponde e' «cosa c'e' dentro la tribuna»,
   e il dettaglio sta a un clic (bottone «Piano interno»). */
.tribSec{border-bottom:2px solid var(--linea);padding-bottom:10px}
.tribSec .compHd b{flex:none}
.tribSec .compN{flex:1}
.tribNomi{font-size:11.5px;color:var(--ink);font-weight:600;line-height:1.5}
/* pieno e oltre: due stati diversi, e il secondo e' un fatto da dichiarare, non
   un numero da azzerare (25 persone su 24 posti succede) */
.park-full{color:#9a3412;font-weight:800}
.park-over{color:var(--err);font-weight:800}
.compFlag{color:var(--err);font-weight:800}
/* azioni riga + badge "nuovo" + eliminati */
.vacts{white-space:nowrap}
tr.vrow{cursor:pointer}
tr.vrow:hover td{background:#fafafa}
.vico{width:24px;height:24px;border:1px solid var(--linea);background:var(--carta);border-radius:7px;font-size:11.5px;cursor:pointer;padding:0;margin-left:4px;vertical-align:middle;line-height:1}
.vico:hover{border-color:var(--ink);box-shadow:var(--sh-1)}
.vchev{display:inline-block;margin-left:7px;color:var(--mut);font-size:10px;transition:transform .15s;vertical-align:middle}
tr.vrow.open .vchev{transform:rotate(180deg)}
.vnew{font-size:8.5px;font-weight:800;color:#1e40af;background:#dbeafe;border-radius:99px;padding:1px 6px;vertical-align:1px;letter-spacing:.03em;text-transform:uppercase}
.vgone{margin-top:12px;padding:8px 11px;background:var(--carta);border:1px dashed var(--linea);border-radius:var(--r1);font-size:11.5px;color:var(--mut);font-weight:600;line-height:1.5}
.vgone button{border:none;background:none;color:var(--rosso);font-weight:800;font-family:inherit;font-size:11.5px;cursor:pointer;padding:0}
.vgone button:hover{text-decoration:underline}
/* pulsante + form "nuovo stand in metri" */
#addStand{margin-top:12px;width:100%;padding:9px;border:1px dashed var(--linea);border-radius:var(--r1);background:var(--carta);font-family:inherit;font-weight:800;font-size:12px;cursor:pointer;box-shadow:var(--sh-1)}
#addStand:hover{border-color:var(--ink)}
.vaddcard{background:var(--carta);border:1px solid var(--linea);border-radius:var(--r1);box-shadow:var(--sh-1);padding:11px;margin-top:8px;display:flex;flex-direction:column;gap:9px}
.vadddims{display:grid;grid-template-columns:1fr 1fr 1.2fr;gap:9px}
.vaddacts{display:flex;gap:8px}
.vaddacts button{flex:1;padding:7px;border-radius:var(--r1);font-family:inherit;font-weight:800;font-size:11.5px;cursor:pointer;border:1px solid var(--linea);background:#fff}
.vaddacts #vaOk{background:var(--rosso);border-color:var(--rosso);color:#fff}
.vaddacts #vaOk:hover{background:var(--rosso-d)}

/* selettore export nella toolbar */
#bar select.expSel{max-width:130px}

/* stampa: nascondere nav e banner */
@media print{
  body.printing #topnav,body.printing .fixedToasts{display:none!important}
  body.printing.haspanel #app{height:auto}
}


/* v11: la nav ha gia' la riga rossa in alto - il pannello non la ripete */
body.haspanel header{border-top:none;padding-top:12px}

/* ===================== v12 — mobile / iPhone ===================== */
@media(max-width:640px){
  :root{--nav-h:46px}
  #topnav{height:46px;padding:0 10px;gap:8px}
  #topnav .brand img{height:24px}
  #topnav .links{overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
  #topnav .links::-webkit-scrollbar{display:none}
  #topnav .links a{padding:6px 10px;font-size:11.5px;white-space:nowrap}
  #topnav .vchip{display:none}
  header{padding:9px 12px 8px}
  #stats{gap:6px;margin-top:8px}
  .stat{padding:6px 9px}
  .stat b{font-size:14px}
  #issues{max-height:46px;margin-top:7px}
  #bar{padding:8px 10px;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
  #bar::-webkit-scrollbar{display:none}
  #bar button,#bar select{white-space:nowrap;flex-shrink:0}
  #tabs{margin:9px 10px 0}
  .pane{padding:8px 10px 16px}
  .row{padding:7px 8px}
  .row .pos{min-width:48px;font-size:9.5px}
  table{font-size:11px}
  th,td{padding:4px 6px}
  .lyrPanel{min-width:148px;max-width:72vw}
  .lyrBody{max-height:36vh}
  .hero{padding:20px 14px 40px}
  .hero h1{font-size:20px}
  .cards{grid-template-columns:1fr}
  #printDlg .pcard{width:92vw;padding:16px}
  /* col dito il riquadro «Cosa si stampa» deve restare una lista scorrevole
     dentro un dialogo che è già tutto lo schermo: più basso, non più alto */
  .pContBody{max-height:28vh}
  .fixedToasts{left:8px;right:8px;bottom:10px;max-width:none}
  .leaflet-control-scale{display:none}
}


/* ---------- Stadio 3D (CesiumJS) ---------- */
.page-stadio3d #cesium{flex:1;min-width:0;position:relative;background:#0b0e1a}
.page-stadio3d #cesium .cesium-viewer,.page-stadio3d #cesium .cesium-widget,
.page-stadio3d #cesium .cesium-widget canvas{width:100%;height:100%}
.page-stadio3d .cesium-viewer-bottom{display:none}
#s3dCredits{position:absolute;left:8px;bottom:6px;z-index:20;font-size:10px;color:#fff;opacity:.75;pointer-events:none}
#s3dCredits *{font-size:10px!important}
/* v29: via il logo Cesium ion e il link "Data attribution" (non usiamo asset
   ion, nessun obbligo); resta l'attribuzione swisstopo — obbligo di licenza
   geo.admin.ch — come testo statico. Classi .cesium-credit-* verificate sulla
   1.126 pinnata nel CDN: ricontrollare a un futuro bump di Cesium. */
#s3dCredits .cesium-credit-logoContainer,#s3dCredits .cesium-credit-textContainer,
#s3dCredits .cesium-credit-expand-link{display:none!important}
#s3dCredits::after{content:"© swisstopo · CesiumJS"}
#s3dTip{display:none;position:absolute;z-index:30;max-width:280px;background:rgba(21,21,28,.92);color:#fff;
  font-size:12px;font-weight:600;line-height:1.45;padding:7px 10px;border-radius:8px;pointer-events:none;white-space:pre-line}
.s3dTitle{font-size:16px;font-weight:800}
.s3dTitle span{display:block;font-size:11px;font-weight:700;color:var(--mut);margin-top:2px}
.s3dSec{padding:12px 14px;border-bottom:1px solid var(--linea)}
.s3dSec h3{margin:0 0 8px;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut)}
.s3dChk{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:700;padding:4px 0;cursor:pointer}
.s3dSec select{width:100%;font-family:inherit;font-size:13px;font-weight:700;padding:8px 10px;
  border:1px solid var(--linea);border-radius:9px;background:var(--carta)}
.s3dRow{display:flex;align-items:center;gap:10px;margin-top:8px;font-size:12px;font-weight:700;color:var(--mut)}
.s3dRow input[type=range]{flex:1}
.s3dRow input[type=date]{font-family:inherit;font-size:12.5px;font-weight:700;padding:6px 8px;border:1px solid var(--linea);border-radius:8px}
.s3dHint{font-size:11px;color:var(--mut);font-weight:600;margin:8px 0 0;line-height:1.5}
.s3dViews{display:flex;flex-wrap:wrap;gap:6px}
.s3dViews button,#bar button{font-size:12px;font-weight:800;font-family:inherit;color:var(--ink);padding:7px 12px;
  border:1px solid var(--linea);background:var(--carta);cursor:pointer;border-radius:99px;box-shadow:var(--sh-1)}
.s3dViews button:hover,#bar button:hover{background:var(--bg)}
#bar button.primary{background:var(--rosso);border-color:var(--rosso);color:#fff}
.s3dCal{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px}
.s3dCal label{display:flex;flex-direction:column;gap:4px;font-size:11px;font-weight:700;color:var(--mut)}
.s3dCal input{font-family:inherit;font-size:13px;font-weight:700;padding:7px 9px;border:1px solid var(--linea);border-radius:8px}
.s3dSec button.primary{font-size:12px;font-weight:800;font-family:inherit;color:#fff;padding:8px 14px;
  border:1px solid var(--rosso);background:var(--rosso);cursor:pointer;border-radius:99px}

/* ===================== v20 — restyling "wow" (identità INVARIATA) =====================
   Stessi colori (--rosso/--navy/--ink), stesso font Montserrat, stesso logo.
   Solo finitura: profondità, luce, micro-animazioni. Le regole qui sotto
   sovrascrivono per cascata quelle storiche più in alto. */

/* --- home: fondale con bagliori sottili nei colori del Galà + filo rosso in alto --- */
body.page-dash{background:
  radial-gradient(900px 420px at 88% -8%,rgba(227,6,19,.055),transparent 62%),
  radial-gradient(760px 400px at -8% 2%,rgba(31,29,77,.07),transparent 58%),
  var(--bg)}
body.page-dash::before{content:"";position:fixed;top:0;left:0;right:0;height:3px;z-index:10;
  background:linear-gradient(90deg,var(--rosso) 0%,var(--rosso-d) 55%,var(--navy) 100%)}
.dash{padding-top:34px}
.dashHead{margin-bottom:26px}
.dashHead .dhLogo{height:52px;filter:drop-shadow(0 2px 6px rgba(21,21,40,.14))}
.dashHead .dhTitle h1{font-size:25px}
.dashHead .dhTitle p{margin-top:4px}

/* --- hero "Generale stadio": navy Galà + corsie di pista stilizzate --- */
.hubBanner{background:linear-gradient(128deg,var(--navy) 0%,#1a1840 52%,var(--ink) 100%);
  transition:transform .18s cubic-bezier(.22,.9,.3,1),box-shadow .22s}
.hubBanner::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:repeating-radial-gradient(circle at 108% 132%,transparent 0 30px,rgba(255,255,255,.045) 30px 33px,transparent 33px 63px)}
.hubBanner::after{width:260px;height:260px;background:radial-gradient(circle,rgba(227,6,19,.28),rgba(227,6,19,.06) 62%,transparent 72%)}
.hubBanner:hover{transform:translateY(-3px);box-shadow:0 14px 40px rgba(31,29,77,.28)}
.hubBanner .hbIc{background:rgba(255,255,255,.12);box-shadow:inset 0 0 0 1px rgba(255,255,255,.14)}
.hubBanner .hbKick{color:#ff8b93;opacity:1}
.hubBanner .hbGo{transition:background .15s,gap .18s;box-shadow:0 6px 18px rgba(227,6,19,.35)}
.hubBanner:hover .hbGo{background:var(--rosso-d);gap:11px}

/* --- card moduli: sheen, barra rossa che si accende, icona che prende colore --- */
.modTile{border-radius:18px;background:linear-gradient(180deg,var(--carta) 0%,#fbfbfd 100%);overflow:hidden;
  transition:border-color .18s,transform .18s cubic-bezier(.22,.9,.3,1),box-shadow .2s}
.mtStretch::after{border-radius:18px}
.modTile::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;
  background:linear-gradient(90deg,var(--rosso),rgba(227,6,19,0) 78%);opacity:0;transition:opacity .2s}
.modTile.attivo:hover{transform:translateY(-3px)}
.modTile.attivo:hover::before{opacity:1}
.modTile .mtIc{transition:background .18s,color .18s,transform .18s}
.modTile.attivo:hover .mtIc{background:var(--rosso);color:#fff;transform:scale(1.06)}
.modTile .mtStat b{font-size:21px}
.badge.on{display:inline-flex;align-items:center;gap:5px}
.badge.on::before{content:"";width:6px;height:6px;border-radius:50%;background:#0f7537;animation:bpulse 2.2s ease-in-out infinite}
@keyframes bpulse{50%{opacity:.3}}

/* --- ingresso morbido della home (rispetta prefers-reduced-motion) --- */
@keyframes riseIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
.dashHead{animation:riseIn .4s .02s backwards}
.hubBanner{animation:riseIn .45s .08s backwards}
.modGrid .modTile{animation:riseIn .45s backwards}
.modGrid .modTile:nth-child(1){animation-delay:.13s}
.modGrid .modTile:nth-child(2){animation-delay:.18s}
.modGrid .modTile:nth-child(3){animation-delay:.23s}
.modGrid .modTile:nth-child(4){animation-delay:.28s}
.modGrid .modTile:nth-child(5){animation-delay:.33s}

/* --- nav condivisa: più luce, chip sync a pillola, badge DEV --- */
#topnav{box-shadow:0 4px 14px rgba(21,21,40,.05)}
#topnav .brand img{transition:transform .18s}
#topnav .brand:hover img{transform:scale(1.05)}
#syncChip{background:var(--bg);border:1px solid var(--linea);border-radius:99px;padding:3px 9px;line-height:1.4}
.devb{color:#fff;background:var(--rosso);border-radius:6px;padding:1.5px 7px;margin-left:6px;letter-spacing:.06em;font-size:10px;font-weight:800;white-space:nowrap}

/* --- accessibilità: anello di fuoco nei colori del Galà --- */
:is(button,a,select,input,textarea):focus-visible{outline:2px solid var(--rosso);outline-offset:2px}

/* --- banner file:// (pagina aperta col doppio-click: NIENTE sync) --- */
#fileBanner{position:fixed;left:0;right:0;bottom:0;z-index:6000;
  background:linear-gradient(90deg,var(--rosso),var(--rosso-d));color:#fff;
  font-size:12.5px;font-weight:700;line-height:1.5;text-align:center;
  padding:11px 18px;box-shadow:0 -6px 22px rgba(184,4,15,.35)}
#fileBanner b{font-weight:800}
#fileBanner a{color:#fff;font-weight:800;text-decoration:underline;text-underline-offset:2px}
body.hasFileBanner .fixedToasts{bottom:70px}
body.hasFileBanner #toasts{bottom:78px}
body.hasFileBanner #brandChip{bottom:78px}

/* --- dialogo "Modifiche in conflitto" (sync cloud↔locale) --- */
#cloudConflict{position:fixed;inset:0;z-index:7000;display:flex;align-items:center;justify-content:center;padding:16px}
#cloudConflict .ccBack{position:absolute;inset:0;background:rgba(21,21,30,.52);backdrop-filter:blur(3px);animation:palFade .12s}
#cloudConflict .ccCard{position:relative;width:470px;max-width:94vw;background:var(--carta);border-radius:16px;
  box-shadow:0 20px 60px rgba(21,21,40,.4);padding:20px 22px;animation:ccPop .16s cubic-bezier(.2,.9,.3,1.15)}
@keyframes ccPop{from{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:none}}
#cloudConflict h3{font-size:16px;font-weight:800;display:flex;align-items:center;gap:8px;margin-bottom:4px}
#cloudConflict .ccSub{font-size:12px;color:var(--mut);font-weight:600;line-height:1.55;margin-bottom:12px}
#cloudConflict .ccWhen{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px}
#cloudConflict .ccWhen div{background:var(--bg);border-radius:10px;padding:8px 11px;font-size:11px;font-weight:600;color:var(--mut)}
#cloudConflict .ccWhen b{display:block;font-size:12px;color:var(--ink);font-weight:800;margin-top:2px}
#cloudConflict .popt.ccMain{border-color:var(--rosso);background:#fff}
#cloudConflict .popt.ccMain b{color:var(--rosso)}

@media print{#fileBanner,#cloudConflict{display:none!important}}

@media(max-width:640px){
  .dashHead .dhLogo{height:42px}
  .dashHead .dhTitle h1{font-size:21px}
  #cloudConflict .ccWhen{grid-template-columns:1fr}
}
@media(prefers-reduced-motion:reduce){
  .dashHead,.hubBanner,.modGrid .modTile{animation:none}
  .badge.on::before{animation:none}
}

/* ===================== v21 — login, account, cantiere ===================== */

/* --- pagina di accesso --- */
.page-login{display:flex;min-height:100%}
.loginWrap{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:28px 16px;gap:18px}
.loginCard{width:400px;max-width:94vw;background:linear-gradient(180deg,var(--carta) 0%,#fbfbfd 100%);
  border:1px solid var(--linea);border-radius:20px;box-shadow:var(--sh-2);padding:30px 30px 24px;
  display:flex;flex-direction:column;text-align:center;position:relative;overflow:hidden;animation:riseIn .45s .05s backwards}
.loginCard::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;
  background:linear-gradient(90deg,var(--rosso),var(--rosso-d) 55%,var(--navy))}
.loginCard .lgLogo{height:56px;width:auto;margin:2px auto 14px;filter:drop-shadow(0 2px 6px rgba(21,21,40,.14))}
.loginCard h1{font-size:21px;font-weight:800;letter-spacing:-.02em}
.loginCard .lgSub{font-size:11.5px;color:var(--mut);font-weight:700;margin:3px 0 20px}
.lgField{display:block;text-align:left;margin-bottom:12px}
.lgField[hidden]{display:none} /* [hidden] da solo perde contro .lgField per pari specificità: qui vince */
.lgField>span:first-child{display:block;font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--mut);margin-bottom:5px}
.lgField input{width:100%;font-family:inherit;font-size:14px;font-weight:600;color:var(--ink);
  padding:11px 13px;border:1.5px solid var(--linea);border-radius:11px;background:var(--bg);outline:none;transition:border-color .15s,background .15s}
.lgField input:focus{border-color:var(--rosso);background:var(--carta)}
.lgPwdWrap{position:relative;display:block}
.lgPwdWrap input{padding-right:42px}
.lgPwdWrap button{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:none;background:none;
  font-size:15px;cursor:pointer;padding:5px 7px;border-radius:8px;color:var(--mut)}
.lgPwdWrap button:hover{background:var(--bg);color:var(--ink)}
.lgErr{background:#fee2e2;color:#991b1b;font-size:12px;font-weight:700;border-radius:10px;padding:9px 12px;margin-bottom:12px;text-align:left}
.lgGo{width:100%;font-family:inherit;font-size:14px;font-weight:800;color:#fff;background:var(--rosso);
  border:none;border-radius:12px;padding:12px;cursor:pointer;box-shadow:0 6px 18px rgba(227,6,19,.3);
  transition:background .15s,transform .08s;margin-top:2px}
.lgGo:hover{background:var(--rosso-d)}
.lgGo:active{transform:translateY(1px)}
.lgGo:disabled{opacity:.7;cursor:default}
.lgHint{font-size:11px;color:var(--mut);font-weight:600;line-height:1.6;margin-top:14px}
.lgHint b{color:var(--ink)}
.lgFoot{font-size:11px;color:var(--mut);font-weight:600}
.lgFoot a{color:var(--mut);font-weight:800}
.lgFoot a:hover{color:var(--rosso)}

/* --- chip account + Esci (nav e home) --- */
.accChip{font-size:11px;font-weight:800;color:var(--ink);background:var(--bg);border:1px solid var(--linea);
  border-radius:99px;padding:4px 11px;white-space:nowrap;max-width:180px;overflow:hidden;text-overflow:ellipsis}
.accOut{font-family:inherit;font-size:11px;font-weight:800;color:var(--mut);background:none;
  border:1px solid var(--linea);border-radius:99px;padding:4px 11px;cursor:pointer;transition:all .13s;white-space:nowrap}
.accOut:hover{color:#fff;background:var(--ink);border-color:var(--ink)}
@media(max-width:640px){
  .accChip{max-width:90px}
}

/* --- barra CANTIERE: il sito -dev si riconosce OVUNQUE, a colpo d'occhio --- */
#cantiereBar{position:fixed;top:0;left:0;right:0;z-index:6500;height:32px;
  display:flex;align-items:center;justify-content:center;gap:9px;
  background:repeating-linear-gradient(135deg,var(--warn) 0 18px,var(--ink) 18px 36px);
  color:#fff;font-size:11px;font-weight:700;letter-spacing:.02em;white-space:nowrap;overflow:hidden;
  text-shadow:0 1px 2px rgba(0,0,0,.6);box-shadow:0 2px 12px rgba(0,0,0,.3)}
#cantiereBar b{background:rgba(0,0,0,.55);border-radius:99px;padding:2.5px 13px;font-weight:800;letter-spacing:.05em}
body.cantiere #topnav{margin-top:32px}
/* la striscia si aggiunge alla nav: da qui in poi tutto ciò che si appoggia
   sotto la testata (mappa, linguetta destra, cassetto Layer) segue da solo */
body.cantiere{--nav-h:84px}
body.cantiere.page-dash .dash{padding-top:calc(34px + 32px)}
body.cantiere.page-login .loginWrap{padding-top:60px}
@media(max-width:640px){
  #cantiereBar{font-size:10px}
  #cantiereBar span{display:none} /* su schermi stretti resta il badge principale */
  body.cantiere{--nav-h:78px}     /* nav mobile 46 + striscia 32 */
}
@media print{#cantiereBar{display:none!important}}

/* ===================== v54.2 — NAV COMPATTA: la barra entra nello schermo =====================
   La nav è una riga sola e non si adattava: brand + 11 link + chip account +
   Esci + chip versione chiedevano ~1500px, e sotto quella misura sporgevano
   dallo schermo trascinandosi dietro la BARRA DI SCORRIMENTO ORIZZONTALE
   dell'INTERA PAGINA — su ogni modulo, perché la nav è condivisa. Misurato: il
   contenuto delle pagine ci sta già, l'unico pezzo che sfora è questo.
   Attenzione a chi guarda le larghezze in px: con lo scalamento di Windows al
   150% un monitor da 1920 dà 1265px di viewport al 100% di zoom, ed è per
   questo che serviva scendere all'80%.

   Le regole stanno QUI, in fondo, e non accanto al blocco `#topnav` della v11:
   `.devb`, `.accChip` e le loro varianti sono dichiarate più sotto nel file e
   una media query NON aggiunge specificità — messe prima, perderebbero.
   I due livelli partono da sopra i 640px perché sotto comanda il blocco mobile
   della v12 (link a scorrimento, chip nascosti), che è dichiarato prima. Il
   tetto è 1600 e non 1500: la nav a grandezza piena ne chiede ~1505, quindi
   staccare la compattazione a 1500 lascerebbe scoperta proprio la striscia di
   larghezze in cui serve.

   `min-width:640.02px` e non `641px`: la larghezza del viewport può essere
   FRAZIONARIA (zoom del browser, scalamento dello schermo, Safari su iPad), e
   a 640,5px non varrebbe né `max-width:640px` né `min-width:641px` — la nav
   tornerebbe a grandezza piena proprio sullo schermo più stretto di tutti. */
@media(min-width:640.02px) and (max-width:1600px){
  #topnav{gap:10px;padding:0 10px}
  #topnav .brand img{height:23px}
  #topnav .links{gap:1px}
  /* Il corpo del testo NON è cosmesi qui: le voci vanno a capo dentro la
     pastiglia, quindi la larghezza minima della barra è la somma delle parole
     più lunghe («Cronometraggio», «Programma»). Da 12,5 a 11,5px la nav intera
     passa da ~1230 a ~1160px, ed è quello che le fa entrare in un portatile. */
  #topnav .links a{padding:6px 8px;font-size:11.5px}
  #topnav .navright{gap:8px}
  /* «GALA 2026» lo dice il logo, e la versione resta: è quella che serve
     quando si chiede «che versione stai guardando?». */
  #topnav .vchip .vlong{display:none}
  /* Il badge CANTIERE sparisce, non l'avviso: sopra la nav c'è già la striscia
     a strisce gialle e nere di #cantiereBar, larga tutto lo schermo. Quando lo
     spazio è poco, la prima cosa che se ne va è la ripetizione. */
  #topnav .devb{display:none}
  .accChip{max-width:110px}
}
/* Portatili piccoli e finestre affiancate: sotto i ~1160px nemmeno andando a
   capo la barra ci sta più, quindi i link tornano su una riga sola e scorrono,
   come sul telefono — meglio una striscia da scorrere che una nav che spinge
   fuori tutta la pagina. La soglia sta appena sopra il punto di rottura
   misurato: sopra si vede tutto, sotto si scorre, e in mezzo non resta un
   intervallo scoperto. */
@media(min-width:640.02px) and (max-width:1180px){
  #topnav .links{overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;min-width:0}
  #topnav .links::-webkit-scrollbar{display:none}
  #topnav .links a{white-space:nowrap;padding:6px 9px}
  #topnav .vchip{display:none}
}

/* ===================== v23 — mappa striscioni più ariosa e amica del touch ===================== */
/* v24: pannello Livelli spostato a SINISTRA (sotto i comandi zoom/▦), lontano
   dalla linguetta di chiusura del pannello destro con cui si accavallava.
   Un filo di stacco dai bottoni sopra e corpo non troppo alto. */
.leaflet-top.leaflet-left .lyrPanel{margin-top:8px;clear:both}
@media(min-width:641px){ .lyrBody{max-height:48vh} }
/* v53 — mobile: stesso cassetto laterale del desktop (stesso gesto), solo più
   stretto quando lo schermo è piccolo. La barra strumenti slitta anche qui: su
   375 px finisce a 248-288, dentro lo schermo — lasciarla ferma vorrebbe dire
   sotterrarla sotto il cassetto ogni volta che lo si apre. */
@media(max-width:820px){
  :root{--lyr-w:min(238px,78vw)}
  .lyrDrawer .lyrBody{max-height:none}
}
@media(pointer:coarse){
  /* iPad/telefono: bersagli più grandi per zoom, ▦ e voci del pannello Livelli */
  .leaflet-bar a{width:40px!important;height:40px!important;line-height:40px!important;font-size:19px}
  .lyrHead{padding:12px 15px}
  .lyrBody label{padding:6px 0}
  .lyrTab{padding:20px 8px}
  .lyrGo{padding:8px 9px}
}

/* ===================== v28 — modulo Città (guida atleti) ===================== */
/* punto sulla mappa: il pallino colorato con l'emoji, e basta.
   v66 — L'ETICHETTA ACCANTO (.cplbl) NON ESISTE PIU', ed e' una correzione e
   non un alleggerimento: era uno <span> dentro il divIcon, quindi FUORI da
   `_DECLUT_RANK` — il diradamento non la spostava e, peggio, non la contava
   come ostacolo, cosi' le altre scritte ci finivano sopra. Ora il nome e' un
   tooltip `.lbl` come nella vista Stadio (v. `poiLabel` in citta.js e il
   commento gemello in atleti-stadio.js): una sola famiglia di scritte. */
.cpoi{display:flex;align-items:center;justify-content:center;width:30px;height:30px;
  border-radius:50%;font-size:14px;line-height:1;border:2.5px solid #fff;
  box-shadow:0 2px 8px rgba(0,0,0,.45);cursor:grab}
body.viewer .cpoi{cursor:pointer}
body.printing .cpoi{width:34px;height:34px;font-size:16px}
/* riga percorso nel pannello */
.crt{display:flex;align-items:center;gap:8px;background:var(--carta);border-radius:var(--r1);
  margin-bottom:5px;padding:8px 11px;font-size:12px;box-shadow:var(--sh-1)}
.crt b{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.crt .cmin{font-size:10.5px;color:var(--mut);font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.crt label{display:flex;align-items:center;gap:5px;font-weight:700;font-size:10.5px;color:var(--mut);cursor:pointer;text-transform:uppercase;letter-spacing:.03em}
.rtDot{width:20px;height:5px;border-radius:99px;flex-shrink:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.08)}
/* bottone "Naviga" nel popup (apre Google Maps a piedi) */
.cNav{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:800;color:#fff;
  background:var(--navy);border-radius:99px;padding:5px 12px;text-decoration:none}
.cNav:hover{filter:brightness(1.25)}
/* link 🧭 nelle righe della tabella */
a.bt.cnavi{text-decoration:none;font-size:12px}
/* interruttore lingua IT/EN nel viewer (riusa .pseg del dialogo stampa) */
#cLang{flex-shrink:0}
#cLang button{padding:5px 10px}

/* ===================== v29 — Stadio 3D: storico + barra del tempo =====================
   Stessa identità (Montserrat, --rosso, pillole 99px): la barra del tempo è
   una pillola frosted flottante in basso al centro del globo, una tacca per
   epoca (S3D_EPOCHS in data-stadio3d.js), attiva in rosso Galà. */
#s3dTimeline{position:absolute;left:50%;bottom:16px;transform:translateX(-50%);z-index:25;
  display:flex;align-items:center;gap:10px;max-width:calc(100% - 32px);
  background:rgba(255,255,255,.92);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  border:1px solid var(--linea);border-radius:99px;box-shadow:var(--sh-2);
  padding:7px 18px;animation:riseIn .45s .15s backwards}
.tlTicks{display:flex;position:relative}
.tlTicks::before{content:"";position:absolute;left:28px;right:28px;top:24px;height:2px;
  background:var(--linea);border-radius:99px}                 /* filo che collega le tacche */
.tlTick{position:relative;display:flex;flex-direction:column;align-items:center;gap:3px;
  min-width:56px;padding:3px 4px;border:none;background:none;cursor:pointer;
  font-family:inherit;color:var(--mut)}
.tlTick .tlIc{height:14px;font-size:12px;line-height:14px}
.tlTick .tlDot{width:11px;height:11px;border-radius:50%;background:var(--carta);
  border:2px solid #c9c9d4;position:relative;z-index:1;transition:border-color .18s,box-shadow .18s,background .18s}
.tlTick:hover .tlDot{border-color:var(--ink)}
.tlTick .tlYear{font-size:11px;font-weight:800;letter-spacing:.02em}
.tlTick.on{color:var(--ink)}
.tlTick.on .tlDot{background:var(--rosso);border-color:var(--rosso);box-shadow:0 0 0 4px rgba(227,6,19,.14)}
.tlTick.on .tlYear{color:var(--rosso)}
.tlTick.loading .tlDot{border-color:var(--rosso);border-top-color:transparent;animation:tlSpin .7s linear infinite}
@keyframes tlSpin{to{transform:rotate(360deg)}}
.tlTick.soon{cursor:default;opacity:.55}
.tlTick.soon .tlYear::after{content:"in arrivo";display:block;font-size:7.5px;font-weight:800;
  text-transform:uppercase;letter-spacing:.06em;color:var(--rosso);margin-top:1px}
.tlSep{width:1px;height:28px;background:var(--linea);flex:none}
.tlOp{display:flex;align-items:center;gap:7px;font-size:10px;font-weight:800;color:var(--mut);
  text-transform:uppercase;letter-spacing:.05em;cursor:pointer}
.tlOp input[type=range]{width:76px;accent-color:var(--rosso)}
/* badge dell'epoca attiva nel titolo del pannello (dentro .s3dTitle, che
   altrimenti renderizza ogni span come sottotitolo a blocco) */
.s3dTitle .s3dEpochBadge{display:inline-block;font-size:10px;font-weight:800;color:#fff;
  background:var(--rosso);border-radius:99px;padding:2px 9px;margin:0 0 0 6px;vertical-align:2px}
.s3dChk.off{opacity:.5}
/* ingresso morbido delle sezioni del pannello, a scalare */
.page-stadio3d .s3dSec{animation:riseIn .4s backwards}
.page-stadio3d .s3dSec:nth-child(1){animation-delay:.04s}
.page-stadio3d .s3dSec:nth-child(2){animation-delay:.09s}
.page-stadio3d .s3dSec:nth-child(3){animation-delay:.14s}
.page-stadio3d .s3dSec:nth-child(4){animation-delay:.19s}
@media(max-width:1100px){.tlTick{min-width:46px}.tlTick .tlIc{display:none}.tlTicks::before{top:8px}}
@media(max-width:820px){
  /* il bottom-sheet di v12+ targetta #map: senza questa riga la pagina 3D
     su mobile resta schiacciata dal pannello */
  .page-stadio3d #cesium{position:absolute;inset:0;width:100%;height:100%}
  #s3dTimeline{left:10px;right:10px;transform:none;max-width:none;justify-content:flex-start;
    bottom:162px;overflow-x:auto;scrollbar-width:none} /* sopra il peek (150px) del foglio */
  #s3dTimeline::-webkit-scrollbar{display:none}
}
@media(prefers-reduced-motion:reduce){
  #s3dTimeline,.page-stadio3d .s3dSec{animation:none}
  .tlTick.loading .tlDot{animation:none}
}

/* ===================== v31 — Mappa Atleti: vera app di navigazione =====================
   Niente più #app/#panel: mappa a schermo intero (position:fixed) con barra
   di ricerca flottante, pillole categoria, card "Oggi" (il meteo — v64: il
   programma gara e' uscito) e un foglio in basso — trascinabile su telefono (stessa
   fisica dello sheetGrab esistente, riscritta ad hoc in citta.js per non
   toccare initSheet() di common.js), card ancorata a sinistra su desktop.
   #topnav (solo editor, .hasTopnav) resta sopra tutto com'è sempre stato:
   qui si spostano solo gli elementi PROPRI di questo modulo per non
   accavallarsi con la sua barra rossa. La toolbar di modifica vive DENTRO
   il foglio (#cSheetTools): la barra in alto ha solo home/logo, ricerca e
   lingua — pochi elementi, spaziati, niente più affollamento. Il bottone
   "la mia posizione" è un FAB a sé, lontano da tutto il resto. Variabili
   di spaziatura in cima cosà i tre livelli (barra/pillole/oggi) e il
   pannello Livelli di Leaflet si allineano SEMPRE senza sovrapporsi,
   qualunque sia il contenuto della card "Oggi". */
:root{
  --ct-top:12px;      /* margine dalla cima */
  --ct-bar-h:42px;    /* altezza barra di ricerca */
  --ct-gap:8px;       /* spazio fra le due fasce */
  --ct-pills-h:36px;  /* altezza della fascia viste+pillole */
  --ct-peek:172px;    /* quanto foglio si vede da chiuso (lo legge anche citta.js) */
}
/* v60: la quota di ogni fascia si dichiara UNA volta, non si riscrive a mano
   in cinque calc() come prima — aggiungere il commutatore avrebbe voluto dire
   correggere cinque catene identiche e sbagliarne una in una sola delle
   quattro combinazioni nav/cantiere. Stessa lezione di --nav-h (v54.1).
   >>> LA CATENA VA DICHIARATA SU `body`, NON SU `:root`. <<< Una variabile si
   risolve DOVE E' DICHIARATA, e `--ct-top` viene sovrascritto qui sotto sul
   body (nav 66px, cantiere 46, cantiere+nav 98). Messa su :root, la catena
   restava congelata sui 14px di :root: misurato a 375px, il commutatore
   finiva a 70px e la barra di ricerca a 98, una sopra l'altra. */
/* v66.1 — DUE FASCE, NON QUATTRO. Erano barra + commutatore + pillole + card
   del meteo, una sotto l'altra: a 375px si mangiavano 190px, cioe' un quarto
   di schermo, e le scritte della mappa finivano tutte sotto. Ora il
   commutatore sta NELLA riga delle pillole (#cBands) e il meteo e' sceso nel
   foglio, dove sta la roba da leggere. Restano 90px. */
body.page-citta{
  overflow:hidden;
  --ct-y-fasce:calc(var(--ct-top) + var(--ct-bar-h) + var(--ct-gap));
  --ct-y-fine:calc(var(--ct-y-fasce) + var(--ct-pills-h) + var(--ct-gap));
}
body.page-citta #map{position:fixed;inset:0;width:100%;height:100%;flex:none}
/* #app serve a DUE cose, e nessuna delle due tollera `display:contents`:
   1. la STAMPA — doPrint tiene soltanto #printHead/#app/#printFoot/#printBar e
      dimensiona il foglio su #app, con #map absolute dentro. Senza involucro
      la mappa veniva nascosta e il foglio usciva senza disegno;
   2. il DIRADAMENTO delle scritte, che a schermo gira in tutto il portale
      (declNow/declSoon) ma comincia con `const app=$('app'); if(!app) return`
      — ecco perche' qui non ha mai funzionato: questa era la sola pagina
      mappa senza #app. Con `display:contents` l'elemento non genera un box e
      il suo rettangolo e' nullo: il diradamento crederebbe che nessuna
      scritta sia dentro l'area visibile e non farebbe niente.
   Quindi un riquadro vero, grande come la mappa. `pointer-events:none` perche'
   l'involucro non deve intercettare nulla: i clic sono di #map, che li
   riabilita. In stampa il display:block!important del JS vince su questa riga. */
body.page-citta #app{display:block;position:fixed;inset:0;pointer-events:none}
body.page-citta #app>#map{pointer-events:auto}
body.page-citta #alert{top:var(--ct-y-fasce)}
body.page-citta .leaflet-top{margin-top:var(--ct-y-fine)}
body.page-citta.hasTopnav{--ct-top:66px}
/* sul cantiere la barra a strisce "CANTIERE" (32px, comune a tutto il sito)
   si aggiunge sopra: senza questo la barra in alto/pillole/card "Oggi" ci
   finiscono sotto, ammassate. Il viewer pubblico (niente nav) la vede da
   solo — l'editor la vede in aggiunta al normale scarto della nav. */
body.page-citta.cantiere{--ct-top:46px}
body.page-citta.cantiere.hasTopnav{--ct-top:98px}

/* --- barra in alto: home/logo, ricerca, lingua — SOLO questi tre --- */
#cityTop{position:fixed;left:0;right:0;top:var(--ct-top);z-index:1400;
  display:flex;align-items:center;gap:10px;padding:0 14px;height:var(--ct-bar-h)}
#cSearchWrap{flex:1;min-width:0}
#cSearch{width:100%;font-family:inherit;font-size:13px;font-weight:600;padding:11px 16px;
  border:none;border-radius:99px;background:var(--carta);box-shadow:var(--sh-2);outline:none;color:var(--ink)}
#cSearch:focus{box-shadow:0 0 0 2px var(--rosso),var(--sh-2)}
#cSearch::placeholder{color:#a8a8b4}
.cIconBtn{flex:none;width:42px;height:42px;border-radius:50%;border:none;background:var(--carta);
  box-shadow:var(--sh-2);font-size:17px;line-height:1;cursor:pointer;display:flex;align-items:center;
  justify-content:center;transition:transform .1s,background .13s;padding:0}
.cIconBtn:hover{background:var(--bg)}
.cIconBtn:active{transform:scale(.94)}
#cBrand{height:30px;width:auto;flex:none;filter:drop-shadow(0 1px 3px rgba(0,0,0,.35))}
#cityTop #cLang{flex:none;background:rgba(255,255,255,.92);backdrop-filter:blur(4px);box-shadow:var(--sh-2)}

/* --- pillole categoria/percorsi/preferiti --- */
/* v66.1 — vive dentro #cBands (v. la sezione in fondo): niente piu' position
   fixed propria, e' una colonna della fascia. */
#cityPills{flex:1;min-width:0;display:flex;gap:6px;overflow-x:auto;scrollbar-width:none;
  height:var(--ct-pills-h);align-items:center;scroll-padding:0 14px}
#cityPills::-webkit-scrollbar{display:none}
.cPill{flex:none;font-family:inherit;font-size:11.5px;font-weight:800;padding:7px 13px;
  border-radius:99px;border:none;background:rgba(255,255,255,.92);backdrop-filter:blur(4px);
  color:var(--ink);box-shadow:var(--sh-1);cursor:pointer;white-space:nowrap;transition:all .13s}
.cPill.on{background:var(--ink);color:#fff}
.cPill.cPillToggle.on{background:var(--rosso);color:#fff}

/* --- card "Oggi": il METEO, e basta ---
   v64 — via anche la riga «PROSSIMA / IN CORSO» del programma gara (.ctNext*):
   questa mappa dice DOVE si va, l'orario delle batterie sta sul programma
   ufficiale e cambia fino all'ultimo. La fascia resta alta 42px perche' il
   meteo resta: fa caldo, piove? e' l'unica cosa che cambia oggi e che riguarda
   chi gareggia. --- */
/* v66.1 — sceso NEL FOGLIO (#cSheetHead): il meteo e' una cosa da leggere, non
   un comando, e in cima rubava una striscia intera alla mappa. Niente piu'
   position:fixed ne' ombra: qui e' contenuto, non un oggetto che galleggia. */
#cityToday{display:none;flex-wrap:wrap;gap:8px;min-width:0}
.ctW{background:var(--bg);border-radius:12px;padding:6px 12px;
  display:flex;align-items:center;gap:8px;font-size:12px}
.ctWic{font-size:20px;line-height:1}
.ctW b{font-size:17px;font-weight:800}
.ctWlb{color:var(--mut);font-weight:700;font-size:11px}
.ctWmm{color:var(--mut);font-size:10.5px;font-weight:700}

/* --- FAB "la mia posizione": lontano dalla barra in alto, sopra il foglio --- */
.cFab{position:fixed;right:16px;bottom:calc(var(--ct-peek) + 14px);z-index:1450}
@media(min-width:821px){.cFab{bottom:16px}}

/* --- foglio: trascinabile su telefono, card ancorata su desktop --- */
#citySheet{position:fixed;left:0;right:0;bottom:0;background:var(--carta);
  border-radius:20px 20px 0 0;box-shadow:0 -8px 30px rgba(21,21,40,.22);z-index:1400;
  height:82vh;max-height:82vh;overflow:hidden;display:flex;flex-direction:column;
  transform:translateY(calc(100% - var(--ct-peek)));transition:transform .3s cubic-bezier(.22,.9,.3,1);touch-action:none}
#cSheetGrab,#cSheetHead,#cSheetTools{flex:none}
#citySheet.sheetDrag{transition:none}
#cSheetGrab{display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:10px 0 6px;cursor:grab;touch-action:none}
#cSheetGrab:active{cursor:grabbing}
#cSheetGrab::before{content:"";width:42px;height:5px;border-radius:99px;background:#d2d2da}
/* toolbar di modifica, dentro il foglio (solo editor), allineata a destra —
   stile #bar di villaggio/striscioni (bottoni rettangolari con bordo), non
   più i cerchi della barra in alto: qui sono azioni secondarie, non i primi
   comandi che si notano aprendo la pagina. */
#cSheetTools{display:flex;gap:6px;justify-content:flex-end;padding:0 14px 10px;flex-wrap:wrap}
.cBarBtn{font-size:11px;font-weight:700;font-family:inherit;color:var(--ink);padding:6px 12px;
  border:1px solid var(--linea);background:var(--carta);cursor:pointer;border-radius:var(--r1);
  transition:border-color .15s,transform .08s;box-shadow:var(--sh-1)}
.cBarBtn:hover{border-color:#b9b9c6}
.cBarBtn:active{transform:translateY(1px)}
.cBarBtn.primary{background:var(--rosso);border-color:var(--rosso);color:#fff}
.cBarBtn.primary:hover{background:var(--rosso-d)}
/* v66.1 — il corpo prende quello che resta (colonna flex, v. #citySheet in
   fondo): prima erano due altezze a calcolo piu' un :has() per la barra
   dell'editor, e ogni riga aggiunta in testa le faceva sbagliare. */
#cSheetBody{flex:1;min-height:0;overflow-y:auto;padding:4px 14px 90px}
@media(min-width:821px){
  #citySheet{left:14px;right:auto;bottom:14px;
    top:var(--ct-y-fine);
    width:400px;border-radius:16px;transform:none!important;transition:none;height:auto;max-height:none;
    touch-action:auto;box-shadow:var(--sh-2)}
  #citySheet.cCollapsed{bottom:auto;height:auto}
  #citySheet.cCollapsed #cSheetBody,#citySheet.cCollapsed #cSheetTools{display:none}
  #cSheetGrab{cursor:pointer}
  #cSheetGrab::before{width:32px}
}

/* --- programma gara --- */
.schedTbl{width:100%;border-collapse:collapse;font-size:11.5px;background:var(--carta);
  border-radius:var(--r1);overflow:hidden;box-shadow:var(--sh-1);margin-bottom:6px}
.schedTbl th{padding:6px 8px;font-size:8.5px;text-transform:uppercase;letter-spacing:.05em;
  color:var(--mut);font-weight:800;border-bottom:1px solid var(--linea)}
.schedTbl td{padding:5px 8px;border-bottom:1px solid var(--bg);font-weight:600;font-size:11px}
.schedT{font-variant-numeric:tabular-nums;font-weight:800;color:var(--mut);white-space:nowrap;width:1%}
.schedSec td{background:var(--ink);color:#fff;font-size:9px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;padding:5px 8px}
tr.schedLive td{background:#fdeaec;color:var(--rosso);font-weight:800}
tr.schedLive .schedT::before{content:"🔴 "}

/* --- contatti utili / emergenza --- */
.ctGrid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-bottom:6px}
.ctContact{display:flex;flex-direction:column;align-items:center;gap:2px;background:var(--carta);
  border-radius:var(--r1);box-shadow:var(--sh-1);padding:9px 4px;text-decoration:none;color:var(--ink)}
.ctContact b{font-size:16px;font-weight:800;color:var(--rosso)}
.ctContact span{font-size:9px;font-weight:700;color:var(--mut);text-align:center}

/* --- preferiti --- */
.cpoi.cpoiFav{box-shadow:0 0 0 2px #f5c518,0 2px 8px rgba(0,0,0,.45)}
.cfav,.cfavPop{border:none;background:none;cursor:pointer;font-size:13px;color:#dca300}
.cfavPop{font-size:18px}
.cEmpty{padding:26px 10px;text-align:center;color:var(--mut);font-size:12.5px;font-weight:600}

@media(max-width:640px){
  #cityTop{gap:6px;padding:0 10px}
  #cityPills{padding:0 10px}
  #cityToday{left:10px;right:10px}
  .ctGrid{grid-template-columns:repeat(3,1fr)}
  #cityTop #cLang button{padding:5px 7px;font-size:10.5px}
}
@media print{
  #cityTop,#cBands,#cViste,#cityPills,#cityToday,#citySheet,.cFab,.leaflet-top{display:none!important}
}

/* ===================== v39 — Programma lavori (Gantt per giorni) =====================
   Modulo lavori.html / lavori-viewer.html: niente mappa, pagina scrollabile
   sotto la nav. Solo classi .lv*; colori dalle variabili :root (identità
   invariata) + i tre pastelli di stato già usati nel portale (cfr. CLI/POS
   del villaggio). */
body.page-lavori{background:var(--bg);overflow:auto;height:auto}
.lvWrap{max-width:1280px;margin:0 auto;padding:18px 22px 60px;display:flex;flex-direction:column;gap:16px}
/* barra comandi */
#lvBar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--carta);
  border-radius:var(--r2);box-shadow:var(--sh-1);padding:10px 14px}
.lvRoLbl{font-size:11px;font-weight:800;color:var(--mut)}
#lvSearch{flex:0 1 240px;min-width:140px;border:1px solid var(--linea);border-radius:99px;
  padding:7px 13px;font:inherit;font-size:12.5px;background:var(--bg)}
#lvSearch:focus{outline:2px solid var(--navy);outline-offset:1px}
.lvSpring{flex:1}
/* bottoni e segmented */
.lvBtn{border:1px solid var(--linea);background:var(--carta);color:var(--ink);border-radius:99px;
  padding:7px 14px;font:inherit;font-size:12px;font-weight:700;cursor:pointer;white-space:nowrap}
.lvBtn:hover{border-color:var(--navy)}
.lvBtn.primary{background:var(--rosso);border-color:var(--rosso);color:#fff}
.lvBtn.primary:hover{background:var(--rosso-d)}
.lvBtn.lvGhost{border-color:transparent;background:none;color:var(--mut);padding:7px 8px}
.lvBtn.lvGhost:hover{color:var(--rosso)}
.lvBtn.lvDanger{border-color:var(--err);color:var(--err);background:none}
.lvBtn.lvDanger:hover{background:var(--err);color:#fff}
.lvSeg{display:inline-flex;border:1px solid var(--linea);border-radius:99px;overflow:hidden;background:var(--bg)}
.lvSeg button{border:none;background:none;padding:7px 13px;font:inherit;font-size:11.5px;font-weight:700;
  color:var(--mut);cursor:pointer}
.lvSeg button+button{border-left:1px solid var(--linea)}
.lvSeg button.on{background:var(--navy);color:#fff}
/* sezione giorno */
.lvDay,.lvUnplanned{background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-1);padding:14px 16px}
.lvDayHead{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.lvDayHead h2{margin:0;font-size:16px;font-weight:800;color:var(--navy)}
.lvDayStat{font-size:11px;font-weight:700;color:var(--mut);background:var(--bg);border-radius:99px;padding:3px 10px}
/* gantt */
/* v44: griglia oraria disegnata UNA volta per giorno (layer sotto le righe),
   righe più pulite, nome del task dentro la barra, linea "adesso" unica */
.lvGantt{display:flex;flex-direction:column;gap:2px;position:relative}
.lvGridLayer{position:absolute;left:calc(var(--lv-lbl,190px) + 10px);right:0;top:18px;bottom:0;
  pointer-events:none;border-radius:6px;
  background:repeating-linear-gradient(90deg,var(--linea) 0 1px,transparent 1px calc(100%/var(--lv-cols,13)))}
/* v45.1: maniglia per allargare/restringere la colonna etichette Timeline —
   striscia nel gutter tra colonna e ruler, alta quanto tutto il blocco giorno */
.lvLblResizer{position:absolute;left:calc(var(--lv-lbl,190px) + 5px);top:0;bottom:0;width:8px;
  transform:translateX(-50%);cursor:col-resize;z-index:3;border-radius:4px}
.lvLblResizer:hover,.lvLblResizer:active{background:rgba(227,6,19,.25)}
.lvHead,.lvRow{display:grid;grid-template-columns:var(--lv-lbl,190px) 1fr;gap:10px;align-items:center}
.lvHead{position:relative;z-index:1}
.lvHours{position:relative;height:18px;font-size:10px;font-weight:800;color:var(--mut)}
.lvHours span{position:absolute;top:2px;transform:translateX(-50%);font-variant-numeric:tabular-nums}
.lvLbl{display:flex;align-items:baseline;gap:6px;min-width:0;font-size:12px;font-weight:600;line-height:1.25}
.lvLbl .lvTxt{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.lvResp{font-style:normal;font-size:10px;font-weight:700;color:var(--mut);white-space:nowrap}
.lvRow{cursor:pointer;border-radius:6px;padding:2px 0}
.lvRow:hover .lvTxt{color:var(--rosso)}
.lvRow:hover{background:rgba(31,29,77,.04)}
.lvTrack{position:relative;height:26px;border-radius:6px}
.lvBarEl{position:absolute;top:2px;bottom:2px;min-width:56px;border-radius:6px;display:flex;
  align-items:center;padding:0 8px;font-size:10px;font-weight:800;cursor:pointer}
.lvBarEl b{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none}
.lvBarName{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-left:7px;opacity:.85}
/* .lvOpenEnd (fine sconosciuta, tratteggio a destra) e' decaduta in v62.1:
   senza orario di fine ora si vede solo l'inizio, come .lvIstante piu' sotto. */
.lvBarEl:hover{outline:1px solid var(--navy)}
/* colori stato (stessi pastelli di CLI/POS del villaggio; 'fatto' =
   Completato in verde PIENO, v43: stacca subito dai pastelli di conferma) */
.st-todo{background:#e2e8f0;color:#334155}
.st-doing{background:#dbeafe;color:#1e40af}
.st-done{background:#dcfce7;color:#166534}
.st-fatto{background:#166534;color:#fff}
.lvChip.st-done,.lvURow .lvDot.st-done{text-decoration:none}
/* pallino di stato */
.lvDot{width:13px;height:13px;border-radius:50%;flex:0 0 auto;align-self:center;cursor:pointer;
  border:2px solid #fff;box-shadow:0 0 0 1px var(--linea)}
.lvDot.st-todo{background:#94a3b8}
.lvDot.st-doing{background:#3b82f6}
.lvDot.st-done{background:#22c55e}
.lvDot.st-fatto{background:#166534}
/* linea "adesso": una sola per giorno, a tutta altezza nel layer griglia,
   con l'ora corrente nel chip in testa (v44) */
.lvNow{position:absolute;top:0;bottom:0;width:2px;background:var(--rosso);pointer-events:none;
  box-shadow:0 0 4px rgba(227,6,19,.5)}
.lvNowChip{position:absolute;top:-16px;left:50%;transform:translateX(-50%);background:var(--rosso);
  color:#fff;font-size:9px;font-weight:900;font-variant-numeric:tabular-nums;padding:1px 6px;
  border-radius:99px;white-space:nowrap}
/* senza orario + da pianificare */
.lvNoTime{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:8px;padding-top:8px;
  border-top:1px dashed var(--linea)}
.lvNoTimeLbl{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
.lvChip{display:inline-flex;align-items:center;gap:6px;border-radius:99px;padding:4px 11px;
  font-size:11.5px;font-weight:700;cursor:pointer;border:1px solid var(--linea)}
.lvChip i{font-style:normal;font-weight:600;opacity:.75}
.lvChip:hover{filter:brightness(.96)}
.lvUnList{display:flex;flex-direction:column}
.lvURow{display:flex;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px solid var(--bg);
  font-size:12.5px;font-weight:600;cursor:pointer}
.lvURow:last-child{border-bottom:none}
.lvURow:hover .lvTxt{color:var(--rosso)}
.lvURow .lvTxt{flex:0 1 auto;min-width:0}
.lvURow .lvBtn{margin-left:auto}
.lvDim{opacity:.22}
/* drawer di modifica */
#lvDlg{position:fixed;inset:0;z-index:6500;background:rgba(21,21,28,.35);display:flex;justify-content:flex-end}
#lvDlg[hidden]{display:none}
body.lvDlgOpen{overflow:hidden}
.lvDlgCard{width:min(420px,100%);height:100%;background:var(--carta);box-shadow:var(--sh-2);
  padding:20px 22px;overflow:auto;display:flex;flex-direction:column;gap:12px;
  animation:lvSlide .18s ease-out}
@keyframes lvSlide{from{transform:translateX(30px);opacity:0}to{transform:none;opacity:1}}
.lvDlgCard h3{margin:0;font-size:16px;font-weight:800;color:var(--navy)}
.lvDlgCard label{display:flex;flex-direction:column;gap:4px;font-size:10.5px;font-weight:800;
  text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
.lvDlgCard input,.lvDlgCard textarea,.lvDlgCard select{border:1px solid var(--linea);border-radius:var(--r1);
  padding:8px 10px;font:inherit;font-size:13px;font-weight:600;color:var(--ink);background:var(--bg);
  text-transform:none;letter-spacing:normal}
.lvDlgCard input:focus,.lvDlgCard textarea:focus,.lvDlgCard select:focus{outline:2px solid var(--navy);outline-offset:1px}
.lvDlgTimes{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.lvTimeClearRow{display:flex;gap:4px;align-items:center}
.lvTimeClearRow input{flex:1;min-width:0}
.lvTimeClearRow .lvBtn{flex:none;padding:6px 9px}
.lvDlgBtns{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:10px;border-top:1px solid var(--linea)}
/* v45: tag riutilizzabili (Azienda/Responsabili) — bottone singolo + chip multipli */
.lvTagBtn{border:1px solid var(--linea);border-radius:var(--r1);padding:8px 10px;font:inherit;font-size:13px;
  font-weight:600;color:var(--ink);background:var(--bg);text-align:left;cursor:pointer;
  text-transform:none;letter-spacing:normal;width:100%}
.lvTagBtn:hover{border-color:var(--navy)}
.lvTagRow{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.lvTagChip{display:inline-flex;align-items:center;gap:4px;background:var(--bg);border:1px solid var(--linea);
  border-radius:99px;padding:4px 10px;font-size:12px;font-weight:700;color:var(--ink);cursor:pointer;
  text-transform:none;letter-spacing:normal}
.lvTagChip:hover{border-color:var(--rosso);color:var(--rosso)}
.lvDlgRO{display:flex;flex-direction:column;gap:10px;font-size:13px;font-weight:600}
.lvDlgRO b{display:block;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--mut);margin-bottom:2px}
.lvDlgRO .lvChip{cursor:default;align-self:flex-start}
/* --- v40: dashboard operativa (overview, collapse, minimalismo) --- */
#lvOverview .lvOvCard{background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-1);
  padding:12px 14px;display:flex;flex-direction:column;gap:10px}
.lvKpis{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.lvKpi{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--linea);background:var(--bg);
  border-radius:99px;padding:5px 12px;font:inherit;font-size:11.5px;font-weight:700;color:var(--mut);cursor:pointer}
.lvKpi b{font-size:12.5px;color:var(--ink);font-variant-numeric:tabular-nums}
.lvKpi.on{border-color:var(--navy);background:var(--carta);color:var(--ink);outline:1px solid var(--navy)}
.lvKpi .lvDot{cursor:inherit;width:10px;height:10px;border-width:1px}
.lvOvProg{flex:1;min-width:90px;height:8px;border-radius:99px;background:var(--bg);overflow:hidden;margin-left:4px;display:flex}
/* v43: barre a due segmenti — pieno = completati, chiaro = confermati */
.lvPgF{display:block;height:100%;background:#166534;flex:none}
.lvPgC{display:block;height:100%;background:#22c55e;flex:none}
.lvOvDays{display:flex;gap:8px;flex-wrap:wrap}
.lvOvDay{display:flex;align-items:center;gap:7px;border:1px solid var(--linea);background:var(--bg);
  border-radius:99px;padding:5px 12px;font:inherit;font-size:11.5px;font-weight:800;color:var(--ink);cursor:pointer;white-space:nowrap}
.lvOvDay:hover{border-color:var(--navy)}
.lvOvDay.is-past{opacity:.55}
.lvOvDay.is-today{border-color:var(--navy);box-shadow:inset 0 0 0 1px var(--navy)}
.lvOvBar{width:52px;height:6px;border-radius:99px;background:var(--linea);overflow:hidden;display:flex;flex:none}
.lvOvNum{font-size:10.5px;color:var(--mut);font-variant-numeric:tabular-nums}
.lvOvDay.lvOvUn b{color:var(--rosso)}
.lvOvNext{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.lvOvNextLbl{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--rosso)}
.lvOvMoment{display:inline-flex;align-items:baseline;gap:6px;border:1px dashed var(--linea);background:none;
  border-radius:99px;padding:4px 11px;font:inherit;font-size:11.5px;font-weight:600;color:var(--ink);cursor:pointer;max-width:100%}
.lvOvMoment b{font-variant-numeric:tabular-nums;color:var(--rosso)}
.lvOvMoment i{font-style:normal;font-size:10px;color:var(--mut)}
.lvOvMoment:hover{border-color:var(--navy)}
/* giorni collassabili */
.lvChev{border:none;background:none;cursor:pointer;font-size:12px;color:var(--mut);padding:2px 4px;transition:transform .15s}
.lvDay.lvCollapsed .lvChev{transform:rotate(-90deg)}
.lvDay.lvCollapsed .lvGantt,.lvDay.lvCollapsed .lvNoTime{display:none}
.lvDayHead{cursor:pointer}
/* micro progress nell'header giorno */
.lvMini{display:inline-flex;width:46px;height:6px;border-radius:99px;background:var(--linea);
  overflow:hidden;vertical-align:middle;margin-right:6px}
/* elimina giorno: visibile solo su hover/focus */
.lvDelDay{opacity:0;transition:opacity .15s}
.lvDayHead:hover .lvDelDay,.lvDelDay:focus{opacity:1}
/* flash del task raggiunto dall'overview */
.lvFlash{animation:lvFlashK 1.6s ease-out}
@keyframes lvFlashK{0%,60%{outline:2px solid var(--rosso);outline-offset:2px}100%{outline:2px solid transparent}}
/* drag & drop */
body.page-lavori:not(.viewer) .lvBarEl{cursor:grab;touch-action:none}
body.page-lavori:not(.viewer) .lvChip{touch-action:none}
.lvHandle{position:absolute;top:0;bottom:0;width:10px;cursor:ew-resize;display:block}
.lvHandle.lvHL{left:0;border-radius:6px 0 0 6px}
.lvHandle.lvHR{right:0;border-radius:0 6px 6px 0}
.lvGrip{cursor:grab;color:var(--mut);font-size:13px;user-select:none;padding:0 2px;touch-action:none}
body.lvDragOn{user-select:none}
body.lvDragOn,body.lvDragOn .lvBarEl,body.lvDragOn .lvChip,body.lvDragOn .lvGrip{cursor:grabbing!important}
.lvDragging{opacity:.45}
.lvDragTip{position:fixed;z-index:7000;background:var(--ink);color:#fff;font-size:11px;font-weight:800;
  padding:5px 10px;border-radius:8px;pointer-events:none;white-space:nowrap;box-shadow:var(--sh-2)}
.lvDropCaret{position:absolute;top:-3px;bottom:-3px;width:2px;background:var(--navy);pointer-events:none}
.lvDropHover{outline:2px dashed var(--navy);outline-offset:2px}
/* v45: vista a schermo intero — "Espandi" (tutta la vista) o il singolo
   giorno (⤢ nell'header). #lvApp esce dal flusso e riempie il viewport,
   KPI/overview e sidebar spariscono: la stessa idea "zen" del drawer #lvDlg,
   ma per leggere/lavorare comodamente da tablet o proiettore in cantiere. */
#lvFocusBtn.on{border-color:var(--navy);background:var(--carta);color:var(--ink);outline:1px solid var(--navy)}
body.lvFocus{overflow:hidden}
body.lvFocus #topnav,body.lvFocus #lvOverview,body.lvFocus #lvSide{display:none}
body.lvFocus #lvApp{position:fixed;inset:0;z-index:5000;background:var(--fondo);
  display:flex;flex-direction:column;overflow:hidden;padding:10px 14px;max-width:none;margin:0}
body.cantiere.lvFocus #lvApp{top:32px}
body.lvFocus #lvBar{flex:none}
body.lvFocus .lvBody{flex:1;min-height:0;overflow:auto}
.lvFocusDay{font-size:14px;line-height:1;padding:5px 9px}
.lvFocusDay.on{border-color:var(--navy);background:var(--carta);color:var(--ink);outline:1px solid var(--navy)}
/* mobile */
@media(max-width:640px){
  .lvWrap{padding:12px 10px 40px}
  .lvHead,.lvRow{--lv-lbl:120px;gap:6px}
  .lvBarEl b{display:none}
  .lvDlgCard{width:100%}
  #lvSearch{flex-basis:100%}
  .lvOvDays{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px}
}
/* stampa: solo il programma, senza comandi né drawer; giorni sempre espansi */
@media print{
  #topnav,#lvBar,#lvOverview,#lvDlg,#fileBanner,#cantiereBar,#toasts,.lvBtn,.lvChev,.lvHandle,.lvGrip,.lvDragTip,.lvDropCaret,#accChip,#accOut{display:none!important}
  body.page-lavori{background:#fff}
  .lvDay,.lvUnplanned{box-shadow:none;border:1px solid var(--linea);break-inside:avoid}
  .lvDay.lvCollapsed .lvGantt{display:flex!important}
  .lvDay.lvCollapsed .lvNoTime{display:flex!important}
  .lvDim{opacity:1}
  .lvNow{display:none!important}
}
/* v59 — sezione EVENTI + scadenze "pronto entro"
   Evento: un momento vero del programma (partenza, cerimonia…), non un task
   di allestimento — sempre in rosso, indipendente dallo stato. Il tag è
   bordo+testo, MAI un fondo pieno: è lo stesso identificativo usato anche
   sui fogli stampati (printRowsHtml), dove un fondo colorato sparisce con
   «Grafica di sfondo» disattivata (Regola 6) mentre il testo colorato resta. */
.lvEventoTag{display:inline-flex;align-items:center;font-size:9px;font-weight:800;
  color:var(--rosso-d);border:1.5px solid var(--rosso);border-radius:99px;padding:1px 7px;
  text-transform:uppercase;letter-spacing:.04em;flex:none;white-space:nowrap}
.lvBarEl.lvEvento{background:var(--rosso)!important;color:#fff!important;
  border:2px solid var(--rosso-d)}
.lvChip.lvEvento{border:1.5px solid var(--rosso)}
.lvRow.lvEvento .lvTxt,tr.lvTRow.lvEvento td.lvTAct,.lvURow.lvEvento .lvTxt{
  color:var(--rosso-d);font-weight:800}
tr.lvTRow.lvEvento{background:#fff5f5}
tr.lvTRow.lvEvento td.lvTAct{border-left:3px solid var(--rosso);padding-left:6px}
.lvBtn.lvEventBtn{background:var(--rosso);border-color:var(--rosso);color:#fff;font-weight:800}
.lvBtn.lvEventBtn:hover{background:var(--rosso-d);border-color:var(--rosso-d)}
.lvOvEventiLbl{color:var(--rosso)}
.lvOvEventBtn{border-color:var(--rosso)}
/* scadenza "pronto entro": colore diverso dall'evento (ambra, non rosso) per
   non confondere le due cose — un task senza orario ma con una data-limite. */
.lvEntroTag{font-size:10.5px;font-weight:800;color:var(--warn);white-space:nowrap}
.lvChip.lvEntroChip{border:1px dashed var(--warn)}
.lvEntroLbl{color:var(--warn)}

/* v62 — ATTIVITA' SU PIU' GIORNI.
   La pastiglia "1/2 gg" e' BORDO + TESTO, mai un fondo pieno: in stampa con
   "Grafica di sfondo" disattivata un background sparisce, un bordo no
   (Regola 6). Stessa costruzione di .lvEventoTag, colore neutro perche' una
   durata non e' ne' un allarme ne' un evento: e' un fatto. */
.lvSpanTag{display:inline-flex;align-items:center;font-size:9px;font-weight:800;
  color:var(--navy);border:1.5px solid var(--linea);border-radius:99px;padding:1px 6px;
  margin-right:5px;letter-spacing:.03em;flex:none;white-space:nowrap}
/* Il lato che CONTINUA sull'altro giorno e' squadrato e ha un filetto interno:
   dice "esce dal foglio", e il lato pieno dice "finisce qui". Il filetto
   e' un box-shadow, che in stampa senza grafica di sfondo sparisce — per
   questo il segno portante sono i chevron ‹ › scritti DENTRO la barra. */
.lvBarEl.lvContR{border-top-right-radius:0;border-bottom-right-radius:0;
  box-shadow:inset -3px 0 0 currentColor}
.lvBarEl.lvContL{border-top-left-radius:0;border-bottom-left-radius:0;
  box-shadow:inset 3px 0 0 currentColor}
.lvBarEl.lvContL.lvContR{box-shadow:inset 3px 0 0 currentColor,inset -3px 0 0 currentColor}
/* v62.1 — SENZA ORARIO DI FINE si vede solo l'inizio: non e' una barra, e' un
   punto sull'asse (la consegna che arriva alle 14:00 non dura un'ora). Niente
   larghezza inline dal JS, quindi la pastiglia si dimensiona sul proprio
   contenuto invece di occupare i 56px di min-width; il filetto a sinistra
   ancora la scritta all'istante esatto, e in stampa resta il bordo (Regola 6).
   La maniglia destra resta: trascinarla e' il modo di dargli una fine. */
.lvBarEl.lvIstante{min-width:0;width:auto;border-radius:0 6px 6px 0;
  box-shadow:inset 3px 0 0 currentColor}

/* ===================== v41 — Collaboratori =====================
   Modulo collaboratori.html / collaboratori-viewer.html: database staff,
   team in due sezioni, pass d'accesso, scheda personale stampabile.
   Solo classi .cb*; riusa .lvBtn/.lvSeg/.lvDlgCard/.lvDayHead della v39 e
   le variabili :root (identità invariata). */
body.page-collab{background:var(--bg);overflow:auto;height:auto}
.cbWrap{max-width:1280px;margin:0 auto;padding:18px 22px 60px;display:flex;flex-direction:column;gap:14px}
#cbTabs{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
/* v50.6: la riga Collaboratori/Stakeholder occupa tutta la larghezza così va
   sempre a capo sopra ai sotto-tab, invece di schiacciarsi in coda a fianco */
.cbSectionRow{width:100%}
/* v54 — le sezioni sono diventate CINQUE («Pass d'accesso» è salito di livello).
   .lvSeg e' inline-flex con overflow:hidden e senza wrap: su schermo stretto le
   ultime voci verrebbero TAGLIATE, non mandate a capo. Qui si lascia andare a
   capo, e il raggio scende da pillola a riquadro perche' una pillola su due
   righe non e' una pillola. */
@media (max-width:760px){
  #cbSectionSeg{flex-wrap:wrap;border-radius:var(--r2)}
}
#cbBar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--carta);
  border-radius:var(--r2);box-shadow:var(--sh-1);padding:10px 14px}
#cbSearch{flex:0 1 240px;min-width:140px;border:1px solid var(--linea);border-radius:99px;
  padding:7px 13px;font:inherit;font-size:12.5px;background:var(--bg)}
#cbSearch:focus{outline:2px solid var(--navy);outline-offset:1px}
#cbBar select{border:1px solid var(--linea);border-radius:99px;padding:7px 11px;font:inherit;
  font-size:12px;font-weight:700;color:var(--ink);background:var(--bg);max-width:210px}
#cbBar .lvBtn.cbFOn{background:var(--navy);border-color:var(--navy);color:#fff}
.cbCount{font-size:11px;font-weight:800;color:var(--mut);font-variant-numeric:tabular-nums}
body.cbDlgOpen{overflow:hidden}
/* tabella persone */
.cbTblWrap{background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-1);padding:8px 10px;overflow-x:auto}
.cbTable{width:100%;box-shadow:none;border-radius:0}
.cbTable td{vertical-align:middle}
/* v50.8: tr[data-crmid] = riga di un contatto Stakeholder, stessa apertura
   scheda di tr[data-id] (collaboratore) — vedi openCrmDlg */
.cbTable tbody tr[data-id],.cbTable tbody tr[data-crmid]{cursor:pointer}
.cbTable tbody tr[data-id]:hover td,.cbTable tbody tr[data-crmid]:hover td{background:var(--bg)}
.cbName{font-weight:800;white-space:nowrap}
.cbStar{color:var(--rosso);cursor:help}
.cbRuolo{max-width:220px}
.cbNum{font-variant-numeric:tabular-nums;white-space:nowrap}
.cbMail a{color:var(--navy);text-decoration:none}
.cbMail a:hover{text-decoration:underline}
.cbEmpty{text-align:center;color:var(--mut);font-weight:700;padding:22px 0!important}
.cbPhRow td{opacity:.55}
.cbPhTag{display:inline-block;background:#fef3c7;color:#92400e;border-radius:99px;padding:2px 8px;
  font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}
/* v65 — «Jolly»: viola per non confondersi con l'ambra di .cbPhTag (posto da
   coprire), che dice una cosa opposta: qui c'è la persona, in più, per le
   emergenze. */
.cbJollyTag{display:inline-block;background:#ede9fe;color:#5b21b6;border-radius:99px;padding:2px 8px;
  font-size:9.5px;font-weight:800;letter-spacing:.02em;white-space:nowrap}
/* chips team e badge pass */
.cbTag{display:inline-block;background:var(--bg);border:1px solid var(--linea);border-radius:99px;
  padding:2px 9px;font-size:10.5px;font-weight:700;margin:1px 2px 1px 0;white-space:nowrap}
.cbTagSec{opacity:.6;border-style:dashed}
.cbPass{display:inline-flex;align-items:center;border-radius:99px;padding:3px 10px;
  font-size:10.5px;font-weight:800;white-space:nowrap}
/* v49.7 — il numero del pass (la posizione nel tab Pass = la zona). Sta dentro
   la stessa pastiglia, su una rondella chiara: si legge da lontano e resta
   leggibile anche in stampa senza «grafica di sfondo», dove i fondi spariscono
   ma il testo no. */
.cbPassNum{flex:none;min-width:15px;margin-right:6px;padding:0 3px;border-radius:99px;
  background:rgba(255,255,255,.72);text-align:center;font-size:10px;font-weight:800;
  font-variant-numeric:tabular-nums}
.cbPassNone .cbPassNum{background:none}
.cbP0{background:#dbeafe;color:#1e40af}   /* Zona 1 · Collaboratori e Campo Stadio */
.cbP1{background:#fce7f3;color:#9d174d}   /* Zona 2 · Tribuna Sotto (tunnel) */
.cbP2{background:#fef3c7;color:#92400e}   /* Zona 3 · Spalti */
.cbP3{background:#e2e8f0;color:#334155}   /* Zona 4 · Campo Riscaldamento e Campo Stadio */
.cbP4{background:#dcfce7;color:#166534}   /* Zona 5 · Tribuna Sopra e Mixzone */
/* sezioni (team e pass) */
.cbSez{background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-1);padding:14px 16px}
.cbSez .lvDayHead{cursor:default}
.cbTeamGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}
.cbTeamCard{border:1px solid var(--linea);border-radius:var(--r1);padding:12px;display:flex;
  flex-direction:column;gap:8px;background:var(--bg)}
.cbTeamCard h3{margin:0;font-size:14px;font-weight:800;color:var(--navy)}
/* v50.1: il nome del team e' un titolo, non un campo — si modifica col doppio
   clic (v. .cbEditable). L'input compare solo durante la modifica. */
h3.cbTeamName{margin:0;font-size:14px;font-weight:800;color:var(--navy);line-height:1.3}
.cbTeamMeta{font-size:11px;font-weight:700;color:var(--mut)}
.cbLbl{display:flex;flex-direction:column;gap:4px;font-size:10px;font-weight:800;
  text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
.cbLbl select,.cbLbl textarea{border:1px solid var(--linea);border-radius:var(--r1);padding:7px 9px;
  font:inherit;font-size:12.5px;font-weight:600;color:var(--ink);background:var(--carta);
  text-transform:none;letter-spacing:normal;resize:vertical}
.cbLbl select:focus,.cbLbl textarea:focus{outline:2px solid var(--navy);outline-offset:1px}
.cbDoc{font-size:12px;font-weight:600;white-space:pre-line;background:var(--carta);
  border:1px dashed var(--linea);border-radius:var(--r1);padding:8px 10px}
.cbDoc b{display:block;font-size:9.5px;font-weight:800;text-transform:uppercase;
  letter-spacing:.05em;color:var(--mut);margin-bottom:3px}
/* tab pass */
.cbPtList{display:flex;flex-direction:column;gap:6px}
/* v50.1 — il tab Pass e' un ELENCO che si legge, non un modulo da compilare:
   una griglia di cinque colonne (sequenza, nome, zone in chiaro, a quanti e'
   assegnato, azioni). Sotto i 760px collassa in due righe per pass. */
.cbPtGrid{display:grid;grid-template-columns:auto minmax(110px,auto) minmax(160px,1fr) auto auto;
  gap:0 12px;align-items:center}
.cbPtGrid .cbPtHead,.cbPtGrid .cbPtRow{display:contents}
.cbPtHead span{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--mut);padding:0 0 6px;border-bottom:1px solid var(--linea)}
.cbPtRow>*{padding:7px 0;border-bottom:1px solid var(--bg)}
.cbPtRow:last-child>*{border-bottom:none}
.cbPtAz{display:flex;gap:4px;justify-content:flex-end}
.cbPtUse{font-size:11px;font-weight:700;color:var(--mut);white-space:nowrap}
.cbPtUse0{opacity:.55}
/* i nomi delle zone: la cifra basta al banco accrediti, il nome serve a chi
   decide chi mandarci */
.cbPtZoneTxt{font-style:normal;font-size:11px;font-weight:700;color:var(--mut);line-height:1.35}
.cbPtZoneVuoto{color:var(--rosso);opacity:.75}
.cbPtHint{display:block;font-style:normal;font-size:11px;font-weight:700;color:var(--mut);
  margin-top:10px;padding-top:8px;border-top:1px solid var(--bg)}
@media(max-width:760px){
  .cbPtGrid{grid-template-columns:auto 1fr auto}
  .cbPtRow>.cbPtZoneTxt{grid-column:1/-1;padding-top:0}
  .cbPtRow>.cbPtUse{grid-column:1/-1;padding-top:0;padding-bottom:9px}
}
/* elenco delle zone: il numero e' la posizione, quindi e' una pastiglia e non
   un campo — si rinomina solo il nome */
.cbZnList{display:flex;flex-direction:column;gap:2px}
.cbZnRow{display:flex;align-items:center;gap:10px;padding:6px 2px;border-bottom:1px solid var(--bg)}
.cbZnRow:last-child{border-bottom:none}
.cbZnNum{flex:none;min-width:26px;text-align:center;border:1px solid var(--linea);
  border-radius:99px;padding:3px 8px;font-size:11px;font-weight:800;color:var(--navy);
  background:var(--carta);font-variant-numeric:tabular-nums}
.cbZnName{flex:1 1 auto;font-size:13px;font-weight:800;color:var(--ink)}
.cbZnRow .cbPtUse{margin-left:auto}
/* v50.1 — testo modificabile col doppio clic (nome del team, del pass, zone).
   Deve VEDERSI che si puo' toccare, senza sembrare un campo aperto: nessun
   bordo a riposo, un fondo appena accennato al passaggio. */
.cbEditable{cursor:text;border-radius:var(--r1);padding:2px 5px;margin:0 -5px;
  border:1px solid transparent}
body:not(.viewer) .cbEditable:hover{border-color:var(--linea);background:var(--carta)}
.cbEditInp{width:100%;min-width:60px;border:1px solid var(--navy);border-radius:var(--r1);
  padding:4px 7px;font:inherit;color:var(--ink);background:var(--carta)}
.cbEditInp:focus{outline:2px solid var(--navy);outline-offset:1px}
.cbNomeInp{font-size:13px;font-weight:800}
.cbSeqInp{font-size:12.5px;font-weight:800;font-variant-numeric:tabular-nums;text-align:center}
/* v50.1: anche qui il nome e' testo (doppio clic per modificarlo) */
.cbPtName{font-size:13px;font-weight:800;color:var(--ink)}
/* v50.2 — intestazioni ordinabili. La freccia sta solo sulla colonna attiva:
   otto frecce grigie in fila sarebbero rumore. Il cursore resta 'col-resize'
   sopra il grip di ridimensionamento (che ha il suo). */
.cbThSort{cursor:pointer;user-select:none;white-space:nowrap}
.cbThSort:hover{color:var(--navy);background:var(--bg)}
.cbThSort.on{color:var(--navy)}
.cbSortAr{font-style:normal;font-size:9px;margin-left:4px;vertical-align:1px}
/* v50.3 — recap: stampati / assegnati / restano. La riga che conta e' l'ultima
   colonna, quindi e' l'unica colorata: rosso solo quando il conto NON torna. */
.cbPassTbl td{vertical-align:middle}
.cbPassTbl .cbPtName{display:block}
.cbPassTbl .cbPtZoneTxt{display:block;margin-top:2px}
.cbQty{display:inline-block;min-width:34px;text-align:right;font-variant-numeric:tabular-nums;
  font-weight:800}
.cbResta{font-variant-numeric:tabular-nums}
.cbResta b{color:#15803d}
.cbResta0 b{color:var(--mut)}
.cbRestaKo b{color:var(--rosso)}
/* sezioni ripiegate (zone, matrice per team): restano a un clic, non in mezzo */
.cbDett>summary{display:flex;align-items:center;gap:10px;flex-wrap:wrap;cursor:pointer;
  list-style:none;padding:2px 0}
.cbDett>summary::-webkit-details-marker{display:none}
.cbDett>summary::before{content:'▸';font-size:11px;color:var(--mut);transition:transform .15s}
.cbDett[open]>summary::before{transform:rotate(90deg)}
.cbDett>summary h2{margin:0;font-size:15px;font-weight:800;color:var(--navy)}
.cbDett>summary:hover h2{color:var(--rosso)}
.cbDett>summary .lvDayStat{font-size:11px;font-weight:700;color:var(--mut)}
.cbDettAz{display:flex;align-items:center;gap:8px;margin:10px 0 6px}
/* v50.3 — «non serve il pass», dichiarato: grigio e pieno, diverso dal
   tratteggio di «non ancora deciso». Non e' un buco, e non deve sembrarlo. */
.cbPassNo{background:var(--bg);border:1px solid var(--linea);color:var(--mut);font-style:italic}
/* v50.2 — «Senza pass»: un blocco per team, con il comando in testa */
.cbSpGrp{margin-top:10px}
.cbSpGrp:first-of-type{margin-top:2px}
.cbSpHead{display:flex;align-items:center;gap:9px;padding:6px 2px;flex-wrap:wrap}
.cbSpHead b{font-size:13px;font-weight:800;color:var(--navy)}
.cbSpHead i{font-style:normal;font-size:11px;font-weight:700;color:var(--rosso)}
.cbSpBtn{margin-left:auto;font-size:11px;white-space:nowrap}
.cbScorta{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:800;color:var(--mut)}
.cbScorta input{width:64px;border:1px solid var(--linea);border-radius:99px;padding:5px 10px;
  font:inherit;font-size:12px;font-weight:800;background:var(--bg)}
/* v50.4 — tab Scarpe: stesso impianto del recap pass. La misura e' una
   pastiglia numerica; gli esiti «coperta/manca» ricalcano i colori di Restano. */
.cbScMisura{display:inline-block;min-width:38px;text-align:center;background:var(--bg);
  border:1px solid var(--linea);font-size:11px;padding:2px 6px}
.cbScAdd{display:flex;align-items:center;gap:6px}
.cbScAdd input{width:64px;border:1px solid var(--linea);border-radius:99px;padding:6px 10px;
  font:inherit;font-size:12px;font-weight:800;background:var(--bg)}
.cbScMis{background:var(--bg);border:1px solid var(--linea);color:var(--navy);
  font-weight:800;font-variant-numeric:tabular-nums}
.cbScOk{background:var(--bg);border:1px solid #15803d;color:#15803d}
.cbScKo{background:var(--bg);border:1px solid var(--rosso);color:var(--rosso);font-weight:800}
/* v50.8 — sezione Stakeholder: righe cliccabili, apre la scheda (come i
   collaboratori) invece del doppio clic campo per campo. */
.cbCrmTbl td{vertical-align:middle}
/* v52 — intestazione di gruppo (Ente) dentro la tabella Stakeholder: stesso
   ritmo visivo di .cbSpHead (elenco «Chi aspetta un pass»), qui dentro un
   <td colspan> invece che un div — il flex sta sulla cella, non sulla riga. */
.cbCrmGrpHead td{background:var(--bg);border-top:1px solid var(--linea);
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:6px 8px}
.cbCrmGrpHead b{font-size:13px;font-weight:800;color:var(--navy)}
.cbCrmGrpHead i{font-style:normal;font-size:11px;font-weight:700;color:var(--rosso)}
.cbCrmGrpHead .cbSpBtn{margin-left:auto}
/* v54 — tolta la regola v53 che metteva in corsivo il nome delle righe create
   in blocco: quelle righe non si segnalano piu' (nessuno le rinomina, l'elenco
   si da' al responsabile dell'ente). `.cbPhRow` resta ai soli collaboratori,
   dove `ph` vuol dire davvero «posto da coprire» — cioe' un buco aperto. */
/* bottone-campo di Ente e Contatto di riferimento: si comporta come un campo,
   non come un bottone d'azione, quindi riusa .lvTagBtn (la stessa cosa che fa
   #lvFazBtn per l'Azienda nel modulo Lavori) — qui serve solo che un nome
   lungo non allarghi la scheda. */
.cbRifBtn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* v56 — righe DA APPROVARE. Il blocco e' una .cbSez normale e i gruppi per
   autore riusano .cbSpGrp/.cbSpHead del blocco «Senza pass»: qui serve solo il
   segnale visivo che quella parte di elenco non conta ancora. */
.cbApprSez{border-left:3px solid #f59e0b;padding-left:12px}
/* si usano INSIEME a .cbTag, cosi' ereditano forma, ritmo e margini. L'ambra e'
   la stessa di .cbPhTag (posto da coprire) perche' dice la stessa cosa: una
   riga che c'e' ma non conta. */
.cbTagAtt{background:#fef3c7;color:#92400e;border-color:#fde68a}
.cbTagNo{background:var(--bg);color:var(--rosso);border-style:dashed;opacity:.8}
.cbApprMot{font-style:normal;font-size:11px;font-weight:700;color:var(--mut);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;max-width:220px}
.cbApprNo{white-space:nowrap}
/* v56 — taglia e numero corretti dalla riga della tabella Consegna materiale.
   L'input riusa .cbSeqInp; la select non ha un equivalente, e resta stretta
   perche' la colonna non deve allargarsi. */
.cbConsSel{border:1px solid var(--linea);border-radius:99px;padding:4px 8px;font:inherit;
  font-size:12px;font-weight:700;color:var(--ink);background:var(--carta);max-width:120px}
.cbConsSel:focus{outline:2px solid var(--navy);outline-offset:1px}
.cbConsSc{max-width:78px}
@media(pointer:coarse){.cbConsSel,.cbConsSc{min-height:38px}}
/* v56.8 - le paia ordinate del tab Scarpe: stesso campo del numero corretto al
   banco (.cbSeqInp), stretto perche la colonna non si allarghi. Qui la riga non
   apre nessuna scheda, quindi un campo sempre aperto non ruba nessun clic. */
.cbScQtyInp{max-width:66px}
@media(pointer:coarse){.cbScQtyInp{min-height:38px}}
/* v56.1 — le due liste della Consegna stanno in una pastiglia accanto al
   conteggio, non in due riquadri sotto 238 righe. La pastiglia e' un .lvDayStat
   che si preme: eredita forma e colore, qui si aggiunge solo il fatto che e'
   cliccabile e lo stato aperto. */
.cbConsChip{cursor:pointer;border:1px solid transparent;font:inherit;display:inline-flex;
  align-items:center;gap:6px}
.cbConsChip:hover{border-color:var(--linea)}
.cbConsChip.on{border-color:var(--navy);color:var(--navy)}
.cbConsChip b{font-weight:800}
.cbConsChev{font-size:9px;opacity:.7}
@media(pointer:coarse){.cbConsChip{min-height:38px}}
.cbConsPanel{border-top:1px solid var(--linea);padding-top:8px;margin-top:2px}
/* v56.7 - la misura della tabella scarpe si PREME, dentro la Consegna: filtra
   l'elenco su chi porta quel numero. E' la stessa pastiglia .cbScMisura, con in
   piu' il fatto che e' un bottone (font e colore non si ereditano) e lo stato
   acceso. Fuori dalla Consegna la cella resta un <b>: li' non c'e' un elenco da
   filtrare, e un bottone prometterebbe un gesto che non fa niente. */
.cbScFiltro{cursor:pointer;font:inherit;font-size:11px;font-weight:800;color:var(--navy)}
.cbScFiltro:hover{border-color:var(--navy)}
.cbScFiltro.on{background:var(--navy);border-color:var(--navy);color:#fff}
@media(pointer:coarse){.cbScFiltro{min-height:38px}}
/* la riga che dichiara il filtro attivo, sopra l'elenco: bordo e non fondo,
   cosi' regge anche in stampa senza «Grafica di sfondo» (Regola 6). */
.cbConsFiltro{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  border:1px solid var(--linea);border-left:3px solid var(--rosso);border-radius:8px;
  padding:6px 10px;margin:8px 0 4px;font-size:12px}
.cbConsFiltro i{font-style:normal;font-weight:700;color:var(--mut)}
.cbConsFiltro button{margin-left:auto}
.cbSecRow td{opacity:.6}
.cbZero{color:var(--linea)}
.cbTotRow td{border-top:2px solid var(--linea);background:var(--bg)}
.cbScRow td{color:var(--rosso)}
/* drawer persona: riusa .lvDlgCard, qui solo l'overlay e i pezzi propri */
#cbDlg{position:fixed;inset:0;z-index:6500;background:rgba(21,21,28,.35);display:flex;justify-content:flex-end}
#cbDlg[hidden]{display:none}
/* v48.1: qui stava .cbTchkList — la lista dei 38 checkbox della scheda persona,
   sostituita dal blocco .cbTm* più in basso. */
.cbTwo{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.cbInline{flex-direction:row!important;align-items:center;gap:8px;text-transform:none!important;
  letter-spacing:normal!important;font-size:12px!important;color:var(--ink)!important;cursor:pointer}
/* v44 — recap team (clic sulla card) e allegati reali su R2 */
.cbTeamCard{cursor:pointer}
.cbTeamCard:hover{border-color:var(--navy)}
.cbTeamCard input,.cbTeamCard textarea,.cbTeamCard button{cursor:auto}
.cbTeamHint{font-size:10.5px;font-weight:700;color:var(--mut);margin-top:auto}
/* v49.2: `flex:none` non è un dettaglio — .lvDlgCard è una colonna flex, e un
   box con overflow proprio si lascia comprimere fino a una riga sola quando il
   contenuto sopra cresce. È così che l'elenco dei membri era sparito. */
.cbTeamDlgMembers{flex:none;max-height:240px;overflow:auto;border:1px solid var(--linea);
  border-radius:var(--r1);padding:6px 8px;display:flex;flex-direction:column;gap:2px;
  background:var(--bg)}
.cbTeamMemberRow{display:flex;align-items:center;gap:8px;padding:4px 2px;font-size:12.5px;font-weight:700}
.cbTeamMemberRow .cbName{flex:1;font-weight:800}
.cbTeamMemberRow .cbRuolo{font-weight:600;color:var(--mut);max-width:none}
.cbTeamFiles{display:flex;flex-direction:column;gap:6px}
.cbFileRow{display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid var(--linea);
  border-radius:var(--r1);background:var(--bg)}
.cbFileInfo{flex:1;font-size:12.5px;font-weight:700;color:var(--navy);text-decoration:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cbFileInfo:hover{text-decoration:underline}
.cbFileMeta{font-size:10.5px;font-weight:700;color:var(--mut);white-space:nowrap}
.cbFileEmpty{font-size:12px;font-weight:700;color:var(--mut);padding:6px 2px}
.cbFileHint{font-size:12px;font-weight:600;color:var(--mut);background:var(--bg);
  border:1px dashed var(--linea);border-radius:var(--r1);padding:9px 12px}
/* v49.9 — zona di caricamento: input `multiple` piu trascinamento. Il bordo
   tratteggiato dice da se che ci si puo lasciar cadere sopra qualcosa; sul
   touch la mezza frase sul trascinamento sparisce, il gesto non esiste. */
.cbDrop{display:flex;flex-direction:column;gap:6px;padding:10px 12px;background:var(--bg);
  border:1px dashed var(--linea);border-radius:var(--r1);
  transition:border-color .15s,background .15s}
.cbDrop.on{border-color:var(--rosso);background:var(--carta)}
.cbDropLbl{margin:0}
.cbDropLbl input[type=file]{max-width:100%}
.cbDropHint{font-size:11px;font-weight:600;color:var(--mut)}
.cbDropProg{font-size:12px;font-weight:800;color:var(--navy)}
@media (pointer:coarse){.cbDropDrag{display:none}}
/* scheda personale stampabile */
#cbPrint{display:none}
.cbCard{max-width:620px;margin:0 auto;padding:26px 30px;display:flex;flex-direction:column;gap:16px}
.cbCardHead{display:flex;flex-direction:column;gap:8px;align-items:flex-start;
  border-bottom:3px solid var(--rosso);padding-bottom:14px}
.cbCardEvt{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--navy)}
.cbCardHead h1{margin:0;font-size:26px;font-weight:900;color:var(--ink)}
.cbCardTbl{width:100%;border-collapse:collapse;box-shadow:none;border-radius:0}
.cbCardTbl th{width:150px;text-align:left;font-size:9.5px;font-weight:800;text-transform:uppercase;
  letter-spacing:.05em;color:var(--mut);padding:7px 10px 7px 0;vertical-align:top;background:none}
.cbCardTbl td{font-size:13px;font-weight:600;padding:7px 0;border-bottom:1px solid var(--linea)}
.cbCardResp{display:block;font-style:normal;font-size:11px;font-weight:600;color:var(--mut)}
.cbCardDoc{font-size:12px;font-weight:600;white-space:pre-line;border:1px dashed var(--linea);
  border-radius:var(--r1);padding:9px 12px}
.cbCardDoc b{display:block;font-size:9.5px;font-weight:800;text-transform:uppercase;
  letter-spacing:.05em;color:var(--mut);margin-bottom:3px}
.cbCardFoot{font-size:10px;font-weight:600;color:var(--mut);border-top:1px solid var(--linea);padding-top:10px}
/* mobile */
@media(max-width:640px){
  .cbWrap{padding:12px 10px 40px}
  #cbSearch{flex-basis:100%}
  #cbBar select{max-width:46%}
  .cbTwo{grid-template-columns:1fr}
  .lvDlgCard{width:100%}
  .cbTeamGrid{grid-template-columns:1fr}
}
/* stampa: la pagina normale stampa la vista corrente pulita; il foglio vero lo
   governa body.pPrinting nel blocco condiviso in fondo al file.
   v49: tolte due regole su body.cbPrinting — quella classe non viene più
   impostata da nessuna parte dalla v47. */
@media print{
  #topnav,#cbBar,#cbTabs,#cbDlg,#fileBanner,#cantiereBar,#toasts,.lvBtn,#accChip,#accOut{display:none!important}
  body.page-collab{background:#fff}
  .cbTblWrap,.cbSez{box-shadow:none;border:1px solid var(--linea);break-inside:avoid}
}

/* ===================== v42 — Collaboratori: dashboard team =====================
   Viste multiple del tab Persone (Lista/Kanban/Griglia), drag&drop delle
   schede tra le colonne team (pattern drag di lavori v40), mini-picker per
   l'assegnazione manuale dei pass. Solo classi .cb*; variabili :root. */
/* kanban */
.cbKan{display:flex;gap:10px;overflow-x:auto;align-items:flex-start;padding-bottom:8px}
.cbKanCol{flex:0 0 230px;background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-1);
  padding:10px;display:flex;flex-direction:column;gap:6px;min-height:90px}
.cbKanSec{opacity:.85}
.cbKanSec .cbKColHead b{color:var(--mut)}
.cbKanNone{background:var(--bg);border:1px dashed var(--linea);box-shadow:none}
.cbKColHead{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding-bottom:4px;
  border-bottom:1px solid var(--linea)}
.cbKColHead b{font-size:12.5px;font-weight:800;color:var(--navy)}
.cbKColHead span{font-size:10.5px;font-weight:800;color:var(--mut);font-variant-numeric:tabular-nums}
.cbKCard,.cbGCard{border:1px solid var(--linea);border-radius:var(--r1);background:var(--bg);
  padding:7px 9px;cursor:pointer;display:flex;flex-direction:column;gap:3px}
.cbGCard{background:var(--carta)}
.cbKCard:hover,.cbGCard:hover{border-color:var(--navy)}
.cbKName{font-size:12px;font-weight:800;line-height:1.25}
.cbKRole{font-size:10.5px;font-weight:600;color:var(--mut);line-height:1.3}
.cbRespTag{font-size:10.5px;font-weight:800;color:var(--rosso);line-height:1.3;cursor:help}
.cbKFoot{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:2px}
.cbKMulti{font-size:9.5px;font-weight:800;color:var(--mut);border:1px dashed var(--linea);
  border-radius:99px;padding:1px 6px}
.cbKEmpty{font-size:10.5px;font-weight:600;color:var(--mut);text-align:center;padding:10px 4px;
  border:1px dashed var(--linea);border-radius:var(--r1)}
.cbPhCard{opacity:.55}
/* griglia raggruppata */
.cbGroup{background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-1);padding:12px 14px;margin-bottom:12px}
.cbGroupHead{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.cbGroupHead h2{margin:0;font-size:15px;font-weight:800;color:var(--navy)}
.cbGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(185px,1fr));gap:8px}
/* pass manuali */
.cbPassNone{background:var(--bg);border:1px dashed var(--linea);color:var(--mut)}
body.page-collab:not(.viewer) .cbPassCell{cursor:pointer}
body.page-collab:not(.viewer) .cbPassCell:hover .cbPass{outline:1px solid var(--navy);outline-offset:1px}
.cbPick{position:fixed;z-index:6800;background:var(--carta);border:1px solid var(--linea);
  border-radius:var(--r1);box-shadow:var(--sh-2);min-width:190px;max-height:60vh;overflow:auto;
  display:flex;flex-direction:column;padding:4px}
/* v48.1 — SENZA QUESTA RIGA il popover si rompe. In un flex column con
   max-height i figli hanno flex-shrink:1 e vengono SCHIACCIATI invece di far
   scorrere il contenitore: con 38 team le righe si riducevano a pochi pixel e
   la prima (con outline, perché .on) sembrava un riquadro vuoto. */
.cbPick>*{flex:none}
.cbPick button{border:none;background:none;font:inherit;text-align:left;padding:6px 8px;
  border-radius:8px;cursor:pointer;display:flex;align-items:center;min-height:32px}
.cbPick button:hover{background:var(--bg)}
.cbPick button.on{outline:1px solid var(--navy)}
/* v54 — MENU CONTESTUALE (tasto destro), impianto unico di common.js. Non e'
   una terza famiglia di popover: e' un .cbPick, cosi' eredita position:fixed,
   il max-height con lo scroll, la riga .cbPick>*{flex:none} qui sopra, la
   soppressione in stampa e i 38px col dito. Qui solo cio' che un menu di
   comandi ha in piu' rispetto a un elenco di scelte. */
.ctxM{min-width:210px;font-size:12.5px;font-weight:700}
.ctxM .sep{border-top:1px solid var(--linea);margin:3px 6px}
.ctxM button[disabled]{opacity:.4;cursor:default}
.ctxM button[disabled]:hover{background:none}
/* su cosa sta agendo: un menu che compare sotto il cursore fa bene a dirlo */
.ctxMHd{padding:6px 8px 5px;border-bottom:1px solid var(--linea);margin-bottom:3px;
  font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--mut);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* v56 — le voci dell'elenco «qui ci sono N elementi»: pallino del colore, nome
   e categoria. Il nome puo' essere lungo e la categoria non deve sparire, per
   questo e' l'unico dei tre a stringersi. */
.ctxM button:has(.ctxSw){display:flex;align-items:center;gap:7px}
.ctxSw{width:11px;height:11px;border-radius:4px;flex:none;box-shadow:0 0 0 1px rgba(0,0,0,.18)}
.ctxNm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}
.ctxSub{flex:none;font-size:10px;font-weight:700;color:var(--mut)}
.cbPick .cbPickNew{border-top:1px solid var(--linea);border-radius:0 0 8px 8px;margin-top:2px;
  font-size:12px;font-weight:800;color:var(--rosso)}
/* v45.1: riga opzione+cestino, per eliminare un tag dal catalogo */
.cbPickRow{display:flex;align-items:stretch;gap:2px}
.cbPickRow .cbPickOpt{flex:1;min-width:0}
.cbPickDel{flex:none;color:var(--mut);font-size:11px}
.cbPickDel:hover{color:var(--rosso)}
/* v62.2: rinomina un tag del catalogo (per ora solo i responsabili di lavori.js) */
.cbPickEdit{flex:none;color:var(--mut);font-size:11px}
.cbPickEdit:hover{color:var(--ink)}
/* drag (specchio del blocco lavori v40) */
body.page-collab:not(.viewer) .cbKCard{touch-action:pan-y} /* pan-y, non none: lo scroll pagina deve restare possibile */
body.cbDragOn{user-select:none}
body.cbDragOn,body.cbDragOn .cbKCard{cursor:grabbing!important}
.cbDragging{opacity:.45}
.cbDragTip{position:fixed;z-index:7000;background:var(--ink);color:#fff;font-size:11px;font-weight:800;
  padding:5px 10px;border-radius:8px;pointer-events:none;white-space:nowrap;box-shadow:var(--sh-2)}
.cbDropHover{outline:2px dashed var(--navy);outline-offset:2px}
/* mobile */
@media(max-width:640px){
  .cbKanCol{flex-basis:200px}
  #cbViewSeg{order:-1}
}
/* stampa: il kanban si sviluppa su più righe invece di tagliarsi allo scroll */
@media print{
  .cbKan{overflow:visible;flex-wrap:wrap}
  .cbKanCol,.cbGroup{break-inside:avoid;box-shadow:none;border:1px solid var(--linea)}
  .cbPick,.cbDragTip{display:none!important}
}

/* ===================== v42 — Lavori: sidebar "Da pianificare" + vista tabella =====================
   Strumento di gestione attività: aside sticky a sinistra coi task senza
   giorno, tabella unica per giorno con colonne ridimensionabili
   (makeResizableTable con persistenza 'lvTableW2026') e scheda azienda
   stampabile (pattern cbPrinting dei collaboratori). Solo classi .lv*. */
.lvBody{display:flex;align-items:flex-start;gap:16px}
#lvSide{flex:0 0 272px;min-width:0;position:sticky;top:12px;
  max-height:calc(100vh - 76px);overflow:auto;display:flex;flex-direction:column;gap:16px}
.lvMain{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:16px}
#lvSide .lvURow{flex-wrap:wrap}
/* vista tabella */
.lvTblWrap{background:var(--carta);border-radius:var(--r2);box-shadow:var(--sh-1);
  padding:8px 10px;overflow-x:auto}
table.lvTable{min-width:760px}
.lvTable td{vertical-align:middle;padding:6px 8px;border-bottom:1px solid var(--bg);font-size:12px}
tr.lvTGroup td{background:var(--ink);color:#fff;font-size:10px;font-weight:800;
  letter-spacing:.06em;text-transform:uppercase;padding:6px 10px}
tr.lvTGroup .lvTGStat{font-weight:700;opacity:.75;text-transform:none;letter-spacing:normal;margin-left:8px}
tr.lvTGroup .lvBtn{float:right;padding:1px 10px;font-size:10px;background:none;color:#fff;border-color:rgba(255,255,255,.4)}
tr.lvTGroup .lvBtn:hover{border-color:#fff}
/* v43: il giorno corrente si àncora a colpo d'occhio */
tbody.lvToday tr.lvTGroup td{background:var(--rosso)}
.lvTodayTag{display:inline-block;background:#fff;color:var(--rosso);border-radius:99px;
  padding:1px 8px;margin-right:8px;font-size:9px;font-weight:900;letter-spacing:.08em}
tr.lvTRow{cursor:pointer}
tr.lvTRow:hover td{background:#fafafc}
tr.lvTRow.lvDim td{opacity:.25}
tr.lvTEmpty td{color:var(--mut);font-weight:600;font-size:11.5px;font-style:italic}
/* v62: .lvTable e' table-layout:fixed (via .resizableCols, aggiunta da
   makeResizableTable): la cella NON si allarga mai per il contenuto, e la sua
   larghezza puo' anche arrivare da localStorage lvTableW2026 (minimo 40px).
   Senza overflow il testo lungo tracima e viene dipinto SOPRA la colonna
   accanto — era il caso del badge "Pronto entro", che scriveva sul nome
   dell'attivita'. Stessa identica correzione gia' fatta per .cbTable. */
.lvTable td{overflow:hidden;text-overflow:ellipsis}
td.lvTTime{font-variant-numeric:tabular-nums;font-weight:800;white-space:nowrap}
td.lvTAct{font-weight:700}
td.lvTNc{text-align:center;font-variant-numeric:tabular-nums;font-weight:700}
td.lvTSt{white-space:nowrap}
td.lvTSt .lvChip{cursor:inherit;border:none}
td.lvTNote,td.lvTAz,td.lvTResp{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
#lvBar select{border:1px solid var(--linea);border-radius:99px;padding:7px 12px;
  font:inherit;font-size:12px;font-weight:700;background:var(--bg);max-width:180px}
/* v44: pannello filtri avanzati */
#lvFilters{flex-basis:100%;display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;
  border-top:1px dashed var(--linea);margin-top:4px;padding-top:10px}
#lvFilters[hidden]{display:none}
#lvFilters label{display:flex;flex-direction:column;gap:3px;font-size:9.5px;font-weight:800;
  text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
#lvFilters select{min-width:130px;max-width:210px}
#lvFiltBtn.lvFiltOn{border-color:var(--navy);background:var(--navy);color:#fff}
/* mobile / tablet: sidebar impilata sotto la tabella */
@media(max-width:900px){
  .lvBody{flex-direction:column}
  #lvSide{position:static;flex:none;width:100%;max-height:none;order:2}
  .lvMain{width:100%}
}
/* scheda stampabile (azienda / completa) — v45.1: header con logo, footer
   "da lettera" con referente/data/link su righe separate */
#lvPrint{display:none}
.lvAzCard{max-width:640px;margin:0 auto;padding:26px 30px;display:flex;flex-direction:column;gap:14px}
.lvAzHead{display:flex;flex-direction:column;gap:6px;border-bottom:3px solid var(--rosso);padding-bottom:12px}
.lvAzHeadTop{display:flex;align-items:center;gap:10px}
.lvAzLogo{height:32px;width:auto;display:block}
.lvAzEvt{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--navy)}
.lvAzHead h1{margin:0;font-size:24px;font-weight:900;color:var(--ink)}
.lvAzDay{margin:6px 0 0;font-size:13px;font-weight:800;color:var(--navy)}
.lvAzTbl{width:100%;border-collapse:collapse;box-shadow:none;border-radius:0}
.lvAzTbl th{font-size:9px;padding:5px 8px 5px 0;background:none}
.lvAzTbl td{font-size:12px;font-weight:600;padding:5px 8px 5px 0;border-bottom:1px solid var(--linea)}
.lvAzFoot{font-size:10px;font-weight:600;color:var(--mut);border-top:1px solid var(--linea);padding-top:10px;
  display:flex;flex-direction:column;gap:4px}
.lvAzFootMeta{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
.lvAzFootMeta b{color:var(--ink)}
.lvAzFoot a{color:inherit;word-break:break-all}
/* dialogo opzioni di stampa (stesso schema centrato di #cloudConflict) */
.lvPrintOptOv{position:fixed;inset:0;z-index:7200;display:flex;align-items:center;justify-content:center;
  background:rgba(21,21,30,.45);padding:16px}
.lvPrintOptCard{width:min(340px,92vw);background:var(--carta);border-radius:16px;box-shadow:var(--sh-2);
  padding:20px 22px;display:flex;flex-direction:column;gap:12px;animation:ccPop .16s cubic-bezier(.2,.9,.3,1.15)}
.lvPrintOptCard h3{margin:0;font-size:16px;font-weight:800;color:var(--navy)}
.lvPrintOptCard label{display:flex;flex-direction:column;gap:6px;font-size:10.5px;font-weight:800;
  text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
@media print{
  .lvTblWrap{box-shadow:none;border:1px solid var(--linea)}
  .colResizer{display:none!important}
  #lvSide{position:static;max-height:none}
  body.lvPrinting #lvApp{display:none!important}
  body.lvPrinting #lvPrint{display:block!important}
  .lvPrintOptOv{display:none!important}
}

/* ===================== v46 — Collaboratori: leggibilità e mobile =====================
   Correzioni di sovrapposizione, gruppi di team liberi (al posto del vecchio
   pri/sec), kanban navigabile, scheda laterale o al centro, vista Lista
   ridotta a Nome/Team/Ruolo e adattamento a telefono. Solo classi .cb*;
   .lvDlgCard resta condivisa col Programma lavori e non viene toccata. */

/* --- sovrapposizioni (punto 1) --- */
/* .cbTable è table-layout:fixed (via .resizableCols): senza overflow il testo
   lungo di una cella tracima sulla colonna accanto — era il caso delle mail. */
.cbTable td,.cbTable th{overflow:hidden;text-overflow:ellipsis}
.cbTable td.cbTeamCell{white-space:normal}
.cbRuolo{max-width:none}
/* --- barra comandi --- */
.cbFilts{display:contents} /* su desktop i controlli restano in linea nella barra */
.cbFiltToggle{display:none}
#cbBar .lvBtn.cbFOn{background:var(--navy);border-color:var(--navy);color:#fff}

/* --- popover generico: titoli di gruppo e ricerca interna --- */
.cbPick{min-width:210px;max-width:min(320px,92vw)}
.cbPickFind{border:1px solid var(--linea);border-radius:99px;padding:6px 10px;font:inherit;
  font-size:12px;font-weight:600;background:var(--bg);margin:2px 2px 4px}
.cbPickFind:focus{outline:2px solid var(--navy);outline-offset:1px}
.cbPickGrp{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--mut);padding:6px 8px 2px}
.cbPick button[hidden],.cbPickGrp[hidden]{display:none}
/* v48.1: una regola sola. Prima qui c'era `display:block`, che sovrascriveva il
   `display:flex;align-items:center` di .cbPick button e sballava
   l'allineamento verticale delle voci con badge o orario a fianco. */
.cbPick button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;gap:6px;min-width:0}
.cbPick button.on{outline:1px solid var(--navy)}

/* --- gruppi di team (punto 4) --- */
.cbTeamTools{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
#cbTeamSearch{flex:0 1 280px;min-width:150px;border:1px solid var(--linea);border-radius:99px;
  padding:7px 13px;font:inherit;font-size:12.5px;background:var(--carta)}
#cbTeamSearch:focus{outline:2px solid var(--navy);outline-offset:1px}
.cbGrpHead{gap:6px}
.cbGrpName{border:1px solid transparent;border-radius:var(--r1);padding:4px 8px;font:inherit;
  font-size:16px;font-weight:800;color:var(--navy);background:none;flex:0 1 260px;min-width:120px}
.cbGrpName:hover,.cbGrpName:focus{border-color:var(--linea);background:var(--bg);outline:none}
.cbKanGrp{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;
  color:var(--mut);background:var(--bg);border-radius:99px;padding:1px 7px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;max-width:90px}
.cbRowGrp{font-style:normal;font-size:10px;font-weight:700;color:var(--mut)}

/* --- card team più asciutta (punto 9) --- */
.cbTeamHint{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.cbTeamBadge{font-size:10px;font-weight:800;background:var(--carta);border:1px solid var(--linea);
  border-radius:99px;padding:2px 8px;white-space:nowrap;max-width:150px;overflow:hidden;text-overflow:ellipsis}
.cbTeamOpen{margin-left:auto;font-size:10.5px;font-weight:700;color:var(--mut)}
.cbTeamCard:hover .cbTeamOpen{color:var(--rosso)}
.cbDocAdd{align-self:flex-start;padding:4px 6px;font-size:11px}

/* --- kanban navigabile (punto 3) --- */
/* colonne con altezza limitata e scroll proprio: così la barra orizzontale
   della corsia resta a schermo invece di finire in fondo alla pagina */
.cbKan{padding-right:14px} /* niente scroll-behavior:smooth: rende la rotella molliccia */
/* --cbKanH è calcolata in JS dalla posizione reale della corsia: un offset
   fisso non regge quando la barra dei filtri va a capo */
.cbKanCol{max-height:var(--cbKanH,calc(100vh - 210px));overflow:hidden}
.cbKColHead{position:sticky;top:0;z-index:1;background:var(--carta);flex:none}
.cbKanNone .cbKColHead{background:var(--bg)}
.cbKanBody{overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;gap:6px;
  padding-top:6px;scrollbar-gutter:stable}
body.page-collab:not(.viewer) .cbKCard{touch-action:pan-x pan-y} /* la corsia deve restare trascinabile col dito */

/* --- scheda laterale o al centro (punto 2) --- */
.cbDlgHead{display:flex;align-items:flex-start;gap:8px}
.cbDlgHead h3{margin:0;flex:1;min-width:0;font-size:16px;font-weight:800;color:var(--navy)}
.cbDlgPosBtn{flex:none;font-size:14px;line-height:1;padding:4px 8px}
#cbDlg.cbDlgCenter{justify-content:center;align-items:center;padding:16px}
#cbDlg.cbDlgCenter .lvDlgCard{width:min(560px,100%);height:auto;max-height:88vh;
  border-radius:var(--r2);animation:ccPop .16s cubic-bezier(.2,.9,.3,1.15)}
#cbDlg.cbDlgCenter .cbPrList{max-height:28vh}

/* --- v48: orario di ritrovo, uno per team (niente più generale) --- */
.cbRitroRow input{border:1px solid var(--linea);border-radius:99px;
  padding:6px 11px;font:inherit;font-size:12.5px;font-weight:800;color:var(--ink);
  background:var(--carta);text-transform:none;letter-spacing:normal}
.cbRitroRow input:focus{outline:2px solid var(--navy);outline-offset:1px}
.cbRitroRow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cbRitroInh{font-style:normal;font-size:11px;font-weight:700;color:var(--mut);
  text-transform:none;letter-spacing:normal}
/* promemoria nella barra del tab Team: quanti team sono ancora senza orario */
.cbRitroTodo{font-size:11px;font-weight:800;color:var(--rosso);white-space:nowrap;
  border:1px solid var(--linea);border-radius:99px;padding:5px 10px}
/* badge del ritrovo nella card del team: senza più un valore ereditato, il
   buco si deve vedere dall'elenco */
.cbTeamBadge.cbTeamRit{color:var(--ink);font-weight:800}
.cbTeamBadge.cbTeamRitOff{color:var(--rosso);border-style:dashed}
/* v48.1: «senza orario» dichiarato — grigio e discreto, non è una dimenticanza */
.cbTeamBadge.cbTeamRitNone{color:var(--mut);opacity:.8}
.cbRitroNoneChk{margin-top:6px}
/* v49.7 — badge del pass dei membri. «Misti» e «nessuno» non sono allarmi: il
   portale non decide quale pass è giusto (regola v42), quindi qui non c'è
   rosso — solo il tratteggio di un dato ancora da mettere a posto. */
.cbTeamBadge.cbTeamPassB{color:var(--ink);max-width:170px}
.cbTeamBadge.cbTeamPassMix{color:var(--mut);border-style:dashed}
.cbTeamBadge.cbTeamPassOff{color:var(--mut);border-style:dashed;opacity:.85}
/* riga «Membri» del drawer: l'etichetta a sinistra, il comando in blocco a destra */
.cbMembHead{display:flex;align-items:center;gap:8px}
.cbMembHead .cbPassAllBtn{margin-left:auto;flex:none;font-size:11px;white-space:nowrap}
.cbPassSum{margin-top:-2px;font-weight:700}
/* il numero del pass nelle intestazioni della tabella fabbisogno: lì sotto non
   c'è la pastiglia colorata, quindi la rondella si disegna col bordo */
.cbTable th .cbPassNum{background:var(--carta);border:1px solid var(--linea)}

/* --- v48.1: riordino delle card team (schema "Personalizza" della home) --- */
.cbSortHint{font-size:11.5px;font-weight:700;color:var(--mut);
  border:1px dashed var(--linea);border-radius:var(--r1);padding:8px 12px;margin-bottom:4px}
@keyframes cbJiggle{0%{transform:rotate(-.7deg)}100%{transform:rotate(.7deg)}}
.cbTeamGrid.cbSorting .cbTeamCard{animation:cbJiggle .22s ease-in-out infinite alternate;
  cursor:grab;user-select:none;touch-action:pan-y}
.cbTeamGrid.cbSorting .cbTeamCard:nth-child(even){animation-direction:alternate-reverse}
/* in riordino i controlli interni non devono intercettare il gesto */
.cbTeamGrid.cbSorting .cbTeamCard input,
.cbTeamGrid.cbSorting .cbTeamCard textarea,
.cbTeamGrid.cbSorting .cbTeamCard button{pointer-events:none}
.cbTeamGrid.cbSorting .cbTeamCard.cbDragging{animation:none;opacity:.4;cursor:grabbing;
  box-shadow:var(--sh-2)}
.cbTeamGrid.cbSorting:empty,.cbTeamGrid.cbSorting .cbEmpty{min-height:64px;
  border:2px dashed var(--linea);border-radius:var(--r1);display:flex;
  align-items:center;justify-content:center}
@media(prefers-reduced-motion:reduce){.cbTeamGrid.cbSorting .cbTeamCard{animation:none}}
.cbTeamNoteRO{font-size:12.5px;font-weight:600;white-space:pre-line;color:var(--ink)}

/* ============ v49 — copertura dei team, stati, cruscotto ============ */
/* La barra di copertura sulla card: il rapporto confermati/richiesti si legge
   prima del nome, perché è il motivo per cui si apre questo tab. */
.cbCop{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:800}
.cbCopNum{flex:none;font-size:13px;font-weight:800;color:var(--ink);white-space:nowrap}
.cbCopBar{flex:1;min-width:40px;height:6px;border-radius:99px;background:var(--linea);overflow:hidden}
.cbCopBar i{display:block;height:100%;border-radius:99px;background:var(--mut)}
.cbCopTxt{flex:none;color:var(--mut);white-space:nowrap}
.cbCopOk .cbCopBar i{background:#15803d}
.cbCopOk .cbCopTxt{color:#15803d}
.cbCopKo .cbCopNum,.cbCopKo .cbCopTxt{color:var(--rosso)}
.cbCopKo .cbCopBar i{background:var(--rosso)}
.cbCopOver .cbCopBar i{background:var(--navy)}
.cbCopNd{opacity:.75}
.cbCopNd .cbCopTxt{font-weight:700}

/* Badge dello stato di lavorazione */
.cbTeamBadge.cbStato{border-style:solid;max-width:none}
.cbStato-bozza{color:var(--mut)}
/* «completo» = ho finito di comporlo, non ancora mandato: teal, distinto sia
   dall'ambra di «inviato» sia dal verde di «confermato» */
.cbStato-completo{color:#0e7490;border-color:#0e7490}
.cbStato-inviato{color:#a16207;border-color:#a16207}
/* «invio non necessario» non è un problema né un traguardo: neutro, per non
   far sembrare indietro un team che è a posto così */
.cbStato-noinv{color:var(--navy);border-color:var(--navy);border-style:dashed}
.cbStato-chiuso{color:#15803d;border-color:#15803d}

/* Segmented control degli stati: con quattro voci va a capo invece di
   comprimere le etichette fino a renderle illeggibili */
.cbStatoSeg{flex-wrap:wrap}
.cbStatoSeg button{flex:1 1 auto;font-size:11px;padding:6px 9px;min-height:34px;
  white-space:nowrap}

/* Cruscotto: pochi riquadri, uno solo grande — quello che dice cosa manca */
.cbKpiRow{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:4px}
.cbKpi{flex:1 1 120px;min-width:110px;border:1px solid var(--linea);border-radius:var(--r1);
  background:var(--bg);padding:10px 12px;display:flex;flex-direction:column;gap:2px}
.cbKpi b{font-size:22px;font-weight:800;line-height:1;color:var(--ink)}
.cbKpi i{font-style:normal;font-size:10.5px;font-weight:700;color:var(--mut);line-height:1.3}
.cbKpiKo{border-color:var(--rosso);border-left-width:5px}
.cbKpiKo b{color:var(--rosso)}
.cbKpiOk b{color:#15803d}
.cbKpiRis b{color:#a16207}
.cbKpiVal b{color:var(--navy)}
.cbKpiNd{opacity:.7}
/* v49.3: chi non è in nessun team — non è un buco nella copertura (nessun team
   lo aspetta), ma non deve nemmeno sparire: navy come i «da valutare» */
.cbKpiNoTeam b{color:var(--navy)}
.cbKpiClick{cursor:pointer}
.cbKpiClick:hover{border-color:var(--navy);background:var(--carta)}
.cbKpiVuoto{align-items:stretch}
.cbKpiHint{flex:2 1 260px;border:1px dashed var(--linea);border-radius:var(--r1);
  padding:10px 12px;font-size:11.5px;font-weight:600;color:var(--mut);line-height:1.45}
.cbKpiHint b{color:var(--ink);font-weight:800}

/* ============ v49.2 — i dati si cambiano dalla griglia ============ */
/* Stato, orario e fabbisogno erano i tre motivi per cui si apriva il drawer:
   ora i badge della card sono bottoni, e si deve vedere che lo sono — bordo che
   si accende, cursore, altezza da dito, e un ▾ che promette un elenco. */
.cbBadgeBtn{display:inline-flex;align-items:center;gap:3px;font:inherit;font-size:10px;
  font-weight:800;line-height:1.4;min-height:26px;cursor:pointer}
.cbTeamCard button.cbBadgeBtn{cursor:pointer}
.cbBadgeBtn::after{content:'▾';font-size:8px;opacity:.55}
.cbBadgeBtn:hover{border-color:currentColor;background:var(--bg)}
.cbBadgeBtn:focus-visible{outline:2px solid var(--navy);outline-offset:1px}
/* la barra di copertura è un bottone solo nella card: il tratteggio compare al
   passaggio, così a riposo l'elenco resta pulito come prima */
.cbCopBtn{width:100%;font:inherit;text-align:left;background:none;cursor:pointer;
  border:1px dashed transparent;border-radius:var(--r1);padding:3px 5px;margin:-3px -5px}
.cbTeamCard button.cbCopBtn{cursor:pointer}
.cbCopBtn:hover{border-color:var(--linea);background:var(--carta)}
.cbCopBtn:focus-visible{outline:2px solid var(--navy);outline-offset:1px}
/* «Sposta» ed «Elimina» erano due bottoni larghi quanto la card, uno rosso, su
   38 team: due gesti rari con l'aria di essere i principali. Ora stanno dietro
   il ⋯, che pesa quanto merita. */
.cbTeamMore{flex:none;border:1px solid transparent;background:none;font:inherit;
  font-size:14px;line-height:1;font-weight:800;color:var(--mut);border-radius:99px;
  padding:2px 9px;min-height:26px;cursor:pointer}
.cbTeamCard button.cbTeamMore{cursor:pointer}
.cbTeamMore:hover{border-color:var(--linea);background:var(--carta);color:var(--ink)}
.cbTeamMore:focus-visible{outline:2px solid var(--navy);outline-offset:1px}
/* popover con un campo dentro (orario, fabbisogno) */
.cbPickHead{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--mut);padding:4px 8px 2px}
.cbPickField{display:flex;align-items:center;gap:6px;padding:2px 8px 6px}
.cbPickField input{flex:1;min-width:0;border:1px solid var(--linea);border-radius:99px;
  padding:6px 11px;font:inherit;font-size:12.5px;font-weight:800;color:var(--ink);
  background:var(--bg)}
.cbPickField input:focus{outline:2px solid var(--navy);outline-offset:1px}
.cbPick .cbPickOk{flex:none;border:1px solid var(--linea);border-radius:99px;
  padding:6px 12px;font-size:11.5px;font-weight:800;color:var(--navy);text-align:center}
.cbPick .cbPickOk:hover{border-color:var(--navy);background:var(--bg)}
.cbPickNote{display:block;font-style:normal;font-size:10.5px;font-weight:700;
  color:var(--mut);padding:5px 8px 2px;margin-top:2px;border-top:1px solid var(--linea)}
.cbPick .cbPickDanger{color:var(--rosso);border-top:1px solid var(--linea);margin-top:2px}
/* v50.1 — POPOVER CENTRATO. Quando la scelta e' importante e l'ancora sta in
   cima a una scheda che riempie lo schermo, un pannellino agganciato in un
   angolo non si vede: si centra, si allarga, e un velo dice che e' una domanda
   a cui rispondere. Sopra il drawer (#cbDlg, z-index 6500). */
.cbPickVeil{position:fixed;inset:0;z-index:6790;background:rgba(15,23,42,.42)}
.cbPickBig{min-width:min(430px,94vw);max-width:min(430px,94vw);max-height:86vh;padding:6px}
.cbPickBig>button{min-height:52px;padding:8px 10px;font-size:13px}
.cbPickTitle{padding:10px 10px 8px;border-bottom:1px solid var(--linea);margin-bottom:4px;
  font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
.cbPickTitle b{display:block;margin-top:2px;font-size:15px;font-weight:800;color:var(--navy);
  text-transform:none;letter-spacing:normal}
.cbPickTitle i{display:block;margin-top:2px;font-style:normal;font-size:11px;font-weight:700;
  color:var(--mut);text-transform:none;letter-spacing:normal;line-height:1.35}
/* riga del pass: pastiglia sopra, zone in chiaro sotto — si sceglie leggendo,
   non ricordandosi che cosa vuol dire «1-3-4» */
.cbPickPass{display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-width:0;flex:1}
.cbPickZone{font-style:normal;font-size:10.5px;font-weight:700;color:var(--mut);line-height:1.3;
  white-space:normal;text-align:left}
.cbPickBtns{display:flex;justify-content:flex-end;padding:8px 8px 4px;margin-top:2px;
  border-top:1px solid var(--linea)}
/* v49.7: spunta dentro un popover (pass del team: «solo chi non ce l'ha»).
   È una riga di comando come le altre, ma NON sceglie: si distingue dal fondo
   e dal peso, e il click sopra non chiude il popover. */
.cbPickChk{display:flex;align-items:center;gap:7px;padding:7px 8px;margin-top:2px;
  border-top:1px solid var(--linea);font-size:11px;font-weight:700;color:var(--mut);
  cursor:pointer;line-height:1.35}
.cbPickChk input{flex:none;width:15px;height:15px;accent-color:var(--navy);cursor:pointer}
.cbPickChk:hover{color:var(--ink)}

/* la × di chiusura, in alto a destra su ogni dialogo */
.cbDlgX{flex:none;font-size:15px;line-height:1;padding:4px 9px;font-weight:800}
.cbDlgX:hover{color:var(--rosso);border-color:var(--rosso)}

/* --- v48.1: dialogo di stampa (schede team, elenco, blocco) --- */
.cbPrSec{display:flex;flex-direction:column;gap:8px;border:1px solid var(--linea);
  border-radius:var(--r1);padding:12px;background:var(--bg)}
.cbPrSec>b{font-size:13px;font-weight:800;color:var(--navy)}
.cbPrSec>i{font-style:normal;font-size:11.5px;font-weight:600;color:var(--mut);line-height:1.45}
.cbPrBtns{display:flex;align-items:center;gap:8px}
.cbPrCount{font-size:11px;font-weight:800;color:var(--mut);white-space:nowrap}
.cbPrList{max-height:34vh;overflow:auto;border:1px solid var(--linea);border-radius:var(--r1);
  background:var(--carta);padding:6px 8px;display:flex;flex-direction:column;gap:1px}
.cbPrGrp{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--mut);padding:8px 0 2px}
/* Selettore con .lvDlgCard davanti: senza, `.lvDlgCard label` (specificità più
   alta) rimette flex-direction:column e text-transform:uppercase — e con la
   colonna il `flex` sul nome diventa altezza zero, così il nome del team
   spariva del tutto lasciando solo «6 MEMBRI» in maiuscolo. Stessa battaglia
   che .cbInline ha risolto a colpi di !important. */
.lvDlgCard .cbPrChk{display:flex;flex-direction:row;align-items:center;gap:8px;
  font-size:12.5px;font-weight:600;color:var(--ink);text-transform:none;
  letter-spacing:normal;cursor:pointer;padding:3px 2px;min-height:30px}
.lvDlgCard .cbPrChk span{flex:1 1 auto;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.lvDlgCard .cbPrChk i{font-style:normal;font-size:10.5px;font-weight:700;
  color:var(--mut);flex:none}
.lvDlgCard .cbPrChk input:disabled+span{opacity:.45}
.cbPrCols{display:flex;flex-wrap:wrap;gap:2px 14px;border:1px solid var(--linea);
  border-radius:var(--r1);background:var(--carta);padding:8px 10px}
.cbPrColFix{font-size:12.5px;font-weight:800;color:var(--mut);padding:3px 2px;
  align-self:center;white-space:nowrap}
.lvDlgCard .cbPrColChk{flex:0 0 auto}
.lvDlgCard .cbPrColChk span{flex:0 0 auto}
/* i checkbox del portale sono nativi: la regola generica .lvDlgCard input
   (bordo, padding, sfondo) li deformerebbe */
.lvDlgCard input[type=checkbox]{border:none;background:none;padding:0;
  width:auto;flex:none;accent-color:var(--rosso)}

/* --- v48.1: blocco Team della scheda persona --- */
/* Sostituisce .cbTchkList (38 checkbox in una finestrella da 200px): qui si
   vedono solo i team della persona, gli altri si pescano dal picker. */
.cbTmLbl{display:flex;flex-direction:column;gap:5px}
.cbTmList{display:flex;flex-direction:column;gap:6px}
.cbTmRow{display:flex;align-items:center;gap:6px;border:1px solid var(--linea);
  border-radius:var(--r1);background:var(--carta);padding:7px 9px;min-height:44px}
/* il principale si riconosce dal filetto rosso, come la testata di stampa */
.cbTmRow.cbTmFirst{border-left:5px solid var(--rosso);padding-left:8px}
.cbTmMain{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0;
  text-transform:none;letter-spacing:normal}
.cbTmMain b{font-size:13.5px;font-weight:800;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cbTmTag{font-size:8.5px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;
  color:var(--rosso)}
.cbTmMeta{font-style:normal;font-size:10.5px;font-weight:700;color:var(--mut);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cbTmBtn{flex:none;border:1px solid transparent;background:none;font:inherit;font-size:11px;
  font-weight:800;color:var(--mut);border-radius:99px;padding:5px 8px;cursor:pointer;
  text-transform:none;letter-spacing:normal;min-height:32px}
.cbTmBtn:hover{border-color:var(--linea);background:var(--bg);color:var(--ink)}
.cbTmBtn:focus-visible{outline:2px solid var(--navy);outline-offset:1px}
.cbTmStar.on{color:var(--rosso);border-color:var(--rosso)}
.cbTmDel:hover{color:var(--rosso);border-color:var(--rosso)}
.cbTmAdd{align-self:flex-start;font-size:11.5px;padding:6px 10px}
.cbTmEmpty{font-size:12px;font-weight:700;color:var(--mut);text-transform:none;
  letter-spacing:normal;border:1px dashed var(--linea);border-radius:var(--r1);padding:9px 12px}
.cbTmHelp{font-style:normal;font-size:10.5px;font-weight:600;color:var(--mut);
  text-transform:none;letter-spacing:normal;line-height:1.45}
.cbTmHelp b{font-weight:800}
/* v49.2: nel selettore dei team ogni voce dice la sua copertura (prima era
   l'orario di ritrovo, che con «dove metto questa persona?» non c'entra) */
.cbPickCop{flex:none;font-style:normal;margin-left:auto;font-size:11px;font-weight:800;
  color:var(--mut)}
.cbPickCopKo{color:var(--rosso)}
.cbPickCopOk{color:#15803d}
.cbPickCopNd{opacity:.7}
/* chip di team cliccabile (scheda in sola lettura) */
.cbTag.cbTagLink{cursor:pointer;font-family:inherit;font-size:10.5px;font-weight:700;
  line-height:1.5;color:var(--ink)}
.cbTag.cbTagLink:hover{border-color:var(--rosso);color:var(--rosso)}
.cbTag.cbTagLink:focus-visible{outline:2px solid var(--navy);outline-offset:1px}
/* sotto i 480px i bottoni della riga team vanno a capo invece di schiacciare
   il nome; «↑ principale» si riduce alla sola freccia */
@media (max-width:480px){
  .cbTmRow{flex-wrap:wrap}
  .cbTmMain{flex-basis:100%}
  .cbTmBtn{min-width:40px;text-align:center}
}

/* --- v46.1: tutto ciò che mostra un dato porta al dato --- */
.cbTeamMemberRow[data-person]{cursor:pointer;border-radius:var(--r1);padding-left:6px;padding-right:6px}
.cbTeamMemberRow[data-person]:hover{background:var(--carta);outline:1px solid var(--linea)}
.cbTeamMemberRow[data-person]:hover .cbName{color:var(--rosso)}
tr.cbTeamRow{cursor:pointer}
tr.cbTeamRow:hover td{background:var(--bg)}
tr.cbTeamRow:hover td:first-child{color:var(--rosso)}
/* la textarea dei riferimenti aperta a mano si distingue: è temporanea finché
   non ci si scrive dentro (Esc o clic fuori la richiudono) */
.cbDocAdd{align-self:flex-start}

/* --- stampa elenco team (punto 7) --- */
.cbPrintOpts{display:flex;flex-direction:column;gap:8px}
.cbPrintOpt{text-align:left;border:1px solid var(--linea);border-radius:var(--r1);background:var(--bg);
  padding:11px 13px;font:inherit;cursor:pointer;display:flex;flex-direction:column;gap:3px}
.cbPrintOpt:hover{border-color:var(--navy);background:var(--carta)}
.cbPrintOpt b{font-size:13px;font-weight:800;color:var(--navy)}
.cbPrintOpt i{font-style:normal;font-size:11.5px;font-weight:600;color:var(--mut);line-height:1.35}
.cbCardWide{max-width:100%}
.cbCardSub{font-size:12px;font-weight:700;color:var(--mut)}
.cbCardList th{width:auto;padding:6px 10px 6px 0;border-bottom:1px solid var(--linea)}
.cbCardList td{padding:6px 10px 6px 0;vertical-align:top;font-size:12px}

/* --- mobile (punto 10) --- */
@media(max-width:640px){
  .cbWrap{gap:10px}
  /* i filtri si aprono su richiesta: in barra restano ricerca e viste */
  .cbFilts{display:none;width:100%;flex-wrap:wrap;gap:8px}
  #cbBar.cbFiltOpen .cbFilts{display:flex}
  #cbBar.cbFiltOpen .cbFiltToggle{background:var(--navy);border-color:var(--navy);color:#fff}
  .cbFiltToggle{display:inline-block}
  #cbBar{padding:9px 10px;gap:8px}
  #cbBar select,.cbFilts .lvBtn{flex:1 1 45%;max-width:none}
  #cbSearch{flex:1 1 100%}
  #cbViewSeg{flex:1 1 auto}
  #cbViewSeg button{flex:1;padding:9px 8px}
  .cbCount{width:100%;text-align:right}
  /* la tabella diventa una lista di card: a 375px tre colonne sono illeggibili */
  .cbTblWrap{padding:0;background:none;box-shadow:none;overflow:visible}
  .cbTable,.cbTable tbody,.cbTable tr,.cbTable td{display:block;width:auto}
  .cbTable thead{display:none}
  .cbTable tbody tr[data-id],.cbTable tbody tr[data-crmid]{background:var(--carta);border-radius:var(--r2);
    box-shadow:var(--sh-1);padding:10px 12px;margin-bottom:8px}
  .cbTable tbody tr[data-id]:hover td,.cbTable tbody tr[data-crmid]:hover td{background:none}
  .cbTable td{border:none;padding:2px 0;white-space:normal;overflow:visible;text-overflow:clip}
  .cbTable td:empty{display:none}
  .cbTable td.cbName{font-size:14px}
  .cbTable td[data-lbl]:not(.cbName):not(.cbTeamCell):not(.cbRuolo)::before{
    content:attr(data-lbl) ': ';font-size:9.5px;font-weight:800;text-transform:uppercase;
    letter-spacing:.05em;color:var(--mut)}
  .cbTable td.cbEmpty{background:var(--carta);border-radius:var(--r2);padding:20px 0!important}
  .colResizer{display:none}
  /* kanban: una colonna alla volta sotto il pollice */
  .cbKan{scroll-snap-type:x mandatory;padding-right:8px}
  .cbKanCol{flex:0 0 min(78vw,260px);scroll-snap-align:start;max-height:calc(100vh - 230px)}
  .cbGrid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
  .cbSez{padding:12px 12px}
  .cbGrpHead{position:sticky;top:0;z-index:2;background:var(--carta);padding:4px 0}
  .cbGrpName{flex:1 1 100%;font-size:15px}
  #cbTeamSearch{flex:1 1 100%}
  /* scheda: sempre a tutta larghezza, bottoni sempre raggiungibili */
  #cbDlg,#cbDlg.cbDlgCenter{justify-content:stretch;align-items:stretch;padding:0}
  #cbDlg.cbDlgCenter .lvDlgCard{width:100%;height:100%;max-height:none;border-radius:0}
  .lvDlgBtns{position:sticky;bottom:0;background:var(--carta);margin-top:auto;
    padding-bottom:calc(10px + env(safe-area-inset-bottom))}
  .cbPrList,#cbDlg.cbDlgCenter .cbPrList{max-height:32vh}
}
@media(pointer:coarse){
  #cbBar .lvBtn,#cbBar select,.lvSeg button{min-height:40px}
  .cbPick button{min-height:38px}
  /* v49.2: col dito un badge da 26px non si centra — i tre editor della card
     e il ⋯ crescono, il resto della card resta com'è */
  .cbBadgeBtn,.cbTeamMore{min-height:34px;padding-left:11px;padding-right:11px}
  .cbPickField input{min-height:38px}
}
@media print{
  .cbKanCol{max-height:none;overflow:visible}
  .cbKanBody{overflow:visible}
  .cbKColHead{position:static}
  .cbTeamTools,.cbDlgPosBtn{display:none!important}
  /* v47: sul foglio i gruppi non interessano — via le intestazioni di gruppo
     nel tab Team e l'etichetta sulle colonne kanban */
  .cbGrpHead,.cbKanGrp{display:none!important}
}

/* ===================== v47 — foglio stampabile condiviso =====================
   Una sola veste per tutte le esportazioni. Sostituisce .lvAzCard (Programma
   lavori) e .cbCard (Collaboratori), che erano copie quasi identiche fra loro
   e diverse dal foglio delle mappe. I vecchi selettori restano affiancati
   finché la stampa non è verificata su carta: così si torna indietro con un
   revert solo. La testata (.pHead) sta più in alto, nella sezione stampa. */
.pSheet,.lvAzCard,.cbCard{max-width:640px;margin:0 auto;display:flex;flex-direction:column;gap:14px}
.pSheet.pWide,.cbCardWide{max-width:100%}
.pSheetH2,.lvAzDay{margin:6px 0 0;font-size:13px;font-weight:800;color:var(--navy)}
.pSheetSub,.cbCardSub{font-size:12px;font-weight:700;color:var(--mut);
  display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* tabelle: .pTbl a colonne, .pKv chiave/valore (scheda personale) */
.pTbl,.lvAzTbl,.cbCardTbl{width:100%;border-collapse:collapse;box-shadow:none;border-radius:0}
.pTbl th{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--mut);text-align:left;padding:5px 8px 5px 0;background:none;
  border-bottom:1px solid var(--linea)}
.pTbl td{font-size:12px;font-weight:600;padding:5px 8px 5px 0;vertical-align:top;
  border-bottom:1px solid var(--linea)}
/* v49.6: «Responsabile» sotto il ruolo, nello stesso nero e nello stesso
   corpo del ruolo — non un'annotazione secondaria come .cbCardResp (troppo
   chiara, sembrava spenta), solo un'altra riga della stessa cella */
.pTblResp{display:block}
.pTbl.pKv th{width:150px;padding-right:10px}
.pTbl.pKv td{font-size:13px}
/* v48 — .pHero: il dato che deve leggersi a colpo d'occhio sul foglio (oggi
   l'orario di ritrovo). Bordo e testo, MAI un background: con «Grafica di
   sfondo» disattivata un fondo sparisce dalla stampa, un bordo no — stessa
   scelta già motivata per .pHead e per le etichette del Villaggio. */
.pHero{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;
  border:1.5px solid var(--linea);border-left:6px solid var(--rosso);
  border-radius:var(--r1);padding:10px 16px;break-inside:avoid}
.pHero b{font-size:9px;font-weight:800;text-transform:uppercase;
  letter-spacing:.1em;color:var(--rosso);align-self:center}
.pHero .pHeroVal{font-size:34px;font-weight:800;line-height:1;color:var(--ink);
  letter-spacing:-.01em}
/* «Senza orario di ritrovo»: è una frase, non una cifra — stesso box ma più
   discreto, così dichiara la cosa senza gridarla */
.pHero.pHeroFlat{border-left-color:var(--mut)}
.pHero .pHeroVal.pHeroTxt{font-size:18px;color:var(--mut)}
.pHero.pHeroFlat b{color:var(--mut)}
.pHero .pHeroSub{font-size:11px;font-weight:700;color:var(--mut);margin-left:auto}
/* riquadro note (riferimenti, allegati) */
.pNote,.cbCardDoc{font-size:12px;font-weight:600;white-space:pre-line;
  border:1px dashed var(--linea);border-radius:var(--r1);padding:9px 12px}
.pNote b,.cbCardDoc b{display:block;font-size:9.5px;font-weight:800;text-transform:uppercase;
  letter-spacing:.05em;color:var(--mut);margin-bottom:3px}
/* piè del foglio */
.pFoot,.cbCardFoot,.lvAzFoot{font-size:10px;font-weight:600;color:var(--mut);
  border-top:1px solid var(--linea);padding-top:10px;display:flex;flex-direction:column;gap:4px;margin-top:auto}
.pFootNote{font-weight:700;color:var(--ink)}
.pFootPrivacy{color:var(--mut);font-weight:600}
.pFootMeta{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px}
.pFootMeta b{color:var(--ink)}
/* v49: .pFootLink rimossa — sui fogli non si stampano indirizzi del portale */
/* barra ripetuta su ogni foglio: fuori dalla stampa non si vede mai */
.pFootBar{display:none}
.pPrintBox{display:none}
@media print{
  /* v49 — DUE righe che tengono il documento nel numero di fogli giusto.
     1) L'altezza del foglio la decide il contenuto. Senza questo `html`
        conserva l'height:100% di app.css:11 e il documento è alto ESATTAMENTE
        una pagina piena anche con 11 cm di contenuto: tolleranza zero, e
        qualunque pixel di troppo diventa una seconda pagina. */
  html,body{height:auto!important;min-height:0!important}
  /* 2) position:fixed in stampa = ripetuta su ogni pagina (Chrome/Edge), ma il
        blocco contenitore è l'AREA DI PAGINA, non la carta: un `bottom`
        negativo spinge la barra sotto il fondo del foglio e il browser conta
        una pagina in più (era `bottom:-10mm`, e ogni stampa usciva doppia).
        A `bottom:0` la barra sta sul bordo dell'area utile e il margine
        inferiore di 14mm di PRINT_MARGIN le fa già spazio. */
  .pFootBar{display:block;position:fixed;left:0;right:0;bottom:0;
    font-size:7.5px;font-weight:700;color:#666;text-align:center;
    border-top:.5px solid #ccc;padding-top:2mm;background:#fff}
  /* v56 — `#app` e' la radice del Generale stadio (mappa + pannello): serve
     perche' quella pagina ha DUE stampe — la mappa (body.printing, impianto
     printInit) e i documenti (body.pPrinting, impianto printDocShow, oggi
     l'elenco parcheggi). Sono esclusive: chi stampa un documento non vuole la
     mappa sotto, e senza questa riga uscirebbero sovrapposte. */
  body.pPrinting #cbApp,body.pPrinting #lvApp,body.pPrinting #app{display:none!important}
  /* v57 — i modali vivono in <body> con position:fixed e z-index 3000, cioe'
     FUORI da #app: senza questa riga il piano interno della tribuna, aperto,
     finirebbe stampato sopra il documento. Stesso difetto latente per gli
     altri due, che oggi non convivono con una stampa e domani si'. */
  body.pPrinting #tribDlg,body.pPrinting #matDlg,body.pPrinting #verDlg,body.pPrinting #gpkgDlg,
  body.pPrinting #mapBtns,body.pPrinting .filtBox{display:none!important}
  body.pPrinting .pPrintBox{display:block!important}
  /* IL DISEGNO DEVE STARE IN UN FOGLIO SOLO. «Larghezza piena e altezza
     automatica» non bastava: le proporzioni del piano (1000x736) su 281mm di
     larghezza fanno 207mm di altezza, e con testata e pie' il foglio veniva
     255mm contro i 188 utili — la stampa usciva su DUE pagine col disegno
     tagliato a meta' (misurato, non dedotto).
     Si dichiara quindi il riquadro anche in ALTEZZA: `preserveAspectRatio` di
     serie (xMidYMid meet) rimpicciolisce il disegno finche' ci sta e lo centra,
     senza deformarlo. Il foglio e' ORIZZONTALE (v. stampaTribuna), dove a
     comandare e' l'altezza: 130mm, e ogni numero e' MISURATO, non stimato.
     Storia: a 142 il foglio veniva 190,3mm contro i 188 utili (fuori di 2,3);
     a 136 stava dentro ma finiva a 181,1 e la barra di versione —
     `position:fixed;bottom:0`, alta 4,6mm, quindi da 183,4 in giu' — gli
     arrivava addosso; a 130 il foglio finisce a 175,1 e restano 8,3mm di aria.
     Testata, pie' e spaziature fra i blocchi si mangiano piu' di quanto sembri.
     `!important` non e' pigrizia: l'SVG porta `width:100%` nello STYLE INLINE
     (a schermo il riquadro e' largo quanto la card) e una regola senza
     !important perderebbe in silenzio. */
  .pTrib{margin:6mm 0 4mm}
  .pTrib svg{width:100%!important;height:130mm!important;break-inside:avoid}
  .pSheet{max-width:100%}
  /* v48 — UNICO meccanismo di salto pagina dei documenti multi-scheda: più
     .pSheet accodati dentro un solo printDocShow, uno per foglio. Non
     inventarne altri (cfr. Regola 6 in CLAUDE.md). */
  .pSheet+.pSheet{break-before:page;page-break-before:always}
  .pTbl{break-inside:auto}
  .pTbl tr{break-inside:avoid}
  .pFoot{break-inside:avoid}
  .pHead{break-inside:avoid;break-after:avoid}
}

/* ===================== v49 — Sondaggio candidati (pagina pubblica) ==========
   Unica pagina del portale che vede qualcuno da fuori: deve essere leggibile
   su un telefono, in piedi, con una mano sola. Niente nav, niente barre,
   niente scorciatoie: un modulo e un bottone. Colori e font restano quelli del
   Galà — l'identità visiva non cambia mai. */
body.page-sond{background:var(--bg);min-height:100vh;padding:18px 14px 40px;
  display:flex;align-items:flex-start;justify-content:center}
.sndCard{width:min(620px,100%);background:var(--carta);border:1px solid var(--linea);
  border-radius:var(--r2);box-shadow:var(--sh-1);padding:22px 22px 26px;
  display:flex;flex-direction:column;gap:14px}
.sndHead{display:flex;flex-direction:column;gap:6px;padding-bottom:12px;
  border-bottom:2.5px solid var(--rosso)}
.sndLogo{height:40px;width:auto;align-self:flex-start}
.sndKick{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;
  color:var(--rosso)}
.sndCard h1{margin:0;font-size:23px;font-weight:800;color:var(--navy);line-height:1.2}
.sndP{margin:0;font-size:13.5px;font-weight:600;color:var(--mut);line-height:1.55}
.sndCard form{display:flex;flex-direction:column;gap:12px;margin-top:4px}
.sndL{display:flex;flex-direction:column;gap:4px;font-size:10.5px;font-weight:800;
  text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
/* 16px esatti, non uno di meno: sotto i 16px Safari su iPhone ingrandisce da
   solo la pagina appena si tocca un campo, e chi compila si ritrova il modulo
   fuori schermo. È l'unica pagina che finisce su telefoni non nostri. */
.sndL input,.sndL select,.sndL textarea{border:1px solid var(--linea);border-radius:var(--r1);
  padding:11px 12px;font:inherit;font-size:16px;font-weight:600;color:var(--ink);
  background:var(--bg);text-transform:none;letter-spacing:normal;width:100%}
.sndL textarea{resize:vertical;min-height:64px;line-height:1.5}
.sndL input:focus,.sndL select:focus,.sndL textarea:focus{outline:2px solid var(--navy);
  outline-offset:1px;background:var(--carta)}
.sndTwo{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.sndPriv{margin:2px 0 0;font-size:11px;font-weight:600;color:var(--mut);line-height:1.5}
.sndGo{border:none;border-radius:99px;background:var(--rosso);color:#fff;font:inherit;
  font-size:15px;font-weight:800;padding:14px 20px;cursor:pointer;min-height:52px}
.sndGo:hover{filter:brightness(1.06)}
.sndGo:disabled{opacity:.55;cursor:default}
.sndGo:focus-visible{outline:2px solid var(--navy);outline-offset:2px}
.sndMsg{font-size:12.5px;font-weight:700;color:var(--mut);min-height:1.2em}
.sndMsg.sndKo{color:var(--rosso)}
.sndCardMsg{text-align:left}
/* honeypot: fuori campo, non display:none — i bot evitano i campi nascosti così */
.sndHp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
@media (max-width:480px){
  body.page-sond{padding:0}
  .sndCard{border:none;border-radius:0;box-shadow:none;min-height:100vh;padding:18px 16px 32px}
  .sndTwo{grid-template-columns:1fr}
}

/* --- v49: candidature dal sondaggio --- */
.cbTabN{display:inline-flex;align-items:center;justify-content:center;min-width:17px;height:17px;
  margin-left:6px;padding:0 4px;border-radius:99px;background:var(--rosso);color:#fff;
  font-size:10px;font-weight:800;line-height:1}
.cbSondLink{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.cbSondLink input{flex:1;min-width:200px;border:1px solid var(--linea);border-radius:99px;
  padding:8px 13px;font:inherit;font-size:12px;font-weight:600;background:var(--bg);color:var(--ink)}
.cbSondLink i{font-style:normal;font-size:12px;font-weight:700;color:var(--mut)}
.cbCandList{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.cbCand{border:1px solid var(--linea);border-left:5px solid var(--navy);border-radius:var(--r1);
  background:var(--bg);padding:12px;display:flex;flex-direction:column;gap:7px}
.cbCandTop{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cbCandTop b{font-size:14px;font-weight:800;color:var(--navy)}
.cbCandRuolo{font-size:10.5px;font-weight:800;color:var(--rosso);text-transform:uppercase;
  letter-spacing:.04em}
.cbCandData{font-style:normal;font-size:10.5px;font-weight:700;color:var(--mut)}
.cbCandMeta{font-size:11.5px;font-weight:700;color:var(--mut);line-height:1.5}
.cbCandSkill{font-size:12px;font-weight:600;color:var(--ink);white-space:pre-line;line-height:1.5}
.cbCandSkill b{display:block;font-size:9px;font-weight:800;text-transform:uppercase;
  letter-spacing:.05em;color:var(--mut);margin-bottom:2px}
.cbCandBtns{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto}

/* v49: avviso nel dialogo di stampa + tabella densa per i team numerosi */
.cbPrAvviso{font-size:11.5px;font-weight:600;color:var(--mut);line-height:1.5;
  border-left:3px solid var(--rosso);padding:2px 0 2px 10px}
.cbPrAvviso b{color:var(--ink);font-weight:800}
@media print{
  /* sopra le ~22 righe: meglio un foglio compatto che un secondo foglio con
     tre nomi sopra. Solo font e spaziatura, nessuna colonna tolta. */
  .pTbl.pTblDense td{font-size:10px;padding:2.5px 6px 2.5px 0}
  .pTbl.pTblDense th{font-size:8px;padding:3px 6px 3px 0}
  .pHero{flex-wrap:nowrap}
}

/* --- v49.1: sezioni Riserva / 2027 e azione del cruscotto --- */
.cbKpiAz{display:flex;gap:8px;flex-wrap:wrap;margin:-2px 0 6px}
.cbKpiFix{font-size:11.5px}
.cbPList{display:flex;flex-direction:column;gap:6px}
.cbPRow{display:flex;align-items:center;gap:10px;border:1px solid var(--linea);
  border-radius:var(--r1);background:var(--bg);padding:8px 10px;min-height:48px}
.cbPRow:hover{border-color:var(--navy)}
.cbPRowMain{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}
.cbPRowMain b{font-size:13.5px;font-weight:800;color:var(--ink)}
.cbPRowRuolo{font-style:normal;font-size:11.5px;font-weight:700;color:var(--mut)}
.cbPRowTeam{display:flex;flex-wrap:wrap;gap:2px}
.cbPRowOk,.cbPRowGo,.cbPRowAdd{flex:none;font-size:11.5px;padding:6px 10px}
/* v49.3: «+ Team» sulle righe di chi non ne ha nessuno — l'unica cosa che
   serve fare lì dentro, quindi si vede, ma non è la primaria come «Conferma» */
.cbPRowAdd{border-color:var(--navy);color:var(--navy)}
@media (max-width:640px){
  .cbPRow{flex-wrap:wrap}
  .cbPRowMain{flex-basis:100%}
}
/* col dito i 30px del padding non bastano: queste righe si usano soprattutto
   da telefono, scorrendo la riserva */
@media(pointer:coarse){
  .cbPRowOk,.cbPRowGo{min-height:40px;padding:8px 14px}
}

/* ============ v55 — modulo ELETTRICITÀ ====================================
   Il modulo mostra COSA SERVE, non come si chiama: il requisito è il titolo e
   il nome del punto compare solo al clic (.elRowOpen). Vive dentro il #panel
   di un modulo-mappa, quindi righe e non tabelle: la tabella vera esce solo in
   stampa (.pTbl, impianto condiviso). Tutte le classi hanno prefisso .el* e
   nessuna regola generica su tr/td. ======================================== */
#elMain{padding:0 12px 14px;overflow:auto;display:flex;flex-direction:column;gap:7px}
.elSec{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;
  color:var(--mut);margin-top:6px}
.elHint{font-size:11.5px;font-weight:600;color:var(--mut);line-height:1.45}
.elWarn{color:var(--err);font-weight:800}
.elLink{border:none;background:none;padding:4px 6px;font:inherit;font-size:11px;font-weight:800;
  color:var(--navy);cursor:pointer;text-decoration:none;flex:none}
.elLink:hover{color:var(--rosso)}
.elNoPos{color:var(--mut);font-weight:800;cursor:help;flex:none}
/* posizione implausibile: si segnala, non si corregge (non e' roba nostra) */
.elFuori{color:var(--warn);font-weight:800;cursor:help;flex:none}

/* «Cosa serve»: un blocco per tipo di alimentazione, col numero grande a
   sinistra. E' la lista con cui si carica il furgone. */
.elTipo{display:flex;align-items:center;gap:11px;background:var(--carta);
  border:1px solid var(--linea);border-left:4px solid var(--tc,var(--navy));
  border-radius:var(--r1);padding:9px 11px;box-shadow:var(--sh-1)}
.elTipoNd{border-left-style:dashed}
.elTipoQ{flex:none;min-width:46px;display:flex;flex-direction:column;align-items:center;line-height:1}
.elTipoQ b{font-size:23px;font-weight:800;color:var(--ink)}
.elTipoQ span{font-size:8.5px;font-weight:800;text-transform:uppercase;
  letter-spacing:.04em;color:var(--mut);margin-top:2px}
.elTipoTxt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.elTipoTxt b{font-size:13.5px;font-weight:800;color:var(--ink)}
.elTipoTxt i{font-style:normal;font-size:10.5px;font-weight:700;color:var(--mut)}

/* «Dove serve»: il requisito in chiaro, il nome solo al clic */
.elGrp{display:flex;flex-direction:column;gap:3px;margin-top:4px}
.elGrpHead{display:flex;align-items:center;gap:4px;padding:2px 2px 1px}
.elGrpHead .elChk{flex:1}
.elGrpN{font-size:10px;font-weight:800;color:var(--mut);
  background:var(--bg);border-radius:99px;padding:1px 7px}
.elChk{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:800;
  color:var(--ink);cursor:pointer}
.elRow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--carta);
  border:1px solid var(--linea);border-radius:var(--r1);padding:7px 9px;cursor:pointer;
  min-height:40px}
.elRow:hover{border-color:var(--navy)}
.elRow.on{border-color:var(--navy);box-shadow:var(--sh-1)}
.elPill{flex:none;min-width:34px;text-align:center;padding:2px 7px;border-radius:99px;
  color:#fff;font-size:11px;font-weight:800;
  -webkit-print-color-adjust:exact;print-color-adjust:exact}
.elRowReq{flex:1;min-width:0;font-size:12.5px;font-weight:800;color:var(--ink);
  display:flex;flex-wrap:wrap;align-items:baseline;gap:6px}
.elRowN{font-size:11px;font-weight:800;color:var(--mut)}
.elRowAlt{flex-basis:100%;font-style:normal;font-size:10.5px;font-weight:600;color:var(--mut)}
/* il nome del punto: compare SOLO qui, cioe' solo dopo un clic */
.elRowOpen{flex-basis:100%;display:flex;flex-direction:column;gap:3px;margin-top:5px;
  padding-top:6px;border-top:1px solid var(--linea)}
.elRowOpen b{font-size:12.5px;font-weight:800;color:var(--navy)}
.elRowOpen span{font-size:11px;font-weight:600;color:var(--mut);line-height:1.4}
.elRowOpen .elLink{align-self:flex-start;padding-left:0}

/* marker: sulla mappa si legge la TENSIONE, non il numero dell'utenza */
.elPinW{background:none;border:none}
.elPin{display:flex;align-items:center;justify-content:center;gap:2px;
  width:34px;height:20px;border-radius:99px;color:#fff;border:2px solid #fff;
  font-size:10px;font-weight:800;box-shadow:0 1px 4px rgba(0,0,0,.4);
  -webkit-print-color-adjust:exact;print-color-adjust:exact}
.elPin i{font-style:normal;font-size:8px;opacity:.85}
.elPinNd{border-style:dashed;opacity:.85}

@media(pointer:coarse){
  .elRow{min-height:46px}
  .elLink{min-height:36px;display:inline-flex;align-items:center}
}

/* ===================== v60 — MAPPA ATLETI: la vista dello stadio =====================
   La Mappa Atleti ha due viste: «Città» (hotel, percorsi, servizi — quella di
   sempre) e «Stadio», che e' questa. Questa pagina finisce dietro un QR appeso
   in hotel e si guarda col telefono in mano, in pieno sole.
   Lo SFONDO E' SWISSTOPO. La prima stesura aveva un fondo a tinta piatta stile
   manifesto: tolto dopo averlo visto (scelta di Giacomo) — su una foto aerea
   l'atleta riconosce i luoghi, su una carta astratta no. Le zone quindi sono
   traslucide con contorno marcato, non tinte piene.
   Tre cose che sembrano dettagli e non lo sono:
   - i colori delle zone sono attributi `fill` SVG scritti dal JS, non
     `background` CSS: sopravvivono alla stampa con «Grafica di sfondo»
     disattivata, come il bordo di .pHero;
   - le etichette riusano .lbl (classe condivisa) e ci aggiungono solo il
     vestito: cosi' ereditano gratis --mtx (i corpi che scalano con lo zoom),
     i tre gradini pTxt-s/m/g, la casella «Etichette» del cartiglio e il
     diradamento _declutter(), che senza .lbl non le vedrebbe;
   - l'ORTOFOTO si nasconde con una classe sul body, mai spegnendo `oPref`:
     quella preferenza (`orthoPref2026`) e' condivisa con gli altri sei moduli
     mappa — accenderla nel Generale stadio la accendeva anche qui, ed e'
     esattamente il motivo per cui compariva sopra swisstopo. Stessa ragione
     per cui non si passa mai da setBg(), che scrive `bgPref2026`. */

/* --- commutatore di vista: fascia propria, fra la barra e le pillole ---
   Non nella barra in alto (a 375px ha gia' home, ricerca e lingua) e non fra
   le pillole (quelle scorrono in orizzontale, e un commutatore che scorre via
   e' un commutatore che non si trova). */
/* v66.1 — prima banda a se' stante, centrata; ora e' la prima colonna di
   #cBands, pinnata a sinistra e non comprimibile (le pillole scorrono, lui no:
   e' navigazione, non un filtro). */
#cViste{flex:none;display:flex}
#cViste .pseg{background:rgba(255,255,255,.94);backdrop-filter:blur(4px);
  box-shadow:var(--sh-2);height:var(--ct-pills-h)}
#cViste .pseg button{font-size:12px;font-weight:800;padding:0 18px;letter-spacing:.01em}

/* --- via l'ortofoto, resta swisstopo --- */
body.page-citta.vistaStadio .leaflet-ortho-pane{display:none!important}

/* --- etichette delle zone: pastiglia Montserrat, non testo nudo --- */
.leaflet-tooltip.lbl.aLbl{font-family:"Montserrat",sans-serif;font-weight:800;
  font-size:calc(10.5px * var(--mtx,1));text-transform:uppercase;letter-spacing:.045em;
  color:var(--navy);background:rgba(255,255,255,.93);border:1px solid #9a9aa4;
  border-radius:99px;padding:3px 11px;box-shadow:none;white-space:nowrap}
.leaflet-tooltip.lbl.aLbl.aLblBig{font-size:calc(13px * var(--mtx,1));padding:4px 14px;
  color:var(--ink);border-color:var(--ink);border-width:1.5px}

/* --- punti: SEGNO CARTOGRAFICO, non emoji (v64) ---------------------------
   Il nome e' un tooltip .lbl (vedi ptLabel); qui c'e' solo il segno.
   QUI NON SI DICHIARA NESSUN COLORE, ed e' la cosa importante di questo blocco:
   corpo e simbolo sono un solo <svg> scritto dal JS, con `fill` e `stroke` come
   ATTRIBUTI. Con «Grafica di sfondo» disattivata nel dialogo di stampa i
   `background` CSS spariscono dal foglio — e' la ragione per cui .pHero ha un
   bordo e non un fondo (Regola 6) — mentre un attributo di presentazione SVG si
   stampa. Prima il colore del punto era `style="background:…"`: su quel foglio
   i pin uscivano come anelli bianchi vuoti sulla foto aerea. Il CSS qui non
   tocca nessun colore, e non deve tornare a toccarlo.
   Due forme, due significati: la PUNTA della goccia e' una coordinata (le tre
   porte: si cammina fino a QUELLA porta), il DISCO e' un'area — gli altri punti
   nascono da centroidi di poligoni, e una goccia millanterebbe una precisione
   che il dato non ha. Le dimensioni e le ancore stanno nel JS (ptIcon), non
   qui: una sola fonte di verita' per la geometria del segno. */
.aMk{background:none;border:none;line-height:0}
.aMk svg{display:block;overflow:visible;filter:drop-shadow(0 1px 2px rgba(0,0,0,.45))}
/* il glifo dentro il testo: elenco, popup, pillole, tappe, tabella di stampa.
   Nessun colore nemmeno qui — lo scrive il JS come attributo, oppure e'
   `currentColor` dove lo decide il contesto (una pillola accesa ha fondo scuro
   e testo bianco: il simbolo la segue senza una regola in piu'). */
.aIc{display:inline-block;vertical-align:-2px;flex:none}
.aIcRow{margin-right:6px}
.cPill .aIc{vertical-align:-3px}
.aPopH .aIc{vertical-align:-3px}
.aStepIc{color:var(--rosso)}   /* colore per EREDITA', non per attributo */
.aStep .bt .aIc,.vacts .bt .aIc{vertical-align:-3px}
/* il nome di un punto e' minuscolo e in nero: la MAIUSCOLETTA e' delle zone,
   e usarla anche qui appiattirebbe la gerarchia — a colpo d'occhio l'area e
   il servizio dentro l'area devono distinguersi */
.leaflet-tooltip.lbl.aLbl.aLblPt{font-size:calc(10px * var(--mtx,1));text-transform:none;
  letter-spacing:.01em;color:var(--ink);padding:2px 9px}
/* LE TRE PORTE DEGLI ATLETI si devono vedere prima di ogni altra cosa: sono
   l'unica informazione per cui questa mappa esiste davvero. Nome piu' grande e
   pastiglia piena, e l'USCITA in rosso pieno — entrare e uscire sono due gesti
   opposti e non possono avere lo stesso vestito. */
.leaflet-tooltip.lbl.aLbl.aLblPorta{font-size:calc(11.5px * var(--mtx,1));padding:4px 12px;
  border-width:1.5px;border-color:#0f9d58;color:#0a6b3c}
.leaflet-tooltip.lbl.aLbl.aLblUscita{background:var(--rosso);border-color:var(--rosso-d);color:#fff;
  text-transform:uppercase;letter-spacing:.05em}

/* --- badge numerato delle tappe: SOLO in stampa (opzione «tappe») ---
   v64 — non ha piu' una classe sua: era un <div> con `background:var(--rosso)`,
   e con «Grafica di sfondo» disattivata usciva BIANCO SU BIANCO, cioe' proprio
   sul foglio per cui esiste. Ora e' un <svg> con `fill` attributo e riusa .aMk,
   come i pin: un solo posto dove si dice come si comporta un segno sulla mappa. */

/* --- popup essenziale: categoria + nome, niente altro --- */
.aPopH{display:flex;align-items:center;gap:7px}
.aPopH b{font-size:12.5px}
.aPop{color:#fff;font-weight:800;font-size:9px;padding:2px 8px;border-radius:99px;letter-spacing:.02em}

/* --- il percorso dell'atleta, nel foglio --- */
.aSteps{display:flex;flex-direction:column;gap:6px}
.aStep{display:flex;align-items:center;gap:11px;background:var(--carta);border-radius:var(--r1);
  padding:9px 11px;box-shadow:var(--sh-1);cursor:pointer}
.aStep:hover{box-shadow:var(--sh-2)}
.aStepN{flex:none;width:26px;height:26px;border-radius:50%;background:var(--rosso);color:#fff;
  font-weight:800;font-size:13px;display:flex;align-items:center;justify-content:center}
.aStepT{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
.aStepT b{font-size:12.5px}
.aStepT span{font-size:11px;color:var(--mut);line-height:1.4}
.aDot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:6px;vertical-align:0}

/* --- stampa: i corpi si dichiarano FUORI da @media print, o il diradamento
   misurerebbe un foglio che non esiste (lezione della v55: _declutter legge i
   rettangoli veri dal DOM, quindi cio' che si misura dev'essere cio' che si
   stampa). Doppia classe e posizione in coda, o «Testi piccoli/grandi» —
   stessa specificita' — vincerebbe. --- */
body.printing .leaflet-tooltip.lbl.aLbl{font-size:12px}
body.printing .leaflet-tooltip.lbl.aLbl.aLblBig{font-size:15px}
body.printing .lbl.aLbl.pLblS{font-size:10px}
body.printing .lbl.aLbl.pLblXS{font-size:8.5px}
body.printing .leaflet-tooltip.lbl.aLbl.aLblPt{font-size:10px}
body.printing .leaflet-tooltip.lbl.aLbl.aLblPorta{font-size:11.5px}
body.printing .lbl.aLbl.aLblPt.pLblS{font-size:8.5px}
body.printing .lbl.aLbl.aLblPt.pLblXS{font-size:7.5px}
/* l'ombra e' l'unica cosa decorativa rimasta sul segno, e in stampa si spegne:
   un filtro SVG fa RASTERIZZARE il disegno in alcune catene di stampa, e un pin
   sgranato su un A3 si vede. Sta qui e non dentro @media print per la stessa
   ragione delle righe sopra: cio' che si misura dev'essere cio' che si stampa. */
body.printing .aMk svg{filter:none}
body.printing .ptbl .aIc{vertical-align:-1.5px}
/* in stampa lo sfondo swisstopo RESTA: e' quello che fa riconoscere i luoghi,
   e doPrint aspetta le tile prima di stampare (_printWhenReady). */

@media(max-width:640px){
  #cViste .pseg button{padding:0 14px;font-size:11.5px}
}
@media(pointer:coarse){
  .aStep{min-height:48px}
  #cViste .pseg button{min-height:32px}
}

/* =========================================================================
   v63 — modulo SICUREZZA: badge delle postazioni (lettera A–M colorata per
   organizzazione, come i .pzB delle zone pass), quadratini dei varchi
   (colore = stato della gestione entrate) e le poche righe proprie del
   pannello. Tutto il resto riusa le classi di Elettricità (.elSec, .elRow,
   .elGrp…), che sono già generiche: stessa famiglia, zero duplicazioni. */
.sicPW{background:none;border:none}
.sicP{display:flex;width:26px;height:26px;align-items:center;justify-content:center;border-radius:50%;
  border:2.5px solid #fff;color:#fff;font-weight:900;font-size:13px;font-family:inherit;
  box-shadow:0 1px 4px rgba(0,0,0,.45);box-sizing:border-box;
  print-color-adjust:exact;-webkit-print-color-adjust:exact}
.sicP.ext{border-style:dashed}          /* postazione fuori stadio (posteggi) */
.sicPmini{width:20px;height:20px;font-size:11px;border-width:2px;flex:none;box-shadow:none}
.sicE{display:flex;width:20px;height:20px;align-items:center;justify-content:center;border-radius:5px;
  border:2px solid #fff;color:#fff;font-weight:900;font-size:11px;font-family:inherit;
  box-shadow:0 1px 3px rgba(0,0,0,.4);box-sizing:border-box;
  print-color-adjust:exact;-webkit-print-color-adjust:exact}
.sicEmini{box-shadow:none;flex:none}
.sicOre{display:flex;flex-direction:column;gap:2px;margin-top:4px}
.sicOra{display:flex;gap:10px;align-items:baseline;font-size:12.5px;padding:3px 2px;border-bottom:1px solid var(--linea)}
.sicOra b{flex:none;width:44px;font-size:12px}
.sicOra span{color:var(--ink)}
.sicVSel{font-family:inherit;font-size:11.5px;padding:4px 6px;border:1px solid var(--linea);border-radius:7px;max-width:150px}
.sicVNote{font-family:inherit;font-size:11.5px;padding:4px 6px;border:1px solid var(--linea);border-radius:7px;flex:1;min-width:80px}
.sicDel{font-family:inherit;font-size:12px;border:1px solid var(--linea);background:var(--carta);border-radius:7px;
  padding:2px 8px;cursor:pointer;color:var(--mut)}
.sicDel:hover{color:var(--rosso);border-color:var(--rosso)}
.sicRcpAdd{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.sicRcpAdd input{font-family:inherit;font-size:12px;padding:6px 8px;border:1px solid var(--linea);border-radius:8px;flex:1;min-width:110px}
.sicRcpAdd button{font-family:inherit;font-size:11.5px;font-weight:800;padding:6px 12px;border:1px solid var(--linea);
  background:var(--carta);border-radius:99px;cursor:pointer}
.sicTel{font-weight:800;color:var(--ink)}
.sicUrg{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;font-size:12px;color:var(--mut)}
.sicUrg b{color:var(--rosso);font-size:13px}
.sicPdfRow{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;font-size:12.5px;margin-top:4px}
.sicPdfBtns{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.sicPdfBtns button{font-family:inherit;font-size:11.5px;font-weight:700;padding:6px 12px;border:1px solid var(--linea);
  background:var(--carta);border-radius:99px;cursor:pointer;box-shadow:var(--sh-1)}
.sicPdfBtns button:hover{border-color:var(--navy)}
#sicPdfFrame{width:100%;height:62vh;border:1px solid var(--linea);border-radius:10px;margin-top:8px;background:#fff}
.sicRisk{display:flex;flex-direction:column;gap:2px;margin-top:4px}
.sicRiskRow{display:flex;gap:8px;align-items:baseline;font-size:12px;padding:3px 2px;border-bottom:1px solid var(--linea)}
.sicRiskRow span{flex:1}
.sicRiskRow b{flex:none}
.sicRiskRow i{flex:1.4;color:var(--mut);font-style:normal;text-align:right}
@media(pointer:coarse){
  .sicVSel,.sicVNote,.sicRcpAdd input{min-height:38px}
  .sicPdfBtns button,.sicRcpAdd button{min-height:38px}
}
/* in stampa il pannello sparisce già con .haspanel; i badge .sicP/.sicE sono
   marker Leaflet e seguono le regole comuni dei marker in stampa. */

/* --- v63.1 (riscritta in v63.2): la HOME D'ENTRATA del modulo Sicurezza e
   la pagina Indicazioni. La prima stesura era un velo sopra la mappa con
   `var(--fondo)` — un token che NON ESISTE (quello vero è `--bg`), quindi lo
   sfondo era trasparente e sotto ci passavano mappa, cassetto Layer
   (z-index 1600) e pannello: il pasticcio nello screenshot di Giacomo.
   Ora le viste home/indicazioni SPENGONO la mappa e i suoi comandi con una
   classe su body (sotto), e gli overlay hanno sfondo pieno e z-index sopra
   il cassetto. Regola da ricordare: un overlay a tutta pagina o nasconde
   quello che copre, o prima o poi qualcosa con z-index più alto ci galleggia
   sopra. --- */
/* centratura con margin:auto sul FIGLIO, non align/justify-center sul padre:
   un flex centrato più alto del contenitore taglia la testa del contenuto
   anche con overflow:auto (misurato: il titolo finiva sotto la nav) */
#sicHub{position:fixed;left:0;right:0;bottom:0;top:var(--nav-h);z-index:2000;
  background:var(--bg);overflow:auto;display:flex;padding:22px 16px}
#sicHub[hidden],#sicDoc[hidden]{display:none!important}
/* nelle viste home e indicazioni la mappa non esiste: via anche linguetta
   del cassetto, cassetto, maniglia del pannello e barra strumenti — sono
   position:fixed in <body> e galleggerebbero sopra qualsiasi overlay */
body.sicVHub #app,body.sicVDoc #app,
body.sicVHub .lyrDrawer,body.sicVDoc .lyrDrawer,
body.sicVHub #lyrTab,body.sicVDoc #lyrTab,
body.sicVHub #panelToggle,body.sicVDoc #panelToggle,
body.sicVHub #mapBtns,body.sicVDoc #mapBtns{display:none!important}
.sicHubIn{max-width:860px;width:100%;text-align:center;margin:auto}
.sicHubKick{font-size:10.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--rosso);margin:0 0 6px}
.sicHubIn h1{font-size:30px;font-weight:900;margin:0 0 6px}
.sicHubSub{color:var(--mut);font-size:13.5px;margin:0 0 26px}
/* v69: tre card — auto-fit, cosi' stanno in riga quando c'e' spazio e si
   impilano quando non ce n'e', senza una soglia scritta a mano */
.sicCards{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:18px;text-align:left}
.sicCard{display:flex;flex-direction:column;gap:9px;background:var(--carta);border:1px solid var(--linea);
  border-top:4px solid var(--navy);border-radius:16px;padding:22px 20px 18px;text-decoration:none;color:var(--ink);
  box-shadow:var(--sh-1);transition:transform .12s,box-shadow .12s,border-color .12s}
.sicCard.rossa{border-top-color:var(--rosso)}
.sicCard:hover{transform:translateY(-2px);box-shadow:var(--sh-2);border-color:var(--navy)}
/* v64.6: niente icone-emoji sulle card (richiesta di Giacomo, «più
   professionale»): l'identità la danno il bordo colorato e il titolo */
.sicCard b{font-size:17px;font-weight:900}
.sicCard>span:not(.sicCardStat){font-size:12.5px;color:var(--mut);line-height:1.55}
.sicCardStat{display:flex;gap:14px;margin-top:2px}
.sicCardStat b{font-size:19px;font-weight:900}
.sicCardStat span{display:flex;flex-direction:column;font-size:10.5px;color:var(--mut);font-weight:700}
.sicCard i{font-style:normal;font-size:12.5px;font-weight:800;color:var(--rosso);margin-top:8px}
#sicDoc{position:fixed;left:0;right:0;bottom:0;top:var(--nav-h);z-index:2000;background:var(--bg);overflow:auto}
.sicDocIn{max-width:900px;margin:0 auto;padding:16px 16px 70px}
.sicDocHead{display:flex;gap:14px;align-items:center;flex-wrap:wrap;padding:4px 0 10px}
.sicDocNav{font-size:12.5px;font-weight:800;color:var(--ink);text-decoration:none}
.sicDocNav:hover{color:var(--rosso)}
.sicDocPrintBtn{font-family:inherit;font-size:12px;font-weight:800;color:#fff;background:var(--rosso);
  border:1px solid var(--rosso);border-radius:99px;padding:8px 18px;cursor:pointer;box-shadow:var(--sh-1)}
.sicDocTitle{font-size:22px;font-weight:900;margin:2px 0 10px}
.sicGoDoc{display:block;margin-top:10px;padding:10px 12px;border:1px solid var(--linea);border-radius:12px;
  background:var(--carta);font-size:12.5px;color:var(--ink);text-decoration:none;box-shadow:var(--sh-1)}
.sicGoDoc:hover{border-color:var(--navy)}
/* le due stampe sono esclusive (schema Generale stadio): in printDocShow gli
   overlay spariscono, o le Indicazioni aperte finirebbero stampate sopra */
body.pPrinting #sicHub,body.pPrinting #sicDoc{display:none!important}
@media(max-width:700px){
  .sicCards{grid-template-columns:1fr}
  .sicHubIn h1{font-size:22px}
}

/* ===================== v65 — REVISIONE GRAFICA BRAND 2026 =====================
   Il portale si allinea alla grafica ufficiale dell'evento (galathletics.ch +
   locandina 2026). Le firme del brand che entrano qui:
   — TITOLI in Roboto Condensed 800 CORSIVO MAIUSCOLO (--font-display, definito
     in :root): e' il carattere di sito e locandina. Montserrat resta il font di
     LAVORO (tabelle, form, etichette): la leggibilita' non cambia.
   — login e hero home = il "palcoscenico notte" della locandina: fondo scuro,
     ANELLO ROSSO incandescente, striature di velocita', "2026" in outline.
     Tutto il resto del portale resta chiaro (e' anche il registro del sito).
   — CTA primarie = pillola rossa condensed, come i bottoni del sito.
   — GIALLO #FBDB04 (--giallo): accento RARO, elenco chiuso — il trattino del
     kicker dell'hero e quello del sottotitolo del login. Non usarlo altrove.
   Come la v20: SOLO override per cascata, nessuna classe nuova, niente JS,
   NIENTE dentro @media print. ATTENZIONE alle taglie: una regola qui in fondo
   vince anche sulle media query piu' in alto (v20 mobile, v54.2 nav compatta),
   quindi i corpi che cambiano nei breakpoint vengono RIDICHIARATI nel blocco
   mobile in coda a questa sezione — chi tocca una taglia qui controlli la'.
   I font arrivano dagli stessi host gia' in CSP (fonts.googleapis/gstatic);
   in file:// senza rete si degrada su Montserrat, dichiarato nel fallback. */

/* --- nav: voci condensed maiuscole come il sito ufficiale; la voce attiva
   diventa la pillola ROSSA del brand (era nera). Niente font-size qui: le
   taglie restano quelle di v11/v12/v54.2, che si sono gia' misurate la nav.
   Il TRACKING invece si misura di nuovo: il maiuscolo allarga, il condensed
   stringe, e a .035em la barra sforava di 33px proprio a 1185px — la striscia
   che la v54.2 aveva liberato. Misurato dopo la correzione: 1610 e 1265 senza
   sforo, 1185 rientrata (vedi il blocco ≤1600 qui sotto). */
#topnav .links a{font-family:var(--font-display);font-weight:700;text-transform:uppercase;letter-spacing:.02em}
@media(min-width:640.02px) and (max-width:1600px){
  #topnav .links a{letter-spacing:.008em;padding:6px 7px}
}
#topnav .links a.on{background:var(--rosso);color:#fff}
#topnav .vchip{font-family:var(--font-display);letter-spacing:.05em;font-size:11px}
#topnav .vchip b{font-style:italic;font-weight:800}

/* --- home: titolo condensed con sottolineatura rossa "in velocita'" --- */
.dashHead .dhTitle h1{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;font-size:30px;letter-spacing:.005em;line-height:1}
.dashHead .dhTitle h1::after{content:"";display:block;width:46px;height:4px;margin-top:7px;
  background:linear-gradient(90deg,var(--rosso),var(--rosso-d));transform:skewX(-18deg);border-radius:1px}
.dashSecTitle{font-family:var(--font-display);letter-spacing:.12em}
.dhChip{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.05em;font-size:11.5px}
.dhChip b{font-style:italic;font-weight:800}

/* --- hero "Generale stadio" = la locandina: notte, anello incandescente,
   striature, "2026" in outline. I tre livelli di fondo stanno sul BANNER
   stesso (alone rosso + striature + notte), cosi' ::before resta libero per
   l'anello e ::after per il "2026" — e vanno AZZERATE per esteso le proprieta'
   che v13/v20 davano ai due pseudo-elementi (inset, misure, fondo). --- */
.hubBanner{background:
  radial-gradient(560px 300px at 86% 50%,rgba(219,12,28,.30),rgba(219,12,28,.06) 60%,transparent 72%),
  repeating-linear-gradient(115deg,transparent 0 44px,rgba(255,255,255,.03) 44px 46px,transparent 46px 104px),
  linear-gradient(128deg,#25225a 0%,#171540 48%,#0d0c22 100%)}
.hubBanner::before{content:"";position:absolute;inset:auto;right:-72px;top:50%;width:310px;height:310px;
  transform:translateY(-50%);border-radius:50%;border:2px solid rgba(255,84,92,.5);
  box-shadow:0 0 30px rgba(219,12,28,.45),0 0 90px rgba(219,12,28,.3),inset 0 0 36px rgba(219,12,28,.38);
  background:radial-gradient(circle,transparent 58%,rgba(219,12,28,.1) 72%,transparent 76%);
  pointer-events:none;animation:v65ring 4.5s ease-in-out infinite}
@keyframes v65ring{50%{opacity:.72}}
.hubBanner::after{content:"2026";position:absolute;left:auto;right:20px;top:auto;bottom:-30px;
  width:auto;height:auto;border-radius:0;background:none;
  font-family:var(--font-display);font-style:italic;font-weight:900;font-size:96px;line-height:1;
  letter-spacing:-.02em;color:rgba(255,255,255,.04);-webkit-text-stroke:1.5px rgba(255,255,255,.13);
  pointer-events:none}
.hubBanner .hbKick{font-family:var(--font-display);font-weight:700;letter-spacing:.14em;color:#ff9aa0}
.hubBanner .hbKick::before{content:"";display:inline-block;width:17px;height:3px;margin-right:8px;
  background:var(--giallo);transform:skewX(-18deg);vertical-align:2px;border-radius:1px}
.hubBanner .hbTxt h2{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;font-size:26px;letter-spacing:.005em}
.hubBanner .hbGo{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.04em;font-size:13.5px}

/* --- card moduli: titoli e numeroni nel carattere del brand; la card resta
   chiara e identica di struttura (v13/v20) --- */
.modTile h2{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;font-size:17px;letter-spacing:.01em;line-height:1.05}
.modTile .mtStat b{font-family:var(--font-display);font-style:italic;font-weight:800;
  font-size:24px;letter-spacing:0}
.stat b{font-family:var(--font-display);font-style:italic;font-weight:800;font-size:20px}
.totsSum b{font-family:var(--font-display);font-style:italic;font-weight:800;font-size:18px}

/* --- login = mini-locandina. Il body ha anche .page-dash: ::before qui era il
   filetto rosso fisso in cima (left/right/top/height/z-index) e va riscritto
   PER ESTESO per diventare l'anello — right:auto e z-index:0 non sono
   ornamento, senza di loro restano quelli del filetto. La card resta BIANCA:
   e' il biglietto sul palcoscenico, e i campi si leggono come prima. --- */
body.page-login{background:
  radial-gradient(760px 420px at 72% 4%,rgba(219,12,28,.17),transparent 62%),
  radial-gradient(900px 620px at 16% 98%,rgba(31,29,77,.6),transparent 68%),
  linear-gradient(158deg,#1c1942 0%,#131030 46%,#0a0918 100%)}
body.page-login::before{content:"";position:fixed;left:50%;right:auto;top:44%;bottom:auto;z-index:0;
  width:min(620px,148vw);height:min(620px,148vw);transform:translate(-50%,-50%);border-radius:50%;
  border:2px solid rgba(255,84,92,.4);
  box-shadow:0 0 40px rgba(219,12,28,.4),0 0 120px rgba(219,12,28,.26),inset 0 0 60px rgba(219,12,28,.3);
  background:radial-gradient(circle,transparent 56%,rgba(219,12,28,.09) 74%,transparent 79%);
  pointer-events:none;animation:v65ring 5.5s ease-in-out infinite}
body.page-login::after{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background:
   repeating-linear-gradient(115deg,transparent 0 60px,rgba(255,255,255,.022) 60px 62px,transparent 62px 140px),
   radial-gradient(1100px 480px at 50% 118%,rgba(219,12,28,.1),transparent 60%)}
.page-login .loginWrap{position:relative;z-index:1}
/* pre-esistente, chiuso di passaggio: `width:400px;max-width:94vw` + i 32px
   di padding del wrap chiedevano 385px minimi su un viewport da 375 e il
   layout mobile si allargava di ~20px (misurato). `width:100%` dentro il
   wrap non e' circolare: il blocco segue il padre, il tetto resta 400px. */
.loginCard{width:100%;max-width:400px;box-shadow:0 30px 80px rgba(5,5,18,.55),0 2px 10px rgba(5,5,18,.35)}
.loginCard h1{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;font-size:24px;letter-spacing:.005em}
.loginCard .lgSub::before{content:"";display:inline-block;width:15px;height:3px;margin-right:7px;
  background:var(--giallo);transform:skewX(-18deg);vertical-align:2px;border-radius:1px}
.lgFoot{color:rgba(255,255,255,.6)}
.lgFoot a{color:rgba(255,255,255,.78)}
.lgFoot a:hover{color:#fff}

/* --- CTA primarie: la pillola rossa della locandina, un solo disegno --- */
.pgo{border-radius:99px;font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.04em}
.lgGo{border-radius:99px;font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.05em;font-size:15px}
.lvBtn.primary,.sicDocPrintBtn{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.04em}
#bar button.primary{font-family:var(--font-display);font-weight:700;text-transform:uppercase;letter-spacing:.05em}

/* --- sicurezza: l'ingresso del modulo parla la stessa lingua --- */
.sicHubIn h1,.sicDocTitle{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.005em}

/* --- dettagli globali: selezione nei colori del Gala', scrollbar discrete
   (solo WebKit: scrollbar-width cambierebbe le larghezze misurate) --- */
::selection{background:var(--rosso);color:#fff}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:#c6c6cf;border-radius:99px;border:2px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background-color:#9a9aa4}

/* --- taglie mobile RIDICHIARATE (vedi avvertenza in testa alla sezione:
   questa sezione vince sulle media query v20/v13 piu' in alto) --- */
@media(max-width:640px){
  /* difetto PRE-ESISTENTE chiuso di passaggio: la barra CANTIERE ha tutto il
     testo nel <b> (lo `#cantiereBar span{display:none}` della v21 non ha mai
     avuto uno span da nascondere) e con white-space:nowrap il suo min-content
     e' 426px — su telefono il layout viewport si spalancava a 426 e OGNI
     pagina del cantiere usciva rimpicciolita (misurato sulla home a 375).
     Il <b> e' un flex item: min-width:0 + ellissi, l'altezza resta 32px. */
  #cantiereBar b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* su telefono logo e titolo si IMPILANO (come in locandina): affiancati non
     sono mai entrati davvero — il logo e' largo 195px (42px di altezza per un
     file 558x120) e sul cantiere il titolo e' "Amministrazione", una parola
     sola da 189px: 195+16+189 = 400px su 347 utili, e il viewport mobile si
     spalancava a 426 (stessa misura del difetto della barra qui sopra). */
  .dashHead{flex-direction:column;align-items:flex-start;gap:10px}
  .dashHead .dhTitle h1{font-size:24px}
  .hubBanner::before{width:230px;height:230px;right:-80px}
  .hubBanner::after{font-size:64px;bottom:-18px;right:12px}
  .loginCard h1{font-size:21px}
  body.page-login::before{width:min(440px,140vw);height:min(440px,140vw)}
}
@media(prefers-reduced-motion:reduce){
  .hubBanner::before,body.page-login::before{animation:none}
}
@media(pointer:coarse){
  .sicCard{min-height:120px}
  .sicDocNav,.sicDocPrintBtn{min-height:38px;display:inline-flex;align-items:center}
}

/* --- v63.3: la vista TAVOLE (#sicTav, hash #mappa) e le note «Indicazioni
   accessi». Stesse regole di #sicDoc: overlay pieno, mappa e comandi spenti
   dalla classe su body. --- */
#sicTav{position:fixed;left:0;right:0;bottom:0;top:var(--nav-h);z-index:2000;background:var(--bg);overflow:auto}
#sicTav[hidden]{display:none!important}
body.sicVTav #app,body.sicVTav .lyrDrawer,body.sicVTav #lyrTab,
body.sicVTav #panelToggle,body.sicVTav #mapBtns{display:none!important}
body.pPrinting #sicTav{display:none!important}

/* --- v69: la vista PARCHEGGI (#sicPark, hash #parcheggi). Stesse regole di
   #sicTav: overlay pieno, mappa e comandi spenti dalla classe su body. --- */
#sicPark{position:fixed;left:0;right:0;bottom:0;top:var(--nav-h);z-index:2000;background:var(--bg);overflow:auto}
#sicPark[hidden]{display:none!important}
body.sicVPark #app,body.sicVPark .lyrDrawer,body.sicVPark #lyrTab,
body.sicVPark #panelToggle,body.sicVPark #mapBtns{display:none!important}
body.pPrinting #sicPark{display:none!important}
/* il totale in testa alla lista: bordo e non fondo, cosi' regge anche in
   stampa con «Grafica di sfondo» disattivata (Regola 6) */
.sicPkTot{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;border:1px solid var(--linea);
  border-left:3px solid var(--rosso);border-radius:10px;padding:9px 12px;margin:0 0 12px;font-size:13px}
.sicPkTot b{font-size:17px;font-weight:900}
.sicPkTot i{color:var(--mut);font-size:11px;font-style:normal;margin-left:auto}
.sicPkN{flex:none;width:20px;text-align:right;font-size:11px;font-weight:800;color:var(--mut);font-variant-numeric:tabular-nums}
.sicPkFrom{margin-top:10px}
/* v69.2 — la mappetta «dove si trova»: l'etichetta dello stadio e' una
   pastiglia della stessa famiglia delle altre scritte di mappa (v54) */
/* piu' bassa della mappa viva delle entrate: qui e' un riferimento, non la
   cosa da guardare — sotto c'e' l'elenco, che e' il contenuto della pagina */
#sicPkMap{height:44vh;min-height:230px;max-height:380px;margin-bottom:6px}
.pkStLbl{position:absolute;transform:translate(-50%,-50%);white-space:nowrap}
/* v69.1 — l'elenco si modifica qui: campi sempre aperti, come la tabella
   della Consegna materiale nel CRM (lì il primo clic aprirebbe la scheda,
   qui la riga non apre niente, quindi un campo aperto non ruba nessun gesto) */
.sicPkBox{border:1px solid var(--linea);border-radius:12px;padding:10px;background:var(--carta)}
.sicPkCap{display:flex;align-items:center;gap:8px;padding:0 0 8px;margin:0 0 8px;border-bottom:1px solid var(--linea)}
.sicPkCap label{font-size:11.5px;font-weight:800;color:var(--mut)}
.sicPkRow{display:flex;gap:6px;align-items:center;margin:0 0 6px}
.sicPkI{flex:1;min-width:0;border:1px solid var(--linea);border-radius:8px;padding:6px 8px;
  font-family:inherit;font-size:13px;background:var(--bg)}
.sicPkI:focus{outline:2px solid var(--navy);outline-offset:-1px;background:var(--carta)}
.sicPkI.sicPkNota{flex:.8;color:var(--mut)}
.sicPkI.sicPkNum{flex:none;width:86px;text-align:right;font-variant-numeric:tabular-nums;font-weight:800}
.sicPkX{flex:none;width:30px;height:30px;border:1px solid var(--linea);border-radius:8px;background:none;
  color:var(--mut);font-size:13px;cursor:pointer}
.sicPkX:hover{border-color:var(--err);color:var(--err)}
.sicPkAdd{width:100%;margin-top:2px}
.sicPkMsgWrap{min-height:18px;margin:6px 0 0}
.sicPkMsg{font-size:11.5px;font-weight:700;color:var(--mut)}
.sicPkMsg.ok{color:#166534}
.sicPkMsg.ko{color:var(--err)}
@media(pointer:coarse){.sicPkI{padding:9px 10px}.sicPkX{width:38px;height:38px}}
.sicTavHint{font-size:12.5px;color:var(--mut);margin:0 0 14px}
.sicTavFig{margin:0 0 18px;background:var(--carta);border:1px solid var(--linea);border-radius:14px;
  padding:10px;box-shadow:var(--sh-1)}
.sicTavFig img{display:block;width:100%;height:auto;border-radius:8px;cursor:zoom-in}
.sicTavFig figcaption{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;padding:9px 4px 2px}
.sicTavFig figcaption b{font-size:13.5px}
.sicTavFig figcaption span{font-size:11.5px;color:var(--mut)}
.sicAccTa{width:100%;box-sizing:border-box;font-family:inherit;font-size:13px;line-height:1.55;
  padding:12px;border:1px solid var(--linea);border-radius:12px;background:var(--carta);resize:vertical;min-height:120px}
.sicAccTa:focus{outline:2px solid var(--navy);outline-offset:-1px}
.sicAccTxt{font-size:13px;line-height:1.6;background:var(--carta);border:1px solid var(--linea);
  border-radius:12px;padding:12px}
.pAccTxt{font-size:11.5pt;line-height:1.5;margin:2mm 0 4mm}

/* --- v63.4/v63.5: la PRESENTAZIONE sta DENTRO la pagina Planimetrie
   (scelta di Giacomo: «planimetrie e concetto nella stessa card») —
   testata compatta + iframe same-origin su /api/sicurezza/pdf. --- */
.sicPdfHead{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:10px 14px;
  border-bottom:1px solid var(--linea);background:var(--carta)}
.sicPdfInTav{border:1px solid var(--linea);border-bottom:none;border-radius:12px 12px 0 0}
.sicPdfName{font-size:13px;font-weight:800}
.sicPdfName i{font-style:normal;font-weight:600;color:var(--mut);font-size:11.5px}
.sicPdfHead button{font-family:inherit;font-size:11.5px;font-weight:700;padding:7px 14px;
  border:1px solid var(--linea);background:var(--carta);border-radius:99px;cursor:pointer;box-shadow:var(--sh-1)}
.sicPdfHead button:hover{border-color:var(--navy)}
.sicPdfEmbed{display:block;width:100%;height:72vh;border:1px solid var(--linea);
  border-radius:0 0 12px 12px;background:#525659;box-sizing:border-box;margin-bottom:6px}
.sicCards{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
@media(pointer:coarse){.sicPdfHead button{min-height:38px}}

/* --- v64: la VISTA VIVA dal Generale stadio dentro le Indicazioni accessi
   (mappa Leaflet propria, chips delle viste salvate). --- */
.sicVivaMap{height:62vh;min-height:340px;border:1px solid var(--linea);border-radius:12px;
  background:#e8e8ef;margin-top:8px}
.sicChips{display:flex;gap:6px;flex-wrap:wrap;margin-top:4px}
.sicChip{font-family:inherit;font-size:11.5px;font-weight:700;padding:6px 12px;border:1px solid var(--linea);
  background:var(--carta);border-radius:99px;cursor:pointer;color:var(--ink)}
.sicChip:hover{border-color:var(--navy)}
.sicChip.on{background:var(--navy);border-color:var(--navy);color:#fff}
@media(pointer:coarse){.sicChip{min-height:38px}}

/* --- v64.1: il testo delle Indicazioni entrate impaginato come un
   DOCUMENTO (titoli, elenchi), non un muro di testo in un campo. --- */
.sicAcc{background:var(--carta);border:1px solid var(--linea);border-radius:12px;
  padding:16px 18px;font-size:13.5px;line-height:1.65}
.sicAcc p{margin:0 0 10px}
.sicAccH{font-size:12px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;
  color:var(--rosso);margin:16px 0 8px;padding-bottom:4px;border-bottom:2px solid var(--rosso)}
.sicAcc .sicAccH:first-child{margin-top:0}
.sicAccUl{margin:0 0 10px;padding-left:20px}
.sicAccUl li{margin:0 0 6px}
.sicAccBtns{display:flex;gap:6px;margin-top:8px}
.sicAccBtns button{font-family:inherit;font-size:11.5px;font-weight:700;padding:7px 14px;
  border:1px solid var(--linea);background:var(--carta);border-radius:99px;cursor:pointer;box-shadow:var(--sh-1)}
.sicAccBtns button:hover{border-color:var(--navy)}
/* la stessa impaginazione sul FOGLIO: titoli col filetto (un fondo sparirebbe
   senza «Grafica di sfondo»), corpi in pt */
.pAccTxt .sicAccH{font-size:10.5pt;border-bottom-width:1.5pt;margin:5mm 0 2.5mm}
.pAccTxt p{font-size:11pt;line-height:1.5;margin:0 0 2.5mm}
.pAccTxt .sicAccUl{font-size:11pt;line-height:1.5;margin:0 0 2.5mm;padding-left:6mm}
@media(pointer:coarse){.sicAccBtns button{min-height:38px}}

/* --- v64.4: la legenda delle zone pass ACCANTO alla vista viva (la «solita
   lista» delle stampe): sul pin resta il numero nudo. --- */
.sicVivaWrap{display:flex;gap:12px;align-items:stretch;margin-top:8px}
.sicVivaWrap .sicVivaMap{flex:1;margin-top:0;min-width:0}
.sicVivaLeg{flex:none;width:200px;background:var(--carta);border:1px solid var(--linea);
  border-radius:12px;padding:12px;display:flex;flex-direction:column;gap:9px;align-self:flex-start}
.sicVivaLeg>b{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--mut)}
.sicLegRow{display:flex;gap:8px;align-items:center;font-size:11.5px;line-height:1.35}
.sicLegRow .pzB{width:20px;height:20px;font-size:11px;border-width:2px;flex:none;box-shadow:none}
@media(max-width:700px){
  .sicVivaWrap{flex-direction:column}
  .sicVivaLeg{width:auto;align-self:stretch}
}

/* ===================== v66 — MAPPA ATLETI: il brand, il telefono, le scritte
   =============================================================================
   La revisione grafica v65 ha vestito nav, home, login e card, ma NON questa
   pagina — che e' l'unica di contenuto davvero pubblica del portale: quella che
   gli atleti aprono col QR, dal telefono, una volta sola.
   Qui arriva lo stesso vestito (Roboto Condensed corsivo maiuscolo sui titoli,
   pillola rossa del brand) piu' due cose che si misurano invece di vedersi: le
   sfocature sopra la mappa e le scritte che si nascondono con una classe.
   Stesse regole della v65: solo override per cascata, NIENTE dentro
   @media print, e la coda del file vince — quindi le taglie che cambiano nei
   breakpoint vanno ridichiarate nel blocco mobile in fondo a questa sezione.
   ========================================================================= */

/* --- il commutatore delle due viste e le pillole: titoli, quindi condensed
   maiuscolo. Il TRACKING resta stretto apposta: `#cityPills` scorre in
   orizzontale e `#cViste` e' centrato, e la v65 ha gia' pagato una volta il
   fatto che maiuscolo + tracking allarga (la nav sforava di 33px a 1185).
   Misurato a 375: nessuno scorrimento laterale della pagina. --- */
#cViste .pseg button{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.02em;font-size:12.5px}
/* LO STATO ATTIVO SI DICHIARA QUI, con la stessa forza degli altri selettori di
   questo commutatore. Il componente condiviso lo fa con «.pseg button.on», che
   e' (0,2,1): le righe «#cViste .pseg button» qui sopra sono (1,1,1) e vincono
   su tutto cio' che dichiarano — basta che una di loro tocchi «background» o
   «color» perche' lo stato attivo sparisca senza che nessuno se ne accorga.
   Dichiararlo a livello di id toglie la trappola.
   Rosso come la voce di nav attiva della v65: in tutto il portale «rosso» vuol
   dire «e' questo che stai guardando». (Gli interruttori acceso/spento — i
   percorsi, i preferiti — restano navy: sono un'altra cosa.) */
#cViste .pseg button{-webkit-appearance:none;appearance:none;background:none;color:var(--mut)}
#cViste .pseg button.on{background:var(--rosso);color:#fff;box-shadow:none}
.cPill{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.02em;font-size:12.5px}
/* la pillola accesa e' ROSSA come la voce di nav attiva in v65 (era --ink).
   Il tasto dei percorsi era gia' rosso e diventerebbe indistinguibile: passa
   al navy, che nel portale e' il secondo colore del marchio. */
.cPill.on{background:var(--rosso);color:#fff}
.cPill.cPillToggle.on{background:var(--navy);color:#fff}

/* --- i titoli di sezione del foglio (Zone dello stadio, Punti utili,
   Il percorso dell'atleta). SCOPED a `body.page-citta`: `.vsec` e' condiviso
   col modulo VILLAGGIO, e questa revisione riguarda la Mappa Atleti — gli altri
   moduli mappa devono restare identici al pixel. --- */
body.page-citta .vsec .n{font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.04em}

/* --- i nomi delle due grandi zone sulla mappa: condensed, come le scritte di
   un manifesto. Le altre etichette restano Montserrat: su una mappa la
   leggibilita' non si baratta con il carattere. --- */
.leaflet-tooltip.lbl.aLbl.aLblBig{font-family:var(--font-display);font-weight:800;letter-spacing:.06em}

/* =========================== IL TELEFONO ===================================
   1. LE SFOCATURE. `backdrop-filter` obbliga il compositore a rileggere quello
      che sta DIETRO l'elemento a ogni fotogramma: sopra una mappa che scorre
      significa rifare il lavoro in continuazione. Su questa pagina gli strati
      sfocati erano cinque famiglie — e `.cPill` ne fa uno PER PILLOLA, quindi
      con sette pillole sono sette superfici. Sopra una foto aerea quel velo
      non si distingue nemmeno: si paga e non si vede. Col dito (`pointer:
      coarse`, cioe' esattamente i telefoni) si passa a un fondo pieno.
      Su desktop la sfocatura resta: li' la potenza c'e' e l'effetto si vede.
   ========================================================================= */
@media(pointer:coarse){
  /* .ctW NON e' piu' in questo elenco: da v66.1 il meteo vive DENTRO il foglio,
     dove non c'e' niente da sfocare e un fondo bianco sparirebbe sulla carta
     bianca (misurato: chip invisibile). Il suo fondo lo dichiara la regola del
     componente, --bg. */
  #cityTop #cLang,.cPill,#cViste .pseg{
    backdrop-filter:none;-webkit-backdrop-filter:none;background:rgba(255,255,255,.97)}
  /* la pillola accesa ha il fondo suo: la riga sopra non deve schiarirla */
  .cPill.on{background:var(--rosso)}
  .cPill.cPillToggle.on{background:var(--navy)}
  /* 34px erano sotto i 38 che il portale usa dappertutto per il dito */
  .cPill{min-height:38px;display:inline-flex;align-items:center}
  #cityPills{height:auto}
}

/* 2. LE SCRITTE SI NASCONDONO CON UNA CLASSE, non con uno `style.display` per
      etichetta. Prima `applyPoiLabels` e `applyLbl` giravano a ogni `zoomend`
      e scrivevano sul DOM una volta per punto: e' il modo che common.js usa
      gia' per la stessa cosa (`body.lblFar`), portato anche qui.
      Le eccezioni vivono nel selettore, non in un `if`: le zone grandi e le
      TRE PORTE degli atleti non spariscono mai — sono la ragione per cui si
      guarda questa mappa.
      Le regole della vista Stadio sono sotto `body.vistaStadio`, cosi' non
      serve ripulire le classi quando la vista si spegne, e i nomi dei punti
      della vista Citta' — che portano le stesse classi — non ne sono toccati. */
body.vistaStadio.asFarZ .leaflet-tooltip.aLbl:not(.aLblPt):not(.aLblBig){display:none}
body.vistaStadio.asFarP .leaflet-tooltip.aLbl.aLblPt:not(.aLblPorta){display:none}
body.ctFar:not(.vistaStadio) .leaflet-tooltip.aLbl.cLbl{display:none}

/* 3. LA SCRITTA CHE NON CI STA SPARISCE ANCHE A SCHERMO.
      `_declutter` ha tre rimedi in scala — rimpicciolire, spostare e, quando
      non c'e' davvero posto, togliere (`pLblOff`). Ma la regola che nasconde
      esisteva SOLO sotto `body.printing` (v. il blocco della stampa condivisa):
      a schermo l'ultimo rimedio non faceva NIENTE, e la scritta restava
      sovrapposta esattamente come prima. Misurato qui: «Wheelchair warm-up»
      marcata `pLblOff` e comunque addosso ad altre tre.
      La regola si accende SOLO su questa pagina, e non su tutto il portale:
      negli editor una scritta che sparisce da sola mentre si lavora sarebbe
      una sorpresa, qui invece la mappa deve soltanto essere leggibile.
      Non tocca le scritte protette (`lblMan`: le tre porte degli atleti e la
      call room), che il diradamento non prende nemmeno in considerazione.
      Il nome non si perde: resta nell'elenco del foglio e nel popup. */
body.page-citta .pLblOff{display:none}

/* --- taglie mobile RIDICHIARATE (v. l'avvertenza in testa alla sezione) --- */
@media(max-width:640px){
  #cViste .pseg button{font-size:12px}
  .cPill{font-size:12px}
}

/* ===================== v66.1 — MAPPA ATLETI: LA MAPPA E' IL CONTENUTO
   =============================================================================
   Bocciata la prima passata («cosi' e' un caos», screenshot alla mano): quattro
   strisce flottanti impilate — ricerca, viste, pillole, meteo — si mangiavano
   190px su 812, il marchio da 139px lasciava alla ricerca un moncone, le
   pillole uscivano a destra senza dirlo e le scritte della mappa finivano tutte
   sotto ai comandi.
   La regola di questa passata e' una sola: **sopra la mappa ci sta solo cio' che
   comanda la mappa.** Il resto — meteo, marchio, elenchi — scende nel foglio,
   che e' il posto delle cose da leggere. Da 190px di comandi a 90.
   ========================================================================= */

/* --- 1. LA FASCIA UNICA: viste + pillole sulla stessa riga.
   Il commutatore e' pinnato a sinistra e non si comprime (e' navigazione), le
   pillole scorrono nello spazio che resta (sono un filtro). --- */
#cBands{position:fixed;left:0;right:0;top:var(--ct-y-fasce);z-index:1350;
  display:flex;align-items:center;gap:8px;padding:0 14px;height:var(--ct-pills-h)}
#cityPills::-webkit-scrollbar{display:none}
/* la sfumatura a destra dice CHE SI SCORRE: senza, le pillole sembravano
   semplicemente tagliate dal bordo dello schermo (era il difetto nello
   screenshot). `mask` e non un velo sovrapposto, o coprirebbe i clic. */
#cityPills{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent);
  mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent)}
#cityPills.ctNoFade{-webkit-mask-image:none;mask-image:none}

/* --- 2. LA BARRA IN ALTO: ricerca e lingua, nient'altro.
   Il marchio e' sceso nel foglio: a 375px il logo (file 558x120, alto 30) e'
   largo 139px e alla ricerca restavano ~90px — «Reche…». --- */
#cityTop{gap:8px}
#cSearch{padding:10px 15px;font-size:13px}
#cityTop #cLang{border-radius:99px;overflow:hidden}
#cityTop #cLang button{padding:0 9px;height:var(--ct-bar-h);font-size:11px;font-weight:800;
  font-family:var(--font-display);letter-spacing:.03em}
.cIconBtn{width:var(--ct-bar-h);height:var(--ct-bar-h);font-size:16px}

/* --- 3. IL FOGLIO: marchio e meteo in testa, poi gli elenchi.
   E' anche il posto dove il marchio si vede DAVVERO, invece di stare
   schiacciato in un angolo della barra di ricerca. --- */
#cSheetHead{display:flex;align-items:center;gap:12px;padding:0 14px 10px;min-width:0}
#cSheetHead #cBrand{height:26px;width:auto;flex:none;filter:none}
#cSheetHead #cityToday{margin-left:auto}
#cSheetHead.ctHeadVuoto{display:none}

/* --- 4. LE SCRITTE DELLA MAPPA NON VANNO SOTTO I COMANDI.
   `_declutter` (common.js) usa il rettangolo di #app come area utile: finche'
   era tutto il viewport, spostava le etichette anche sotto la barra e sotto il
   foglio. Ritagliato all'area LIBERA, le sposta solo dove si vedono.
   `#map` resta `position:fixed;inset:0` — la mappa e' ancora a tutto schermo,
   cambia solo dove si possono posare le scritte.
   `:not(.printing)`: in stampa #app E' il foglio, e lo dimensiona il JS. --- */
/* `height:auto` non e' cosmesi: la regola generale `#app{height:100%}` vince
   sul `bottom` di un elemento fixed — l'altezza resta quella del viewport e il
   ritaglio in basso non vale niente (misurato: riquadro alto 812 su 812). */
body.page-citta:not(.printing) #app{top:calc(var(--ct-y-fine) + 4px);
  bottom:calc(var(--ct-peek) + 4px);height:auto}

/* --- 5. LE RIGHE DEL FOGLIO NON SI TRONCANO PIU'.
   «Hôt…» al posto di «Hôtel Unione → Stade»: la riga era una fila unica e il
   nome era l'unico pezzo comprimibile. Ora nome e misura stanno su due righe
   nella loro colonna, e i comandi restano a destra. --- */
/* IL WRAP E' OBBLIGATORIO, non un dettaglio: la misura va a capo con
   `flex:1 0 100%`, e in un flex SENZA wrap quel 100% schiaccia tutti gli altri a
   larghezza zero — misurato, il nome spariva del tutto (0px) e la riga diventava
   alta 83px. */
.crt{display:flex;flex-wrap:wrap;align-items:center;gap:5px 9px;padding:9px 11px}
.crt .rtDot{flex:none}
.crt>b{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.3;white-space:normal}
.crt .cmin{order:9;flex:1 0 100%;padding-left:21px;color:var(--mut);font-size:11px}
.crt label,.crt .bt{flex:none}

/* --- 6. DESKTOP: DUE COLONNE VERE.
   A sinistra la card — marchio, meteo, elenchi: tutto quello che si legge. A
   destra la mappa, con SOPRA DI LEI i suoi comandi. Prima la barra di ricerca
   attraversava lo schermo passando sopra la card, che le cominciava sotto: due
   cose che non c'entrano niente allineate sulla stessa riga. --- */
@media(min-width:821px){
  #cityTop,#cBands{left:428px;padding-right:18px}
  #citySheet{top:var(--ct-top)}
  body.page-citta:not(.printing) #app{left:428px;bottom:14px}
  #cSheetHead{padding-top:2px}
  #cSheetHead #cBrand{height:30px}
}

/* --- 7. TELEFONO --- */
@media(max-width:640px){
  #cBands{padding:0 10px;gap:6px}
  #cViste .pseg button{padding:0 11px;font-size:11.5px}
  .cPill{font-size:11.5px;padding:0 12px}
  #cSheetHead{padding:0 10px 8px}
  #cSheetHead #cBrand{height:23px}
  .ctW{padding:5px 10px;font-size:11.5px;gap:6px}
  .ctW b{font-size:15px}
  .ctWlb{display:none}   /* «Partiellement nuageux» non entra: restano icona, gradi e min/max */
}
.cvIc{margin-right:5px;font-style:normal}
/* Sotto i 400px si toglie il SIMBOLO e resta la PAROLA, non il contrario: e' la
   parola a dire dove si va, il simbolo e' decorazione. (Il primo tentativo
   faceva l'opposto — font-size:0 e ::first-letter — e su un telefono da 360
   restavano due pittogrammi senza scritta per la navigazione principale della
   pagina.) Cosi' i due bottoni passano da ~150px a ~112 e le pillole ne
   guadagnano quaranta. */
@media(max-width:399px){
  .cvIc{display:none}
  #cViste .pseg button{padding:0 12px}
}

/* ===================== v66.2 — IL FOGLIO SI SFOGLIA, NON SI SCORRE
   =============================================================================
   «Rendilo piu' fruibile sul telefono, meno scritte inutili» + «mettilo in una
   tabella a scomparsa». Ogni blocco del foglio e' un <details>: la prima
   sezione aperta, le altre chiuse (la logica sta in citta.js, qui c'e' solo
   l'aspetto). Un <details> nativo perche' porta gia' tastiera, lettori di
   schermo e stato, senza una riga di JS per aprire e chiudere.
   ========================================================================= */
.aSec{margin:0}
/* la testata E' il bersaglio: si preme tutta, non solo la freccia */
summary.vsec{cursor:pointer;list-style:none;-webkit-tap-highlight-color:transparent}
summary.vsec::-webkit-details-marker{display:none}
summary.vsec::after{content:"";flex:none;width:7px;height:7px;margin-right:3px;
  border-right:2px solid var(--mut);border-bottom:2px solid var(--mut);border-radius:1px;
  transform:rotate(45deg) translateY(-2px);transition:transform .18s}
details[open]>summary.vsec::after{transform:rotate(-135deg) translateY(-2px)}
summary.vsec:hover{box-shadow:var(--sh-2)}
/* la sezione chiusa non lascia il vuoto della sua spaziatura */
.aSec:not([open])>summary.vsec{margin-bottom:0}
.aSecIn{padding-top:2px}
@media(pointer:coarse){summary.vsec{min-height:40px}}

/* --- meno cornici: dentro una sezione le righe non hanno bisogno di ripetere
   il proprio riquadro, ci pensa gia' la testata a raggrupparle --- */
.aSecIn>table{width:100%}

/* --- il percorso dell'atleta: la descrizione e' una riga di servizio, non un
   titolo. Su telefono si stringe invece di sparire — e' l'istruzione vera
   («si entra solo da qui, non dagli ingressi del pubblico»). --- */
@media(max-width:640px){
  .aStep{padding:8px 10px}
  .aStepT b{font-size:12.5px;line-height:1.25}
  .aStepT span{font-size:11px;line-height:1.35}
}

/* ===================== v66.3 — SULLA MAPPA DEGLI ATLETI RESTA UN COMANDO SOLO
   =============================================================================
   «Togli queste cose e metti solo il cambio mappa in basso a destra.» Nel
   viewer spariscono zoom, pannello Livelli, barra strumenti e vedi-tutto (la
   logica sta in citta.js); qui restano l'aspetto del bottone dello sfondo e la
   riga che nasconde il ⤢, che lo aggiunge safeFit in common.js e quindi non si
   puo' togliere da questa pagina se non cosi'. --------------------------- */
body.page-citta.viewer .mapAllBtn{display:none}

/* il bottone sta SOPRA il 📍 della posizione: sono i due comandi della mappa e
   stanno insieme, nell'angolo che il pollice raggiunge */
.cBgBtn{position:fixed;right:16px;bottom:calc(var(--ct-peek) + 62px);z-index:1450;
  display:inline-flex;align-items:center;gap:6px;height:38px;padding:0 14px;border:none;
  border-radius:99px;background:var(--carta);box-shadow:var(--sh-2);cursor:pointer;
  color:var(--ink);font-family:var(--font-display);font-style:italic;font-weight:800;
  text-transform:uppercase;letter-spacing:.03em;font-size:12px;
  transition:transform .1s,background .13s}
.cBgBtn:hover{background:var(--bg)}
.cBgBtn:active{transform:scale(.95)}
.cBgIc{font-style:normal;font-size:14px;line-height:1}
@media(min-width:821px){.cBgBtn{bottom:62px}}
@media print{.cBgBtn{display:none!important}}

/* ===================== v66.4 — ALLENAMENTI ≠ GARA
   =============================================================================
   I due tracciati portano agli hotel → STADIO: sono la strada degli
   allenamenti. Il giorno della gara la porta e' il CAMPO DI RISCALDAMENTO.
   La nota lo dice in testa alla sezione dei percorsi e dentro il popup del
   tracciato — filetto rosso e non un fondo colorato, cosi' si legge anche sul
   foglio stampato con «Grafica di sfondo» disattivata (Regola 6). ------- */
.ctNota{border-left:3px solid var(--rosso);background:var(--bg);border-radius:0 8px 8px 0;
  padding:8px 11px;margin:0 0 8px;font-size:11.5px;line-height:1.45;color:var(--ink2);font-weight:600}
.leaflet-popup-content .ctNota{max-width:230px;margin:0;font-size:11px}

/* ============================================================================
   v70 — LE LISTE DEL MATERIALE (#matDlg)
   Il guscio del modale e' quello della tribuna (.tribCard e compagne, v57):
   quelle classi descrivono un modale, non la tribuna, e riusarle vuol dire che
   una correzione al modale vale per tutti e due. Qui sotto c'e' SOLO la
   tabella, che e' l'unica cosa nuova.
   ========================================================================= */
.matCard { width: min(880px, 94vw); }
.matBox { max-height: calc(88vh - 150px); }
.matTot { font-size: 11px; font-weight: 800; color: var(--mut); white-space: nowrap; }
.matSec { margin-bottom: 14px; }
.matSec > .compHd { border-bottom: 1px solid var(--linea); padding-bottom: 4px; }
/* v70.1 — via il blocco «le altre categorie» e il suo <details>: in elenco
   restano le sole categorie che contano i pezzi, quindi non c'e' piu' niente
   di secondario da ripiegare (scelta di Giacomo). */
/* l'intestazione di una tipologia dentro la categoria */
/* align-items: center e non baseline, da quando la riga porta anche il 🗺 */
.matTip { display: flex; align-items: center; gap: 8px; margin: 8px 0 2px; }
.matTipN { font-size: 11.5px; font-weight: 800; color: var(--ink); }
.matTipQ { flex: 1; font-size: 10.5px; font-weight: 700; color: var(--mut); }
.matTbl { width: 100%; }
.matTbl td { padding: 3px 0; vertical-align: baseline; }
.matN { font-size: 11.5px; }
.matN i { color: var(--mut); font-size: 10.5px; }
.matQ { width: 96px; white-space: nowrap; }
.matQ b { font-size: 13px; font-weight: 800; }
/* la quantita' esclusa si VEDE, in grigio: escludere non e' nascondere, e un
   numero scritto a mano che sparisce senza dirlo e' peggio di un numero in piu' */
.matQoff { display: inline-block; font-size: 10px; font-weight: 700; color: var(--mut);
  border: 1px solid var(--linea); border-radius: 6px; padding: 0 5px; margin-left: 4px; white-space: nowrap; }
.matQno { color: var(--linea); }
.matM { width: 68px; font-size: 10.5px; color: var(--mut); text-align: right;
  white-space: nowrap; padding-right: 10px !important; }
.matD { width: 34%; font-size: 10.5px; color: var(--mut); font-weight: 700; }
/* «vicino a X · 28 m»: peso normale e piu' chiaro, o si leggerebbe come una
   zona vera — il pezzo li' dentro NON c'e'. Niente corsivo: su questo piano i
   due terzi delle righe cadono fuori da ogni zona, e un corsivo su due righe su
   tre non distingue piu' niente, pesa e basta. Bastano il peso e le parole
   «vicino a», che lo dicono per esteso. */
.matDvic { font-weight: 500; opacity: .72; }
.matZ { width: 28px; text-align: right; }
.matZoom { border: 1px solid var(--linea); background: #fff; border-radius: 6px; width: 24px; height: 24px;
  font-size: 11px; line-height: 1; cursor: pointer; color: var(--ink); padding: 0; }
.matZoom:hover { border-color: var(--rosso); }
/* il 🗺 sulle intestazioni: piu' piccolo dello 🔍 delle righe, perche' e' un
   comando di sezione e non deve competere con la colonna dei dati */
.matVista { border: 1px solid var(--linea); background: #fff; border-radius: 6px; padding: 1px 6px;
  font-size: 10px; line-height: 1.5; cursor: pointer; color: var(--ink); flex: none; }
.matVista:hover { border-color: var(--rosso); }
/* la riga che dice da dove vengono le richieste del villaggio, e dove si
   scrivono: qui si guarda e non si tocca (regola v53) */
.matVillNota { margin-top: 2px; }
.matVillGo { color: var(--rosso); text-decoration: none; font-weight: 800; }
.matVillGo:hover { text-decoration: underline; }
/* la nota dell'elemento, sotto la sua riga: e' li' che l'import QGIS ha lasciato
   dimensioni e quantita' che nessun campo raccoglie */
.matNota { font-size: 10px; color: var(--mut); padding: 0 0 4px 10px !important;
  border-left: 2px solid var(--linea); line-height: 1.35; }
/* la pastiglia «quali tipologie contano», accanto a «pezzi» in ⚙ Campi */
.schpzno { border: 1px solid var(--linea); background: #fff; border-radius: 6px; padding: 1px 6px;
  font-family: inherit; font-size: 10px; font-weight: 700; cursor: pointer; color: var(--ink); }
.schpzno.vuoto { color: var(--mut); }
.schpzno:hover { border-color: var(--rosso); color: var(--rosso); }
@media (max-width: 640px) {
  /* col dito la colonna «dove» e i metri stanno stretti: la tabella scorre
     DENTRO .matBox, che e' gia' un riquadro con overflow — la pagina no */
  .matD { width: auto; }
  .matZoom { width: 30px; height: 30px; }
}

/* ============================================================================
   v71 — MAPPA PUBBLICO, rifatta da zero (modulo autonomo, pubblico.js)
   La mappa e' un DISEGNO (SVG assonometrico in #pbStage) con i luoghi
   NUMERATI; il foglio in basso (#pbSheet) porta tappe e legenda per
   categoria con gli stessi numeri. Niente Leaflet: nessuna classe .leaflet-*.
   Stessa disciplina delle pagine mappa: --pb-top segue nav e cantiere,
   catena dichiarata su body (una variabile si risolve dove e' dichiarata).
   ============================================================================ */
:root{ --pb-top:12px; --pb-bar:42px; --pb-gap:8px; --pb-pills:36px; --pb-peek:172px; }
body.page-pubblico{ overflow:hidden; background:#e3e1d7;
  --pb-y-fasce:calc(var(--pb-top) + var(--pb-bar) + var(--pb-gap));
  --pb-y-fine:calc(var(--pb-y-fasce) + var(--pb-pills) + var(--pb-gap)); }
body.page-pubblico.hasTopnav{ --pb-top:66px }
body.page-pubblico.cantiere{ --pb-top:46px }
body.page-pubblico.cantiere.hasTopnav{ --pb-top:98px }
body.page-pubblico #app{ display:block; position:fixed; inset:0; }
#pbStage{ position:absolute; inset:0; overflow:hidden; touch-action:none; user-select:none; -webkit-user-select:none;
  background:radial-gradient(ellipse at 50% 40%, #f3f2ec 0%, #e3e1d7 60%, #d6d4c8 100%); cursor:grab; }
#pbStage:active{ cursor:grabbing }
#pbSvg{ position:absolute; left:0; top:0; display:block }
#pbSvg path{ vector-effect:non-scaling-stroke }
#pbSvg .pbTetto,#pbSvg .pbZona{ cursor:pointer }
#pbLay{ position:absolute; inset:0; pointer-events:none }
#pbLay>*{ pointer-events:auto }
/* i pin: disco numerato, goccia per le entrate (la punta E' la coordinata) */
.pbMk{ position:absolute; line-height:0; cursor:pointer; transform:translate(-17px,-17px); filter:drop-shadow(0 2px 3px rgba(0,0,0,.35)); transition:transform .12s }
.pbMk.big{ transform:translate(-18px,-47px) }
.pbMk:hover,.pbMk.hi{ transform:translate(-17px,-17px) scale(1.18); z-index:3 }
.pbMk.big:hover,.pbMk.big.hi{ transform:translate(-18px,-47px) scale(1.18) }
.pbMk.hi svg{ filter:drop-shadow(0 0 5px #fff) }
[data-drag]{ cursor:grab }
/* le scritte: solo entrate e parcheggi, pastiglia come le .lbl del portale */
.pbLbl{ position:absolute; visibility:hidden; font:800 11px/1.15 Montserrat,'Segoe UI',sans-serif; color:var(--ink);
  background:rgba(255,255,255,.94); border:1px solid #9a9aa4; border-radius:5px; padding:3px 6px; white-space:nowrap; max-width:150px;
  overflow:hidden; text-overflow:ellipsis; box-shadow:0 1px 2px rgba(0,0,0,.15); cursor:pointer }
.pbLbl.posta{ visibility:visible }
.pbLbl.in{ border-color:#0f9d58; color:#0b7a45 }
/* il cartellino al bordo per i luoghi fuori inquadratura */
.pbFuori{ position:absolute; transform:translate(-50%,-50%); display:flex; align-items:center; gap:5px; background:rgba(255,255,255,.96);
  border:1.5px solid; border-radius:99px; padding:3px 9px 3px 3px; font:800 11px/1 Montserrat,sans-serif; color:var(--ink); box-shadow:var(--sh-2); cursor:pointer; white-space:nowrap }
.pbFa{ display:inline-block; font-size:13px; line-height:1; color:var(--rosso) }
.pbFd{ font-size:9.5px; color:var(--mut); font-weight:700 }
.pbN{ display:inline-flex; align-items:center; justify-content:center; min-width:22px; height:22px; padding:0 4px; border-radius:99px;
  color:#fff; font:800 12px/1 'Roboto Condensed',Montserrat,sans-serif; box-shadow:0 0 0 1.5px #fff; flex:none }
/* «sei qui» */
.pbQui{ position:absolute; width:16px; height:16px; border-radius:50%; background:#1a73e8; border:3px solid #fff; transform:translate(-50%,-50%); box-shadow:0 0 0 6px rgba(26,115,232,.25); pointer-events:none }
/* popup sopra il pin */
.pbPop{ position:absolute; z-index:20; display:flex; align-items:center; gap:9px; background:var(--carta); border-radius:12px; box-shadow:var(--sh-2);
  padding:9px 34px 9px 10px; max-width:min(300px,calc(100% - 12px)); font-size:12.5px; animation:pbIn .14s ease-out }
@keyframes pbIn{ from{ opacity:0; transform:translateY(4px) } }
.pbPop .pbN{ width:30px; height:30px; font-size:15px }
.pbPopT{ display:flex; flex-direction:column; gap:2px; min-width:0 }
.pbPopT b{ font:800 14px/1.2 var(--font-display,Montserrat); letter-spacing:.01em }
.pbPopT span{ display:inline-flex; align-items:center; gap:4px; color:var(--mut); font-size:11px; font-weight:700 }
.pbPopX{ position:absolute; right:5px; top:5px; width:24px; height:24px; border:0; border-radius:50%; background:var(--bg); color:var(--mut); font-size:12px; cursor:pointer }
.pbPopX:hover{ background:#e6e6ec; color:var(--ink) }
/* comandi: in basso a destra, dove arriva il pollice */
#pbCtl{ position:absolute; right:12px; bottom:calc(var(--pb-peek) + 14px); z-index:15; display:flex; flex-direction:column; gap:6px }
#pbCtl button{ width:36px; height:36px; border-radius:50%; border:1px solid var(--linea); background:rgba(255,255,255,.94); color:var(--ink);
  font:700 16px/1 Montserrat,sans-serif; cursor:pointer; box-shadow:var(--sh-2); display:flex; align-items:center; justify-content:center; padding:0 }
#pbCtl button:hover{ border-color:var(--rosso); color:var(--rosso) }
@media(pointer:coarse){ #pbCtl button{ width:40px; height:40px } }
#pbScale{ position:absolute; left:14px; bottom:calc(var(--pb-peek) + 14px); z-index:15; color:#4b4b55; font:700 10px/1 Montserrat,sans-serif; pointer-events:none }
#pbScale i{ display:block; height:6px; border:1.5px solid #4b4b55; border-top:0; margin-bottom:3px }
#pbNord{ position:absolute; left:14px; top:calc(var(--pb-y-fine) + 6px); z-index:15; width:30px; height:30px; border-radius:50%; background:rgba(255,255,255,.9);
  box-shadow:var(--sh-1); display:flex; flex-direction:column; align-items:center; justify-content:center; font:800 11px/1 Montserrat,sans-serif; color:var(--rosso); pointer-events:none }
#pbNord span{ font-size:8px; color:var(--ink); margin-top:-1px }
/* barra in alto e fascia delle pillole */
#pbTop{ position:fixed; left:0; right:0; top:var(--pb-top); z-index:1400; display:flex; align-items:center; gap:10px; padding:0 14px; height:var(--pb-bar) }
#pbSearchWrap{ flex:1; min-width:0 }
#pbSearch{ width:100%; font-family:inherit; font-size:13px; font-weight:600; padding:11px 16px; border:none; border-radius:99px; background:var(--carta); box-shadow:var(--sh-2); outline:none; color:var(--ink) }
#pbSearch:focus{ box-shadow:0 0 0 2px var(--rosso),var(--sh-2) }
#pbTop #pbLang{ flex:none; background:rgba(255,255,255,.94); box-shadow:var(--sh-2) }
#pbTop #pbLang button{ font-family:var(--font-display,inherit); font-weight:800; font-size:11px; padding:6px 8px; min-width:34px }
#pbBands{ position:fixed; left:0; right:0; top:var(--pb-y-fasce); z-index:1395; height:var(--pb-pills); display:flex; align-items:center; padding:0 14px }
#pbPills{ display:flex; gap:6px; overflow-x:auto; scrollbar-width:none; height:100%; align-items:center; width:100%;
  mask:linear-gradient(90deg,#000 calc(100% - 28px),transparent); -webkit-mask:linear-gradient(90deg,#000 calc(100% - 28px),transparent) }
#pbPills::-webkit-scrollbar{ display:none }
.pbPill{ flex:none; display:inline-flex; align-items:center; gap:5px; font:italic 800 11.5px/1 var(--font-display,Montserrat); text-transform:uppercase; letter-spacing:.02em;
  padding:0 13px; height:34px; border-radius:99px; border:none; background:rgba(255,255,255,.94); color:var(--ink); box-shadow:var(--sh-1); cursor:pointer; white-space:nowrap; --c:var(--ink) }
.pbPill.on{ background:var(--c); color:#fff }
.pbPill.on .pbIc path{ stroke:#fff }
/* il foglio: tre scatti sul telefono, colonna a sinistra su desktop */
#pbSheet{ position:fixed; left:0; right:0; bottom:0; background:var(--carta); border-radius:20px 20px 0 0; box-shadow:0 -8px 30px rgba(21,21,40,.22); z-index:1400;
  height:84vh; max-height:84vh; overflow:hidden; display:flex; flex-direction:column; transform:translateY(calc(100% - var(--pb-peek))); transition:transform .3s cubic-bezier(.22,.9,.3,1); touch-action:none }
#pbSheet.sheetDrag{ transition:none }
#pbGrab,#pbHead,#pbTools{ flex:none }
#pbGrab{ display:flex; align-items:center; justify-content:center; padding:10px 0 6px; cursor:grab; touch-action:none }
#pbGrab::before{ content:""; width:42px; height:5px; border-radius:99px; background:#d2d2da }
#pbHead{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:0 14px 8px; min-height:0 }
#pbHead:empty{ display:none }
#pbBrand{ height:30px; width:auto }
#pbToday{ display:flex; align-items:center; gap:7px; background:var(--bg); border-radius:12px; padding:5px 11px; font-size:12px }
#pbToday:empty{ display:none }
.pbWic{ font-size:18px; line-height:1 } #pbToday b{ font-size:16px; font-weight:800 } .pbWlb{ color:var(--mut); font-weight:700; font-size:11px } .pbWmm{ color:var(--mut); font-size:10.5px; font-weight:700 }
#pbTools{ display:flex; gap:6px; justify-content:flex-end; padding:0 14px 8px; flex-wrap:wrap }
#pbTools:empty{ display:none }
#pbBody{ flex:1; min-height:0; overflow-y:auto; padding:2px 14px 90px }
/* sezioni a scomparsa, legenda, tappe */
.pbSec{ margin:0 0 8px } .pbSec[open]{ margin-bottom:12px }
.pbSum{ list-style:none; display:flex; align-items:center; gap:8px; padding:8px 0; cursor:pointer; border-bottom:1px solid var(--linea) }
.pbSum::-webkit-details-marker{ display:none }
.pbSum::after{ content:"\203A"; margin-left:auto; color:var(--mut); font-size:18px; line-height:1; transform:rotate(90deg); transition:transform .15s }
.pbSec[open]>.pbSum::after{ transform:rotate(-90deg) }
.pbSecT{ display:inline-flex; align-items:center; gap:6px; font:italic 800 14px/1.1 var(--font-display,Montserrat); text-transform:uppercase; letter-spacing:.02em; color:var(--c,var(--ink)) }
.pbSecZ{ font-size:11px; font-weight:800; color:var(--mut); background:var(--bg); border-radius:99px; padding:3px 8px }
.pbSecIn{ padding-top:4px }
.pbRow{ display:flex; align-items:center; gap:9px; padding:7px 4px; border-bottom:1px solid var(--bg); cursor:pointer; border-radius:8px }
.pbRow:hover{ background:var(--bg) }
.pbRow .pbN{ min-width:26px; height:26px; font-size:13px }
.pbRn{ flex:1; min-width:0; font-size:13px; font-weight:700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
.pbRt{ flex:none; display:inline-flex; align-items:center; gap:4px; font-size:10.5px; font-weight:700; color:var(--mut); max-width:42%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
.pbStep{ display:flex; align-items:flex-start; gap:10px; padding:8px 4px; border-bottom:1px solid var(--bg); cursor:pointer; border-radius:8px }
.pbStep:hover{ background:var(--bg) }
.pbStep>div{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px }
.pbStep b{ font:800 13px/1.2 var(--font-display,Montserrat); text-transform:uppercase; letter-spacing:.01em }
.pbStep span{ font-size:11.5px; color:var(--mut); font-weight:600; line-height:1.4 }
.pbStepN{ flex:none; width:26px; height:26px; border-radius:50%; background:var(--rosso); color:#fff; display:flex; align-items:center; justify-content:center; font:800 13px/1 'Roboto Condensed',Montserrat,sans-serif }
.pbStep .pbIc{ flex:none; margin-top:3px }
.pbEmpty{ padding:26px 10px; text-align:center; color:var(--mut); font-size:12.5px; font-weight:600; line-height:1.5 }
.pbNota{ margin:10px 0 0; font-size:10.5px; color:var(--mut); font-weight:600; line-height:1.4 }
.pbIc{ flex:none; vertical-align:-3px }
@media(min-width:821px){
  #pbTop,#pbBands{ left:428px }
  #pbSheet{ left:14px; right:auto; bottom:14px; top:var(--pb-top); width:400px; border-radius:16px; transform:none!important; transition:none; height:auto; max-height:none; touch-action:auto; box-shadow:var(--sh-2) }
  #pbGrab{ display:none }
  #pbHead{ padding-top:12px }
  #pbCtl,#pbScale{ bottom:16px }
}
@media(max-width:640px){
  #pbTop{ gap:6px; padding:0 10px } #pbBands{ padding:0 10px }
  #pbTop #pbLang button{ padding:5px 6px; font-size:10.5px; min-width:30px }
}
/* il pannello «Dal Generale stadio» (solo editor) */
#pbPiano{ position:fixed; inset:0; z-index:3000; background:rgba(20,20,40,.45); display:flex; align-items:center; justify-content:center; padding:14px }
.pbPianoCard{ background:var(--carta); border-radius:14px; box-shadow:var(--sh-2); width:min(860px,100%); max-height:92vh; display:flex; flex-direction:column; overflow:hidden }
.pbPianoHd{ display:flex; align-items:center; gap:12px; padding:14px 16px; border-bottom:1px solid var(--linea); position:relative }
.pbPianoHd b{ font:italic 800 18px/1 var(--font-display,Montserrat); text-transform:uppercase }
.pbPianoHd span{ font-size:11.5px; color:var(--mut); font-weight:700 }
.pbPianoHd .pbPopX{ position:absolute; right:12px; top:12px }
.pbPianoAvv{ margin:10px 16px 0; border-left:3px solid var(--rosso); background:var(--bg); padding:7px 10px; font-size:11.5px; font-weight:600; line-height:1.4; border-radius:0 8px 8px 0 }
.pbPianoTb{ display:flex; gap:12px; align-items:center; padding:10px 16px 6px; font-size:12px; font-weight:700 }
.pbPianoTb #pbPianoQ{ flex:1; font:inherit; padding:6px 10px; border:1px solid var(--linea); border-radius:8px }
.pbPianoLs{ flex:1; min-height:0; overflow:auto; padding:0 16px 10px }
.pbPianoL{ font:italic 800 12px/1 var(--font-display,Montserrat); text-transform:uppercase; color:var(--mut); padding:12px 0 5px; border-bottom:1px solid var(--linea); margin-bottom:3px }
.pbPianoR{ display:grid; grid-template-columns:22px minmax(0,1.4fr) minmax(0,1fr) 130px 30px; align-items:center; gap:8px; padding:5px 4px; border-bottom:1px solid var(--bg); font-size:12.5px; opacity:.62 }
.pbPianoR.on{ opacity:1 }
.pbPianoR input[type=checkbox]{ width:18px; height:18px; margin:0 }
.pbPianoN{ font-weight:700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap } .pbPianoN i{ color:var(--mut); font-style:normal }
.pbPianoT{ font-size:11px; color:var(--mut); font-weight:700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
.pbPianoR select{ font:inherit; font-size:12px; padding:4px 6px; border:1px solid var(--linea); border-radius:7px; background:var(--carta) }
.pbPianoTr{ width:28px; height:28px; border:1px solid var(--linea); border-radius:7px; background:var(--carta); cursor:pointer; font-size:13px; padding:0 }
.pbPianoR.tr .pbPianoTr{ background:var(--ink); color:#fff }
.pbPianoTrIn{ display:none; grid-column:2/6; gap:8px }
.pbPianoR.tr .pbPianoTrIn{ display:flex; flex-wrap:wrap }
.pbPianoTrIn label{ display:flex; align-items:center; gap:5px; font-size:11px; font-weight:800; color:var(--mut); flex:1; min-width:140px }
.pbPianoTrIn input{ flex:1; font:inherit; font-size:12px; padding:4px 8px; border:1px solid var(--linea); border-radius:7px; min-width:0 }
.pbPianoFt{ display:flex; justify-content:flex-end; gap:8px; padding:10px 16px; border-top:1px solid var(--linea) }
@media(max-width:640px){ .pbPianoR{ grid-template-columns:22px minmax(0,1fr) 110px 30px } .pbPianoT{ display:none } .pbPianoTrIn{ grid-column:2/5 } }
/* stampa (printDocShow): due fogli, disegno+legenda e tappe */
body.pPrinting #pbStage,body.pPrinting #pbTop,body.pPrinting #pbBands,body.pPrinting #pbSheet,body.pPrinting #topnav,body.pPrinting #cantiereBar,body.pPrinting #pbPiano{ display:none!important }
.pbPTav{ margin:4mm 0 3mm } .pbPTav svg{ width:100%!important; height:150mm!important }
.pbPLeg{ display:grid; grid-template-columns:1fr 1fr; gap:3mm 8mm; font-size:10.5pt }
.pbPLegCat b{ display:flex; align-items:center; gap:2mm; font:italic 800 11pt/1 var(--font-display,Montserrat); text-transform:uppercase; margin:0 0 2mm }
.pbPLegRow{ display:flex; align-items:center; gap:2.5mm; padding:1mm 0 } .pbPLegRow .pbN{ box-shadow:none; -webkit-print-color-adjust:exact; print-color-adjust:exact }
.pbPSteps{ display:flex; flex-direction:column; gap:4mm; margin-top:4mm }
.pbPStep{ display:flex; gap:4mm; align-items:flex-start; font-size:11pt } .pbPStep>div{ display:flex; flex-direction:column; gap:1mm } .pbPStep b{ font:800 12pt/1.2 var(--font-display,Montserrat); text-transform:uppercase } .pbPStep span{ color:#444 }
.pbPStep .pbStepN{ -webkit-print-color-adjust:exact; print-color-adjust:exact }

/* ===== v72.2 — Sicurezza, riquadro «Timbro sulla mano» (SVG + numeri) ===== */
.sicTimbro{display:flex;align-items:center;gap:16px;margin:6px 0 16px;padding:12px 14px;border:1.5px solid var(--rosso);border-radius:12px;background:var(--bg)}
.sicTimbroImg{width:150px;flex:none;height:auto}
.sicTimbroTxt{display:flex;flex-direction:column;gap:6px;min-width:0}
.sicTimbroH{font:italic 800 15px/1.1 var(--font-display,Montserrat);text-transform:uppercase;color:var(--rosso)}
.sicTimbroNum{display:flex;gap:18px;flex-wrap:wrap}
.sicTimbroNum span{display:flex;align-items:baseline;gap:6px;font-size:12px;color:var(--ink2,#4b4b55);text-transform:uppercase;letter-spacing:.04em}
.sicTimbroNum b{font:italic 800 30px/1 var(--font-display,Montserrat);color:var(--ink)}
.sicTimbroSub{font-size:12.5px;line-height:1.45;color:var(--ink2,#4b4b55)}
@media (max-width:640px){.sicTimbro{flex-direction:column;align-items:flex-start}.sicTimbroImg{width:120px}}
.pAccTxt .sicTimbro{margin:5mm 0 0;padding:3mm 4mm;border-width:.5pt;background:none;break-inside:avoid}
.pAccTxt .sicTimbroImg{width:38mm}
.pAccTxt .sicTimbroH{font-size:11pt}.pAccTxt .sicTimbroNum b{font-size:20pt}.pAccTxt .sicTimbroNum span{font-size:9pt}.pAccTxt .sicTimbroSub{font-size:9.5pt}
