Files
Void-Homelab/public/style.css
2026-06-09 09:03:45 +10:00

661 lines
45 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 var(--rail-w);
grid-template-rows: var(--topbar-h) 1fr;
grid-template-areas:
"topbar topbar topbar"
"sidebar main rail";
height: 100vh;
width: 100vw;
}
#shell.rail-collapsed { grid-template-columns: var(--sidebar-w) 1fr var(--rail-w-min); }
#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; }
#rightrail{ grid-area: rail; border-left: 1px solid var(--border); background: var(--panel); overflow: hidden; display: flex; flex-direction: column; }
/* 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; */
}
#sv-cards { display: grid; grid-template-columns: repeat(12, 1fr); gap: 16px; align-items: start; }
.sv-card { grid-column: span 6; } /* fallback; svCard sets an inline span (112) */
@media (max-width: 700px) { #sv-cards { grid-template-columns: 1fr; } .sv-card { grid-column: 1 / -1 !important; } }
.sv-ed-span { display: inline-flex; align-items: center; gap: 3px; }
.sv-ed-step { width: 18px; height: 20px; border: 1px solid var(--border); background: transparent; color: var(--muted);
border-radius: 3px; font-size: 14px; line-height: 1; cursor: pointer; padding: 0; }
.sv-ed-step:hover { color: var(--accent); border-color: var(--accent-dim); }
.sv-span-val { font-family: var(--font-mono); font-size: 12px; color: var(--text); min-width: 14px; text-align: center; }
.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 { opacity: .5; }
.sv-card.drag-over { border-color: var(--accent); }
.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, #rightrail { transition: transform .22s ease; }
/* Desktop collapse — shrink the grid columns */
#shell.sidebar-collapsed { grid-template-columns: var(--sidebar-w-min) 1fr var(--rail-w); }
#shell.sidebar-collapsed.rail-collapsed { grid-template-columns: var(--sidebar-w-min) 1fr var(--rail-w-min); }
#shell.rail-collapsed { grid-template-columns: var(--sidebar-w) 1fr var(--rail-w-min); }
#shell.sidebar-collapsed #sidebar { overflow: hidden; border-right: none; }
/* Hide chat body when the rail is collapsed so the thin strip stays clean */
#shell.rail-collapsed .rail-chat { display: 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,
#shell.rail-collapsed,
#shell.sidebar-collapsed.rail-collapsed {
grid-template-columns: 1fr;
grid-template-areas: "topbar" "main";
}
#sidebar, #rightrail {
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; }
.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; }
.sv-grip:active { cursor: grabbing; }
.sv-ed-sizes { display: flex; gap: 2px; }
.sv-ed-size, .sv-ed-hide { width: 20px; height: 20px; border: 1px solid var(--border); background: transparent;
border-radius: 3px; font-size: 11px; cursor: pointer; padding: 0; line-height: 1; }
.sv-ed-size { color: var(--muted); }
.sv-ed-size:hover { color: var(--accent); border-color: var(--accent-dim); }
.sv-card[data-size="s"] .sv-ed-size[data-s="s"],
.sv-card[data-size="m"] .sv-ed-size[data-s="m"],
.sv-card[data-size="l"] .sv-ed-size[data-s="l"] { background: var(--accent-dim); color: var(--text); border-color: var(--accent); }
.sv-ed-hide { color: var(--bad); font-size: 12px; }
.sv-ed-hide:hover { background: var(--bad); color: var(--bg); }
#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); }
.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: 20px; height: 20px; object-fit: contain; opacity: .9; }
.dv-icon-fb { width: 20px; height: 20px; display: grid; place-items: center; font-size: 11px; 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: 34px; height: 34px; display: grid; place-items: center; background: transparent; border: 1px solid var(--border, #2a2a36); border-radius: 4px; cursor: pointer; }
.ip-icon img { width: 22px; height: 22px; 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; }