Files
Void-Homelab/public/style.css
root e29bacbda1 feat(dross): voice Phase 2a — local whisper transcribe + mic (2.12.0)
faster-whisper (small.en, GPU+CPU fallback) on CT 102 → POST
/api/voice/transcribe (multer→whisper client) → mic in the bubble
records (MediaRecorder), uploads, drops the transcript into the input
to review-and-send. Infra scripts in deploy/whisper/. Retention (P2b)
next. NOTE: mic needs a secure context (the https domain), not the LAN IP.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 01:00:10 +10:00

779 lines
56 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Void 2.0 — Cradle / blackflame palette. Three-column grid shell. */
:root {
--bg: #0a0a0e;
--panel: #14141c;
--panel-2: #1c1c26;
--border: #2a2a36;
--text: #e8e6ed;
--muted: #888094;
--accent: #ff4f2e; /* blackflame */
--accent-dim:#7a2716;
--accent-soft:#3a1610;
--ok: #6fa86a;
--warn: #d4a04a;
--bad: #c45a4a;
--topbar-h: 48px;
--sidebar-w: 280px;
--rail-w: 360px;
--rail-w-min: 40px;
--font-display: 'Cinzel', 'Cormorant Garamond', serif;
--font-body: 'Cormorant Garamond', Georgia, serif;
--font-ui: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
--font-mono: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; height: 100%; background: var(--bg); color: var(--text); font-family: var(--font-ui); font-size: 15px; }
#shell {
display: grid;
grid-template-columns: var(--sidebar-w) 1fr;
grid-template-rows: var(--topbar-h) 1fr;
grid-template-areas:
"topbar topbar"
"sidebar main";
height: 100vh;
width: 100vw;
}
#topbar { grid-area: topbar; border-bottom: 1px solid var(--border); background: var(--panel); display: flex; align-items: center; padding: 0 16px; gap: 12px; }
#sidebar { grid-area: sidebar; border-right: 1px solid var(--border); background: var(--panel); overflow-y: auto; padding: 12px 0; }
#main { grid-area: main; overflow-y: auto; padding: 24px 32px; }
/* topbar */
.brand { font-family: var(--font-display); font-weight: 700; letter-spacing: 0.18em; font-size: 14px; color: var(--accent); text-transform: uppercase; padding: 0 6px; }
.topbar-search { flex: 1; max-width: 520px; }
.topbar-search input {
width: 100%; background: var(--bg); border: 1px solid var(--border); color: var(--text);
padding: 7px 10px; border-radius: 4px; font-family: var(--font-ui); font-size: 14px; outline: none;
}
.topbar-search input:focus { border-color: var(--accent-dim); }
.topbar-spacer { flex: 1; }
.icon-btn { background: transparent; border: 1px solid var(--border); color: var(--text); padding: 5px 10px; border-radius: 4px; cursor: pointer; font-size: 13px; }
.icon-btn:hover { border-color: var(--accent-dim); color: var(--accent); }
.badge {
display: inline-block; min-width: 16px; padding: 1px 5px; border-radius: 8px;
background: var(--accent); color: var(--bg); font-size: 11px; font-weight: 700; text-align: center; margin-left: 4px;
}
/* sidebar */
.sb-section { padding: 8px 12px; }
.sb-title { font-family: var(--font-display); font-size: 11px; letter-spacing: 0.16em; color: var(--muted); text-transform: uppercase; padding: 6px 4px; }
.sb-item {
display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 3px; cursor: pointer;
color: var(--text); text-decoration: none; font-size: 14px;
}
.sb-item:hover { background: var(--panel-2); }
.sb-item.active { background: var(--accent-soft); color: var(--accent); }
.sb-item .caret { color: var(--muted); width: 10px; text-align: center; font-size: 11px; }
.sb-children { padding-left: 18px; }
/* rightrail */
.rail-toggle {
height: var(--topbar-h); border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: center;
cursor: pointer; color: var(--muted); font-size: 12px;
}
.rail-body { flex: 1; padding: 14px 14px; overflow-y: auto; font-size: 14px; color: var(--muted); }
#shell.rail-collapsed .rail-body { display: none; }
/* main / views */
.view-h1 { font-family: var(--font-display); font-size: 26px; font-weight: 500; letter-spacing: 0.04em; margin: 0 0 4px; color: var(--text); }
.view-sub { color: var(--muted); margin-bottom: 24px; font-family: var(--font-body); font-size: 15px; }
.card {
background: var(--panel); border: 1px solid var(--border); border-radius: 6px; padding: 16px 18px; margin-bottom: 12px;
}
.card h3 { font-family: var(--font-display); font-size: 15px; letter-spacing: 0.08em; text-transform: uppercase; margin: 0 0 10px; color: var(--accent); font-weight: 500; }
.row { display: flex; gap: 16px; }
.row > * { flex: 1; min-width: 0; }
.muted { color: var(--muted); }
.kbd { font-family: var(--font-mono); background: var(--panel-2); padding: 1px 6px; border: 1px solid var(--border); border-radius: 3px; font-size: 12px; }
pre, code { font-family: var(--font-mono); font-size: 13px; }
pre { background: var(--panel-2); border: 1px solid var(--border); padding: 10px 12px; border-radius: 4px; overflow-x: auto; }
a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }
hr { border: none; border-top: 1px solid var(--border); margin: 18px 0; }
/* form */
input[type=text], input[type=password], textarea, select {
background: var(--bg); border: 1px solid var(--border); color: var(--text);
padding: 6px 8px; border-radius: 3px; font-family: var(--font-ui); font-size: 14px; outline: none;
}
input:focus, textarea:focus, select:focus { border-color: var(--accent-dim); }
button.primary {
background: var(--accent-dim); color: var(--text); border: 1px solid var(--accent); padding: 6px 14px;
border-radius: 3px; cursor: pointer; font-family: var(--font-ui); font-size: 14px;
}
button.primary:hover { background: var(--accent); color: var(--bg); }
button.ghost {
background: transparent; color: var(--muted); border: 1px solid var(--border); padding: 6px 12px;
border-radius: 3px; cursor: pointer; font-size: 14px;
}
button.ghost:hover { color: var(--text); border-color: var(--accent-dim); }
.back-btn { margin-bottom: 12px; }
.back-btn:hover { color: var(--accent); border-color: var(--accent-dim); }
/* Rendered markdown (page preview, chat) — blackflame styling. */
.md-preview { color: var(--text); line-height: 1.6; }
.md-preview h1, .md-preview h2, .md-preview h3, .md-preview h4 {
font-family: var(--font-display); color: var(--accent); letter-spacing: 0.03em; margin: 16px 0 8px;
}
.md-preview h1 { font-size: 20px; } .md-preview h2 { font-size: 16px; }
.md-preview h3 { font-size: 15px; text-transform: uppercase; }
.md-preview a { color: var(--accent); }
.md-preview code { font-family: var(--font-mono); background: var(--panel-2); padding: 1px 5px; border: 1px solid var(--border); border-radius: 3px; font-size: 13px; }
.md-preview pre { background: var(--panel-2); border: 1px solid var(--border); border-radius: 5px; padding: 12px; overflow-x: auto; }
.md-preview pre code { border: none; background: none; padding: 0; }
.md-preview blockquote { border-left: 2px solid var(--accent-dim); margin: 8px 0; padding: 2px 12px; color: var(--muted); }
.md-preview table { border-collapse: collapse; width: 100%; margin: 12px 0; font-size: 14px; }
.md-preview th, .md-preview td { border: 1px solid var(--border); padding: 6px 10px; text-align: left; vertical-align: top; }
.md-preview th { background: var(--panel-2); color: var(--accent); font-weight: 600; letter-spacing: 0.02em; }
.md-preview tbody tr:nth-child(even) td { background: rgba(255, 255, 255, 0.02); }
/* Little Blue caretaker view */
.lb-grid { display: grid; grid-template-columns: 1fr 360px; gap: 14px; align-items: start; }
.lb-chat { display: flex; flex-direction: column; height: 70vh; border: 1px solid var(--border); border-radius: 6px; background: var(--panel); overflow: hidden; }
.lb-chat .lb-log { flex: 1; overflow-y: auto; padding: 14px; }
.lb-actions { display: flex; flex-direction: column; gap: 8px; }
.lb-sec { font-family: var(--font-display); font-size: 13px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--accent); margin: 6px 0 2px; }
.lb-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; }
.lb-card { padding: 12px; margin: 0; }
.lb-pending-card { padding: 12px; margin: 0; border-color: var(--accent-dim); }
.lb-card-title { font-size: 12.5px; color: var(--text); margin-bottom: 10px; word-break: break-word; }
.lb-btn-row { display: flex; gap: 8px; flex-wrap: wrap; }
.lb-act { padding: 5px 12px; border-radius: 3px; cursor: pointer; font-size: 13px; font-family: var(--font-ui); border: 1px solid var(--border); background: transparent; color: var(--muted); }
.lb-act.safe { color: var(--ok); }
.lb-act.safe:hover { border-color: var(--ok); color: var(--ok); }
.lb-act.risky { color: var(--accent); background: var(--accent-soft); border-color: var(--accent-dim); }
.lb-act.risky:hover { background: var(--accent-dim); color: var(--text); }
.lb-act:disabled { opacity: 0.5; cursor: default; }
.lb-toasts { position: fixed; bottom: 16px; right: 16px; display: flex; flex-direction: column; gap: 6px; z-index: 60; }
.lb-toast { background: var(--panel-2); border: 1px solid var(--accent-dim); color: var(--text); padding: 8px 12px; border-radius: 4px; font-size: 13px; box-shadow: 0 4px 16px rgba(0,0,0,0.45); }
.lb-toast.err { border-color: var(--bad); color: var(--bad); }
@media (max-width: 900px) { .lb-grid { grid-template-columns: 1fr; } }
/* Terminal tab (embedded ttyd) */
.term-bar { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.term-title { font-family: var(--font-display); color: var(--accent); letter-spacing: 0.08em; font-size: 15px; }
.term-frame { width: 100%; height: calc(100vh - 100px); border: 1px solid var(--border); border-radius: 6px; background: var(--bg); display: block; }
/* Doc/space header bar: back + breadcrumb on the left, export on the right. */
.doc-head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.doc-head-left { display: flex; align-items: center; gap: 12px; flex: 1; min-width: 0; flex-wrap: wrap; }
.doc-head .back-btn { margin-bottom: 0; }
.doc-actions { display: flex; align-items: center; gap: 8px; margin-left: auto; flex: none; flex-wrap: wrap; justify-content: flex-end; }
.ed-controls { display: inline-flex; align-items: center; gap: 8px; }
/* Breadcrumb: Space parent current — sized + themed to sit inline with the back button */
.crumbs { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; font-size: 14px; font-family: var(--font-ui); line-height: 1; }
.crumb { color: var(--muted); text-decoration: none; }
.crumb:hover { color: var(--accent); }
.crumb.current { color: var(--text); }
.crumb-sep { color: var(--accent-dim); font-size: 15px; }
/* Export dropdown */
.exp-menu { position: relative; }
.exp-list { position: absolute; right: 0; top: calc(100% + 4px); background: var(--panel-2); border: 1px solid var(--border); border-radius: 5px; padding: 4px; min-width: 168px; display: none; z-index: 40; box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5); }
.exp-menu.open .exp-list { display: block; }
.exp-list button { display: block; width: 100%; text-align: left; background: transparent; border: none; color: var(--text); padding: 7px 10px; border-radius: 3px; cursor: pointer; font-size: 13px; font-family: var(--font-ui); }
.exp-list button:hover { background: var(--accent-soft); color: var(--accent); }
.rev-list { max-height: 340px; overflow-y: auto; min-width: 220px; }
/* Revision viewer modal */
.rev-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.62); z-index: 100; display: flex; align-items: center; justify-content: center; padding: 24px; }
.rev-modal { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; width: min(820px, 94vw); max-height: 86vh; display: flex; flex-direction: column; box-shadow: 0 14px 50px rgba(0, 0, 0, 0.6); }
.rev-modal-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--border); font-family: var(--font-display); color: var(--accent); letter-spacing: 0.04em; font-size: 14px; }
.rev-modal .md-preview { padding: 16px 20px; overflow-y: auto; flex: 1; }
.rev-modal-foot { padding: 12px 16px; border-top: 1px solid var(--border); display: flex; justify-content: flex-end; }
/* AI Usage card */
.aiu-sec { margin-bottom: 12px; }
.aiu-h { font-family: var(--font-display); font-size: 11px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--muted); margin-bottom: 6px; border-bottom: 1px solid var(--border); padding-bottom: 4px; }
.aiu-link { display: inline-block; margin-top: 4px; font-size: 12px; color: var(--accent); text-decoration: none; }
.aiu-link:hover { text-decoration: underline; }
/* ── Themed scrollbars (blackflame) ── */
* { scrollbar-width: thin; scrollbar-color: var(--accent-dim) var(--panel); }
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-track { background: var(--panel); }
::-webkit-scrollbar-thumb { background: var(--accent-soft); border: 2px solid var(--panel); border-radius: 6px; }
::-webkit-scrollbar-thumb:hover { background: var(--accent-dim); }
::-webkit-scrollbar-corner { background: var(--panel); }
/* ── Topbar: themed, a touch larger + bolder ── */
:root { --topbar-h: 54px; }
#topbar { background: linear-gradient(180deg, #17131b, var(--panel)); border-bottom: 1px solid var(--accent-soft); box-shadow: 0 1px 0 rgba(255, 79, 46, 0.10); }
.brand { font-size: 18px; letter-spacing: 0.22em; }
.icon-btn { font-size: 14px; font-weight: 600; padding: 7px 13px; color: var(--text); }
.icon-btn:hover { background: var(--accent-soft); border-color: var(--accent-dim); color: var(--accent); }
.topbar-search input { font-size: 14px; padding: 8px 12px; }
.chrome-toggle { width: 38px; height: 34px; font-size: 17px; }
/* card header row (h3 + action button) */
.card-head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.card-head h3 { margin: 0; }
.card-head .primary { margin-left: auto; }
/* Project cards (per-space) */
.proj-list { display: flex; flex-direction: column; gap: 8px; }
.proj-card { border: 1px solid var(--border); border-radius: 7px; background: var(--panel-2); overflow: hidden; }
.proj-head { display: flex; align-items: center; gap: 10px; padding: 10px 12px; cursor: pointer; }
.proj-head:hover { background: rgba(255, 255, 255, 0.015); }
.proj-chev { color: var(--muted); transition: transform .18s; flex: none; }
.proj-card.open .proj-chev { transform: rotate(90deg); color: var(--accent); }
.proj-meta { flex: 1; min-width: 0; }
.proj-title { font-size: 15px; color: var(--text); }
.proj-desc { font-size: 13px; color: var(--muted); margin-top: 2px; }
.proj-actions { display: flex; align-items: center; gap: 6px; flex: none; }
.proj-status { background: var(--panel); border: 1px solid var(--border); color: var(--muted); border-radius: 4px; font-size: 12px; padding: 3px 6px; font-family: var(--font-ui); cursor: pointer; }
.proj-status.st-active { color: var(--ok); border-color: var(--ok); }
.proj-status.st-paused { color: var(--warn); border-color: var(--warn); }
.proj-status.st-done { color: var(--muted); }
.proj-status.st-abandoned { color: var(--bad); border-color: var(--bad); }
.proj-status.st-idea { color: var(--accent); border-color: var(--accent-dim); }
.proj-btn { background: transparent; border: 1px solid var(--border); color: var(--muted); border-radius: 4px; font-size: 12px; padding: 4px 9px; cursor: pointer; font-family: var(--font-ui); }
.proj-btn:hover { color: var(--accent); border-color: var(--accent-dim); }
.proj-btn.danger:hover { color: var(--bad); border-color: var(--bad); }
.proj-btn.busy { color: var(--accent); border-color: var(--accent-dim); }
.proj-panel { padding: 0 14px 14px 34px; border-top: 1px solid var(--border); }
.proj-section-h { font-family: var(--font-display); font-size: 11px; text-transform: uppercase; letter-spacing: .12em; color: var(--muted); margin: 12px 0 8px; }
/* Project / generic modal */
.pm-modal { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; width: min(480px, 94vw); padding: 20px 22px; display: flex; flex-direction: column; gap: 8px; box-shadow: 0 14px 50px rgba(0,0,0,.6); }
.pm-head { font-family: var(--font-display); color: var(--accent); letter-spacing: .04em; font-size: 17px; margin-bottom: 6px; }
.pm-label { font-size: 12px; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); margin-top: 6px; }
.pm-input { width: 100%; background: var(--bg); border: 1px solid var(--border); color: var(--text); border-radius: 5px; padding: 7px 9px; font-family: var(--font-ui); font-size: 14px; }
.pm-input:focus { border-color: var(--accent-dim); outline: none; }
.pm-foot { display: flex; gap: 10px; justify-content: flex-end; margin-top: 12px; }
/* Settings */
.settings-card { max-width: 740px; }
.settings-sub { margin: -4px 0 12px; font-size: 13px; }
.settings-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--border); }
.settings-row:last-child { border-bottom: none; }
.settings-row.revoked { opacity: .5; }
.settings-create { flex-wrap: wrap; }
.settings-label { color: var(--text); font-size: 14px; min-width: 120px; }
.settings-value { flex: 1; font-size: 13px; }
.token-out { min-height: 4px; }
.token-reveal { background: var(--accent-soft); border: 1px solid var(--accent-dim); border-radius: 5px; padding: 8px 10px; font-size: 13px; margin: 8px 0; word-break: break-all; }
.token-reveal code { color: var(--accent); font-family: var(--font-mono); }
/* ── Sidebar (hybrid: sectioned headers + active pill + agent dots) ── */
.sb-section { padding: 4px 10px 10px; }
.sb-title { font-family: var(--font-display); font-size: 11px; letter-spacing: 0.18em; color: var(--accent); text-transform: uppercase; padding: 8px 6px; opacity: 0.85; border-bottom: 1px solid var(--border); margin-bottom: 5px; }
.sb-item { padding: 7px 11px; border-radius: 6px; margin: 1px 2px; font-size: 14px; transition: background .12s, color .12s, box-shadow .12s; }
.sb-item:hover { background: var(--panel-2); color: var(--text); }
.sb-item.active { background: var(--accent-soft); color: var(--accent); box-shadow: inset 3px 0 0 var(--accent); font-weight: 500; }
.sb-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
.sb-dot.ok { background: var(--ok); box-shadow: 0 0 6px var(--ok); }
.sb-dot.lb { background: var(--lb, #7dd3d8); box-shadow: 0 0 6px var(--lb, #7dd3d8); }
/* Agent profile expander (Settings) */
.agent-row { display: block; padding: 8px 0; border-bottom: 1px solid var(--border); }
.agent-row:last-child { border-bottom: none; }
.agent-row-hd { display: flex; align-items: center; gap: 10px; cursor: pointer; }
.agent-row-hd:hover .agent-nm { color: var(--accent); }
.agent-nm { color: var(--text); font-size: 14px; min-width: 120px; }
.agent-row-chev { color: var(--muted); transition: transform .18s; margin-left: auto; }
.agent-row.open .agent-row-chev { transform: rotate(90deg); color: var(--accent); }
.agent-body { margin: 8px 0 2px; padding-left: 4px; }
.agent-file-label { font-family: var(--font-display); font-size: 10px; text-transform: uppercase; letter-spacing: .12em; color: var(--muted); margin: 10px 0 4px; }
.agent-file-content { background: var(--bg); border: 1px solid var(--border); border-radius: 5px; padding: 10px 12px; font-size: 12.5px; line-height: 1.5; white-space: pre-wrap; color: var(--text); max-height: 280px; overflow: auto; }
/* Project cards — compact + responsive + details panel */
.proj-head { padding: 7px 10px; gap: 8px; }
.proj-title { font-size: 14px; }
.proj-desc { font-size: 12px; }
.proj-status { font-size: 11px; padding: 2px 6px; }
.proj-btn { font-size: 11px; padding: 3px 8px; }
.proj-actions { flex-wrap: wrap; justify-content: flex-end; }
.proj-panel { padding: 2px 14px 12px 32px; }
.proj-details { margin-bottom: 4px; }
.proj-detail-desc { font-size: 13px; color: var(--text); line-height: 1.55; margin-bottom: 8px; }
.proj-dl { display: grid; grid-template-columns: max-content 1fr; gap: 3px 14px; margin: 0; font-size: 12px; }
.proj-dl dt { color: var(--muted); text-transform: uppercase; letter-spacing: .06em; font-size: 10px; align-self: center; }
.proj-dl dd { margin: 0; color: var(--text); }
.proj-sub-list { display: flex; flex-direction: column; gap: 3px; margin-bottom: 4px; }
.proj-sub-row { font-size: 13px; color: var(--text); padding: 2px 0; }
.proj-panel .research-notes, .proj-panel .md-preview { font-size: 13px; }
@media (max-width: 620px) {
.proj-head { flex-wrap: wrap; }
.proj-actions { width: 100%; margin-top: 4px; }
.proj-panel { padding-left: 14px; }
}
/* Yerin — classic red (Sage of the Endless Sword) */
:root { --yerin: #d23b3b; }
.sb-dot.yerin { background: var(--yerin); box-shadow: 0 0 6px var(--yerin); }
.sentinel-chat { display: flex; flex-direction: column; height: 70vh; border: 1px solid var(--border); border-radius: 6px; background: var(--panel); overflow: hidden; }
.sentinel-chat .sentinel-log { flex: 1; overflow-y: auto; padding: 14px; }
.yerin-view .view-h1 { color: var(--yerin); }
.yerin-view .view-sub { color: var(--yerin); opacity: .85; font-style: italic; }
.yerin-view .sentinel-chat { border-color: var(--yerin); box-shadow: inset 0 2px 0 rgba(210, 59, 59, .25); }
/* modal */
.modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,0.6); display: flex; align-items: center; justify-content: center; z-index: 100; }
.modal {
background: var(--panel); border: 1px solid var(--border); border-radius: 6px; padding: 22px 24px; min-width: 380px; max-width: 520px;
}
.modal h2 { font-family: var(--font-display); font-size: 18px; margin: 0 0 12px; color: var(--accent); letter-spacing: 0.06em; }
.modal .actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 16px; }
/* lists */
ul.plain { list-style: none; padding: 0; margin: 0; }
ul.plain li { padding: 6px 0; border-bottom: 1px solid var(--border); }
ul.plain li:last-child { border-bottom: none; }
/* badges (status) */
.status { display: inline-block; padding: 1px 6px; border-radius: 8px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; border: 1px solid var(--border); color: var(--muted); }
.status.ok { color: var(--ok); border-color: var(--ok); }
.status.warn { color: var(--warn); border-color: var(--warn); }
.status.bad { color: var(--bad); border-color: var(--bad); }
.status.idle { color: var(--muted); }
/* search results */
.search-group { margin-bottom: 22px; }
.search-group .group-h { font-family: var(--font-display); font-size: 12px; letter-spacing: 0.18em; color: var(--accent); text-transform: uppercase; margin-bottom: 6px; }
.search-hit { padding: 8px 10px; border: 1px solid var(--border); border-radius: 3px; margin-bottom: 6px; background: var(--panel); }
.search-hit .hit-meta { color: var(--muted); font-size: 12px; }
/* ── Plan 5: right-rail companion chat ──────────────────────────────────── */
.rail-chat { display:flex; flex-direction:column; height:100%; }
.rail-hd { display:flex; justify-content:space-between; align-items:center; padding:9px 12px; border-bottom:1px solid var(--border,#262b38); }
.rail-hd .who { font-weight:600; color:var(--accent,#b69cff); }
.rail-hd .chev { cursor:pointer; color:#5b6478; }
.rail-log { flex:1; overflow-y:auto; padding:12px; display:flex; flex-direction:column; gap:10px; }
.turn { display:flex; flex-direction:column; max-width:84%; }
.turn .lbl { font-size: 10.5px; letter-spacing:.12em; margin-bottom:3px; }
.turn .msg { line-height:1.4; padding:6px 10px; border-radius:8px; background:#141826; }
.turn.you { align-self:flex-end; align-items:flex-end; }
.turn.you .lbl { color:#6f7ce0; } .turn.you .msg { border-right:2px solid #6f7ce0; }
.turn.ai { align-self:flex-start; } .turn.ai .lbl { color:var(--accent,#b69cff); }
.turn.ai .msg { border-left:2px solid var(--accent,#b69cff); }
.tools { align-self:flex-start; }
.tools .chip { font-family:ui-monospace,Menlo,monospace; font-size: 11.5px; color:#7d869b; }
.tools .chip.err { color:#e08a8a; }
.draftx { align-self:flex-start; max-width:90%; border:1px solid #3a2f5e; background:#1a1530; border-radius:9px; padding:9px 11px; }
.draftx .dh { font-size: 10.5px; text-transform:uppercase; letter-spacing:.1em; color:#9b7dff; }
.draftx .dt { color:#e3e0f5; margin:4px 0 9px; }
.draftx .row { display:flex; gap:6px; }
.draftx .ok { background:#2a6f4f; color:#d9ffe9; border:none; border-radius:6px; padding:4px 12px; }
.draftx .no { background:#2a2f3d; color:#aeb6c7; border:none; border-radius:6px; padding:4px 12px; }
.draftx.resolved { opacity:.55; } .resolved-tag { font-size: 11px; text-transform:uppercase; color:#7d869b; margin-top:6px; }
.rail-inputwrap { border-top:1px solid var(--border,#262b38); padding:9px 12px; display:flex; align-items:flex-end; gap:7px; }
.rail-input { flex:1 1 auto; min-width:0; width:100%; resize:none; background:#0c0e14; color:#c9d1e0; border:1px solid #262b38; border-radius:8px; padding:7px 9px; }
.rail-send { flex:0 0 auto; width:38px; height:36px; display:inline-flex; align-items:center; justify-content:center;
background:var(--accent,#ff4f2e); color:#fff; border:none; border-radius:8px; cursor:pointer;
font-size:15px; line-height:1; box-shadow:0 0 0 1px rgba(255,79,46,.25), 0 2px 8px rgba(255,79,46,.18);
transition:filter .12s ease, transform .06s ease; }
.rail-send:hover { filter:brightness(1.12); }
.rail-send:active { transform:translateY(1px); }
.rail-send:disabled { opacity:.45; cursor:default; box-shadow:none; }
.err { color:#e08a8a; font-size: 13px; }
#shell.rail-collapsed .rail-chat { display:none; }
/* ===== Sacred Valley (Plan 6) ===== */
:root {
--lb: #7dd3d8; /* Little Blue cyan */
/* reserved for a future agent-output phase — unused now:
--hue-dross: #ff4f2e; --hue-yerin: #c45a4a; --hue-orthos: #6fa86a; */
}
/* Hybrid canvas: cards are absolutely placed (JS sets left/top/width/height in
12-col grid units); the board grows to fit its content. See sacred_valley.js. */
#sv-cards { position: relative; width: 100%; min-height: 200px; }
.sv-card {
position: relative; border: 1px solid #2c242a; border-radius: 10px; padding: 16px 18px;
background: radial-gradient(120% 90% at 100% 0%, rgba(255,79,46,.05), transparent 55%),
linear-gradient(160deg, #16131a, #0f0d12);
box-shadow: inset 0 0 30px rgba(255,79,46,.015);
transition: box-shadow .35s ease, border-color .35s ease, transform .35s ease;
}
.sv-card::after {
content: ""; position: absolute; inset: 0; border-radius: 10px; pointer-events: none;
background-image: repeating-linear-gradient(115deg, rgba(255,255,255,.015) 0 1px, transparent 1px 9px);
mix-blend-mode: overlay;
}
.sv-card:hover {
border-color: #4a2c28; transform: translateY(-2px);
box-shadow: 0 8px 28px rgba(0,0,0,.45), inset 0 0 46px rgba(255,79,46,.06), 0 0 0 1px rgba(255,79,46,.10);
}
.sv-card.dragging { transition: none; box-shadow: 0 16px 44px -12px #000, 0 0 0 1px var(--accent-dim); }
.sv-card.free { box-shadow: 0 0 0 1px var(--accent-dim), 0 10px 30px -12px #000; }
#sv-cards.editing .sv-card { transition: none; }
#sv-cards.editing .sv-card:hover { transform: none; }
.sv-card-body { height: 100%; overflow: auto; }
.sv-card-title {
font-family: var(--font-display); font-size: 13px; letter-spacing: .16em; text-transform: uppercase;
color: var(--text); padding-bottom: 7px; margin-bottom: 12px;
border-bottom: 1px solid transparent; border-image: linear-gradient(90deg, var(--accent), transparent 60%) 1;
cursor: grab;
}
.sv-row { display: flex; justify-content: space-between; align-items: center; font-family: var(--font-mono); font-size: 12px; margin: 7px 0; }
.sv-row .k { color: var(--muted); letter-spacing: .04em; }
.sv-bar { height: 5px; border-radius: 3px; background: #221820; overflow: hidden; margin-top: 3px; }
.sv-bar > i { display: block; height: 100%; border-radius: 3px; background: linear-gradient(90deg, var(--accent-dim), var(--accent)); transition: box-shadow .35s; }
.sv-card:hover .sv-bar > i { box-shadow: 0 0 9px rgba(255,79,46,.55); }
.sv-search-input{width:100%;background:#0d0d13;border:1px solid var(--border);border-radius:6px;padding:8px 10px;color:var(--text);font-family:var(--font-mono);font-size: 13px}
.sv-run{background:var(--accent-soft);border:1px solid var(--accent-dim);color:var(--accent);border-radius:5px;padding:3px 10px;font-family:var(--font-ui);font-size: 12px;cursor:pointer}
/* ===== Little Blue health band (Task 22) ===== */
#sv-health { margin-top: 28px; }
.lbwrap { display: flex; align-items: center; gap: 14px; margin-bottom: 14px; }
.lb-av { width: 46px; height: 46px; filter: drop-shadow(0 0 10px rgba(125,211,216,.4)); animation: lb-bob 4s ease-in-out infinite; }
@keyframes lb-bob { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-3px); } }
.lb-name { font-family: var(--font-display); letter-spacing: .08em; font-size: 15px; color: var(--text); }
.lb-sub { font-family: var(--font-body); font-style: italic; color: var(--lb); font-size: 15px; }
.lb-group { margin: 14px 0 8px; display: flex; align-items: center; gap: 10px; }
.lb-group .gname { font-family: var(--font-display); text-transform: uppercase; letter-spacing: .14em; font-size: 12px; color: var(--muted); }
.lb-group .gcount { font-family: var(--font-mono); font-size: 11px; color: var(--lb); }
.lb-group .line { flex: 1; height: 1px; background: linear-gradient(90deg, rgba(125,211,216,.25), transparent); }
.tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; }
.tile { display: flex; align-items: center; gap: 10px; border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px;
background: linear-gradient(160deg, #14141c, #101017); text-decoration: none; color: var(--text); transition: border-color .25s, transform .25s; }
.tile:hover { transform: translateY(-2px); border-color: #37404a; }
.tile-icon, .tile-icon-fb { width: 26px; height: 26px; border-radius: 6px; flex: none; }
.tile-icon-fb { display: grid; place-items: center; background: #20202a; color: var(--muted); font-family: var(--font-mono); font-size: 14px; }
.tile-main { flex: 1; min-width: 0; }
.tile-nm { font-family: var(--font-mono); font-size: 13px; display: flex; align-items: center; gap: 7px; }
.tile-host { font-family: var(--font-mono); font-size: 11px; color: var(--muted); margin-top: 4px; }
.tile .dot { width: 8px; height: 8px; border-radius: 50%; }
.tile.status-ok .dot { background: var(--ok); box-shadow: 0 0 7px var(--ok); }
.tile.status-warn .dot { background: var(--warn); box-shadow: 0 0 7px var(--warn); }
.tile.status-down .dot { background: var(--bad); box-shadow: 0 0 7px var(--bad); }
.tile.status-unknown .dot { background: var(--muted); }
/* cluster-health card — reuse the tile status palette */
.sv-cluster .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; vertical-align: middle; background: var(--muted); }
.sv-cluster .status-ok .dot { background: var(--ok); box-shadow: 0 0 7px var(--ok); }
.sv-cluster .status-down .dot { background: var(--bad); box-shadow: 0 0 7px var(--bad); }
.sv-cluster .warn { color: var(--warn); }
.sv-cluster .cl-badge { font-family: var(--font-mono); font-size: 11px; font-weight: 700; letter-spacing: .06em; padding: 1px 7px; border-radius: 4px; }
.sv-cluster .cl-badge.ok { color: var(--ok); border: 1px solid var(--accent-soft); }
.sv-cluster .cl-badge.bad { color: var(--bad); border: 1px solid var(--bad); background: var(--accent-soft); }
/* topbar cluster-health pill */
.cluster-health { display: inline-flex; align-items: center; gap: 6px; }
.cluster-health .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex: none; }
.cluster-health .ch-label { font-size: 12px; letter-spacing: .04em; text-transform: lowercase; }
.cluster-health.status-ok .dot { background: var(--ok); box-shadow: 0 0 7px var(--ok); }
.cluster-health.status-ok .ch-label { color: var(--ok); }
.cluster-health.status-warn .dot { background: var(--warn); box-shadow: 0 0 7px var(--warn); }
.cluster-health.status-warn .ch-label { color: var(--warn); }
.cluster-health.status-down { border-color: var(--bad); }
.cluster-health.status-down .dot { background: var(--bad); box-shadow: 0 0 7px var(--bad); }
.cluster-health.status-down .ch-label { color: var(--bad); }
.tile-go { color: var(--lb); font-size: 12px; opacity: 0; transition: opacity .25s; }
.tile:hover .tile-go { opacity: 1; }
/* Tile root is a div hosting a stretched primary link + a small alt control. */
.tile { position: relative; }
.tile-link { position: absolute; inset: 0; z-index: 1; border-radius: inherit; }
.tile-alt { position: absolute; top: 6px; right: 6px; z-index: 2; display: inline-flex;
align-items: center; justify-content: center; width: 20px; height: 20px; font-size: 12px;
line-height: 1; border-radius: 6px; text-decoration: none; opacity: 0; transition: opacity .2s;
color: var(--muted); background: #20202a; border: 1px solid var(--border); }
.tile:hover .tile-alt, .tile:focus-within .tile-alt { opacity: 1; }
.tile-alt:hover { color: var(--lb); border-color: #37404a; }
.tile.lan-only { opacity: .55; }
.tile-lan { position: absolute; bottom: 6px; right: 8px; z-index: 2; font-family: var(--font-mono);
font-size: 9px; letter-spacing: .04em; text-transform: uppercase; color: var(--muted); pointer-events: none; }
/* ===== Collapsible chrome + responsive layout (Plan 6 polish) ===== */
:root { --sidebar-w-min: 0px; }
#shell { transition: grid-template-columns .22s ease; }
#sidebar { transition: transform .22s ease; }
/* Desktop collapse — shrink the sidebar column */
#shell.sidebar-collapsed { grid-template-columns: var(--sidebar-w-min) 1fr; }
#shell.sidebar-collapsed #sidebar { overflow: hidden; border-right: none; }
/* Topbar toggle buttons */
.chrome-toggle {
background: transparent; border: 1px solid var(--border); color: var(--text);
width: 34px; height: 30px; border-radius: 4px; cursor: pointer; font-size: 15px; line-height: 1; flex: none;
}
.chrome-toggle:hover { border-color: var(--accent-dim); color: var(--accent); }
/* Scrim behind mobile drawers */
#scrim {
position: fixed; inset: var(--topbar-h) 0 0 0; background: rgba(0,0,0,.5);
z-index: 40; opacity: 0; pointer-events: none; transition: opacity .22s;
}
body.drawer-open #scrim { opacity: 1; pointer-events: auto; }
/* Hide the chat-only toggle button on wide screens (rail has its own strip);
show it on narrow screens where the rail is an off-canvas drawer. */
.rail-toggle-btn { display: none; }
/* ---- Narrow / mobile / vertical: off-canvas drawers, single-column main ---- */
@media (max-width: 860px) {
#shell,
#shell.sidebar-collapsed {
grid-template-columns: 1fr;
grid-template-areas: "topbar" "main";
}
#sidebar {
position: fixed; top: var(--topbar-h); bottom: 0; z-index: 50;
}
#sidebar { left: 0; width: min(82vw, 300px); transform: translateX(-100%); border-right: 1px solid var(--border); }
#rightrail{ right: 0; width: min(90vw, 360px); transform: translateX(100%); }
/* A drawer is OPEN when its collapse class is absent */
#shell:not(.sidebar-collapsed) #sidebar { transform: translateX(0); box-shadow: 6px 0 28px rgba(0,0,0,.6); }
#shell:not(.rail-collapsed) #rightrail{ transform: translateX(0); box-shadow: -6px 0 28px rgba(0,0,0,.6); }
#shell:not(.rail-collapsed) .rail-chat { display: flex; flex-direction: column; height: 100%; }
#main { padding: 16px 18px; }
.topbar-search { max-width: none; }
.rail-toggle-btn { display: inline-block; }
}
/* Very narrow phones — tighten the topbar so toggles + search fit */
@media (max-width: 520px) {
#topbar { padding: 0 8px; gap: 8px; }
.brand { display: none; }
#main { padding: 14px 12px; }
/* Sacred Valley cards already collapse to 1 column at <=900px (see grid rules) */
}
/* ===== Network · Devices band (separate from Little Blue's health band) ===== */
#sv-devices { margin-top: 30px; padding-top: 22px; border-top: 1px dashed var(--border); }
.dv-hd { display: flex; align-items: baseline; gap: 12px; }
.dv-title { font-family: var(--font-display); letter-spacing: .14em; text-transform: uppercase; font-size: 14px; color: var(--muted); }
.dv-count { font-family: var(--font-mono); font-size: 11px; color: var(--muted); }
.dv-note { font-family: var(--font-body); font-style: italic; color: var(--muted); font-size: 14px; margin: 4px 0 6px; opacity: .8; }
.dv-section { margin-top: 12px; }
.dv-group { display: flex; align-items: center; gap: 10px; margin: 10px 0 7px; }
.dv-group .gname { font-family: var(--font-display); text-transform: uppercase; letter-spacing: .14em; font-size: 11px; color: var(--muted); }
.dv-group .gcount { font-family: var(--font-mono); font-size: 11px; color: var(--muted); }
.dv-group .line { flex: 1; height: 1px; background: linear-gradient(90deg, var(--border), transparent); }
.dv-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 8px; }
.dv-tile {
border: 1px solid var(--border); border-radius: 7px; padding: 8px 11px; background: #101017;
display: flex; flex-direction: column; gap: 2px;
}
.dv-tile .dv-nm { font-family: var(--font-ui); font-size: 13px; color: var(--text); }
.dv-tile .dv-ip { font-family: var(--font-mono); font-size: 12px; color: var(--muted); }
.dv-tile .dv-mac { font-family: var(--font-mono); font-size: 10px; color: var(--muted); opacity: .6; letter-spacing: .02em; }
.lk-card { max-width: 760px; }
.lk-row { display: flex; gap: 12px; align-items: center; margin-bottom: 10px; }
.lk-update a { color: var(--accent); }
.lk-quickadd { display: flex; gap: 8px; }
.lk-quickadd .lk-url { flex: 1; }
.lk-out { display: block; margin-top: 8px; font-family: var(--font-mono); font-size: 13px; }
.dv-tile { position: relative; }
.dv-edit-btn { position: absolute; top: 5px; right: 5px; background: transparent; border: 1px solid var(--border); color: var(--muted); border-radius: 3px; font-size: 11px; line-height: 1; padding: 2px 5px; cursor: pointer; opacity: 0; }
.dv-tile:hover .dv-edit-btn { opacity: 1; }
/* touch devices have no hover — keep the ✎ edit button always visible there */
@media (hover: none) { .dv-edit-btn { opacity: .85; } }
/* Little Blue service-tile edit affordance */
.lb-tile-wrap { position: relative; }
.lb-edit-btn { position: absolute; top: 5px; right: 5px; z-index: 5; background: var(--panel-2); border: 1px solid var(--border); color: var(--muted); border-radius: 3px; font-size: 11px; line-height: 1; padding: 2px 5px; cursor: pointer; opacity: 0; }
.lb-tile-wrap:hover .lb-edit-btn { opacity: 1; }
.lb-edit-btn:hover { color: var(--accent); border-color: var(--accent-dim); }
@media (hover: none) { .lb-edit-btn { opacity: .85; } }
.lb-edit { display: flex; flex-direction: column; gap: 4px; padding: 8px; }
.lb-edit .dv-edit-name, .lb-edit .dv-edit-grp { width: 100%; margin: 0; }
.lb-edit-btns { display: flex; gap: 4px; margin-top: 2px; }
.lb-edit-btns button { font-size: 11px; padding: 2px 8px; }
.dv-edit-btn:hover { color: var(--accent); border-color: var(--accent-dim); }
.dv-tile .dv-edit-name, .dv-tile .dv-edit-grp { margin: 2px 0; width: 100%; }
.dv-tile .dv-add, .dv-tile .dv-ignore, .dv-tile .ghost { margin-top: 4px; margin-right: 4px; font-size: 11px; padding: 2px 8px; }
.dv-addtoggle { margin-left: auto; font-size: 11px; padding: 2px 8px; white-space: nowrap; }
.dv-scanbtn { font-size: 11px; padding: 2px 8px; white-space: nowrap; margin-left: 6px; }
.dv-scanbtn:disabled { opacity: .6; cursor: default; }
.dv-addform { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 8px 0; padding: 8px 10px; border: 1px solid var(--accent-dim); border-radius: 6px; background: var(--accent-soft); }
.dv-addform .dv-edit-name { flex: 1 1 9rem; }
.dv-tile .dv-vendor { font-family: var(--font-ui); font-size: 11px; color: var(--muted); opacity: .7; }
.dv-tile.flag { border-color: var(--bad); background: #1a1012; }
.dv-tile.flag .dv-nm { color: var(--bad); }
.dv-tile.absent { opacity: .5; }
.dv-discovered { border: 1px solid var(--accent-dim); border-radius: 6px; padding: 10px 12px; margin: 10px 0; background: var(--accent-soft); }
.dv-disc-hd { font-family: var(--font-display); font-size: 12px; text-transform: uppercase; letter-spacing: .1em; color: var(--accent); margin-bottom: 8px; }
.dv-disc-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 5px 0; }
.dv-disc-row .dv-edit-name { flex: 1 1 120px; }
.dv-disc-row .dv-add { background: var(--accent-dim); color: var(--text); border: 1px solid var(--accent); border-radius: 3px; padding: 4px 10px; cursor: pointer; font-family: var(--font-ui); font-size: 12px; }
.dv-disc-row .dv-add:hover { background: var(--accent); color: var(--bg); }
.dv-disc-row .ghost { background: transparent; color: var(--muted); border: 1px solid var(--border); border-radius: 3px; padding: 4px 10px; cursor: pointer; font-size: 12px; }
/* ===== Discovered services + scan (Plan: DB-backed registry) ===== */
.lb-scan { background: var(--accent-soft); border: 1px solid var(--accent-dim); color: var(--accent);
border-radius: 5px; padding: 4px 12px; font-family: var(--font-ui); font-size: 12px; cursor: pointer; flex: none; }
.lb-scan:hover { background: var(--accent-dim); color: var(--text); }
.tile.disc { border-style: dashed; }
.disc-add { margin-left: auto; width: 22px; height: 22px; border-radius: 50%; flex: none;
border: 1px solid var(--accent-dim); background: transparent; color: var(--accent); font-size: 15px; line-height: 1; cursor: pointer; }
.disc-add:hover { background: var(--accent); color: var(--bg); }
/* ===== Sacred Valley — edit layout mode ===== */
.sv-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 22px; }
.sv-toolbar { display: flex; gap: 8px; flex: none; }
.sv-edit-btn, .sv-reset-btn { background: transparent; border: 1px solid var(--border); color: var(--text);
padding: 5px 12px; border-radius: 5px; cursor: pointer; font-family: var(--font-ui); font-size: 13px; }
.sv-edit-btn:hover, .sv-reset-btn:hover { border-color: var(--accent-dim); color: var(--accent); }
.sv-card-title { cursor: default; } /* drag is via the grip now, not the title */
.sv-card-edit { position: absolute; top: 6px; right: 8px; z-index: 3; display: none; align-items: center; gap: 6px;
background: rgba(10,10,14,.88); border: 1px solid var(--border); border-radius: 6px; padding: 3px 5px; }
#sv-cards.editing .sv-card-edit { display: flex; }
#sv-cards.editing .sv-card { outline: 1px dashed var(--accent-dim); }
.sv-grip { cursor: grab; color: var(--muted); font-size: 14px; padding: 0 2px; user-select: none; touch-action: none; }
.sv-grip:active { cursor: grabbing; }
.sv-ed-free, .sv-ed-hide { width: 20px; height: 20px; border: 1px solid var(--border); background: transparent;
border-radius: 3px; font-size: 12px; cursor: pointer; padding: 0; line-height: 1; }
.sv-ed-free { color: var(--muted); }
.sv-ed-free:hover { color: var(--accent); border-color: var(--accent-dim); }
.sv-card.free .sv-ed-free { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.sv-ed-hide { color: var(--bad); }
.sv-ed-hide:hover { background: var(--bad); color: var(--bg); }
/* resize handle — bottom-right corner, edit mode only */
.sv-resize { display: none; position: absolute; right: 3px; bottom: 3px; width: 16px; height: 16px; z-index: 4;
cursor: nwse-resize; touch-action: none; border-radius: 0 0 9px 0;
background: linear-gradient(135deg, transparent 45%, var(--muted) 45% 55%, transparent 55%,
transparent 62%, var(--muted) 62% 72%, transparent 72%); opacity: .6; }
.sv-resize:hover { opacity: 1; }
#sv-cards.editing .sv-resize { display: block; }
.sv-tray-hint { font-family: var(--font-ui); font-size: 11px; margin-left: 6px; }
/* decorative cards (blank spacer / blackflame) — no chrome padding, full-bleed body */
.sv-card-decor { padding: 0; overflow: hidden; }
.sv-card-decor .sv-card-body { position: absolute; inset: 0; padding: 0; overflow: hidden; }
.sv-card-decor:hover { transform: none; }
.sv-blank { width: 100%; height: 100%;
background-image: repeating-linear-gradient(45deg, rgba(255,255,255,.025) 0 9px, transparent 9px 18px); }
.sv-flame-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; pointer-events: none; }
.sv-flame-crest { position: absolute; top: 46%; left: 50%; width: 22%; aspect-ratio: 1; transform: translate(-50%,-50%);
border-radius: 50%; pointer-events: none;
background: radial-gradient(circle at 50% 45%, #000 38%, #0a0a10 60%, transparent 72%);
box-shadow: 0 0 26px 10px #000, 0 0 60px 18px rgba(255,79,46,.13); }
.sv-flame-label { position: absolute; left: 0; right: 0; bottom: 14px; text-align: center; pointer-events: none;
font-family: var(--font-display); letter-spacing: .42em; text-indent: .42em; text-transform: uppercase;
font-size: 14px; color: #f4ece9; text-shadow: 0 0 18px rgba(255,79,46,.55), 0 0 4px #000; }
#sv-tray { flex-wrap: wrap; align-items: center; gap: 8px; margin: 2px 0 18px; padding: 10px 12px;
border: 1px dashed var(--border); border-radius: 8px; }
.sv-tray-label { font-family: var(--font-display); text-transform: uppercase; letter-spacing: .14em; font-size: 11px; color: var(--muted); }
.sv-tray-chip { background: var(--panel-2); border: 1px solid var(--border); color: var(--text); border-radius: 14px;
padding: 4px 10px; font-family: var(--font-ui); font-size: 12px; cursor: pointer; }
.sv-tray-chip:hover { border-color: var(--accent); color: var(--accent); }
.sv-link { color: var(--muted); text-decoration: none; font-family: var(--font-ui); font-size: 11px; }
.sv-link:hover { color: var(--accent); }
/* ---- Speedtest page ---- */
.st-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 16px; flex-wrap: wrap; margin-bottom: 16px; }
.st-actions { display: flex; align-items: center; gap: 10px; }
.st-ranges { display: inline-flex; border: 1px solid var(--border); border-radius: 7px; overflow: hidden; }
.st-range { background: transparent; border: 0; color: var(--muted); padding: 5px 12px; font-family: var(--font-ui); font-size: 12px; cursor: pointer; }
.st-range.on { background: var(--accent-soft); color: var(--accent); }
.st-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; margin-bottom: 8px; }
.st-kpi { border: 1px solid var(--border); border-left: 3px solid var(--border); border-radius: 8px; padding: 10px 12px; background: var(--panel); }
.st-kpi.down { border-left-color: var(--accent); }
.st-kpi.up { border-left-color: var(--ok); }
.st-kpi.bad { border-left-color: var(--bad); }
.st-kpi-l { display: block; font-family: var(--font-ui); font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: .08em; }
.st-kpi-v { display: block; font-family: var(--font-mono); font-size: 26px; color: var(--text); line-height: 1.1; }
.st-kpi-s { display: block; font-size: 11px; color: var(--muted); }
.st-meta { font-size: 12px; margin: 4px 0 10px; }
.st-link { color: var(--accent); text-decoration: none; }
.st-warn { color: var(--warn); }
.st-fail td { color: var(--bad); opacity: .8; }
.st-stats { display: flex; flex-wrap: wrap; gap: 16px; font-family: var(--font-mono); font-size: 12px; color: var(--muted); margin-bottom: 18px; }
.st-h2 { font-family: var(--font-display); font-size: 14px; letter-spacing: .12em; text-transform: uppercase; color: var(--text); margin: 18px 0 6px; }
.st-chart { width: 100%; height: 180px; display: block; }
.st-legend { display: flex; gap: 16px; margin-bottom: 4px; }
.st-leg { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--muted); }
.st-leg i { width: 14px; height: 3px; border-radius: 2px; display: inline-block; }
.st-card { margin: 16px 0; }
.st-form { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; }
.st-lbl { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; color: var(--muted); }
.st-table-wrap { overflow-x: auto; }
.st-table { width: 100%; border-collapse: collapse; font-family: var(--font-mono); font-size: 12px; }
.st-table th { text-align: left; color: var(--muted); font-weight: 400; font-family: var(--font-ui); border-bottom: 1px solid var(--border); padding: 6px 10px; position: sticky; top: 0; background: var(--bg); }
.st-table td { padding: 5px 10px; border-bottom: 1px solid #ffffff08; }
.st-table td.num { text-align: right; }
/* ---- Theming panel ---- */
.theme-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 8px 18px; margin-bottom: 14px; }
.theme-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: 12px; color: var(--muted); }
.theme-row input[type=color] { width: 40px; height: 24px; padding: 0; border: 1px solid var(--border); border-radius: 4px; background: none; cursor: pointer; }
.theme-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.hidden { display: none !important; }
/* Storage card (sv-cluster container) — warn dot + capacity meter + subheader */
.sv-cluster .status-warn .dot { background: var(--warn); box-shadow: 0 0 7px var(--warn); }
.sv-cluster .ok { color: var(--ok); }
.sv-cluster .bad { color: var(--bad); }
.sv-cluster .st-meter { height: 3px; background: var(--accent-soft); border-radius: 2px; margin: 3px 0 9px; overflow: hidden; }
.sv-cluster .st-fill { height: 100%; border-radius: 2px; }
.sv-cluster .st-fill.ok { background: var(--ok); }
.sv-cluster .st-fill.warn { background: var(--warn); }
.sv-cluster .st-fill.bad { background: var(--bad); }
.sv-cluster .sv-subhdr { color: var(--muted); font-size: 10px; text-transform: uppercase; letter-spacing: .08em; margin: 11px 0 5px; font-family: var(--font-mono); }
.dv-icon { width: 30px; height: 30px; object-fit: contain; opacity: .95; }
.dv-icon-fb { width: 30px; height: 30px; display: grid; place-items: center; font-size: 14px; color: var(--text); background: var(--panel-2, #1b1b22); border-radius: 4px; }
.dv-seen { font-size: 11px; color: var(--muted, #8a8a94); }
.icon-picker { border: 1px solid var(--border, #2a2a36); border-radius: 6px; padding: 6px; margin-top: 6px; max-width: 320px; }
.ip-tabs { display: flex; gap: 4px; margin-bottom: 6px; }
.ip-tab.active { color: var(--accent, #ff4f2e); border-bottom: 1px solid var(--accent, #ff4f2e); }
.ip-grid { display: flex; flex-wrap: wrap; gap: 6px; }
.ip-icon { width: 40px; height: 40px; display: grid; place-items: center; background: transparent; border: 1px solid var(--border, #2a2a36); border-radius: 4px; cursor: pointer; }
.ip-icon img { width: 28px; height: 28px; object-fit: contain; }
.ip-set-hd, .isp-hd { font-size: 12px; margin: 6px 0 3px; text-transform: capitalize; }
.isp-upload { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
/* ---- Dross floating chat ---- */
:root{ --dross:#a86adf; --dross-dim:#5a2e8a; --dross-soft:#1e1030; --dross-glow:#c79bff; }
.dross-orb{position:relative;border-radius:50%;display:grid;place-items:center;overflow:hidden;flex:none;
background:radial-gradient(circle at 38% 30%, #2a1640, #1a0f2a 70%, #120a1e);
box-shadow:0 0 0 1px #ffffff12, 0 6px 22px -6px #000, 0 0 26px -4px var(--dross-dim)}
.dross-fab{position:fixed;right:20px;bottom:20px;z-index:40;cursor:grab;touch-action:none;animation:dross-bob 5s ease-in-out infinite}
.dross-fab:active{cursor:grabbing}
@keyframes dross-bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
.dross-fab .dross-orb{width:60px;height:60px}
.dross-ping{position:absolute;right:-2px;top:-2px;width:17px;height:17px;border-radius:50%;background:var(--accent);
color:#0a0a0e;font-size:10px;display:grid;place-items:center;box-shadow:0 0 0 2px var(--bg);z-index:2;font-family:var(--font-ui)}
.av-eye{width:54%;height:54%;border-radius:50%;background:radial-gradient(circle at 50% 40%, #2a1c3a, #140b20);display:grid;place-items:center;box-shadow:inset 0 0 10px #000}
.av-pupil{width:44%;height:44%;border-radius:50%;position:relative;background:radial-gradient(circle at 38% 32%, #fff, var(--dross-glow) 50%, var(--dross) 100%);box-shadow:0 0 10px var(--dross-glow);animation:dross-look 7s ease-in-out infinite}
.av-pupil::after{content:"";position:absolute;right:14%;bottom:18%;width:26%;height:26%;border-radius:50%;background:#fff;opacity:.8}
@keyframes dross-look{0%,45%{transform:translate(0,0)}58%{transform:translate(3px,-2px)}72%{transform:translate(-2px,1px)}88%,100%{transform:translate(0,0)}}
.b-core{position:absolute;inset:13%;border-radius:50%;filter:blur(3px);animation:dross-spin 7s linear infinite;
background:conic-gradient(from 0deg, var(--dross-dim), var(--dross-glow), var(--dross), var(--dross-soft), var(--dross-dim))}
.b-bright{position:absolute;inset:32%;border-radius:50%;background:radial-gradient(circle,#fff,var(--dross-glow) 60%,transparent 75%);animation:dross-pulse 3s ease-in-out infinite}
@keyframes dross-spin{to{transform:rotate(360deg)}}
@keyframes dross-pulse{0%,100%{opacity:.55;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}
.d-core{width:22%;height:22%;border-radius:50%;background:radial-gradient(circle,#fff,var(--dross-glow) 60%,var(--dross));box-shadow:0 0 12px var(--dross-glow)}
.d-ring{position:absolute;inset:0;animation:dross-spin 5s linear infinite}
.d-ring.r2{animation-duration:8s;animation-direction:reverse}
.d-mote{position:absolute;top:11%;left:50%;width:11%;height:11%;margin-left:-5.5%;border-radius:50%;background:var(--dross-glow);box-shadow:0 0 8px var(--dross-glow)}
.d-ring.r2 .d-mote{top:auto;bottom:14%;background:var(--dross);width:8%;height:8%}
.dross-panel{position:fixed;right:20px;bottom:20px;width:340px;max-width:calc(100vw - 24px);height:480px;max-height:calc(100vh - 24px);
display:none;flex-direction:column;z-index:41;border:1px solid var(--dross-dim);border-radius:16px;overflow:hidden;
background:linear-gradient(180deg, rgba(30,16,48,.6), rgba(20,20,28,.96) 22%);
box-shadow:0 24px 70px -18px #000, 0 0 0 1px #00000060, 0 0 40px -16px var(--dross-dim);backdrop-filter:blur(6px)}
.dross-panel.open{display:flex}
.dross-hd{display:flex;align-items:center;gap:10px;padding:11px 12px;cursor:grab;touch-action:none;
background:linear-gradient(180deg, var(--dross-soft), transparent);border-bottom:1px solid var(--border)}
.dross-hd .dross-orb{width:30px;height:30px}
.dross-who{font-family:var(--font-display);letter-spacing:.16em;text-transform:uppercase;font-size:13px;color:#efe9f6;flex:1}
.dross-who small{display:block;font-family:var(--font-mono);letter-spacing:0;text-transform:none;font-size:10px;color:var(--dross-glow);opacity:.85}
.dross-x{background:none;border:0;color:var(--muted);font-size:18px;cursor:pointer;padding:4px 6px}
.dross-x:hover{color:var(--text)}
.dross-log{flex:1;overflow:auto;padding:12px 12px;display:flex;flex-direction:column;gap:10px}
.dross-inwrap{padding:10px;border-top:1px solid var(--border);background:#0d0a12;display:flex;flex-direction:column;gap:9px}
.dross-inwrap textarea{width:100%;background:#0d0d13;border:1px solid var(--border);border-radius:10px;padding:10px 12px;color:var(--text);font-family:var(--font-mono);font-size:13px;resize:none;height:46px;max-height:96px}
.dross-btnrow{display:flex;gap:10px}
.dross-mic{flex:1;height:50px;border-radius:12px;border:1px solid var(--dross-dim);background:var(--dross-soft);color:var(--dross-glow);cursor:pointer;display:flex;align-items:center;justify-content:center;gap:9px;font-family:var(--font-ui);font-size:13px}
.dross-mic[disabled]{opacity:.5;cursor:not-allowed}
.dross-mic.rec{background:#3a1010;border-color:var(--accent);color:#fff;animation:dross-rec 1.2s infinite}
@keyframes dross-rec{0%,100%{box-shadow:0 0 0 0 rgba(255,79,46,.5)}50%{box-shadow:0 0 0 8px rgba(255,79,46,0)}}
.dross-send{width:64px;height:50px;border-radius:12px;border:1px solid var(--dross-dim);background:linear-gradient(180deg,var(--dross),var(--dross-dim));color:#fff;cursor:pointer;display:grid;place-items:center}
.dross-collapse{display:flex;align-items:center;justify-content:center;gap:8px;height:34px;cursor:pointer;color:var(--muted);
font-family:var(--font-ui);font-size:11px;letter-spacing:.12em;text-transform:uppercase;background:#0b0810;border-top:1px solid var(--border)}
.dross-collapse:hover{color:var(--dross-glow)}
.dross-collapse .grip{width:42px;height:4px;border-radius:3px;background:var(--border)}
.dross-pick{display:flex;gap:12px;margin-bottom:12px;flex-wrap:wrap}
.dross-avopt{display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px 14px;border:1px solid var(--border);border-radius:12px;background:var(--panel);color:var(--muted);cursor:pointer;font-size:11px}
.dross-avopt.on{border-color:var(--dross);color:var(--dross-glow);background:var(--dross-soft)}
.dross-persona{width:100%;background:#0d0d13;border:1px solid var(--border);border-radius:8px;padding:10px;color:var(--text);font-family:var(--font-mono);font-size:12px;resize:vertical;margin:10px 0}