/* ═══════════════════════════════════════════════════════════════════════
   SP-TABLE-CORE — CSS condiviso di TUTTE le tabelle custom.

   DROP_1182c — QUESTO FILE ERA MORTO. L'estrazione del DROP_1160 (che ha
   tolto 142 KB di JS+CSS inline dal partial) ha tagliato nel punto
   sbagliato: le prime 983 righe erano JavaScript — un DUPLICATO di quello
   già in sp-table-core.js, tag <script>/<style> compresi — e un foglio di
   stile che comincia a metà di un commento JS il browser lo scarta INTERO.
   Misurato: `document.styleSheets[...].cssRules.length` = 0 su 66 KB.

   Non si vedeva perché il grosso di ciò che si guarda arriva da doc-*.css:
   a sparire erano il velo di attesa, lo scheletro delle linguette e la
   sidebar di secondo livello — cose che non si notano finché non servono.
   Da qui la lezione: un asset statico va verificato per quello che il
   BROWSER ne fa, non per il fatto che il file esista e sia servito con 200.
   ═══════════════════════════════════════════════════════════════════════ */
    /* progress indeterminata del velo (azioni senza % server) */
    @keyframes sp-indet-slide { 0%{transform:translateX(-100%)} 100%{transform:translateX(350%)} }
    #sp-veil .sp-veil-fill.sp-indet { width:35% !important; animation: sp-indet-slide 1.1s ease-in-out infinite; }

    /* Notifiche Filament SOPRA topbar/overlay (finivano nascoste sotto
       la barra header) */
    .fi-no, [class^="fi-no"], .fi-notifications, div[class*="fi-no-container"] { z-index: 100000 !important; }

    /* Bulk bar a selezione ZERO: azioni disattivate (client-driven) */
    .sp-bulk-bar.sp-zero .sp-bulk-btn { opacity:.42; pointer-events:none; filter:saturate(.6); }
    /* Sidebar delle pagine EDIT: bordo sinistro trascinabile */
    .sdoc-product-sb.open { position:relative; }
    body.sp-esb-resizing { cursor:col-resize !important; user-select:none; }
    /* fluidita': la transition width .2s della sidebar la faceva arrancare
       dietro al mouse — spenta SOLO durante il drag */
    .sdoc-product-sb.sp-esb-dragging { transition: none !important; }
    body.sp-esb-resizing * { cursor:col-resize !important; }
.sp-vport { overflow: auto; }
    .sp-vport table.sp-table thead th {
        position: sticky; top: 0; z-index: 6;
        background: var(--sp-th-bg, #f9fafb);
        box-shadow: 0 1px 0 #e5e7eb;
    }
    .dark .sp-vport table.sp-table thead th { background: var(--sp-th-bg-dark, #1f2937); }
    .sp-hscroll-top { overflow-x: auto; overflow-y: hidden; height: 12px; }
    .sp-hscroll-top > div { height: 1px; }

    /* DROP_187: colonne NUMERICHE delle tabelle righe — intestazione
       allineata come i valori (a destra): titolo a sx + numero a dx
       faceva sembrare che il valore sconfinasse nella colonna accanto.
       Il padding tiene il testo lontano dall'handle di resize (7px). */
    .srow-table thead th[data-col-key="qta"],
    .srow-table thead th[data-col-key="qta_ord"],
    .srow-table thead th[data-col-key="qta_ric"],
    .srow-table thead th[data-col-key="evasa"],
    /* DROP_605: chiave UNIFICATA della quantita' evasa. Le tre storiche
       (evasa/ricevuti/prelev/qta_ric) restano finche' tutte le pagine non
       sono agganciate al registro DocumentRowColumns. */
    .srow-table thead th[data-col-key="qta_evasa"],
    .srow-table thead th[data-col-key="ricevuti"],
    .srow-table thead th[data-col-key="prelev"],
    .srow-table thead th[data-col-key="prezzo"],
    .srow-table thead th[data-col-key="prezzo_listino"],
    .srow-table thead th[data-col-key="prezzo_netto"],
    .srow-table thead th[data-col-key="sc1"],
    .srow-table thead th[data-col-key="sc2"],
    .srow-table thead th[data-col-key="sconto"],
    .srow-table thead th[data-col-key="imponibile"],
    .srow-table thead th[data-col-key="iva"],
    .srow-table thead th[data-col-key="totale"] {
        text-align: right;
        padding-right: 12px;
    }

    /* DROP_607 — campi di sola lettura delle righe: LEGGIBILI.
       Erano grigio chiaro (#9ca3af) IN CORSIVO: la combinazione rendeva
       difficile leggere il valore, segnalato da Raffaele ("vorrei che i
       valori fossero ben visibili anche quando in corsivo").
       Il corsivo resta — e' il segnale che il campo non si modifica — ma il
       contrasto sale da 2.5:1 a oltre 7:1 su bianco, ben sopra la soglia di
       accessibilita'. La regola era ripetuta in CINQUE pagine: ora vive qui
       e vale ovunque. */
    .srow-table .srow-inp.readonly,
    .sp-table .srow-inp.readonly {
        pointer-events: none;
        color: #4b5563;
        font-style: italic;
        padding-right: 6px;
    }
    .dark .srow-table .srow-inp.readonly,
    .dark .sp-table .srow-inp.readonly {
        color: #d1d5db;
    }

    /* DROP_615 — testata documenti su SCHERMO PICCOLO: solo icone.
       Sotto i 1100px i pulsanti di testata perdono l'etichetta e restano
       icona + tooltip: cinque azioni rapide ci stanno su una riga sola
       invece di andare a capo. Serve che l'etichetta stia in uno
       <span class="sdoc-btn-label">, cosi' la regola vale per ogni
       pulsante nuovo senza toccare le pagine. */
    @media (max-width: 1100px) {
        .sdoc-toolbar .sdoc-btn-label { display: none; }
        .sdoc-toolbar .sdoc-btn { padding-left: 8px; padding-right: 8px; gap: 0; }
    }

    /* DROP_615 — voci del menu ☰ delle azioni operative. */
    .sdoc-menu-item {
        display: flex; align-items: center; gap: 7px; width: 100%;
        padding: 7px 12px; border: none; background: none; cursor: pointer;
        font-size: .75rem; color: #374151; text-align: left; font-family: inherit;
        text-decoration: none; white-space: nowrap;
    }
    .sdoc-menu-item:hover { background: #f9fafb; }

    /* DROP_643 — la maniglia di resize deve stare DENTRO la propria cella.
       Era larga 7px ma sporgeva di 3 oltre il bordo (right:-3px). Le
       intestazioni sono sticky, quindi ognuna apre un contesto di
       impilamento a se': quella SUCCESSIVA, venendo dopo nel documento,
       copre la parte sporgente della precedente. Misurato con
       elementFromPoint sulle colonne vere: dei 7px ne rispondevano ~4, il
       centro e la destra colpivano la cella accanto.

       Da fuori sembrava rotto a intermittenza: l'evidenziazione al
       passaggio del mouse copre tutti i 7px, quindi si vede la maniglia,
       si preme, e spesso il clic finisce sull'intestazione — che non fa
       nulla. Un test che spara l'evento direttamente sull'elemento non se
       ne accorge: salta il test di collisione, ed e' l'errore che mi aveva
       fatto dire "funziona".

       Ora la maniglia resta dentro la cella e diventa piu' larga: tutta
       l'area evidenziata e' anche l'area che risponde. Regola qui e non
       nelle pagine perche' la geometria e' comune a tutte e cinque; il
       colore di evidenziazione resta quello di ciascuna. */
    .srow-col-handle { right: 0 !important; width: 10px !important; }

    /* DROP_607 — frecce su/giu' dei campi numerici NASCOSTE nelle righe.
       Misurato: rubavano ~14px a ogni cella numerica, e su una colonna
       sconto da 72px lasciavano 58px utili contro i 63 richiesti da un
       valore come "-6.01". Da qui i valori "tagliati sulla destra"
       segnalati da Raffaele. Il valore si scrive comunque a tastiera e le
       frecce su una tabella fitta non le usa nessuno. */
    .srow-table input[type="number"].srow-inp::-webkit-outer-spin-button,
    .srow-table input[type="number"].srow-inp::-webkit-inner-spin-button {
        -webkit-appearance: none;
        margin: 0;
    }
    .srow-table input[type="number"].srow-inp {
        -moz-appearance: textfield;
        appearance: textfield;
    }
#sp-print-guide{position:absolute;top:0;bottom:0;width:0;border-left:2px dashed #dc2626;z-index:25;pointer-events:none}
    #sp-print-guide::before{content:'\2702 limite stampa A4';position:sticky;top:4px;display:inline-block;transform:translateX(-100%);
        background:#dc2626;color:#fff;font-size:.58rem;font-weight:700;padding:2px 7px;border-radius:6px 0 0 6px;white-space:nowrap}
#sp-veil{position:fixed;inset:0;z-index:9998;display:none;align-items:center;justify-content:center;
        background:rgba(17,24,39,.22);backdrop-filter:blur(1px)}
    #sp-veil.on{display:flex}
    #sp-veil .sp-veil-box{background:white;border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.18);
        padding:14px 22px;display:flex;align-items:center;gap:11px;font-size:.8rem;font-weight:600;color:#374151}
    .dark #sp-veil .sp-veil-box{background:rgb(31,41,55);color:#e5e7eb}
    #sp-veil svg{width:19px;height:19px;color:#4f46e5;animation:sp-veil-spin .8s linear infinite}
    @keyframes sp-veil-spin{to{transform:rotate(360deg)}}
.sp-tab-waiting{position:relative;pointer-events:none}
    .sp-tab-waiting::after{content:'';position:absolute;inset:0;z-index:5;border-radius:8px;
        background:linear-gradient(90deg,transparent 25%,rgba(148,163,184,.14) 50%,transparent 75%);
        background-size:200% 100%;animation:sp-tabskel 1s linear infinite}
    @keyframes sp-tabskel{0%{background-position:200% 0}100%{background-position:-200% 0}}
#sp-l2-inline{position:absolute;inset:0;z-index:40;display:none;flex-direction:column;background:rgb(var(--gray-50));border-radius:12px 12px 0 0;overflow:hidden}
    .dark #sp-l2-inline{background:rgb(var(--gray-900))}
    #sp-l2-inline:has(.sp-sidebar.open){display:flex}
    #sp-l2-back{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid rgb(var(--gray-200));background:rgb(var(--primary-50, 239 246 255))}
    .dark #sp-l2-back{border-color:rgb(var(--gray-700));background:rgb(var(--gray-800))}
    #sp-l2-back button{display:inline-flex;align-items:center;gap:6px;font-size:.75rem;font-weight:700;color:rgb(var(--primary-600));background:none;border:none;cursor:pointer}
    #sp-l2-body{flex:1;min-height:0;display:flex;overflow:hidden}
    #sp-l2-body .sp-sidebar{width:100% !important;min-width:0 !important;max-width:none !important;height:100% !important;position:static !important;border:none !important}
    #sp-l2-body .sp-sidebar-resize{display:none !important}

/* ═══ DROP_1182b (B5) — PACCHETTI NELLE RIGHE DOCUMENTO ═══════════════════
   Un bundle/composto entra come una riga che lo NOMINA piu' i suoi
   componenti agganciati. Senza un segno a video sono sei righe scollegate,
   e chi ne tocca una non puo' sapere che le tocca tutte.
   Il marcatore lo mette il partial CONDIVISO row-number-select-cell sulla
   sua cella; lo stile lo prende la riga con :has(), cosi' le cinque pagine
   documento non vanno toccate una per una. */
/* La riga DESCRITTIVA era colorata con uno `style` inline sulla pagina, e
   uno stile inline batte qualunque foglio: la riga del pacchetto — che e'
   descrittiva — non poteva prendere il suo colore. Il colore vive qui, dove
   si puo' scavalcare. */
.srow-table tbody tr.srow-descr{background:#fafbff}
.dark .srow-table tbody tr.srow-descr{background:#111827}

.srow-table tbody tr:has(td[data-sp-pack]){background:#f5f3ff;font-weight:600}
.dark .srow-table tbody tr:has(td[data-sp-pack]){background:#2e1065}
.srow-table tbody tr:has(td[data-sp-pack]) td{border-top:1px solid #ddd6fe}
.srow-table tbody tr:has(td[data-sp-pack]) .srow-inp{font-weight:600}
.sp-pack-ico{font-size:.8rem;line-height:1;vertical-align:middle}

/* I COMPONENTI: rientrati e con il ramo, come le sottovoci di un elenco. */
.srow-table tbody tr:has(td[data-sp-fig]){background:#fcfcff}
.dark .srow-table tbody tr:has(td[data-sp-fig]){background:#1e1b31}
/* Il rientro si conta DAL marcatore, non dalla posizione: `nth-child(4)`
   avrebbe indentato una colonna diversa su ogni pagina. Dopo la cella del
   numero vengono sempre il codice e poi il prodotto (contratto delle
   colonne condivise), su tutte e cinque le pagine documento. */
.srow-table tbody tr td[data-sp-fig] + td + td .srow-inp{padding-left:16px}
.sp-pack-ramo{color:#c4b5fd;font-family:monospace;font-size:.72rem;margin-right:2px;vertical-align:middle}

/* L'ULTIMO componente chiude il blocco: sotto ricomincia il documento. */
.srow-table tbody tr:has(td[data-sp-fig]):not(:has(+ tr td[data-sp-fig])) td{border-bottom:1px solid #ddd6fe}

/* DROP_1200 — i numeri della riga PADRE (somme a blocco chiuso). */
.srow-table .sp-pack-num{display:block;text-align:right;font-size:.72rem;color:#4338ca;padding-right:8px;font-variant-numeric:tabular-nums}


/* ═══ DROP_1475 — LA PROMOZIONE SULLA RIGA, SENZA RUBARE ALTEZZA ══════════
 *
 * Prima versione: una pastiglia con bordo sotto la descrizione. Raffaele:
 * «non mi piace come viene la riga, occupa troppo spazio la promozione».
 * Aveva ragione — su un documento di venti righe una riga in piu' per ognuna
 * significa meta' documento fuori schermo, e le promozioni si guardano UNA
 * volta mentre le righe si scorrono tutto il giorno.
 *
 * Adesso l'etichetta sta DENTRO la cella del prodotto, appoggiata a destra
 * sopra lo spazio vuoto dell'input: la riga resta alta esattamente quanto
 * prima. La cella e' gia' `position:relative` (serve al menu della ricerca
 * prodotto), quindi non serve toccare il markup delle quattro pagine.
 *
 * Perche' l'input prende un rientro a destra: senza, un nome di prodotto
 * lungo ci finirebbe sotto e si leggerebbero due testi sovrapposti. Il
 * rientro lo prende SOLO la cella che ha davvero un'etichetta — `:has()`,
 * gia' usato piu' su in questo stesso foglio.
 *
 * Ambra e non verde: lo sconto e' da NOTARE, e in queste tabelle il verde
 * vuol dire «fatto». */
.srow-promo{
  position:absolute; right:6px; top:50%; transform:translateY(-50%);
  display:inline-flex; align-items:center; gap:4px;
  font-size:.62rem; line-height:1; white-space:nowrap;
  color:#b45309; cursor:help; pointer-events:auto;
}
.srow-promo-nome{
  font-weight:700; padding:1px 4px; border-radius:6px;
  background:#fef3c7; color:#92400e;
}
.srow-promo-val{font-variant-numeric:tabular-nums; font-weight:600}
.dark .srow-promo{color:#fbbf24}
.dark .srow-promo-nome{background:#3f2d0a; color:#fcd34d}

/* Il rientro solo dove serve, e calcolato sull'etichetta piu' lunga che ci
   sta comoda: oltre, l'etichetta stessa si accorcia con l'ellissi invece di
   mangiare il nome del prodotto. */
/* Il rientro e' piccolo apposta: alla prova a video con 112px l'etichetta
   si mangiava il NOME DEL PRODOTTO su una colonna stretta — e fra le due
   informazioni il nome viene prima, sempre. L'importo di riga se ne va nel
   tooltip, e il totale delle promozioni si legge in fondo al documento. */
/* Il rientro tiene conto anche della percentuale, e resta stretto: con
   112px (etichetta + importo in euro) l'etichetta si mangiava il NOME DEL
   PRODOTTO su una colonna stretta, e fra le due informazioni il nome viene
   prima. La percentuale costa meta' spazio dell'importo e dice la stessa
   cosa a colpo d'occhio. */
.srow-table td:has(> .srow-promo) .srow-inp{padding-right:52px}
.srow-table td:has(> .srow-promo-mano) .srow-inp{padding-right:96px}
.srow-promo-nome{max-width:44px; overflow:hidden; text-overflow:ellipsis}

/* DROP_1478 — la promozione c'era ma lo sconto l'ha corretto una persona: la
   promozione si e' fatta da parte. Grigio e non ambra, perche' NON e' uno
   sconto attivo — e' il segno di una promozione che non si applica. Dirlo
   costa una parola; tacerlo lascia chi guarda a chiedersi perche' quel 3x2
   non ha fatto niente. */
.srow-promo-mano{color:#6b7280}
.srow-promo-mano .srow-promo-nome{background:#f3f4f6; color:#4b5563; text-decoration:line-through}
.srow-promo-mano .srow-promo-val{font-style:italic; font-weight:500}
.dark .srow-promo-mano{color:#a1a1aa}
.dark .srow-promo-mano .srow-promo-nome{background:#27272a; color:#a1a1aa}

/* ═══ DROP_1479 — LO SWITCHER % / VALORE DI UNO SLOT SCONTO ═══════════════
 *
 * Il simbolo E' il pulsante: su una tabella gia' stretta un secondo controllo
 * accanto al numero avrebbe rubato larghezza proprio alla cifra da leggere.
 *
 * In VALORE cambia colore, e non e' decorazione: «10» in una colonna che si
 * chiama «Sc.%» si legge come dieci per cento, sempre — e' quello che l'occhio
 * si aspetta. Il colore diverso e' l'unico segnale che arriva prima della
 * lettura, e senza si sbaglierebbe a colpo d'occhio. */
.srow-modo{
  flex:0 0 auto; width:16px; height:18px; padding:0;
  border:1px solid #d1d5db; border-radius:4px;
  background:#f9fafb; color:#6b7280;
  font-size:.66rem; font-weight:700; line-height:1;
  cursor:pointer; user-select:none;
}
.srow-modo:hover{background:#eef2ff; border-color:#a5b4fc; color:#4338ca}
/* DROP_1554 — in sola lettura e' un'etichetta: niente manina, niente reazione
   al passaggio del mouse. Un comando che si illumina e non fa niente si legge
   come un guasto. */
.srow-modo-fermo{display:inline-flex; align-items:center; justify-content:center;
  cursor:default; opacity:.85}
.srow-modo-fermo:hover{background:#f9fafb; border-color:#d1d5db; color:#6b7280}
.srow-modo-fermo.e-valore:hover{background:#ecfdf5; border-color:#6ee7b7; color:#047857}
.srow-modo.e-valore{background:#ecfdf5; border-color:#6ee7b7; color:#047857}
.srow-modo.e-valore:hover{background:#d1fae5}
.dark .srow-modo{background:#27272a; border-color:#3f3f46; color:#a1a1aa}
.dark .srow-modo.e-valore{background:#052e23; border-color:#047857; color:#6ee7b7}

/* DROP_1482 — in ACQUISTO il badge della promozione si tocca: dentro si
   sceglie quale applicare fra quelle valide su quella riga. La freccina e' il
   solo segnale che e' un comando e non un'etichetta — senza, nessuno proverebbe
   a premerlo. In vendita resta un'etichetta, perche' li' decide la priorita'. */
.srow-promo-scelta{border:none;padding:0;background:none;cursor:pointer;font:inherit}
.srow-promo-scelta:hover .srow-promo-nome{background:#fde68a}
.srow-promo-scelta .srow-promo-val{font-size:.55rem;opacity:.7}
.dark .srow-promo-scelta:hover .srow-promo-nome{background:#57400c}
