:root{--bg:#0b1220;--panel:#111a2e;--panel2:#15213a;--line:#1f2d4a;--tx:#d7e0f2;--mut:#8a9bb8;--blue:#2f7df6;--blue2:#1d5fd1;--ok:#22c55e;--bad:#ef4444;--warn:#f59e0b}
*{box-sizing:border-box}html,body{margin:0}body{background:var(--bg);color:var(--tx);font:14px/1.45 -apple-system,"Segoe UI",Roboto,Arial,sans-serif}
a{color:#6aa6ff;text-decoration:none}a:hover{text-decoration:underline}h1{font-size:20px;margin:4px 0 14px}h3{margin:0 0 10px;font-size:15px}h4{margin:14px 0 6px}
.muted,small{color:var(--mut)}.mono{font-family:Consolas,monospace;font-size:12px}
#side{position:fixed;inset:0 auto 0 0;width:220px;background:#0a1020;border-right:1px solid var(--line);overflow-y:auto;z-index:30;transition:transform .2s}
.brand{padding:16px;font-weight:700;font-size:16px;color:#fff;letter-spacing:.3px}.brand::first-letter{color:var(--blue)}
#side nav a{display:flex;gap:10px;align-items:center;padding:8px 16px;color:var(--tx);border-left:3px solid transparent}
#side nav a:hover{background:var(--panel);text-decoration:none}#side nav a.on{background:var(--panel2);border-left-color:var(--blue);color:#fff}
.sep{padding:12px 16px 4px;font-size:11px;text-transform:uppercase;color:var(--mut);letter-spacing:1px}
#main{margin-left:220px;min-height:100vh}header{position:sticky;top:0;z-index:20;display:flex;gap:12px;align-items:center;padding:10px 20px;background:rgba(11,18,32,.92);backdrop-filter:blur(6px);border-bottom:1px solid var(--line)}
#burger{display:none;background:none;border:0;color:var(--tx);font-size:22px}.who{margin-left:auto;white-space:nowrap}.who a{margin-left:8px}
main{padding:18px 20px 40px}.gsearch{position:relative;flex:1;max-width:480px}
input,select,textarea{width:100%;background:#0d1730;border:1px solid var(--line);color:var(--tx);border-radius:6px;padding:7px 10px;font:inherit}
input:focus,select:focus,textarea:focus{outline:0;border-color:var(--blue)}input.big{font-size:16px;padding:12px 14px}
label{display:block;font-size:12px;color:var(--mut);margin:0 0 10px}label input,label select,label textarea{margin-top:4px;color:var(--tx)}
.card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:14px;margin-bottom:14px}
.grid{display:grid;gap:14px}.two{grid-template-columns:1fr 1fr}.cols3{grid-template-columns:repeat(3,1fr);gap:0 14px}.stats{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));margin-bottom:14px}
.stat{display:flex;gap:12px;align-items:center;background:linear-gradient(135deg,#13224a,#0f1a33);border:1px solid var(--line);border-radius:10px;padding:14px;color:var(--tx)}.stat:hover{border-color:var(--blue);text-decoration:none}
.stat b{display:block;font-size:26px;color:#fff;line-height:1}.stat small{font-size:12px}.ico{font-size:28px;background:rgba(47,125,246,.15);width:48px;height:48px;border-radius:10px;display:grid;place-items:center}
.btn{display:inline-block;background:var(--blue);color:#fff;border:0;border-radius:6px;padding:7px 14px;cursor:pointer;font:inherit;margin:0 4px 4px 0}.btn:hover{background:var(--blue2);text-decoration:none}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--tx)}.btn.ghost:hover{border-color:var(--blue)}.btn.danger{background:#b91c1c}.btn:disabled{opacity:.4}
.toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}.toolbar form{display:flex;gap:6px}.toolbar input{width:220px}
.tablewrap{overflow-x:auto}table{width:100%;border-collapse:collapse}th,td{padding:7px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
th{font-size:11px;text-transform:uppercase;color:var(--mut);letter-spacing:.5px;white-space:nowrap}tr:hover td{background:rgba(47,125,246,.05)}
table.kv th{width:150px;text-transform:none;font-size:12px}.act a,.act button{margin-right:6px;font-size:16px;background:none;border:0;cursor:pointer;padding:0}.inl{display:inline}.inl button{background:none;border:0;color:var(--mut);cursor:pointer}
.alert{padding:10px 14px;border-radius:8px;margin-bottom:12px}.alert.ok{background:rgba(34,197,94,.12);border:1px solid #166534}.alert.err{background:rgba(239,68,68,.12);border:1px solid #991b1b}
.badge{font-size:11px;padding:1px 8px;border-radius:10px;background:var(--panel2);text-transform:uppercase}.b-admin{background:#7c2d12}.b-manager{background:#1e3a8a}
.bar{display:flex;align-items:center;gap:10px;margin:7px 0}.bar span{width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bar em{width:56px;text-align:right;font-style:normal;color:var(--mut)}
.track{flex:1;height:10px;background:#0d1730;border-radius:5px;overflow:hidden}.track i{display:block;height:100%;background:linear-gradient(90deg,var(--blue2),#52a2ff)}
.results{position:absolute;left:0;right:0;top:100%;background:var(--panel);border:1px solid var(--line);border-radius:8px;max-height:420px;overflow:auto;display:none;z-index:50;box-shadow:0 10px 30px #0008}.results.inline{position:static;margin-top:10px;box-shadow:none;max-height:none}.results.show{display:block}
.results .it{display:flex;gap:10px;padding:9px 12px;border-bottom:1px solid var(--line);align-items:center}.results .it:hover{background:var(--panel2)}.results .it .m{flex:1}.results .it small{display:block}
.login{display:grid;place-items:center;min-height:100vh}.loginbox{width:340px;padding:24px}.loginbox .btn{width:100%;text-align:center}
.legend i{display:inline-block;width:14px;height:14px;border-radius:3px;margin:0 4px 0 12px;vertical-align:middle}.legend i:first-child{margin-left:0}
.swpanel{display:grid;grid-auto-flow:column;grid-template-rows:repeat(2,44px);grid-auto-columns:38px;gap:6px;padding:14px;background:#070d1a;border:2px solid #263759;border-radius:8px;overflow-x:auto;justify-content:start}
.port{border-radius:4px;border:2px solid #263759;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:10px;cursor:pointer;color:#fff}.port:hover,.port.sel{outline:2px solid #fff}
.p-up{background:#16a34a}.p-free{background:#334155}.p-down{background:#991b1b}.port small{color:#fff9;font-size:9px}
.clickrow{cursor:pointer}.trace{display:flex;flex-direction:column;align-items:flex-start;gap:0}.hop{display:flex;gap:12px;align-items:center;background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px 16px;min-width:320px}.hop.first{border-color:var(--blue)}
.hop small{display:block}.hico{font-size:26px}.arrow{margin:4px 0 4px 26px;color:#6aa6ff;font-size:16px}.arrow span{font-size:12px;color:var(--mut);margin-left:8px}
.topo-wrap{position:relative;height:calc(100vh - 210px);min-height:420px;background:#080e1c;border:1px solid var(--line);border-radius:10px;overflow:hidden;background-image:radial-gradient(#1a2744 1px,transparent 1px);background-size:24px 24px}
#topo{width:100%;height:100%;cursor:grab;touch-action:none}.topo-info{position:absolute;right:10px;top:10px;width:260px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:10px;font-size:12px}
.node{cursor:pointer}.node text.l{fill:var(--tx);font-size:11px;text-anchor:middle}.node circle{stroke:#0b1220;stroke-width:3}.node.sel circle{stroke:#fff}.node.dim{opacity:.15}.node.hit circle{stroke:var(--warn)}
.edge line{stroke:#3b5a94;stroke-width:2}.edge.sel line{stroke:var(--warn);stroke-width:3}.edge text{fill:#8fb3ee;font-size:9px;text-anchor:middle}.topo-tools input{width:160px}#filters label{display:inline;margin:0 8px 0 0;color:var(--tx)}#filters input{width:auto}
table.rack{width:auto;min-width:340px;border-collapse:collapse}table.rack td{border:1px solid #263759;padding:2px 8px;height:24px}td.un{width:30px;color:var(--mut);font-size:11px;text-align:right;background:#0a1020}td.empty{background:#0d1730;min-width:300px}
td.dev{background:#1d4ed8;color:#fff}td.dev a{color:#fff}td.dev small{color:#cbd5e1}td.t-server{background:#0f766e}td.t-ups{background:#92400e}td.t-firewall{background:#9f1239}td.t-nas{background:#6d28d9}
@media(max-width:900px){#side{transform:translateX(-100%)}#side.open{transform:none}#main{margin-left:0}#burger{display:block}.two,.cols3{grid-template-columns:1fr}.who{font-size:12px}.topo-info{display:none}}
/* ---- Giam sat / import ---- */
.mon{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;font-size:12px}.mon i{display:inline-block;width:10px;height:10px;border-radius:50%;background:var(--mut)}
.mon.m-online{color:#4ade80}.mon.m-online i{background:var(--ok);box-shadow:0 0 6px var(--ok)}
.mon.m-offline{color:#f87171;font-weight:600}.mon.m-offline i{background:var(--bad);box-shadow:0 0 6px var(--bad)}
.mon.m-unknown{color:var(--mut)}.mon.m-off{color:var(--mut);opacity:.7}.mon.m-off i{background:transparent;border:1px solid var(--mut)}
tr.row-off td{background:rgba(239,68,68,.08)}
.btn.sm{padding:3px 9px;font-size:12px;margin:0 4px 2px 0}.act .ibtn{font-size:14px;color:var(--tx)}
label.chk{display:flex;align-items:center;gap:8px;color:var(--tx);font-size:13px}label.chk input{margin:0}
.toolbar .inl{display:flex;gap:6px;align-items:center}.toolbar select{width:auto}
.dz{border:2px dashed var(--line);border-radius:10px;padding:18px;text-align:center}.dz:hover{border-color:var(--blue)}
.tag{display:inline-block;font-size:11px;padding:1px 8px;border-radius:10px;background:var(--panel2);margin-right:4px}.tag.new{background:#14532d}.tag.upd{background:#1e3a8a}.tag.skip{background:#44403c}.tag.err{background:#7f1d1d}
.imp-errs td{font-size:12px}
@media(max-width:640px){.toolbar input{width:100%}}
