*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg:#f3f4f6;--surface:#fff;--surface-2:#fafbfc;--surface-3:#f1f3f5;--sidebar:#15171c;--sidebar-2:#1c1f26;--sidebar-line:#2a2e37;--sidebar-ink:#c9cdd4;--sidebar-ink-2:#7c828d;--sidebar-ink-3:#565b65;--ink:#15181d;--ink-2:#565d68;--ink-3:#878d97;--ink-4:#aab0b9;--line:#e5e7eb;--line-2:#eef0f3;--line-strong:#d5d9df;--accent:#2f6bdb;--accent-deep:#2457bd;--accent-weak:#eaf1fd;--accent-line:#cadcfb;--live:#1f9d57;--live-weak:#e7f5ec;--live-line:#bfe5cd;--sched:#b3791a;--sched-weak:#f9efdc;--sched-line:#ecd9ad;--offline:#d6453c;--offline-weak:#fbe9e7;--offline-line:#f3cbc7;--sync:#6b54d1;--sync-weak:#efecfb;--sync-line:#d8d0f5;--r-xs:4px;--r-sm:6px;--r:8px;--r-lg:12px;--r-pill:20px;--sh-1:0 1px 2px #15181d0f;--sh-2:0 4px 14px #15181d1a;--sh-3:0 16px 40px #15181d2e;--s-1:4px;--s-2:8px;--s-3:12px;--s-4:16px;--s-5:20px;--s-6:24px;--s-8:32px;--display:"Inter Tight", system-ui, sans-serif;--sans:"IBM Plex Sans", system-ui, sans-serif;--mono:"IBM Plex Mono", ui-monospace, monospace;--primary:var(--accent);--primary-dark:var(--accent-deep);--primary-glow:#2f6bdb29;--dark:var(--sidebar);--dark-border:var(--sidebar-line);--dark-hover:var(--sidebar-2);--slate-600:var(--ink-2);--slate-500:var(--ink-3);--slate-400:var(--ink-4);--slate-300:var(--line-strong);--slate-200:var(--line);--slate-100:var(--surface-3);--slate-50:var(--bg);--text:var(--ink);--success:var(--live);--warning:var(--sched);--danger:var(--offline);--font-heading:var(--display);--font-body:var(--sans);--radius:8px;--radius-lg:12px;--shadow-sm:var(--sh-1);--shadow:var(--sh-2);--sidebar-w:236px;--sidebar-collapsed:64px}body{font-family:var(--sans);background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased;margin:0;font-size:14px;line-height:1.45}a{color:inherit;text-decoration:none}button{cursor:pointer;font-family:inherit}input,textarea,select{font-family:inherit}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:4px}#root{min-height:100vh}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-1)}.btn{border-radius:var(--r-sm);white-space:nowrap;height:34px;color:var(--ink-2);border:1px solid #0000;align-items:center;gap:7px;padding:0 14px;font-size:13.5px;font-weight:600;line-height:1;transition:background .15s,border-color .15s,opacity .15s;display:inline-flex}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--accent);color:#fff}.btn-primary:hover:not(:disabled){background:var(--accent-deep)}.btn-outline{background:var(--surface);border-color:var(--line);color:var(--ink)}.btn-outline:hover:not(:disabled){border-color:var(--line-strong);background:var(--surface-2)}.btn-ghost{background:var(--surface-3);color:var(--ink-2)}.btn-ghost:hover:not(:disabled){background:var(--line)}.btn-danger{background:var(--offline-weak);color:var(--offline);border-color:var(--offline-line)}.btn-danger:hover:not(:disabled){background:#f8ddda}.btn-sm{height:30px;padding:0 10px;font-size:12.5px}.btn-lg{height:38px;padding:0 18px;font-size:15px}.btn-icon{justify-content:center;width:34px;padding:0}.btn-sm.btn-icon{width:30px}.input{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);width:100%;height:34px;color:var(--ink);outline:none;padding:0 11px;font-size:13.5px;transition:border-color .15s,box-shadow .15s}.input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-weak)}.input::placeholder{color:var(--ink-3)}textarea.input{height:auto;padding:9px 11px}select.input{padding:0 8px}.label{color:var(--ink-2);margin-bottom:6px;font-size:12.5px;font-weight:600;display:block}.badge{border-radius:var(--r-pill);border:1px solid #0000;align-items:center;gap:5px;padding:2px 9px;font-size:11.5px;font-weight:600;display:inline-flex}.badge-green{background:var(--live-weak);color:#157a43;border-color:var(--live-line)}.badge-yellow{background:var(--sched-weak);color:#8c5e13;border-color:var(--sched-line)}.badge-red{background:var(--offline-weak);color:#b1362e;border-color:var(--offline-line)}.badge-blue{background:var(--accent-weak);color:var(--accent-deep);border-color:var(--accent-line)}.badge-slate{background:var(--surface-3);color:var(--ink-2);border-color:var(--line)}.page{padding:24px 28px}.page-header{justify-content:space-between;align-items:center;gap:12px;margin-bottom:22px;display:flex}.page-title{font-family:var(--display);letter-spacing:-.02em;color:var(--ink);font-size:22px;font-weight:700}.empty{color:var(--ink-3);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:12px;padding:56px 32px;display:flex}.empty svg{color:var(--ink-4)}.empty h3{color:var(--ink);font-size:16px;font-weight:700}.empty p{max-width:340px;font-size:13.5px}@keyframes spin{to{transform:rotate(360deg)}}.spinner{border:2px solid var(--line);border-top-color:var(--accent);border-radius:50%;flex:none;width:20px;height:20px;animation:.7s linear infinite spin}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.35}}.modal-overlay{z-index:50;background:#0f11156b;justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.modal{background:var(--surface);border-radius:var(--r-lg);width:100%;max-width:480px;box-shadow:var(--sh-3);padding:24px}.modal-title{font-family:var(--display);color:var(--ink);margin-bottom:4px;font-size:19px;font-weight:700}.modal-sub{color:var(--ink-3);margin-bottom:20px;font-size:13.5px}@keyframes slideIn{0%{transform:translate(120%)}to{transform:translate(0)}}.toast-container{z-index:100;pointer-events:none;flex-direction:column;gap:8px;display:flex;position:fixed;bottom:24px;right:24px}.toast{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh-2);align-items:center;gap:10px;padding:12px 16px;font-size:13.5px;font-weight:500;animation:.2s slideIn;display:flex}.toast-success{border-left:3px solid var(--live)}.toast-error{border-left:3px solid var(--offline)}
