* feat(mobile): masthead-led dashboard and 5-tab bottom nav on phones
On phones (below the md breakpoint) the dashboard now renders a bespoke,
masthead-led layout instead of the reflowed desktop workspace:
- A status masthead leads with the overall system-health verdict, the node,
and a live summary (stack counts, last sync, a "metrics stale" marker when
polling stops).
- A CPU hero card with a sparkline, then a memory / disk / network strip with
threshold-colored bars, then a tappable stack-health list.
- The bottom tab bar gains a Home tab (Home / Stacks / Fleet / Sched /
Settings); the global top bar is dropped on this screen, with notifications
and a "more" menu rehomed into the masthead.
The health-verdict logic is extracted into a shared helper so the phone
masthead and the desktop health bar read from one source, with unit tests.
All changes are scoped below the md breakpoint or rendered only on the mobile
shell; desktop layout is unchanged (verified against the desktop snapshot gate).
* feat(mobile): bespoke fleet glance and node detail on phones
On phones (below the md breakpoint) the Fleet view now renders a bespoke,
masthead-led layout instead of the reflowed desktop workspace:
- A fleet masthead leads with the overall fleet-health verdict and a running /
cpu / mem summary band, then a list of node cards. The local node is marked
with a cyan rail and a "you are here" tag; offline nodes are dimmed.
- Tapping a node opens a full-screen node detail: state pill, resource bars
(cpu / mem / disk), the stacks running on that node, and an Inspect action
that switches to the node. Operators with the right permissions also get a
Drain (cordon) action.
- The screen polls the fleet overview every 30 seconds; the global top bar is
dropped here, with notifications and a "more" menu in the masthead.
All changes are scoped below the md breakpoint or rendered only on the mobile
shell; desktop layout is unchanged.
* feat(mobile): bespoke schedules and settings screens on phones
On phones (below the md breakpoint) Schedules and Settings now render bespoke,
masthead-led layouts instead of the reflowed desktop workspace:
- Schedules: a "next up" glance leading with the next run time and countdown,
then upcoming runs grouped by day with a per-action status dot and target.
It is read-only on mobile; creating and editing schedules stays on desktop.
- Settings: a grouped-card list of every reachable section; tapping one opens
it full-screen with a back affordance and a section masthead. The section
content itself is the same as on desktop.
The settings section switch, lazy-loaded section chunks, and tier gating are
moved into a shared component so the desktop and mobile screens render the same
section content from one place. The global top bar is dropped on both screens,
with notifications and a "more" menu in the masthead.
All changes are scoped below the md breakpoint or rendered only on the mobile
shell; desktop layout is unchanged.
* fix(mobile): show notifications and more-menu on the stack detail header
The full-screen stack detail on phones drops the global top bar, but its
header was missing the notifications bell and the "more" navigation menu that
the other mobile screens carry in their masthead, leaving no way to reach
notifications or other destinations while viewing a stack. Render the same
header-actions cluster in the detail header (and the loading placeholder),
next to the back affordance. Desktop is unaffected.
* feat(ui): make the core stack flow usable on mobile
Below the md breakpoint the app collapses to a single full-width column:
the stack list is full-screen, tapping a stack opens a full-screen detail
with a Health / Logs / Compose segmented control (Logs first) and a back
button, and a bottom tab bar switches Stacks, Fleet, Schedules, and
Settings. Compose is read-only on a phone with a prompt to edit on desktop.
Desktop (md and up) is unchanged: the mobile shell is gated behind a
useIsMobile hook plus max-md/md variants, and the stack-detail blocks are
shared with the desktop two-pane view so it renders identically.
Also generalizes the unsaved-changes guard so leaving a dirty editor (back,
tab bar, hamburger) prompts before discarding; adds 44px touch targets on
list rows, filter chips, and actions; makes log and shell modals full-screen
on mobile; and offsets toasts and the deploy pill above the bottom tab bar.
* fix(ui): keep mobile nav in sync when opening views from outside the bottom bar
On a phone the sidebar activity actions, the node switcher's Manage Nodes, the
profile Settings entry, and the dashboard configuration links set the active
view without flipping the mobile surface to content, so the user stayed on the
stack list and never saw the destination. Route these through the mobile-aware
navigation and settings helpers (a no-op on desktop).