304 lines
8.4 KiB
CSS
304 lines
8.4 KiB
CSS
/* Palette + base body typography live in hive-fr0nt::BASE_CSS, prepended
|
|
to this stylesheet by `serve_css` at runtime. */
|
|
body {
|
|
max-width: 110em;
|
|
margin: 1.5em auto;
|
|
padding: 0 1.5em;
|
|
}
|
|
.banner {
|
|
text-align: center;
|
|
margin: 0 0 1em 0;
|
|
font-size: 0.95em;
|
|
overflow-x: auto;
|
|
background: linear-gradient(
|
|
90deg,
|
|
var(--purple-dim) 0%,
|
|
var(--purple) 50%,
|
|
var(--purple-dim) 100%
|
|
);
|
|
background-size: 200% 100%;
|
|
background-position: 50% 0;
|
|
-webkit-background-clip: text;
|
|
background-clip: text;
|
|
color: transparent;
|
|
filter: drop-shadow(0 0 6px rgba(203, 166, 247, 0.45));
|
|
}
|
|
.banner.active {
|
|
animation: banner-shimmer 1.8s linear infinite;
|
|
}
|
|
@keyframes banner-shimmer {
|
|
from { background-position: 200% 0; }
|
|
to { background-position: -100% 0; }
|
|
}
|
|
h2, h3 {
|
|
color: var(--purple);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.15em;
|
|
text-shadow: 0 0 8px rgba(203, 166, 247, 0.4);
|
|
}
|
|
.meta { color: var(--muted); font-size: 0.85em; }
|
|
.status-online { color: var(--green); text-shadow: 0 0 6px rgba(166, 227, 161, 0.55); }
|
|
.status-needs-login { color: var(--amber); text-shadow: 0 0 6px rgba(250, 179, 135, 0.55); }
|
|
code { background: rgba(203, 166, 247, 0.12); padding: 0.05em 0.3em; border-radius: 2px; }
|
|
a {
|
|
color: var(--cyan);
|
|
text-shadow: 0 0 4px rgba(137, 220, 235, 0.5);
|
|
}
|
|
a:hover { color: var(--fg); text-shadow: 0 0 12px rgba(137, 220, 235, 0.9); }
|
|
.btn {
|
|
font-family: inherit;
|
|
font-size: 1em;
|
|
background: var(--bg);
|
|
border: 1px solid var(--purple);
|
|
color: var(--purple);
|
|
padding: 0.25em 0.8em;
|
|
cursor: pointer;
|
|
letter-spacing: 0.1em;
|
|
}
|
|
.btn {
|
|
text-shadow: 0 0 4px currentColor;
|
|
transition: box-shadow 0.15s ease, text-shadow 0.15s ease;
|
|
}
|
|
.btn:hover {
|
|
background: rgba(205, 214, 244, 0.06);
|
|
text-shadow: 0 0 10px currentColor;
|
|
box-shadow: 0 0 10px -2px currentColor;
|
|
}
|
|
.btn-login { color: var(--amber); border-color: var(--amber); }
|
|
.btn-cancel { color: var(--red); border-color: var(--red); font-size: 0.85em; padding: 0.15em 0.6em; }
|
|
.btn-rebuild {
|
|
color: var(--amber);
|
|
border: 1px solid var(--amber);
|
|
padding: 0.15em 0.6em;
|
|
font-size: 0.55em;
|
|
font-family: inherit;
|
|
text-decoration: none;
|
|
letter-spacing: 0.1em;
|
|
margin-left: 0.6em;
|
|
vertical-align: middle;
|
|
cursor: pointer;
|
|
}
|
|
.btn-rebuild:hover { background: rgba(250, 179, 135, 0.1); }
|
|
.btn-send { color: var(--green); border-color: var(--green); }
|
|
.sendform { display: flex; gap: 0.6em; margin-top: 0.5em; }
|
|
.sendform input {
|
|
font-family: inherit; font-size: 1em;
|
|
background: rgba(255, 255, 255, 0.04);
|
|
color: var(--fg);
|
|
border: 1px solid var(--purple-dim);
|
|
padding: 0.4em 0.6em;
|
|
flex: 1;
|
|
}
|
|
.sendform input:focus { outline: 1px solid var(--purple); }
|
|
.loginform { display: flex; gap: 0.6em; margin-top: 0.5em; }
|
|
.loginform input {
|
|
font-family: inherit; font-size: 1em;
|
|
background: rgba(255, 255, 255, 0.04);
|
|
color: var(--fg);
|
|
border: 1px solid var(--purple-dim);
|
|
padding: 0.4em 0.6em;
|
|
flex: 1;
|
|
}
|
|
.loginform input:focus { outline: 1px solid var(--purple); }
|
|
pre.diff {
|
|
background: rgba(255, 255, 255, 0.03);
|
|
border: 1px solid var(--purple-dim);
|
|
padding: 0.6em 0.8em;
|
|
overflow-x: auto;
|
|
white-space: pre-wrap;
|
|
word-break: break-all;
|
|
max-height: 30em;
|
|
}
|
|
#state-row {
|
|
margin: 0.4em 0 0.2em;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.6em;
|
|
}
|
|
/* Per-agent inbox section — collapsible, dim, lives between the
|
|
state row and the terminal so the operator can peek at what
|
|
landed without scrolling through the live tail. */
|
|
.agent-inbox {
|
|
margin: 0.4em 0;
|
|
font-size: 0.85em;
|
|
color: var(--muted);
|
|
}
|
|
.agent-inbox > summary {
|
|
cursor: pointer;
|
|
letter-spacing: 0.05em;
|
|
list-style: none;
|
|
}
|
|
.agent-inbox > summary::marker { content: ''; }
|
|
.agent-inbox[open] > summary > span::before { content: ''; }
|
|
.agent-inbox ul {
|
|
list-style: none;
|
|
padding: 0.4em 0.8em;
|
|
margin: 0.3em 0 0;
|
|
background: rgba(255, 255, 255, 0.02);
|
|
border-left: 2px solid var(--purple-dim);
|
|
max-height: 16em;
|
|
overflow-y: auto;
|
|
}
|
|
.agent-inbox li {
|
|
padding: 0.15em 0;
|
|
display: grid;
|
|
grid-template-columns: auto auto auto 1fr;
|
|
gap: 0.5em;
|
|
align-items: baseline;
|
|
}
|
|
.agent-inbox .inbox-ts { color: var(--muted); font-size: 0.9em; }
|
|
.agent-inbox .inbox-from { color: var(--amber); }
|
|
.agent-inbox .inbox-sep { color: var(--muted); }
|
|
.agent-inbox .inbox-body { color: var(--fg); white-space: pre-wrap; word-break: break-word; }
|
|
|
|
.last-turn {
|
|
color: var(--muted);
|
|
font-size: 0.8em;
|
|
letter-spacing: 0.05em;
|
|
}
|
|
.model-chip {
|
|
display: inline-block;
|
|
padding: 0.1em 0.6em;
|
|
border: 1px solid var(--purple-dim);
|
|
border-radius: 999px;
|
|
color: var(--cyan);
|
|
font-size: 0.78em;
|
|
letter-spacing: 0.04em;
|
|
}
|
|
.token-usage {
|
|
color: var(--muted);
|
|
font-size: 0.8em;
|
|
letter-spacing: 0.04em;
|
|
cursor: default;
|
|
}
|
|
.btn-dashlink {
|
|
color: var(--cyan);
|
|
border: 1px solid var(--cyan);
|
|
padding: 0.15em 0.6em;
|
|
font-size: 0.55em;
|
|
font-family: inherit;
|
|
text-decoration: none;
|
|
letter-spacing: 0.1em;
|
|
margin-left: 0.6em;
|
|
vertical-align: middle;
|
|
}
|
|
.btn-dashlink:hover {
|
|
background: rgba(137, 220, 235, 0.1);
|
|
box-shadow: 0 0 10px -2px currentColor;
|
|
}
|
|
.btn-cancel-turn {
|
|
font-family: inherit;
|
|
font-size: 0.8em;
|
|
letter-spacing: 0.08em;
|
|
background: transparent;
|
|
color: var(--red);
|
|
border: 1px solid var(--red);
|
|
border-radius: 999px;
|
|
padding: 0.2em 0.8em;
|
|
cursor: pointer;
|
|
text-shadow: 0 0 4px currentColor;
|
|
transition: box-shadow 0.15s ease, background 0.15s ease;
|
|
}
|
|
.btn-cancel-turn:hover {
|
|
background: rgba(243, 139, 168, 0.1);
|
|
box-shadow: 0 0 10px -2px currentColor;
|
|
}
|
|
.btn-new-session {
|
|
font-family: inherit;
|
|
font-size: 0.8em;
|
|
letter-spacing: 0.08em;
|
|
background: transparent;
|
|
color: var(--amber);
|
|
border: 1px solid var(--amber);
|
|
border-radius: 999px;
|
|
padding: 0.2em 0.8em;
|
|
cursor: pointer;
|
|
text-shadow: 0 0 4px currentColor;
|
|
transition: box-shadow 0.15s ease, background 0.15s ease;
|
|
}
|
|
.btn-new-session:hover {
|
|
background: rgba(250, 179, 135, 0.1);
|
|
box-shadow: 0 0 10px -2px currentColor;
|
|
}
|
|
.btn-new-session:disabled {
|
|
opacity: 0.4;
|
|
cursor: progress;
|
|
}
|
|
.state-badge {
|
|
display: inline-block;
|
|
padding: 0.25em 0.8em;
|
|
border: 1px solid;
|
|
border-radius: 999px;
|
|
font-size: 0.85em;
|
|
letter-spacing: 0.05em;
|
|
transition: color 280ms ease, border-color 280ms ease,
|
|
box-shadow 280ms ease, background 280ms ease;
|
|
}
|
|
.state-badge.state-loading {
|
|
color: var(--muted); border-color: var(--purple-dim);
|
|
}
|
|
.state-badge.state-offline {
|
|
color: var(--muted); border-color: var(--muted);
|
|
}
|
|
.state-badge.state-idle {
|
|
color: var(--cyan); border-color: var(--cyan);
|
|
text-shadow: 0 0 6px rgba(137, 220, 235, 0.55);
|
|
}
|
|
.state-badge.state-thinking {
|
|
color: var(--amber); border-color: var(--amber);
|
|
text-shadow: 0 0 6px rgba(250, 179, 135, 0.65);
|
|
animation: badge-pulse 1.8s ease-in-out infinite;
|
|
}
|
|
.state-badge.state-compacting {
|
|
color: var(--purple); border-color: var(--purple);
|
|
text-shadow: 0 0 6px rgba(203, 166, 247, 0.65);
|
|
animation: badge-pulse 1.8s ease-in-out infinite;
|
|
}
|
|
.state-badge.state-just-changed {
|
|
animation: state-flash 600ms ease-out;
|
|
}
|
|
@keyframes state-flash {
|
|
0% { box-shadow: 0 0 0 0 currentColor, 0 0 0 0 currentColor; }
|
|
60% { box-shadow: 0 0 18px -4px currentColor, 0 0 4px 0 currentColor; }
|
|
100% { box-shadow: 0 0 0 0 currentColor, 0 0 0 0 currentColor; }
|
|
}
|
|
/* `.terminal-wrap`, `.live`, `.live.terminal`, row + pill + details
|
|
styling all live in hive-fr0nt::TERMINAL_CSS (prepended by serve_css).
|
|
What stays here is the composer chrome that sits inside the wrap. */
|
|
.term-input { padding: 0.4em 1em 0.8em; }
|
|
.term-input .sendform-term {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 0.5em;
|
|
border-top: 1px dashed var(--purple-dim);
|
|
padding-top: 0.5em;
|
|
}
|
|
.term-input .prompt, .term-input .submit-hint {
|
|
padding-top: 0.25em;
|
|
}
|
|
.term-input .prompt {
|
|
color: var(--green);
|
|
text-shadow: 0 0 6px rgba(166, 227, 161, 0.6);
|
|
user-select: none;
|
|
flex: 0 0 auto;
|
|
}
|
|
.term-input textarea {
|
|
flex: 1;
|
|
background: transparent;
|
|
border: 0;
|
|
outline: 0;
|
|
color: var(--fg);
|
|
font-family: inherit;
|
|
font-size: 1em;
|
|
padding: 0.2em 0;
|
|
caret-color: var(--green);
|
|
resize: none;
|
|
overflow-y: auto;
|
|
line-height: 1.4;
|
|
min-height: 1.4em;
|
|
}
|
|
.term-input textarea::placeholder { color: var(--muted); }
|
|
.term-input .submit-hint { color: var(--muted); font-size: 0.8em; flex: 0 0 auto; }
|
|
.term-input.disabled .prompt { color: var(--muted); text-shadow: none; }
|
|
.term-input.disabled textarea { color: var(--muted); }
|
|
/* Row + pill + details styling moved to hive-fr0nt::TERMINAL_CSS. */
|