:root{--font-sans: "IBM Plex Sans", system-ui, sans-serif;--font-mono: "IBM Plex Mono", ui-monospace, monospace;--radius: 6px;--radius-sm: 4px;--transition: .14s cubic-bezier(.4, 0, .2, 1);--sidebar-w: 232px;--header-h: 56px}:root,:root[data-theme=dark]{--bg: #0c0f14;--bg-elev: #11151c;--bg-elev-2: #161b24;--bg-input: #0e1218;--border: #232a36;--border-strong: #313a4a;--text: #e4e8ef;--text-dim: #98a2b3;--text-faint: #5f6b7e;--accent: #34d399;--accent-dim: #1e7a5a;--accent-bg: rgba(52, 211, 153, .08);--warn: #fbbf24;--warn-bg: rgba(251, 191, 36, .09);--danger: #f87171;--danger-bg: rgba(248, 113, 113, .1);--info: #60a5fa;--grid-line: rgba(255, 255, 255, .04);--shadow: 0 8px 28px rgba(0, 0, 0, .5)}:root[data-theme=light]{--bg: #f4f5f7;--bg-elev: #ffffff;--bg-elev-2: #fbfbfc;--bg-input: #ffffff;--border: #e2e5ea;--border-strong: #cdd2db;--text: #1a1f29;--text-dim: #5a6373;--text-faint: #9aa3b2;--accent: #0d9668;--accent-dim: #6ee7b7;--accent-bg: rgba(13, 150, 104, .07);--warn: #b45309;--warn-bg: rgba(180, 83, 9, .08);--danger: #dc2626;--danger-bg: rgba(220, 38, 38, .07);--info: #2563eb;--grid-line: rgba(0, 0, 0, .035);--shadow: 0 6px 22px rgba(15, 23, 42, .1)}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{font-family:var(--font-sans);background:var(--bg);color:var(--text);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(var(--grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--grid-line) 1px,transparent 1px);background-size:32px 32px;pointer-events:none;z-index:0}#root{position:relative;z-index:1}a{color:inherit;text-decoration:none}button,input,select{font-family:inherit;font-size:inherit;color:inherit}code,.mono{font-family:var(--font-mono)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:6px;border:2px solid var(--bg)}.btn{display:inline-flex;align-items:center;gap:7px;padding:8px 14px;background:var(--bg-elev-2);border:1px solid var(--border-strong);border-radius:var(--radius-sm);cursor:pointer;font-weight:500;font-size:13px;transition:var(--transition);white-space:nowrap}.btn:hover{border-color:var(--accent-dim);background:var(--accent-bg)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#04130d;font-weight:600}.btn-primary:hover{filter:brightness(1.08);background:var(--accent)}.btn-danger{border-color:var(--danger);color:var(--danger)}.btn-danger:hover{background:var(--danger-bg);border-color:var(--danger)}.btn-sm{padding:5px 10px;font-size:12px}.input{width:100%;padding:9px 12px;background:var(--bg-input);border:1px solid var(--border-strong);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:13px;transition:var(--transition);outline:none}.input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-bg)}.card{background:var(--bg-elev);border:1px solid var(--border);border-radius:var(--radius)}.tag{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;font-family:var(--font-mono);font-size:11px;font-weight:500;border-radius:3px;background:var(--bg-elev-2);border:1px solid var(--border);color:var(--text-dim)}.tag-accent{color:var(--accent);border-color:var(--accent-dim);background:var(--accent-bg)}.tag-warn{color:var(--warn);border-color:var(--warn);background:var(--warn-bg)}.label{display:block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint);margin-bottom:6px}.dot{width:7px;height:7px;border-radius:50%;display:inline-block;flex-shrink:0}.dot-ok{background:var(--accent);box-shadow:0 0 7px var(--accent)}.dot-off{background:var(--danger)}@keyframes fadeUp{0%{opacity:0;transform:translateY(7px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:fadeUp .32s cubic-bezier(.16,1,.3,1) both}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.flash{animation:flashBg 1s ease-out}@keyframes flashBg{0%{background:var(--accent-bg)}to{background:transparent}}.spin{animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}
