/* ══════════════════════════════════════════════════════════════════════════
   Flipping Club — AREA SCHEDA OPERAZIONE (nuovo design, PR 5-8, un file solo)
   ══════════════════════════════════════════════════════════════════════════
   Spec docs/superpowers/specs/2026-09-17-nuovo-design-design.md §4.5, §6.1-6.2.
   design-05 (cornice): i tre modali #opModal, #genModal, #ddModal (.modal-*),
   testata della scheda, fasi a chip (.wiz-step), selettore di fase da telefono
   (.wiz-sel), barra Stato e azioni, riepilogo delle completate, barra dei
   pulsanti, dialoghi dei gate, modale date DD, risorse Drive ed Email scritte
   da opmodal.js, modale di conflitto. design-06/07/08 aggiungono qui il
   contenuto dei passi.
   Regole (tests/area-opmodal.test.js):
   - solo token: niente hex, niente rgba, niente !important, niente
     font-family, niente rem;
   - forma e misure di .modal-overlay, .modal e .modal-body SOLO dentro
     @media screen: la Decisione si stampa dal modale (@media print di
     css/stampa.css, con !important) e un max-height o un flex la troncherebbero;
   - ogni :hover dentro @media (hover:hover); ogni @media con larghezza
     comincia con "screen and" (la pagina A4 è larga 741 px);
   - si carica dopo area-pipeline.css e prima di area-shell.css, che resta
     l'ULTIMO foglio: i selettori con transition/animation di questo file
     stanno anche nel blocco "Riduci movimento" in coda ad area-shell.css;
   - da telefono i bottoni della cornice dentro #opModalBody ricevono
     #opModalBody button a (1,0,1) (in testa a questo foglio, era in mobile.css):
     dove serve un allineamento diverso, la regola qui porta il prefisso #opModalBody.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Da telefono: le regole della scheda che erano in css/mobile.css (cancellato nella PR 15,
   Task 3) ──
   In testa al foglio, prima di ogni regola dell'area: mobile.css si caricava prima di
   area-opmodal.css, quindi a pari peso le regole dell'area qui sotto vincono come prima.
   - Fasi (.wiz-step): solo la larghezza minima a 44 px. L'altezza resta 32 px da telefono
     (la regola di .wiz-step più giù, a pari peso, la teneva a 32 anche prima): domanda aperta
     a Fede nella PR 15. Con un dito (hover:none) le fasi sono a 44 px.
   - Bottoni, label con il file, date e select generati nel JS del corpo della scheda: si
     raggiungono per struttura. La regola con :has() sta da sola: un browser che non lo
     conosce scarta solo quella.
   - Varianti ai lavori: una colonna, campi a tutta larghezza, rata alta 44 px. Le radici
     (#cantVariantiRoot, #cantRoot) servono a battere le regole dell'area a pari peso.
   - «Aggiungi un impianto» delle Foto sottotraccia (.cchiu-altro>summary) a 44 px.
   - Checklist: la casella sta in label.op-cl-check, 44×44; i margini negativi tengono la riga
     alta 44 (44 - 2×5 = 34 px dentro la riga, che ha 4 px di padding e 1 px di bordo sopra e
     sotto) e a sinistra recuperano gli 8 px di padding della riga. Il 📎 del file caricato e
     la cartella Drive in testa a Checklist e Segnalazione a 44 px; gli altri link dentro il
     testo restano esclusi. */
@media screen and (max-width:768px){
  .wiz-step{min-width:44px}
  #opModalBody button{min-height:44px;min-width:44px;display:inline-flex;align-items:center;justify-content:center}
  #opModalBody label:has(input[type=file]){min-height:44px;min-width:44px;display:inline-flex;align-items:center;justify-content:center}
  #opModalBody input[type=date]{min-height:44px;min-width:44px}
  #opModalBody select{min-height:44px;min-width:44px}
  #cantVariantiRoot .cvar-riga-dettaglio{grid-template-columns:minmax(0,1fr)}
  #cantVariantiRoot .cvar-data input,#cantVariantiRoot .cvar-modulo .cchiu-campo input,
  #cantVariantiRoot .cvar-modulo .cchiu-campo select,#cantVariantiRoot .cvar-modulo .cchiu-campo textarea,
  #cantVariantiRoot .cvar-decisione .cchiu-campo select,#cantVariantiRoot .cvar-decisione textarea,#cantVariantiRoot .cvar-azione textarea{max-width:none}
  #cantRoot .cvar-rata{min-height:44px;padding:7.6px 11.4px;font-size:12.35px}
  #opModalBody .cchiu-altro>summary{min-height:44px;padding:12.35px 0;box-sizing:border-box}
  #opModalBody .op-cl-check{min-height:44px;min-width:44px;display:inline-flex;align-items:center;justify-content:center;flex:none;margin:-5px 0 -5px -8px}
  #opModalBody .op-cl-voce a.op-cl-link,#opModalBody .op-box.op-riga>a.op-link{min-height:44px;min-width:44px;display:inline-flex;align-items:center;justify-content:center}
}

/* ── I tre modali: velo, foglio, barra in alto, corpo ── */
@keyframes fcSheetIn{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
@media screen{
  .modal-overlay{inset:0;align-items:flex-start;padding:var(--sp-6) var(--sp-5);overflow-y:auto}
  .modal{display:flex;flex-direction:column;width:100%;max-width:960px;max-height:calc(100vh - 2 * var(--sp-6));max-height:calc(100dvh - 2 * var(--sp-6));overflow:hidden;border:.5px solid var(--fc-sep);animation:fcSheetIn .22s ease}
  .modal-body{flex:1 1 auto;min-height:0;padding:var(--sp-5);overflow-y:auto;overscroll-behavior:contain}
  #genModal .modal{max-width:720px}
  #ddModal .modal{max-width:560px}
}
.modal-top{flex:none;gap:var(--sp-3);min-height:56px;padding:var(--sp-2) var(--sp-3) var(--sp-2) var(--sp-5);border-bottom:.5px solid var(--fc-sep);background:var(--fc-card)}
.modal-title{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:var(--sp-2);row-gap:2px;flex:1 1 auto;min-width:0;font-size:17px;line-height:22px;color:var(--fc-label)}
.modal-title em{font-style:italic;color:var(--fc-label)}
.modal-close{display:inline-flex;align-items:center;justify-content:center;flex:none;width:36px;height:36px;padding:0;border-radius:50%;font-size:15px;line-height:1}
.modal-close:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
@media (hover:hover){.modal-close:hover{background:var(--fc-rail)}}
@media (hover:none){.modal-close{width:44px;height:44px}}
@media screen and (min-width:769px){
  .modal-overlay{left:var(--sidebar-w)}
}
@media screen and (max-width:768px){
  .modal-overlay{left:0;padding:0;align-items:stretch;overflow:hidden;overscroll-behavior:contain}
  .modal{max-width:none;height:100vh;height:100dvh;max-height:none;border:0;border-radius:0}
  #genModal .modal,#ddModal .modal{max-width:none}
  .modal-top{padding:calc(var(--sp-2) + var(--fc-safe-top)) var(--sp-2) var(--sp-2) var(--sp-4)}
  .modal-body{padding:var(--sp-3) var(--sp-4) calc(var(--sp-3) + var(--fc-safe-bottom))}
}

/* ── Posizione, fasi a chip, selettore di fase da telefono (design-05) ──
   .wiz-step resta la classe delle voci (JS e test la usano), cambia l'aspetto:
   pillola. Da scrivania vanno a capo, nessuna si nasconde (decisione C1 del
   30/07); da telefono, bandiera spenta, una riga che scorre; bandiera accesa,
   il selettore .wiz-sel (il markup c'è sempre, è il CSS a scegliere). */
.op-wiz-pos{margin-bottom:var(--sp-2);font-size:12px;line-height:16px;color:var(--fc-label2)}
.op-wiz-pos b{font-weight:600;color:var(--fc-label)}
.wizard-nav{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:0 0 var(--sp-4)}
.wiz-step{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:0 var(--sp-3);border:.5px solid transparent;border-radius:var(--r-pill);background:var(--fc-fill);color:var(--fc-label);font-size:13px;line-height:18px;font-weight:600;white-space:nowrap;cursor:pointer;transition:background-color .15s,color .15s}
.wiz-step.done{background:var(--fc-accent-soft);color:var(--fc-accent)}
.wiz-step.future{border-color:var(--fc-sep);background:var(--fc-card);color:var(--fc-label2)}
.wiz-step.active{background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.wiz-step:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
@media (hover:hover){.wiz-step:not(.active):hover{background:var(--fc-accent-soft);color:var(--fc-accent)}}
@media (hover:none){.wiz-step{min-height:44px}}
.wiz-sel,.wiz-sel-list{display:none}
@media screen and (max-width:768px){
  /* Da bordo a bordo: il corpo ha 16 px ai lati (Task 2), e senza il margine negativo il testo
     che scorre passava sotto, accanto alla riga fissa (review della rev. 1, M9). Lo sticky si
     ferma dentro il padding del corpo: top negativo pari al padding (12 px), o il testo scorre
     in una fascia fra la barra in alto e i chip (smoke a 390). */
  .wizard-nav:not(.fasi){position:sticky;top:calc(-1 * var(--sp-3));z-index:1;flex-wrap:nowrap;overflow-x:auto;scroll-snap-type:x proximity;scroll-padding-inline:var(--sp-4);scrollbar-width:none;margin:0 calc(-1 * var(--sp-4)) var(--sp-3);padding:var(--sp-1) var(--sp-4) var(--sp-2);background:var(--fc-card)}
  .wizard-nav:not(.fasi)::-webkit-scrollbar{display:none}
  .wizard-nav:not(.fasi) .wiz-step{flex:none;scroll-snap-align:start}
  .wizard-nav.fasi{display:none}
  .wiz-sel{display:flex;align-items:stretch;position:sticky;top:calc(-1 * var(--sp-3));z-index:2;margin-bottom:var(--sp-3);overflow:hidden;border:.5px solid var(--fc-sep);border-radius:var(--r);background:var(--fc-card)}
  .wiz-sel-arrow{flex:0 0 44px;border:0;background:var(--fc-card);color:var(--fc-label2);font-size:20px;line-height:1;cursor:pointer}
  .wiz-sel-arrow:first-child{border-right:.5px solid var(--fc-sep)}
  .wiz-sel-arrow:last-child{border-left:.5px solid var(--fc-sep)}
  /* Freccia disabilitata: --fc-label3 (2,21:1) è ammesso, un controllo disabilitato è esente da WCAG 1.4.3 (M6). */
  .wiz-sel-arrow:disabled{color:var(--fc-label3);cursor:default}
  .wiz-sel-cur{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px;padding:var(--sp-2) var(--sp-3);border:0;background:var(--fc-accent-fill);color:var(--fc-on-accent);cursor:pointer}
  .wiz-sel-cur .n{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase}
  .wiz-sel-cur .l{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:700}
  .wiz-sel-list{display:block;margin:calc(-1 * var(--sp-2)) 0 var(--sp-3);overflow:hidden;border:.5px solid var(--fc-sep);border-radius:var(--r);background:var(--fc-card)}
  .wiz-sel-voce{display:flex;align-items:center;gap:var(--sp-2);width:100%;min-height:44px;padding:var(--sp-2) var(--sp-3);border:0;border-bottom:.5px solid var(--fc-sep);background:var(--fc-card);color:var(--fc-label);font-size:15px;text-align:left;cursor:pointer}
  /* #opModalBody button (1,0,1) in testa al foglio le centrava: il prefisso (1,1,0) le rimette a sinistra. */
  #opModalBody .wiz-sel-voce{display:flex;justify-content:flex-start}
  .wiz-sel-voce:last-child{border-bottom:0}
  .wiz-sel-voce .mark{display:flex;align-items:center;justify-content:center;flex:0 0 20px;height:20px;border:1.5px solid var(--fc-sep);border-radius:50%;color:var(--fc-label2);font-size:11px}
  .wiz-sel-voce.done .mark{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-accent)}
  .wiz-sel-voce.active{background:var(--fc-accent-fill);color:var(--fc-on-accent);font-weight:700}
  .wiz-sel-voce.active .mark{border-color:var(--fc-on-accent);color:var(--fc-on-accent)}
  .wiz-sel-voce.future{color:var(--fc-label2)}
  .wiz-sel-voce.future .mark{border-style:dashed}
}

/* ── Testata della scheda: codice, indirizzo, stato, presenza (design-05) ── */
.op-title-id{font-size:13px;line-height:22px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--fc-label2)}
.modal-title .addr{min-width:0;overflow-wrap:anywhere;font-size:17px;line-height:22px;color:var(--fc-label)}
.op-title-st{display:inline-flex;align-items:center;gap:6px;font-size:13px;line-height:22px;font-weight:600;color:var(--fc-label)}
.op-title-st .status-dot{margin:0}
.op-title-storico{font-size:11px;font-weight:700;letter-spacing:.06em}
.op-presence{flex:0 1 auto;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:2px var(--sp-2);border-radius:var(--r-pill);background:var(--fc-warn-soft);color:var(--fc-warn);font-size:12px;font-weight:600}
/* Vuoto resta nell'albero dell'accessibilità ma non si vede e non occupa spazio: con hidden
   (display:none) la regione aria-live non esisteva e lo screen reader non leggeva il testo
   che arrivava insieme alla comparsa. Assoluto: fuori dal gap della barra in alto. */
.op-presence:empty{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip-path:inset(50%)}

/* ── Barra Stato e azioni (#opStatusBar): tendina, risorse, Storico, PDF, Elimina ── */
.op-statusbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-4)}
.op-stato-lbl{font-size:12px;font-weight:600;color:var(--fc-label2)}
.op-stato-sel{min-height:36px;padding:0 var(--sp-3);border:.5px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px}
.op-azioni{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-left:auto}
.op-risorse{display:inline-flex;gap:var(--sp-1)}
.op-risorsa{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;min-width:36px;padding:0;border:.5px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:15px;line-height:1;cursor:pointer}
.op-risorsa.is-open{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label);box-shadow:inset 0 0 0 1px var(--fc-accent)}
.op-risorsa:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
.op-pdf{position:relative;display:inline-block}
.op-pdf>summary{list-style:none;cursor:pointer}
.op-pdf>summary::-webkit-details-marker{display:none}
.op-pdf-menu{position:absolute;right:0;z-index:50;min-width:160px;margin-top:2px;overflow:hidden;border:.5px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);box-shadow:var(--fc-shadow)}
/* Il prefisso batte #opModalBody button (1,0,1) in testa al foglio, che le centrava. */
#opModalBody .op-pdf-voce{display:flex;align-items:center;justify-content:flex-start;width:100%;min-height:36px;padding:var(--sp-2) var(--sp-3);border:0;background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px;text-align:left;cursor:pointer}
@media (hover:hover){
  .op-risorsa:hover{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
  #opModalBody .op-pdf-voce:hover{background:var(--fc-fill)}
}
@media (hover:none){
  .op-risorsa{width:44px;height:44px;min-width:44px}
  .op-stato-sel{min-height:44px}
  /* Il prefisso sopra batte anche i 44 px di #opModalBody button (in testa al foglio): al tocco si rimettono qui. */
  #opModalBody .op-pdf-voce{min-height:44px}
}
@media screen and (max-width:768px){
  /* A 390 px tendina, tre icone e tre bottoni non stanno su una riga: le azioni vanno sotto, a tutta larghezza. */
  .op-azioni{width:100%;margin-left:0;justify-content:flex-start}
}

/* ── Corpo della scheda: sblocco di una completata, BP in caricamento, barra dei pulsanti (design-05) ──
   .fc-modal-actions la usano anche le barre dei passi (opmodal-steps, -finance,
   -gestione) con uno style="display:flex;gap:.5rem;margin-top:1rem" che se ne
   va nelle PR 6-8: fino ad allora l'inline vince su gap e margine, il resto è qui. */
.op-unlock{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-4);padding:var(--sp-2) var(--sp-3);border:.5px solid var(--fc-warn-fill);border-radius:var(--rs);background:var(--fc-warn-soft);color:var(--fc-label)}
.op-unlock-ico{flex:none;font-size:18px}
.op-unlock-txt{flex:1;min-width:0}
.op-unlock-t{font-size:13px;font-weight:700;color:var(--fc-warn)}
.op-unlock-s{font-size:12px;color:var(--fc-label)}
.op-bp-loading{padding:var(--sp-6);text-align:center;font-size:13px;color:var(--fc-label2)}
.op-bp-err{color:var(--fc-danger)}
.fc-modal-actions{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-4)}
/* Le barre dei passi hanno già style="flex:1" sul verde: identico fino alle PR 6-8 (M11).
   Verde pieno su --fc-accent-fill: in chiaro uguale a .btn-green (era in style.css, #1B5E20),
   in scuro #2E7D32 con bianco (5,13:1) al posto di bianco su #81C784 (1,98:1) (I4). */
.fc-modal-actions .btn-green,.drv-tools .btn-green,.drv-empty .btn-green{background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.fc-modal-actions .btn-green{flex:1 1 auto;width:auto} /* width:auto contro il width:100% di .btn-green (base.css, era in style.css), o la base auto è tutta la riga; base auto, non 0: se l'etichetta non ci sta va a capo intera; con flex:1 (base 0) a 375 px "Avanti → Ricerca Mercato" finiva schiacciato in 57 px (smoke PR 6a) */
@media screen and (max-width:768px){
  /* Fissa in fondo al corpo, sopra la safe-area (era mobile.css blocco 6). Scarto negativo pari al
     padding in fondo al corpo: con bottom:0 il testo scorreva sotto la barra (smoke a 390). */
  .modal-body .fc-modal-actions{position:sticky;bottom:calc(-1 * (var(--sp-3) + var(--fc-safe-bottom)));z-index:2;padding:var(--sp-2) 0 calc(var(--sp-2) + var(--fc-safe-bottom));border-top:.5px solid var(--fc-sep);background:var(--fc-card)}
}

/* ── Riepilogo di un'operazione completata (vista storico, design-05) ──
   .stats-row/.stat-card/.stat-val/.stat-lbl sono di base.css (pezzi comuni, design-13a):
   qui, solo dentro .op-storico, il bordo e l'ombra di .stat-card e i colori di .stat-val
   (dalla 13a l'ombra coincide con base.css, nessuna; il bordo no: qui .5px, in base.css 1px).
   .op-sto-card batte .card di base.css per ordine. La tabella ridefinisce thead/th/td di base.css. */
.op-sto-banner{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border:.5px solid var(--fc-accent);border-radius:var(--rs);background:var(--fc-accent-soft);color:var(--fc-accent);font-size:13px;font-weight:600}
.op-sto-ico{flex:none;font-size:18px}
.unlock-bar{display:flex;align-items:center;gap:var(--sp-3);margin:var(--sp-2) 0 var(--sp-4);padding:var(--sp-2) var(--sp-3);border:.5px solid var(--fc-accent);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);cursor:pointer}
.unlock-bar-t{font-size:13px;font-weight:700;color:var(--fc-accent)}
.unlock-bar-s{font-size:12px;color:var(--fc-label2)}
@media (hover:hover){.unlock-bar:hover{background:var(--fc-bg)}}
.op-storico .stats-row{margin-bottom:var(--sp-3)}
.op-storico .stat-card{border:.5px solid var(--fc-sep);box-shadow:none}
.op-storico .stat-val{color:var(--fc-label)}
.op-storico .stat-val.is-pos{color:var(--fc-ok)}
.op-storico .stat-val.is-zero{color:var(--fc-label2)}
.op-storico .op-sto-city{font-size:15px}
.op-sto-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-3);margin-bottom:var(--sp-3)}
.op-sto-card{padding:var(--sp-3) var(--sp-4);border:.5px solid var(--fc-sep);background:var(--fc-card);color:var(--fc-label);box-shadow:none}
.op-sto-unita{margin-bottom:var(--sp-3)}
.op-sto-lbl{margin-bottom:var(--sp-2);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--fc-label2)}
.op-sto-addr{font-size:15px;font-weight:600}
.op-sto-sub{margin-top:2px;font-size:13px;color:var(--fc-label2)}
.op-sto-maps{display:inline-flex;align-items:center;gap:4px;margin-top:var(--sp-2);font-size:13px;font-weight:600;color:var(--fc-accent);text-decoration:none}
.op-sto-row{margin-bottom:2px;font-size:13px}
.op-sto-st{display:inline-flex;align-items:center;gap:6px;margin-top:var(--sp-2);font-size:13px;font-weight:600}
.op-sto-st .status-dot{margin:0}
.op-sto-scroll{overflow-x:auto}
.op-sto-table{width:100%;border-collapse:collapse;font-size:13px}
.op-sto-table thead{background:none}
.op-sto-table th{padding:var(--sp-2);border-bottom:.5px solid var(--fc-sep);color:var(--fc-label2);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;text-align:left;white-space:nowrap}
.op-sto-table tbody tr,.occ-table tbody tr{border-bottom:0} /* tbody tr di base.css: 1 px che vince sul filetto della cella */
.op-sto-table td{padding:var(--sp-2);border-bottom:.5px solid var(--fc-sep);color:var(--fc-label);font-size:13px}
.op-sto-table tfoot td{border-top:2px solid var(--fc-sep);border-bottom:0}
.op-sto-table .num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.op-sto-table .is-b{font-weight:700}
.op-sto-table .is-muted{color:var(--fc-label2)}
.op-sto-table .op-sto-tot{font-weight:800;color:var(--fc-accent)}
.op-sto-foot{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);font-size:12px;color:var(--fc-label2)}
.op-sto-foot .is-b{font-weight:600}
@media screen and (max-width:768px){.op-sto-grid{grid-template-columns:1fr}}

/* ── Dialoghi dei gate e dello scarto (fcConfirm con corpo HTML, design-05) ──
   Il dialogo è di base.css (.fc-confirm-*); qui solo il corpo. Le <li> restano
   nude: i test dei gate le leggono con /<li>(.*?)<\/li>/. */
.gate-intro{margin-bottom:var(--sp-2)}
.gate-box{margin-bottom:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-left:3px solid var(--fc-rail);border-radius:var(--rs);background:var(--fc-fill);color:var(--fc-label);font-size:14px;line-height:20px}
.gate-box[data-level="danger"]{border-left-color:var(--fc-danger);background:var(--fc-danger-soft);color:var(--fc-label)}
.gate-box[data-level="warn"]{border-left-color:var(--fc-warn-fill);background:var(--fc-warn-soft);color:var(--fc-label)}
.gate-box-h{margin-bottom:var(--sp-1);font-weight:600}
.gate-list{margin:0;padding-left:var(--sp-5)}
.gate-note{margin-top:var(--sp-2);font-size:13px;color:var(--fc-label2)}
.fc-confirm-msg .fg:last-child{margin-bottom:0}
.fc-confirm-msg .fg textarea{resize:vertical}
/* I campi sui token: .fg select/textarea di style.css:54 avevano #F8F8F6 scritto a mano e il
   testo --fc-label, in scuro bianco su quasi bianco (review della rev. 1, I2). (0,2,1) batte
   (0,1,1) per ordine e specificità; il focus rimette il bordo verde. */
.fc-confirm-msg .fg select,.fc-confirm-msg .fg textarea{border-color:var(--fc-sep);background:var(--fc-card);color:var(--fc-label)}
.fc-confirm-msg .fg select:focus,.fc-confirm-msg .fg textarea:focus{border-color:var(--fc-accent)}
/* «Richiedi eliminazione» (op-delete-request.js): etichetta e campo dentro il messaggio, come in
   Scarta e in Cantiere chiuso fuori app. Fuori, nella colonna di .fc-confirm-box (#485), i pulsanti
   toccavano il campo e l'etichetta scendeva di 10 px (in colonna i margini non si sovrappongono).
   L'etichetta resta a --sp-5 dal testo come prima della #485, fra campo e pulsanti c'è il margine
   del messaggio. Il campo è un blocco: in riga lasciava sotto lo spazio delle lettere. Niente
   box-shadow al focus: il messaggio scorre e taglia quello che esce dal campo; l'anello è l'outline
   di .fc-confirm-msg :focus-visible (base.css), disegnato dentro. */
.op-elim-etichetta{display:block;margin:var(--sp-5) 0 var(--sp-1);font-size:12px;color:var(--fc-label2)}
.op-elim-campo{display:block;width:100%;padding:var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px;resize:vertical}

/* ── Modale date DD (#ddModal): caselle, sezioni, date, avviso (design-05) ──
   Le due sezioni non hanno più un colore ciascuna (arancio e viola senza token):
   la casella spuntata è verde chiaro, la sezione la dice il titolo. */
.dd-intro{margin-bottom:var(--sp-3);font-size:13px;line-height:18px;color:var(--fc-label2)}
.dd-sec{margin:var(--sp-3) 0 var(--sp-2);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--fc-label2)}
.dd-list{display:flex;flex-direction:column;gap:var(--sp-1);margin-bottom:var(--sp-4)}
.dd-check{display:flex;align-items:center;gap:var(--sp-2);min-height:36px;padding:var(--sp-1) var(--sp-2);border:.5px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);cursor:pointer}
.dd-check.is-on{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.dd-check input{flex:none;width:16px;height:16px;margin:0;accent-color:var(--fc-accent-fill)}
.dd-check-ico{flex:none;font-size:15px}
.dd-check-t{flex:1;font-size:13px;font-weight:500}
.dd-check.is-on .dd-check-t{font-weight:700}
.dd-racc{margin-left:var(--sp-1);padding:1px 6px;border-radius:var(--r-pill);background:var(--fc-warn-soft);color:var(--fc-warn);font-size:11px;font-weight:600}
.dd-date{margin-top:var(--sp-2);padding-top:var(--sp-3);border-top:.5px solid var(--fc-sep)}
.dd-date .dd-sec{margin-top:0}
.dd-req{color:var(--fc-danger)}
.dd-warn{margin-top:var(--sp-3);padding:var(--sp-2) var(--sp-3);border:.5px solid var(--fc-warn-fill);border-radius:var(--rs);background:var(--fc-warn-soft);color:var(--fc-warn);font-size:13px;line-height:18px}
@media (hover:none){.dd-check{min-height:44px}}
/* Le tre date sui token: .fg input di style.css:54 le faceva #F8F8F6 col testo --fc-label, in scuro
   bianco su quasi bianco già oggi (review della rev. 1, I2). (1,1,1) batte (0,1,1) e il focus
   (0,2,1), che erano in style.css; il focus rimette il bordo verde. */
#ddModal .fg input{border-color:var(--fc-sep);background:var(--fc-card);color:var(--fc-label)}
#ddModal .fg input:focus{border-color:var(--fc-accent)}

/* ── Risorse Drive ed Email scritte da opmodal.js (design-05; .drv-* e .op-email-* spostati da style.css, design-08b) ──
   Elenco della tab Drive e righe delle email collegate: erano in style.css (DRIVE FILE BROWSER e "Operation
   email links section") con fondi bianchi scritti a mano (in scuro testo bianco su bianco) e testi da 8 a
   11 px; qui sui token, a filo del corpo come gli altri passi, senza transition. .btn-green (era in style.css)
   ha width:100%. */
.drv-breadcrumb{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1);margin-bottom:var(--sp-2);font-size:13px;color:var(--fc-label2)}
.drv-breadcrumb a{color:var(--fc-accent);text-decoration:none;cursor:pointer}
.drv-breadcrumb span{color:var(--fc-label2)}
.drv-list{display:flex;flex-direction:column;gap:var(--sp-1)}
.drv-item{display:flex;align-items:center;gap:var(--sp-2);min-height:40px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);cursor:pointer}
.drv-item-icon{flex:none;font-size:16px}
.drv-item-name{flex:1 1 auto;min-width:0;overflow:hidden;font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
.drv-item-meta{flex:none;font-size:12px;color:var(--fc-label2);white-space:nowrap}
.drv-item-actions{display:flex;flex:none;gap:var(--sp-2)}
.drv-item-actions a{font-size:12px;font-weight:600;color:var(--fc-accent);text-decoration:none}
.drv-empty{padding:var(--sp-5) var(--sp-4);text-align:center;font-size:13px;color:var(--fc-label2)}
.drv-preview{margin-top:var(--sp-2);overflow:hidden;border:1px solid var(--fc-sep);border-radius:var(--rs)}
.drv-preview iframe,.drv-preview img{width:100%;max-height:400px;object-fit:contain}
.op-email-card{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-bottom:var(--sp-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-left:3px solid var(--fc-accent-fill);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.op-email-card-left{flex:1 1 auto;min-width:0}
.op-email-from{overflow:hidden;font-size:13px;font-weight:700;color:var(--fc-label);text-overflow:ellipsis;white-space:nowrap}
.op-email-subj{margin-top:2px;overflow:hidden;font-size:13px;font-weight:600;color:var(--fc-label);text-overflow:ellipsis;white-space:nowrap}
.op-email-snippet{display:-webkit-box;margin-top:2px;overflow:hidden;font-size:12px;line-height:16px;color:var(--fc-label2);-webkit-line-clamp:2;-webkit-box-orient:vertical}
.op-email-date{margin-top:var(--sp-1);font-size:11px;color:var(--fc-label2)}
.op-email-card-actions{display:flex;flex:none;align-items:center;gap:var(--sp-1)}
@media (hover:hover){
  .drv-breadcrumb a:hover,.drv-item-actions a:hover{text-decoration:underline}
  .drv-item:hover,.op-email-card:hover{border-color:var(--fc-accent)}
}
@media screen and (max-width:768px){
  /* Al tocco: voci e link di Drive a 44 px (#opModalBody button in testa al foglio prende i bottoni, non gli <a>). */
  .drv-item{min-height:44px}
  .drv-open,.drv-item-actions a{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px}
}
.drv-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.drv-head .drv-breadcrumb{margin-bottom:0}
.drv-tools{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.drv-open{font-size:13px;font-weight:600;color:var(--fc-accent);text-decoration:none}
.drv-tools .btn-green,.drv-empty .btn-green{width:auto}
.drv-empty-ico{margin-bottom:var(--sp-2);font-size:24px}
.drv-breadcrumb .drv-crumb-cur{font-weight:600;color:var(--fc-label)}
.drv-preview iframe{height:400px;border:0}
.op-email-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-3)}
.op-email-title{font-size:15px;font-weight:700;color:var(--fc-label)}
.op-email-hint{font-size:12px;color:var(--fc-label2)}
.op-email-loading{padding:var(--sp-4);text-align:center}
.op-email-empty{padding:var(--sp-6) var(--sp-4);text-align:center}
.op-email-empty-ico{margin-bottom:var(--sp-2);font-size:24px;opacity:.4}
.op-email-empty-t{font-size:13px;color:var(--fc-label2)}
.op-email-empty-s{margin-top:var(--sp-1);font-size:12px;color:var(--fc-label2)}
.op-email-err{padding:var(--sp-2);font-size:13px;color:var(--fc-danger)}

/* ── Modale di conflitto (occ-conflict.js, "qualcun altro ha modificato la scheda", design-05) ──
   Il dialogo è un .fc-confirm di base.css: qui la larghezza, il titolo e la
   tabella delle differenze. Il "Tieni i miei" è .fc-confirm-warn dalla #291. */
.fc-confirm-box.occ-box{max-width:720px}
.fc-confirm-title.occ-title{color:var(--fc-warn)}
.fc-confirm-msg.occ-msg{text-align:left;line-height:1.4}
.occ-lead{margin-bottom:var(--sp-2);color:var(--fc-label)}
.occ-diff{max-height:340px;overflow:hidden auto;border:.5px solid var(--fc-sep);border-radius:var(--rs)}
.occ-empty{padding:var(--sp-2);font-style:italic;color:var(--fc-label2)}
.occ-table{width:100%;border-collapse:collapse;font-size:13px}
.occ-table thead{background:var(--fc-warn-soft);color:var(--fc-label)}
.occ-table th{padding:var(--sp-2);border-bottom:2px solid var(--fc-warn-fill);color:var(--fc-label);font-size:11px;font-weight:700;text-transform:uppercase;text-align:left}
.occ-table td{padding:var(--sp-2);border-bottom:.5px solid var(--fc-sep);color:var(--fc-label);font-size:13px}
.occ-table .occ-campo{width:30%;font-weight:600}
.occ-table .occ-mine{color:var(--fc-info)}
.occ-table .occ-server{color:var(--fc-label)}
.occ-heavy{margin-left:var(--sp-1);padding:1px 6px;border-radius:var(--r-pill);background:var(--fc-fill);color:var(--fc-label);font-size:11px;font-weight:600}
.occ-help{margin-top:var(--sp-2);font-size:12px;line-height:17px;color:var(--fc-label2)}
.fc-confirm-btns.occ-btns{flex-wrap:wrap;gap:var(--sp-2)}

/* ── Contenuto dei passi: vocabolario comune (design-06a) ──
   Le PR 6a, 6b, 7 e 8 portano qui il contenuto dei passi della scheda (opmodal-steps.js e gli altri
   opmodal-*.js), una sottosezione per passo, sempre sopra la stampa. Nessuna transition né animation
   nel contenuto dei passi (tests/area-opmodal.test.js): il blocco "Riduci movimento" di area-shell.css
   non cresce. Da telefono #opModalBody button (1,0,1), in testa al foglio, fa ogni bottone del corpo
   centrato e a 44 px, e va bene per .op-azione; chi deve allineare a sinistra porta il prefisso
   #opModalBody. I campi .fg di style.css:54 avevano il fondo #F8F8F6 scritto a mano e il testo
   --fc-label, bianco sul body scuro dalla PR 5: la regola a id qui sotto li riporta sui token in tutta la
   scheda, e ridichiara il bordo di focus che altrimenti batterebbe. */
.op-sez{margin:var(--sp-5) 0 var(--sp-2);font-size:11px;line-height:14px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--fc-label2)}
.op-sez:first-child{margin-top:0}
.op-sez-n{font-weight:400;text-transform:none;letter-spacing:0}
.op-hint{font-size:12px;line-height:16px;color:var(--fc-label2)}
/* Aiuto da controllare (dati superati, campi che non tornano, cosa manca per cercare): ambra come
   .op-box e .gate-box warn, non il grigio degli altri aiuti. Testo pieno sul fondo colorato. */
.op-hint[data-level="warn"]{margin-top:var(--sp-1);padding:var(--sp-1) var(--sp-2);border-left:3px solid var(--fc-warn-fill);border-radius:var(--rs);background:var(--fc-warn-soft);color:var(--fc-label)}
.op-link{color:var(--fc-accent);font-weight:600;text-decoration:none;white-space:nowrap;cursor:pointer}
/* Un .op-link che è un <button> («Porta nella scheda», «Allinea» dei dati ripetuti, js/modules/dati-ripetuti.js:
   passi della scheda, testata e Programma lavori della tab Cantiere) resta un link: senza, il bottone teneva
   fondo e bordo del sistema, e in scuro la scritta verde sul fondo chiaro stava a 1,75:1 (C11, design-09b).
   Da telefono #opModalBody button (1,0,1) in testa al foglio lo tiene a 44 px. */
button.op-link{padding:0;border:0;background:none;font:inherit;font-weight:600;color:var(--fc-accent);cursor:pointer}
.op-riga{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.op-cresce{flex:1 1 auto;min-width:0}
.op-box{margin:var(--sp-3) 0;padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label);font-size:13px;line-height:18px}
.op-box[data-level="ok"]{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.op-box[data-level="warn"]{border-color:var(--fc-warn-fill);background:var(--fc-warn-soft);color:var(--fc-label)}
.op-box[data-level="danger"]{border-color:var(--fc-danger);background:var(--fc-danger-soft);color:var(--fc-label)}
.op-box[data-level="info"]{border-color:var(--fc-info);background:var(--fc-info-soft);color:var(--fc-label)}
.op-box-t{margin-bottom:var(--sp-1);font-size:13px;font-weight:700}
.op-box[data-level="ok"] .op-box-t{color:var(--fc-accent)}
.op-box[data-level="warn"] .op-box-t{color:var(--fc-warn)}
.op-box[data-level="danger"] .op-box-t{color:var(--fc-danger)}
.op-box[data-level="info"] .op-box-t{color:var(--fc-info)}
/* --fc-label2 su --fc-accent-soft è 4,39:1 in scuro: dentro un riquadro colorato l'aiuto è testo pieno. */
.op-box[data-level] .op-hint{color:var(--fc-label)}
.op-vuoto{padding:var(--sp-4);text-align:center;font-size:13px;color:var(--fc-label2)}
.op-err{color:var(--fc-danger)}
.op-req{color:var(--fc-danger);font-weight:700}
.op-azione{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-1);min-height:28px;padding:0 var(--sp-2);border:1px solid var(--fc-accent);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-accent);font:inherit;font-size:12px;font-weight:600;line-height:16px;text-decoration:none;white-space:nowrap;cursor:pointer}
.op-azione.is-primary{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.op-azione.is-danger{border-color:var(--fc-danger);color:var(--fc-danger)}
.op-azione:disabled{border-color:var(--fc-sep);background:var(--fc-card);color:var(--fc-label2);cursor:default}
.op-x{display:inline-flex;align-items:center;justify-content:center;min-width:28px;min-height:28px;padding:0;border:0;border-radius:50%;background:none;color:var(--fc-label2);font:inherit;font-size:13px;line-height:1;cursor:pointer}
.op-x.is-danger{color:var(--fc-danger)}
.op-azione:focus-visible,.op-x:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
.op-chip{display:inline-flex;align-items:center;gap:2px;min-height:18px;padding:0 var(--sp-1);border-radius:var(--r-pill);background:var(--fc-fill);color:var(--fc-label);font-size:11px;line-height:14px;font-weight:600;white-space:nowrap;vertical-align:middle}
.op-chip[data-level="ok"]{background:var(--fc-accent-soft);color:var(--fc-accent)}
.op-chip[data-level="warn"]{background:var(--fc-warn-soft);color:var(--fc-warn)}
.op-chip[data-level="danger"]{background:var(--fc-danger-soft);color:var(--fc-danger)}
.op-chip[data-level="info"]{background:var(--fc-info-soft);color:var(--fc-info)}
.op-campo{width:100%;min-height:36px;padding:var(--sp-1) var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px;line-height:18px}
.op-campo:focus{border-color:var(--fc-accent);outline:none;box-shadow:0 0 0 3px var(--fc-accent-soft)}
textarea.op-campo{resize:vertical}
.op-riga>.op-campo{width:auto}
.op-riga>.op-campo.op-cresce{flex:1 1 160px}
/* I campi .fg (in base.css, erano in style.css) sono larghi 100%: in una riga che va a capo spingerebbero sotto quello
   che hanno accanto (coordinate e "Apri" del link Maps, "→ BP" della rendita). */
.op-riga>input.op-cresce{width:auto;min-width:0;flex:1 1 0}
.op-pannello{margin-top:var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--r);background:var(--fc-card);color:var(--fc-label);overflow:hidden}
.op-pannello-testa{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-3);border:0;background:var(--fc-bg);color:var(--fc-label);font:inherit;font-size:11px;font-weight:700;line-height:14px;text-transform:uppercase;letter-spacing:.04em;text-align:left}
.op-pannello-corpo{padding:var(--sp-2) var(--sp-3)}
.op-scorre{max-height:300px;overflow-y:auto}
/* input:not(.fg-ro-computo): il "Budget Lavori" della card Riunione (Decisione) resta alla regola dei campi .fg (era in style.css),
   la sua forma la decide la 6b (review I3). */
#opModalBody .fg input:not(.fg-ro-computo),#opModalBody .fg select,#opModalBody .fg textarea{border-color:var(--fc-sep);background:var(--fc-card);color:var(--fc-label)}
#opModalBody .fg input:not(.fg-ro-computo):focus,#opModalBody .fg select:focus,#opModalBody .fg textarea:focus{border-color:var(--fc-accent);background:var(--fc-card)}
#opModalBody .fg input[readonly]:not(.fg-ro-computo){background:var(--fc-bg);color:var(--fc-label2);cursor:default}
@media (hover:hover){
  .op-link:hover{text-decoration:underline}
  .op-azione:not(.is-primary):not(:disabled):hover{background:var(--fc-accent-soft);color:var(--fc-accent)}
  .op-azione.is-danger:not(:disabled):hover{background:var(--fc-danger-soft);color:var(--fc-danger)}
  .op-x:hover{background:var(--fc-fill);color:var(--fc-label)}
}
@media (hover:none){
  .op-azione{min-height:44px}
  .op-x{min-width:44px;min-height:44px}
}
@media screen and (max-width:768px){
  .op-campo{min-height:44px}
}

/* ── Tendina delle agenzie (agenzie.js, passo Segnalazione; era style.css AGENZIA AUTOCOMPLETE, design-06a) ──
   Si apre e si chiude con hidden: [hidden] di base.css ha !important e vincerebbe su qualunque
   style.display, quindi markup e agenzie.js cambiano insieme. */
.op-ag{position:relative}
.agenzia-dd{position:absolute;top:100%;left:0;right:0;z-index:500;max-height:220px;overflow-y:auto;border:1px solid var(--fc-sep);border-radius:0 0 var(--rs) var(--rs);background:var(--fc-card);color:var(--fc-label);box-shadow:var(--fc-shadow)}
.agenzia-dd-item{display:flex;align-items:center;gap:var(--sp-2);min-height:36px;padding:var(--sp-1) var(--sp-3);border-bottom:.5px solid var(--fc-sep);font-size:13px;cursor:pointer}
.agenzia-dd-item:last-child{border-bottom:0}
.agenzia-dd-item.create{background:var(--fc-info-soft);color:var(--fc-info);font-weight:600}
.agenzia-dd-nome{flex:1;min-width:0}
.agenzia-dd-sub{font-size:12px;color:var(--fc-label2)}
.agenzia-dd-top{margin-left:var(--sp-1);padding:0 var(--sp-1);border-radius:var(--r-pill);background:var(--fc-warn-soft);color:var(--fc-warn);font-size:11px;font-weight:700}
@media (hover:hover){
  .agenzia-dd-item:hover{background:var(--fc-accent-soft);color:var(--fc-label)}
  /* --fc-label2 su --fc-accent-soft è 4,39:1 in scuro. */
  .agenzia-dd-item:hover .agenzia-dd-sub{color:var(--fc-label)}
  .agenzia-dd-item.create:hover{background:var(--fc-info-soft);color:var(--fc-label)}
}
@media (hover:none){.agenzia-dd-item{min-height:44px}}

/* ── Passo Segnalazione (design-06a) ── */
.op-idbox{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-idbox-l{font-size:11px;line-height:14px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--fc-label2);white-space:nowrap}
.op-idbox-v{display:flex;flex:1;align-items:center;gap:var(--sp-2);min-width:0}
.op-id-val{padding:2px var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:14px;font-weight:700;user-select:all}
.op-id-vuoto{font-size:13px;font-style:italic;color:var(--fc-label2)}
.op-corto{max-width:90px}
/* Anche col cursore dentro, come l'inline di oggi: il focus dei campi è (1,3,1) per il :not() del Task 2. */
#opModalBody .fg input.is-mancante,#opModalBody .fg input.is-mancante:focus{border-color:var(--fc-danger)}
.op-label-hint{font-weight:400;text-transform:none;letter-spacing:0;color:var(--fc-accent)}
.op-coord{font-size:12px;white-space:nowrap;color:var(--fc-label2)}
.op-coord.is-ok{font-weight:700;color:var(--fc-accent)}
.op-coord.is-err{color:var(--fc-danger)}
.op-span2{grid-column:span 2}
.op-inserita{display:flex;align-items:stretch;gap:var(--sp-1)}
.op-btn-ico{display:inline-flex;flex:none;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0 var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:15px;cursor:pointer}
.op-cronolink{display:flex;align-items:center;width:100%;min-height:36px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label2);font:inherit;font-size:13px;text-align:left;cursor:pointer}
/* #opModalBody button (1,0,1) in testa al foglio la centrerebbe da telefono. */
#opModalBody .op-cronolink{justify-content:flex-start}
.op-drive-obbl{text-align:center}
.op-avviso-prov{display:block;margin-top:var(--sp-2);font-size:13px}
@media (hover:hover){.op-btn-ico:hover,.op-cronolink:hover{background:var(--fc-fill);color:var(--fc-label)}}
/* Con .fr3 a una colonna (base.css, 768; era in style.css) uno span 2 creerebbe una seconda colonna implicita. */
@media screen and (max-width:768px){.op-span2{grid-column:auto}}

/* ── Dialoghi admin del passo Segnalazione: Riassegna e Storia operazione (fc-confirm, design-06a) ──
   Stanno nel body, fuori da #opModalBody: i campi prendono .op-campo. (0,2,0) batte il max-width
   di .fc-confirm-box di base.css anche dentro la sua @media. */
.fc-confirm-box.op-dlg-m{max-width:480px}
.fc-confirm-box.op-dlg-l{display:flex;flex-direction:column;max-width:640px;max-height:80vh;max-height:80dvh}
.op-dlg-sub{margin:calc(-1 * var(--sp-2)) 0 var(--sp-3);font-size:12px;color:var(--fc-label2)}
.op-dlg-lbl{display:block;margin-bottom:var(--sp-1);font-size:12px;color:var(--fc-label2)}
.op-dlg-val{margin-bottom:var(--sp-3);padding:var(--sp-1) var(--sp-2);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label);font-size:13px}
.op-dlg-m .op-campo{margin-bottom:var(--sp-3)}
.op-dlg-l .fc-confirm-btns{margin-top:var(--sp-2)}
.op-storia{flex:1;min-height:0;margin:var(--sp-1) 0;overflow-y:auto;font-size:13px}
.op-storia-riga{padding:var(--sp-2) var(--sp-1);border-bottom:.5px solid var(--fc-sep)}
.op-storia-testa{display:flex;justify-content:space-between;gap:var(--sp-2)}
.op-storia-azione{font-weight:600;color:var(--fc-label)}
.op-storia-quando,.op-storia-chi,.op-storia-det{font-size:12px;color:var(--fc-label2)}
.op-storia-nota{margin-top:2px;font-style:italic;color:var(--fc-label2)}
.op-storia-warn{color:var(--fc-warn)}
.op-storia code{font-size:12px}

/* ── Passo Sopralluogo: scelte, criticità, rischio, foto (design-06a) ──
   .check-item e figli erano in style.css (CHECKLIST) e in mobile.css (blocco 4): li usa solo questo
   passo. Scelte in verde chiaro, criticità in ambra. Niente transition (erano .15s). */
.check-item{display:flex;width:100%;font:inherit;text-align:left;align-items:center;gap:var(--sp-2);min-height:36px;margin-bottom:var(--sp-1);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);cursor:pointer}
/* <button> (review xhigh della PR 6a): da tastiera si raggiungono e aria-pressed dice se sono scelti.
   #opModalBody button (1,0,1) in testa al foglio li centrerebbe e li farebbe inline-flex: il prefisso li rimette. */
#opModalBody .check-item{display:flex;justify-content:flex-start}
#opModalBody .op-tipi .check-item{justify-content:center}
.check-item:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
.check-item.checked{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.crit-wrap .check-item.checked{border-color:var(--fc-warn-fill);background:var(--fc-warn-soft);color:var(--fc-label)}
.check-toggle{display:flex;flex:none;align-items:center;justify-content:center;width:18px;height:18px;border:2px solid var(--fc-sep);border-radius:4px;font-size:12px;line-height:1}
.check-item.checked .check-toggle{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.crit-wrap .check-item.checked .check-toggle{border-color:var(--fc-warn-fill);background:var(--fc-warn-fill);color:var(--fc-on-accent)}
.check-label{flex:1;font-size:13px;font-weight:500}
.op-tipi{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-bottom:var(--sp-3)}
.op-tipi .check-item{flex:1 1 140px;width:auto;justify-content:center;margin-bottom:0;text-align:center}
.crit-note{margin:0 0 var(--sp-2);padding-left:var(--sp-6)}
.op-rischio{display:flex;align-items:center;margin-top:var(--sp-4);padding:var(--sp-2) var(--sp-3);border-radius:var(--rs);background:var(--fc-bg)}
.op-foto-ov{position:fixed;inset:0;z-index:99999;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-2);padding:var(--sp-4);background:var(--fc-ink);color:var(--fc-on-accent);cursor:pointer}
.op-foto-cap{font-size:13px;font-weight:600}
.op-foto-img{max-width:90vw;max-height:70vh;border-radius:var(--rs);box-shadow:var(--fc-shadow)}
.op-foto-nota{width:min(400px,80vw);min-height:36px;padding:var(--sp-1) var(--sp-2);border:1px solid var(--fc-label2);border-radius:var(--rs);background:var(--fc-ink);color:var(--fc-on-accent);font:inherit;font-size:13px}
.op-foto-btn{min-width:44px;min-height:44px;padding:0 var(--sp-4);border:1px solid var(--fc-label2);border-radius:var(--rs);background:none;color:var(--fc-on-accent);font-size:16px;cursor:pointer}
.op-foto-help{font-size:12px}
@media (hover:hover){.check-item:hover{border-color:var(--fc-accent)}}
@media (hover:none){.check-item{min-height:44px}}
/* Era mobile.css blocco 4: 44 px sotto i 768 anche col mouse. */
@media screen and (max-width:768px){.check-item{min-height:44px}}

/* ── Passo Sopralluogo: dati catastali e Zornade (design-06a) ──
   Il riquadro dei dati catastali è un .op-box neutro: via il viola #F3E5F5/#6A1B9A e l'azzurro
   #E0F7FA/#006064, che non hanno un token (decisione 3). */
.op-cat-testa{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.op-cat-t{font-size:13px;font-weight:700;color:var(--fc-label)}
.op-griglia{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:var(--sp-2)}
.op-griglia+.op-griglia{margin-top:var(--sp-2)}
.op-griglia .fg{margin-bottom:0}
.op-cat-rif{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--sp-2);margin-top:var(--sp-2);padding:var(--sp-1) var(--sp-2);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:12px}
.op-zornade{margin-top:var(--sp-2);padding:var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:12px;line-height:16px}
.op-zornade-t{margin-bottom:var(--sp-1);font-weight:700}
.op-zornade-griglia{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--sp-1)}
.op-zornade-sez{margin-top:var(--sp-2);padding-top:var(--sp-2);border-top:1px solid var(--fc-sep)}
/* Fonti ufficiali: una fonte per riga, a tutta larghezza (atti, beni e siti sono testi lunghi). La griglia Zornade resta a colonne. */
.op-zornade-sez[data-fonti] .op-zornade-griglia{grid-template-columns:1fr}
.op-zornade-rischi{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2)}
.op-zornade-mappa{width:100%;height:180px;margin:var(--sp-2) 0;border:1px solid var(--fc-sep);border-radius:var(--rs)}
/* Segnaposto della mappa Zornade (L.divIcon, className vuoto): il colore dal token. */
.op-pin{width:16px;height:16px;border:3px solid var(--fc-card);border-radius:50%;background:var(--fc-danger);box-shadow:var(--fc-shadow)}
/* Testo del popup Leaflet del segnaposto (era .7rem inline). */
.op-pin-pop{font-size:12px}

/* ── Passo Checklist (design-06a) ──
   I sei colori dei gate (CHECKLIST_CONFIG.color/bg, senza token, testo bianco sui badge) non
   disegnano più la tab: ogni gate porta il pallino del suo stato (.status-dot.st-*, base.css). La
   barra riceve la percentuale come --w (spec §5.1 caso 2). --fc-label2 su --fc-accent-soft è
   4,39:1 in scuro: dentro gate e righe fatti i grigi diventano --fc-label. */
.op-cl-gate{margin-bottom:var(--sp-3);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.op-cl-gate.is-fatto{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.op-cl-testa{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.op-cl-titolo{font-size:13px;font-weight:700}
/* Icona della testata del gate e 📌 del promemoria ventennale (era 1.3rem). */
.op-cl-ico{flex:none;font-size:16px;line-height:1}
.op-cl-conta{margin-left:auto;font-size:12px;font-weight:600;color:var(--fc-label2)}
.op-cl-barra{height:6px;margin-bottom:var(--sp-2);border-radius:var(--r-pill);background:var(--fc-rail);overflow:hidden}
.op-cl-barra>i{display:block;width:var(--w,0%);height:100%;background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.op-cl-riga{display:flex;align-items:center;gap:var(--sp-2);min-height:32px;margin-bottom:var(--sp-1);padding:var(--sp-1) var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:13px}
.op-cl-riga.is-racc{border-style:dashed}
.op-cl-riga.is-fatto{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.op-cl-riga input[type=checkbox]{flex:none;accent-color:var(--fc-accent-fill)}
/* L'etichetta della sola casella (opmodal-steps.js): flex, cosi' la casella resta
   centrata nella riga come quando era figlia diretta. Da telefono 44x44 (blocco da telefono in testa a questo file,
   che era in mobile.css). */
.op-cl-check{display:flex;flex:none}
.op-cl-stato{flex:none;width:16px;text-align:center}
.op-cl-voce{flex:1;min-width:0}
/* L'avviso ⚠️ di una riga (row.warn, es. "termine passato il …") è lungo: va a capo, altrimenti
   da telefono la pastiglia esce dal riquadro e la scheda scorre di lato. */
.op-cl-voce .op-chip{white-space:normal}
.op-cl-riga.is-fatto .op-cl-voce{font-weight:600}
.op-cl-link{margin-left:var(--sp-1);color:var(--fc-label2);text-decoration:none;cursor:help}
/* Il 📎 apre il file su Drive: è un link, non un'informazione come il 🔗. */
a.op-cl-link{cursor:pointer}
.op-cl-nota{font-size:12px;font-style:italic;color:var(--fc-label2)}
.op-cl-gate.is-fatto .op-cl-conta,.op-cl-riga.is-fatto .op-cl-link,.op-cl-riga.is-fatto .op-cl-nota,.op-cl-riga.is-fatto .op-hint{color:var(--fc-label)}
.op-cl-gate .op-campo{margin-top:var(--sp-1)}
/* Link nel toast di caricamento (fuori dalla scheda): prende il colore del toast. */
.op-toast-link{color:inherit;font-weight:700;text-decoration:underline}
@media (hover:none){.op-cl-riga{min-height:44px}}

/* ── Passo Checklist: storico modifiche (design-06a) ── */
.op-log{margin-bottom:var(--sp-2);padding:var(--sp-1) var(--sp-2);border-left:3px solid var(--fc-accent);border-radius:0 var(--rs) var(--rs) 0;background:var(--fc-bg);color:var(--fc-label)}
.op-log-testa{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:2px}
.op-log-chi{font-size:12px;font-weight:700}
.op-log-quando{font-size:12px;color:var(--fc-label2)}
.op-log-riga{margin-left:var(--sp-1);font-size:12px}
.op-log-campo{font-weight:600;color:var(--fc-label2)}
.op-log-da{color:var(--fc-danger);text-decoration:line-through}
.op-log-a{font-weight:700;color:var(--fc-accent)}
/* La testata dello storico è un bottone: da telefono #opModalBody button (1,0,1) la centrerebbe. */
button.op-pannello-testa{cursor:pointer}
/* Freccia ▼/▲ dello storico: la cambia toggleAuditLog, senza rotazione animata (decisione 16). */
.op-pannello-ico{font-size:11px;line-height:1}
/* Riga di aggiunta delle condizioni sospensive, sotto le righe. */
.op-cs-add{margin-top:var(--sp-2)}
#opModalBody .op-pannello-testa{justify-content:space-between}
/* ── Passo Appunti (design-06a) ──
   Tag come chip: il livello viene da una mappa fissa in opmodal-steps.js (_TAG_APPUNTO), mai dal dato. */
.op-appunti{max-width:720px;margin:0 auto}
.op-appunti-testa{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-bottom:var(--sp-4)}
.op-appunti-t{margin:0;font-size:17px;line-height:22px;font-weight:700;color:var(--fc-label)}
.op-appunti-s{margin:var(--sp-1) 0 0;font-size:12px;color:var(--fc-label2)}
.op-appunto-nuovo{margin-bottom:var(--sp-4)}
.op-appunto-nuovo .op-riga{margin-top:var(--sp-1)}
.op-appunto{margin-bottom:var(--sp-2);padding:var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.op-appunto-testa{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-1)}
.op-appunto-meta{font-size:12px;color:var(--fc-label2)}
.op-appunto-meta .op-chip{margin-left:var(--sp-1)}
.op-appunto-testo{font-size:13px;line-height:20px;white-space:pre-wrap}
.op-appunti-vuoto{padding:var(--sp-6) var(--sp-4);text-align:center;color:var(--fc-label2)}
.op-appunti-vuoto-ico{margin-bottom:var(--sp-2);font-size:32px;opacity:.3}

/* ── Contenuto dei passi: tabelle, dettagli, dati di sintesi (design-06b) ──
   Le regole generiche di tabella stanno in base.css (design-13a: testata senza fondo, 11 px maiuscoletto,
   td.price su --fc-label, hover solo col puntatore): le tabelle dei passi le ridichiarano col loro passo
   (celle a 13 px, filetti da .5px, riga trasparente anche al passaggio del mouse). In stampa comandano le
   regole !important di stampa.css (testata verde). */
.op-tab-wrap{margin-bottom:var(--sp-4);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);overflow:auto}
.op-tab{width:100%;border-collapse:collapse;font-size:13px}
.op-tab thead{background:transparent}
.op-tab th{padding:var(--sp-1) var(--sp-2);border-bottom:.5px solid var(--fc-sep);color:var(--fc-label2);font-size:11px;font-weight:600;letter-spacing:.04em;text-align:left;white-space:nowrap}
.op-tab td{padding:var(--sp-1) var(--sp-2);border-bottom:.5px solid var(--fc-sep);color:var(--fc-label);font-size:13px}
.op-tab tbody tr{border-bottom:0;background:transparent}
.op-tab .num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.op-tab td.price{color:var(--fc-label);font-weight:700}
.op-tab .op-tenue{color:var(--fc-label2)}
.op-tab tr.is-tipo td{background:var(--fc-bg)}
.op-tab tr.op-tab-tot td{border-top:2px solid var(--fc-sep);background:var(--fc-bg);font-weight:700}
.op-tab tr.is-escluso{opacity:.45}
.op-tab td.is-barrato{text-decoration:line-through}
.op-tab td.is-accento{color:var(--fc-accent);font-weight:700}
.op-tab td.op-vuoto{padding:var(--sp-4);color:var(--fc-label2);text-align:center}
.op-stats{margin-bottom:var(--sp-4)}
.op-dett{margin-top:var(--sp-2);font-size:12px;color:var(--fc-label2)}
.op-dett summary{font-weight:600;cursor:pointer}
.op-dett pre{max-height:200px;margin-top:var(--sp-1);padding:var(--sp-2);overflow:auto;border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label);font-size:11px;white-space:pre-wrap}

/* ── Ricerca Mercato: stima e risultati Casafari (design-06b) ──
   La griglia a tre card passa a due da telefono: era mobile.css blocco 10 con un selettore sullo stile inline. */
.op-stima{margin-bottom:var(--sp-3);padding:var(--sp-3);border-radius:var(--r);background:var(--fc-accent-soft);color:var(--fc-label)}
.op-stima-t{margin-bottom:var(--sp-2);font-size:13px;font-weight:700;color:var(--fc-accent)}
.op-stima-griglia{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-2)}
.op-stima-c{padding:var(--sp-2);border:2px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);text-align:center}
.op-stima-c[data-level="warn"]{border-color:var(--fc-warn-fill)}
.op-stima-c[data-level="ok"]{border-color:var(--fc-ok)}
.op-stima-c[data-level="info"]{border-color:var(--fc-info)}
.op-stima-l{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}
.op-stima-v{font-size:17px;line-height:22px;font-weight:800;font-variant-numeric:tabular-nums}
.op-stima-c[data-level="warn"] .op-stima-l,.op-stima-c[data-level="warn"] .op-stima-v{color:var(--fc-warn)}
.op-stima-c[data-level="ok"] .op-stima-l,.op-stima-c[data-level="ok"] .op-stima-v{color:var(--fc-ok)}
.op-stima-c[data-level="info"] .op-stima-l,.op-stima-c[data-level="info"] .op-stima-v{color:var(--fc-info)}
.op-stima-mq{font-size:12px;color:var(--fc-label2)}
.op-stima .op-riga{justify-content:center;margin-top:var(--sp-2)}
/* Le celle battono .op-tab td (0,1,1): per questo il prefisso .op-tab td. */
.op-tab td.op-score{font-weight:700;color:var(--fc-label2)}
.op-tab td.op-score[data-level="ok"]{color:var(--fc-ok)}
.op-tab td.op-score[data-level="warn"]{color:var(--fc-warn)}
@media screen and (max-width:768px){
  .op-stima-griglia{grid-template-columns:repeat(2,1fr)}
  /* Era in style.css (RESPONSIVE 768): batte .stats-row{1fr} dei 480 di base.css per specificità, come prima. */
  #casafariResults .stats-row{grid-template-columns:1fr 1fr}
}

/* ── Ricerca Mercato: il passo (design-06b) ──
   Il suggerimento "i" si apre con la classe cf-tip-open messa dagli handler inline: style.css lo mostrava
   con !important perché il display:none era inline; ora sono due regole di classe. I campi
   del riquadro Casafari sono .op-campo senza altezza propria: 36 px, 44 da telefono (review M1). */
.op-mercato-testa{margin-bottom:var(--sp-2);font-size:12px;font-weight:600;color:var(--fc-label2)}
.op-gps{font-size:12px}
.op-gps.is-ok{font-weight:600;color:var(--fc-accent)}
.op-gps.is-err{color:var(--fc-danger)}
.op-rm-riga{align-items:end;margin-bottom:var(--sp-1)}
.op-rm-riga .fg{margin:0}
.op-cf{margin-bottom:var(--sp-4);padding:var(--sp-3);border:1px solid var(--fc-info);border-radius:var(--r);background:var(--fc-info-soft);color:var(--fc-label)}
.op-cf-testa{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.op-cf-t{font-size:13px;font-weight:700;color:var(--fc-info)}
.cf-params-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-2);margin-bottom:var(--sp-2)}
.cf-params-grid.is-5{grid-template-columns:repeat(5,1fr)}
.op-cf-lbl{display:block;margin-bottom:2px;font-size:11px;font-weight:600;color:var(--fc-info)}
.op-cf-gruppi{display:flex;flex-wrap:wrap;gap:var(--sp-4);padding:var(--sp-1) 0}
.op-cf-gruppo-t{margin-bottom:2px;font-size:11px;font-weight:700;color:var(--fc-info)}
.op-cf-scelta{display:flex;align-items:center;gap:var(--sp-1);font-size:12px;color:var(--fc-label);cursor:pointer}
.op-cf .op-dett{color:var(--fc-info)}
.op-cf-agg{margin-bottom:var(--sp-1);font-size:12px;color:var(--fc-label)}
.cf-tip-wrap{position:relative;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-left:var(--sp-1);border-radius:50%;background:var(--fc-card);color:var(--fc-info);font-size:11px;font-weight:700;line-height:1;vertical-align:middle;cursor:help}
.cf-tip-box{display:none;position:absolute;bottom:calc(100% + 6px);left:50%;z-index:9999;width:220px;padding:var(--sp-1) var(--sp-2);border-radius:var(--rs);background:var(--fc-toast-bg);color:var(--fc-toast-fg);font-size:12px;font-weight:400;line-height:16px;text-align:left;text-transform:none;letter-spacing:0;white-space:normal;box-shadow:var(--fc-shadow);pointer-events:none;transform:translateX(-50%)}
.cf-tip-wrap.cf-tip-open .cf-tip-box{display:block}
@media screen and (max-width:768px){.cf-params-grid,.cf-params-grid.is-5{grid-template-columns:repeat(2,1fr)}}
@media screen and (max-width:480px){.cf-params-grid,.cf-params-grid.is-5{grid-template-columns:1fr}}

/* ── Decisione: testata di stampa, dati, link, riepiloghi (design-06b) ──
   Il blocco @media print di css/stampa.css (con !important, PR 13b) mostra la testata di stampa con
   display:flex: qui la si nasconde solo a schermo. .stat-card e figli sono di base.css (design-13a). */
@media screen{.dec-print-header{display:none}}
.dec-print-header{align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-4)}
.op-dec-logo{display:flex;flex:none;align-items:center;justify-content:center;width:36px;height:36px;border-radius:var(--rs);background:var(--fc-accent-fill);color:var(--fc-on-accent);font-size:14px;font-weight:800}
.op-dec-marca{font-size:14px;font-weight:800;letter-spacing:.2em;text-transform:uppercase}
.op-dec-data{font-size:11px;font-weight:600;color:var(--fc-label2)}
.stat-val.op-stat-testo{font-size:17px}
.stat-val.op-stat-addr{font-size:15px}
.op-dec-info{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--sp-1);margin-bottom:var(--sp-4);font-size:12px}
.op-dec-info>div{padding:var(--sp-1) var(--sp-2);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-dec-info>div[data-level="warn"]{background:var(--fc-warn-soft);color:var(--fc-label)}
.op-dec-link,.op-dec-doc{margin-bottom:var(--sp-4)}
.op-lista{margin:var(--sp-1) 0 0 var(--sp-4);padding:0;list-style:disc}
.op-lista li{margin-bottom:2px}
ol.op-lista{list-style:decimal}
.op-cl-barra[data-level="warn"]>i{background:var(--fc-warn-fill)}
.op-cl-barra[data-level="danger"]>i{background:var(--fc-danger)}
.op-riga>.op-cl-barra{margin-bottom:0}
.op-dec-vuoto{margin-bottom:var(--sp-4);padding:var(--sp-5);border:1.5px dashed var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label2);text-align:center}
.op-dec-vuoto-ico{margin-bottom:var(--sp-1);font-size:24px;opacity:.4}
.op-dec-vuoto-t{font-size:13px;font-weight:600}

/* ── Decisione: scorecard, POI, mappa, comparabili (design-06b) ──
   .sc-* e .poi-* erano in style.css (SCORECARD, POI CHIPS): il markup lo scrive opmodal-finance.js
   (renderScorecard, renderPOI) e si vede solo qui. Livello dal punteggio, barre con --w, ferme (era
   transition:width .5s). .op-ref porta colore e fondo sullo span: in stampa td{color:#1a1a1a!important}
   che era in style.css colpiva la cella, non lui (prima lo salvava td span[style*="background:…"], che ora non
   trova più niente: resta alla PR 13). Il riquadro della chiave Google Maps è .op-box.op-dec-chiave:
   la classe lo toglie dalla stampa (blocco print in fondo). */
.sc-bar{height:6px;margin-top:2px;border-radius:var(--r-pill);background:var(--fc-rail);overflow:hidden}
.sc-bar.is-poi{width:120px}
.sc-bar-fill{width:var(--w,0%);height:100%;background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.sc-bar-fill[data-level="warn"]{background:var(--fc-warn-fill)}
.sc-bar-fill[data-level="danger"]{background:var(--fc-danger)}
.sc-score{font-size:32px;line-height:1;font-weight:800;color:var(--fc-label)}
.sc-score[data-level="ok"]{color:var(--fc-ok)}
.sc-score[data-level="warn"]{color:var(--fc-warn)}
.sc-score[data-level="danger"]{color:var(--fc-danger)}
.sc-grade{display:inline-block;margin-top:var(--sp-1);padding:2px var(--sp-2);border-radius:var(--rs);font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;background:var(--fc-fill);color:var(--fc-label)}
.sc-grade[data-level="ok"]{background:var(--fc-accent-soft);color:var(--fc-accent)}
.sc-grade[data-level="warn"]{background:var(--fc-warn-soft);color:var(--fc-warn)}
.sc-grade[data-level="danger"]{background:var(--fc-danger-soft);color:var(--fc-danger)}
.op-sc{margin-bottom:var(--sp-3);gap:var(--sp-4)}
.op-sc-voto{text-align:center}
.op-sc-righe{flex:1 1 240px;min-width:0}
.op-sc-riga{flex-wrap:nowrap;gap:var(--sp-1);margin-bottom:2px}
.op-sc-riga .sc-bar{flex:1;margin-top:0}
.sc-lbl{flex:none;width:85px;font-size:11px;font-weight:600;text-align:right;color:var(--fc-label2)}
.sc-pts{flex:none;width:34px;font-size:11px;font-weight:800;color:var(--fc-label)}
.sc-pts[data-level="ok"]{color:var(--fc-ok)}
.sc-pts[data-level="warn"]{color:var(--fc-warn)}
.sc-pts[data-level="danger"]{color:var(--fc-danger)}
.op-poi{display:flex;flex-wrap:wrap;gap:var(--sp-1)}
.poi-chip{display:inline-flex;align-items:center;gap:var(--sp-1);padding:2px var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--r-pill);background:var(--fc-card);color:var(--fc-label);font-size:12px;font-weight:600}
.poi-chip[data-level="ok"]{border-color:var(--fc-ok)}
.poi-chip[data-level="warn"]{border-color:var(--fc-warn-fill)}
.dec-comps-note{margin-bottom:var(--sp-1);font-size:12px;line-height:16px;color:var(--fc-label2)}
.op-dec-mappa{height:400px;margin-bottom:var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--r)}
.op-legenda{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-2);font-size:12px}
.op-legenda .op-pin{display:inline-block;width:14px;height:14px;margin-right:var(--sp-1);border-width:2px;vertical-align:middle}
.op-pin.is-comp{background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.op-ref{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:var(--fc-accent-fill);color:var(--fc-on-accent);font-size:11px;font-weight:800}
.op-ref.is-escluso{background:var(--fc-fill);color:var(--fc-label)}
.op-x.is-ok{color:var(--fc-accent)}
.op-col-s{width:32px}
.op-tab .op-centro{text-align:center}
.op-mappa-riga{margin-bottom:var(--sp-1)}
.op-mappa-riga .op-azione{margin-left:auto}

/* ── Decisione: riepilogo dei gate, pulsanti, investitori, raccolta, Riunione Operativa (design-06b) ──
   La barra dei pulsanti della Decisione non è .fc-modal-actions: sono sette bottoni, fissa in fondo da
   telefono coprirebbe mezzo schermo. Il verde prende lo spazio con base auto come nella 6a (width:auto
   contro il width:100% di .btn-green, che era in style.css). #genModal sta sotto #opModal nel DOM: openModal
   (opmodal.js) lo alza con is-sopra quando la scheda è aperta e closeModal la toglie. .card
   di base.css ha la sua testata: .op-riu-card ridichiara la propria e la batte per ordine (non .op-card,
   che è la card della Pipeline in area-pipeline.css). */
.op-cl-mini{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-1);padding:var(--sp-1) var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:12px}
.op-cl-mini.is-fatto{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.op-cl-mini .status-dot{margin-right:0}
.op-cl-mini .op-cl-titolo{flex:1;font-size:12px}
.op-cl-mini .op-cl-conta{margin-left:0}
.op-cl-mini.is-fatto .op-cl-conta{color:var(--fc-label)}
.op-cl-barra.is-mini{width:60px;height:6px;margin:0}
.op-dec-azioni{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-2);padding-top:var(--sp-2);border-top:1px solid var(--fc-sep)}
.op-dec-azioni .btn-green{flex:1 1 auto;width:auto;background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.op-dec-azioni .btn-green:disabled{background:var(--fc-bg);color:var(--fc-label2);cursor:not-allowed;transform:none} /* .btn-green:hover di base.css (era in style.css) lo alzerebbe */
.op-inv-testa{margin-bottom:var(--sp-3);font-size:12px;color:var(--fc-label2)}
.op-inv-testa .op-hint{margin-top:var(--sp-1)}
.op-inv-lista{display:flex;flex-direction:column;gap:var(--sp-2);max-height:60vh;overflow-y:auto}
.op-inv{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.op-inv.is-zero{opacity:.55}
.op-inv-nome{font-size:13px;font-weight:700}
.op-inv-contatti{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-1);font-size:12px}
.op-inv-contatti .op-link{white-space:normal;overflow-wrap:anywhere} /* un'email lunga va a capo, non esce dalla card */
.op-inv-cap{flex:none;text-align:right;font-size:13px;font-weight:800}
.op-inv-cap[data-level="ok"]{color:var(--fc-ok)}
.op-inv-cap[data-level="warn"]{color:var(--fc-warn)}
.op-inv-cap[data-level="danger"]{color:var(--fc-danger)}
.op-inv-cap-l{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--fc-label2)}
.op-inv-nota{margin-top:var(--sp-2);text-align:center}
.op-form{display:flex;flex-direction:column;gap:var(--sp-3);max-width:440px}
.op-form-lbl{display:block;font-size:12px;font-weight:700;color:var(--fc-label)}
.op-form-lbl .op-campo{margin-top:var(--sp-1);font-weight:400}
#genModal.is-sopra{z-index:1200}
/* «Salva su Drive» aperto da «PDF Firmato!» (pdf-sign.js, z-index 100000): drive-save.js. */
#genModal.is-sopra-tutto{z-index:100001}
.op-riu-card{margin-top:var(--sp-4);border:1px solid var(--fc-sep);border-radius:var(--r);background:var(--fc-card);color:var(--fc-label);box-shadow:none}
.op-riu-card .card-h{border-bottom:.5px solid var(--fc-sep);background:var(--fc-bg)}
.op-riu-card .card-h h2{color:var(--fc-label)}
.op-riu-card .card-h h2 em{color:var(--fc-label)}
.op-riu-card .card-icon{background:var(--fc-accent-soft);color:var(--fc-accent)}
.op-riu-testa{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--sp-2)}
.op-riu-testa .op-sez{margin:0}
.op-riu-drive{margin-bottom:var(--sp-4)}
.op-riu-dati{margin-bottom:var(--sp-4)}

/* ── Decisione: finestre della mappa e planimetrie di stampa (design-06b) ──
   Le finestre (InfoWindow di Google Maps) vivono nel documento: le classi valgono. Ma il fumetto lo
   disegna Google, sempre bianco anche col tema scuro: il testo sta su --fc-ink, scuro in tutti e due
   i temi (--fc-label in scuro è bianco: testo bianco su bianco, review I6); il secondario è lo stesso
   --fc-ink con opacità (non c'è un token "secondario su superficie chiara"). Il colore del marcatore
   (target o comparabile, dalla fonte) arriva come --c (spec §5.1 caso 2). La sezione planimetrie la
   mostra solo la stampa (#decPlanPrintSection di css/stampa.css, con !important); il numero di colonne
   arriva come --n. Salto pagina nelle due forme: Safari iOS stampa dal telefono (review M4). */
.op-iw{padding:var(--sp-1);color:var(--fc-ink);font-size:12px}
.op-iw-tipo{font-size:11px;font-weight:700;color:var(--c,var(--fc-ink))}
.op-iw-addr{margin:2px 0;font-size:13px;font-weight:600}
.op-iw-det{font-size:11px;opacity:.65}
.op-iw-riga{display:flex;justify-content:space-between;gap:var(--sp-2);margin-top:var(--sp-1)}
.op-iw-prezzo{font-size:13px;font-weight:800;color:var(--c,var(--fc-ink))}
.op-iw-prezzo.is-target{color:var(--fc-accent-fill)}
.dec-plan-print{margin-top:var(--sp-4);page-break-before:always;break-before:page}
.dec-plan-t{margin-bottom:var(--sp-2);font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--fc-label2)}
.dec-plan-griglia{display:grid;grid-template-columns:repeat(var(--n,1),1fr);gap:var(--sp-2)}
.dec-plan-item{page-break-inside:avoid;break-inside:avoid}
.dec-plan-img{display:block;width:100%;height:auto;border:1px solid var(--fc-sep);border-radius:var(--rs)}
.dec-plan-cap{margin-top:2px;font-size:11px;font-weight:600;text-align:center;color:var(--fc-label2)}

/* ── Contenuto dei passi: vocabolario dei numeri (design-07a) ──
   Il regime fiscale (Persona Fisica, Società IVA, Imposta Registro) arriva come data-regime e dà --rc:
   filetto, pallino e barra, mai il colore di un testo (il giallo di prima era 1,7:1 sul bianco). Le fasi
   del progetto arrivano come data-fase coi colori degli stati della pipeline, larghezza come --w (spec §5.1
   caso 2); il testo è --fc-ink, scuro in tutti e due i temi (i colori di stato sono chiari). La stessa barra
   la usa il Cronoprogramma (PR 7b). data-dec-regime e data-dec-compare restano: li legge il filtro di stampa
   per regime di stampa.css. Dentro un riquadro già --fc-bg il totale delle tabelle va su --fc-fill. */
[data-regime="PF"]{--rc:var(--fc-ok)}
[data-regime="IVA"]{--rc:var(--fc-info)}
[data-regime="IR"]{--rc:var(--fc-warn-fill)}
.op-num-box{margin-bottom:var(--sp-4);padding:var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-num-box.is-accento{border-left:3px solid var(--fc-accent-fill)}
.op-num-testa{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.op-num-t{font-size:11px;line-height:14px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--fc-label2)}
.op-num-box>.op-num-t{display:block;margin-bottom:var(--sp-2)}
.op-num-box .op-tab td{padding:2px var(--sp-1);font-size:12px}
.op-tab td.is-forte{font-weight:600}
.op-tab tr.op-tab-tot.is-forte td{border-top-color:var(--fc-label);font-weight:800}
.op-num-box .op-tab tr.op-tab-tot td{background:var(--fc-fill)}
.op-fasi{display:flex;height:40px;margin-bottom:var(--sp-4);border-radius:var(--rs);overflow:hidden}
.op-fase{display:flex;flex:0 1 auto;flex-direction:column;align-items:center;justify-content:center;width:var(--w,0%);min-width:40px;background:var(--c);color:var(--fc-ink);line-height:1.1}
.op-fase[data-fase="prel"]{--c:var(--st-preliminare)}
.op-fase[data-fase="presv"]{--c:var(--st-due_diligence_conclusa)}
.op-fase[data-fase="rog"]{--c:var(--st-rogito)}
.op-fase[data-fase="lav"]{--c:var(--st-cantiere)}
.op-fase[data-fase="ven"]{--c:var(--st-in_vendita)}
.op-fase-l{font-size:11px;font-weight:700}
.op-fase-m{font-size:13px;font-weight:800}

/* ── Decisione e BP: le tre schede scenario (design-07a) ──
   Stesso componente nella Decisione e nella tab BP (#bpKPI, scritto da _bpCalcInner). Chiare, col filetto
   del regime; profitto verde o rosso dal data-level (la stampa di css/stampa.css legge lo stesso attributo e
   forza fondo, bordo e colori con !important). Da telefono una colonna: era il blocco 8 di mobile.css per
   #bpKPI e .dec-scenarios del blocco 10, tutti e due con !important contro l'inline. */
.dec-scenarios{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2);margin-bottom:var(--sp-4)}
.dec-scenarios.is-bp{margin-bottom:var(--sp-1)}
.dec-sc-card{padding:var(--sp-3);border:1px solid var(--fc-sep);border-left:3px solid var(--rc,var(--fc-sep));border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
/* Scheda del regime non attivo (tab BP): niente filetto del regime e numeri in grigio. Leggibile: a opacity .4
   (prima .3) etichette e numeri scendevano a circa 1,9:1 e chi confronta i regimi non li leggeva. */
.dec-sc-card.is-spento{border-left-color:var(--fc-sep)}
.dec-sc-card.is-spento .dec-sc-val{color:var(--fc-label2)}
.dec-sc-title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1);margin-bottom:var(--sp-2);font-size:11px;line-height:14px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--fc-label2)}
.dec-sc-griglia{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-1) var(--sp-2)}
.dec-sc-label{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--fc-label2)}
.dec-sc-val{font-size:14px;font-weight:700;color:var(--fc-label);font-variant-numeric:tabular-nums;white-space:nowrap}
.dec-sc-val.is-grande{font-size:17px;font-weight:800}
.dec-sc-val[data-level="ok"]{color:var(--fc-ok)}
.dec-sc-val[data-level="danger"]{color:var(--fc-danger)}
@media screen and (max-width:768px){.dec-scenarios{grid-template-columns:1fr}}

/* ── Decisione: confronto fra regimi e sensitivity (design-07a) ──
   Barre sul riempimento, larghezza come --w, colore del regime; la migliore piena, le altre a metà (come
   prima). Il colore dei cursori viene dal livello (accent-color); le celle dei risultati le riscrive
   runSensitivity (opmodal-finance.js) a ogni movimento, con le stesse classi. Le intestazioni della
   sensitivity restano scritte come oggi (niente maiuscolo: il testo del PDF non cambia). Sotto i 480 px
   quattro colonne non tengono una cifra a sette caratteri: tre colonne di valori e l'etichetta sopra,
   su una riga intera. */
.op-cmp{display:grid;grid-template-columns:72px repeat(3,minmax(0,1fr));gap:var(--sp-1) var(--sp-2);align-items:center;font-size:12px}
.op-cmp-h{display:flex;align-items:center;justify-content:center;gap:var(--sp-1);font-size:11px;font-weight:700;color:var(--fc-label);text-align:center}
.op-cmp-h::before,.op-sens-l::before{content:'';flex:none;width:8px;height:8px;border-radius:50%;background:var(--rc,var(--fc-sep))}
.op-cmp-l{font-weight:600;color:var(--fc-label)}
.op-cmp-c{min-width:0;text-align:center}
.op-cmp-barra{height:12px;margin-bottom:2px;border-radius:3px;background:var(--fc-fill);overflow:hidden}
.op-cmp-barra>i{display:block;width:var(--w,0%);height:100%;border-radius:3px;background:var(--rc);opacity:.5}
.op-cmp-c.is-best .op-cmp-barra>i{opacity:1}
.op-cmp-v{font-size:11px;color:var(--fc-label);font-variant-numeric:tabular-nums;white-space:nowrap}
.op-cmp-c.is-best .op-cmp-v{font-weight:800;color:var(--fc-accent)}
.op-sens-slider{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3);margin-bottom:var(--sp-2)}
.op-sens-lbl{display:flex;justify-content:space-between;gap:var(--sp-2);font-size:12px;font-weight:600;color:var(--fc-label)}
.op-sens-pct{font-weight:800}
.op-sens-range{width:100%;accent-color:var(--fc-accent-fill)}
.op-sens-range[data-level="danger"]{accent-color:var(--fc-danger)}
.op-sens-griglia{display:grid;grid-template-columns:minmax(0,1.2fr) repeat(3,minmax(0,1fr));gap:var(--sp-1) var(--sp-2);align-items:center;font-size:12px}
.op-sens-h{font-size:11px;font-weight:600;color:var(--fc-label2)}
.op-sens-h.is-centro{text-align:center}
.op-sens-l{display:flex;align-items:center;gap:var(--sp-1);font-weight:600;color:var(--fc-label)}
.op-sens-v{text-align:center;color:var(--fc-label);font-variant-numeric:tabular-nums;white-space:nowrap}
.op-sens-v.is-forte{font-weight:800}
.op-sens-v.op-tenue{color:var(--fc-label2)}
.op-sens-pct[data-level="ok"],.op-sens-l[data-level="ok"],.op-sens-v[data-level="ok"]{color:var(--fc-ok)}
.op-sens-pct[data-level="danger"],.op-sens-l[data-level="danger"],.op-sens-v[data-level="danger"]{color:var(--fc-danger)}
.op-sens-nota{margin-top:var(--sp-1);text-align:center}
@media screen and (max-width:480px){
  .op-sens-slider{grid-template-columns:1fr}
  .op-cmp,.op-sens-griglia{grid-template-columns:repeat(3,minmax(0,1fr));font-size:11px;gap:var(--sp-1)}
  .op-cmp-vuoto{display:none}
  .op-cmp-l,.op-sens-l,.op-sens-h.is-riga{grid-column:1/-1}
}

/* ── Decisione: RLV (design-07a) ──
   Da telefono due colonne (era .dec-rlv-grid del blocco 10 di mobile.css, con !important contro l'inline). */
.dec-rlv-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2);margin-bottom:var(--sp-4)}
.op-rlv{padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-left:3px solid var(--rc,var(--fc-sep));border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-rlv-v{font-size:17px;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
.op-rlv-mq{font-size:11px;color:var(--fc-label2)}
@media screen and (max-width:768px){.dec-rlv-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ── Decisione: costi, cash flow, piano vendita (design-07a) ──
   I due riquadri dei costi stavano in una griglia 1fr 1fr: una colonna non scende sotto il suo contenuto
   e a 375 px il CAPEX spingeva la scheda a 496 px (anche in produzione). minmax(0,1fr) e una colonna sotto
   i 768. Il canvas del cash flow riempie il suo contenitore (Chart.js lo ridimensiona da sé). .tag era a
   .58rem (9,3 px) quando stava in style.css: nella scheda saliva a 11 px con la regola qui sotto; dalla 13a .tag è a
   11 px ovunque (base.css) e la regola resta come guardia della scheda. */
.op-dec-costi{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2);margin-bottom:var(--sp-4)}
.op-dec-costi>.op-num-box{margin-bottom:0}
.op-cf-grafico{position:relative;width:100%;height:180px;margin-bottom:var(--sp-2)}
.op-cf-grafico>canvas{width:100%;height:100%}
#opModalBody .tag{font-size:11px}
@media screen and (max-width:768px){.op-dec-costi{grid-template-columns:1fr}}

/* ── Decisione: tracker dei costi effettivi (design-07a, era COST TRACKER di style.css) ──
   Colonne che possono stringersi (a 375 il campo da 90 px spingeva la riga). Il campo è un .op-campo
   come gli altri della scheda. La barra riceve la larghezza come --w e il colore dal livello. */
.ct-row{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr) 64px;gap:var(--sp-2);align-items:center;padding:var(--sp-1) 0;border-bottom:.5px solid var(--fc-sep);color:var(--fc-label);font-size:13px}
.ct-row.ct-testa{border-bottom:2px solid var(--fc-sep);font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--fc-label2)}
.ct-row.ct-tot{padding-top:var(--sp-2);border-top:2px solid var(--fc-sep);border-bottom:0;font-weight:800}
.ct-num{text-align:right;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.ct-d{text-align:center;font-weight:700}
.ct-inp{width:100%;max-width:120px;text-align:right}
.ct-over{color:var(--fc-danger)}
.ct-under{color:var(--fc-ok)}
.ct-bar{height:4px;margin-top:var(--sp-2);border-radius:2px;background:var(--fc-rail);overflow:hidden}
.ct-bar-fill{width:var(--w,0%);height:100%;border-radius:2px;background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.ct-bar[data-level="warn"] .ct-bar-fill{background:var(--fc-warn-fill)}
.ct-bar[data-level="danger"] .ct-bar-fill{background:var(--fc-danger)}
/* Sotto i 600 px quattro colonne non bastano: una cifra da milioni (80 px) non stava in una colonna da 66, e il campo
   a 16 px (la regola dei campi da telefono, fino a 768, in coda a base.css) tagliava "2.400.000" a 375 (85 px) e ancora a 500 (93). La voce va su una riga sua e i tre numeri
   si dividono la riga sotto; in testa "VOCE" sparisce e BUDGET, EFFETTIVO e Δ% restano sopra le loro colonne.
   Ogni riga è una griglia a sé, quindi la colonna del Δ% resta fissa (allinea le righe): "+650,0%" in grassetto
   misura 61 px a 13 px e usciva dalla colonna da 56, da qui 64; a 12 px sta nei 60. */
@media screen and (max-width:600px){
  .ct-row{grid-template-columns:minmax(0,1fr) minmax(0,1fr) 60px;gap:2px var(--sp-2);font-size:12px}
  .ct-row>:first-child{grid-column:1/-1}
  .ct-row.ct-testa>:first-child{display:none}
}

/* ── BP & Crono: sezioni del BP (design-07b, era CE TABLE di style.css) ──
   Le intestazioni che aprono e chiudono una sezione (i grafici, Task 9) sono bottoni: il prefisso
   #opModalBody batte il centraggio di #opModalBody button (in testa al foglio); cursore e passaggio del mouse
   solo sui bottoni (la testata del Piano Vendita non apre niente). La freccia cambia testo, senza
   rotazione animata. .ce-section e .ce-total erano regole morte (nessun uso in js/ né in index.html):
   sparite. Il BP non si stampa (.bp-section di css/stampa.css in @media print). */
.bp-section{margin-bottom:var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);overflow:hidden}
.bp-section-head,#opModalBody .bp-section-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);width:100%;padding:var(--sp-2) var(--sp-3);border:0;border-bottom:.5px solid var(--fc-sep);background:transparent;color:var(--fc-label2);font:inherit;font-size:11px;line-height:14px;font-weight:700;letter-spacing:.04em;text-align:left;text-transform:uppercase}
button.bp-section-head{cursor:pointer}
.bp-section-body{display:none;padding:var(--sp-2) var(--sp-3)}
.bp-section-body.bp-open{display:block}
.bp-chev{font-size:11px;color:var(--fc-label2)}
@media (hover:hover){#opModalBody button.bp-section-head:hover{background:var(--fc-bg)}}

/* ── Cronoprogramma: card, condizioni sospensive, scadenze, importi (design-07b) ──
   La card: le sue regole stanno in base.css (dalla 13a; era style.css:14, .card{background:#fff}, in scuro
   la lasciava bianca col testo bianco); il blocco resta come sicurezza sui token: fondo, testo e testata dai
   token, come la card Riunione della 6b. Titoli neutri come negli altri passi; l'urgenza la dicono il
   riquadro ambra e i chip delle scadenze (7 e 30 giorni tutti e due ambra: li distingue l'icona).
   Il riquadro della verifica delle condizioni sospensive porta icona, testo e bottone sulla stessa riga.
   .fg-hint (base.css, era in style.css) è a .62rem (9,9 px): qui 12 px. */
.op-crono-card{border:1px solid var(--fc-sep);background:var(--fc-card);color:var(--fc-label);box-shadow:none}
.op-crono-card .card-h{border-bottom:.5px solid var(--fc-sep);background:var(--fc-bg)}
.op-crono-card .card-h h2{color:var(--fc-label)}
.op-crono-card .card-icon{background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.op-box.op-crono-cs{display:flex;align-items:center;gap:var(--sp-2);margin-top:0}
/* fc-app-015: il gruppo «Preliminare» dentro Date Effettive (bozza al notaio, firma, condizioni avverate). */
.op-crono-sub{margin:var(--sp-3) 0 var(--sp-1);font-size:13px;line-height:18px;font-weight:600;color:var(--fc-label2)}
.op-crono-tag{display:inline-flex;align-items:center;margin-left:var(--sp-1);padding:0 var(--sp-1);border-radius:var(--r-pill);background:var(--fc-fill);color:var(--fc-label);font-size:11px;line-height:16px;font-weight:700;letter-spacing:0;text-transform:none;white-space:nowrap}
.op-crono-tag[data-level="ok"]{background:var(--fc-accent-soft);color:var(--fc-accent)}
.op-crono-tag[data-level="warn"]{background:var(--fc-warn-soft);color:var(--fc-warn)}
.op-crono-tag[data-level="danger"]{background:var(--fc-danger-soft);color:var(--fc-danger)}
.op-box.op-crono-somma{justify-content:space-between;margin-top:var(--sp-2)}
#opModalBody .fg-hint{margin-top:var(--sp-1);font-size:12px;line-height:16px;color:var(--fc-label2)}

/* ── Cronoprogramma: timeline, durate, date unità, impatto, modelli di BP (design-07b) ──
   La barra delle fasi è quella della 7a (colori degli stati, testo scuro), qui bassa e senza la larghezza
   minima: le fasi brevi restano proporzionate. Le durate portano il pallino della fase (erano numeri in
   cinque colori sul crema). "Date Unità": a 375 il contenitore overflow:hidden tagliava "Data Rogito";
   un campo data a 16 px (il minimo da telefono) non scende sotto ~145 px, quindi sotto i 480 px ogni unità
   diventa un blocco: nome, poi le due date con la loro etichetta (data-l). Le intestazioni restano nel DOM.
   I modelli di BP: applica e × sono due bottoni fratelli (la × stava dentro il bottone). */
.op-fasi.is-crono{height:28px;margin:var(--sp-2) 0 0}
.op-fasi.is-crono .op-fase{min-width:0;font-size:11px;font-weight:700;white-space:nowrap;overflow:hidden}
.op-durate{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:var(--sp-1);text-align:center}
.op-durata{display:flex;flex-direction:column;align-items:center}
.op-durata::before{content:'';width:8px;height:8px;margin-bottom:2px;border-radius:50%;background:var(--c)}
.op-durata[data-fase="prel"]{--c:var(--st-preliminare)}
.op-durata[data-fase="presv"]{--c:var(--st-due_diligence_conclusa)}
.op-durata[data-fase="rog"]{--c:var(--st-rogito)}
.op-durata[data-fase="lav"]{--c:var(--st-cantiere)}
.op-durata[data-fase="ven"]{--c:var(--st-in_vendita)}
.op-durata-m{font-size:13px;font-weight:700;color:var(--fc-label)}
.op-crono-date{display:flex;justify-content:space-between;gap:var(--sp-2);margin-top:var(--sp-1)}
.op-crono-imp{gap:var(--sp-4);font-size:13px}
.op-pos{color:var(--fc-ok)}
.op-tpl{margin-bottom:var(--sp-2)}
.op-tpl-item{display:inline-flex;align-items:center;gap:2px}
@media screen and (max-width:480px){
  .op-durate{grid-template-columns:repeat(3,minmax(0,1fr))}
  .op-crono-unita thead{display:none}
  .op-crono-unita tbody tr{display:block;padding:var(--sp-2) 0;border-bottom:.5px solid var(--fc-sep)}
  .op-crono-unita td{display:block;padding:var(--sp-1) var(--sp-2);border-bottom:0}
  .op-crono-unita td[data-l]::before{content:attr(data-l);display:block;margin-bottom:2px;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--fc-label2)}
}

/* ── BP: parte alta (design-07b) ──
   Il consuntivo di un'operazione completata e il confronto "BP contro realtà" erano riquadri neri col testo
   bianco al 40-65%: chiari, come la vista storico della PR 5. Le righe del confronto restano display:contents
   nella griglia a quattro colonne. */
.bp-storico{max-width:600px;margin:0 auto}
.bp-sto-griglia{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2)}
.bp-sto-v{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums}
.bp-sto-v[data-level="ok"],.bp-bpr-v[data-level="ok"]{color:var(--fc-ok)}
.bp-sto-v[data-level="danger"],.bp-bpr-v[data-level="danger"]{color:var(--fc-danger)}
.bp-bpr{margin-top:var(--sp-4);border-left:3px solid var(--fc-warn-fill)}
.bp-bpr-griglia{display:grid;grid-template-columns:auto repeat(3,minmax(0,1fr))}
.bp-bpr-riga{display:contents}
.bp-bpr-l,.bp-bpr-v{padding:var(--sp-1) var(--sp-2);font-size:12px}
.bp-bpr-l{font-weight:600}
.bp-bpr-v{text-align:right;font-variant-numeric:tabular-nums}
.bp-bpr-griglia>.op-num-t{text-align:right;padding:0 var(--sp-2)}
/* A 360 px «EFFETTIVO» (11 px maiuscolo spaziato) era più largo della sua colonna e sconfinava di 7 px
   verso DELTA (residuo della 7b): sotto i 400 px meno spaziatura e meno margine, stesso testo. */
@media screen and (max-width:400px){
  .bp-bpr-griglia>.op-num-t{padding:0 var(--sp-1);letter-spacing:0}
}
.bp-bpr-v.is-forte{font-weight:700}
.bp-strumenti{margin-bottom:var(--sp-2)}
.op-box.bp-stima{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.bp-stima-p{font-size:15px;font-weight:800;color:var(--fc-info)}
.bp-stima .op-hint:last-child{margin-left:auto}
.bp-kpi{margin-bottom:var(--sp-3)}
@media screen and (max-width:480px){.bp-sto-griglia{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ── BP: barra di configurazione e tabella CE (design-07b, era BP CONFIG BAR e CE INLINE TABLE di style.css) ──
   .ce-col-val era text-align:right!important: qui basta th.ce-col-val. Le righe di sezione avevano tre
   !important contro lo stile inline: non serve più. Il totale generale era la riga nera --fc-ink: fondo
   --fc-bg col testo pieno (su --fc-fill i totali negativi rossi scendevano a 4,48:1); il profitto col solo
   filetto verde sopra (su --fc-accent-soft una colonna spenta scendeva a 4,39:1 in scuro). Le intestazioni
   PF/IVA/IR prendono un filetto del colore del regime (data-regime nel markup; il "●" di testo dell'attiva
   lo scrive _bpCalcInner come oggi). _bpCalcInner mette is-spento su intestazione e celle dei regimi non
   attivi (testo grigio, niente opacity: al 35% il testo scendeva a 2,4:1), is-neg sui valori negativi,
   is-sovrascritto sulle etichette automatiche (Task 7). Il pilota del BP (bp-pilota.js) è già sui token:
   le sue regole passano qui come sono, a px. */
.bp-config-bar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--sp-2) var(--sp-3);margin-bottom:var(--sp-3);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.bp-cfg-item{display:flex;flex-direction:column;gap:2px}
.bp-cfg-item>label{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--fc-label2)}
.bp-cfg-item>label.bp-cfg-casella{display:flex;flex-direction:row;align-items:center;gap:var(--sp-1)}
.bp-cfg-item select,.bp-cfg-item input{min-height:32px;padding:var(--sp-1) var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px}
.bp-cfg-item select{max-width:130px}
.bp-cfg-item input.is-70{width:70px}
.bp-cfg-item input.is-50{width:50px}
.bp-cfg-casella input{width:auto;min-height:0;margin:0;padding:0}
.bp-cfg-imposte{font-size:12px;font-weight:600;color:var(--fc-accent);white-space:nowrap}
.bp-cfg-timeline{align-self:center;margin-left:auto;border:0;font:inherit;font-size:11px;cursor:pointer}
@media (hover:hover){.bp-cfg-timeline:hover{background:var(--fc-accent-soft);color:var(--fc-accent)}}
.bp-main-grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:var(--sp-3);align-items:start}
.bp-ce-col{min-width:0}
.bp-ce-scorre{overflow-x:auto}
.ce-inline-table{width:100%;border-collapse:collapse;font-size:12px}
.ce-inline-table thead{background:transparent}
.ce-inline-table th{padding:var(--sp-1) 4px;border-bottom:.5px solid var(--fc-sep);color:var(--fc-label2);font-size:11px;font-weight:600;letter-spacing:.04em;text-align:left;text-transform:uppercase;white-space:nowrap}
.ce-inline-table td{padding:2px 4px;border-bottom:.5px solid var(--fc-sep);color:var(--fc-label)}
.ce-inline-table tbody tr{border-bottom:0;background:transparent}
.ce-inline-table th.ce-col-voce{min-width:130px}
.ce-inline-table th.ce-col-inp{min-width:100px}
.ce-inline-table th.ce-col-val{min-width:85px;text-align:right}
.ce-inline-table th[data-regime]{border-bottom:2px solid var(--rc)}
.ce-v{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.ce-v.ce-bold{font-weight:700}
.ce-v.ce-sm{font-size:12px;color:var(--fc-label2)}
.ce-v.is-neg{color:var(--fc-danger)}
.ce-v[data-level="ok"]{color:var(--fc-ok)}
.ce-v[data-level="danger"]{color:var(--fc-danger)}
.ce-section-row td{padding:var(--sp-2) var(--sp-2) var(--sp-1);background:var(--fc-bg);color:var(--fc-accent);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.ce-total-row td{border-top:1.5px solid var(--fc-sep);font-weight:600}
.ce-grand-total-row td{border-top:2px solid var(--fc-accent-fill);background:var(--fc-bg);color:var(--fc-label);font-weight:800}
.ce-profit-row td{padding:var(--sp-1) var(--sp-2);border-top:2px solid var(--fc-accent-fill);color:var(--fc-label)}
.ce-profit-l{font-size:14px;font-weight:800}
.ce-profit-v{font-size:14px}
.ce-inline-table th.is-spento,.ce-inline-table .ce-v.is-spento{color:var(--fc-label2)}
.ce-inline-table th[data-regime].is-spento{border-bottom-color:var(--fc-sep)}
.ce-calc,.ce-inline-table td.ce-calc{font-size:12px;font-style:italic;color:var(--fc-label2)}
.ce-inline-table td.is-forte{font-weight:600}
.ce-inp{width:80px;min-height:28px;padding:2px var(--sp-1);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px;text-align:right}
.ce-inp:focus{border-color:var(--fc-accent);outline:none;box-shadow:0 0 0 3px var(--fc-accent-soft)}
.ce-inp-eur{width:85px}
.ce-inp-pct{width:50px}
.ce-inp.is-60{width:60px}
.ce-inp.is-70{width:70px}
.ce-inp-wrap{display:flex;align-items:center;gap:var(--sp-1)}
.ce-unit{font-size:11px;color:var(--fc-label2);white-space:nowrap}
.ce-unit-warn{color:var(--fc-danger);font-weight:600}
.ce-auto{color:var(--fc-accent)}
.ce-auto.is-sovrascritto{color:var(--fc-label2);text-decoration:line-through}
.ce-warn-row td{padding:2px var(--sp-2) var(--sp-1);color:var(--fc-danger);font-size:12px;font-weight:600;white-space:normal}
.ce-inp.ce-inp-ro{background:var(--fc-fill);color:var(--fc-label);border-style:dashed;cursor:not-allowed}
.bp-pilota-blocco{margin-bottom:var(--sp-1);padding:var(--sp-1) var(--sp-1) var(--sp-2);border-bottom:1px solid var(--fc-sep);color:var(--fc-label2);font-size:12px;white-space:normal}
.bp-pilota-switch{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--fc-label)}
.bp-pilota-switch input{width:auto;margin:0}
.bp-pilota-motivo{color:var(--fc-label2)}
.bp-pilota-riga{margin-top:2px}
.bp-pilota-avviso{margin-top:2px;padding:1px 4px;border-radius:4px;background:var(--fc-warn-soft);color:var(--fc-warn);font-weight:600}
.bp-pilota-link{padding:0;border:0;background:none;color:var(--fc-accent);font:inherit;text-decoration:underline;cursor:pointer}
.bp-pilota-storico{margin:2px 0 0 12px;padding:0}
@media screen and (max-width:900px){.bp-main-grid{grid-template-columns:1fr}}

.bp-regime{color:var(--fc-accent);font-weight:600}
.op-box.bp-apt-sum{gap:var(--sp-1) var(--sp-3);margin-top:var(--sp-2);font-size:12px}

/* ── BP: scratchpad, piano vendita, colonna Mercato (design-07b, era SCRATCHPAD e "BP · colonna Mercato" di style.css) ──
   Il pannello Mercato riceve il massimo da _clampPanel come --mw (spec §5.1 caso 2). thead di base.css vale
   per ogni tabella: la tabella del pannello e quella del piano vendita (op-tab) lo ridichiarano trasparente.
   Dentro i chip del Mercato la freccia e la nota prendono il colore del chip (in grigio, sul verde chiaro in
   scuro scendevano a 4,39:1). */
.bp-scratchpad{position:sticky;top:0;border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);overflow:hidden}
.bp-sp-header{display:flex;align-items:center;justify-content:space-between;padding:var(--sp-1) var(--sp-2);border-bottom:.5px solid var(--fc-sep);background:var(--fc-bg);color:var(--fc-label2);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.bp-sp-formula{max-width:160px;overflow:hidden;color:var(--fc-accent);font-size:11px;font-weight:600;letter-spacing:0;text-overflow:ellipsis;text-transform:none;white-space:nowrap}
.bp-sp-grid{max-height:500px;overflow-y:auto}
.bp-sp-table{width:100%;border-collapse:collapse;font-size:12px}
.bp-sp-table th{position:sticky;top:0;z-index:1;padding:2px var(--sp-1);border-bottom:.5px solid var(--fc-sep);background:var(--fc-bg);color:var(--fc-label2);font-size:11px;font-weight:700;text-align:center}
.bp-sp-rownum{width:20px;padding:2px;border-right:.5px solid var(--fc-sep);background:var(--fc-bg);color:var(--fc-label2);font-size:11px;text-align:center;user-select:none}
.bp-sp-cell{min-width:50px;max-width:55px;padding:2px var(--sp-1);border:.5px solid var(--fc-sep);color:var(--fc-label);font-size:12px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:cell}
@media (hover:hover){.bp-sp-cell:hover{border-color:var(--fc-accent);background:var(--fc-bg)}}
.bp-sp-edit{width:100%;padding:0 2px;border:0;outline:none;background:var(--fc-accent-soft);color:var(--fc-label);font:inherit;font-size:12px;text-align:right}
.bp-pv{margin-top:var(--sp-4)}
.bp-pv-ctrl,.bp-pv-qta{gap:var(--sp-1)}
.bp-pv-scorre,.bp-mkt-scorre{overflow-x:auto}
.bp-pv-tab .op-campo{min-height:32px;padding:2px var(--sp-1)}
.bp-pv-tab .op-campo.num{width:96px}
.bp-pv-tab .op-campo.num.is-mq{width:64px}
.bp-pv-tab select.op-campo{width:auto;min-width:110px}
.op-campo.is-corto{width:48px;text-align:center}
.op-chip.bp-scen{border:1px solid var(--fc-accent);background:var(--fc-card);color:var(--fc-accent);font:inherit;font-size:11px;font-weight:700;cursor:pointer}
.op-chip.bp-scen[aria-pressed="true"]{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.bp-mkt-cell{font-size:12px;white-space:nowrap;cursor:pointer}
.bp-mkt{display:inline-flex;align-items:center;gap:var(--sp-1);padding:2px var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label);line-height:1.3}
.bp-mkt strong{font-weight:700}
.bp-mkt em{font-style:normal;font-weight:400;font-size:11px;color:inherit}
.bp-mkt-caret{font-size:11px;color:inherit}
.bp-mkt-ok{border-color:var(--fc-ok);background:var(--fc-accent-soft);color:var(--fc-accent)}
.bp-mkt-warn{border-color:var(--fc-warn-fill);background:var(--fc-warn-soft);color:var(--fc-warn)}
.bp-mkt-alert{border-color:var(--fc-danger);background:var(--fc-danger-soft);color:var(--fc-danger)}
.bp-mkt-low{border-color:var(--fc-info);background:var(--fc-info-soft);color:var(--fc-info)}
.bp-mkt-scarso{border-style:dashed;color:var(--fc-label2)}
.bp-mkt-nd{color:var(--fc-label2)}
.bp-mkt-none{border-color:transparent;background:transparent;color:var(--fc-label2);cursor:default}
.bp-mkt-detail>td{padding:0 var(--sp-1) var(--sp-2);background:var(--fc-bg)}
.bp-mkt-panel{position:sticky;left:0;max-width:var(--mw,none);padding:var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.bp-mkt-sum{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1) var(--sp-3);margin-bottom:var(--sp-2);font-size:12px}
.bp-mkt-sum strong{margin-right:var(--sp-1);color:var(--fc-label2);font-weight:600}
.bp-mkt-byf{color:var(--fc-label2)}
.bp-mkt-usa{margin-left:auto;font-size:11px}
.bp-mkt-empty{padding:var(--sp-1) 0;color:var(--fc-label2);font-size:12px}
.bp-mkt-table{width:100%;font-size:12px}
.bp-mkt-table thead{background:transparent}
.bp-mkt-table th{color:var(--fc-label2);font-size:11px;letter-spacing:.04em;text-transform:uppercase;white-space:nowrap}
.bp-mkt-table td,.bp-mkt-table th{padding:var(--sp-1)}
.bp-mkt-table .r{text-align:right}
.bp-mkt-table a{color:var(--fc-info);text-decoration:none}
.bp-mkt-dim{color:var(--fc-label2);font-size:11px}
.bp-mkt-fonte{display:inline-block;padding:0 var(--sp-1);border-radius:3px;font-size:11px;font-weight:700;white-space:nowrap}
.bp-mkt-fonte-cf{background:var(--fc-info-soft);color:var(--fc-info)}
.bp-mkt-fonte-st{background:var(--fc-accent-soft);color:var(--fc-accent)}
.bp-mkt-fonte-mn{background:var(--fc-fill);color:var(--fc-label)}
.bp-mkt-ctx{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1) var(--sp-3);margin:0 0 var(--sp-2);padding:var(--sp-1) var(--sp-2);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label);font-size:12px}
.bp-mkt-ctx-lbl{color:var(--fc-label2);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}
.bp-mkt-tgl{padding:2px var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:12px;cursor:pointer}
.bp-mkt-tgl.on{border-color:var(--fc-ok);background:var(--fc-accent-soft);color:var(--fc-accent)}
.bp-mkt-link{margin-left:auto;padding:2px var(--sp-1);border:0;background:transparent;color:var(--fc-info);font:inherit;font-size:12px;cursor:pointer}
@media screen and (max-width:900px){.bp-scratchpad{max-height:300px}}
@media screen and (max-width:640px){.bp-mkt-cell{white-space:normal}.bp-mkt-usa,.bp-mkt-link{margin-left:0}}

/* ── BP: grafici, Waterfall (design-07b) ──
   Il canvas riempie il suo contenitore (Chart.js lo ridimensiona: position:relative e l'altezza stanno sul
   contenitore). Due colonne da computer, una sotto i 1024 (era .bp-two-col{…!important} in una riga di
   style.css con .fr e .fr3, che erano lì e restano, ora in base.css). */
.bp-two-col{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3);margin-top:var(--sp-3)}
.bp-grafico{position:relative;height:280px}
.bp-grafico.is-basso{height:220px}
.bp-grafico>canvas{width:100%;height:100%}
.bp-wf-griglia{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-1);margin-bottom:var(--sp-2)}
.bp-wf-griglia .stat-card{padding:var(--sp-2)}
.bp-wf-griglia .stat-val{font-size:15px}
@media screen and (max-width:1024px){.bp-two-col{grid-template-columns:1fr}}

/* ── Tab Cantiere: Task di cantiere (Fase 9, js/modules/cantiere-task*.js) ──
   Erano in coda a style.css e in un blocco da telefono che stava in mobile.css: qui dalla review xhigh
   (rilievo 10), con lo stesso disegno. I rem di prima diventano px esatti: da computer sulla
   radice del browser (16 px), da telefono sulla radice che aveva mobile.css (19 px, la sua "scala
   tipografica dalla radice"), riscritti nel blocco sotto i 768 px. I nomi vecchi del testo, dei bordi, del verde, del giallo
   chiaro e del rosso sono diventati i token --fc-label/-sep/-accent/-warn-soft/-danger, e il
   bianco sul verde e' --fc-on-accent. Cambia solo, da computer, il testo che era sotto gli 11 px
   (sottotitolo, bottoni, etichette, stato, nomi dei campi: 9,3-10,4 px): sale a 11 px come .tag
   qui sopra; da telefono era gia' sopra. I tre fondi colorati dichiarano il loro colore
   (--fc-label, lo stesso che ereditavano). La sezione vive in #cantTaskRoot, sorella di #cantRoot, sotto il Programma lavori. */
.ctask{margin:9.6px 0;font-size:11.2px;color:var(--fc-label)}
.ctask-muto{color:var(--fc-label2)}
.ctask-titolo{font-weight:700;font-size:12.8px}
.ctask-sub{color:var(--fc-label2);font-size:11px;margin:2.4px 0}
.ctask-testa,.ctask-crea{border:1px solid var(--fc-sep);border-radius:8px;padding:8px 9.6px;background:var(--fc-card)}
.ctask-kpi{display:flex;flex-wrap:wrap;gap:4.8px 16px;margin:5.6px 0}
.ctask-rosso{color:var(--fc-danger)}
.ctask-viste,.ctask-azioni{display:flex;flex-wrap:wrap;gap:4.8px;margin-top:5.6px}
.ctask-gruppo{display:flex;flex-wrap:wrap;gap:4.8px}
.ctask-btn{font-size:11px;padding:4px 8.8px;border:1px solid var(--fc-sep);border-radius:6px;background:var(--fc-bg);color:var(--fc-label);cursor:pointer}
.ctask-btn[disabled]{opacity:.5;cursor:not-allowed}
.ctask-btn.ctask-on{background:var(--fc-accent-soft);border-color:var(--fc-accent);color:var(--fc-label)}
.ctask-primario{background:var(--fc-accent);border-color:var(--fc-accent);color:var(--fc-on-accent)}
.ctask-leggero{background:transparent}
.ctask-avviso{margin:5.6px 0;padding:5.6px 8px;border-radius:6px;background:var(--fc-info-soft)}
.ctask-avviso-warn{background:var(--fc-warn-soft);color:var(--fc-warn)}
.ctask-avviso-errore{color:var(--fc-danger);font-weight:600}
.ctask-cat,.ctask-sez{margin:6.4px 0;border:1px solid var(--fc-sep);border-radius:8px;padding:4.8px 9.6px;background:var(--fc-card)}
.ctask-cat summary,.ctask-sez summary{cursor:pointer;font-weight:600}
.ctask-conto{font-weight:400;color:var(--fc-label2)}
.ctask-lista{list-style:none;margin:3.2px 0;padding:0}
.ctask-lista li{padding:2.4px 0;border-bottom:1px solid var(--fc-sep)}
.ctask-num{display:inline-block;min-width:25.6px;color:var(--fc-label2);font-variant-numeric:tabular-nums}
.ctask-riga{display:flex;flex-wrap:wrap;align-items:center;gap:4.8px 8px;padding:4.8px 0;border-bottom:1px solid var(--fc-sep)}
.ctask-riga.ctask-aperta{background:var(--fc-accent-soft);color:var(--fc-label)}
.ctask-riga.ctask-completata .ctask-testo,.ctask-riga.ctask-non_applicabile .ctask-testo{color:var(--fc-label2);text-decoration:line-through}
.ctask-riga.ctask-ritardo .ctask-data{color:var(--fc-danger);font-weight:600}
.ctask-testo{flex:1 1 224px;text-align:left;background:none;border:none;padding:0;font:inherit;color:inherit;cursor:pointer}
.ctask-testo-fisso{flex:1 1 224px}
.ctask-meta{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center}
.ctask-data{font-variant-numeric:tabular-nums}
.ctask-etichetta{padding:0 6px;border-radius:9px;background:var(--fc-info-soft);font-size:11px}
.ctask-persona{font-weight:600}
.ctask-contro{color:var(--fc-label2)}
.ctask-badge{padding:0 6px;border-radius:9px;border:1px solid var(--fc-sep);font-size:11px}
.ctask-spunta{width:22px;height:22px;padding:0;display:inline-flex;align-items:center;justify-content:center}
.ctask-spunta.ctask-fatto{background:var(--fc-accent);border-color:var(--fc-accent);color:var(--fc-on-accent)}
.ctask-check-wrap{display:inline-flex;align-items:center;justify-content:center;cursor:pointer}
.ctask-check{width:16px;height:16px}
.ctask-saltata{color:var(--fc-label2)}
.ctask-sottotitolo{margin:8px 0 3.2px;font-weight:600}
.ctask-sett-nav{display:flex;align-items:center;gap:8px;margin:5.6px 0}
.ctask-pannello{margin:4.8px 0 8px;padding:8px 9.6px;border:1px solid var(--fc-accent);border-radius:8px;background:var(--fc-card)}
.ctask-pannello-testa{display:flex;justify-content:space-between;align-items:center;gap:8px}
.ctask-campo{display:flex;flex-direction:column;gap:2px;margin:5.6px 0;font-size:11px;color:var(--fc-label2)}
.ctask-campo input,.ctask-campo select,.ctask-campo textarea{font-size:11.2px}
.ctask-frase{margin:3.2px 0;color:var(--fc-label2)}
.ctask-assegna{border-top:1px solid var(--fc-sep);margin-top:5.6px;padding-top:3.2px}
.ctask-blocco{display:flex;flex-wrap:wrap;align-items:center;gap:6.4px;margin:6.4px 0;padding:5.6px 8px;border-radius:8px;background:var(--fc-accent-soft);color:var(--fc-label)}
.ctask-finestra{padding:4px 0;border-bottom:1px solid var(--fc-sep)}
.ctask-num-in{width:72px}
.ctask-passate-cat{margin:4.8px 0}
.ctask-passate-testa{display:flex;flex-wrap:wrap;gap:4.8px;align-items:center}
.ctask-form{display:flex;flex-direction:column;gap:3.2px}
/* Da telefono. Prima le misure sulla radice di 19 px (quello che i rem davano sotto i 768 px:
   +18,75%), poi il disegno del telefono: la vista di default e' "Questa settimana"
   (js/modules/cantiere-task.js); righe a una colonna, pannello a tutta larghezza, tocchi da 44 px
   (anche i titoli delle categorie e delle sezioni, la casella del blocco dentro la sua etichetta, i
   campi dei tempi e le scelte dell'anteprima: review del Task 11, m7). Il testo di una riga resta a
   sinistra: il prefisso #opModalBody batte #opModalBody button (1,0,1) in testa al foglio, che lo
   centrerebbe (m6): conta la specificita', non l'ordine dei fogli. I campi restano a 16 px (la regola
   dei campi in coda a base.css, contro lo zoom di iOS). */
@media screen and (max-width:768px){
  .ctask{margin:11.4px 0;font-size:13.3px}
  .ctask-titolo{font-size:15.2px}
  .ctask-sub{font-size:11.78px;margin:2.85px 0}
  .ctask-testa,.ctask-crea{padding:9.5px 11.4px}
  .ctask-kpi{flex-direction:column;gap:2.85px;margin:6.65px 0}
  .ctask-viste,.ctask-azioni{gap:5.7px;margin-top:6.65px}
  .ctask-gruppo{gap:5.7px}
  .ctask-btn{font-size:12.35px;padding:7.6px 13.3px;min-height:44px}
  .ctask-avviso{margin:6.65px 0;padding:6.65px 9.5px}
  .ctask-cat,.ctask-sez{margin:7.6px 0;padding:5.7px 11.4px}
  .ctask-cat summary,.ctask-sez summary{min-height:44px;padding:12.35px 0;box-sizing:border-box}
  .ctask-lista{margin:3.8px 0}
  .ctask-lista li{padding:2.85px 0}
  .ctask-num{min-width:30.4px}
  .ctask-riga{flex-direction:column;align-items:flex-start;gap:5.7px 9.5px;padding:5.7px 0}
  .ctask-testo,.ctask-testo-fisso{flex-basis:auto;width:100%;min-height:44px}
  #opModalBody .ctask-testo{justify-content:flex-start;text-align:left}
  .ctask-meta{gap:4.75px 9.5px}
  .ctask-etichetta,.ctask-badge{font-size:11.02px}
  .ctask-spunta{width:44px;height:44px}
  .ctask-check{width:24px;height:24px}
  .ctask-check-wrap{min-width:44px;min-height:44px}
  .ctask-sottotitolo{margin:9.5px 0 3.8px}
  .ctask-sett-nav{gap:9.5px;margin:6.65px 0}
  .ctask-pannello{margin:5.7px 0 9.5px;padding:9.5px 11.4px}
  .ctask-pannello-testa{gap:9.5px}
  .ctask-campo{margin:6.65px 0;font-size:11.78px}
  .ctask-campo input,.ctask-campo select,.ctask-campo textarea{width:100%;min-height:44px}
  .ctask-frase{margin:3.8px 0}
  .ctask-assegna{margin-top:6.65px;padding-top:3.8px}
  .ctask-blocco{flex-direction:column;align-items:stretch;gap:7.6px;margin:7.6px 0;padding:6.65px 9.5px}
  .ctask-finestra{padding:4.75px 0}
  .ctask-num-in{width:85.5px;min-height:44px}
  .ctask-sel{min-height:44px}
  .ctask-passate-cat{margin:5.7px 0}
  .ctask-passate-testa{gap:5.7px}
  .ctask-form{gap:3.8px}
}

/* ── Tab Cantiere: Foto sottotraccia, Adempimenti, Collaudo e difetti (Fase 10) ──
   js/modules/cantiere-foto*.js, cantiere-adempimenti*.js, cantiere-collaudo*.js, cantiere-checklist.js.
   Tre sezioni sorelle di #cantRoot, dopo le Task di cantiere, chiuse di default: stesso disegno delle
   Task (misure in px, token --fc-*), un solo prefisso cchiu-. Le firme: un canvas a tutta larghezza
   che non scorre la pagina mentre si firma col dito (touch-action:none), su fondo bianco anche in
   scuro (--fc-on-accent e' bianco nei due temi: l'inchiostro e' scuro). */
.cchiu{margin:9.6px 0;font-size:11.2px;color:var(--fc-label);border:1px solid var(--fc-sep);border-radius:8px;background:var(--fc-card)}
.cchiu-testa{display:flex;align-items:baseline;gap:8px;width:100%;padding:8px 9.6px;background:none;border:none;font:inherit;color:inherit;text-align:left;cursor:pointer}
.cchiu-titolo{font-weight:700;font-size:12.8px}
.cchiu-riassunto{flex:1 1 auto;color:var(--fc-label2)}
.cchiu-freccia{margin-left:auto;color:var(--fc-label2)}
.cchiu-corpo{padding:0 9.6px 8px}
.cchiu-blocco{margin:6.4px 0}
.cchiu-sub{color:var(--fc-label2);font-size:11px;margin:2.4px 0}
.cchiu-muto{color:var(--fc-label2)}
.cchiu-rosso{color:var(--fc-danger);font-weight:600}
.cchiu-avviso{margin:5.6px 0;padding:5.6px 8px;border-radius:6px;background:var(--fc-info-soft)}
.cchiu-avviso-warn{background:var(--fc-warn-soft);color:var(--fc-warn)}
.cchiu-avviso-errore{background:var(--fc-danger-soft);color:var(--fc-danger);font-weight:600}
.cchiu-btn{font-size:11px;padding:4px 8.8px;border:1px solid var(--fc-sep);border-radius:6px;background:var(--fc-bg);color:var(--fc-label);cursor:pointer}
.cchiu-btn[disabled]{opacity:.5;cursor:not-allowed}
.cchiu-btn.cchiu-on{background:var(--fc-accent-soft);border-color:var(--fc-accent);color:var(--fc-label)}
.cchiu-primario{background:var(--fc-accent);border-color:var(--fc-accent);color:var(--fc-on-accent)}
.cchiu-leggero{background:transparent}
.cchiu-file{display:inline-flex;align-items:center;position:relative;overflow:hidden}
.cchiu-file input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer}
.cchiu-file-spento{opacity:.5;cursor:not-allowed}
.cchiu-file-spento input[type=file]{cursor:not-allowed}
.cchiu-azioni,.cchiu-gruppo,.cchiu-stanze,.cchiu-esiti{display:flex;flex-wrap:wrap;gap:4.8px;align-items:center;margin-top:4.8px}
.cchiu-chip{border-radius:14px}
.cchiu-check{display:inline-flex;align-items:center;gap:4px}
.cchiu-titolo-ed{font-size:11px;color:var(--fc-label2)}
.cchiu-titolo-ed select{font-size:11.2px}
.cchiu-riga{display:flex;flex-wrap:wrap;align-items:center;gap:4.8px 8px;padding:4.8px 0;border-bottom:1px solid var(--fc-sep)}
.cchiu-testo{flex:1 1 224px;text-align:left;background:none;border:none;padding:0;font:inherit;color:inherit;cursor:pointer}
.cchiu-testo-fisso{flex:1 1 224px}
.cchiu-num{display:inline-block;min-width:25.6px;color:var(--fc-label2);font-variant-numeric:tabular-nums}
.cchiu-conto,.cchiu-data{font-variant-numeric:tabular-nums}
.cchiu-meta{display:inline-flex;flex-wrap:wrap;gap:4px 8px;align-items:center}
.cchiu-badge{padding:0 6px;border-radius:9px;border:1px solid var(--fc-sep);font-size:11px}
.cchiu-etichetta{padding:0 6px;border-radius:9px;background:var(--fc-info-soft);font-size:11px}
.cchiu-stato-scaduto,.cchiu-stato-manca{border-color:var(--fc-danger);color:var(--fc-danger)}
.cchiu-stato-presente,.cchiu-stato-non_serve{border-color:var(--fc-accent)}
.cchiu-sottotitolo{display:block;margin:8px 0 3.2px;font-weight:600;background:none;border:none;padding:0;font:inherit;font-weight:600;color:inherit;text-align:left;cursor:pointer}
.cchiu-categoria{margin:6.4px 0 1.6px;font-weight:600;color:var(--fc-label2)}
.cchiu-criterio{flex:1 1 100%;color:var(--fc-label2);font-size:11px}
.cchiu-pannello{margin:4.8px 0 8px;padding:8px 9.6px;border:1px solid var(--fc-accent);border-radius:8px;background:var(--fc-card)}
.cchiu-campo{display:flex;flex-direction:column;gap:2px;margin:5.6px 0;font-size:11px;color:var(--fc-label2)}
.cchiu-campo input,.cchiu-campo select,.cchiu-campo textarea{font-size:11.2px}
.cchiu-frase{margin:3.2px 0;color:var(--fc-label2)}
.cchiu-link{color:var(--fc-accent);text-decoration:underline}
.cchiu-lista{list-style:none;margin:3.2px 0;padding:0}
.cchiu-foto-lista{list-style:none;margin:4.8px 0;padding:0;display:flex;flex-wrap:wrap;gap:8px}
.cchiu-foto{display:flex;flex-direction:column;align-items:flex-start;gap:2.4px;max-width:96px;font-size:11px}
.cchiu-miniatura img{display:block;width:96px;height:72px;object-fit:cover;border-radius:4px;background:var(--fc-sep)}
.cchiu-vuota{display:flex;width:96px;height:72px;align-items:center;justify-content:center;border:1px dashed var(--fc-sep);border-radius:4px;color:var(--fc-label2)}
.cchiu-scartata img{opacity:.4}
.cchiu-scartata .cchiu-meta{text-decoration:line-through}
.cchiu-difetto.cchiu-chiuso .cchiu-testo,.cchiu-difetto.cchiu-accettato .cchiu-testo,.cchiu-difetto.cchiu-annullato .cchiu-testo{color:var(--fc-label2);text-decoration:line-through}
.cchiu-firma{margin:5.6px 0}
.cchiu-canvas{display:block;width:100%;max-width:600px;height:auto;aspect-ratio:3/1;border:1px solid var(--fc-sep);border-radius:6px;background:var(--fc-on-accent);touch-action:none}
.cchiu-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* Da telefono: tocchi da 44 px, righe a una colonna, firme a tutta larghezza, la fila delle stanze
   che scorre; i campi restano a 16 px (in coda a base.css, contro lo zoom di iOS). */
@media screen and (max-width:768px){
  .cchiu{margin:11.4px 0;font-size:13.3px}
  .cchiu-testa{min-height:44px;padding:9.5px 11.4px}
  .cchiu-titolo{font-size:15.2px}
  .cchiu-btn{font-size:12.35px;padding:7.6px 13.3px;min-height:44px}
  .cchiu-riga{flex-direction:column;align-items:flex-start;gap:5.7px}
  .cchiu-testo,.cchiu-testo-fisso{flex-basis:auto;width:100%;min-height:44px}
  #opModalBody .cchiu-testo{justify-content:flex-start;text-align:left}
  .cchiu-stanze{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%}
  .cchiu-chip{flex:0 0 auto}
  .cchiu-campo input,.cchiu-campo select,.cchiu-campo textarea{width:100%;min-height:44px}
  .cchiu-check{min-height:44px}
  .cchiu-titolo-ed select{min-height:44px}
  .cchiu-canvas{max-width:none}
  .cchiu-sottotitolo{min-height:44px}
}

/* ── Contratti: finestre "Nuovo contratto", "Conferma dal firmato", "Annulla bozza" (contratti PR 3) ──
   js/modules/contratto-compila.js. Sono il riquadro di fcConfirm (.fc-confirm-overlay e .fc-confirm-box
   di base.css) allargato: (0,2,0) batte il max-width di base.css anche dentro la sua @media, come
   .op-dlg-l. Testata e piede fermi, il corpo scorre; da telefono a tutto schermo. Il contenuto usa il
   vocabolario dei passi (.op-*): qui solo cornice, griglie dei campi, tabelle, articoli e il segno dei
   valori cambiati alla firma. Un prefisso solo, cbz-. */
.fc-confirm-overlay.cbz-sfondo{align-items:center;padding:var(--sp-3)}
.fc-confirm-box.cbz-finestra{display:flex;flex-direction:column;width:96vw;max-width:980px;max-height:92vh;max-height:92dvh;padding:0;border-radius:var(--r);overflow:hidden}
.fc-confirm-box.cbz-piccola{max-width:720px}
.cbz-testa{flex:0 0 auto;padding:var(--sp-3) var(--sp-4) var(--sp-2);border-bottom:1px solid var(--fc-sep)}
.cbz-titolo{margin:0;font-size:17px;line-height:22px;font-weight:700;color:var(--fc-label)}
.cbz-sub{margin-top:2px;font-size:12px;line-height:16px;color:var(--fc-label2)}
.cbz-passi{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-2)}
.cbz-passo{min-height:32px;padding:0 var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--r-pill);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px;font-weight:600;cursor:pointer}
.cbz-passo[aria-current="step"]{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.cbz-corpo{flex:1 1 auto;min-height:0;overflow-y:auto;padding:var(--sp-3) var(--sp-4);color:var(--fc-label);font-size:13px;line-height:18px}
.cbz-fs{min-width:0;margin:0;padding:0;border:0}
.cbz-piede{flex:0 0 auto;padding:var(--sp-2) var(--sp-4) calc(var(--sp-3) + var(--fc-safe-bottom));border-top:1px solid var(--fc-sep);background:var(--fc-card);color:var(--fc-label)}
.cbz-piede .op-box{margin:0 0 var(--sp-2)}
.cbz-elenco>summary{font-size:13px;font-weight:700;cursor:pointer}
.cbz-elenco[data-level="danger"]>summary{color:var(--fc-danger)}
.cbz-elenco[data-level="warn"]>summary{color:var(--fc-warn)}
.cbz-elenco .cbz-lista{max-height:112px;margin-top:var(--sp-1);overflow-y:auto}
.cbz-finestra button.op-link{padding:0;border:0;background:none;font:inherit;font-weight:600;color:var(--fc-accent);cursor:pointer}
.cbz-lista{margin:0;padding-left:18px}
.cbz-lista li+li{margin-top:2px}
.cbz-azioni{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2)}
.cbz-avanti{justify-content:flex-end;margin-top:var(--sp-4)}
.cbz-griglia{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--sp-2) var(--sp-3);margin:var(--sp-2) 0}
.cbz-campo{display:flex;flex-direction:column;gap:2px;min-width:0;font-size:12px;line-height:16px;color:var(--fc-label2)}
.cbz-largo{grid-column:1/-1}
.cbz-spunta{display:flex;align-items:center;gap:var(--sp-2);margin:var(--sp-2) 0;font-size:13px;color:var(--fc-label);cursor:pointer}
.cbz-valore{min-height:36px;font-size:15px;font-weight:700;line-height:36px;color:var(--fc-label);font-variant-numeric:tabular-nums}
.cbz-scheda{margin:var(--sp-2) 0;padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.cbz-scheda[data-level="danger"]{border-color:var(--fc-danger)}
.cbz-aggiungi{align-items:flex-end;margin:var(--sp-2) 0}
.cbz-altri{margin:var(--sp-3) 0}
.cbz-altri>summary{font-size:13px;font-weight:600;color:var(--fc-accent);cursor:pointer}
.cbz-tab{width:100%;margin:var(--sp-2) 0;border-collapse:collapse;font-size:13px;line-height:18px}
.cbz-tab thead{background:transparent}
.cbz-tab tbody tr{border-bottom:0;background:transparent}
.cbz-tab th,.cbz-tab td{padding:var(--sp-1);border-bottom:1px solid var(--fc-sep);text-align:left;vertical-align:top}
.cbz-tab th{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--fc-label2)}
.cbz-tab tfoot td{font-weight:700}
.cbz-tab.cbz-righe td{vertical-align:middle}
.cbz-tab .cbz-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.cbz-stretta{width:88px}
.cbz-media{width:160px}
.cbz-art{padding:var(--sp-2) 0;border-bottom:1px solid var(--fc-sep)}
.cbz-art-testa{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.cbz-art-nome{font-weight:700}
.cm-anteprima.cbz-anteprima{max-width:none;margin-top:var(--sp-2);padding:var(--sp-2) var(--sp-3)}
.cbz-editor{margin-top:var(--sp-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-accent);border-radius:var(--rs);background:var(--fc-card)}
textarea.op-campo.cbz-testo{min-height:220px}
.cbz-file{display:flex;flex-direction:column}
.cbz-domanda{margin:0 var(--sp-4) var(--sp-2)}
/* Conferma dal firmato: il valore diverso dal Documento generato (il campo o la cella della rata). */
.cbz-cambiato .op-campo{border-color:var(--fc-warn-fill);background:var(--fc-warn-soft);color:var(--fc-label)}
.cbz-cambiato>span{color:var(--fc-warn);font-weight:600}
/* La cella % della rata non ha un campo: il colore va sulla cella (review finale del ramo, F7). */
.cbz-tab td.cbz-num.cbz-cambiato{background:var(--fc-warn-soft);color:var(--fc-warn);font-weight:600}
.cbz-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* Tab Cantiere (Task 7): le bozze in #cantBozzeRoot (js/modules/contratto-bozze.js), tratteggiate finché non
   sono firmate; sulla card di ogni contratto (opmodal-cantiere.js) il nome della ditta che apre la sua scheda e
   l'avviso DURC in rosso; nella testata il campo "Direttore lavori". */
.cbz-bozze{margin:0 0 var(--sp-3)}
.cbz-bozze-testa{margin:0 0 var(--sp-2)}
.cbz-bozza{margin:0 0 var(--sp-3);padding:var(--sp-2) var(--sp-3);border:1.5px dashed var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:13px;line-height:18px}
.cbz-bozza-ditta{overflow-wrap:anywhere}
.cbz-bozza-riga{margin-top:var(--sp-1);overflow-wrap:anywhere}
.cbz-bozza-doc{white-space:normal}
.cbz-bozza .op-box{margin:var(--sp-2) 0 0}
.cbz-ditta-link{padding:0;border:0;background:none;color:var(--fc-accent);font:inherit;font-weight:700;text-align:left;text-decoration:underline;text-underline-offset:2px;overflow-wrap:anywhere;cursor:pointer}
.cbz-ditta-link:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
.cbz-durc{margin-top:var(--sp-1);color:var(--fc-danger);font-size:12px;line-height:16px;font-weight:700}
.cbz-durc-ignoto{margin-top:var(--sp-1);color:var(--fc-label2);font-size:12px;line-height:16px}
.cbz-anagrafica{margin-top:var(--sp-1);padding:var(--sp-1) var(--sp-2);border:.5px solid var(--fc-warn-fill);border-radius:var(--rs);background:var(--fc-warn-soft);color:var(--fc-warn);font-size:12px;line-height:16px;overflow-wrap:anywhere}
.cbz-anagrafica-titolo{font-weight:700}
.cbz-dl{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2)}
.cbz-dl .op-campo{flex:1 1 220px;width:auto;min-width:0}
.cbz-dl-errore{flex:1 1 100%;color:var(--fc-danger);font-size:12px;line-height:16px;font-weight:600}
@media (hover:hover){
  .cbz-passo:not([aria-current="step"]):hover{background:var(--fc-accent-soft);color:var(--fc-accent)}
}
@media screen and (max-width:768px){
  .fc-confirm-overlay.cbz-sfondo{padding:0}
  .fc-confirm-box.cbz-finestra{width:100vw;max-width:none;height:100vh;height:100dvh;max-height:none;border-radius:0}
  .cbz-griglia{grid-template-columns:1fr}
  .cbz-passo{min-height:44px}
  .cbz-tab.cbz-righe th,.cbz-tab.cbz-righe td{padding:2px}
  .cbz-elenco .cbz-lista{max-height:88px}
  .cbz-media{width:auto}
  .cbz-dl .op-campo{flex-basis:100%}
}

/* ── Tab Cantiere: riga "Per passare in vendita" e Chiusura fatta fuori dalla app (Fase 11) ──
   js/modules/cantiere-gate.js, in #cantGateRoot sopra la testata, solo con l'operazione in Cantiere.
   La riga va a capo da sola (flex-wrap): da telefono il testo ha la riga intera e i bottoni vanno
   sotto, tocchi da 44 px. La finestra del motivo e' il riquadro di fcConfirm: qui solo il campo.
   Un prefisso solo, cgate-. */
.cgate{margin:0 0 var(--sp-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);font-size:13px;color:var(--fc-label)}
.cgate.is-pronto{border-color:var(--fc-accent)}
.cgate.is-avviso{background:var(--fc-warn-soft);color:var(--fc-warn)}
.cgate-riga{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1) var(--sp-2)}
.cgate-riga+.cgate-riga{margin-top:var(--sp-1)}
.cgate-testo{flex:1 1 240px;min-width:0}
.cgate-motivo{margin:var(--sp-1) 0 0;font-size:12px;color:var(--fc-label2)}
.cgate-messaggio{margin:var(--sp-1) 0 0;font-weight:600;color:var(--fc-danger)}
.cgate-btn{font:inherit;font-size:12px;padding:var(--sp-1) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label);cursor:pointer}
.cgate-btn[disabled]{opacity:.5;cursor:not-allowed}
.cgate-campo{display:flex;flex-direction:column;gap:var(--sp-1);font-size:12px;color:var(--fc-label2)}
.cgate-campo textarea{width:100%;min-height:72px;padding:var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label);font:inherit;font-size:13px;resize:vertical}
@media screen and (max-width:768px){
  .cgate-testo{flex-basis:100%}
  .cgate-btn{min-height:44px;font-size:13px}
}

/* ── Tab Cantiere: Varianti ai lavori (Fase 7) ──
   js/modules/cantiere-varianti*.js: sezione sorella di #cantRoot dopo il Collaudo, chiusa di default,
   con il disegno delle sezioni della Fase 10 (le classi cchiu- di fcChiusuraComune: testata, righe,
   bottoni, campi, pannelli e i loro 44 px da telefono qui sopra). Qui solo quello che e' delle varianti,
   prefisso cvar-, con i token --fc-*. Il telefono in testa al foglio (blocco "Varianti ai lavori"). La
   rata di una variante nelle card dei contratti (js/modules/opmodal-cantiere.js) e' .cvar-rata. */
.cvar-kv{margin:2.4px 0}
.cvar-testo{margin:3.2px 0;white-space:pre-line}
.cvar-blocco{margin:5.6px 0}
.cvar-conti{margin-bottom:6.4px}
.cvar-riga .cchiu-conto{font-weight:600}
.cvar-stato{white-space:nowrap}
.cvar-stato-proposta{border-color:var(--fc-warn);color:var(--fc-warn)}
.cvar-stato-approvata{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.cvar-stato-rifiutata,.cvar-stato-annullata{border-color:var(--fc-danger);color:var(--fc-danger)}
.cvar-stato-ritirata{color:var(--fc-label2)}
.cvar-rifiutata .cchiu-testo,.cvar-ritirata .cchiu-testo{color:var(--fc-label2)}
.cvar-annullata .cchiu-testo{color:var(--fc-label2);text-decoration:line-through}
.cvar-dettaglio{border-color:var(--fc-sep)}
.cvar-investitore,.cvar-righe{padding-top:2.4px;border-top:1px solid var(--fc-sep)}
.cvar-modulo .cchiu-campo input,.cvar-modulo .cchiu-campo select,.cvar-modulo .cchiu-campo textarea,
.cvar-decisione .cchiu-campo select,.cvar-decisione textarea,.cvar-azione textarea{max-width:480px}
.cvar-effetto{margin:5.6px 0;padding:5.6px 8px;border-radius:6px;background:var(--fc-info-soft);color:var(--fc-label);font-weight:600}
.cvar-riga-dettaglio{display:grid;grid-template-columns:minmax(0,3fr) repeat(4,minmax(0,1fr)) auto;gap:4.8px;align-items:end;margin:4px 0}
.cvar-riga-dettaglio .cchiu-campo{margin:0}
.cvar-righe-lista li{padding:1.6px 0}
.cvar-data input{max-width:180px}
.cvar-rata{display:inline-block;font:inherit;font-size:11px;font-weight:700;letter-spacing:.3px;padding:2.4px 7.2px;border-radius:10px;
  border:1px solid var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label);white-space:nowrap;cursor:pointer}
.cvar-rata-da-firmare{border-color:var(--fc-warn);background:var(--fc-warn-soft);color:var(--fc-warn)}

/* ── Tab Progetto: barra delle planimetrie, zona vuota, strumenti (design-08a) ──
   opmodal-planimetrie.js a zero stile inline. La planimetria aperta e lo strumento scelto sono aria-pressed
   (prima un fondo verde scritto nel JS); i bottoni piccoli sono .op-azione come negli altri passi (28 px, 44
   al tocco per la regola del vocabolario e per #opModalBody button in testa al foglio). Il trascinamento sulla zona
   vuota aggiunge .is-sopra. Niente testo sotto gli 11 px (erano 8,8-9,9 px). */
.op-plan-barra{margin-bottom:var(--sp-2)}
.op-plan-t{font-size:11px;line-height:14px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--fc-label2)}
.op-plan-tab{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:28px;padding:0 var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:12px;font-weight:600;line-height:16px;cursor:pointer}
.op-plan-tab[aria-pressed="true"]{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.op-plan-tab-x{padding:0 2px;color:var(--fc-danger);font-size:15px;font-weight:700;line-height:1}
.op-riga>.op-campo.op-plan-nome{max-width:160px}
.op-plan-drop{padding:var(--sp-6) var(--sp-4);border:2px dashed var(--fc-sep);border-radius:var(--r);background:var(--fc-bg);color:var(--fc-label);text-align:center}
.op-plan-drop.is-sopra{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
/* --fc-label2 su --fc-accent-soft è 4,39:1 in scuro: col file sopra l'aiuto diventa testo pieno. */
.op-plan-drop.is-sopra .op-hint{color:var(--fc-label)}
.op-plan-drop-ico{margin-bottom:var(--sp-2);font-size:32px;line-height:1}
.op-plan-drop-t{margin-bottom:var(--sp-1);font-size:15px;line-height:20px;font-weight:600}
.op-plan-drop .op-hint{margin-bottom:var(--sp-3)}
/* label.btn: .btn-green (base.css, era in style.css) è largo 100% e la label non dichiara display (il blocco da
   telefono in coda a base.css, che era il blocco 4 di mobile.css, lo fa solo da telefono). Stessa specificità di
   .btn-green, file dopo: vince. */
.op-plan-carica{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-1);width:auto;cursor:pointer}
.op-plan-bar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1);margin-bottom:var(--sp-1);padding:var(--sp-1);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-plan-bar .op-azione[aria-pressed="true"]{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.op-plan-sep{flex:none;width:1px;height:18px;margin:0 var(--sp-1);background:var(--fc-sep)}
.op-plan-l{font-size:12px;line-height:16px;font-weight:600;color:var(--fc-label2)}
.op-plan-colore{width:28px;height:28px;padding:0;border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);cursor:pointer}
.op-plan-range{width:64px;accent-color:var(--fc-accent)}
.op-plan-bar .op-campo{width:auto;min-height:28px;padding:0 var(--sp-1);font-size:12px}
.op-plan-zoom{min-width:40px;font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--fc-label)}
.op-plan-salva{margin-left:auto}
/* Lo strumento scelto resta pieno sotto il puntatore: .op-azione:not(.is-primary):not(:disabled):hover
   pesa più della regola con aria-pressed qui sopra. Stesso peso di quella, file dopo: vince. */
@media (hover:hover){.op-plan-bar .op-azione[aria-pressed="true"]:hover{background:var(--fc-accent-fill);color:var(--fc-on-accent)}}
@media (hover:none){.op-plan-colore{width:44px;height:44px}}

/* ── Tab Progetto: tela, etichette, suggerimenti (design-08a) ──
   Il canvas disegna da sé e resta chiaro anche in scuro (fondo f9f9f9 dipinto dal JS): qui solo cornice,
   cursore e i due strati sopra. Il cursore arriva come data-cursore (lo scrive il gestore del mouse); posizione,
   colore e misura dell'overlay e del campo di scrittura come --x, --y, --c, --fs (spec §5.1 caso 2). L'overlay
   eredita il font della app, lo stesso di FONT_TELA con cui il canvas esporta le etichette su Drive; l'alone
   bianco è --fc-on-accent, bianco in tutti e due i temi come la tela. I testi dell'overlay seguono lo zoom:
   sono disegno, non interfaccia, e restano fuori dal pavimento degli 11 px. */
.op-plan-corpo{display:flex;align-items:flex-start;gap:var(--sp-2)}
.op-plan-sx{flex:1;min-width:0}
.op-plan-tela{position:relative;margin-bottom:var(--sp-1);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);overflow:hidden}
.op-plan-canvas{display:block;width:100%;cursor:crosshair}
.op-plan-canvas[data-cursore="grab"]{cursor:grab}
.op-plan-canvas[data-cursore="grabbing"]{cursor:grabbing}
.op-plan-canvas[data-cursore="move"]{cursor:move}
.op-plan-canvas[data-cursore="text"]{cursor:text}
.op-plan-canvas[data-cursore="cell"]{cursor:cell}
.op-plan-testi{position:absolute;inset:0;pointer-events:none}
.op-plan-etich{position:absolute;left:var(--x);top:var(--y);color:var(--c);font-size:var(--fs);font-weight:800;white-space:nowrap;pointer-events:none;user-select:none;text-shadow:1px 1px 2px var(--fc-on-accent),-1px -1px 2px var(--fc-on-accent)}
.op-plan-scrivi{position:absolute;left:var(--x,0);top:var(--y,0);z-index:10;pointer-events:auto}
.op-plan-scrivi-riga{display:flex;align-items:center;gap:var(--sp-1)}
.op-plan-scrivi-campo{min-width:80px;padding:2px var(--sp-1);border:2px dashed var(--fc-accent);border-radius:4px;outline:none;background:var(--fc-card);color:var(--c,var(--fc-danger));font:inherit;font-size:var(--fs,16px);font-weight:700}
.op-plan-hint{margin:0 0 var(--sp-1);padding:var(--sp-1) var(--sp-2);font-size:12px;line-height:16px;font-weight:600}
.op-plan-dist{width:72px;min-height:28px;margin:0 var(--sp-1);padding:0 var(--sp-1)}
.op-plan-etichette{margin-bottom:var(--sp-1)}
.op-plan-etichette-t{margin-bottom:var(--sp-1);font-size:11px;line-height:14px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--fc-label2)}
.op-plan-chips{display:flex;flex-wrap:wrap;gap:var(--sp-1)}
.op-plan-chip{display:inline-flex;align-items:center;gap:2px;padding:0 0 0 var(--sp-2);border:1px solid var(--fc-sep);border-left:3px solid var(--c,var(--fc-danger));border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:12px;line-height:16px;font-weight:600}

/* ── Tab Progetto: validazione DM 1975, vani, editor del vano (design-08a) ──
   Pannello a destra della tela da computer; sotto i 1024 px va sotto (la scheda è larga 510 px a 800 e
   la tela restava a 230, a 375 px a 110 col pannello a 220). Le violazioni sono .op-box per livello, con
   la regola scritta e l'icona di errore o di avviso. La tabella dei vani è una tabella dei passi: il
   colore della tipologia è un pallino (--c), il nome resta testo pieno (era il colore stesso, fino a
   2,68:1). L'editor del vano è un .op-box neutro. */
.op-plan-valida{flex:none;width:220px;max-height:600px;overflow-y:auto;padding:var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font-size:12px;line-height:16px}
.op-plan-valida-t{margin-bottom:var(--sp-2);font-size:11px;line-height:14px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--fc-label2)}
.op-plan-valida-ok{font-weight:700;color:var(--fc-ok)}
.op-plan-valida .op-box{margin:0 0 var(--sp-1);padding:var(--sp-1) var(--sp-2);font-size:12px;line-height:16px}
.op-plan-valida .op-box-t{margin-bottom:2px;font-size:12px}
.op-plan-comune{margin-top:var(--sp-2);padding:var(--sp-1) var(--sp-2);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-plan-affacci{margin-top:var(--sp-2)}
.op-campo.op-plan-num{width:72px}
.op-plan-vani{margin-top:var(--sp-2)}
.op-plan-vani .is-centro{text-align:center}
.op-plan-dot{display:inline-block;width:8px;height:8px;margin-right:var(--sp-1);border-radius:50%;background:var(--c);vertical-align:middle}
.op-plan-editor{margin-top:var(--sp-2)}
.op-plan-form{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:var(--sp-1) var(--sp-2)}
.op-plan-form .op-campo{max-width:240px}
.op-plan-area{font-weight:700}
.op-plan-editor-azioni{margin-top:var(--sp-2)}
@media screen and (max-width:1024px){
  .op-plan-corpo{flex-direction:column;align-items:stretch}
  .op-plan-valida{width:auto;max-height:none}
}
@media screen and (max-width:768px){
  .op-plan-bar .op-campo,.op-plan-dist{min-height:44px}
}

/* ── Planimetrie nella Decisione e lightbox (design-08a; erano style.css PLANIMETRIE GALLERY e LIGHTBOX) ──
   Le miniature (opmodal-steps.js, renderStep5DecPanel) finiscono anche nel PDF: il nome sta sotto
   l'immagine su una striscia --fc-card, 11 px (era bianco a 8,3 px su una sfumatura sopra l'immagine),
   niente transition né spostamento al passaggio. La miniatura senza immagine si allunga come le altre della
   riga (con aspect-ratio non si allungherebbe e il nome finirebbe più in alto, nel PDF su un'altra riga);
   da sola è alta 124 px, quanto una miniatura larga 150. Il lightbox (index.html, aperto da ui-misc.js con .open)
   è una superficie scura in tutti e due i temi: --fc-ink col testo --fc-on-accent, come le foto del
   Sopralluogo (.op-foto-ov); la navigazione si nasconde con hidden. */
.plan-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--sp-3);margin-bottom:var(--sp-4)}
/* Le miniature con l'immagine sono <button> (raggiungibili da tastiera): via i margini e il font del bottone. */
.plan-thumb{display:flex;flex-direction:column;width:100%;margin:0;padding:0;border:1px solid var(--fc-sep);border-radius:var(--rs);overflow:hidden;background:var(--fc-card);color:var(--fc-label);font:inherit;text-align:left;cursor:pointer}
.plan-thumb img{display:block;width:100%;aspect-ratio:3/2;object-fit:cover;background:var(--fc-bg)}
.plan-thumb-label{align-self:stretch;padding:var(--sp-1) var(--sp-2);border-top:1px solid var(--fc-sep);background:var(--fc-card);color:var(--fc-label);font-size:11px;line-height:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.plan-thumb-empty{display:grid;grid-template-rows:1fr auto;align-items:center;min-height:124px;background:var(--fc-bg);color:var(--fc-label2);font-size:24px;line-height:1;text-align:center;cursor:default}
.plan-thumb-empty .plan-thumb-label{text-align:left}
#planLightbox{position:fixed;inset:0;z-index:2000;display:none;flex-direction:column;align-items:center;justify-content:center;padding:var(--sp-4);background:var(--fc-ink);color:var(--fc-on-accent)}
#planLightbox.open{display:flex}
#planLightbox img{max-width:92vw;max-height:80vh;object-fit:contain;border-radius:var(--rs)}
#planLightboxCaption{margin-top:var(--sp-3);font-size:12px;line-height:16px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--fc-on-accent)}
#planLightboxClose{position:absolute;top:var(--sp-4);right:var(--sp-4);display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;padding:0;border:0;background:none;color:var(--fc-on-accent);font:inherit;font-size:32px;line-height:1;cursor:pointer}
#planLightboxNav{display:flex;gap:var(--sp-4);margin-top:var(--sp-3)}
.plan-lb-btn{min-height:36px;padding:0 var(--sp-4);border:1px solid var(--fc-on-accent);border-radius:var(--rs);background:none;color:var(--fc-on-accent);font:inherit;font-size:13px;font-weight:600;cursor:pointer}
@media (hover:hover){
  .plan-thumb:not(.plan-thumb-empty):hover{border-color:var(--fc-accent);box-shadow:var(--fc-shadow)}
  #planLightboxClose:hover,.plan-lb-btn:hover{text-decoration:underline}
}
/* Il focus arriva su Chiudi all'apertura (PR 15): anello chiaro sul fondo --fc-ink, come .op-sopr-lb-x. */
#planLightboxClose:focus-visible,.plan-lb-btn:focus-visible{outline-color:var(--fc-on-accent)}
@media (hover:none){.plan-lb-btn{min-height:44px}}

/* ── Tab Gestione: pannelli, campi, utenze, unità (design-08b) ──
   renderStep9 (opmodal-gestione.js). Ogni blocco è un .op-pannello con la sua testata; i campi sono .fg e
   prendono i token dalla regola #opModalBody .fg della 6a (prima fondi bianchi scritti a mano: in scuro
   testo bianco su bianco). .gest-wrap era in style.css: la colonna è minmax(0,1fr) perché con 1fr la
   tabella delle utenze allargava tutta la tab a 957 px, e da 800 px in giù la scheda scorreva di lato
   (992 su 375). Citofoni, Cassette e Ripartitori a due colonne sotto i 768: era il blocco 10 di mobile.css,
   che riconosceva la griglia dal suo stile inline. */
.gest-wrap{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-4)}
.gest-wrap .op-pannello{margin-top:0}
.gest-wrap>.fc-modal-actions{margin-top:0}
.gest-wrap .fg:last-child{margin-bottom:0}
.gest-wrap .fg textarea{resize:vertical}
.op-gest-due{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-4);align-items:start}
.op-gest-tre{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-3);align-items:start}
.op-gest-campi{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));column-gap:var(--sp-3)}
.op-gest-campi.is-tre{grid-template-columns:repeat(3,minmax(0,1fr))}
.op-gest-scelta{margin-bottom:var(--sp-3)}
.op-gest-scelta-l{font-size:13px;font-weight:600;color:var(--fc-label)}
.op-gest-contatori{margin-bottom:var(--sp-3)}
.op-gest-check{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:36px;margin:0;font-size:13px;font-weight:600;color:var(--fc-label);cursor:pointer}
.op-gest-check input{flex:none;width:18px;height:18px;margin:0;accent-color:var(--fc-accent-fill);cursor:pointer}
.op-gest-contatori textarea.op-campo,.op-gest-utenze textarea.op-campo{height:36px}
.op-gest-sotto{margin:var(--sp-3) 0 var(--sp-1);font-weight:600}
.op-gest-utenze{min-width:760px}
.op-gest-utenze th,.op-gest-utenze td{padding:var(--sp-1)}
.op-gest-utenze td{vertical-align:top}
.op-gest-utenze .op-campo{min-width:96px}
.op-gest-utenze select.op-campo{min-width:112px}
.op-gest-utenze input[type=date].op-campo{min-width:136px}
.op-gest-utenze .op-campo.op-corto{min-width:64px}
.op-gest-unita{margin-bottom:var(--sp-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.op-gest-unita:last-child{margin-bottom:0}
.op-gest-unita.is-venduta{border-left:3px solid var(--fc-ok)}
.op-gest-unita-testa{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.op-gest-unita-n{flex:none;font-size:13px;font-weight:800;color:var(--fc-info)}
.op-gest-unita-t{flex:1 1 auto;min-width:0;overflow:hidden;font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
.op-gest-vendita{margin-bottom:var(--sp-2)}
.op-gest-nuova{margin:var(--sp-2) 0 var(--sp-1)}
.op-gest-nuova>summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--fc-info)}
.op-gest-nuova[open]>summary{margin-bottom:var(--sp-2)}
.op-gest-nuova[open]{margin-bottom:var(--sp-3)}
.op-gest-nuova>.op-azione{margin-top:var(--sp-1)}
@media screen and (max-width:768px){
  .op-gest-due{grid-template-columns:minmax(0,1fr)}
  .op-gest-tre{grid-template-columns:repeat(2,minmax(0,1fr))}
  .op-gest-unita .op-gest-campi.is-tre{grid-template-columns:repeat(2,minmax(0,1fr))}
  .op-gest-check{min-height:44px}
}

/* ── Tab Gestione: sopralluoghi di cantiere, foto e galleria da Drive (design-08b) ──
   _renderSopralluoghi e la galleria (toggleSoprGallery, _renderSoprGalleryGrid, _buildSoprThumbTile,
   _soprTilePlaceholder, _renderSoprGalleryFallback, scritte con createElement): className al posto di
   style.cssText, galleria aperta e chiusa con hidden. Link alla cartella e bottoni di Drive erano blu
   Google (1a73e8) o verdi pieni: qui .op-azione come nel resto della scheda. Il "↗" sulla miniatura
   resta 24 px anche al tocco (AA): a 44 coprirebbe un quarto della foto, che è già il bersaglio grande. */
.op-sopr{margin-bottom:var(--sp-3);padding:var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-sopr:last-child{margin-bottom:0}
.op-sopr-testa{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.op-sopr-t{font-size:14px;font-weight:700;color:var(--fc-accent)}
.op-sopr-drive,.op-sopr-note,.op-sopr-blocco{margin-bottom:var(--sp-2)}
.op-sopr-blocco:last-child{margin-bottom:0}
.op-sopr-foto-lista{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-2)}
.op-sopr-foto{display:flex;align-items:center;gap:var(--sp-1);max-width:200px;padding:var(--sp-1);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.op-sopr-mini-btn{flex:none;display:block;margin:0;padding:0;border:0;border-radius:4px;background:none;cursor:zoom-in}
.op-sopr-mini{display:block;flex:none;width:42px;height:42px;border-radius:4px;object-fit:cover;cursor:zoom-in}
.op-sopr-ico{flex:none;font-size:16px}
.op-sopr-nota{min-width:0;overflow:hidden;font-size:12px;color:var(--fc-label2);text-overflow:ellipsis;white-space:nowrap}
.op-sopr-gal{margin-top:var(--sp-2)}
.op-sopr-gal-testa{display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.op-sopr-gal-n{font-size:12px;font-weight:600;color:var(--fc-label2)}
.op-sopr-gal-apri{margin-left:auto;font-size:12px}
.op-sopr-gal-griglia{display:grid;grid-template-columns:repeat(auto-fill,minmax(86px,1fr));gap:var(--sp-2)}
.op-sopr-gal-tile{position:relative;aspect-ratio:1;overflow:hidden;border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.op-sopr-gal-img{display:block;width:100%;height:100%;object-fit:cover;cursor:zoom-in}
.op-sopr-gal-su{position:absolute;top:2px;right:2px;display:inline-flex;align-items:center;justify-content:center;min-width:24px;min-height:24px;border-radius:4px;background:var(--fc-ink);color:var(--fc-on-accent);font-size:12px;line-height:1;text-decoration:none}
.op-sopr-gal-ph{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-1);width:100%;height:100%;padding:var(--sp-1);text-align:center}
.op-sopr-gal-ph-ico{font-size:16px}
.op-sopr-gal-ph-nome{max-width:100%;overflow:hidden;font-size:11px;color:var(--fc-label2);text-overflow:ellipsis;white-space:nowrap}
/* Vetrina: la copertina della card Prossimamente nell'anteprima (riquadro .op-sopr-gal-ph senza immagine) */
.op-vet-cop{width:100%;max-width:320px;aspect-ratio:4/3;margin-bottom:var(--sp-2);overflow:hidden;border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-vet-cop-img{display:block;width:100%;height:100%;object-fit:cover}
.op-vet-cop-nome{max-width:100%;font-size:12px;color:var(--fc-label2);overflow-wrap:anywhere}
.op-vet-foto-lista{display:flex;flex-direction:column;gap:var(--sp-2);margin:0 0 var(--sp-2);padding:0;list-style:none}
.op-vet-foto{display:flex;gap:var(--sp-2);align-items:flex-start}
.op-vet-foto-mini{flex:none;width:72px;height:72px;overflow:hidden;border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.op-vet-foto-mini img{display:block;width:100%;height:100%;object-fit:cover}
.op-vet-foto-testo{flex:1;min-width:0;overflow-wrap:anywhere}
.op-vet-foto-did{display:flex;gap:var(--sp-1);align-items:center;margin-top:var(--sp-1)}
.op-vet-foto-did input{flex:1;min-width:0}
.op-sopr-gal-info{margin-bottom:var(--sp-1)}
.op-sopr-gal-riga{padding:2px 0;font-size:12px;color:var(--fc-label)}
.op-sopr-gal-apri-cartella{display:inline-block;margin-top:var(--sp-1);font-size:13px}
@media screen and (max-width:768px){
  /* Al tocco: il link alla cartella del sopralluogo e "Apri cartella ↗" a 44 px (#opModalBody button in testa al foglio prende i bottoni, non gli <a>). */
  .op-sopr-drive .op-azione{min-height:44px}
  .op-sopr-gal-apri{display:inline-flex;align-items:center;min-height:44px}
}

/* ── Foto dei sopralluoghi: lightbox (opmodal-gestione.js openSoprLightbox, design-08b) ──
   Si apre anche dalla chat (messaggi.js) e sta nel body, fuori da #opModalBody: #opModalBody button in testa al foglio
   non lo prende e la chiusura è a 44 px qui. Classi sue e non .op-foto-ov della 6a: navFotoSopralluogo
   toglie il primo .op-foto-ov del documento. Fondo --fc-ink pieno come il visore della 6a (era nero al 92%). */
.op-sopr-lb{position:fixed;inset:0;z-index:99999;display:flex;align-items:center;justify-content:center;padding:var(--sp-4);background:var(--fc-ink);cursor:zoom-out}
.op-sopr-lb-img{max-width:92vw;max-height:92vh;max-height:92dvh;border-radius:var(--rs);object-fit:contain;box-shadow:var(--fc-shadow)}
.op-sopr-lb-x{position:absolute;top:calc(var(--sp-4) + var(--fc-safe-top));right:var(--sp-4);display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:1px solid var(--fc-label2);border-radius:50%;background:var(--fc-ink);color:var(--fc-on-accent);font:inherit;font-size:18px;line-height:1;cursor:pointer}
.op-sopr-lb-x:focus-visible{outline:2px solid var(--fc-on-accent);outline-offset:2px}

/* ── Modale "Carica File su Drive" (opmodal-drive.js uploadFileToDrive, design-08b) ──
   Sta nel body, fuori da #opModalBody: la regola dei .fg della 6a e i 44 px di #opModalBody button in testa al foglio non
   lo prendono, quindi fondo, testo e altezze al tocco sono tutti qui (in scuro il titolo era bianco sul
   riquadro bianco scritto a mano). */
.op-drv-up{position:fixed;inset:0;z-index:99999;display:flex;align-items:center;justify-content:center;padding:var(--sp-4);background:var(--fc-scrim)}
.op-drv-up-box{width:100%;max-width:360px;max-height:80vh;max-height:80dvh;overflow-y:auto;padding:var(--sp-5);border-radius:var(--r);background:var(--fc-card);color:var(--fc-label);box-shadow:var(--fc-shadow)}
.op-drv-up-testa{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2);margin-bottom:var(--sp-3)}
.op-drv-up-t{font-size:15px;font-weight:700;color:var(--fc-label)}
.op-drv-up-sotto{margin-bottom:var(--sp-3);font-size:13px;font-weight:600;color:var(--fc-label)}
.op-drv-up-voce{display:flex;align-items:center;width:100%;min-height:36px;margin-bottom:var(--sp-1);padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px;text-align:left;cursor:pointer}
.op-drv-up-voce:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
@media (hover:hover){.op-drv-up-voce:hover{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}}
@media (hover:none){.op-drv-up-voce{min-height:44px}}
@media screen and (max-width:768px){.op-drv-up-voce,.op-drv-up .op-x{min-height:44px}.op-drv-up .op-x{min-width:44px}}

/* ── Tab Email: Modelli Email (email-templates.js renderEmailTemplates, design-08b) ──
   Ogni modello è un <button> (era un <div onclick>, fuori dalla tastiera) col passaggio del mouse qui
   (era scritto nello stile da onmouseover/onmouseout). Al passaggio cambia solo il bordo: --fc-label2
   su --fc-accent-soft è 4,39:1 in scuro. La testata riusa .op-email-head della design-05. */
.op-email-tpl-sez{margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:1px solid var(--fc-sep)}
.op-email-tpl-cat{margin-bottom:var(--sp-4)}
.op-email-tpl-cat:last-child{margin-bottom:0}
.op-email-tpl-griglia{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--sp-2)}
.op-email-tpl{display:flex;align-items:center;gap:var(--sp-2);width:100%;min-width:0;min-height:44px;padding:var(--sp-2) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;text-align:left;cursor:pointer}
/* #opModalBody button (1,0,1) in testa al foglio la centrerebbe da telefono. */
#opModalBody .op-email-tpl{justify-content:flex-start}
.op-email-tpl:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
.op-email-tpl-ico{flex:none;font-size:16px}
.op-email-tpl-testo{display:block;flex:1 1 auto;min-width:0}
.op-email-tpl-nome{display:block;overflow:hidden;font-size:13px;font-weight:700;color:var(--fc-label);text-overflow:ellipsis;white-space:nowrap}
.op-email-tpl-desc{display:block;overflow:hidden;font-size:12px;color:var(--fc-label2);text-overflow:ellipsis;white-space:nowrap}
.op-email-tpl-busta{flex:none;margin-left:auto;font-size:13px;opacity:.4}
@media (hover:hover){.op-email-tpl:hover{border-color:var(--fc-accent)}}

/* ── Gestione: note riunione e attività in cima alla tab (design-08c, era stile inline di opmodal-riunione-task.js) ──
   Due riquadri su --fc-bg con le liste su --fc-card. I conteggi sono chip (note verdi, attività aperte blu), la
   priorità è il pallino di area-task.css (.task-prio-dot, stesso del modale Attività) con la parola accanto nei
   dettagli. Il menu degli assegnatari si apre e si chiude con hidden (base.css). Da telefono #opModalBody button
   in testa al foglio dà a ogni bottone del corpo 44 px centrati: chi va allineato a sinistra porta #opModalBody. */
.gnt{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sp-4)}
.gnt-card{padding:var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-bg);color:var(--fc-label)}
.gnt-testa{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2)}
.gnt-testa .op-sez{margin:0}
.gnt-testa .gnt-nuova{margin-left:auto}
.gnt-composer{align-items:flex-start;margin-bottom:var(--sp-2)}
.gnt-vuoto{border:1px dashed var(--fc-sep);border-radius:var(--rs);background:var(--fc-card)}
.gnt-lista{overflow:hidden;border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.gnt-lista.gnt-note{max-height:280px;overflow-y:auto}
.gnt-lista.is-completate{border-top:0;border-radius:0 0 var(--rs) var(--rs)}
.gnt-nota{display:flex;align-items:flex-start;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--fc-sep)}
.gnt-nota:last-child,.gnt-task:last-child{border-bottom:0}
.gnt-nota-corpo{flex:1;min-width:0}
.gnt-nota-chi{margin-bottom:2px;font-size:12px;font-weight:700;color:var(--fc-accent)}
.gnt-nota-testo{font-size:13px;line-height:18px;white-space:pre-wrap;overflow-wrap:anywhere}
.gnt-nota-azioni{margin-top:var(--sp-1)}
.gnt-nota-x{display:flex;flex:none;gap:2px}
.gnt-form{margin-bottom:var(--sp-2);padding:var(--sp-3);border:1px solid var(--fc-accent);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label)}
.gnt-form-t{margin-bottom:var(--sp-1);font-size:13px;font-weight:700;color:var(--fc-accent)}
.gnt-form-op{margin-bottom:var(--sp-2)}
.gnt-fg{margin-bottom:var(--sp-2)}
.gnt-form-riga{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.gnt-fg-ass{flex:2 1 160px;min-width:0}
.gnt-fg-prio{flex:1 1 90px;min-width:0}
.gnt-fg-data{flex:1 1 120px;min-width:0}
.gnt-form-azioni{justify-content:flex-end}
.gnt-ass{position:relative}
.gnt-ass-chips{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1);min-height:36px;padding:var(--sp-1) var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);cursor:pointer}
.gnt-ass-vuoto{font-size:13px;color:var(--fc-label2)}
.gnt-ass-x{margin-left:2px;font-size:11px;cursor:pointer}
.gnt-ass-dd{position:absolute;top:100%;right:0;left:0;z-index:50;max-height:160px;overflow-y:auto;border:1px solid var(--fc-sep);border-radius:0 0 var(--rs) var(--rs);background:var(--fc-card);color:var(--fc-label);box-shadow:var(--fc-shadow)}
.gnt-ass-voce{display:flex;align-items:center;gap:var(--sp-2);min-height:32px;padding:var(--sp-1) var(--sp-2);border-bottom:1px solid var(--fc-sep);font-size:13px;cursor:pointer}
.gnt-ass-voce.is-on{background:var(--fc-accent-soft);color:var(--fc-label)}
.gnt-ass-spunta{display:flex;flex:none;align-items:center;justify-content:center;width:16px;height:16px;border:1px solid var(--fc-sep);border-radius:4px;background:var(--fc-card);color:var(--fc-on-accent);font-size:11px;line-height:1}
.gnt-ass-voce.is-on .gnt-ass-spunta{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.gnt-task{padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--fc-sep);background:var(--fc-card);color:var(--fc-label)}
.gnt-task.is-scaduta{background:var(--fc-danger-soft);color:var(--fc-label)}
.gnt-task-riga{display:flex;align-items:center;gap:var(--sp-2)}
.gnt-task-t{flex:1;min-width:0;font-size:13px;font-weight:600;overflow-wrap:anywhere}
.gnt-task.is-fatta .gnt-task-t{color:var(--fc-label2);text-decoration:line-through}
.gnt-task-prog{flex:none;font-size:12px;font-weight:700;color:var(--fc-label2);white-space:nowrap}
.gnt-spunta{display:inline-flex;flex:none;align-items:center;justify-content:center;width:18px;height:18px;margin:0;padding:0;border:1px solid var(--fc-sep);border-radius:4px;background:var(--fc-card);color:var(--fc-on-accent);font:inherit;font-size:12px;line-height:1;cursor:pointer;appearance:none}
.gnt-spunta.is-on{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.gnt-task-desc{margin:2px 0 0 var(--sp-4);font-size:12px;color:var(--fc-label2);white-space:pre-wrap;overflow-wrap:anywhere}
.gnt-task-meta{display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-3);margin:2px 0 0 var(--sp-4);font-size:12px;color:var(--fc-label2)}
.gnt-scaduta{font-weight:700;color:var(--fc-danger)}
.gnt-completate{display:flex;align-items:center;gap:var(--sp-2);width:100%;margin-top:var(--sp-2);padding:var(--sp-1) var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label2);font:inherit;font-size:12px;font-weight:700;text-align:left;cursor:pointer}
.gnt-completate.is-open{border-radius:var(--rs) var(--rs) 0 0}
.gnt-freccia{font-size:11px}
/* La riga "Completate" è un bottone: da telefono #opModalBody button la centrerebbe. */
#opModalBody .gnt-completate{justify-content:flex-start}
@media (hover:hover){
  .gnt-ass-voce:not(.is-on):hover{background:var(--fc-bg)}
  .gnt-completate:hover{color:var(--fc-label)}
}
@media (hover:none){.gnt-ass-voce{min-height:44px}}

/* ── Pannello Riunione Responsabili (#pan-riuResp, design-08c; era RIUNIONE TAB di style.css) ──
   Non sta nella scheda ma vive qui (spec §6.1 riga 8): è la stessa riunione della card della Decisione e
   delle note della Gestione. La card ha la testata chiara come .op-riu-card (6b). La tabella scorre nel
   suo contenitore; le colonne ID e Cantiere restano ferme a sinistra e la testata in alto. Ordine dei
   livelli: celle ferme del corpo 2, testata 3, incrocio testata/colonne ferme 4 (prima celle e incrocio
   erano a 3 e le righe che salivano coprivano "ID" e "Cantiere"). Fondi opachi (--fc-card, --fc-bg): il
   testo che scorre non si vede sotto. border-collapse:separate perché con collapse i bordi delle celle
   ferme restano indietro. La colonna ID è larga --riu-c0 e Cantiere parte da lì. Le priorità (.prio-*)
   sono coppie fondo/testo dei token con la parola sempre scritta. Nessuna animazione (il "SALVA NOTE"
   pulsava). */
.riu-card{margin-bottom:var(--sp-3);border:1px solid var(--fc-sep);border-radius:var(--r);background:var(--fc-card);color:var(--fc-label);box-shadow:none}
.riu-card .card-h{border-bottom:.5px solid var(--fc-sep);background:var(--fc-bg)}
.riu-card .card-h h2{color:var(--fc-label)}
.riu-card .card-h h2 em{color:var(--fc-label)}
.riu-card .card-icon{background:var(--fc-accent-soft);color:var(--fc-accent)}
.riu-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-3)}
.riu-toolbar select{min-height:32px;padding:0 var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:13px}
.riu-toolbar select:focus{border-color:var(--fc-accent);outline:none;box-shadow:0 0 0 3px var(--fc-accent-soft)}
.riu-stati{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1)}
.riu-stato{display:inline-flex;align-items:center;gap:var(--sp-1);min-height:24px;padding:0 var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--r-pill);background:var(--fc-card);color:var(--fc-label);font:inherit;font-size:11px;font-weight:600;cursor:pointer}
.riu-stato .status-dot{margin:0}
.riu-stato[aria-pressed="true"]{border-color:var(--fc-accent);background:var(--fc-accent-soft);color:var(--fc-label)}
.riu-solo-attive{display:inline-flex;align-items:center;gap:var(--sp-1);font-size:13px;font-weight:600;color:var(--fc-label);cursor:pointer}
.riu-solo-attive input{accent-color:var(--fc-accent-fill)}
.riu-spazio{flex:1 1 0}
.riu-btn,.riu-btn-save{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-1);min-height:32px;padding:0 var(--sp-3);border:1px solid var(--fc-accent);border-radius:var(--rs);background:var(--fc-card);color:var(--fc-accent);font:inherit;font-size:12px;font-weight:600;white-space:nowrap;cursor:pointer}
.riu-btn-primary,.riu-btn-save{border-color:var(--fc-accent-fill);background:var(--fc-accent-fill);color:var(--fc-on-accent)}
.riu-btn-ghost{border-color:var(--fc-sep);background:var(--fc-card);color:var(--fc-label)}
.riu-btn:focus-visible,.riu-btn-save:focus-visible,.riu-stato:focus-visible{outline:2px solid var(--fc-accent);outline-offset:2px}
.riu-wrap{max-height:calc(100vh - 260px);overflow:auto;border:1px solid var(--fc-sep);border-radius:var(--r);background:var(--fc-card)}
.riu-table{--riu-c0:64px;width:auto;border-collapse:separate;border-spacing:0;font-size:12px}
.riu-table thead{background:transparent}
.riu-table th{position:sticky;top:0;z-index:3;padding:var(--sp-1) var(--sp-2);border-right:1px solid var(--fc-sep);border-bottom:2px solid var(--fc-sep);background:var(--fc-bg);color:var(--fc-label2);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;vertical-align:bottom}
.riu-table td{padding:var(--sp-1) var(--sp-2);border-right:1px solid var(--fc-fill);border-bottom:1px solid var(--fc-sep);color:var(--fc-label);font-size:12px;vertical-align:top}
.riu-table tbody tr{background:transparent}
.riu-table .riu-sticky-0,.riu-table .riu-sticky-1{position:sticky}
.riu-table .riu-sticky-0{left:0;width:var(--riu-c0);min-width:var(--riu-c0);max-width:var(--riu-c0);box-sizing:border-box}
.riu-table .riu-sticky-1{left:var(--riu-c0);min-width:120px;border-right:2px solid var(--fc-sep)}
.riu-table th.riu-sticky-0,.riu-table th.riu-sticky-1{z-index:4}
.riu-table td.riu-sticky-0,.riu-table td.riu-sticky-1{z-index:2;background:var(--fc-card)}
.riu-table td.riu-sticky-1{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.riu-table .riu-w-s{min-width:48px}
.riu-table .riu-w-m{min-width:72px}
.riu-table .riu-w-l{min-width:92px}
.riu-table .riu-w-xl{min-width:104px}
.riu-table .riu-w-nota{min-width:220px}
.riu-table .riu-w-oggi{min-width:260px}
.riu-table .riu-forte{font-weight:800}
.riu-table .num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.riu-table .riu-centro{text-align:center}
.riu-table td.riu-date{max-width:100px;line-height:1.2;white-space:normal}
.riu-table td.riu-nowrap{white-space:nowrap}
.riu-table td.riu-vuoto{padding:var(--sp-6);text-align:center;color:var(--fc-label2)}
.riu-table .riu-id-cell{font-weight:700;color:var(--fc-accent);white-space:nowrap;cursor:pointer}
.riu-table td.riu-note-cell{max-width:240px;line-height:1.3;white-space:normal;cursor:pointer}
.riu-note-conta{margin-left:var(--sp-1)}
.riu-scad{font-weight:700;color:var(--fc-label2);white-space:nowrap}
.riu-scad.is-vicina{color:var(--fc-danger)}
.riu-wf-sel{width:100%;padding:2px var(--sp-1);border:1px solid transparent;border-radius:4px;background:transparent;color:var(--fc-label);font:inherit;font-size:12px;text-align:center;cursor:pointer;outline:none;appearance:none}
.riu-wf-sel:focus{border-color:var(--fc-accent);box-shadow:0 0 0 2px var(--fc-accent-soft)}
.riu-edit{width:100%;padding:2px var(--sp-1);border:1px solid transparent;border-radius:4px;background:transparent;color:var(--fc-label);font:inherit;font-size:12px;box-sizing:border-box;outline:none}
.riu-edit.riu-num{text-align:right}
.riu-edit:focus{border-color:var(--fc-accent);background:var(--fc-card);box-shadow:0 0 0 2px var(--fc-accent-soft)}
/* Cella Budget lavori sotto pilota (Fase 5 Cantieri, era style.css:80-86): testo pieno su --fc-fill e
   bordo tratteggiato, segnale di sola lettura che non dipende dal colore. Il :focus tiene il fondo. */
.riu-edit.riu-edit-ro{background:var(--fc-fill);color:var(--fc-label);border-style:dashed;border-color:var(--fc-sep);cursor:not-allowed}
.riu-edit.riu-edit-ro:focus{background:var(--fc-fill);border-color:var(--fc-accent)}
.riu-note-ta{width:100%;min-height:48px;padding:var(--sp-1) var(--sp-2);border:1px solid var(--fc-sep);border-radius:var(--rs);background:var(--fc-warn-soft);color:var(--fc-label);font:inherit;font-size:12px;line-height:1.35;resize:vertical;box-sizing:border-box;outline:none}
.riu-note-ta:focus{border-color:var(--fc-accent);background:var(--fc-card);box-shadow:0 0 0 2px var(--fc-accent-soft)}
select.prio-alta{background:var(--fc-danger-soft);color:var(--fc-danger);font-weight:800}
select.prio-media{background:var(--fc-warn-soft);color:var(--fc-warn);font-weight:800}
select.prio-bassa{background:var(--fc-accent-soft);color:var(--fc-accent);font-weight:800}
/* Modale "⚙ Ordina" (#genModal, solo admin). */
.riu-ordina-lbl{display:block;margin:var(--sp-2) 0 var(--sp-1);font-size:12px;font-weight:700;color:var(--fc-label)}
.riu-ordina-ta{min-height:180px}
.riu-ordina-err{min-height:1em;margin-top:var(--sp-2);font-size:12px}
.riu-ordina-azioni{justify-content:flex-end;margin-top:var(--sp-2)}
@media (hover:hover){
  .riu-stato:hover{border-color:var(--fc-accent)}
  .riu-btn:hover{background:var(--fc-accent-soft);color:var(--fc-accent)}
  .riu-btn-primary:hover,.riu-btn-save:hover{background:var(--fc-accent-fill);color:var(--fc-on-accent)}
  .riu-btn-ghost:hover{border-color:var(--fc-accent);background:var(--fc-card);color:var(--fc-accent)}
  .riu-table tbody tr:hover,.riu-table tbody tr:hover td.riu-sticky-0,.riu-table tbody tr:hover td.riu-sticky-1{background:var(--fc-bg)}
  .riu-table td.riu-note-cell:hover{background:var(--fc-accent-soft);color:var(--fc-label)}
  .riu-table .riu-id-cell:hover{text-decoration:underline}
  .riu-wf-sel:hover,.riu-edit:hover{border-color:var(--fc-sep)}
}
@media (hover:none){
  .riu-btn,.riu-btn-save,.riu-stato,.riu-toolbar select{min-height:44px}
}

/* ── Scheda: le ultime regole della Riunione che stavano in style.css (design-08c) ──
   .riu-diary*: "Ultime Note Riunione" della card Riunione della Decisione (renderStep5Riunione), fuori dal
   PDF dalla 6c (.op-riu-card{display:none} nel blocco print qui sotto; riprovato nel Task 7). Stessa forma
   dello storico modifiche della Checklist (.op-log). .fg input.fg-ro-computo: il Budget Lavori della card
   Riunione sotto pilota; le regole dei campi #opModalBody .fg input:not(.fg-ro-computo) della 6a lo
   escludono di proposito, e (0,2,1) qui batte .fg input:focus di base.css (era in style.css) per ordine dei file. */
.riu-diary{max-height:200px;overflow-y:auto;font-size:12px}
.riu-diary-entry{margin-bottom:var(--sp-2);padding:var(--sp-1) var(--sp-2);border-left:3px solid var(--fc-accent);border-radius:0 var(--rs) var(--rs) 0;background:var(--fc-bg);color:var(--fc-label)}
.riu-diary-date{margin-bottom:2px;font-size:11px;font-weight:700;color:var(--fc-accent)}
.riu-diary-text{line-height:1.4;white-space:pre-wrap}
.fg input.fg-ro-computo{background:var(--fc-fill);color:var(--fc-label);border-style:dashed;cursor:not-allowed}

/* ── Scheda: bottoni piccoli della cornice e delle risorse (design-08c) ──
   .btn-sm (base.css, era in style.css) è .62rem (9,9 px da computer, 11,8 da telefono): Storico, PDF, Elimina e Richiedi
   eliminazione della barra Stato, Chiudi della vista storico, Repair, Carica File e Crea cartella del
   Drive, Apri delle Email. Qui dentro 12 px come .op-azione; fuori dalla scheda .btn-sm resta com'è
   (lo usano Gmail, Home, Cantieri, Cassa, Lista e altri, con le loro PR). Vale anche per "Usa" del
   Mercato nel BP (.bp-mkt-usa, 11 px dalla 7b: questa regola lo batte e lo porta a 12). */
#opModalBody .btn-sm{font-size:12px;letter-spacing:.04em}

/* ── Stampa della Decisione: la cornice resta fuori (design-05) ──
   Il blocco @media print di css/stampa.css (con !important, PR 13b) stampa il modale e
   nasconde barra in alto e fasi. Qui gli altri pezzi di cornice che finivano in
   testa al PDF ("Fase N di M", "Stato ▾ Storico PDF Elimina", avviso di sblocco):
   regole normali, in stampa nessuno le contende. Resta l'ULTIMA regola del file:
   le PR 6-8 aggiungono le loro sezioni sopra. */
@media print{
  .op-wiz-pos,.op-statusbar,.op-unlock{display:none}
  /* Decisione (design-06b): i pulsanti (decisione 12), il riquadro della chiave Google Maps con le
     istruzioni e il bottone "Salva" (decisione 18), "Cambia API Key" e le crocette ✕/↺ della tabella
     dei comparabili non vanno nel PDF per l'investitore. */
  .op-dec-azioni,.op-dec-chiave,.op-mappa-riga .op-azione,.op-tab .op-x{display:none}
  /* La card "Riunione Operativa" (campi e bottoni di lavoro interno) non va nel PDF per l'investitore:
     decisione di Fede del 27-set-2026. */
  .op-riu-card{display:none}
  /* Numeri della Decisione (design-07a): nel PDF il campo "effettivo" del tracker (un .op-campo da 36 px)
     allungava le cinque righe e spingeva il totale e la barra sulla pagina dopo. Qui solo classi della 7a. */
  .ct-inp{min-height:0;padding:0 var(--sp-1)}
  .ct-row{padding:2px 0}
}
