/* Brand KiLuggage operatore: blu Poste #0047BB + giallo. Mobile-first, tocco a pollice. */
:root {
    --kl-blue: #0047BB;
    --kl-blue-dark: #00337f;
    --kl-yellow: #FFD200;
    --kl-bg: #f4f6fa;
    --kl-text: #1a2230;
    --kl-muted: #6b7280;
    --kl-radius: 14px;
}

html, body {
    margin: 0;
    background: var(--kl-bg);
    color: var(--kl-text);
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    -webkit-tap-highlight-color: transparent;
}

/* ---- Shell autenticata ---- */
/* Full-width responsive (mockup): il contenuto si vincola via .kl-content/.kl-topbar-inner. */
.kl-shell {
    min-height: 100dvh;
    display: flex;
    flex-direction: column;
    background: var(--kl-bg);
    position: relative;
}

.kl-topbar {
    background: var(--kl-blue);
    color: #fff;
    padding: 16px 16px 14px;
    padding-top: max(16px, env(safe-area-inset-top));
    position: sticky;
    top: 0;
    z-index: 10;
}
/* Tre zone come da mockup: titolo+sede | logo centrato | utente/azioni */
.kl-topbar-inner {
    max-width: 1140px; margin: 0 auto;
    display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;
}
.kl-topbar-left { display: flex; align-items: center; gap: 12px; }
.kl-back {
    /* font-size e line-height non servono piu': l'icona e' dimensionata in px qui sotto. */
    color: #fff; text-decoration: none;
    padding: 6px 10px; border-radius: 8px;
}
.kl-back:active { background: rgba(255,255,255,.15); }
/* La freccia back e' un chevron di KlIcon: `display: block` perche' nell'anchor non c'e' testo,
   e un inline-block resterebbe appoggiato alla linea di base lasciando sotto lo spazio del
   descender. */
.kl-back .kl-ico { display: block; width: 24px; height: 24px; }
.kl-topbar-title { font-weight: 800; font-size: 1.25rem; line-height: 1.15; color: #fff; }
.kl-topbar-loc { font-size: .85rem; font-weight: 600; margin-top: 8px; white-space: nowrap; color: #fff; }
/* Il colore e la misura del testo qui servono ancora: sono l'aspetto del fallback (l'alt
   dell'immagine) se il file del logo non caricasse. */
.kl-logo { font-size: 1.15rem; justify-self: center; color: #fff; text-decoration: none; }
/* Altezza fissa e larghezza in proporzione: il file e' 250x89 (marchio col sottotitolo), a 44px
   viene 124x44, cioe' un po' piu' della scritta che c'era prima (95x34). `display: block` perche'
   nell'anchor non c'e' testo: un'immagine inline si appoggerebbe alla linea di base lasciando
   sotto lo spazio del descender. */
.kl-logo img { display: block; height: 44px; width: auto; }
.kl-userchip {
    display: inline-flex; align-items: center; gap: 8px;
    background: rgba(255,255,255,.18); border-radius: 10px;
    padding: 9px 16px; font-size: .95rem; font-weight: 700; white-space: nowrap;
}
/* Il chip col nome resta nascosto fino a 1000px, non solo su telefono. Nella fascia dei tablet i
   minimi dei tre blocchi non stavano nella barra: il blocco di sinistra non si comprime sotto il
   nome della sede (che e' `white-space: nowrap`, ~230px) piu' la freccia, il logo e' fisso e le
   azioni sono anch'esse nowrap. Misurato a 753px, tablet in portrait: 121px di sfondamento col
   chip, 0 senza. La soglia e' 1000 e non ~880 perche' `UserLabel` ricade sull'email dai claim
   quando il profilo non ha il nome, e un'email allarga il chip di un altro centinaio di pixel. */
@media (max-width: 1000px) { .kl-userchip { display: none; } }
/* Fascia fra il telefono e il desktop (561-720px, tipico di un tablet piccolo o di una finestra
   ridimensionata): la barra resta a una riga, ma i due testi di sinistra devono poter cedere.
   Con la sede a `nowrap` il blocco di sinistra non scendeva sotto ~297px e i tre blocchi non
   stavano nella barra: a 600px erano 124px di sfondamento, e il logo piu' grande peggiorava di
   40px un difetto che c'era gia'. Cosi' il minimo di sinistra scende a ~104px e la riga sta. */
/* Il logo centrato sparisce sotto i 680px: a quelle larghezze i suoi 124px sono la differenza
   fra una barra che sta e una che sfora (a 561px il resto occupa 452px su 529 disponibili), e il
   brand e' comunque nell'icona della PWA. Da 681 in su resta con ~73px di margine. */
@media (max-width: 680px) { .kl-logo { display: none; } }
@media (max-width: 720px) {
    .kl-topbar-loc   { white-space: normal; }
    .kl-topbar-title { overflow-wrap: break-word; }
}
@media (max-width: 560px) {
    /* Top bar su due righe (decisione utente 2026-08-20): riga 1 freccia + titolo + badge
       operazione, riga 2 sede + toggle apertura + Esci. Con la griglia a tre zone del desktop
       a 375px servivano 663px contro i 343 utili: badge, toggle sede ed Esci finivano fuori
       dalla barra, quindi irraggiungibili col dito.
       `display: contents` scioglie i raggruppamenti pensati per il desktop, cosi' i singoli
       pezzi diventano celle di questa griglia senza duplicare il markup. */
    .kl-topbar-left, .kl-topbar-titlebox { display: contents; }
    /* Il selettore col figlio non e' un vezzo: la regola base di .kl-topbar-right (display: flex)
       sta piu' in basso in questo foglio, quindi a pari specificita' vincerebbe per ordine di
       sorgente e le azioni resterebbero tutte incollate sulla prima riga. */
    .kl-topbar-inner > .kl-topbar-right { display: contents; }
    .kl-topbar-inner {
        /* minmax(0, 1fr) e non 1fr: altrimenti la colonna non scende sotto la parola piu' lunga
           del titolo e sotto i 360px tornava a spingere Esci fuori dalla barra. */
        grid-template-columns: auto minmax(0, 1fr) auto auto;
        grid-template-areas:
            "back titolo badge  badge"
            "sede sede   toggle esci";
        /* Nessun column-gap: senza freccia (Dashboard) la prima colonna collassa a zero e il
           titolo resta incolonnato con la sede. Lo stacco fra le azioni lo danno i margini qui
           sotto, e la spaziatura della freccia il suo padding. */
        column-gap: 0; row-gap: 10px;
    }
    .kl-back         { grid-area: back; }
    /* Se lo spazio non basta il titolo spezza la parola: meglio un a-capo brutto che un bottone
       fuori schermo. */
    .kl-topbar-title { grid-area: titolo; font-size: 1.05rem; overflow-wrap: break-word; }
    /* La sede va a capo invece di restare tagliata: su telefono il tooltip col nome completo non
       esiste, quindi il nome deve leggersi tutto qui. */
    .kl-topbar-loc   { grid-area: sede; margin-top: 0; white-space: normal; }
    .kl-optype       { grid-area: badge; justify-self: end; }
    .kl-placetoggle  { grid-area: toggle; margin-left: 10px; }
    .kl-logout       { grid-area: esci; margin-left: 10px; }
}
.kl-logout {
    background: rgba(255,255,255,.15); color: #fff; border: 0;
    border-radius: 8px; padding: 8px 12px; font-size: .9rem; cursor: pointer;
}

/* Toggle apertura sede in top bar (US-047): pill con pallino di stato, affianco al chip utente. */
.kl-placetoggle {
    display: inline-flex; align-items: center; gap: 7px;
    border: 0; border-radius: 999px; padding: 8px 14px;
    font-size: .85rem; font-weight: 700; cursor: pointer; white-space: nowrap;
}
.kl-placetoggle-dot { width: 9px; height: 9px; border-radius: 50%; background: currentColor; }
.kl-placetoggle--open   { background: #dcfce7; color: #15803d; }
.kl-placetoggle--closed { background: #fee2e2; color: #b91c1c; }

.kl-content {
    flex: 1; width: 100%; max-width: 1140px; margin: 0 auto;
    box-sizing: border-box; padding: 18px 16px 32px;
}

/* ---- Tipografia ---- */
/* Titolo di pagina. 1.3rem sta poco sopra il titolo in top bar (1.25) e sopra la sezione
   (kl-h2, 1.2): prima erano 1.5rem senza alcuna riduzione su telefono, dove il titolo di
   pagina finiva per essere il testo piu' grande della schermata.
   Il peso e' dichiarato qui perche' il reboot di Bootstrap mette 500 sugli h1: a 1.5rem la
   dimensione lo mascherava, piu' piccolo il titolo risultava piu' leggero della sezione (700)
   e del titolo card (800), cioe' il contrario della gerarchia. */
.kl-h1 { font-size: 1.3rem; margin: 4px 0 14px; font-weight: 700; }
@media (max-width: 560px) { .kl-h1 { font-size: 1.15rem; } }
.kl-muted { color: var(--kl-muted); }
.kl-todo {
    margin-top: 20px; padding: 12px 14px; background: #fff;
    border: 1px dashed #c9d2e3; border-radius: var(--kl-radius);
    color: var(--kl-muted); font-size: .9rem;
}
.kl-todo code { color: var(--kl-blue-dark); }

/* ---- Icone SVG (componente KlIcon) ---- */
/* Il default e' in linea e in em perche' e' quello che serve nella grande maggioranza dei punti:
   dentro etichette, chip, righe di elenco e testo dei bottoni l'icona deve seguire il corpo del
   testo accanto. I pochi contesti che vogliono un'icona grande la ridichiarano qui sotto.
   `flex-shrink: 0` serve nei contenitori flex (chip, label), dove altrimenti si schiaccerebbe.
   Lo stacco dal testo lo da' lo spazio del markup, o il `gap` del contenitore quando e' flex:
   nessun margine qui, altrimenti nei flex si sommerebbe al gap. */
.kl-ico { width: 1.05em; height: 1.05em; display: inline-block; vertical-align: -.15em; flex-shrink: 0; }

/* Contesti a icona grande: qui la misura e' in px perche' e' un elemento grafico della card,
   non un segno dentro una riga di testo. */
.kl-ac-ico .kl-ico      { width: 28px; height: 28px; display: block; }   /* azioni Dashboard */
.kl-choice-ico .kl-ico  { width: 32px; height: 32px; display: block; }   /* scelte Deposito/Ritiro */
.kl-photo-ico .kl-ico   { width: 30px; height: 30px; display: block; }   /* stato foto documento */
.kl-hero-ok-ico .kl-ico { width: 28px; height: 28px; }                   /* spunta nel cerchio di fine flusso */
.kl-receipt-check .kl-ico { width: 16px; height: 16px; }                 /* spunta nel cerchietto ricevuta */

/* ---- Azioni / pulsanti grandi ---- */
.kl-actions { display: flex; flex-direction: column; gap: 12px; margin-bottom: 22px; }
.kl-action {
    display: block; text-decoration: none; text-align: center;
    background: #fff; color: var(--kl-text); border: 1px solid #e3e7ee;
    border-radius: var(--kl-radius); padding: 18px; font-size: 1.05rem; font-weight: 600;
}
.kl-action--primary { background: var(--kl-blue); color: #fff; border-color: var(--kl-blue); }

.kl-btn-primary, .kl-btn, .kl-btn-outline, .kl-btn-yellow, .kl-btn-red {
    width: 100%; border: 0; border-radius: 12px; padding: 16px;
    font-size: 1.05rem; font-weight: 600; margin-top: 16px; cursor: pointer;
}
.kl-btn-primary { background: var(--kl-blue); color: #fff; }
.kl-btn-primary:disabled { opacity: .6; }
.kl-btn { background: #e5e7eb; color: var(--kl-text); }
.kl-btn-outline { background: #fff; color: var(--kl-text); border: 1px solid #e3e7ee; }
.kl-btn-outline:disabled { opacity: .6; }
/* Variante a larghezza naturale (es. bottoni secondari dentro card) */
.kl-btn--auto {
    display: inline-block; width: auto; padding: 14px 22px;
    text-decoration: none; text-align: center;
}
/* Bottone azione gialla full-width (mockup Inventario "Verifica Presenza") */
.kl-btn-yellow { background: var(--kl-yellow); color: var(--kl-text); }
.kl-btn-yellow:disabled { opacity: .6; }
/* Un pulsante spento non deve offrire la mano: il cursore a freccia dice che non c'e' niente da
   cliccare, e su un blocco come il check-in fuori finestra quello e' meta' del messaggio. */
.kl-btn-primary:disabled, .kl-btn:disabled, .kl-btn-outline:disabled,
.kl-btn-yellow:disabled, .kl-btn-red:disabled { cursor: default; }

/* ---- Stat ---- */
/* 2 colonne su telefono, 4 su desktop (mockup) */
.kl-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
@media (min-width: 768px) { .kl-stats { grid-template-columns: repeat(4, 1fr); } }
/* Variante a 3 KPI (es. Anomalie): 3 colonne a ogni larghezza */
.kl-stats.kl-stats--3 { grid-template-columns: repeat(3, 1fr); }
@media (min-width: 768px) { .kl-stats.kl-stats--3 { grid-template-columns: repeat(3, 1fr); } }
.kl-stat {
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 16px; text-align: center;
}
.kl-stat b { display: block; font-size: 1.6rem; color: var(--kl-blue); }
.kl-stat span { color: var(--kl-muted); font-size: .85rem; }

/* ---- Form ---- */
.kl-field { margin-bottom: 14px; display: flex; flex-direction: column; }
.kl-field label { font-size: .85rem; font-weight: 600; margin-bottom: 6px; color: var(--kl-muted); }
.kl-field input,
.kl-field select,
.kl-field textarea {
    border: 1px solid #cdd4e0; border-radius: 10px; padding: 14px;
    font-size: 1rem; background: #fff; font-family: inherit;
}
.kl-field textarea { resize: vertical; min-height: 96px; }
.kl-field input:focus,
.kl-field select:focus,
.kl-field textarea:focus { outline: 2px solid var(--kl-blue); border-color: var(--kl-blue); }

.kl-alert {
    background: #fee2e2; color: #991b1b; border: 1px solid #fca5a5;
    border-radius: 10px; padding: 12px; margin-top: 8px; font-size: .92rem;
}
.kl-ok {
    background: #dcfce7; color: #166534; border: 1px solid #86efac;
    border-radius: 10px; padding: 14px; margin-top: 14px; word-break: break-all;
}

/* ---- Login ---- */
/* Colonna: marchio sul gradiente, poi la card. Il centraggio verticale resta, ora vale per
   l'insieme dei due. */
.kl-login-shell {
    min-height: 100dvh; display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: 26px;
    background: linear-gradient(160deg, var(--kl-blue), var(--kl-blue-dark)); padding: 20px;
}
/* Il marchio e' l'elemento piu' grande della schermata (56px contro i 34px della top bar):
   qui e' il protagonista, non un segnaposto di navigazione. */
.kl-login-brand { display: block; height: 56px; width: auto; }
.kl-login-card {
    background: #fff; border-radius: 20px; padding: 28px 22px;
    width: 100%; max-width: 380px; box-shadow: 0 12px 40px rgba(0,0,0,.25);
}
/* La scritta "KiLuggage" nella card non c'e' piu' (sarebbe il marchio due volte): "Area
   Operatore" e' la prima riga, quindi niente margine sopra che si somma al padding della card. */
.kl-login-sub { text-align: center; color: var(--kl-muted); margin: 0 0 22px; }

/* ---- Scanner ---- */
.kl-scanner { max-width: 560px; margin: 0 auto; }
.kl-frame {
    background: #000; border-radius: var(--kl-radius); overflow: hidden;
    aspect-ratio: 4/3; display: flex; align-items: center; justify-content: center; margin-top: 8px;
}
.kl-frame video { width: 100%; height: 100%; object-fit: cover; }

/* ---- Splash auth ---- */
.kl-splash { padding: 40px; text-align: center; color: var(--kl-muted); }

/* ---- Badge tipo operazione in top bar (US-031) ---- */
/* justify-self: end -> il blocco utente/azioni aderisce al bordo destro della griglia top bar */
.kl-topbar-right { justify-self: end; display: flex; align-items: center; gap: 10px; }
.kl-optype {
    font-weight: 700; font-size: .78rem; padding: 5px 11px; border-radius: 999px;
    text-transform: uppercase; letter-spacing: .03em; white-space: nowrap;
    background: var(--kl-yellow); color: var(--kl-blue-dark);
}
.kl-optype--ritiro { background: #fff; color: var(--kl-blue); }

/* ---- Card dettaglio prenotazione (US-033) ---- */
.kl-card {
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 6px 16px; margin-bottom: 16px;
}
.kl-row {
    display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
    padding: 11px 0; border-bottom: 1px solid #eef1f6;
}
.kl-row:last-child { border-bottom: 0; }
.kl-row span { color: var(--kl-muted); font-size: .9rem; }
.kl-row b { text-align: right; word-break: break-word; }

/* Avviso ambra: stato "gia' fatto" / non-bloccante, distinto dall'errore rosso (kl-alert). */
.kl-warn {
    background: #fef3c7; color: #92400e; border: 1px solid #fde68a;
    border-radius: 10px; padding: 14px; margin-top: 14px; font-size: .92rem;
}

/* ---- Dashboard ---- */
.kl-h2 { font-size: 1.2rem; margin: 24px 0 10px; font-weight: 700; }
/* Su telefono la scala si comprime tutta insieme, non solo l'h1: 18.4 titolo pagina, 16.8
   sezione, 16 titolo card. Ritoccando solo l'h1, la sezione sarebbe diventata piu' grande del
   titolo che la contiene. */
@media (max-width: 560px) { .kl-h2 { font-size: 1.05rem; } }
.kl-section-header { display: flex; align-items: baseline; justify-content: space-between; }
.kl-empty { color: var(--kl-muted); margin-top: 8px; font-size: .95rem; }

/* Stat cards colorate (modello mockup) */
.kl-stat--blue   { background: #eff6ff; border-color: #93c5fd; color: #1e3a8a; }
.kl-stat--yellow { background: #fefce8; border-color: #fde047; color: #713f12; }
.kl-stat--red    { background: #fef2f2; border-color: #fca5a5; color: #7f1d1d; }
.kl-stat--green  { background: #f0fdf4; border-color: #86efac; color: #14532d; }
.kl-stat--blue b, .kl-stat--yellow b, .kl-stat--red b, .kl-stat--green b { color: inherit; }

/* Action cards (Azioni Principali): 1 colonna su telefono, 2+3 da desktop */
.kl-ac-list { display: grid; grid-template-columns: 1fr; gap: 12px; margin-bottom: 8px; }
/* Da 768px le due azioni di banco (Nuovo Deposito, Ritiro) stanno a meta' riga ciascuna e le
   altre tre a un terzo nella riga sotto. Griglia a 6 colonne perche' e' il minimo comune
   multiplo di 2 e 3: due righe di larghezze diverse senza sdoppiare il contenitore.
   L'ordine delle card conta: le prime due sono le azioni di banco. */
@media (min-width: 768px) {
    .kl-ac-list { grid-template-columns: repeat(6, 1fr); }
    .kl-ac-list > :nth-child(-n+2) { grid-column: span 3; }
    .kl-ac-list > :nth-child(n+3)  { grid-column: span 2; }
}
.kl-ac {
    display: flex; align-items: center; gap: 16px; text-decoration: none;
    border-radius: var(--kl-radius); padding: 20px 22px;
    box-shadow: 0 2px 8px rgba(0,0,0,.07); min-height: 88px;
    transition: transform .1s, box-shadow .1s;
}
.kl-ac:active { transform: scale(.99); }
.kl-ac--primary   { background: var(--kl-blue); color: #fff; }
.kl-ac--yellow    { background: var(--kl-yellow); color: var(--kl-text); }
.kl-ac--secondary { background: #fff; color: var(--kl-text); border: 2px solid #e3e7ee; }
.kl-ac-ico   { font-size: 2rem; flex-shrink: 0; line-height: 1; }
.kl-ac-title { font-weight: 700; font-size: 1.1rem; }
.kl-ac-desc  { font-size: .85rem; opacity: .8; margin-top: 2px; }

/* Quick access: card orizzontali (icona + label) come da mockup; 1 colonna stretta, 2 da 480px */
.kl-quickaccess { display: grid; grid-template-columns: 1fr; gap: 10px; margin-bottom: 8px; }
@media (min-width: 480px) { .kl-quickaccess { grid-template-columns: 1fr 1fr; } }
.kl-ac--compact { flex-direction: row; align-items: center; gap: 12px; min-height: 64px; padding: 16px 18px; }
.kl-ac--compact .kl-ac-ico   { font-size: 1.5rem; }
.kl-ac--compact .kl-ac-title { font-size: .95rem; }

/* ---- Hover delle superfici cliccabili (Dashboard) ---- */
/* bootstrap.min.css dichiara `a:hover{color:#0a58ca}` e app.css `a{color:#0071c1}`: specificita'
   0,1,1 che batte le nostre varianti a classe singola, percio' al passaggio del mouse il testo
   delle card virava al blu, bianco-su-blu e nero-su-giallo compresi. Qui il colore e' ridichiarato
   su un selettore piu' specifico (elemento + classe + stato, 0,2,1 contro 0,1,1), non
   affidandosi all'ordine di caricamento dei fogli. */
a.kl-ac--primary,   a.kl-ac--primary:hover   { color: #fff; }
a.kl-ac--yellow,    a.kl-ac--yellow:hover    { color: var(--kl-text); }
a.kl-ac--secondary, a.kl-ac--secondary:hover { color: var(--kl-text); }
a.kl-stat--blue:hover   { color: #1e3a8a; }
a.kl-stat--yellow:hover { color: #713f12; }
a.kl-stat--green:hover  { color: #14532d; }
a.kl-stat--red:hover    { color: #7f1d1d; }
a.kl-listitem:hover     { color: var(--kl-text); }
/* Stessa storia per i link vestiti da bottone, chip o card: il colore lo dice la classe, e il
   fatto di essere un <a> non deve cambiarlo al passaggio del mouse. Le coppie base/variante
   stanno in quest'ordine di proposito: pari specificita', vince l'ultima scritta. */
a.kl-btn-primary:hover      { color: #fff; }
a.kl-btn-outline:hover      { color: var(--kl-text); }
a.kl-btn:hover              { color: var(--kl-text); }
a.kl-btn-yellow:hover       { color: var(--kl-text); }
a.kl-action:hover           { color: var(--kl-text); }
a.kl-action--primary:hover  { color: #fff; }
a.kl-choice:hover           { color: var(--kl-text); }
a.kl-choice--deposito:hover { color: #fff; }
a.kl-board-contact:hover    { color: #0369a1; }

/* Il feedback e' un ingrandimento minimo, non un cambio di colore. Solo dove c'e' un puntatore
   vero: col dito il tap lascerebbe la card ingrandita fino al tocco successivo. La tessera
   Anomalie non e' un <a> e resta fuori, com'e' giusto: non porta da nessuna parte. */
a.kl-stat, a.kl-listitem { transition: transform .1s; }

/* Colonna azioni agganciata a destra SEMPRE, senza piu' soglia di larghezza. Prima era dentro una
   @media (max-width:1150px), stima fatta quando il codice pratica andava a capo su desktop. Ora il
   codice sta su una riga sola (richiesta utente) e la tabella e' misurata a 1334px, mentre il
   contenitore ne offre 1106 (`.kl-content` e' tappato a max-width:1140px): eccede di 228px a
   QUALUNQUE larghezza, verificato fino a 1440px di viewport. Con la soglia, sopra i 1150px la
   cella tornava `static` e il pulsante di riga scorreva via proprio dove la tabella scorre.
   Se un domani la tabella tornasse a starci dentro, questa regola lascerebbe l'ombra visibile
   senza niente dietro: e' l'unico caso in cui va rimessa una condizione. */
.kl-table--orders th:last-child, .kl-table--orders td:last-child {
    position: sticky; right: 0; background: #fff;
    /* L'ombra a sinistra dice che dietro c'e' altro contenuto che scorre. */
    box-shadow: -8px 0 8px -8px rgba(15,23,42,.30);
}
.kl-table--orders thead th:last-child { background: #f8fafc; z-index: 3; }
.kl-table--orders tbody td:last-child { z-index: 2; }
@media (hover: hover) {
    .kl-ac:hover { transform: scale(1.015); box-shadow: 0 4px 14px rgba(0,0,0,.10); }
    a.kl-stat:hover, a.kl-listitem:hover { transform: scale(1.015); }
}

/* ---- Lista ordini (Dashboard / Search) ---- */
.kl-list { display: flex; flex-direction: column; gap: 8px; }
.kl-listitem {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 14px 16px; text-decoration: none; color: var(--kl-text);
}
.kl-listitem:active { transform: scale(.99); }
.kl-listitem-main { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.kl-listitem-title { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.kl-listitem-meta { font-size: .82rem; color: var(--kl-muted); }
.kl-listitem-aside { flex-shrink: 0; }

/* ---- Status chip ---- */
.kl-chip {
    font-size: .78rem; font-weight: 700; padding: 4px 10px; border-radius: 999px;
    white-space: nowrap; text-transform: uppercase; letter-spacing: .02em;
}
.kl-chip--in { background: #dcfce7; color: #166534; }
.kl-chip--out { background: #e0f2fe; color: #0369a1; }
.kl-chip--pending { background: #fef3c7; color: #92400e; }

/* ---- Anomalie (pagina; dati demo in attesa endpoint BE) ---- */
/* Card form "Nuova Segnalazione" (mockup) */
.kl-formcard {
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 18px 18px 20px; margin-top: 16px; box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
.kl-form-title { font-weight: 800; font-size: 1.05rem; margin-bottom: 14px; }
@media (max-width: 560px) { .kl-form-title { font-size: 1rem; } }
/* Riga Annulla | Salva: affiancati, stessa larghezza */
.kl-formrow { display: flex; gap: 12px; }
/* `min-width: 0` e' il paracadute: senza, il minimo automatico di un elemento (per un <select> e'
   la sua opzione piu' lunga) impedisce di restringersi e spinge i fratelli fuori dallo schermo,
   invece di far stringere tutti. */
.kl-formrow > * { flex: 1; min-width: 0; }
/* Riga di campi con etichetta (non di bottoni): allineata in basso, cosi' un bottone senza
   etichetta sta sulla linea degli input e non su quella delle label. */
.kl-formrow--fields { align-items: flex-end; }
@media (max-width: 560px) {
    /* Su telefono diventa una colonna. Restringere non basta: tre campi in 305px lasciavano al
       <select> del servizio 140px, cioe' un nome di servizio illeggibile. */
    .kl-formrow--fields { flex-direction: column; align-items: stretch; }
}
@media (max-width: 560px) {
    /* Coppie di pulsanti (step del check-in, Scanner, data entry manuale): su telefono uno sotto
       l'altro, col pulsante d'azione in cima (richiesta utente). L'`order` sposta solo la resa:
       nel markup l'azione resta dov'era, perche' su desktop la riga affiancata non cambia.
       Sale il blu e sale il giallo, perche' nello Scanner l'azione e' gialla (Avvia Scansione, e
       il Conferma del data entry in modalita' Ritiro); in una riga che avesse sia blu sia giallo
       fra i due resterebbe l'ordine del markup. Dove non c'e' nessuno dei due (Assegna Slot /
       Fuori posizione) la regola e' inerte e vale l'ordine del markup.
       NOTA: su telefono l'ordine di tabulazione resta quello del markup, quindi da tastiera si
       raggiunge prima il pulsante in basso. Per un solo Tab di differenza ho preferito non
       riordinare il markup, che avrebbe girato anche il desktop.
       I margini dei pulsanti si azzerano e lo stacco lo da' il `gap` della riga: sommati
       facevano 28px fra i due. */
    .kl-formrow--stack-sm { flex-direction: column; margin-top: 16px; }
    .kl-formrow--stack-sm > * { margin-top: 0; }
    .kl-formrow--stack-sm .kl-btn-primary,
    .kl-formrow--stack-sm .kl-btn-yellow  { order: -1; }
}

/* Barra filtri a chip dentro una card bianca (mockup) */
.kl-filterbar {
    display: flex; flex-wrap: wrap; gap: 8px;
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 12px; margin: 16px 0;
}
.kl-fchip {
    border: 1px solid #e3e7ee; background: #f4f6fa; color: var(--kl-text);
    border-radius: 10px; padding: 8px 14px; font-size: .9rem; font-weight: 600; cursor: pointer;
}
.kl-fchip--active { background: var(--kl-blue); border-color: var(--kl-blue); color: #fff; }

/* Pill di stato sature (Aperta/In Corso/Risolta), distinte dai kl-chip pastello */
.kl-pill {
    font-size: .8rem; font-weight: 700; padding: 7px 16px; border-radius: 999px;
    white-space: nowrap; color: #fff;
}
.kl-pill--open     { background: #ef4444; }
.kl-pill--progress { background: var(--kl-yellow); color: var(--kl-text); }
.kl-pill--done     { background: #22c55e; }
/* Aggiunta per il badge di provenienza (Online): mancava il tono "info" fra le pill. */
.kl-pill--info     { background: var(--kl-blue); }
/* Pill dentro una riga di dettaglio (badge Provenienza): `.kl-row span` vince per specificita' su
   .kl-pill e colorerebbe di grigio muto il testo anche sui fondi saturi, oltre a rimpicciolirlo.
   Qui si ripristinano i due valori della pill, tenendo il testo scuro dove il fondo e' giallo. */
.kl-row .kl-pill            { color: #fff; font-size: .8rem; }
.kl-row .kl-pill--progress  { color: var(--kl-text); }

/* Card anomalia */
.kl-anomlist { display: flex; flex-direction: column; gap: 14px; margin-top: 16px; }
.kl-anom {
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 16px 18px; box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
.kl-anom-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; }
.kl-anom-title { display: flex; align-items: flex-start; gap: 10px; }
.kl-anom-ico { font-size: 1.4rem; line-height: 1.2; }
/* L'icona del tipo anomalia e del tipo evento e' un elemento grafico, non un segno in riga:
   misura in px come le altre icone grandi (vedi il blocco Icone SVG). */
.kl-anom-ico .kl-ico { width: 22px; height: 22px; display: block; }
.kl-tlico .kl-ico { width: 22px; height: 22px; }
.kl-anom-type { font-weight: 800; }
.kl-anom-id { font-size: .82rem; }
.kl-anom-ref { margin-top: 10px; font-size: .9rem; }
.kl-anom-ref code { font-family: ui-monospace, Consolas, monospace; font-weight: 600; color: var(--kl-text); }
.kl-anom-desc {
    background: #f8fafc; border-radius: 10px; padding: 12px 14px;
    margin-top: 10px; font-size: .92rem;
}
.kl-anom-action { margin-top: 10px; font-size: .9rem; }
.kl-anom-action > span { color: var(--kl-blue); font-weight: 700; }
.kl-anom-action > div { margin-top: 2px; }
.kl-anom-foot {
    display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
    border-top: 1px solid #eef1f6; margin-top: 12px; padding-top: 10px;
    color: var(--kl-muted); font-size: .82rem;
}

/* ---- Pagamenti Extra (pagina; dati demo in attesa endpoint BE) ---- */
/* Variante stat con label+importo allineati a sinistra (mockup) */
.kl-paystat { text-align: left; display: flex; flex-direction: column; gap: 10px; }
.kl-paystat-label { display: flex; align-items: center; gap: 8px; font-size: .9rem; font-weight: 600; }
.kl-paystat-amount { font-size: 1.5rem; font-weight: 800; color: var(--kl-blue); }
.kl-stat--blue .kl-paystat-amount,
.kl-stat--green .kl-paystat-amount { color: inherit; }

/* Filtro periodo: label sopra, chip sotto, range date opzionale */
.kl-filterbar-label { width: 100%; font-size: .9rem; font-weight: 600; }
.kl-filterbar-chips { display: flex; flex-wrap: wrap; gap: 8px; width: 100%; }
.kl-filterbar-range { width: 100%; margin-top: 4px; }
.kl-filterbar-range .kl-field { margin-bottom: 0; }

/* Card transazione */
.kl-paylist { display: flex; flex-direction: column; gap: 14px; }
.kl-pay {
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 16px 18px; box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
.kl-pay-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-bottom: 4px; }
.kl-pay-amount { color: var(--kl-blue); font-weight: 800; font-size: 1.2rem; }
.kl-pay-code { font-family: ui-monospace, Consolas, monospace; font-size: .85rem; color: var(--kl-muted); margin-top: 2px; }
.kl-pay-foot {
    display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
    border-top: 1px solid #eef1f6; margin-top: 12px; padding-top: 10px;
    color: var(--kl-muted); font-size: .82rem;
}

/* ---- Storico (pagina; dati demo in attesa endpoint BE) ---- */
/* Footer card condiviso (operatore | data). NOTA: kl-anom-foot e kl-pay-foot sono lo stesso
   pattern; alla prossima occasione vanno unificati su questa classe. */
.kl-cardfoot {
    display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
    border-top: 1px solid #eef1f6; margin-top: 12px; padding-top: 10px;
    color: var(--kl-muted); font-size: .82rem;
}

/* Timeline verticale: icona tonda a sinistra, linea di collegamento, card a destra */
.kl-timeline { display: flex; flex-direction: column; gap: 18px; }
.kl-tlitem { display: grid; grid-template-columns: 60px 1fr; align-items: start; position: relative; }
.kl-tlitem::before {
    content: ""; position: absolute; left: 29px; top: 52px; bottom: -18px;
    width: 2px; background: #dbe1ec;
}
.kl-tlitem:last-child::before { display: none; }
.kl-tlico-wrap { display: flex; justify-content: flex-start; }
.kl-tlico {
    width: 48px; height: 48px; border-radius: 50%;
    background: #fff; box-shadow: 0 2px 8px rgba(0,0,0,.10);
    display: flex; align-items: center; justify-content: center;
    font-size: 1.3rem; position: relative; z-index: 1;
}
.kl-tlcard {
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 16px 18px; box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
.kl-tlhead { display: flex; align-items: center; gap: 10px; font-size: .85rem; }
.kl-tltitle { font-weight: 800; margin-top: 8px; }
.kl-tlrow { display: flex; align-items: baseline; gap: 8px; font-size: .9rem; margin-top: 8px; flex-wrap: wrap; }
.kl-tlrow code { font-family: ui-monospace, Consolas, monospace; font-weight: 600; color: var(--kl-text); }

/* Chip tipo evento (pastello, coerenti coi colori di dominio) */
.kl-evt {
    font-size: .78rem; font-weight: 700; padding: 4px 10px; border-radius: 8px; white-space: nowrap;
}
.kl-evt--deposito  { background: #dbeafe; color: #1e40af; }
.kl-evt--ritiro    { background: #dcfce7; color: #166534; }
.kl-evt--anomalia  { background: #fee2e2; color: #991b1b; }
.kl-evt--pagamento { background: #f3e8ff; color: #7e22ce; }

/* ---- Inventario / Fine Turno (pagina; dati demo in attesa endpoint BE) ---- */
/* Riepilogo giornata: 3 numeri colorati centrati dentro una card */
.kl-invstats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; text-align: center; }
.kl-invstat b { display: block; font-size: 1.6rem; }
.kl-invstat span { color: var(--kl-muted); font-size: .85rem; }
.kl-invstat--blue b   { color: var(--kl-blue); }
.kl-invstat--green b  { color: #16a34a; }
.kl-invstat--orange b { color: #d97706; }

/* Barra avanzamento verifica */
.kl-progress {
    height: 10px; border-radius: 999px; background: #e5e7eb;
    overflow: hidden; margin-top: 12px;
}
.kl-progress-fill { height: 100%; background: var(--kl-blue); border-radius: 999px; transition: width .2s; }

/* Variante della sola barra "Capacita' occupata" in Dashboard (richiesta utente): il trolley fa
   da punta e all'ingresso in pagina la barra si riempie da zero fino al valore vero.
   E' una VARIANTE e non la regola generale perche' .kl-progress serve anche ai passi dei wizard
   (Deposito, Scanner) e all'inventario: la' la barra dice "passo 3 di 8", e riempirsi da sola
   all'ingresso racconterebbe un avanzamento che non e' avvenuto. */
.kl-progress--capacity { overflow: visible; }   /* il disco del trolley sporge dalla pista alta 10px */
.kl-progress--capacity .kl-progress-fill {
    position: relative;                          /* riferimento per la punta */
    animation: kl-capacity-fill .9s cubic-bezier(.22,.61,.36,1) both;
}
/* Un solo fotogramma, "from": il punto d'arrivo e' la width in linea, cioe' la percentuale vera.
   Cosi' il valore non e' scritto due volte e l'animazione non puo' sballare rispetto al dato. */
@keyframes kl-capacity-fill { from { width: 0; } }
/* Il trolley e' centrato sul bordo della parte piena, come il pomello di un cursore: alle due
   estremita' sporge di mezzo disco, ed e' voluto (a fondo corsa dice "sono arrivato in fondo").
   Il disco bianco serve perche' l'icona deve restare leggibile sia sul blu pieno sia sul grigio
   della pista, e a percentuali basse si trova a cavallo dei due. */
.kl-progress-tip {
    position: absolute; right: 0; top: 50%; transform: translate(50%, -50%);
    display: inline-flex; align-items: center; justify-content: center;
    width: 24px; height: 24px; border-radius: 999px;
    background: #fff; border: 1px solid #d8dee9; box-shadow: 0 1px 4px rgba(15,23,42,.25);
    color: var(--kl-blue);
}
.kl-progress-tip .kl-ico { width: 16px; height: 16px; }
/* Chi ha chiesto al sistema meno animazioni trova la barra gia' piena, senza la corsa. */
@media (prefers-reduced-motion: reduce) {
    .kl-progress--capacity .kl-progress-fill { animation: none; }
}

/* Card bagaglio in giacenza; variante verificata con bordo verde e spunta */
.kl-invlist { display: flex; flex-direction: column; gap: 14px; }
.kl-inv {
    position: relative; background: #fff; border: 1px solid #e3e7ee;
    border-radius: var(--kl-radius); padding: 16px 18px; box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
.kl-inv--verified { border-color: #22c55e; }
.kl-inv-check {
    position: absolute; top: 14px; right: 14px;
    width: 28px; height: 28px; border-radius: 50%;
    background: #22c55e; color: #fff; font-size: .85rem;
    display: flex; align-items: center; justify-content: center;
}
.kl-inv-name { font-weight: 800; }
.kl-inv-code { font-family: ui-monospace, Consolas, monospace; font-size: .85rem; color: var(--kl-muted); margin-top: 2px; }
.kl-inv-meta { display: flex; gap: 18px; flex-wrap: wrap; font-size: .9rem; margin-top: 10px; }
.kl-inv-meta code { font-family: ui-monospace, Consolas, monospace; color: var(--kl-muted); }
.kl-inv-verified {
    margin-top: 14px; padding: 12px; text-align: center;
    background: #f0fdf4; border: 1px solid #86efac; border-radius: 10px;
    color: #16a34a; font-weight: 700;
}
.kl-inv-question { text-align: center; font-weight: 600; margin: 6px 0 2px; }

/* ---- Wizard Nuovo Deposito (8 step; step 3..7 demo in attesa BE) ---- */
/* Banner informativo azzurro (mockup) */
.kl-info {
    background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 10px;
    padding: 12px 14px; margin: 16px 0; color: #1e40af; font-size: .92rem;
}

/* Testata step: "Step X di 8" + nome step + barra avanzamento */
.kl-step-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; }
.kl-step-label { color: var(--kl-blue); font-weight: 800; font-size: .9rem; }
.kl-step-name { font-weight: 600; font-size: .9rem; }
.kl-step-badge { display: flex; justify-content: center; margin: 18px 0 2px; }
/* Stato della pratica a piena larghezza a ogni misura (richiesta utente): e' la prima cosa che
   l'operatore legge aprendo la schermata. Raggio 10px come i banner kl-warn/kl-info che gli
   stanno subito sotto, non i 999px della pastiglia, che larghi sembrerebbero una capsula.
   Il modificatore e' solo sul Ritiro: nel wizard Deposito ("Prenotazione Valida") la struttura
   e' la stessa ma non e' stata toccata. */
.kl-step-badge--wide .kl-pill {
    width: 100%; text-align: center;
    padding: 11px 16px; border-radius: 10px; font-size: .9rem;
}

/* Bottone rosso (Prenotazione Non Valida) — nel gruppo di reset bottoni qui sopra */
.kl-btn-red { background: #ef4444; color: #fff; }
.kl-btn-red:disabled { opacity: .6; }

/* Area foto documento/bagaglio: placeholder grigio, variante acquisita */
.kl-photo {
    min-height: 220px; border-radius: 12px; background: #f3f4f6; padding: 12px;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 8px; color: var(--kl-muted); font-size: .9rem;
}
/* Anteprima dello scatto dentro il box: `contain` per non tagliare il documento, che va letto,
   e non `cover`. Il tetto in altezza tiene l'immagine dentro i 220px del box insieme alla
   riga "Foto acquisita" sotto. */
.kl-photo-preview { max-width: 100%; max-height: 168px; border-radius: 8px; object-fit: contain; display: block; }
.kl-photo-ico { font-size: 2rem; }

/* Contatore bagagli reali: - n + */
.kl-counter { display: flex; align-items: center; justify-content: center; gap: 22px; }
.kl-counter-btn {
    width: 48px; height: 48px; border-radius: 50%; border: 0; cursor: pointer;
    font-size: 1.4rem; line-height: 1; display: flex; align-items: center; justify-content: center;
}
.kl-counter-btn--minus { background: #e5e7eb; color: var(--kl-text); }
.kl-counter-btn--plus  { background: var(--kl-blue); color: #fff; }
.kl-counter-value { font-size: 1.8rem; font-weight: 800; color: var(--kl-blue); min-width: 40px; text-align: center; }

/* Etichette di sezione dentro le card bagaglio */
.kl-bag-label { font-size: .85rem; font-weight: 600; color: var(--kl-muted); margin: 14px 0 8px; }
.kl-bag-caption { font-size: .78rem; text-align: center; margin: 6px 0 0; }

/* Modal posizione manuale */
.kl-modal-backdrop {
    position: fixed; inset: 0; background: rgba(15,23,42,.55); z-index: 50;
    display: flex; align-items: center; justify-content: center; padding: 16px;
}
.kl-modal {
    background: #fff; border-radius: var(--kl-radius); padding: 18px;
    width: 100%; max-width: 440px; max-height: 90dvh; overflow-y: auto;
    box-shadow: 0 12px 40px rgba(0,0,0,.25);
}
.kl-modal-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
.kl-modal-x { border: 0; background: none; font-size: 1.4rem; cursor: pointer; color: var(--kl-muted); }

/* Box suggerimenti azzurro con elenco */
.kl-hint {
    background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 10px;
    padding: 12px 14px; margin: 10px 0 4px; color: #1e40af; font-size: .85rem;
}
.kl-hint ul { margin: 8px 0 0; padding-left: 18px; }
.kl-hint li { margin-top: 4px; }

/* Card etichetta QR per bagaglio */
.kl-labelcard {
    display: flex; gap: 16px; align-items: flex-start;
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 16px 18px; margin-top: 14px; box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
/* Cella QR: il box col QR reale + didascalia "Collo N/M" sotto */
.kl-qrcell { flex: 0 0 84px; display: flex; flex-direction: column; align-items: center; gap: 4px; }
.kl-qrcaption { font-size: .72rem; font-weight: 700; color: var(--kl-muted); }
.kl-qrbox {
    width: 84px; height: 84px; border: 3px solid var(--kl-text); border-radius: 6px;
    display: flex; align-items: center; justify-content: center; overflow: hidden; background: #fff;
}
/* il QR e' un <canvas> generato da js/qrGen.js, dimensionato a 84x84 */
.kl-qrbox canvas, .kl-qrbox img { width: 84px; height: 84px; display: block; }
.kl-labelinfo { font-size: .88rem; display: flex; flex-direction: column; gap: 4px; }
.kl-labelinfo-title { font-weight: 800; font-size: 1rem; }
.kl-labelinfo span { color: var(--kl-muted); }
.kl-labelinfo code { font-family: ui-monospace, Consolas, monospace; }

/* Hero verde di completamento */
.kl-hero-ok {
    background: #16c04b; color: #fff; border-radius: var(--kl-radius);
    padding: 28px 18px; text-align: center; margin-top: 4px;
}
.kl-hero-ok-ico {
    display: inline-flex; align-items: center; justify-content: center;
    width: 56px; height: 56px; border-radius: 50%; border: 3px solid #fff;
    font-size: 1.6rem; margin-bottom: 10px;
}
.kl-hero-ok-title { font-size: 1.3rem; font-weight: 800; margin-bottom: 4px; }

/* Riga ricevuta digitale */
.kl-receipt {
    display: flex; justify-content: space-between; align-items: center; gap: 12px;
    background: #f8fafc; border-radius: 10px; padding: 12px 14px;
}
.kl-receipt-check {
    width: 28px; height: 28px; flex: 0 0 28px; border-radius: 50%;
    border: 2px solid #16a34a; color: #16a34a; font-weight: 700;
    display: flex; align-items: center; justify-content: center;
}

/* ---- Wizard Ritiro (6 step; giacenza/pagamento/verifiche demo in attesa BE) ---- */
/* Dettaglio pratica su desktop: cliente a sinistra, bagagli a destra (richiesta utente).
   `align-items: start` perche' le due colonne hanno altezze diverse e la piu' corta non deve
   stirarsi. Sotto i 768px torna una colonna sola, nell'ordine del markup. */
.kl-twocol { display: grid; grid-template-columns: 1fr; column-gap: 20px; }
@media (min-width: 768px) { .kl-twocol { grid-template-columns: 1fr 1fr; align-items: start; } }
/* Card pastello gialla (Dettaglio Importo / Pagamento Extra) */
.kl-formcard--warn { background: #fffbeb; border-color: #fde68a; }
.kl-amount-red { color: #dc2626; font-size: 1.05rem; }

/* Box bianco dentro un banner kl-warn (date deposito/previsto/effettivo) */
.kl-warn-box {
    background: #fff; border: 1px solid #fde68a; border-radius: 8px;
    padding: 10px 12px; margin-top: 10px; display: inline-block; font-size: .85rem;
}
.kl-warn-box span { color: var(--kl-muted); }

/* Chip posizione magazzino */
.kl-poschip {
    display: inline-block; background: var(--kl-blue); color: #fff;
    border-radius: 6px; padding: 3px 8px; font-size: .78rem; font-weight: 700;
    margin-left: 6px;
}
.kl-poschip--light { background: #eff6ff; color: var(--kl-blue); margin-left: 0; padding: 6px 10px; }

/* Conteggio bagagli del dettaglio pratica: un numero grande e basta, le posizioni le mostrano
   le righe di dettaglio qui sotto. Le icone SVG prendono il colore da `color`, essendo a
   currentColor. */
.kl-bagcount { display: flex; align-items: center; justify-content: center; gap: 12px; padding: 4px 0 2px; }
.kl-bagcount .kl-ico { width: 26px; height: 26px; color: var(--kl-blue); }
.kl-bagcount b { font-size: 2.2rem; font-weight: 800; line-height: 1; color: var(--kl-blue); }
.kl-bagcount span { color: var(--kl-muted); font-size: .95rem; }

/* Riga bagaglio compatta (dettaglio pratica) */
.kl-bagrow {
    display: flex; justify-content: space-between; align-items: center; gap: 12px;
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 14px 18px; margin-top: 12px; box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
.kl-bagrow-title { font-weight: 800; }
@media (max-width: 560px) {
    /* Su telefono la posizione va sotto il codice (richiesta utente): affiancata, con un codice
       lungo come il GUID della pratica e posizioni tipo "Fuori standard - ...", il chip finiva
       spezzato su due righe. */
    .kl-bagrow { flex-direction: column; align-items: flex-start; gap: 8px; }
}

/* Banner blu posizione magazzino (recupero) */
.kl-posbanner {
    background: var(--kl-blue); color: #fff; border-radius: 10px;
    padding: 12px 16px; margin-top: 12px; display: flex; flex-direction: column; gap: 2px;
}
.kl-posbanner-label { font-size: .82rem; opacity: .9; }
.kl-posbanner-code { font-size: 1.4rem; font-weight: 800; }

/* Opzioni metodo pagamento (radio card) */
.kl-payopt {
    display: flex; align-items: center; gap: 10px;
    border: 1px solid #e3e7ee; border-radius: 10px; padding: 14px 16px;
    margin-top: 10px; font-weight: 600; cursor: pointer;
}
.kl-payopt--active { border-color: var(--kl-blue); outline: 2px solid var(--kl-blue); }
.kl-payopt input { accent-color: var(--kl-blue); }

/* Checklist verde (stato sistema aggiornato) */
.kl-checklist { display: flex; flex-direction: column; gap: 8px; }
.kl-checklist > div { color: #16a34a; font-weight: 600; font-size: .92rem; }

/* ---- Scelta operazione in Home (US-031) ---- */
.kl-choices { display: flex; flex-direction: column; gap: 16px; margin-top: 8px; }
.kl-choice {
    display: flex; flex-direction: column; align-items: flex-start; justify-content: center;
    text-decoration: none; background: #fff; color: var(--kl-text);
    border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    padding: 26px 22px; min-height: 120px;
}
.kl-choice:active { transform: scale(.99); }
.kl-choice--deposito { background: var(--kl-blue); color: #fff; border-color: var(--kl-blue); }
.kl-choice-ico { font-size: 2rem; line-height: 1; margin-bottom: 8px; }
.kl-choice-label { font-size: 1.45rem; font-weight: 800; }
.kl-choice-sub { font-size: .9rem; opacity: .85; margin-top: 2px; }
.kl-choice--ritiro .kl-choice-sub { color: var(--kl-muted); opacity: 1; }

/* ---- Elenchi drill-down della Dashboard (#17202) ---- */
/* Tessera KPI cliccabile: il colore del testo lo porta gia' la variante .kl-stat--*, qui basta
   togliere la sottolineatura del link. */
a.kl-stat { text-decoration: none; }
a.kl-stat:active { transform: scale(.99); }
/* Tessera senza elenco dietro (Anomalie): deve leggersi come non attiva, non come "zero da vedere". */
.kl-stat--disabled { opacity: .5; }

/* Riga elenco: corpo cliccabile a sinistra, chip di stato incolonnati a destra */
.kl-listitem-link { text-decoration: none; color: inherit; }
.kl-board-row { align-items: flex-start; }
.kl-board-row .kl-listitem-main { flex: 1; }
.kl-board-aside { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }

/* Banda di gravita' della giacenza sul bordo sinistro della riga */
.kl-board-row--attenzione { border-left: 5px solid var(--kl-yellow); }
.kl-board-row--critica    { border-left: 5px solid #ef4444; }
.kl-board-row--abbandono  { border-left: 5px solid #7f1d1d; }
/* Fasce di permanenza (#17199): verde < 24h, giallo entro il ritiro previsto, rosso oltre. */
.kl-board-row--recente    { border-left: 5px solid #22c55e; }
.kl-board-row--prolungata { border-left: 5px solid var(--kl-yellow); }
.kl-board-row--sovratempo { border-left: 5px solid #ef4444; }
.kl-pill--severe { background: #7f1d1d; }

/* Riga dei ritiri: intestazione sopra, barra azioni (contatti + Effettua ritiro) sotto */
.kl-board-row--stack { flex-direction: column; align-items: stretch; }
.kl-board-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.kl-board-head .kl-listitem-main { flex: 1; }
.kl-board-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 12px; }
.kl-board-actions .kl-btn--auto { margin-top: 0; margin-left: auto; }
@media (max-width: 560px) {
    /* Su telefono le azioni riempiono la card e si impilano (richiesta utente): sono i tre
       bersagli da toccare col pollice - chiamare, scrivere, aprire il ritiro - e in fila
       restavano larghi 109 e 178px con il bottone mandato a capo. Piu' stacco dall'intestazione
       (18px invece di 12) perche' non sembrino attaccate al testo sopra. */
    .kl-board-actions { flex-direction: column; align-items: stretch; gap: 10px; margin-top: 18px; }
    .kl-board-actions .kl-btn--auto { width: 100%; margin-left: 0; }
    /* I recapiti diventano righe da toccare, non pastigliette: testo centrato e piu' respiro
       verticale, perche' a 27px di altezza erano un bersaglio scomodo col dito. */
    .kl-board-actions .kl-board-contact { text-align: center; padding: 11px 12px; }
}
/* Recapiti: chip, ma leggibili come tali (niente maiuscolo forzato) e troncati se lunghi */
.kl-board-contact {
    text-decoration: none; text-transform: none; letter-spacing: normal;
    max-width: 100%; overflow: hidden; text-overflow: ellipsis;
    background: #e0f2fe; color: #0369a1;
}

/* Countdown / ritardo del ritiro previsto */
.kl-due {
    font-size: .82rem; font-weight: 700; white-space: nowrap;
    padding: 4px 10px; border-radius: 999px;
}
.kl-due--ok   { background: #f4f6fa; color: var(--kl-muted); }
.kl-due--soon { background: #fef3c7; color: #92400e; }
.kl-due--late { background: #fee2e2; color: #991b1b; }
.kl-due--none { background: #f4f6fa; color: var(--kl-muted); }

/* Pie' di pagina degli elenchi: pratiche e colli sono due numeri diversi */
.kl-board-footer {
    display: flex; justify-content: space-between; gap: 12px;
    margin-top: 14px; padding: 12px 16px;
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    font-size: .9rem; font-weight: 600; color: var(--kl-muted);
}

/* ---- Quadratura di magazzino di fine turno (#17204) ---- */
/* Badge top bar: il giro di verifica non e' ne' deposito ne' ritiro, si legge come terzo stato. */
.kl-optype--quadratura { background: #e0f2fe; color: #0369a1; }
/* Riga gia' verificata: banda verde a sinistra, coerente con le bande di gravita' degli elenchi. */
.kl-board-row--found { border-left: 5px solid #22c55e; }


/* Conteggio sopra la tabella: era dentro una kl-section-header insieme al titolo "Risultati",
   tolto su richiesta. Da solo non serve la riga a due estremi, basta una riga di testo spento. */
/* Spinto a destra nella riga dei filtri: `margin-left: auto` invece di `justify-content` sul
   contenitore, cosi' il pulsante e i chip restano a sinistra e solo il conteggio va in fondo.
   Se la riga va a capo su schermi stretti, il conteggio si allinea a destra della sua riga. */
.kl-resultcount { color: var(--kl-muted); font-size: .82rem; margin-left: auto; text-align: right; }
/* ---- Barra filtri sopra la tabella (Cerca prenotazione) ---- */
.kl-filtertop { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 16px 0 10px; }
/* Il pulsante e' bianco su fondo pagina come le card: e' un comando, non l'azione principale
   della schermata, quindi non prende il blu. */
.kl-filterbtn {
    display: inline-flex; align-items: center; gap: 8px;
    background: #fff; color: var(--kl-text); border: 1px solid #e3e7ee; border-radius: 10px;
    padding: 10px 14px; font-size: .9rem; font-weight: 700; cursor: pointer; white-space: nowrap;
}
.kl-filterbtn .kl-ico { width: 16px; height: 16px; color: var(--kl-blue); }
.kl-activefilters { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
/* Riassunto di cio' che e' attivo: pastiglia azzurra, stessa famiglia dei chip di stato ma piu'
   sobria, perche' e' un'etichetta e non un comando. */
.kl-afchip {
    display: inline-flex; align-items: center; gap: 6px;
    background: #eff6ff; color: var(--kl-blue); border: 1px solid #bfdbfe;
    border-radius: 999px; padding: 5px 12px; font-size: .82rem; font-weight: 700;
}
/* Il testo cercato puo' essere lungo: si tronca invece di spingere il resto a capo. */
.kl-afchip--q { max-width: 60vw; overflow: hidden; }
/* La X e' un bersaglio da dito, non un carattere appiccicato al testo: cerchietto di 20px con
   sfondo al passaggio del mouse, cosi' si capisce che e' un comando. */
.kl-afchip-x {
    border: 0; background: none; padding: 0; margin-right: -4px;
    width: 20px; height: 20px; flex-shrink: 0;
    display: inline-flex; align-items: center; justify-content: center;
    border-radius: 50%; color: inherit; font-size: 1.05rem; line-height: 1; cursor: pointer;
}
@media (hover: hover) {
    .kl-afchip-x:hover { background: rgba(0,71,187,.12); }
}
/* Una sola tabella a ogni larghezza (decisione utente): su telefono si scorre in orizzontale qui
   dentro, invece di cambiare rappresentazione fra desktop e mobile. Il contenitore e' l'unico
   punto del progetto dove lo scorrimento laterale e' voluto: ovunque altro e' un difetto. */
.kl-tablewrap {
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    background: #fff; border: 1px solid #e3e7ee; border-radius: var(--kl-radius);
    box-shadow: 0 2px 8px rgba(0,0,0,.05);
}
/* `separate` e non `collapse`: con collapse le celle in position:sticky perdono bordi e sfondo
   su piu' di un motore, e la colonna agganciata a destra si vedrebbe trasparente. I bordi sono
   gia' dichiarati per cella, quindi il risultato a schermo e' identico. */
.kl-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: .9rem; }
.kl-table th, .kl-table td { padding: 12px 14px; text-align: left; white-space: nowrap; }
/* Intestazione nella stessa lingua tipografica dei chip del progetto: maiuscoletto piccolo e
   spaziato, colore spento. Cosi' la riga di testa non compete con i dati. */
.kl-table thead th {
    border-bottom: 1px solid #e3e7ee; background: #f8fafc;
    font-size: .74rem; text-transform: uppercase; letter-spacing: .04em; color: var(--kl-muted);
}
.kl-table tbody tr + tr td { border-top: 1px solid #eef1f6; }
/* Regole legate al CONTENUTO della tabella pratiche, non alla tabella in generale: la prima
   colonna e' un nome, la seconda un GUID. Un'altra tabella con la stessa veste (per esempio la
   capacita' in Dashboard) non deve ereditarle. */
/* Il nome va a capo: senza questo un solo indirizzo email lungo allarga la colonna a dismisura
   e spinge fuori dallo schermo tutte le altre. */
.kl-table--orders td:first-child { white-space: normal; min-width: 160px; }
/* Il codice pratica e' un GUID e NON va a capo a nessuna larghezza (richiesta utente): su una
   riga sola si prende circa 290px, quindi la tabella non ci sta piu' nel contenitore e scorre
   in orizzontale anche da desktop, non solo su telefono. E' il prezzo scelto per averlo su una
   riga: e' un dato che l'operatore legge e detta al telefono, e a capo si legge male.
   Non si tronca: un GUID mozzato non e' dettabile. Il nowrap arriva da `.kl-table th, td`,
   qui non serve ridichiararlo. */
.kl-td--num  { text-align: right; font-variant-numeric: tabular-nums; }
.kl-td--date { color: var(--kl-muted); }
.kl-table-code { font-family: ui-monospace, Consolas, monospace; font-size: .82rem; color: var(--kl-muted); }
/* Azione di riga a sola icona: quadrato con angoli tondi, misura da dito. Nella cella non c'e'
   testo, quindi il bersaglio non puo' essere il solo disegno da 16px. */
.kl-iconbtn {
    display: inline-flex; align-items: center; justify-content: center;
    width: 36px; height: 36px; border-radius: 10px;
    border: 1px solid #e3e7ee; background: #fff; color: var(--kl-blue);
    text-decoration: none; cursor: pointer;
}
.kl-iconbtn .kl-ico { width: 17px; height: 17px; }
a.kl-iconbtn:hover { color: var(--kl-blue); }
@media (hover: hover) {
    .kl-iconbtn:hover { background: #eff6ff; border-color: #bfdbfe; }
}
/* Variante piena per l'azione di riga (deposito/ritiro): bianco su blu, cosi' si vede a colpo d'occhio
   in una tabella fitta. Le frecce dell'impaginazione restano nella variante leggera: due blocchi
   blu in fondo alla pagina peserebbero piu' della tabella.
   Sta DOPO la regola `a.kl-iconbtn:hover` di sopra apposta: stessa specificita', vince l'ultima,
   altrimenti al passaggio del mouse il pulsante tornerebbe blu su blu. */
.kl-iconbtn--primary {
    background: var(--kl-blue); border-color: var(--kl-blue); color: #fff;
}
a.kl-iconbtn--primary:hover { color: #fff; }
@media (hover: hover) {
    .kl-iconbtn--primary:hover { background: var(--kl-blue-dark); border-color: var(--kl-blue-dark); }
}
/* Intestazione ordinabile: e' un <button> perche' ci si arrivi col tasto Tab, ma deve leggersi
   come un'intestazione, non come un pulsante. */
.kl-th {
    background: none; border: 0; padding: 0; cursor: pointer;
    font: inherit; color: inherit;
    display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
}
/* La colonna attiva e' l'unica con il caret: si tinge di blu senza bisogno di una classe in piu'
   nel markup. Se `:has()` non fosse supportato l'intestazione resta spenta, e si perde solo un
   rinforzo visivo: il caret la marca comunque. */
.kl-th:has(.kl-ico) { color: var(--kl-blue); }
/* Intestazione di una colonna numerica. Vale in due forme: sul <button> ordinabile della Cerca
   (che e' flex, quindi si spinge in fondo) e su un <th> di testo come nella tabella capacita'
   della Dashboard (dove basta allineare il testo). */
.kl-th--num { justify-content: flex-end; width: 100%; }
th.kl-th--num { text-align: right; }
.kl-th .kl-ico { width: 14px; height: 14px; color: var(--kl-blue); }
/* Verso decrescente: un disegno solo, ruotato. */
.kl-table--desc .kl-th .kl-ico { transform: rotate(180deg); }
@media (hover: hover) {
    /* Riga sotto il puntatore: aiuta a seguirla fino in fondo quando le colonne sono otto. */
    .kl-table tbody tr:hover td { background: #f8fafc; }
}

/* Barra di impaginazione sotto la tabella */
.kl-pager { display: flex; align-items: center; justify-content: center; gap: 14px; margin-top: 14px; }
.kl-pager-info { color: var(--kl-muted); font-size: .85rem; text-align: center; }
/* La freccia "avanti" e' lo stesso disegno di quella indietro, ruotato: un disegno solo da
   mantenere invece di due speculari. */
.kl-iconbtn--next .kl-ico { transform: rotate(180deg); }
.kl-iconbtn:disabled { opacity: .45; cursor: default; }
@media (hover: hover) {
    .kl-iconbtn:disabled:hover { background: #fff; border-color: #e3e7ee; }
}
