:root{--bg: #0a0e15;--bg-soft: #0d121b;--panel: #111826;--panel-2: #0f1520;--panel-3: #151e2e;--border: #1e2a3a;--border-soft: #17212f;--text: #e6edf3;--text-2: #aab8c8;--muted: #7d8b9d;--primary: #3b82f6;--primary-weak: rgba(59, 130, 246, .14);--accent: #d97706;--accent-weak: rgba(217, 119, 6, .14);--ok: #22c55e;--ok-weak: rgba(34, 197, 94, .14);--danger: #ef4444;--danger-weak: rgba(239, 68, 68, .14);--radius: 10px;--radius-sm: 7px;--space-xs: 4px;--space-sm: 8px;--space-md: 16px;--space-lg: 24px;--space-xl: 32px;--mono: ui-monospace, "SF Mono", "Cascadia Mono", "Fira Code", Consolas, monospace;--sans: system-ui, -apple-system, "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif}*{box-sizing:border-box}html,body,#app{height:100%}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 var(--sans);-webkit-font-smoothing:antialiased}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}button,input,select,textarea{font:inherit;color:inherit}::selection{background:#3b82f659}.shell{display:grid;grid-template-columns:216px 1fr;height:100%}.sidebar{background:var(--bg-soft);border-right:1px solid var(--border);display:flex;flex-direction:column;min-height:0}.brand{display:flex;align-items:center;gap:10px;padding:18px 16px 14px;border-bottom:1px solid var(--border-soft)}.brand .mark{width:26px;height:26px;border-radius:7px;background:linear-gradient(140deg,var(--primary),#1e40af);display:grid;place-items:center;color:#fff;font-weight:700;font-size:13px}.brand b{font-size:14px;letter-spacing:.2px}.brand span{display:block;font-size:11px;color:var(--muted);margin-top:1px}.nav{flex:1;overflow:auto;padding:10px 8px 16px}.nav-group{margin:12px 8px 4px;font-size:11px;letter-spacing:.08em;color:var(--muted);text-transform:uppercase}.nav a{display:flex;align-items:center;gap:9px;padding:8px 10px;margin:1px 0;border-radius:var(--radius-sm);color:var(--text-2);font-size:13px}.nav a svg{width:15px;height:15px;opacity:.8;flex:none}.nav a:hover{background:var(--panel);color:var(--text);text-decoration:none}.nav a.router-link-active{background:var(--primary-weak);color:#bfdbfe}.nav a.router-link-active svg{opacity:1}.sidebar-foot{padding:10px 14px 14px;border-top:1px solid var(--border-soft);font-size:11px;color:var(--muted)}.sidebar-foot b{color:var(--text-2);font-weight:500}.main{display:flex;flex-direction:column;min-width:0;min-height:0}.topbar{height:52px;flex:none;display:flex;align-items:center;gap:14px;padding:0 20px;border-bottom:1px solid var(--border);background:var(--bg-soft)}.topbar h1{font-size:15px;font-weight:600;margin:0}.topbar .sp{flex:1}.who{font-size:12px;color:var(--muted)}.content{flex:1;overflow:auto;padding:20px}.panel{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.panel+.panel{margin-top:16px}.panel-head{display:flex;align-items:center;gap:10px;padding:11px 14px;border-bottom:1px solid var(--border-soft);background:var(--panel-2)}.panel-head h2{font-size:13px;font-weight:600;margin:0;letter-spacing:.2px}.panel-head .sp{flex:1}.panel-body{padding:14px}.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:12px}.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:13px 14px}.card .k{font-size:11px;color:var(--muted);letter-spacing:.04em}.card .v{font:600 24px/1.25 var(--mono);margin-top:6px;letter-spacing:-.02em}.card .v small{font-size:12px;color:var(--muted);font-weight:400}.table-wrap{overflow:auto}table.t{width:100%;border-collapse:collapse;font-size:13px}table.t th{text-align:left;font-weight:500;font-size:11px;letter-spacing:.05em;color:var(--muted);text-transform:uppercase;padding:8px 12px;border-bottom:1px solid var(--border);background:var(--panel-2);position:sticky;top:0;z-index:1}table.t td{padding:9px 12px;border-bottom:1px solid var(--border-soft);vertical-align:middle}table.t tr:last-child td{border-bottom:0}table.t tbody tr:hover{background:#3b82f60b}table.t .mono{font-family:var(--mono);font-size:12px}table.t .actions{display:flex;gap:6px;flex-wrap:wrap}.empty{padding:28px;text-align:center;color:var(--muted);font-size:13px}.form-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px 12px}.field{display:flex;flex-direction:column;gap:5px}.field label{font-size:11px;color:var(--muted);letter-spacing:.03em}input.in,select.in,textarea.in{background:var(--bg-soft);border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 10px;color:var(--text);outline:none;min-width:0;font-size:13px}input.in:focus,select.in:focus,textarea.in:focus{border-color:var(--primary);box-shadow:0 0 0 3px #3b82f62e}input.in::placeholder{color:#5b6979}textarea.in{min-height:72px;resize:vertical;font-family:var(--mono);font-size:12px}.btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--panel-3);color:var(--text-2);cursor:pointer;font-size:12.5px;transition:background .12s ease,border-color .12s ease,color .12s ease;min-height:30px}.btn:hover{background:#1b2740;color:var(--text)}.btn:active{transform:translateY(.5px)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}.btn.primary:hover{background:#2f74e0}.btn.danger{background:transparent;border-color:#ef444473;color:#fca5a5}.btn.danger:hover{background:var(--danger-weak)}.btn.ghost{background:transparent}.btn.sm{padding:3px 9px;font-size:12px;min-height:26px}.tag{display:inline-flex;align-items:center;gap:4px;padding:1px 8px;border-radius:999px;font-size:11px;border:1px solid var(--border);color:var(--text-2);background:var(--panel-3);white-space:nowrap}.tag.ok{color:#86efac;border-color:#22c55e59;background:var(--ok-weak)}.tag.warn{color:#fcd34d;border-color:#d9770666;background:var(--accent-weak)}.tag.bad{color:#fca5a5;border-color:#ef444466;background:var(--danger-weak)}.tag.info{color:#bfdbfe;border-color:#3b82f666;background:var(--primary-weak)}.mono{font-family:var(--mono)}.muted{color:var(--muted)}.small{font-size:12px}.right{text-align:right}.row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.mt{margin-top:12px}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}@media(max-width:900px){.shell{grid-template-columns:1fr}.sidebar{display:none}.grid2{grid-template-columns:1fr}}.login-wrap{min-height:100%;display:grid;place-items:center;padding:24px}.login-card{width:100%;max-width:380px;background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:26px}.login-card h1{font-size:17px;margin:0 0 4px}.login-card p.sub{margin:0 0 20px;color:var(--muted);font-size:12.5px}.login-card .field+.field{margin-top:12px}.login-card .btn{width:100%;justify-content:center;margin-top:18px}.toasts{position:fixed;right:16px;bottom:16px;display:flex;flex-direction:column;gap:8px;z-index:50}.toast{padding:9px 13px;border-radius:var(--radius-sm);font-size:12.5px;background:var(--panel-3);border:1px solid var(--border);color:var(--text);box-shadow:0 8px 24px #00000059;min-width:180px;max-width:380px}.toast.ok{border-color:#22c55e66}.toast.err{border-color:#ef444480;color:#fecaca}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#03060cb3;display:grid;place-items:center;z-index:40;padding:20px}.modal{width:min(720px,100%);max-height:86vh;overflow:auto;background:var(--panel);border:1px solid var(--border);border-radius:12px}.modal header{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--border-soft)}.modal header h3{margin:0;font-size:13.5px}.modal .body{padding:16px}.modal .foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid var(--border-soft)}pre.code{background:var(--bg-soft);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;overflow:auto;font:12px/1.55 var(--mono);color:#cfe3ff;margin:0;max-height:340px}.spinner{width:14px;height:14px;border:2px solid rgba(255,255,255,.25);border-top-color:var(--text);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;transition-duration:.01ms!important}}
