:root{--asm-accent:#6c3bff;--asm-accent-2:#5125d6;--asm-up:#2fb344;--asm-down:#5b6472;--asm-dis:#d63939;--asm-lag:#ae3ec9;--asm-tag:#f76707;--asm-poe:#fab005}
body{font-feature-settings:"cv03","cv04","cv11";-webkit-font-smoothing:antialiased}
[data-bs-theme=dark] body{background:#0b1220}
[data-bs-theme=dark] .card{background:#111a2b;border-color:#1f2a3d}
[data-bs-theme=dark] .page-header,[data-bs-theme=dark] .topbar{background:transparent}
/* sidebar */
.asm-sidebar{background:linear-gradient(180deg,#0f172a 0%,#0b1220 100%)!important;border-right:1px solid #1e293b;transition:width .2s ease}
.asm-brand{display:flex;align-items:center;gap:.6rem;font-weight:700;letter-spacing:.2px;color:#fff!important;text-decoration:none}
.asm-logo{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,var(--asm-accent),var(--asm-accent-2));display:grid;place-items:center;color:#fff;font-size:1.2rem;box-shadow:0 4px 14px rgba(108,59,255,.35)}
.asm-brand small{display:block;font-weight:500;font-size:.68rem;color:#94a3b8;letter-spacing:.6px;text-transform:uppercase}
.asm-sidebar .nav-link{border-radius:8px;margin:2px 10px;color:#cbd5e1}
.asm-sidebar .nav-link:hover{background:rgba(255,255,255,.05);color:#fff}
.asm-sidebar .nav-link.active{background:rgba(108,59,255,.14);color:#fff;box-shadow:inset 3px 0 0 var(--asm-accent)}
.asm-sidebar .dropdown-item.active{background:rgba(108,59,255,.18);color:#fff;font-weight:600;box-shadow:inset 3px 0 0 var(--asm-accent)}
.asm-sidebar .nav-section{font-size:.65rem;text-transform:uppercase;letter-spacing:1px;color:#64748b;padding:1rem 1.6rem .3rem}
.asm-sidebar .sw-dot{width:8px;height:8px;border-radius:50%;background:#64748b;display:inline-block}
.sw-dot.ok{background:var(--asm-up);box-shadow:0 0 0 3px rgba(47,179,68,.2)}.sw-dot.bad{background:var(--asm-dis);box-shadow:0 0 0 3px rgba(214,57,57,.2)}
@media (min-width:992px){
 body.sb-collapsed .asm-sidebar{width:4.5rem}
 body.sb-collapsed .asm-sidebar .nav-link-title,body.sb-collapsed .asm-sidebar .asm-brand .t,body.sb-collapsed .asm-sidebar .nav-section,body.sb-collapsed .asm-sidebar .sb-extra{display:none!important}
 body.sb-collapsed .page-wrapper{margin-left:4.5rem!important}
 body.sb-collapsed .asm-sidebar .nav-link{justify-content:center}
}
/* top bar */
.topbar{position:sticky;top:0;z-index:1020;backdrop-filter:saturate(180%) blur(10px);background:rgba(255,255,255,.75)!important;border-bottom:1px solid var(--tblr-border-color)}
[data-bs-theme=dark] .topbar{background:rgba(11,18,32,.75)!important}
.gsearch{position:relative;max-width:520px;width:100%}
.gsearch .kbd-hint{position:absolute;right:.6rem;top:50%;transform:translateY(-50%);pointer-events:none}
.gsearch-results{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:1100;max-height:60vh;overflow:auto;display:none}
.gsearch-results.show{display:block}
.gsearch-results .list-group-item.active{background:rgba(108,59,255,.12);color:inherit;border-color:transparent}
/* cards / kpis */
.kpi{position:relative;overflow:hidden}
.kpi .kpi-icon{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;font-size:1.35rem}
.kpi .kpi-value{font-size:1.75rem;font-weight:700;line-height:1.1}
.kpi .spark{position:absolute;right:0;bottom:0;width:55%;opacity:.9}
.card{transition:transform .15s ease,box-shadow .15s ease}
.card-hover:hover{transform:translateY(-2px);box-shadow:0 10px 30px rgba(0,0,0,.12)}
.fade-in{animation:fadeIn .35s ease both}@keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
/* skeleton */
.sk{background:linear-gradient(90deg,rgba(130,140,160,.12) 25%,rgba(130,140,160,.24) 37%,rgba(130,140,160,.12) 63%);background-size:400% 100%;animation:sk 1.3s ease infinite;border-radius:6px}
@keyframes sk{0%{background-position:100% 50%}100%{background-position:0 50%}}
.sk-line{height:12px;margin:.4rem 0}.sk-title{height:22px;width:40%}.sk-block{height:120px}
/* health ring */
.ring{--p:0;--c:var(--asm-up);width:64px;height:64px;border-radius:50%;background:conic-gradient(var(--c) calc(var(--p)*1%),rgba(130,140,160,.18) 0);display:grid;place-items:center;flex:none}
.ring>span{width:50px;height:50px;border-radius:50%;background:var(--tblr-bg-surface);display:grid;place-items:center;font-weight:700;font-size:.85rem}
.sw-icon{width:56px;height:30px;border-radius:5px;background:linear-gradient(180deg,#3a4558,#232b38);position:relative;box-shadow:inset 0 1px 0 rgba(255,255,255,.08);flex:none}
.sw-icon:before{content:"";position:absolute;left:6px;right:14px;top:8px;height:5px;background:repeating-linear-gradient(90deg,#9fb1c7 0 3px,transparent 3px 5px);opacity:.7}
.sw-icon:after{content:"";position:absolute;left:6px;right:14px;bottom:8px;height:5px;background:repeating-linear-gradient(90deg,#9fb1c7 0 3px,transparent 3px 5px);opacity:.7}
.sw-icon i{position:absolute;right:4px;top:4px;width:5px;height:5px;border-radius:50%;background:var(--asm-up)}
.sw-icon.bad i{background:var(--asm-dis)}
/* hero */
.hero{background:radial-gradient(1200px 300px at 0% 0%,rgba(108,59,255,.18),transparent 60%),linear-gradient(135deg,#0f172a,#1e293b);color:#e2e8f0;border:0}
.hero .text-secondary{color:#94a3b8!important}
.hero .hero-meta .item{padding-right:1.5rem;margin-right:1.5rem;border-right:1px solid rgba(255,255,255,.08)}
.hero .hero-meta .item:last-child{border:0}
.hero .lbl{font-size:.68rem;text-transform:uppercase;letter-spacing:.8px;color:#94a3b8}
.hero .val{font-weight:600;color:#fff}
.nav-tabs-asm{border:0;gap:.25rem;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
.nav-tabs-asm .nav-link{border:0;border-radius:8px;padding:.5rem .85rem;color:var(--tblr-secondary);white-space:nowrap}
.nav-tabs-asm .nav-link.active{background:rgba(108,59,255,.12);color:var(--asm-accent);font-weight:600}
/* front panel */
.chassis{background:linear-gradient(180deg,#2b3340 0%,#1b212b 100%);border-radius:12px;padding:14px 16px;box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 8px 24px rgba(0,0,0,.25);overflow-x:auto;color:#cbd5e1}
.chassis-inner{display:flex;align-items:stretch;gap:18px;min-width:max-content}
.chassis .brand{display:flex;flex-direction:column;justify-content:space-between;padding-right:10px;border-right:1px solid rgba(255,255,255,.08);min-width:92px}
.chassis .brand b{color:var(--asm-accent);font-size:.8rem;letter-spacing:1px}
.chassis .brand small{font-size:.62rem;color:#8b98ab}
.pblock{display:grid;grid-auto-flow:column;grid-template-rows:auto auto;gap:14px 3px}
.pblock.sfp{padding-left:14px;border-left:1px dashed rgba(255,255,255,.12)}
.pgroup{display:flex;gap:12px}
.pt{position:relative;width:30px;height:26px;cursor:pointer;display:flex;flex-direction:column;align-items:center;transition:transform .12s}
.pt:hover{transform:translateY(-1px) scale(1.06);z-index:2}
.pt .jack{width:26px;height:21px;background:#0b0f15;border:2px solid #4b5563;border-radius:3px;position:relative}
.pt .jack:after{content:"";position:absolute;left:24%;width:52%;height:34%;bottom:-2px;background:#1e252f;border:2px solid;border-color:inherit;border-bottom-color:#1e252f;border-radius:2px 2px 0 0}
.pt.bottom .jack:after{bottom:auto;top:-2px;border-bottom-color:inherit;border-top-color:#1e252f;border-radius:0 0 2px 2px}
.pt.sfpp .jack:after{left:15%;width:70%;height:30%;bottom:auto;top:35%;border:0;background:#1f2937;border-radius:1px}
.pt.sfpp .jack{width:28px;height:16px;border-radius:2px;background:#0b0f15;border-color:#6b7280;margin-top:3px}
.pt .led{position:absolute;width:6px;height:4px;border-radius:1px;background:#374151;top:-6px;left:4px}
.pt.bottom .led{top:auto;bottom:-6px}
.pt .num{position:absolute;font-size:.58rem;color:#9ca3af;top:-15px;width:100%;text-align:center}
.pt.bottom .num{top:auto;bottom:-16px}
.pt.up .jack{border-color:var(--asm-up);background:#0f2a18}.pt.up .led{background:#4ade80;box-shadow:0 0 6px #4ade80}
.pt.down .jack{border-color:#4b5563}
.pt.disabled .jack{border-color:var(--asm-dis);background:repeating-linear-gradient(45deg,#2a0f12 0 4px,#140608 4px 8px)}.pt.disabled .led{background:#ef4444}
.pt.poe .jack{box-shadow:0 0 0 2px rgba(250,176,5,.35),0 0 12px 2px rgba(250,176,5,.55)}
.pt.poe .led:after{content:"";position:absolute;left:9px;top:0;width:6px;height:4px;border-radius:1px;background:var(--asm-poe);box-shadow:0 0 6px var(--asm-poe)}
.pt .pmark{position:absolute;left:3px;right:3px;height:3px;border-radius:2px;bottom:-3px}
.pt.bottom .pmark{bottom:auto;top:-3px}
.pt.lag .pmark{background:var(--asm-lag)}.pt.tagged .pmark{background:var(--asm-tag)}
.pt.sel .jack{outline:2px solid #fff;outline-offset:2px}
.pt.flash .jack{animation:pflash 1s ease 3}@keyframes pflash{50%{outline:3px solid var(--asm-accent);outline-offset:3px}}
.chassis-rows{padding:14px 0}
.plegend span{display:inline-flex;align-items:center;gap:.35rem;margin-right:1rem;font-size:.78rem;color:var(--tblr-secondary)}
.plegend i.sw{width:12px;height:10px;border-radius:2px;display:inline-block;border:2px solid}
/* vlan matrix */
.matrix{border-collapse:separate;border-spacing:0;font-size:.78rem}
.matrix th,.matrix td{padding:.3rem .45rem;text-align:center;border-bottom:1px solid var(--tblr-border-color);white-space:nowrap}
.matrix thead th{position:sticky;top:0;background:var(--tblr-bg-surface);z-index:2;vertical-align:bottom}
.matrix thead th .vn{writing-mode:vertical-rl;transform:rotate(180deg);font-weight:500;color:var(--tblr-secondary);max-height:110px;overflow:hidden;text-overflow:ellipsis}
.matrix td:first-child,.matrix th:first-child{position:sticky;left:0;background:var(--tblr-bg-surface);text-align:left;z-index:1}
.matrix .c{width:26px;height:22px;border-radius:5px;display:inline-grid;place-items:center;font-weight:700;cursor:default}
.matrix .c.U{background:rgba(32,107,196,.18);color:#4299e1}.matrix .c.T{background:rgba(247,103,7,.18);color:var(--asm-tag)}
.matrix tbody tr:hover td{background:rgba(108,59,255,.06)}
.matrix .c.edit{cursor:pointer}.matrix .c.e{opacity:0;border:1px dashed var(--tblr-border-color)}.matrix tr:hover .c.e{opacity:.7}
.matrix-wrap{max-height:70vh;overflow:auto}
/* misc */
pre.raw,pre.term{max-height:460px;overflow:auto;font-size:.78rem;border-radius:8px}
pre.term{background:#0b0f15;color:#d1fae5;padding:1rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.chip{cursor:pointer}
.empty-state{padding:2.5rem 1rem;text-align:center;color:var(--tblr-secondary)}
.empty-state i{font-size:2.6rem;opacity:.6;display:block;margin-bottom:.5rem}
.offcanvas .dl{display:grid;grid-template-columns:120px 1fr;gap:.45rem .75rem;font-size:.85rem}.offcanvas .dl dt{color:var(--tblr-secondary);font-weight:500}
.alert-row{display:flex;gap:.75rem;align-items:flex-start;padding:.7rem 1rem;border-bottom:1px solid var(--tblr-border-color)}
.alert-row:last-child{border:0}
.login-bg{min-height:100vh;background:radial-gradient(900px 500px at 10% 10%,rgba(108,59,255,.25),transparent 60%),radial-gradient(800px 500px at 90% 90%,rgba(32,107,196,.25),transparent 60%),#0b1220}
.glass{background:rgba(17,26,43,.85)!important;backdrop-filter:blur(12px);border:1px solid #1f2a3d!important}
@media (max-width:576px){.hero .hero-meta .item{border:0;margin-right:1rem;padding-right:0}.kpi .kpi-value{font-size:1.4rem}}
.ti-spin{animation:spin 1s linear infinite;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}
.asm-sidebar .navbar-brand{margin:0!important;padding-left:.25rem}
.asm-brand .t{font-size:.92rem;line-height:1.15;white-space:nowrap}
/* ---- Deskivo additions (accent: teal #6c3bff) ---- */
.btn-accent{background:linear-gradient(135deg,var(--asm-accent),var(--asm-accent-2));border:0;color:#fff}
.btn-accent:hover{color:#fff;filter:brightness(1.08)}
.tenant-pill{font-size:.72rem;color:#94a3b8;padding:0 1.6rem .6rem;display:block}
.tenant-pill b{color:#e2e8f0;font-weight:600}
body.sb-collapsed .tenant-pill{display:none}
.sig-pad{width:100%;height:160px;border:1px dashed var(--tblr-border-color);border-radius:8px;background:#fff;touch-action:none;cursor:crosshair}
.sig-img{max-width:100%;height:90px;background:#fff;border-radius:6px;padding:4px}
.perm-group{border:1px solid var(--tblr-border-color);border-radius:8px;padding:.6rem .8rem;margin-bottom:.6rem}
.perm-group h5{font-size:.7rem;text-transform:uppercase;letter-spacing:.8px;color:var(--tblr-secondary);margin-bottom:.4rem}
.risk-high{color:var(--asm-dis)}.risk-medium{color:#f59f00}
.module-table tbody tr{cursor:pointer}
.org-tree .site{border-left:2px solid rgba(108,59,255,.35);margin-left:.6rem;padding-left:.9rem}
.row-warn td{background:rgba(247,103,7,.08)!important}.row-warn td:first-child{box-shadow:inset 3px 0 0 #f76707}

/* stage 4-6 */
th.sortable{cursor:pointer;user-select:none} th.sortable:hover{color:var(--sd-accent,#6c3bff)}
.rule-box{border-left:2px solid #6c3bff;padding-left:.5rem}
.rule-box:empty::before{content:"No rows yet";color:var(--tblr-secondary);font-size:.8rem}
.kv dt{color:var(--tblr-secondary);font-weight:400}
