:root{--bg:#f4f5f7;--surface:#fff;--ink:#1a1e26;--muted:#646c79;--line:#dde1e7;--accent:#3550b0;--ok:#1d7a4c;--bad:#b42318;--new:#8a5a00;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root{--bg:#12151b;--surface:#1a1e26;--ink:#e6e9ee;--muted:#98a0ad;--line:#2b313c;--accent:#8ea3ff;--ok:#5fd39a;--bad:#ff8a80;--new:#f0c060;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}*{box-sizing:border-box}body{background:var(--bg);color:var(--ink);margin:0;font:15px/1.5 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}h1{margin:0;font-size:1.6rem}h2{margin:0 0 12px;font-size:1.05rem}p{margin:0}a{color:var(--accent)}.muted{color:var(--muted)}.small{margin-top:10px;font-size:.88rem}.sr{clip:rect(0 0 0 0);width:1px;height:1px;position:absolute;overflow:hidden}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input{font:inherit;border:1px solid var(--line);background:var(--surface);width:100%;color:var(--ink);border-radius:6px;padding:7px 10px}input:focus{border-color:var(--accent);outline:none}input.port{font-variant-numeric:tabular-nums;width:7.5em}label{gap:4px;font-size:.9rem;font-weight:500;display:grid}button{font:inherit;cursor:pointer;border:1px solid var(--line);background:var(--surface);color:var(--ink);white-space:nowrap;border-radius:6px;padding:7px 14px;font-weight:500}button:hover:not(:disabled){border-color:var(--accent)}button:disabled{opacity:.55;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:var(--bg)}button.link{color:var(--muted);background:0 0;border:0;padding:4px}button.link.danger:hover{color:var(--bad)}.login{place-items:center;min-height:100vh;padding:20px;display:grid}.login-box{background:var(--surface);border:1px solid var(--line);border-radius:10px;gap:16px;width:min(340px,100%);padding:28px;display:grid}.topbar{z-index:20;background:color-mix(in srgb, var(--bg) 88%, transparent);-webkit-backdrop-filter:blur(10px);border-bottom:1px solid var(--line);position:sticky;top:0}.topbar-inner{flex-wrap:wrap;align-items:center;gap:12px 24px;max-width:1100px;margin:0 auto;padding:10px 20px;display:flex}.topbar h1{font-size:1.15rem}.tabs{flex:1;gap:4px;display:flex;overflow-x:auto}.tabs a{color:var(--muted);white-space:nowrap;border-radius:8px;padding:7px 14px;font-weight:500;text-decoration:none}.tabs a:hover{color:var(--ink);background:var(--surface)}.tabs a.on{color:var(--ink);background:var(--surface);box-shadow:inset 0 0 0 1px var(--line)}.signout{margin-left:auto}.page{max-width:1100px;margin:0 auto;padding:28px 20px 120px}.stack{gap:20px;display:grid}.section-bar{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:12px 16px;display:flex}.page-title{margin:0 0 4px;font-size:1.4rem}.actions{flex-wrap:wrap;gap:8px;display:flex}.row-end{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.msg.warn{color:var(--new);border-color:currentColor}.msg.warn strong,.msg.warn .cmd-line{color:var(--ink)}.sub{margin:22px 0 10px;font-size:.95rem}.check{flex-direction:row;align-items:center;gap:8px;margin-top:12px;font-weight:400;display:flex}.check input{width:auto}.hint{color:var(--muted);font-size:.82rem;font-weight:400}a.btn{border:1px solid var(--line);background:var(--surface);color:var(--ink);border-radius:6px;align-items:center;padding:7px 14px;font-weight:500;text-decoration:none;display:inline-flex}a.btn:hover{border-color:var(--accent)}.sites{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px;display:grid}.site{background:var(--surface);border:1px solid var(--line);border-radius:10px;flex-direction:column;gap:12px;padding:18px;display:flex}.site.maint-on{border-color:var(--new)}.site-head{justify-content:space-between;align-items:flex-start;gap:10px;display:flex}.site-head h3{margin:0;font-size:1.05rem}.site-host{overflow-wrap:anywhere;font-size:.92rem;text-decoration:none}.site-host:hover{text-decoration:underline}.site-type{color:var(--muted);border:1px solid var(--line);white-space:nowrap;border-radius:999px;padding:2px 9px;font-size:.78rem}.chips{flex-wrap:wrap;gap:6px 14px;display:flex}.site-facts{gap:2px;margin:0;font-size:.88rem;display:grid}.site-facts div{gap:8px;display:flex}.site-facts dt{color:var(--muted);min-width:3.2em}.site-facts dd{font-variant-numeric:tabular-nums;margin:0}.site-error{color:var(--bad);font-size:.85rem}.site-actions{flex-wrap:wrap;gap:6px;margin-top:auto;padding-top:4px;display:flex}.site-actions button,.site-actions a.btn{padding:5px 11px;font-size:.88rem}.site-actions .danger{margin-left:auto}.new-site{gap:16px;display:grid}.new-site>label{max-width:460px}.new-site .host-input input{width:100%}.types{border:0;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin:0;padding:0;display:grid}.types legend{margin-bottom:6px;font-size:.9rem;font-weight:500}.type{cursor:pointer;border:1px solid var(--line);background:var(--bg);border-radius:8px;gap:4px;padding:12px 14px;display:grid;position:relative}.type.on{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent)}.type input{opacity:0;pointer-events:none;position:absolute}.type-title{font-weight:600}input[aria-invalid=true],.job.failed{border-color:var(--bad)}.job.done{border-color:var(--ok)}.job-state{color:var(--muted);align-items:center;gap:8px;font-size:.9rem;display:inline-flex}.job-state.done{color:var(--ok)}.job-state.failed{color:var(--bad)}.job-state.warning{color:var(--new)}.steps{gap:8px;margin:14px 0 0;padding:0;list-style:none;display:grid}.step{grid-template-columns:22px 1fr;align-items:start;gap:10px;display:grid}.step-icon{border:1.5px solid var(--line);width:22px;height:22px;color:var(--muted);border-radius:50%;place-items:center;font-size:.8rem;font-weight:700;display:grid}.step.done .step-icon{border-color:var(--ok);color:var(--ok)}.step.error .step-icon{border-color:var(--bad);color:var(--bad)}.step.warn .step-icon{border-color:var(--new);color:var(--new)}.step.skipped{opacity:.6}.step-detail{color:var(--muted);white-space:pre-wrap;overflow-wrap:anywhere;font-size:.85rem}.step.error .step-detail{color:var(--bad)}.step.warn .step-detail{color:var(--new)}.job-log{margin-top:14px}.job-log summary{cursor:pointer;color:var(--muted);font-size:.9rem}.job-log pre,pre.log{background:var(--bg);border:1px solid var(--line);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:6px;max-height:320px;margin:8px 0 0;padding:10px 12px;font-size:.8rem;overflow:auto}.spinner{border:2px solid var(--line);border-top-color:var(--accent);border-radius:50%;width:12px;height:12px;animation:.8s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.overlay{z-index:50;background:#00000073;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.dialog{background:var(--surface);border:1px solid var(--line);border-radius:10px;width:min(900px,100%);max-height:90vh;padding:20px;overflow:auto}.log-name{margin:16px 0 0;font-size:.9rem}.stat-grid{grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;display:grid}.stat-card{background:var(--surface);border:1px solid var(--line);border-radius:10px;flex-direction:column;gap:8px;padding:18px;display:flex}.stat-card h3{color:var(--muted);margin:0;font-size:.85rem;font-weight:600}.stat-value{font-variant-numeric:tabular-nums;font-size:1.9rem;font-weight:650;line-height:1.1}.meter{background:var(--line);border-radius:999px;height:8px;overflow:hidden}.meter span{border-radius:inherit;background:var(--ok);height:100%;transition:width .3s;display:block}.meter.warn span{background:var(--new)}.meter.bad span{background:var(--bad)}.meter-label{margin-top:6px}.cores{grid-template-columns:repeat(auto-fit,minmax(60px,1fr));gap:6px 10px;margin-top:4px;display:grid}.core{color:var(--muted);font-variant-numeric:tabular-nums;gap:3px;font-size:.78rem;display:grid}.core .meter{height:5px}.kv-list{gap:6px;margin:0;display:grid}.kv-list+.kv-list{border-top:1px solid var(--line);margin-top:14px;padding-top:14px}.kv{grid-template-columns:9.5em 1fr;gap:10px;display:grid}.kv dt{color:var(--muted)}.kv dd{overflow-wrap:anywhere;font-variant-numeric:tabular-nums;margin:0}.two-col{grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px;display:grid}.two-col .card h2,.card>h2{margin-bottom:14px}.top-list{gap:4px;max-width:520px;margin:0;padding-left:22px;display:grid}.top-list li span:first-child{min-width:14em;display:inline-block}@media (prefers-reduced-motion:reduce){.meter span{transition:none}}.health{border:1px solid var(--ok);background:var(--surface);border-radius:10px;grid-template-columns:30px 1fr;align-items:start;gap:12px;padding:16px 18px;display:grid}.health.warn{border-color:var(--new)}.health ul{margin:6px 0;padding-left:20px}.health .small{margin-top:6px}.health-icon{width:30px;height:30px;color:var(--bg);background:var(--ok);border-radius:50%;place-items:center;font-weight:700;display:grid}.health.warn .health-icon{background:var(--new)}button.danger-btn{color:var(--bad);border-color:color-mix(in srgb, var(--bad) 45%, var(--line))}button.danger-btn:hover:not(:disabled){background:var(--bad);border-color:var(--bad);color:var(--bg)}.rebooting{border-color:var(--accent)}.ip-list{gap:6px;margin:0 0 12px;padding:0;list-style:none;display:grid}.ip-list li{align-items:center;gap:12px;display:flex}@media (width<=640px){.topbar-inner{padding:10px 16px}.tabs{flex-basis:100%;order:3}.page{padding:20px 16px 100px}.sites{grid-template-columns:minmax(0,1fr)}}.msg{border:1px solid;border-radius:8px;padding:10px 14px}.msg.ok{color:var(--ok);border-color:currentColor}.msg.error{color:var(--bad);border-color:currentColor}.msg pre{white-space:pre-wrap;color:var(--ink);margin:8px 0 0;font-size:.85rem}.table-wrap{background:var(--surface);border:1px solid var(--line);border-radius:10px;overflow-x:auto}table{border-collapse:collapse;width:100%;min-width:640px}th,td{text-align:left;border-bottom:1px solid var(--line);vertical-align:middle;padding:10px 14px}th{color:var(--muted);font-size:.82rem;font-weight:600}tbody tr:last-child td{border-bottom:0}td:first-child a{font-weight:500;text-decoration:none}td:first-child a:hover{text-decoration:underline}.status{white-space:nowrap;align-items:center;gap:6px;font-size:.88rem;display:inline-flex}.status:before{content:"";background:currentColor;border-radius:50%;width:8px;height:8px}.status.ok{color:var(--ok)}.status.bad{color:var(--bad)}.status.new{color:var(--new)}.savebar{background:var(--surface);border:1px solid var(--accent);border-radius:10px;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 16px;display:flex;position:sticky;bottom:16px}.savebar span{margin-right:auto;font-weight:500}.card{background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:20px}.add{flex-wrap:wrap;align-items:flex-end;gap:12px;display:flex}.add .grow{flex:1;min-width:180px}.host-input{align-items:center;gap:6px;display:flex}.host-input input{width:10em}.suffix{color:var(--muted);white-space:nowrap}.cmd{background:var(--bg);border:1px solid var(--line);border-radius:6px;margin:12px 0 0;padding:12px;font-size:.88rem;overflow-x:auto}.card-head{justify-content:space-between;align-items:center;gap:12px;margin-bottom:4px;display:flex}.card-head h2{margin:0}.card>.msg,.card>.router-info,.card>.table-wrap{margin-top:14px}.router-info{flex-wrap:wrap;align-items:center;gap:6px 18px;display:flex}code{font:.88em ui-monospace,Cascadia Mono,Consolas,monospace}.table-wrap.flat{border-radius:8px}td.num{font-variant-numeric:tabular-nums}select{font:inherit;border:1px solid var(--line);background:var(--surface);color:var(--ink);border-radius:6px;padding:7px 10px}.ports-add{margin-top:18px}.ufw{margin-top:4px;font-size:.85rem}.ufw summary{cursor:pointer;color:var(--muted)}.cmd-line{background:var(--bg);border:1px solid var(--line);color:var(--ink);border-radius:6px;align-items:center;gap:8px;margin-top:8px;padding:8px 10px;display:flex}.cmd-line code{white-space:nowrap;flex:1;overflow-x:auto}.others{margin-top:16px}.others ul{gap:6px;margin:10px 0 0;padding:0;font-size:.9rem;list-style:none;display:grid}.msg .small{color:var(--ink);margin-top:6px}.maint{margin:14px 0 0;padding:0;list-style:none}.maint li{border-top:1px solid var(--line);grid-template-columns:1fr auto auto;align-items:center;gap:16px;padding:10px 0;display:grid}.maint li:first-child{border-top:0}.maint a{overflow-wrap:anywhere;font-weight:500;text-decoration:none}.maint a:hover{text-decoration:underline}@media (width<=560px){.maint li{grid-template-columns:1fr auto}.maint button{grid-column:1/-1;justify-self:start}}
