From 6e6f5192189f089ab0978ff8ac2aa4460df86e03 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 17 Jun 2026 05:08:47 -0400 Subject: [PATCH 1/2] Fix responsive dashboard slot list --- ui/src/dash/overhaul.css | 81 +++++++++++++++++++++++++++++++++++++++ ui/src/dash/slot-list.jsx | 48 ++++++++++++----------- 2 files changed, 106 insertions(+), 23 deletions(-) diff --git a/ui/src/dash/overhaul.css b/ui/src/dash/overhaul.css index 7548ce77..9e5f66a3 100644 --- a/ui/src/dash/overhaul.css +++ b/ui/src/dash/overhaul.css @@ -144,6 +144,12 @@ gap: 0 8px; padding: 0 14px; min-height: 0; + min-width: 0; +} + +.sh > *, +.sr > * { + min-width: 0; } /* ── Header row ────────────────────────────────────────────────────────────── */ @@ -224,6 +230,11 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + min-width: 0; +} + +.sl-detail-row { + display: contents; } /* ── Device chips ──────────────────────────────────────────────────────────── */ @@ -295,6 +306,7 @@ align-items: flex-end; gap: 1px; font-family: var(--jbm); + min-width: 0; } .sl-ml { @@ -503,6 +515,75 @@ } } +@media (max-width: 760px) { + .sl-table .sh { + display: none; + } + + .sr { + grid-template-columns: 10px minmax(0, 1fr) 26px; + grid-template-rows: auto auto auto; + gap: 3px 8px; + height: auto; + min-height: 70px; + padding: 8px 10px; + align-items: center; + } + + .sr .sl-dot-cell { + grid-column: 1; + grid-row: 1 / 4; + align-self: start; + padding-top: 4px; + } + + .sr .snm { + grid-column: 2; + grid-row: 1; + max-width: 100%; + } + + .sr .smodel { + grid-column: 2; + grid-row: 2; + max-width: min(100%, 15ch); + line-height: 1.2; + } + + .sr .sl-detail-row { + grid-column: 2; + grid-row: 3; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 4px 10px; + min-width: 0; + } + + .sr .sl-metric { + flex: 0 1 auto; + flex-direction: row; + align-items: baseline; + gap: 3px; + } + + .sr .sl-ml { + font-size: 7.5px; + } + + .sr .sl-mv, + .sr .sl-mv.sl-ctx { + font-size: 10px; + } + + .sr .pinbtn { + grid-column: 3; + grid-row: 1 / 4; + opacity: 1; + align-self: center; + } +} + /* ─── Grid cell ──────────────────────────────────────────────────────────────── */ .dash-cell { position: relative; diff --git a/ui/src/dash/slot-list.jsx b/ui/src/dash/slot-list.jsx index 9ffe12fb..eb62df90 100644 --- a/ui/src/dash/slot-list.jsx +++ b/ui/src/dash/slot-list.jsx @@ -143,33 +143,35 @@ function SlotRow({ s, pinned, onTogglePin }) { {s.model || '—'} - {/* col 4: device chip (auto) */} - - - {/* col 5: mem (58px) */} - - mem - {mem || '—'} - + + {/* col 4: device chip (auto) */} + + + {/* col 5: mem (58px) */} + + mem + {mem || '—'} + - {/* col 6: tok/s (52px) */} - - tok/s - - {toks || '—'} + {/* col 6: tok/s (52px) */} + + tok/s + + {toks || '—'} + - - {/* col 7: ttft (56px) */} - - ttft - {ttft || '—'} - + {/* col 7: ttft (56px) */} + + ttft + {ttft || '—'} + - {/* col 8: ctx (74px) */} - - ctx - {ctx || '—'} + {/* col 8: ctx (74px) */} + + ctx + {ctx || '—'} + {/* col 9: pin (26px) */} From 809605a2adb7e49af5e03711f841f4d36e43ee83 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 17 Jun 2026 07:13:24 -0400 Subject: [PATCH 2/2] Fix dashboard responsive chrome cleanup --- ui/src/dash/board/board.css | 52 +++++ ui/src/dash/chrome.jsx | 142 +----------- ui/src/dash/command-palette.jsx | 2 +- ui/src/dash/connections.css | 92 ++++++++ ui/src/dash/dash-grid.jsx | 17 +- ui/src/dash/dashboard.jsx | 4 +- ui/src/dash/data.jsx | 6 +- ui/src/dash/extras.jsx | 40 ++-- ui/src/dash/main.jsx | 7 - ui/src/dash/memory-overhaul.css | 22 ++ ui/src/dash/overhaul.css | 10 +- ui/src/dashboard.css | 178 ++++++++------- ui/src/main.tsx | 3 - ui/tests/e2e/specs/dashboard-v3.spec.ts | 6 +- ui/tests/e2e/specs/memory-gate-v3.spec.ts | 12 +- .../e2e/specs/sidebar-runtime-widget.spec.ts | 212 ------------------ ui/tests/e2e/specs/system-card-v3.spec.ts | 2 +- ui/tests/e2e/specs/ui-sweep-a-v3.spec.ts | 37 ++- 18 files changed, 323 insertions(+), 521 deletions(-) delete mode 100644 ui/tests/e2e/specs/sidebar-runtime-widget.spec.ts diff --git a/ui/src/dash/board/board.css b/ui/src/dash/board/board.css index df9041d1..c8353276 100644 --- a/ui/src/dash/board/board.css +++ b/ui/src/dash/board/board.css @@ -402,3 +402,55 @@ /* ─── Responsive ─────────────────────────────────────────────────────── */ @media (max-width: 1100px) { .board .lane { width: 270px; } } + +@media (max-width: 720px) { + .board .board-top { + padding: 14px 16px 0; + } + + .board .board-bar { + flex-wrap: wrap; + gap: 10px; + padding: 10px 12px; + } + + .board .board-select { + flex: 1 1 100%; + min-width: 0; + } + + .board .board-select .bs-btn { + width: 100%; + min-width: 0; + } + + .board .board-select .bs-btn .nm { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .board .board-bar .bb-spacer { + flex: 1 1 auto; + } + + .board .filterbar { + gap: 10px; + } + + .board .flt, + .board .flt-search, + .board .flt-search .input { + width: 100%; + } + + .board .flt-actions { + width: 100%; + flex-wrap: wrap; + } + + .board .lanes-scroll { + padding: 4px 16px 0; + } +} diff --git a/ui/src/dash/chrome.jsx b/ui/src/dash/chrome.jsx index 5d71421d..d247d76c 100644 --- a/ui/src/dash/chrome.jsx +++ b/ui/src/dash/chrome.jsx @@ -6,13 +6,11 @@ import { useRuntimeRollup, useHealthSystem, failingChecks } from '@/api/hooks/useRuntime' import { useLogsStream } from '@/api/hooks/useLogs' -import { useSlots, useEndpoints } from '@/api/hooks/useSlots' +import { useSlots } from '@/api/hooks/useSlots' import { useModels } from '@/api/hooks/useModels' import { useMemoryEnabled } from '@/api/hooks/useMemory' import { useUpdateState } from '@/api/hooks/useUpdates' -import { useSidebarAgentRollup, useApprovalList, useApproveApproval, useDenyApproval } from '@/api/hooks/useAgents' -import { useConfigUrls } from '@/api/hooks/useConfigUrls' -import { useHardware } from '@/api/hooks/useHardware' +import { useApprovalList, useApproveApproval, useDenyApproval } from '@/api/hooks/useAgents' import { useServicesHealth } from '@/api/hooks/useServicesHealth' const { useState: useStateC, useEffect: useEffectC } = React; @@ -137,12 +135,7 @@ const Icons = { }; // ─── TopBar ─── -function TopBar({ route, hostUptime = "14d 02:11", onBell, onCmdK, onMenu, menuOpen = false, approvals = 0 }) { - // Issue #333: hostname from live /api/hardware (useHardware hook) instead of - // the legacy HAL0_DATA seed. Fall back to a neutral "hal0" placeholder - // while the first response is in flight so the layout stays stable. - const hw = useHardware(); - const hostName = hw.data?.name || "hal0"; +function TopBar({ route, onCmdK, onMenu, menuOpen = false }) { // Brand-bar version badge — live from /api/updates/state (hal0.current, // sourced from hal0.__version__) so it never goes stale; the static fallback // keeps it correct before the first response lands. @@ -186,18 +179,9 @@ function TopBar({ route, hostUptime = "14d 02:11", onBell, onCmdK, onMenu, menuO ⌘B -
- - {hostName} - · up {hostUptime} -
- {/* Mobile-only nav launcher (hidden ≤720px sidebar is gone) → opens NavDrawer. */}
{items.map(it => ( @@ -842,7 +715,6 @@ function NavDrawer({ open, route, param, onGo, onClose, onCmdK }) { ))}
- )} diff --git a/ui/src/dash/command-palette.jsx b/ui/src/dash/command-palette.jsx index cdbd3a36..6c0bfa8a 100644 --- a/ui/src/dash/command-palette.jsx +++ b/ui/src/dash/command-palette.jsx @@ -147,7 +147,7 @@ function CommandPaletteInner({ onClose }) { return (
{ if (e.target.classList.contains("cp-backdrop")) onClose(); }}> -
+
{Icons.search} "). Prefer the live stats node, fall back to the - // HAL0_DATA seed host name so the hero never shows a bare "on ". - const hostName = - hw?.host?.node || - (typeof window !== 'undefined' && window.HAL0_DATA?.host?.name) || - null; - // Reconcile raw layout with live slots const rawLayout = layoutQuery.data; const layout = useMemo(() => { @@ -630,16 +622,9 @@ function DashboardOverhaulView({ editing: editingProp, onToggleEdit }) { // padding from the app shell); every route view uses it. Keep it so the // overhaul board inherits the same chrome as the old DashboardView.
- {/* Hero strip — handoff copy: "Welcome back, halo. system steady on - ". `hero-strip` class kept alongside `dash-hero` so shell + - existing hero specs still target it. */}
- - Welcome back, halo. system steady{hostName ? ` on ` : ''} - {hostName ? {hostName} : ''} - - {heroMeta} +