:root{--tone-10203325:#10203325;--tone-13233b26:#13233b26;--tone-1421376b:#1421376b;--tone-14233a30:#14233a30;--tone-17243b:#17243b;--tone-182337:#182337;--tone-19305209:#19305209;--tone-19324b:#19324b;--tone-1949c6:#1949c6;--tone-20304704:#20304704;--tone-238455:#238455;--tone-24334d:#24334d;--tone-245ce6:#245ce6;--tone-28714f:#28714f;--tone-426899:#426899;--tone-497ce2:#497ce2;--tone-52637a:#52637a;--tone-526f94:#526f94;--tone-536781:#536781;--tone-617086:#617086;--tone-64748b:#64748b;--tone-66758b:#66758b;--tone-708096:#708096;--tone-8b651d:#8b651d;--tone-94a3b8:#94a3b8;--tone-9a6a0c:#9a6a0c;--tone-a8c3ff:#a8c3ff;--tone-b52d3a:#b52d3a;--tone-b7cdfb:#b7cdfb;--tone-bac8dc:#bac8dc;--tone-bf3d48:#bf3d48;--tone-c43c48:#c43c48;--tone-cbd5e1:#cbd5e1;--tone-d5deeb:#d5deeb;--tone-dbe3f0:#dbe3f0;--tone-dbe6fa:#dbe6fa;--tone-dce3ee:#dce3ee;--tone-e1e7f0:#e1e7f0;--tone-e2eafb:#e2eafb;--tone-e3e8f0:#e3e8f0;--tone-e8edf4:#e8edf4;--tone-e8effe:#e8effe;--tone-eaf0fc:#eaf0fc;--tone-eaf8f0:#eaf8f0;--tone-edf0f5:#edf0f5;--tone-edf3fc:#edf3fc;--tone-edf3ff:#edf3ff;--tone-edf7f1:#edf7f1;--tone-eef3fb:#eef3fb;--tone-efd3d6:#efd3d6;--tone-eff2f6:#eff2f6;--tone-f0f3f8:#f0f3f8;--tone-f1f5f9:#f1f5f9;--tone-f2d9b2:#f2d9b2;--tone-f3f7ff:#f3f7ff;--tone-f4d7dc:#f4d7dc;--tone-f4f6fa:#f4f6fa;--tone-f6f8fc:#f6f8fc;--tone-f7faff:#f7faff;--tone-fafbfd:#fafbfd;--tone-ffebed:#ffebed;--tone-ffeded:#ffeded;--tone-fff1f2:#fff1f2;--tone-fff5df:#fff5df;--tone-fff8f8:#fff8f8;--tone-fffbf1:#fffbf1;--chart-total:#0f172a;--chart-grid:#e5eaf3}
:root{color-scheme:light;--bg:var(--tone-f4f6fa);--surface:#fff;--ink:var(--tone-182337);--muted:var(--tone-64748b);--line:var(--tone-e3e8f0);--blue:var(--tone-245ce6);--blue-soft:var(--tone-edf3ff);--danger:var(--tone-c43c48);--radius:14px;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;font-size:14px;line-height:1.55}*{box-sizing:border-box}body{margin:0;color:var(--ink);background:var(--bg)}a{color:var(--blue);text-decoration:none}button,input,select,textarea{font:inherit}button,a.button{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:38px;padding:8px 14px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--ink);font-weight:550;cursor:pointer;transition:background .15s,border-color .15s;white-space:nowrap}button:hover,a.button:hover{background:var(--tone-f6f8fc);border-color:var(--tone-bac8dc)}button.primary,a.primary{background:var(--blue);border-color:var(--blue);color:#fff}button.primary:hover,a.primary:hover{background:var(--tone-1949c6)}button.danger{color:var(--danger);border-color:var(--tone-efd3d6);background:var(--tone-fff8f8)}button.danger:hover{background:var(--tone-ffebed)}button.quiet{border-color:transparent;background:transparent;color:var(--muted)}button:disabled{opacity:.5;cursor:not-allowed}input:not([type=checkbox]),select,textarea{display:block;width:100%;min-height:42px;border:1px solid var(--tone-cbd5e1);border-radius:8px;padding:10px 12px;background:var(--surface);color:var(--ink)}input[type=checkbox]{width:16px;height:16px;accent-color:var(--blue);margin:0;flex-shrink:0}input::placeholder{color:var(--tone-94a3b8);font-weight:400}:focus-visible{outline:3px solid var(--tone-a8c3ff);outline-offset:2px}h1,h2,h3,p{margin:0}h1{font-size:27px;letter-spacing:-.7px;line-height:1.35}h2{font-size:18px;letter-spacing:-.2px}h3{font-size:15px}small,.muted{color:var(--muted)}.site-header{background:var(--surface);border-bottom:1px solid var(--line)}.header-inner{max-width:1240px;margin:auto;padding:19px 32px;display:flex;align-items:center;gap:24px;justify-content:space-between}.brand{display:inline-flex;align-items:center;gap:11px;color:var(--ink);font-weight:720;font-size:18px;letter-spacing:-.4px;white-space:nowrap}.brand-mark{display:grid;place-items:center;width:33px;height:33px;border-radius:9px;background:var(--blue);color:white;font-size:16px;letter-spacing:-1px}.brand small{font-size:11px;letter-spacing:1px;border-left:1px solid var(--line);padding-left:12px;font-weight:500}.nav{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end}.identity{display:flex;align-items:center;gap:8px;padding-right:10px;margin-right:5px;border-right:1px solid var(--line);font-size:13px}.avatar{display:grid;place-items:center;background:var(--tone-eaf0fc);color:var(--blue);width:28px;height:28px;border-radius:50%;font-weight:700}.container{max-width:1240px;margin:auto;padding:36px 32px 64px}.page-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:26px}.eyebrow{font-size:11px;font-weight:650;color:var(--blue);letter-spacing:1.8px;margin-bottom:7px}.page-heading p{margin-top:9px;color:var(--muted);max-width:700px}.page-meta{color:var(--muted);font-size:12px;white-space:nowrap}.nodes{display:grid;gap:18px}.node-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:23px 25px;box-shadow:0 3px 12px var(--tone-20304704)}.node-top{display:flex;gap:18px;align-items:center;flex-wrap:wrap}.node-title{display:flex;align-items:center;gap:11px;min-width:130px}.node-icon{display:grid;place-items:center;width:36px;height:36px;border-radius:9px;background:var(--tone-edf3fc);color:var(--tone-426899);font-size:18px}.resources{display:flex;align-items:center;flex-wrap:wrap;gap:8px;flex:1}.resource{font-size:12px;color:var(--tone-52637a);border:1px solid var(--tone-e8edf4);background:var(--tone-fafbfd);padding:4px 8px;border-radius:6px;white-space:nowrap}.node-body{display:flex;justify-content:space-between;align-items:center;gap:18px;margin-top:21px;padding-top:19px;border-top:1px solid var(--tone-edf0f5);flex-wrap:wrap}.node-description{color:var(--muted);font-size:13px;margin-top:5px}.actions{display:flex;align-items:center;gap:9px;flex-wrap:wrap}.badge{display:inline-flex;align-items:center;gap:6px;border-radius:20px;padding:4px 9px;font-size:12px;background:var(--tone-f0f3f8);color:var(--tone-617086);white-space:nowrap}.badge:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.badge.running{background:var(--tone-eaf8f0);color:var(--tone-238455)}.badge.starting,.badge.stopping{background:var(--tone-fff5df);color:var(--tone-9a6a0c)}.badge.error{background:var(--tone-ffeded);color:var(--tone-bf3d48)}.ports{display:flex;gap:9px;flex-wrap:wrap;margin-top:18px;padding-top:16px;border-top:1px dashed var(--line)}.ports a{font-size:12px;border:1px solid var(--tone-dbe6fa);background:var(--tone-f7faff);border-radius:7px;padding:7px 10px;overflow-wrap:anywhere}.port-number{font-weight:700;margin-right:8px}.empty{background:var(--surface);border:1px dashed var(--tone-d5deeb);padding:48px 24px;text-align:center;border-radius:var(--radius);color:var(--muted)}.empty h2{color:var(--ink);margin-bottom:8px}.alert{border:1px solid var(--tone-f2d9b2);background:var(--tone-fffbf1);border-radius:9px;padding:13px 16px;color:var(--tone-8b651d);margin:0 0 20px}.error{color:var(--tone-b52d3a);white-space:pre-wrap;font-size:13px}.error:not(:empty){background:var(--tone-fff1f2);border:1px solid var(--tone-f4d7dc);padding:11px 13px;border-radius:8px;margin:14px 0}.error:empty{display:none}.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);background:var(--tone-19324b);color:#fff;padding:11px 20px;border-radius:9px;box-shadow:0 6px 24px var(--tone-10203325);z-index:1000}.auth-layout{min-height:calc(100vh - 73px);display:grid;place-items:center;padding:40px 20px;background:radial-gradient(ellipse at 50% 0,var(--tone-e8effe),transparent 62%)}.auth-card{width:100%;max-width:420px;background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:34px;box-shadow:0 16px 60px var(--tone-19305209)}.auth-card h1{font-size:25px;margin-bottom:7px}.auth-card .subtitle{color:var(--muted);margin-bottom:27px}.field{display:grid;gap:7px;margin-bottom:18px;font-size:13px;font-weight:550}.field small{font-weight:400}.full{width:100%}.auth-foot{text-align:center;font-size:12px;color:var(--tone-94a3b8);margin-top:23px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 18px}.span-2{grid-column:1/-1}.check-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.check-row{display:flex;align-items:center;gap:9px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;font-size:13px;cursor:pointer}.check-row:has(input:checked){border-color:var(--tone-b7cdfb);background:var(--tone-f3f7ff)}.check-row small{margin-left:auto;font-size:11px}.all-nodes{margin-bottom:9px;font-weight:600}.field-title{display:block;font-size:13px;font-weight:550;margin:0 0 8px}.field-group{margin-bottom:19px}.tabs{display:flex;gap:5px;border-bottom:1px solid var(--line);margin-bottom:22px}.tabs button{border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;padding:12px 19px;color:var(--muted)}.tabs button[aria-selected=true]{color:var(--blue);border-bottom-color:var(--blue)}.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}.panel-head{padding:19px 22px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:12px}.panel-head p{font-size:12px;color:var(--muted);margin-top:3px}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse;font-size:13px;text-align:left}th{background:var(--tone-fafbfd);color:var(--tone-708096);font-size:11px;font-weight:600;letter-spacing:.5px;padding:12px 22px;border-bottom:1px solid var(--line)}td{padding:16px 22px;border-bottom:1px solid var(--tone-eff2f6);vertical-align:middle}tr:last-child td{border-bottom:0}.row-name{font-weight:650;color:var(--ink)}td .actions button{min-height:30px;padding:5px 9px;font-size:12px}.tag{display:inline-block;background:var(--tone-eef3fb);color:var(--tone-526f94);border-radius:5px;padding:3px 7px;font-size:11px;margin:2px 4px 2px 0}.tag.all{background:var(--tone-edf7f1);color:var(--tone-28714f)}.audit{margin-top:24px}.audit summary{padding:17px 22px;cursor:pointer;font-weight:600;color:var(--muted)}dialog{padding:0;width:min(520px,calc(100vw - 32px));max-height:calc(100dvh - 48px);border:1px solid var(--line);border-radius:16px;background:var(--surface);color:var(--ink);box-shadow:0 24px 100px var(--tone-14233a30)}dialog::backdrop{background:var(--tone-1421376b);backdrop-filter:blur(2px)}.dialog-head{display:flex;justify-content:space-between;align-items:center;padding:21px 24px 15px;gap:16px}.dialog-head h2{font-size:19px}.icon-button{min-width:32px;min-height:32px;padding:3px;border:0;background:transparent;font-size:23px;color:var(--muted)}.dialog-body{padding:5px 24px 24px}.dialog-description{color:var(--muted);font-size:13px;margin-bottom:20px}.dialog-actions{display:flex;justify-content:flex-end;gap:9px;padding-top:8px}.progress{width:34px;height:34px;border:3px solid var(--tone-e2eafb);border-top-color:var(--blue);border-radius:50%;animation:spin .9s linear infinite;margin:0 auto 18px}@keyframes spin{to{transform:rotate(360deg)}}[hidden]{display:none!important}@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}@media(max-width:700px){.header-inner{padding:16px 18px;flex-wrap:wrap;gap:13px}.brand small{display:none}.nav{gap:3px;justify-content:flex-start}.nav button,.nav a.button{padding:7px 9px;font-size:12px}.container{padding:27px 18px 40px}.page-heading{align-items:flex-start}.page-heading h1{font-size:24px}.page-meta{display:none}.node-card{padding:19px}.node-top{gap:12px}.resources{flex-basis:100%;order:3}.node-top>.badge{margin-left:auto}.node-body{gap:14px}.actions{gap:7px}.form-grid{grid-template-columns:1fr}.auth-card{padding:27px}.panel-head{padding:16px}.table-wrap th,.table-wrap td{padding:13px 16px}.identity{padding-right:6px}.dialog-head{padding:19px 20px 14px}.dialog-body{padding:5px 20px 20px}}
.metrics-dialog{width:1100px;max-width:calc(100vw - 32px)}.chart-container{width:100%;height:300px;min-height:300px;font-size:12px}.monitor-toolbar{display:flex;justify-content:space-between;align-items:center;gap:16px}.monitor-toolbar select{border:1px solid var(--tone-dbe3f0);border-radius:8px;padding:10px;background:var(--surface);color:var(--tone-24334d)}.monitor-note{font-size:12px;color:var(--tone-64748b);line-height:1.8}.docs-layout{display:grid;grid-template-columns:200px minmax(0,1fr);gap:40px}.docs-nav{position:sticky;top:100px;align-self:start;display:grid;gap:12px}.docs-nav a{color:var(--tone-536781);text-decoration:none}.docs-content{background:var(--surface);padding:32px;border:1px solid var(--tone-e1e7f0);border-radius:16px;line-height:1.85}.docs-content h2{scroll-margin-top:100px;margin-top:32px}.docs-content code{background:var(--tone-f1f5f9);border-radius:4px;padding:2px 5px;overflow-wrap:anywhere}.docs-content pre{white-space:pre-wrap;background:var(--tone-f1f5f9);padding:16px;border-radius:8px}.docs-content img{max-width:100%;border:1px solid var(--tone-e1e7f0);border-radius:10px}.docs-content table{display:block;overflow:auto}@media(max-width:700px){.docs-layout{display:block}.docs-nav{position:static;display:flex;flex-wrap:wrap;margin-bottom:20px}.docs-content{padding:18px}.monitor-toolbar{align-items:flex-start;flex-direction:column}.chart-container{height:260px;min-height:260px}}
.monitor-toolbar select{width:auto;min-width:160px;flex:0 0 auto}.monitor-toolbar p{margin:0}.monitor-toolbar{margin-bottom:18px}

/* Resource roster is updated in place so polling preserves hover/focus. */
.user-resource{position:relative;font:inherit;cursor:pointer;text-align:left}
.user-list{display:none;position:absolute;z-index:20;right:0;top:calc(100% + 6px);min-width:240px;padding:12px;border:1px solid var(--tone-dce3ee);border-radius:12px;background:var(--surface);color:var(--tone-17243b);box-shadow:0 10px 32px var(--tone-13233b26);white-space:normal}
.user-resource:hover .user-list,.user-resource:focus .user-list,.user-resource.is-open .user-list{display:block}
.user-row{display:flex;justify-content:space-between;gap:20px;padding:6px 0;font-size:13px}
.user-state,.user-empty{color:var(--tone-66758b);font-size:12px}
.user-resource:focus-visible{outline:2px solid var(--tone-497ce2);outline-offset:3px}

:root:not([data-theme="light"]){color-scheme:dark;--surface:#141e2e;--tone-10203325:#00000040;--tone-13233b26:#00000060;--tone-1421376b:#030811aa;--tone-14233a30:#00000066;--tone-17243b:#e3eaf6;--tone-182337:#e3eaf6;--tone-19305209:#00000015;--tone-19324b:#dbe7fa;--tone-1949c6:#326bd9;--tone-20304704:#00000010;--tone-238455:#73d9a5;--tone-24334d:#dbe7fa;--tone-245ce6:#79a5ff;--tone-28714f:#73d9a5;--tone-426899:#9ebcea;--tone-497ce2:#79a5ff;--tone-52637a:#b0bfd4;--tone-526f94:#afc1e0;--tone-536781:#afc1d9;--tone-617086:#afc1d9;--tone-64748b:#9cacc3;--tone-66758b:#9cacc3;--tone-708096:#9cacc3;--tone-8b651d:#f2ce83;--tone-94a3b8:#94a3b8;--tone-9a6a0c:#f2ce83;--tone-a8c3ff:#83adff;--tone-b52d3a:#ff9ba6;--tone-b7cdfb:#46679e;--tone-bac8dc:#445772;--tone-bf3d48:#ff9ba6;--tone-c43c48:#ff9ba6;--tone-cbd5e1:#354761;--tone-d5deeb:#2a3850;--tone-dbe3f0:#2a3850;--tone-dbe6fa:#2a3850;--tone-dce3ee:#2a3850;--tone-e1e7f0:#2a3850;--tone-e2eafb:#2a3850;--tone-e3e8f0:#2a3850;--tone-e8edf4:#2a3850;--tone-e8effe:#1c2f51;--tone-eaf0fc:#1c2f51;--tone-eaf8f0:#19332c;--tone-edf0f5:#2a3850;--tone-edf3fc:#1c2f51;--tone-edf3ff:#1c2f51;--tone-edf7f1:#19332c;--tone-eef3fb:#1c2f51;--tone-efd3d6:#633443;--tone-eff2f6:#2a3850;--tone-f0f3f8:#243146;--tone-f1f5f9:#1b283c;--tone-f2d9b2:#635032;--tone-f3f7ff:#15243d;--tone-f4d7dc:#633443;--tone-f4f6fa:#0c1320;--tone-f6f8fc:#1b2940;--tone-f7faff:#17243a;--tone-fafbfd:#141f31;--tone-ffebed:#472632;--tone-ffeded:#38212b;--tone-fff1f2:#38212b;--tone-fff5df:#352d1e;--tone-fff8f8:#2c1c27;--tone-fffbf1:#2b261c;--chart-total:#e4edff;--chart-grid:#2b3950}

button.primary,a.primary{background:#326bdf;border-color:#326bdf;color:#fff}
button.primary:hover,a.primary:hover{background:#2457bf}
.resource-monitor{min-height:30px;padding:4px 9px;font-size:12px}
.user-resource{min-height:30px;font-size:12px}
.theme-toggle{min-width:38px;flex-shrink:0}
.recharts-text{fill:var(--muted)}
.recharts-default-tooltip{background:var(--surface)!important;border-color:var(--line)!important;color:var(--ink)!important;border-radius:8px}

.ports-note{flex-basis:100%;margin:0 0 3px;font-size:12px;line-height:1.7;color:var(--muted)}

.user-list{position:fixed;right:auto;width:240px;max-width:calc(100vw - 24px)}
.user-resource.dismiss .user-list{display:none}
.theme-toggle{font-size:19px}
