/* ============================================================================
   UI FOUNDATION — token e utility THEME-INDEPENDENT. ADDITIVI: non cambiano il
   render esistente finche' non usati (nessuna regressione). Base per rifinire
   spaziatura/elevazione, palette dati e stati vuoti/caricamento in modo coerente.
   ============================================================================ */
:root{
  /* scala di spaziatura (4pt) */
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--sp-6:32px;
  /* raggi ed elevazioni coerenti */
  --r-1:8px;--r-2:12px;--r-3:16px;
  --el-1:0 1px 2px rgba(0,0,0,.12);--el-2:0 4px 16px rgba(0,0,0,.16);--el-3:0 8px 32px rgba(0,0,0,.22);
  /* Palette SEVERITA' centralizzata e CVD-consapevole: rosso critico (convenzione universale) + verde-teal per "ok",
     piu' separabile dal rosso per il daltonismo rosso-verde; va SEMPRE accompagnata da etichetta testuale (ridondanza,
     non solo colore). Fonte unica per grafici/badge/KPI quando li si allinea. */
  --sev-critical:#e0503a;--sev-high:#e07b3a;--sev-medium:#c08a2a;--sev-low:#5c9dd1;--sev-info:#8a94a6;--sev-ok:#1a9e73;
}
/* Stato VUOTO coerente (additivo): usare dove oggi compare un messaggio "nessun dato" spoglio. */
.emptystate{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-2);
  padding:var(--sp-6) var(--sp-5);color:var(--muted);text-align:center;font-size:13px;line-height:1.5}
.emptystate .es-ico{font-size:26px;opacity:.55}
.emptystate .es-t{color:var(--text);font-weight:600;font-size:14px}
/* SKELETON di caricamento (additivo): .skel su un placeholder mentre i dati arrivano. */
.skel{position:relative;overflow:hidden;background:var(--panel2);border-radius:var(--r-1);min-height:14px}
.skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,var(--seltint),transparent);animation:skelshine 1.3s infinite}
@keyframes skelshine{100%{transform:translateX(100%)}}
@media (prefers-reduced-motion:reduce){.skel::after{animation:none}}

body[data-theme="claude-dark"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#1f1e1c;--bg2:#262624;--panel:#30302e;--panel2:#2a2a28;--border:#45443f;--text:#e8e6df;--muted:#a6a49b;--accent:#d97757;--accent2:#e0a184;--accent-text:#1a1712;--head:#26251f;--head-text:#f2f0ea;--tab:#c9c6bd;--tab-active:#45443f;--tab-active-text:#f2f0ea;--input:#1c1b19;--link:#e0a184;--good:#57b87a;--warnbg:#3a2f1a;--warnbd:#b7791f;--warntx:#e8c98a;--glow:none;--neon:0 0 12px rgba(217,119,87,.25);--grid:rgba(217,119,87,.05);--termbg:#111110;--termtx:#8fe6a8;--seltint:#352a22;--selring:rgba(217,119,87,.26);--chipbg:#242320}
body[data-theme="dark"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#070d18;--bg2:#0e1626;--panel:#15223a;--panel2:#0f1b30;--border:#24365a;--text:#e6ecf5;--muted:#adc1de;--accent:#2f8fe0;--accent2:#8fd0ff;--accent-text:#00121f;--head:#0a1424;--head-text:#fff;--tab:#bcd4f0;--tab-active:#1d3a5f;--tab-active-text:#ffffff;--input:#0b1424;--link:#8fd0ff;--good:#57d98a;--warnbg:#2a1f10;--warnbd:#b7791f;--warntx:#e8c98a;--glow:none;--neon:0 0 14px rgba(47,143,224,.3);--grid:rgba(47,143,224,.06);--termbg:#060c16;--termtx:#7fd0ff;--seltint:#122a45;--selring:rgba(47,143,224,.28);--chipbg:#0e1728}
body[data-theme="light"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#e7eaef;--bg2:#eef0f3;--panel:#fff;--panel2:#f5f6f8;--border:#dce0e6;--text:#1a1c22;--muted:#4b5563;--accent:#123a6b;--accent2:#2f6fe0;--accent-text:#fff;--head:#0d2340;--head-text:#fff;--tab:#cfe0f5;--tab-active:#1d3a5f;--tab-active-text:#ffffff;--input:#fff;--link:#1565c0;--good:#1e7d3a;--warnbg:#fff3e0;--warnbd:#b7791f;--warntx:#8a5a12;--glow:none;--neon:0 4px 18px rgba(0,0,0,.08);--grid:rgba(18,58,107,.05);--termbg:#0d1117;--termtx:#7fd0ff;--seltint:#e9f0fd;--selring:rgba(18,58,107,.20);--chipbg:#f3f6fb}
body[data-theme="hacker"]{--font:'JetBrains Mono',Consolas,monospace;--mono:'JetBrains Mono',Consolas,monospace;--bg:#000;--bg2:#020602;--panel:#040c04;--panel2:#061006;--border:#0e3f0e;--text:#00ff41;--muted:#12a012;--accent:#00ff41;--accent2:#7dff9e;--accent-text:#001a06;--head:#000;--head-text:#00ff41;--tab:#12c012;--tab-active:#0c2a0c;--tab-active-text:#00ff41;--input:#050d05;--link:#39ff6a;--good:#00ff41;--warnbg:#0a1a00;--warnbd:#7fbf00;--warntx:#aaff00;--glow:0 0 5px rgba(0,255,65,.4);--neon:0 0 16px rgba(0,255,65,.35);--grid:rgba(0,255,65,.06);--termbg:#000;--termtx:#00ff41;--seltint:#08240f;--selring:rgba(0,255,65,.28);--chipbg:#040c04}
body[data-theme="purple"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#120a1f;--bg2:#190f28;--panel:#221436;--panel2:#1a0f2b;--border:#3d2a5c;--text:#ece6f7;--muted:#b6a6d6;--accent:#9d5cff;--accent2:#cbb0ff;--accent-text:#160a26;--head:#160a26;--head-text:#fff;--tab:#d0bef0;--tab-active:#3a2559;--tab-active-text:#ffffff;--input:#160c26;--link:#cbb0ff;--good:#57d98a;--warnbg:#2a1f10;--warnbd:#b7791f;--warntx:#e8c98a;--glow:none;--neon:0 0 14px rgba(157,92,255,.3);--grid:rgba(157,92,255,.06);--termbg:#0f0819;--termtx:#c9a8ff;--seltint:#2a1745;--selring:rgba(157,92,255,.30);--chipbg:#1c1030}
body[data-theme="tokyo-night"]{--tokyo-bg-base:#16161E;--tokyo-bg-surface:#1A1B26;--tokyo-bg-surface-elevated:#1F2335;--tokyo-bg-highlight:#292E42;--tokyo-text-primary:#C0CAF5;--tokyo-text-secondary:#9AA5CE;--tokyo-text-muted:#828ab0;--tokyo-accent-blue:#7AA2F7;--tokyo-accent-purple:#BB9AF7;--tokyo-accent-cyan:#7DCFFF;--tokyo-accent-green:#9ECE6A;--tokyo-accent-orange:#FF9E64;--tokyo-accent-red:#F7768E;--tokyo-border-subtle:#292E42;--tokyo-border-focus:#3B4261;--tokyo-gradient-neon:linear-gradient(135deg,#7AA2F7,#BB9AF7);--tokyo-shadow-glow:rgba(122,162,247,.25);--tokyo-radius-sm:6px;--tokyo-radius-md:10px;--tokyo-radius-lg:16px;--tokyo-transition:200ms cubic-bezier(0.4,0,0.2,1);--font:'Outfit',-apple-system,Segoe UI,Roboto,sans-serif;--mono:'Fira Code','JetBrains Mono',Consolas,monospace;--bg:var(--tokyo-bg-surface);--bg2:var(--tokyo-bg-base);--panel:var(--tokyo-bg-surface-elevated);--panel2:var(--tokyo-bg-highlight);--border:var(--tokyo-border-subtle);--text:var(--tokyo-text-primary);--muted:var(--tokyo-text-muted);--accent:var(--tokyo-accent-blue);--accent2:var(--tokyo-accent-purple);--accent-text:var(--tokyo-bg-base);--head:var(--tokyo-bg-base);--head-text:var(--tokyo-text-primary);--tab:var(--tokyo-text-secondary);--tab-active:var(--tokyo-border-focus);--tab-active-text:#C0CAF5;--input:var(--tokyo-bg-base);--link:var(--tokyo-accent-cyan);--good:var(--tokyo-accent-green);--warnbg:#3d2f24;--warnbd:var(--tokyo-accent-orange);--warntx:var(--tokyo-accent-orange);--glow:none;--neon:0 0 14px var(--tokyo-shadow-glow);--grid:rgba(122,162,247,.05);--termbg:var(--tokyo-bg-base);--termtx:var(--tokyo-accent-green);--seltint:#24283b;--selring:var(--tokyo-shadow-glow);--chipbg:var(--tokyo-bg-surface-elevated)}
body[data-theme="dracula"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#282A36;--bg2:#21222C;--panel:#44475A;--panel2:#343746;--border:#44475A;--text:#F8F8F2;--muted:#afb8d1;--accent:#BD93F9;--accent2:#FF79C6;--accent-text:#21222C;--head:#21222C;--head-text:#F8F8F2;--tab:#6272A4;--tab-active:#BD93F9;--tab-active-text:#21222C;--input:#21222C;--link:#8BE9FD;--good:#50FA7B;--warnbg:#3a2f1a;--warnbd:#FFB86C;--warntx:#FFB86C;--glow:none;--neon:0 0 14px rgba(189,147,249,.3);--grid:rgba(189,147,249,.05);--termbg:#21222C;--termtx:#50FA7B;--seltint:#3b3d52;--selring:rgba(189,147,249,.28);--chipbg:#44475A}
body[data-theme="one-dark"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#282c34;--bg2:#21252b;--panel:#2c313a;--panel2:#353b45;--border:#3e4451;--text:#abb2bf;--muted:#939aa6;--accent:#61afef;--accent2:#c678dd;--accent-text:#1e2228;--head:#21252b;--head-text:#e6e9ef;--tab:#9da5b4;--tab-active:#3e4451;--tab-active-text:#e6e9ef;--input:#21252b;--link:#56b6c2;--good:#98c379;--warnbg:#3a2f1a;--warnbd:#e5c07b;--warntx:#e5c07b;--glow:none;--neon:0 0 14px rgba(97,175,239,.28);--grid:rgba(97,175,239,.05);--termbg:#21252b;--termtx:#98c379;--seltint:#2a3140;--selring:rgba(97,175,239,.26);--chipbg:#2c313a}
body[data-theme="catppuccin"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#1e1e2e;--bg2:#181825;--panel:#313244;--panel2:#45475a;--border:#45475a;--text:#cdd6f4;--muted:#989cac;--accent:#89b4fa;--accent2:#cba6f7;--accent-text:#11111b;--head:#181825;--head-text:#cdd6f4;--tab:#a6adc8;--tab-active:#45475a;--tab-active-text:#cdd6f4;--input:#181825;--link:#b4befe;--good:#a6e3a1;--warnbg:#3d3028;--warnbd:#fab387;--warntx:#fab387;--glow:none;--neon:0 0 14px rgba(137,180,250,.28);--grid:rgba(137,180,250,.05);--termbg:#11111b;--termtx:#a6e3a1;--seltint:#2a2a3d;--selring:rgba(137,180,250,.30);--chipbg:#313244}
body[data-theme="synthwave"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#262335;--bg2:#1a1825;--panel:#34294f;--panel2:#463465;--border:#463465;--text:#f0eff1;--muted:#8f95c3;--accent:#ff7edb;--accent2:#72f1b8;--accent-text:#1a1825;--head:#1a1825;--head-text:#f0eff1;--tab:#b6a8d9;--tab-active:#463465;--tab-active-text:#f0eff1;--input:#1a1825;--link:#36f9f6;--good:#72f1b8;--warnbg:#3d2838;--warnbd:#f97e72;--warntx:#f97e72;--glow:0 0 8px rgba(255,126,219,.35);--neon:0 0 18px rgba(255,126,219,.4);--grid:rgba(255,126,219,.06);--termbg:#1a1825;--termtx:#36f9f6;--seltint:#362a50;--selring:rgba(255,126,219,.32);--chipbg:#34294f}
body[data-theme="antigravity"]{--font:'Inter',-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#13151A;--bg2:#0B0C10;--panel:#1D1F27;--panel2:#252830;--border:#2D3039;--text:#E8EAED;--muted:#83888e;--accent:#A8C7FA;--accent2:#C58AF9;--accent-text:#0B0C10;--head:#0B0C10;--head-text:#E8EAED;--tab:#9AA0A6;--tab-active:#4A4D56;--tab-active-text:#E8EAED;--input:#0B0C10;--link:#8AB4F8;--good:#81C995;--warnbg:#3d3520;--warnbd:#FDD663;--warntx:#FDD663;--glow:none;--neon:0 0 16px rgba(168,199,250,.22);--grid:rgba(168,199,250,.06);--termbg:#0B0C10;--termtx:#81C995;--seltint:#1a1d26;--selring:rgba(168,199,250,.15);--chipbg:#1D1F27}
body[data-theme="nord"]{--font:'Inter',-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#2E3440;--bg2:#292E39;--panel:#3B4252;--panel2:#434C5E;--border:#434C5E;--text:#ECEFF4;--muted:#a8b0c1;--accent:#81A1C1;--accent2:#88C0D0;--accent-text:#2E3440;--head:#292E39;--head-text:#ECEFF4;--tab:#D8DEE9;--tab-active:#81A1C1;--tab-active-text:#2E3440;--input:#292E39;--link:#88C0D0;--good:#A3BE8C;--warnbg:#3d3528;--warnbd:#D08770;--warntx:#EBCB8B;--glow:none;--neon:0 0 14px rgba(129,161,193,.25);--grid:rgba(136,192,208,.05);--termbg:#292E39;--termtx:#A3BE8C;--seltint:#3b4252;--selring:rgba(129,161,193,.28);--chipbg:#3B4252}
body[data-theme="monokai-pro"]{--font:-apple-system,Segoe UI,Roboto,sans-serif;--mono:'Fira Code','JetBrains Mono',Consolas,monospace;--bg:#2D2E27;--bg2:#272822;--panel:#403E3C;--panel2:#4a4846;--border:#403E3C;--text:#FCFCFA;--muted:#acaaac;--accent:#AB9DF2;--accent2:#FF6188;--accent-text:#272822;--head:#272822;--head-text:#FCFCFA;--tab:#939293;--tab-active:#FFD866;--tab-active-text:#2D2A2E;--input:#272822;--link:#78DCE8;--good:#A9DC76;--warnbg:#3d3020;--warnbd:#FC9867;--warntx:#FFD866;--glow:none;--neon:0 0 14px rgba(171,157,242,.28);--grid:rgba(171,157,242,.05);--termbg:#272822;--termtx:#A9DC76;--seltint:#353632;--selring:rgba(255,216,102,.25);--chipbg:#403E3C}
body[data-theme="minimal-black"]{--font:'Inter',-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;--bg:#000000;--bg2:#000000;--panel:#111111;--panel2:#18181b;--border:#27272A;--text:#EDEDED;--muted:#7d7d86;--accent:#FFFFFF;--accent2:#E4E4E7;--accent-text:#000000;--head:#000000;--head-text:#EDEDED;--tab:#A1A1AA;--tab-active:#EDEDED;--tab-active-text:#000000;--input:#000000;--link:#3B82F6;--good:#10B981;--warnbg:#1a1408;--warnbd:#F59E0B;--warntx:#F59E0B;--glow:none;--neon:0 0 12px rgba(255,255,255,.08);--grid:rgba(255,255,255,.04);--termbg:#000000;--termtx:#10B981;--seltint:#18181b;--selring:rgba(237,237,237,.2);--chipbg:#111111}
/* palette severità UNICA (punto design #6): stessi colori per badge, dot, grafici, mappa e Risk Radar. Semantica,
   quindi theme-independent (un "critical" è rosso ovunque). JS (SEVC in app.js) usa gli stessi hex. */
:root{--sev-critical:#e0503a;--sev-high:#e07b3a;--sev-medium:#d99a2b;--sev-low:#3a9d5c;--sev-info:#5c7c9d;
  --sp1:8px;--sp2:16px;--sp3:24px;   /* scala di spaziatura uniforme (punto #1) */
  --ui-font:-apple-system,Segoe UI,Roboto,sans-serif;   /* pulsanti/tab: stessa metrica su tutti i temi */
  --tab-active-text:var(--head-text)}   /* testo tab selezionata (minimal-black: nero su pill bianca) */
*{box-sizing:border-box} html,body{margin:0} body{font-family:var(--font);background:var(--bg);color:var(--text);transition:background .2s,color .2s;min-height:100vh}
body::before{content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:38px 38px}
body[data-theme="hacker"]::after{content:"";position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.35;
  background:repeating-linear-gradient(0deg,rgba(0,0,0,0) 0,rgba(0,0,0,0) 2px,rgba(0,20,0,.25) 3px)}
body[data-theme="synthwave"]::after{content:"";position:fixed;inset:0;z-index:1;pointer-events:none;opacity:.22;
  background:repeating-linear-gradient(0deg,rgba(0,0,0,0) 0,rgba(0,0,0,0) 2px,rgba(255,126,219,.12) 3px)}
body[data-theme="tokyo-night"] header{box-shadow:0 1px 0 rgba(122,162,247,.14)}
/* Tokyo Night — card / bottoni neon / input (anche classi utility .tokyo-*) */
body[data-theme="tokyo-night"] .card,body[data-theme="tokyo-night"] .tokyo-card{background:var(--tokyo-bg-surface-elevated);border:1px solid var(--tokyo-border-subtle);border-radius:var(--tokyo-radius-lg);box-shadow:0 4px 6px rgba(0,0,0,.1);transition:transform var(--tokyo-transition),border-color var(--tokyo-transition)}
body[data-theme="tokyo-night"] .card:hover,body[data-theme="tokyo-night"] .tokyo-card:hover{transform:translateY(-2px);border-color:var(--tokyo-border-focus)}
body[data-theme="tokyo-night"] #terminal .card:hover{transform:none}
body[data-theme="tokyo-night"] button.go,body[data-theme="tokyo-night"] .tokyo-btn-primary{background:var(--tokyo-accent-blue);color:var(--tokyo-bg-base);border:0;border-radius:var(--tokyo-radius-sm);font-weight:600;transition:all var(--tokyo-transition)}
body[data-theme="tokyo-night"] button.go:hover,body[data-theme="tokyo-night"] .tokyo-btn-primary:hover{background:#8db0fc;filter:none;box-shadow:0 0 12px var(--tokyo-shadow-glow)}
body[data-theme="tokyo-night"] select,body[data-theme="tokyo-night"] input,body[data-theme="tokyo-night"] textarea,body[data-theme="tokyo-night"] .tokyo-input{background:var(--tokyo-bg-base);border:1px solid var(--tokyo-border-subtle);color:var(--tokyo-text-primary);border-radius:var(--tokyo-radius-sm);transition:all var(--tokyo-transition)}
body[data-theme="tokyo-night"] select:focus,body[data-theme="tokyo-night"] input:focus,body[data-theme="tokyo-night"] textarea:focus,body[data-theme="tokyo-night"] .tokyo-input:focus{outline:none;border-color:var(--tokyo-accent-blue);box-shadow:0 0 0 2px var(--tokyo-shadow-glow)}
body[data-theme="tokyo-night"] code,body[data-theme="tokyo-night"] pre,body[data-theme="tokyo-night"] .termout{font-family:var(--mono);font-variant-ligatures:normal}
body[data-theme="tokyo-night"] code{color:var(--tokyo-accent-cyan)}
body[data-theme="tokyo-night"] .cfgblk{border-radius:var(--tokyo-radius-md)}
/* Antigravity — glassmorphism (Deep Space / AI) */
body[data-theme="antigravity"] header{background:rgba(11,12,16,.78);backdrop-filter:blur(14px) saturate(1.25);border-bottom-color:rgba(45,48,57,.9)}
body[data-theme="antigravity"] .card{background:rgba(29,31,39,.72);backdrop-filter:blur(10px);border-color:rgba(45,48,57,.85);box-shadow:0 4px 24px rgba(0,0,0,.35)}
body[data-theme="antigravity"] .card:hover{border-color:var(--border-focus);box-shadow:0 0 20px var(--selring)}
body[data-theme="antigravity"] #terminal .card{background:var(--panel);backdrop-filter:none}
body[data-theme="antigravity"] button.go:hover{box-shadow:0 0 14px var(--selring)}
body[data-theme="minimal-black"] .card{border-color:var(--border);box-shadow:none}
body[data-theme="minimal-black"] button.go{border:1px solid var(--border)}
header{position:sticky;top:0;z-index:20;background:var(--head);color:var(--head-text);border-bottom:1px solid var(--border);padding:12px 24px;display:flex;align-items:center;gap:16px;text-shadow:var(--glow);backdrop-filter:blur(6px)}
.logo{display:flex;align-items:center;gap:10px} .logo svg{filter:drop-shadow(var(--glow))}
.logo .valor-product-logo, .logo svg.valor-product-logo{display:block;height:34px;width:auto;max-width:180px;object-fit:contain;flex:0 0 auto;filter:drop-shadow(var(--glow))}
.logo .logo-meta{min-width:0}

/* logo aziendale (personalizzabile da Config): a sinistra, prima dell'icona-scudo e del nome, separato da una linea */
.brandco{display:inline-flex;align-items:center;height:26px;padding-right:12px;margin-right:2px;border-right:1px solid var(--border)}
.brandco img,.brandco svg{height:24px;width:auto;max-width:150px;display:block;object-fit:contain} .brandco svg{filter:none}
.tab.tab-ico{padding:8px 11px;display:inline-flex;align-items:center} .tab.tab-ico i{font-size:14px}
/* scheda Config */
.cfggrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--sp2)}
.cfgblk{border:1px solid var(--border);border-radius:10px;padding:14px 16px;background:var(--panel2)}
.cfgblk-h{font-weight:700;font-size:13px;color:var(--accent);display:flex;align-items:center;gap:8px;margin-bottom:8px}
.logorow{display:flex;align-items:center;gap:12px;margin-top:6px} .logobtns{display:flex;gap:8px;flex-wrap:wrap}
.logoprev{width:96px;height:44px;border:1px dashed var(--border);border-radius:8px;background:var(--head);display:flex;align-items:center;justify-content:center;overflow:hidden;flex:0 0 auto}
.logoprev img,.logoprev svg{max-width:88px;max-height:36px;width:auto;height:auto;object-fit:contain}
.feedrow{display:flex;gap:8px;align-items:center;margin-bottom:7px} .feedrow input{flex:1;min-width:0}
.feedrow input.fn{flex:0 0 120px} .feedrow .del{flex:0 0 auto;padding:8px 10px;line-height:1}
.feedrow .feed-kind{flex:0 0 auto;font-size:9px;font-weight:700;letter-spacing:.4px;padding:2px 6px;border-radius:5px;background:color-mix(in srgb,var(--accent) 18%,transparent);color:var(--accent)}
.feedrow-off{opacity:.55} .feedrow-off input{text-decoration:line-through}
.feedrow-invalid input.fu{border:1px solid var(--sev-high)}
header h1{margin:0;font-family:'Orbitron',var(--font);font-size:17px;font-weight:800;letter-spacing:1.5px}
header .sub{font-size:10.5px;opacity:.7;font-family:var(--mono);letter-spacing:.3px}
.dotlive{width:8px;height:8px;border-radius:50%;background:var(--good);box-shadow:0 0 8px var(--good);animation:pulse 1.6s infinite;display:inline-block;margin-right:5px}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}
nav{margin-left:auto;display:flex;gap:5px;align-items:center;flex-wrap:wrap}
.tab{color:var(--tab);background:transparent;border:1px solid transparent;padding:8px 13px;border-radius:9px;cursor:pointer;font-size:12.5px;font-weight:600;font-family:var(--ui-font);letter-spacing:.2px;line-height:1.2}
.tab:hover{border-color:var(--border)} .tab.active{background:var(--tab-active);color:var(--tab-active-text);box-shadow:var(--glow)}
/* Badge scadenze incidenti NIS2 sulla tab «Incidenti»: ambra = in avvicinamento, rosso pulsante = scaduta. */
.tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:17px;height:17px;padding:0 5px;margin-left:6px;border-radius:9px;background:#e0a800;color:#1a1205;font-size:10.5px;font-weight:800;line-height:1;vertical-align:middle}
.tab-badge.over{background:#e5484d;color:#fff;animation:incpulse 1.6s ease-in-out infinite}
.tab-badge.calm{background:#64748b;color:#fff}
@keyframes incpulse{0%,100%{opacity:1}50%{opacity:.5}}
.themesw{display:inline-flex;gap:6px;align-items:center;background:var(--input);border:1px solid var(--border);border-radius:10px;padding:5px 7px}
/* in header: sfondo come la barra (blu nel tema chiaro); padding = anello blu attorno allo swatch */
header .themesw{background:var(--head);border-color:rgba(255,255,255,.18)}
.themesw-pop{position:relative;padding:5px;flex-shrink:0}
header .themesw-pop{padding:6px}
.tsw{width:20px;height:20px;border-radius:6px;border:1.5px solid transparent;cursor:pointer;padding:0;transition:transform .14s,border-color .14s}
.tsw-main{width:20px;height:20px;border-radius:6px;box-shadow:none;border:1.5px solid transparent}
header .tsw-main{border-color:transparent;box-shadow:none}
.tsw-menu{position:absolute;top:calc(100% + 6px);right:0;display:none;flex-direction:column;gap:5px;padding:6px;background:var(--input);border:1px solid var(--border);border-radius:10px;z-index:120;box-shadow:0 10px 28px rgba(0,0,0,.35);max-height:min(70vh,420px);overflow-y:auto}
.themesw-pop.open .tsw-menu{display:flex}
.tsw:hover{transform:scale(1.1)} .tsw[aria-pressed="true"]{border-color:var(--head-text);transform:scale(1.08)}
.tsw:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
main{position:relative;z-index:2;max-width:1240px;margin:0 auto;padding:18px 24px 60px} section{display:none} section.on{display:block;animation:fade .25s}
/* F.R.O.D.O. a piena pagina: quando attiva, occupa tutto il viewport (come aprirla direttamente) */
/* la sezione parte SOTTO l'header sticky (--headh misurata a runtime): header in alto + sidebar nativa + contenuto,
   layout coerente col resto del tool. Full-bleed (fuori dal max-width di main) per dare spazio alle tabelle FRODO. */
#frodo.on{position:fixed;top:var(--headh,61px);left:0;right:0;bottom:0;z-index:3000;margin:0;padding:0;background:var(--bg);display:flex;flex-direction:column;animation:fade .2s}
#frodo .frodobody{flex:1;display:flex;min-height:0}
#frodo #frodoframe{flex:1;width:100%;border:0;background:#fff;min-width:0}
#toto.on{position:fixed;top:var(--headh,61px);left:0;right:0;bottom:0;z-index:3000;margin:0;padding:0;background:var(--bg);display:flex;flex-direction:column;animation:fade .2s}
#toto #totoframe{flex:1;width:100%;border:0;min-width:0;background:var(--bg)}
#milou.on{position:fixed;top:var(--headh,61px);left:0;right:0;bottom:0;z-index:3000;margin:0;padding:0;background:var(--bg);display:flex;flex-direction:column;animation:fade .2s}
#milou #milouframe{flex:1;width:100%;border:0;min-width:0;background:var(--bg)}
#ai.on{position:fixed;top:var(--headh,61px);left:0;right:0;bottom:0;z-index:3000;margin:0;padding:0;background:var(--bg);display:flex;flex-direction:column;animation:fade .2s}
#ai #aiframe{flex:1;width:100%;border:0;min-width:0;background:var(--bg)}
/* sidebar NATIVA della sezione Gestione del rischio (rispecchia la nav di FRODO, stile della console): la sidebar
   interna di FRODO e' nascosta dal bridge -> qui usiamo le variabili del tema per un look coerente col resto del tool */
/* display:block + margin-left:0 NEUTRALIZZANO la regola generica `nav{display:flex;gap:5px;flex-wrap:wrap;margin-left:auto}`
   (pensata per la tab-bar in alto) che, applicandosi a questo <nav class="frodoside">, faceva andare a capo gli item
   width:100% in righe da ~68px (icone "troppo distanti"). Come block gli item si impilano alla loro altezza reale (~33px). */
#frodo .frodoside{flex:0 0 170px;display:block;margin-left:0;overflow-y:auto;background:var(--head);border-right:1px solid var(--border);padding:10px 0;font-family:var(--font)}
.frodoside .fs-loading{color:var(--head-text);opacity:.6;font-size:12px;padding:12px 16px}
.frodoside .fs-group{color:var(--head-text);opacity:.55;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:1px;padding:14px 18px 6px}
.frodoside .fs-item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;background:transparent;border:0;cursor:pointer;
  color:var(--head-text);opacity:.82;font-size:13.5px;padding:9px 18px;border-left:3px solid transparent;transition:background .12s,opacity .12s}
.frodoside .fs-item i{width:16px;text-align:center;font-size:13px;opacity:.9}
.frodoside .fs-item:hover{background:rgba(255,255,255,.06);opacity:1}
.frodoside .fs-item.active{opacity:1;background:rgba(255,255,255,.10);border-left-color:var(--accent);font-weight:600}
body[data-theme="light"] #frodo .frodoside .fs-item,body[data-theme="light"] #frodo .frodoside .fs-group,body[data-theme="light"] #frodo .frodoside .fs-loading{color:var(--head-text)}
/* comprimi/espandi il menu Gestione del rischio: da collassato restano solo le icone (titolo nel tooltip) */
#frodo .frodoside{transition:flex-basis .16s ease}
.frodoside .fs-toggle{display:flex;align-items:center;justify-content:flex-end;gap:9px;width:100%;background:transparent;border:0;cursor:pointer;color:var(--head-text);opacity:.6;font-size:11.5px;font-weight:600;padding:2px 16px 8px;font-family:inherit;transition:opacity .12s}
.frodoside .fs-toggle:hover{opacity:1}
.frodoside .fs-toggle i{width:16px;text-align:center;font-size:14px}
#frodo .frodoside.collapsed{flex-basis:58px}
.frodoside.collapsed .fs-group{display:none}
.frodoside.collapsed .fs-item{justify-content:center;padding-left:0;padding-right:0;border-left-width:0}
.frodoside.collapsed .fs-item.active{border-left-width:0;box-shadow:inset 3px 0 0 var(--accent)}
.frodoside.collapsed .fs-item span,.frodoside.collapsed .fs-toggle span{display:none}
.frodoside.collapsed .fs-toggle{justify-content:center;padding-left:0;padding-right:0}
/* pulsante elimina run + riga in corso */
.dl.del:hover{border-color:#e0503a;color:#e0503a} tr.running{background:rgba(224,123,58,.07)} tr.running .spinner{margin-right:6px}
tr.queued{background:rgba(120,120,120,.06)} tr.queued .fa-hourglass-half{margin-right:6px;opacity:.6}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.card{background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:var(--sp2) var(--sp3);margin-bottom:var(--sp2);box-shadow:var(--glow)}
#terminal .card{padding:0}   /* eccezione: il terminale gestisce il proprio padding interno */
h2{font-family:var(--mono);font-size:12px;margin:0 0 var(--sp2);color:var(--muted);text-transform:uppercase;letter-spacing:1px}
h2 .hl{color:var(--accent)}
.kpis{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:6px} .kpi{background:var(--panel2);border:1px solid var(--border);border-radius:12px;padding:13px 16px;min-width:96px;text-align:center;flex:1;position:relative;overflow:hidden}
.kpi::after{content:"";position:absolute;left:0;top:0;height:2px;width:100%;background:var(--accent);opacity:.35}
.kpi .n{font-family:'Orbitron',var(--mono);font-size:27px;font-weight:800;text-shadow:var(--glow)} .kpi .l{font-size:9.5px;color:var(--muted);text-transform:uppercase;margin-top:3px;letter-spacing:.5px}
.flex{display:flex;gap:16px;flex-wrap:wrap} .grow{flex:1;min-width:260px}
.legend{font-size:12px} .lg{margin:3px 0;text-transform:capitalize} .dot{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px}
.trend{display:flex;gap:5px;align-items:flex-end;height:120px} .bar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}
.bfill{width:72%;background:var(--accent);border-radius:3px 3px 0 0;min-height:3px} .bar span{font-size:9px;color:var(--muted);margin-top:3px}
#donut text{fill:var(--text)} #donut text.sub{fill:var(--muted)}
/* --- HERO / GLOBE --- */
/* gruppi tematici scheda OSINT */
.osintgrp{border:1px solid var(--border);border-radius:12px;padding:14px 16px;margin-bottom:14px;background:var(--bg2,var(--panel))}
.osintgrp-h{font-weight:800;font-size:13px;margin-bottom:10px;letter-spacing:.3px}
.osintgrp label{margin-top:0}
.rapidact-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;margin-bottom:12px}
.rapidact-card{display:flex;flex-direction:column;gap:12px;padding:14px;border:1px solid var(--border);border-radius:12px;background:var(--panel);transition:border-color .15s,box-shadow .15s}
.rapidact-card:hover{border-color:color-mix(in srgb,var(--accent) 35%,var(--border));box-shadow:0 3px 16px color-mix(in srgb,var(--accent) 10%,transparent)}
.rapidact-top{display:flex;gap:12px;align-items:flex-start}
.rapidact-ico{flex:0 0 36px;width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:10px;background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent);font-size:15px}
.rapidact-t{font-weight:700;font-size:12.5px;line-height:1.35;margin-bottom:4px}
.rapidact-d{font-size:11.5px;color:var(--muted);line-height:1.45}
.rapidact-go{display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:10px 14px;border:1px solid var(--border);border-radius:10px;background:var(--panel2);color:var(--text);font-size:12px;font-weight:700;cursor:pointer;font-family:var(--ui-font);line-height:1.2;transition:border-color .15s,color .15s,background .15s,transform .12s}
.rapidact-go i{font-size:11px;opacity:.8}
.rapidact-go:hover{border-color:var(--accent);color:var(--accent);background:var(--seltint)}
.rapidact-go:active{transform:scale(.985)}
.rapidact-opt{display:flex;align-items:center;gap:8px;margin:0;padding:10px 12px;border:1px dashed color-mix(in srgb,var(--accent2) 40%,var(--border));border-radius:10px;background:color-mix(in srgb,var(--accent2) 6%,var(--panel));cursor:pointer;transition:border-color .15s,background .15s}
.rapidact-opt:hover{border-color:color-mix(in srgb,var(--accent2) 55%,var(--border));background:color-mix(in srgb,var(--accent2) 10%,var(--panel))}
.rapidact-opt input{margin:0;flex:0 0 auto}
.rapidact-opt>span:first-of-type{font-size:12.5px;font-weight:600}
.feedcard{margin-bottom:16px}
.feedfilter button{font-size:11.5px;padding:4px 12px}
.feedfilter button[aria-pressed="true"]{background:var(--tab-active);color:var(--tab-active-text);border-color:var(--accent)}
.feedfilter button.off{opacity:.45;border-style:dashed}
.feed-search-row{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:6px 10px;background:var(--panel);border:1px solid var(--border);border-radius:10px}
.feed-search-row>i{color:var(--muted);font-size:12px;flex:0 0 auto}
.feed-search-row input{flex:1;min-width:0;border:none;background:transparent;color:var(--text);font-size:12.5px;font-family:var(--sans);outline:none}
.feed-search-row input::placeholder{color:var(--muted)}
.feed-search-row .feed-search-clear{flex:0 0 auto;padding:4px 8px;font-size:11px;line-height:1}
.feed{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:0;overflow:hidden;display:flex;flex-direction:column}
.feed .fl{flex:1;overflow:auto;padding:6px 14px;font-family:var(--mono);font-size:12px;line-height:1.75;max-height:360px}
.feed .ev{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-bottom:1px dashed var(--border);padding:5px 0}
.feed .ev:last-child{border-bottom:none}
.feed .ev .ts{color:var(--muted);font-size:11px}
.feed .ev a{color:var(--text);text-decoration:none} .feed .ev a:hover{color:var(--accent);text-decoration:underline}
.feed .ev .src{font-weight:700;font-size:10px;padding:1px 6px;border-radius:5px;letter-spacing:.5px}
.feed .ev .src-csirt{background:color-mix(in srgb,var(--accent) 22%,transparent);color:var(--accent)}
.feed .ev .src-misp{background:color-mix(in srgb,#6ab0ff 22%,transparent);color:#6ab0ff}
.feed .ev .fmeta{color:var(--muted);font-size:10.5px}
.sev-critical{color:var(--sev-critical)} .sev-high{color:var(--sev-high)} .sev-medium{color:var(--sev-medium)} .sev-low{color:var(--sev-low)} .sev-info{color:var(--sev-info)}
/* --- FORM --- */
label{font-size:12px;color:var(--muted);display:block;margin:12px 0 4px} select,input,textarea{padding:9px 11px;border:1px solid var(--border);border-radius:8px;background:var(--input);color:var(--text);font-size:13px;width:100%;font-family:inherit}
textarea{min-height:70px;font-family:var(--mono)} .row{display:flex;gap:var(--sp2);flex-wrap:wrap} .row>div{flex:1;min-width:150px}
button.go{padding:12px 24px;border:0;border-radius:10px;background:var(--accent);color:var(--accent-text);font-weight:700;cursor:pointer;font-size:13px;margin-top:16px;font-family:var(--ui-font);letter-spacing:.3px;line-height:1.2;transition:filter .15s,transform .12s} button.go:hover{filter:brightness(1.06)} button.go:active{transform:scale(.98)}
button.go:disabled{opacity:.5;cursor:not-allowed}
/* gerarchia pulsanti (design #3): 1 PRIMARIO forte per schermata = .go / .qact.primary (accent pieno).
   Secondari = .sec / .qact.ghost / .dl (superficie sottile + bordo), che NON competono col primario. */
.sec{background:var(--panel2);color:var(--text);padding:8px 14px;border:1px solid var(--border);border-radius:9px;cursor:pointer;font-size:12px;font-family:var(--ui-font);font-weight:600;line-height:1.2;text-decoration:none;transition:border-color .13s,color .13s,background .13s}
.sec:hover{border-color:var(--accent);color:var(--accent);background:var(--seltint)}
/* .sec era definito solo per <button>: un <a class="sec"> (Esporta Excel) prendeva il colore-link e un
   <label class="sec"> (Importa matrice) non ereditava lo stile → sembravano diversi. Ora .sec vale per ogni
   elemento; a/label prendono anche inline-flex per allineare icona+testo come i bottoni. */
a.sec,label.sec{display:inline-flex;align-items:center;gap:6px;vertical-align:middle;margin:0}
/* pulsanti azione (report/export): pill compatte con icona FontAwesome, font sans, feedback hover chiaro.
   Tutto via variabili tema -> coerenti su claude/dark/light/hacker/purple. */
.dl{display:inline-flex;align-items:center;gap:6px;background:var(--panel2);color:var(--text);border:1px solid var(--border);
  border-radius:8px;padding:5px 11px;font-size:12px;font-weight:600;cursor:pointer;text-decoration:none;margin:3px 5px 0 0;
  font-family:var(--ui-font);line-height:1.2;white-space:nowrap;transition:background .13s,border-color .13s,color .13s}
.dl i{font-size:12.5px;width:14px;text-align:center;opacity:.8;transition:opacity .13s}
.dl:hover{border-color:var(--accent);color:var(--accent);background:var(--seltint)} .dl:hover i{opacity:1}
.dl:active{transform:translateY(1px)}
/* variante icon-only (colonna Report & export): solo icona, più grande e leggibile; il testo è nel tooltip (title) */
.dl.ico{padding:7px;width:32px;height:30px;justify-content:center;gap:0}
.dl.ico i{font-size:15px;width:auto}
.dl.del:hover{border-color:#e0503a;color:#e0503a;background:rgba(224,80,58,.08)}
.dl svg{width:13px;height:13px}
/* gateway: pannello Accesso & utenti (server-bridge.js) */
.auth-actions{display:flex;gap:5px;flex-wrap:wrap;align-items:center}
.auth-actions .dl{margin:0;font-size:11px;padding:4px 9px;border-radius:7px;gap:5px;font-weight:600}
.auth-actions .dl i{font-size:10.5px;width:12px;opacity:.75}
.auth-actions .dl:hover i{opacity:1}
.auth-actions .dl.del{color:color-mix(in srgb,var(--sev-critical) 82%,var(--text))}
.desc{font-size:12px;color:var(--muted);margin-top:8px;min-height:15px}
/* --- FAMILY CARDS (compatte, 7 su una riga) --- */
.fams{display:flex;flex-wrap:nowrap;align-items:stretch;gap:5px;width:100%}
.fam{position:relative;flex:1 1 0;min-width:0;display:flex;flex-direction:row;align-items:center;gap:6px;
  padding:6px 5px 6px 6px;border-radius:10px;background:var(--panel);border:1.5px solid var(--border);cursor:pointer;
  transition:transform .16s cubic-bezier(.2,.8,.2,1),border-color .16s,box-shadow .16s,background .16s}
.fam:hover{transform:translateY(-2px);border-color:var(--muted)}
.fam.sel{border-color:var(--accent);background:var(--seltint);box-shadow:0 0 0 3px var(--selring)}
.fam .chip{flex:0 0 auto;width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:12px;
  background:var(--chipbg);border:1px solid var(--border);color:var(--accent);transition:.16s}
.fam.sel .chip{background:var(--accent);color:var(--accent-text);border-color:transparent}
.fam .ft{flex:1 1 auto;min-width:0;font-weight:600;font-size:10px;line-height:1.15;margin:0;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fam .fd{display:none}
.fam .seltick{position:absolute;top:4px;right:5px;color:var(--accent);opacity:0;font-size:9px;transition:.2s;line-height:1}
.fam.sel .seltick{opacity:1}
@media(max-width:820px){.fams{flex-wrap:wrap}.fam{flex:1 1 calc(25% - 5px);min-width:108px}}
@media(max-width:520px){.fam{flex:1 1 calc(50% - 5px);min-width:0}}
.modeinfo{background:var(--panel2);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:9px;padding:11px 13px;margin-top:12px;font-size:12.5px;line-height:1.55}
.modeinfo .mi-t{font-weight:700;color:var(--accent);line-height:1.55} .modeinfo .mi-tools{margin-top:3px;font-family:var(--mono);font-size:11.5px} .modeinfo .mi-set{margin-top:8px;color:var(--muted);font-size:12px}
.modeinfo .mi-line{margin-top:7px;font-size:12px;line-height:1.55} .modeinfo .mi-line>i{color:var(--accent);margin-right:6px;width:14px;text-align:center} .modeinfo .mi-line b{color:var(--text)}
.modeinfo .pill2{display:inline-block;background:var(--chipbg);color:var(--accent2);border:1px solid var(--border);border-radius:10px;padding:1px 8px;margin:2px 3px 0 0;font-size:11.5px;font-weight:700;font-family:var(--mono)}
table{width:100%;border-collapse:collapse;font-size:12.5px} th,td{text-align:left;padding:7px 9px;border-bottom:1px solid var(--border)} th{color:var(--muted);font-size:10.5px;text-transform:uppercase}
.mono{font-family:var(--mono)} a{color:var(--link)} .muted{color:var(--muted);font-size:12px}
.run{color:var(--good);font-weight:700;margin-bottom:10px;font-size:13px} .warn{background:var(--warnbg);border-left:3px solid var(--warnbd);color:var(--warntx);padding:9px 13px;border-radius:8px;font-size:12px;margin-bottom:14px}
.assetbox{max-height:280px;overflow:auto;border:1px solid var(--border);border-radius:8px} .assetbox td{padding:5px 8px} .adv{margin-top:8px}
.assettbl{table-layout:fixed;width:100%}
.assettbl .ast-col-host{width:26%} .assettbl .ast-col-tier{width:96px}
.assettbl .ast-col-find{width:124px} .assettbl .ast-col-risk{width:104px} .assettbl .ast-col-act{width:138px}
.assettbl td,.assettbl th{vertical-align:middle}
.assettbl .ast-wrap{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal;word-break:break-word;overflow-wrap:anywhere;line-height:1.35;max-height:2.7em}
.assettbl .ast-tier{width:96px;text-align:center;white-space:nowrap}
.assettbl .ast-findcell{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;white-space:nowrap}
.assettbl .ast-findcell .ast-crit{margin-left:auto;flex-shrink:0}
.assettbl .ast-act,.assettbl .ast-act-h{position:sticky;right:0;z-index:2;background:var(--panel);white-space:nowrap;box-shadow:-8px 0 10px rgba(0,0,0,.08)}
.assettbl tbody tr:hover .ast-act,.assettbl tbody tr.asel .ast-act{background:var(--panel2)}
.assettbl tbody tr{cursor:pointer;transition:background .12s} .assettbl tbody tr:hover,.assettbl tbody tr.asel{background:var(--panel2)}
.assettbl .ast-find,.assettbl .ast-risk,.assettbl .ast-find-h,.assettbl .ast-risk-h{white-space:nowrap}
.assettbl .ast-nums{display:inline-flex;align-items:center;gap:5px;flex-wrap:nowrap;white-space:nowrap}
.assettbl .ast-nums .badge{flex-shrink:0;font-size:10px;padding:1px 7px;line-height:1.35}
.appstack-card{border:1px solid var(--border);border-radius:12px;padding:14px 16px;margin-bottom:14px;background:var(--panel)}
.appstack-hd{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:10px}
.appstack-kpis{display:flex;gap:8px;flex-wrap:wrap}
.appstack-deploy{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-bottom:10px;padding:8px 10px;background:var(--panel2);border-radius:8px}
.appdeploy-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:999px;border:1px solid var(--border);font-size:12px;background:var(--panel)}
.appstack-tbl{margin-top:6px}
.appstack-tbl tbody tr{cursor:pointer}
.appstack-comp:hover{background:var(--panel2)}
.atier{display:inline-block;font-size:10px;font-weight:700;text-transform:uppercase;padding:2px 7px;border-radius:8px;border:1px solid;max-width:100%}
.assetdetail-wrap{margin-top:14px;padding:14px 16px;border:2px solid var(--accent);border-radius:12px;background:var(--panel2);animation:fade .2s}
.assetdetail-hd{display:flex;align-items:center;gap:8px;font-weight:800;font-size:15px;margin-bottom:10px}
.assetacts{display:flex;gap:4px;flex-wrap:nowrap;justify-content:flex-end}
.assetacts .sec.ico{padding:5px 7px;min-width:28px;font-size:12px}
.agrp{border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin-bottom:8px} .agrp-h{display:flex;align-items:center;gap:8px;font-weight:700;font-size:13px;flex-wrap:wrap}
details summary{cursor:pointer;color:var(--muted);font-size:12.5px;font-weight:600;padding:6px 0}
.chk{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text)} .chk input{width:auto} .chk.off{opacity:.4;cursor:not-allowed}
/* slider custom: il riempimento sta sul TRACK esplicito (non sullo sfondo dell'input) e termina al centro del pallino
   a ogni posizione (calc con la larghezza del thumb). Il track esplicito rende prevedibile la corsa del thumb in webkit
   (inset = metà-thumb) -> niente stacco tra barra e pallino al minimo. Il pallino (accent2, tinta più chiara) ha bordo
   del colore del pannello per staccare bene dalla barra scura. */
input[type=range]{-webkit-appearance:none;appearance:none;width:100%;background:transparent;cursor:pointer;margin:8px 0;--thumb:18px}
input[type=range]::-webkit-slider-runnable-track{height:8px;border-radius:6px;
  background:linear-gradient(to right, var(--accent) 0,
    var(--accent) calc(var(--thumb)/2 + var(--pf,.5)*(100% - var(--thumb))),
    var(--sltrack,var(--border)) calc(var(--thumb)/2 + var(--pf,.5)*(100% - var(--thumb))),
    var(--sltrack,var(--border)) 100%)}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:18px;height:18px;border-radius:50%;background:var(--accent2);border:2px solid var(--panel);box-shadow:0 1px 5px rgba(0,0,0,.35);cursor:pointer;margin-top:-5px}
input[type=range]::-moz-range-track{height:8px;border-radius:6px;background:var(--sltrack,var(--border))}
input[type=range]::-moz-range-progress{height:8px;border-radius:6px;background:var(--accent)}
input[type=range]::-moz-range-thumb{width:16px;height:16px;border:2px solid var(--panel);border-radius:50%;background:var(--accent2);cursor:pointer}
input[type=range]:disabled{opacity:.45;cursor:not-allowed}
.sliderlab{display:flex;justify-content:space-between;font-size:11px;color:var(--muted);margin-top:5px;gap:6px}
.sliderlab .cur{color:var(--accent2);font-weight:800;font-family:var(--mono);font-size:12px;background:var(--chipbg);padding:1px 8px;border-radius:10px;border:1px solid var(--border);text-align:center;flex:0 0 auto}
.sliderlab>span:first-child{text-align:left} .sliderlab>span:last-child{text-align:right}
.info{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;background:var(--panel2);border:1px solid var(--border);color:var(--muted);font-size:10px;font-weight:700;cursor:help;position:relative;margin-left:6px;vertical-align:middle}
.info:hover::after{content:attr(data-tip);position:absolute;left:20px;top:-6px;width:250px;background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:9px 11px;font-size:11.5px;line-height:1.45;color:var(--text);box-shadow:0 6px 18px rgba(0,0,0,.4);z-index:30;white-space:normal;font-weight:400;text-transform:none;letter-spacing:0}
.info:hover{color:var(--accent);border-color:var(--accent)}
/* --- TERMINAL --- */
#terminal .card{padding:0;overflow:hidden}
.termbar{display:flex;align-items:center;gap:8px;padding:9px 14px;background:var(--head);border-bottom:1px solid var(--border);font-family:var(--mono);font-size:11px;color:var(--muted)}
.tled{width:11px;height:11px;border-radius:50%} .tled.r{background:#ff5f56}.tled.y{background:#ffbd2e}.tled.g{background:#27c93f}
.termout{font-family:var(--mono);font-size:12.5px;line-height:1.55;background:var(--termbg);color:var(--termtx);padding:14px 16px;height:52vh;overflow:auto;white-space:pre-wrap;word-break:break-word}
.termout .cmd{color:var(--accent2)} .termout .err{color:#ff6a5a} .termout .sys{color:var(--muted)}
.termin{display:flex;align-items:center;gap:8px;background:var(--termbg);border-top:1px solid var(--border);padding:10px 14px}
.termin .ps{color:var(--good);font-family:var(--mono);font-size:12.5px;white-space:nowrap}
.termin input{background:transparent;border:0;color:var(--termtx);font-family:var(--mono);font-size:12.5px;padding:4px;outline:none}
.quickcmds{display:flex;gap:6px;flex-wrap:wrap;padding:8px 14px;background:var(--panel);border-top:1px solid var(--border)}
.qc{display:inline-flex;align-items:center;gap:5px;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);font-size:11px;background:var(--panel2);border:1px solid var(--border);border-radius:7px;padding:4px 9px;cursor:pointer;color:var(--text)} .qc:hover{border-color:var(--accent);color:var(--accent)}
.qc i{font-size:9.5px;opacity:.7}
.qc-used{background:var(--seltint);border-color:var(--accent)}   /* comandi dallo storico d'uso: leggera tinta accento */
.qc-used i{color:var(--accent);opacity:.9}
.termbar-btn{margin-left:auto;background:var(--panel2);border:1px solid var(--border);color:var(--text);border-radius:8px;padding:5px 11px;font-size:11.5px;cursor:pointer;font-family:inherit;display:inline-flex;gap:6px;align-items:center}
.termbar-btn:hover{border-color:var(--accent);color:var(--accent)}

/* --- QUICK ACTIONS --- */
.qbar{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px}
.qact{display:inline-flex;align-items:center;gap:8px;border-radius:11px;padding:10px 16px;font-size:12.5px;font-weight:700;cursor:pointer;font-family:var(--ui-font);line-height:1.2;border:1px solid var(--border)}
.qact.primary{background:var(--accent);color:var(--accent-text);border-color:transparent} .qact.primary:hover{filter:brightness(1.06)}
.qact.ghost{background:var(--panel);color:var(--text)} .qact.ghost:hover{border-color:var(--accent);color:var(--accent)}
.qact i{font-size:13px}
/* --- TOAST --- */
.toasts{position:fixed;right:18px;bottom:18px;z-index:80;display:flex;flex-direction:column;gap:10px;max-width:340px}
.toast{background:var(--panel);border:1px solid var(--border);border-left:4px solid var(--accent);border-radius:12px;padding:12px 14px;box-shadow:0 12px 34px rgba(0,0,0,.45);font-size:12.5px;display:flex;gap:11px;align-items:flex-start;animation:slidein .3s}
.toast.ok{border-left-color:var(--good)} .toast.err{border-left-color:#ff5a4d}
.toast i{margin-top:1px;color:var(--accent)} .toast.ok i{color:var(--good)} .toast.err i{color:#ff5a4d}
.toast .tt{font-weight:700;margin-bottom:2px} .toast .tx{color:var(--muted)}
@keyframes slidein{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:none}}
/* --- MODAL (palette + libreria comandi) --- */
.modal{position:fixed;inset:0;z-index:90;background:rgba(0,0,0,.55);backdrop-filter:blur(3px);display:none;align-items:flex-start;justify-content:center;padding-top:9vh}
.modal.on{display:flex;animation:fade .18s}
.modalbox{width:min(700px,94vw);max-height:80vh;overflow:hidden;background:var(--panel);border:1px solid var(--border);border-radius:16px;box-shadow:0 26px 74px rgba(0,0,0,.6);display:flex;flex-direction:column}
.modalhd{display:flex;align-items:center;gap:11px;padding:14px 16px;border-bottom:1px solid var(--border)}
.modalhd i{color:var(--accent)} .modalhd input{border:0;background:transparent;color:var(--text);font-size:15px;flex:1;outline:none;font-family:inherit}
.modalhd .kbd{font-family:var(--mono);font-size:10px;color:var(--muted);border:1px solid var(--border);border-radius:6px;padding:2px 6px}
.modalbody{overflow:auto;padding:8px}
.cpitem{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:10px;cursor:pointer}
.cpitem:hover,.cpitem.act{background:var(--panel2)} .cpitem.act{outline:1px solid var(--accent)}
.cpitem>i{width:20px;text-align:center;color:var(--accent)} .cpitem .cpl{font-weight:600;font-size:13px;flex-shrink:0} .cpitem .cps{font-size:11px;color:var(--muted)}
.cpitem .cpd{font-size:11px;color:var(--muted);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cpitem .cmd{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--muted);background:var(--panel2);border:1px solid var(--border);border-radius:6px;padding:2px 7px;white-space:nowrap;max-width:48%;overflow:hidden;text-overflow:ellipsis}
.cpcat{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--accent);padding:13px 12px 4px;font-weight:800}
/* --- LIVE LOG --- */
.logpanel{background:var(--termbg);border:1px solid var(--border);border-radius:12px;overflow:hidden;margin-bottom:16px}
.logpanel .lh{display:flex;align-items:center;gap:8px;padding:9px 14px;border-bottom:1px solid var(--border);font-family:var(--mono);font-size:11px;color:var(--muted)}
.logpanel pre{margin:0;padding:12px 14px;max-height:240px;overflow:auto;font-family:var(--mono);font-size:11.5px;line-height:1.5;color:var(--termtx);white-space:pre-wrap;word-break:break-word}
/* Banner di stato scan + log live: guardie anti-collasso/anti-sovrapposizione. min-width:0 impedisce che una label
   lunga (host/kind) forzi un min-content > contenitore (overflow orizzontale) e che i figli flex rifiutino di ridursi;
   overflow-wrap:anywhere fa andare a capo il testo DENTRO al box invece di incolonnarlo. Difesa in profondità: nel
   flusso normale questi div sono già a piena larghezza di <main>, ma così un reflow sfortunato non può jumbleare. */
#runban,#livelog{min-width:0;width:100%}
#runban .warn{min-width:0;overflow-wrap:anywhere}
#runban .warn .run{min-width:0}
.logpanel{min-width:0}
/* Banner «Coda: N job in attesa». NB: NON usare class="info" (è il cerchietto «?» da 15px: schiaccerebbe il testo
   in un cerchio, incolonnandolo/sovrapponendolo). Classe dedicata, theme-aware su tutti i 14 temi. */
.qban{display:flex;align-items:center;gap:8px;min-width:0;overflow-wrap:anywhere;margin:8px 0 14px;padding:8px 13px;font-size:12px;background:var(--panel2);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:8px;color:var(--text)}
.qban i{color:var(--accent);flex:none}
.spark{vertical-align:middle;margin-top:4px}
/* --- MAIL SECURITY --- */
.dropzone{border:2px dashed var(--border);border-radius:14px;padding:26px 18px;text-align:center;cursor:pointer;transition:.2s;background:var(--panel2)}
.dropzone:hover,.dropzone.drag{border-color:var(--accent);background:var(--panel);box-shadow:var(--neon)}
.dropzone i{font-size:30px;color:var(--accent)} .dropzone .dz-t{font-weight:700;margin-top:8px} .dropzone .dz-s{font-size:11.5px;color:var(--muted);margin-top:3px}
.verdictbar{display:flex;align-items:center;gap:16px;border-radius:14px;padding:16px 20px;margin-bottom:16px;border:1px solid var(--border)}
.verdictbig{font-family:'Orbitron',var(--mono);font-size:30px;font-weight:800}
.gauge{width:64px;height:64px;flex:none}
.authgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:16px}
.authcard{background:var(--panel2);border:1px solid var(--border);border-radius:12px;padding:13px 15px}
.authcard .ac-l{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--muted)}
.authcard .ac-v{font-size:17px;font-weight:800;margin-top:3px} .authcard .ac-s{font-size:11px;color:var(--muted);margin-top:3px;word-break:break-word}
.pass{color:var(--good)} .fail{color:#ff5a4d} .unk{color:var(--muted)}
.badge{display:inline-block;border-radius:20px;padding:2px 10px;font-size:11px;font-weight:700;font-family:var(--mono)}
.badge.p{background:rgba(87,184,122,.16);color:var(--good)} .badge.f{background:rgba(224,80,58,.16);color:#ff5a4d} .badge.u{background:var(--chipbg);color:var(--muted);border:1px solid var(--border)}
.mrow{display:flex;gap:10px;font-size:12.5px;padding:5px 0;border-bottom:1px solid var(--border)} .mrow .k{color:var(--muted);min-width:120px}
/* mini-grafico di trend (finding aperti nel tempo) nella card Delta */
.trendbars{display:flex;align-items:flex-end;gap:3px;height:44px;padding:2px 0}
.trendbars .tbar{flex:1;min-width:3px;max-width:16px;background:linear-gradient(180deg,var(--accent2),var(--accent));border-radius:2px 2px 0 0;opacity:.85;transition:opacity .12s}
.trendbars .tbar:hover{opacity:1}
.flagli{font-size:12px;color:#ff9a3d;margin:2px 0} .flagli i{margin-right:6px}
.spinner{width:22px;height:22px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin 1s linear infinite;display:inline-block}
@keyframes spin{to{transform:rotate(360deg)}}
/* stati di caricamento/vuoti uniformi (design #5): skeleton shimmer riusabile + empty-state coerente */
.skel{position:relative;overflow:hidden;background:var(--panel2);border-radius:8px}
.skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,var(--seltint),transparent);animation:shimmer 1.3s infinite}
@keyframes shimmer{100%{transform:translateX(100%)}}
.skel-row{height:14px;margin:10px 14px;border-radius:6px}
.skel-list .skel-row:nth-child(3n){width:60%} .skel-list .skel-row:nth-child(3n+1){width:85%}
.emptystate{text-align:center;color:var(--muted);padding:26px 16px;font-size:13px}
.emptystate i{display:block;font-size:26px;opacity:.35;margin-bottom:10px}
/* --- SSL/TLS + PORTE --- */
.grade{width:78px;height:78px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-family:'Orbitron',var(--mono);font-size:36px;font-weight:800;color:#fff;flex:none;box-shadow:var(--neon)}
.protorow{display:flex;align-items:center;gap:10px;padding:7px 0;border-bottom:1px solid var(--border);font-size:12.5px}
.protorow .pn{min-width:82px;font-family:var(--mono);font-weight:700}
.protopill{display:inline-block;border-radius:16px;padding:2px 9px;font-size:11px;font-weight:700;font-family:var(--mono)}
.proto-ok{background:rgba(87,184,122,.16);color:var(--good)} .proto-old{background:rgba(224,123,58,.16);color:#ff9a3d} .proto-bad{background:rgba(224,80,58,.16);color:#ff5a4d}
.catbtns{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.catbtn{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--border);background:var(--panel2);border-radius:10px;padding:8px 12px;font-size:12px;cursor:pointer;font-family:var(--ui-font);line-height:1.2;color:var(--text)}
.catbtn:hover{border-color:var(--muted)} .catbtn.on{border-color:var(--accent);background:var(--seltint);color:var(--accent)}
.catbtn .cc{font-family:var(--mono);font-size:10px;color:var(--muted)}
.pstate{font-family:var(--mono);font-size:11px;font-weight:700;border-radius:6px;padding:1px 8px}
.st-open{background:rgba(87,184,122,.16);color:var(--good)} .st-closed{background:var(--chipbg);color:var(--muted);border:1px solid var(--border)}
/* Web-check: scheda host aggregata (stile web-check.xyz), tema-aware via variabili CSS */
.wc-wrap{border:1px solid var(--border);border-radius:12px;overflow:hidden;background:var(--panel2)}
.wc-top{display:flex;align-items:center;gap:14px;padding:14px 16px;background:var(--panel);border-bottom:1px solid var(--border)}
.wc-grade{width:52px;height:52px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:26px;font-weight:800;color:#fff;flex:0 0 auto}
.wc-host{font-family:var(--mono);font-size:16px;font-weight:700;color:var(--text)}
.wc-sub{font-size:12px;color:var(--muted)}
.wc-notes{padding:10px 16px;font-size:12.5px;color:var(--text);border-bottom:1px solid var(--border)}
.wc-notes ul{margin:4px 0 0;padding-left:20px} .wc-notes li{margin:2px 0}
.wc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;padding:14px 16px}
.wc-card{border:1px solid var(--border);border-radius:10px;padding:10px 12px;background:var(--panel)}
.wc-h{font-size:12.5px;font-weight:700;color:var(--accent);margin-bottom:8px}
.wc-kv{display:flex;justify-content:space-between;gap:10px;font-size:12.5px;padding:2px 0;color:var(--muted)}
.wc-kv b{color:var(--text);text-align:right;word-break:break-word}
.wc-muted{font-size:12px;color:var(--muted)}
.wc-chip{display:inline-block;background:var(--chipbg);border:1px solid var(--border);border-radius:8px;padding:1px 8px;margin:3px 4px 0 0;font-size:11px;font-family:var(--mono);color:var(--text)}
.wc-chip.wc-high{border-color:#e0503a;color:#e0776a} .wc-chip.wc-medium{border-color:#e0a83a;color:#d9a94b}
/* ===== POSTURE PULSE (idea B): fascia "mission control" in cima alla dashboard ===== */
.posturebar{background:linear-gradient(120deg,var(--head) 0%,var(--panel) 70%);border:1px solid var(--border);border-radius:16px;padding:16px 22px 18px;margin-bottom:16px;position:relative;overflow:hidden}
/* tema chiaro: niente sfumatura navy->bianco, grigio uniforme coerente con le altre superfici */
body[data-theme="light"] .posturebar{background:var(--panel2)}
.posturebar::before{content:"";position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(90deg,transparent 0 40px,rgba(255,255,255,.018) 40px 41px)}
.posturebar::after{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:linear-gradient(90deg,transparent,var(--accent),transparent);opacity:.5}
.pb-hd{display:flex;align-items:center;gap:10px;font-family:var(--mono);font-size:10.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted);margin-bottom:14px;position:relative;z-index:1}
.pb-live{display:inline-flex;align-items:center;gap:7px;color:var(--good);font-weight:700}
.pb-live .d{width:8px;height:8px;border-radius:50%;background:var(--good);box-shadow:0 0 9px var(--good);animation:pulse 1.6s infinite}
.pb-when{margin-left:auto;font-size:10px;opacity:.75;letter-spacing:.4px}
.pb-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;position:relative;z-index:1}
.pb-m{position:relative;padding:2px 4px}
.pb-m + .pb-m{border-left:1px solid var(--border)}
.pb-n{font-family:'Orbitron',var(--mono);font-size:40px;font-weight:800;line-height:1;letter-spacing:-1.5px;text-shadow:var(--glow)}
.pb-l{font-size:10.5px;color:var(--muted);margin-top:8px;text-transform:uppercase;letter-spacing:.5px}
.pb-m .spark{position:absolute;right:6px;top:2px;opacity:.65}
@media(max-width:760px){.pb-grid{grid-template-columns:repeat(2,1fr)}.pb-m:nth-child(3){border-left:none}}

/* ===== LIVE THREAT WIRE (idea A): feed threat-intel animato ===== */
.wire-live{display:inline-flex;align-items:center;gap:6px;margin-left:10px;font-family:var(--mono);font-size:10px;font-weight:700;letter-spacing:1px;color:var(--good);vertical-align:middle}
.wire-live .d{width:7px;height:7px;border-radius:50%;background:var(--good);box-shadow:0 0 8px var(--good);animation:pulse 1.6s infinite}
.feed .ev{display:flex;align-items:baseline;gap:8px}
.feed .ev .sdot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;align-self:center}
.feed .ev .rel{color:var(--muted);font-size:10px;opacity:.85;flex:0 0 auto;min-width:52px}
.feed .ev .body{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.feed .ev.src-ransomfeed .body a,.feed .ev.src-ransomfeed .body{color:#ff7a6b}
.feed .fl .ev{animation:wireIn .35s ease both}
@keyframes wireIn{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}
#feedrefresh.spin i{animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
/* ===== RISK RADAR (idea D): priorità di rimedio per risk_score ===== */
.rr-row{display:flex;align-items:center;gap:12px;padding:8px 0;border-bottom:1px dashed var(--border)}
.rr-row:last-child{border-bottom:none}
.rr-rank{font-family:'Orbitron',var(--mono);font-size:15px;font-weight:800;color:var(--muted);width:22px;text-align:center;flex:0 0 auto}
.rr-main{flex:1;min-width:0}
.rr-t{display:flex;align-items:baseline;gap:8px;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rr-t .nm{font-weight:600;overflow:hidden;text-overflow:ellipsis}
.rr-asset{color:var(--muted);font-size:11px;flex:0 0 auto}
.rr-track{height:7px;background:var(--panel2);border-radius:5px;margin-top:5px;overflow:hidden}
.rr-fill{height:7px;border-radius:5px;width:0;transition:width .8s cubic-bezier(.2,.8,.2,1)}
.rr-side{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.rr-score{font-family:'Orbitron',var(--mono);font-size:16px;font-weight:800;min-width:44px;text-align:right}
.rr-b{font-family:var(--mono);font-size:9.5px;font-weight:700;letter-spacing:.4px;padding:2px 6px;border-radius:5px;background:var(--chipbg);color:var(--muted);border:1px solid var(--border)}
.rr-b.kev{background:rgba(224,80,58,.16);color:#e0503a;border-color:rgba(224,80,58,.4)}
.rr-b.epss{background:rgba(224,168,58,.15);color:#c58a1a;border-color:rgba(224,168,58,.35)}
.rr-b.cve{color:var(--accent2)}
/* ===== MAPPA ESPOSIZIONE ASSET (idea C) ===== */
#geobtn.spin i{animation:spin 1s linear infinite}
/* Vera mappa geografica (tile raster CARTO "dark_all", derivate da OpenStreetMap, nessuna chiave richiesta):
   costa/confini/città reali, non un grafico a dispersione con soli assi lat/lon. */
.ageo-mapwrap{position:relative;border-radius:12px;overflow:hidden;border:1px solid var(--border);
  height:240px;background:#0a1220;cursor:grab;touch-action:none}
.ageo-mapwrap.grabbing{cursor:grabbing}
.ageo-tiles,.ageo-markers{position:absolute;inset:0;pointer-events:none}
.ageo-tiles img{position:absolute;width:256px;height:256px;user-select:none;pointer-events:none}
.ageo-marker{position:absolute;width:0;height:0;pointer-events:auto;cursor:pointer}
.ageo-m-halo{position:absolute;left:-14px;top:-14px;width:28px;height:28px;border-radius:50%;background:currentColor;opacity:.16}
.ageo-m-ring{position:absolute;left:-8px;top:-8px;width:16px;height:16px;border-radius:50%;background:currentColor;opacity:.35;border:1.5px solid currentColor}
.ageo-m-core{position:absolute;left:-3px;top:-3px;width:6px;height:6px;border-radius:50%;background:currentColor;box-shadow:0 0 4px currentColor}
.ageo-marker:hover .ageo-m-ring{opacity:.55}
/* popup al click su un marker: asset + IP in primo piano */
.ageo-popup{position:absolute;z-index:5;background:rgba(8,14,24,.95);border:1px solid rgba(255,255,255,.25);
  border-radius:8px;padding:8px 22px 8px 10px;font-family:var(--mono);font-size:11px;color:#e8ecf2;
  min-width:150px;max-width:220px;box-shadow:0 4px 16px rgba(0,0,0,.5)}
.ageo-pop-hd{font-size:12.5px;font-weight:700;margin-bottom:3px;overflow-wrap:break-word}
.ageo-pop-row{margin-top:2px;line-height:1.4}
.ageo-pop-row.muted{color:rgba(255,255,255,.55)}
.ageo-pop-x{position:absolute;top:4px;right:5px;width:16px;height:16px;line-height:14px;text-align:center;
  border:none;background:transparent;color:rgba(255,255,255,.6);cursor:pointer;font-size:13px;padding:0}
.ageo-pop-x:hover{color:#fff}
/* bordo/sfondo col colore accento del tema: su un basemap scuro, un bottone quasi-nero si perdeva */
.ageo-zoomctl{position:absolute;top:8px;right:8px;display:flex;flex-direction:column;gap:5px;z-index:2}
.ageo-zoomctl button{width:26px;height:26px;line-height:1;border-radius:7px;border:1.5px solid var(--accent);
  background:rgba(0,0,0,.6);color:#fff;font-family:var(--mono);font-size:15px;font-weight:800;cursor:pointer;padding:0;
  box-shadow:0 1px 5px rgba(0,0,0,.6)}
.ageo-zoomctl button:hover{background:var(--accent);color:var(--accent-text)}
.ageo-hint{position:absolute;left:8px;bottom:6px;font-size:9.5px;color:rgba(255,255,255,.55);font-family:var(--mono);pointer-events:none;text-shadow:0 1px 2px rgba(0,0,0,.8);z-index:2}
.ageo-attrib{position:absolute;right:8px;bottom:6px;font-size:9px;color:rgba(255,255,255,.55);font-family:var(--mono);z-index:2}
.ageo-attrib a{color:rgba(255,255,255,.75)}
.ageo-ccbar{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0}
.ageo-cc{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:4px 9px;border-radius:8px;background:var(--panel2);border:1px solid var(--border)}
.ageo-cc.ext{border-color:rgba(224,168,58,.5);background:rgba(224,168,58,.08)}
.ageo-list{display:flex;flex-direction:column;max-height:260px;overflow-y:auto}
.ageo-row{display:flex;align-items:center;gap:10px;padding:7px 0;border-bottom:1px dashed var(--border);font-size:13px}
.ageo-row:last-child{border-bottom:none}
.ageo-fl{font-size:16px;flex:0 0 auto;width:22px;text-align:center}
.ageo-h{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ageo-h .mono{font-size:11px;margin-left:6px}
.ageo-prov{flex:0 0 auto;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:11px}
.ageo-badges{display:flex;gap:5px;flex:0 0 auto}
.ageo-r{font-family:'Orbitron',var(--mono);font-size:14px;font-weight:800;min-width:42px;text-align:right;flex:0 0 auto}
@media(max-width:640px){.ageo-prov{display:none}}
/* Security Assessment — riepilogo scanner (dashboard) */
.secval-panel{background:var(--panel2);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:10px;padding:14px 16px}
.secval-panel h3{margin:0 0 10px;font-size:13px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:8px}
.secval-panel h3 i{color:var(--accent)}
.secval-gate{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:16px;font-size:11px;font-weight:700;margin-bottom:10px}
.secval-gate.pass{background:rgba(58,157,92,.12);color:var(--good);border:1px solid rgba(58,157,92,.35)}
.secval-gate.fail{background:rgba(224,80,58,.1);color:#e0503a;border:1px solid rgba(224,80,58,.35)}
.secval-tbl{width:100%;border-collapse:collapse;font-size:12px}
.secval-tbl th,.secval-tbl td{padding:6px 8px;border-bottom:1px solid var(--border);text-align:left}
.secval-tbl th{font-size:10px;text-transform:uppercase;letter-spacing:.4px;color:var(--muted);font-weight:600}
.secval-tbl td.c,.secval-tbl th.c{text-align:center}
.secval-tbl tr.skip td{opacity:.5}
.secval-tbl .gf-ok{color:var(--good);font-weight:700}
.secval-tbl .gf-fail{color:#e0503a;font-weight:700}
.secval-badge{display:inline-block;font-size:10px;font-weight:700;padding:2px 7px;border-radius:6px;background:rgba(47,111,224,.12);color:var(--accent);margin-left:6px;vertical-align:middle}
/* BIA (Business Impact Analysis) — striscia impatto, chip asset, righe di collegamento */
.bia-strip{display:inline-flex;gap:2px;vertical-align:middle}
.bia-cell{width:22px;height:18px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;color:#fff;border-radius:3px;text-shadow:0 1px 1px rgba(0,0,0,.35)}
.bia-chip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:2px 9px;border-radius:20px;border:1px solid var(--border);background:transparent;color:var(--muted);cursor:pointer}
.bia-chip:hover{border-color:var(--accent);color:var(--accent)}
.bia-chip.on{border-color:var(--accent);color:var(--accent);background:rgba(47,111,224,.10)}
.bia-linkrow{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:5px 8px;border:1px solid var(--border);border-radius:8px;margin-bottom:6px;font-size:12px}
/* BIA — analisi (grafici), filtri, ordinamento */
.bia-anahead{display:flex;align-items:center;gap:10px;font-size:13px;padding:2px 0}
/* Primitive dei cruscotti analitici: nate per la BIA, ora condivise (Risk Matrix VAPT, ecc.) -> il nome canonico e'
   `ana-*`; gli alias `bia-*` restano perche' app-bia.js li usa gia' ovunque. Stesso stile = stesso linguaggio visivo. */
.ana-charts,.bia-charts{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}
.ana-card,.bia-card{border:1px solid var(--border);border-radius:12px;padding:12px 14px;background:var(--panel2,transparent)}
.ana-ctitle,.bia-ctitle{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);margin-bottom:10px}
.ana-track,.bia-track{background:var(--panel2);border:1px solid var(--border);border-radius:5px;height:9px;margin-top:3px;overflow:hidden}
.ana-fill,.bia-fill{height:100%;background:var(--accent);border-radius:5px;position:relative;min-width:2px}
.bia-fill-crit{position:absolute;left:0;top:0;height:100%;background:#e0503a;border-radius:5px 0 0 5px}
.ana-lg,.bia-lg{display:block;font-size:12px;margin:3px 0}
.ana-dot,.bia-dot{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:6px;vertical-align:middle}
/* voce di legenda cliccabile = filtro (stesso gesto delle barre BIA) */
.ana-lg.click{cursor:pointer;border-radius:6px;padding:1px 5px;margin-left:-5px}
.ana-lg.click:hover{background:var(--panel)}
.ana-lg.on{background:var(--panel);outline:1px solid var(--accent)}
.bia-filterbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px 10px;border:1px solid var(--border);border-radius:10px;background:var(--panel2,transparent)}
.bia-filterbar input[type=text],.bia-filterbar input:not([type]),.bia-filterbar select{font-size:12px;padding:5px 8px}
.bia-flabel{font-size:11.5px;color:var(--muted);display:inline-flex;align-items:center;gap:4px;cursor:pointer}
.bia-impchips{display:inline-flex;gap:4px}
.bia-impchip{width:26px;height:26px;border-radius:7px;border:1.5px solid var(--border);background:transparent;color:var(--muted);font-weight:700;font-size:12px;cursor:pointer}
.bia-impchip:hover{border-color:var(--c);color:var(--c)}
.bia-impchip.on{background:var(--c);border-color:var(--c);color:#fff}
.bia-sort{cursor:pointer;user-select:none}
.bia-sort:hover{color:var(--accent)}
.bia-sort::after{content:"\2195";opacity:.35;font-size:10px;margin-left:3px}
/* BIA — barre cliccabili (drill-down) + pill filtro sistema */
.bia-bar{cursor:pointer;border-radius:6px;padding:2px 4px;margin-left:-4px;margin-right:-4px;transition:background .12s}
.bia-bar:hover{background:var(--panel2)}
.bia-bar.on{background:rgba(47,111,224,.12);box-shadow:inset 0 0 0 1px var(--accent)}
.bia-bar:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.bia-pill{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;padding:3px 9px;border-radius:20px;background:rgba(47,111,224,.12);border:1px solid var(--accent);color:var(--accent)}
.bia-pill a{color:inherit;text-decoration:none;font-weight:700;font-size:14px;line-height:1}

/* ============================================================================
   MICRO-INTERAZIONI GLOBALI (tutti i temi) — profondita' + hover, SENZA blur.
   Il blur (backdrop-filter) e' l'UNICO costo reale in GPU e resta esclusivo del
   tema Glass; hover-lift/glow/focus/transizioni sono economici (transform e
   box-shadow su UN solo elemento, solo in hover) -> applicabili ovunque, adattivi
   al tema via var(--accent)/var(--selring). Guardia prefers-reduced-motion in fondo.
   ============================================================================ */
.card,.osintgrp,.cfgblk,.rapidact-card,.bia-card,.ana-card{
  transition:transform .22s cubic-bezier(.2,.8,.2,1),border-color .22s ease,box-shadow .22s ease;
}
.card:hover,.rapidact-card:hover,.bia-card:hover,.ana-card:hover{
  transform:translateY(-2px);border-color:var(--accent);
  box-shadow:0 6px 22px rgba(0,0,0,.18),0 0 14px var(--selring);
}
button.go{transition:transform .18s cubic-bezier(.2,.8,.2,1),box-shadow .18s ease,filter .18s ease}
button.go:hover{transform:translateY(-2px);box-shadow:0 6px 18px var(--selring);filter:brightness(1.06)}
button.go:active{transform:translateY(1px)}
.sec,.dl,.fam{transition:transform .18s cubic-bezier(.2,.8,.2,1),background .18s,border-color .18s,box-shadow .18s}
.sec:hover,.dl:hover{transform:translateY(-1px);box-shadow:0 2px 8px var(--selring)}
.fam:hover{transform:translateY(-2px)}
select:focus,input:focus,textarea:focus{box-shadow:0 0 0 3px var(--selring)}
@media (prefers-reduced-motion: reduce){
  .card,.osintgrp,.cfgblk,.rapidact-card,.bia-card,.ana-card,button.go,.sec,.dl,.fam{transition:none !important}
  .card:hover,.rapidact-card:hover,.bia-card:hover,.ana-card:hover,button.go:hover,button.go:active,.sec:hover,.dl:hover,.fam:hover{transform:none !important}
}
/* A11y: focus da TASTIERA visibile e coerente (WCAG 2.4.7). :focus-visible non mostra l'anello sul click col mouse,
   solo su navigazione da tastiera -> nessun impatto estetico sull'uso normale. Colore = accento del tema. */
a:focus-visible,button:focus-visible,select:focus-visible,input:focus-visible,textarea:focus-visible,
[role="button"]:focus-visible,[tabindex]:focus-visible,.tab:focus-visible,.sec:focus-visible,.dl:focus-visible,.fam:focus-visible{
  outline:2px solid var(--accent);outline-offset:2px;
}

/* ============================================================================
   TEMA «GLASS» — glassmorphism opt-in, selezionabile dal menu temi.
   Tutto scopato sotto body[data-theme="glass"] -> specificita' 0,2,1 batte le
   regole base (0,1,0) SENZA !important; gli altri 13 temi restano intatti.
   Perf: backdrop-filter SOLO su header + modali (non su ogni card). A11y:
   guardia prefers-reduced-motion in fondo.
   ============================================================================ */
body[data-theme="glass"]{
  --font:'Inter',-apple-system,Segoe UI,Roboto,sans-serif;--mono:'JetBrains Mono',Consolas,monospace;
  --bg:#09090b;--bg2:#18181b;--panel:rgba(24,24,27,0.72);--panel2:rgba(39,39,42,0.6);
  --border:rgba(63,63,70,0.5);--border-focus:rgba(161,161,170,0.6);
  --text:#fafafa;--muted:#a1a1aa;--accent:#06b6d4;--accent2:#3b82f6;--accent-text:#080808;
  --head:rgba(9,9,11,0.75);--head-text:#ffffff;
  --tab:#a1a1aa;--tab-active:rgba(6,182,212,0.15);--tab-active-text:#22d3ee;
  --input:rgba(0,0,0,0.4);--link:#22d3ee;
  --good:#34d399;--warnbg:#2a1f10;--warnbd:#f59e0b;--warntx:#fcd34d;
  --glow:0 4px 24px rgba(0,0,0,0.4);--neon:0 0 20px rgba(6,182,212,0.4);
  --grid:rgba(6,182,212,0.05);--termbg:#050506;--termtx:#5eead4;
  --seltint:rgba(6,182,212,0.08);--selring:rgba(6,182,212,0.3);--chipbg:rgba(24,24,27,0.6);
}
/* tipografia del tema */
body[data-theme="glass"]{letter-spacing:.015em;line-height:1.6}
body[data-theme="glass"] h1,
body[data-theme="glass"] h2,
body[data-theme="glass"] h3,
body[data-theme="glass"] .kpi .n,
body[data-theme="glass"] .rapidact-t,
body[data-theme="glass"] .bs-logo{font-family:'Outfit',var(--font)}

/* Header in vetro: blur qui (UNA superficie grande, in cima) */
body[data-theme="glass"] header{
  background:var(--head);
  backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);
  border-bottom:1px solid var(--border);box-shadow:0 4px 30px rgba(0,0,0,.5);
}
/* Card "vetro": pannello translucido + bordo + ombra, SENZA blur per-card (perf: il blur
   su decine di card fa scattare lo scroll; l'effetto vetro resta dato dalla translucenza). */
body[data-theme="glass"] .card,
body[data-theme="glass"] .osintgrp,
body[data-theme="glass"] .cfgblk,
body[data-theme="glass"] .rapidact-card,
body[data-theme="glass"] .feed,
body[data-theme="glass"] .modeinfo,
body[data-theme="glass"] .bia-card,
body[data-theme="glass"] .ana-card{
  background:var(--panel);border:1px solid var(--border);border-radius:16px;box-shadow:0 4px 24px rgba(0,0,0,.2);
  transition:transform .25s cubic-bezier(.2,.8,.2,1),border-color .25s ease,box-shadow .25s ease;
}
body[data-theme="glass"] .card:hover,
body[data-theme="glass"] .rapidact-card:hover,
body[data-theme="glass"] .bia-card:hover,
body[data-theme="glass"] .ana-card:hover{
  transform:translateY(-3px);border-color:var(--border-focus);box-shadow:0 8px 32px rgba(0,0,0,.3),0 0 16px var(--selring);
}
/* Modali: blur qui (poche, grandi, in primo piano) */
body[data-theme="glass"] .modalbox{
  background:var(--panel);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
  border:1px solid var(--border);border-radius:16px;box-shadow:0 8px 40px rgba(0,0,0,.5);
}
/* Pulsanti primari (niente scale sul testo: eviterebbe la sfocatura in hover) */
body[data-theme="glass"] button.go{
  background:linear-gradient(135deg,var(--accent),var(--accent2));color:#fff;border:none;border-radius:12px;
  text-shadow:0 1px 2px rgba(0,0,0,.3);box-shadow:0 4px 12px rgba(6,182,212,.3);
  transition:transform .2s cubic-bezier(.2,.8,.2,1),box-shadow .2s ease,filter .2s ease;
}
body[data-theme="glass"] button.go:hover{
  transform:translateY(-2px);box-shadow:0 6px 20px rgba(6,182,212,.5),inset 0 0 0 1px rgba(255,255,255,.2);filter:brightness(1.08);
}
body[data-theme="glass"] button.go:active{transform:translateY(1px)}
/* Voci di navigazione / famiglie */
body[data-theme="glass"] .sec,
body[data-theme="glass"] .dl,
body[data-theme="glass"] .tab,
body[data-theme="glass"] .fam{border-radius:10px;transition:transform .2s cubic-bezier(.2,.8,.2,1),background .2s,border-color .2s,box-shadow .2s}
body[data-theme="glass"] .sec:hover,
body[data-theme="glass"] .dl:hover{background:var(--seltint);border-color:var(--accent);box-shadow:0 2px 10px var(--selring);transform:translateY(-1px)}
body[data-theme="glass"] .fam:hover{transform:translateY(-2px)}
/* Input / form */
body[data-theme="glass"] select,
body[data-theme="glass"] input,
body[data-theme="glass"] textarea{border-radius:10px;background:var(--input);border:1px solid var(--border);transition:border-color .2s,box-shadow .2s}
body[data-theme="glass"] select:focus,
body[data-theme="glass"] input:focus,
body[data-theme="glass"] textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--selring);outline:none}
body[data-theme="glass"] .tab-badge{border-radius:6px}

/* A11y: rispetta "riduci animazioni" (qui !important e' legittimo: la preferenza utente deve vincere) */
@media (prefers-reduced-motion: reduce){
  body[data-theme="glass"] .card,
  body[data-theme="glass"] .osintgrp,
  body[data-theme="glass"] .cfgblk,
  body[data-theme="glass"] .rapidact-card,
  body[data-theme="glass"] .feed,
  body[data-theme="glass"] .modeinfo,
  body[data-theme="glass"] .bia-card,
  body[data-theme="glass"] .ana-card,
  body[data-theme="glass"] button.go,
  body[data-theme="glass"] .sec,
  body[data-theme="glass"] .dl,
  body[data-theme="glass"] .tab,
  body[data-theme="glass"] .fam{transition:none !important}
  body[data-theme="glass"] .card:hover,
  body[data-theme="glass"] .rapidact-card:hover,
  body[data-theme="glass"] .bia-card:hover,
  body[data-theme="glass"] .ana-card:hover,
  body[data-theme="glass"] button.go:hover,
  body[data-theme="glass"] button.go:active,
  body[data-theme="glass"] .sec:hover,
  body[data-theme="glass"] .dl:hover,
  body[data-theme="glass"] .fam:hover{transform:none !important}
}
