Status LEDs, image model selection, backup restore, provider test, monthly versions
- Sidebar: three status LEDs (server, models, MCP) with an overview popover (/api/status) - Images: preview stage, purpose-based model choice and reference images (Nano Banana Pro edit refines the chosen preview) - Settings: restore a stored or uploaded backup (staged, applied on restart) - Provider form: test connection; saving or reloading re-checks the status at once - opencode Zen/Go: send x-opencode-session with a stable id per conversation - Releases are named vYYYYMM-NNNNN; scripts/release.sh numbers, tags, builds and publishes - Fix: backups made in the same second no longer overwrite each other Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
49d404eec7
commit
1f69d63b09
35 files changed
+1156
-88
No files matched your search
+117
-7
@@ -132,14 +132,120 @@ textarea:focus {
|
||||
height: 22px;
|
||||
}
|
||||
|
||||
.conn-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
background: var(--red);
|
||||
/* --- status LEDs (sidebar) ------------------------------------------------------ */
|
||||
/* Theme hues, pushed to a vivid chroma and a readable lightness so the state is
|
||||
obvious in every theme; warn takes the red's lightness/chroma at an amber hue. */
|
||||
:root {
|
||||
--led-ok: #22c55e;
|
||||
--led-warn: #f5a700;
|
||||
--led-err: #ef4444;
|
||||
}
|
||||
.conn-dot.on {
|
||||
background: var(--green);
|
||||
@supports (color: oklch(from red l c h)) {
|
||||
:root {
|
||||
--led-ok: oklch(from var(--green) clamp(0.7, l, 0.8) max(c, 0.2) clamp(138, h, 158));
|
||||
--led-warn: oklch(from var(--red) clamp(0.78, l, 0.85) max(c, 0.17) 75);
|
||||
--led-err: oklch(from var(--red) clamp(0.6, l, 0.7) max(c, 0.21) h);
|
||||
}
|
||||
}
|
||||
.status-leds {
|
||||
position: relative;
|
||||
}
|
||||
.status-leds-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
padding: 5px 7px;
|
||||
border-radius: 999px;
|
||||
background: var(--bg2);
|
||||
}
|
||||
.led {
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
border-radius: 50%;
|
||||
flex: none;
|
||||
display: inline-block;
|
||||
}
|
||||
.led-ok {
|
||||
background: var(--led-ok);
|
||||
box-shadow: 0 0 6px color-mix(in srgb, var(--led-ok) 70%, transparent);
|
||||
}
|
||||
.led-warn {
|
||||
background: var(--led-warn);
|
||||
box-shadow: 0 0 6px color-mix(in srgb, var(--led-warn) 70%, transparent);
|
||||
}
|
||||
.led-err {
|
||||
background: var(--led-err);
|
||||
box-shadow: 0 0 7px color-mix(in srgb, var(--led-err) 80%, transparent);
|
||||
}
|
||||
.status-leds-btn .led-err {
|
||||
animation: led-blink 1.6s ease-in-out infinite;
|
||||
}
|
||||
.led-off {
|
||||
background: transparent;
|
||||
box-shadow: inset 0 0 0 1.5px var(--muted);
|
||||
}
|
||||
@keyframes led-blink {
|
||||
50% {
|
||||
opacity: 0.45;
|
||||
}
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.status-leds-btn .led-err {
|
||||
animation: none;
|
||||
}
|
||||
}
|
||||
.status-pop {
|
||||
position: fixed;
|
||||
z-index: 40;
|
||||
width: min(320px, calc(100vw - 24px));
|
||||
background: var(--bg1);
|
||||
border: 1px solid var(--bg3);
|
||||
border-radius: var(--radius);
|
||||
box-shadow: var(--shadow);
|
||||
padding: 6px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.status-section + .status-section {
|
||||
border-top: 1px solid var(--bg3);
|
||||
margin-top: 4px;
|
||||
padding-top: 4px;
|
||||
}
|
||||
.status-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 6px 8px 4px;
|
||||
font-weight: 600;
|
||||
color: var(--fg0);
|
||||
}
|
||||
.status-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 4px 8px 4px 25px;
|
||||
color: var(--fg1);
|
||||
}
|
||||
.status-row .led {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
.status-row .grow {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.status-row .hint {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.status-foot {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
border-top: 1px solid var(--bg3);
|
||||
margin-top: 4px;
|
||||
padding: 6px 4px 2px;
|
||||
}
|
||||
|
||||
.session-list {
|
||||
@@ -3413,6 +3519,10 @@ button.danger-solid {
|
||||
.backup-file .grow {
|
||||
flex: 1;
|
||||
}
|
||||
.backup-file button,
|
||||
.backup-file .button {
|
||||
padding: 2px 6px;
|
||||
}
|
||||
|
||||
/* --- automation templates ------------------------------------------------------ */
|
||||
.job-tpl {
|
||||
|
||||
Reference in new issue
Block a user