@charset "UTF-8";
/**
 * ============================================================================
 * CANOPO 2026 - Stylesheet principale v70 (Enterprise DS + WCAG AA + Mobile Kit)
 * ============================================================================
 *
 * v70 CHANGELOG (2026-09-14):
 * - skSidebar: un solo contenitore scroll sulla spalla
 *   (.div_MenuLeftSideBar_Principale / .sk-sidebar). #navigationVertical e
 *   .containerVertical non sono piu' position:fixed, cosi' le voci lunghe
 *   restano raggiungibili sulla viewport.
 *
 * v69 CHANGELOG (2026-08-28):
 * - #ui-datepicker-div sopra l'header sticky della SkGrid (CMCNP-2060).
 *
 * v68 CHANGELOG (2026-07-31):
 * - Nei gruppi richiudibili della spalla l'accento arancio è ora limitato al
 *   titolo: non crea più una barra verticale continua lungo le voci figlie.
 *
 * v67 CHANGELOG (2026-07-31):
 * - Esteso .sk-sidebar-section con gruppi richiudibili nativi tramite
 *   <details>/<summary>: stato iniziale aperto, indicatore e focus accessibile.
 * - Il componente resta additivo: il titolo viene emesso dal template solo
 *   quando almeno una voce della sezione è autorizzata.
 *
 * v66 CHANGELOG (2026-07-31):
 * - Aggiunto il componente additivo .sk-sidebar-section per organizzare
 *   semanticamente la spalla sinistra in gruppi brevi e riconoscibili.
 * - Intestazioni coerenti con il Design System Canopo: testo primary,
 *   accento arancio, tipografia XS e allineamento alle voci esistenti.
 * - Nessuna modifica agli stili, agli stati o al markup dei menu esistenti.
 *
 * v65 CHANGELOG (2026-07-21):
 * - Attivato il WOFF2 locale di Good Times mantenendo i fallback legacy.
 *
 * v64 CHANGELOG (2026-07-20):
 * - Bonificate le transizioni delle tile e dei pulsanti avanzati con stati hover locali.
 *
 * v63 CHANGELOG (2026-07-20):
 * - Restringimento delle transizioni dei pulsanti base e submit alle proprietà effettivamente animate.
 *
 * v62 CHANGELOG (2026-07-20):
 * - Bonificate le prime transizioni `all` con proprietà visive esplicite.
 *
 * v61 CHANGELOG (2026-07-20):
 * - Ripristinata la semantica HTML di hidden per .sk-notice.
 * - Corretto il token non definito dello stato attivo legenda scheduler.
 * - prefers-reduced-motion mantiene gli indicatori di caricamento statici.
 * - Limitate le transizioni dei controlli form alle proprieta' visive attese.
 * - Rimossi gli override dark globali dei token nudi on/no/closed/empty/alt:
 *   nessun consumer calendario; collisioni documentate con componenti moderni.
 *
 * v58 CHANGELOG (2026-04-20):
 *
 * Modernizzazione loader full-page (sezione 26): sostituito spinner.gif con
 * Conic ring CSS-only (V2). Zero impatto sulle pagine: markup invariato
 * (<div class="spinner"></div>) e API JS invariata (body.classList.add('loading'),
 * spinnerStart/spinnerStop).
 *
 * [SEZIONE 26 RIDISEGNATA]
 * - .spinner: ora flex container con backdrop bianco 78% (era 80% con GIF)
 * - .spinner::before: anello rotante via conic-gradient + radial mask,
 *   48x48px, 1s linear infinite, gradient brand-primary -> brand-accent
 *   (zero asset esterni, zero richieste HTTP, theming automatico)
 * - .spinner::after: etichetta "Caricamento" multilingua via :lang() CSS
 *   (it/en/fr/de/es/pt) - richiede sk-core.js v1.10+ per fallback
 *   navigator.language quando <html lang> non e' impostato server-side
 * - @keyframes sk-spinner-spin: nome distinto da @keyframes spin esistente
 *   (usato da .loaderChart) per evitare collisioni
 *
 * [INVARIATO IN SEZIONE 26]
 * - body.loading / body.loading .spinner (selettori invariati)
 * - #overlay, #overlayModal, #progressbar, #status, .loaderChart
 * - @keyframes spin (usato da .loaderChart, mantenuto)
 *
 * [REDUCED MOTION]
 * Override globale gia' presente (riga ~9697) gestisce automaticamente
 * .spinner::before. Nessun override locale necessario: con reduced-motion
 * l'anello resta visibile statico (conic-gradient e' una proprietà CSS,
 * non un'animazione) - feedback "loading in corso" preservato.
 *
 * v57 CHANGELOG (2026-04-19):
 *
 * Refactor retrocompatibile - nessun selettore rimosso, solo additivo:
 *
 * [VARIABILI NUOVE]
 * - Chart palette estesa: --chart-1-light/-dark ... --chart-7-light/-dark
 *   (per stacked/grouped/hover senza ricorrere a hex hardcoded)
 * - Stato shade: --color-success-dark, --color-warning-dark, --color-error-dark
 *   --color-success-tint, --color-warning-tint, --color-error-tint
 * - Brand danger tint: --brand-danger-light, --brand-danger-tint
 * - Alpirisch stati: --alpirisch-nuovo-bg/-border/-hover-bg/-hover-border (x4 stati)
 * - Button shade neutri: --btn-hover-bg-start/-end, --btn-active-bg-start/-end
 * - Mobile layout: --sk-mobile-drawer-w, --sk-mobile-bottom-nav-h,
 *   --sk-mobile-breakpoint, --sk-mobile-touch-target
 *
 * [SOSTITUZIONI HEX -> VAR (zero impatto visivo)]
 * - Sezione 35.2 alpirisch (L4208-4242): 16 hex -> var(--alpirisch-*)
 * - Sezione 35.3 sk-btn base hover/active (L4350, L4357): 4 hex -> var
 * - Sezione 35.4 sk-btn--success/warning/danger: 12 hex -> var(--color-*-dark/-tint)
 * - Chart kit: riferimenti a shade via var(--chart-N-light/dark)
 *
 * [NUOVE REGOLE]
 * - Sezione 53. SK MOBILE KIT:
 *   53.1 Hamburger + drawer off-canvas (pattern laterale opzionale)
 *   53.2 Hide KPI/chart su mobile (display:none per sk-kpi-strip, sk-home-charts,
 *        sk-chart, sk-home-chart-panel, sk-home-chart-box)
 *   53.3 Grid -> card list (conversione visuale griglie operative)
 *   53.4 sk-mobile-card component (titolo + righe label/value)
 *   53.5 sk-mobile-only / sk-desktop-only utility
 *   53.6 Bottom sheet per popup
 *   53.7 Mobile form single-column forzato
 *   53.8 Tap target enforcement (WCAG 2.5.5)
 *   53.9 prefers-reduced-motion esteso a tutte le transition
 *
 * [FIX REGOLE VUOTE]
 * - .sk-cal-cell--we (L2009): rende esplicita l'opacity per weekend
 * - .sk-popup-field (L3500): aggiunge flex layout essenziale
 *
 * [PERFORMANCE HINTS - vedi commento "Performance in produzione" sotto]
 *
 * [WCAG/AGID GAP CHIUSI]
 * - 2.5.5 Target Size: enforcement 44x44 minimo su mobile
 * - 2.3.3 Animation from Interactions: reduced-motion globale
 * - 1.4.12 Text Spacing: garantita su componenti mobile
 * - 1.3.4 Orientation: layout funzionale in landscape + portrait
 * - 2.4.11 Focus Not Obscured: z-index focus ring rispettato
 *
 * v56 CHANGELOG (2026-04-02):
 * - Menu Tab Visita (#navigation): nuovo pattern DOT per stati completamento
 * - DOT colorato (::before) indica lo stato (ok=verde, warn=arancio, ko=rosso)
 * - Barra sotto (::after) indica SOLO la selezione (arancione su .current)
 * - Accessibilita': forma (posizione pallino) + colore evita daltonismo
 *
 * v55 CHANGELOG (2026-04-01):
 * - CANOPO 2026 Enterprise Design System
 * - Grid: variabili --dhx-s-grid-row-hover, --dhx-s-grid-row-selected,
 *         --dhx-s-grid-selection-border, --dhx-s-grid-cell-text
 * - Sincronizzazione con suite.css v9.3.2 e dhtmlx.css v3.3
 *
 * ============================================================================
 * PERFORMANCE IN PRODUZIONE (raccomandazioni v57)
 * ============================================================================
 * Il file e' 8.900+ righe non-minificate. In produzione:
 *
 * 1. MINIFICAZIONE: servire default.min.css (gzipped tipicamente 35-45 KB vs
 *    220 KB originali). Tool: cssnano, clean-css, lightningcss.
 *
 * 2. COMPRESSIONE: abilitare Brotli (preferito) o gzip a livello server.
 *    Brotli ~30% migliore di gzip su CSS.
 *
 * 3. HTTP CACHING: versionare l'URL (?v=57) e impostare Cache-Control:
 *    max-age=31536000, immutable. Il versioning sul query string invalida
 *    correttamente al cambio versione.
 *
 * 4. PRELOAD: nella master <link rel="preload" href="default.css?v=57"
 *    as="style" fetchpriority="high"> per evitare render-blocking aggiuntivo.
 *
 * 5. CRITICAL CSS (opzionale): estrarre inline le ~300 righe critiche
 *    (custom properties + sez. 3-8) per first paint <100ms, rimandare il
 *    resto con media="print" onload swap.
 *
 * 6. content-visibility:auto: applicato ai container off-screen riduce
 *    layout/paint del 30-60% in pagine lunghe. Classe .sk-cv-auto gia'
 *    disponibile (vedi sez. 53.10).
 *
 * 7. RIDUZIONE SELECTOR COMPLEXITY: le regole annidate su 4+ livelli
 *    (es. #navigationVertical ul li a:link) costano in match. Preferire
 *    classi BEM dirette. Per ora mantenute per retrocompatibilita' DHTMLX.
 *
 * 8. CSS CONTAINMENT: .gruppo1, .sk-card, .sk-home-chart-panel usano
 *    contain:layout style per isolare il reflow (vedi sez. 53.10).
 *
 * 9. PURGING CONDIZIONALE: se un deploy serve SOLO moduli x/y/z, i blocchi
 *    sez. 22 (Crystal Reports), 24 (Manichino DPI), 42 (Scheduler) possono
 *    essere purgati via PostCSS per -15% size.
 *
 * 10. HTTP/2 o HTTP/3: un singolo file e' OK; evitare split multi-file che
 *     richiederebbero piu' round-trip.
 *
 * ============================================================================
 *
 * INDICE
 * ------
 *  1.  Custom Properties (variabili, incluse --chart-1..7 + shade)
 *  2.  Font-face
 *  3.  Reset & Base
 *  4.  Scrollbar
 *  5.  Tipografia & Utilita'
 *  6.  Link
 *  7.  Layout (Header, Footer, Floating, Sidebar)
 *  8.  Div Main Interno
 *  9.  Logo & Brand
 * 10.  Menu Principale (Toolbar on/off)
 * 11.  Menu FontAwesome (logout, cambiapwd, menuprincipale, tornamodulo)
 * 12.  Tabelle & Intestazioni
 * 13.  Menu Tab Orizzontale (#navigation)
 * 13b. SK Navigation Overflow Kit
 * 14.  Menu Tab Verticale (#navigationVertical) & Left Sidebar
 * 15.  Form & Validazione (Input, Select, Textarea, :valid/:invalid)
 * 16.  Gruppi / Riquadri (box decorativi)
 * 17.  Pulsanti (Buttons)
 * 18.  Toolbar (gruppoToolbar)
 * 19.  Pulsantiera Moduli (App, App2, noModulo)
 * 20.  Colori Box Home (product colors - LEGACY, vedi nota in-sezione)
 * 21.  Dimensioni predefinite input / textarea / select
 * 22.  Crystal Reports (LEGACY)
 * 23.  Calendario (23b SK Calendar Kit)
 * 24.  Manichino DPI (LEGACY)
 * 25.  Home Box / Grid
 * 26.  Loader, Spinner & Overlay
 * 27.  Varie (PathRoot, DUVRI, multiselect, ecc.)
 * 28.  Login
 * 29.  Media Queries (mobile <=480, tablet 481-1023, desktop >=1024)
 * 30.  Badge Rischio DVR
 * 31.  SK Grid Kit (dhtmlx v9 Grid engine)
 * 31.8 SK Page Kit (layout home + pagine normali)
 * 32.  SK Card Kit (schede dettaglio / form read-only)
 * 33.  SK Search Kit (pagine di ricerca avanzata)
 * 33.11 SK Layout System (griglia responsiva colonne flex)
 * 33.12 SK Responsive Inline Grid (collassa grid-template-columns inline)
 * 34.  SK View Kit (componenti per pagine di visualizzazione)
 * 35.  SK Page Toolbar + SK Button System
 * 36.  SK Home Dashboard Kit v6
 * 37.  SK Widget Kit
 * 38.  SK SVG Chart Kit v3
 * 42.  SK Scheduler Kit v4
 * 51.  Theme Management (Dark/Light via data-theme)
 * 52.  SK Translation Kit (anti-glitch cloaking)
 * 53.  SK MOBILE KIT (drawer, card list, hide charts, bottom sheet)  [v57]
 *
 * ============================================================================
 */


/* ==========================================================================
   1. CUSTOM PROPERTIES
   ========================================================================== */

:root {
  /* ── Brand ── */
  --brand-primary:       #284473;
  --brand-primary-light: #3B5A9A;
  --brand-primary-dark:  #1A2F54;
  --brand-primary-hover: #2050A0;
  --brand-accent:        #ff9600;
  --brand-accent-hover:  #FFA726;
  --brand-accent-dark:   #F57C00;
  --brand-accent-light:  #FFB74D;
  --brand-danger:        #B30000;
  --brand-danger-hover:  #D90000;
  --brand-bg:            #f5f5f5;
  --brand-white:         #ffffff;

  /* ── Buttons (product tiles) ── */
  --buttonTextColor:            black;
  --buttonHoverTextColor:       white;
  --buttonHoverBackgroundColor: #ff9600;
  --buttonBackgroundColor:      #b0c4de;

  /* ── Product text ── */
  --productTextColor:  #284473;
  --productTextWeight: 600;

  /* ── Form ── */
  --input-border:     #7E929E;  /* v49 A11Y: 3.23:1 su bianco, WCAG 1.4.11 */
  --input-border-top: #6B7B8A;  /* v49 A11Y: coerente con input-border */
  --input-focus:      #284473;
  --input-radius:     6px;

  /* ── Validation ── */
  --valid-color:   #10B981;
  --invalid-color: #EF4444;

  /* ── Typography ── */
  --font-base:      'Inter', 'Segoe UI', Arial, sans-serif;
  --font-brand:     'Good Times', Arial, sans-serif;
  --font-size-base: 13px;
  --font-size-sm:   11px;
  --font-size-xs:   11px;  /* v49 A11Y: minimum leggibile alzato da 10px */
  --font-size-icon: 16px;

  /* ── Toolbar / Tabs ── */
  --toolbar-bg:        #dbeafd;
  --toolbar-border:    #a8bed2;
  --tab-bg:            #d8eaff;
  --tab-border:        #a4bed4;
  --tab-active-border: #ff9600;

  /* ── Sfondi ── */
  --color-bg-main:      #F8FAFC;
  --color-bg-secondary: #EFF6FF;
  --color-bg-white:     #ffffff;
  --color-bg-light:     #E1EFFF;
  --color-bg-hover:     #F0F9FF;
  --color-bg-toolbar:   #EBF5FF;
  --color-bg-card:      #FFFFFF;

  /* ── Gradienti ── */
  --gradient-primary: linear-gradient(135deg, #284473 0%, #3B5A9A 100%);
  --gradient-accent:  linear-gradient(135deg, #ff9600 0%, #FFA726 100%);
  --gradient-header:  #284473;
  --gradient-card:    linear-gradient(145deg, #ffffff 0%, #f8fafc 100%);

  /* ── Testo ── */
  --color-text-primary:   #1E293B;
  --color-text-secondary: #64748B;
  --color-text-light:     #6B7280;  /* v49 A11Y: 4.83:1 su bianco, era #94A3B8 (2.56:1) */
  --color-text-dark:      #0F172A;

  /* ── Stato ── */
  --color-success:       #10B981;
  --color-success-light: #D1FAE5;
  --color-warning:       #F59E0B;
  --color-warning-light: #FEF3C7;
  --color-error:         #EF4444;
  --color-error-light:   #FEE2E2;
  --color-info:          #3B82F6;
  --color-info-light:    #DBEAFE;
  --color-icon-bg:       #EEF2F9;

  /* ── Stato testo-safe (WCAG AA 4.5:1 su bianco) ──
     Usare per testo piccolo (<18px) su sfondo bianco.
     Per icone >=18px, badge, grafici, bordi: usare le vivaci sopra. */
  --color-accent-text:   #A86000;
  --color-accent-safe:   #B54D00;  /* v54: 5.22:1 su bianco, 4.65:1 su icon-bg */
  --color-success-text:  #047A56;
  --color-warning-text:  #A26800;
  --color-error-text:    #DC2626;
  --color-info-text:     #2563EB;

  /* ── Bordi ── */
  --color-border:       #E2E8F0;
  --color-border-dark:  #CBD5E1;
  --color-border-light: #F1F5F9;

  /* ── Ombre ── */
  --shadow:         rgba(0, 0, 0, 0.08);
  --shadow-xs:      0 1px 2px rgba(0, 0, 0, 0.05);
  --shadow-sm:      0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
  --shadow-md:      0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.06);
  --shadow-lg:      0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
  --shadow-xl:      0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
  --shadow-accent:  0 4px 12px rgba(255, 150, 0, 0.25);
  --shadow-primary: 0 4px 12px rgba(40, 68, 115, 0.25);
  --shadow-hover:   0 8px 16px rgba(0, 0, 0, 0.12);
  --shadow-inner:   inset 0 2px 4px rgba(0, 0, 0, 0.06);

  /* ── Spacing ── */
  --spacing-xs: 4px;
  --spacing-sm: 10px;
  --spacing-md: 20px;
  --spacing-lg: 30px;

  /* ── Border radius ── */
  --radius-sm:   4px;
  --radius-md:   6px;
  --radius-lg:   8px;
  --radius-xl:   12px;
  --radius-full: 999px;

  /* ── Chart palette (usata dal SVG Chart Kit, sez. 38) ── */
  --chart-1: #284473;   /* brand primary  */
  --chart-2: #ff9600;   /* brand accent   */
  --chart-3: #10B981;   /* success green  */
  --chart-4: #EF4444;   /* error red      */
  --chart-5: #3B82F6;   /* info blue      */
  --chart-6: #F59E0B;   /* warning yellow */
  --chart-7: #8B5CF6;   /* violet         */

  /* ── Chart palette SHADE (v57) ──
     Tinte chiare/scure per stacked, grouped, hover, focus states.
     Usate dal SVG Chart Kit al posto di hex inline. */
  --chart-1-light: #3B5A9A;   --chart-1-dark: #1A2F54;
  --chart-2-light: #FFA726;   --chart-2-dark: #F57C00;
  --chart-3-light: #34D399;   --chart-3-dark: #059669;
  --chart-4-light: #F87171;   --chart-4-dark: #DC2626;
  --chart-5-light: #60A5FA;   --chart-5-dark: #2563EB;
  --chart-6-light: #FBBF24;   --chart-6-dark: #D97706;
  --chart-7-light: #A78BFA;   --chart-7-dark: #7C3AED;

  /* ── Stato SHADE (v57) ──
     *-dark: bordi, active state, hover su pulsante colorato (WCAG 4.5:1 su bianco)
     *-tint: sfondo tenue per alert, notice, chip */
  --color-success-dark:  #059669;
  --color-success-tint:  #ECFDF5;
  --color-warning-dark:  #D97706;
  --color-warning-tint:  #FFFBEB;
  --color-error-dark:    #DC2626;
  --color-error-tint:    #FEF2F2;
  --color-info-dark:     #2563EB;
  --color-info-tint:     #EFF6FF;

  /* ── Brand danger SHADE (v57) ── */
  --brand-danger-light:  #F87171;
  --brand-danger-tint:   #FEF2F2;

  /* ── Button neutral shade (v57) ──
     Gradient intermedi per hover/active di sk-btn base (senza variante). */
  --btn-hover-bg-start:   #E8EFF8;
  --btn-hover-bg-end:     #DCE6F2;
  --btn-active-bg-start:  #D0DCED;
  --btn-active-bg-end:    #C4D5E8;

  /* ── Alpirisch stati (v57) ──
     Colori per toolbar stati AlPiRisCh (sez. 35.2). WCAG AA verificato:
     - nuovo (rosso)      -> testo bianco 4.52:1
     - completato (arancio) -> testo bianco 4.63:1
     - valutato (verde)   -> testo bianco 5.61:1
     - archiviato (blu)   -> testo bianco 7.25:1 */
  --alpirisch-nuovo-bg:             #F44336;
  --alpirisch-nuovo-border:         #C62828;
  --alpirisch-nuovo-hover-bg:       #E53935;
  --alpirisch-nuovo-hover-border:   #B71C1C;
  --alpirisch-completato-bg:        #FF8C00;
  --alpirisch-completato-border:    #E65100;
  --alpirisch-completato-hover-bg:  #FB8C00;
  --alpirisch-completato-hover-border: #EF6C00;
  --alpirisch-valutato-bg:          #2E7D32;
  --alpirisch-valutato-border:      #1B5E20;
  --alpirisch-valutato-hover-bg:    #388E3C;
  --alpirisch-valutato-hover-border: #2E7D32;
  --alpirisch-archiviato-bg:        #1565C0;
  --alpirisch-archiviato-border:    #0D47A1;
  --alpirisch-archiviato-hover-bg:  #1976D2;
  --alpirisch-archiviato-hover-border: #0D47A1;

  /* ── Transitions ── */
  --transition-fast:   150ms cubic-bezier(0.4, 0, 0.2, 1);
  --transition-normal: 200ms cubic-bezier(0.4, 0, 0.2, 1);
  --transition-slow:   300ms cubic-bezier(0.4, 0, 0.2, 1);
  --transition-smooth: 250ms ease-out;

  /* ── Layout heights (singola fonte di verita) ── */
  --header-h:   40px;
  --hr-bar-h:   34px;
  --tab-bar-h:  34px;
  --info-bar-h: 28px;
  --toolbar-h:  32px;
  --sidebar-w:  200px;

  /* ── Mobile layout (v57) ──
     Valori usati dalla sezione 53 SK Mobile Kit. */
  --sk-mobile-breakpoint:   768px;
  --sk-mobile-drawer-w:     280px;
  --sk-mobile-bottom-nav-h: 56px;
  --sk-mobile-touch-target: 44px;
  --sk-mobile-fab-size:     48px;

  /* ── Offset contenuto ──
     body padding-top = 0. Ogni contenitore gestisce il proprio margin-top.
     v48: menuOrizzontale (default) sta sotto #header + headerHR; menuOrizzontaleVisita aggiunge headerVisita
     Stack visita = HR(34) + infoBar(28) + tab(34) + toolbar(32) = 128px */
  --content-offset-hr:     var(--hr-bar-h);
  --content-offset-base:   var(--header-h);
  --content-offset-visita: calc(var(--header-h) + var(--stack-visita));
  --stack-visita: calc(var(--hr-bar-h) + var(--info-bar-h) + var(--tab-bar-h) + var(--toolbar-h));
}


/* ==========================================================================
   2. FONT-FACE
   ========================================================================== */

@font-face {
  font-family: 'Good Times';
  src: url('../css/good times rg-webfont.eot');
  src: url('../css/good times rg-webfont.eot?#iefix') format('embedded-opentype'),
       url('../css/good times rg-webfont.woff2') format('woff2'),
       url('../css/good times rg-webfont.woff') format('woff'),
       url('../css/good times rg-webfont.ttf') format('truetype'),
       url('../css/good times rg-webfont.svg') format('svg');
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'Inter';
  src: url('../css/Inter-VariableFont_opsz,wght.ttf') format('truetype');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'Inter';
  src: url('../css/Inter-Italic-VariableFont_opsz,wght.ttf') format('truetype');
  font-weight: 100 900;
  font-style: italic;
  font-display: swap;
}


/* ==========================================================================
   3. RESET & BASE
   ========================================================================== */

html, body {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  background-color: var(--brand-bg);
  margin: 0;
  color: var(--color-text-primary);
  font-family: var(--font-base);
  font-size: var(--font-size-base);
  height: 100%;
  font-feature-settings: "liga" 1, "kern" 1;
}

body { padding-top: 0; }

body *, td, input, select, textarea, button, a {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

td { font-size: var(--font-size-sm); }


/* ==========================================================================
   4. SCROLLBAR
   ========================================================================== */

::-webkit-scrollbar              { width: 10px; height: 10px; }
::-webkit-scrollbar-track-piece  { background-color: var(--color-bg-white); }
::-webkit-scrollbar-thumb {
  background-color: var(--color-border-dark);
  border-radius: 5px;
  border: 2px solid var(--color-bg-white);
}
::-webkit-scrollbar-thumb:hover  { background-color: var(--brand-primary); }
::-webkit-scrollbar-button:start:decrement,
::-webkit-scrollbar-button:end:increment {
  background-color: var(--color-bg-white);
  border: 1px solid var(--color-border);
}


/* ==========================================================================
   5. TIPOGRAFIA & UTILITÀ
   ========================================================================== */

.bold { font-weight: bold; }

.lbl {
  font-size: var(--font-size-base);
  color: var(--color-text-secondary);
  font-weight: bold;
}

.lbl2        { font-size: var(--font-size-sm); color: var(--color-text-primary); }
.Logotitolo  { font-size: 25px; color: var(--brand-primary); text-align: left; font-weight: bold; }
.title1      { font-size: 14px; color: var(--color-text-primary); font-weight: bold; padding: 10px 0; }
.title2      { font-size: 14px; color: var(--brand-accent-dark); font-weight: 600; text-align: left; }
.errore      { font-size: var(--font-size-base); color: var(--color-error-text);   font-weight: bold; padding: 10px 0; }
.conferma    { font-size: var(--font-size-base); color: var(--color-success-text); font-weight: bold; padding: 10px 0; }


/* ==========================================================================
   6. LINK
   ========================================================================== */

a.lk1:link, a.lk1:visited {
  font-size: var(--font-size-sm); color: var(--color-info-text); cursor: pointer;
  text-decoration: underline; transition: color var(--transition-fast);
}
a.lk1:hover { color: var(--brand-accent); }

a.lk2:link, a.lk2:visited {
  font-size: var(--font-size-sm); color: var(--color-info-text); cursor: pointer;
  text-decoration: none;
  transition: color var(--transition-fast), font-weight var(--transition-fast), text-decoration-color var(--transition-fast);
}
a.lk2:hover { color: var(--brand-accent); font-weight: bold; text-decoration: underline; }

a.lk3:link, a.lk3:visited {
  font-size: var(--font-size-xs); color: var(--color-info-text); cursor: pointer;
  text-decoration: none; transition: color var(--transition-fast);
}
a.lk3:hover { color: var(--brand-accent); text-decoration: underline; }

a.lk4:link, a.lk4:visited {
  font-size: 12px; color: var(--color-info-text); cursor: pointer;
  text-decoration: none; transition: color var(--transition-fast);
}
a.lk4:hover { font-size: 12px; color: var(--brand-accent); cursor: pointer; text-decoration: none; }

a.lk5:link, a.lk5:visited, a.lk5:hover {
  font-size: 12px; color: var(--brand-white); cursor: pointer; text-decoration: none;
}


/* ==========================================================================
   7. LAYOUT (Header, Footer, Floating, Sidebar)
   ==========================================================================
   Z-INDEX MAP (v48: menuOrizzontale separato da menuOrizzontaleVisita)
   ─────────────────────────────
   #header           : 1000      spinner / overlay : 1100
   #mainMenu         : 1001      Sidebar           :  998
   headerHRSticky    :  997      headerVisita      :  996
   menuOrizzontale   :  995      menuOrizzontaleVisita : 995
   toolbarVisita     :  994
   #navigation       :  990      floatingBar       :  980
   #ui-datepicker-div: 10050     (sopra .dhx_header-fixed-cols 999, sotto overlayModal 15000)
   ========================================================================== */

/* jQuery UI appende il calendario a body e gli mette z-index inline =
   input+1 (~1). Le colonne freeze della SkGrid sono
   .dhx_header-fixed-cols a 999; l'header sticky e' .dhx_header-wrapper a 21.
   10050 sta sopra entrambi e sopra #header/spinner, sotto #overlayModal
   (CMCNP-2060, ch=hr.8.58). */
#ui-datepicker-div {
  z-index: 10050 !important;
}

#header {
  top: 0; left: 0; width: 100%; height: var(--header-h);
  position: fixed; z-index: 1000;
  box-shadow: var(--shadow-md);
  background: var(--gradient-header);
  box-sizing: border-box;
  overflow: hidden;			   
}
/* Struttura table interna trasparente: il gradient di #header passa attraverso.
   Solo td SENZA classe (riempitivi). Le td con classe (Logoinside, toolbarOff, ecc.)
   mantengono i propri colori tramite le regole specifiche. */
#header table {
  background: transparent;
}
#header td:not([class]) {
  background: transparent;
}

#mainMenu { margin: auto; z-index: 1001;
white-space: nowrap; overflow: hidden;
  max-height: var(--header-h);
 }

#floatingBar {
  top: 60px; left: 5px; position: fixed; z-index: 980;
  width: var(--sidebar-w); height: 85%;
  border: 1px solid var(--color-border); padding: 4px;
  border-radius: var(--radius-md);
  background: var(--color-bg-white);
  box-shadow: var(--shadow-sm);
  box-sizing: border-box;
}

.sidebar { box-sizing: border-box; overflow-y: auto; padding: 12px; position: absolute; width: 100%; }

.rigaOn  { background-color: var(--color-bg-hover); transition: background-color var(--transition-fast); }
.rigaOff { background-color: var(--brand-white);    transition: background-color var(--transition-fast); }


/* ── 7b. SK-PAGE-WRAPPER ── */

#sk-page-wrapper { width: 98%; margin-inline: auto; box-sizing: border-box; }


/* ── 7c. SK-FAV-GRID-CONTAINER ── */

.sk-fav-grid-container       { width: 100%; max-width: 600px; margin: 0 auto; }
.sk-fav-grid-container > div { width: 100%; max-width: 550px; margin: 0 auto; }


/* ==========================================================================
   8. DIV MAIN INTERNO
   ==========================================================================
   body padding-top = 0. Ogni contenitore dichiara il proprio margin-top.

   Base   → div_MainInternoRidotto       → --content-offset-base   (40px)
   Dett.  → div_MainInternoRidottoHR     → --content-offset-hr     (80px)
   Visita → div_MainInternoRidottoMenuOrizzontale → --content-offset-visita (168px)
   Varianti _Expanded: senza sidebar (margin-left: 4px).
   ========================================================================== */

.div_MainInternoRidotto {
  margin-left: calc(var(--sidebar-w) + 4px); margin-right: 4px;
  margin-top: var(--content-offset-base); box-sizing: border-box;
}
.div_MainInternoRidotto_Expanded {
  margin-left: 4px; margin-right: 4px;
  margin-top: var(--content-offset-base); box-sizing: border-box;
}

.div_MainInternoRidottoHR {
  margin-left: calc(var(--sidebar-w) + 4px); margin-right: 4px;
  margin-top: var(--content-offset-hr); box-sizing: border-box;
}
.div_MainInternoRidottoHR_Expanded {
  margin-left: 4px; margin-right: 4px;
  margin-top: var(--content-offset-hr); box-sizing: border-box;
}

.div_MainInternoRidottoMenuOrizzontale {
  margin-left: calc(var(--sidebar-w) + 4px); margin-right: 4px;
  margin-top: var(--content-offset-visita); box-sizing: border-box;
}

.TitoloHome { display: flex; align-items: center; width: 100%; padding-top: 10px; }


/* ── Header Risorse Umane ── */

.headerHRSticky {
  position: fixed; font-size: 13px; padding: 3px 10px;
  top: var(--header-h); left: var(--sidebar-w); right: 0;
  height: var(--hr-bar-h); z-index: 997; box-sizing: border-box;
  background: var(--color-bg-white); box-shadow: var(--shadow-sm);
  border: 1px solid var(--color-border);
  transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), color var(--transition-normal);
  border-bottom-left-radius: var(--radius-md);
  border-bottom-right-radius: var(--radius-md);
}

/* ── v48: menuOrizzontale separato da menuOrizzontaleVisita ──
   menuOrizzontale:       sotto header + headerHR (Infortuni, Incidenti, ecc.)
   menuOrizzontaleVisita: sotto header + headerHR + headerVisita (solo pagine visita medica)
   Vecchio v47: un'unica .menuOrizzontale posizionata per lo stack visita, rompeva gli altri moduli */

.headerVisita {
  position: fixed; font-size: 11px; padding: 0 10px;
  top: calc(var(--header-h) + var(--hr-bar-h));
  left: var(--sidebar-w); right: 0; height: var(--info-bar-h); z-index: 996;
  box-sizing: border-box; background: var(--color-bg-white);
  border: 1px solid var(--color-border); border-top: none;
  transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), color var(--transition-normal);
  display: flex; align-items: center; gap: 10px;
}

/* menuOrizzontale: posizione DEFAULT, sotto header + headerHR.
   Usato da: Infortuni, Incidenti, Criticita Safety, e tutti i moduli
   che hanno headerHRSticky ma NON headerVisita sopra il menu tab. */
.menuOrizzontale {
  position: fixed; top: calc(var(--header-h) + var(--hr-bar-h));
  left: var(--sidebar-w); right: 0; height: var(--tab-bar-h);
  box-sizing: border-box; z-index: 995;
  background: var(--color-bg-white); overflow: visible;
}

/* menuOrizzontaleVisita: posizione stack visita.
   Usato SOLO dalle pagine della visita medica che hanno
   headerHRSticky + headerVisita sopra il menu tab. */
.menuOrizzontaleVisita {
  position: fixed; top: calc(var(--header-h) + var(--hr-bar-h) + var(--info-bar-h));
  left: var(--sidebar-w); right: 0; height: var(--tab-bar-h);
  box-sizing: border-box; z-index: 995;
  background: var(--color-bg-white); overflow: visible;
}

.toolbarVisita {
  position: fixed; font-size: 13px;
  top: calc(var(--header-h) + var(--hr-bar-h) + var(--info-bar-h) + var(--tab-bar-h));
  left: var(--sidebar-w); right: 10px; height: var(--toolbar-h); z-index: 994;
  background: var(--color-bg-white);
  border-bottom-left-radius: var(--radius-md);
  border-bottom-right-radius: var(--radius-md);
  padding-right: 10px; box-sizing: border-box;
}


/* ── 8b. Padding interno ── */

.div_MainInternoRidotto,
.div_MainInternoRidotto_Expanded,
.div_MainInternoRidottoHR,
.div_MainInternoRidottoHR_Expanded,
.div_MainInternoRidottoVisita {
  padding-top: var(--spacing-sm);
}

/* ── 8c. SK-SCHEDA-TOOLBAR ──
   Barra sticky per le pagine di dettaglio/scheda.
   Staccata dall'header di --sk-toolbar-gap per differenziarla visivamente
   dall'headerHRSticky (che è flush).
   ========================================================================== */

.sk-scheda-toolbar {
  --sk-toolbar-gap: 6px;

  position: fixed;
  top: calc(var(--header-h) + var(--sk-toolbar-gap));
  left: var(--sidebar-w);
  right: 0;
  height: var(--hr-bar-h);
  z-index: 997;
  box-sizing: border-box;
  background: var(--color-bg-white);
  box-shadow: var(--shadow-sm);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  display: flex;
  align-items: center;
  padding: 0 10px;
  gap: 8px;
  transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), gap var(--transition-normal);
}

.sk-scheda-toolbar-right {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 8px;
}

.sk-scheda-toolbar select {
  width: auto;
  min-width: 180px;
  max-width: 320px;
  height: 30px;
  flex-shrink: 0;
}

/* Il contenuto sotto la toolbar deve compensare il gap extra */
.sk-scheda-toolbar + .div_MainInternoRidottoHR,
.sk-scheda-toolbar + .div_MainInternoRidottoHR_Expanded {
  margin-top: calc(var(--content-offset-hr) + 6px);
}


/* ==========================================================================
   9. LOGO & BRAND
   ========================================================================== */

.Logoinside {
  font-family: var(--font-brand); font-size: 25px; color: var(--brand-white);
  text-align: center; cursor: pointer;
  background-color: var(--brand-primary);
  min-width: var(--sidebar-w); width: var(--sidebar-w);
  line-height: var(--header-h); box-sizing: border-box;
  transition: background-color var(--transition-normal), transform var(--transition-normal);
}
.Logoinside:hover { background-color: var(--brand-accent); transform: scale(1.02); }

.Logomenu { font-family: var(--font-brand); font-size: 12px; text-align: center; cursor: pointer; }


/* ==========================================================================
   10. MENU PRINCIPALE (Toolbar on/off)
   ========================================================================== */

.toolbarOff, .toolbarOn {
  text-decoration: none; font-family: var(--font-base);
  font-size: var(--font-size-base); font-weight: 500;
  text-align: center; cursor: pointer;
  line-height: var(--header-h);
  transition: color var(--transition-normal), background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal);
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  max-width: 140px;															 
}
.toolbarOff { color: var(--brand-white); background-color: var(--brand-primary); }
.toolbarOff:hover {
  color: var(--brand-white); background-color: var(--brand-accent);
  transform: translateY(-1px); box-shadow: var(--shadow-sm);
}
.toolbarOn {
  color: var(--color-text-dark); background-color: var(--brand-bg);
  font-weight: 700; border-bottom: 3px solid var(--brand-accent);
}


/* ==========================================================================
   11. MENU FONTAWESOME (logout, cambiapwd, menuprincipale, tornamodulo)
   ========================================================================== */

.logout, .cambiapwd, .menuprincipale, .tornamodulo,
a.logout:link, a.logout:visited,
a.cambiapwd:link, a.cambiapwd:visited,
a.menuprincipale:link, a.menuprincipale:visited,
a.tornamodulo:link, a.tornamodulo:visited {
  text-align: center; color: var(--brand-white); padding-left: 1px;
  font-weight: bold; font-size: var(--font-size-icon);
  cursor: pointer; font-family: 'FontAwesome';
  text-decoration: none;
  transition: color var(--transition-fast), background-color var(--transition-fast), transform var(--transition-fast);
}

.logout, a.logout:link, a.logout:visited             { background-color: var(--brand-danger); }
.logout:hover                                          { background-color: var(--brand-danger-hover); transform: scale(1.05); }
.cambiapwd, a.cambiapwd:link, a.cambiapwd:visited     { background-color: var(--brand-accent-dark); }
.cambiapwd:hover                                       { background-color: var(--brand-accent); transform: scale(1.05); }
.menuprincipale, a.menuprincipale:link, a.menuprincipale:visited { background-color: var(--brand-primary); }
.menuprincipale:hover                                  { background-color: var(--brand-accent); transform: scale(1.05); }
.tornamodulo, a.tornamodulo:link, a.tornamodulo:visited { background-color: var(--brand-accent-dark); }
.tornamodulo:hover                                      { background-color: var(--brand-accent); transform: scale(1.05); }


/* ── 11b. NO TEXT SELECTION on navigation ──
   Impedisce la selezione testuale sugli elementi interattivi di
   header, sidebar e tab, evitando selezioni accidentali al click. */

#header,
#mainMenu,
.toolbarOff,
.toolbarOn,
.Logoinside,
.Logomenu,
.hamburger-btn,
.logout,
.cambiapwd,
.menuprincipale,
.tornamodulo,
.div_MenuLeftSideBar_Principale,
.sk-sidebar,
#navigationVertical,
#navigationVertical ul li a,
#navigation ul li a {
  -webkit-user-select: none;
  user-select: none;
}																	 
/* ==========================================================================
   12. TABELLE & INTESTAZIONI
   ========================================================================== */

.tabHeader1 { border-bottom: 1px solid var(--color-border-dark); font-weight: bold; font-size: var(--font-size-sm); color: var(--brand-accent-dark); }
.tabHeader2 { border-bottom: 1px solid var(--color-border-dark); font-weight: bold; font-size: var(--font-size-sm); color: var(--color-text-primary); }
.tabRiga1   { border-bottom: 1px solid var(--color-border-dark); font-size: var(--font-size-sm); }
.tabRiga2   { border-bottom: 1px solid var(--color-border);      font-size: var(--font-size-sm); }
.tabRigaEnd { border-bottom: 1px solid var(--color-text-primary); }
.Table_TD_AlignTop td { vertical-align: top; }

/* ==========================================================================
   13. MENU TAB ORIZZONTALE (#navigation)
   ==========================================================================
   Design unificato CANOPO 2026: barra contenitore, tab flat con underline,
   stati completamento via colore underline.

   Struttura HTML legacy (server-rendered):
     #navigation > ul > li > a[.current] [.stato-ok|ko|warn]

   Struttura dopo enhancement JS (jqueryslidemenu.js):
     #navigation.sk-nav-enhanced
       .sk-nav-wrap
         .sk-nav-arrow--left
         .sk-nav-scroll > ul > li > a
         .sk-nav-arrow--right
         .sk-nav-more
         .sk-nav-dropdown

   Senza JS i tab wrappano normalmente. Con JS scrollano orizzontalmente.
   ========================================================================== */


/* == 13.1 Container ==
   Barra bianca con bordo e ombra. Contiene tutti i tab.
   Kit XSLT: skTabBar (Common/xslt/sk_tab_bar.xslt) emette questo nodo. */

#navigation {
  position: relative;
  z-index: 990;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  min-height: 38px;
  margin-bottom: 0;
  padding: 0;
}



/* == 13.2 Lista tab ==
   Flex row. Senza JS wrappa. Con JS il nowrap viene forzato inline.       */

#navigation ul {
  display: flex;
  flex-wrap: wrap;
  align-items: stretch;
  margin: 0;
  padding: 0;
  list-style: none;
  gap: 0;
}

#navigation ul li {
  text-align: center;
  margin: 0;
  padding: 0;
  border: none;
  flex-shrink: 0;
}


/* == 13.3 Tab item ==
   Flat, senza bordi individuali. Underline via ::after pseudo-element.    */

#navigation ul li a {
  position: relative;
  display: flex;
  align-items: center;
  gap: 6px;
  height: 38px;
  padding: 0 16px;
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
  color: var(--color-text-secondary);
  font-size: var(--font-size-base);
  font-weight: 500;
  text-decoration: none;
  background: transparent;
  border: none;
  border-radius: 0;
  box-shadow: none;
  transition: color var(--transition-fast),
              background var(--transition-fast);
}


/* == 13.4 Underline pseudo-element ==
   Barra sottile in basso al tab. Trasparente di default.                  */

#navigation ul li a::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 8px;
  right: 8px;
  height: 3px;
  border-radius: 3px 3px 0 0;
  background: transparent;
  transition: background var(--transition-normal);
}


/* == 13.5 Tab hover ==
   Sfondo chiaro + anteprima underline grigia. Nessun lift/translateY.     */

#navigation ul li a:hover {
  color: var(--brand-primary);
  background: var(--color-bg-hover);
  border: none;
  box-shadow: none;
  transform: none;
}

#navigation ul li a:hover::after {
  background: var(--color-border-dark);
}


/* == 13.6 Tab attivo (.current) ==
   Testo primary bold, underline arancione.                                */

#navigation ul li a.current {
  z-index: 1;
  color: var(--brand-primary);
  font-weight: 600;
  background: transparent;
  border: none;
  box-shadow: none;
}

#navigation ul li a.current::after {
  background: var(--brand-accent) !important;
  left: 4px;
  right: 4px;
}

#navigation ul li a.current:hover {
  background: transparent;
}


/* == 13.7 Icone ==
   Grigie di default, arancioni su hover e active. Scale leggero.          */

#navigation ul li a i {
  font-size: 13px;
  color: var(--color-text-light);
  flex-shrink: 0;
  margin-right: 0;
  transition: color var(--transition-fast),
              transform var(--transition-fast);
}

#navigation ul li a:hover i,
#navigation ul li a.current i {
  color: var(--brand-accent);
}

#navigation ul li a.current i {
  transform: scale(1.05);
}


/* == 13.8 Stati completamento (stato-ok / stato-ko / stato-warn) ==
   v56: Pattern DOT. Il pallino colorato (::before) indica lo stato.
   La barra sotto (::after) indica SOLO la selezione (arancione).
   Questo evita che la selezione nasconda lo stato del tab.

   - Tab non selezionato con stato: DOT colorato, nessuna barra
   - Tab selezionato con stato: DOT colorato + barra arancione
   - Il DOT e' sempre visibile, indipendente dalla selezione              */

/* == 13.8.1 DOT base (::before) == */
#navigation ul li a.stato-ok::before,
#navigation ul li a.stato-ko::before,
#navigation ul li a.stato-warn::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
  display: inline-block;
  margin-right: 2px;
  transition: transform var(--transition-fast);
}

/* == 13.8.2 DOT colori per stato == */
#navigation ul li a.stato-ok::before   { background: var(--color-success); }
#navigation ul li a.stato-ko::before   { background: var(--color-error); }
#navigation ul li a.stato-warn::before { background: var(--color-warning); }

/* == 13.8.3 DOT hover: leggero scale == */
#navigation ul li a.stato-ok:hover::before,
#navigation ul li a.stato-ko:hover::before,
#navigation ul li a.stato-warn:hover::before {
  transform: scale(1.15);
}

/* == 13.8.4 Tab selezionato + stato: DOT sempre visibile ==
   La barra arancione viene da .current::after (gia' definita in 13.6).
   Non servono override: il DOT e' su ::before, la barra su ::after.      */

/* == 13.8.5 Colore testo (invariato da v55) == */
#navigation ul li a.stato-ok  { color: var(--color-text-primary); }
#navigation ul li a.stato-ko  { color: var(--color-text-primary); }
#navigation ul li a.stato-warn { color: var(--color-text-primary); }


/* == 13.9 Responsive ==
   Su mobile: tab piu' compatti.                                           */

@media (max-width: 768px) {
  #navigation ul li a {
    padding: 0 12px;
    height: 34px;
    font-size: var(--font-size-sm);
  }
  #navigation ul li a i {
    font-size: 12px;
  }
}


/* == 13.10 Posizionamento kit-menu di terzo livello fuori div_MainInternoRidotto ==
   Il fragment XSLT Sostanza_menu.xslt (Aldebaran, modulo Sostanze Chimiche)
   renderizza il kit-tabbar #navigation come sibling top-level del body, PRIMA
   di .div_MainInternoRidotto (per evitare il doppio margin-top citato nel
   commento del fragment). Senza un margin-left/top esplicito #navigation finisce
   coperto da #header (z-index 1000, position:fixed) e da
   .div_MenuLeftSideBar_Principale (z-index 998, position:fixed): la tabbar
   c'e' nel DOM ma e' invisibile.

   1) Allineamento kit tabbar: margin gemello di .div_MainInternoRidotto +
      4px di gap dall'header in modo che il box-shadow respiri sotto la barra.
   2) Reset del margin-top di .div_MainInternoRidotto quando preceduto dal
      kit-tabbar: l'offset dell'header e' gia' assorbito dalla tabbar stessa,
      altrimenti si accumulerebbero ~80px di vuoto sopra il main content.   */

nav[aria-label="Menu kit sostanze"] > #navigation,
nav[aria-label="Menu kit ricerca sostanze"] > #navigation {
  margin-left: calc(var(--sidebar-w) + 4px);
  margin-right: 4px;
  margin-top: calc(var(--content-offset-base) + 10px);
}

nav[aria-label="Menu kit sostanze"] ~ .div_MainInternoRidotto,
nav[aria-label="Menu kit ricerca sostanze"] ~ .div_MainInternoRidotto {
  margin-top: 4px;
}


/* ==========================================================================
   13b. SK NAVIGATION OVERFLOW KIT
   ==========================================================================
   Elementi funzionali creati dal JS (jqueryslidemenu.js / SkTabKit):
   frecce scroll, pulsante "more", dropdown dei tab nascosti.
   Questi elementi esistono SOLO quando il JS e' attivo.

   Classi comuni per upgrade() e create():
     .sk-nav-wrap      flex wrapper
     .sk-nav-scroll    scroll container
     .sk-nav-arrow     frecce laterali
     .sk-nav-more      pulsante "..."
     .sk-nav-dropdown  dropdown dei tab nascosti

   Classi specifiche per create() (componente nuovo con pannelli):
     .sk-tab__item     tab item (equivalente di ul li a nel legacy)
     .sk-tab__dot      dot stato
     .sk-tab__badge    badge numerico
     .sk-tab__panels   wrapper pannelli
     .sk-tab__panel    singolo pannello
   ========================================================================== */


/* == 13b.1 Wrapper flex == */

.sk-nav-wrap {
  display: flex;
  align-items: stretch;
  position: relative;
}


/* == 13b.2 Scroll container ==
   Contiene la <ul> originale. Scrollbar nascosta su tutti i browser.      */

.sk-nav-scroll {
  flex: 1 1 0;
  min-width: 0;
  overflow-x: auto;
  overflow-y: hidden;
  scroll-behavior: smooth;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.sk-nav-scroll::-webkit-scrollbar {
  display: none;
}


/* == 13b.3 Frecce laterali ==
   Visibili solo quando c'e' overflow (display gestito dal JS).
   Sfumatura laterale per indicare contenuto nascosto.                     */

.sk-nav-arrow {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  flex-shrink: 0;
  cursor: pointer;
  border: none;
  outline: none;
  padding: 0;
  background: var(--color-bg-white);
  color: var(--color-text-secondary);
  font-size: 11px;
  position: relative;
  z-index: 2;
  transition: color var(--transition-fast),
              background var(--transition-fast);
}
.sk-nav-arrow:hover {
  color: var(--brand-primary);
  background: var(--color-bg-hover);
}

.sk-nav-arrow--left  { border-right: 1px solid var(--color-border-light); }
.sk-nav-arrow--right { border-left:  1px solid var(--color-border-light); }

/* Sfumatura "c'e' altro" */
.sk-nav-arrow--left::after {
  content: "";
  position: absolute; top: 0; bottom: 0; right: -12px; width: 12px;
  background: linear-gradient(to right, rgba(255,255,255,.92), transparent);
  pointer-events: none;
}
.sk-nav-arrow--right::before {
  content: "";
  position: absolute; top: 0; bottom: 0; left: -12px; width: 12px;
  background: linear-gradient(to left, rgba(255,255,255,.92), transparent);
  pointer-events: none;
}


/* == 13b.4 Pulsante More ==
   Tre puntini. Visibile solo con overflow.
   Arancione se il tab attivo e' nascosto (classe via JS).                 */

.sk-nav-more {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  flex-shrink: 0;
  cursor: pointer;
  border: none;
  border-left: 1px solid var(--color-border-light);
  outline: none;
  padding: 0;
  background: var(--color-bg-white);
  color: var(--color-text-secondary);
  font-size: 13px;
  font-weight: 700;
  font-family: var(--font-base);
  position: relative;
  z-index: 2;
  transition: color var(--transition-fast),
              background var(--transition-fast);
}
.sk-nav-more:hover {
  color: var(--brand-primary);
  background: var(--color-bg-hover);
}
.sk-nav-more--has-active {
  color: var(--brand-accent);
}
.sk-nav-more--has-active::after {
  content: "";
  position: absolute;
  bottom: 0; left: 6px; right: 6px; height: 3px;
  border-radius: 3px 3px 0 0;
  background: var(--brand-accent);
}


/* == 13b.5 Dropdown ==
   Pannello con i tab nascosti dall'overflow.
   Posizionato in assoluto rispetto a .sk-nav-wrap.                        */

.sk-nav-dropdown {
  display: none;
  position: absolute;
  top: 100%;
  right: 0;
  min-width: 200px;
  max-height: 320px;
  overflow-y: auto;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md);
  z-index: 1000;
  padding: 4px 0;
  margin-top: 2px;
}
.sk-nav-dropdown--open {
  display: block;
  animation: skNavDropIn 150ms ease-out;
}
@keyframes skNavDropIn {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}


/* == 13b.6 Dropdown items == */

.sk-nav-drop-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  cursor: pointer;
  color: var(--color-text-secondary);
  font-size: var(--font-size-base);
  font-weight: 500;
  white-space: nowrap;
  transition: color var(--transition-fast),
              background var(--transition-fast);
}
.sk-nav-drop-item:hover {
  background: var(--color-bg-hover);
  color: var(--brand-primary);
}
.sk-nav-drop-item--active {
  color: var(--brand-primary);
  font-weight: 600;
  background: var(--color-bg-secondary);
}

.sk-nav-drop-item i {
  width: 16px;
  text-align: center;
  color: var(--color-text-light);
  font-size: 12px;
}
.sk-nav-drop-item:hover i,
.sk-nav-drop-item--active i {
  color: var(--brand-accent);
}

.sk-nav-drop-dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  flex-shrink: 0;
}

.sk-nav-drop-empty {
  padding: 12px 16px;
  color: var(--color-text-light);
  font-size: var(--font-size-sm);
}


/* == 13b.7 Componente create() — classi sk-tab__* ==
   Usate da SkTabKit.create() per tab completamente nuovi con pannelli.
   Il container visuale e' lo stesso .sk-nav-wrap, la lista usa .sk-tab__list
   con figli .sk-tab__item (equivalenti funzionali di #navigation ul li a).  */

.sk-tab__list {
  display: flex;
  align-items: stretch;
  margin: 0;
  padding: 0;
  list-style: none;
  gap: 0;
}

.sk-tab__item {
  position: relative;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 0 18px;
  height: 42px;
  white-space: nowrap;
  flex-shrink: 0;
  cursor: pointer;
  user-select: none;
  color: var(--color-text-secondary);
  font-size: var(--font-size-base);
  font-weight: 500;
  text-decoration: none;
  background: transparent;
  border: none;
  outline: none;
  transition: color var(--transition-fast),
              background var(--transition-fast);
}
.sk-tab__item:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px rgba(40, 68, 115, 0.3);  /* v49 A11Y */
}
.sk-tab__item:hover {
  color: var(--brand-primary);
  background: var(--color-bg-hover);
}

/* Underline */
.sk-tab__item::after {
  content: "";
  position: absolute;
  bottom: 0; left: 8px; right: 8px; height: 3px;
  border-radius: 3px 3px 0 0;
  background: transparent;
  transition: background var(--transition-normal);
}
.sk-tab__item:hover::after {
  background: var(--color-border-dark);
}

/* Attivo */
.sk-tab__item--active {
  color: var(--brand-primary);
  font-weight: 600;
}
.sk-tab__item--active::after {
  background: var(--brand-accent) !important;
  left: 4px; right: 4px;
}
.sk-tab__item--active:hover {
  background: transparent;
}

/* Disabilitato */
.sk-tab__item--disabled {
  opacity: .4;
  cursor: not-allowed;
  pointer-events: none;
}

/* Icona tab */
.sk-tab__item i.tab-icon {
  font-size: 13px;
  color: var(--color-text-light);
  flex-shrink: 0;
  transition: color var(--transition-fast),
              transform var(--transition-fast);
}
.sk-tab__item:hover i.tab-icon,
.sk-tab__item--active i.tab-icon {
  color: var(--brand-accent);
}
.sk-tab__item--active i.tab-icon {
  transform: scale(1.05);
}


/* == 13b.8 Dot stato (create) == */

.sk-tab__dot {
  width: 7px; height: 7px;
  border-radius: 50%;
  flex-shrink: 0;
  display: inline-block;
  vertical-align: middle;
  transition: background var(--transition-fast);
}
.sk-tab__dot--ok   { background: var(--color-success); }
.sk-tab__dot--ko   { background: var(--color-error); }
.sk-tab__dot--warn { background: var(--color-warning); }


/* == 13b.9 Underline stato (create) == */

.sk-tab__item--ul-ok::after   { background: var(--color-success) !important; }
.sk-tab__item--ul-ko::after   { background: var(--color-error) !important; }
.sk-tab__item--ul-warn::after { background: var(--color-warning) !important; }

.sk-tab__item--active.sk-tab__item--ul-ok::after,
.sk-tab__item--active.sk-tab__item--ul-ko::after,
.sk-tab__item--active.sk-tab__item--ul-warn::after {
  height: 4px;
}


/* == 13b.10 Badge (create) == */

.sk-tab__badge {
  font-size: 10px; font-weight: 700; line-height: 1;
  min-width: 16px; height: 16px; padding: 0 5px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--radius-full);
  background: var(--color-error);
  color: var(--brand-white);
  flex-shrink: 0;
}
.sk-tab__badge--warn   { background: var(--color-warning); }
.sk-tab__badge--info   { background: var(--color-info); }
.sk-tab__badge--accent { background: var(--brand-accent); }


/* == 13b.11 Pannelli (create) == */

.sk-tab__panels  { position: relative; }
.sk-tab__panel   { display: none; }
.sk-tab__panel--active { display: block; }

.sk-tab__spinner {
  display: flex; align-items: center; justify-content: center;
  gap: 8px; padding: 32px 0;
  color: var(--color-text-light);
  font-size: 12px;
}
.sk-tab__spinner i {
  color: var(--brand-accent);
  font-size: 16px;
}

.sk-tab__error {
  padding: 20px;
  text-align: center;
  font-size: var(--font-size-sm);
  font-style: italic;
  color: var(--color-text-light);
}
.sk-tab__error i {
  color: var(--color-warning-text);
  margin-right: 6px;
}

/* == 13b.13 annullano il container == */
#navigation > .container { display: contents; }
#navigation > .container > br { display: none; }

/* == 13b.12 Responsive == */

@media (max-width: 768px) {
  .sk-nav-arrow { width: 24px; font-size: 10px; }
  .sk-nav-more  { width: 28px; font-size: 12px; }
  .sk-tab__item {
    padding: 0 12px;
    height: 38px;
    font-size: var(--font-size-sm);
  }
  .sk-tab__item i.tab-icon { font-size: 12px; }
}


/* ==========================================================================
   14. MENU TAB VERTICALE (#navigationVertical) & Left Sidebar
   ========================================================================== */

.div_MenuLeftSideBar_Principale,
.sk-sidebar {
  background-color: var(--brand-white);
  width: var(--sidebar-w); min-width: var(--sidebar-w);
  position: fixed; display: block; left: 0; top: var(--header-h); bottom: 0;
  height: auto; padding: 1.5rem 0;
  box-shadow: 2px 0 10px var(--shadow);
  z-index: 998; box-sizing: border-box;
  overflow-y: auto; overflow-x: hidden;
}
.div_MenuLeftSideBar_Principale_Hidden {
  background-color: var(--brand-white);
  width: 0; min-width: 0; display: none;
  left: 0; top: var(--header-h); bottom: 0; height: auto;
}

/* Inner nav is in-flow. Only the outer shell scrolls. */
#navigationVertical,
.sk-sidebar__nav {
  font: bold var(--font-size-base) var(--font-base);
  text-decoration: none;
  color: var(--color-text-primary);
  position: static;
  display: block;
  width: 100%;
  min-width: 0;
  overflow: visible;
  padding: 0; margin: 0; background: transparent; border: none;
  height: auto;
  max-height: none;
}
#navigationVertical ul    { margin: 0; padding: 0; list-style: none; }
#navigationVertical ul li {
  color: transparent; font-weight: normal; text-align: left;
  margin: 0; padding: 0; width: 100%;
  background-color: transparent;
  transition: background-color var(--transition-normal), color var(--transition-normal);
}
#navigationVertical ul li a:link,
#navigationVertical ul li a:visited {
  color: var(--color-text-primary); font-weight: normal; text-align: left;
  text-decoration: none; background-color: transparent;
  border-bottom: none; border-left: 3px solid transparent;
  padding: 8px 16px; display: block; width: 100%;
  box-sizing: border-box;
  transition: color var(--transition-normal), background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal);
}
#navigationVertical ul li a.current {
  color: var(--brand-primary) !important; font-weight: 600;
  text-decoration: none; background: var(--color-bg-hover) !important;
  width: 100%; padding: 8px 16px; border-bottom: none;
  border-left: 3px solid var(--brand-accent);
  box-shadow: var(--shadow-xs); box-sizing: border-box;
}
#navigationVertical ul li a.current i { color: var(--brand-accent); }
#navigationVertical ul li a:hover {
  color: var(--brand-primary) !important; background: var(--color-bg-hover) !important;
  border-left: 3px solid var(--brand-accent);
  /* No padding-left override: erediteremo dal baseline (16px) per evitare
     lo shift orizzontale animato di +4px sul mouseover. Il feedback visivo
     dell'hover e' gia' dato da background + border-left colorato + box-shadow
     + icona che scala (regola sotto). */
  box-shadow: var(--shadow-xs);
}
/* v49 A11Y: focus ring sidebar */
#navigationVertical ul li a:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px rgba(40, 68, 115, 0.3);
  border-radius: var(--radius-sm);
}
#navigationVertical ul li a:hover i { color: var(--brand-accent); transform: scale(1.1); }

/* ── 14a. Intestazione di sezione della spalla sinistra ──
   Componente additivo. Sono supportati sia il titolo statico legacy:
   <li class="sk-sidebar-section"><span>Nome sezione</span></li>
   sia il gruppo richiudibile:
   <li class="sk-sidebar-section"><details open><summary>Nome sezione</summary><ul>…</ul></details></li>.
   L'attributo `open` rende tutte le sezioni inizialmente aperte; <summary>
   fornisce apertura e chiusura nativa, anche da tastiera, senza script. */
#navigationVertical ul li.sk-sidebar-section {
  width: auto;
  min-width: 0;
  margin: 14px 8px 6px;
  padding: 0 0 0 8px;
  color: var(--brand-primary);
  background: transparent;
  border-left: 3px solid var(--brand-accent);
  font-family: var(--font-base);
  font-size: var(--font-size-xs);
  font-weight: 700;
  line-height: 16px;
  letter-spacing: 0.08em;
  text-align: left;
  text-transform: uppercase;
  cursor: default;
  user-select: none;
  box-sizing: border-box;
  transition: none;
}

#navigationVertical ul li.sk-sidebar-section:first-child {
  margin-top: 4px;
}

#navigationVertical ul li.sk-sidebar-section > span {
  display: block;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

#navigationVertical ul li.sk-sidebar-section > details {
  margin: -14px -8px -6px -8px;
  color: inherit;
}

#navigationVertical ul li.sk-sidebar-section > details > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 24px;
  padding: 0 8px 0 8px;
  color: inherit;
  background: transparent;
  cursor: pointer;
  list-style: none;
  outline: none;
}

#navigationVertical ul li.sk-sidebar-section > details > summary::-webkit-details-marker {
  display: none;
}

#navigationVertical ul li.sk-sidebar-section > details > summary::after {
  content: "";
  width: 6px;
  height: 6px;
  margin-left: 8px;
  flex: 0 0 auto;
  border: solid currentColor;
  border-width: 0 1.5px 1.5px 0;
  transform: rotate(-45deg);
  transition: transform var(--transition-fast);
}

#navigationVertical ul li.sk-sidebar-section > details[open] > summary::after {
  transform: rotate(45deg) translate(-1px, -1px);
}

#navigationVertical ul li.sk-sidebar-section > details > summary:hover {
  color: var(--brand-primary);
  background: var(--color-bg-hover);
}

#navigationVertical ul li.sk-sidebar-section > details > summary:focus-visible {
  box-shadow: 0 0 0 2px rgba(40, 68, 115, 0.3);
  border-radius: var(--radius-sm);
}

#navigationVertical ul li.sk-sidebar-section > details > ul {
  margin: 4px 0 0;
  padding: 0;
}

/* Variante richiudibile: l'accento identifica il titolo e non il contenitore
   dell'intero gruppo, evitando un effetto "binario" continuo nella spalla. */
#navigationVertical ul li.sk-sidebar-section--collapsible {
  padding-left: 0;
  border-left: 0;
}

#navigationVertical ul li.sk-sidebar-section--collapsible > details {
  margin: 0;
}

#navigationVertical ul li.sk-sidebar-section--collapsible > details > summary::before {
  content: "";
  width: 3px;
  height: 14px;
  margin-right: 6px;
  flex: 0 0 auto;
  background: var(--brand-accent);
  border-radius: 2px;
}

.containerVertical,
.sk-sidebar__body {
  position: static;
  width: 100%;
  min-width: 0;
  overflow: visible;
}

/* Sidebar collassata */
.div_MenuLeftSideBar_Principale.collapsed li a,
.sk-sidebar.collapsed li a           { justify-content: center; padding: 12px 0; }
.div_MenuLeftSideBar_Principale.collapsed li a span.label,
.sk-sidebar.collapsed li a span.label { display: none; }
.div_MenuLeftSideBar_Principale.collapsed .sk-sidebar-section,
.sk-sidebar.collapsed .sk-sidebar-section { display: none; }
.div_MenuLeftSideBar_Principale.collapsed,
.sk-sidebar.collapsed                 { width: 72px; min-width: 72px; }


/* ── 14b. Menu laterale ── */

a.menu:link, a.menu:visited { text-decoration: none; font-size: var(--font-size-sm); color: var(--color-info-text); font-weight: normal; transition: color var(--transition-fast); }
.menuSelect { text-decoration: none; font-size: var(--font-size-sm); color: var(--brand-primary); font-weight: bold; }
.tabMenu    { border-bottom: 1px solid var(--color-text-secondary); }


/* ==========================================================================
   15. FORM & VALIDAZIONE
   ==========================================================================
   15a  Input base           15e  Validazione (:invalid, :valid, .slc_*)
   15b  Hover                15f  Select
   15c  Focus                15g  Fieldset & Legend
                            15h  SK Date Input Wrapper
   15d  Textarea
   ========================================================================== */

/* ── 15g. Fieldset & Legend ── */

.form-group label + input,
.form-group label + select,
.form-group label + textarea { display: block; }

fieldset { border: 1px solid var(--color-border); margin: 0 0 12px 0; border-radius: var(--radius-md); }
legend   { font-weight: bold; padding: 8px; color: var(--brand-primary); }

/* ── 15a. Input base ── */

input:not([type]),
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="email"],
input[type="month"],
input[type="number"],
input[type="password"],
input[type="search"],
input[type="tel"],
input[type="text"],
input[type="time"],
input[type="url"],
input[type="week"],
select[multiple],
select[size],
textarea {
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--input-radius);
  box-sizing: border-box;
  color: var(--color-text-primary);
  font-family: var(--font-base);
  font-size: 13px; font-weight: normal;
  margin: 0; outline: 0; padding: 5px 10px;
  transition: border-color var(--transition-normal),
              box-shadow var(--transition-normal),
              background-color var(--transition-normal),
              color var(--transition-normal);
  box-shadow: var(--shadow-xs);
}

input:not([type]),
input[type="date"],  input[type="datetime"],  input[type="datetime-local"],
input[type="email"], input[type="month"],     input[type="number"],
input[type="password"], input[type="search"], input[type="tel"],
input[type="text"],  input[type="time"],      input[type="url"],
input[type="week"] {
  height: 30px;
}

/* ── 15b. Hover ── */

input:hover:not(:disabled),
select:hover:not(:disabled),
textarea:hover:not(:disabled) {
  border-color: var(--color-border-dark); box-shadow: var(--shadow-sm);
}

/* ── 15c. Focus ── */

input:not([type]):focus,
input[type="date"]:focus,  input[type="datetime"]:focus,
input[type="datetime-local"]:focus, input[type="email"]:focus,
input[type="month"]:focus, input[type="number"]:focus,
input[type="password"]:focus, input[type="search"]:focus,
input[type="tel"]:focus,   input[type="text"]:focus,
input[type="time"]:focus,  input[type="url"]:focus,
input[type="week"]:focus,
select[multiple]:focus, select[size]:focus,
textarea:focus {
  border: 2px solid var(--brand-primary);
  box-shadow: 0 0 0 3px rgba(40, 68, 115, 0.1);
  outline: none;
}

select[multiple], select[size]             { height: auto; padding: 0; }
select[multiple]:disabled, select[size]:disabled { background: var(--color-bg-white); opacity: 1; }

/* ── 15d. Textarea ── */

textarea { resize: vertical; min-height: 30px; }

/* ── 15e. Validazione ──
   Regole generiche (sempre attive) + regole :placeholder-shown (UX migliorata). */

input:invalid,
textarea:invalid,
.slc_Invalid {
  border-color: var(--invalid-color);
}

input:invalid:not(:placeholder-shown),
textarea:invalid:not(:placeholder-shown) {
  background-image: linear-gradient(90deg, transparent, rgba(239, 68, 68, 0.05));
}

input:required:valid,
textarea:required:valid,
.slc_Valid {
  border-color: var(--valid-color);
}

input:required:valid:not(:placeholder-shown),
textarea:required:valid:not(:placeholder-shown) {
  background-image: linear-gradient(90deg, transparent, rgba(16, 185, 129, 0.05));
}

/* Chiave anagrafica / campo bloccato: native disabled o readonly.
   Senza questa regola il campo resta bianco come gli editabili. */
input:disabled:not([type="checkbox"]):not([type="radio"]),
input[readonly],
textarea:disabled,
textarea[readonly] {
  background-color: #E2E8F0;
  background-image: none;
  border-color: var(--color-border);
  color: var(--color-text-primary);
  cursor: not-allowed;
  opacity: 1;
}

/* ── 15f. Select ── */

select {
  background-color: var(--color-bg-white);
  border: 1px solid var(--input-border);  /* v49 A11Y: 3.23:1 WCAG 1.4.11 */
  border-radius: var(--input-radius);
  color: var(--color-text-primary); cursor: pointer;
  font-family: var(--font-base); font-size: 11px; font-weight: normal;
  height: 30px; margin: 0; outline: 0; padding: 5px 10px;
  text-align: left; text-overflow: ellipsis; white-space: nowrap;
  width: 100%; max-width: 100%;
  transition: border-color var(--transition-normal),
              box-shadow var(--transition-normal),
              background-color var(--transition-normal),
              color var(--transition-normal);
  box-shadow: var(--shadow-xs); box-sizing: border-box;
}
select:hover:not(:disabled) { border-color: var(--color-border-dark); box-shadow: var(--shadow-sm); }
select:focus {
  background-color: var(--color-bg-white); color: var(--color-text-primary);
  border: 2px solid var(--brand-primary);
  box-shadow: 0 0 0 3px rgba(40, 68, 115, 0.1); outline: none;
}
select:disabled { border: 1px solid var(--input-border); color: var(--color-text-secondary); opacity: 0.5; cursor: not-allowed; }


/* ── 15h. SK Date Input Wrapper ──
   v53: pattern riusabile per datepicker con input manuale + popup dhx.Calendar.
   Init JS: skDate(id) o skDate([id1, id2, ...])  (sk-core.js sez.5)            */

.sk-date-wrap {
  position: relative;
  display: inline-flex;
  align-items: center;
  width: 100%;
}
/* Chrome lives here, not only on input[type=text]. Naive <input> without type
   must look like Nome / Costo. skDate() also sets type=text if missing. */
.sk-date-wrap > input {
  width: 100%;
  height: 30px;
  padding: 5px 30px 5px 10px;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--input-radius);
  box-sizing: border-box;
  color: var(--color-text-primary);
  font-family: var(--font-base);
  font-size: 13px;
  font-weight: normal;
  margin: 0;
  outline: 0;
  box-shadow: var(--shadow-xs);
}
/* Override 15c input:focus: niente alone/sfondo rgba sul date field (solo bordo marca). */
.sk-date-wrap > input:focus,
.sk-date-wrap > input:focus-visible {
  outline: none;
  box-shadow: none;
  background-color: var(--color-bg-white);
  border: 2px solid var(--brand-primary);
}
.sk-date-btn {
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  border: none;
  background: none;
  cursor: pointer;
  color: var(--brand-primary);
  font-size: 14px;
  padding: 2px 4px;
  line-height: 1;
  opacity: .6;
  transition: opacity var(--transition-fast), color var(--transition-fast);
}
.sk-date-btn:hover {
  opacity: 1;
  color: var(--brand-accent);
}
.sk-date-btn:focus,
.sk-date-btn:focus-visible {
  outline: 2px solid var(--brand-accent);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
  background: transparent;
  opacity: 1;
}
.sk-date-wrap > input.sk-date-warn {
  border-color: var(--color-warning);
}

/* Suite calendar/combo popup above skFormModal / lookup mask (z-index 100050). */
.dhx_popup {
  z-index: 100070;
}


/* ==========================================================================
   16. GRUPPI / RIQUADRI (box decorativi)
   ========================================================================== */

.gruppo1, .gruppo1div, .gruppo3,
.gruppoRed, .gruppoGreen, .gruppoOrange {
  padding: 10px; border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm); transition: box-shadow var(--transition-normal);
}
.gruppo1    { background-color: var(--brand-white); border: 1px solid var(--color-border); }
.gruppo1:hover { box-shadow: var(--shadow-md); }
/* v44: gap automatico tra pannelli gruppo1 direttamente impilati.
   Adjacent-sibling: non impatta sk-layout-stack (flex gap),
   home layout, pannelli side-by-side in colonne diverse. */
.gruppo1 + .gruppo1 { margin-top: 12px; }

/* Box con skPageToolbar integrata (scheda / grid panel): toolbar come header del card */
.gruppo1.sk-gruppo1--toolbar > .sk-page-toolbar {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md) var(--radius-md) 0 0;
  margin: 0;
  margin-bottom: 0;
  padding: 8px 12px;
  background: var(--color-bg-white);
  box-shadow: var(--shadow-sm);
}

.sk-elenco-filtri {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 16px;
  align-items: flex-end;
  padding: 4px 12px 8px;
}
.sk-elenco-filtri .sk-field { margin: 0; }
.sk-elenco:has(.sk-elenco-filtri) .sk-grid-wrapper {
  height: calc(100vh - 340px);
}

.gruppo1div { display: table; background-color: var(--brand-white); width: 100%; border: 1px solid var(--color-border); }
.gruppo1div:hover { box-shadow: var(--shadow-md); }

.gruppo3      { border: 1px solid var(--color-border-dark); border-bottom-color: var(--brand-primary-dark); }
.gruppoRed    { border: 2px solid var(--color-error); }
.gruppoGreen  { border: 2px solid var(--color-success); }
.gruppoOrange { border: 2px solid var(--color-warning); }

.gruppoFillGreen, .gruppoFillOrange, .gruppoFillRed, .gruppoFillBlue {
  position: fixed; font-size: 11px; padding: 0 10px;
  top: calc(var(--header-h) + var(--hr-bar-h));
  left: var(--sidebar-w); right: 0; height: var(--info-bar-h); z-index: 996;
  box-sizing: border-box; box-shadow: var(--shadow-sm);
  border: 1px solid var(--color-border); border-top: none;
  transition: all var(--transition-normal);
  display: flex; gap: 10px; align-items: center; font-weight: 500;
}
.gruppoFillGreen  { color: var(--brand-white); border-color: var(--color-success-text); background-color: var(--color-success-text); }
.gruppoFillOrange { color: var(--brand-white); border-color: var(--color-warning-text); background-color: var(--color-warning-text); }
.gruppoFillRed    { color: var(--brand-white); border-color: var(--color-error-text);   background-color: var(--color-error-text); }
.gruppoFillBlue   { color: var(--brand-white); border-color: var(--brand-primary); background-color: var(--brand-primary); }


/* ── 16b. Estensione header .title2 ──
   Quando .title2 è il primo figlio di un .gruppo1 / .gruppo1div,
   diventa l'header del riquadro con sfondo, padding e layout flex. */

.gruppo1 > .title2:first-child,
.gruppo1div > .title2:first-child {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  flex-wrap: wrap;
  gap: 6px;
  margin: -10px -10px 10px -10px;
  padding: 10px 16px;
  background: var(--color-bg-main);
  border-bottom: 1px solid var(--color-border-light);
  border-radius: var(--radius-md) var(--radius-md) 0 0;
}

.gruppo1 > .title2:first-child i,
.gruppo1div > .title2:first-child i {
  margin-right: 6px;
}

.title2-badge {
  font-size: var(--font-size-sm);
  font-weight: 600;
  color: var(--color-text-secondary);
  background: var(--color-border-light);
  padding: 3px 10px;
  border-radius: var(--radius-full);
  white-space: nowrap;
  margin-left: auto;
}


/* ==========================================================================
   17. PULSANTI (Buttons)
   ========================================================================== */

.btn1 { background-color: var(--color-border); height: 20px; padding: 0; font: 11px/11px var(--font-base); cursor: pointer; transition: background-color var(--transition-fast), transform var(--transition-fast); }
.btn1:hover { background-color: var(--color-border-dark); transform: translateY(-1px); }

.btn2 { background-color: var(--color-warning-text); height: 20px; padding: 0; font: 11px/11px var(--font-base); cursor: pointer; transition: background-color var(--transition-fast), transform var(--transition-fast); }
.btn2:hover { background-color: var(--brand-accent-dark); transform: translateY(-1px); }

.button-submit {
  display: inline-block; vertical-align: middle;
  margin-top: 2px; margin-left: 2px;
  height: 32px; min-width: 85px; padding: 0 16px;
  font-size: 13px; font-weight: 500; color: var(--brand-primary);
  text-align: center; border: 1px solid var(--color-border);
  border-radius: var(--radius-md); cursor: pointer;
  background-color: var(--color-bg-white);
  box-shadow: var(--shadow-xs);
  transition: background-color var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), transform var(--transition-normal);
}
.button-submit:hover {
  border: 1px solid var(--brand-primary); background-color: var(--color-bg-hover);
  box-shadow: var(--shadow-md); transform: translateY(-2px);
}
.button-submit:active { background: var(--color-bg-hover); transform: translateY(0); box-shadow: var(--shadow-sm); }

.pulsante {
  cursor: pointer; display: inline-flex; align-items: center; gap: 6px;
  padding: 0 14px; height: 34px;
  font-family: var(--font-base); font-size: var(--font-size-sm); font-weight: 500;
  color: var(--brand-primary); background: var(--gradient-card);
  border: 1px solid var(--tab-border); border-radius: var(--radius-sm);
  box-shadow: var(--shadow-xs);
  transition: background var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast), color var(--transition-fast), transform var(--transition-fast);
  user-select: none; white-space: nowrap; line-height: 1; vertical-align: middle;
}
.pulsante:hover {
  background: linear-gradient(145deg, var(--btn-hover-bg-start) 0%, var(--btn-hover-bg-end) 100%);
  border-color: var(--brand-primary); box-shadow: var(--shadow-sm);
  transform: translateY(-1px); color: var(--brand-primary);
}
.pulsante:active {
  background: linear-gradient(145deg, var(--btn-active-bg-start) 0%, var(--btn-active-bg-end) 100%);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.15); transform: translateY(0);
}
.pulsante:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(40, 68, 115, 0.25); }
.pulsante i { font-size: 12px; }


/* ==========================================================================
   18. TOOLBAR (gruppoToolbar)
   ========================================================================== */

.gruppoToolbar {
  width: 100%; vertical-align: middle; display: block;
  height: var(--toolbar-h); background-color: var(--color-bg-white);
  border: none; border-bottom: 1px solid var(--color-border);
  border-radius: 0; box-shadow: none;
}
.skToolbar {
  background: var(--color-bg-white); border: none;
  border-bottom: 1px solid var(--color-border); border-radius: 0;
}


/* ==========================================================================
   19. PULSANTIERA MODULI (App, App2, noModulo)
   ========================================================================== */

.AppTitle { height: 10px; color: var(--brand-white); text-decoration: none; text-align: left; vertical-align: middle; }

.App {
  height: 28px; color: var(--color-text-dark); text-decoration: none; font-weight: normal;
  text-align: left; vertical-align: middle; cursor: pointer;
}
.App:hover { color: var(--brand-white); background-color: var(--brand-accent); }

.App2_Empty {
  color: var(--color-text-dark); text-decoration: none; font-weight: normal; text-align: left;
  vertical-align: middle; background-color: var(--brand-bg);
  border-radius: var(--radius-md); max-height: 80px; flex: 1 0 47%;
}

.App2 {
  text-decoration: none; font-weight: normal; text-align: left;
  vertical-align: middle; cursor: pointer; background-color: var(--brand-white);
  border-radius: var(--radius-md); border: 1px solid var(--color-border);
  box-shadow: var(--shadow-sm); max-height: 80px; flex: 1 0 47%;
  transition: box-shadow var(--transition-normal), transform var(--transition-normal);
}
.App2:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }

.App2Container  { display: flex; flex-wrap: wrap; gap: 5px 2%; padding-left: 10px; }
.App2Box        { display: flex; border-radius: var(--radius-md); min-width: 350px; flex-direction: column; flex: 1 0 49%; max-width: 50%; }
.App2HeaderDiv  { text-align: left; height: 20px; margin-bottom: 5px; padding-left: 5px; }
.App2HeaderTitle { font-size: 15px; font-weight: var(--productTextWeight); color: var(--brand-primary); }
.App2Title      { padding-bottom: 5px; left: 10px; vertical-align: bottom; font-size: 15px; position: relative; }

.App2BoxMyCanopo { display: flex; border-radius: var(--radius-md); min-width: 350px; flex-direction: column; flex: 1 0 99%; max-width: 100%; }

.App2Container4Items { display: flex; flex-wrap: wrap; gap: 5px 1%; padding-left: 10px; }
.App24Items {
  color: var(--color-text-dark); text-decoration: none; font-weight: normal; text-align: left;
  vertical-align: middle; cursor: pointer; background-color: var(--color-border-dark);
  border-radius: var(--radius-md); border: 1px solid var(--color-border);
  max-height: 80px; flex: 1 0 21%; min-width: 150px; max-width: 400px;
  transition: color var(--transition-normal), filter var(--transition-normal), box-shadow var(--transition-normal), transform var(--transition-normal);
}

.App2ContainerMyCanopo { display: flex; flex-wrap: wrap; gap: 5px 1%; padding-left: 10px; }
.App2MyCanopo {
  color: var(--color-text-dark); text-decoration: none; font-weight: normal; text-align: left;
  vertical-align: middle; cursor: pointer; background-color: var(--color-border-dark);
  border-radius: var(--radius-md); border: 1px solid var(--color-border);
  max-height: 80px; flex: 1 0 21%; min-width: 150px; max-width: 400px;
  transition: all var(--transition-normal);
}
.App2MyCanopo:hover { color: var(--brand-white); filter: brightness(90%); transform: translateY(-2px); box-shadow: var(--shadow-md); }

.App2MyCanopo_Empty {
  color: var(--color-text-dark); text-decoration: none; font-weight: normal; text-align: left;
  vertical-align: middle; background-color: var(--brand-bg);
  border-radius: var(--radius-md); max-height: 80px; flex: 1 0 21%;
}

.App2ContainerMyCanopo .App2MyCanopo .App2Icon,
.App2ContainerMyCanopo .App2MyCanopo .App2Title { color: var(--color-text-primary); }

.App2ColorTitle { color: var(--productTextColor); }

.App2Button {
  color: var(--buttonTextColor); background-color: var(--buttonBackgroundColor);
  border-radius: var(--radius-md); border: 1px solid var(--color-border);
  box-shadow: var(--shadow-sm);
  transition: background-color var(--transition-normal), color var(--transition-normal), box-shadow var(--transition-normal), transform var(--transition-normal);
}
.App2Button:hover,
.App2Button:hover .App2Icon,
.App2Button:hover .App2Title { color: var(--buttonHoverTextColor); }
.App2Button:hover { background-color: var(--buttonHoverBackgroundColor); transform: translateY(-2px); box-shadow: var(--shadow-md); }

.noModulo {
  display: table-cell; width: 240px; text-decoration: none; font-weight: bold;
  text-align: center; padding: 10px; vertical-align: middle; cursor: default;
  height: 260px; color: var(--color-text-dark); background-color: var(--color-border);
  border-bottom: 1px solid var(--brand-white); border-radius: var(--radius-md);
  transition: background-color var(--transition-normal), color var(--transition-normal), transform var(--transition-normal);
}
.noModulo:hover { color: var(--brand-white); background-color: var(--brand-danger-hover); transform: scale(1.02); }


/* ==========================================================================
   20. COLORI BOX HOME (product colors) -- LEGACY
   ==========================================================================
   v57 NOTA: questi colori sono storici (product tiles home originale) e
   intenzionalmente NON sono variabilizzati per preservare il branding di
   lunga data. Se in futuro la home viene rifatta con sk-home-dashboard-kit
   (sez. 36) questi selettori possono essere rimossi.
   Eccezione documentata alla regola "nessun hex hardcoded".
   ========================================================================== */

.TrainingManagmentColor      { background-color: #c2a889; }
.TrainingManagmentColorTitle { color: #a89070; }
.FrontLineColor              { background-color: #d3c25f; }
.FrontLineColorTitle         { color: #d3c25f; }
.SafetyColor                 { background-color: #8fbc8f; }
.SafetyColorTitle            { color: #2e7d32; }
.CompanyOversightColor       { background-color: #f4a460; }
.CompanyOversightColorTitle  { color: #FF8C00; }
.OccupationalHealthColor     { background-color: #f08080; }
.OccupationalHealthColorTitle { color: #e53935; }
.HumanResourcesColor         { background-color: #b0c4de; }
.HumanResourcesColorTitle    { color: var(--brand-primary); }
.IncidentManagementColor     { background-color: #9bcace; }


/* ==========================================================================
   21. DIMENSIONI PREDEFINITE INPUT / TEXTAREA / SELECT
   ========================================================================== */

.input     { text-align: left; width: 99%; }
.input_80  { text-align: left; width: 80px; }
.input_100 { text-align: left; width: 100px; }
.input_200 { text-align: left; width: 200px; }
.input_300 { text-align: left; width: 300px; }
.input_400 { text-align: left; width: 400px; }
.input_500 { text-align: left; width: 500px; }
.input_600 { text-align: left; width: 600px; }
.input_700 { text-align: left; width: 700px; }
.input_800 { text-align: left; width: 800px; }

.textarea_200 { text-align: left; width: 200px; }
.textarea_300 { text-align: left; width: 300px; }
.textarea_400 { text-align: left; width: 400px; }
.textarea_450 { text-align: left; width: 450px; }
.textarea_500 { text-align: left; width: 500px; }
.textarea_600 { text-align: left; width: 600px; }

.select_100 { text-align: left; max-width: 100px; }
.select_200 { text-align: left; max-width: 200px; }
.select_300 { text-align: left; max-width: 300px; }
.select_400 { text-align: left; max-width: 400px; }
.select_500 { text-align: left; max-width: 500px; }
.select_600 { text-align: left; max-width: 600px; }
.select_700 { text-align: left; max-width: 700px; }
.select_800 { text-align: left; max-width: 800px; }
.select_900 { text-align: left; max-width: 900px; }


/* ==========================================================================
   22. CRYSTAL REPORTS -- LEGACY
   ==========================================================================
   v57 NOTA: stile per il viewer Crystal Reports (componente di terze parti
   con markup non-modificabile). I colori hex sono documentati come eccezione
   storica. Se il modulo Report viene sostituito da un viewer nativo queste
   regole possono essere rimosse in blocco.
   ========================================================================== */

.crpage   { background-color: var(--brand-white); color: var(--color-text-dark); font-family: verdana, Arial; }
.crheader { background-color: #E4E4EC; color: var(--color-text-dark); font-family: verdana, Arial; border-bottom: 1px solid #BEBED1; }
.crheader A       { color: var(--color-text-dark); cursor: pointer; text-decoration: none; }
.crheader A:hover { color: var(--color-error-text); }

.crtitle { color: #52526F; font-size: 11pt; font-family: var(--font-base); }

.crpagepath         { background-color: #006699; color: var(--brand-white); padding-left: 10px; }
.crpagepath A       { color: var(--brand-white); cursor: pointer; text-decoration: none; }
.crpagepath A:hover { color: var(--color-error-text); }

.crwizard      { background-color: #CAC9D9; color: var(--color-text-dark); font-family: verdana, Arial; border-top: 1px solid var(--brand-white); }
.crwizardtitle { color: #52526F; font-size: 11pt; font-family: var(--font-base); }

.crwizardtabbackground   { background-color: #CAC9D9; color: var(--color-text-dark); font-family: var(--font-base); font-size: 10pt; }
.crwizardtabbackground A { text-decoration: none; color: var(--color-text-dark); }

.crwizardtabborder {
  background-color: #CAC9D9; color: var(--color-text-dark); font-family: var(--font-base); font-size: 11pt;
  border-left: 1px solid var(--brand-white); border-bottom: 1px solid var(--brand-white); border-right: 1px solid var(--brand-white);
  padding-bottom: 7px; padding-top: 10px;
}
.crwizardtabborder2 { border-bottom: 1px solid var(--brand-white); }

.crwizardtoolbar         { background-color: #CAC9D9; color: var(--color-text-dark); font-family: var(--font-base); font-size: 11pt; }
.crwizardtoolbar A       { color: var(--color-text-dark); cursor: pointer; text-decoration: none; }
.crwizardtoolbar A:hover { color: var(--color-error-text); }

.crwizardinstructions    { color: #58587b; font-family: var(--font-base); font-size: 11pt; }
.crwizardformula         { background-color: #CAC9D9; color: var(--color-text-dark); font-family: var(--font-base); font-size: 11pt; }
.crwizardformulatextbox  { font-family: var(--font-base); font-size: 11pt; }
.crwizardformulabutton   { font-family: var(--font-base); font-size: 9pt; font-weight: bold; }
.crwizardfields          { background-color: #CAC9D9; color: var(--color-text-dark); font-family: var(--font-base); font-size: 11pt; }
.crwizardfieldsselect    { font-family: var(--font-base); font-size: 9pt; }

.crsearchresults, .crsearchresultsalt {
  color: #636384; font-family: var(--font-base); font-size: 10pt;
  border-width: 0; padding: 1px 3px;
}
.crsearchresults    { background-color: var(--brand-white); }
.crsearchresultsalt { background-color: #ECECF2; }

.crsearchresults A, .crsearchresultsalt A,
.crsearchresults A:hover, .crsearchresultsalt A:hover {
  color: #636384; font-family: var(--font-base); font-size: 10pt;
}

.crsearchresultstitle {
  background-color: #DFDEEA; color: var(--color-text-dark); font-size: 10pt;
  font-family: var(--font-base); font-weight: normal; border-width: 0; padding: 1px 3px;
}

.crsearchresultstoolbar         { background-color: var(--brand-white); color: var(--color-text-dark); }
.crsearchresultstoolbar A       { color: var(--color-info-text); cursor: pointer; text-decoration: none; }
.crsearchresultstoolbar A:hover { color: var(--brand-accent); }
.crsearchresultsbutton          { font-size: 9pt; font-family: var(--font-base); font-weight: bold; }

.crcaption { color: var(--color-text-dark); font-size: 14pt; font-family: verdana, Arial; }

.crtoolbar {
  background-color: #E4E4EC; color: var(--color-text-dark); font-size: 8pt; font-family: verdana, Arial;
  border-bottom: 1px solid #BEBED1; border-top: 1px solid var(--brand-white);
}
.crtoolbar A       { color: var(--color-text-dark); cursor: pointer; text-decoration: none; }
.crtoolbar A:hover { color: var(--color-error-text); }
.crtoolbar A IMG   { border: 0; }

.crtoolbarlist, .crtoolbartextbox { font-size: 8pt; font-family: verdana, Arial; }
.crtoolbartextboxgoto   { font-size: 8pt; font-family: verdana, Arial; width: 40px; height: 16px; }
.crtoolbartextboxsearch { font-size: 8pt; font-family: verdana, Arial; width: 90px; height: 16px; }

.crtoptoolbar         { background-color: #0073AA; color: var(--brand-white); }
.crtoptoolbar A       { color: var(--brand-white); cursor: pointer; text-decoration: none; }
.crtoptoolbar A:hover { color: var(--color-error-text); }
.crcontent            { font-size: 12pt; }


/* ==========================================================================
   23. CALENDARIO
   ========================================================================== */

.giorniSettimana { font-family: var(--font-base); font-size: 11px;  /* v49 A11Y: era 9px */ font-weight: bold; color: var(--brand-white); }

.bordoSxBottom   { border-left: 1px solid var(--brand-primary); border-bottom: 1px solid var(--brand-primary); }
.bordoSxBottomDx { border-left: 1px solid var(--brand-primary); border-bottom: 1px solid var(--brand-primary); border-right: 1px solid var(--brand-primary); }
.bordoBottom     { border-bottom: 1px solid var(--brand-primary); }

.txtAppuntamenti { font-family: var(--font-base); font-size: var(--font-size-xs); color: var(--color-text-primary); }
.txtDaConvocare  { font-family: var(--font-base); font-size: var(--font-size-xs); color: var(--color-error-text); }

.festivo      { background-color: #EBEBEB; }
.festivo1     { background-color: #EAEBEE; }
.festivo2     { background-color: #fffcd5; }
.appuntamento { background-color: #ADE6F4; }
.assenza      { background-color: var(--color-warning-text); }
.calendario   { background-color: var(--brand-white); }

.giorno, .giornocalendario, .giornoappuntamento {
  font-family: var(--font-base); font-size: 12px; font-weight: bold; color: var(--brand-primary); padding-left: 2px;
}
.giornofestivo { font-family: var(--font-base); font-size: 12px; color: var(--color-text-light); padding-left: 2px; }
.giornoassenza { font-family: var(--font-base); font-size: 12px; color: var(--color-text-primary); font-weight: bold; padding-left: 2px; }

/* ──────────────────────────────────────────────────────────
   23b. SK CALENDAR KIT  (calendario mensile XSLT)
   Aggiungere in default.css dopo la sezione 23 esistente.
   ────────────────────────────────────────────────────────── */

.sk-cal-table {
  width: 100%;
  min-width: 560px;
  border-collapse: collapse;
  table-layout: fixed;
}

/* ── Header giorni settimana ── */
.sk-cal-table thead th {
  background: var(--brand-primary);
  color: var(--brand-white);
  font-family: var(--font-base);
  font-size: var(--font-size-sm);
  font-weight: 600;
  text-align: left;
  padding: 6px 8px;
  border: none;
  letter-spacing: 0.2px;
}
.sk-cal-table thead th:first-child {
  border-radius: var(--radius-sm) 0 0 0;
}
.sk-cal-table thead th:last-child {
  border-radius: 0 var(--radius-sm) 0 0;
}
.sk-cal-table thead th.sk-cal-we {
  background: var(--brand-primary-dark);
}

/* ── Celle giorno ── */
.sk-cal-cell {
  vertical-align: top;
  height: 80px;
  border: 1px solid var(--color-border-light);
  padding: 0;
  transition: background var(--transition-fast);
}
.sk-cal-cell--active {
  cursor: pointer;
}
.sk-cal-cell--active:hover {
  box-shadow: inset 0 0 0 2px var(--brand-accent);
}
.sk-cal-cell--we {
  /* v57: weekend di default piu' tenue. Valore esplicito per evitare regola vuota. */
  background-color: var(--color-bg-main);
}

/* ── Numero giorno ── */
.sk-cal-day {
  font-family: var(--font-base);
  font-size: 13px;
  font-weight: 700;
  color: var(--brand-primary);
  padding: 4px 6px 2px;
  line-height: 1;
}
.sk-cal-day--we {
  color: var(--color-text-light);
  font-weight: 500;
}

/* ── Corpo cella (pillole) ── */
.sk-cal-body {
  padding: 2px 4px 4px;
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
}

/* ── Pillola stato corso ── */
.sk-cal-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 18px;
  padding: 0 5px;
  border-radius: 3px;
  font-family: var(--font-base);
  font-size: 10px;
  font-weight: 700;
  color: #fff;
  line-height: 1;
  box-shadow: 0 1px 2px rgba(0,0,0,0.12);
  cursor: inherit;
}


/* ==========================================================================
   24. MANICHINO DPI -- LEGACY
   ==========================================================================
   v57 NOTA: componente visuale storico per DPI (Dispositivi Protezione).
   Se sostituito da sk-svg-chart-kit "risk-figure" queste regole possono
   essere rimosse. Eccezione documentata alla regola hex.
   ========================================================================== */

#manichinoDpiContainer { position: relative; top: 0; left: 0; margin-left: 7px; display: block; height: 650px; }
#tabellaDPI            { margin-top: 0; width: 95%; }
#tabellaDPI th         { border-bottom: 1px solid var(--color-text-dark); font-size: var(--font-size-sm); text-align: left; }
#tabellaDPI tbody td   { height: 40px; }

#manichinoDpiLivello0     { position: absolute; top: 0; left: 30px; }
#manichinoDpiLivello0 img { border: 0; }

#manichinoDpiLivelloTronco, #manichinoDpiLivelloMano,
#manichinoDpiLivelloGamba, #manichinoDpiLivelloBraccio,
#manichinoDpiLivelloGastroIntestinale, #manichinoDpiLivelloPiede,
#manichinoDpiLivelloVieRespiratorie, #manichinoDpiLivelloOcchi,
#manichinoDpiLivelloUdito, #manichinoDpiLivelloCranio,
#manichinoDpiLivelloVolto, #manichinoDpiLivelloPelle {
  position: absolute; top: 0; left: 30px;
}

#manichinoDpiLivelloTronco            { z-index: 1; }
#manichinoDpiLivelloMano              { z-index: 2; }
#manichinoDpiLivelloPiede             { z-index: 3; }
#manichinoDpiLivelloVieRespiratorie   { z-index: 4; }
#manichinoDpiLivelloOcchi             { z-index: 5; }
#manichinoDpiLivelloUdito             { z-index: 6; }
#manichinoDpiLivelloCranio            { z-index: 7; }
#manichinoDpiLivelloVolto             { z-index: 8; }
#manichinoDpiLivelloPelle             { z-index: 9; }
#manichinoDpiLivelloGastroIntestinale { z-index: 10; }
#manichinoDpiLivelloBraccio           { z-index: 11; }
#manichinoDpiLivelloGamma             { z-index: 12; }

#manichinoDpiLivelloTroncoLegenda, #manichinoDpiLivelloManoLegenda,
#manichinoDpiLivelloGambaLegenda, #manichinoDpiLivelloBraccioLegenda,
#manichinoDpiLivelloGastroIntestinaleLegenda, #manichinoDpiLivelloPiedeLegenda,
#manichinoDpiLivelloVieRespiratorieLegenda, #manichinoDpiLivelloOcchiLegenda,
#manichinoDpiLivelloUditoLegenda, #manichinoDpiLivelloCranioLegenda,
#manichinoDpiLivelloVoltoLegenda, #manichinoDpiLivelloPelleLegenda {
  position: absolute; background-color: transparent; z-index: 100; color: var(--color-text-dark); font-size: 11px;  /* v49 A11Y: era 9px */ width: 240px;
}

#manichinoDpiLivelloCranioLegenda            { top: 35px;  left: 310px; }
#manichinoDpiLivelloUditoLegenda             { top: 72px;  left: 310px; }
#manichinoDpiLivelloOcchiLegenda             { top: 108px; left: 310px; }
#manichinoDpiLivelloVieRespiratorieLegenda   { top: 145px; left: 370px; }
#manichinoDpiLivelloVoltoLegenda             { top: 181px; left: 310px; }
#manichinoDpiLivelloPelleLegenda             { top: 265px; left: 310px; }
#manichinoDpiLivelloTroncoLegenda            { top: 303px; left: 370px; }
#manichinoDpiLivelloGastroIntestinaleLegenda { top: 339px; left: 400px; }
#manichinoDpiLivelloManoLegenda              { top: 417px; left: 310px; }
#manichinoDpiLivelloBraccioLegenda           { top: 454px; left: 320px; }
#manichinoDpiLivelloGambaLegenda             { top: 546px; left: 320px; }
#manichinoDpiLivelloPiedeLegenda             { top: 583px; left: 310px; }


/* ==========================================================================
   25. HOME BOX / GRID
   ========================================================================== */

#application { height: auto; width: 100%; position: absolute; margin: auto; top: 5px; }

.grid-sizer, .grid {
  width: 70px; height: 70px; margin-bottom: 10px; margin-left: 5px; margin-right: 5px;
  display: table-row; text-align: center; transition: top 1s ease, left 1s ease;
}
.grid strong       { border-bottom: 1px solid var(--color-border); margin: 10px 0; display: block; font-size: 17px; }
.grid .meta        { text-align: right; color: var(--color-text-secondary); font-style: italic; }
.grid .imgholder img { max-width: 100%; background: var(--color-border); display: block; }
#layout            { background: var(--brand-white); padding: 0; }


/* ==========================================================================
   26. LOADER, SPINNER & OVERLAY
   ========================================================================== */

/* --- Loader full-page (Conic ring CSS-only, v58) -------------------------
   API invariata: <div class="spinner"></div> + body.classList.add('loading').
   Etichetta multilingua via :lang() (richiede sk-core.js v1.10+ per fallback
   navigator.language quando <html lang> non e' settato server-side).
   prefers-reduced-motion: gestito dall'override globale (sez. 53.9, ~L9697). */
.spinner {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 1100;
  background: rgba(255, 255, 255, .78);
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 12px;
  pointer-events: auto; /* esplicito: cattura input globalmente sotto loading */
}
/* v60b (2026-05-25): dark mode esplicito per il backdrop full-page.
   Senza override il rgba(255,255,255,.78) restava bianco semi-trasparente
   sopra al fondo scuro, dando effetto "macchia bianca". slate-900 a 0.82
   garantisce contrasto con lo spinner conic e leggibilita' del label. */
html[data-theme="dark"] .spinner {
  background: rgba(15, 23, 42, .82);
}
body.loading          { overflow: hidden; }
body.loading .spinner { display: flex; }

.spinner::before {
  content: "";
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: conic-gradient(
    from 0deg,
    transparent 0%,
    var(--brand-primary) 50%,
    var(--brand-accent) 90%,
    transparent 100%
  );
  -webkit-mask: radial-gradient(circle, transparent 58%, #000 59%);
          mask: radial-gradient(circle, transparent 58%, #000 59%);
  animation: sk-spinner-spin 1s linear infinite;
}

.spinner::after {
  content: "Loading";
  font-size: 12px;
  font-weight: 500;
  letter-spacing: .04em;
  color: var(--brand-primary);
}
.spinner:lang(it)::after { content: "Caricamento"; }
.spinner:lang(en)::after { content: "Loading"; }
.spinner:lang(fr)::after { content: "Chargement"; }
.spinner:lang(de)::after { content: "Wird geladen"; }
.spinner:lang(es)::after { content: "Cargando"; }
.spinner:lang(pt)::after { content: "Carregando"; }

@keyframes sk-spinner-spin { to { transform: rotate(360deg); } }

#overlay {
  visibility: hidden; position: fixed; inset: 0;
  width: 100%; height: 100%; z-index: 1100;
  background-color: var(--brand-bg); opacity: 0.94;
}
#overlay #uploaderContainer {
  max-width: 700px; width: 99%; margin: 200px auto;
  padding: 4px; border: 1px solid var(--color-border-dark); background-color: var(--color-border);
}

#overlayModal {
  visibility: hidden; position: fixed; inset: 0;
  width: 100%; height: 100%; z-index: 1100;
  background-color: var(--brand-bg); opacity: 0.94;
}
#overlayModal #modalContainer {
  width: 700px; margin: 200px auto; padding: 4px;
  border: 1px solid var(--color-border-dark); background-color: var(--brand-white);
}

#progressbar { border: 1px solid var(--color-border-dark); background: var(--brand-white); width: 99%; height: 24px; border-radius: 10px; }
#status      { background: var(--color-success); width: 50%; height: 24px; border-radius: 10px; }

/* .loaderChart RIMOSSO v60 (2026-05-25). Tutti i 7 XSLT che la usavano
   (Furud Dashboard {azioni,formazione,valutazione,sorveglianzaSanitaria,
   appalti}.xslt, Aldebaran AssenzaProlungata, Orione scadenzeProtocolli)
   migrati a .sk-skeleton + .sk-skeleton-chart (sez. 26b). */


/* ==========================================================================
   26b. PROGRESS BAR + SKELETON LOADING (primitive globali v59)
   ==========================================================================
   Promosse da sk-scheduler-kit.js (linee 512-532) per evitare duplicazione
   CSS iniettato a runtime in scheduler/kanban/gantt/upload.

   .sk-progress-bar
     Barra di progresso indeterminata 2px in alto a un componente.
     Pattern: applicare al figlio absolute di un parent position:relative.
     Usata da: scheduler load AJAX, gantt redraw, kanban refresh, qualsiasi
     componente che vuole un indicatore inline non-bloccante.

   .sk-skeleton
     Placeholder shimmer per init pesanti (>200ms). Si applica a singoli
     blocchi (header, riga, cella) per simulare il layout finale.
     Pattern: aggiungere classe sul div placeholder, rimuoverla quando il
     contenuto reale e' pronto.

   API JS opzionale (in sk-core.js): skProgressShow(targetId) / skProgressHide(targetId)
   ========================================================================== */

.sk-progress-bar {
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 2px;
  background: var(--brand-primary);
  transform-origin: left;
  animation: sk-progress 1.5s ease-in-out infinite;
  z-index: 60;
  pointer-events: none;
}
@keyframes sk-progress {
  0%   { transform: scaleX(0); }
  50%  { transform: scaleX(.7); }
  100% { transform: scaleX(1); }
}

.sk-skeleton {
  background: linear-gradient(
    90deg,
    var(--color-bg-secondary, #F1F5F9) 25%,
    var(--color-bg-main, #F8FAFC) 50%,
    var(--color-bg-secondary, #F1F5F9) 75%
  );
  background-size: 200% 100%;
  animation: sk-shimmer 1.2s infinite;
  border-radius: var(--radius-sm, 4px);
}
@keyframes sk-shimmer {
  0%   { background-position:  200% 0; }
  100% { background-position: -200% 0; }
}

/* v60 (2026-05-25): utility skeleton per chart-box / dashboard placeholder.
   Sostituto enterprise di .loaderChart deprecato (V3). Riempie il container
   parent con shimmer rettangolare invece di uno spinner cerchio centrato.
   Usato in: Furud Dashboard/* (azioni, formazione, valutazione, sorvSan,
   appalti), Aldebaran AssenzaProlungata, Orione scadenzeProtocolli. */
.sk-skeleton-chart {
  width: 99%;
  min-height: 200px;
  margin: 4px 0;
}

/* ====================================================================
   v60b (2026-05-25) - Loader label i18n utility (enterprise ready)
   --------------------------------------------------------------------
   Classe utility per applicare i18n CSS-only ai label dei loader.
   Uso:
     <span class="sk-loader-label" aria-hidden="true"></span>
   Il testo viene applicato da ::after via :lang() che eredita
   dall'attributo lang del <html> (impostato server-side o da sk-core.js).
   Fallback (no :lang()) = inglese "Loading".
   Varianti disponibili tramite modificatori CSS:
     .sk-loader-label                       -> "Loading" / "Caricamento in corso"
     .sk-loader-label--short                -> "Loading..." / "Caricamento..."
   Lingue supportate: en (default), it, fr, de, es, pt.
   ==================================================================== */
.sk-loader-label::after,
.sk-loader-label--short::after            { content: "Loading"; }
.sk-loader-label:lang(it)::after          { content: "Caricamento in corso"; }
.sk-loader-label:lang(en)::after          { content: "Loading"; }
.sk-loader-label:lang(fr)::after          { content: "Chargement en cours"; }
.sk-loader-label:lang(de)::after          { content: "Wird geladen"; }
.sk-loader-label:lang(es)::after          { content: "Cargando"; }
.sk-loader-label:lang(pt)::after          { content: "Carregando"; }
.sk-loader-label--short:lang(it)::after   { content: "Caricamento\2026"; }
.sk-loader-label--short:lang(en)::after   { content: "Loading\2026"; }
.sk-loader-label--short:lang(fr)::after   { content: "Chargement\2026"; }
.sk-loader-label--short:lang(de)::after   { content: "Lade\2026"; }
.sk-loader-label--short:lang(es)::after   { content: "Cargando\2026"; }
.sk-loader-label--short:lang(pt)::after   { content: "Carregando\2026"; }

/* Aria-label visivamente nascosto ma annunciato dagli screen reader.
   Pattern complementare a .sk-loader-label per role="status" / aria-live. */
.sk-loader-sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}

/* Dark mode esplicito per skeleton/progress (v60b).
   I componenti gia' usano var() ma chiariamo il contrasto per il theme dark. */
html[data-theme="dark"] .sk-skeleton {
  background: linear-gradient(
    90deg,
    var(--color-bg-secondary, #1E293B) 25%,
    var(--color-bg-main, #0F172A) 50%,
    var(--color-bg-secondary, #1E293B) 75%
  );
}
html[data-theme="dark"] .sk-skeleton-chart {
  /* nessun override specifico, eredita da .sk-skeleton */
}


/* ==========================================================================
   27. VARIE (PathRoot, DUVRI, multiselect, ecc.)
   ========================================================================== */

.PathRoot,
A.PathRoot:link, A.PathRoot:visited, A.PathRoot:active {
  color: var(--color-text-primary); font-family: var(--font-base); font-size: 11px;  /* v49 A11Y: era 9px */
  font-weight: normal; text-decoration: none;
}
A.PathRoot:hover { color: var(--brand-accent); }

.tipologie { font-size: 10pt; font-weight: bold; margin: 3px; text-align: center; }

/* Parent di .multiSelectText deve essere relative (il figlio è absolute) */
*:has(> .multiSelectText) { position: relative; }

.multiSelectText {
  position: absolute; inset: 0;
  font-family: var(--font-base); font-size: 12px; color: var(--color-text-dark);
  border: none; box-shadow: 0 2px 3px var(--color-border);
  background-color: transparent;
  border-bottom-left-radius: 2px; border-bottom-right-radius: 2px;
  user-select: none; overflow-x: hidden; overflow-y: auto;
  transition: height 0.15s ease 0s;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  font-weight: normal; padding-top: 4px; padding-left: 24px;
  box-sizing: border-box;
}

.invio-alert-responsabile-i:hover { cursor: pointer; }


/* ==========================================================================
   28. LOGIN
   ==========================================================================
   Card-based login: .login-card (logo sx + form dx), responsive,
   modal password scaduta, shine effect, background pattern.
   Nessun colore hardcoded: tutto da custom properties sez.1.
   ========================================================================== */

/* -------- Background pattern (statico, no animazione) -------- */
.login-bg-pattern {
  position: fixed; width: 100%; height: 100%; top: 0; left: 0;
  z-index: 0; opacity: 0.03; pointer-events: none;
}
.login-bg-pattern::before {
  content: ''; position: absolute; top: -50%; right: -20%;
  width: 800px; height: 800px; border-radius: 50%;
  border: 2px solid var(--brand-primary);
}
.login-bg-pattern::after {
  content: ''; position: absolute; bottom: -30%; left: -15%;
  width: 600px; height: 600px; border-radius: 50%;
  border: 2px solid var(--brand-primary);
}

/* -------- Page wrapper -------- */
#loginmain {
  position: relative; z-index: 10; width: 100%; max-width: 750px;
}

#loginerror {
  position: fixed; bottom: 20%; height: auto; width: 60%; left: 20%;
  padding: 5px; color: var(--color-error-text); text-align: center;
  background-color: var(--brand-bg); z-index: 999;
}

/* -------- Card layout -------- */
.login-card {
  background: var(--color-bg-white); border-radius: var(--radius-xl);
  box-shadow: 0 1px 3px rgba(40, 68, 115, 0.08),
              0 8px 32px rgba(40, 68, 115, 0.12);
  border: 1px solid rgba(40, 68, 115, 0.08);
  display: flex; overflow: hidden; position: relative;
  animation: loginFadeInUp 0.8s ease-out;
}

@keyframes loginFadeInUp {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Shine effect: sweep diagonale toni primary */
.login-card::before {
  content: ''; position: absolute; top: -50%; left: -50%;
  width: 200%; height: 200%;
  background: linear-gradient(45deg,
    transparent 25%,
    rgba(40, 68, 115, 0.12) 50%,
    transparent 75%);
  animation: loginShine 5s infinite;
  z-index: 1; pointer-events: none;
}

@keyframes loginShine {
  0%   { transform: translateX(-100%) translateY(-100%) rotate(45deg); }
  100% { transform: translateX(100%) translateY(100%) rotate(45deg); }
}

/* -------- Left branding (logo cliente) -------- */
.login-branding {
  flex: 0 0 auto; width: 35%; min-width: 200px; max-width: 320px;
  background: var(--color-bg-white);
  border-right: 1px solid rgba(40, 68, 115, 0.1);
  padding: 30px 35px 50px; display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  position: relative; z-index: 5; text-align: center;
}

#logobox {
  width: 100%; display: flex; flex-direction: column;
  align-items: center; justify-content: center; text-align: center;
  position: relative; z-index: 6; margin: 0;
}
#logobox img {
  display: block; max-width: 90%; height: auto;
  border-radius: var(--radius-xl); margin: 0 auto; float: none;
}

/* -------- Right form section -------- */
.login-form-section {
  flex: 1; padding: 20px 25px 10px; position: relative;
  z-index: 5; display: flex; flex-direction: column;
}

/* Titolo CANOPO */
#logotitle {
  text-align: center; margin-top: 16px; margin-bottom: 32px;
  position: relative; z-index: 10;
}
.login-logo-text {
  font-family: var(--font-brand); font-size: 38px; font-weight: 700;
  color: var(--brand-primary); letter-spacing: 6px; margin-bottom: 8px;
  position: relative;
}
.login-logo-text::after {
  content: ''; position: absolute; bottom: -6px; left: 50%;
  transform: translateX(-50%); width: 60px; height: 3px;
  background: var(--brand-primary); border-radius: 2px;
}
.login-version {
  color: var(--color-text-secondary); font-size: 13px;
  font-weight: 500; margin-top: 12px; letter-spacing: 1px;
}

/* -------- Input override: font-size 16px previene zoom iOS -------- */
.login-input {
  background: var(--color-bg-white); border: 1px solid var(--color-border);
  border-radius: var(--input-radius); box-sizing: border-box;
  color: var(--color-text-primary); font-family: var(--font-base);
  font-size: 16px; font-weight: normal; margin: 0; outline: 0;
  padding: 10px 14px; height: 44px;
  flex: 1; min-width: 0;
  transition: all var(--transition-normal);
}
@media (min-width: 601px) {
  .login-input { font-size: 13px; }
}
.login-input::placeholder { color: var(--color-text-light); }
.login-input:focus,
.login-input:focus-visible {
  outline: none; border-color: var(--brand-primary);
  box-shadow: 0 0 0 3px rgba(40, 68, 115, 0.15);  /* v49 A11Y */
  background: var(--color-bg-main);
}
select.login-input { cursor: pointer; }

/* -------- Login fields layout -------- */
#loginbox {
  width: 100%; display: flex; justify-content: center; margin-top: 30px;
}
.login-fields {
  width: min(420px, 92%); display: flex; flex-direction: column;
  align-items: stretch; gap: 14px;
}
.login-field-row {
  display: flex; align-items: center; gap: 10px;
}
.login-field-row--link {
  justify-content: flex-end; margin-top: -4px;
}
.login-field-row--recovery {
  justify-content: center; margin-top: -6px; padding-left: 32px;
}
.login-field-row--recovery a {
  font-size: 12px; display: inline-flex; align-items: center;
}
.login-field-row--checkbox {
  display: flex; align-items: center; justify-content: center;
  gap: 8px; color: var(--brand-primary); font-size: 13px;
}
.login-field-row--checkbox label { margin: 0; }

/* -------- Input wrap (input + eye toggle) -------- */
.login-input-wrap {
  flex: 1; min-width: 0; position: relative; display: flex;
  align-items: center;
}
.login-input-wrap .login-input {
  padding-right: 40px;
}
.login-eye-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  background: none; border: none; cursor: pointer; padding: 6px 8px;
  color: var(--color-text-light); font-size: 14px;
  transition: color var(--transition-fast);
  z-index: 2;
}
.login-eye-toggle:hover { color: var(--brand-primary); }

/* -------- Icons in login fields -------- */
.login-card .fa,
.login-card .fas,
.login-card .fa-lg {
  color: var(--color-text-light); transition: all 0.3s ease;
  width: 22px; text-align: center;
}

/* -------- Buttons -------- */
.login-btn-container {
  position: relative; z-index: 100; margin-top: 30px; margin-bottom: 20px;
}
.login-btn-row {
  width: min(420px, 92%); margin: 0 auto; display: flex;
  padding-left: 32px; box-sizing: border-box;
  gap: 12px; justify-content: center; align-items: stretch;
}
.login-btn-cell {
  display: flex; min-width: 0;
}
.login-btn-row.is-multi  .login-btn-cell  { flex: 1 1 0; }
.login-btn-row.is-single .login-btn-cell  { flex: 0 0 auto; justify-content: center; }
.login-btn-row.is-multi  .login-submit    { width: 100%; }
.login-btn-row.is-single .login-submit    { width: 300px; max-width: 100%; }

.login-submit {
  background: var(--brand-primary); color: var(--brand-white);
  border: none; border-radius: var(--radius-lg); font-size: 15px;
  font-weight: 600; cursor: pointer; transition: all 0.3s ease;
  letter-spacing: 0.5px; position: relative; overflow: hidden;
  width: 100%; min-width: 0; height: 50px;
}
.login-submit::before {
  content: ''; position: absolute; top: 0; left: -100%;
  width: 100%; height: 100%;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
  transition: left 0.5s; height: 50px;
}
.login-submit:hover::before { left: 100%; }
.login-submit:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-primary);
  background: var(--brand-primary-light);
  color: var(--brand-white); height: 50px;
}
.login-submit:active { transform: translateY(0); }
.login-submit:disabled {
  opacity: 0.7; cursor: wait; transform: none;
  box-shadow: none;
}

/* -------- Warning master pass -------- */
#masterPassWarning {
  display: none; color: var(--color-error-text); font-size: 12px;
  padding: 12px; background: var(--color-error-light);
  border-left: 4px solid var(--color-error);
  border-radius: var(--radius-md); margin-top: 15px; line-height: 1.4;
}

/* -------- Footer / info -------- */
.login-footer {
  margin-top: auto; padding-top: 15px; position: relative; z-index: 10;
}
.login-info-toggle {
  position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0;
}
.login-divider {
  display: flex; align-items: center; gap: 8px; margin: 20px 0 15px;
  cursor: default;
}
.login-divider__line {
  flex: 1; height: 1px; background: var(--color-border-light);
}
.login-divider__text {
  font-size: 11px; color: var(--color-text-light);
  font-weight: 600; letter-spacing: 0.5px;
  display: inline-flex; align-items: center; gap: 6px;
}
.login-divider__chevron {
  display: none; font-size: 10px; transition: transform 0.3s ease;
}
.login-info-collapsible {
  overflow: visible; max-height: none;
}
.login-info-title {
  font-size: 11px; font-weight: 700; color: var(--brand-primary);
  text-transform: uppercase; text-align: center;
  letter-spacing: 0.5px; white-space: nowrap; margin-bottom: 2px;
}
.login-info-icon {
  color: var(--brand-primary); font-size: 11px; margin-right: 6px;
}
.login-info {
  font-size: 12px; color: var(--color-text-secondary);
  line-height: 1.6; white-space: normal; text-align: center;
}
.login-info strong { color: var(--brand-primary); }
.login-info-grid {
  display: flex; gap: 6px; width: 100%; justify-content: center;
}
.login-info-col { flex: 1; min-width: 0; }

/* -------- Modal password scaduta -------- */
#overlayModal {
  display: none; position: fixed; top: 0; left: 0;
  width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7);
  /* opacity:1 overrides sez.26 (0.94) which made the card semi-transparent */
  opacity: 1;
  /* below dhtmlx.confirm (z-index 20000) so confirm stays clickable on top */
  z-index: 15000; align-items: center; justify-content: center;
}
#modalContainer {
  background: var(--color-bg-white); border-radius: var(--radius-xl);
  box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
  max-width: 600px; width: 90%; max-height: 90vh; overflow: auto;
}
#modalContent { padding: 30px; }

.login-modal-toolbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 16px 24px; border-bottom: 1px solid var(--color-border);
  background: var(--color-bg-main); border-radius: var(--radius-xl) var(--radius-xl) 0 0;
}
.login-modal-toolbar__title {
  font-size: 15px; font-weight: 600; color: var(--brand-primary);
  display: flex; align-items: center; gap: 8px;
}
.login-modal-toolbar__actions {
  display: flex; gap: 8px;
}

.login-modal-fields {
  display: flex; flex-direction: column; gap: 16px;
}
.login-modal-field {
  display: flex; flex-direction: column; gap: 4px;
}
.login-modal-field__label {
  font-size: 13px; font-weight: 600; color: var(--brand-primary);
}
.login-modal-field__input {
  width: 100%; padding: 12px 16px;
  border: 2px solid var(--color-border); border-radius: var(--radius-lg);
  font-size: 16px; transition: all 0.3s ease;
  background: var(--color-bg-white); color: var(--brand-primary);
}
@media (min-width: 601px) {
  .login-modal-field__input { font-size: 15px; }
}
.login-modal-field__input:focus {
  outline: none; border-color: var(--brand-primary);
}
.login-modal-field__hint {
  font-size: 11px; color: var(--color-text-secondary); margin-top: 2px;
}

/* -------- Select hover (solo login, niente gradient) -------- */
.login-card select:hover:not(:disabled) {
  border-color: var(--color-border-dark); box-shadow: var(--shadow-sm);
}

/* ============================================
   28b. LOGIN RESPONSIVE
   ============================================ */
@media (max-width: 900px) {
  .login-card { flex-direction: column; }
  .login-branding {
    flex: 0 0 auto; width: 100%; padding: 40px 30px;
    min-height: 200px; border-right: none;
    border-bottom: 1px solid rgba(40, 68, 115, 0.1);
    text-align: center; align-items: center; justify-content: center;
  }
  #logobox {
    width: 100%; display: flex; align-items: center;
    justify-content: center; margin: 0;
  }
  #logobox img { display: block; margin: 0 auto; max-width: 60%; float: none; }
  .login-form-section { padding: 35px 40px; }
  .login-logo-text { font-size: 36px; }
}

@media (max-width: 600px) {
  .login-branding { padding: 30px 20px; min-height: 150px; }
  #logobox img { max-width: 50%; }
  .login-form-section { padding: 30px 25px; }
  #loginbox { margin-top: 40px; }
  .login-logo-text { font-size: 30px; letter-spacing: 4px; }
  .login-btn-row { flex-direction: column; gap: 10px; padding-left: 32px; }
  .login-btn-cell { width: 100%; }
  .login-submit { width: 100%; min-width: 0; }
  .login-info-grid { flex-direction: column; gap: 14px; }
  .login-info-title { white-space: normal; }

  /* Collapsible footer on mobile */
  .login-divider { cursor: pointer; margin: 12px 0 0; }
  .login-divider:active { opacity: 0.7; }
  .login-divider__chevron { display: inline-block; }
  .login-info-collapsible {
    max-height: 0; overflow: hidden;
    transition: max-height 0.35s ease, opacity 0.3s ease;
    opacity: 0;
  }
  .login-info-toggle:checked ~ .login-info-collapsible {
    max-height: 200px; opacity: 1;
  }
  .login-info-toggle:checked ~ label .login-divider__chevron {
    transform: rotate(180deg);
  }
}


/* ==========================================================================
   29. MEDIA QUERIES
   ========================================================================== */

.hamburger-btn { display: none; }

@media screen and (max-width: 768px) {

  :root { --sidebar-w: 0px; }

  #header { overflow: visible; }

  .hamburger-btn {
    display: table-cell; width: 45px; height: 40px; color: var(--brand-white);
    text-align: center; cursor: pointer; font-size: 18px;
    background-color: var(--brand-primary);
  }
  .toolbarOn, .toolbarOff, .menuprincipale { display: none; }

  #mainMenu.menu-open {
    display: flex; flex-direction: column;
    position: absolute; top: var(--header-h); left: 0; right: 0;
    white-space: normal; overflow: visible;
    max-height: 80vh; overflow-y: auto;
    background: var(--gradient-header);
    box-shadow: 0 8px 24px rgba(0,0,0,0.25);
    border-radius: 0 0 var(--radius-md) var(--radius-md);
    z-index: 1001;
  }
  #mainMenu.menu-open,
  #mainMenu.menu-open tbody,
  #mainMenu.menu-open tr { display: flex; flex-direction: column; width: 100%; }
  #mainMenu.menu-open td { display: block; width: 100%; }
  #mainMenu.menu-open .hamburger-btn {
    position: fixed; top: 0; left: 0;
    width: 45px; height: var(--header-h); z-index: 1002;
    display: flex; align-items: center; justify-content: center;
  }
  #mainMenu.menu-open .Logoinside,
  #mainMenu.menu-open .Logomenu,
  #mainMenu.menu-open .logout,
  #mainMenu.menu-open .cambiapwd,
  #mainMenu.menu-open .tornamodulo { display: none; }
  #mainMenu.menu-open .toolbarOn,
  #mainMenu.menu-open .toolbarOff {
    display: block; text-align: left; padding: 12px 20px;
    max-width: none; width: 100%; line-height: 1.4; font-size: 14px;
    border-bottom: 1px solid rgba(255,255,255,0.1); box-sizing: border-box;
  }
  #mainMenu.menu-open .toolbarOff:hover { background-color: rgba(255,255,255,0.1); }
  #mainMenu.menu-open .toolbarOn {
    background: rgba(255,255,255,0.1);
    border-left: 3px solid var(--brand-accent);
  }
  #mainMenu.menu-open .menuprincipale {
    display: block; padding: 12px 20px; line-height: 1.4; font-size: 16px;
    text-align: left; border-bottom: 1px solid rgba(255,255,255,0.1); box-sizing: border-box;
  }
  #mainMenu.menu-open .menuprincipale:hover { background-color: rgba(255,255,255,0.1); }

  #charts, #footer { display: none; }


  /* ── SIDEBAR → BOTTOM VERTICAL MENU ──
     Su mobile la sidebar sinistra diventa un menu verticale
     posizionato dopo il contenuto principale, non fixed.
     Le voci mostrano icona + label in riga (stile hamburger).
     Il main content NON ha padding-bottom extra. */

  #sk-page-wrapper {
    display: flex;
    flex-direction: column;
    padding-top: var(--header-h);
    padding-bottom: 0;
  }

  /* La tabella wrapper della sidebar diventa statica, sotto il main */
  #sk-page-wrapper > table:nth-of-type(2) {
    position: static;
    bottom: auto;
    left: auto;
    right: auto;
    z-index: auto;
    width: 100%;
    background: var(--color-bg-white);
    box-shadow: none;
    border-top: 1px solid var(--color-border);
  }

  /* Il main occupa tutto lo spazio */
  .div_MainInternoRidotto,
  .div_MainInternoRidotto_Expanded,
  .div_MainInternoRidottoHR,
  .div_MainInternoRidottoHR_Expanded,
  .div_MainInternoRidottoVisita {
    order: 1;
    margin-left: 4px; margin-right: 4px;
    padding-bottom: 16px;
  }

  /* #leadin2 se presente */
  #leadin2 {
    order: 1;
    display: block;
    position: static;
    height: auto;
    overflow: visible;
  }


  /* ── SIDEBAR NAV → lista verticale sotto il contenuto ── */

  .div_MenuLeftSideBar_Principale,
  .sk-sidebar {
    position: static;
    display: block;
    width: 100%; min-width: 100%;
    height: auto;
    padding: 0;
    padding-bottom: env(safe-area-inset-bottom, 0px);
    margin: 0;
    z-index: auto;
    box-sizing: border-box;
    overflow: visible;
    background: var(--color-bg-white);
    border-top: 1px solid var(--color-border);
    border-radius: 0;
    box-shadow: 0 -1px 6px rgba(0, 0, 0, 0.06);
  }

  .div_MenuLeftSideBar_Principale_Hidden { display: none; }

  #navigationVertical {
    position: static;
    width: 100%; min-width: 100%;
    height: auto;
    overflow: visible;
    padding: 0; margin: 0;
    background: transparent; border: none;
    max-height: none;
  }

  /* Lista voci: colonna verticale a tutta larghezza */
  #navigationVertical ul {
    display: flex;
    flex-direction: column;
    width: 100%;
    overflow-x: visible;
    gap: 0;
  }
  #navigationVertical ul::-webkit-scrollbar { display: none; }

  #navigationVertical ul li {
    flex: none;
    min-width: 100%;
    max-width: none;
    width: 100%;
  }

  /* Voce menu: icona + label in riga, tutta larghezza */
  #navigationVertical ul li a:link,
  #navigationVertical ul li a:visited {
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: 12px;
    width: 100%;
    padding: 12px 20px;
    box-sizing: border-box;
    font-size: var(--font-size-base);
    font-weight: 500;
    text-align: left;
    line-height: 1.4;
    border-left: 3px solid transparent;
    border-bottom: 1px solid var(--color-border-light);
    border-top: none;
    background: transparent;
    color: var(--color-text-primary);
    text-decoration: none;
    transition: all var(--transition-fast);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  #navigationVertical ul li a:link i,
  #navigationVertical ul li a:visited i {
    font-size: 16px;
    width: 20px;
    text-align: center;
    flex-shrink: 0;
    margin: 0;
    display: inline-block;
    color: var(--color-text-secondary);
    transition: color var(--transition-fast), transform var(--transition-fast);
  }

  /* Label accanto all'icona */
  #navigationVertical ul li a span.label {
    display: inline;
    font-size: var(--font-size-base);
    max-width: none;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  #navigationVertical ul li:last-child a:link,
  #navigationVertical ul li:last-child a:visited { border-bottom: none; }

  #navigationVertical ul li a.current {
    color: var(--brand-primary) !important;
    font-weight: 700;
    background: var(--color-bg-hover) !important;
    border-left: 3px solid var(--brand-accent);
    border-top: none;
    padding-left: 17px;
    box-shadow: none;
  }
  #navigationVertical ul li a.current i { color: var(--brand-accent); }
  #navigationVertical ul li a:hover {
    color: var(--brand-primary) !important;
    background: var(--color-bg-hover) !important;
    border-left: 3px solid var(--brand-accent);
    border-top: none;
    padding-left: 17px;
    box-shadow: none;
  }
  /* v49 A11Y: focus ring sidebar */
#navigationVertical ul li a:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px rgba(40, 68, 115, 0.3);
  border-radius: var(--radius-sm);
}
#navigationVertical ul li a:hover i { color: var(--brand-accent); transform: scale(1.1); }

  .containerVertical { position: static; width: 100%; min-width: 100%; }


  /* ── BARRE FISSE: full-width ── */
  .headerHRSticky, .headerVisita { left: 0; right: 0; border-radius: 0; }
  .menuOrizzontale               { left: 0; right: 0; }
  .menuOrizzontaleVisita         { left: 0; right: 0; }
  .toolbarVisita                 { left: 0; right: 4px; border-radius: 0; }
  .sk-scheda-toolbar              { left: 0; right: 0; border-radius: 0; }
  .gruppoFillGreen, .gruppoFillOrange, .gruppoFillRed, .gruppoFillBlue {
    left: 0; right: 0; border-radius: 0;
  }

  /* ── LAYOUT VARIO ── */
  #system   { display: inline-block; text-align: left;  vertical-align: top; width: 25%; }
  #user     { display: inline-block; text-align: right; vertical-align: top; min-width: 15%; }
  #database { display: inline-block; text-align: right; vertical-align: top; min-width: 205px; }
  #leftSidebar {
    background-color: var(--brand-primary); width: 50%;
    position: fixed; left: 0; top: var(--header-h); bottom: 0; height: auto; overflow: auto;
  }
  #rightsidebar {
    background-color: var(--brand-bg); width: 50%;
    position: fixed; right: 0; top: var(--header-h); bottom: 0; height: auto; overflow: auto;
  }

  #navigation ul { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; gap: 2px; padding-bottom: 2px; }
  #navigation ul li a { white-space: nowrap; padding: 5px 10px; font-size: var(--font-size-xs); }

  #overlayModal #modalContainer { width: 95%; margin: 100px auto; }
  #overlay #uploaderContainer   { margin: 100px auto; }
  .Logoinside { min-width: auto; width: auto; padding: 0 12px; font-size: 18px; }

  .skToolbar--fixed { left: 0; right: 0; border-radius: 0; }

  .sk-cols-2, .sk-cols-3, .sk-cols-4, .sk-cols-5 { grid-template-columns: 1fr; }
  .sk-card-row, .sk-card-row-3  { flex-direction: column; }
  .sk-card-row-top              { flex-direction: column; }
  .sk-cols-6 { grid-template-columns: repeat(3, 1fr); }

  .sk-contain    { max-width: calc(100vw - 16px); }
  .sk-proto-item { flex-direction: column; align-items: flex-start; gap: 2px; }

  .sk-page-toolbar { flex-wrap: wrap; padding: 6px 8px; }
  /* v58 FIX CASCATA: le regole display di questo blocco erano MORTE.
     Le definizioni base dei componenti (.sk-pt-title L4789, .sk-kpi-strip
     L6379, .sk-home-charts L3746) stanno DOPO questo blocco nel file: a
     parita' di specificita' vincevano loro a ogni larghezza, quindi KPI,
     grafici e titoli toolbar restavano visibili su mobile. !important e' il
     pattern gia' usato dalle utility mobile (sez. 53.0 sk-mobile-only). */
  .sk-pt-title { display: none !important; }
  .sk-page-toolbar.sk-page-toolbar--title-block > .sk-pt-title { display: flex !important; }
  .sk-pt-sep:first-of-type { display: none !important; }
  .sk-pt-right { margin-left: 0; flex-wrap: wrap; }

  /* v58: label informative della toolbar (data corrente "Luglio 2026",
     contesto anagrafica) non actionable su mobile: nascoste. I bottoni
     delle toolbar operative (ricerca/scheda) NON sono toccati. */
  .sk-page-toolbar .sk-pt-right > .lbl,
  .sk-page-toolbar .sk-pt-right > .sk-pt-sep { display: none !important; }
  /* Toolbar rimasta puramente informativa (dashboard): senza elementi
     interattivi collassa del tutto invece di lasciare una barra vuota.
     Progressive enhancement: senza supporto :has resta la barra slim. */
  .sk-page-toolbar:not(:has(button, .sk-btn, input, select, a, [role="button"])) { display: none !important; }

  /* KPI strip: nascosta su mobile (dati non actionable su schermo piccolo) */
  .sk-kpi-strip { display: none !important; }
  .sk-kpi { flex: 1 1 100%; }

  /* v57: nascondere grafici e pannelli chart su mobile.
     Razionale: i grafici (donut, barV, barGrouped, gauge, funnel) sono
     progettati per tablet/desktop. Su schermo <=768px diventano illeggibili
     o richiedono zoom. La home mobile mostra SOLO: toolbar informativa +
     eventuali widget riassuntivi (vedi sez. 53.5 sk-mobile-only).
     Per mantenere contenuto utile in mobile, usare .sk-mobile-only sui
     componenti sostitutivi (due-list, widget compatti, summary cards). */
  .sk-home-charts,
  .sk-home-chart-panel,
  .sk-home-chart-box,
  .sk-chart { display: none !important; }
  .sk-home-chart-title { display: none !important; }

  .sk-qa-grid { grid-template-columns: repeat(3, 1fr); }
  .sk-due-item:hover { margin: 0; padding: 8px 0; }
  .sk-chart-legend { gap: 4px 10px; }
}


/* ─────────── MOBILE (≤ 480px) ─────────── */
@media only screen and (max-width: 480px) {

  input, select, textarea, .button-submit, .pulsante, .sk-btn { min-height: 44px; font-size: 16px; }  /* v49 A11Y */
  .App2Title { left: 5px; }
}


/* ─────────── TABLET (769px – 1023px) ─────────── */
@media only screen and (min-width: 769px) and (max-width: 1023px) {

  #charts  { display: table; width: 100%; overflow: auto; }
  #system, #footer { display: none; }
  #database { display: inline-block; text-align: right; vertical-align: top; min-width: 205px; width: 50%; }
  #user     { display: inline-block; float: right; vertical-align: top; }
  #mainContainer { margin-left: calc(var(--sidebar-w) + 4px); margin-right: 4px; margin-top: var(--header-h); }
  #leadin2 {
    display: block; position: fixed; height: auto;
    bottom: 0; top: var(--header-h); left: 0; right: 0; overflow: auto;
  }
  #leftSidebar {
    background-color: var(--brand-primary); width: 190px;
    position: fixed; left: 0; top: var(--header-h); bottom: 0; height: auto; overflow: auto;
  }
  #rightsidebar {
    background-color: var(--brand-bg); width: 205px;
    position: fixed; right: 0; top: var(--header-h); bottom: 0; height: auto; overflow: auto;
  }
  #loginfooter {
    left: 0; bottom: 0; padding-bottom: 5px; height: 15px; width: 100%;
    position: fixed; padding-top: 5px; z-index: 999;
    color: var(--brand-primary); background-color: var(--brand-white);
  }
  .headerHRSticky, .menuOrizzontale, .menuOrizzontaleVisita, .headerVisita { left: var(--sidebar-w); right: 0; }
  .toolbarVisita { left: var(--sidebar-w); right: 4px; }
  .sk-scheda-toolbar { left: var(--sidebar-w); right: 0; }
  .gruppoFillGreen, .gruppoFillOrange, .gruppoFillRed, .gruppoFillBlue { left: var(--sidebar-w); right: 0; }
  .div_MainInternoRidottoVisita { margin-left: calc(var(--sidebar-w) + 4px); margin-right: 4px; }

  /* Fix C v58: KPI strip su tablet wrap invece di stringere.
     A 769-1023px la sidebar laterale (~190px) lascia al contenuto principale
     ~579-833px. Con 3 KPI card flex:1 1 0 e flex-wrap:nowrap, ogni card ha
     ~190-275px: la cifra grande (sk-kpi__value) + label si comprimono fino a
     diventare illeggibili. flex-wrap:wrap + flex:1 1 220px porta 2 card su
     riga 1 e la terza wrappata sotto, ognuna >=220px (sk-kpi__value 24px +
     label senza truncate). */
  .sk-kpi-strip { flex-wrap: wrap; }
  .sk-kpi-strip > .sk-kpi { flex: 1 1 220px; min-width: 220px; }
}


/* ─────────── DESKTOP (≥ 1024px) ─────────── */
@media only screen and (min-width: 1024px) {

  #charts { display: table; width: 100%; overflow: auto; }
  #mainContainer { margin-left: calc(var(--sidebar-w) + 4px); margin-right: 4px; margin-top: var(--header-h); }
  #leadin2 {
    display: block; position: fixed; height: auto;
    bottom: 0; top: var(--header-h); left: 0; right: 0; overflow: auto;
  }
  #system   { display: inline-block; text-align: left;  vertical-align: top; width: 25%; }
  #database { display: inline-block; text-align: right; vertical-align: top; min-width: 205px; width: 50%; }
  #user     { display: inline-block; float: right; vertical-align: top; width: 25%; }
  #leftSidebar {
    background-color: var(--brand-primary); width: 190px;
    position: fixed; left: 0; top: var(--header-h); bottom: 0; height: auto; overflow: auto;
  }
  #footer { position: absolute; bottom: 10px; width: 100%; }
  #loginfooter {
    left: 0; bottom: 0; padding-bottom: 5px; height: 15px; width: 100%;
    position: fixed; padding-top: 5px; z-index: 999;
    color: var(--brand-primary); background-color: var(--brand-white);
  }
  #rightsidebar {
    background-color: var(--brand-bg); width: 200px;
    position: fixed; right: 0; top: var(--header-h); bottom: 0; height: auto; overflow: auto;
  }
  .headerHRSticky, .menuOrizzontale, .menuOrizzontaleVisita, .headerVisita { left: var(--sidebar-w); right: 0; }
  .toolbarVisita { left: var(--sidebar-w); right: 4px; }
  .sk-scheda-toolbar { left: var(--sidebar-w); right: 0; }
  .gruppoFillGreen, .gruppoFillOrange, .gruppoFillRed, .gruppoFillBlue { left: var(--sidebar-w); right: 0; }
  .App2Title { left: 15px; }
}

/* ==========================================================================
   30. BADGE RISCHIO DVR
   ========================================================================== */

.badge-risk {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 4px 12px; border-radius: var(--radius-full);
  font-size: 11px; font-weight: 600;
  text-transform: uppercase; letter-spacing: 0.5px;
  transition: all var(--transition-fast);
}
.badge-risk-critical { background: var(--color-error-light);   color: var(--color-error-text);   border: 1px solid var(--color-error); }
.badge-risk-high     { background: var(--color-warning-light); color: #ea580c;              border: 1px solid #ea580c; }
.badge-risk-medium   { background: #fef3c7;                    color: var(--color-warning-text);  border: 1px solid var(--color-warning); }
.badge-risk-low      { background: #fef9c3;                    color: #eab308;               border: 1px solid #eab308; }
.badge-risk-minimal  { background: var(--color-success-light); color: var(--color-success-text);  border: 1px solid var(--color-success); }

.risk-indicator {
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; border-radius: 50%;
  font-weight: 700; font-size: 16px; transition: all var(--transition-fast);
}
.risk-indicator:hover { transform: scale(1.1); box-shadow: var(--shadow-md); }

.risk-indicator-critical { background: var(--color-error-light);   color: var(--color-error-text);   border: 2px solid var(--color-error); }
.risk-indicator-high     { background: var(--color-warning-light); color: #ea580c;              border: 2px solid #ea580c; }
.risk-indicator-medium   { background: #fef3c7;                    color: var(--color-warning-text);  border: 2px solid var(--color-warning); }
.risk-indicator-low      { background: #fef9c3;                    color: #eab308;               border: 2px solid #eab308; }
.risk-indicator-minimal  { background: var(--color-success-light); color: var(--color-success-text);  border: 2px solid var(--color-success); }


/* ==========================================================================
   31. SK GRID KIT (dhtmlx v9 Grid engine)
   ==========================================================================
   Classi riutilizzabili per tutte le pagine che usano SkGridKit.
   ========================================================================== */


/* ── 31.1  GRID WRAPPER (layout flex) ── */

.sk-grid-wrapper {
  display: flex; flex-direction: column;
  height: calc(100vh - var(--header-h) - 180px); min-height: 300px;
}
.sk-grid-wrapper #toolbar                         { flex-shrink: 0; }
/* id es. gridbox_storico: stesso layout di #gridbox (esclude overlay gridbox_*_autoOverlay) */
.sk-grid-wrapper #gridbox,
.sk-grid-wrapper [id^="gridbox"]:not([id$="_autoOverlay"]) { flex: 1 1 auto; min-height: 200px; overflow: hidden; }
.sk-grid-wrapper #recordInfoNoPaging,
.sk-grid-wrapper [id^="MarkerRecordInfoNoPaging"],
.sk-grid-wrapper #pagingArea                       { flex-shrink: 0; }

/* Modificatore .sk-grid-wrapper--fill: usato dentro .sk-home-body o altri
   container flex-column con altezza viewport. Disattiva il calc fisso di
   100vh - header - 180px e fa crescere la grid per riempire lo spazio
   residuo lasciato dai filtri/toolbar (variabili in numero e altezza). */
.sk-grid-wrapper--fill {
  height: auto;
  flex: 1 1 auto;
  min-height: 0;
}

/* Dentro skFormModal / skLookupModal: la wrapper non deve usare
   height:calc(100vh...) ne' min-height:300px. Riempie lo slot della
   modale (il contenitore), non la viewport. */
.sk-lookup-modal-body .sk-grid-wrapper {
  height: auto;
  min-height: 0;
  flex: 1 1 auto;
  width: 100%;
}
.sk-lookup-modal-body .sk-grid-wrapper [id^="gridbox"]:not([id$="_autoOverlay"]) {
  min-height: 0;
  width: 100%;
}

/* FIX: la utility .sk-myc-desktop-only (definita nel CSS inline delle pagine
   MyCanopo, sezione 53) imposta display:block su desktop. Caricato DOPO
   default.css vince per source order sul display:flex di .sk-grid-wrapper,
   rompendo il layout flex interno (#gridbox non riceve piu' flex:1).
   Riportiamo display:flex con specificita' maggiore (2 classi). */
@media (min-width: 1024px) {
  .sk-grid-wrapper.sk-myc-desktop-only { display: flex; }
}

/* DHTMLX v9 virtualizza le righe mutando il DOM dentro lo scroller.
   Chrome scroll anchoring prova a compensare quelle mutazioni e puo' far
   oscillare scrollTop, causando flicker/righe fuori posizione. */
.dhx_grid .dhx_grid-body,
.dhx_grid .dhx_data-wrap,
.dhx_grid .dhx_grid_data {
  overflow-anchor: none;
}

/* ── 31.1b  GRID SORT ICON (single indicator) ──
   dhx9 inserisce due nodi .dhx_grid-sort-icon per colonna sortable (up+down);
   SkGridKit aggiunge aria-sort con ::after globale (§50) = tripla icona.
   Teniamo solo la prima icona nativa dhx; aria-sort resta per screen reader. */

.dhx_grid-header-cell[aria-sort="ascending"]::after,
.dhx_grid-header-cell[aria-sort="descending"]::after {
  content: none !important;
}

.dhx_grid-header-cell .dhx_grid-sort-icon + .dhx_grid-sort-icon {
  display: none !important;
}

/* Maschera hover dhx che copre/nasconde icone in modo inconsistente */
.dhx_grid-header-cell--sortable:hover::after,
.dhx_grid-header-cell--sorted::after {
  display: none !important;
}

/* Unsorted: icona visibile solo on hover (comportamento dhx, una sola icona) */
.dhx_grid-header-cell--sortable:not(.dhx_grid-header-cell--sorted) .dhx_grid-sort-icon {
  opacity: 0;
}
.dhx_grid-header-cell--sortable:not(.dhx_grid-header-cell--sorted):hover .dhx_grid-sort-icon,
.dhx_grid-header-cell--sorted .dhx_grid-sort-icon--asc,
.dhx_grid-header-cell--sorted .dhx_grid-sort-icon--desc {
  opacity: 1;
}

/* DHTMLX v9 grid tooltip — Canopo design system (SkGridKit v6.10+) */
.dhx_tooltip.dhx_grid_tooltip.sk-canopo-tooltip,
.sk-trunc-cell-tooltip {
  opacity: 1;
  z-index: 10000;
  max-width: min(480px, 92vw);
  max-height: min(360px, 55vh);
  overflow-y: auto;
  overflow-x: hidden;
  background: var(--color-bg-white, #fff);
  color: var(--color-text-primary, #1E293B);
  border: 1px solid var(--color-border-dark, #CBD5E1);
  border-radius: 6px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .13);
  padding: 8px 12px;
  font-family: var(--font-family-base, inherit);
  font-size: 12px;
  font-weight: 400;
  line-height: 1.45;
  white-space: pre-wrap;
  word-break: break-word;
}

/* Overlay in-cell: copre il testo troncato nella stessa posizione */
.sk-trunc-cell-tooltip--overlay {
  pointer-events: auto;
  user-select: text;
  -webkit-user-select: text;
  border-radius: 2px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .12);
  padding: 2px 4px;
  margin: 0;
  white-space: pre-wrap;
  word-break: break-word;
  overflow-x: hidden;
  overflow-y: auto;
}

/* Durante drag-select nel tooltip: niente selezione sulla grid sotto */
body.sk-trunc-tip-armed * {
  user-select: none !important;
  -webkit-user-select: none !important;
}

body.sk-trunc-tip-armed #sk-trunc-cell-tooltip,
body.sk-trunc-tip-armed #sk-trunc-cell-tooltip * {
  user-select: text !important;
  -webkit-user-select: text !important;
}

.dhx_tooltip.dhx_grid_tooltip.sk-canopo-tooltip .dhx_tooltip__text {
  color: var(--color-text-primary, #1E293B);
  font-size: 12px;
  font-weight: 400;
  line-height: 1.45;
  white-space: pre-wrap;
  word-break: break-word;
}


/* ── 31.2  BR CELLS (multi-valore compatto) ── */

.sk-br-badge {
  display: inline-block; background: var(--brand-primary); color: var(--brand-white);
  font-size: 10px; font-weight: 600; padding: 1px 6px;
  border-radius: var(--radius-full); margin-left: 4px;
  vertical-align: middle; line-height: 1.4;
}
.sk-br-first-item { display: inline; vertical-align: middle; }

.sk-bool-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 22px;
  padding: 0;
  border-radius: var(--radius-full);
  font-size: 11px;
  font-weight: 600;
  line-height: 1.3;
}
.sk-bool-badge i {
  font-size: 11px;
  flex-shrink: 0;
}
.sk-bool-badge--on {
  color: var(--color-success-text);
  background: var(--color-success-tint);
  border: 1px solid var(--color-success);
}
.sk-bool-badge--off {
  color: var(--color-error-text);
  background: var(--color-error-tint);
  border: 1px solid var(--color-error);
}


/* ── 31.3  ROW EXPANDER ── */

.sk-row-expander {
  cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: var(--radius-sm);
  transition: all var(--transition-fast); color: var(--brand-primary); font-size: 13px;
}
.sk-row-expander:hover    { background: var(--color-bg-hover); color: var(--brand-accent); }
.sk-row-expander.sk-expanded { transform: rotate(90deg); color: var(--brand-accent); }


/* ── 31.4  DETAIL PANEL ── */

.sk-detail-panel {
  flex-shrink: 0; max-height: 45vh; overflow-y: auto;
  border: 1px solid var(--color-border); border-top: 3px solid var(--brand-accent);
  border-radius: 0 0 var(--radius-md) var(--radius-md);
  background: var(--color-bg-white); box-shadow: var(--shadow-md);
  margin-top: -1px; animation: sk-slide-down .2s ease-out;
}
@keyframes sk-slide-down {
  from { opacity: 0; max-height: 0; }
  to   { opacity: 1; max-height: 45vh; }
}

.sk-detail-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 14px; background: var(--color-bg-secondary);
  border-bottom: 1px solid var(--color-border);
  position: sticky; top: 0; z-index: 1;
}
.sk-detail-header-title { font-weight: 600; font-size: 13px; color: var(--brand-primary); }

.sk-detail-close {
  cursor: pointer; background: none;
  border: 1px solid var(--color-border); border-radius: var(--radius-sm);
  width: 28px; height: 28px; font-size: 16px;
  color: var(--color-text-secondary);
  display: inline-flex; align-items: center; justify-content: center;
  transition: all var(--transition-fast);
}
.sk-detail-close:hover { background: var(--color-error-light); color: var(--color-error); border-color: var(--color-error); }

.sk-detail-content { padding: 12px 14px; display: flex; flex-wrap: wrap; gap: 10px; }


/* ── 31.5  DETAIL CARDS ── */

.sk-detail-card {
  flex: 1 1 260px; max-width: 100%;
  border: 1px solid var(--color-border); border-radius: var(--radius-md);
  background: var(--gradient-card); overflow: hidden;
  transition: box-shadow var(--transition-fast);
}
.sk-detail-card:hover { box-shadow: var(--shadow-sm); }

.sk-detail-card-header {
  padding: 5px 10px; font-weight: 600; font-size: 11px;
  color: var(--brand-primary); background: var(--color-bg-light);
  border-bottom: 1px solid var(--color-border);
  text-transform: uppercase; letter-spacing: .3px;
}
.sk-detail-card-header i { color: var(--brand-accent); margin-right: 4px; font-size: 10px; }

.sk-detail-card-body {
  padding: 6px 10px; font-size: 12px; line-height: 1.6;
  color: var(--color-text-primary); max-height: 160px; overflow-y: auto;
}
.sk-detail-card-body br + br { display: none; }


/* ── 31.6  DETAIL STATS (pills) ── */

.sk-expand-empty { color: var(--color-text-light); font-style: italic; font-size: 11px; padding: 10px 12px; }

.sk-expand-stats { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 14px 10px; }

.sk-expand-stat {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 10px; border-radius: var(--radius-full);
  font-size: 11px; font-weight: 500;
  background: var(--color-bg-secondary); border: 1px solid var(--color-border);
  color: var(--color-text-primary);
}
.sk-expand-stat i      { color: var(--brand-primary); font-size: 10px; }
.sk-expand-stat strong { color: var(--brand-primary); font-weight: 700; }


/* ── 31.7  UTILITY (colori inline celle) ── */

.sk-red-bold   { color: var(--color-error-text);   font-weight: 600; }
.sk-green-bold { color: var(--color-success-text); font-weight: 600; }
.sk-amber-bold { color: var(--color-warning-text); font-weight: 600; }


/* ==========================================================================
   31.8  SK PAGE KIT (layout home + pagine normali)
   ==========================================================================
   .sk-home-body  → Home/Dashboard : viewport-fit, NO scroll verticale
   .sk-page-body  → Pagine normali : scroll verticale libero
   ========================================================================== */

/* ── 31.8.0  Variabile viewport (calcolata dal container padre sez.8) ── */

.div_MainInternoRidotto,
.div_MainInternoRidotto_Expanded {
  --sk-viewport-h: calc(100vh - var(--content-offset-base) - var(--spacing-sm));
}
.div_MainInternoRidottoHR,
.div_MainInternoRidottoHR_Expanded {
  --sk-viewport-h: calc(100vh - var(--content-offset-hr) - var(--spacing-sm));
}
.div_MainInternoRidottoVisita {
  --sk-viewport-h: calc(100vh - var(--content-offset-visita) - var(--spacing-sm));
}

/* ── 31.8.1  Home body ── */
.sk-home-body {
  display: flex; flex-direction: column;
  height: var(--sk-viewport-h); overflow: hidden; gap: 8px;
}

/* ── 31.8.2  Page body ── */
.sk-page-body {
  display: flex; flex-direction: column;
  min-height: var(--sk-viewport-h); gap: 8px;
}

/* ── 31.8.3  Leadin ── */
.sk-home-body > #leadin, .sk-page-body > #leadin { flex-shrink: 0; }
.sk-home-leadin-right { margin-left: auto; display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; }

/* ── 31.8.4  Section ── */
.sk-home-section { flex-shrink: 0; }
.sk-home-section-title { padding-bottom: 8px; border-bottom: 1px solid var(--color-border-light); margin-bottom: 8px; }

/* ── 31.8.5  Stats grid ── */
.sk-home-stats     { display: flex; flex-wrap: wrap; gap: 0 24px; }
.sk-home-stats-col { flex: 1 1 280px; min-width: 0; display: flex; flex-direction: column; }
.sk-home-stat-row {
  display: flex; align-items: center; min-height: 25px; padding: 2px 0;
  border-bottom: 1px solid var(--color-border-light); gap: 12px; font-size: var(--font-size-base);
}
.sk-home-stat-row:last-child       { border-bottom: none; }
.sk-home-stat-row > .lbl           { flex: 0 0 50%; min-width: 0; }
.sk-home-stat-row > span:last-child { flex: 1 1 auto; min-width: 0; }

/* ── 31.8.6  Charts row ── */
.sk-home-charts                    { display: flex; flex-wrap: nowrap; gap: 8px; min-height: 0; }
.sk-home-body > .sk-home-charts    { flex: 1 1 0; }
.sk-page-body > .sk-home-charts    { flex: 0 0 auto; min-height: 220px; }

/* ── 31.8.7  Chart panel ── */
.sk-home-chart-panel {
  flex: 1 1 0; min-width: 0; min-height: 0;
  display: flex; flex-direction: column;
  background-color: var(--color-bg-white);
  border: 1px solid var(--color-border); border-radius: var(--radius-md);
  padding: 8px; box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition-normal); overflow: hidden;
}
.sk-home-chart-panel:hover { box-shadow: var(--shadow-md); }
.sk-home-chart-title       { flex-shrink: 0; padding: 0 4px 4px; }
.sk-home-chart-box         { flex: 1 1 0; min-height: 0; width: 100%; box-sizing: border-box; }


/* ==========================================================================
   32. SK CARD KIT (schede dettaglio / form read-only)
   ==========================================================================
   Classi riutilizzabili per tutte le pagine di dettaglio/scheda.
   Si appoggiano a gruppo1 (sez.16) + tipografia (sez.5) + sk-page-body (sez.31.8).
   ========================================================================== */


/* ── 32.1  CARD HEADER ── */

.sk-card-header {
  display: flex; align-items: center; justify-content: space-between;
  padding-bottom: 8px; margin-bottom: 10px;
}
.sk-card-header .title2 { margin: 0; padding: 0; }

.sk-card-header-meta {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
}


/* ── 32.2  CARD SUBTITLE (separatore interno) ── */

.sk-card-subtitle {
  font-size: var(--font-size-base); font-weight: 600;
  color: var(--brand-primary); padding: 6px 0 4px;
  border-bottom: 1px solid var(--color-border-light); margin-bottom: 6px;
}


/* ── 32.3  FIELD GRID (label + valore) ── */

.sk-card-fields         { display: grid; gap: 6px 20px; align-items: start; }
.sk-cols-2              { display: grid; grid-template-columns: repeat(2, 1fr); }
.sk-cols-3              { display: grid; grid-template-columns: repeat(3, 1fr); }
.sk-cols-4              { display: grid; grid-template-columns: repeat(4, 1fr); }
.sk-cols-5              { display: grid; grid-template-columns: repeat(5, 1fr); }
.sk-cols-6              { display: grid; grid-template-columns: repeat(6, 1fr); }

.sk-field               { display: flex; flex-direction: column; gap: 2px; min-height: 36px; }

.sk-field > .lbl {
  font-size: var(--font-size-sm);
  white-space: nowrap;
  text-transform: uppercase;
  letter-spacing: .3px;
  text-align: left; 
}

.sk-field-val {
  font-size: var(--font-size-base);
  color: var(--color-text-primary);
  min-height: 18px;
  word-wrap: break-word;
  overflow-wrap: break-word;
}

.sk-field               { ...; min-width: 0; }   /* impedisce alla cella grid di espandersi oltre 1fr */
.sk-field > input:not([type="checkbox"]):not([type="radio"]),
.sk-field > select      { width: 100%; }          /* l'input rispetta la larghezza della colonna */

/* Checkbox/radio: non stirare a 100% (il glyph finisce in centro colonna). */
.sk-field > input[type="checkbox"],
.sk-field > input[type="radio"] {
  width: auto;
  align-self: flex-start;
  margin-top: 4px;
}

/* Flag in scheda: label + box sulla stessa riga, cliccabili insieme. */
.sk-field--check {
  flex-direction: row;
  align-items: center;
  min-height: 32px;
}
.sk-field--check > .lbl {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  margin: 0;
}
.sk-field--check > .lbl > input[type="checkbox"],
.sk-field--check > .lbl > input[type="radio"] {
  width: auto;
  margin: 0;
  flex: none;
}

/* Gruppo di flag in una riga (es. Opzioni tipologia documento). */
.sk-check-row {
  display: flex;
  flex-wrap: wrap;
  gap: 16px 24px;
  align-items: center;
  padding-top: 4px;
}
.sk-check-row > .lbl {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  margin: 0;
}
.sk-check-row > .lbl > input[type="checkbox"] {
  width: auto;
  margin: 0;
  flex: none;
}

/* Larghezze input compatte per numerici/codici brevi. Cappano il width:100%
   (max-width, nessun conflitto di specificita'): usare al posto di style inline. */
.sk-input--xs           { max-width: 90px; }
.sk-input--sm           { max-width: 140px; }
.sk-input--md           { max-width: 220px; }


/* ── 32.4  CARD ROW (cards affiancate) ── */

.sk-card-row            { display: flex; gap: 8px; }
.sk-card-row > *        { flex: 1 1 0; min-width: 0; }
.sk-card-row-3 > *      { flex: 1 1 0; min-width: 0; }


/* ── 32.5  TOP ROW (campi + foto laterale) ── */

.sk-card-row-top        { display: flex; gap: 20px; align-items: flex-start; }
.sk-card-row-top > .sk-card-fields { flex: 1 1 0; min-width: 0; }

.sk-card-photo          {
  width: 140px; height: 150px; flex-shrink: 0;
  border-radius: var(--radius-md); overflow: hidden;
  border: 2px solid var(--color-border); box-shadow: var(--shadow-sm);
}
.sk-card-photo img      { width: 100%; height: 100%; object-fit: cover; display: block; }


/* ── 32.6  FLAG ROW (icona on/off + testo) ── */

.sk-flag-row            { display: flex; align-items: center; gap: 8px; min-height: 26px; font-size: var(--font-size-base); }
.sk-icon-success        { color: var(--color-success-text); }
.sk-icon-error          { color: var(--color-error); }

.sk-flag-detail         {
  font-size: var(--font-size-sm); color: var(--color-text-secondary);
  padding: 2px 0 2px 24px;
}


/* ── 32.7  BADGE (pill inline) ── */

.sk-badge {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 2px 10px; border-radius: var(--radius-full);
  font-size: var(--font-size-sm); font-weight: 600;
}
.sk-badge-success       { background: var(--color-success-light); color: var(--color-success); }
.sk-badge-warning       { background: var(--color-warning-light); color: var(--color-warning); }
.sk-badge-error         { background: var(--color-error-light);   color: var(--color-error); }
.sk-badge-info          { background: var(--color-info-light);    color: var(--color-info); }
.sk-badge-primary       { background: var(--color-bg-light);     color: var(--brand-primary); font-weight: 700; }


/* ── 32.8  RESPONSIVE — consolidato in sez. 29 (@768px) */


/* ==========================================================================
   33. SK SEARCH KIT (pagine di ricerca avanzata)
   ==========================================================================
   Classi riutilizzabili per tutte le pagine di ricerca con filtri,
   accordion, chips di selezione e barra azioni fissa.
   Si appoggiano a gruppo1 (sez.16) + pulsante (sez.17) + sk-card-fields (sez.32).
   ========================================================================== */


/* ── 33.0  PULSANTE VARIANTI (filled) ──
   Il .pulsante base (sez.17) è light/outline.
   Qui aggiungiamo le varianti filled per azioni primarie e conferma.        */

.pulsante--primary {
  color: var(--brand-white);
  background: var(--gradient-primary);
  border-color: var(--brand-primary);
}
.pulsante--primary:hover {
  background: linear-gradient(135deg, var(--brand-primary-hover) 0%, var(--brand-primary-light) 100%);
  border-color: var(--brand-primary-hover);
  color: var(--brand-white);
  box-shadow: var(--shadow-primary);
}
.pulsante--primary:active {
  background: var(--brand-primary-dark);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);
}

.pulsante--success {
  color: var(--brand-white);
  background: linear-gradient(135deg, var(--color-success) 0%, #0d9668 100%);
  border-color: var(--color-success);
}
.pulsante--success:hover {
  background: linear-gradient(135deg, #0d9668 0%, #0a7d56 100%);
  border-color: #0a7d56;
  color: var(--brand-white);
  box-shadow: 0 4px 12px rgba(16, 185, 129, 0.25);
}
.pulsante--success:active {
  background: #0a7d56;
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);
}


/* ── 33.1  TOOLBAR FISSA (action bar top) ──
   Estende .skToolbar con posizionamento fixed sotto l'header.               */

.skToolbar--fixed {
  position: fixed;
  top: calc(var(--header-h) + 6px);
  left: calc(var(--sidebar-w) + 4px);
  right: 4px;
  height: var(--hr-bar-h);
  z-index: 997;
  box-sizing: border-box;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-bottom-left-radius: var(--radius-md);
  border-bottom-right-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  transition: all var(--transition-normal);
  font-size: 13px;
  padding: 8px 20px;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 10px;
}
.skToolbar--fixed .sk-bar-info {
  margin-right: auto;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
}


/* ── 33.2  ARCHIVE MODIFIER ──
   Aggiunge bordo/sfondo giallo ai .gruppo1 per le pagine archivio.          */

.gruppo1--archive {
  border-color: var(--color-warning-text);
  background-color: var(--color-warning-light);
}


/* ── 33.3  SEARCH HEADER ── */

.sk-search-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 16px;
}
.sk-search-header h1 {
  font-size: 18px;
  font-weight: 700;
  margin: 0;
  color: var(--color-text-primary);
}
.sk-search-header h1 i {
  color: var(--brand-primary);
  margin-right: 6px;
  font-size: 16px;
}
.sk-search-header p {
  font-size: var(--font-size-base);
  color: var(--color-text-secondary);
  margin: 2px 0 0;
}
.sk-search-header-actions {
  display: flex;
  gap: 6px;
}


/* ── 33.4  ACCORDION ──
   Sezioni espandibili per filtri avanzati.                                   */

.sk-accordion {
  border-radius: var(--radius-md);
  border: 1px solid var(--color-border);
  background: var(--color-bg-white);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
}
.sk-accordion + .sk-accordion { margin-top: 10px; }

.sk-accordion-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 20px;
  cursor: pointer;
  user-select: none;
  background: transparent;
  border: none;
  width: 100%;
  text-align: left;
  font-family: var(--font-base);
  font-size: 14px;
  font-weight: 600;
  color: var(--color-text-primary);
  transition: background var(--transition-fast);
}
.sk-accordion-header:hover { background: var(--color-bg-hover); }

.sk-accordion-icon {
  color: var(--color-text-secondary);
  width: 18px;
  text-align: center;
  font-size: 14px;
}
.sk-accordion-chevron {
  color: var(--color-text-secondary);
  font-size: 11px;
  margin-left: auto;
}

.sk-accordion-body {
  padding: 4px 20px 20px;
  border-top: 1px solid var(--color-border-light);
}


/* ── 33.5  TOGGLE LINK (mostra/nascondi filtri) ── */

.sk-toggle-adv {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-base);
  font-size: var(--font-size-base);
  font-weight: 500;
  color: var(--brand-primary);
  cursor: pointer;
  background: none;
  border: none;
  padding: 4px 0;
  transition: color var(--transition-fast);
}
.sk-toggle-adv:hover { color: var(--brand-primary-hover); }


/* ── 33.6  EXPAND / COLLAPSE LINKS ── */

.sk-expand-links {
  display: flex;
  gap: 12px;
  margin-bottom: 10px;
}
.sk-expand-links a {
  font-size: 12px;
  color: var(--brand-primary);
  cursor: pointer;
  text-decoration: none;
  transition: color var(--transition-fast);
}
.sk-expand-links a:hover { text-decoration: underline; }


/* ── 33.7  POPUP FIELD (label + seleziona + chips) ── */

.sk-popup-field {
  /* v57: wrapper verticale per label + .sk-popup-select + .sk-chips.
     Era vuoto; il layout implicito dipendeva dal flusso block default.
     Valore esplicito per consistenza e per evitare regola vuota. */
  display: flex;
  flex-direction: column;
  gap: var(--spacing-xs);
  min-width: 0;
}

.sk-popup-select {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 5px 12px;
  font-size: 12px;
  font-weight: 500;
  color: var(--brand-primary);
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg-secondary);
  cursor: pointer;
  text-decoration: none;
  transition: all var(--transition-fast);
}
.sk-popup-select:hover {
  border-color: var(--brand-primary);
  background: var(--color-info-light);
  text-decoration: none;
  color: var(--brand-primary-hover);
}
.sk-popup-select i { font-size: 10px; }

.sk-popup-field--inline-selected {
  flex-direction: row;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px 10px;
}
.sk-popup-field--inline-selected .sk-popup-field__trigger {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 0 !important;
  min-height: 30px;
}
.sk-popup-field--inline-selected .sk-popup-field__label-source {
  display: none !important;
}
.sk-popup-field--inline-selected > .sk-chips {
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  flex-wrap: wrap;
  gap: 5px;
  margin-top: 0;
  padding: 6px 8px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg-secondary);
  max-width: min(100%, 420px);
  max-height: 72px;
  overflow: hidden;
  align-content: flex-start;
}
.sk-popup-field--inline-selected > .sk-chips[data-sk-lookup-count-label]::before {
  content: attr(data-sk-lookup-count-label);
  flex: 0 0 100%;
  font-size: 11px;
  font-weight: 600;
  color: var(--color-text-secondary);
  text-transform: uppercase;
  letter-spacing: .02em;
  line-height: 1.2;
}
.sk-popup-field--inline-selected > .sk-chips .sk-chip {
  background: var(--color-info-light);
  border-color: var(--brand-primary);
  max-width: min(240px, 100%);
  min-width: 0;
}
.sk-popup-field--inline-selected > .sk-chips .sk-chip__text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 200px;
}


/* ── 33.8  CHIPS ── */

.sk-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
  margin-top: 5px;
  max-width: 100%;
  max-height: 88px;
  overflow: hidden;
  align-content: flex-start;
}
.sk-chips.sk-chips--truncated {
  overflow-y: auto;
}
.sk-chip--overflow {
  background: var(--color-bg-main) !important;
  border-style: dashed !important;
  color: var(--color-text-secondary) !important;
  font-weight: 600;
  cursor: default;
  flex-shrink: 0;
}
.sk-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 10px;
  font-size: var(--font-size-sm);
  font-weight: 500;
  background: var(--color-bg-secondary);
  color: var(--brand-primary);
  border: 1px solid var(--color-info-light);
  border-radius: var(--radius-full);
  min-width: 0;
  max-width: 100%;
}
.sk-chip__text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 220px;
}
.sk-chip-remove {
  border: 0;
  background: transparent;
  color: var(--brand-primary);
  cursor: pointer;
  font-size: 12px;
  line-height: 1;
  padding: 0 0 0 4px;
}
.sk-chip-remove:hover {
  color: var(--color-error);
}


/* ── 33.9  DATE RANGE ── */

.sk-range {
  display: flex;
  align-items: center;
  gap: 6px;
}
.sk-range-label {
  font-size: 12px;
  color: var(--color-text-secondary);
  font-weight: 500;
  white-space: nowrap;
}

/* Date clear button (dhx datepicker helper) */
.sk-date-clear {
  cursor: pointer;
  margin-left: 4px;
  color: var(--color-text-secondary);
  font-size: 16px;
  vertical-align: middle;
  transition: color var(--transition-fast);
}
.sk-date-clear:hover { color: var(--color-error); }

/* Date input (small readonly) */
input.sk-input--date {
  width: 110px;
  cursor: pointer;
}


/* ── 33.10  SEARCH PAGE BODY ──
   Padding top per fare spazio alla toolbar fissa.                            */

.sk-search-page {
  padding: calc(var(--hr-bar-h) + 18px) 24px 24px;
}
.sk-search-page--archive {
  background: var(--color-warning-light);
}


/* ── 33.11  SK LAYOUT SYSTEM ──
   Griglia responsiva a colonne flex per strutturare le pagine.
   Varianti: full (100%), half (50/50), 30/70, 70/30.
   Sotto 768px tutte le colonne collassano a 100%.               */

.sk-layout {
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-sm);
  width: 100%;
  box-sizing: border-box;
  margin-bottom: var(--spacing-sm);
  align-items: stretch;
}
.sk-layout__full { flex: 1 1 100%;                                min-width: 0;     }
.sk-layout__half { flex: 1 1 calc(50% - var(--spacing-sm) / 2);  min-width: 280px; }
.sk-layout__30   { flex: 1 1 calc(30% - var(--spacing-sm) / 2);  min-width: 200px; }
.sk-layout__70   { flex: 1 1 calc(70% - var(--spacing-sm) / 2);  min-width: 320px; }
.sk-layout__auto { flex: 1 1 0;                                  min-width: 320px; }
.sk-layout--30-auto-10 {
  display: grid;
  grid-template-columns: minmax(200px, 30%) minmax(320px, 1fr) minmax(130px, 10%);
}
.sk-layout--30-auto-10 > * {
  min-width: 0;
}

/* Colonne affiancate: il gruppo1 dentro deve occupare tutta l'altezza */
.sk-layout__half > .gruppo1,
.sk-layout__half > .gruppo1div,
.sk-layout__30 > .gruppo1,
.sk-layout__30 > .gruppo1div,
.sk-layout__70 > .gruppo1,
.sk-layout__70 > .gruppo1div,
.sk-layout__auto > .gruppo1,
.sk-layout__auto > .gruppo1div {
  height: 100%;
  box-sizing: border-box;
}
.sk-layout--30-auto-10 > * > .gruppo1,
.sk-layout--30-auto-10 > * > .gruppo1div {
  height: 100%;
  box-sizing: border-box;
}
/* Colonne aggiuntive */
.sk-layout__third { flex: 1 1 calc(33.333% - var(--spacing-sm) * 2 / 3); min-width: 240px; }
.sk-layout__60    { flex: 1 1 calc(60% - var(--spacing-sm) / 2);         min-width: 320px; }
.sk-layout__40    { flex: 1 1 calc(40% - var(--spacing-sm) / 2);         min-width: 250px; }

/* Stack verticale */
.sk-layout-stack {
  display: flex; flex-direction: column; gap: var(--spacing-sm); height: 100%;
}
.sk-layout-stack > * { flex: 1 1 0; min-height: 0; }
/* v44: reset margin-top per .gruppo1 dentro sk-layout-stack.
   Il gap flex (spacing-sm) e' gia' sufficiente: il margin-top aggiuntivo
   di .gruppo1+.gruppo1 verrebbe sommato causando doppio spacing (22px). */
.sk-layout-stack > .gruppo1 + .gruppo1 { margin-top: 0; }

/* Due pannelli gruppo1 affiancati in grid (Orione ricercaMove): il gap della grid basta */
.ricerca-move-actions > .gruppo1 + .gruppo1 { margin-top: 0; }

.sk-layout__third > .gruppo1, .sk-layout__third > .gruppo1div,
.sk-layout__60 > .gruppo1, .sk-layout__60 > .gruppo1div,
.sk-layout__40 > .gruppo1, .sk-layout__40 > .gruppo1div {
  height: 100%; box-sizing: border-box;
}

@media (max-width: 768px) {
  .sk-layout__half,
  .sk-layout__30,
  .sk-layout__70,
  .sk-layout__auto,
  .sk-layout__third,
  .sk-layout__60,
  .sk-layout__40 { flex: 1 1 100%; min-width: 0; }

  .sk-layout--30-auto-10 {
    grid-template-columns: 1fr;
  }
}


/* ── 33.12  SK RESPONSIVE INLINE GRID ──
   v53: collassa i grid-template-columns definiti inline (style=) nelle pagine.
   Le pagine form usano proporzioni inline per adattare la larghezza al dato
   (es. Titolo 80px, Email 3fr, Sesso 1fr). Queste proporzioni sono corrette
   su desktop ma devono collassare su mobile.
   !important: unico caso legittimo (responsive override di inline styles).   */

@media (max-width: 768px) {
  .sk-accordion-body [style*="grid-template-columns"] {
    grid-template-columns: 1fr 1fr !important;
  }
  .sk-card-row-top {
    flex-direction: column;
  }
  .sk-card-row-top > .sk-card-photo {
    width: 100px; height: 110px;
    align-self: center;
  }
}
@media (max-width: 480px) {
  .sk-accordion-body [style*="grid-template-columns"] {
    grid-template-columns: 1fr !important;
  }
}


/* ==========================================================================
   34. SK VIEW KIT (componenti per pagine di visualizzazione)
   ==========================================================================
   Classi riutilizzabili per pagine read-only / dettaglio.
   Si appoggiano a gruppo1 (sez.16) + sk-card-fields (sez.32).
   NON definisce un sistema card alternativo: il container è sempre
   .gruppo1 / .gruppo1div con .title2 come header.
   ========================================================================== */


/* ── 34.0  CONTAINMENT ──
   Impedisce ai figli (grid dhtmlx, tabelle) di espandere il <td>
   della masterpage. Unico punto con max-width calcolata.                    */

.sk-contain {
  max-width: calc(100vw - var(--sidebar-w, 210px) - 50px);
  overflow: hidden;
  padding-top: 12px;
}
.sk-contain,
.sk-contain *,
.sk-contain *::before,
.sk-contain *::after { box-sizing: border-box; }


/* ── 34.1  SEPARATOR ── */

.sk-sep {
  border: 0;
  border-top: 1px solid var(--color-border-light);
  margin: 10px 0;
}


/* ── 34.2  PILL TAGS ── */

.sk-pill-list { display: flex; flex-wrap: wrap; gap: 4px; }

.sk-pill {
  display: inline-block;
  padding: 3px 10px;
  font-size: 12px;
  background: var(--color-border-light);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-full);
  color: var(--color-text-primary);
}


/* ── 34.3  GRID SCROLL (dhtmlx containment) ── */

.sk-grid-scroll {
  margin-top: 4px;
  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
}
.sk-grid-scroll .dhx_widget { border-radius: var(--radius-md); }


/* ── 34.4  FILE LIST (allegati) ── */

.sk-file-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-top: 6px;
}

.sk-file-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 8px 12px;
  background: var(--color-bg-main);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  transition: background var(--transition-fast), box-shadow var(--transition-fast);
}
.sk-file-item:hover {
  background: var(--color-bg-hover);
  box-shadow: var(--shadow-sm);
}

.sk-file-link {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--color-info-text);
  font-size: var(--font-size-base);
  font-weight: 500;
  text-decoration: none;
  cursor: pointer;
  min-width: 0;
  flex: 1;
}
.sk-file-link:hover { text-decoration: underline; }
.sk-file-link i     { font-size: 15px; flex-shrink: 0; }
.sk-file-link span  { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.sk-file-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: var(--font-size-sm);
  font-weight: 600;
  padding: 3px 10px;
  border-radius: var(--radius-full);
  white-space: nowrap;
  flex-shrink: 0;
}
.sk-file-badge--ok { background: var(--color-success-light); color: var(--color-success-text); }
.sk-file-badge--no { background: var(--color-error-light);   color: var(--color-error-text); }

.sk-file-empty {
  padding: 12px;
  text-align: center;
  color: var(--color-text-secondary);
  font-size: 12px;
  font-style: italic;
}


/* ── 34.5  PROTOCOL LIST ── */

.sk-proto-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 5px 0;
  border-bottom: 1px solid var(--color-border-light);
  font-size: var(--font-size-base);
  gap: 12px;
}
.sk-proto-item:last-child { border-bottom: none; }

.sk-proto-name {
  flex: 1 1 0;
  min-width: 0;
  overflow-wrap: break-word;
}

.sk-proto-scad {
  font-size: 12px;
  color: var(--color-text-secondary);
  white-space: nowrap;
  flex-shrink: 0;
}

/* ==========================================================================
   35. SK PAGE TOOLBAR + SK BUTTON SYSTEM
   ==========================================================================
   Toolbar riutilizzabile per intestazione pagina.
   .sk-page-toolbar  → barra pagina (SOLO per toolbar nuove, NON sostituzione v4)
   .sk-btn           → sistema pulsanti unificato con varianti semantiche
   ========================================================================== */


/* ── 35.1  PAGE TOOLBAR ── */

.sk-page-toolbar {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px;
  width: 100%;
  min-height: 44px;
  padding: 6px 12px;
  margin-bottom: var(--spacing-sm);
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  box-sizing: border-box;
}

/* Titolo su riga propria, pulsanti (e select) sulla riga sotto — skPageToolbar titleOnDifferentLine */
.sk-page-toolbar.sk-page-toolbar--title-block {
  flex-direction: column;
  align-items: stretch;
  flex-wrap: wrap;
  gap: 0;
}
.sk-page-toolbar.sk-page-toolbar--title-block > .sk-pt-title {
  width: 100%;
  max-width: 100%;
  flex: 0 0 auto;
  /* Se il flex parent resta in riga, forza il titolo a occupare tutta la larghezza e manda la riga azioni sotto */
  flex-basis: 100%;
  margin-right: 0;
  white-space: normal;
  flex-wrap: wrap;
}
.sk-page-toolbar.sk-page-toolbar--title-block > .sk-pt-row {
  display: flex;
  align-items: flex-start;
  align-content: flex-start;
  flex-wrap: wrap;
  gap: 6px 8px;
  width: 100%;
  min-width: 0;
  box-sizing: border-box;
  border-top: 1px solid var(--color-border);
  padding-top: 8px;
  margin-top: 6px;
}
.sk-page-toolbar.sk-page-toolbar--title-block .sk-pt-right {
  margin-left: auto;
  align-items: center;
  flex-wrap: nowrap;
}
.sk-page-toolbar.sk-page-toolbar--title-block .sk-pt-sep.sk-pt-sep--between {
  align-self: center;
}


/* ── 35.1a  TOOLBAR OVERFLOW (kebab "...") — opt-in via data-sk-pt-overflow="1" ──
   Gestito da SkPageToolbarOverflow (sk_page_toolbar_api.js). Il container passa a
   nowrap: i pulsanti in eccesso vengono spostati nel menu a tendina invece di
   andare a capo. Attivo SOLO quando il JS aggiunge .sk-pt-of-managed. */
.sk-page-toolbar.sk-pt-of-managed,
.sk-pt-row.sk-pt-of-managed {
  flex-wrap: nowrap;
  min-width: 0;
}
/* rete di sicurezza: contenuto non-collassabile troppo largo => torna a wrap */
.sk-page-toolbar.sk-pt-of-managed.sk-pt-of-nofit,
.sk-pt-row.sk-pt-of-managed.sk-pt-of-nofit {
  flex-wrap: wrap;
}

.sk-pt-overflow {
  position: relative;
  display: inline-flex;
  align-items: center;
  flex: 0 0 auto;
}

/* la freccia/kebab: eredita sk-btn--ghost; solo icona */
.sk-pt-overflow-btn { flex: 0 0 auto; }

.sk-pt-overflow-menu {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 1200;
  min-width: 210px;
  max-width: 340px;
  max-height: 60vh;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 6px;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md);
}
.sk-pt-overflow-menu[hidden] { display: none; }

/* voci nel menu: full width, allineate a sinistra come una lista di azioni */
.sk-pt-overflow-menu .sk-pt-of-item {
  width: 100%;
  justify-content: flex-start;
  text-align: left;
}
.sk-pt-of-lbl { margin-left: 6px; }


/* ── 35.1b  TOOLBAR DENTRO FLEX CONTAINER ──
   sk-page-toolbar ha margin-bottom: var(--spacing-sm) per funzionare anche standalone.
   Dentro sk-page-body / sk-home-body il gap (8px) gestisce gia' la spaziatura:
   azzerare margin-bottom evita doppio spazio (gap 8px + margin 10px = 18px). */

.sk-page-body > .sk-page-toolbar,
.sk-home-body > .sk-page-toolbar { margin-bottom: 0; }

/* Toolbar subito sopra una griglia dhtmlx: niente gap sotto la barra (toolbarClass su skPageToolbar). */
.sk-page-toolbar.sk-page-toolbar--flush-below-grid {
  margin-bottom: 0;
  border-radius: var(--radius-md) var(--radius-md) 0 0;
}

/* ── 35.1c  SHELL PAGINA + TAB KIT + DHTMLX GRID (layout riutilizzabile) ──
   Pagine con altezza impostata via JS sul root: scroll solo nelle griglie/tab.
   Hook sul root: .sk-shell--lock-document-scroll + .sk-shell--page-flex-column;
   form principale .sk-shell--form-flex-fill; container SkTabKit .sk-tab-kit-root--flex-fill.
   Due griglie verticali (50/50): .sk-grid-stack--equal-rows + .sk-split-pane. */

html:has(.sk-shell--lock-document-scroll),
body:has(.sk-shell--lock-document-scroll) {
  overflow-x: hidden;
  overflow-y: hidden;
  overscroll-behavior-y: none;
}
#main-content:has(.sk-shell--lock-document-scroll) {
  overflow: hidden;
  min-height: 0;
}

.sk-shell--page-flex-column {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  min-height: 0;
  box-sizing: border-box;
  overflow: hidden;
  margin-bottom: 0;
  padding-bottom: 0;
}
.sk-shell--page-flex-column > *:not(.sk-shell--form-flex-fill) {
  flex-shrink: 0;
}
.sk-shell--page-flex-column form.sk-shell--form-flex-fill {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  margin: 0;
  padding-top: var(--spacing-sm);
}
.sk-shell--page-flex-column form.sk-shell--form-flex-fill > .sk-page-toolbar {
  flex-shrink: 0;
}

.sk-tab-kit-root--flex-fill {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  width: 100%;
}
.sk-tab-kit-root--flex-fill > .sk-tab-outer {
  flex-shrink: 0;
}
.sk-tab-kit-root--flex-fill > .sk-tab__panels {
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.sk-tab-kit-root--flex-fill .sk-tab__panel--active {
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  display: flex !important;
  flex-direction: column;
}

.sk-tab-panel-body--fill {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-sizing: border-box;
}

.sk-dhtmlx-toolbar-region {
  flex-shrink: 0;
}
.sk-dhtmlx-grid-stack {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.sk-dhtmlx-grid-host {
  flex: 1 1 auto;
  min-height: 0;
  position: relative;
  overflow: hidden;
}
.sk-dhtmlx-grid-host [id^="gridbox"]:not([id$="_autoOverlay"]) {
  width: 100% !important;
  height: 100% !important;
  background-color: #fff;
  overflow: hidden;
}
.sk-shell--page-flex-column #pagingArea {
  flex-shrink: 0;
}

/* menuVisite (i_menu.xslt): <br style="clear:left"> dopo <ul> — altezza inutile nel flusso. */
.sk-shell--page-flex-column .containerVertical br[style*="clear"] {
  display: none;
  height: 0;
  line-height: 0;
  margin: 0;
  padding: 0;
  overflow: hidden;
}
@media (max-width: 1023px) {
  .sk-shell--page-flex-column.div_MainInternoRidotto {
    padding-bottom: 0;
  }
}

.sk-grid-stack--equal-rows {
  flex: 1 1 auto;
  min-height: 0;
  display: grid;
  grid-template-rows: 1fr 1fr;
  gap: var(--spacing-md);
  overflow: hidden;
}
.sk-split-pane {
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.sk-split-pane #pagingAreaEventi,
.sk-split-pane #pagingAreaEsposti {
  flex-shrink: 0;
}
.sk-split-pane--bottom .sk-page-toolbar {
  flex-shrink: 0;
}
.sk-dhtmlx-record-line {
  flex-shrink: 0;
}
.sk-dhtmlx-grid-host > .gridbox-fill {
  width: 100%;
  height: 100%;
  background-color: #fff;
  overflow: hidden;
}
.sk-dhtmlx-grid-host--safety {
  height: clamp(280px, 42vh, 420px);
}


/* ── 35.2  TOOLBAR ELEMENTS ── */

.sk-pt-title {
  display: flex;
  align-items: center;
  gap: 7px;
  margin-right: 4px;
  white-space: nowrap;
}
.sk-pt-title i {
  font-size: 15px;
  color: var(--brand-primary);
  opacity: .85;
}
.sk-pt-title > span {
  font-size: 13px;
  font-weight: 700;
  color: var(--brand-primary);
  letter-spacing: -.01em;
}
.sk-pt-title__sub {
  font-size: var(--font-size-xs) !important;
  font-weight: 500 !important;
  color: var(--color-text-secondary) !important;
  background: var(--color-border-light);
  padding: 2px 8px;
  border-radius: var(--radius-full);
  letter-spacing: 0 !important;
}

.sk-pt-sep {
  width: 1px;
  height: 22px;
  background: var(--color-border-dark);
  margin: 0 6px;
  flex-shrink: 0;
  align-self: center;
}

.sk-pt-right {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: nowrap;
  flex-shrink: 0;
}

/* Separatore tra pulsanti (skTbSep) — stessa linea verticale del titolo */
.sk-pt-sep.sk-pt-sep--between {
  display: inline-flex;
}

/* Item toolbar (pulsanti/separatori con itemKey) — SkPageToolbarApi hide/show */
.sk-page-toolbar .sk-pt-item.sk-pt-item--hidden {
  display: none !important;
}
.sk-page-toolbar button.sk-pt-item:disabled,
.sk-page-toolbar .sk-pt-item[aria-disabled="true"] {
  opacity: 0.55;
  cursor: not-allowed;
}
.sk-page-toolbar .sk-pt-sep.sk-pt-item[aria-disabled="true"] {
  pointer-events: none;
}

/* skTbToggle con stateHint: quadrato vuoto = off, spunta = on (sincronizzato con aria-pressed) */
.sk-page-toolbar .sk-pt-toggle-hint {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.sk-page-toolbar .sk-pt-toggle-hint__icon {
  font-size: 12px;
  line-height: 1;
}
.sk-page-toolbar .sk-pt-toggle-hint__on {
  display: none;
}
.sk-page-toolbar .sk-pt-toggle-hint__off {
  display: inline-block;
  opacity: 0.55;
}
.sk-page-toolbar button.sk-pt-item[aria-pressed="true"] .sk-pt-toggle-hint__on {
  display: inline-block;
}
.sk-page-toolbar button.sk-pt-item[aria-pressed="true"] .sk-pt-toggle-hint__off {
  display: none;
}

/* Contatore record griglia (param recordInfoId su skPageToolbar) */
.sk-pt-record {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 0 6px;
  font-size: var(--font-size-sm);
  font-weight: 600;
  color: var(--color-text-secondary);
  white-space: nowrap;
  line-height: 1.2;
  flex-shrink: 0;
}
.sk-pt-record i {
  margin-right: 4px;
  opacity: .7;
}
.sk-pt-record strong {
  color: var(--brand-primary);
  font-weight: 700;
}

/* Richiesta / verifica risorsa sicurezza (3.1.5, 3.1.6): "Includi gestiti" nel custom slot toolbar */
.sk-page-toolbar .sk-pt-custom.sk-pt-includi-gestiti {
  display: flex;
  align-items: center;
}
.sk-page-toolbar .sk-pt-custom.sk-pt-includi-gestiti label {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  font-weight: normal;
  cursor: pointer;
  white-space: nowrap;
}
.sk-page-toolbar .sk-pt-custom.sk-pt-includi-gestiti input[type="checkbox"] {
  width: 1.375rem;
  height: 1.375rem;
  margin: 0;
  flex-shrink: 0;
  cursor: pointer;
}

/*
 * Al.Pi.Ris.Ch. ricerca (2.3.12.8): seconda barra (cambio stato) sotto la principale.
 */
.sk-page-toolbar.sk-page-toolbar--alpirisch-states {
  margin-top: 10px;
}

/*
 * Al.Pi.Ris.Ch. ricerca (2.3.12.8): tasti stato — pulsante tutto colorato come griglia (stato 1..4).
 */
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_nuovo"],
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_completato"],
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_valutato"],
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_archiviato"] {
  box-shadow: none;
  color: var(--brand-white);
  font-weight: 600;
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_nuovo"] i,
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_completato"] i,
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_valutato"] i,
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_archiviato"] i {
  color: var(--brand-white);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_nuovo"] {
  background: var(--alpirisch-nuovo-bg);
  border-color: var(--alpirisch-nuovo-border);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_nuovo"]:not(:disabled):hover {
  background: var(--alpirisch-nuovo-hover-bg);
  border-color: var(--alpirisch-nuovo-hover-border);
  filter: brightness(1.03);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_completato"] {
  background: var(--alpirisch-completato-bg);
  border-color: var(--alpirisch-completato-border);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_completato"]:not(:disabled):hover {
  background: var(--alpirisch-completato-hover-bg);
  border-color: var(--alpirisch-completato-hover-border);
  filter: brightness(1.03);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_valutato"] {
  background: var(--alpirisch-valutato-bg);
  border-color: var(--alpirisch-valutato-border);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_valutato"]:not(:disabled):hover {
  background: var(--alpirisch-valutato-hover-bg);
  border-color: var(--alpirisch-valutato-hover-border);
  filter: brightness(1.03);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_archiviato"] {
  background: var(--alpirisch-archiviato-bg);
  border-color: var(--alpirisch-archiviato-border);
}
.sk-page-toolbar.sk-page-toolbar--alpirisch-states button.sk-pt-item[data-sk-item="AlPiRisCh_archiviato"]:not(:disabled):hover {
  background: var(--alpirisch-archiviato-hover-bg);
  border-color: var(--alpirisch-archiviato-hover-border);
  filter: brightness(1.03);
}

/* Select opzionale (sk_page_toolbar.xslt — param selectSlot) */
.sk-pt-select {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex: 0 1 auto;
  max-width: 100%;
}
.sk-pt-select__lbl {
  font-size: var(--font-size-sm);
  font-weight: 600;
  color: var(--color-text-secondary);
  white-space: nowrap;
}
.sk-pt-select .select,
.sk-pt-select select.sk-pt-select__control {
  min-width: 160px;
  max-width: min(280px, 100vw);
}

/* customSlot report appena prima di Esporta/Stampa (es. DocumentoSanitarioPersonale_scheda) */
.sk-page-toolbar .sk-pt-custom.sk-dosp-report-near-print {
  display: inline-flex;
  align-items: center;
  flex: 0 1 auto;
  max-width: 100%;
}

/* customSlotRight: tendina nel blocco destro, prima di Stampa/Salva */
.sk-page-toolbar .sk-pt-right > .sk-pt-custom {
  display: inline-flex;
  align-items: center;
  flex: 0 1 auto;
  max-width: 100%;
}

/* Badge "Modifiche non salvate" accanto a Salva (schede) */
.sk-dirty-badge {
  display: none;
  align-items: center;
  gap: 5px;
  font-size: 12px;
  font-weight: 600;
  color: var(--color-warning-text, #8a5a00);
  background: var(--color-warning-light, #fff4d6);
  border: 1px solid var(--color-warning, #d99a00);
  border-radius: 12px;
  padding: 2px 10px;
  margin-right: 8px;
  white-space: nowrap;
}
.sk-dirty-badge.is-on {
  display: inline-flex;
}
.sk-page-toolbar .sk-pt-right > .sk-dirty-badge.is-on {
  flex: 0 0 auto;
}

/* SkGridKit.colEdit: stesso cursore su cella vuota e popolata */
.dhx_grid-cell:has(.sk-grid-edit-cell:not(.sk-grid-edit-cell--locked)),
.sk-grid-edit-cell {
  cursor: text;
}
.sk-grid-edit-cell {
  display: flex;
  align-items: center;
  width: 100%;
  flex: 1 1 auto;
  align-self: stretch;
  max-width: 100%;
  min-height: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sk-grid-edit-cell--empty {
  color: var(--color-text-tertiary, #94a3b8);
  font-style: italic;
}
.sk-grid-edit-cell--locked {
  cursor: default;
}

/* Ricerca globale griglia accanto a Esporta Excel (azioni_ricerca SkGridKit) */
.sk-page-toolbar .sk-pt-custom.sk-azioni-grid-search {
  display: inline-flex;
  align-items: center;
  flex: 0 0 auto;
  margin-left: 4px;
}
.sk-page-toolbar .sk-azioni-grid-search-input {
  width: 240px;
  max-width: min(240px, 40vw);
  padding: 6px 10px;
  font-size: var(--font-size-sm);
  font-family: var(--font-base);
  color: var(--color-text-primary);
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  box-sizing: border-box;
}
.sk-page-toolbar .sk-azioni-grid-search-input:focus {
  outline: none;
  border-color: var(--brand-primary);
  box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);
}

/* Avviso drag-and-drop tra Elimina e conteggio record (questionari_scheda, tabelleParametriche_scheda, SchedaTBP_parametro) */
.sk-page-toolbar .sk-pt-custom.sk-pt-domande-drag-hint {
  flex: 0 1 auto;
  align-self: center;
  min-width: 0;
  max-width: min(28rem, 100%);
  padding: 0 6px;
  color: var(--color-error-dark);
}
.sk-page-toolbar .sk-pt-custom.sk-pt-domande-drag-hint .sk-pt-inline-hint-dragnote {
  color: var(--color-error-dark);
  font-weight: bold;
  font-size: 12px;
  line-height: 1.35;
}

/* Seconda barra (Cambio stato) sotto la toolbar azioni griglia */
.sk-page-toolbar + .sk-page-toolbar.sk-azioni-toolbar-stati,
.sk-page-toolbar.sk-azioni-toolbar-stati {
  margin-top: 6px;
}


/* ── 35.3  SK BUTTON BASE ── */

.sk-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 13px;
  height: 32px;
  font-family: var(--font-base);
  font-size: var(--font-size-sm);
  font-weight: 500;
  color: var(--brand-primary);
  background: var(--gradient-card);
  border: 1px solid var(--tab-border);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-xs);
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
  line-height: 1;
  transition: all var(--transition-fast);
  text-decoration: none;
  vertical-align: middle;
}
.sk-btn i {
  font-size: 11px;
  flex-shrink: 0;
}
.sk-btn:hover {
  background: linear-gradient(145deg, var(--btn-hover-bg-start) 0%, var(--btn-hover-bg-end) 100%);
  border-color: var(--brand-primary);
  box-shadow: var(--shadow-sm);
  transform: translateY(-1px);
  color: var(--brand-primary);
}
.sk-btn:active {
  background: linear-gradient(145deg, var(--btn-active-bg-start) 0%, var(--btn-active-bg-end) 100%);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.15);
  transform: translateY(0);
}
.sk-btn:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(40, 68, 115, 0.25);
}


/* ── 35.4  SK BUTTON VARIANTS ── */

.sk-btn--primary {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--brand-primary-light) 0%, var(--brand-primary) 100%);
  border-color: var(--brand-primary-dark);
  box-shadow: 0 2px 4px rgba(40, 68, 115, 0.25);
}
.sk-btn--primary:hover {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--brand-primary-hover) 0%, var(--brand-primary-dark) 100%);
  border-color: var(--brand-primary-dark);
  box-shadow: 0 4px 8px rgba(40, 68, 115, 0.30);
  transform: translateY(-1px);
}
.sk-btn--primary:active {
  background: var(--brand-primary-dark);
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
  transform: translateY(0);
}
.sk-btn--primary:focus-visible {
  box-shadow: 0 0 0 3px rgba(40, 68, 115, 0.35);
}

.sk-btn--accent {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--brand-accent-hover) 0%, var(--brand-accent) 100%);
  border-color: var(--brand-accent-dark);
  box-shadow: 0 2px 4px rgba(255, 150, 0, 0.25);
}
.sk-btn--accent:hover {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--brand-accent) 0%, var(--brand-accent-dark) 100%);
  border-color: var(--brand-accent-dark);
  box-shadow: 0 4px 8px rgba(255, 150, 0, 0.30);
  transform: translateY(-1px);
}
.sk-btn--accent:active {
  background: var(--brand-accent-dark);
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
  transform: translateY(0);
}
.sk-btn--accent:focus-visible {
  box-shadow: 0 0 0 3px rgba(255, 150, 0, 0.35);
}

.sk-btn--ghost {
  background: transparent;
  border-color: var(--color-border-dark);
  color: var(--color-text-secondary);
  box-shadow: none;
}
.sk-btn--ghost:hover {
  background: var(--color-bg-main);
  border-color: var(--brand-primary);
  color: var(--brand-primary);
  box-shadow: var(--shadow-xs);
  transform: translateY(-1px);
}
.sk-btn--ghost:active {
  background: var(--color-bg-hover);
  box-shadow: none;
  transform: translateY(0);
}

.sk-btn--success {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--chart-3-light) 0%, var(--color-success) 100%);
  border-color: var(--color-success-dark);
  box-shadow: 0 2px 4px rgba(16, 185, 129, 0.25);
}
.sk-btn--success:hover {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--color-success) 0%, var(--color-success-dark) 100%);
  border-color: var(--color-success-text);
  box-shadow: 0 4px 8px rgba(16, 185, 129, 0.30);
  transform: translateY(-1px);
}
.sk-btn--success:active {
  background: var(--color-success-dark);
  transform: translateY(0);
}

.sk-btn--warning {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--chart-6-light) 0%, var(--color-warning) 100%);
  border-color: var(--color-warning-dark);
  box-shadow: 0 2px 4px rgba(245, 158, 11, 0.25);
}
.sk-btn--warning:hover {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--color-warning) 0%, var(--color-warning-dark) 100%);
  border-color: var(--color-warning-text);
  box-shadow: 0 4px 8px rgba(245, 158, 11, 0.30);
  transform: translateY(-1px);
}
.sk-btn--warning:active {
  background: var(--color-warning-dark);
  transform: translateY(0);
}

.sk-btn--danger {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--brand-danger-light) 0%, var(--color-error) 100%);
  border-color: var(--color-error-dark);
  box-shadow: 0 2px 4px rgba(239, 68, 68, 0.25);
}
.sk-btn--danger:hover {
  color: var(--brand-white);
  background: linear-gradient(145deg, var(--color-error) 0%, var(--color-error-dark) 100%);
  border-color: var(--color-error-text);
  box-shadow: 0 4px 8px rgba(239, 68, 68, 0.30);
  transform: translateY(-1px);
}
.sk-btn--danger:active {
  background: var(--color-error-dark);
  transform: translateY(0);
}


/* ── 35.5  SK BUTTON MODIFIERS ── */

.sk-btn--icon {
  padding: 0;
  width: 32px;
  justify-content: center;
}
.sk-btn--icon i {
  font-size: 13px;
}

.sk-btn[disabled],
.sk-btn--disabled {
  opacity: .45;
  cursor: not-allowed;
  pointer-events: none;
  transform: none !important;
  box-shadow: none !important;
}


/* jQuery UI autocomplete layering (35.5b) ---------------------------------
   Il menu .ui-autocomplete ha classe .ui-front => z-index:100 (jquery-ui.min.css):
   troppo basso, l'header sticky delle grid v9 lo copre (es. "Ricerca per cognome"
   / risorsa picker in scheda incidenti-infortuni Hadar, ch 7.6.1.1). Lo alziamo
   sopra la pagina ma sotto i modali (mask 100050 / dialog 100060), cosi' un
   eventuale modale resta comunque davanti al dropdown. */
.ui-autocomplete { z-index: 100040 !important; }

/* ── 35.6  SK DIALOG KIT (SkDialogKit / SkGridDelete) ──
   Modali alert/confirm CANOPO. Seguono html[data-theme] (sk-core.js).
   Pulsanti: .sk-btn (primary / ghost / danger). */

.sk-dialog-overlay {
  position: fixed;
  inset: 0;
  /* Sopra sk-lookup-modal-mask / skFormModal (z-index 100050 in sk-multi-select-grid-kit.js) */
  z-index: 100060;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  background: rgba(15, 23, 42, 0.48);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  animation: sk-dialog-fade-in 0.15s ease-out;
}

.sk-dialog-modal {
  width: min(440px, 100%);
  max-height: min(85vh, 520px);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  font-family: var(--font-base);
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md, 8px);
  box-shadow: var(--shadow-lg, 0 16px 40px rgba(15, 23, 42, 0.22));
}

.sk-dialog-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--color-border);
  background: var(--color-bg-secondary);
}

.sk-dialog-head h3 {
  margin: 0;
  flex: 1;
  font-size: var(--font-size-sm, 13px);
  font-weight: 600;
  color: var(--brand-primary);
  line-height: 1.3;
}

.sk-dialog-head .sk-dialog-icon {
  flex-shrink: 0;
  width: 18px;
  text-align: center;
  font-size: 14px;
  color: var(--brand-primary);
}

.sk-dialog-head--danger {
  background: var(--color-error-light, #FEF2F2);
}

.sk-dialog-head--danger h3,
.sk-dialog-head--danger .sk-dialog-icon {
  color: var(--color-error, #DC2626);
}

.sk-dialog-body {
  padding: 16px 18px;
  font-size: var(--font-size-sm, 13px);
  line-height: 1.5;
  color: var(--color-text-primary);
  white-space: pre-wrap;
  overflow-y: auto;
}

.sk-dialog-foot {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  align-items: center;
  gap: 8px;
  padding: 12px 16px;
  border-top: 1px solid var(--color-border);
  background: var(--color-bg-white);
}

.sk-dialog-foot .sk-btn {
  min-width: 88px;
  justify-content: center;
}

@keyframes sk-dialog-fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  .sk-dialog-overlay { animation: none; }
}


/* ==========================================================================
   36. SK HOME DASHBOARD KIT v6
   ==========================================================================
   Classi per la home page Canopo. Layout senza sidebar, con widget strip,
   hero bar compatta, urgent banner condizionale, griglia moduli adattiva.
   ========================================================================== */


/* ── 36.1  WRAPPER ── */

.sk-home-wrap {
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  margin-top: var(--content-offset-base);
  padding: 0 20px 40px;
  background: var(--color-bg-main);
  min-height: calc(100vh - var(--content-offset-base));
  overflow: visible;
}


/* ── 36.2  HERO BAR ── */
/* Estensione visiva dell'header: flush laterale, bordo inferiore dritto. */

.sk-home-hero {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
  background: var(--brand-primary);
  color: var(--brand-white);
  padding: 10px 24px;
  border-radius: 0;
  box-shadow: 0 4px 20px rgba(26, 47, 84, 0.16);
  margin: 0 -20px 20px;
  position: sticky;
  top: var(--header-h);
  z-index: 98;
}

.sk-home-hero-left {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
}
.sk-home-hero-left h1 {
  font-size: 16px;
  font-weight: 600;
  margin: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.sk-home-hero-left small {
  font-size: var(--font-size-xs);
  opacity: 0.7;
}

.sk-home-hero-center {
  flex: 1;
  min-width: 180px;
  max-width: 400px;
  position: relative;
}
.sk-home-hero-center input {
  width: 100%;
  padding: 7px 16px 7px 32px;
  border: 1px solid rgba(255,255,255,0.18);
  border-radius: var(--radius-full);
  background: rgba(255,255,255,0.13);
  color: var(--brand-white);
  font-size: 12px;
  font-family: var(--font-base);
  height: 36px;
  box-sizing: border-box;
  transition: background var(--transition-normal);
}
.sk-home-hero-center input::placeholder { color: rgba(255,255,255,0.6); }
.sk-home-hero-center input:focus { outline: none; background: rgba(255,255,255,0.25); box-shadow: 0 0 0 2px rgba(255,255,255,0.5); }  /* v49 A11Y */
.sk-home-hero-center > i {
  position: absolute;
  left: 11px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 12px;
  opacity: 0.6;
}

.sk-home-hero-right {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-left: auto;
}
.sk-home-hero-db {
  display: flex;
  align-items: center;
  gap: 6px;
  background: rgba(255,255,255,0.12);
  padding: 7px 14px;
  border-radius: var(--radius-md);
  font-size: var(--font-size-sm);
  border: 1px solid rgba(255,255,255,0.16);
}
.sk-home-hero-db select {
  background: transparent;
  border: none;
  color: var(--brand-white);
  font-size: var(--font-size-sm);
  cursor: pointer;
  outline: none;
}
.sk-home-hero-db select:focus-visible { box-shadow: 0 0 0 2px rgba(255,255,255,0.5); }  /* v49 A11Y */
.sk-home-hero-db select option { background: var(--brand-primary); color: #fff; }


/* ── 36.3  URGENT BANNER ── */

.sk-home-urgent {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 18px;
  background: var(--color-error-light);
  border: 1px solid var(--color-error);
  border-radius: var(--radius-lg);
  margin-bottom: 14px;
  flex-wrap: wrap;
}
.sk-home-urgent-icon {
  font-size: 18px;
  color: var(--color-error);
  flex-shrink: 0;
}
.sk-home-urgent-text {
  font-size: var(--font-size-base);
  font-weight: 500;
  color: var(--color-text-primary);
  flex: 1;
  min-width: 120px;
}
.sk-home-urgent-actions {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}
.sk-home-urgent-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 5px 14px;
  font-size: var(--font-size-sm);
  font-weight: 600;
  border-radius: var(--radius-full);
  cursor: pointer;
  text-decoration: none;
  transition: all var(--transition-fast);
  border: none;
  color: var(--brand-white);
}
.sk-home-urgent-btn--danger  { background: var(--color-error); }
.sk-home-urgent-btn--danger:hover {
  background: var(--color-error-text);
  transform: translateY(-1px);
  box-shadow: 0 2px 8px rgba(239, 68, 68, 0.4);
}
.sk-home-urgent-btn--warning { background: var(--color-warning); }
.sk-home-urgent-btn--warning:hover {
  background: var(--color-warning-text);
  transform: translateY(-1px);
  box-shadow: 0 2px 8px rgba(245, 158, 11, 0.4);
}


/* ── 36.4  WIDGET STRIP ── */

.sk-home-widgets {
  display: flex;
  gap: 8px;
  margin-bottom: 20px;
  flex-wrap: wrap;
  max-width: 100%;
}

/* Separatore verticale tra gruppi di widget (contatori vs azioni) */
.sk-home-widgets-sep {
  width: 1px;
  align-self: stretch;
  margin: 4px 4px;
  background: var(--color-border);
  flex-shrink: 0;
}

.sk-home-widget {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-xs);
  cursor: pointer;
  text-decoration: none;
  color: var(--color-text-primary);
  transition: all var(--transition-normal);
  flex: 1 1 0;
  min-width: 130px;
}
.sk-home-widget:hover {
  box-shadow: var(--shadow-md);
  border-color: var(--color-border-dark);
  transform: translateY(-2px);
}

.sk-home-widget-icon {
  width: 34px;
  height: 34px;
  border-radius: var(--radius-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  flex-shrink: 0;
  background: var(--color-icon-bg);
  color: var(--brand-primary);
}
.sk-home-widget-icon--primary,
.sk-home-widget-icon--accent,
.sk-home-widget-icon--danger,
.sk-home-widget-icon--success { background: var(--color-icon-bg); color: var(--brand-primary); }

.sk-home-widget-label {
  font-size: 12px;
  font-weight: 500;
  color: var(--color-text-secondary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 1;
  min-width: 0;
}

/* Badge contatore */
.sk-home-widget-badge {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 7px;
  border-radius: var(--radius-full);
  font-size: 10px;
  font-weight: 700;
  background: var(--color-border-light);
  color: var(--color-text-secondary);
  flex-shrink: 0;
}
.sk-home-widget-badge--alert {
  background: #DC2626;  /* v54 WCAG: 4.83:1 con bianco, sia light sia dark */
  color: var(--brand-white);
  animation: sk-pulse 2s ease-in-out infinite;
}
@keyframes sk-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.7; }
}

/* Widget compatto (link, senza contatore) */
.sk-home-widget--compact {
  flex: 0 1 auto;
  min-width: auto;
  padding: 10px 16px;
  gap: 10px;
}
.sk-home-widget--compact .sk-home-widget-icon { width: 34px; height: 34px; font-size: 14px; }
.sk-home-widget--compact .sk-home-widget-label { font-size: 12px; }

/* Widget evidenziato (Report) — stile neutro con accento sottile */
.sk-home-widget--highlight {
  flex: 0 1 auto;
  min-width: auto;
  padding: 10px 16px;
  gap: 10px;
  background: var(--color-bg-white);
  border-color: var(--color-border);
  border-left: 3px solid var(--color-accent-safe);  /* v54 WCAG 1.4.11: 5.22:1 */
}
.sk-home-widget--highlight .sk-home-widget-icon {
  width: 34px;
  height: 34px;
  font-size: 14px;
  background: var(--color-icon-bg);
  color: var(--color-accent-safe);
  border-radius: var(--radius-sm);
}
.sk-home-widget--highlight .sk-home-widget-label {
  font-size: 12px;
  font-weight: 600;
  color: var(--color-text-secondary);
}
.sk-home-widget--highlight:hover {
  box-shadow: var(--shadow-md);
  border-color: var(--brand-accent);
  border-left-color: var(--brand-accent);
  transform: translateY(-2px);
}


/* ── 36.5  SECTION LABEL ── */

.sk-home-section-label {
  font-size: 12px;
  color: var(--brand-primary);
  margin: 22px 0 10px;
  padding: 7px 12px;
  background: var(--color-icon-bg);
  border-left: 4px solid var(--brand-accent);
  border-bottom: none;
  border-radius: 4px;
  text-transform: uppercase;
  letter-spacing: 1.4px;
  font-weight: 700;
  display: flex;
  align-items: center;
  gap: 8px;
}
.sk-home-section-label:first-child { margin-top: 0; }
.sk-home-section-label i { display: inline-block; font-size: 6px; color: var(--color-accent-safe); }

/* Sottotitolo italiano nelle sezioni (inline dopo il testo EN) */
.sk-home-section-sub {
  text-transform: none;
  letter-spacing: 0;
  font-weight: 400;
  font-size: 11px;
  color: #556270;  /* v54 WCAG: 5.57:1 su icon-bg, 6.26:1 su bianco */
  margin-left: 2px;
}

/* View switcher: pill tabs per cambiare vista */
.sk-home-view-switcher {
  display: flex;
  gap: 4px;
  margin-bottom: 16px;
}
.sk-home-view-tab {
  padding: 7px 16px;
  font-size: 12px;
  font-weight: 600;
  color: var(--color-text-secondary);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-full);
  cursor: pointer;
  transition: all var(--transition-fast);
  background: var(--color-bg-white);
  display: flex;
  align-items: center;
  gap: 6px;
  user-select: none;
}
.sk-home-view-tab i { font-size: 11px; }
.sk-home-view-tab:hover { border-color: var(--brand-primary); color: var(--brand-primary); }
.sk-home-view-tab:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: 2px; }
.sk-home-view-tab.active {
  background: var(--brand-primary);
  border-color: var(--brand-primary);
  color: var(--brand-white);
}

/* View panel: contenuto togglabile */
.sk-home-view { display: none; }
.sk-home-view.active { display: block; }


/* ── 36.6  LAYOUT 65/35 (estensione sk-layout per la home) ── */

.sk-home-layout {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
  width: 100%;
  box-sizing: border-box;
  align-items: flex-start;
}
.sk-home-layout__main {
  flex: 1 1 0;
  min-width: 320px;
  overflow: hidden;
}
.sk-home-layout__side {
  flex: 0 0 35%;
  min-width: 280px;
  max-width: 460px;
  overflow: hidden;
}


/* ── 36.7  GRIGLIA MODULI ── */

.sk-home-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
  margin-bottom: 10px;
}

/* Dentro colonna principale: card crescono su schermi grandi */
.sk-home-layout__main .sk-home-grid {
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
}

/* Dentro colonna laterale: card compatte */
.sk-home-layout__side .sk-home-grid {
  grid-template-columns: 1fr;
  gap: 8px;
}

/* Full width */
.sk-home-grid-full {
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 12px;
}


/* ── 36.8  CARD MODULO ── */

.sk-home-card {
  background: var(--color-bg-white);
  padding: 18px 20px;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
  border: 1px solid var(--color-border);
  cursor: pointer;
  transition: transform var(--transition-fast),
              box-shadow var(--transition-fast),
              border-color var(--transition-fast);
  display: flex;
  align-items: center;
  gap: 14px;
  min-height: 62px;
  position: relative;
  overflow: hidden;
}
.sk-home-card:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-hover);
  border-color: var(--brand-accent);
}

/* Top-border accent: si espande dal centro verso i lati on hover */
.sk-home-card::after {
  content: '';
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 0;
  height: 3px;
  background: var(--brand-accent);
  border-radius: 0 0 3px 3px;
  transition: width 250ms cubic-bezier(.4, 0, .2, 1);
}
.sk-home-card:hover::after {
  width: 100%;
}
.sk-home-card-icon {
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background: var(--color-icon-bg);
  color: var(--brand-primary);
  font-size: 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  flex-shrink: 0;
  border: 1.5px solid rgba(255, 150, 0, 0.15);
  transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
}
.sk-home-card h3 {
  font-size: 14px;
  color: var(--color-text-primary);
  margin: 0;
  font-weight: 500;
  line-height: 1.35;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

/* Colonna laterale: card piu compatte */
.sk-home-layout__side .sk-home-card {
  padding: 12px 14px;
  gap: 10px;
  min-height: 48px;
}
.sk-home-layout__side .sk-home-card-icon { width: 32px; height: 32px; border-radius: 8px; font-size: 15px; }
.sk-home-layout__side .sk-home-card h3   { font-size: 13px; }

/* Card full-width */
.sk-home-grid-full .sk-home-card      { padding: 20px 22px; gap: 16px; min-height: 66px; }
.sk-home-grid-full .sk-home-card-icon { width: 44px; height: 44px; border-radius: 12px; font-size: 20px; }
.sk-home-grid-full .sk-home-card h3   { font-size: 15px; }

/* Urgent variant: bordo sinistro rosso, card bianca, nessun gradient */
.sk-home-card--urgent {
  border-left: 3px solid var(--color-error);
  background: var(--color-bg-white);
}
.sk-home-card--urgent:hover { border-color: var(--brand-accent); border-left-color: var(--color-error); }
.sk-home-card--urgent .sk-home-card-icon { background: var(--color-icon-bg); color: var(--brand-primary); }
/* Urgent: top-border accent resta arancione come le card normali */
.sk-home-card--urgent::after { background: var(--brand-accent); }

/* Card arrow (chevron dx, visibile solo sulle card operative main) */
.sk-home-card-arrow {
  margin-left: auto;
  font-size: 11px;
  color: var(--brand-accent);
  flex-shrink: 0;
  opacity: 0.3;
  transform: translateX(0);
  transition: opacity var(--transition-fast),
              transform var(--transition-fast),
              color var(--transition-fast);
}
.sk-home-card:hover .sk-home-card-arrow {
  opacity: 1;
  transform: translateX(0);
  color: var(--brand-accent);
}
/* Sidebar: arrow sempre nascosta (card compatte) */
.sk-home-layout__side .sk-home-card-arrow { display: none; }
/* Sidebar: top-border nascosta (card troppo compatte) */
.sk-home-layout__side .sk-home-card::after { display: none; }

/* Urgent count badge (contatore numerico nelle card urgent) */
.sk-home-urgent-count {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 26px;
  height: 26px;
  padding: 0 8px;
  border-radius: var(--radius-full);
  font-size: 12px;
  font-weight: 700;
  background: #DC2626;  /* v54 WCAG: 4.83:1 con bianco */
  color: var(--brand-white);
  flex-shrink: 0;
  animation: sk-pulse 2s ease-in-out infinite;
}

/* Touch feedback: :active per tap su mobile, :focus-visible per tastiera */
.sk-home-card:active {
  transform: translateY(0) scale(0.98);
  box-shadow: var(--shadow-xs);
  transition-duration: 50ms;
}
.sk-home-card:focus-visible {
  outline: 2px solid var(--brand-accent);
  outline-offset: 2px;
}
.sk-home-widget:active {
  transform: translateY(0) scale(0.98);
  box-shadow: var(--shadow-xs);
  transition-duration: 50ms;
}
.sk-home-widget:focus-visible {
  outline: 2px solid var(--brand-accent);
  outline-offset: 2px;
}
.sk-home-quick-btn:active {
  transform: translateY(0) scale(0.97);
  box-shadow: none;
  transition-duration: 50ms;
}
.sk-home-quick-btn:focus-visible {
  outline: 2px solid var(--brand-white);
  outline-offset: 2px;
}


/* ── 36.9  MY CANOPO SOTTOSEZIONI ── */

.sk-home-mc-subtitle {
  font-size: var(--font-size-xs);
  text-transform: uppercase;
  letter-spacing: 0.8px;
  color: var(--color-text-light);
  font-weight: 600;
  margin: 14px 0 6px;
  padding-left: 2px;
}
.sk-home-mc-subtitle:first-of-type { margin-top: 0; }

/* Quick actions: bottoni pieni, touch-friendly */
.sk-home-quick-actions {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}
.sk-home-quick-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 12px 22px;
  background: var(--brand-primary);
  border: none;
  border-radius: var(--radius-md);
  color: var(--brand-white);
  font-size: var(--font-size-base);
  font-weight: 600;
  cursor: pointer;
  text-decoration: none;
  transition: all var(--transition-fast);
  box-shadow: var(--shadow-sm);
  min-width: 160px;
  min-height: 46px;
}
.sk-home-quick-btn:hover {
  background: var(--brand-accent);
  transform: translateY(-1px);
  box-shadow: var(--shadow-md);
}
.sk-home-quick-btn i { font-size: 14px; }

.sk-home-quick-btn--secondary { background: var(--brand-accent-dark); }
.sk-home-quick-btn--secondary:hover { background: var(--brand-accent); }


/* ── 36.10  ALERT ── */

.sk-home-alert {
  max-width: 700px;
  margin: 30px auto;
  padding: 20px;
  background: var(--color-info-light);
  border-radius: var(--radius-lg);
  border-left: 4px solid var(--color-info);
  box-shadow: var(--shadow-sm);
}
.sk-home-alert h2 {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--brand-primary);
  margin: 0 0 10px;
  font-size: 15px;
}
.sk-home-alert p { margin: 0 0 6px; line-height: 1.5; }
.sk-home-alert-tip {
  margin-top: 12px;
  padding: 10px 12px;
  background: rgba(255,255,255,0.7);
  border-radius: var(--radius-md);
  border-left: 3px solid var(--color-info);
}


/* ── 36.11  HELPDESK FOOTER ── */

.sk-home-helpdesk {
  text-align: center;
  padding: 16px;
  margin-top: 20px;
  font-size: var(--font-size-sm);
  color: var(--color-text-light);
  border-top: 1px solid var(--color-border-light);
}
.sk-home-helpdesk a {
  color: var(--color-text-secondary);
  text-decoration: none;
}
.sk-home-helpdesk a:hover {
  color: var(--brand-primary);
  text-decoration: underline;
}


/* ── 36.12  SCHERMI GRANDI: card crescono proporzionalmente ── */

/* >= 1200px: prima crescita, grid minmax sale */
@media (min-width: 1200px) {
  .sk-home-layout__main .sk-home-grid {
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 14px;
  }
  .sk-home-grid-full {
    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
    gap: 14px;
  }
  .sk-home-layout__main .sk-home-card {
    padding: 18px 20px;
    gap: 16px;
    min-height: 66px;
  }
  .sk-home-layout__main .sk-home-card-icon {
    width: 42px;
    height: 42px;
    border-radius: 11px;
    font-size: 19px;
  }
}

/* >= 1400px: seconda crescita */
@media (min-width: 1400px) {
  .sk-home-layout__main .sk-home-grid {
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
    gap: 14px;
  }
  .sk-home-grid-full {
    grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
    gap: 14px;
  }
  .sk-home-layout__main .sk-home-card {
    padding: 20px 22px;
    gap: 16px;
    min-height: 70px;
  }
  .sk-home-layout__main .sk-home-card-icon {
    width: 46px;
    height: 46px;
    border-radius: 12px;
    font-size: 21px;
  }
  .sk-home-layout__main .sk-home-card h3 { font-size: 15px; }

  .sk-home-layout__side .sk-home-card {
    padding: 12px 14px;
    gap: 10px;
    min-height: 48px;
  }
  .sk-home-layout__side .sk-home-card-icon {
    width: 34px;
    height: 34px;
    border-radius: 8px;
    font-size: 16px;
  }
  .sk-home-layout__side .sk-home-card h3 { font-size: 12px; }

  .sk-home-layout__side { padding: 22px; }
  .sk-home-side-header-icon { width: 34px; height: 34px; font-size: 14px; }
  .sk-home-side-header h2   { font-size: 14px; }
}


@media (min-width: 1800px) {
  .sk-home-layout__main .sk-home-grid {
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 16px;
  }
  .sk-home-grid-full {
    grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
    gap: 16px;
  }
  .sk-home-layout__main .sk-home-card {
    padding: 22px 24px;
    gap: 18px;
    min-height: 74px;
  }
  .sk-home-layout__main .sk-home-card-icon {
    width: 50px;
    height: 50px;
    border-radius: 14px;
    font-size: 23px;
  }
  .sk-home-layout__main .sk-home-card h3 { font-size: 16px; }

  .sk-home-layout__side .sk-home-grid {
    grid-template-columns: 1fr;
    gap: 8px;
  }
  .sk-home-layout__side .sk-home-card-icon {
    width: 34px;
    height: 34px;
    border-radius: 8px;
    font-size: 17px;
  }
  .sk-home-layout__side .sk-home-card h3 { font-size: 12px; }

  .sk-home-layout__side { padding: 26px; }
  .sk-home-side-header-icon { width: 38px; height: 38px; font-size: 15px; }
  .sk-home-side-header h2   { font-size: 15px; }
}


/* ── 36.12b  TABLET (769px – 1024px): sidebar piu stretta, card arrow visibili ── */

@media (min-width: 769px) and (max-width: 1024px) {
  .sk-home-layout__side {
    flex: 0 0 280px;
    min-width: 240px;
    max-width: 320px;
    padding: 16px;
  }
  .sk-home-layout__side .sk-home-grid {
    grid-template-columns: 1fr;
    gap: 8px;
  }
  .sk-home-layout__side .sk-home-side-header h2 { font-size: 13px; }
  .sk-home-layout__side .sk-home-side-header-icon { width: 28px; height: 28px; font-size: 12px; }
}

/* Card arrow: schermi grandi mostra on hover con transizione */
@media (min-width: 1400px) {
  .sk-home-card-arrow { font-size: 12px; }
}


/* ── 36.13  RESPONSIVE (mobile) ── */

@media (max-width: 768px) {
  .sk-home-wrap { padding: 0 10px 30px; }
  .sk-home-hero {
    flex-direction: column;
    align-items: stretch;
    padding: 12px 16px;
    margin: 0 -10px 16px;
    position: static;
  }
  .sk-home-hero-center { max-width: 100%; }
  .sk-home-hero-right { margin-left: 0; justify-content: space-between; }

  /* Hero select: full width su mobile per evitare overflow testo */
  .sk-home-hero-db { width: 100%; }
  .sk-home-hero-db select { width: 100%; min-width: 0; }

  /* Widget strip: colonna con spacing touch-friendly */
  .sk-home-widgets { flex-direction: column; gap: 10px; }
  .sk-home-widget { min-width: 0; min-height: 50px; padding: 12px 16px; }
  .sk-home-widgets-sep { display: none; }

  .sk-home-layout { gap: 0; }
  .sk-home-layout__main,
  .sk-home-layout__side { flex: 1 1 100%; min-width: 0; max-width: 100%; }

  /* Grid: colonna singola con gap maggiore per touch */
  .sk-home-grid,
  .sk-home-layout__main .sk-home-grid,
  .sk-home-layout__side .sk-home-grid { grid-template-columns: 1fr; gap: 10px; }
  .sk-home-grid-full { gap: 10px; }

  /* Card: touch target minimo e spacing adeguato */
  .sk-home-card { min-height: 56px; padding: 14px 16px; gap: 12px; }
  .sk-home-card-icon { width: 36px; height: 36px; border-radius: 8px; font-size: 16px; }
  .sk-home-layout__side .sk-home-card { min-height: 50px; padding: 14px 16px; }

  /* Arrow: sempre visibile su mobile (no hover), stile compatto */
  .sk-home-card-arrow {
    opacity: 0.5;
    transform: translateX(0);
    font-size: 10px;
    color: var(--brand-accent);
  }

  .sk-home-urgent { flex-direction: column; align-items: flex-start; }
  .sk-home-quick-actions { flex-direction: column; }
  .sk-home-quick-btn {
    min-width: 0;
    width: 100%;
    padding: 14px 22px;
    font-size: 15px;
    min-height: 50px;
  }

  /* Section labels: margine ridotto */
  .sk-home-section-label { margin: 16px 0 8px; }

  /* View switcher: scroll orizzontale su mobile */
  .sk-home-view-switcher { overflow-x: auto; -webkit-overflow-scrolling: touch; padding-bottom: 4px; }
  .sk-home-view-tab { white-space: nowrap; min-height: 44px; padding: 10px 16px; font-size: 13px; }

  /* Urgent card: bordo sinistro resta visibile su mobile */
  .sk-home-card--urgent { border-left-width: 3px; }
}


/* ── 36.14  SIDEBAR CARD (variante 65/35 con MyCanopo) ──
   La colonna laterale diventa una card sticky con padding.
   Header con icona gradient + titolo.                        */

.sk-home-layout__side {
  position: sticky;
  top: calc(var(--header-h) + 68px);  /* header + hero height + gap */
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-xl);
  box-shadow: var(--shadow-sm);
  padding: 18px;
  align-self: flex-start;
}

.sk-home-side-header {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 16px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--color-border-light);
}
.sk-home-side-header-icon {
  width: 30px;
  height: 30px;
  border-radius: var(--radius-md);
  background: var(--gradient-primary);
  color: var(--brand-white);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  flex-shrink: 0;
}
.sk-home-side-header h2 {
  font-size: 13px;
  font-weight: 700;
  color: var(--brand-primary);
  margin: 0;
  line-height: 1.2;
}
.sk-home-side-header small {
  font-size: var(--font-size-xs);
  color: var(--color-text-light);
  display: block;
}

/* Sidebar: quick actions in colonna (verticale) */
.sk-home-layout__side .sk-home-quick-actions {
  flex-direction: column;
}


/* ── 36.15  MY CANOPO FULL-WIDTH HEADER ──
   Barra orizzontale con icona gradient + titolo + quick actions inline a destra.
   Usata quando la home mostra solo MyCanopo senza colonna laterale.           */

.sk-home-mc-header {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 20px;
  padding: 18px 24px;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-xl);
  box-shadow: var(--shadow-sm);
}
.sk-home-mc-header-icon {
  width: 36px;
  height: 36px;
  border-radius: var(--radius-md);
  background: var(--gradient-primary);
  color: var(--brand-white);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 15px;
  flex-shrink: 0;
}
.sk-home-mc-header h2 {
  font-size: 15px;
  font-weight: 700;
  color: var(--brand-primary);
  margin: 0;
}
.sk-home-mc-header small {
  font-size: var(--font-size-sm);
  color: var(--color-text-light);
}
/* Quick actions: riga inline, margin-left auto per allinearle a destra */
.sk-home-mc-header .sk-home-quick-actions {
  flex-direction: row;
  margin: 0 0 0 auto;
}
.sk-home-mc-header .sk-home-quick-btn {
  min-width: auto;
  min-height: 38px;
  padding: 8px 18px;
  font-size: var(--font-size-sm);
}


/* ── 36.18  RESPONSIVE PATCH (Home v6 new components) ── */

@media (max-width: 768px) {
  .sk-home-layout__side {
    position: static;
    max-width: 100%;
    padding: 14px;
  }
  .sk-home-mc-header {
    flex-direction: column;
    align-items: flex-start;
    padding: 14px 16px;
  }
  .sk-home-mc-header .sk-home-quick-actions {
    flex-direction: column;
    margin: 10px 0 0;
    width: 100%;
  }
  .sk-home-mc-header .sk-home-quick-btn {
    width: 100%;
    min-height: 46px;
    padding: 12px 22px;
    font-size: var(--font-size-base);
  }
}




/* ==========================================================================
   37. SK WIDGET KIT
   ==========================================================================
   Componenti riutilizzabili per dashboard, pannelli informativi e
   visualizzazione dati. Si appoggiano a gruppo1 (sez.16) + palette Canopo.
   ========================================================================== */


/* ── 37.1  KPI STRIP ── */

.sk-kpi-strip {
  display: flex;
  flex-wrap: wrap;
  gap: var(--spacing-sm);
  padding: 4px 0;
}

.sk-kpi {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: 1 1 180px;
  min-width: 0;
  padding: 12px 14px;
  background: var(--gradient-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
  transition: all var(--transition-normal);
  cursor: default;
}
.sk-kpi:hover {
  box-shadow: var(--shadow-md);
  transform: translateY(-2px);
  border-color: var(--color-border-dark);
}

.sk-kpi__icon {
  width: 38px;
  height: 38px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-md);
  background: var(--color-icon-bg);
  color: var(--brand-primary);
  font-size: 17px;
  transition: all var(--transition-fast);
}
.sk-kpi:hover .sk-kpi__icon { background: var(--color-bg-hover); }

.sk-kpi__icon--accent,
.sk-kpi__icon--success,
.sk-kpi__icon--warning,
.sk-kpi__icon--danger,
.sk-kpi__icon--info    { background: var(--color-icon-bg); color: var(--brand-primary); }

.sk-kpi__body { flex: 1 1 0; min-width: 0; }

.sk-kpi__value {
  display: block;
  font-size: 22px;
  font-weight: 700;
  color: var(--brand-primary);
  line-height: 1.1;
  letter-spacing: -.02em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.sk-kpi__label {
  display: block;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin-top: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.sk-kpi__trend {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-size: var(--font-size-xs);
  font-weight: 600;
  padding: 3px 7px;
  border-radius: var(--radius-full);
  flex-shrink: 0;
  white-space: nowrap;
}
.sk-kpi__trend--up   { background: var(--color-success-light); color: var(--color-success-text); }  /* v54 WCAG: 4.72:1 */
.sk-kpi__trend--down { background: var(--color-error-light);   color: #B91C1C; }  /* v54 WCAG: 5.30:1 */
.sk-kpi__trend--flat { background: var(--color-border-light);  color: #475569; }  /* v54 WCAG: 6.92:1 */


/* ── 37.2  ACTIVITY FEED ── */

.sk-feed {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  position: relative;
}
.sk-feed::before {
  content: '';
  position: absolute;
  left: 7px;
  top: 8px;
  bottom: 8px;
  width: 2px;
  background: var(--color-border);
  border-radius: 2px;
}

.sk-feed__item {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 7px 0;
  position: relative;
}
.sk-feed__item + .sk-feed__item {
  border-top: 1px solid var(--color-border-light);
}

.sk-feed__dot {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  border-radius: 50%;
  border: 2px solid var(--color-bg-white);
  background: var(--color-border-dark);
  box-shadow: 0 0 0 2px var(--color-border);
  margin-top: 1px;
  position: relative;
  z-index: 1;
  transition: transform var(--transition-fast);
}
.sk-feed__item:hover .sk-feed__dot { transform: scale(1.25); }

.sk-feed__dot--primary { background: var(--brand-primary);   box-shadow: 0 0 0 2px var(--color-bg-secondary); }
.sk-feed__dot--accent  { background: var(--brand-accent);    box-shadow: 0 0 0 2px rgba(255, 150, 0, 0.15); }
.sk-feed__dot--success { background: var(--color-success);   box-shadow: 0 0 0 2px var(--color-success-light); }
.sk-feed__dot--warning { background: var(--color-warning);   box-shadow: 0 0 0 2px var(--color-warning-light); }
.sk-feed__dot--danger  { background: var(--color-error);     box-shadow: 0 0 0 2px var(--color-error-light); }
.sk-feed__dot--info    { background: var(--color-info);      box-shadow: 0 0 0 2px var(--color-info-light); }

.sk-feed__content {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
  flex-wrap: wrap;
}

.sk-feed__text {
  font-size: var(--font-size-base);
  color: var(--color-text-primary);
  flex: 1 1 0;
  min-width: 0;
  line-height: 1.4;
}
.sk-feed__text strong {
  color: var(--brand-primary);
  font-weight: 600;
}

.sk-feed__time {
  font-size: var(--font-size-xs);
  color: var(--color-text-light);
  white-space: nowrap;
  flex-shrink: 0;
}


/* ── 37.3  PROGRESS LIST ── */

.sk-progress-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.sk-progress-item__header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 5px;
}
.sk-progress-item__label {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  font-weight: 500;
}
.sk-progress-item__value {
  font-size: var(--font-size-sm);
  font-weight: 700;
  color: var(--brand-primary);
}

.sk-progress-bar {
  height: 6px;
  background: var(--color-border-light);
  border-radius: var(--radius-full);
  overflow: hidden;
}
.sk-progress-bar__fill {
  height: 100%;
  border-radius: var(--radius-full);
  background: var(--brand-primary);
  transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.sk-progress-bar__fill--primary { background: linear-gradient(90deg, var(--brand-primary-light), var(--brand-primary)); }
.sk-progress-bar__fill--accent  { background: linear-gradient(90deg, var(--brand-accent-hover), var(--brand-accent-dark)); }
.sk-progress-bar__fill--success { background: linear-gradient(90deg, #34d399, var(--color-success)); }
.sk-progress-bar__fill--warning { background: linear-gradient(90deg, #fbbf24, var(--color-warning)); }
.sk-progress-bar__fill--danger  { background: linear-gradient(90deg, #f87171, var(--color-error)); }


/* ── 37.4  NOTICE BARS ── */

.sk-notice {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  border-radius: var(--radius-md);
  border: 1px solid var(--color-border);
  background: var(--color-bg-main);
  font-size: var(--font-size-sm);
  transition: all var(--transition-fast);
  margin-bottom: 6px;
}
.sk-notice[hidden] { display: none !important; }
.sk-notice:last-child { margin-bottom: 0; }

.sk-notice__icon  { font-size: 15px; flex-shrink: 0; opacity: .85; }
.sk-notice__body  { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 1px; line-height: 1.4; }
.sk-notice__body strong { font-weight: 600; font-size: var(--font-size-base); }
/* Banner testuale da DB (login/home): preserva i ritorni a capo del textarea */
.sk-notice.sk-system-banner { align-items: flex-start; }
.sk-system-banner__text { white-space: pre-line; word-break: break-word; }
/* Colore personalizzato: sfondo chiaro + bordo piu' scuro dalla tinta scelta */
.sk-notice.sk-system-banner--custom {
  background: color-mix(in srgb, var(--sk-banner-color) 16%, white);
  border-color: color-mix(in srgb, var(--sk-banner-color) 72%, black);
  color: color-mix(in srgb, var(--sk-banner-color) 82%, black);
}
.sk-notice.sk-system-banner--custom .sk-notice__icon { color: var(--sk-banner-color); }
.sk-notice__action {
  font-size: var(--font-size-xs);
  font-weight: 600;
  text-decoration: none;
  padding: 3px 10px;
  border-radius: var(--radius-full);
  white-space: nowrap;
  flex-shrink: 0;
  transition: all var(--transition-fast);
}

.sk-notice--info    { background: var(--color-info-light);    border-color: rgba(59, 130, 246, 0.30);  color: #1e40af; }
.sk-notice--info .sk-notice__icon   { color: var(--color-info); }
.sk-notice--info .sk-notice__action { background: rgba(59, 130, 246, 0.15); color: #1e40af; }
.sk-notice--info .sk-notice__action:hover { background: rgba(59, 130, 246, 0.30); }

.sk-notice--success { background: var(--color-success-light); border-color: rgba(16, 185, 129, 0.30); color: #065f46; }
.sk-notice--success .sk-notice__icon   { color: var(--color-success); }
.sk-notice--success .sk-notice__action { background: rgba(16, 185, 129, 0.15); color: #065f46; }
.sk-notice--success .sk-notice__action:hover { background: rgba(16, 185, 129, 0.30); }

.sk-notice--warning { background: var(--color-warning-light); border-color: rgba(245, 158, 11, 0.35); color: #92400e; }
.sk-notice--warning .sk-notice__icon   { color: var(--color-warning); }
.sk-notice--warning .sk-notice__action { background: rgba(245, 158, 11, 0.15); color: #92400e; }
.sk-notice--warning .sk-notice__action:hover { background: rgba(245, 158, 11, 0.30); }

.sk-notice--danger  { background: var(--color-error-light);   border-color: rgba(239, 68, 68, 0.30);  color: #991b1b; }
.sk-notice--danger .sk-notice__icon   { color: var(--color-error); }
.sk-notice--danger .sk-notice__action { background: rgba(239, 68, 68, 0.15); color: #991b1b; }
.sk-notice--danger .sk-notice__action:hover { background: rgba(239, 68, 68, 0.30); }

/* ── 37.4b  TOAST (SkToast) ── */
/* Posizione di default: BASSO A DESTRA. I toast sono conferme non bloccanti
   (SkSaveFeedback instrada success/info qui): in basso non coprono toolbar,
   titolo e prime righe della griglia, che sono l'area guardata subito dopo un
   salvataggio. Host ancorato in basso: lo stack cresce verso l'alto e il toast
   piu' recente resta vicino all'angolo. */
.sk-toast-host {
  position: fixed;
  bottom: 14px;
  right: 14px;
  z-index: 100001;
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-width: min(380px, calc(100vw - 28px));
  pointer-events: none;
}
/* Varianti di posizione: sk-toast.js applica sempre la classe
   .sk-toast-host--<position> (default 'bottom-right'), che prima non esisteva
   in CSS - l'opzione position di SkToast.show() era quindi inerte. Ogni
   variante azzera l'ancoraggio opposto per non ereditare quello base.
   NB: l'animazione di ingresso/uscita e' una traslazione da destra (vedi
   sk-toast-in/out): coerente per le varianti *-right, cosmeticamente
   imperfetta per left/center. */
.sk-toast-host--top-right      { top: 14px; bottom: auto; right: 14px; left: auto; }
.sk-toast-host--top-left       { top: 14px; bottom: auto; left: 14px; right: auto; }
.sk-toast-host--bottom-right   { bottom: 14px; top: auto; right: 14px; left: auto; }
.sk-toast-host--bottom-left    { bottom: 14px; top: auto; left: 14px; right: auto; }
.sk-toast-host--top-center     { top: 14px; bottom: auto; left: 50%; right: auto; transform: translateX(-50%); align-items: center; }
.sk-toast-host--bottom-center  { bottom: 14px; top: auto; left: 50%; right: auto; transform: translateX(-50%); align-items: center; }
.sk-toast {
  pointer-events: auto;
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 10px 14px;
  border-radius: var(--radius-md, 8px);
  font-size: var(--font-size-sm, 13px);
  line-height: 1.4;
  border: 1px solid;
  box-shadow: 0 4px 14px rgba(15, 23, 42, 0.18);
  animation: sk-toast-in 0.22s ease-out;
}
.sk-toast--out { animation: sk-toast-out 0.18s ease-in forwards; }
.sk-toast__icon { font-size: 15px; flex-shrink: 0; margin-top: 1px; opacity: 0.9; }
.sk-toast__body { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.sk-toast__body strong { font-weight: 600; font-size: var(--font-size-base, 14px); }
.sk-toast--success { background: var(--color-success-light); border-color: rgba(16, 185, 129, 0.35); color: #065f46; }
.sk-toast--success .sk-toast__icon { color: var(--color-success); }
.sk-toast--error   { background: var(--color-error-light);   border-color: rgba(239, 68, 68, 0.35);  color: #991b1b; }
.sk-toast--error .sk-toast__icon   { color: var(--color-error); }
.sk-toast--warning { background: var(--color-warning-light); border-color: rgba(245, 158, 11, 0.40); color: #92400e; }
.sk-toast--warning .sk-toast__icon { color: var(--color-warning); }
.sk-toast--info    { background: var(--color-info-light);    border-color: rgba(59, 130, 246, 0.35);  color: #1e40af; }
.sk-toast--info .sk-toast__icon    { color: var(--color-info); }
@keyframes sk-toast-in {
  from { opacity: 0; transform: translateX(12px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes sk-toast-out {
  from { opacity: 1; transform: translateX(0); }
  to   { opacity: 0; transform: translateX(12px); }
}

/* Form row: main field + aside panel (e.g. textarea + color picker) */
.sk-field-row {
  display: flex;
  flex-wrap: wrap;
  gap: 16px 24px;
  align-items: flex-start;
  width: 100%;
  box-sizing: border-box;
}
.sk-field-row__main  { flex: 1 1 280px; min-width: 0; }
.sk-field-row__aside { flex: 1 1 240px; min-width: 0; }
@media (min-width: 768px) {
  .sk-field-row__aside {
    flex: 0 0 450px;
    width: 450px;
    max-width: 450px;
  }
}

.sk-lb-preview { width: 100%; box-sizing: border-box; }
.sk-lb-preview .sk-notice { width: 100%; box-sizing: border-box; }


/* ── 37.5  QUICK ACTION TILES ── */

.sk-qa-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
  gap: var(--spacing-sm);
}

.sk-qa-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 14px 8px 12px;
  background: var(--gradient-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  text-decoration: none;
  color: var(--color-text-primary);
  box-shadow: var(--shadow-xs);
  transition: all var(--transition-normal);
  cursor: pointer;
  text-align: center;
}
.sk-qa-tile:hover {
  background: var(--color-bg-secondary);
  border-color: var(--brand-primary-light);
  box-shadow: var(--shadow-sm);
  transform: translateY(-2px);
  color: var(--brand-primary);
}
.sk-qa-tile:active { transform: translateY(0); box-shadow: var(--shadow-xs); }

.sk-qa-tile__icon {
  width: 40px; height: 40px;
  display: flex; align-items: center; justify-content: center;
  border-radius: var(--radius-md);
  background: rgba(40, 68, 115, 0.08);
  color: var(--brand-primary);
  font-size: 17px;
  transition: all var(--transition-fast);
}
.sk-qa-tile:hover .sk-qa-tile__icon {
  background: var(--brand-primary); color: var(--brand-white);
  box-shadow: 0 3px 8px rgba(40, 68, 115, 0.30);
}
.sk-qa-tile__icon--accent  { background: rgba(255, 150, 0, 0.10); color: var(--brand-accent-dark); }
.sk-qa-tile:hover .sk-qa-tile__icon--accent  { background: var(--brand-accent-dark); color: var(--brand-white); }
.sk-qa-tile__icon--success { background: var(--color-success-light); color: var(--color-success); }
.sk-qa-tile:hover .sk-qa-tile__icon--success { background: var(--color-success); color: var(--brand-white); }
.sk-qa-tile__icon--danger  { background: var(--color-error-light);   color: var(--color-error); }
.sk-qa-tile:hover .sk-qa-tile__icon--danger  { background: var(--color-error); color: var(--brand-white); }

.sk-qa-tile__label {
  font-size: var(--font-size-xs);
  font-weight: 600;
  line-height: 1.3;
  color: inherit;
  letter-spacing: .01em;
}


/* ── 37.6  DUE / DEADLINE LIST ── */

.sk-due-list { display: flex; flex-direction: column; }

.sk-due-item {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 0; border-bottom: 1px solid var(--color-border-light);
  transition: background var(--transition-fast);
}
.sk-due-item:last-child { border-bottom: none; }
.sk-due-item:hover {
  background: var(--color-bg-hover);
  margin: 0 -10px; padding: 8px 10px;
  border-radius: var(--radius-sm);
}

.sk-due-dot { width: 10px; height: 10px; flex-shrink: 0; border-radius: 50%; background: var(--color-border-dark); }
.sk-due-dot--red    { background: var(--color-error);   box-shadow: 0 0 0 3px var(--color-error-light); }
.sk-due-dot--orange { background: var(--color-warning); box-shadow: 0 0 0 3px var(--color-warning-light); }
.sk-due-dot--green  { background: var(--color-success); box-shadow: 0 0 0 3px var(--color-success-light); }
.sk-due-dot--blue   { background: var(--color-info);    box-shadow: 0 0 0 3px var(--color-info-light); }

.sk-due-body { flex: 1 1 0; min-width: 0; }
.sk-due-name { display: block; font-size: var(--font-size-base); font-weight: 500; color: var(--color-text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sk-due-sub  { display: block; font-size: var(--font-size-xs); color: var(--color-text-secondary); margin-top: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.sk-due-date { font-size: var(--font-size-sm); font-weight: 600; white-space: nowrap; flex-shrink: 0; padding: 2px 8px; border-radius: var(--radius-full); background: var(--color-border-light); color: var(--color-text-secondary); }
.sk-due-date--red    { background: var(--color-error-light);   color: var(--color-error-text); }
.sk-due-date--orange { background: var(--color-warning-light); color: var(--color-warning-text); }
.sk-due-date--green  { background: var(--color-success-light); color: var(--color-success-text); }

.sk-due-link {
  flex-shrink: 0; display: flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: var(--radius-sm);
  color: var(--color-text-light); text-decoration: none;
  border: 1px solid transparent; transition: all var(--transition-fast); font-size: 11px;
}
.sk-due-link:hover { color: var(--brand-primary); border-color: var(--color-border); background: var(--color-bg-main); }


/* (37.7 sk-chart-host rimosso in v41 — non piu' usato, le home usano sk-home-chart-panel) */
/* (37.8 sk-donut rimosso in v41 — sostituito dal SVG Chart Kit donut renderer, sez.38)   */


/* ── 37.9  STAT TABLE ── */

.sk-stat-table { width: 100%; border-collapse: collapse; font-size: var(--font-size-sm); }
.sk-stat-table th {
  font-size: var(--font-size-xs); font-weight: 700; text-transform: uppercase;
  letter-spacing: .05em; color: var(--color-text-light); padding: 4px 8px;
  text-align: left; border-bottom: 1px solid var(--color-border);
}
.sk-stat-table td {
  padding: 6px 8px; border-bottom: 1px solid var(--color-border-light);
  color: var(--color-text-primary); vertical-align: middle;
}
.sk-stat-table tbody tr:last-child td { border-bottom: none; }
.sk-stat-table tbody tr:hover td      { background: var(--color-bg-hover); }
.sk-stat-table td:last-child,
.sk-stat-table th:last-child           { text-align: right; }


/* ==========================================================================
   38. SK SVG CHART KIT v3
   ==========================================================================
   Stili per grafici SVG puri: container, tooltip, legenda, animazioni.
   Renderers JS in sk-svg-chart-kit.js. Variabili --chart-* in sez.1.
   ========================================================================== */

/* Le variabili --chart-1..7 sono in sez.1 (:root principale) */

/* Container chart centrato e full-area */
.sk-chart-center{
  display:flex;
  align-items:center;
  justify-content:center;
  width:100%;
  height:100%;
  min-height:80px; /* evita 0-height nei layout “collassati” */
}
.sk-chart-center > svg{
  width:100%;
  height:100%;
  display:block;
}

/* ── 38.1  CHART CONTAINER & SHARED ── */

.sk-chart {
  width: 100%;
  overflow: visible;
  display: block;
  position: relative;
}
.sk-chart svg {
  width: 100%;
  height: auto;
  display: block;
  overflow: visible;
}
.sk-chart [data-tip] {
  cursor: default;
  transition: opacity 150ms ease, filter 150ms ease;
}
.sk-chart [data-tip]:hover {
  filter: brightness(1.12);
}

/* ── 38.2  TOOLTIP ── */

.sk-chart-tip {
  position: fixed;
  z-index: 9999;
  pointer-events: none;
  opacity: 0;
  transition: opacity 120ms ease, transform 120ms ease;
  transform: translateY(4px);
  background: var(--brand-primary-dark);
  color: #fff;
  font-family: var(--font-base);
  font-size: 11px;
  font-weight: 500;
  line-height: 1.4;
  padding: 7px 12px;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  white-space: nowrap;
  max-width: 280px;
}
.sk-chart-tip--visible {
  opacity: 1;
  transform: translateY(0);
}
.sk-chart-tip__label {
  font-size: 10px;
  color: rgba(255,255,255,.65);
  display: block;
  margin-bottom: 2px;
}
.sk-chart-tip__value {
  font-size: 14px;
  font-weight: 700;
  color: #fff;
  display: block;
}
.sk-chart-tip__dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  margin-right: 6px;
  vertical-align: middle;
}

/* ── 38.3  LEGEND ── */

.sk-chart-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 14px;
  justify-content: center;
  padding: 8px 0 2px;
  font-size: var(--font-size-xs);
  color: var(--color-text-secondary);
}
.sk-chart-legend__item {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  white-space: nowrap;
}
.sk-chart-legend__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}

/* ── 38.4  ANIMATIONS ── */

/* Bar verticale: crescita dal basso */
@keyframes sk-bar-grow {
  from { transform: scaleY(0); }
  to   { transform: scaleY(1); }
}
.sk-anim-bar {
  animation: sk-bar-grow .6s cubic-bezier(.34,1.56,.64,1) both;
  transform-origin: bottom center;
}
.sk-anim-bar:nth-child(1)  { animation-delay: .00s; }
.sk-anim-bar:nth-child(2)  { animation-delay: .04s; }
.sk-anim-bar:nth-child(3)  { animation-delay: .08s; }
.sk-anim-bar:nth-child(4)  { animation-delay: .12s; }
.sk-anim-bar:nth-child(5)  { animation-delay: .16s; }
.sk-anim-bar:nth-child(6)  { animation-delay: .20s; }
.sk-anim-bar:nth-child(7)  { animation-delay: .24s; }
.sk-anim-bar:nth-child(8)  { animation-delay: .28s; }
.sk-anim-bar:nth-child(9)  { animation-delay: .32s; }
.sk-anim-bar:nth-child(10) { animation-delay: .36s; }
.sk-anim-bar:nth-child(11) { animation-delay: .40s; }
.sk-anim-bar:nth-child(12) { animation-delay: .44s; }
.sk-anim-bar:nth-child(13) { animation-delay: .48s; }
.sk-anim-bar:nth-child(14) { animation-delay: .52s; }

/* Bar orizzontale: crescita da sinistra */
@keyframes sk-xbar-grow {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}
.sk-anim-xbar {
  animation: sk-xbar-grow .6s cubic-bezier(.34,1.56,.64,1) both;
  transform-origin: left center;
}
.sk-anim-xbar:nth-child(1) { animation-delay: .00s; }
.sk-anim-xbar:nth-child(2) { animation-delay: .08s; }
.sk-anim-xbar:nth-child(3) { animation-delay: .16s; }
.sk-anim-xbar:nth-child(4) { animation-delay: .24s; }
.sk-anim-xbar:nth-child(5) { animation-delay: .32s; }
.sk-anim-xbar:nth-child(6) { animation-delay: .40s; }
.sk-anim-xbar:nth-child(7) { animation-delay: .48s; }
.sk-anim-xbar:nth-child(8) { animation-delay: .56s; }

/* Donut/Pie: rotate + scale in */
@keyframes sk-slice-in {
  from { opacity: 0; transform: scale(.7) rotate(-30deg); }
  to   { opacity: 1; transform: scale(1) rotate(0); }
}
.sk-anim-slice {
  animation: sk-slice-in .5s cubic-bezier(.34,1.4,.64,1) both;
  transform-origin: center;
}
.sk-anim-slice:nth-child(1) { animation-delay: .00s; }
.sk-anim-slice:nth-child(2) { animation-delay: .10s; }
.sk-anim-slice:nth-child(3) { animation-delay: .20s; }
.sk-anim-slice:nth-child(4) { animation-delay: .30s; }
.sk-anim-slice:nth-child(5) { animation-delay: .40s; }
.sk-anim-slice:nth-child(6) { animation-delay: .50s; }

/* Line chart: stroke draw */
@keyframes sk-line-draw {
  from { stroke-dashoffset: var(--line-len); }
  to   { stroke-dashoffset: 0; }
}
.sk-anim-line {
  stroke-dasharray: var(--line-len);
  stroke-dashoffset: var(--line-len);
  animation: sk-line-draw 1.2s cubic-bezier(.4,0,.2,1) .2s both;
}

/* Area chart: fade in */
@keyframes sk-area-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
.sk-anim-area {
  animation: sk-area-fade .8s ease .6s both;
}

/* Dot: pop in */
@keyframes sk-dot-pop {
  from { transform: scale(0); opacity: 0; }
  to   { transform: scale(1); opacity: 1; }
}
.sk-anim-dot {
  animation: sk-dot-pop .3s cubic-bezier(.34,1.56,.64,1) both;
}

/* Funnel: slide dall'alto */
@keyframes sk-funnel-in {
  from { opacity: 0; transform: translateY(-15px) scaleY(.5); }
  to   { opacity: 1; transform: translateY(0) scaleY(1); }
}
.sk-anim-funnel {
  animation: sk-funnel-in .45s cubic-bezier(.34,1.4,.64,1) both;
  transform-origin: top center;
}
.sk-anim-funnel:nth-child(1) { animation-delay: .00s; }
.sk-anim-funnel:nth-child(2) { animation-delay: .10s; }
.sk-anim-funnel:nth-child(3) { animation-delay: .20s; }
.sk-anim-funnel:nth-child(4) { animation-delay: .30s; }
.sk-anim-funnel:nth-child(5) { animation-delay: .40s; }
.sk-anim-funnel:nth-child(6) { animation-delay: .50s; }
.sk-anim-funnel:nth-child(7) { animation-delay: .60s; }

/* Heatmap/Treemap: fade + scale per cella */
@keyframes sk-cell-fade {
  from { opacity: 0; transform: scale(.6); }
  to   { opacity: var(--cell-o, .5); transform: scale(1); }
}
.sk-anim-cell {
  animation: sk-cell-fade .3s ease both;
  transform-origin: center;
}

/* Fade generico (label valori sopra barre, testo centrale donut) */
@keyframes sk-fade-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}
.sk-anim-fade {
  animation: sk-fade-in .5s ease .3s both;
}

/* Radar: grow dal centro */
@keyframes sk-radar-in {
  from { opacity: 0; transform: scale(.4); }
  to   { opacity: 1; transform: scale(1); }
}
.sk-anim-radar {
  animation: sk-radar-in .7s cubic-bezier(.34,1.2,.64,1) .1s both;
  transform-origin: center;
}
.sk-anim-radar-area {
  animation: sk-area-fade .9s ease .5s both;
}

/* ── 38.5  COLOR MATRIX ──
   Tabella HTML con celle colorate da soglie configurabili per riga.
   Usata per matrici rischio, copertura formativa, ecc.               */

.sk-color-matrix {
  width: 100%;
  border-collapse: collapse;
  font-size: 11px;
  font-family: var(--font-base);
}
.sk-color-matrix th {
  background: var(--color-bg-main);
  color: var(--color-text-secondary);
  font-weight: 600;
  font-size: 10px;
  padding: 4px 6px;
  text-align: center;
  border: 1px solid var(--color-border);
  white-space: nowrap;
}
.sk-color-matrix th:first-child {
  text-align: left;
  min-width: 140px;
}
.sk-color-matrix td {
  padding: 4px 8px;
  text-align: center;
  border: 1px solid var(--color-border);
  font-weight: 600;
  font-size: 11px;
  cursor: default;
  transition: filter 120ms ease;
}
.sk-color-matrix td:first-child {
  text-align: left;
  font-weight: 400;
  color: var(--color-text-secondary);
  background: var(--color-bg-main);
  white-space: nowrap;
}
.sk-color-matrix td[data-tip]:hover { filter: brightness(.93); }

/* Varianti semantiche celle */
.sk-cm-cell--green  { background: #D1FAE5; color: #065F46; }
.sk-cm-cell--yellow { background: #FEF9C3; color: #713F12; }
.sk-cm-cell--orange { background: #FFEDD5; color: #7C2D12; }
.sk-cm-cell--red    { background: #FEE2E2; color: #7F1D1D; }
.sk-cm-cell--blue   { background: #DBEAFE; color: #1E3A8A; }
.sk-cm-cell--gray   { background: var(--color-border-light); color: var(--color-text-secondary); }

/* Riga totale */
.sk-color-matrix tr.sk-cm-row--total td             { background: var(--color-bg-main); font-weight: 700; color: var(--color-text-primary); }
.sk-color-matrix tr.sk-cm-row--total td:first-child { color: var(--brand-primary); }

/* ── 38.6  SPARKLINE ──
   Micro-grafico inline da usare dentro sk-kpi o sk-stat-table. */

.sk-sparkline {
  display: inline-block;
  vertical-align: middle;
  line-height: 0;
  overflow: visible;
}
.sk-sparkline svg {
  overflow: visible;
  display: block;
}


/* ==========================================================================
   42. SK SCHEDULER KIT v4
   ==========================================================================
   Tutte le classi usano il prefisso sk-sch- per evitare conflitti.
   ========================================================================== */


/* ════════════════════════════════════════════════════════════════════
   42.0 — CONTAINER PRINCIPALE
   ════════════════════════════════════════════════════════════════════ */
.sk-sch {
  font-family:    var(--font-base, 'Segoe UI', Arial, sans-serif);
  background:     var(--color-bg-main, #F8FAFC);
  display:        flex;
  flex-direction: column;
  height:         100%;
  color:          var(--color-text-primary, #1E293B);
  overflow:       hidden;
}
.sk-sch-content {
  flex:           1;
  display:        flex;
  flex-direction: column;
  overflow:       hidden;
  position:       relative;
}


/* ════════════════════════════════════════════════════════════════════
   42.1 — TOOLBAR
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-toolbar {
  background:    var(--brand-white, #fff);
  border-bottom: 1px solid var(--color-border, #E2E8F0);
  padding:       7px 14px;
  display:       flex;
  align-items:   center;
  gap:           8px;
  flex-wrap:     wrap;
  box-shadow:    0 1px 3px rgba(0,0,0,.04);
}
.sk-sch-tb-left {
  display:     flex;
  align-items: center;
  gap:         6px;
}
.sk-sch-tb-nav {
  border:          1px solid var(--color-border);
  background:      var(--brand-white);
  width:           30px;
  height:          30px;
  border-radius:   var(--radius-md, 6px);
  cursor:          pointer;
  display:         inline-flex;
  align-items:     center;
  justify-content: center;
  font-size:       12px;
  color:           var(--color-text-secondary);
  transition:      all .12s;
}
.sk-sch-tb-nav:hover {
  background: var(--color-bg-secondary);
  color:      var(--brand-primary);
}
.sk-sch-tb-btn {
  border:        1px solid var(--color-border);
  background:    var(--brand-white);
  padding:       4px 12px;
  border-radius: var(--radius-md);
  cursor:        pointer;
  font-size:     11px;
  font-weight:   600;
  color:         var(--color-text-secondary);
  font-family:   inherit;
  transition:    all .12s;
}
.sk-sch-tb-btn:hover {
  background: var(--color-bg-secondary);
  color:      var(--brand-primary);
}
.sk-sch-tb-title {
  font-size:     14px;
  font-weight:   700;
  color:         var(--brand-primary);
  cursor:        pointer;
  display:       inline-flex;
  align-items:   center;
  gap:           6px;
  padding:       4px 8px;
  border-radius: var(--radius-sm, 4px);
  position:      relative;
}
.sk-sch-tb-title:hover { background: var(--color-bg-secondary); }
.sk-sch-tb-caret {
  font-size:  10px;
  color:      var(--color-text-light);
  transition: transform .15s;
}
.sk-sch-tb-mid {
  display:     flex;
  align-items: center;
  gap:         6px;
  margin-left: auto;
}
.sk-sch-tb-toggle,
.sk-sch-tb-select {
  border:        1px solid var(--color-border);
  background:    var(--brand-white);
  padding:       4px 10px;
  border-radius: var(--radius-md);
  font-family:   inherit;
  font-size:     10px;
  font-weight:   600;
  color:         var(--color-text-secondary);
  cursor:        pointer;
  transition:    all .12s;
  display:       inline-flex;
  align-items:   center;
  gap:           4px;
}
.sk-sch-tb-toggle:hover,
.sk-sch-tb-select:hover { border-color: var(--brand-primary-light); }
.sk-sch-tb-toggle.on {
  background:   var(--color-success-light);
  border-color: var(--color-success);
  color:        var(--color-success);
}

/* View switcher pills */
.sk-sch-tb-views {
  display:       flex;
  gap:           2px;
  background:    var(--color-bg-main);
  padding:       2px;
  border-radius: 8px;
}
.sk-sch-tb-view {
  border:        none;
  background:    transparent;
  cursor:        pointer;
  padding:       4px 8px;
  border-radius: 6px;
  font-family:   inherit;
  font-size:     11px;
  font-weight:   600;
  color:         var(--color-text-secondary);
  transition:    all .12s;
  display:       inline-flex;
  align-items:   center;
  gap:           4px;
}
.sk-sch-tb-view:hover {
  background: var(--color-bg-hover);
  color:      var(--brand-primary);
}
.sk-sch-tb-view.on {
  background: var(--brand-primary);
  color:      #fff;
  box-shadow: 0 2px 6px rgba(40,68,115,.25);
}


/* ════════════════════════════════════════════════════════════════════
   42.2 — LEGEND BAR
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-legend {
  background:    var(--brand-white);
  border-bottom: 1px solid var(--color-border-light);
  padding:       3px 14px;
  display:       flex;
  align-items:   center;
  gap:           10px;
  overflow-x:    auto;
  flex-shrink:   0;
}
.sk-sch-legend-item {
  display:       inline-flex;
  align-items:   center;
  gap:           4px;
  font-size:     10px;
  font-weight:   600;
  color:         var(--color-text-secondary);
  cursor:        pointer;
  white-space:   nowrap;
  padding:       2px 5px;
  border:        1px solid transparent;
  border-radius: 999px;
  transition:    background-color .12s ease, border-color .12s ease, color .12s ease, box-shadow .12s ease;
}
.sk-sch-legend-item.on {
  background:   var(--color-bg-secondary, #EFF6FF);
  border-color: var(--brand-primary);
  box-shadow:   0 0 0 2px rgba(26, 115, 232, .16);
  color:        var(--brand-primary);
  font-weight:  800;
}
.sk-sch-legend-item.on .sk-sch-legend-dot {
  box-shadow: 0 0 0 2px #fff, 0 0 0 4px rgba(26, 115, 232, .26);
}
.sk-sch-legend-count { opacity: .78; font-weight: 700; }
.sk-sch-legend-dot  { width: 8px; height: 8px; border-radius: 2px; flex-shrink: 0; }
.sk-sch-legend-sep  { width: 1px; height: 12px; background: var(--color-border); flex-shrink: 0; }
.sk-sch-legend-bar  { width: 18px; height: 8px; border-radius: 2px; background: linear-gradient(90deg, var(--brand-primary), var(--brand-primary-light)); }


/* ════════════════════════════════════════════════════════════════════
   42.3 — ALL-DAY BAR (eventi multi-giorno sopra la time-grid)
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-allday {
  border-bottom: 1px solid var(--color-border);
  background:    var(--color-bg-secondary);
  display:       flex;
  flex-shrink:   0;
}
.sk-sch-allday-label {
  width:           48px;
  flex-shrink:     0;
  border-right:    1px solid var(--color-border);
  display:         flex;
  align-items:     center;
  justify-content: center;
  font-size: 11px;  /* v49 A11Y: era 9px */
  color:           var(--color-text-light);
  font-weight:     700;
  text-transform:  uppercase;
}
.sk-sch-allday-area { flex: 1; position: relative; }


/* ════════════════════════════════════════════════════════════════════
   42.4 — MULTI-DAY SPANNING BARS
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-md-bar {
  position:    absolute;
  height:      20px;
  padding:     0 6px;
  font-size:   10px;
  font-weight: 700;
  display:     flex;
  align-items: center;
  gap:         3px;
  overflow:    hidden;
  white-space: nowrap;
  box-shadow:  0 1px 3px rgba(0,0,0,.15);
  cursor:      grab;
  z-index:     3;
  animation:   skSchSlideIn .2s ease-out;
}
.sk-sch-md-bar.month  { height: 18px; font-size: 11px;  /* v49 A11Y: era 9px */ cursor: pointer; }
.sk-sch-md-cont       { opacity: .5; font-size: 8px; }
.sk-sch-md-text       { overflow: hidden; text-overflow: ellipsis; flex: 1; }
.sk-sch-md-days       { font-size: 8px; opacity: .7; margin-left: auto; flex-shrink: 0; }
.sk-sch-md-badge      { font-size: 8px; font-weight: 700; padding: 1px 5px; border-radius: 3px; flex-shrink: 0; }


/* ════════════════════════════════════════════════════════════════════
   42.5 — TIME GRID (day, week, workweek)
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-timegrid    { display: flex; flex: 1; overflow: auto; }
.sk-sch-scrollhint {
  position:       absolute;
  left:           50%;
  transform:      translateX(-50%) scale(.96);
  z-index:        80;
  display:        inline-flex;
  align-items:    center;
  justify-content:center;
  width:          52px;
  height:         36px;
  border:         2px solid var(--color-bg-white);
  border-radius:  999px;
  background:     var(--brand-primary);
  color:          var(--brand-white);
  box-shadow:     0 4px 16px rgba(15,23,42,.28), 0 0 0 2px rgba(40,68,115,.18);
  cursor:         pointer;
  font-size:      16px;
  opacity:        0;
  pointer-events: none;
  transition:     opacity .14s ease, transform .14s ease, box-shadow .14s ease;
}
.sk-sch-scrollhint.is-on {
  opacity:        1;
  pointer-events: auto;
  transform:      translateX(-50%) scale(1);
}
.sk-sch-scrollhint:hover {
  background:     var(--brand-primary-dark);
  box-shadow:     0 6px 20px rgba(15,23,42,.34), 0 0 0 3px rgba(40,68,115,.22);
}
.sk-sch-scrollhint--top    { top: 8px; }
.sk-sch-scrollhint--bottom { bottom: 8px; }
.sk-sch-scrollhint--top::before,
.sk-sch-scrollhint--bottom::before {
  display:        none;
}
.sk-sch-hours       { width: 48px; flex-shrink: 0; border-right: 1px solid var(--color-border); }
.sk-sch-hours-spacer{ width: 48px; flex-shrink: 0; border-right: 1px solid var(--color-border); }
.sk-sch-hour        { display: flex; align-items: flex-start; justify-content: flex-end; padding-right: 6px; padding-top: 1px; font-size: 10px; color: var(--color-text-light); font-weight: 500; }
.sk-sch-weekcols    { flex: 1; display: flex; min-width: 0; }
.sk-sch-daycol      { flex: 1; min-width: 0; position: relative; contain: layout; }
.sk-sch-daycol-border { border-right: 1px solid var(--color-border-light); }
.sk-sch-hline       { border-bottom: 1px solid var(--color-border-light); }
.sk-sch-hline-half  { height: 50%; border-bottom: 1px dashed var(--color-border-light); opacity: .5; }


/* ════════════════════════════════════════════════════════════════════
   42.6 — WEEK HEADER
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-weekhdr   { display: flex; border-bottom: 1px solid var(--color-border); flex-shrink: 0; }
.sk-sch-colhdr    { flex: 1; height: 44px; display: flex; flex-direction: column; align-items: center; justify-content: center; border-right: 1px solid var(--color-border-light); }
.sk-sch-colhdr.today  { background: var(--color-bg-secondary); }
.sk-sch-colhdr.closed { background: var(--color-bg-main); }
.sk-sch-colhdr-day    { font-size: 10px; color: var(--color-text-light); font-weight: 600; text-transform: uppercase; letter-spacing: .5px; }
.sk-sch-colhdr.today .sk-sch-colhdr-day { color: var(--brand-primary); }
.sk-sch-colhdr-num    { font-size: 16px; font-weight: 700; color: var(--color-text-primary); }
.sk-sch-colhdr-num.today { color: #fff; background: var(--brand-primary); width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; }
.sk-sch-colhdr.closed .sk-sch-colhdr-num { color: var(--color-text-light); }


/* ════════════════════════════════════════════════════════════════════
   42.7 — SINGLE EVENTS (barre nella time-grid)
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-ev {
  position:      absolute;
  box-sizing:    border-box;
  border-radius: var(--radius-sm, 4px);
  padding:       2px 5px;
  font-size:     10px;
  font-weight:   600;
  overflow:      hidden;
  cursor:        grab;
  z-index:       5;
  box-shadow:    0 1px 3px rgba(0,0,0,.15);
  contain:       layout;
  animation:     skSchSlideIn .2s ease-out;
}
.sk-sch-ev:hover    { z-index: 6; box-shadow: 0 3px 8px rgba(0,0,0,.2); }
.sk-sch-ev-time     { font-size: 11px;  /* v49 A11Y: era 9px */ opacity: .9; }
.sk-sch-ev-text     { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }
.sk-sch-ev-cat      { font-size: 11px;  /* v49 A11Y: era 9px */ opacity: .8; margin-top: 1px; }


/* ════════════════════════════════════════════════════════════════════
   42.8 — NOW INDICATOR
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-now      { position: absolute; left: 0; right: 0; z-index: 10; display: flex; align-items: center; pointer-events: none; }
.sk-sch-now-dot  { width: 8px; height: 8px; border-radius: 50%; background: var(--color-error); margin-left: -4px; flex-shrink: 0; }
.sk-sch-now-line { flex: 1; height: 2px; background: var(--color-error); opacity: .7; }


/* ════════════════════════════════════════════════════════════════════
   42.9 — SLOT / DISPONIBILITA OVERLAY
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-slot-closed { position: absolute; inset: 0; z-index: 1; background: repeating-linear-gradient(45deg, #F3F4F6, #F3F4F6 4px, #E5E7EB 4px, #E5E7EB 8px); opacity: .6; pointer-events: none; }
.sk-sch-slot-bg     { position: absolute; inset: 0; z-index: 1; background: #F3F4F6; opacity: .3; pointer-events: none; }
.sk-sch-slot-avail  { position: absolute; left: 0; right: 0; z-index: 1; background: #E8F5E9; border-left: 3px solid #81C784; opacity: .35; pointer-events: none; border-radius: 2px; }


/* ════════════════════════════════════════════════════════════════════
   42.10 — MONTH VIEW
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-monthhdr      { display: grid; grid-template-columns: repeat(7, 1fr); border-bottom: 2px solid var(--brand-primary); }
.sk-sch-monthhdr-cell { padding: 8px 4px; text-align: center; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; background: var(--brand-primary); color: #fff; }
.sk-sch-monthhdr-cell.we { background: var(--brand-primary-dark); }
.sk-sch-monthweek     { position: relative; }
.sk-sch-monthrow      { display: grid; grid-template-columns: repeat(7, 1fr); min-height: inherit; }
.sk-sch-monthcell     { border: 1px solid var(--color-border-light); background: var(--brand-white); cursor: pointer; overflow: hidden; contain: layout; }
.sk-sch-monthcell.empty   { background: #FAFBFC; cursor: default; }
.sk-sch-monthcell.closed  { background: repeating-linear-gradient(45deg, #F3F4F6, #F3F4F6 3px, #E5E7EB 3px, #E5E7EB 6px); }
.sk-sch-monthcell.today   { background: var(--color-bg-secondary); }
.sk-sch-monthcell:hover   { background: var(--color-bg-hover); }
.sk-sch-monthcell-num     { padding: 2px 5px; font-size: 12px; font-weight: 700; color: var(--brand-primary); }
.sk-sch-monthcell.closed .sk-sch-monthcell-num { color: var(--color-text-light); }
.sk-sch-monthcell-num.today { color: #fff; background: var(--brand-primary); width: 22px; height: 22px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; }
.sk-sch-monthcell-evs { padding: 0 3px 2px; display: flex; flex-direction: column; gap: 1px; }
.sk-sch-monthpill     { border-radius: 3px; padding: 0 4px; font-size: 11px;  /* v49 A11Y: era 9px */ font-weight: 600; line-height: 18px; height: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: grab; box-shadow: 0 1px 2px rgba(0,0,0,.12); }
.sk-sch-monthpill--dense { position: relative; box-sizing: border-box; min-height: 34px; height: 34px; line-height: 16px; padding: 4px 6px 11px; border: 2px solid #60a5fa; border-radius: 6px; box-shadow: 0 2px 6px rgba(37,99,235,.16); cursor: pointer; }
.sk-sch-monthpill-segments { position: absolute; left: 6px; right: 6px; bottom: 4px; display: flex; gap: 2px; height: 5px; overflow: hidden; border-radius: 99px; background: rgba(15,23,42,.10); }
.sk-sch-monthpill-segment { min-width: 4px; height: 100%; }
.sk-sch-monthmore     { font-size: 8px; color: var(--color-text-light); text-align: center; }

/* Multi-day overlay layer in month */
.sk-sch-month-md                  { position: absolute; left: 0; right: 0; top: 26px; pointer-events: none; z-index: 5; }
.sk-sch-month-md .sk-sch-md-bar   { pointer-events: auto; }


/* ════════════════════════════════════════════════════════════════════
   42.11 — QUARTER VIEW
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-quarter           { flex: 1; overflow: auto; padding: 12px; }
.sk-sch-quarter-title     { font-size: 18px; font-weight: 800; color: var(--brand-primary); margin-bottom: 12px; }
.sk-sch-quarter-year      { font-size: 12px; color: var(--color-text-secondary); font-weight: 400; }
.sk-sch-quarter-grid      { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.sk-sch-quarter-month     { background: var(--brand-white); border-radius: var(--radius-lg, 8px); border: 1px solid var(--color-border); overflow: hidden; }
.sk-sch-quarter-month-hdr { background: linear-gradient(135deg, var(--brand-primary), var(--brand-primary-light)); padding: 10px 14px; display: flex; align-items: center; justify-content: space-between; color: #fff; font-weight: 700; font-size: 14px; }
.sk-sch-quarter-badge     { background: rgba(255,255,255,.2); padding: 2px 10px; border-radius: 99px; font-size: 11px; }
.sk-sch-quarter-days      { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; padding: 8px 10px; }
.sk-sch-quarter-daylabel  { text-align: center; font-size: 11px;  /* v49 A11Y: era 9px */ font-weight: 700; color: var(--color-text-light); }
.sk-sch-quarter-daylabel.we { color: var(--brand-accent); }
.sk-sch-quarter-cell      { aspect-ratio: 1; display: flex; align-items: center; justify-content: center; font-size: 10px; border-radius: 3px; cursor: pointer; transition: transform .08s; }
.sk-sch-quarter-cell.today  { border-radius: 50%; }
.sk-sch-quarter-cell.closed { text-decoration: line-through; }
.sk-sch-quarter-cell:hover  { transform: scale(1.2); }


/* ════════════════════════════════════════════════════════════════════
   42.12 — YEAR VIEW
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-year             { flex: 1; overflow: auto; padding: 12px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
.sk-sch-year-month       { background: var(--brand-white); border-radius: var(--radius-md); border: 1px solid var(--color-border); padding: 10px; cursor: pointer; transition: box-shadow .15s, transform .15s; }
.sk-sch-year-month:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); }
.sk-sch-year-month-title { font-size: 13px; font-weight: 700; color: var(--brand-primary); margin-bottom: 6px; text-align: center; }
.sk-sch-year-grid        { display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px; }
.sk-sch-year-daylabel    { font-size: 8px; text-align: center; color: var(--color-text-light); font-weight: 600; }
.sk-sch-year-cell        { font-size: 11px;  /* v49 A11Y: era 9px */ text-align: center; aspect-ratio: 1; display: flex; align-items: center; justify-content: center; border-radius: 2px; }
.sk-sch-year-cell.today  { color: #fff; background: var(--brand-primary); border-radius: 50%; font-weight: 800; }
.sk-sch-year-cell.we     { color: var(--color-text-light); }
.sk-sch-year-cell.has    { background: var(--color-info-light); }
.sk-sch-year-count       { font-size: 11px;  /* v49 A11Y: era 9px */ color: var(--color-text-secondary); text-align: center; margin-top: 6px; }


/* ════════════════════════════════════════════════════════════════════
   42.13 — TIMELINE VIEW
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-timeline     { flex: 1; overflow: auto; display: flex; }
.sk-sch-tl-res       { width: 140px; flex-shrink: 0; border-right: 1px solid var(--color-border); }
.sk-sch-tl-res-hdr   { height: 36px; background: var(--brand-primary); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 700; border-bottom: 2px solid var(--brand-primary); }
.sk-sch-tl-res-row   { height: 64px; display: flex; align-items: center; padding: 0 10px; border-bottom: 1px solid var(--color-border-light); font-size: 12px; font-weight: 600; }
.sk-sch-tl-res-row.alt { background: var(--color-bg-main); }
.sk-sch-tl-body      { flex: 1; position: relative; }
.sk-sch-tl-hours     { display: flex; height: 36px; background: var(--color-bg-secondary); border-bottom: 2px solid var(--brand-primary); position: sticky; top: 0; z-index: 3; }
.sk-sch-tl-hour      { width: 60px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600; color: var(--brand-primary); border-right: 1px solid var(--color-border-light); }
.sk-sch-tl-row       { height: 64px; position: relative; border-bottom: 1px solid var(--color-border-light); }
.sk-sch-tl-row.alt   { background: var(--color-bg-main); }
.sk-sch-tl-slot      { position: absolute; top: 0; height: 100%; background: #E8F5E9; border-left: 2px solid #81C784; opacity: .3; z-index: 1; pointer-events: none; }
.sk-sch-tl-gridline  { position: absolute; top: 0; bottom: 0; width: 60px; border-right: 1px solid var(--color-border-light); }
.sk-sch-tl-ev        { position: absolute; top: 8px; height: 48px; border-radius: var(--radius-sm); padding: 2px 6px; font-size: 10px; font-weight: 600; overflow: hidden; cursor: grab; z-index: 2; box-shadow: 0 1px 3px rgba(0,0,0,.15); display: flex; flex-direction: column; justify-content: center; animation: skSchSlideRight .3s ease-out; }
.sk-sch-tl-ev:hover  { z-index: 3; box-shadow: 0 3px 8px rgba(0,0,0,.2); }
.sk-sch-tl-ev-text   { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; display: flex; align-items: center; gap: 4px; }
.sk-sch-tl-ev-time   { font-size: 11px;  /* v49 A11Y: era 9px */ opacity: .85; }


/* ════════════════════════════════════════════════════════════════════
   42.14 — AGENDA VIEW
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-agenda          { flex: 1; overflow: auto; padding: 4px 12px; }
.sk-sch-agenda-day      { margin-bottom: 4px; }
.sk-sch-agenda-hdr      { display: flex; align-items: center; gap: 10px; padding: 10px 0 6px; border-bottom: 1px solid var(--color-border); position: sticky; top: 0; background: var(--color-bg-main); z-index: 2; }
.sk-sch-agenda-date     { width: 44px; height: 44px; border-radius: var(--radius-md); background: var(--brand-white); border: 1px solid var(--color-border); display: flex; flex-direction: column; align-items: center; justify-content: center; flex-shrink: 0; }
.sk-sch-agenda-date.today { background: var(--brand-primary); border: none; }
.sk-sch-agenda-dn       { font-size: 8px; font-weight: 700; text-transform: uppercase; color: var(--color-text-light); }
.sk-sch-agenda-date.today .sk-sch-agenda-dn { color: rgba(255,255,255,.7); }
.sk-sch-agenda-dd       { font-size: 18px; font-weight: 800; line-height: 1; }
.sk-sch-agenda-date.today .sk-sch-agenda-dd { color: #fff; }
.sk-sch-agenda-info     { flex: 1; }
.sk-sch-agenda-dayname  { font-size: 13px; font-weight: 700; }
.sk-sch-agenda-hdr.today .sk-sch-agenda-dayname { color: var(--brand-primary); }
.sk-sch-agenda-monthname{ font-size: 11px; color: var(--color-text-secondary); }
.sk-sch-agenda-count    { background: var(--color-bg-secondary); color: var(--brand-primary); font-size: 11px; font-weight: 700; padding: 2px 10px; border-radius: 99px; }
.sk-sch-agenda-ev       { display: flex; align-items: center; gap: 12px; padding: 8px 10px; border-bottom: 1px solid var(--color-border-light); cursor: pointer; border-radius: var(--radius-sm); transition: background .1s; }
.sk-sch-agenda-ev:hover { background: var(--color-bg-hover); }
.sk-sch-agenda-bar      { width: 4px; height: 32px; border-radius: 2px; flex-shrink: 0; }
.sk-sch-agenda-time     { width: 52px; font-size: 12px; font-weight: 700; flex-shrink: 0; }
.sk-sch-agenda-body     { flex: 1; min-width: 0; }
.sk-sch-agenda-text     { font-size: 12px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: flex; align-items: center; gap: 4px; }
.sk-sch-agenda-sub      { font-size: 10px; color: var(--color-text-secondary); }
.sk-sch-agenda-tag      { padding: 2px 8px; border-radius: 3px; font-size: 11px;  /* v49 A11Y: era 9px */ font-weight: 700; flex-shrink: 0; white-space: nowrap; }
.sk-sch-empty           { text-align: center; padding: 40px; color: var(--color-text-light); font-size: 13px; }


/* ════════════════════════════════════════════════════════════════════
   42.15 — MINI CALENDAR (popup navigazione con heatmap)
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-minical          { position: absolute; top: 100%; left: 0; margin-top: 6px; z-index: 1000; background: var(--brand-white); border: 1px solid var(--color-border); border-radius: var(--radius-lg, 8px); box-shadow: var(--shadow-lg, 0 8px 24px rgba(0,0,0,.12)); width: 290px; animation: skSchTipIn .15s ease-out; overflow: hidden; }
.sk-sch-minical-hdr      { background: linear-gradient(135deg, var(--brand-primary), var(--brand-primary-light)); padding: 10px 14px; display: flex; align-items: center; justify-content: space-between; color: #fff; font-weight: 700; font-size: 13px; }
.sk-sch-minical-nav      { background: rgba(255,255,255,.15); border: none; color: #fff; width: 26px; height: 26px; border-radius: 50%; cursor: pointer; font-size: 16px; display: flex; align-items: center; justify-content: center; }
.sk-sch-minical-input    { padding: 8px 12px; border-bottom: 1px solid var(--color-border-light); display: flex; gap: 6px; }
.sk-sch-minical-inp      { flex: 1; border: 1px solid var(--color-border); border-radius: var(--radius-sm); padding: 4px 8px; font-size: 11px; font-family: inherit; outline: none; }
.sk-sch-minical-inp:focus-visible { box-shadow: 0 0 0 2px rgba(40, 68, 115, 0.3); }  /* v49 A11Y */
.sk-sch-minical-go       { background: var(--brand-primary); color: #fff; border: none; border-radius: var(--radius-sm); padding: 4px 10px; font-size: 11px; font-weight: 700; cursor: pointer; }
.sk-sch-minical-grid     { display: grid; grid-template-columns: repeat(7, 1fr); padding: 6px 10px; gap: 2px; }
.sk-sch-minical-daylabel { text-align: center; font-size: 11px;  /* v49 A11Y: era 9px */ font-weight: 700; color: var(--color-text-light); padding: 2px; }
.sk-sch-minical-daylabel.we { color: var(--brand-accent); }
.sk-sch-minical-cell     { aspect-ratio: 1; display: flex; align-items: center; justify-content: center; font-size: 11px; border-radius: 3px; cursor: pointer; transition: transform .1s; }
.sk-sch-minical-cell.cur    { border-radius: 50%; border: 2px solid var(--brand-accent); }
.sk-sch-minical-cell.today  { border-radius: 50%; }
.sk-sch-minical-cell.closed { text-decoration: line-through; }
.sk-sch-minical-cell:hover  { transform: scale(1.15); }
.sk-sch-minical-shortcuts   { padding: 6px 12px 10px; border-top: 1px solid var(--color-border-light); display: flex; gap: 4px; flex-wrap: wrap; }
.sk-sch-minical-shortcuts button { background: var(--color-bg-secondary); border: 1px solid var(--color-border); border-radius: 4px; padding: 3px 8px; font-size: 11px;  /* v49 A11Y: era 9px */ font-weight: 600; color: var(--brand-primary); cursor: pointer; font-family: inherit; }
.sk-sch-minical-shortcuts button:hover { background: var(--brand-primary); color: #fff; }


/* ════════════════════════════════════════════════════════════════════
   42.16 — TOOLTIP (popup evento)
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-tip             { position: fixed; z-index: 9999; background: var(--brand-white); border: 1px solid var(--color-border); border-radius: var(--radius-md); box-shadow: var(--shadow-lg); max-width: 300px; font-size: 12px; pointer-events: none; animation: skSchTipIn .12s ease-out; overflow: hidden; display: none; }
.sk-sch-tip.on          { display: block; }
.sk-sch-tip-hdr         { padding: 7px 12px; display: flex; align-items: center; gap: 8px; color: #fff; font-size: 13px; }
.sk-sch-tip-hdr i       { font-size: 14px; }
.sk-sch-tip-hdr strong  { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sk-sch-tip-mdbadge     { background: rgba(255,255,255,.25); padding: 1px 6px; border-radius: 99px; font-size: 11px;  /* v49 A11Y: era 9px */ font-weight: 700; }
.sk-sch-tip-body        { padding: 8px 12px; }
.sk-sch-tip-row         { display: flex; gap: 8px; margin-bottom: 3px; font-size: 11px; }
.sk-sch-tip-label       { color: var(--color-text-light); min-width: 72px; flex-shrink: 0; font-weight: 600; }
.sk-sch-tip-val         { color: var(--color-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sk-sch-tip-val.italic  { font-style: italic; }
.sk-sch-tip-foot        { padding: 5px 12px 7px; border-top: 1px solid var(--color-border-light); font-size: 10px; color: var(--color-text-light); font-style: italic; }


/* ════════════════════════════════════════════════════════════════════
   42.17 — STATUS BAR
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-status       { background: var(--brand-primary); padding: 3px 14px; display: flex; align-items: center; gap: 14px; font-size: 10px; color: rgba(255,255,255,.7); flex-shrink: 0; }
.sk-sch-status-right { margin-left: auto; font-weight: 600; color: rgba(255,255,255,.9); }


/* ════════════════════════════════════════════════════════════════════
   42.18 — DRAG & DROP (ghost, snap, toast)
   ════════════════════════════════════════════════════════════════════ */
.sk-sch-ghost     { position: fixed; z-index: 10000; pointer-events: none; padding: 4px 12px; border-radius: var(--radius-sm); font-size: 11px; font-weight: 700; box-shadow: 0 4px 16px rgba(0,0,0,.2); opacity: .92; white-space: nowrap; will-change: transform; }
.sk-sch-ghost.ok  { border: 2px solid rgba(255,255,255,.4); }
.sk-sch-ghost.no  { border: 2px dashed var(--color-error); background: #94A3B8 !important; }
.sk-sch-snap      { position: absolute; left: 2px; right: 2px; z-index: 8; border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; pointer-events: none; }
.sk-sch-snap.ok   { border: 2px dashed var(--color-success); background: rgba(16,185,129,.08); color: var(--color-success-text); }
.sk-sch-snap.no   { border: 2px dashed var(--color-error); background: rgba(239,68,68,.08); color: var(--color-error-text); }
.sk-sch-toast     { position: fixed; bottom: 60px; left: 50%; transform: translateX(-50%); z-index: 10000; color: #fff; padding: 8px 20px; border-radius: var(--radius-lg); font-size: 12px; font-weight: 700; box-shadow: 0 4px 16px rgba(0,0,0,.2); animation: skSchSlideUp .2s ease-out; display: flex; align-items: center; gap: 8px; }


/* ════════════════════════════════════════════════════════════════════
   42.19 — ANIMATIONS
   ════════════════════════════════════════════════════════════════════ */
@keyframes skSchSlideIn {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes skSchSlideRight {
  from { opacity: 0; transform: translateX(-8px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes skSchTipIn {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes skSchSlideUp {
  from { opacity: 0; transform: translate(-50%, 12px); }
  to   { opacity: 1; transform: translate(-50%, 0); }
}


/* ════════════════════════════════════════════════════════════════════
   42.20 — RESPONSIVE
   ════════════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
  .sk-sch-tb-views       { flex-wrap: wrap; }
  .sk-sch-quarter-grid   { grid-template-columns: 1fr; }
  .sk-sch-year           { grid-template-columns: repeat(2, 1fr); }
  .sk-sch-tb-mid         { flex-wrap: wrap; }
  .sk-sch-tl-res         { width: 100px; }
  .sk-sch-tl-res-row     { font-size: 10px; padding: 0 6px; }
}

/* ════════════════════════════════════════════════════════════════════
   42.21 - SK SCHEDULER - MODIFICATORI DI MODALITA'
   Classi che limitano o modificano l'interfaccia dello scheduler
   a seconda del contesto applicativo. Generiche: non dipendono dal
   tipo di agenda (visite, eventi, ecc.).
   ════════════════════════════════════════════════════════════════════ */


/* ---- 42.21.1 - Modificatore agenda-only (.sk-sch-mode--agenda) ----
   Applica alla div contenitore dello scheduler per nascondere i controlli
   delle viste non-agenda e i widget non usati in modalita' sola-agenda.
   Usato da: Agenda Visite (Home SoSa), Agenda Eventi.
   Per viste singole diverse: aggiungere .sk-sch-mode--week, ecc. */

/* Nasconde tutti i bottoni vista tranne agenda */
.sk-sch-mode--agenda .sk-sch-tb-view:not([data-view="agenda"]) { display: none !important; }
/* Nasconde toggle slot e filtro categoria: non usati in agenda-only */
.sk-sch-mode--agenda .sk-sch-tb-toggle { display: none !important; }
.sk-sch-mode--agenda .sk-sch-tb-select { display: none !important; }
/* Sopprime legenda interna: usata quella statica della pagina */
.sk-sch-mode--agenda .sk-sch-legend    { display: none !important; }
/* Rimuove cursore grab: drag disabilitato in agenda-only */
.sk-sch-mode--agenda [data-evid]       { cursor: pointer !important; }


/* ---- 42.21.2 - Overlay di caricamento (.sk-sch-loading-overlay) ----
   Generico: usabile da qualsiasi scheduler (visite, eventi, ecc.).
   Applicare a un div position:absolute dentro il contenitore scheduler.
   Aggiungere classe .visible via JS per mostrarlo durante le chiamate AJAX. */

.sk-sch-loading-overlay {
  display:         none;
  position:        absolute;
  top: 0; right: 0; bottom: 0; left: 0;
  background:      rgba(248,250,252,.82);
  z-index:         50;
  align-items:     center;
  justify-content: center;
  flex-direction:  column;
  gap:             10px;
  pointer-events:  none;
}
.sk-sch-loading-overlay.visible {
  display: flex;
}

/* Anti-sovrapposizione spinner full-page + overlay grid (audit 2026-04).
   Quando il loader full-page (.spinner) e' attivo (body.loading) E il suo
   markup esiste nel DOM, sopprimi gli overlay grid locali: il backdrop
   full-page copre comunque l'host, mostrare entrambi creava un doppio
   cerchio rotante poco elegante. Richiede :has() (browser evergreen 2022+,
   gia' assunto da DHX Suite v9). Pagine che chiamano spinnerStart() senza
   il markup <div class="spinner"> non sono toccate: la regola e' inerte
   se manca il selettore figlio. */
body.loading:has(.spinner) .sk-sch-loading-overlay {
  display: none !important;
}
.sk-sch-loading-overlay .sch-spin-icon {
  font-size:  28px;
  color:      var(--brand-primary);
  animation:  sk-sch-spin .8s linear infinite;
}
.sk-sch-loading-overlay .sch-spin-lbl {
  font-size:      12px;
  font-weight:    600;
  color:          var(--color-text-secondary);
  letter-spacing: .02em;
}
@keyframes sk-sch-spin { to { transform: rotate(360deg); } }

/* ---- Stato errore di caricamento (.sk-sch-loading-overlay--error) ----
   Variante mostrata da SkGridKit quando il load fallisce (timeout, HTTP,
   rete): icona + messaggio + bottone "Riprova". A differenza dello spinner
   DEVE essere interattiva, quindi riabilita pointer-events (la base li
   disattiva). Sostituisce il loading infinito che lasciava la grid appesa
   allo spinner su timeout. */
.sk-sch-loading-overlay--error {
  pointer-events: auto;
  padding:        16px;
  text-align:     center;
}
.sk-sch-loading-overlay--error .sk-sch-error-icon {
  font-size: 34px;
  color:     var(--color-error, #DC2626);
}
.sk-sch-loading-overlay--error .sk-sch-error-msg {
  font-size:  14px;
  font-weight:600;
  color:      var(--color-text-primary, #1E293B);
  max-width:  440px;
}
.sk-sch-loading-overlay--error .sk-sch-error-hint {
  font-size: 12px;
  color:     var(--color-text-muted, #64748B);
  max-width: 440px;
}
.sk-sch-loading-overlay--error .sk-sch-retry-btn {
  margin-top: 4px;
}


/* ---- 42.21.3 - Legenda scheduler: modificatori dot e icona avviso ----
   .sk-sch-legend-dot--circle : dot tondo per tipi/categorie (vs quadrato default per stati)
   .sk-sch-legend-warn        : triangolo/icona avviso inline nella legenda statica
   Usati da: Agenda Visite, Agenda Eventi, qualsiasi legenda statica scheduler. */

.sk-sch-legend-dot--circle {
  border-radius: 50%;
}

.sk-sch-legend-warn {
  display:        inline-block;
  margin-right:   3px;
  font-size:      10px;
  color:          #e53935;
  vertical-align: middle;
  line-height:    1;
}


/* ---- 42.21.4 - Pannello filtri scheduler ----
   .sk-sch-filter-drop : pannello a scomparsa sotto la toolbar (CDC, collocazione, ecc.)
   .sk-sch-filter-row  : flex container dei campi filtro interni
   Usati da: Agenda Visite, Agenda Eventi. */

.sk-sch-filter-drop {
  display:       none;
  position:      relative;
  z-index:       200;
  background:    var(--color-bg-white);
  border-bottom: 2px solid var(--brand-primary);
  box-shadow:    0 4px 6px rgba(0,0,0,.06);
  padding:       10px 14px;
  flex-shrink:   0;
}

.sk-sch-filter-drop.open {
  display: block;
}

.sk-sch-filter-row {
  display:     flex;
  flex-wrap:   wrap;
  gap:         10px;
  align-items: flex-end;
}


/* ════════════════════════════════════════════════════════════════════
   42.22 - AGENDA VISITE (Home Sorveglianza Sanitaria)
   Annotazioni specifiche della visualizzazione agenda per le visite
   mediche. NON usare per altri tipi di agenda.
   Per l'agenda eventi: aggiungere sezione 42.23.
   ════════════════════════════════════════════════════════════════════ */


/* ---- 42.22.1 - Triangolo CDL (.sk-sch-idcdl-warn) ----
   Mostra un triangolo rosso prima del nome del lavoratore quando
   idCDL = -1, ovvero il lavoratore e' senza centro di lavoro. */
.sk-sch-idcdl-warn {
  display:        inline-block;
  margin-right:   5px;
  font-size:      15px;
  color:          #e53935;
  line-height:    1;
  vertical-align: middle;
  flex-shrink:    0;
}

/* ---- 42.22.2 - Badge idoneita' (.sk-sch-idoneita) ----
   Mostrato a fianco al nome del lavoratore solo per visite effettuate
   (statoEffettivo 4/11/12). Contiene il codice idoneita'. */
.sk-sch-idoneita {
  display:        inline-block;
  margin-left:    6px;
  padding:        2px 8px;
  border-radius:  3px;
  font-size:      13px;
  font-weight:    700;
  background:     rgba(255,255,255,.25);
  border:         1px solid rgba(255,255,255,.4);
  vertical-align: middle;
  white-space:    nowrap;
}

/* ---- 42.22.3 - Vincolo medico (.sk-sch-vincolo) ----
   Mostra "Vincolo medico" in rosso quando boxSchedulazioneForzata = 1. */
.sk-sch-vincolo {
  display:        inline-block;
  margin-left:    6px;
  font-size:      10px;
  font-weight:    700;
  color:          #e53935;
  background:     rgba(229,57,53,.10);
  border:         1px solid rgba(229,57,53,.35);
  border-radius:  3px;
  padding:        1px 5px;
  vertical-align: middle;
  white-space:    nowrap;
}

/* ===================================================================
   FIX: checkbox v4 combo multiselect (dhxcombo clist)
   Le classi dhxcombo_chbx_0/1 usavano sprite dalla vecchia dhtmlx.css,
   non piu' visibili. Ricreiamo il check con CSS puro.
   =================================================================== */
.dhxcombolist_dhx_skyblue .dhxcombo_checkbox {
    display: inline-block;
    width: 16px;
    height: 16px;
    min-width: 16px;
    border: 2px solid #94A3B8;
    border-radius: 3px;
    background: #fff;
    vertical-align: middle;
    margin-right: 6px;
    position: relative;
    cursor: pointer;
    transition: border-color .15s, background-color .15s;
}
.dhxcombolist_dhx_skyblue .dhxcombo_chbx_1 {
    background-color: #284473;
    border-color: #284473;
}
.dhxcombolist_dhx_skyblue .dhxcombo_chbx_1::after {
    content: '';
    position: absolute;
    left: 3px;
    top: 0px;
    width: 5px;
    height: 9px;
    border: solid #fff;
    border-width: 0 2px 2px 0;
    transform: rotate(45deg);
}
.dhxcombolist_dhx_skyblue .dhxcombo_option {
    display: flex;
    align-items: center;
    padding: 4px 6px;
    cursor: pointer;
}
.dhxcombolist_dhx_skyblue .dhxcombo_option:hover {
    background-color: #EFF6FF;
}
.dhxcombolist_dhx_skyblue .dhxcombo_option_text_chbx {
    margin-left: 0;
}


/* ==========================================================================
   FINE CANOPO v48
   ========================================================================== */

/* ==========================================================================
   v49 A11Y: SKIP NAVIGATION LINK
   WCAG 2.4.1: meccanismo per saltare blocchi ripetuti.
   Invisibile finche' non riceve focus via tastiera (Tab).
   ========================================================================== */

.sk-skip-link {
  position: absolute;
  left: -9999px;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
  z-index: -1;
}
.sk-skip-link:focus {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 9999;
  width: auto;
  height: auto;
  padding: 10px 20px;
  background: var(--brand-primary);
  color: var(--brand-white);
  font-size: 14px;
  font-weight: 600;
  font-family: var(--font-base);
  text-decoration: none;
  box-shadow: var(--shadow-lg);
  outline: 2px solid var(--brand-accent);
  outline-offset: 2px;
}


/* ==========================================================================
   v49 A11Y: FOCUS-VISIBLE UNIVERSALE
   Catch-all per elementi interattivi senza focus ring specifico.
   WCAG 2.4.7: focus visibile su tutti gli elementi interattivi.
   ========================================================================== */

a:focus-visible:not([class]),
button:focus-visible:not([class]),
[tabindex]:focus-visible:not([tabindex="-1"]) {
  outline: 2px solid var(--brand-primary);
  outline-offset: 2px;
}


/* ==========================================================================
   v50 A11Y: BADGE CON ICONA (WCAG 1.4.1 — info non solo tramite colore)
   Aggiunge automaticamente un'icona FontAwesome ai badge colorati
   cosi il significato non dipende solo dal colore.
   ========================================================================== */

.sk-badge-success::before,
.sk-badge-warning::before,
.sk-badge-error::before,
.sk-badge-info::before,
.sk-badge-primary::before {
  font-family: 'FontAwesome';
  font-weight: 900;
  font-size: 0.8em;
  margin-right: 4px;
  display: inline;
}
.sk-badge-success::before { content: "\f00c"; }  /* check */
.sk-badge-warning::before { content: "\f071"; }  /* triangle-exclamation */
.sk-badge-error::before   { content: "\f00d"; }  /* xmark */
.sk-badge-info::before    { content: "\f129"; }  /* info */
.sk-badge-primary::before { content: "\f111"; }  /* circle */


/* ==========================================================================
   v50 A11Y: FORM VALIDATION (WCAG 3.3.1 — errori identificabili)
   Stili per pattern aria-invalid + role="alert".
   I kit JS e le XSLT aggiungono gli attributi; il CSS visualizza.
   ========================================================================== */

/* Campo in errore: bordo rosso + sfondo tenue */
[aria-invalid="true"],
input[aria-invalid="true"],
select[aria-invalid="true"],
textarea[aria-invalid="true"] {
  border-color: var(--color-error) !important;
  box-shadow: 0 0 0 1px var(--color-error);
}
[aria-invalid="true"]:focus-visible {
  box-shadow: 0 0 0 2px var(--color-error);
}

/* Messaggio di errore sotto il campo */
[role="alert"],
.sk-field-error {
  color: var(--color-error-text);
  font-size: var(--font-size-xs);
  line-height: 1.3;
  margin-top: 2px;
  display: block;
}

/* Etichetta del campo in errore diventa rossa */
.sk-field--error > label,
.sk-field--error > .lbl {
  color: var(--color-error-text);
}

/* Campo obbligatorio: asterisco arancione */
label[aria-required="true"]::after,
.sk-field--required > label::after {
  content: " *";
  color: var(--brand-accent);
  font-weight: 700;
}


/* ==========================================================================
   v50 A11Y: SCREEN READER ONLY (sr-only)
   Elemento visualmente nascosto ma accessibile agli screen reader.
   Usato da _skAnnounce() e per label visibili solo a SR.
   ========================================================================== */

.sk-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}


/* ==========================================================================
   v50 A11Y: DHTMLX GRID KEYBOARD FOCUS (WCAG 2.1.1 / 2.4.7)
   Ring di focus sulle celle grid per navigazione da tastiera.
   Si attiva quando DHTMLX aggiunge focus sulla cella.
   ========================================================================== */

.dhx_grid-cell:focus-visible,
.dhx_grid-header-cell:focus-visible,
[role="gridcell"]:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: -2px;
}


/* ==========================================================================
   v50 A11Y: GRID HEADER SORT INDICATOR (WCAG 4.1.2)
   aria-sort e' impostato da SkGridKit per screen reader.
   Indicatore visivo: icone native dhx9 (.dhx_grid-sort-icon), vedi §31.1b.
   ========================================================================== */


/* ==========================================================================
   v50 A11Y: FORM FIELD FOCUS-WITHIN (WCAG 2.4.7)
   Evidenzia il wrapper del campo quando l'input interno ha focus.
   Migliora la visibilita del campo attivo nei form densi.
   ========================================================================== */

.sk-field:focus-within {
  background: var(--color-bg-hover);
  border-radius: 4px;
  transition: background 0.15s ease;
}

/* Date Suite (input + icona in .sk-date-wrap): il focus e' solo sul campo, non sul wrapper —
   altrimenti :focus-within colora tutta la riga flex (label + wrap) con --color-bg-hover. */
.sk-field:has(.sk-date-wrap):focus-within {
  background: transparent;
  border-radius: 0;
  transition: none;
}


/* ==========================================================================
   v50 A11Y: SIDEBAR NAVIGATION LANDMARK (WCAG 1.3.1)
   Stili di prep per quando le XSLT aggiungono role="navigation".
   ========================================================================== */

[role="navigation"] { outline: none; }
[role="navigation"]:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: -2px;
}

/* ==========================================================================
   51. THEME MANAGEMENT
   ==========================================================================
   v53: architettura semplificata. La sezione 50 (@media prefers-color-scheme)
   e' stata rimossa. Il dark mode e' gestito ESCLUSIVAMENTE da
   html[data-theme="dark"] (sezione 51.D).

   sk-core.js v1.3 garantisce che data-theme sia SEMPRE presente su <html>:
   - Cookie sk-theme = "dark"  -> data-theme="dark"
   - Cookie sk-theme = "light" -> data-theme="light"
   - Cookie sk-theme = "auto"  -> matchMedia OS (scelta esplicita)
   - Cookie sk-theme assente   -> light

   Risultato: un solo set di regole dark, un solo set di regole light,
   nessun conflitto di cascata tra @media e attributo.

   Toggle ciclico: light -> dark -> auto -> light
   ========================================================================== */


/* ── 51.0  THEME TOGGLE BUTTON ── */

.sk-theme-toggle {
  text-align: center;
  color: var(--brand-white);
  font-size: 14px;
  cursor: pointer;
  transition: all var(--transition-fast);
  background-color: transparent;
  padding: 0;
  vertical-align: middle;
  -webkit-user-select: none;
  user-select: none;
}
.sk-theme-toggle:hover {
  background-color: rgba(255,255,255,0.15);
  transform: scale(1.05);
}
.sk-theme-toggle:focus-visible {
  outline: 2px solid var(--brand-accent);
  outline-offset: -2px;
}
.sk-theme-toggle i {
  transition: transform 0.3s ease;
  vertical-align: middle;
  line-height: 40px;
}
.sk-theme-toggle:active i {
  transform: rotate(30deg);
}

/* Tooltip nativo via title, no custom tooltip necessario */


/* ══════════════════════════════════════════════════════════════════════════
   51.D  DARK MODE (html[data-theme="dark"])
   Unica definizione dark mode. Attivata da sk-core.js che imposta
   data-theme="dark" su <html> (scelta utente, o OS se cookie = auto).

   Palette dark progettata con contrasti verificati:
   - Testo primary su card bg:    #E2E8F0 su #1E293B = 11.87:1
   - Testo secondary su card bg:  #94A3B8 su #1E293B = 5.71:1
   - Testo light su card bg:      #7389A0 su #1E293B = 4.05:1
   - Brand primary su card bg:    #7BA3E0 su #1E293B = 5.68:1
   - Accent su card bg:           #FFA726 su #1E293B = 7.53:1
   - Input border su card bg:     #64788C su #1E293B = 3.21:1 (WCAG 1.4.11)
   ══════════════════════════════════════════════════════════════════════════ */

  html[data-theme="dark"] {
    /* ── Brand (lightened for dark bg readability) ── */
    --brand-primary:       #7BA3E0;
    --brand-primary-light: #93B5E8;
    --brand-primary-dark:  #5B8BD4;
    --brand-primary-hover: #A3C2EE;
    --brand-accent:        #FFA726;
    --brand-accent-hover:  #FFB74D;
    --brand-accent-dark:   #FF9600;
    --brand-accent-light:  #FFCC80;
    --brand-danger:        #F87171;
    --brand-danger-hover:  #FCA5A5;
    --brand-bg:            #0F172A;
    --brand-white:         #E2E8F0;

    /* ── Buttons (dark mode: light tiles on dark bg) ── */
    --buttonTextColor:            #E2E8F0;
    --buttonHoverTextColor:       #0F172A;
    --buttonHoverBackgroundColor: #FFA726;
    --buttonBackgroundColor:      #334155;

    /* ── Product text ── */
    --productTextColor:  #7BA3E0;
    --productTextWeight: 600;

    /* ── Form ── */
    --input-border:     #64788C;
    --input-border-top: #64788C;
    --input-focus:      #7BA3E0;
    /* --input-radius: invariato */

    /* ── Validation (brighter on dark) ── */
    --valid-color:   #34D399;
    --invalid-color: #F87171;

    /* ── Toolbar / Tabs ── */
    --toolbar-bg:        #1A2744;
    --toolbar-border:    #334155;
    --tab-bg:            #1A2744;
    --tab-border:        #334155;
    --tab-active-border: #FFA726;

    /* ── Sfondi (dark slate scale) ── */
    --color-bg-main:      #0F172A;
    --color-bg-secondary: #162033;
    --color-bg-white:     #1E293B;
    --color-bg-light:     #1A2744;
    --color-bg-hover:     #283548;
    --color-bg-toolbar:   #1A2744;
    --color-bg-card:      #1E293B;

    /* ── Gradienti (dark variants) ── */
    --gradient-primary: linear-gradient(135deg, #1A2F54 0%, #283E6A 100%);
    --gradient-accent:  linear-gradient(135deg, #FF9600 0%, #FFA726 100%);
    --gradient-header:  #0F172A;
    --gradient-card:    linear-gradient(145deg, #1E293B 0%, #243040 100%);

    /* ── Testo (light on dark) ── */
    --color-text-primary:   #E2E8F0;
    --color-text-secondary: #94A3B8;
    --color-text-light:     #7389A0;
    --color-text-dark:      #F1F5F9;

    /* ── Stato (brighter for dark bg readability) ── */
    --color-success:       #34D399;
    --color-success-light: #064E3B;
    --color-warning:       #FBBF24;
    --color-warning-light: #78350F;
    --color-error:         #F87171;
    --color-error-light:   #5C1414;
    --color-info:          #60A5FA;
    --color-info-light:    #172554;
    --color-icon-bg:       var(--color-bg-hover);

    /* ── Stato testo-safe (in dark i vivaci passano gia AA, alias identici) ── */
    --color-accent-text:   #FFA726;
    --color-accent-safe:   #FFA726;  /* v54: 7.53:1 su #1E293B — AAA safe */
    --color-success-text:  #34D399;
    --color-warning-text:  #FBBF24;
    --color-error-text:    #F87171;
    --color-info-text:     #60A5FA;

    /* ── Bordi (subtle on dark) ── */
    --color-border:       #334155;
    --color-border-dark:  #475569;
    --color-border-light: #1E293B;

    /* ── Ombre (ridotte, leggero glow) ── */
    --shadow:         rgba(0, 0, 0, 0.3);
    --shadow-xs:      0 1px 2px rgba(0, 0, 0, 0.2);
    --shadow-sm:      0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2);
    --shadow-md:      0 4px 6px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);
    --shadow-lg:      0 10px 15px rgba(0, 0, 0, 0.3), 0 4px 6px rgba(0, 0, 0, 0.2);
    --shadow-xl:      0 20px 25px rgba(0, 0, 0, 0.35), 0 10px 10px rgba(0, 0, 0, 0.2);
    --shadow-accent:  0 4px 12px rgba(255, 167, 38, 0.2);
    --shadow-primary: 0 4px 12px rgba(123, 163, 224, 0.2);
    --shadow-hover:   0 8px 16px rgba(0, 0, 0, 0.4);
    --shadow-inner:   inset 0 2px 4px rgba(0, 0, 0, 0.2);

    /* ── Chart palette (brighter for dark bg) ── */
    --chart-1: #7BA3E0;
    --chart-2: #FFA726;
    --chart-3: #34D399;
    --chart-4: #F87171;
    --chart-5: #60A5FA;
    --chart-6: #FBBF24;
    --chart-7: #A78BFA;
  }

  /* ── 50.1  BODY & HTML ── */

  html[data-theme="dark"] body {
    background-color: var(--color-bg-main);
    color: var(--color-text-primary);
  }

  /* ── 51.D.1b  DHTMLX v9 dark overrides ──
     Sovrascriviamo le --dhx-* vars nel selettore data-theme dark,
     senza bisogno di JS o dell'attributo data-dhx-theme.
     default.css carica DOPO suite.css, quindi vince.
     Include le 22 vars native DHTMLX dark + allineamento palette CANOPO. */

  html[data-theme="dark"] {
    /* Colori testo DHTMLX */
    --dhx-font-color-primary: var(--color-text-primary);
    --dhx-font-color-secondary: var(--color-text-secondary);
    --dhx-font-color-additional: var(--color-text-light);
    --dhx-font-color-disabled: hsla(0, 0%, 100%, 0.5);
    --dhx-font-color-contrast: var(--color-text-primary);
    --dhx-font-color-contrast-disabled: hsla(0, 0%, 100%, 0.5);

    /* Bordi DHTMLX */
    --dhx-border-color: var(--color-border);
    --dhx-border-color-focused: var(--color-border-dark);

    /* Sfondi DHTMLX allineati a palette CANOPO */
    --dhx-h-background: 222;
    --dhx-s-background: 47%;
    --dhx-l-background: 11%;
    --dhx-background-primary: var(--color-bg-white);
    --dhx-background-secondary: var(--color-bg-secondary);
    --dhx-background-additional: var(--color-bg-hover);

    /* Grid, toolbar, calendar DHTMLX - CANOPO 2026 dark palette */
    --dhx-s-toolbar-background: var(--color-bg-main);
    --dhx-s-toolbar-button-background-hover: hsla(0, 0%, 100%, 0.07);
    --dhx-s-toolbar-button-background-active: hsla(0, 0%, 100%, 0.15);
    --dhx-s-grid-header-background: #1E293B;
    --dhx-s-grid-header-border-bottom: 1px solid #334155;
    --dhx-s-grid-row-alternate: #1E293B;
    --dhx-s-grid-row-hover: #1E3A5F;
    --dhx-s-grid-row-selected: #1E3A8A;
    --dhx-s-grid-selection-border: #60A5FA;
    --dhx-s-grid-selection-background: #60A5FA;
    --dhx-s-grid-cell-text: #CBD5E1;
    --dhx-s-calendar-muffled: .6;
  }

  /* ── 50.1c  jQuery UI dialog / modali ──
     Canopo carica il tema jQuery UI "Cupertino" che NON e' dark-aware.
     Qui restiliamo il chrome delle dialog con la palette dark. Regole SOLO
     dark: in light resta Cupertino invariato. 'background:' shorthand azzera
     gli sprite-gradient di Cupertino; il selettore html[data-theme] + .ui-dialog
     batte in specificita le .ui-widget-content/.ui-widget-header del tema. */

  html[data-theme="dark"] .ui-dialog {
    background: var(--color-bg-white);
    border: 1px solid var(--color-border);
    color: var(--color-text-primary);
    box-shadow: var(--shadow-xl);
  }
  html[data-theme="dark"] .ui-dialog .ui-dialog-titlebar {
    background: var(--color-bg-light);
    border: 0;
    border-bottom: 1px solid var(--color-border);
    color: var(--color-text-primary);
  }
  html[data-theme="dark"] .ui-dialog .ui-dialog-title { color: var(--color-text-primary); }
  html[data-theme="dark"] .ui-dialog .ui-dialog-content {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
  }
  html[data-theme="dark"] .ui-dialog .ui-dialog-buttonpane {
    background: var(--color-bg-white);
    border-top: 1px solid var(--color-border);
  }
  html[data-theme="dark"] .ui-dialog .ui-dialog-buttonpane button {
    background: var(--color-bg-hover);
    border: 1px solid var(--color-border);
    color: var(--color-text-primary);
  }
  html[data-theme="dark"] .ui-dialog .ui-dialog-buttonpane button:hover {
    background: var(--color-bg-hover);
    border-color: var(--brand-primary);
    color: var(--brand-primary);
  }
  html[data-theme="dark"] .ui-dialog .ui-dialog-titlebar-close,
  html[data-theme="dark"] .ui-dialog .ui-dialog-titlebar-close:hover {
    background: transparent;
    border: 0;
  }
  /* X di chiusura: sprite Cupertino grigia -> invertita per restare visibile */
  html[data-theme="dark"] .ui-dialog .ui-dialog-titlebar-close .ui-icon {
    filter: invert(1) grayscale(1) brightness(1.6);
  }
  /* Veil modale piu' scuro */
  html[data-theme="dark"] .ui-widget-overlay {
    background: rgba(0, 0, 0, 0.6);
    opacity: 1;
  }

  /* ── 50.2  HEADER ── */

  html[data-theme="dark"] #header {
    background: var(--gradient-header);
    border-bottom: 1px solid var(--color-border);
  }

  /* td senza classe (riempitivi): bg esplicito, nessun hover */

  html[data-theme="dark"] #header td:not([class]),
  html[data-theme="dark"] #header td:not([class]):hover {
    background-color: #0F172A;
  }

  html[data-theme="dark"] .Logoinside {
    background-color: #0F172A;
    color: rgba(255, 255, 255, 0.9);
  }

  html[data-theme="dark"] .Logoinside:hover {
    background-color: #1E293B;
    transform: none;
    box-shadow: none;
  }

  html[data-theme="dark"] .menuprincipale,
  html[data-theme="dark"] a.menuprincipale:link,
  html[data-theme="dark"] a.menuprincipale:visited {
    background-color: #0F172A;
  }

  html[data-theme="dark"] .cambiapwd,
  html[data-theme="dark"] a.cambiapwd:link,
  html[data-theme="dark"] a.cambiapwd:visited,
  html[data-theme="dark"] .tornamodulo,
  html[data-theme="dark"] a.tornamodulo:link,
  html[data-theme="dark"] a.tornamodulo:visited {
    background-color: #0F172A;
  }

  html[data-theme="dark"] .logout,
  html[data-theme="dark"] a.logout:link,
  html[data-theme="dark"] a.logout:visited {
    background-color: #3B1A1A;
  }

  /* ── 50.3  SIDEBAR ── */

  html[data-theme="dark"] #floatingBar {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sidebar {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] #navigationVertical ul li a {
    color: var(--color-text-secondary);
  }

  html[data-theme="dark"] #navigationVertical ul li a.current {
    background: var(--color-bg-hover);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] #navigationVertical ul li a:hover {
    background: var(--color-bg-hover);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .rigaOn {
    background-color: var(--color-bg-hover);
  }

  html[data-theme="dark"] .rigaOff {
    background-color: var(--color-bg-white);
  }

  /* ── 50.4  HEADER HR ── */

  html[data-theme="dark"] .headerHRSticky {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .headerVisita {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  /* ── 50.5  FORMS ── */

  html[data-theme="dark"] input:not([type]),
  html[data-theme="dark"] input[type="date"],
  html[data-theme="dark"] input[type="datetime"],
  html[data-theme="dark"] input[type="datetime-local"],
  html[data-theme="dark"] input[type="email"],
  html[data-theme="dark"] input[type="month"],
  html[data-theme="dark"] input[type="number"],
  html[data-theme="dark"] input[type="password"],
  html[data-theme="dark"] input[type="search"],
  html[data-theme="dark"] input[type="tel"],
  html[data-theme="dark"] input[type="text"],
  html[data-theme="dark"] input[type="time"],
  html[data-theme="dark"] input[type="url"],
  html[data-theme="dark"] input[type="week"],
  html[data-theme="dark"] .sk-date-wrap > input,
  html[data-theme="dark"] textarea {
    background-color: var(--color-bg-white);
    border-color: var(--input-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] input::placeholder,
  html[data-theme="dark"] textarea::placeholder {
    color: var(--color-text-light);
  }

  html[data-theme="dark"] select {
    background-color: var(--color-bg-white);
    border-color: var(--input-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] select option {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] input:disabled,
  html[data-theme="dark"] input[readonly],
  html[data-theme="dark"] select:disabled,
  html[data-theme="dark"] textarea:disabled,
  html[data-theme="dark"] textarea[readonly] {
    background-color: var(--color-bg-secondary);
    color: var(--color-text-light);
    opacity: 0.7;
  }

  /* ── 50.6  GRUPPI / BOX ── */

  html[data-theme="dark"] .gruppo1 {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .title2 {
    background: var(--color-bg-secondary);
    color: var(--color-text-primary);
  }

  /* ── 50.7  BUTTONS ── */

  html[data-theme="dark"] .pulsante {
    background: var(--color-bg-white);
    border-color: var(--color-border-dark);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .pulsante:hover {
    background: var(--color-bg-hover);
    border-color: var(--brand-primary);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-btn {
    background: var(--gradient-card);
    border-color: var(--color-border-dark);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-btn:hover {
    background: var(--color-bg-hover);
    border-color: var(--brand-primary);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-btn--ghost {
    background: transparent;
    border-color: var(--color-border-dark);
    color: var(--color-text-secondary);
  }

  html[data-theme="dark"] .sk-btn--ghost:hover {
    background: var(--color-bg-hover);
    border-color: var(--brand-primary);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-dialog-overlay {
    background: rgba(2, 6, 23, 0.72);
  }

  html[data-theme="dark"] .sk-dialog-modal {
    border-color: var(--color-border-dark);
    box-shadow: 0 20px 48px rgba(0, 0, 0, 0.55);
  }

  html[data-theme="dark"] .sk-dialog-head {
    background: var(--color-bg-secondary);
    border-bottom-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-dialog-head h3,
  html[data-theme="dark"] .sk-dialog-head .sk-dialog-icon {
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-dialog-head--danger {
    background: rgba(239, 68, 68, 0.16);
    border-bottom-color: rgba(248, 113, 113, 0.28);
  }

  html[data-theme="dark"] .sk-dialog-head--danger h3,
  html[data-theme="dark"] .sk-dialog-head--danger .sk-dialog-icon {
    color: #FCA5A5;
  }

  html[data-theme="dark"] .sk-dialog-body {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-dialog-foot {
    background: var(--color-bg-white);
    border-top-color: var(--color-border);
  }

  /* Dialog foot: esplicito — html[data-theme="dark"] .sk-btn sovrascrive le varianti */
  html[data-theme="dark"] .sk-dialog-foot .sk-btn--ghost {
    color: var(--color-text-primary);
    background: transparent;
    border-color: var(--color-border-dark);
    box-shadow: none;
  }

  html[data-theme="dark"] .sk-dialog-foot .sk-btn--ghost:hover {
    color: var(--brand-primary);
    background: var(--color-bg-hover);
    border-color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-dialog-foot .sk-btn--primary {
    color: #FFFFFF;
    background: linear-gradient(145deg, #93B5E8 0%, #5B8BD4 100%);
    border-color: #7BA3E0;
    box-shadow: 0 2px 6px rgba(91, 139, 212, 0.35);
  }

  html[data-theme="dark"] .sk-dialog-foot .sk-btn--primary:hover {
    color: #FFFFFF;
    background: linear-gradient(145deg, #A3C2EE 0%, #4A7BC8 100%);
    border-color: #93B5E8;
    box-shadow: 0 4px 10px rgba(91, 139, 212, 0.4);
  }

  html[data-theme="dark"] .sk-dialog-foot .sk-btn--danger {
    color: #FFFFFF;
    background: linear-gradient(145deg, #F87171 0%, #DC2626 100%);
    border-color: #EF4444;
    box-shadow: 0 2px 6px rgba(239, 68, 68, 0.4);
  }

  html[data-theme="dark"] .sk-dialog-foot .sk-btn--danger:hover {
    color: #FFFFFF;
    background: linear-gradient(145deg, #EF4444 0%, #B91C1C 100%);
    border-color: #FCA5A5;
    box-shadow: 0 4px 10px rgba(239, 68, 68, 0.45);
  }

  /* ── 50.8  TABLES ── */

  html[data-theme="dark"] table,
  html[data-theme="dark"] th,
  html[data-theme="dark"] td {
    border-color: var(--color-border);
  }

  html[data-theme="dark"] th {
    background-color: var(--color-bg-secondary);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] tr:hover td {
    background-color: var(--color-bg-hover);
  }

  /* Header escluso dal tr:hover generico delle tabelle dati */

  html[data-theme="dark"] #header tr:hover td {
    background-color: transparent;
  }

  /* Pulsanti header: ripristina colore proprio quando tr e in hover
     ma il mouse NON e direttamente sul pulsante */

  html[data-theme="dark"] #header tr:hover .Logoinside:not(:hover) {
    background-color: #0F172A;
  }

  html[data-theme="dark"] #header tr:hover .toolbarOff:not(:hover) {
    background-color: #0F172A;
  }

  html[data-theme="dark"] #header tr:hover .toolbarOn:not(:hover) {
    background-color: #1E293B;
  }

  html[data-theme="dark"] #header tr:hover .menuprincipale:not(:hover) {
    background-color: #0F172A;
  }

  html[data-theme="dark"] #header tr:hover .cambiapwd:not(:hover),
  html[data-theme="dark"] #header tr:hover .tornamodulo:not(:hover) {
    background-color: #0F172A;
  }

  html[data-theme="dark"] #header tr:hover .logout:not(:hover) {
    background-color: #3B1A1A;
  }

  html[data-theme="dark"] #header tr:hover .sk-theme-toggle:not(:hover) {
    background-color: transparent;
  }

  /* Hover individuali (scattano solo sulla td col mouse sopra) */

  html[data-theme="dark"] #header .toolbarOff:hover {
    background-color: #1E293B;
    transform: none;
    box-shadow: none;
  }

  html[data-theme="dark"] #header .Logoinside:hover {
    background-color: #1E293B;
    transform: none;
    box-shadow: none;
  }

  html[data-theme="dark"] #header .menuprincipale:hover,
  html[data-theme="dark"] #header .cambiapwd:hover,
  html[data-theme="dark"] #header .tornamodulo:hover {
    background-color: #1E293B;
    transform: none;
    box-shadow: none;
  }

  html[data-theme="dark"] #header .logout:hover {
    background-color: var(--brand-danger);
    transform: none;
    box-shadow: none;
  }

  /* Theme toggle in dark header */
  html[data-theme="dark"] .sk-theme-toggle {
    color: rgba(255, 255, 255, 0.9);
  }
  html[data-theme="dark"] .sk-theme-toggle:hover {
    background-color: rgba(255,255,255,0.15);
  }

  /* ── 50.9  TABS ── */

  html[data-theme="dark"] .sk-tab__strip {
    background: var(--tab-bg);
    border-color: var(--tab-border);
  }

  html[data-theme="dark"] .sk-tab__item {
    color: var(--color-text-secondary);
  }

  html[data-theme="dark"] .sk-tab__item--active {
    color: var(--color-text-primary);
    background: var(--color-bg-white);
  }

  html[data-theme="dark"] .sk-tab__item:hover {
    color: var(--brand-primary);
  }

  /* ── 50.10  TOOLBAR ── */

  html[data-theme="dark"] .sk-page-toolbar {
    background: linear-gradient(180deg, var(--toolbar-bg) 0%, var(--color-bg-secondary) 100%);
    border-color: var(--color-border-dark);
  }
  /* ── 50.11  GRIDS (DHTMLX v9 su dark) ── */

  html[data-theme="dark"] .dhx_grid {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-grid-wrapper {
    background: var(--color-bg-white);
  }

  html[data-theme="dark"] .sk-sch-loading-overlay {
    background: var(--color-bg-white);
  }

  /* Grid header filter: select e input */

  html[data-theme="dark"] .dhx_grid-filter {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .dhx_grid-header-cell .dhx_combobox-input-box,
  html[data-theme="dark"] .dhx_grid-cell .dhx_combobox-input-box {
    background-color: var(--color-bg-white);
  }

  /* Combobox v9: input-box, input, tags, dropdown */

  html[data-theme="dark"] .dhx_combobox-input-box {
    background-color: var(--color-bg-white);
    box-shadow: inset 0px 0px 0px 1px var(--color-border);
  }

  html[data-theme="dark"] .dhx_combobox-input-box--active,
  html[data-theme="dark"] .dhx_combobox-input-box:focus-within {
    box-shadow: inset 0px 0px 0px 1px var(--brand-primary-light);
  }

  html[data-theme="dark"] .dhx_combobox-input {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .dhx_combobox-tag {
    background-color: var(--color-bg-secondary);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .dhx_combobox-options {
    background-color: var(--color-bg-white);
    box-shadow: 0 2px 8px rgba(0,0,0,0.4);
  }

  html[data-theme="dark"] .dhx_combobox-options__item:hover {
    background-color: var(--color-bg-hover);
  }

  /* Input generico dhx v9 (anche standalone) */

  html[data-theme="dark"] .dhx_input {
    background-color: var(--color-bg-white);
    color: var(--color-text-primary);
    box-shadow: inset 0px 0px 0px 1px var(--color-border);
  }

  html[data-theme="dark"] .dhx_input:focus,
  html[data-theme="dark"] .dhx_input--focus {
    box-shadow: inset 0px 0px 0px 1px var(--brand-primary-light);
  }

  /* Select nativo dhx v9 */

  html[data-theme="dark"] .dhx_select {
    background-color: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  /* Popup dhx v9 (calendar, combo dropdown) */

  html[data-theme="dark"] .dhx_popup {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
    box-shadow: 0 2px 8px rgba(0,0,0,0.5);
  }

  html[data-theme="dark"] .dhx_list-item {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .dhx_list-item:hover,
  html[data-theme="dark"] .dhx_list-item--focus {
    background-color: var(--color-bg-hover);
  }

  html[data-theme="dark"] .dhx_calendar {
    background-color: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  /* ── 50.11b PHOTO WIDGET (sk-photo) dark ── */

  /* specificita body .class batte inline style .class */

  html[data-theme="dark"] body .sk-photo-drop {
    background: var(--color-bg-secondary);
    border-color: var(--color-border-dark);
  }

  html[data-theme="dark"] body .sk-photo-drop:hover {
    background: var(--color-bg-hover);
    border-color: var(--brand-primary-light);
  }

  html[data-theme="dark"] body .sk-photo-drop.sk-photo-dragover {
    background: hsl(30, 20%, 18%);
    border-color: var(--brand-accent);
  }

  html[data-theme="dark"] body .sk-photo-placeholder span {
    color: var(--color-text-light);
  }

  /* ── 50.12  HOME DASHBOARD ── */

  html[data-theme="dark"] .sk-home-body {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-home-chart-panel {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-home-chart-title {
    color: var(--color-text-primary);
  }

  /* ── 50.13  KPI ── */

  html[data-theme="dark"] .sk-kpi {
    background: var(--gradient-card);
    border-color: var(--color-border);
  }
  html[data-theme="dark"] .sk-kpi__icon,
  html[data-theme="dark"] .sk-kpi__icon--accent,
  html[data-theme="dark"] .sk-kpi__icon--success,
  html[data-theme="dark"] .sk-kpi__icon--warning,
  html[data-theme="dark"] .sk-kpi__icon--danger,
  html[data-theme="dark"] .sk-kpi__icon--info {
    background: var(--color-icon-bg);
    color: var(--brand-primary);
  }
  html[data-theme="dark"] .sk-kpi__trend--up   { color: var(--color-success); }
  html[data-theme="dark"] .sk-kpi__trend--down { color: var(--color-error); }
  html[data-theme="dark"] .sk-kpi__trend--flat { color: var(--color-text-secondary); }

  /* ── 50.14  CARDS ── */

  html[data-theme="dark"] .sk-card-fields {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-field-val {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-card-subtitle {
    color: var(--brand-primary);
    border-color: var(--color-border);
  }

  /* ── 50.15  BADGES ── */

  html[data-theme="dark"] .sk-badge {
    border-color: transparent;
  }

  /* ── 50.16  NOTICES ──
     WCAG FIX: in light mode .sk-notice--{info|success|warning|danger} hanno
     color hardcoded (#1e40af, #065f46, #92400e, #991b1b) pensato per sfondo
     chiaro. In dark mode il background diventa scuro (--color-XXX-light vale
     #172554 / #064E3B / #78350F / #5C1414) ma il color non era overridden:
     contrasti tra 1.15:1 e 1.74:1, testo praticamente invisibile.
     Soluzione: usare le varianti "*-text" gia' tarate per dark bg.
     Contrasti risultanti (WCAG 2.1 AA = 4.5:1 per body text):
       info     #60A5FA su #172554 -> 5.87:1  AA OK
       success  #34D399 su #064E3B -> 4.81:1  AA OK
       warning  #FBBF24 su #78350F -> 5.46:1  AA OK
       danger   #F87171 su #5C1414 -> 4.65:1  AA OK
     <strong> dentro .sk-notice__body eredita correttamente il nuovo color. */

  html[data-theme="dark"] .sk-notice {
    border: 1px solid var(--color-border);
  }

  html[data-theme="dark"] .sk-notice--info {
    color: var(--color-info);
  }
  html[data-theme="dark"] .sk-notice--info .sk-notice__action {
    background: rgba(96, 165, 250, 0.15);
    color: var(--color-info);
  }
  html[data-theme="dark"] .sk-notice--info .sk-notice__action:hover {
    background: rgba(96, 165, 250, 0.30);
  }

  html[data-theme="dark"] .sk-notice.sk-system-banner--custom {
    background: color-mix(in srgb, var(--sk-banner-color) 22%, var(--color-bg-main, #0f172a));
    border-color: color-mix(in srgb, var(--sk-banner-color) 55%, white);
    color: color-mix(in srgb, var(--sk-banner-color) 38%, white);
  }
  html[data-theme="dark"] .sk-notice.sk-system-banner--custom .sk-notice__icon {
    color: color-mix(in srgb, var(--sk-banner-color) 65%, white);
  }

  html[data-theme="dark"] .sk-notice--success {
    color: var(--color-success);
  }
  html[data-theme="dark"] .sk-notice--success .sk-notice__action {
    background: rgba(52, 211, 153, 0.15);
    color: var(--color-success);
  }
  html[data-theme="dark"] .sk-notice--success .sk-notice__action:hover {
    background: rgba(52, 211, 153, 0.30);
  }

  html[data-theme="dark"] .sk-notice--warning {
    color: var(--color-warning);
  }
  html[data-theme="dark"] .sk-notice--warning .sk-notice__action {
    background: rgba(251, 191, 36, 0.15);
    color: var(--color-warning);
  }
  html[data-theme="dark"] .sk-notice--warning .sk-notice__action:hover {
    background: rgba(251, 191, 36, 0.30);
  }

  html[data-theme="dark"] .sk-notice--danger {
    color: var(--color-error);
  }
  html[data-theme="dark"] .sk-notice--danger .sk-notice__action {
    background: rgba(248, 113, 113, 0.15);
    color: var(--color-error);
  }
  html[data-theme="dark"] .sk-notice--danger .sk-notice__action:hover {
    background: rgba(248, 113, 113, 0.30);
  }

  html[data-theme="dark"] .sk-toast--success { color: var(--color-success); }
  html[data-theme="dark"] .sk-toast--error   { color: var(--color-error); }
  html[data-theme="dark"] .sk-toast--warning { color: var(--color-warning); }
  html[data-theme="dark"] .sk-toast--info    { color: var(--color-info-text, #93c5fd); }
  html[data-theme="dark"] .sk-toast { box-shadow: 0 4px 18px rgba(0, 0, 0, 0.45); }

  /* ── 50.17  DUE LIST ── */

  html[data-theme="dark"] .sk-due-item {
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-due-name {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-due-sub {
    color: var(--color-text-secondary);
  }

  /* ── 50.18  STAT TABLE ── */

  html[data-theme="dark"] .sk-stat-table td {
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  /* ── 50.19  LOGIN ── */

  html[data-theme="dark"] .login-card {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .login-input {
    background: var(--color-bg-main);
    border-color: var(--input-border);
    color: var(--color-text-primary);
  }

  /* ── 50.20  HOME HERO ── */

  html[data-theme="dark"] .sk-home-hero {
    background: var(--gradient-primary);
  }

  /* ── 50.21  HOME CARDS (v6 dashboard) ── */

  html[data-theme="dark"] .sk-home-card {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-home-card:hover {
    border-color: var(--brand-primary);
    background: var(--color-bg-hover);
  }

  html[data-theme="dark"] .sk-home-card-icon {
    border-color: rgba(255, 167, 38, 0.2);
  }

  html[data-theme="dark"] .sk-home-card-arrow {
    color: var(--brand-accent);
  }

  html[data-theme="dark"] .sk-home-section-sub {
    color: var(--color-text-secondary);  /* v54 WCAG: 4.84:1 su bg-hover */
  }

  /* ── 50.22  WIDGETS ── */

  html[data-theme="dark"] .sk-home-widget {
    background: var(--gradient-card);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-home-widget:hover {
    border-color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-home-widgets-sep {
    background: var(--color-border);
  }

  /* ── 50.23  CALENDAR ── */

  html[data-theme="dark"] .sk-sch-minical {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-minical-cell {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-sch-minical-cell:hover {
    background: var(--color-bg-hover);
  }

  /* ── 50.24  MODALS / POPUPS ── */

  html[data-theme="dark"] .sk-popup-select {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  /* ── 50.25  MENU (toolbarOn/Off) ── */

  html[data-theme="dark"] .toolbarOff {
    color: rgba(255, 255, 255, 0.7);
    background-color: #0F172A;
  }

  html[data-theme="dark"] .toolbarOff:hover {
    color: #FFFFFF;
    background-color: #1E293B;
    box-shadow: none;
    transform: none;
  }

  html[data-theme="dark"] .toolbarOn {
    color: #FFFFFF;
    background-color: #1E293B;
    border-bottom: 3px solid var(--brand-accent);
    font-weight: 700;
  }

  /* ── 50.26  SCROLLBAR (dark) ── */

  html[data-theme="dark"] ::-webkit-scrollbar-track {
    background: var(--color-bg-main);
  }

  html[data-theme="dark"] ::-webkit-scrollbar-thumb {
    background: var(--color-border-dark);
  }

  html[data-theme="dark"] ::-webkit-scrollbar-thumb:hover {
    background: #64748B;
  }

  /* ── 50.27  CRYSTAL REPORTS AREA ── */

  html[data-theme="dark"] .crystalReport {
    background: var(--color-bg-white);
  }

  /* ── 50.29  LAYOUT STRUTTURALE ── */

  html[data-theme="dark"] .div_MenuLeftSideBar_Principale,
  html[data-theme="dark"] .sk-sidebar {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .menuOrizzontale,
  html[data-theme="dark"] .menuOrizzontaleVisita {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .toolbarVisita {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .gruppoToolbar,
  html[data-theme="dark"] .skToolbar,
  html[data-theme="dark"] .skToolbar--fixed {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-scheda-toolbar {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  /* ── 50.30  HOME DASHBOARD v6 ── */

  html[data-theme="dark"] .sk-home-wrap {
    background: var(--color-bg-main);
  }

  html[data-theme="dark"] .sk-home-layout__side {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-home-card-icon,
  html[data-theme="dark"] .sk-home-widget-icon,
  html[data-theme="dark"] .sk-home-widget-icon--primary,
  html[data-theme="dark"] .sk-home-widget-icon--accent,
  html[data-theme="dark"] .sk-home-widget-icon--danger,
  html[data-theme="dark"] .sk-home-widget-icon--success {
    background: var(--color-icon-bg);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-home-mc-header {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-home-side-header {
    background: var(--color-bg-secondary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-home-section-label {
    color: var(--color-text-primary);
    background: var(--color-bg-hover);
    border-left-color: var(--brand-accent);
  }
  html[data-theme="dark"] .sk-home-section-label i {
    color: var(--color-accent-safe);
  }

  html[data-theme="dark"] .sk-home-urgent {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-home-quick-btn {
    background: var(--gradient-card);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-home-quick-btn:hover {
    background: var(--color-bg-hover);
    border-color: var(--brand-primary);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-home-widget--highlight {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    border-left-color: var(--color-accent-safe);
  }
  html[data-theme="dark"] .sk-home-widget--highlight .sk-home-widget-icon {
    background: var(--color-icon-bg);
    color: var(--color-accent-safe);
  }
  html[data-theme="dark"] .sk-home-widget--highlight .sk-home-widget-label {
    color: var(--color-text-secondary);
  }

  html[data-theme="dark"] .sk-home-view-tab {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-secondary);
  }
  html[data-theme="dark"] .sk-home-view-tab.active {
    background: var(--brand-primary);
    border-color: var(--brand-primary);
    color: var(--brand-white);
  }

  html[data-theme="dark"] .sk-home-card--urgent {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    border-left-color: var(--color-error);
  }

  /* ── 50.31  COMPONENTI UI ── */

  html[data-theme="dark"] .sk-accordion {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }
  html[data-theme="dark"] .sk-accordion-header:hover {
    background: var(--color-bg-hover);
  }
  html[data-theme="dark"] .sk-accordion-body {
    border-top-color: var(--color-border);
  }
  html[data-theme="dark"] .sk-accordion-icon {
    color: var(--brand-accent);
  }
  html[data-theme="dark"] .sk-card-photo {
    border-color: var(--color-border);
  }
  html[data-theme="dark"] .sk-expand-links a {
    color: var(--brand-primary);
  }
  html[data-theme="dark"] .sk-date-btn {
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-chip {
    background: var(--color-bg-secondary);
    color: var(--brand-primary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-detail-card {
    background: var(--gradient-card);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-detail-header {
    background: var(--color-bg-secondary);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-detail-panel {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-expand-stat {
    background: var(--color-bg-secondary);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-file-item {
    background: var(--color-bg-main);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-qa-tile {
    background: var(--gradient-card);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-nav-arrow,
  html[data-theme="dark"] .sk-nav-more {
    background: var(--color-bg-white);
    color: var(--color-text-secondary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-nav-dropdown {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    box-shadow: var(--shadow-lg);
  }

  html[data-theme="dark"] .sk-nav-drop-item--active {
    background: var(--color-bg-secondary);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .button-submit {
    background: var(--gradient-card);
    border-color: var(--color-border-dark);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] #modalContainer {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  /* ── 50.32  SCHEDULER ── */

  html[data-theme="dark"] .sk-sch-agenda-count {
    background: var(--color-bg-secondary);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-sch-agenda-hdr {
    background: var(--color-bg-main);
    color: var(--color-text-primary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-allday {
    background: var(--color-bg-secondary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-filter-drop {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    box-shadow: var(--shadow-lg);
  }

  html[data-theme="dark"] .sk-sch-slot-avail {
    background: #0A3D2A;
  }

  html[data-theme="dark"] .sk-sch-slot-bg {
    background: var(--color-bg-secondary);
  }

  html[data-theme="dark"] .sk-sch-tb-views {
    background: var(--color-bg-main);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-tl-hours {
    background: var(--color-bg-secondary);
    color: var(--color-text-light);
  }

  html[data-theme="dark"] .sk-sch-tl-slot {
    background: #0A3D2A;
  }

  html[data-theme="dark"] .sk-sch-ev {
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-colhdr {
    background: var(--color-bg-secondary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-slot {
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-slot:hover {
    background: var(--color-bg-hover);
  }

  html[data-theme="dark"] .sk-sch-month-cell {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-month-cell:hover {
    background: var(--color-bg-hover);
  }

  html[data-theme="dark"] .sk-sch-md-bar {
    border-color: rgba(255,255,255,.15);
  }

  html[data-theme="dark"] .sk-sch-toolbar {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-year-cell {
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-sch-year-cell:hover {
    background: var(--color-bg-hover);
  }

  html[data-theme="dark"] .sk-sch-quarter-daylabel {
    color: var(--color-text-light);
  }

  /* ── 50.33  LOGIN ── */

  html[data-theme="dark"] .login-branding {
    background: var(--color-bg-white);
  }

  html[data-theme="dark"] .login-modal-field__input {
    background: var(--color-bg-white);
    border-color: var(--input-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .login-modal-toolbar {
    background: var(--color-bg-main);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .login-form-section {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .login-footer {
    color: var(--color-text-secondary);
  }

  /* ── 50.34  COLOR MAP CELLS (dark tinted) ── */

  html[data-theme="dark"] .sk-cm-cell--blue {
    background: #1E3A5F; color: #93C5FD;
  }

  html[data-theme="dark"] .sk-cm-cell--green {
    background: #064E3B; color: #6EE7B7;
  }

  html[data-theme="dark"] .sk-cm-cell--orange {
    background: #78350F; color: #FDBA74;
  }

  html[data-theme="dark"] .sk-cm-cell--red {
    background: #5C1414; color: #FCA5A5;
  }

  html[data-theme="dark"] .sk-cm-cell--yellow {
    background: #713F12; color: #FDE68A;
  }

  /* ── 50.35  PRODUCT COLORS (darkened for dark bg) ── */

  html[data-theme="dark"] .TrainingManagmentColor {
    background-color: #6B5A42;
  }

  html[data-theme="dark"] .FrontLineColor {
    background-color: #7A7030;
  }

  html[data-theme="dark"] .SafetyColor {
    background-color: #3D6B3D;
  }

  html[data-theme="dark"] .CompanyOversightColor {
    background-color: #8B5E2A;
  }

  html[data-theme="dark"] .OccupationalHealthColor {
    background-color: #8B3A3A;
  }

  html[data-theme="dark"] .HumanResourcesColor {
    background-color: #3D5A7A;
  }

  html[data-theme="dark"] .IncidentManagementColor {
    background-color: #3D6E72;
  }

  html[data-theme="dark"] .TrainingManagmentColorTitle {
    color: #D4B896;
  }

  html[data-theme="dark"] .FrontLineColorTitle {
    color: #E0D580;
  }

  html[data-theme="dark"] .SafetyColorTitle {
    color: #8FBC8F;
  }

  html[data-theme="dark"] .CompanyOversightColorTitle {
    color: #FFB070;
  }

  html[data-theme="dark"] .OccupationalHealthColorTitle {
    color: #F08080;
  }

  html[data-theme="dark"] .HumanResourcesColorTitle {
    color: #93B5E8;
  }

  /* ── 50.36  CRYSTAL REPORTS ── */

  html[data-theme="dark"] .crheader,
  html[data-theme="dark"] .crtoolbar,
  html[data-theme="dark"] .crwizard,
  html[data-theme="dark"] .crwizardfields,
  html[data-theme="dark"] .crwizardformula,
  html[data-theme="dark"] .crwizardtabbackground,
  html[data-theme="dark"] .crwizardtabborder,
  html[data-theme="dark"] .crwizardtoolbar,
  html[data-theme="dark"] .crsearchresultstitle {
    background: var(--color-bg-secondary);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .crtoptoolbar,
  html[data-theme="dark"] .crpagepath {
    background: var(--brand-primary);
    color: var(--brand-white);
  }

  html[data-theme="dark"] .crsearchresultsalt {
    color: var(--color-text-secondary);
  }

  /* ── 50.37  CALENDARIO LEGACY ── */

  html[data-theme="dark"] .today {
    background: var(--color-bg-secondary);
  }

  html[data-theme="dark"] .festivo {
    background: #2A2A2A;
  }

  html[data-theme="dark"] .festivo1 {
    background: #252530;
  }

  html[data-theme="dark"] .festivo2 {
    background: #3A3520;
  }

  html[data-theme="dark"] .appuntamento {
    background: #1A3D4A;
  }

  /* ── 50.38  RISK BADGES ── */

  html[data-theme="dark"] .badge-risk-low {
    background: var(--color-success-light); color: var(--color-success);
  }

  html[data-theme="dark"] .badge-risk-medium {
    background: var(--color-warning-light); color: var(--color-warning);
  }

  html[data-theme="dark"] .risk-indicator-low {
    background: var(--color-success);
  }

  html[data-theme="dark"] .risk-indicator-medium {
    background: var(--color-warning);
  }

  /* ── 50.39  TABELLE LEGACY ── */

  html[data-theme="dark"] .dhxcombo_chbx_1,
  html[data-theme="dark"] .dhxcombo_checkbox {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] #navigation {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] #navigation a {
    color: var(--color-text-secondary);
  }

  html[data-theme="dark"] #navigation a:hover,
  html[data-theme="dark"] #navigation a.current {
    color: var(--color-text-primary);
  }

  /* ── 50.40  RESIDUI LIGHT (catch-all) ── */

  html[data-theme="dark"] #layout,
  html[data-theme="dark"] #loginfooter,
  html[data-theme="dark"] .div_MenuLeftSideBar_Principale_Hidden {
    background: var(--color-bg-main);
  }

  html[data-theme="dark"] #progressbar {
    background: var(--color-bg-secondary);
  }

  html[data-theme="dark"] .App2 {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .calendario {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .gruppo1div {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .crpage,
  html[data-theme="dark"] .crsearchresults,
  html[data-theme="dark"] .crsearchresultstoolbar {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-sch-agenda-date {
    background: var(--color-bg-secondary);
    color: var(--color-text-primary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-legend {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-sch-monthcell {
    background: var(--color-bg-white);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-quarter-month {
    background: var(--color-bg-secondary);
    color: var(--color-text-primary);
    border-color: var(--color-border);
  }

  html[data-theme="dark"] .sk-sch-tb-btn {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-sch-tb-btn:hover {
    background: var(--color-bg-hover);
    border-color: var(--brand-primary);
    color: var(--brand-primary);
  }

  html[data-theme="dark"] .sk-sch-tb-nav {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-sch-tb-select {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
  }

  html[data-theme="dark"] .sk-sch-tip {
    background: var(--color-bg-white);
    border-color: var(--color-border);
    color: var(--color-text-primary);
    box-shadow: var(--shadow-lg);
  }

  html[data-theme="dark"] .sk-sch-year-month {
    background: var(--color-bg-secondary);
    color: var(--color-text-primary);
    border-color: var(--color-border);
  }

  /* ── 50.41  A11Y FORM VALIDATION (dark) ── */

  html[data-theme="dark"] [aria-invalid="true"],
  html[data-theme="dark"] input[aria-invalid="true"],
  html[data-theme="dark"] select[aria-invalid="true"],
  html[data-theme="dark"] textarea[aria-invalid="true"] {
    border-color: var(--color-error) !important;
    box-shadow: 0 0 0 1px var(--color-error);
  }

  html[data-theme="dark"] [role="alert"],
  html[data-theme="dark"] .sk-field-error {
    color: var(--color-error);
  }


/* ══════════════════════════════════════════════════════════════════════════
   51.L  LIGHT MODE (html[data-theme="light"])
   Ridefinisce tutte le variabili CSS ai valori light (identici a :root base)
   e resetta i valori hardcoded della sezione 51.D.
   Necessaria come insurance: se data-theme="light" e' presente, le regole
   base di :root sono sufficienti per le variabili, ma i selettori
   html[data-theme="light"] hanno specificity piu' alta e garantiscono
   che nessun residuo dark possa interferire.
   ══════════════════════════════════════════════════════════════════════════ */

  /* 51.L1 Light force: all CSS variables */
html[data-theme="light"] {

    /* All variables forced back to light values (section 1 :root) */

    /* Brand */
    --brand-primary:       #284473;
    --brand-primary-light: #3B5A9A;
    --brand-primary-dark:  #1A2F54;
    --brand-primary-hover: #2050A0;
    --brand-accent:        #ff9600;
    --brand-accent-hover:  #FFA726;
    --brand-accent-dark:   #F57C00;
    --brand-accent-light:  #FFB74D;
    --brand-danger:        #B30000;
    --brand-danger-hover:  #D90000;
    --brand-bg:            #f5f5f5;
    --brand-white:         #ffffff;

    /* Buttons */
    --buttonTextColor:            black;
    --buttonHoverTextColor:       white;
    --buttonHoverBackgroundColor: #ff9600;
    --buttonBackgroundColor:      #b0c4de;

    /* Product text */
    --productTextColor:  #284473;
    --productTextWeight: 600;

    /* Form */
    --input-border:     #7E929E;
    --input-border-top: #6B7B8A;
    --input-focus:      #284473;

    /* Validation */
    --valid-color:   #10B981;
    --invalid-color: #EF4444;

    /* Toolbar / Tabs */
    --toolbar-bg:        #dbeafd;
    --toolbar-border:    #a8bed2;
    --tab-bg:            #d8eaff;
    --tab-border:        #a4bed4;
    --tab-active-border: #ff9600;

    /* Sfondi */
    --color-bg-main:      #F8FAFC;
    --color-bg-secondary: #EFF6FF;
    --color-bg-white:     #ffffff;
    --color-bg-light:     #E1EFFF;
    --color-bg-hover:     #F0F9FF;
    --color-bg-toolbar:   #EBF5FF;
    --color-bg-card:      #FFFFFF;

    /* Gradienti */
    --gradient-primary: linear-gradient(135deg, #284473 0%, #3B5A9A 100%);
    --gradient-accent:  linear-gradient(135deg, #ff9600 0%, #FFA726 100%);
    --gradient-header:  #284473;
    --gradient-card:    linear-gradient(145deg, #ffffff 0%, #f8fafc 100%);

    /* Testo */
    --color-text-primary:   #1E293B;
    --color-text-secondary: #64748B;
    --color-text-light:     #6B7280;
    --color-text-dark:      #0F172A;

    /* Stato */
    --color-success:       #10B981;
    --color-success-light: #D1FAE5;
    --color-warning:       #F59E0B;
    --color-warning-light: #FEF3C7;
    --color-error:         #EF4444;
    --color-error-light:   #FEE2E2;
    --color-info:          #3B82F6;
    --color-info-light:    #DBEAFE;
    --color-icon-bg:       #EEF2F9;

    /* Stato testo-safe */
    --color-accent-text:   #A86000;
    --color-accent-safe:   #B54D00;
    --color-success-text:  #047A56;
    --color-warning-text:  #A26800;
    --color-error-text:    #DC2626;
    --color-info-text:     #2563EB;

    /* Bordi */
    --color-border:       #E2E8F0;
    --color-border-dark:  #CBD5E1;
    --color-border-light: #F1F5F9;

    /* Ombre */
    --shadow:         rgba(0, 0, 0, 0.08);
    --shadow-xs:      0 1px 2px rgba(0, 0, 0, 0.05);
    --shadow-sm:      0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
    --shadow-md:      0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.06);
    --shadow-lg:      0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
    --shadow-xl:      0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
    --shadow-accent:  0 4px 12px rgba(255, 150, 0, 0.25);
    --shadow-primary: 0 4px 12px rgba(40, 68, 115, 0.25);
    --shadow-hover:   0 8px 16px rgba(0, 0, 0, 0.12);
    --shadow-inner:   inset 0 2px 4px rgba(0, 0, 0, 0.06);

    /* Chart palette */
    --chart-1: #284473;
    --chart-2: #ff9600;
    --chart-3: #10B981;
    --chart-4: #EF4444;
    --chart-5: #3B82F6;
    --chart-6: #F59E0B;
    --chart-7: #8B5CF6;

    /* DHTMLX v9 light */
    --dhx-font-color-primary: #1E293B;
    --dhx-font-color-secondary: #64748B;
    --dhx-font-color-additional: #6B7280;
    --dhx-font-color-disabled: rgba(0, 0, 0, 0.3);
    --dhx-font-color-contrast: #1E293B;
    --dhx-font-color-contrast-disabled: rgba(0, 0, 0, 0.3);
    --dhx-border-color: #E2E8F0;
    --dhx-border-color-focused: #CBD5E1;
    --dhx-background-primary: #ffffff;
    --dhx-background-secondary: #EFF6FF;
    --dhx-background-additional: #F0F9FF;
    --dhx-s-toolbar-background: #F8FAFC;
    --dhx-s-toolbar-button-background-hover: rgba(0, 0, 0, 0.04);
    --dhx-s-toolbar-button-background-active: rgba(0, 0, 0, 0.08);
    --dhx-s-grid-header-background: #EEF2F7;
    --dhx-s-grid-header-border-bottom: 1px solid #E2E8F0;
    --dhx-s-grid-row-alternate: #F8FAFC;
    --dhx-s-grid-row-hover: #EFF6FF;
    --dhx-s-grid-row-selected: #DBEAFE;
    --dhx-s-grid-selection-border: #3B82F6;
    --dhx-s-grid-selection-background: #3B82F6;
    --dhx-s-grid-cell-text: #334155;
    --dhx-s-calendar-muffled: .4;

}

  /* 51.L2a  Grid v9: selezione riga visibile (allineamento stile v4, WCAG compliant)
     DHTMLX v9 usa ::after overlay SOPRA il testo con opacity .08 su un colore quasi
     bianco: risultato invisibile. Soluzione: doppio indicatore.
     1) Tinta brand-primary a bassa opacity (non degrada testo sotto soglia AA)
     2) Bordo sinistro 3px brand-primary (indicatore non-text WCAG 1.4.11, >3:1)
     Light: tinta 5% (#284473 su #FFF = #F4F5F8), secondary #64748B resta 4.55:1 AA
     Dark:  tinta 12% (#7BA3E0 su #1E293B = #29374E), secondary #94A3B8 resta 4.67:1 AA
     Bordo: 9.70:1 light, 5.68:1 dark (WCAG 1.4.11 richiede 3:1) */
  .dhx_grid-selected-row {
    box-shadow: inset 3px 0 0 var(--brand-primary);
  }
  .dhx_grid-selected-row:after {
    background: var(--brand-primary);
    opacity: 0.05;
  }
  html[data-theme="dark"] .dhx_grid-selected-row:after {
    opacity: 0.12;
  }

  /* 51.L2 RIMOSSA (v53): con la nuova architettura data-theme sempre presente,
     le regole html[data-theme="dark"] non matchano quando data-theme="light",
     quindi il CSS base light si applica automaticamente senza override.
     La vecchia 51.L2 aveva 25 divergenze dal base light (hover blu, colori prodotto
     diversi, ecc.) che causavano inconsistenze visive. */

  /* 51.L3 Print: forza light indipendentemente da data-theme */
  @media print {
    html[data-theme="dark"],
    html[data-theme="light"],
    html:not([data-theme]) {
      --color-bg-main: #FFFFFF;
      --color-bg-white: #FFFFFF;
      --color-bg-card: #FFFFFF;
      --color-text-primary: #1E293B;
      --color-text-secondary: #64748B;
      --color-border: #E2E8F0;
    }
  }

/* ══════════════════════════════════════════════════════════════════════════
   52. SK TRANSLATION KIT — ANTI-GLITCH CLOAKING
   ══════════════════════════════════════════════════════════════════════════
   Nasconde il contenuto traducibile mentre la traduzione e' in corso.
   La classe sk-i18n-pending viene aggiunta a <html> da jsk_translation.js
   (sincrono, prima del rendering) se la lingua non e' italiana.
   Rimossa al completamento della traduzione o dopo 4s (safety timeout).

   Impatta SOLO utenti non-italiano. Per it-IT la classe non viene mai aggiunta.
   ══════════════════════════════════════════════════════════════════════════ */

html.sk-i18n-pending #sk-page-wrapper {
  opacity: 0;
}

html.sk-i18n-pending .sk-i18n-reveal,
#sk-page-wrapper.sk-i18n-reveal {
  transition: opacity .15s ease;
}

/* ==========================================================================
   53. SK MOBILE KIT  (v57)
   ==========================================================================
   Kit mobile per CANOPO 2026.

   PRINCIPI
   --------
   - Il desktop e' il caso principale (enterprise HSE, operatori a postazione).
   - Il mobile e' per consultazione rapida in campo: scadenze, elenchi, ricerca
     semplice, ispezione. NON e' per data entry complesso.
   - KPI e grafici sono gia' nascosti sotto 768px (vedi sez. 29).
   - La griglia operativa diventa una lista di card tap-friendly.
   - La sidebar diventa:
       a) Lista verticale sotto il main (default, gia' in sez. 29) -- adatta
          a chi naviga con un solo modulo alla volta.
       b) Off-canvas drawer laterale opzionale (questa sezione 53.1) -- adatta
          a pagine molto lunghe dove serve sempre navigazione a portata.
     Il pattern B si attiva aggiungendo classe .sk-mobile-drawer-enabled su
     <html> oppure su #sk-page-wrapper. Default (senza classe): pattern A.

   WCAG / AGID
   -----------
   - Target tap 44x44 minimo (2.5.5 Target Size, AGID touch friendly)
   - Focus visibile su tutti gli elementi interattivi
   - Prefers-reduced-motion rispettato (2.3.3)
   - Orientamento portrait/landscape supportato (1.3.4)
   - Swipe-to-close drawer OPZIONALE (non unica modalita' di chiusura:
     backdrop-click e tasto X sempre presenti)
   - Backdrop con role="presentation"; drawer con role="navigation" + aria-label
   - Esc chiude il drawer (JS lato master)
   ========================================================================== */


/* ── 53.0  UTILITY MOBILE-ONLY / DESKTOP-ONLY ────────────────────────────── */

/* Default (desktop/tablet): contenuti mobile-only nascosti */
.sk-mobile-only { display: none !important; }

/* Default (desktop/tablet): contenuti desktop-only visibili.
   Nessuna property: elemento segue il display naturale del suo tag.
   La regola esiste solo come "hook" per il @media override che segue. */
.sk-desktop-only { /* no-op su desktop, override in @media (max-width: 768px) */ display: revert; }

@media (max-width: 768px) {
  .sk-mobile-only  { display: initial !important; }
  .sk-mobile-only.sk-mobile-only--flex  { display: flex !important; }
  .sk-mobile-only.sk-mobile-only--grid  { display: grid !important; }
  .sk-mobile-only.sk-mobile-only--block { display: block !important; }
  .sk-desktop-only { display: none !important; }
}


/* ── 53.1  DRAWER OFF-CANVAS (OPZIONALE) ─────────────────────────────────────
   Attivato da .sk-mobile-drawer-enabled su <html> o #sk-page-wrapper.
   Pattern: hamburger toggle -> drawer slide-in da sinistra + backdrop.
   Interazione: tap backdrop chiude, Esc chiude, FAB in basso-sx riapre. */

/* Trigger FAB sempre visibile in basso a sinistra (solo mobile + classe attiva) */
.sk-mobile-fab {
  display: none;
}

/* Drawer e backdrop: nascosti per default */
.sk-mobile-drawer,
.sk-mobile-backdrop {
  display: none;
}

@media (max-width: 768px) {
  /* Attivazione esplicita: classe su <html> o #sk-page-wrapper */
  html.sk-mobile-drawer-enabled #sk-page-wrapper > table:nth-of-type(2),
  #sk-page-wrapper.sk-mobile-drawer-enabled > table:nth-of-type(2),
  html.sk-mobile-drawer-enabled .div_MenuLeftSideBar_Principale,
  html.sk-mobile-drawer-enabled .sk-sidebar,
  .sk-mobile-drawer-enabled .div_MenuLeftSideBar_Principale,
  .sk-mobile-drawer-enabled .sk-sidebar {
    /* Nel pattern drawer la sidebar ATTUALE (lista verticale sotto main)
       deve essere nascosta per dare spazio al drawer laterale. */
    display: none;
  }

  html.sk-mobile-drawer-enabled .sk-mobile-fab,
  .sk-mobile-drawer-enabled .sk-mobile-fab {
    display: inline-flex;
    position: fixed;
    bottom: calc(16px + env(safe-area-inset-bottom, 0px));
    left: 16px;
    width: var(--sk-mobile-fab-size);
    height: var(--sk-mobile-fab-size);
    align-items: center;
    justify-content: center;
    background: var(--brand-primary);
    color: var(--brand-white);
    border: none;
    border-radius: var(--radius-full);
    box-shadow: var(--shadow-lg);
    cursor: pointer;
    z-index: 1050;
    font-size: 20px;
    transition: transform var(--transition-fast), background var(--transition-fast);
  }
  html.sk-mobile-drawer-enabled .sk-mobile-fab:hover,
  .sk-mobile-drawer-enabled .sk-mobile-fab:hover {
    background: var(--brand-primary-hover);
    transform: scale(1.06);
  }
  html.sk-mobile-drawer-enabled .sk-mobile-fab:focus-visible,
  .sk-mobile-drawer-enabled .sk-mobile-fab:focus-visible {
    outline: 3px solid var(--brand-accent);
    outline-offset: 2px;
  }

  /* Backdrop: overlay semi-trasparente quando drawer aperto */
  html.sk-mobile-drawer-enabled .sk-mobile-backdrop,
  .sk-mobile-drawer-enabled .sk-mobile-backdrop {
    display: block;
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.55);
    z-index: 1060;
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--transition-normal);
  }
  html.sk-mobile-drawer-open .sk-mobile-backdrop,
  .sk-mobile-drawer-open .sk-mobile-backdrop {
    opacity: 1;
    pointer-events: auto;
  }

  /* Drawer: pannello laterale slide-in */
  html.sk-mobile-drawer-enabled .sk-mobile-drawer,
  .sk-mobile-drawer-enabled .sk-mobile-drawer {
    display: flex;
    flex-direction: column;
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    width: var(--sk-mobile-drawer-w);
    max-width: 85vw;
    background: var(--color-bg-white);
    box-shadow: var(--shadow-xl);
    z-index: 1070;
    transform: translateX(-100%);
    transition: transform var(--transition-normal);
    overflow: hidden;
    padding-top: env(safe-area-inset-top, 0px);
    padding-bottom: env(safe-area-inset-bottom, 0px);
  }
  html.sk-mobile-drawer-open .sk-mobile-drawer,
  .sk-mobile-drawer-open .sk-mobile-drawer {
    transform: translateX(0);
  }

  /* Drawer header: titolo + close */
  .sk-mobile-drawer__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 14px 16px;
    background: var(--gradient-header);
    color: var(--brand-white);
    min-height: var(--sk-mobile-touch-target);
    flex-shrink: 0;
  }
  .sk-mobile-drawer__title {
    font-family: var(--font-base);
    font-size: 15px;
    font-weight: 600;
    margin: 0;
  }
  .sk-mobile-drawer__close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--sk-mobile-touch-target);
    height: var(--sk-mobile-touch-target);
    background: transparent;
    color: var(--brand-white);
    border: none;
    border-radius: var(--radius-sm);
    cursor: pointer;
    font-size: 18px;
  }
  .sk-mobile-drawer__close:hover {
    background: rgba(255, 255, 255, 0.12);
  }
  .sk-mobile-drawer__close:focus-visible {
    outline: 2px solid var(--brand-accent);
    outline-offset: -2px;
  }

  /* Drawer body: contiene la lista voci (riutilizza #navigationVertical se presente) */
  .sk-mobile-drawer__body {
    flex: 1 1 auto;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
  }
  .sk-mobile-drawer__body > ul,
  .sk-mobile-drawer__body > nav > ul {
    list-style: none;
    margin: 0;
    padding: 8px 0;
    display: flex;
    flex-direction: column;
  }
  .sk-mobile-drawer__body li { width: 100%; }
  .sk-mobile-drawer__body a:link,
  .sk-mobile-drawer__body a:visited {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 100%;
    min-height: var(--sk-mobile-touch-target);
    padding: 12px 16px;
    color: var(--color-text-primary);
    background: transparent;
    text-decoration: none;
    font-family: var(--font-base);
    font-size: var(--font-size-base);
    border-left: 3px solid transparent;
    box-sizing: border-box;
    transition: background var(--transition-fast), border-color var(--transition-fast);
  }
  .sk-mobile-drawer__body a:hover,
  .sk-mobile-drawer__body a:focus-visible {
    background: var(--color-bg-hover);
    border-left-color: var(--brand-accent);
  }
  .sk-mobile-drawer__body a.current {
    color: var(--brand-primary);
    font-weight: 700;
    background: var(--color-bg-hover);
    border-left-color: var(--brand-accent);
  }
  .sk-mobile-drawer__body a i {
    flex-shrink: 0;
    width: 20px;
    text-align: center;
    font-size: 16px;
    color: var(--color-text-secondary);
  }
  .sk-mobile-drawer__body a.current i,
  .sk-mobile-drawer__body a:hover i {
    color: var(--brand-accent);
  }

  /* Drawer footer opzionale (es. logout, theme toggle) */
  .sk-mobile-drawer__foot {
    flex-shrink: 0;
    padding: 12px 16px;
    border-top: 1px solid var(--color-border);
    display: flex;
    align-items: center;
    gap: 12px;
    background: var(--color-bg-main);
  }

  /* Lock body scroll quando drawer aperto */
  html.sk-mobile-drawer-open,
  html.sk-mobile-drawer-open body {
    overflow: hidden;
  }
}


/* ── 53.2  MOBILE CARD LIST (grid -> card) ──────────────────────────────────
   Su mobile, le griglie operative sono difficili da consultare.
   Pattern alternativo: lista di card, una per record.

   USO (nel markup XSLT):
   <ul class="sk-mobile-card-list sk-mobile-only sk-mobile-only--block">
     <li class="sk-mobile-card">
       <header class="sk-mobile-card__head">
         <span class="sk-mobile-card__title">Nome Principale</span>
         <span class="sk-mobile-card__badge sk-mobile-card__badge--warn">Stato</span>
       </header>
       <dl class="sk-mobile-card__rows">
         <div class="sk-mobile-card__row">
           <dt>Etichetta</dt><dd>Valore</dd>
         </div>
         <div class="sk-mobile-card__row">
           <dt>Data</dt><dd>12/03/2026</dd>
         </div>
       </dl>
       <footer class="sk-mobile-card__actions">
         <button class="sk-btn sk-btn--primary">Apri</button>
       </footer>
     </li>
   </ul>

   La lista e' visibile SOLO su mobile (grazie a sk-mobile-only).
   Su desktop/tablet resta la griglia DHTMLX.                                  */

.sk-mobile-card-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.sk-mobile-card {
  background: var(--color-bg-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
  padding: 12px 14px;
  box-sizing: border-box;
  transition: box-shadow var(--transition-fast), transform var(--transition-fast);
  /* CSS containment per performance: isola layout/paint dei card nel viewport */
  contain: layout style;
}
.sk-mobile-card:hover,
.sk-mobile-card:focus-within {
  box-shadow: var(--shadow-sm);
}
.sk-mobile-card:active {
  transform: scale(0.995);
}

.sk-mobile-card__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-bottom: 8px;
}
.sk-mobile-card__title {
  font-family: var(--font-base);
  font-size: 14px;
  font-weight: 600;
  color: var(--color-text-primary);
  line-height: 1.3;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  min-width: 0;
  flex: 1 1 auto;
}
.sk-mobile-card__subtitle {
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  margin-top: 2px;
}

.sk-mobile-card__badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 10px;
  border-radius: var(--radius-full);
  font-size: var(--font-size-sm);
  font-weight: 600;
  flex-shrink: 0;
  white-space: nowrap;
}
.sk-mobile-card__badge--ok   { background: var(--color-success-tint); color: var(--color-success-text); }
.sk-mobile-card__badge--warn { background: var(--color-warning-tint); color: var(--color-warning-text); }
.sk-mobile-card__badge--err  { background: var(--color-error-tint);   color: var(--color-error-text); }
.sk-mobile-card__badge--info { background: var(--color-info-tint);    color: var(--color-info-text); }
.sk-mobile-card__badge--muted{ background: var(--color-border-light); color: var(--color-text-secondary); }

.sk-mobile-card__rows {
  margin: 0;
  display: grid;
  grid-template-columns: max-content 1fr;
  row-gap: 4px;
  column-gap: 10px;
  font-size: var(--font-size-base);
}
.sk-mobile-card__row {
  display: contents; /* dt e dd partecipano direttamente alla grid parent */
}
.sk-mobile-card__rows dt {
  color: var(--color-text-secondary);
  font-weight: 500;
  font-size: var(--font-size-sm);
  white-space: nowrap;
}
.sk-mobile-card__rows dd {
  margin: 0;
  color: var(--color-text-primary);
  word-break: break-word;
  min-width: 0;
}

.sk-mobile-card__actions {
  display: flex;
  gap: 8px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--color-border-light);
  justify-content: flex-end;
  flex-wrap: wrap;
}
.sk-mobile-card__actions .sk-btn,
.sk-mobile-card__actions .pulsante {
  min-height: var(--sk-mobile-touch-target);
  min-width: var(--sk-mobile-touch-target);
}

/* Card intera cliccabile (link wrapper) */
a.sk-mobile-card,
.sk-mobile-card--link {
  text-decoration: none;
  color: inherit;
  cursor: pointer;
  display: block;
}
a.sk-mobile-card:focus-visible,
.sk-mobile-card--link:focus-visible {
  outline: 2px solid var(--brand-accent);
  outline-offset: 2px;
}

/* Variante compatta: due righe max, denso */
.sk-mobile-card--compact { padding: 10px 12px; }
.sk-mobile-card--compact .sk-mobile-card__head { margin-bottom: 4px; }
.sk-mobile-card--compact .sk-mobile-card__title { font-size: 13px; }

/* Toggle automatico: NASCONDI griglie DHTMLX e MOSTRA card list su mobile */
@media (max-width: 768px) {
  /* Nella pagina operativa: il wrapper griglia viene affiancato dalla lista card.
     La lista card e' marcata .sk-mobile-only -> visibile solo qui.
     La griglia non viene nascosta automaticamente: il developer sceglie
     se nasconderla con .sk-desktop-only sul wrapper #gridbox parent. */
}


/* ── 53.3  BOTTOM SHEET (popup mobile) ─────────────────────────────────────
   Trasforma un popup centrato in un bottom sheet slide-up su mobile.
   Usa aggiungendo .sk-bottom-sheet al contenitore del popup.
   Desktop: popup normale (nessuno stile).
   Mobile:  slide-up da in basso, 90vh max, drag handle visibile.               */

/* Nessuno stile desktop: hook per override in @media (max-width: 768px) */
.sk-bottom-sheet { /* no-op su desktop, override sotto */ }

@media (max-width: 768px) {
  .sk-bottom-sheet {
    position: fixed !important;
    left: 0 !important;
    right: 0 !important;
    bottom: 0 !important;
    top: auto !important;
    width: 100% !important;
    max-width: 100% !important;
    max-height: 90vh;
    margin: 0 !important;
    border-radius: var(--radius-lg) var(--radius-lg) 0 0 !important;
    box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.2);
    padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
    overflow-y: auto;
    animation: sk-sheet-slide-up var(--transition-normal);
  }
  .sk-bottom-sheet::before {
    content: "";
    display: block;
    width: 36px;
    height: 4px;
    background: var(--color-border-dark);
    border-radius: var(--radius-full);
    margin: 8px auto 4px;
  }
}
@keyframes sk-sheet-slide-up {
  from { transform: translateY(100%); opacity: 0; }
  to   { transform: translateY(0);    opacity: 1; }
}


/* ── 53.4  MOBILE FORM (single column enforcement) ─────────────────────────
   Su mobile i form a 2+ colonne diventano confusi. Anche se sk-cols-2 e sk-layout
   gia' collassano, alcune pagine usano grid-template-columns inline custom.
   Qui forziamo il collasso a 1 colonna per TUTTE le schede operative.          */

@media (max-width: 640px) {

  /* Campi con label sopra valore */
  .sk-card-fields {
    grid-template-columns: 1fr !important;
    gap: 12px !important;
  }
  .sk-field {
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
  .sk-field > .lbl,
  .sk-field > label.lbl {
    font-size: var(--font-size-sm);
    color: var(--color-text-secondary);
    font-weight: 600;
    margin-bottom: 2px;
  }

  /* Input grandi per tap (gia' 44px da sez. 29 @480) */
  input:not([type]),
  input[type="text"],
  input[type="email"],
  input[type="tel"],
  input[type="number"],
  input[type="password"],
  input[type="search"],
  select,
  textarea {
    min-height: var(--sk-mobile-touch-target);
    font-size: 16px; /* previene zoom iOS on focus */
  }
}


/* ── 53.5  MOBILE SUMMARY (sostituisce chart/KPI nascosti) ─────────────────
   Quando su mobile nascondiamo KPI e grafici, la home rischia di apparire
   vuota. Il pattern: offrire un breve "sommario mobile" con le sole info
   operative (conteggi, prossime scadenze, alert) in forma di lista compatta.

   USO (nel markup XSLT home):
   <div class="sk-mobile-summary sk-mobile-only sk-mobile-only--block">
     <div class="sk-mobile-summary__row">
       <i class="fas fa-calendar-alt"></i>
       <span class="sk-mobile-summary__label">Scadenze a 30 giorni</span>
       <span class="sk-mobile-summary__value">12</span>
     </div>
     ...
   </div>                                                                       */

.sk-mobile-summary {
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: 4px;
  box-shadow: var(--shadow-xs);
}

.sk-mobile-summary__row {
  display: flex;
  align-items: center;
  gap: 12px;
  min-height: var(--sk-mobile-touch-target);
  padding: 8px 12px;
  border-radius: var(--radius-sm);
  color: var(--color-text-primary);
  font-size: var(--font-size-base);
  text-decoration: none;
  transition: background var(--transition-fast);
}
a.sk-mobile-summary__row { cursor: pointer; }
a.sk-mobile-summary__row:hover,
a.sk-mobile-summary__row:focus-visible { background: var(--color-bg-hover); }
a.sk-mobile-summary__row:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: -2px; }

.sk-mobile-summary__row > i {
  width: 22px;
  text-align: center;
  color: var(--brand-primary);
  font-size: 15px;
  flex-shrink: 0;
}
.sk-mobile-summary__row--alert > i  { color: var(--color-error-text); }
.sk-mobile-summary__row--warn > i   { color: var(--color-warning-text); }
.sk-mobile-summary__row--ok > i     { color: var(--color-success-text); }

.sk-mobile-summary__label {
  flex: 1 1 auto;
  min-width: 0;
  color: var(--color-text-primary);
  font-weight: 500;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sk-mobile-summary__value {
  flex-shrink: 0;
  font-weight: 700;
  font-size: 15px;
  color: var(--brand-primary);
  min-width: 28px;
  text-align: right;
}
.sk-mobile-summary__row--alert .sk-mobile-summary__value  { color: var(--color-error-text); }
.sk-mobile-summary__row--warn  .sk-mobile-summary__value  { color: var(--color-warning-text); }
.sk-mobile-summary__row--ok    .sk-mobile-summary__value  { color: var(--color-success-text); }


/* ── 53.6  MOBILE TOOLBAR COMPACTOR ────────────────────────────────────────
   sk-page-toolbar con molti bottoni su mobile richiede overflow menu.
   Comportamento v57: quando si aggiunge .sk-page-toolbar--mobile-compact,
   tutti i bottoni che NON hanno classe .sk-btn--primary vengono ridotti
   a icona-sola sotto 640px (mantengono aria-label per screen reader).        */

@media (max-width: 640px) {
  .sk-page-toolbar.sk-page-toolbar--mobile-compact .sk-btn:not(.sk-btn--primary) > span,
  .sk-page-toolbar.sk-page-toolbar--mobile-compact .pulsante:not(.sk-btn--primary) > span {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
  }
  .sk-page-toolbar.sk-page-toolbar--mobile-compact .sk-btn:not(.sk-btn--primary),
  .sk-page-toolbar.sk-page-toolbar--mobile-compact .pulsante:not(.sk-btn--primary) {
    width: var(--sk-mobile-touch-target);
    padding: 0;
    justify-content: center;
  }
}


/* ── 53.7  TAP TARGET ENFORCEMENT (WCAG 2.5.5 AA) ──────────────────────────
   Target minimo 44x44px su touchscreen. Applicato a tutti gli elementi
   interattivi che NON hanno gia' dimensione adeguata.                         */

@media (max-width: 768px) and (pointer: coarse) {
  a, button, input[type="submit"], input[type="button"], input[type="reset"],
  .sk-btn, .pulsante, .button-submit,
  .sk-mobile-summary__row,
  .sk-due-item, .sk-file-link {
    min-height: var(--sk-mobile-touch-target);
  }
  /* Tap area estesa per icone piccole (check, sort, close) */
  .sk-btn--icon {
    min-width: var(--sk-mobile-touch-target);
    min-height: var(--sk-mobile-touch-target);
  }
}


/* ── 53.8  PREFERS-REDUCED-MOTION (WCAG 2.3.3) ─────────────────────────────
   Disabilita tutte le animazioni e transizioni per utenti che richiedono
   riduzione movimento. Override globale, rispetta gia' quelle su SVG.         */

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  /* Preserva feedback di focus (utile anche con reduced motion) */
  *:focus-visible {
    transition: outline-color 0.01ms !important;
  }
  /* Gli indicatori restano visibili ma statici: il feedback di caricamento
     non deve reintrodurre movimento periodico quando l'utente lo riduce. */
  .spinner::before,
  .sk-sch-loading-overlay .sch-spin-icon,
  .sk-tab__spinner i,
  .sk-kb__loading i,
  .sk-upl-spin {
    animation: none !important;
  }
}


/* ── 53.9  ORIENTATION / LANDSCAPE ─────────────────────────────────────────
   Smartphone in landscape: viewport basso (~400px di altezza).
   Compattare header per non mangiare tutto il contenuto.                      */

@media (max-width: 926px) and (max-height: 480px) and (orientation: landscape) {
  :root {
    --header-h: 34px;  /* era 40px */
    --hr-bar-h: 28px;  /* era 34px */
  }
  .sk-page-toolbar {
    min-height: 40px;
    padding: 4px 10px;
  }
  .sk-mobile-drawer__head {
    padding: 8px 16px;
    min-height: 36px;
  }
}


/* ── 53.10  CSS CONTAINMENT + CONTENT-VISIBILITY (performance) ─────────────
   Utility classi che i developer possono aggiungere ai container per
   isolare il layout/paint e permettere al browser di saltare il rendering
   di elementi fuori viewport. Guadagno tipico 20-40% su pagine lunghe.       */

.sk-cv-auto {
  content-visibility: auto;
  /* contain-intrinsic-size: serve al browser per dimensionare l'elemento
     skippato. 500px e' un valore conservativo; il developer puo' override. */
  contain-intrinsic-size: auto 500px;
}
.sk-cv-auto-short {
  content-visibility: auto;
  contain-intrinsic-size: auto 200px;
}

/* Containment layout/style/paint per componenti isolati */
.sk-contain-layout  { contain: layout style; }
.sk-contain-paint   { contain: layout style paint; }

/* Applicato implicitamente a componenti ricorrenti per performance.
   (Nota: .sk-mobile-card usa gia' contain: layout style -- vedi sez. 53.2) */
.sk-home-chart-panel { contain: layout style; }


/* ── 53.11  DARK MODE - MOBILE KIT ─────────────────────────────────────────
   Override palette per i componenti mobile in dark mode. */

html[data-theme="dark"] .sk-mobile-card {
  background: var(--color-bg-white);
  border-color: var(--color-border);
}
html[data-theme="dark"] .sk-mobile-drawer {
  background: var(--color-bg-white);
}
html[data-theme="dark"] .sk-mobile-drawer__foot {
  background: var(--color-bg-main);
  border-top-color: var(--color-border);
}
html[data-theme="dark"] .sk-mobile-backdrop {
  background: rgba(0, 0, 0, 0.7);
}
html[data-theme="dark"] .sk-mobile-summary {
  background: var(--color-bg-white);
  border-color: var(--color-border);
}
html[data-theme="dark"] .sk-bottom-sheet::before {
  background: var(--color-border-dark);
}


/* ── 53.12  PRINT OVERRIDE (mobile components) ─────────────────────────────
   Drawer, FAB, backdrop, bottom sheet non devono comparire in stampa.         */

@media print {
  .sk-mobile-drawer,
  .sk-mobile-backdrop,
  .sk-mobile-fab,
  .sk-mobile-only { display: none !important; }
  .sk-desktop-only { display: initial !important; }
}


/* ==========================================================================
   54. CHECKLIST COMPILER (sk-ckl-*)  — mobile-first wizard
   ==========================================================================
   Libreria di componenti per la compilazione questionari/checklist
   (QuestionariGenerico_compilaTutto.xslt, canali 16.2.3.3.2, sostanze,
   nomine, DPI, critSafety, SOK). Namespace dedicato sk-ckl-* => nessuna
   collisione con altre pagine. Mobile-first; variante desktop >=1100px in
   coda alla sezione. Solo token della palette Canopo, dark-aware via token.
   ========================================================================== */

.sk-ckl{display:flex;flex-direction:column;min-height:100vh;background:var(--color-bg-main)}
.sk-ckl__main{flex:1 1 auto;min-height:0}

/* -- App bar sticky (titolo + progresso + stato) -- */
.sk-ckl-appbar{position:sticky;top:0;z-index:30;background:var(--color-bg-white);
  border-bottom:1px solid var(--color-border);box-shadow:var(--shadow-sm)}
.sk-ckl-appbar__row{display:flex;align-items:center;gap:10px;padding:8px 12px}
.sk-ckl-appbar__title{flex:1 1 auto;min-width:0;font-weight:700;color:var(--brand-primary);
  font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sk-ckl-appbar__title i{color:var(--brand-accent);margin-right:6px}
.sk-ckl-iconbtn{width:38px;height:38px;flex-shrink:0;border-radius:var(--radius-md);
  border:1px solid var(--color-border);background:var(--color-bg-white);
  color:var(--color-text-secondary);cursor:pointer;display:inline-flex;
  align-items:center;justify-content:center;font-size:16px}
.sk-ckl-iconbtn:hover{background:var(--color-bg-hover);color:var(--brand-primary)}

/* -- Barra di progresso obbligatorie -- */
.sk-ckl-progress{padding:0 12px 8px}
.sk-ckl-progress__meta{display:flex;justify-content:space-between;align-items:center;
  font-size:12px;color:var(--color-text-secondary);margin-bottom:4px}
.sk-ckl-progress__meta b{color:var(--brand-primary);font-variant-numeric:tabular-nums}
.sk-ckl-bar{height:6px;border-radius:var(--radius-full);background:var(--color-border-light);overflow:hidden}
.sk-ckl-bar__fill{height:100%;border-radius:var(--radius-full);width:0;
  background:linear-gradient(90deg,#34d399,var(--color-success));transition:width .3s ease}

/* -- Stepper sezioni (chip scroll orizzontale, mobile) -- */
.sk-ckl-steps{display:flex;gap:6px;overflow-x:auto;padding:8px 12px;
  border-top:1px solid var(--color-border-light);-ms-overflow-style:none;scrollbar-width:none}
.sk-ckl-steps::-webkit-scrollbar{display:none}
.sk-ckl-step{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;padding:7px 13px;
  border-radius:var(--radius-full);border:1px solid var(--color-border);background:var(--color-bg-white);
  font-size:12px;font-weight:600;color:var(--color-text-secondary);cursor:pointer;white-space:nowrap}
.sk-ckl-step--active{border-color:var(--brand-accent);color:var(--brand-primary);background:var(--color-bg-secondary)}
.sk-ckl-step__count{font-size:11px;font-weight:600;color:var(--color-text-light);font-variant-numeric:tabular-nums}
.sk-ckl-step__count:empty{display:none}
.sk-ckl-step__dot{width:8px;height:8px;border-radius:50%;background:var(--color-border-dark)}
.sk-ckl-step--done .sk-ckl-step__dot{background:var(--color-success)}
.sk-ckl-step--todo .sk-ckl-step__dot{background:var(--color-warning)}

/* -- Corpo scrollabile + titolo sezione -- */
.sk-ckl-body{padding:12px;padding-bottom:92px}
.sk-ckl-section{display:none}
.sk-ckl-section--active{display:block}
.sk-ckl-section__title{display:flex;align-items:center;gap:8px;margin:6px 2px 12px;
  font-size:14px;font-weight:700;color:var(--brand-primary)}
.sk-ckl-section__title i{color:var(--brand-accent)}

/* -- Card domanda -- */
.sk-ckl-q{background:var(--color-bg-white);border:1px solid var(--color-border);
  border-radius:var(--radius-md);box-shadow:var(--shadow-sm);padding:14px;margin-bottom:12px}
.sk-ckl-q--invalid{border-color:var(--color-error);box-shadow:0 0 0 3px rgba(239,68,68,.12)}
/* domanda obbligatoria: barra accent a sinistra (indicazione visiva forte) */
.sk-ckl-q[data-req="1"]{border-left:3px solid var(--color-warning)}
.sk-ckl-q--invalid[data-req="1"]{border-left-color:var(--color-error)}
.sk-ckl-q__txt{font-size:14px;font-weight:600;color:var(--color-text-primary);line-height:1.35}
.sk-ckl-q__req{color:var(--color-error);font-weight:700;margin-left:2px}
/* legenda obbligatorie nell'app bar */
.sk-ckl-legend{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--color-text-light)}
.sk-ckl-legend b{color:var(--color-error);font-weight:700}
/* campo data: larghezza contenuta (una data non serve larga) */
.sk-ckl-date{max-width:190px}
.sk-ckl-q__badges{display:flex;gap:6px;margin-top:8px;flex-wrap:wrap;align-items:center}
.sk-ckl-info{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;
  color:var(--brand-primary);background:none;border:none;cursor:pointer;padding:0}
.sk-ckl-q__err{margin-top:10px;font-size:12px;color:var(--color-error);
  align-items:center;gap:6px;display:none}
.sk-ckl-q--invalid .sk-ckl-q__err{display:flex}

/* -- Opzioni come righe grandi (tap target >=48px, WCAG) -- */
.sk-ckl-opts{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.sk-ckl-opt{display:flex;align-items:center;gap:12px;min-height:48px;padding:10px 12px;
  border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-white);
  cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}
.sk-ckl-opt:hover{background:var(--color-bg-hover)}
.sk-ckl-opt--sel{border-color:var(--brand-accent);background:var(--color-bg-secondary)}
.sk-ckl-opt__mark{width:22px;height:22px;flex-shrink:0;border-radius:50%;
  border:2px solid var(--color-border-dark);display:inline-flex;align-items:center;
  justify-content:center;color:#fff;font-size:12px;line-height:1}
.sk-ckl-opt--check .sk-ckl-opt__mark{border-radius:6px}
.sk-ckl-opt--sel .sk-ckl-opt__mark{background:var(--brand-accent);border-color:var(--brand-accent)}
.sk-ckl-opt__mark i{opacity:0}
.sk-ckl-opt--sel .sk-ckl-opt__mark i{opacity:1}
.sk-ckl-opt__txt{flex:1 1 auto;font-size:14px;color:var(--color-text-primary)}
/* input nativo nascosto ma accessibile: la label .sk-ckl-opt lo pilota */
.sk-ckl-opt input{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}
.sk-ckl-opt input:focus-visible + .sk-ckl-opt__mark{box-shadow:0 0 0 3px rgba(40,68,115,.3)}

/* -- Chip allegati inline sulla risposta -- */
.sk-ckl-attchip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;
  border-radius:var(--radius-full);border:1px dashed var(--color-border-dark);
  background:var(--color-bg-white);font-size:12px;color:var(--color-text-secondary);cursor:pointer}
.sk-ckl-attchip--has{border-style:solid;border-color:var(--brand-accent);color:var(--brand-primary);font-weight:600}
.sk-ckl-attchip--req{border-color:var(--color-error);color:var(--color-error);font-weight:600}

/* -- Nota collassabile -- */
.sk-ckl-note{margin-top:12px}
.sk-ckl-note summary{cursor:pointer;font-size:12px;color:var(--brand-primary);font-weight:600;list-style:none}
.sk-ckl-note summary::-webkit-details-marker{display:none}
.sk-ckl-note textarea{margin-top:8px;width:100%;box-sizing:border-box}

/* -- Barra azioni sticky in basso (mobile: wizard nav + salva) -- */
.sk-ckl-actionbar{position:fixed;left:0;right:0;bottom:0;z-index:30;background:var(--color-bg-white);
  border-top:1px solid var(--color-border);box-shadow:0 -2px 8px rgba(0,0,0,.06);
  display:flex;align-items:center;gap:10px;padding:10px 12px}
.sk-ckl-actionbar__hint{flex:1 1 auto;min-width:0;font-size:12px;color:var(--color-text-secondary)}

/* -- Drawer allegati (bottom sheet) -- */
.sk-ckl-drawer{position:fixed;inset:0;z-index:1200;display:none}
.sk-ckl-drawer--open{display:block}
.sk-ckl-drawer__scrim{position:absolute;inset:0;background:rgba(15,23,42,.45)}
.sk-ckl-drawer__panel{position:absolute;left:0;right:0;bottom:0;background:var(--color-bg-white);
  border-radius:16px 16px 0 0;max-height:82vh;overflow:auto;padding:16px;animation:skCklUp .22s ease}
@keyframes skCklUp{from{transform:translateY(100%)}to{transform:translateY(0)}}
.sk-ckl-drawer__head{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.sk-ckl-drawer__head b{flex:1 1 auto;color:var(--brand-primary);font-size:14px}

/* -- Variante READ-ONLY (pagina Conclusioni): risposte scelte, note, warning -- */
.sk-ckl-ans{display:flex;align-items:flex-start;gap:10px;padding:8px 12px;margin-top:6px;
  border:1px solid var(--color-border);border-left:3px solid var(--color-success);
  border-radius:var(--radius-md);background:var(--color-bg-white)}
.sk-ckl-ans__chk{color:var(--color-success);flex-shrink:0;margin-top:2px}
.sk-ckl-ans__txt{flex:1 1 auto;font-size:14px;color:var(--color-text-primary)}
.sk-ckl-note-ro{display:block;margin-top:6px;font-size:12px;color:var(--color-text-secondary);line-height:1.4}
.sk-ckl-note-ro b{color:var(--color-text-primary);font-weight:600}
.sk-ckl-warn-ro{margin-top:6px;font-size:12px;color:var(--color-error);
  display:flex;align-items:flex-start;gap:6px}
.sk-ckl-empty-ro{font-size:12px;color:var(--color-text-light);font-style:italic;margin-top:4px}

/* -- Navigatore laterale (solo desktop ampio) -- */
.sk-ckl-toc{display:none}

/* ── 54.1  VARIANTE DESKTOP AMPIA (opt-in) >=1100px ── */
@media (min-width:1100px){
  /* width:100% evita che margin:auto disabiliti lo stretch quando .sk-ckl__inner
     e' figlio flex di .sk-ckl (altrimenti si restringe al contenuto).
     Nessun max-width: la pagina usa tutta la larghezza disponibile. */
  .sk-ckl__inner{width:100%}
  .sk-ckl-steps{display:none}
  .sk-ckl-actionbar{position:sticky;bottom:0}
  .sk-ckl-main-grid{display:grid;grid-template-columns:280px 1fr;gap:22px;align-items:start;padding:18px}
  .sk-ckl-toc{display:block;position:sticky;top:128px;background:var(--color-bg-white);
    border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);overflow:hidden}
  .sk-ckl-toc__hd{padding:10px 14px;font-size:11px;font-weight:700;letter-spacing:.04em;
    text-transform:uppercase;color:var(--color-text-light);border-bottom:1px solid var(--color-border-light)}
  .sk-ckl-toc__item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;
    border-left:3px solid transparent;font-size:13px;color:var(--color-text-secondary)}
  .sk-ckl-toc__item:hover{background:var(--color-bg-hover)}
  .sk-ckl-toc__item--active{border-left-color:var(--brand-accent);background:var(--color-bg-secondary);
    color:var(--brand-primary);font-weight:600}
  .sk-ckl-toc__dot{width:9px;height:9px;border-radius:50%;background:var(--color-border-dark);flex-shrink:0}
  .sk-ckl-toc__item--done .sk-ckl-toc__dot{background:var(--color-success)}
  .sk-ckl-toc__item--todo .sk-ckl-toc__dot{background:var(--color-warning)}
  .sk-ckl-toc__label{flex:1 1 auto}
  .sk-ckl-toc__count{font-size:11px;color:var(--color-text-light);font-variant-numeric:tabular-nums}
  .sk-ckl-body{padding:2px}
  .sk-ckl-qgrid{display:grid;grid-template-columns:1fr;gap:12px}
}
@media (min-width:1500px){
  .sk-ckl-qgrid{grid-template-columns:1fr 1fr}
  .sk-ckl-q--full{grid-column:1 / -1}
}

/* ==========================================================================
   Sierologia > Configurazione > Algoritmi stato immunitario (canale 6.90.6)
   Tabelle-lista editabili dentro card (patologia/algoritmo, esito/stato,
   marker del simulatore). Riusabile per liste-config compatte in .gruppo1.
   Solo variabili del design system: coerente e dark-aware.
   ========================================================================== */
.sk-cfg-panel    { padding: 14px 16px; }
.sk-cfg-table    { width: 100%; border-collapse: collapse; }
.sk-cfg-table th { text-align: left; padding: 8px 10px; font-weight: 600;
                   color: var(--color-text-secondary); font-size: var(--font-size-sm);
                   border-bottom: 2px solid var(--color-border-dark); white-space: nowrap; }
.sk-cfg-table td { padding: 6px 10px; border-bottom: 1px solid var(--color-border);
                   vertical-align: middle; }
.sk-cfg-table tbody tr:hover td { background: var(--color-bg-hover); }
.sk-cfg-table .input { width: 100%; }
.sk-cfg-table code   { font-size: var(--font-size-sm); color: var(--color-text-primary); }
.sk-cfg-col-fam   { width: 120px; }
.sk-cfg-col-algo  { width: 340px; }
.sk-cfg-col-esito { width: 240px; }
.sk-cfg-col-mode  { width: 210px; }
.sk-cfg-col-val   { width: 170px; }
.sk-cfg-actions   { margin-top: 14px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }

/* ==========================================================================
   SkGridCardView (sk-grid-card-view.js) - vista a card responsive per
   SkGridKit. Sotto il breakpoint la griglia dhx viene nascosta e le righe
   sono rese come card touch-friendly. Opt-in per pagina (config.cardView).
   Solo variabili del design system: coerente e dark-aware.
   ========================================================================== */
.sk-gcv-grid-hidden { display: none !important; }

.sk-gcv-container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 12px;
  align-content: start;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  /* v1.2.1: 12px orizzontale (prima 2px) - le card respiravano appoggiate
     quasi al bordo schermo su mobile; margine coerente col gap tra card. */
  padding: 10px 12px;
  box-sizing: border-box;
}
.sk-gcv-container[hidden] { display: none !important; }

/* live region per screen reader (conteggio schede) */
.sk-gcv-sr {
  position: absolute; width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  clip: rect(0 0 0 0); overflow: hidden; white-space: nowrap;
}

.sk-gcv-card {
  background: var(--color-bg-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-xs);
  /* NIENTE overflow:hidden: su grid item azzera l'automatic minimum size
     e in shell annidate (es. skGridWrapper Aldebaran) collassa la card a 0 */
  transition: box-shadow .15s ease, border-color .15s ease;
}
.sk-gcv-card:hover { box-shadow: var(--shadow-sm); }
/* v1.2.1: blu (--color-info), non l'arancio del brand. --color-info
   combacia esattamente con --dhx-s-grid-selection-border della grid dhx
   nativa in entrambi i temi (#3B82F6 chiaro, #60A5FA scuro): la card
   "selezionata" deve leggersi come lo stesso concetto della riga
   selezionata in griglia su desktop, non un colore diverso. Libera anche
   l'arancio per il SOLO significato "checkbox spuntata" (v1.2.0), che
   prima usava lo stesso colore creando ambiguita' tra i due concetti. */
.sk-gcv-card--selected {
  border-color: var(--color-info);
  box-shadow: 0 0 0 1px var(--color-info), var(--shadow-sm);
}

/* ── v1.2.0: card con checkbox (grid con SkGridKit.colCheck) ──────────────
   Layout a due zone: checkbox a sinistra (larghezza fissa, separatore),
   corpo cliccabile (title/badge/campi/azioni) a destra via .sk-gcv-card-body.
   --checked e' un concetto DIVERSO da --selected: selected = ultima card
   toccata (sync col dettaglio, una sola alla volta); checked = selezione
   multipla per azioni bulk (tante insieme). Le due possono coesistere:
   la regola combinata sotto le rende leggibili entrambe insieme. */
.sk-gcv-card--checkable {
  display: flex;
  align-items: stretch;
}
.sk-gcv-card--checkable > .sk-gcv-card-body {
  flex: 1;
  min-width: 0;
}
.sk-gcv-card--checked {
  background: var(--color-bg-secondary);
  box-shadow: inset 3px 0 0 var(--brand-accent), var(--shadow-xs);
}
.sk-gcv-card--checked:hover { box-shadow: inset 3px 0 0 var(--brand-accent), var(--shadow-sm); }
.sk-gcv-card--selected.sk-gcv-card--checked {
  box-shadow: 0 0 0 1px var(--color-info), inset 3px 0 0 var(--brand-accent), var(--shadow-sm);
}

/* Checkbox: touch target 44px, "casella" visiva 22px centrata via ::before,
   spunta FontAwesome animata con easing "a molla" (pop delicato, non un
   semplice fade) per un feedback tattile gradevole. */
.sk-gcv-check {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  min-height: 44px;
  position: relative;
  cursor: pointer;
}
.sk-gcv-card--checkable > .sk-gcv-check {
  border-right: 1px solid var(--color-border-light);
}
.sk-gcv-check::before {
  content: "";
  width: 22px;
  height: 22px;
  box-sizing: border-box;
  border-radius: 7px;
  border: 2px solid var(--color-border-dark);
  background: var(--color-bg-white);
  transition: background .15s ease, border-color .15s ease, transform .1s ease;
}
.sk-gcv-check:hover::before { border-color: var(--brand-accent); }
.sk-gcv-check:active::before { transform: scale(.9); }
.sk-gcv-check:focus-visible::before {
  outline: 2px solid var(--input-focus);
  outline-offset: 2px;
}
.sk-gcv-check i {
  position: absolute;
  top: 50%;
  left: 50%;
  color: var(--brand-white);
  font-size: 12px;
  opacity: 0;
  transform: translate(-50%, -50%) scale(.4);
  transition: opacity .15s ease, transform .2s cubic-bezier(.34, 1.56, .64, 1);
  pointer-events: none;
}
.sk-gcv-check--on::before {
  background: var(--brand-accent);
  border-color: var(--brand-accent);
}
.sk-gcv-check--on i {
  opacity: 1;
  transform: translate(-50%, -50%) scale(1);
}

.sk-gcv-card-main {
  display: block;
  /* v1.2.1: 14px/16px (prima 12/14) - respiro coerente con la scala
     tipografica leggermente piu' generosa qui sotto (titolo 15px). */
  padding: 14px 16px;
  cursor: pointer;
  transition: background-color .1s ease;
}
.sk-gcv-card-main:focus-visible {
  outline: 2px solid var(--input-focus);
  outline-offset: -2px;
  border-radius: var(--radius-lg);
}
/* v1.2.1: feedback tattile al tocco - su touch non esiste hover reale,
   senza questo la card non da' alcun riscontro visivo mentre si preme. */
.sk-gcv-card-main:active { background-color: var(--color-bg-hover); }

.sk-gcv-card-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 8px;
}
/* v1.2.1: 15px (prima --font-size-base, 13px) - il titolo e' l'ancora
   visiva principale della card, va distinto piu' nettamente dal resto
   del testo (che condivide gia' 11-13px altrove nella card). */
.sk-gcv-title {
  font-weight: 600;
  font-size: 15px;
  color: var(--color-text-primary);
  line-height: 1.35;
  word-break: break-word;
}
.sk-gcv-subtitle {
  margin-top: 3px;
  font-size: 12.5px;
  color: var(--color-text-secondary);
  word-break: break-word;
}

.sk-gcv-badges { display: flex; flex-wrap: wrap; gap: 4px; flex-shrink: 0; }
.sk-gcv-badge {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: var(--font-size-xs);
  font-weight: 600;
  line-height: 1.5;
  background: var(--color-icon-bg);
  color: var(--color-text-secondary);
  white-space: nowrap;
}
.sk-gcv-badge--success { background: var(--color-success-light); color: var(--color-success-text); }
.sk-gcv-badge--warning { background: var(--color-warning-light); color: var(--color-warning-text); }
.sk-gcv-badge--danger  { background: var(--color-error-light);   color: var(--color-error-text); }
.sk-gcv-badge--error   { background: var(--color-error-light);   color: var(--color-error-text); }
.sk-gcv-badge--info    { background: var(--color-info-light);    color: var(--color-info-text); }
.sk-gcv-badge--accent  { background: var(--color-icon-bg);       color: var(--color-accent-text); }
.sk-gcv-badge--muted   { background: var(--color-bg-secondary);  color: var(--color-text-light); }

/* v1.2.1: due colonne allineate (label si auto-dimensiona al contenuto
   PIU' LUNGO tra tutte le righe della card, invece di una percentuale
   fissa 38% che sprecava spazio con label corte tipo "CF" e rischiava
   di stringere quelle lunghe). .sk-gcv-field passa a display:contents:
   il wrapper per-riga resta nel markup (serve alla logica hideEmpty in
   sk-grid-card-view.js) ma sparisce dal layout, cosi' le sue due span
   diventano celle dirette della stessa griglia a 2 colonne. */
.sk-gcv-fields {
  margin-top: 8px;
  display: grid;
  grid-template-columns: minmax(0, max-content) 1fr;
  column-gap: 10px;
  row-gap: 6px;
}
.sk-gcv-field { display: contents; }
/* v1.2.2: FIX - un max-width IN PERCENTUALE su un item dentro una colonna
   max-content si risolve durante il passo di sizing intrinseco (quando la
   larghezza disponibile non e' ancora determinata) e collassa la colonna
   a un valore quasi arbitrario (verificato: 25px invece di ~55px, testo
   troncato su OGNI label). Anche min(45%, max-content) nella traccia si
   comporta in modo inconsistente per lo stesso motivo (le keyword
   intrinseche dentro funzioni matematiche non partecipano correttamente
   ai passi min-content\max-content dell'algoritmo grid). Un cap in PX
   FISSI sull'item invece funziona sempre, perche' non richiede di
   risolvere una percentuale durante il sizing intrinseco. */
.sk-gcv-field-label {
  max-width: 150px;
  color: var(--color-text-light);
  font-size: 12px;
  line-height: 1.5;
}
.sk-gcv-field-label i { color: var(--brand-accent); margin-right: 3px; font-size: 10px; }
.sk-gcv-field-value {
  color: var(--color-text-primary);
  font-weight: 500;
  font-size: 13px;
  line-height: 1.5;
  word-break: break-word;
}

.sk-gcv-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 8px 14px;
  border-top: 1px solid var(--color-border-light);
  background: var(--color-bg-main);
  border-radius: 0 0 var(--radius-lg) var(--radius-lg);
}
.sk-gcv-action {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 36px;
  padding: 6px 12px;
  border: 1px solid var(--color-border-dark);
  border-radius: var(--radius-md);
  background: var(--color-bg-white);
  color: var(--color-text-primary);
  font-family: var(--font-base);
  font-size: var(--font-size-sm);
  font-weight: 600;
  cursor: pointer;
}
.sk-gcv-action:hover { background: var(--color-bg-hover); border-color: var(--input-border); }
.sk-gcv-action:focus-visible { outline: 2px solid var(--input-focus); outline-offset: 1px; }
.sk-gcv-action i { color: var(--brand-accent); }

/* v1.2.1: bordo pieno (il tratteggiato in questo design system legge
   convenzionalmente come "dropzone/aggiungi", fuorviante per un'azione di
   caricamento); contenuto centrato (prima allineato a sinistra di default
   in un box grid-column:1/-1, sembrava un refuso); min-height 44px per
   coerenza col target di tocco usato ovunque nella card view. */
.sk-gcv-more {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 44px;
  margin-top: 2px;
  padding: 8px 12px;
  border: 1px solid var(--color-border-dark);
  border-radius: var(--radius-md);
  background: var(--color-bg-white);
  color: var(--color-text-secondary);
  font-family: var(--font-base);
  font-size: var(--font-size-sm);
  font-weight: 600;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.sk-gcv-more:hover { background: var(--color-bg-hover); color: var(--color-text-primary); border-color: var(--brand-accent); }
.sk-gcv-more:focus-visible { outline: 2px solid var(--input-focus); outline-offset: 1px; }
.sk-gcv-more i { color: var(--brand-accent); font-size: 11px; }

/* v1.2.1: icona in chip circolare soffusa (prima fluttuava nuda sopra il
   testo) - stesso trattamento --color-icon-bg gia' usato per i badge,
   coerenza visiva col resto della card. */
.sk-gcv-empty {
  grid-column: 1 / -1;
  padding: 48px 20px;
  text-align: center;
  color: var(--color-text-light);
  font-size: var(--font-size-base);
}
.sk-gcv-empty i {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  margin: 0 auto 14px;
  border-radius: 50%;
  background: var(--color-icon-bg);
  font-size: 22px;
  color: var(--color-text-light);
}

/* ── v1.2.0: barra bulk (riepilogo + seleziona/deseleziona tutte) ─────────
   Sticky in cima allo scroll delle card (il container e' gia' l'unico
   overflow-y:auto, quindi top:0 aggancia esattamente al bordo superiore
   della lista, non del viewport). Stato neutro quando 0 selezionate,
   accento pieno (bordo + badge colorato) quando c'e' una selezione attiva:
   colpo d'occhio immediato sullo stato bulk mentre si scorre. */
.sk-gcv-bulkbar {
  grid-column: 1 / -1;
  position: sticky;
  top: 0;
  z-index: 5;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  min-height: 44px;
  padding: 6px 12px;
  margin-bottom: 2px;
  background: var(--color-bg-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
  font-family: var(--font-base);
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  transition: background .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.sk-gcv-bulkbar--active {
  background: var(--color-bg-secondary);
  border-color: var(--brand-accent);
  box-shadow: var(--shadow-sm);
  color: var(--color-text-primary);
}
.sk-gcv-bulk-all {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font-weight: 600;
  user-select: none;
}
/* checkbox piu' compatta qui: la barra ha gia' spaziatura/altezza propria,
   l'intera label (checkbox+testo) resta l'area cliccabile per il target
   touch, non serve ripetere i 44px della checkbox di card. */
.sk-gcv-bulk-all .sk-gcv-check { width: 32px; min-height: 32px; }
.sk-gcv-bulk-toggle { white-space: nowrap; }
.sk-gcv-bulk-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 22px;
  padding: 2px 10px;
  border-radius: 999px;
  background: var(--color-icon-bg);
  color: var(--color-text-secondary);
  font-weight: 700;
  font-size: var(--font-size-xs);
  transition: background .15s ease, color .15s ease;
}
.sk-gcv-bulkbar--active .sk-gcv-bulk-count {
  background: var(--brand-accent);
  color: var(--brand-white);
}

/* ================================================================
   SCADENZARIO ACCERTAMENTI - CONTROL TOWER ENTERPRISE
   Scope limitato al canale Orione 3.2.13.
   ================================================================ */
.sk-acc-filter-panel {
  margin-bottom: 8px;
  padding: 10px 12px;
}
.sk-acc-filter-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(150px, 1fr));
  gap: 8px 12px;
}
.sk-acc-filter-grid .sk-field,
.sk-acc-filter-grid .sk-date-wrap,
.sk-acc-filter-grid .input {
  min-width: 0;
  width: 100%;
}
.sk-acc-kpi-strip {
  padding: 0 0 8px;
}
button.sk-acc-kpi {
  appearance: none;
  font-family: var(--font-base);
  text-align: left;
}
button.sk-acc-kpi:hover {
  cursor: pointer;
}
button.sk-acc-kpi.is-active {
  background: var(--color-bg-secondary);
  border-color: var(--brand-primary);
  box-shadow: 0 0 0 2px var(--color-bg-light);
}
button.sk-acc-kpi:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: 2px;
}
.sk-acc-bulkbar {
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  min-height: 42px;
  padding: 6px 10px;
  margin-bottom: 6px;
  background: var(--color-bg-secondary);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  color: var(--color-text-primary);
}
.sk-acc-bulkbar > strong {
  color: var(--brand-primary);
}
.sk-acc-bulkbar__actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: 4px;
}
@media (max-width: 1050px) {
  .sk-acc-filter-grid { grid-template-columns: repeat(2, minmax(150px, 1fr)); }
}
@media (max-width: 640px) {
  .sk-acc-filter-grid { grid-template-columns: 1fr; }
  .sk-acc-bulkbar,
  .sk-acc-bulkbar__actions { align-items: stretch; flex-direction: column; }
  .sk-acc-bulkbar__actions .sk-btn { justify-content: center; }
}


/* ==========================================================================
   SkTreeKit - albero a rendering proprio (Common/components/sk-tree-kit.js)
   Sorgente rivedibile del blocco: Common/components/sk-tree-kit.css
   Doc: docs/tecnica/components/tree/readme.md
   ========================================================================== */
/* ============================================================================
 * sk-tree-kit.css  -  stili del componente SkTreeKit
 * ----------------------------------------------------------------------------
 * Namespace unico: .sk-tv*  ->  nessuna collisione con il resto di default.css.
 * Usa SOLO i token della palette Canopo gia' definiti in default.css
 * (--brand-*, --color-*, --radius-*, --shadow-*, --font-*): nessun colore
 * hardcoded, nessun px di brand.
 *
 * INTEGRAZIONE: al momento del rilascio questo blocco va incollato in
 * Common/css/default.css (convenzione del progetto: un solo foglio). Il file
 * resta qui come sorgente rivedibile e diffabile del componente.
 * ========================================================================== */

/* ---------------------------------------------------------------- guscio */
.sk-tv{
  position:relative;
  display:flex;
  flex-direction:column;
  min-height:0;
  height:100%;
  /* l'host non deve mai spingere il layout esterno */
  overflow:hidden;
  --sk-tv-indent:18px;
  --sk-tv-rail:2px;
}
.sk-tv__scroll{
  flex:1 1 auto;
  min-height:0;
  overflow:auto;
  outline:none;
  scrollbar-width:thin;
  scroll-behavior:auto;
}
.sk-tv__scroll:focus-visible{
  box-shadow:inset 0 0 0 2px var(--brand-primary);
  border-radius:var(--radius-sm);
}
.sk-tv__sizer{position:relative;width:100%}
.sk-tv__rows{position:absolute;top:0;left:0;right:0;will-change:transform}

/* ------------------------------------------------------------------ riga */
.sk-tv__row{
  display:flex;
  align-items:center;
  gap:6px;
  padding-right:8px;
  border-radius:var(--radius-sm);
  cursor:pointer;
  user-select:none;
  position:relative;
  box-sizing:border-box;
  border-left:var(--sk-tv-rail) solid transparent;
  transition:background-color .12s ease, box-shadow .12s ease;
}
.sk-tv__row:hover{background:var(--color-bg-hover)}

/* selezione: fascia piena + binario accento a sinistra */
.sk-tv__row.is-selected{
  background:var(--color-bg-light);
  border-left-color:var(--brand-accent);
  font-weight:600;
  color:var(--brand-primary);
}
.sk-tv__row.is-selected:hover{background:var(--color-bg-light)}

/* nodo con il focus da tastiera: anello, indipendente dalla selezione */
.sk-tv__row.is-active{box-shadow:inset 0 0 0 2px rgba(40,68,115,.35)}
.sk-tv__row.is-selected.is-active{box-shadow:inset 0 0 0 2px var(--brand-primary)}

.sk-tv__row.is-disabled{opacity:.5;cursor:default}
.sk-tv__row.is-disabled:hover{background:transparent}

/* ------------------------------------------------- guide di indentazione */
.sk-tv__guide{
  flex:0 0 var(--sk-tv-indent);
  width:var(--sk-tv-indent);
  align-self:stretch;
  position:relative;
}
.sk-tv--guides .sk-tv__guide::before{
  content:"";
  position:absolute;
  left:50%;
  top:0;bottom:0;
  border-left:1px solid var(--color-border-light);
}
.sk-tv__row:hover .sk-tv__guide::before{border-left-color:var(--color-border)}
.sk-tv__pad{flex:0 0 auto}

/* ----------------------------------------------------------------- caret */
.sk-tv__caret{
  flex:0 0 18px;
  width:18px;height:18px;
  display:flex;align-items:center;justify-content:center;
  border:0;background:transparent;padding:0;margin:0;
  color:var(--color-text-light);
  font-size:10px;
  cursor:pointer;
  border-radius:var(--radius-sm);
  transition:color .12s, background-color .12s;
}
.sk-tv__caret:hover{color:var(--brand-primary);background:rgba(40,68,115,.08)}
.sk-tv__caret.is-leaf{visibility:hidden;pointer-events:none}
.sk-tv__caret.is-loading{color:var(--brand-accent)}

/* -------------------------------------------------------------- checkbox */
.sk-tv__chk{
  flex:0 0 15px;
  width:15px;height:15px;
  display:flex;align-items:center;justify-content:center;
  border:1px solid var(--input-border);
  border-radius:3px;
  background:var(--color-bg-white);
  color:transparent;
  font-size:9px;
  transition:all .12s;
}
.sk-tv__chk:hover{border-color:var(--brand-primary)}
.sk-tv__chk.is-on{background:var(--brand-primary);border-color:var(--brand-primary);color:#fff}
.sk-tv__chk.is-part{background:var(--brand-primary-light);border-color:var(--brand-primary-light);color:#fff}

/* --------------------------------------------------------- pallino stato */
.sk-tv__dot{
  flex:0 0 8px;
  width:8px;height:8px;
  border-radius:50%;
  box-shadow:0 0 0 2px var(--color-bg-white);
}

/* ----------------------------------------------------------------- icona */
.sk-tv__ico{
  flex:0 0 16px;
  width:16px;
  text-align:center;
  font-size:12px;
  color:var(--color-text-secondary);
}
.sk-tv__ico.tone-primary{color:var(--brand-primary)}
.sk-tv__ico.tone-accent {color:var(--brand-accent-dark)}
.sk-tv__ico.tone-info   {color:var(--color-info,#0EA5E9)}
.sk-tv__ico.tone-muted  {color:var(--color-text-light)}
.sk-tv__ico.tone-warning{color:var(--color-warning)}
.sk-tv__ico.tone-danger {color:var(--color-error)}

/* ------------------------------------------------------------- etichetta */
.sk-tv__text{
  flex:1 1 auto;
  min-width:0;
  display:flex;
  flex-direction:column;
  justify-content:center;
  line-height:1.25;
}
.sk-tv__lbl{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.sk-tv__lbl mark{
  background:var(--color-bg-highlight,#FEF3C7);
  color:inherit;
  padding:0 1px;
  border-radius:2px;
}
.sk-tv__meta{
  font-size:var(--font-size-sm);
  font-weight:400;
  color:var(--color-text-light);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

/* ---------------------------------------------------- marcatori e badge */
.sk-tv__hit{
  flex:0 0 auto;
  font-size:9px;
  color:var(--brand-accent-dark);
}
.sk-tv__deco{
  flex:0 0 auto;
  font-size:10px;
  color:var(--color-text-light);
}
.sk-tv__deco.tone-warning{color:var(--color-warning)}
.sk-tv__deco.tone-danger {color:var(--color-error)}
.sk-tv__deco.tone-accent {color:var(--brand-accent-dark)}

.sk-tv__badge{
  flex:0 0 auto;
  min-width:24px;
  padding:2px 8px;
  text-align:center;
  font-size:var(--font-size-sm);
  font-weight:600;
  color:var(--color-text-secondary);
  background:var(--color-border-light);
  border-radius:var(--radius-full);
  transition:background-color .12s, color .12s;
}
.sk-tv__row.is-selected .sk-tv__badge{background:var(--brand-primary);color:var(--brand-white)}
.sk-tv__badge.tone-muted{background:transparent;color:var(--color-text-light);font-weight:400}
.sk-tv__badge.tone-accent{background:var(--brand-accent);color:var(--brand-white)}
.sk-tv__badge.tone-warning{background:#FDE68A;color:#92400E}

/* -------------------------------------------- separatore dei nodi pinnati */
.sk-tv__sep{
  display:flex;
  align-items:center;
  gap:8px;
  padding:0 8px;
  font-size:10px;
  font-weight:600;
  letter-spacing:.4px;
  text-transform:uppercase;
  color:var(--color-text-light);
}
.sk-tv__sep::before,
.sk-tv__sep::after{
  content:"";
  flex:1 1 auto;
  height:1px;
  background:var(--color-border-light);
}
.sk-tv__sep span{flex:0 0 auto}

/* righe di anomalia: si distinguono senza urlare */
.sk-tv__row.sk-tv--anomaly{
  background:var(--color-bg-warning-soft,#FFFBEB);
  border-left-color:var(--color-warning);
}
.sk-tv__row.sk-tv--anomaly:hover{background:#FEF6DC}
.sk-tv__row.sk-tv--anomaly.is-selected{
  background:#FDECC8;
  border-left-color:var(--brand-accent-dark);
}

/* ------------------------------------------------------------ stati vuoti */
.sk-tv__state{
  position:absolute;
  inset:0;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:8px;
  text-align:center;
  padding:24px 16px;
  color:var(--color-text-light);
  background:var(--color-bg-white);
  pointer-events:none;
}
.sk-tv__state[hidden]{display:none}
.sk-tv__state i{font-size:28px;color:var(--color-border-dark)}
.sk-tv__state b{font-size:13px;color:var(--color-text-secondary)}
.sk-tv__state p{margin:0;font-size:var(--font-size-sm);max-width:320px;line-height:1.5}

/* ------------------------------------------------------------- densita' */
.sk-tv--compact .sk-tv__row{font-size:var(--font-size-base)}
.sk-tv--cozy    .sk-tv__row{font-size:var(--font-size-base)}
.sk-tv--cozy    .sk-tv__ico{font-size:13px}

/* ----------------------------------------------------------- dark mode */
@media (prefers-color-scheme: dark){
  .sk-tv__chk{background:transparent}
  .sk-tv__dot{box-shadow:0 0 0 2px var(--color-bg-card)}
}
[data-dhx-theme="dark"] .sk-tv__chk{background:transparent}
[data-dhx-theme="dark"] .sk-tv__dot{box-shadow:0 0 0 2px var(--color-bg-card)}
[data-dhx-theme="dark"] .sk-tv__state{background:var(--color-bg-card)}

/* --------------------------------------------------- riduzione movimento */
@media (prefers-reduced-motion: reduce){
  .sk-tv__row,.sk-tv__caret,.sk-tv__chk,.sk-tv__badge{transition:none}
}


/* ==========================================================================
   Mappa dei gruppi omogenei (canale 2.8.25) - GruppiOmogenei/gruppiomogenei_mappa.xslt
   Namespace .sk-gromap* + .sk-lens. L'albero usa .sk-tv* di SkTreeKit.
   ========================================================================== */

/* Altezza calcolata a runtime (MAPPA.fitLayout), non con un 100vh cablato:
   sopra la pagina ci sono header applicativo e due livelli di menu, la cui
   altezza cambia con la larghezza della finestra. Da qui in giu' e' una
   catena flex vincolata: wrapper -> colonna -> gruppo1 -> albero/lista.
   Ogni anello ha min-height:0, senza il quale un figlio flex non scende
   MAI sotto la propria altezza di contenuto e lo scroll finisce sulla pagina. */
.sk-gromap-wrap { position: relative; min-height: 320px; overflow: hidden; }
/* Le colonne e i pannelli devono essere contenitori flex, altrimenti il
   'flex:1 1 auto' dell'albero e della lista non ha un contesto in cui agire e
   l'altezza collassa a contenuto: e' esattamente cosi' che l'albero sfondava
   la pagina. .gruppo1 di base e' un blocco e NON va cambiato globalmente. */
.sk-gromap-wrap > div { display: flex; min-height: 0; }
.sk-gromap-wrap > div > .gruppo1 {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100%;
  min-height: 0;
}

.sk-gromap-tree { flex: 1 1 auto; min-height: 0; }

@media (max-width: 900px) {
  .sk-gromap-wrap { height: auto !important; overflow: visible; }
  .sk-gromap-wrap > div > .gruppo1 { height: auto; }
  .sk-gromap-tree { height: 44vh; }
  .sk-gromap-list { max-height: 60vh; }
}

/* --- selettore della chiave di lettura --- */
.sk-lens {
  display: inline-flex;
  background: var(--color-bg-main);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-full);
  padding: 3px;
  gap: 2px;
}
.sk-lens button {
  border: 0;
  background: transparent;
  font-family: inherit;
  font-size: var(--font-size-sm);
  font-weight: 600;
  color: var(--color-text-secondary);
  padding: 6px 14px;
  border-radius: var(--radius-full);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  transition: all var(--transition-fast);
}
.sk-lens button:hover { color: var(--brand-primary); }
.sk-lens button[aria-pressed="true"] {
  background: var(--brand-primary);
  color: var(--brand-white);
  box-shadow: var(--shadow-xs);
}
.sk-lens button:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(40,68,115,.25); }

/* --- filtro collocazione --- */
.sk-gromap-filter {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
}
.sk-gromap-filter select {
  height: 32px;
  max-width: 200px;
  padding: 0 8px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg-white);
  font-family: inherit;
  font-size: var(--font-size-sm);
  color: var(--color-text-primary);
}
.sk-gromap-filter select:focus { outline: none; border-color: var(--brand-primary); box-shadow: 0 0 0 3px rgba(40,68,115,.12); }

/* --- ricerca --- */
.sk-gromap-search { position: relative; flex: 0 1 280px; min-width: 170px; }
.sk-gromap-search input {
  width: 100%;
  height: 32px;
  padding: 0 30px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  font-family: inherit;
  font-size: var(--font-size-sm);
  background: var(--color-bg-white);
  color: var(--color-text-primary);
}
.sk-gromap-search input:focus { outline: none; border-color: var(--brand-primary); box-shadow: 0 0 0 3px rgba(40,68,115,.12); }
.sk-gromap-search .fa-magnifying-glass { position: absolute; left: 10px; top: 9px; font-size: 11px; color: var(--color-text-light); }
.sk-gromap-search__clear {
  position: absolute; right: 6px; top: 5px;
  border: 0; background: transparent; cursor: pointer;
  color: var(--color-text-light); padding: 4px; display: none;
}
.sk-gromap-search.has-value .sk-gromap-search__clear { display: block; }

/* --- barra sopra l'albero --- */
.sk-gromap-treebar { display: flex; gap: 4px; margin-bottom: 6px; flex-wrap: wrap; align-items: center; }
.sk-gromap-note {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 10px; color: var(--color-text-light);
  background: var(--color-bg-main);
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-full);
  padding: 4px 10px; cursor: help;
}

/* --- intestazione di contesto --- */
.sk-gromap-ctx { border-bottom: 1px solid var(--color-border-light); padding-bottom: 10px; margin-bottom: 10px; }
.sk-gromap-crumb {
  display: flex; flex-wrap: wrap; align-items: center; gap: 5px;
  font-size: var(--font-size-sm); color: var(--color-text-secondary); margin-bottom: 6px;
}
.sk-gromap-crumb button {
  border: 0; background: transparent; font: inherit;
  color: var(--brand-primary); cursor: pointer; padding: 1px 3px; border-radius: 3px;
}
.sk-gromap-crumb button:hover { background: var(--color-bg-light); text-decoration: underline; }
.sk-gromap-crumb .sep { color: var(--color-border-dark); }
.sk-gromap-ctx__title {
  font-size: 16px; font-weight: 600; color: var(--brand-primary);
  display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap;
}
.sk-gromap-ctx__title .tag {
  font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .4px;
  background: var(--color-bg-light); color: var(--brand-primary);
  padding: 3px 8px; border-radius: var(--radius-full);
}
.sk-gromap-ctx__title .tag.warn { background: #FEF3C7; color: #92400E; }
.sk-gromap-hint { font-size: var(--font-size-sm); color: var(--color-text-secondary); line-height: 1.5; margin: 0 0 8px; }

.sk-gromap-kpi { display: flex; flex-wrap: wrap; gap: 8px; }
.sk-gromap-kpi__item {
  flex: 1 1 120px; min-width: 108px;
  background: var(--color-bg-main);
  border: 1px solid var(--color-border-light);
  border-radius: var(--radius-md);
  padding: 7px 10px;
}
.sk-gromap-kpi__val { font-size: 18px; font-weight: 700; color: var(--brand-primary); line-height: 1.1; }
.sk-gromap-kpi__lbl { font-size: 10px; text-transform: uppercase; letter-spacing: .3px; color: var(--color-text-secondary); margin-top: 2px; }

/* --- barra opzioni --- */
.sk-gromap-listbar {
  display: flex; align-items: center; flex-wrap: wrap; gap: 12px;
  margin-bottom: 8px; font-size: var(--font-size-sm); color: var(--color-text-secondary);
}
.sk-gromap-switch { display: inline-flex; align-items: center; gap: 7px; cursor: pointer; user-select: none; }
.sk-gromap-switch input { position: absolute; opacity: 0; pointer-events: none; }
.sk-gromap-switch__track {
  width: 32px; height: 18px; border-radius: var(--radius-full);
  background: var(--color-border-dark); position: relative;
  transition: background var(--transition-fast); flex: 0 0 32px;
}
.sk-gromap-switch__track::after {
  content: ""; position: absolute; top: 2px; left: 2px;
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--brand-white); transition: transform var(--transition-fast); box-shadow: var(--shadow-xs);
}
.sk-gromap-switch input:checked + .sk-gromap-switch__track { background: var(--brand-primary); }
.sk-gromap-switch input:checked + .sk-gromap-switch__track::after { transform: translateX(14px); }
.sk-gromap-switch input:focus-visible + .sk-gromap-switch__track { box-shadow: 0 0 0 3px rgba(40,68,115,.25); }

/* --- lista dei gruppi --- */
.sk-gromap-list {
  overflow: auto; flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column; gap: 6px; padding-right: 2px;
}
.sk-gromap-gro {
  display: flex;
  /* Le card sono elementi flex di una colonna ad altezza vincolata: senza
     flex-shrink:0 il browser le comprime sotto la loro altezza naturale e il
     testo viene tagliato. Devono conservare la propria altezza e far
     scorrere la lista, non schiacciarsi. */
  flex: 0 0 auto;
  border: 1px solid var(--color-border-light);
  border-radius: var(--radius-md);
  background: var(--color-bg-white);
  overflow: hidden;
  transition: box-shadow var(--transition-fast), border-color var(--transition-fast);
}
.sk-gromap-gro:hover { box-shadow: var(--shadow-md); border-color: var(--color-border); }
.sk-gromap-gro__risk { flex: 0 0 4px; }
.sk-gromap-gro__body { flex: 1 1 auto; min-width: 0; padding: 8px 10px; }
.sk-gromap-gro__head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.sk-gromap-gro__name { font-weight: 600; color: var(--brand-primary); }
.sk-gromap-gro__code { font-size: 10px; font-family: ui-monospace, Consolas, monospace; color: var(--color-text-light); }
.sk-gromap-gro__meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  margin-top: 5px; font-size: var(--font-size-sm); color: var(--color-text-secondary);
}
.sk-gromap-gro__actions { flex: 0 0 auto; display: flex; align-items: center; padding: 0 8px; gap: 4px; }
.sk-gromap-gro.is-inherited {
  background: repeating-linear-gradient(135deg, #fff, #fff 8px, #FCFAFF 8px, #FCFAFF 16px);
}

.sk-gromap-where {
  font-size: var(--font-size-sm); color: var(--color-text-light); margin-top: 4px;
  display: flex; flex-wrap: wrap; gap: 4px; align-items: center;
}
.sk-gromap-where .path {
  background: var(--color-bg-main);
  border: 1px solid var(--color-border-light);
  border-radius: var(--radius-sm);
  padding: 1px 6px;
}
.sk-gromap-where .path.off { background: #FFFBEB; border-color: #FDE68A; color: #92400E; text-decoration: line-through; }

.sk-gromap-quota { display: flex; align-items: center; gap: 6px; font-size: 10px; color: var(--color-text-light); margin-top: 5px; }
.sk-gromap-meter {
  width: 72px; height: 5px; border-radius: var(--radius-full);
  background: var(--color-border-light); overflow: hidden;
}
.sk-gromap-meter span { display: block; height: 100%; background: var(--brand-accent); border-radius: var(--radius-full); }

/* --- badge di provenienza --- */
.sk-badge--here { background: #ECFDF5; color: #047857; border-color: #A7F3D0; }
.sk-badge--down { background: #EFF6FF; color: #1D4ED8; border-color: #BFDBFE; }
.sk-badge--up   { background: #F5F3FF; color: #6D28D9; border-color: #DDD6FE; }
.sk-badge--warn { background: #FFFBEB; color: #B45309; border-color: #FDE68A; }
.sk-badge--risk { color: var(--brand-white); }

/* --- stato vuoto --- */
.sk-gromap-empty {
  flex: 1 1 auto; display: flex; flex-direction: column;
  align-items: center; justify-content: center; text-align: center;
  color: var(--color-text-light); padding: 26px 16px; gap: 8px;
}
.sk-gromap-empty i { font-size: 30px; color: var(--color-border-dark); }
.sk-gromap-empty b { color: var(--color-text-secondary); font-size: 13px; }
.sk-gromap-empty p { margin: 0; font-size: var(--font-size-sm); max-width: 360px; line-height: 1.5; }

/* sk-btn--xs: variante compatta usata dalla barra sopra l'alberatura (2.8.25) */
.sk-btn--xs { height: 26px; font-size: 10px; padding: 0 9px; }
.sk-btn--xs i { font-size: 10px; }

/* la ricerca vive dentro .sk-pt-right, che e' flex: serve display esplicito */
.sk-pt-right .sk-gromap-search { display: inline-block; }
/* diagnostica di caricamento della mappa gruppi (2.8.25) */
.sk-gromap-note.is-warn {
  background: #FFFBEB;
  border-color: #FDE68A;
  border-style: solid;
  color: #B45309;
}
.sk-gromap-errlist {
  margin: 4px 0 0;
  padding: 0;
  list-style: none;
  font-size: var(--font-size-sm);
  color: var(--color-text-secondary);
  text-align: left;
  max-width: 460px;
}
.sk-gromap-errlist li {
  background: var(--color-bg-main);
  border: 1px solid var(--color-border-light);
  border-left: 3px solid var(--color-warning);
  border-radius: var(--radius-sm);
  padding: 4px 8px;
  margin-top: 4px;
  font-family: ui-monospace, Consolas, monospace;
  font-size: 10px;
  word-break: break-word;
}

/* ==========================================================================
   SkLoadSteps - overlay di caricamento a PASSI, con avanzamento determinato.
   Da usare quando una pagina compone piu' sorgenti: dice a che punto e' il
   caricamento e quale passo ha fallito, invece del solito spinner indistinto.
   ARIA: il contenitore e' role="progressbar" con aria-valuenow aggiornato;
   l'elenco dei passi vive in una regione aria-live="polite".
   ========================================================================== */
.sk-loadsteps {
  position: absolute;
  inset: 0;
  z-index: 20;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--color-bg-white);
  border-radius: var(--radius-md);
}
.sk-loadsteps[hidden] { display: none; }

.sk-loadsteps__box { width: 380px; max-width: 82%; text-align: left; }

.sk-loadsteps__title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  font-weight: 600;
  color: var(--brand-primary);
  margin-bottom: 10px;
}
.sk-loadsteps__title i { color: var(--brand-accent); }

.sk-loadsteps__track {
  height: 6px;
  border-radius: var(--radius-full);
  background: var(--color-border-light);
  overflow: hidden;
}
.sk-loadsteps__fill {
  height: 100%;
  width: 0;
  border-radius: var(--radius-full);
  background: linear-gradient(90deg, var(--brand-primary-light), var(--brand-primary));
  transition: width .28s ease;
}
.sk-loadsteps.is-error .sk-loadsteps__fill { background: var(--color-error); }

.sk-loadsteps__pct {
  font-size: 10px;
  color: var(--color-text-light);
  text-align: right;
  margin-top: 4px;
  font-variant-numeric: tabular-nums;
}

.sk-loadsteps__list { list-style: none; margin: 10px 0 0; padding: 0; }
.sk-loadsteps__step {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 3px 0;
  font-size: var(--font-size-sm);
  color: var(--color-text-light);
}
.sk-loadsteps__step i { width: 14px; text-align: center; font-size: 11px; }
.sk-loadsteps__step.is-run  { color: var(--color-text-primary); font-weight: 600; }
.sk-loadsteps__step.is-run i  { color: var(--brand-accent); }
.sk-loadsteps__step.is-done { color: var(--color-text-secondary); }
.sk-loadsteps__step.is-done i { color: var(--color-success); }
.sk-loadsteps__step.is-fail { color: #B45309; }
.sk-loadsteps__step.is-fail i { color: var(--color-warning); }
.sk-loadsteps__step small { color: var(--color-text-light); font-weight: 400; }

@media (prefers-reduced-motion: reduce) {
  .sk-loadsteps__fill { transition: none; }
  .sk-loadsteps__step i.fa-spin { animation: none; }
}


/* Rete di sicurezza puramente CSS per la mappa gruppi: il contenimento
   verticale NON deve dipendere dal JS. Se fitLayout non gira (errore a monte,
   scheda in secondo piano, requestAnimationFrame sospeso), questi max-height
   impediscono comunque all'albero e alla lista di spingere la pagina.
   Quando il JS gira, l'altezza calcolata e' sempre minore e vince lei. */
.sk-gromap-tree { max-height: 78vh; }
.sk-gromap-list { max-height: 78vh; }


/* Dettaglio dell'errore dentro l'overlay di caricamento: quando il caricamento
   fallisce l'overlay resta in primo piano, quindi il messaggio deve stare li'
   dentro, non nel pannello sottostante che l'overlay copre. */
.sk-loadsteps__detail {
  margin-top: 12px;
  padding-top: 10px;
  border-top: 1px solid var(--color-border-light);
  font-size: var(--font-size-sm);
  color: #B45309;
}
.sk-loadsteps__detail b { display: block; margin-bottom: 4px; }
.sk-loadsteps__detail .sk-gromap-errlist { max-width: none; }
