filename:
assistant/server/static/style.css
branch:
main
back to repo
:root {
--bg: #efe7ff;
--surface: #ffffff;
--surface2: #f7f4ff;
--border: #111827;
--accent: #6d28d9;
--accent-muted: #7c3aed;
--text: #111827;
--muted: #4b5563;
--success: #16a34a;
--warn: #f59e0b;
--maxw: 1180px;
--page-pad: 1rem;
--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 var(--page-pad) 2rem;
width: 100%;
}
.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;
}
/* Single column: model logs → calendar → chat (aligned full width) */
.bottom-grid {
display: flex;
flex-direction: column;
gap: 1rem;
width: 100%;
}
@media (max-width: 900px) {
.bottom-grid {
gap: 0.85rem;
}
}
/* Calendar: main view + bottom composer (like chat / model summary) */
.calendar-panel {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
}
.calendar-body {
padding: 0;
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
.cal-view {
padding: 0.75rem 1rem 0.5rem;
display: flex;
flex-direction: column;
gap: 0.55rem;
flex: 1;
min-height: 0;
}
.cal-nav {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.5rem;
}
.cal-nav-btn {
border: 2px solid var(--border);
background: var(--surface2);
font: inherit;
font-size: 1.1rem;
line-height: 1;
width: 2rem;
height: 2rem;
cursor: pointer;
padding: 0;
}
.cal-month-label {
font-weight: 700;
font-size: 0.9rem;
flex: 1;
text-align: center;
}
.cal-weekdays {
display: grid;
grid-template-columns: repeat(7, 1fr);
font-size: 0.68rem;
color: var(--muted);
text-align: center;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.cal-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 2px;
border: 2px solid var(--border);
background: var(--border);
}
.cal-cell {
min-height: 2.35rem;
border: none;
background: var(--surface);
font: inherit;
font-size: 0.78rem;
padding: 0.2rem;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.1rem;
position: relative;
}
.cal-cell.muted-day {
color: var(--muted);
background: var(--surface2);
}
.cal-cell.selected {
outline: 2px solid var(--accent);
outline-offset: -2px;
z-index: 1;
}
.cal-cell .cal-day-num {
font-weight: 650;
}
.cal-cell .cal-dots {
font-size: 0.62rem;
color: var(--accent-muted);
line-height: 1.1;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cal-detail {
border: 2px solid var(--border);
background: var(--surface2);
padding: 0.5rem 0.55rem;
display: flex;
flex-direction: column;
min-height: 0;
}
.cal-detail-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.35rem;
font-size: 0.82rem;
font-weight: 650;
}
.cal-small-btn {
border: 1px solid var(--border);
background: var(--surface);
font: inherit;
font-size: 0.75rem;
padding: 0.15rem 0.4rem;
cursor: pointer;
}
.cal-day-items {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 0.35rem;
max-height: 16.5rem;
overflow-y: auto;
padding-right: 0.2rem;
}
.cal-day-items li {
border: 1px solid var(--border);
background: var(--surface);
padding: 0.35rem 0.45rem;
font-size: 0.8rem;
line-height: 1.35;
}
.cal-item-title {
display: flex;
align-items: center;
gap: 0.4rem;
font-weight: 650;
}
.cal-status-pill {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 999px;
padding: 0.04rem 0.42rem;
font-size: 0.62rem;
text-transform: lowercase;
letter-spacing: 0.03em;
border: 1px solid var(--border);
background: var(--surface2);
}
.cal-status-pill.done {
border-color: var(--success);
background: color-mix(in srgb, var(--success) 24%, var(--surface));
color: #0b3d1f;
}
.cal-status-pill.open {
border-color: var(--border);
background: var(--surface2);
}
.cal-item-meta {
font-size: 0.72rem;
color: var(--muted);
}
.cal-day-items li.cal-item-selected-day {
border-color: var(--accent);
}
.cal-day-items li.cal-item-today {
border-color: color-mix(in srgb, var(--accent) 48%, var(--border));
}
.cal-item-marker {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 999px;
padding: 0.04rem 0.42rem;
font-size: 0.62rem;
text-transform: lowercase;
letter-spacing: 0.03em;
border: 1px solid var(--border);
background: var(--surface2);
color: var(--muted);
}
.cal-item-marker.selected {
border-color: var(--accent);
}
.cal-item-marker.today {
border-color: color-mix(in srgb, var(--accent) 50%, var(--border));
}
.cal-section-head {
border: none !important;
background: transparent !important;
padding: 0 !important;
margin-top: 0.2rem;
font-size: 0.72rem;
font-weight: 750;
letter-spacing: 0.03em;
text-transform: lowercase;
color: var(--muted);
}
.cal-day-group-head {
border: none !important;
background: transparent !important;
padding: 0 !important;
margin-top: 0.35rem;
font-size: 0.72rem;
font-weight: 700;
color: var(--muted);
}
.cal-day-group-empty {
margin-bottom: 0.12rem;
}
.cal-item-actions {
margin-top: 0.25rem;
display: flex;
flex-wrap: wrap;
gap: 0.25rem;
}
.cal-item-actions button {
font: inherit;
font-size: 0.72rem;
padding: 0.1rem 0.35rem;
cursor: pointer;
border: 1px solid var(--border);
background: var(--surface2);
}
.cal-composer .cal-quick-add-title {
width: 100%;
margin-bottom: 0.35rem;
}
.cal-composer .cal-quick-add-title input[type="text"] {
width: 100%;
border: 2px solid var(--border);
font: inherit;
font-size: 0.82rem;
padding: 0.35rem 0.45rem;
background: var(--bg);
}
.cal-quick-add-row {
display: flex;
flex-wrap: wrap;
align-items: stretch;
gap: 0.5rem;
width: 100%;
}
/* Single when dropdown + add button (same height) */
.cal-when-select {
flex: 1;
min-width: 0;
min-height: 2.5rem;
height: 2.5rem;
border: 2px solid var(--border);
font: inherit;
font-size: 0.82rem;
padding: 0 0.5rem;
background: var(--bg);
color: var(--text);
cursor: pointer;
border-radius: 0;
box-sizing: border-box;
}
.cal-quick-add-row > button[type="submit"] {
flex-shrink: 0;
min-height: 2.5rem;
height: 2.5rem;
box-sizing: border-box;
align-self: stretch;
display: inline-flex;
align-items: center;
justify-content: center;
}
.cal-composer .composer-actions {
margin-top: 0.4rem;
}
.cal-composer-column {
border-top: 2px solid var(--border);
background: var(--surface2);
display: flex;
flex-direction: column;
gap: 0;
flex-shrink: 0;
}
.cal-composer-column > .cal-composer {
border-top: none;
}
.cal-composer-column .cal-pending-wrap {
margin: 0 1rem 0.75rem;
}
.cal-pending-badge {
font-size: 0.72rem;
font-weight: 700;
color: var(--muted);
flex-shrink: 0;
}
.cal-pending-body {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.cal-pending-line {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.35rem 0.5rem;
min-width: 0;
}
.cal-pending-action {
font-size: 0.72rem;
font-weight: 750;
text-transform: lowercase;
letter-spacing: 0.03em;
color: var(--muted);
font-variant-numeric: tabular-nums;
line-height: 1.35;
}
.cal-pending-title-text {
flex: 1 1 8rem;
min-width: 0;
font-size: 0.82rem;
font-weight: 650;
line-height: 1.45;
word-break: break-word;
color: var(--text);
}
.cal-pending-wrap {
border: 2px solid color-mix(in srgb, var(--border) 70%, var(--accent));
background: color-mix(in srgb, var(--accent) 6%, var(--surface));
padding: 0.45rem 0.5rem;
}
.cal-pending-title {
font-size: 0.78rem;
font-weight: 750;
margin-bottom: 0.35rem;
}
.cal-pending-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.cal-pending-list li {
border: 1px solid var(--border);
background: var(--surface);
padding: 0.4rem 0.45rem;
font-size: 0.78rem;
}
.cal-pending-row {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
align-items: flex-start;
justify-content: space-between;
}
.cal-pending-actions {
display: flex;
gap: 0.25rem;
}
.cal-pending-actions button {
font: inherit;
font-size: 0.72rem;
padding: 0.15rem 0.4rem;
cursor: pointer;
border: 1px solid var(--border);
background: var(--surface2);
}
.cal-pending-actions .confirm {
border-color: var(--success);
background: color-mix(in srgb, var(--success) 18%, var(--surface));
}
.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;
flex-wrap: wrap;
padding: 0.75rem 1rem;
border-bottom: 2px solid var(--border);
background: var(--surface2);
}
.panel-head h2 {
margin: 0;
margin-right: auto;
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;
}
.md-content p {
margin: 0.35rem 0;
}
.md-content ul {
margin: 0.35rem 0;
padding-left: 1.15rem;
}
.md-content h2,
.md-content h3,
.md-content h4 {
margin: 0.45rem 0 0.3rem;
line-height: 1.25;
}
.md-content code {
border: 1px solid var(--border);
background: var(--surface);
padding: 0.02rem 0.28rem;
font-size: 0.86em;
}
.md-content .md-table {
width: 100%;
border-collapse: collapse;
margin: 0.4rem 0;
font-size: 0.86rem;
}
.md-content .md-table th,
.md-content .md-table td {
border: 1px solid var(--border);
padding: 0.28rem 0.4rem;
text-align: left;
vertical-align: top;
}
.md-content .md-table th {
background: var(--surface2);
}
.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;
}
.summary-box {
width: 100%;
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;
line-height: 1.45;
white-space: pre-wrap;
word-break: break-word;
overflow-y: auto;
}
.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-actions-buttons {
display: flex;
align-items: center;
gap: 0.5rem;
flex-shrink: 0;
}
.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;
}
.composer button.composer-cancel {
background: var(--surface);
color: var(--text);
border: 2px solid var(--border);
}
.composer button.composer-cancel:not(:disabled):hover {
background: color-mix(in srgb, var(--surface) 85%, var(--accent-muted));
}
.activity-body {
padding: 0;
flex: 1;
display: flex;
flex-direction: column;
gap: 0;
min-height: 0;
}
.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;
}
.scratchpad-body {
padding: 0.75rem 1rem 1rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
min-height: 0;
}
.scratchpad-editor-wrap {
position: relative;
align-self: stretch;
}
.scratchpad-rendered {
display: none;
width: 100%;
min-height: 14rem;
max-height: 32rem;
overflow: auto;
padding: 0.55rem 0.65rem;
padding-bottom: 2.35rem;
border: 2px solid var(--border);
background: var(--surface);
font-size: 0.86rem;
line-height: 1.45;
}
.scratchpad-rendered:not([hidden]) {
display: block;
}
.scratchpad-render-toggle {
position: absolute;
bottom: 0.5rem;
right: 0.5rem;
z-index: 2;
font: inherit;
font-size: 0.75rem;
font-weight: 650;
padding: 0.35rem 0.6rem;
border: 2px solid var(--border);
background: color-mix(in srgb, var(--surface) 94%, var(--accent));
color: var(--text);
cursor: pointer;
box-shadow: 0 1px 2px color-mix(in srgb, var(--border) 25%, transparent);
}
.scratchpad-render-toggle:hover {
background: color-mix(in srgb, var(--accent) 14%, var(--surface));
}
.scratchpad-lede {
margin: 0;
line-height: 1.45;
}
.scratchpad-lede code {
font-size: 0.78rem;
font-weight: 600;
}
.scratchpad-editor {
width: 100%;
min-height: 14rem;
resize: vertical;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 0.82rem;
line-height: 1.45;
padding: 0.55rem 0.65rem;
padding-bottom: 2.35rem;
border: 2px solid var(--border);
background: var(--surface2);
color: var(--text);
}
.scratchpad-status {
margin: 0;
min-height: 1.25rem;
}