From 20b29d99900fe9ec7526cec8b4a5b4c51e2ecc67 Mon Sep 17 00:00:00 2001 From: Audiobuzz Date: Sat, 4 Jul 2026 06:05:29 +0000 Subject: [PATCH] fleet-manager ui: readability + reboot-now MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Contrast: lighten the muted/faint text tokens (AA on the hull panels) and make Monitor host-card data values bright ink against dim faint labels, so version/ tmpfs/seen details read clearly on the blue-grey panels (was grey-on-grey). - Lifecycle: reboot selector now offers none | now | at... — 'now' sets reboot_at to the current time (agent reboots on reconcile); still confirm-gated as a high-consequence action. --- serving/fleet-manager/ui/src/app.css | 8 ++--- .../ui/src/pages/Lifecycle.svelte | 29 +++++++++++++------ .../fleet-manager/ui/src/pages/Monitor.svelte | 8 ++--- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/serving/fleet-manager/ui/src/app.css b/serving/fleet-manager/ui/src/app.css index 0c12262..7c6979d 100644 --- a/serving/fleet-manager/ui/src/app.css +++ b/serving/fleet-manager/ui/src/app.css @@ -27,10 +27,10 @@ --color-red: #FF3B2F; /* alert / out-of-range */ --color-amber-hot: #FF8A3D; /* caution band */ - /* text */ - --color-ink: #E9EEF6; /* primary text (warm off-white) */ - --color-muted: #7E8DA3; /* secondary text, labels */ - --color-faint: #46566E; /* tertiary, timestamps, meta */ + /* text — tuned for legibility on the dark hull panels (AA on hull2) */ + --color-ink: #EAF1F9; /* primary text (warm off-white) */ + --color-muted: #AEC0D6; /* secondary text / data values — clearly readable */ + --color-faint: #7688A2; /* tertiary labels, timestamps, meta */ /* hairlines */ --color-line: #223146; /* structural */ diff --git a/serving/fleet-manager/ui/src/pages/Lifecycle.svelte b/serving/fleet-manager/ui/src/pages/Lifecycle.svelte index 6b3100a..8675db4 100644 --- a/serving/fleet-manager/ui/src/pages/Lifecycle.svelte +++ b/serving/fleet-manager/ui/src/pages/Lifecycle.svelte @@ -10,6 +10,7 @@ let selected = $state(null) let busy = $state(false) let confirmOpen = $state(false) + let rebootMode = $state('none') // none | now | at let form = $state({ target_version: '', kiosk_url: '', reboot_at: '', drain: false }) async function load() { @@ -24,6 +25,7 @@ function pick(h) { selected = h okMsg = '' + rebootMode = 'none' form = { target_version: h.desired?.target_version || '', kiosk_url: h.desired?.kiosk_url || '', @@ -31,9 +33,8 @@ drain: !!h.desired?.drain, } } - let consequence = $derived( - [form.drain ? 'DRAIN this host' : null, form.reboot_at ? 'schedule a REBOOT' : null].filter(Boolean).join(' and ') - ) + let rebootConseq = $derived(rebootMode === 'now' ? 'REBOOT it NOW' : rebootMode === 'at' && form.reboot_at ? 'schedule a REBOOT' : null) + let consequence = $derived([form.drain ? 'DRAIN this host' : null, rebootConseq].filter(Boolean).join(' and ')) async function apply() { confirmOpen = false busy = true @@ -44,7 +45,8 @@ kiosk_url: form.kiosk_url || undefined, drain: form.drain, } - if (form.reboot_at) body.reboot_at = new Date(form.reboot_at).toISOString() + if (rebootMode === 'now') body.reboot_at = new Date().toISOString() + else if (rebootMode === 'at' && form.reboot_at) body.reboot_at = new Date(form.reboot_at).toISOString() try { const res = await api.put(`/api/hosts/${selected.identity.cert_serial}/desired`, body) okMsg = res.pushed_live ? 'applied — pushed to the live host' : 'applied — host reconciles on next connect' @@ -58,7 +60,7 @@ } function submit() { // Gate destructive changes behind a confirm; a plain version/URL change applies directly. - if (form.drain || form.reboot_at) confirmOpen = true + if (form.drain || rebootMode === 'now' || (rebootMode === 'at' && form.reboot_at)) confirmOpen = true else apply() } $effect(() => { @@ -94,10 +96,19 @@ kiosk url - +
+ reboot +
+ + {#if rebootMode === 'at'} + + {/if} +
+