:root{--bg: #0e1118;--bg-2: #161b26;--bg-3: #1d2433;--border: #2a3243;--fg: #e6ebf2;--fg-dim: #9aa6b8;--accent: #4f9dff;--ok: #38c172;--warn: #f6c343;--err: #ef5b5b;--pending: #b48ef0;--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--sans: system-ui, -apple-system, Segoe UI, Roboto, sans-serif}*{box-sizing:border-box}body{color:var(--fg);font-family:var(--sans)}.app-shell{min-height:100vh;display:flex;flex-direction:column}.topbar{display:flex;align-items:center;gap:16px;padding:12px 20px;background:var(--bg-2);border-bottom:1px solid var(--border)}.topbar .brand{font-weight:700;letter-spacing:.3px}.topbar .brand span{color:var(--accent)}.topbar .spacer{flex:1}.topbar .edge-chip{font-family:var(--mono);font-size:12px;color:var(--fg-dim);background:var(--bg-3);padding:4px 10px;border-radius:6px;border:1px solid var(--border)}.topbar .edge-chip b{color:var(--fg)}.btn{background:var(--bg-3);color:var(--fg);border:1px solid var(--border);padding:7px 14px;border-radius:7px;cursor:pointer;font-size:13px;transition:border-color .15s,background .15s}.btn:hover:not(:disabled){border-color:var(--accent)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.primary{background:var(--accent);color:#06101f;border-color:var(--accent);font-weight:600}.btn.danger{border-color:var(--err);color:var(--err)}.btn.small{padding:4px 9px;font-size:12px}.layout{display:grid;grid-template-columns:1.1fr 1fr;gap:16px;padding:16px 20px;flex:1}@media (max-width: 1100px){.layout{grid-template-columns:1fr}}.col{display:flex;flex-direction:column;gap:16px}.widget{background:var(--bg-2);border:1px solid var(--border);border-radius:10px;overflow:hidden}.widget>header{display:flex;align-items:center;gap:10px;padding:11px 14px;border-bottom:1px solid var(--border);background:var(--bg-3)}.widget>header h2{font-size:14px;margin:0;font-weight:600}.widget>header .tag{font-size:11px;color:var(--fg-dim);font-family:var(--mono)}.widget>header .spacer{flex:1}.widget .body{padding:14px}.accordion .fam{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:var(--bg-3)}.accordion .fam>.fam-head{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.accordion .fam>.fam-head:hover{background:var(--bg);border-radius:8px}.accordion .fam .caret{color:var(--fg-dim);width:12px;transition:transform .15s}.accordion .fam.open .caret{transform:rotate(90deg)}.accordion .fam .fam-name{font-weight:600;text-transform:capitalize}.accordion .fam .fam-proto{font-family:var(--mono);font-size:11px;color:var(--fg-dim)}.accordion .fam .count{margin-left:auto;font-size:12px;color:var(--fg-dim);background:var(--bg);padding:2px 8px;border-radius:10px;border:1px solid var(--border)}.accordion .fam .fam-body{padding:0 12px 12px 28px}.accordion .fam .fam-meta{font-size:12px;color:var(--fg-dim);margin:4px 0 10px}.dev-row{display:flex;align-items:center;gap:10px;padding:7px 0;border-top:1px solid var(--border);font-size:13px}.dev-row .dev-name{font-weight:500}.dev-row .dev-ip{font-family:var(--mono);font-size:12px;color:var(--fg-dim)}.dev-row .spacer{flex:1}.dot{width:8px;height:8px;border-radius:50%;display:inline-block}.dot.online{background:var(--ok)}.dot.offline,.dot.unreachable{background:var(--err)}.dot.degraded{background:var(--warn)}.dot.unknown{background:var(--fg-dim)}.badge{font-size:11px;padding:2px 7px;border-radius:5px;border:1px solid var(--border)}.badge.ok{color:var(--ok);border-color:var(--ok)}.badge.warn{color:var(--warn);border-color:var(--warn)}.badge.err{color:var(--err);border-color:var(--err)}.badge.pending{color:var(--pending);border-color:var(--pending)}.badge.dim{color:var(--fg-dim)}.alert{padding:9px 12px;border-radius:7px;font-size:13px;margin:8px 0}.alert.err{background:#ef5b5b1f;border:1px solid var(--err);color:#ffc9c9}.alert.warn{background:#f6c3431f;border:1px solid var(--warn);color:#ffe9a8}.alert.ok{background:#38c1721f;border:1px solid var(--ok);color:#b6f0cd}.alert.info{background:#4f9dff1a;border:1px solid var(--accent);color:#cfe2ff}.log{font-family:var(--mono);font-size:12px;line-height:1.5;background:#0a0d13;border:1px solid var(--border);border-radius:7px;padding:10px;max-height:280px;overflow:auto;white-space:pre-wrap;word-break:break-word}.log .stderr{color:#ffb4b4}.log .meta{color:var(--accent)}.metric-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.metric{background:var(--bg-3);border:1px solid var(--border);border-radius:8px;padding:12px}.metric .label{font-size:11px;color:var(--fg-dim);text-transform:uppercase;letter-spacing:.5px}.metric .value{font-size:26px;font-weight:700;margin-top:4px;font-variant-numeric:tabular-nums}.metric .sub{font-size:11px;color:var(--fg-dim);font-family:var(--mono);margin-top:2px}.bar{height:6px;background:var(--bg);border-radius:3px;overflow:hidden;margin-top:8px}.bar>span{display:block;height:100%;background:var(--accent);transition:width .3s}table.lan{width:100%;border-collapse:collapse;font-size:13px}table.lan th,table.lan td{text-align:left;padding:7px 8px;border-bottom:1px solid var(--border)}table.lan th{color:var(--fg-dim);font-weight:500;font-size:11px;text-transform:uppercase}table.lan td.mono{font-family:var(--mono);font-size:12px}.field{display:flex;flex-direction:column;gap:5px;margin-bottom:12px}.field label{font-size:12px;color:var(--fg-dim)}.field input,.field select{background:var(--bg-3);color:var(--fg);border:1px solid var(--border);border-radius:7px;padding:9px 11px;font-size:14px;font-family:inherit}.field input:focus,.field select:focus{outline:none;border-color:var(--accent)}.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.muted{color:var(--fg-dim);font-size:12px}.mono{font-family:var(--mono)}.spacer{flex:1}.gauge-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}@media (max-width: 560px){.gauge-grid{grid-template-columns:1fr}}.gauge{position:relative;background:var(--bg-3);border:1px solid var(--border);border-radius:10px;padding:12px;overflow:hidden;transition:border-color .4s ease,box-shadow .4s ease}.gauge.lvl-green{border-color:#38c1728c;box-shadow:0 0 0 1px #38c1721a inset}.gauge.lvl-amber{border-color:#f6c3438c;box-shadow:0 0 0 1px #f6c3431f inset}.gauge.lvl-red{border-color:#ef5b5ba6;box-shadow:0 0 0 1px #ef5b5b24 inset}.gauge.lvl-na{opacity:.85}.gauge .g-head{display:flex;align-items:baseline;gap:8px}.gauge .g-label{font-size:11px;color:var(--fg-dim);text-transform:uppercase;letter-spacing:.6px}.gauge .g-value{margin-left:auto;font-size:22px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums;transition:color .4s ease}.gauge.lvl-green .g-value{color:var(--ok)}.gauge.lvl-amber .g-value{color:var(--warn)}.gauge.lvl-red .g-value{color:var(--err)}.gauge.lvl-na .g-value{color:var(--fg-dim);font-size:16px}.gauge .g-sub{font-size:10.5px;color:var(--fg-dim);font-family:var(--mono);margin-top:3px;min-height:13px}.gauge .g-spark{display:block;width:100%;height:44px;margin-top:8px}.gauge .g-spark .area{transition:opacity .3s ease}.gauge .g-bar{height:6px;background:var(--bg);border-radius:3px;overflow:hidden;margin-top:8px}.gauge .g-bar>span{display:block;height:100%;width:0;transition:width .9s cubic-bezier(.22,1,.36,1),background-color .4s ease}.gauge.lvl-green .g-bar>span{background:var(--ok)}.gauge.lvl-amber .g-bar>span{background:var(--warn)}.gauge.lvl-red .g-bar>span{background:var(--err)}@keyframes g-pulse{0%,to{opacity:1}50%{opacity:.55}}.gauge.lvl-red .g-dot{animation:g-pulse 1.1s ease-in-out infinite}.gauge .g-dot{width:8px;height:8px;border-radius:50%;background:var(--fg-dim)}.gauge.lvl-green .g-dot{background:var(--ok)}.gauge.lvl-amber .g-dot{background:var(--warn)}.gauge.lvl-red .g-dot{background:var(--err)}.live-pip{display:inline-flex;align-items:center;gap:6px;font-size:11px}.live-pip .pip{width:7px;height:7px;border-radius:50%;background:var(--fg-dim)}.live-pip.live .pip{background:var(--ok);animation:g-pulse 1.6s ease-in-out infinite}.live-pip.error .pip{background:var(--err)}.live-pip.connecting .pip{background:var(--warn);animation:g-pulse 1s ease-in-out infinite}.skeleton{background:linear-gradient(90deg,var(--bg-3) 25%,var(--bg) 50%,var(--bg-3) 75%);background-size:200% 100%;animation:g-shimmer 1.4s ease-in-out infinite;border-radius:8px}@keyframes g-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.ra-svc{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 10px;margin-bottom:12px;background:var(--bg-3);border:1px solid var(--border);border-radius:8px}.ra-svc .svc-name{font-family:var(--mono);font-size:12px}.ra-toolbar{display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:wrap}.ra-search{flex:1;min-width:140px;background:var(--bg-3);color:var(--fg);border:1px solid var(--border);border-radius:7px;padding:7px 10px;font-size:13px}.ra-search:focus{outline:none;border-color:var(--accent)}.ra-count{font-size:11px;color:var(--fg-dim)}.ra-list{display:flex;flex-direction:column;max-height:440px;overflow:auto}.ra-list-empty{padding:18px;text-align:center;color:var(--fg-dim);font-size:13px}.ra-row{display:flex;align-items:center;gap:10px;padding:9px 6px;border-top:1px solid var(--border);font-size:13px;animation:ra-fade-in .25s ease both}.ra-row:first-child{border-top:none}.ra-row.busy{opacity:.6}.ra-row .ra-id{min-width:0;flex:1}.ra-row .ra-name{font-weight:500;display:flex;align-items:center;gap:7px}.ra-row .ra-sub{font-family:var(--mono);font-size:11px;color:var(--fg-dim);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ra-row .ra-actions{display:flex;align-items:center;gap:8px}@keyframes ra-fade-in{0%{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}.ra-toggle{position:relative;width:46px;height:24px;flex:none;border-radius:12px;border:1px solid var(--border);background:var(--bg);cursor:pointer;transition:background .2s,border-color .2s;padding:0}.ra-toggle .knob{position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:var(--fg-dim);transition:transform .2s,background .2s}.ra-toggle.on{background:#38c17238;border-color:var(--ok)}.ra-toggle.on .knob{transform:translate(22px);background:var(--ok)}.ra-toggle:disabled{cursor:not-allowed;opacity:.55}.ra-toggle.locked{cursor:not-allowed;background:#f6c34324;border-color:var(--warn)}.ra-toggle.spin .knob{animation:ra-pulse .8s ease-in-out infinite}@keyframes ra-pulse{0%,to{opacity:1}50%{opacity:.4}}.ra-tag{font-size:10px;padding:1px 6px;border-radius:5px;border:1px solid var(--border);color:var(--fg-dim)}.ra-tag.route{color:var(--ok);border-color:var(--ok)}.ra-tag.bypass{color:var(--fg-dim)}.ra-tag.cloud{color:var(--warn);border-color:var(--warn)}.ra-tag.assigned{color:var(--accent);border-color:var(--accent)}.ra-tag.pending{color:var(--pending);border-color:var(--pending)}.ra-assign{background:var(--bg-3);border:1px solid var(--accent);border-radius:8px;padding:10px 12px;margin:4px 0 6px;animation:ra-fade-in .2s ease both}.ra-assign .ra-assign-head{font-size:12px;color:var(--fg-dim);margin-bottom:8px}.ra-assign select{width:100%;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:7px;padding:8px 10px;font-size:13px;margin-top:6px}.ra-assign select:focus{outline:none;border-color:var(--accent)}.ra-undo{background:none;border:none;color:var(--accent);cursor:pointer;font-size:12px;padding:0;text-decoration:underline}.ra-rowmsg{font-size:11px;margin-top:3px}.ra-rowmsg.ok{color:var(--ok)}.ra-rowmsg.warn{color:var(--warn)}.ra-rowmsg.err{color:var(--err)}.ra-rowmsg.info{color:var(--accent)}.ra-skel{height:44px;border-top:1px solid var(--border);position:relative;overflow:hidden}.ra-skel:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.04),transparent);animation:ra-shimmer 1.2s infinite}@keyframes ra-shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.spinner{width:13px;height:13px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;display:inline-block;animation:ra-spin .7s linear infinite;vertical-align:-2px}@keyframes ra-spin{to{transform:rotate(360deg)}}.login-wrap{min-height:100vh;display:grid;place-items:center}.login-card{width:360px;background:var(--bg-2);border:1px solid var(--border);border-radius:12px;padding:28px}.login-card h1{font-size:18px;margin:0 0 4px}.login-card .sub{color:var(--fg-dim);font-size:13px;margin-bottom:20px}
