:root{--font:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--mono:ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;--r:6px;--r-lg:8px;--ease:cubic-bezier(.2, .8, .2, 1);--dur:.14s;--dur-slow:.22s;--side:216px;--side-rail:60px;--head:52px;--bg:#0c1016;--panel:#121821;--panel-2:#161d27;--panel-3:#1b2430;--hover:#1a222d;--line:#222b37;--line-2:#2e3a49;--text:#e4e9ef;--text-2:#a3afbd;--text-3:#6f7c8c;--accent:#5b8cff;--accent-2:#7da3ff;--accent-bg:#5b8cff21;--on-accent:#fff;--crit:#ef5350;--major:#f39033;--minor:#e3bc2a;--warn:#3bb1d6;--ok:#3fbf7f;--off:#6b7686;--on-minor:#241d00;--shadow:0 16px 48px -12px #0009, 0 0 0 1px var(--line);--scrim:#04070b9e;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root[data-theme=light]{--bg:#f3f5f8;--panel:#fff;--panel-2:#f6f8fa;--panel-3:#fff;--hover:#f1f4f8;--line:#e3e8ee;--line-2:#cfd7e1;--text:#0f1720;--text-2:#4d5a69;--text-3:#7f8a98;--accent:#1d5ad6;--accent-2:#1849b3;--accent-bg:#1d5ad617;--crit:#d32f2f;--major:#d26a07;--minor:#b58900;--warn:#0f84b0;--ok:#1b8a4c;--off:#8592a3;--on-minor:#fff;--shadow:0 16px 48px -16px #0f172047, 0 0 0 1px var(--line);--scrim:#0f172061;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-reduced-motion:reduce){:root{--dur:0s;--dur-slow:0s}}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font:14px/1.45 var(--font);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility}h1,h2,h3{letter-spacing:-.01em;margin:0;font-weight:600}a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-2)}button,input,select,textarea{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}::selection{background:var(--accent-bg)}.num{font-variant-numeric:tabular-nums}.mono{font-family:var(--mono);font-size:.92em}.muted{color:var(--text-2)}.faint{color:var(--text-3)}.label{text-transform:uppercase;letter-spacing:.06em;color:var(--text-3);font-size:11px;font-weight:600}.row{align-items:center;gap:8px;display:flex}.spacer{flex:1}.stack{gap:16px;display:grid}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}*{scrollbar-width:thin;scrollbar-color:var(--line-2) transparent}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--line-2);background-clip:content-box;border:3px solid #0000;border-radius:10px}@keyframes fade-in{0%{opacity:.5;transform:translateY(3px)}to{opacity:1;transform:none}}@keyframes shimmer{0%{background-position:-200px 0}to{background-position:200px 0}}@keyframes pulse{50%{opacity:.35}}.shell{grid-template-columns:var(--side) minmax(0, 1fr);grid-template-rows:var(--head) minmax(0, 1fr);height:100%;transition:grid-template-columns var(--dur-slow) var(--ease);display:grid}.shell.rail{grid-template-columns:var(--side-rail) minmax(0, 1fr)}.side{background:var(--panel);border-right:1px solid var(--line);flex-direction:column;grid-row:1/3;min-width:0;display:flex;overflow:hidden}.brand{height:var(--head);letter-spacing:.01em;border-bottom:1px solid var(--line);white-space:nowrap;align-items:center;gap:10px;padding:0 18px;font-size:15px;font-weight:650;display:flex}.brand-mark{background:var(--accent);border-radius:6px;flex:none;place-items:center;width:22px;height:22px;display:grid}.brand-mark:after{content:"";background:var(--panel);width:8px;height:8px;box-shadow:0 0 0 2px var(--panel), 0 0 0 4px #ffffff59;border-radius:50%}.nav{gap:2px;padding:10px 8px;display:grid}.nav a{border-radius:var(--r);height:36px;color:var(--text-2);white-space:nowrap;transition:background var(--dur) var(--ease), color var(--dur) var(--ease);align-items:center;gap:11px;padding:0 11px;display:flex;position:relative}.nav a:hover{background:var(--hover);color:var(--text)}.nav a.on{background:var(--accent-bg);color:var(--text)}.nav a.on:before{content:"";background:var(--accent);border-radius:0 3px 3px 0;width:3px;position:absolute;top:8px;bottom:8px;left:-8px}.nav svg{opacity:.9;flex:none}.nav .count{background:var(--crit);color:#fff;border-radius:9px;place-items:center;min-width:20px;height:18px;margin-left:auto;padding:0 6px;font-size:11px;font-weight:600;display:grid}.shell.rail .nav span,.shell.rail .nav .count,.shell.rail .brand-name,.shell.rail .side-foot span{display:none}.side-foot{border-top:1px solid var(--line);margin-top:auto;padding:10px 8px}.head{border-bottom:1px solid var(--line);background:var(--panel);align-items:center;gap:14px;min-width:0;padding:0 20px;display:flex}.main{min-width:0;position:relative;overflow:auto}.page{max-width:1680px;animation:fade-in var(--dur-slow) var(--ease);padding:22px 24px 40px}.page-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:18px;display:flex}.page-head h1{font-size:20px}.crumbs{color:var(--text-3);margin-bottom:4px;font-size:12px}.crumbs a{color:var(--text-2)}.live{color:var(--text-2);align-items:center;gap:7px;font-size:12px;display:inline-flex}.live i{background:var(--ok);width:7px;height:7px;box-shadow:0 0 0 3px color-mix(in srgb, var(--ok) 22%, transparent);border-radius:50%}.live.off i{background:var(--crit);box-shadow:none;animation:1.2s infinite pulse}.lamp{gap:4px;display:flex}.lamp button{border:1px solid var(--line-2);min-width:36px;height:24px;color:var(--text-3);font-variant-numeric:tabular-nums;cursor:pointer;transition:transform var(--dur) var(--ease), filter var(--dur) var(--ease);background:0 0;border-radius:5px;padding:0 8px;font-size:12px;font-weight:650}.lamp button:hover{filter:brightness(1.15)}.lamp button.s1.has{background:var(--crit);border-color:var(--crit);color:#fff}.lamp button.s2.has{background:var(--major);border-color:var(--major);color:#fff}.lamp button.s3.has{background:var(--minor);border-color:var(--minor);color:var(--on-minor)}.lamp button.s4.has{background:var(--warn);border-color:var(--warn);color:#fff}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);min-width:0}.card-head{border-bottom:1px solid var(--line);align-items:center;gap:10px;padding:12px 16px;font-size:13.5px;font-weight:600;display:flex}.card-head .spacer+*{font-weight:400}.card-body{padding:16px}.grid{gap:12px;display:grid}.kpis{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;display:grid}.kpi{padding:14px 16px}.kpi .v{font-variant-numeric:tabular-nums;letter-spacing:-.02em;margin-top:6px;font-size:28px;font-weight:650;line-height:1.15}.kpi .s{color:var(--text-3);margin-top:2px;font-size:12px}.kpi.bad .v{color:var(--crit)}.meter{background:var(--panel-3);border-radius:2px;height:4px;margin-top:10px;overflow:hidden}.meter i{height:100%;transition:width var(--dur-slow) var(--ease);border-radius:2px;display:block}.btn{border-radius:var(--r);border:1px solid var(--line-2);background:var(--panel-3);height:32px;color:var(--text);cursor:pointer;white-space:nowrap;transition:background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease), transform 80ms var(--ease);justify-content:center;align-items:center;gap:7px;padding:0 13px;font-size:13px;font-weight:500;display:inline-flex}.btn:hover:not(:disabled){border-color:var(--text-3)}.btn:active:not(:disabled){transform:translateY(1px)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.btn.primary:hover:not(:disabled){background:var(--accent-2);border-color:var(--accent-2)}.btn.danger{color:var(--crit);border-color:color-mix(in srgb, var(--crit) 45%, var(--line-2));background:0 0}.btn.danger:hover:not(:disabled){background:color-mix(in srgb, var(--crit) 12%, transparent);border-color:var(--crit)}.btn.danger.solid{background:var(--crit);color:#fff}.btn.ghost{color:var(--text-2);background:0 0;border-color:#0000}.btn.ghost:hover:not(:disabled){background:var(--hover);color:var(--text);border-color:#0000}.btn.sm{height:26px;padding:0 9px;font-size:12px}.btn.icon{width:32px;padding:0}.btn.sm.icon{width:26px}.btn .spin{border:2px solid;border-right-color:#0000;border-radius:50%;width:13px;height:13px;animation:.7s linear infinite rot}@keyframes rot{to{transform:rotate(360deg)}}.field{gap:6px;min-width:0;display:grid}.field>label{color:var(--text-2);font-size:12.5px;font-weight:500}.field .hint{color:var(--text-3);font-size:12px}.field .err{color:var(--crit);font-size:12px}.input,.select,.textarea{border-radius:var(--r);border:1px solid var(--line-2);background:var(--panel-3);width:100%;height:34px;color:var(--text);transition:border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);padding:0 11px;font-size:13.5px}.textarea{resize:vertical;height:auto;min-height:80px;padding:8px 11px}.input::placeholder,.textarea::placeholder{color:var(--text-3)}.input:hover,.select:hover,.textarea:hover{border-color:var(--text-3)}.input:focus,.select:focus,.textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-bg);outline:none}.field.invalid .input,.field.invalid .select{border-color:var(--crit)}.select{appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--text-3) 50%), linear-gradient(135deg, var(--text-3) 50%, transparent 50%);background-position:calc(100% - 15px),calc(100% - 10px);background-repeat:no-repeat;background-size:5px 5px;padding-right:30px}.input.sm,.select.sm{height:28px;font-size:12.5px}.search{position:relative}.search svg{color:var(--text-3);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.search .input{padding-left:32px}.switch{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:10px;font-size:13.5px;display:inline-flex}.switch input{opacity:0;pointer-events:none;position:absolute}.switch i{background:var(--line-2);width:34px;height:20px;transition:background var(--dur) var(--ease);border-radius:10px;flex:none;position:relative}.switch i:after{content:"";width:16px;height:16px;transition:transform var(--dur) var(--ease);background:#fff;border-radius:50%;position:absolute;top:2px;left:2px}.switch input:checked+i{background:var(--accent)}.switch input:checked+i:after{transform:translate(14px)}.switch input:focus-visible+i{outline:2px solid var(--accent);outline-offset:2px}.form-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 16px;display:grid}.form-grid .wide{grid-column:1/-1}.seg{border-radius:var(--r);background:var(--panel-3);border:1px solid var(--line);padding:2px;display:inline-flex}.seg button{color:var(--text-2);cursor:pointer;height:26px;transition:background var(--dur) var(--ease), color var(--dur) var(--ease);background:0 0;border:0;border-radius:4px;padding:0 12px;font-size:12.5px}.seg button.on{background:var(--panel);color:var(--text);box-shadow:0 0 0 1px var(--line-2)}.tabs{border-bottom:1px solid var(--line);gap:4px;padding:0 12px;display:flex;overflow-x:auto}.tabs button{color:var(--text-2);cursor:pointer;white-space:nowrap;height:42px;transition:color var(--dur) var(--ease);background:0 0;border:0;padding:0 10px;font-size:13.5px;position:relative}.tabs button:hover{color:var(--text)}.tabs button.on{color:var(--text);font-weight:550}.tabs button.on:after{content:"";background:var(--accent);border-radius:2px;height:2px;position:absolute;bottom:-1px;left:8px;right:8px}.tag{white-space:nowrap;background:var(--panel-3);height:20px;color:var(--text-2);border:1px solid var(--line);border-radius:4px;align-items:center;gap:5px;padding:0 7px;font-size:11.5px;font-weight:600;display:inline-flex}.sev{color:#fff;letter-spacing:.01em;border:0;justify-content:center;min-width:62px}.sev.s1{background:var(--crit)}.sev.s2{background:var(--major)}.sev.s3{background:var(--minor);color:var(--on-minor)}.sev.s4{background:var(--warn)}.tag.t-ok{color:var(--ok);background:color-mix(in srgb, var(--ok) 12%, transparent);border-color:#0000}.tag.t-bad{color:var(--crit);background:color-mix(in srgb, var(--crit) 12%, transparent);border-color:#0000}.tag.t-info{color:var(--accent);background:var(--accent-bg);border-color:#0000}.dot{border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}.dot.up{background:var(--ok)}.dot.down{background:var(--crit)}.dot.unknown{background:var(--off)}.tbl-wrap{position:relative;overflow:auto}.tbl{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}.tbl th{z-index:1;background:var(--panel-2);color:var(--text-3);text-transform:uppercase;letter-spacing:.05em;text-align:left;border-bottom:1px solid var(--line);white-space:nowrap;-webkit-user-select:none;user-select:none;height:34px;padding:0 12px;font-size:11px;font-weight:600;position:sticky;top:0}.tbl th.sortable{cursor:pointer}.tbl th.sortable:hover{color:var(--text-2)}.tbl th .arrow{opacity:.8;margin-left:4px;display:inline-block}.tbl td{border-bottom:1px solid var(--line);vertical-align:middle;height:40px;padding:0 12px}.tbl.dense td{height:34px}.tbl tbody tr{transition:background var(--dur) var(--ease)}.tbl tbody tr.click{cursor:pointer}.tbl tbody tr:hover{background:var(--hover)}.tbl tbody tr:last-child td{border-bottom:0}.tbl td.r,.tbl th.r{text-align:right}.tbl tr.root td{background:color-mix(in srgb, var(--crit) 6%, transparent)}.tbl tr.child td{opacity:.72}.tbl tr.child td:first-child{box-shadow:inset 3px 0 0 var(--line-2)}.tbl .expander{border:1px solid var(--line-2);width:18px;height:18px;color:var(--text-2);cursor:pointer;transition:transform var(--dur) var(--ease);background:0 0;border-radius:4px;place-items:center;margin-right:8px;display:inline-grid}.tbl .expander.open{transform:rotate(90deg)}.cell-2{gap:1px;padding:6px 0;line-height:1.3;display:grid}.cell-2 small{color:var(--text-3);font-size:12px}.empty{text-align:center;color:var(--text-3);padding:28px 16px;font-size:13px}.empty b{color:var(--text-2);margin-bottom:4px;font-weight:500;display:block}.sk{background:linear-gradient(90deg, var(--panel-2) 0, var(--panel-3) 60px, var(--panel-2) 120px) 0 0 / 400px 100%;border-radius:4px;height:12px;animation:1.2s linear infinite shimmer}dialog.modal{background:var(--panel);color:var(--text);box-shadow:var(--shadow);border:0;border-radius:10px;width:min(560px,100vw - 32px);max-height:calc(100vh - 48px);padding:0;overflow:visible}dialog.modal[open]{animation:pop var(--dur-slow) var(--ease)}dialog::backdrop{background:var(--scrim);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:fade var(--dur-slow) var(--ease)}@keyframes pop{0%{opacity:0;transform:translateY(6px)scale(.985)}}@keyframes fade{0%{opacity:0}}.modal-head{align-items:center;padding:16px 18px 0;font-size:15px;font-weight:600;display:flex}.modal-body{max-height:calc(100vh - 180px);padding:16px 18px;overflow:auto}.modal-foot{justify-content:flex-end;gap:8px;padding:0 18px 16px;display:flex}dialog.drawer{border:0;border-left:1px solid var(--line);background:var(--panel);height:100vh;max-height:100vh;color:var(--text);width:min(640px,100vw);box-shadow:var(--shadow);margin:0 0 0 auto;padding:0}dialog.drawer[open]{animation:slide var(--dur-slow) var(--ease)}@keyframes slide{0%{opacity:0;transform:translate(24px)}}.drawer-head{height:var(--head);border-bottom:1px solid var(--line);align-items:center;gap:10px;padding:0 16px 0 20px;font-weight:600;display:flex}.drawer-body{height:calc(100vh - var(--head));padding:18px 20px;overflow:auto}.menu-wrap{position:relative}.menu{background:var(--panel);border-radius:var(--r-lg);min-width:200px;box-shadow:var(--shadow);z-index:40;animation:pop var(--dur) var(--ease);padding:6px;position:absolute;top:calc(100% + 6px);right:0}.menu button,.menu .menu-info{text-align:left;cursor:pointer;width:100%;height:32px;color:var(--text);background:0 0;border:0;border-radius:5px;align-items:center;gap:9px;padding:0 10px;font-size:13px;display:flex}.menu .menu-info{cursor:default;color:var(--text-3);font-size:12px}.menu button:hover{background:var(--hover)}.menu hr{border:0;border-top:1px solid var(--line);margin:5px 0}.toasts{z-index:100;gap:8px;display:grid;position:fixed;bottom:18px;right:18px}.toast{border-radius:var(--r-lg);background:var(--panel);min-width:260px;max-width:420px;box-shadow:var(--shadow);animation:pop var(--dur-slow) var(--ease);align-items:center;gap:10px;padding:11px 14px;font-size:13px;display:flex}.toast i{background:var(--ok);border-radius:50%;flex:none;width:8px;height:8px}.toast.error i{background:var(--crit)}.tip{position:relative}.tip>.tip-body{opacity:0;pointer-events:none;background:var(--panel-3);border:1px solid var(--line-2);border-radius:var(--r);white-space:nowrap;color:var(--text);box-shadow:var(--shadow);z-index:30;transition:opacity var(--dur) var(--ease), transform var(--dur) var(--ease);padding:7px 10px;font-size:12px;font-weight:400;line-height:1.4;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%,4px)}.tip:hover>.tip-body,.tip:focus-visible>.tip-body{opacity:1;transform:translate(-50%)}.dl{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px 24px;display:grid}.dl>div{gap:3px;min-width:0;display:grid}.dl dt{text-transform:uppercase;letter-spacing:.06em;color:var(--text-3);font-size:11px;font-weight:600}.dl dd{overflow-wrap:anywhere;margin:0}.notice{border-radius:var(--r);border:1px solid var(--line);background:var(--panel-2);align-items:flex-start;gap:10px;margin-bottom:14px;padding:10px 14px;font-size:13px;display:flex}.notice.warn{border-color:color-mix(in srgb, var(--major) 45%, var(--line));background:color-mix(in srgb, var(--major) 8%, var(--panel))}.notice.error{border-color:color-mix(in srgb, var(--crit) 45%, var(--line));background:color-mix(in srgb, var(--crit) 8%, var(--panel))}@media (max-width:900px){.shell{grid-template-columns:var(--side-rail) minmax(0, 1fr)}.shell .nav span,.shell .nav .count,.shell .brand-name{display:none}.page{padding:16px}.form-grid{grid-template-columns:minmax(0,1fr)}}.login{background:radial-gradient(1200px 600px at 20% -10%, var(--accent-bg), transparent 60%), var(--bg);place-items:center;min-height:100%;padding:16px;display:grid}.login .card{width:380px;max-width:100%;animation:fade-in var(--dur-slow) var(--ease);padding:28px}.login h1{align-items:center;gap:10px;font-size:22px;display:flex}.ov-grid{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:12px;margin-top:12px;display:grid}@media (max-width:1100px){.ov-grid{grid-template-columns:minmax(0,1fr)}}.faceplate{border-radius:var(--r-lg);background:var(--panel-2);border:1px solid var(--line);align-items:center;gap:24px;padding:16px 18px;display:flex;overflow-x:auto}.fp-brand{gap:3px;min-width:160px;display:grid}.fp-brand b{font-size:13px}.fp-blocks{gap:14px;display:flex}.fp-ports{grid-template-rows:repeat(2,auto);grid-auto-flow:column;gap:5px;display:grid}.port{cursor:pointer;color:#fff;font-variant-numeric:tabular-nums;width:32px;height:26px;transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);border:1.5px solid #0000;border-radius:4px;place-items:center;padding:0;font-size:10.5px;font-weight:650;display:grid}.port:hover{transform:translateY(-1px)}.port.sel{box-shadow:0 0 0 2px var(--panel-2), 0 0 0 4px var(--accent)}.port.up-fast{background:var(--ok)}.port.up-slow{background:color-mix(in srgb, var(--ok) 70%, var(--panel-2))}.port.down{background:var(--panel);border-color:var(--line-2);color:var(--text-3)}.port.adm{background:repeating-linear-gradient(135deg, var(--panel-3) 0 3px, var(--panel) 3px 6px);border-color:var(--line-2);color:var(--text-3)}.port.err{background:var(--major)}.port.alarm{background:var(--crit)}.port-info{align-items:center;gap:12px;min-height:22px;margin-top:10px;font-size:12.5px;display:flex}.legend{color:var(--text-3);flex-wrap:wrap;gap:6px 16px;margin-top:12px;font-size:12px;display:flex}.legend span{align-items:center;gap:6px;display:inline-flex}.legend i{border-radius:3px;width:14px;height:11px;display:inline-block}.chart{width:100%;height:240px}.chart .u-legend{display:none}.u-select{background:var(--accent-bg)}.chart-legend{color:var(--text-2);gap:14px;margin:8px 0 4px;font-size:12px;display:flex}.chart-legend i{vertical-align:middle;border-radius:2px;width:10px;height:3px;margin-right:6px;display:inline-block}.topo{cursor:grab;touch-action:none;height:calc(100vh - 190px);min-height:420px;position:relative;overflow:hidden}.topo:active{cursor:grabbing}.topo svg{width:100%;height:100%;display:block}.topo .node rect{fill:var(--panel);stroke:var(--line-2);stroke-width:1.2px;transition:stroke var(--dur) var(--ease)}.topo .node{cursor:pointer}.topo .node:hover rect{stroke:var(--accent)}.topo .node rect.bar{fill:currentColor;stroke:none}.topo .node text{fill:var(--text);font-size:12px;font-weight:600}.topo .node text.sub{fill:var(--text-3);font-size:10.5px;font-weight:400}.topo .edge{fill:none;stroke:var(--line-2);stroke-width:1.4px}.topo .edge.bad{stroke:var(--crit);stroke-dasharray:5 4;stroke-width:1.8px}.topo .edge.dim{stroke:var(--off);stroke-dasharray:2 4}.topo-tools{z-index:2;gap:4px;display:flex;position:absolute;top:12px;right:12px}.topo.far .node text{display:none}.topo.far .node rect{fill:currentColor;stroke:none}
