/* NUML gwctl dashboard theme — extracted unchanged from the gateway UI */
:root{--bg:#101214;--side:#151719;--panel:#191c1f;--panel2:#202428;--hover:#262b2f;--border:#2b3034;--text:#f1f3f4;
--muted:#a1a9ae;--subtle:#747e86;--lime:#c4f369;--lime-bg:#c4f36912;--lime-text:#c4f369;--on-lime:#202913;
--blue:#7ec5fa;--blue-bg:#7ec5fa14;--purple:#bdabf9;--purple-bg:#bdabf914;--orange:#edb86c;--orange-bg:#edb86c12;
--red:#f39198;--red-bg:#f3919814;--shadow:0 20px 70px #0005;--radius:17px;--ease:cubic-bezier(.2,.8,.2,1);
--line:var(--border);--bad:var(--red);--map-bg:#141618;--map-dot:#ffffff12;--map-tile:#202326;--map-line:#3a4045;color-scheme:dark}
[data-theme=light]{--bg:#f5f6f8;--side:#fff;--panel:#fff;--panel2:#f0f2f4;--hover:#e9edf0;--border:#dfe4e8;--text:#1c2328;
--muted:#5e6972;--subtle:#7b858d;--lime:#c4f369;--lime-bg:#76a90014;--lime-text:#507918;--blue:#207eb2;--blue-bg:#207eb212;
--purple:#8360c3;--purple-bg:#8360c312;--orange:#946019;--orange-bg:#94601912;--red:#b53443;--red-bg:#b5344310;
--shadow:0 20px 70px #23303d20;--map-bg:#fbfcfd;--map-dot:#1c232818;--map-tile:#fff;--map-line:#c9d1d7;color-scheme:light}
*{box-sizing:border-box}html{scroll-padding-top:20px}[hidden]{display:none!important}
body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;-webkit-font-smoothing:antialiased}
button,input,select,textarea{font:inherit}a{color:var(--lime-text);text-decoration:none}a:hover{text-decoration:underline}
h1,h2,h3,p{margin:0}h1{font-size:32px;line-height:1.2;letter-spacing:-1.1px;font-weight:600}
h2{font-size:15px;letter-spacing:-.3px;font-weight:600;display:flex;align-items:center;gap:9px;flex-wrap:wrap}h3{font-size:12px;font-weight:600;margin:0 0 8px;color:var(--muted)}
b,strong{font-weight:600}
.icon{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.65;stroke-linecap:round;stroke-linejoin:round;display:block;flex-shrink:0}
:focus-visible{outline:2px solid var(--lime-text);outline-offset:3px}
.skip{position:fixed;top:-80px;left:16px;z-index:100;background:var(--lime);color:var(--on-lime);padding:10px 14px;border-radius:8px}.skip:focus{top:10px}
/* ---- sidebar ---- */
.side{position:fixed;inset:0 auto 0 0;width:226px;background:var(--side);border-right:1px solid var(--border);padding:28px 18px 16px;display:flex;flex-direction:column;z-index:30;overflow-y:auto}
.brand{display:flex;align-items:center;gap:11px;line-height:1.1;padding-left:8px;margin-bottom:38px;color:var(--text)}
.brand:hover{text-decoration:none}
.brand-mark{height:36px;width:36px;display:grid;place-items:center;background:var(--lime);color:#23321a;border-radius:11px}
.brand-mark .icon{width:22px;height:22px;stroke-width:2}
.brand-title{font-size:19px;font-weight:650;letter-spacing:-.8px;white-space:nowrap}.brand-sub{display:block;white-space:nowrap;font-size:9px;letter-spacing:2.6px;color:var(--subtle);margin-top:6px}
.nav-label{font-size:10px;letter-spacing:1.8px;text-transform:uppercase;font-weight:600;color:var(--subtle);padding:0 13px;margin-bottom:10px}
.nav{display:grid;gap:4px}
.nav a{display:flex;align-items:center;gap:11px;padding:10px 13px;border:1px solid transparent;border-radius:9px;font-size:12.5px;color:var(--muted);transition:background .2s,color .2s}
.nav a:hover{background:var(--panel2);color:var(--text);text-decoration:none}
.nav a.on{background:var(--lime-bg);color:var(--lime-text);border-color:#a9ca5815}
.nav a .icon{width:17px;height:17px}
.side-foot{margin-top:auto;padding-top:28px}
.svc-card{padding:14px 15px;background:var(--panel);border:1px solid var(--border);border-radius:12px;margin-bottom:16px}
.svc-card .nav-label{padding:0;margin-bottom:9px}
.svc{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--muted);line-height:2}
.svc i{width:6px;height:6px;border-radius:50%;background:var(--subtle);display:inline-block;flex-shrink:0}
.svc i.active{background:var(--lime-text);box-shadow:0 0 0 3px var(--lime-bg)}.svc i.failed,.svc i.inactive{background:var(--red)}
.profile{border-top:1px solid var(--border);padding:15px 4px 0;display:flex;align-items:center;gap:10px}
.profile .name{font-size:12px;font-weight:600}.profile .role{font-size:10px;color:var(--subtle);margin-top:1px}
.avatar{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;background:var(--purple-bg);color:var(--purple);font-weight:600;font-size:12px;flex-shrink:0;text-transform:uppercase}
.icon-btn{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;background:transparent;border:1px solid transparent;border-radius:9px;color:var(--muted);cursor:pointer;transition:background .2s,color .2s}
.icon-btn:hover{background:var(--hover);color:var(--text)}.icon-btn .icon{width:17px;height:17px}
/* ---- topbar ---- */
.shell{margin-left:226px}
.topbar{height:72px;padding:0 34px;display:flex;align-items:center;justify-content:space-between;gap:14px;border-bottom:1px solid var(--border);background:var(--bg);position:sticky;top:0;z-index:20}
.crumb{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--subtle);min-width:0}
.crumb strong{font-weight:500;color:var(--text);white-space:nowrap}.crumb .icon{width:14px;height:14px}
.top-actions{display:flex;align-items:center;gap:10px}
.cmd{display:flex;align-items:center;gap:10px;padding:7px 9px 7px 11px;background:var(--side);border:1px solid var(--border);border-radius:8px;color:var(--subtle);width:220px;text-align:left;font-size:11.5px;cursor:pointer}
.cmd:hover{border-color:var(--subtle)}.cmd .icon{width:14px;height:14px}.cmd kbd{margin-left:auto}
kbd{display:inline-block;background:var(--panel2);border:1px solid var(--border);border-radius:4px;padding:0 5px;font-size:10px;line-height:19px;color:var(--muted);font-family:inherit}
.sep{height:22px;width:1px;background:var(--border)}
.live{display:inline-flex;align-items:center;gap:7px;font-size:11px;color:var(--subtle);white-space:nowrap}
.live:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--lime-text);box-shadow:0 0 0 4px var(--lime-bg)}
.live.stale:before{background:var(--orange);box-shadow:0 0 0 4px var(--orange-bg)}
.menu-btn{display:none}
main{max-width:1600px;margin:0 auto;padding:32px 34px 40px;min-height:calc(100vh - 72px)}
.head{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:26px;flex-wrap:wrap}
.eyebrow{font-size:9.5px;letter-spacing:1.8px;text-transform:uppercase;font-weight:600;color:var(--subtle);margin-bottom:9px}
.head p{margin-top:9px;font-size:12.5px;color:var(--muted);max-width:640px}
.sub{color:var(--muted);font-size:12px;margin:5px 0 0;line-height:1.6}
/* ---- surfaces ---- */
.panel{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);min-width:0}
.panel .panel{background:var(--bg);border-radius:13px}
.pad{padding:21px 22px}.mb{margin-bottom:20px}
.grid{display:grid;gap:18px}.g6{grid-template-columns:repeat(6,minmax(0,1fr))}.g4{grid-template-columns:repeat(4,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}.g2{grid-template-columns:repeat(2,minmax(0,1fr))}.g21{grid-template-columns:1.65fr 1fr}
.strip{gap:1px;background:var(--border);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}
.strip>.panel{border:0;border-radius:0;background:var(--panel)}
.stat{padding:20px 22px}
.stat .k{display:flex;align-items:center;gap:7px;font-size:11px;color:var(--muted)}
.stat .k:before{content:"";width:5px;height:5px;border-radius:50%;background:var(--lime-text)}
.stat.c2 .k:before{background:var(--blue)}.stat.c3 .k:before{background:var(--purple)}.stat.c4 .k:before{background:var(--orange)}.stat.c5 .k:before{background:var(--red)}.stat.c6 .k:before{background:var(--lime-text)}
.stat .v{font-size:26px;letter-spacing:-.9px;margin:8px 0 2px;font-weight:550;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stat .s{font-size:10.5px;color:var(--subtle)}
.bar{height:4px;border-radius:5px;background:var(--panel2);margin-top:12px;overflow:hidden}
.bar i{display:block;height:100%;background:var(--lime);border-radius:5px;transition:width 1s var(--ease);max-width:100%}
.stat.c2 .bar i{background:var(--blue)}.stat.c3 .bar i{background:var(--purple)}
/* ---- forms ---- */
.field,select,textarea{color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:9px;padding:9px 12px;outline:none;min-width:0;font-size:13px;transition:border-color .2s,box-shadow .2s}
select{padding-right:28px;cursor:pointer}
textarea{width:100%;min-height:100px;resize:vertical;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}
.field:focus,select:focus,textarea:focus{border-color:var(--lime-text);box-shadow:0 0 0 3px var(--lime-bg)}
::placeholder{color:var(--subtle)}
label.l{display:flex;flex-direction:column;gap:7px;font-size:11.5px;font-weight:500;color:var(--muted)}
.btn{font-weight:600;font-size:12px;border:1px solid var(--lime);border-radius:9px;padding:8px 14px;min-height:36px;cursor:pointer;background:var(--lime);color:var(--on-lime);
white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;gap:7px;transition:background .18s,transform .18s,border-color .18s}
.btn:hover:not(:disabled){background:#d5fa8c;border-color:#d5fa8c;transform:translateY(-1px);text-decoration:none}
.btn:active:not(:disabled){transform:none}.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.ghost{background:var(--panel2);color:var(--text);border-color:var(--border)}
.btn.ghost:hover:not(:disabled){background:var(--hover);border-color:var(--subtle)}
.btn.bad,.btn.ghost.bad{background:var(--red-bg);color:var(--red);border-color:var(--red)}.btn.bad:hover:not(:disabled){background:var(--red-bg);border-color:var(--red);filter:brightness(1.15)}
.btn.good{background:var(--lime-bg);color:var(--lime-text);border-color:var(--lime-text)}.btn.good:hover:not(:disabled){background:var(--lime-bg);border-color:var(--lime-text);filter:brightness(1.2)}
.btn.sm{min-height:29px;padding:4px 10px;font-size:11px;border-radius:8px}
.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.row.end{align-items:flex-end}.spacer{flex:1}
.form{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));align-items:end}.form .wide{grid-column:1/-1}
.switch{display:flex;align-items:center;gap:12px;cursor:pointer;font-weight:500;font-size:13px}
.switch input{appearance:none;width:36px;height:21px;border-radius:20px;border:1px solid var(--border);background:var(--panel2);position:relative;cursor:pointer;transition:background .2s,border-color .2s;flex:none;margin:0}
.switch input:after{content:"";position:absolute;width:13px;height:13px;border-radius:50%;background:var(--muted);top:3px;left:3px;transition:transform .2s var(--ease),background .2s}
.switch input:checked{background:var(--lime);border-color:var(--lime)}.switch input:checked:after{transform:translateX(15px);background:#2c3b1e}
.switch small{display:block;font-weight:400;color:var(--subtle);font-size:11px;margin-top:2px;line-height:1.5}
/* ---- tables ---- */
table{width:100%;border-collapse:collapse;text-align:left}
th{font-size:9.5px;letter-spacing:.6px;font-weight:500;color:var(--subtle);text-transform:uppercase;padding:11px 12px;border-bottom:1px solid var(--border);background:var(--side);position:sticky;top:0;z-index:1;white-space:nowrap}
th:first-child,td:first-child{padding-left:20px}th:last-child,td:last-child{padding-right:20px}
th.sort{cursor:pointer;user-select:none}th.sort:hover{color:var(--text)}th.sort.asc:after{content:" ↑"}th.sort.desc:after{content:" ↓"}
td{padding:12px;border-bottom:1px solid var(--border);font-size:12px;vertical-align:middle}
tbody tr{transition:background .2s}tbody tr:hover{background:var(--panel2)}tbody tr:last-child td{border-bottom:0}
.scroll{overflow:auto;max-height:68vh}.scroll.short{max-height:420px}
.pad .scroll,.pad>table{border:1px solid var(--border);border-radius:12px;background:var(--panel)}
.panel>.scroll,.panel>div>table{border-top:1px solid var(--border)}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;font-variant-numeric:tabular-nums}
.muted{color:var(--muted)}.faint{color:var(--subtle)}.small{font-size:11px}
/* ---- pills ---- */
.badge{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;font-weight:500;border-radius:6px;padding:3px 8px;white-space:nowrap;background:var(--panel2);color:var(--muted);vertical-align:middle}
.b-limit,.b-cls{color:var(--blue);background:var(--blue-bg)}.b-block{color:var(--red);background:var(--red-bg)}
.b-unlimited{color:var(--lime-text);background:var(--lime-bg)}.b-warn{color:var(--orange);background:var(--orange-bg)}
.b-grey{color:var(--muted);background:var(--panel2)}.b-violet{color:var(--purple);background:var(--purple-bg)}
h2 .badge{font-size:10px;padding:2px 6px;border:1px solid var(--border);font-weight:500}
.tabs{display:flex;gap:3px;background:var(--side);border:1px solid var(--border);border-radius:9px;padding:3px}
.tab{border:1px solid transparent;background:transparent;padding:6px 11px;border-radius:7px;color:var(--muted);font-size:11.5px;cursor:pointer}
.tab:hover{color:var(--text)}.tab.on{background:var(--panel2);border-color:var(--border);color:var(--text)}
.dot{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:8px;background:var(--subtle);vertical-align:middle}
.dot.on{background:var(--lime-text);box-shadow:0 0 0 4px var(--lime-bg)}.dot.idle{background:var(--orange)}
.rate{font-variant-numeric:tabular-nums;font-weight:500;white-space:nowrap}.down{color:var(--lime-text)}.up{color:var(--blue)}
.lim{font-size:10px;color:var(--subtle);margin-top:2px}
.acts{display:flex;gap:4px;align-items:center;flex-wrap:nowrap}.acts .icon-btn{width:29px;height:29px}.acts .icon-btn .icon{width:15px;height:15px}.acts .vr{width:1px;height:18px;background:var(--border);margin:0 3px}.icon-btn.danger:hover{color:var(--red);background:var(--red-bg)}.icon-btn.on{color:var(--lime-text);background:var(--lime-bg);border-color:#a9ca5833}
.acts input{width:54px;padding:5px 7px;font-size:11.5px;border-radius:7px}
input.nm{border:1px solid transparent;background:transparent;padding:5px 7px;width:128px;border-radius:7px;color:var(--text);font-size:12px;font-weight:500}
input.nm:hover,input.nm:focus{border-color:var(--border);background:var(--bg);outline:none}
/* ---- feedback ---- */
.notice{position:fixed;right:24px;bottom:24px;max-width:390px;display:flex;gap:10px;align-items:flex-start;padding:14px 16px;border:1px solid var(--border);border-radius:12px;background:var(--panel2);color:var(--text);
font-size:12px;box-shadow:var(--shadow);z-index:80;opacity:0;transform:translateY(10px);transition:opacity .2s,transform .25s var(--ease);pointer-events:none}
.notice:before{content:"";width:8px;height:8px;margin-top:4px;border-radius:50%;background:var(--lime-text);box-shadow:0 0 0 4px var(--lime-bg);flex-shrink:0}
.notice.show{opacity:1;transform:none}.notice.err:before{background:var(--red);box-shadow:0 0 0 4px var(--red-bg)}.notice.err{border-color:#f3919855}
.alert{display:block;padding:12px 15px;border:1px solid #edb86c44;color:var(--orange);border-radius:10px;background:var(--orange-bg);font-size:12px;margin-bottom:16px;line-height:1.6}
.alert.err{color:var(--red);border-color:#f3919844;background:var(--red-bg)}
.alert.info{color:var(--muted);border-color:var(--border);background:var(--panel)}
.alert.warn{color:var(--orange)}
.empty{padding:34px 20px;text-align:center;color:var(--subtle);font-size:12px}
/* ---- app cards ---- */
.apps{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px}
.app{border:1px solid var(--border);border-radius:13px;padding:17px;background:var(--bg);display:flex;flex-direction:column;gap:11px;transition:transform .2s,border-color .2s}
.app:hover{transform:translateY(-2px);border-color:var(--subtle)}
.app.on-all{border-color:#f3919866;background:var(--red-bg)}.app.on-devices{border-color:#bdabf966;background:var(--purple-bg)}
.app .t{display:flex;justify-content:space-between;align-items:center;gap:8px;font-weight:600;font-size:13px}
.app select{width:100%}
.chips{display:flex;flex-wrap:wrap;gap:5px}.chip{font-size:10px;padding:2px 7px;border-radius:5px;background:var(--panel2);color:var(--muted);font-family:ui-monospace,monospace}
.chart{width:100%;height:230px;display:block}
.legend{display:flex;gap:16px;font-size:10.5px;color:var(--subtle);margin-top:10px}.legend i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;vertical-align:-1px}
details>summary{list-style:none;cursor:pointer}details>summary::-webkit-details-marker{display:none}
/* ---- dialogs ---- */
dialog{border:1px solid var(--border);border-radius:20px;padding:0;width:min(540px,94vw);background:var(--panel);color:var(--text);box-shadow:var(--shadow)}
dialog[open]{animation:enter .23s var(--ease)}
dialog::backdrop{background:#07090ca8;backdrop-filter:blur(7px)}
.dlg-h{padding:23px 25px 16px}.dlg-h h2{font-size:19px;letter-spacing:-.6px}
.dlg-b{padding:0 25px 18px;max-height:60vh;overflow:auto}
.dlg-f{padding:16px 25px;border-top:1px solid var(--border);display:flex;gap:9px;justify-content:flex-end;align-items:center}
.check{display:flex;align-items:center;gap:10px;padding:9px 6px;border-bottom:1px solid var(--border);font-size:12.5px;cursor:pointer;border-radius:7px}
.check:hover{background:var(--panel2)}
.check input{width:16px;height:16px;accent-color:var(--lime);flex-shrink:0}
.kv{display:grid;grid-template-columns:max-content 1fr;gap:9px 20px;font-size:12px;align-items:center}.kv>div{min-width:0;overflow-wrap:anywhere}.kv div:nth-child(odd){color:var(--subtle)}
.sc-apps{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:6px}
.sc-apps .check,.daybox{border:1px solid var(--border);border-radius:9px;padding:8px 10px;background:var(--bg)}
.daybox{display:inline-flex;align-items:center;gap:7px;font-size:12px;cursor:pointer;user-select:none}
.daybox input{accent-color:var(--lime);width:15px;height:15px;margin:0}
.daybox:has(input:checked),.sc-apps .check:has(input:checked){border-color:var(--lime-text);background:var(--lime-bg);color:var(--lime-text)}
.sched{position:relative}.sched.live{border-color:var(--lime-text)}
.sched .when{font-size:20px;font-weight:550;letter-spacing:-.5px;font-variant-numeric:tabular-nums}
.app .edit{opacity:.7}.app:hover .edit{opacity:1}
/* ---- command palette ---- */
#cmdk{width:min(560px,94vw);margin-top:12vh}
.cmd-search{display:flex;align-items:center;gap:12px;padding:16px 22px;border-bottom:1px solid var(--border);color:var(--subtle)}
.cmd-search input{border:0;background:none;outline:none;color:var(--text);font-size:15px;width:100%;padding:4px}
.cmd-list{padding:8px;max-height:360px;overflow:auto;display:grid;gap:2px}
.cmd-opt{border:0;background:none;display:flex;gap:12px;align-items:center;width:100%;text-align:left;padding:11px 13px;border-radius:9px;color:var(--muted);font-size:12.5px;cursor:pointer}
.cmd-opt small{margin-left:auto;font-size:10px;color:var(--subtle)}.cmd-opt.sel,.cmd-opt:hover{background:var(--panel2);color:var(--text)}
.cmd-foot{padding:10px 22px;border-top:1px solid var(--border);font-size:10px;color:var(--subtle)}
.scrim{display:none}
/* ---- monitoring ---- */
.nav a .nb{margin-left:auto;font-size:10px;font-weight:600;min-width:19px;height:18px;padding:0 5px;border-radius:9px;display:inline-grid;place-items:center;background:var(--orange-bg);color:var(--orange)}
.nav a .nb.crit{background:var(--red-bg);color:var(--red)}
.wan-state{font-size:24px;font-weight:600;letter-spacing:-.7px;display:inline-flex;align-items:center;gap:12px}
.sdot{width:10px;height:10px;border-radius:50%;background:var(--subtle);display:inline-block;flex-shrink:0}
.sdot.up{background:var(--lime-text);box-shadow:0 0 0 5px var(--lime-bg)}.sdot.degraded{background:var(--orange);box-shadow:0 0 0 5px var(--orange-bg)}.sdot.down{background:var(--red);box-shadow:0 0 0 5px var(--red-bg)}
.metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;margin-top:16px}
.metric{border:1px solid var(--border);border-radius:11px;padding:10px 12px;background:var(--bg);min-width:0}
.metric .k{font-size:10.5px;color:var(--subtle);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.metric .v{font-size:16px;font-weight:550;font-variant-numeric:tabular-nums;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.metric .v.bad,.bad-t{color:var(--red)}.metric .v.warn,.warn-t{color:var(--orange)}.good-t{color:var(--lime-text)}
.fresh{font-size:10.5px;color:var(--subtle);white-space:nowrap}.fresh.stale{color:var(--orange)}
pre.out{margin:12px 0 0;padding:14px 16px;background:var(--bg);border:1px solid var(--border);border-radius:11px;font:11.5px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace;white-space:pre-wrap;word-break:break-word;max-height:420px;overflow:auto;color:var(--muted)}
.spark{width:96px;height:24px;display:block}
.tl-item{display:grid;grid-template-columns:110px 74px 1fr;gap:10px;padding:9px 0;border-bottom:1px solid var(--border);font-size:12px;align-items:baseline}
.tl-item:last-child{border-bottom:0}
.chart-wrap{position:relative}
.ch-tip{position:absolute;pointer-events:none;background:var(--panel2);border:1px solid var(--border);border-radius:9px;padding:8px 10px;font-size:11px;box-shadow:var(--shadow);white-space:nowrap;z-index:2;line-height:1.6}
.steps{display:grid;gap:8px}.step{display:grid;grid-template-columns:110px 1fr auto;gap:12px;align-items:baseline;padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:var(--bg);font-size:12px}
.step.block{border-color:#f3919866;background:var(--red-bg)}.step.allow{border-color:#c4f36955}
.verdict{padding:14px 16px;border-radius:12px;border:1px solid var(--border);margin-bottom:10px;font-size:13px}
.verdict.blocked{border-color:#f3919866;background:var(--red-bg)}.verdict.allowed{border-color:#c4f36955;background:var(--lime-bg)}
.diff{display:grid;gap:4px;font-size:11.5px}.diff .p{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--muted);word-break:break-all}
.diff .o{color:var(--orange);word-break:break-all}.diff .n{color:var(--lime-text);word-break:break-all}
.diff>div{padding:7px 0;border-bottom:1px solid var(--border)}
/* ---- generic sortable tables ---- */
main thead th:not(:empty),dialog thead th:not(:empty){cursor:pointer;user-select:none}main thead th:not(:empty):hover,dialog thead th:not(:empty):hover{color:var(--text)}
th.asc:after{content:" ↑"}th.desc:after{content:" ↓"}
/* ---- clickable stat cards, nav groups, bell ---- */
a.stat{color:inherit;display:block;transition:background .2s}a.stat:hover{text-decoration:none;background:var(--panel2)}
a.stat .s:after{content:" →";opacity:0;transition:opacity .2s}a.stat:hover .s:after{opacity:1}
.nav-label.grp{margin:18px 0 8px}.nav-label.grp:first-of-type{margin-top:0}
.bell{position:relative}.bell .nb{position:absolute;top:2px;right:1px;min-width:16px;height:16px;border-radius:8px;font-size:9.5px;font-weight:700;display:grid;place-items:center;padding:0 4px;background:var(--orange);color:#231a0b}
.bell .nb.crit{background:var(--red);color:#2a0d10}
.brand-mark img{width:100%;height:100%;object-fit:contain;border-radius:inherit;display:block}.brand-mark.img{background:transparent}
.ro-banner{display:flex;gap:10px;align-items:center}
.brand>span:last-child{min-width:0}.brand-title{display:block;overflow:hidden;text-overflow:ellipsis}.side .brand-title{max-width:150px}
[data-role=viewer] #devTable tr>:last-child{display:none}
/* ---- roles: hide what this account can't use ---- */
[data-role=viewer] .need-mgr,[data-role=viewer] .need-admin,[data-role=manager] .need-admin{display:none!important}
[data-role=viewer] main form:not(.ro),[data-role=viewer] main .btn:not(.ro),[data-role=viewer] .acts,[data-role=viewer] main .icon-btn.edit,[data-role=viewer] main td .icon-btn{display:none!important}
[data-role=viewer] main .switch,[data-role=viewer] main .app select,[data-role=viewer] input.nm{pointer-events:none;opacity:.7}
/* ---- priority ---- */
.b-hi{color:var(--orange);background:var(--orange-bg)}.b-lo{color:var(--subtle);background:var(--panel2)}
/* ---- network map ---- */
.map-grid{display:grid;grid-template-columns:minmax(0,1fr) 330px;gap:18px;align-items:start}
.map-stage{position:relative;overflow:hidden;background:var(--map-bg);border:1px solid var(--border);border-radius:var(--radius)}
.map-stage:before{content:"";position:absolute;inset:0;background-image:radial-gradient(var(--map-dot) 1px,transparent 1px);background-size:22px 22px;pointer-events:none}
.map-scroll{overflow-x:auto;position:relative}
.map-svg{display:block;width:100%;min-width:780px;height:auto;font-family:Inter,-apple-system,"Segoe UI",Roboto,sans-serif}
.map-tools{position:absolute;top:14px;left:14px;z-index:2;display:flex;gap:8px;flex-wrap:wrap}
.map-legend{display:flex;gap:16px;flex-wrap:wrap;padding:12px 18px;border-top:1px solid var(--border);font-size:10.5px;color:var(--subtle);position:relative;background:var(--panel)}
.map-legend i{display:inline-block;width:18px;height:3px;border-radius:2px;vertical-align:middle;margin-right:7px}
.mnode{cursor:pointer}.mnode:focus{outline:none}
.mnode .tile{fill:var(--map-tile);stroke:var(--border);stroke-width:1;transition:stroke .2s}
.mnode:hover .tile,.mnode:focus-visible .tile{stroke:var(--subtle)}
.mnode.sel .tile{stroke:var(--blue);stroke-width:2}
.mnode.hero .tile{fill:var(--lime);stroke:var(--lime)}.mnode.hero .ico{color:#22301a}
.mnode.hero.sel .tile{stroke:var(--blue)}
.mnode.bad .tile{stroke:var(--red)}.mnode.blocked .ico{color:var(--red)}
.mnode .ico{color:var(--text)}
.mnode .t1{fill:var(--text);font-size:18px;font-weight:600;letter-spacing:-.3px}.mnode .t2{fill:var(--muted);font-size:13.5px}
.mnode .t3{fill:var(--subtle);font-size:12.5px}.mnode .t2.mono,.mnode .t3.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.mnode.dev .t1{font-size:12.5px;font-weight:550;letter-spacing:0}.mnode.dev .t2{font-size:11.5px}
.mlink{fill:none;stroke:var(--map-line);stroke-width:2}.mlink.down{stroke:var(--red);stroke-dasharray:5 6}
.mflow{fill:none;stroke:var(--lime);stroke-width:2.6;stroke-linecap:round;stroke-dasharray:3 15;animation:flow 1.1s linear infinite;filter:drop-shadow(0 0 4px var(--lime))}
.mflow.up{stroke:var(--blue);filter:drop-shadow(0 0 4px var(--blue));animation-direction:reverse}
.mflow.s2{animation-duration:.7s}.mflow.s3{animation-duration:.4s}
.mdot{fill:var(--lime-text);stroke:var(--map-bg);stroke-width:2}.mdot.off{fill:var(--subtle)}.mdot.bad{fill:var(--red)}
.mglow{fill:var(--lime);opacity:.16;filter:blur(18px)}
.mcount{fill:var(--lime);stroke:var(--map-bg);stroke-width:3}.mcount-t{fill:#22301a;font-size:12.5px;font-weight:700}
.mpill{fill:var(--panel2);stroke:var(--border)}.mpill-t{fill:var(--muted);font-size:11.5px;font-weight:600}
@keyframes flow{to{stroke-dashoffset:-18}}
.side-panel{position:sticky;top:90px}
.side-panel .kv{margin-top:14px}
.np-icon{width:46px;height:46px;border-radius:14px;display:grid;place-items:center;background:var(--panel2);border:1px solid var(--border);flex-shrink:0}
.np-icon.hero{background:var(--lime);border-color:var(--lime);color:#22301a}
.np-list{display:grid;gap:4px;margin-top:12px}
.np-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:10px;background:var(--bg);font-size:12px;cursor:pointer;color:var(--text);text-align:left;width:100%}
.np-row:hover{border-color:var(--subtle)}.np-row .icon{width:16px;height:16px;color:var(--muted)}
/* ---- usage ---- */
.ubars{display:block;width:100%;height:220px}
.ubars rect.rx{fill:var(--lime)}.ubars rect.tx{fill:var(--blue)}.ubars rect.hit{fill:transparent}.ubars g:hover rect.rx,.ubars g:hover rect.tx{opacity:.75}
.ubars .ax{fill:var(--subtle);font-size:10px}.ubars line{stroke:var(--border);stroke-dasharray:3 5}
.ubar-today rect.rx,.ubar-today rect.tx{opacity:.55}
.capbar{height:10px;border-radius:6px;background:var(--panel2);overflow:hidden;margin-top:14px;position:relative}
.capbar i{display:block;height:100%;background:linear-gradient(90deg,var(--lime),var(--lime));border-radius:6px;transition:width 1s var(--ease)}
.capbar i.warn{background:var(--orange)}.capbar i.bad{background:var(--red)}
.capbar b{position:absolute;top:0;bottom:0;width:2px;background:var(--text);opacity:.5}
.logo-prev{width:64px;height:64px;border-radius:16px;border:1px dashed var(--border);display:grid;place-items:center;overflow:hidden;background:var(--bg);flex-shrink:0}
.logo-prev img{width:100%;height:100%;object-fit:contain}
.check-list{display:grid;gap:6px;margin-top:4px}.check-list div{display:flex;gap:9px;align-items:baseline;font-size:12px}
@keyframes enter{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
main>*{animation:enter .35s var(--ease) both}
/* ---- responsive ---- */
@media(max-width:1280px){.map-grid{grid-template-columns:1fr}.side-panel{position:static}.g6{grid-template-columns:repeat(3,minmax(0,1fr))}.g4{grid-template-columns:repeat(2,minmax(0,1fr))}.g21{grid-template-columns:1fr}}
@media(max-width:1180px){.side{width:205px;padding-left:13px;padding-right:13px}.shell{margin-left:205px}main{padding:28px 23px}.topbar{padding:0 23px}}
@media(max-width:950px){.g3{grid-template-columns:1fr}.g2{grid-template-columns:1fr}.cmd{width:170px}h1{font-size:28px}}
@media(max-width:760px){.side{transform:translateX(-100%);transition:transform .25s var(--ease);width:240px}.side.open{transform:none}
.scrim.open{display:block;position:fixed;inset:0;background:#0008;z-index:29;backdrop-filter:blur(3px);border:0}
.shell{margin-left:0}.menu-btn{display:inline-flex}.topbar{height:62px;padding:0 16px}
.cmd{border:0;width:34px;height:34px;justify-content:center;padding:0;background:none}.cmd span,.cmd kbd,.sep,.live{display:none}.cmd .icon{width:18px;height:18px}
main{padding:22px 16px}.g6,.g4{grid-template-columns:repeat(2,minmax(0,1fr))}.stat{padding:16px}.stat .v{font-size:22px}
.pad{padding:18px 16px}h1{font-size:26px}.head{margin-bottom:20px}.notice{right:16px;left:16px;bottom:16px;max-width:none}
.field,select,textarea{font-size:16px}.crumb .first{display:none}
.tl-item,.step{grid-template-columns:1fr;gap:3px}#m_rate{font-size:16px!important}.map-tools{position:relative;top:auto;left:auto;padding:12px 12px 0}.chart-head .tabs{flex-wrap:wrap}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}}
