/* GLOBALE */
a, a:hover { -webkit-transition: 200ms ease-in-out; transition: 200ms ease-in-out; }
.nav-link.logout { background-color: #DC3545 !important; }
.nav-item > hr { border-top: 1px solid #4F5962; }
.text-large { font-size: 18px; }
.text-light { color: #FFF; }
input.inputNumerico::-webkit-outer-spin-button, input.inputNumerico::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
input[type=number].inputNumerico { -moz-appearance: textfield; }
.visible { display: inline-block !important; }
.invisible { display: none !important; }
.preloader > img { max-width: 90%; height: auto; }
i.fas { min-width: 18px; }
.btn-light { border-color: #E0E0E0; }
.input-group-prepend > .input-group-text { width: 42px; }
input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
input[type=number] { -moz-appearance: textfield; }
.select2-container--bootstrap4 .select2-dropdown { z-index: 3000 !important; }
.tooltip-left { text-align: left; max-width: none; white-space: nowrap; }

/* LOGIN (Fase 2.0 — layout split-screen, stile progetto "reception") */
body.login-page { background: #FFF !important; min-height: 100vh; padding: 0 !important; margin: 0; }
.login-split { display: flex; min-height: 100vh; width: 100%; }
.login-form-panel { background: #FFF; box-shadow: 6px 0 40px rgba(0, 0, 0, 0.28); display: flex; flex: 0 0 clamp(440px, 25%, 560px); max-width: clamp(440px, 25%, 560px); flex-direction: column; justify-content: center; padding: 30px 60px 60px; position: relative; z-index: 2; }
.login-brand { margin-bottom: 48px; text-align: center; }
.login-brand img { max-height: 70px; }
.login-form-inner { width: 100%; }
.login-form-inner .input-group .input-group-text:first-child { background: #E9ECEF; border-radius: 0.25rem 0 0 0.25rem; color: #495057; }
.login-form-inner .input-group .input-group-text:last-child { background: #E9ECEF; border-radius: 0 0.25rem 0.25rem 0; color: #495057; cursor: pointer; }
.login-form-inner button { font-size: 18px; }
.login-box-msg { color: #222; font-family: "Manrope"; font-size: 2rem; font-weight: 400; padding: 0 0 28px; text-align: left; }
.login-panel-footer { color: #999; font-family: "Kanit"; font-size: .8rem; text-align: center; position: absolute; bottom: 24px; left: 0; right: 0; }
.login-panel-footer a { color: #00813E; text-decoration: none; }
.login-panel-footer a:hover, .login-panel-footer a:focus { text-decoration: underline; }
.login-visual-panel { align-items: flex-end; background: linear-gradient(160deg, rgba(0,129,62,.4), rgba(0,90,43,.55)), url('../images/bg-login.jpg') center/cover no-repeat; display: flex; flex: 1 1 auto; justify-content: flex-start; overflow: hidden; position: relative; }
.visual-copy { color: #FFF; max-width: 560px; padding: 0 60px 30px; pointer-events: none; position: relative; text-align: left; z-index: 2; }
.visual-eyebrow { font-family: "Kanit"; font-size: 1rem; letter-spacing: 2px; margin-bottom: 10px; opacity: 0.85; text-transform: uppercase; }
.visual-subtitle { font-family: "Manrope"; font-size: 1.9rem; font-weight: 700; line-height: 1.3; }
@media(max-width: 768px) {
  .login-split { flex-direction: column; }
  .login-form-panel { box-shadow: none; flex: 1 1 auto; max-width: 100%; padding: 40px 30px; }
  .login-visual-panel { display: none; }
}

/* NAVBAR */
.navbar-logo { position: absolute; right: 20px; top: 8px; max-height: 40px; }
.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link.active { background: #FFF; color: #343A40; }
.navbar-dark .navbar-nav .nav-item.dropdown.show { background: #FFF; color: #343A40; }
.navbar-dark .navbar-nav .nav-item.dropdown.show .nav-link { color: #343A40; }
.dropdown-item:focus, .dropdown-item:hover { background: #007BFF; color: #FFF; }
@media(max-width: 991.98px) { 
  .main-header .navbar-nav .nav-item { border: 1px solid rgba(255,255,255,.33); }
  .main-header .navbar-nav .nav-item, .main-header .navbar-nav .nav-item .dropdown-item { text-align: center; }
  .main-header .navbar-nav .nav-item:nth-child(n+2) { margin-top: 5px; }
}

/* BREADCRUMBS */
.breadcrumb .breadcrumb-item { font-size: 16px; }
.breadcrumb-item+.breadcrumb-item { padding-left: 10px; }
.breadcrumb-item+.breadcrumb-item::before { color: #FFF; padding-right: 10px; }
.breadcrumb .breadcrumb-item a { color: rgba(255, 255, 255, 0.66) !important; text-decoration: underline !important; }
.breadcrumb .breadcrumb-item, .breadcrumb .breadcrumb-item a:hover, .breadcrumb .breadcrumb-item a:focus, .breadcrumb .breadcrumb-item.active { color: #FFF !important; }

/* TABELLA DETTAGLI */
#dettagliTabella .col { border: 1px solid #DEE2E6; padding: 8px 15px; min-height: 41px; }
#dettagliTabella .col:first-child { background: #F6F6F6; }
#dettagliTabella .col:not(:last-child) { border-right-width: 0; }
#dettagliTabella .row:not(:last-child) .col { border-bottom-width: 0; }
#dettagliTabella #bottonePrezzo { margin-top: -8px; margin-bottom: -4px; width: 35px; }
/* Icona mostra/nascondi prezzo acquisto in verde ABZ, stessa tonalita' di .btn-success
   (qui il bottone resta btn-outline-primary, quindi si ridichiarano le variabili outline). */
#dettagliTabella #bottonePrezzo {
  --bs-btn-color: #00813E;
  --bs-btn-border-color: #00813E;
  --bs-btn-hover-color: #FFF;
  --bs-btn-hover-bg: #00813E;
  --bs-btn-hover-border-color: #00813E;
  --bs-btn-active-color: #FFF;
  --bs-btn-active-bg: #006732;
  --bs-btn-active-border-color: #006732;
  --bs-btn-focus-shadow-rgb: 38, 148, 91;
}
#dettagliTabella #IDCliente { height: 26px; }
#dettagliTabella button#codiceCliente { font-size: 14px; height: 26px; line-height: 20px; margin-top: -4px; }

/* ELENCO RAPPORTINI */
#elencoRapportini .bg-white > a { color: #FFF !important; }
.calendar-grid { display: grid; gap: 10px; grid-template-columns: repeat(7, 1fr); }
.day-card { border: 2px solid transparent; min-height: 120px; min-width: 0; overflow: hidden; }
.day-card.weekend { background: #ABABAB; border-color: #000; color: #000; }
.day-card.weekend .day-card-footer { border-color: #000; }
.day-card.weekend .day-card-footer span { color: #000 !important; }
.day-card.incomplete { border-color: #feb2b2; background: #fff5f5; }
.day-card.complete { border-color: #9ae6b4; background: #f0fff4; }
.day-card.empty-slot { background: transparent; border: none; }
.rapportini-list .rapportino-item:last-child { margin-bottom: 15px !important; }
.rapportino-item { background: rgba(255 255 255 / 75%); border-left: 3px solid #28a745; font-size: 0.75rem; padding: 2px; }
.day-card-footer i { width: 12px; }
.legend-swatch { display: inline-block; width: 15px; height: 15px; border-radius: 2px; vertical-align: middle; }
.legend-swatch.complete { border: 2px solid #9ae6b4; background: #f0fff4; }
.legend-swatch.incomplete { border: 2px solid #feb2b2; background: #fff5f5; }
.legend-swatch.weekend { background: #ABABAB; }
/* .btn-xs esiste in AdminLTE3 (vecchio stack) ma non in AdminLTE4/BS5: senza questa regola,
   sul nuovo stack la classe è un no-op e il bottone torna alle dimensioni piene di un .btn. */
.btn-xs { padding: .125rem .4rem; font-size: .75rem; line-height: 1.5; border-radius: .2rem; }

@media (max-width: 991px) {
  .calendar-grid { grid-template-columns: 1fr !important; }
  .calendar-grid .empty-slot { display: none !important; min-height: 0; }
  .calendar-grid > div:nth-child(-n+7):not(.day-card) { display: none; }
  .day-card.empty-slot { display: none; }
}
		
/* RAPPORTINI */
#creaPDF #mySketch1 { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; border: 1px solid #CED4DA; border-radius: 0.25rem; height: 200px; margin: 0; padding: 10px; }
.modal-content { border: 0; }
.modal-header .modal-title { text-shadow: 2px 2px 0 #000; }

.nav-tabs .nav-link { border-color: #E9ECEF #E9ECEF #DEE2E6; }
.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { background-color: rgba(0,123,255,0.85); border: #007BFF #007BFF #FFF; color: #FFF; }
.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { background-color: #0056B3; color: #FFF; }

/* DATATABLES */
form span.input-group-append > button { border-top-right-radius: .25rem !important; border-bottom-right-radius: .25rem !important; }
div.dataTables_filter, div.dataTables_paginate { float: right; }
div.dataTables_filter, div.dataTables_length, div.dataTables_info, div.dataTables_paginate { display: inline-block; }
div.dt-buttons { display: block; margin-top: 15px; }
.table-striped tbody tr:nth-of-type(odd) { background-color: #F8F8F8; }
.table-hover tbody tr:not(.canone-scadenza):hover { background-color: rgba(0, 123, 255, 0.1) !important; }

/* CANONI */
#risCanoni tfoot select { display: block; width: 100%; height: 100%; padding: .15rem .3rem; font-size: .875rem; line-height: 1.5; color: #495057; background-color: #fff; background-clip: padding-box; border: 1px solid #ced4da; border-radius: .2rem; box-shadow: inset 0 0 0 transparent; transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; }
#risCanoni th select { width: 100%; }
#risCanoni td.bg-disdettaParziale { background: linear-gradient(to top left, #DC3545 50%, transparent 50%); color: #FFF; text-align: right; }
#risCanoni td.cellaDisdette { height: 20px; }
#risCanoni .barraDisdette { display: flex; gap: 3px; width: 100%; height: 100%; box-sizing: border-box; margin: 0 auto; }
#risCanoni .barraDisdette > div { flex: 1; background-color: transparent; border: 1px solid #ccc; border-radius: 2px; transition: background-color 0.3s ease; height: 100%; }
#risCanoni .barraDisdette > div.canoneDisdettato { background-color: #DC3545; border-color: #900000; }

/* CALENDARIO */
.fc .fc-toolbar-title { text-transform: capitalize; }
.fc-scroller { height:100% !important; }

/* PRTG */
.select2-container--default .select2-selection--single { border-color: #CED4DA; }
.select2-container .select2-selection--single { height: 38px; }
.select2-container--default .select2-selection--single .select2-selection__arrow { height: 36px; }

/* RICHIESTA PERMESSO */
#richiestaPermesso #oraInizio option:disabled, #richiestaPermesso #oraFine option:disabled { color: #DC3545 !important; }

/* LISTA USCITE */
#listaUsciteAutoPersonale thead th:nth-child(1), #listaUsciteAutoPersonale thead th:nth-child(3) { min-width: 200px; }
#listaUsciteAutoPersonale thead th:nth-child(4) { min-width: 150px; }
#listaUsciteAutoPersonale thead th:nth-child(5) { min-width: 100px; }

/* TICKET */
.swal-actions-spaced { display: flex !important; justify-content: space-between !important; padding: 0 1.6em !important; width: 100% !important; }
#ticketABZ.nav-tabs .nav-item:not(:first-child) { margin-left: 5px; }
#ticketABZ.nav-tabs .nav-link:not(.active) { background-color: #E9ECEF; border-color: #DEE2E6; color: #495057; transition: background-color 0.2s ease; }
#ticketABZ.nav-tabs .nav-link:not(.active):hover { background-color: #DEE2E6; color: #212529; }
#ticketABZ.nav-tabs .nav-link.active { font-weight: bold; }

.ticket-chiuso { background-color: rgba(0,0,0,0.5) !important; color: #FFF; pointer-events: none; }
.ticket-chiuso td:not(:last-child), .ticket-chiuso td:not(:last-child) > * { text-decoration: line-through; }
.ticket-chiuso a { color: #FFF; }
.ticket-chiuso .chk-stato-ticket, .ticket-chiuso .btnAzioni button:last-child { cursor: pointer; pointer-events: all; }
.form-check-input { cursor: pointer; width: 1.2em; height: 1.2em; accent-color: #00813E; }
.form-check-input:checked { background-color: #00813E; border-color: #00813E; }
.form-check-input:focus { border-color: #00813E; box-shadow: 0 0 0 0.25rem rgba(0, 129, 62, 0.25); }
/* Checkbox del pannello "Aggiungi annotazione" (dettaglioTicket.php): il bottone che apre il
   pannello è btn-info (cyan), quindi la checkbox segue la stessa logica colore invece del verde
   ABZ di default sopra. */
#blocNotaTicket .form-check-input { accent-color: #0DCAF0; }
#blocNotaTicket .form-check-input:checked { background-color: #0DCAF0; border-color: #0DCAF0; }
#blocNotaTicket .form-check-input:focus { border-color: #0DCAF0; box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.25); }
th.sorting_disabled::after, th.sorting_disabled::before { display: none !important; }

/* RICHIESTE EFFETTUATE */
.btn-cancella-bloccato { opacity: .5; cursor: not-allowed; }

/* CALENDARIO PERMESSI */
#calendarioPermessi .gantt-container { overflow: auto; border: 1px solid #e9ecef; border-radius: .5rem; background: #FFF; }
#calendarioPermessi .gantt-container table { border-collapse: collapse; min-width: 1600px; table-layout: fixed; width: 100%; }
#calendarioPermessi .gantt-container th, #calendarioPermessi .gantt-container td { border: 1px solid #ced4da; height: 28px; text-align: center; position: relative; padding: 0; }
#calendarioPermessi .col-nome { width: 180px; text-align: left; padding-left: 15px; background: #f8f9fa; position: sticky; left: 0; z-index: 10; font-weight: bold; border-right: 3px solid #495057; font-size: 12px; }
#calendarioPermessi .header-day { background: #495057; color: white; font-size: 13px; }
#calendarioPermessi .header-name { background: #e9ecef; color: #495057; font-size: 11px; font-weight: bold; }
#calendarioPermessi .weekend { background-color: #e9ecef !important; }
#calendarioPermessi .festivo { background-color: #e4767c !important; }
#calendarioPermessi .day-split { display: flex; width: 100%; height: 100%; }
#calendarioPermessi .hour-block { flex: 1; height: 100%; border-right: 1px solid rgba(0,0,0,0.04); }
#calendarioPermessi .hour-block:last-child { border-right: none; }
#calendarioPermessi .hour-block.ferie { background-color: #00813E !important; }
#calendarioPermessi .hour-block.chiusura { background-color: rgba(0,129,62,.4) !important; }
#calendarioPermessi .gantt-cell-link { display: block; width: 100%; height: 100%; text-decoration: none; cursor: pointer; }
#calendarioPermessi .legend-swatch.ferie { background-color: #00813E; }
#calendarioPermessi .legend-swatch.chiusura { background-color: rgba(0,129,62,.4); }
#calendarioPermessi .legend-swatch.weekend { background-color: #e9ecef; }
#calendarioPermessi .legend-swatch.festivo { background-color: #e4767c; }

/* CHIUSURE AZIENDALI */
#chiusureAziendali .weekend { background-color: #cbd5e0 !important; }

/* CALENDARIO PRENOTAZIONI (auto + sala riunioni). Asse del tempo VERTICALE (righe = fasce da 30
   minuti), colonne = combinazioni giorno×risorsa — così anche la settimana lavorativa (5 giorni x
   3 risorse = 15 colonne) si vede senza scroll orizzontale, a differenza del primo tentativo con
   l'orario in colonna (fino a 80 colonne in settimana). Stile "barre fluttuanti su griglia
   leggera" ripreso da un riferimento DHTMLX Scheduler mandato dall'utente — solo lo stile,
   nessuna libreria esterna aggiunta: griglia hand-rolled come #calendarioPermessi. */
#calendarioPrenotazioni .card-primary { display: flex; flex-direction: column; min-height: calc(100vh - 220px); }
#calendarioPrenotazioni .gantt-container { overflow: auto; border: 1px solid #e9ecef; border-radius: .5rem; background: #FFF; height: 100%; }
/* table-layout:fixed + solo .col-ora con larghezza esplicita: il resto dello spazio si divide
   in parti automaticamente UGUALI tra tutte le colonne giorno×risorsa (niente scroll, poche
   colonne). L'altezza riga qui sotto è solo un FALLBACK statico (prima che il JS calcoli quella
   reale in ridimensionaRigheOrario(), che divide lo spazio disponibile per il numero di righe —
   così resta sempre uniforme ed è anche responsive al resize della finestra). */
#calendarioPrenotazioni .gantt-container table { border-collapse: collapse; table-layout: fixed; width: 100%; }
#calendarioPrenotazioni .gantt-container th, #calendarioPrenotazioni .gantt-container td { border-right: 1px solid #ced4da; border-bottom: 1px solid #ced4da; text-align: center; position: relative; padding: 0; }
#calendarioPrenotazioni .gantt-container tbody tr { height: 44px; }
#calendarioPrenotazioni .gantt-container thead th { border-bottom: 2px solid #dee2e6; height: 42px; }
#calendarioPrenotazioni .col-ora { width: 64px; background: #f8f9fa; position: sticky; left: 0; z-index: 10; font-weight: bold; border-right: 2px solid #dee2e6; font-size: 11px; color: #343a40; }
#calendarioPrenotazioni .header-risorsa, #calendarioPrenotazioni .header-giorno-gruppo { background: #f8f9fa; color: #6c757d; font-size: 16px; font-weight: 700; }
#calendarioPrenotazioni .header-giorno-gruppo { text-transform: uppercase; }
#calendarioPrenotazioni .header-risorsa i { font-size: 13px; }
#calendarioPrenotazioni .header-risorsa span { font-size: 10px; text-transform: none; font-weight: 600; }
#calendarioPrenotazioni .confine-giorno { border-left: 3px solid #495057 !important; }
#calendarioPrenotazioni .confine-pausa { border-top: 2px dashed #ced4da !important; }
#calendarioPrenotazioni .hour-block-link { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; width: calc(100% - 8px); height: calc(100% - 6px); margin: 3px 4px; border-radius: .5rem; text-decoration: none; cursor: pointer; padding: 4px 6px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,.12); text-align: left; }
#calendarioPrenotazioni .hour-block-link span { display: block; width: 100%; color: #FFF; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#calendarioPrenotazioni .hour-block-link .riga-orario { font-size: 10px; font-weight: 700; }
#calendarioPrenotazioni .hour-block-link .riga-nome { font-size: 10px; font-weight: 400; opacity: .9; }
/* Prenotazioni troppo brevi per due righe leggibili (calendarioPrenotazioni.php,
   aggiornaModalitaCompatta()): solo l'orario, centrato, stile Outlook — il nome resta disponibile
   via tooltip (title) o aprendo il dettaglio col click. */
#calendarioPrenotazioni .hour-block-link.hour-block-compatto { flex-direction: row; align-items: center; justify-content: center; padding: 2px 4px; }
#calendarioPrenotazioni .hour-block-link.hour-block-compatto .riga-nome { display: none; }
#calendarioPrenotazioni .occ-ford { background-color: #DC3545 !important; }
#calendarioPrenotazioni .occ-peugeot { background-color: #007BFF !important; }
#calendarioPrenotazioni .occ-sala { background-color: #00813E !important; }
#calendarioPrenotazioni .libero-link { display: block; width: 100%; height: 100%; cursor: pointer; min-height: 28px; }
#calendarioPrenotazioni .libero-link:hover { background-color: #f0fff4; }
#calendarioPrenotazioni .slot-passato { cursor: default; opacity: .35; }
#calendarioPrenotazioni .toolbar-pren .btn-group .btn { font-weight: 600; }
#calendarioPrenotazioni .legend-swatch { margin-right: 8px; }

/* SHELL BOOTSTRAP 5 / ADMINLTE 4 (Fase 2.1 — solo per le pagine migrate a head2/header2/footer2/scripts2) */
:root {
  /* Senza questo override .bg-primary/.text-primary di Bootstrap 5 tornerebbero al blu di
     default (#0d6efd) — NON riguarda .btn-primary/.card-primary, che hanno le loro variabili
     dedicate (vedi sotto). Verde #00813E scelto come nuovo colore primario per le pagine sul
     nuovo stack (Fase 2.2) — le pagine ancora sul vecchio stack (AdminLTE 3/Bootstrap 4)
     restano sul blu #007BFF finché non vengono migrate, per non toccare codice condiviso da loro. */
  --bs-primary: #00813E;
  --bs-primary-rgb: 0, 129, 62;
}
/* LINK — solo nuovo stack (login.php + shell head2/header2/footer2). Escluse esplicitamente le
   classi che sono in realtà componenti (bottoni, voci di navbar/dropdown, logo): la loro regola
   di colore di base (es. ".btn{color:var(--bs-btn-color)}") ha specificità più bassa di un
   semplice "a" con classe genitore, quindi senza queste esclusioni il verde vinceva anche lì. */
.app-wrapper a:not(.btn):not(.nav-link):not(.dropdown-item):not(.navbar-brand):not(.dropdown-toggle),
body.login-page a:not(.btn) { color: #00813E; text-decoration: none; }
.app-wrapper a:not(.btn):not(.nav-link):not(.dropdown-item):not(.navbar-brand):not(.dropdown-toggle):hover,
.app-wrapper a:not(.btn):not(.nav-link):not(.dropdown-item):not(.navbar-brand):not(.dropdown-toggle):focus,
body.login-page a:not(.btn):hover, body.login-page a:not(.btn):focus { color: #006732; }
/* CARD-HEADER — altezza incoerente tra pagine con bottone nell'header (es. faq.php) e pagine con
   solo il titolo (es. magazzinoCavi.php): dentro ".row.align-items-center" (titolo+bottone) la riga
   si allunga sempre all'elemento più alto tra i due, e un .btn normale (~38px, misurato) è più alto
   del solo testo del titolo (~21px, misurato) — da qui l'header più alto. Generalizza il pattern già
   usato in ticket.php (flex diretto su .card-header + btn-sm) a tutte le varianti del sito, con
   :has() per toccare solo le card-header con titolo/bottone in questa forma (mai il generico
   .card-header, per non rompere le card-header con altro contenuto, es. i widget di
   canoniStatistiche.php o i pannelli bg-primary della checklist). 65px scelto dall'utente, poco
   sopra ai 62.6px misurati (32px di padding AdminLTE4 + 30.6px di altezza reale di un .btn-sm). */
.card-header:has(> h3.card-title:only-child),
.card-header:has(> .row),
.card-header.d-flex.align-items-center {
  display: flex;
  align-items: center;
  min-height: 65px;
}
/* .row e' gia' un flex container di suo (Bootstrap), ma da BLOCCO si allargava sempre al 100% del
   genitore per conto proprio; diventato figlio flex di .card-header sopra, senza questa regola si
   restringe al contenuto (flex-basis:auto di default) invece di riempire la larghezza disponibile
   — le due colonne si stringono, il titolo va a capo su due righe e l'header torna piu' alto del
   dovuto. Ripristina la larghezza piena di prima. */
.card-header:has(> .row) > .row {
  flex: 1 1 auto;
  min-width: 0;
}
/* PRELOADER (Fase 2.2 — stesso pattern del progetto "reception"): overlay a schermo intero con
   logo, barra di avanzamento finta (si ferma al 92% finché la pagina non ha finito di caricare
   davvero) e dicitura LOADING. Nascosto con un fade quando la pagina è pronta (o dopo 8s, come
   rete di sicurezza). Colori ripresi da "reception" ma con #00813E al posto della sua variabile
   --primary-color (qui non presente: il progetto usa --bs-primary direttamente). */
#preloader { position: fixed; inset: 0; z-index: 9999; display: flex; flex-direction: column; align-items: center; justify-content: center; background: #FFF; transition: opacity .4s ease, visibility .4s ease; }
#preloader.preloader-nascosto { opacity: 0; visibility: hidden; pointer-events: none; }
#preloaderLogo { width: 380px; margin-bottom: 1.75rem; animation: preloader-pulse 1.4s ease-in-out infinite; }
.preloader-barra { width: 380px; height: 6px; background: #E9ECEF; border-radius: 999px; overflow: hidden; }
.preloader-barra-fill { height: 100%; width: 0%; background: var(--bs-primary); border-radius: 999px; transition: width .25s ease-out; }
.preloader-testo { margin-top: .9rem; font-size: .95rem; font-weight: 700; letter-spacing: .15em; color: #6C757D; animation: preloader-testo-pulsa 1.6s ease-in-out infinite; }
#preloaderPercentuale { display: inline-block; margin-left: .4em; letter-spacing: normal; color: var(--bs-primary); }
@keyframes preloader-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.06); } }
@keyframes preloader-testo-pulsa { 0%, 100% { opacity: 1; } 50% { opacity: .5; } }
/* Mini-preloader per contenuti caricati via AJAX dentro una tab (dettaglioRubrica.php e simili):
   stesso stile del preloader di pagina ma in scala e con barra indeterminata (qui non conosciamo
   una percentuale reale, il contenuto rimpiazza tutto non appena arriva). */
.tab-preloader { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 3rem 1rem; }
.tab-preloader-logo { width: 140px; margin-bottom: 1.1rem; animation: preloader-pulse 1.4s ease-in-out infinite; }
.tab-preloader-barra { width: 220px; height: 5px; background: #E9ECEF; border-radius: 999px; overflow: hidden; }
.tab-preloader-barra-fill { height: 100%; width: 40%; background: var(--bs-primary); border-radius: 999px; animation: tab-preloader-scorri 1.3s ease-in-out infinite; }
.tab-preloader-testo { margin-top: .7rem; font-size: .8rem; font-weight: 700; letter-spacing: .12em; color: #6C757D; animation: preloader-testo-pulsa 1.6s ease-in-out infinite; }
@keyframes tab-preloader-scorri { 0% { transform: translateX(-100%); } 100% { transform: translateX(250%); } }
/* FONT (Fase 2.4) — solo nuovo stack: stesso schema di tempoLiberoDemo (titoli/corpo/etichette)
   ma con Manrope al posto di Rubik per i titoli, su richiesta esplicita. Scoped su "body" invece
   che su ".app-wrapper" (come già fatto per il colore dei link) perché copre anche i modali, che
   nel markup stanno fuori da ".app-wrapper" ma dentro "body" — le uniche classi presenti SOLO
   sulle pagine già migrate sono "body.bg-body-tertiary" (pagine applicative) e "body.login-page". */
body.bg-body-tertiary, body.login-page {
  font-family: 'Figtree', system-ui, sans-serif;
}
body.bg-body-tertiary h1, body.bg-body-tertiary h2, body.bg-body-tertiary h3,
body.bg-body-tertiary h4, body.bg-body-tertiary h5, body.bg-body-tertiary h6,
body.bg-body-tertiary .h1, body.bg-body-tertiary .h2, body.bg-body-tertiary .h3,
body.bg-body-tertiary .h4, body.bg-body-tertiary .h5, body.bg-body-tertiary .h6,
body.bg-body-tertiary .nav-link, body.bg-body-tertiary .dropdown-item,
body.login-page h1, body.login-page h2, body.login-page h3,
body.login-page h4, body.login-page h5, body.login-page h6 {
  font-family: 'Manrope', system-ui, sans-serif;
}
/* .dropdown-item non eredita il font-size dal body come .nav-link, ma da .dropdown-menu, che
   Bootstrap fissa staticamente a --bs-dropdown-font-size:1rem — va riallineato esplicitamente
   alla stessa dimensione del body, altrimenti resta diverso dalle voci di primo livello. */
body.bg-body-tertiary .dropdown-menu {
  --bs-dropdown-font-size: .95rem;
}
/* Voci di primo livello del menu e sottovoci dei dropdown: stesso peso (normale, non quello più
   bold ereditato da AdminLTE) e stessa spaziatura tra le lettere, su richiesta esplicita. */
body.bg-body-tertiary .nav-link {
  --bs-nav-link-font-weight: 400;
}
body.bg-body-tertiary .nav-link, body.bg-body-tertiary .dropdown-item {
  letter-spacing: .5px;
}
/* Hover verde per i dropdown FUORI dalla navbar (es. menu "Azioni" nelle card) — la regola
   ".dropdown-item:hover{background:#007BFF}" del vecchio stack, più in alto in questo stesso
   file, è globale e senza l'eccezione già presente per ".app-header .dropdown-menu". */
body.bg-body-tertiary .dropdown-item:hover, body.bg-body-tertiary .dropdown-item:focus {
  background-color: #00813E;
  color: #FFF;
}
/* Bottone azioni circolare su header colorato (es. dettaglioRubrica.php): un filo di bianco
   già a riposo, non solo al passaggio del mouse, per risaltare sul verde dell'header. */
.btn-header-actions {
  background-color: rgba(255, 255, 255, .22);
  border-color: rgba(255, 255, 255, .55);
}
.btn-header-actions:hover, .btn-header-actions:focus {
  background-color: #FFF;
  border-color: #FFF;
  color: #00813E;
}
body.bg-body-tertiary label, body.bg-body-tertiary .form-label, body.bg-body-tertiary .form-check-label,
body.bg-body-tertiary th, body.bg-body-tertiary .badge, body.bg-body-tertiary .breadcrumb-item,
body.login-page label, body.login-page .form-label {
  font-family: 'Kanit', system-ui, sans-serif;
}
/* Eccezione al blocco sopra: il titolo dentro la fascia colorata (.app-content-header, es.
   "Rubrica") va in Kanit e non in Manrope, per coerenza visiva col breadcrumb (già in Kanit)
   che gli sta accanto nella stessa fascia — scelta esplicita dell'utente. */
body.bg-body-tertiary .app-content-header h1 {
  font-family: 'Kanit', system-ui, sans-serif;
}
/* Righe informative del dettaglio ticket (Assegnato a/Aperto da/In carico a/...): non più grigie
   (tolto text-muted nel markup), font Manrope come i titoli del nuovo stack invece del corpo
   testo standard "Figtree" ereditato dal body. */
body.bg-body-tertiary .ticket-info-riga {
  font-family: 'Manrope', system-ui, sans-serif;
}
/* DataTables: il testo "Showing X to Y of Z" e la paginazione erano troppo attaccati alla tabella. */
body.bg-body-tertiary .dt-info,
body.bg-body-tertiary .dt-paging {
  margin-top: .5rem;
}
/* Nota: il fix per "Show N entries"/ricerca sulla stessa riga non è più qui — si è rivelato
   inefficace affidarsi alle classi interne del layout di DataTables 2.x (non verificabile in
   browser in questa sessione). Sostituito con un template "dom" esplicito, vedi
   DT_DOM_STESSARIGA in js/custom2.js, usato da ogni init DataTable del nuovo stack. */
/* TABELLE (Fase 2.4) — solo nuovo stack: righe centrate verticalmente, generale così qualunque
   tabella futura eredita lo stesso comportamento senza doverlo ripetere. */
body.bg-body-tertiary .table td {
  vertical-align: middle;
}
/* Rubrica (index.php): Ragione sociale/Indirizzo/Città in maiuscolo (dati AS/400 con casing
   incoerente), solo visivo — l'e-mail resta minuscola tramite il PHP esistente (strtolower). */
#risRubrica tbody td:nth-child(2), #risRubrica tbody td:nth-child(3), #risRubrica tbody td:nth-child(5) {
  text-transform: uppercase;
}
/* Tutte le colonne di ogni DataTable del nuovo stack (tranne l'ultima, Azioni, che resta stretta
   per il suo trattamento "shrink") a sinistra con un po' di respiro laterale. Generalizzato da
   #risRubrica (solo index.php) a "table.dataTable" così qualunque tabella futura lo eredita senza
   doverlo ripetere — la classe "dataTable" è aggiunta automaticamente da DataTables su init. */
body.bg-body-tertiary table.dataTable tbody td:not(:last-child) {
  text-align: left;
  padding-left: .5rem;
  padding-right: .5rem;
}
/* Pagination di DataTables: stesso problema già visto per .btn-primary/.card-primary — i bottoni
   di pagina di Bootstrap hanno variabili proprie per lo stato attivo hardcoded blu
   (--bs-pagination-active-bg:#0d6efd) e il colore testo punta a --bs-link-color (anch'esso
   hardcoded blu), nessuno dei due segue l'override di --bs-primary fatto in Fase 2.2. Vanno
   ridichiarate le variabili del componente stesso, con le stesse tonalità già usate per
   .btn-success. */
body.bg-body-tertiary .pagination {
  --bs-pagination-color: #00813E;
  --bs-pagination-hover-color: #006E35;
  --bs-pagination-focus-color: #006E35;
  --bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(38, 148, 91, .25);
  --bs-pagination-active-color: #FFF;
  --bs-pagination-active-bg: #00813E;
  --bs-pagination-active-border-color: #00813E;
}
/* Nav-pills (switch Cliente/AB Z in rapportiniTab.php): stesso problema di sopra — lo stato
   attivo ha una variabile propria che non segue --bs-primary. */
body.bg-body-tertiary .nav-pills .nav-link {
  color: #00813E;
  border: 1px solid #00813E;
}
body.bg-body-tertiary .nav-pills .nav-link:hover:not(.active) {
  background-color: #00813E;
  color: #FFF;
}
body.bg-body-tertiary .nav-pills .nav-link.active {
  --bs-nav-pills-link-active-bg: #00813E;
  border-color: #00813E;
  color: #FFF;
}
/* Select2 (tema bootstrap-5): stesso problema di sopra — lo stato "selezionato" nella lista a
   tendina è hardcoded blu (background-color:#0d6efd) nel CSS del tema, non segue --bs-primary.
   !important necessario: il tema definisce lo stesso stato con una catena di selettori più
   specifica (.select2-container--bootstrap-5 .select2-dropdown .select2-results__options
   .select2-results__option.select2-results__option--highlighted, 5 classi) di questa regola —
   scoperto perché senza !important restava blu/grigio nonostante il selettore qui sotto
   matchasse comunque l'elemento (verificato con una pagina di test statica). */
body.bg-body-tertiary .select2-container--bootstrap-5 .select2-results__option--selected,
body.bg-body-tertiary .select2-container--bootstrap-5 .select2-results__option[aria-selected="true"]:not(.select2-results__option--highlighted) {
  background-color: #00813E !important;
}
/* Stesso problema dello stato "selected" sopra, ma per lo stato "highlighted" (passaggio del
   mouse/navigazione da tastiera sulla lista a tendina): il tema lo lascia hardcoded blu
   (#0d6efd) — mai coperto finora perché la regola sopra escludeva esplicitamente le opzioni
   evidenziate. */
body.bg-body-tertiary .select2-container--bootstrap-5 .select2-results__option--highlighted {
  background-color: #00813E !important;
  color: #FFF !important;
}
/* Le <select> native (non potenziate da Select2) usano il rendering nativo del browser per
   l'elenco a tendina aperto: funziona in modo affidabile solo sui browser Chromium (Chrome/Edge),
   non su Firefox — compromesso pragmatico accettato, coerente con altri fix "best effort" già
   presenti in questo file. */
body.bg-body-tertiary select.form-select option:hover,
body.bg-body-tertiary select.form-select option:checked,
body.bg-body-tertiary select.form-select option:focus {
  background-color: #00813E;
  color: #FFF;
}
/* Riga filtri per colonna (select + Select2, sostituisce le select semplici) delle DataTables che
   hanno una seconda riga di thead dedicata ai filtri a cascata: messa a punto in
   _mockupFiltriSelect2.html (confronto con SearchPanes), poi consolidata in un'unica regola
   condivisa (classe .dt-riga-filtri sulla <tr> dei filtri, invece di ripeterla identica per ogni
   ID di tabella) — ogni nuova pagina che adotta lo stesso pattern eredita il fix aggiungendo solo
   la classe alla riga, senza copia-incolla del CSS. Niente label, deve restare compatta e non
   spingere in altezza l'header della tabella. */
.dt-riga-filtri th { padding: 4px; }
.dt-riga-filtri .select2-container { width: 100% !important; }
/* Il tema bs5 di default ha padding-top/bottom 6px pensati per un box da ~38px: comprimendo il
   box a 30px senza toccare quel padding, restavano solo 18px per il testo (che ne aveva bisogno
   di 28), da cui il testo schiacciato in basso invece che centrato. Padding verticale ridotto in
   coerenza con l'altezza compatta, line-height del testo allineato allo spazio residuo. */
.dt-riga-filtri .select2-selection {
  min-height: 30px; height: 30px; font-size: .8rem; padding-top: 2px; padding-bottom: 2px;
}
/* text-align:left forzato perché le colonne numeriche (columnDefs type:'num') fanno ereditare
   text-align:right dalla <th> (classe dt-type-numeric di DataTables) fin dentro il testo
   renderizzato da Select2 — altrimenti il valore selezionato finisce allineato a destra, sotto la
   X di reset. */
.dt-riga-filtri .select2-selection__rendered { line-height: 24px; padding-right: 22px; text-align: left; }
/* Intestazioni DataTables sempre a sinistra su tutte le pagine (vecchio e nuovo stack): stesso
   problema della regola sopra ma sulle <th> vere e proprie, non solo dentro Select2. DataTables
   2.x assegna da solo la classe dt-type-numeric/dt-type-date alle colonne che rileva come
   numeriche/data, forzandole a destra a runtime anche quando il markup della pagina non ha
   nessuna classe — oltre a eventuali text-center aggiunti a mano pagina per pagina. */
table.dataTable thead th,
table.dataTable thead td {
  text-align: left !important;
  padding-left: .5rem;
}
/* Freccia di ordinamento sempre a destra della cella, anche sulle colonne dt-type-numeric/dt-type-date:
   il div interno ".dt-column-header" generato da DataTables è un flex container con il titolo
   (flex-grow:1) seguito dall'icona di ordinamento; per queste colonne il tema le inverte con
   flex-direction:row-reverse, mettendo l'icona PRIMA del titolo — corretto quando il loro testo è a
   destra (comportamento di default di DataTables), ma con la regola sopra che forza il testo a
   sinistra su ogni colonna, l'inversione lascia l'icona bloccata all'inizio (sinistra) invece che in
   fondo come nelle altre colonne. Riportata alla direzione normale. */
table.dataTable thead th.dt-type-numeric div.dt-column-header,
table.dataTable thead th.dt-type-date div.dt-column-header,
table.dataTable thead td.dt-type-numeric div.dt-column-header,
table.dataTable thead td.dt-type-date div.dt-column-header {
  flex-direction: row !important;
}
/* Stesso micro-offset delle colonne normali (il tema, solo nelle tabelle .table-sm, usa left:.25rem
   invece di right:.25rem per queste colonne perché presuppone ancora l'ordine invertito sopra). */
table.dataTable.table-sm thead th.dt-type-numeric .dt-column-order,
table.dataTable.table-sm thead th.dt-type-date .dt-column-order,
table.dataTable.table-sm thead td.dt-type-numeric .dt-column-order,
table.dataTable.table-sm thead td.dt-type-date .dt-column-order {
  left: auto !important;
  right: .25rem !important;
}
/* Il tasto "cancella" (×) del tema aveva un box di soli 12x12px per un carattere di 12.8px: il
   glifo veniva tagliato dal proprio contenitore in un modo che può sembrare una X sovrapposta a
   una V. Ingrandito il box a 16x16px; font-size:0 rende il carattere "×" letterale dello span
   invisibile alla radice (l'icona resta visibile solo via il background-image del tema) — più
   robusto della tecnica text-indent/overflow del tema stesso, che dipende da un allineamento a
   sinistra e in pratica lasciava un residuo di un pixel non affidabile su colonne numeriche.
   !important necessario: la regola del tema bs5 per questo stesso elemento incatena 3 classi
   (.select2-container--bootstrap-5 .select2-selection--single .select2-selection__clear),
   più specifica delle 2 di .dt-riga-filtri, quindi altrimenti vincerebbe lei nonostante l'ordine
   di caricamento (per le altre regole qui sopra non serve: sono a parità di specificità con le
   corrispondenti del tema, e custom.css è caricato per ultimo). */
.dt-riga-filtri .select2-selection__clear {
  position: absolute !important; right: 6px !important; top: 50% !important; transform: translateY(-50%) !important;
  width: 16px !important; height: 16px !important; margin: 0 !important; font-size: 0 !important;
}
/* Con la X per cancellare già visibile, la freccia in giù è ridondante e ci si sovrappone: la
   nascondo quando c'è una selezione. Nota: l'elemento .select2-selection__arrow è già nascosto
   di suo dal tema bootstrap-5 (non è mai quello il problema) — la "V" visibile è un
   background-image impostato dal tema direttamente su .select2-selection--single, quindi è
   quello che va rimosso qui. */
.dt-riga-filtri .select2-selection--single:has(.select2-selection__clear) {
  background-image: none;
}
/* canoniDisdetti.php — le intestazioni (es. "€ unitario") non devono andare a capo quando la
   colonna si restringe per via del calcolo automatico di larghezza di DataTables; la tabella è
   già dentro .table-responsive, quindi l'eventuale overflow produce scroll orizzontale. */
#risCanoniDisdetti thead th, #risCanoniDisdetti tfoot th { white-space: nowrap; }
/* canoni.php — stesso motivo di canoniDisdetti.php sopra, stesse colonne monetarie coinvolte. */
#risCanoni thead th, #risCanoni tfoot th { white-space: nowrap; }
/* .btn-primary resta VOLUTAMENTE blu (Bootstrap di default): un override qui non ha mai
   funzionato (confermato con l'utente via devtools — a vincere è sempre la ridichiarazione di
   AdminLTE 4, identica a quella di Bootstrap, causa non individuata) ed è stato rimosso invece
   di lasciare codice morto. Il verde ABZ va su .btn-success (scelta esplicita dell'utente).
   .card-primary invece FUNZIONA (usa --lte-card-variant-*, non --bs-btn-*) e resta verde. */
.btn-success {
  --bs-btn-color: #FFF;
  --bs-btn-bg: #00813E;
  --bs-btn-border-color: #00813E;
  --bs-btn-hover-color: #FFF;
  --bs-btn-hover-bg: #006E35;
  --bs-btn-hover-border-color: #006E35;
  --bs-btn-focus-shadow-rgb: 38, 148, 91;
  --bs-btn-active-color: #FFF;
  --bs-btn-active-bg: #006732;
  --bs-btn-active-border-color: #006732;
  --bs-btn-disabled-bg: #00813E;
  --bs-btn-disabled-border-color: #00813E;
}
.card-primary, .text-bg-primary {
  --lte-card-variant-bg: #00813E;
  --lte-card-variant-bg-rgb: 0, 129, 62;
  --lte-card-variant-color: #FFF;
  --lte-card-variant-color-rgb: 255, 255, 255;
}
/* Niente più data-bs-theme="dark" su navbar/sidebar (rimosso su richiesta esplicita: era la
   causa di diversi problemi precedenti — 55% di opacità, dropdown a sfondo nero, divider
   bianco — tutti valori impliciti pensati per un tema scuro generico, non per questa shell).
   Tutto ciò che quell'attributo forniva "gratis" (colori, sfondi, icona hamburger mobile) è
   ora scritto qui in modo esplicito, senza dipendere da un meccanismo di tema. */
.app-header { --bs-navbar-color: #FFF; --bs-navbar-hover-color: #FFF; --bs-navbar-active-color: #FFF; --bs-navbar-brand-color: #FFF; --bs-navbar-brand-hover-color: #FFF; border-bottom: 0; }
/* Icona hamburger del collapse mobile (<991.98px): di default userebbe righe scure, invisibili
   sullo sfondo verde della navbar — resa bianca, con lo stesso identico SVG che Bootstrap usa
   per il suo tema scuro, solo portato al 100% di opacità invece del 55%. */
.app-header .navbar-toggler-icon { --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 1%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); }
.app-header .navbar-toggler { --bs-navbar-toggler-border-color: rgba(255, 255, 255, .1); }
.app-header .navbar-nav { gap: 1rem; }
.app-header .navbar-nav .nav-link:hover, .app-header .navbar-nav .nav-link.active { background: #FFF; color: #343A40; }
.app-header .navbar-nav .nav-item.dropdown.show { background: #FFF; }
.app-header .navbar-nav .nav-item.dropdown.show .nav-link { color: #343A40; }
/* Dropdown della navbar (Magazzino, Rapportini, ecc.): sfondo bianco invece di nero — di
   default eredita --bs-dropdown-bg: var(--bs-body-bg) dal tema scuro impostato su .app-header
   (data-bs-theme="dark") — con testo scuro di base e voce hover/attiva in verde (invece del
   blu di default di --bs-dropdown-link-*-bg), stessa tonalità in entrambi i casi. */
.app-header .dropdown-menu {
  --bs-dropdown-bg: #FFF;
  --bs-dropdown-color: #212529;
  --bs-dropdown-link-color: #212529;
  --bs-dropdown-link-hover-color: #FFF;
  --bs-dropdown-link-hover-bg: #00813E;
  --bs-dropdown-link-active-color: #FFF;
  --bs-dropdown-link-active-bg: #00813E;
  /* Di default eredita --bs-border-color-translucent dal tema scuro dell'header (un bianco
     semi-trasparente, invisibile ora che lo sfondo del dropdown è bianco) — reso grigio. */
  --bs-dropdown-divider-bg: rgba(0, 0, 0, .15);
}
/* Le variabili --bs-dropdown-link-hover-* sopra non bastano da sole: più in alto in questo
   stesso file (sezione NAVBAR del vecchio stack) c'è ".dropdown-item:hover{background:#007BFF}"
   che imposta lo sfondo in modo diretto, non tramite variabile — stessa specificità della
   regola di Bootstrap che legge la variabile, ma vince comunque perché è nello stesso file,
   dopo. Qui la specificità è aumentata di proposito (3 classi + pseudo-classe) per vincere
   sempre, indipendentemente dall'ordine, invece di continuare a rincorrere il file vecchio. */
.app-header .dropdown-menu .dropdown-item:hover, .app-header .dropdown-menu .dropdown-item:focus { background-color: #00813E; color: #FFF; }
/* Dropdown "Utility AB Z": 10 voci divise su due colonne affiancate invece di un'unica lista
   verticale lunga, entrambe della stessa larghezza (21rem, sufficiente per la voce più lunga
   "Richiesta uscita con auto personale" senza andare a capo). La classe Bootstrap
   "dropdown-center" sull'<li> (v. header.php) da sola non centra nulla in questo progetto: qui
   il dropdown della navbar viene aperto via bootstrap.Dropdown show()/hide() da mouseenter (vedi
   custom.js) e in quel flusso Popper non arriva mai ad applicare lo style inline di
   posizionamento (verificato in console: showare l'istanza lascia getAttribute('style') === null
   sul menu) — quindi il centraggio va forzato qui via CSS puro sulla stessa regola già presente,
   sovrascrivendo il "left:0" statico di Bootstrap. */
.app-header .dropdown-menu.dropdown-menu-columns.show {
  display: flex;
  align-items: stretch;
  left: 50%;
  transform: translateX(-50%);
}
.app-header .dropdown-menu.dropdown-menu-columns .dropdown-column {
  display: flex;
  flex-direction: column;
  width: 21rem;
}
/* Divider verticale tra le due colonne, nello stesso grigio dei .dropdown-divider orizzontali.
   Niente gap sul flex: la distanza dalla linea la danno già i padding orizzontali delle voci,
   uguali su entrambi i lati, così la linea resta esattamente centrata tra i due testi. */
.app-header .dropdown-menu.dropdown-menu-columns .dropdown-column + .dropdown-column {
  border-left: 1px solid var(--bs-dropdown-divider-bg);
}
/* Freccia del dropdown-toggle: Bootstrap 5 disegna di default un triangolino con un
   ::after in CSS puro (border-based, non un'icona) — sostituito da un'icona FontAwesome
   reale nel markup (.dropdown-caret), che ruota quando il dropdown è aperto
   (Bootstrap imposta aria-expanded="true" sul toggle stesso, nessun JS aggiuntivo serve). */
.app-header .dropdown-toggle::after { display: none; }
.app-header .dropdown-caret { transition: transform .3s ease; }
.app-header .dropdown-toggle[aria-expanded="true"] .dropdown-caret { transform: rotate(180deg); }
/* Voci di primo livello dell'header "bordered" (stesso concetto delle nav-pills più sopra):
   il bordo sottile era già presente ma solo su mobile (sotto) — estesa anche al desktop, con
   un raggio per farle leggere come pillole distinte. */
.app-header .navbar-nav .nav-link { border-radius: .375rem; }
@media(max-width: 991.98px) {
  .app-header .navbar-nav .nav-item, .app-header .navbar-nav .nav-item .dropdown-item { text-align: center; }
  .app-header .navbar-nav .nav-item:nth-child(n+2) { margin-top: 5px; }
}

/* ORARIO SETTIMANALE (Fase 2.2 — gestione utenti, stile ripreso dal progetto sorella
   "tempoLiberoDemo"). Elenco testuale Lun-Ven con le fasce orarie effettive di ogni turno (dati
   da turniUtente): griglia Bootstrap col-12/col-sm-6, due giorni per riga da tablet in su. Colori
   del progetto sorgente (--tl-accent/--tl-ink, non presenti qui) sostituiti con il verde ABZ
   #00813E e un grigio scuro neutro già usato altrove in questa fase. */
.orario-settimanale { font-size: .78rem; }
.orario-riga { display: flex; align-items: baseline; gap: .45rem; justify-content: center; padding: 1px 0; }
.orario-giorno-label { display: inline-flex; align-items: center; justify-content: center; width: 1.1rem; height: 1.1rem; border-radius: 50%; background: #00813E; color: #FFF; font-size: .62rem; font-weight: 700; flex-shrink: 0; }
.orario-giorno-testo { color: #212529; }
.orario-riga-vuota .orario-giorno-label { background: #DEE2E6; color: #6C757D; }
.orario-riga-vuota .orario-giorno-testo { color: #6C757D; font-style: italic; }

/* MODALI — nuovo stack (Fase 2.2): titolo bianco senza text-shadow. La regola generica
   ".modal-header .modal-title { text-shadow: 2px 2px 0 #000; }" (sezione RAPPORTINI, vecchio
   stack) andrebbe altrimenti a colpire anche questi modali — .modal-header-flat è la classe
   aggiunta di proposito solo ai modali del nuovo stack per non toccare quelli vecchi. */
.modal-header-flat .modal-title { text-shadow: none; }

/* Modal "Crea rapportino" (modalCreaRapportino.php): alto quanto il form, largo fino a 1500 px. Misurato il 15/10 su uno
   schermo 2048x990: il form è alto ~920 px a qualsiasi larghezza (le sue righe dipendono dallo schermo, non dal modal); a
   1500 px sta senza scorrimento, con "Auto utilizzata" su 2 righe e la firma larga ~970 px; a 1140 (xl) sforava di poco.
   Sugli schermi più stretti si restringe da solo, con lo stesso margine di Bootstrap; sotto i 576 px resta quello di Bootstrap. */
@media (min-width: 576px) {
  .modal-rapportino { max-width: min(1500px, calc(100vw - 2 * var(--bs-modal-margin, 1.75rem))); }
}

/* Codice della commessa (GGMMSSAA, la data della commessa) nelle tendine select2 delle commesse (abzSelect2Commesse in
   js/custom.js): riquadro grigio a sinistra con cifre a larghezza fissa, così i codici stanno in colonna e le descrizioni
   partono tutte allo stesso punto. Serve a distinguere le commesse con lo stesso nome. */
.codice-commessa {
  display: inline-block;
  font-variant-numeric: tabular-nums;
  font-size: .85em;
  color: #495057;
  background-color: #E9ECEF;
  border: 1px solid #DEE2E6;
  border-radius: 4px;
  padding: 0 .4em;
  margin-right: .5em;
}
.select2-results__option--highlighted .codice-commessa { color: #212529; background-color: #FFF; border-color: #FFF; }

/* CAMPI FORM — nuovo stack (login.php + shell + modali). Scope: .app-wrapper (pagine piene),
   body.login-page (login, a sé stante), .modal-content:has(.modal-header-flat) (modali del
   nuovo stack, che vivono fuori da .app-wrapper nel DOM — usa il marcatore già presente sulla
   loro intestazione invece di aggiungere un'altra classe sul contenitore). Non tocca il vecchio
   stack, che userebbe le stesse classi generiche .form-control/.input-group-text.
   - readonly = stesso grigio di disabled (--bs-secondary-bg): di serie in Bootstrap 5 i campi
     readonly restano bianchi, a differenza dei disabled.
   - focus: border-color e box-shadow di Bootstrap 5 sono blu hardcoded (#86b7fe /
     rgba(13,110,253,.25), non legati a --bs-primary) — portati al verde ABZ con lo stesso
     rapporto di schiarimento (border ~50% verso il bianco, ombra il colore base al 25% alpha,
     stessa proporzione usata da Bootstrap per il blu).
   - input-group-text: tinta verde leggera invece del grigio di serie. */
.app-wrapper .form-control[readonly], .app-wrapper .form-select[readonly],
body.login-page .form-control[readonly], body.login-page .form-select[readonly],
.modal-content:has(.modal-header-flat) .form-control[readonly], .modal-content:has(.modal-header-flat) .form-select[readonly] {
  background-color: var(--bs-secondary-bg);
}
.app-wrapper .form-control:focus, .app-wrapper .form-select:focus,
body.login-page .form-control:focus, body.login-page .form-select:focus,
.modal-content:has(.modal-header-flat) .form-control:focus, .modal-content:has(.modal-header-flat) .form-select:focus {
  border-color: #80C09F;
  box-shadow: 0 0 0 .25rem rgba(0, 129, 62, .25);
}
.app-wrapper .input-group-text, body.login-page .input-group-text,
.modal-content:has(.modal-header-flat) .input-group-text {
  background-color: rgba(0, 129, 62, .08);
}
/* Select2 (tema bootstrap-5) non passa da .form-control/.form-select quando aperto/a fuoco:
   nasconde la <select> reale e mostra un div proprio con lo stesso blu hardcoded di Bootstrap —
   stesso identico trattamento del blocco sopra, stesso scope. */
.app-wrapper .select2-container--bootstrap-5.select2-container--focus .select2-selection,
.app-wrapper .select2-container--bootstrap-5.select2-container--open .select2-selection,
body.login-page .select2-container--bootstrap-5.select2-container--focus .select2-selection,
body.login-page .select2-container--bootstrap-5.select2-container--open .select2-selection,
.modal-content:has(.modal-header-flat) .select2-container--bootstrap-5.select2-container--focus .select2-selection,
.modal-content:has(.modal-header-flat) .select2-container--bootstrap-5.select2-container--open .select2-selection {
  /* !important: plugins/select2-bootstrap5-theme/select2-bootstrap-5-theme.min.css arriva sempre
     via $extraHeadLinks, stampato in head2.php DOPO questo file — a parita' di specificita' senza
     !important vincerebbe il blu hardcoded del tema, vanificando l'override su ogni pagina che usa
     select2 con tema bootstrap-5. */
  border-color: #80C09F !important;
  box-shadow: 0 0 0 .25rem rgba(0, 129, 62, .25) !important;
}
/* Stesso problema del blocco sopra, ma per il pannello a tendina aperto (.select2-dropdown, blu
   hardcoded anch'esso) e per il suo campo di ricerca interno quando riceve il focus. Qui niente
   prefisso .app-wrapper/body.login-page/.modal-content:has(...): select2, senza un dropdownParent
   esplicito, appende .select2-dropdown come figlio diretto di <body> (non dentro il contenitore
   della pagina che l'ha aperto), quindi quegli scope non l'avrebbero mai intercettato — la classe
   --bootstrap-5 di per se' basta a restringere la regola alle sole select2 con questo tema. */
.select2-container--bootstrap-5 .select2-dropdown {
  border-color: #80C09F !important;
}
.select2-container--bootstrap-5 .select2-dropdown .select2-search .select2-search__field:focus {
  border-color: #80C09F !important;
  box-shadow: 0 0 0 .25rem rgba(0, 129, 62, .25) !important;
}
/* Filtro data nel card-header di serviziAttivati.php: il tint verde di serie sopra si confonde
   con lo sfondo verde pieno di .card-primary .card-header — qui serve un grigio medio a contrasto. */
.input-group-filtro-header .input-group-text {
  background-color: #ADB5BD;
  color: #333;
}

/* GESTIONE CANONI — righe di collegamento con badge icona a colore pieno, dentro card
   standard (.card.card-primary + .h-100), al posto dei 7 bottoni bg-gradient di colori
   Bootstrap scollegati dal brand usati prima di questa fase. Verde ABZ per l'azione più
   operativa (Elenco canoni), le altre tonalità sono una palette scelta apposta (non i
   colori semantici Bootstrap) per restare coordinate invece che "arcobaleno". */
.hub-azione {
  display: flex;
  align-items: center;
  gap: 18px;
  padding: 20px 14px;
  border-radius: 10px;
  text-decoration: none;
  color: inherit;
  transition: background-color .15s ease;
}
.hub-azione:hover { background-color: rgba(0, 129, 62, .06); }
.hub-azione + .hub-azione { border-top: 1px solid #F6F6F6; }
.hub-azione-icona {
  width: 60px;
  height: 60px;
  border-radius: 14px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #FFF;
  flex: none;
  font-size: 26px;
}
.hub-azione-icona.hub-icona-verde		{ background-color: #00813E; }
.hub-azione-icona.hub-icona-blu			{ background-color: #3E6C93; }
.hub-azione-icona.hub-icona-rossa		{ background-color: #DC3545; }
.hub-azione-icona.hub-icona-terracotta	{ background-color: #A65D42; }
.hub-azione-icona.hub-icona-viola		{ background-color: #6E5A9E; }
.hub-azione-icona.hub-icona-ambra		{ background-color: #B37D2E; }
.hub-azione-icona.hub-icona-grigia		{ background-color: #666666; }
.hub-azione-testo { flex: 1; min-width: 0; }
.hub-azione-titolo { font-weight: 600; font-size: 19px; color: #212529; }
.hub-azione-descrizione { font-size: 15px; color: #6C757D; margin-top: 4px; line-height: 1.45; }
/* Card con più voci (Gestione canoni > Operativo): voci su due colonne affiancate, separatore solo
   tra una riga e l'altra. Decide la larghezza vera della card (container query), non quella dello
   schermo: misurato il 15/10, sotto i ~700px di card (schermi fino a ~1400px) titoli e descrizioni
   andrebbero a capo su 2-4 righe, quindi lì si resta su una colonna con il separatore di sempre. */
.hub-card-griglia { container-type: inline-size; }
@container (min-width: 700px) {
  .hub-azioni-griglia { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 8px; align-content: start; }
  .hub-azioni-griglia .hub-azione + .hub-azione { border-top: 0; }
  .hub-azioni-griglia .hub-azione:nth-child(n+3) { border-top: 1px solid #F6F6F6; }
}

/* Badge categoria (macro/micro) nel modale dettaglio canone disdetto (leggiDettaglioCanoneDisdetto.php):
   piu' leggeri dei badge standard Bootstrap (che sono font-weight: 700 di default) per restare
   un'informazione di contesto secondaria rispetto ai dati del canone sotto. */
.badge-categoria-canone { font-size: 0.95rem; font-weight: 300; }
/* Condizioni di pagamento particolari nella scheda del canone (leggiDettaglioCanone*.php): grande quanto le righe
   accanto (il badge di Bootstrap a 0.75em restava a 10,5px, misurato) e a capo se il testo è lungo. */
.badge-condizioni-pagamento { font-size: 1em; font-weight: 500; line-height: 1.4; }

/* Modal "Modifica canone" (canoni.php, caricaFormCanone.php), messo a punto nei mockup
   _mockupCanoneForm*.html prima di essere portato qui.
   Select2 dentro un input-group: Select2 assegna al proprio contenitore uno style inline
   width:100% che, con .input-group in flex-wrap:wrap (default BS5), lo fa andare a capo invece
   di affiancarsi alla prepend. Stesso trattamento che Bootstrap applica già a .form-control.
   Probabile stesso problema ovunque una Select2 sia dentro un input-group (es. gestioneUtenti.php),
   da verificare in un intervento dedicato. */
.input-group > .select2-container { width: 1% !important; flex: 1 1 auto; }
/* Tasti "cancella"/occhiolino in append: span invece di <a> (niente sottolineatura da link). */
.input-group-text-btn { cursor: pointer; }
/* Log come timeline con badge per campo cambiato, al posto di una textarea col testo grezzo. */
.timeline-log { max-height: 220px; overflow-y: auto; }
.timeline-log .timeline-log-item { background: #fff; border: 1px solid #dee2e6; border-left: 3px solid #00813E; border-radius: .375rem; margin-bottom: .5rem; padding: .5rem .75rem; }
.timeline-log .timeline-log-item.timeline-log-sistema { border-left-color: #6c757d; }
/* TICKET — bordo colorato per tipo di azione (dopo .timeline-log-sistema apposta: sulle righe di
   sistema di un tipo mappato, es. riapertura automatica da cron, il colore per tipo deve prevalere
   sul grigio generico, a parità di specificità CSS). */
.timeline-log .timeline-log-item.timeline-log-success   { border-left-color: var(--bs-success); }
.timeline-log .timeline-log-item.timeline-log-warning   { border-left-color: var(--bs-warning); }
.timeline-log .timeline-log-item.timeline-log-secondary { border-left-color: var(--bs-secondary); }
.timeline-log .timeline-log-item.timeline-log-info      { border-left-color: var(--bs-info); }
/* Messaggi scritti dal cliente su yourABZ: blu, per distinguerli a colpo d'occhio dalle annotazioni di AB Z */
.timeline-log .timeline-log-item.timeline-log-cliente   { border-left-color: #1F4E9D; background: rgba(31, 78, 157, .06); }
.badge-cliente-ticket { background: #1F4E9D; color: #FFF; }
.timeline-log .timeline-log-head { align-items: center; display: flex; gap: .5rem; margin-bottom: .35rem; }
.timeline-log .timeline-log-autore { font-weight: 600; }
.timeline-log .timeline-log-badges { display: flex; flex-wrap: wrap; gap: .35rem; }
.timeline-log .badge { font-weight: 400; }
/* TICKET — badge più leggeri e leggermente più grandi nel modal di dettaglio (intestazione +
   timeline), al posto del font-weight 700 di default dei badge Bootstrap. */
#modalDettaglioTicket .badge { font-weight: 300; font-size: 0.95rem; }

/* CHIUSURE AZIENDALI CICLICHE — i 2 flatpickr "solo giorno+mese" (nuovaChiusuraAziendale.php,
   modificaChiusuraAziendale.php) usano un anno interno solo di appoggio, mai salvato: si nasconde
   lo spinner dell'anno nell'intestazione del calendario per non mostrare un dato irrilevante. */
.flatpickr-calendar.flatpickr-solo-giorno-mese .flatpickr-current-month .numInputWrapper { display: none; }

/* GESTIONE CAUSALI USATE — card cliccabili per selezionare le causali da azzerare (l'intera card è
   una <label> che avvolge la checkbox nascosta, click ovunque sulla card la attiva/disattiva). */
.causale-card { cursor: pointer; border: 2px solid #dee2e6; transition: border-color .15s, background-color .15s; }
.causale-card.selected { border-color: #00813E; background-color: rgba(0, 129, 62, .08); }
.causale-check-icon { color: #adb5bd; transition: color .15s; }
.causale-card.selected .causale-check-icon { color: #00813E; }
/* CREA FATTURE — campo ricerca causali: un quarto della larghezza da desktop (lg, 992px) in su,
   piena larghezza da tablet in giù. Bootstrap 5 non ha classi w-* responsive native (a differenza
   di es. d-md-none), da qui la media query scoped invece di una utility. */
#search { width: 25%; }
@media (max-width: 991.98px) {
  #search { width: 100%; }
}
#ticketTabContent .badge { font-weight: 300; font-size: 0.85rem; }

/* MODAL SEDI AGGIUNTIVE — evidenziazione temporanea della card appena modificata (aggiunta e
   rimossa via classe da JS in inserisciCardSedeInLista/aggiornaCardSedeInLista, index.php e
   dettaglioRubrica.php), hover leggero al passaggio del mouse, e link/icona in verde ABZ (il
   progetto non ha --bs-success sovrascritto al verde ABZ, quindi niente riuso di .text-success:
   servirebbe comunque il colore esplicito). La transition sta sulla regola base (non su quella
   con la classe/hover) per avere un fade morbido sia in entrata sia in uscita. */
.sede-card .card { transition: background-color 1s ease; }
.sede-card.sede-card-aggiornata .card { background-color: #d4edda; }
.sede-card .card:hover { background-color: #f8f9fa; }
.sede-card .sede-verde-abz { color: #00813E; }
.sede-card a.sede-verde-abz:hover { color: #00612e; }

/* GESTIONE CHECKLIST — editor template (checklistTemplate.php): layout master-detail (sezioni a
   sinistra, domande della sezione selezionata a destra), messo a punto nei mockup di design prima
   di essere portato qui. Tutte le regole sono scoped con prefisso .checklist-* per non toccare
   altre pagine. */
.checklist-sec-item { display: flex; align-items: center; gap: 10px; border-left: 3px solid transparent; }
.checklist-sec-item.checklist-sec-item-attiva { background-color: rgba(0, 129, 62, .08); border-left-color: #00813E; }
.checklist-sec-item.checklist-sec-item-attiva .checklist-sec-num { background-color: #00813E; color: #FFF; }
.checklist-sec-item.checklist-sec-item-attiva span.fw-medium { color: #0a5c2c; }
/* Numero d'ordine sezione: sostituisce l'icona generica sia in sidebar (cerchio grigio/verde) sia
   nell'intestazione del pannello (cerchio bianco traslucido su sfondo verde), cosi' l'ordine delle
   sezioni e' sempre visibile senza dover aprire ogni pannello. */
.checklist-sec-num { width: 24px; height: 24px; border-radius: 50%; background: #eef0f2; color: #6c757d; display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: .75rem; font-weight: 700; }
.checklist-panel-num { width: 26px; height: 26px; border-radius: 50%; background: rgba(255, 255, 255, .22); color: #FFF; display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: .75rem; font-weight: 700; }

.checklist-card-title { font-size: 1.25rem; font-weight: 700; color: #00813E; margin-bottom: .25rem; }

.checklist-type-chip { width: 34px; height: 34px; border-radius: .5rem; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.checklist-type-scelta  { background: #eef2ff; color: #4338ca; }
.checklist-type-sinonno { background: #eafaf1; color: #0a8a4a; }
.checklist-type-testo   { background: #f1f3f5; color: #495057; }
.checklist-type-data    { background: #fef3e2; color: #b45309; }
.checklist-type-numero  { background: #fdeaea; color: #b42318; }

.checklist-opt-pill { font-size: .75rem; background: #f1f3f5; color: #495057; border: 1px solid #dee2e6; border-radius: 999px; padding: 2px 9px; }
/* Badge + anteprima opzioni (checklistTemplate.php) sulla stessa riga: altezza limitata a una sola
   riga anche in caso limite (tante opzioni, viewport stretto), cosi' le domande "a scelta" restano
   sempre alte come le altre invece di crescere con un a-capo interno. */
.checklist-domanda-badge-row { max-height: 24px; overflow: hidden; }

/* GESTIONE CHECKLIST — griglia cliente (checklistCliente.php): card con due azioni distinte nel
   footer (non più l'intera card cliccabile), e progress bar del conteggio risposte (Bootstrap la
   colorerebbe di blu di default, --bs-progress-bar-bg non è mai stato riallineato al verde ABZ). */
.checklist-cliente-card { border: 1px solid #dee2e6; transition: border-color .15s, box-shadow .15s; }
.checklist-cliente-card:hover { border-color: #00813E; box-shadow: 0 .25rem .75rem rgba(0, 129, 62, .12); }
.checklist-progress { --bs-progress-bar-bg: #00813E; }
/* Indicatore di completamento a "linea con pallini e pillola scorrevole" (modal compilazione,
   sidebar sezioni, e card griglia cliente): sempre su sfondo bianco, mai a filo con un header
   colorato, per evitare che il segmento verde si confonda con lo sfondo (vedi CLAUDE_DEVLOG). */
.checklist-percentuale-linea { position: relative; height: 40px; }
.checklist-percentuale-pallino-iniziale,
.checklist-percentuale-pallino-finale {
  position: absolute; top: 50%; width: 12px; height: 12px; border-radius: 50%;
  border: 2px solid #00813E; background: #fff; transform: translateY(-50%); z-index: 1;
}
.checklist-percentuale-pallino-iniziale { left: 0; }
.checklist-percentuale-pallino-finale { right: 0; background: #00813E; }
.checklist-percentuale-traccia {
  position: absolute; top: 50%; left: 12px; right: 12px; height: 3px;
  background: #dee2e6; border-radius: 2px; overflow: hidden; transform: translateY(-50%);
}
.checklist-percentuale-riempimento {
  position: absolute; top: 0; left: 0; height: 100%; width: 0%;
  background: #00813E; border-radius: 2px; transition: width .25s ease;
}
/* La pillola segue la variabile --p (percentuale 0-100, impostata inline): a 0% sta a sinistra, a 50% al centro, a 100% con il
   bordo destro a filo della linea (prima la posizione era bloccata tra 12 e 88 e a 100% non arrivava a destra). */
.checklist-percentuale-pillola {
  position: absolute; top: 50%; left: calc(var(--p, 50) * 1%); transform: translate(calc(var(--p, 50) * -1%), -50%);
  background: #fff; border: 2px solid #00813E; color: #00813E; font-weight: 700;
  font-size: .72rem; line-height: 1; padding: .3rem .55rem; border-radius: 999px;
  white-space: nowrap; box-shadow: 0 1px 3px rgba(0, 0, 0, .15); z-index: 2;
  transition: left .25s ease, transform .25s ease;
}
/* Mini transizione al cambio sezione nel modal di compilazione (mostraSezione()): il pannello che
   entra scorre da destra se si avanza, da sinistra se si torna indietro — direzione scelta
   confrontando l'indice del pannello di destinazione con quello attualmente visibile. */
@keyframes checklistEntraDaDestra { from { opacity: 0; transform: translateX(26px); } to { opacity: 1; transform: translateX(0); } }
@keyframes checklistEntraDaSinistra { from { opacity: 0; transform: translateX(-26px); } to { opacity: 1; transform: translateX(0); } }
.checklist-entra-da-destra { animation: checklistEntraDaDestra .28s ease-out; }
.checklist-entra-da-sinistra { animation: checklistEntraDaSinistra .28s ease-out; }
@media (prefers-reduced-motion: reduce) {
  .checklist-entra-da-destra, .checklist-entra-da-sinistra { animation: none; }
}
/* Footer diviso in due metà cliccabili: sinistra verde "Compila"/"Rivedi risposte" (azione
   primaria), destra grigio scuro "Versioni" (storico). Stessa altezza, stesso peso tipografico. */
.checklist-cliente-card-footer { border-top: none; overflow: hidden; }
.checklist-footer-compila,
.checklist-footer-versioni {
  flex: 1 1 50%; display: flex; align-items: center; justify-content: center; gap: 8px;
  padding: .6rem .5rem; border: none; font-weight: 700; font-size: .85rem; cursor: pointer;
  transition: background-color .15s;
}
.checklist-footer-compila { background: #00813E; color: #FFF; }
.checklist-footer-compila:hover { background: #046b34; }
.checklist-footer-compila i { transition: transform .15s; }
.checklist-footer-compila:hover i { transform: translateX(3px); }
.checklist-footer-versioni { background: #495057; color: #FFF; border-left: 1px solid rgba(255, 255, 255, .15); }
.checklist-footer-versioni:hover { background: #343a40; }
.checklist-versione-badge { font-size: .78rem; color: #6c757d; font-weight: 500; }

/* GESTIONE CHECKLIST — compilazione cliente (caricaChecklistClienteCompilazione.php): riga
   domanda a 3 colonne (icona tipo, etichetta a larghezza fissa uguale su tutte le righe, controllo
   che si espande) invece di etichetta sopra/controllo sotto. Sotto i 576px si impila in verticale. */
.checklist-domanda-row { display: flex; align-items: flex-start; gap: 14px; }
.checklist-domanda-etichetta { flex: 0 0 220px; max-width: 220px; font-weight: 500; padding-top: 5px; }
.checklist-domanda-controllo { flex: 1 1 auto; min-width: 0; }
@media (max-width: 575.98px) {
  .checklist-domanda-row { flex-wrap: wrap; }
  .checklist-domanda-etichetta { flex-basis: 100%; max-width: 100%; padding-top: 0; }
  .checklist-domanda-controllo { flex-basis: 100%; }
}
/* Il radio/checkbox globale (custom.css, regola .form-check-input più sopra) è ingrandito a
   1.2em ma mantiene il margin-top calcolato da Bootstrap per la dimensione base 1em, risultando
   leggermente disallineato rispetto al testo dell'etichetta. Fix scoped qui (non sulla regola
   globale, per non toccare checkbox/radio di altre pagine): centratura via flex invece che a margine. */
.checklist-domanda-controllo .form-check-inline { display: inline-flex; align-items: center; }
.checklist-domanda-controllo .form-check-input { margin-top: 0; }
.checklist-domanda-controllo .form-check-label { margin-left: .4rem; }

/* GESTIONE CHECKLIST — indicatore di avanzamento fisso nel footer del modal (checklistCliente.php):
   testo "Sezione X di Y" + barra + pallini cliccabili per saltare direttamente a qualunque sezione.
   Il footer (a differenza del contenuto del pannello) non scorre via, resta sempre visibile.
   I due bottoni ai lati ("Sezione precedente" e "Sezione successiva"/"Salva risposte", che si
   alternano) hanno la stessa min-width: non un valore fisso, ma una custom property calcolata a
   runtime da uniformaLarghezzaBottoniFooterChecklist() (checklistCliente.php) sul più largo dei tre
   bottoni realmente renderizzati. Cosi' restano sempre identici in larghezza anche se in futuro
   cambia un testo o la dimensione del font, e il blocco centrale — che continua a occupare tutto lo
   spazio residuo via classe Bootstrap flex-grow-1 in HTML, come in origine — risulta centrato in
   ogni sezione senza bisogno di un layout a griglia. */
#modalChecklistCliente .checklist-sezione-precedente,
#modalChecklistCliente .checklist-sezione-successiva,
#modalChecklistCliente #btnSalvaRisposteChecklistModal { min-width: var(--checklist-footer-btn-width, 0); }
.checklist-avanzamento-sezioni { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.checklist-avanzamento-testo { display: flex; justify-content: space-between; width: 100%; max-width: 360px; font-size: .78rem; color: #6c757d; }
.checklist-avanzamento-barra { width: 100%; max-width: 360px; height: 6px; }
.checklist-avanzamento-pallini { position: relative; display: flex; align-items: center; gap: 14px; }
.checklist-avanzamento-pallini::before { content: ''; position: absolute; top: 50%; left: 6%; right: 6%; height: 2px; background: #dee2e6; transform: translateY(-50%); z-index: 0; }
.checklist-avanzamento-pallino { position: relative; z-index: 1; width: 22px; height: 22px; border-radius: 50%; border: 2px solid #dee2e6; background: #fff; color: #6c757d; font-size: .68rem; font-weight: 700; padding: 0; display: flex; align-items: center; justify-content: center; cursor: pointer; }
.checklist-avanzamento-pallino.completata { border-color: #00813E; color: #066b34; background: #e3f3ea; }
.checklist-avanzamento-pallino.corrente { border-color: #00813E; background: #00813E; color: #FFF; }

/* GESTIONE CHECKLIST — storico/versioning: header del modal di compilazione distinto quando si
   visualizza una versione ARCHIVIATA (sola lettura), per non farla scambiare per quella viva. Righe
   con differenze nella tabella di confronto tra due versioni (confrontaVersioniChecklist.php). */
.checklist-modal-header-archiviata { background-color: #6c757d !important; }
.checklist-confronto-diff { background-color: #ffc107 !important; color: #212529 !important; font-weight: 600; }
.checklist-readonly-banner { border-left: 4px solid #6c757d; }

/* Bottoni di export Word/PDF della checklist (checklistCliente.php, checklistTemplate.php): colori
   riconoscibili delle rispettive app Office invece del verde/rosso generici di Bootstrap. Piena,
   mai outline (convenzione del progetto). */
.btn-word { background-color: #2B579A; border-color: #2B579A; color: #FFF; }
.btn-word:hover, .btn-word:focus { background-color: #204272; border-color: #204272; color: #FFF; }

/* Colore di brand per il PDF (linea guida colori azioni, vedi CLAUDE_DEVLOG.md): rosso dedicato,
   distinto da btn-danger, cosi' come .btn-word e' distinto da btn-primary. */
.btn-pdf { background-color: #ED1C24; border-color: #ED1C24; color: #FFF; }
.btn-pdf:hover, .btn-pdf:focus { background-color: #BD161D; border-color: #BD161D; color: #FFF; }

/* Colore di brand per l'Excel (stessa linea guida): verde Excel, distinto dal verde di brand del
   sito e da btn-success (mai un secondo "verde generico" nella stessa famiglia). */
.btn-excel { background-color: #217346; border-color: #217346; color: #FFF; }
.btn-excel:hover, .btn-excel:focus { background-color: #195934; border-color: #195934; color: #FFF; }

/* FAQ (faq.php): tabella DataTables vera, stessa struttura di chiusureAziendali.php (e di ogni
   altra DataTable del progetto) invece dell'elenco custom usato nelle iterazioni precedenti —
   niente più righe/colonne fatte a mano, ricerca/ordinamento/paginazione nativi. Badge categoria
   più grande del badge Bootstrap di default, colorato come .alert-secondary (stesse variabili
   "-subtle"/"-emphasis" di Bootstrap 5.3, condivise tra alert e badge/testo "subtle"). Padding
   orizzontale aumentato rispetto al default di .table-sm (che lo riduce a .3rem), solo left/right:
   il verticale resta quello compatto di table-sm. */
#tabellaFaq.table-sm > :not(caption) > * > * { padding-left: 1rem; padding-right: 1rem; }
/* Solo tbody: il className del columnDefs va sulle <td>, ma per sicurezza scopo comunque la regola
   a tbody così l'intestazione "Data" resta identica alle altre anche se DataTables/il tema
   dovessero in futuro propagare la classe anche alla <th>. */
#tabellaFaq tbody .faq-col-data { font-size: .8rem; color: #6c757d; }
/* Badge "lungo al massimo": riempie tutta la larghezza della cella (invece di restare stretto al
   proprio testo) cosi' tutti i badge della colonna appaiono della stessa larghezza, con il testo
   centrato al suo interno. */
.faq-badge-categoria { font-size: .8rem; padding: .4em .7em; font-weight: 400; display: block; width: 100%; text-align: center; }
/* Sulle colonne "shrink" (Data/Categoria) l'icona di ordinamento del tema (.dt-column-order,
   posizionata in absolute con right:.25rem) resta incollata al testo perche' la cella e' larga
   solo quanto il contenuto, senza margine per staccarla visivamente. Spostata oltre il bordo della
   cella solo in questa tabella, invece di allargare le colonne (che vanificherebbe lo shrink). */
#tabellaFaq .dt-column-order { right: -10px; }
/* Vista sola lettura FAQ (caricaVisualizzaFaq.php, dentro il modal-xl #modalVisualizzaFaq):
   intestazione a banda verde chiaro a tutta larghezza del modal-body. Il padding di Bootstrap
   su .modal-body va azzerato qui perche' altrimenti lascerebbe un margine laterale che
   impedirebbe alla banda di arrivare fino al bordo del modal; categoria/data e corpo del testo
   gestiscono il proprio padding separatamente sotto. */
#modalBodyVisualizzaFaq { padding: 0; }
.faq-visualizza-banda { background-color: rgba(0, 129, 62, .1); border-bottom: 1px solid rgba(0, 129, 62, .25); padding: 1rem 2rem; display: flex; align-items: center; gap: .5rem; }
.faq-visualizza-categoria { font-family: 'Kanit', system-ui, sans-serif; font-size: .875rem; font-weight: 600; color: #00813E; }
.faq-visualizza-separatore { color: #00813E; opacity: .5; }
.faq-visualizza-data { font-size: .8125rem; color: #3d6b52; }
.faq-visualizza-corpo { padding: 1.5rem 2rem; }

/* Select2 dentro un .input-group (es. filtro/campo categoria FAQ, faq.php + caricaFormFaq.php):
   senza queste regole il widget non eredita il comportamento flex di .form-select/.form-control
   (flex:1 1 auto, width:1%) e non si allinea correttamente accanto a .input-group-text, oltre a
   restare con angoli arrotondati su entrambi i lati invece che solo a destra. Classe generica,
   riusabile ovunque un select2 debba stare dentro un input-group con icona. */
.select2-input-group .select2-container--bootstrap-5 { flex: 1 1 auto; width: 1% !important; }
.select2-input-group .select2-container--bootstrap-5 .select2-selection { border-top-left-radius: 0; border-bottom-left-radius: 0; }
.text-word { color: #2B579A !important; }
a.text-word:hover { color: #204272 !important; }

/* .btn-primary non era mai stato ridichiarato nel progetto (nessuna pagina attiva lo usava finora)
   — stesso problema già visto per .card-primary/pagination/select2 sopra: le variabili del
   componente sono hardcoded blu (--bs-btn-bg:#0d6efd) e non seguono l'override di --bs-primary.
   Fix generico e riusabile: qualunque .btn-primary sulle pagine sul nuovo stack eredita il verde. */
body.bg-body-tertiary .btn-primary {
  --bs-btn-bg: #00813E;
  --bs-btn-border-color: #00813E;
  --bs-btn-hover-bg: #006E35;
  --bs-btn-hover-border-color: #006E35;
  --bs-btn-active-bg: #006E35;
  --bs-btn-active-border-color: #006E35;
  --bs-btn-disabled-bg: #00813E;
  --bs-btn-disabled-border-color: #00813E;
  --bs-btn-focus-shadow-rgb: 38, 148, 91;
}
/* Jodit (editor risposta FAQ, faq.php/caricaFormFaq.php): il bottone primario dei suoi popup (es.
   "Inserisci" nel popup link) è hardcoded blu (#007bff) direttamente nella regola CSS del tema,
   nessuna custom property da ridichiarare come per gli altri fix sopra — serve !important perché
   il popup è appeso a <body>, fuori da qualunque scope della pagina, e la regola del tema ha la
   stessa specificità di una scoperta qui. */
.jodit-ui-button_variant_primary {
  background-color: #00813E !important;
}
.jodit-ui-button_variant_primary:hover:not([disabled]) {
  background-color: #006E35 !important;
}
/* Badge contatore dentro le nav-pills (es. gestioneBlocchi.php). Il badge di Bootstrap è allineato alla
   baseline del testo e risultava ~1px più in basso di icona e testo: con il link in inline-flex tutti e
   tre si centrano sullo stesso asse. .badge-pill-conteggio: verde brand sulla pill bianca, invertito
   (bianco con testo verde) sulla pill attiva, dove il verde sparirebbe nello sfondo. */
.nav-pills .nav-link:has(> .badge) {
  display: inline-flex;
  align-items: center;
}
.nav-pills .nav-link .badge-pill-conteggio {
  background-color: var(--bs-primary);
  color: #fff;
}
.nav-pills .nav-link.active .badge-pill-conteggio {
  background-color: #fff;
  color: var(--bs-primary);
}

/* Card unica nella pagina: riempie l'altezza visibile fino al footer, a qualsiasi dimensione di
   finestra (niente altezze fisse: app-main di AdminLTE e' gia' un flex a colonna che arriva al
   footer, qui lo spazio viene passato giu' fino alla card). Vale solo se la card e' l'unico elemento
   dentro .container-fluid: pagine con piu' card, righe/griglie o altri blocchi non cambiano. */
.app-main > .app-content:has(> .container-fluid > .card:only-child) {
  flex: 1 0 auto;
  display: flex;
  flex-direction: column;
}
.app-main > .app-content > .container-fluid:has(> .card:only-child) {
  flex: 1 0 auto;
  display: flex;
  flex-direction: column;
}
.app-main > .app-content > .container-fluid > .card:only-child {
  flex: 1 0 auto;
  /* app-main ha gia' 12px di padding sotto: 12 + 12 = 24px, come lo spazio sopra la card */
  margin-bottom: .75rem !important;
}

/* PAGINA 404 (404.php, ErrorDocument in .htaccess) — bozza "I cubi dormono" scelta dall'utente il
   2026-09-28: i tre cubi del logo galleggiano sfasati sopra la fascia verde, dalla Z escono delle "z".
   Posizioni in percentuale ricavate dal logo (cubi larghi 150 su 900, fascia al 54,6% dell'altezza),
   così la scena si ridimensiona da sola. Unico bottone outline del sito ("Torna indietro"), chiesto
   esplicitamente dall'utente. Chi ha "riduci movimento" attivo vede la scena ferma. */
body.pagina-404 { min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1.75rem; padding: 2rem 1rem; text-align: center; position: relative; }
/* Sfondo della 404: sempre verde, anche in yourABZ (non segue il colore della ditta). Base color menta
   in sfumatura verticale, due aloni verdi sfocati che si spostano e "respirano" lentissimi (18 s, in
   tono con i cubi che dormono) e un alone chiaro dietro la fascia. Fermi con "riduci movimento". */
body.pagina-404.bg-body-tertiary { background: linear-gradient(180deg, #F4F7F5 0%, #E6F3EC 100%) fixed !important; overflow-x: hidden; }
body.pagina-404 > * { position: relative; z-index: 1; }
body.pagina-404::before, body.pagina-404::after { content: ""; position: fixed; z-index: 0; border-radius: 50%; filter: blur(60px); pointer-events: none; animation: alone-404 18s ease-in-out infinite; }
body.pagina-404::before { width: 46vw; height: 46vw; left: -12vw; top: -14vw; background: rgba(0, 131, 62, .22); }
body.pagina-404::after { width: 40vw; height: 40vw; right: -10vw; bottom: -14vw; background: rgba(111, 207, 154, .35); animation-delay: -9s; }
@keyframes alone-404 { 0%, 100% { transform: translate(0, 0) scale(1); } 50% { transform: translate(4vw, 3vw) scale(1.12); } }
.scena-404::before { content: ""; position: absolute; left: 12%; right: 12%; top: 5%; bottom: -10%; z-index: -1; background: radial-gradient(ellipse at center, rgba(255, 255, 255, .85) 0%, rgba(255, 255, 255, 0) 70%); pointer-events: none; }
@media (prefers-reduced-motion: reduce) { body.pagina-404::before, body.pagina-404::after { animation: none; } }
.scena-404 { position: relative; width: min(900px, 100%); aspect-ratio: 900 / 240; }
.scena-404 .fascia-404 { position: absolute; left: 0; right: 0; top: 54.58%; height: 21.25%; background: linear-gradient(90deg, rgba(0, 131, 62, 0) 0%, #00833E 12%, #00833E 88%, rgba(0, 131, 62, 0) 100%); }
.scena-404 .cubo-404 { position: absolute; top: 27.9%; width: 16.67%; animation: cubo-404-fluttua 3.2s ease-in-out infinite; }
.scena-404 .cubo-404 img { display: block; width: 100%; height: auto; }
.scena-404 .cubo-404-a { left: 32.22%; }
.scena-404 .cubo-404-b { left: 47.33%; animation-delay: -1.05s; }
.scena-404 .cubo-404-z { left: 67%; animation-delay: -2.1s; }
@keyframes cubo-404-fluttua { 0%, 100% { transform: translateY(0) rotate(-2deg); } 50% { transform: translateY(-10.7%) rotate(2deg); } }
.scena-404 .zeta-404 { position: absolute; left: 82.2%; top: 16.7%; font-family: 'Kanit', sans-serif; font-weight: 600; color: #00813E; font-size: clamp(1rem, 2.4vw, 1.9rem); opacity: 0; animation: zeta-404-sale 4.5s ease-in infinite; }
/* Le "z" escono da tutti e tre i cubi, sfasate (ritardi nel markup): vicino allo spigolo in alto a destra di ognuno */
.scena-404 .zeta-404-a { left: 46.5%; }
.scena-404 .zeta-404-b { left: 61.5%; }
.scena-404 .zeta-404-2 { margin: .6rem 0 0 .6rem; font-size: clamp(1.2rem, 3vw, 2.4rem); }
.scena-404 .zeta-404-3 { margin: .25rem 0 0 -.4rem; font-size: clamp(.9rem, 2vw, 1.6rem); }
@keyframes zeta-404-sale { 0% { transform: translate(0, 0) scale(.6); opacity: 0; } 20% { opacity: 1; } 100% { transform: translate(50px, -110px) scale(1.3); opacity: 0; } }
body.pagina-404 .etichetta-404 { font-family: 'Kanit', sans-serif; font-weight: 600; font-size: .95rem; letter-spacing: .2em; text-transform: uppercase; color: #00813E; }
body.pagina-404 h1 { font-family: 'Kanit', sans-serif; font-weight: 600; font-size: clamp(2rem, 4vw, 2.9rem); line-height: 1.1; margin: .5rem 0 .75rem; color: var(--bs-emphasis-color); }
body.pagina-404 .testo-404 { font-size: 1.1rem; color: var(--bs-secondary-color); max-width: 560px; margin: 0 auto; }
body.pagina-404 .btn-404 { border-width: 2px; font-weight: 700; padding: .7rem 1.5rem; }
body.pagina-404 .btn-404-indietro { --bs-btn-color: #00813E; --bs-btn-border-color: #00813E; --bs-btn-hover-color: #FFF; --bs-btn-hover-bg: #00813E; --bs-btn-hover-border-color: #00813E; --bs-btn-active-color: #FFF; --bs-btn-active-bg: #006E35; --bs-btn-active-border-color: #006E35; }
@media (prefers-reduced-motion: reduce) { .scena-404 .cubo-404 { animation: none; } .scena-404 .zeta-404 { animation: none; opacity: .6; } }
/* Menu in alto: il menu di myABZ ha 7 voci e ha bisogno di circa 1450 px. Il menu esteso parte da 1200 px (navbar-expand-xl in header.php), sotto c'è
   l'hamburger; tra 1200 e 1499 px le voci si stringono (meno spazio e testo un filo più piccolo) così non compare lo scorrimento orizzontale sui portatili. */
@media (min-width: 1200px) and (max-width: 1499.98px) {
  .app-header .navbar-nav { gap: .15rem; }
  .app-header .navbar-nav .nav-link { padding-inline: .5rem; font-size: .85rem; }
  .app-header .navbar-nav .nav-link i { margin-right: .35rem !important; }
}

/* calendarioRapportini.php — la barra sopra il calendario (sincronizza / calendario di / legenda)
   è una griglia a 3 colonne con grid-template-columns inline: sotto md non ci sta, quindi si
   mette in colonna (!important per battere lo style inline) e il selettore utente va a piena larghezza. */
@media (max-width: 767.98px) {
  .calendario-barra { grid-template-columns: 1fr !important; }
  .calendario-barra > div { justify-self: stretch !important; }
  .calendario-barra > div .btn { width: 100%; }
  .calendario-barra form { flex-wrap: wrap; }
  .calendario-barra form .select2-container { width: 100% !important; flex: 1 1 100%; }
}

/* canoniStatistiche.php — titoli di sezione a pillola (KPI, Classifiche, Marginalità...): 2rem su desktop; sotto sm il testo può andare a capo
   e il carattere si riduce, altrimenti "Marginalità / economics" sfora la pagina a 414 px. */
.badge-sezione { font-size: 2rem; white-space: normal; text-align: left; }
@media (max-width: 575.98px) {
  .badge-sezione { font-size: 1.35rem; }
}

/* importaCalendarioOutlook.php — riepilogo del caricamento (js/importaCalendarioOutlook.js): giorno e ora a larghezza
   fissa, così l'oggetto parte alla stessa altezza in tutti i pannelli (misurati a 14px: data più larga "dom …" 110px,
   "Tutto il giorno" 87px, più i 20px di margine della cella). Sotto sm giorno e ora su una riga in grigio e l'oggetto
   sotto a tutta larghezza, altrimenti a 390px l'oggetto va a capo a ogni parola (!important per battere pe-3 e il
   padding delle celle di .table-sm). */
.riepilogoOutlook .colGiorno { width: 9.5em; }
.riepilogoOutlook .colOra { width: 7.75em; }
@media (max-width: 575.98px) {
  .riepilogoOutlook tr { display: flex; flex-wrap: wrap; column-gap: .5rem; padding: .25rem 0; }
  .riepilogoOutlook td { padding: 0 !important; }
  .riepilogoOutlook td.colGiorno, .riepilogoOutlook td.colOra { width: auto; color: var(--bs-secondary-color); }
  .riepilogoOutlook td:last-child { flex-basis: 100%; }
}
