:root{--bg: #0b0f14;--bg-soft: #11161d;--panel: #141a22;--panel-2: #1a222c;--line: #232c38;--line-soft: #1b232d;--text: #dbe3ec;--text-dim: #8b98a8;--text-faint: #616e7e;--accent: #2fa36b;--accent-dim: #1d6b46;--warn: #d99321;--danger: #d9534f;--info: #4a8fd4;--radius: 9px;--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;--sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 var(--sans);-webkit-font-smoothing:antialiased}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}button,input,select,textarea{font:inherit;color:inherit}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#2a3441;border-radius:6px;border:2px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:#384556}.shell{display:flex;min-height:100%}.sidebar{width:232px;flex:none;background:var(--bg-soft);border-right:1px solid var(--line);display:flex;flex-direction:column;position:sticky;top:0;height:100vh}.brand{display:flex;align-items:center;gap:10px;padding:16px 18px;border-bottom:1px solid var(--line)}.brand-mark{width:30px;height:30px;border-radius:8px;flex:none;background:linear-gradient(140deg,var(--accent),#1a7a4e);display:grid;place-items:center;color:#fff;font-weight:700;font-size:15px}.brand-text{font-weight:650;letter-spacing:-.2px}.brand-text small{display:block;font-weight:400;font-size:11px;color:var(--text-faint);letter-spacing:0}.nav{padding:10px;display:flex;flex-direction:column;gap:2px;flex:1;overflow-y:auto}.nav-label{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-faint);padding:14px 10px 6px}.nav a{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:7px;color:var(--text-dim);font-size:13.5px;text-decoration:none}.nav a:hover{background:var(--panel);color:var(--text)}.nav a.active{background:var(--panel-2);color:var(--text);box-shadow:inset 2px 0 0 var(--accent)}.nav a .count{margin-left:auto;font-size:11px;color:var(--text-faint);font-family:var(--mono)}.sidebar-foot{border-top:1px solid var(--line);padding:12px 14px;font-size:12px;color:var(--text-faint)}.sidebar-foot .who{color:var(--text-dim);display:flex;align-items:center;gap:8px;margin-bottom:6px}.main{flex:1;min-width:0;display:flex;flex-direction:column}.topbar{display:flex;align-items:center;gap:14px;padding:14px 22px;border-bottom:1px solid var(--line);background:#0b0f14e6;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);position:sticky;top:0;z-index:20}.topbar h1{font-size:17px;margin:0;font-weight:620;letter-spacing:-.2px}.topbar .sub{color:var(--text-faint);font-size:12.5px}.topbar .spacer{flex:1}.content{padding:22px;max-width:1600px;width:100%}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:16px}.card h3{margin:0 0 12px;font-size:13px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}.grid{display:grid;gap:14px}.g-auto{grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}.g-2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}.g-4{grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}.row{display:flex;align-items:center;gap:10px}.wrap{flex-wrap:wrap}.spacer{flex:1}.muted{color:var(--text-dim)}.faint{color:var(--text-faint)}.tiny.warn,.small.warn{color:var(--warn)}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.nowrap{white-space:nowrap}.small{font-size:12.5px}.tiny{font-size:11.5px}.right{text-align:right}.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn{display:inline-flex;align-items:center;gap:7px;padding:7px 13px;background:var(--panel-2);border:1px solid var(--line);color:var(--text);border-radius:7px;cursor:pointer;font-size:13px;white-space:nowrap;transition:background .12s,border-color .12s}.btn:hover:not(:disabled){background:#212b37;border-color:#2e3a48}.btn:disabled{opacity:.45;cursor:not-allowed}.btn.primary{background:var(--accent);border-color:var(--accent);color:#05130c;font-weight:600}.btn.primary:hover:not(:disabled){background:#34b478;border-color:#34b478}.btn.danger{color:#f0a5a2;border-color:#4a2a29;background:#2a1a1a}.btn.danger:hover:not(:disabled){background:#3a2120;border-color:#63302e}.btn.sm{padding:4px 9px;font-size:12px}.btn.ghost{background:transparent}.input,.select,.textarea{width:100%;padding:8px 11px;background:var(--bg);color:var(--text);border:1px solid var(--line);border-radius:7px;outline:none}.input:focus,.select:focus,.textarea:focus{border-color:var(--accent-dim);box-shadow:0 0 0 3px #2fa36b21}.textarea{font-family:var(--mono);font-size:13px;resize:vertical;min-height:96px}.field{margin-bottom:14px}.field label{display:block;font-size:12.5px;color:var(--text-dim);margin-bottom:6px}.field .hint{font-size:11.5px;color:var(--text-faint);margin-top:5px}.badge{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:20px;font-size:11.5px;background:var(--panel-2);border:1px solid var(--line);color:var(--text-dim);white-space:nowrap}.badge.ok{color:#7fd3a6;border-color:#1f4433;background:#11251b}.badge.warn{color:#e2b869;border-color:#453519;background:#241d10}.badge.err{color:#eda3a0;border-color:#4a2827;background:#261717}.badge.info{color:#8fbde8;border-color:#23384d;background:#131e29}.dot{width:8px;height:8px;border-radius:50%;flex:none;background:var(--text-faint)}.dot.on{background:var(--accent);box-shadow:0 0 0 3px #2fa36b29}.dot.off{background:#4a5563}.dot.warn{background:var(--warn);box-shadow:0 0 0 3px #d9932124}.dot.err{background:var(--danger);box-shadow:0 0 0 3px #d9534f24}table{width:100%;border-collapse:collapse;font-size:13px}th{text-align:left;font-weight:500;color:var(--text-faint);font-size:11.5px;text-transform:uppercase;letter-spacing:.05em;padding:8px 10px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--panel)}td{padding:8px 10px;border-bottom:1px solid var(--line-soft);vertical-align:middle}tr:last-child td{border-bottom:none}tbody tr:hover{background:#ffffff04}.table-wrap{overflow:auto;margin:0 -16px -16px;padding:0 16px}.table-wrap table{min-width:100%}.bar{height:5px;background:#1c242e;border-radius:4px;overflow:hidden}.bar>i{display:block;height:100%;background:var(--accent);border-radius:4px;transition:width .35s ease}.bar.warn>i{background:var(--warn)}.bar.err>i{background:var(--danger)}.stat{display:flex;flex-direction:column;gap:5px}.stat .k{font-size:11.5px;color:var(--text-faint);text-transform:uppercase;letter-spacing:.05em}.stat .v{font-size:22px;font-weight:600;font-family:var(--mono);letter-spacing:-.5px}.stat .v small{font-size:12px;font-weight:400;color:var(--text-faint);margin-left:3px;font-family:var(--sans)}.machine{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:15px;display:flex;flex-direction:column;gap:12px;text-decoration:none;color:inherit;transition:border-color .14s,transform .14s}.machine:hover{border-color:#2f3d4d;text-decoration:none;transform:translateY(-1px)}.machine.offline{opacity:.62}.machine .head{display:flex;align-items:flex-start;gap:10px}.machine .name{font-weight:600;font-size:14.5px;letter-spacing:-.1px}.machine .host{font-size:11.5px;color:var(--text-faint);font-family:var(--mono)}.machine .metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.machine .m{display:flex;flex-direction:column;gap:4px}.machine .m .lbl{font-size:10.5px;color:var(--text-faint);text-transform:uppercase;letter-spacing:.05em}.machine .m .val{font-size:13px;font-family:var(--mono)}.chart{position:relative;width:100%}.chart svg{display:block;width:100%;overflow:visible}.chart .cursor{position:absolute;top:0;right:0;bottom:0;left:0}.chart-tip{position:absolute;pointer-events:none;background:#0a0e13;border:1px solid var(--line);border-radius:6px;padding:5px 9px;font-size:11.5px;font-family:var(--mono);white-space:nowrap;z-index:5;transform:translate(-50%,-140%)}.legend{display:flex;gap:14px;flex-wrap:wrap;font-size:11.5px;color:var(--text-dim)}.legend i{display:inline-block;width:9px;height:3px;border-radius:2px;margin-right:5px;vertical-align:middle}.cores{display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:6px}.core{background:#131a22;border-radius:5px;padding:5px 6px}.core .n{font-size:9.5px;color:var(--text-faint);font-family:var(--mono)}.core .b{height:3px;background:#1e2732;border-radius:3px;margin-top:4px;overflow:hidden}.core .b>i{display:block;height:100%;background:var(--accent)}.tabs{display:flex;gap:2px;border-bottom:1px solid var(--line);margin-bottom:18px;overflow-x:auto}.tabs button{background:none;border:none;padding:9px 14px;color:var(--text-dim);cursor:pointer;font-size:13.5px;border-bottom:2px solid transparent;white-space:nowrap}.tabs button:hover{color:var(--text)}.tabs button.active{color:var(--text);border-bottom-color:var(--accent)}.term-page{display:flex;flex-direction:column;height:100vh;background:#05080b}.term-bar{display:flex;align-items:center;gap:12px;padding:9px 16px;background:var(--bg-soft);border-bottom:1px solid var(--line);flex:none}.term-host{display:flex;flex-direction:column;line-height:1.25}.term-host b{font-size:13.5px;font-weight:600}.term-host span{font-size:11px;color:var(--text-faint);font-family:var(--mono)}.term-wrap{flex:1;min-height:0;padding:8px 10px}.term-wrap .xterm{height:100%}.term-status{font-size:12px;color:var(--text-dim);display:flex;align-items:center;gap:7px}.modal-back{position:fixed;top:0;right:0;bottom:0;left:0;background:#030609b8;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);display:grid;place-items:center;z-index:100;padding:20px}.modal{background:var(--panel);border:1px solid var(--line);border-radius:12px;width:100%;max-width:540px;max-height:88vh;overflow:auto;box-shadow:0 24px 60px #0000008c}.modal header{padding:16px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center}.modal header h2{margin:0;font-size:15.5px;font-weight:620}.modal .body{padding:20px}.modal footer{padding:14px 20px;border-top:1px solid var(--line);display:flex;gap:10px;justify-content:flex-end}.toasts{position:fixed;right:18px;bottom:18px;display:flex;flex-direction:column;gap:9px;z-index:200}.toast{background:var(--panel-2);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:11px 15px;max-width:420px;font-size:13px;box-shadow:0 10px 30px #0006;animation:slide .18s ease}.toast.err{border-left-color:var(--danger)}.toast.warn{border-left-color:var(--warn)}@keyframes slide{0%{opacity:0;transform:translate(18px)}}.empty{text-align:center;padding:48px 20px;color:var(--text-faint)}.empty h3{color:var(--text-dim);margin:0 0 8px;font-size:15px;text-transform:none;letter-spacing:0}pre.out{background:#05080b;border:1px solid var(--line);border-radius:7px;padding:12px;font-family:var(--mono);font-size:12.5px;line-height:1.45;overflow:auto;max-height:460px;white-space:pre-wrap;word-break:break-word;margin:0}code.inline{background:var(--bg);border:1px solid var(--line);border-radius:5px;padding:2px 6px;font-family:var(--mono);font-size:12.5px;word-break:break-all}.login-page{display:grid;place-items:center;min-height:100vh;padding:20px}.login-box{width:100%;max-width:380px}.login-box .card{padding:26px}.login-head{text-align:center;margin-bottom:24px}.login-head .brand-mark{margin:0 auto 12px;width:44px;height:44px;font-size:20px;border-radius:12px}.login-head h1{font-size:19px;margin:0 0 4px}.login-head p{margin:0;color:var(--text-faint);font-size:13px}.login-err{background:#261717;border:1px solid #4a2827;color:#eda3a0;padding:9px 12px;border-radius:7px;font-size:13px;margin-bottom:14px}.spin{width:15px;height:15px;border:2px solid var(--line);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.center-fill{display:grid;place-items:center;min-height:60vh}@media(max-width:880px){.sidebar{width:60px}.sidebar .brand-text,.nav a span:not(.count),.nav-label,.sidebar-foot .who b{display:none}.content{padding:16px}}.chip{display:inline-flex;align-items:center;gap:7px;padding:5px 12px;background:var(--panel);border:1px solid var(--line);color:var(--text-dim);border-radius:20px;cursor:pointer;font-size:13px;white-space:nowrap;transition:background .12s,border-color .12s,color .12s}.chip:hover{background:var(--panel-2);color:var(--text)}.chip.on{background:#2fa36b24;border-color:var(--accent-dim);color:#8fdcb3}.chip-n{font-family:var(--mono);font-size:11px;color:var(--text-faint);background:var(--bg);border-radius:10px;padding:1px 6px}.chip.on .chip-n{color:#7fd3a6;background:#00000040}.speed-live{text-align:center;padding:6px 0 2px}.speed-where{font-size:13px;color:var(--text-dim);margin-bottom:6px}.speed-big{display:flex;align-items:baseline;justify-content:center;gap:8px}.speed-num{font-family:var(--mono);font-size:58px;font-weight:600;line-height:1;letter-spacing:-2px;font-variant-numeric:tabular-nums;color:var(--text)}.speed-unit{font-size:15px;color:var(--text-faint)}.speed-phase{font-size:12.5px;color:var(--text-dim);margin-top:8px}.screen-bar{gap:10px;padding:8px 12px;align-items:center;border-bottom:1px solid var(--line);background:var(--panel-2)}.screen-note{padding:7px 12px;color:var(--text-dim);border-bottom:1px solid var(--line-soft);background:var(--bg-soft)}.screen-box{position:relative;background:#000;display:flex;align-items:center;justify-content:center;min-height:320px}.screen-box:fullscreen{min-height:100vh}.screen-canvas{max-width:100%;max-height:calc(100vh - 260px);display:block;outline:none;image-rendering:pixelated}.screen-box:fullscreen .screen-canvas{max-height:100vh}.screen-canvas:focus{box-shadow:inset 0 0 0 2px var(--accent)}.screen-msg{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;color:var(--text-dim);font-size:13px;text-align:center;padding:20px}.screen-bar .input.sm{padding:3px 8px;font-size:12px;height:26px;width:auto;flex:none}.tag{display:inline-block;font:11px/1.5 var(--mono);padding:1px 7px;border-radius:5px;border:1px solid var(--line);color:var(--text-dim);background:var(--panel-2)}.tag.src-cmd{color:#8fc9f0;border-color:#24405a}.tag.src-job{color:#e0c088;border-color:#4a3c1c}.tag.src-watch{color:#8fd6a8;border-color:#1f4a34}/**
 * Copyright (c) 2014 The xterm.js authors. All rights reserved.
 * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
 * https://github.com/chjj/term.js
 * @license MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * Originally forked from (with the author's permission):
 *   Fabrice Bellard's javascript vt100 for jslinux:
 *   http://bellard.org/jslinux/
 *   Copyright (c) 2011 Fabrice Bellard
 *   The original design remains. The terminal itself
 *   has been extended to include xterm CSI codes, among
 *   other features.
 */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}
