:root {
--bg: #efe7ff;
--surface: #ffffff;
--surface2: #f7f4ff;
--border: #111827;
--accent: #6d28d9;
--accent-muted: #7c3aed;
--text: #111827;
--muted: #4b5563;
--success: #16a34a;
--warn: #f59e0b;
--maxw: 1180px;
--chat-cols: 1fr;
--activity-cols: minmax(300px, 0.38fr);
}
* {
box-sizing: border-box;
}
html, body {
margin: 0;
min-height: 100%;
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;
background: var(--bg);
color: var(--text);
}
.shell {
max-width: var(--maxw);
margin: 0 auto;
padding: 1.25rem 1rem 2rem;
}
.topbar {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 1rem;
margin-bottom: 1.25rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--border);
}
.app-title {
margin: 0;
font-size: 1.35rem;
font-weight: 650;
letter-spacing: -0.02em;
}
.app-sub {
margin: 0.2rem 0 0;
font-size: 0.95rem;
}
.meta {
text-align: right;
}
.pill {
display: inline-flex;
align-items: center;
gap: 0.45rem;
padding: 0.25rem 0.65rem;
border-radius: 999px;
background: var(--surface2);
border: 1px solid var(--border);
font-size: 0.8rem;
}
.pill .dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--success);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--success) 35%, transparent);
}
.pill.busy .dot {
background: var(--warn);
animation: pulse 1.1s ease-in-out infinite;
}
@keyframes pulse {
50% { opacity: 0.35; transform: scale(0.9); }
}
.llm-line {
margin-top: 0.35rem;
max-width: 22rem;
}
.layout {
display: flex;
flex-direction: column;
gap: 1rem;
}
.bottom-grid {
display: flex;
flex-direction: column;
gap: 1rem;
}
@media (max-width: 900px) {
.bottom-grid {
gap: 0.85rem;
}
}
.panel {
background: var(--surface);
border: 2px solid var(--border);
border-radius: 0;
overflow: hidden;
min-height: 0;
display: flex;
flex-direction: column;
}
.panel-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.5rem;
padding: 0.75rem 1rem;
border-bottom: 2px solid var(--border);
background: var(--surface2);
}
.panel-head h2 {
margin: 0;
font-size: 0.95rem;
font-weight: 600;
}
.section-toggle {
border: 1px solid var(--border);
background: var(--surface);
color: var(--text);
font: inherit;
font-size: 0.85rem;
line-height: 1;
width: 1.5rem;
height: 1.5rem;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.panel.section.collapsed > :not(.panel-head) {
display: none;
}
.chat-log {
flex: 1;
padding: 0.75rem 1rem;
overflow-y: auto;
max-height: min(52vh, 520px);
display: flex;
flex-direction: column;
gap: 0.65rem;
}
.bubble {
border-radius: 0;
padding: 0.55rem 0.75rem;
font-size: 0.92rem;
line-height: 1.45;
border: 2px solid var(--border);
white-space: pre-wrap;
word-break: break-word;
}
.bubble.user {
align-self: flex-end;
background: color-mix(in srgb, var(--accent) 12%, var(--surface2));
border-color: color-mix(in srgb, var(--accent) 35%, var(--border));
}
.bubble.assistant {
align-self: flex-start;
background: var(--surface2);
}
.bubble.thinking {
border-color: color-mix(in srgb, var(--accent) 45%, var(--border));
opacity: 0.95;
}
.bubble .who {
font-size: 0.72rem;
text-transform: lowercase;
letter-spacing: 0.06em;
color: var(--muted);
margin-bottom: 0.25rem;
}
.composer {
border-top: 2px solid var(--border);
padding: 0.75rem 1rem 1rem;
background: var(--surface2);
}
.composer textarea {
width: 100%;
resize: vertical;
min-height: 4.5rem;
border-radius: 0;
border: 2px solid var(--border);
background: var(--bg);
color: var(--text);
padding: 0.55rem 0.65rem;
font: inherit;
}
.composer textarea:focus {
outline: 2px solid color-mix(in srgb, var(--accent) 55%, transparent);
outline-offset: 1px;
}
.composer-actions {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 0.5rem;
gap: 0.75rem;
}
.composer button {
border: none;
border-radius: 0;
padding: 0.45rem 1rem;
font-weight: 600;
cursor: pointer;
background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 92%, white), var(--accent-muted));
color: #041018;
}
.composer button:disabled {
opacity: 0.55;
cursor: not-allowed;
}
.activity-body {
padding: 0.75rem 1rem 1rem;
flex: 1;
display: flex;
flex-direction: column;
gap: 0.5rem;
min-height: 0;
}
.subhead {
margin-top: 0.25rem;
}
.timeline {
list-style: none;
margin: 0;
padding: 0;
overflow-y: auto;
max-height: min(38vh, 360px);
display: flex;
flex-direction: column;
gap: 0.45rem;
}
.timeline li {
border-radius: 0;
border: 2px solid var(--border);
background: var(--surface2);
padding: 0.45rem 0.55rem;
font-size: 0.82rem;
line-height: 1.35;
}
.timeline li .t {
color: var(--accent);
font-weight: 600;
font-size: 0.72rem;
text-transform: lowercase;
letter-spacing: 0.04em;
}
.timeline li .body {
margin-top: 0.2rem;
color: var(--text);
white-space: pre-wrap;
word-break: break-word;
}
.summary-box {
border-radius: 0;
border: 2px solid var(--border);
background: var(--bg);
padding: 0.6rem 0.65rem;
font-size: 0.88rem;
line-height: 1.45;
white-space: pre-wrap;
min-height: 3rem;
max-height: min(28vh, 280px);
overflow-y: auto;
}
.muted { color: var(--muted); }
.small { font-size: 0.8rem; }
.hint { flex: 1; }
.dashboard-panel {
min-height: 0;
}
.dashboard-body {
padding: 0.75rem 1rem 1rem;
flex: 0;
overflow-y: visible;
min-height: 0;
}
.widgets {
display: grid;
grid-template-columns: repeat(4, minmax(210px, 1fr));
gap: 0.75rem;
}
.widget-card {
box-shadow: 0 1px 0 color-mix(in srgb, var(--border) 20%, transparent);
}
@media (max-width: 980px) {
.widgets {
grid-template-columns: repeat(2, minmax(220px, 1fr));
}
}
@media (max-width: 640px) {
.widgets {
grid-template-columns: 1fr;
}
}
.widget-card {
border-radius: 0;
border: 2px solid var(--border);
background: var(--surface);
padding: 0.7rem 0.75rem;
}
.widget-title {
font-size: 0.85rem;
color: var(--text);
font-weight: 800;
margin-bottom: 0.45rem;
}
.metric-value {
font-size: 1.75rem;
font-weight: 750;
letter-spacing: -0.01em;
margin-bottom: 0.15rem;
}
.metric-sub {
font-size: 0.82rem;
color: var(--muted);
}
.status-lines {
font-size: 0.88rem;
line-height: 1.4;
white-space: pre-wrap;
word-break: break-word;
}
.kv-table {
width: 100%;
border-collapse: collapse;
}
.kv-table th {
text-align: left;
font-size: 0.75rem;
color: var(--muted);
font-weight: 650;
padding: 0.1rem 0.1rem 0.35rem;
border-bottom: 1px solid var(--border);
}
.kv-table td {
padding: 0.35rem 0.1rem;
font-size: 0.86rem;
border-bottom: 1px solid color-mix(in srgb, var(--border) 80%, transparent);
}
.logs-list {
display: flex;
flex-direction: column;
gap: 0.45rem;
}
.log-line {
font-size: 0.82rem;
line-height: 1.3;
border: 2px solid var(--border);
background: var(--surface);
border-radius: 0;
padding: 0.4rem 0.5rem;
overflow: hidden;
}
.log-at {
font-size: 0.72rem;
color: var(--muted);
margin-bottom: 0.15rem;
}