* fix: polish stack health table, security card heights, and scanner-gate copy
- Remove state dot column from Stack Health rows; state still signaled
via row tinting and sparkline color
- Reposition Update available badge adjacent to stack name and track
the theme accent (--brand) instead of static fuchsia
- Equalize Top exploit-risk findings and Severity x exploitability
card heights via h-full in a stretching grid
- Add resolution prop to CapabilityGate so scanner-gated tabs show
"Install a scanner from the Scanner setup tab." instead of the
misleading "Upgrade the node" message
* fix: scope Resources scroll area to table contents only
- Remove bg-background from the outer wrapper so search/filter bars
no longer sit on a dark strip
- Replace outer ScrollArea with a plain div so search and filter
controls stay fixed while only table rows scroll
- Add ScrollArea (max-h-[62vh]) inside each table card for Images,
Volumes, and Networks tabs
* fix: remove static bg-background from Security table scroll areas
Images and History tab tables used bg-background on their ScrollArea,
forcing a near-black fill that didn't adapt to the theme. Removing it
lets the parent card's bg-card show through, matching the Resources
table pattern that correctly respects DIM, OLED, and Light modes.
* fix: collapsible search icon and transparent Combobox across Resources and Security
- Replace always-visible search inputs on Resources tabs (Images,
Volumes, Networks) and Security Images (desktop + mobile) with
Fleet-style collapsible search: an icon button that expands to
a full input on click, collapses on blur when empty
- Add [&>button]:!bg-background to Security Images severity
Combobox, matching Fleet's transparent dropdown design
* fix: remove redundant orange badge from Unmanaged tab label
The count was shown twice: once as inline text in the tab and again
as an orange bg-warning pill badge. The inline text remains; the
duplicate badge is removed.
* fix: outline buttons invisible in Light mode
- Changed outline variant border from border-input to border so it
uses --card-border, which maintains a visible 0.035 lightness gap
from --background in Light mode (was 0.005, essentially invisible)
- Boosted Light-mode --button-inner-glow from a 4% white inset to
a 10% inset plus a subtle drop shadow for the physical-key feel
* fix: bump table cell horizontal padding from 8px to density-aware token
Changed TableHead and TableCell px-2 (8px) to px-[var(--density-row-x)]
which resolves to 20px comfortable / 16px compact. Matches the density
system used by StackHealthTable and gives every shadcn-based table
proper breathing room on both edges.
* fix: expand collapsible search before typing in ImagesTab test
The test was written for the old always-visible search input. Now that
the search bar collapses to an icon, click it first to expand before
interacting with the input.
* fix: reorder Settings Infrastructure to Nodes, Stacks, Fleet
Move the Stacks section directly below Nodes so the Infrastructure
sidebar reads Nodes, Stacks, Fleet. Pure array-element relocation in
the settings registry; the sidebar renders in array order.
* fix: simplify pilot enroll command and add Step 2 copy button
Step 2 of the pilot-agent enrollment modal now shows "docker compose up
-d" instead of the redundant "-f compose.yaml" form, since Step 1
already has the operator save the file as the default compose.yaml. Add
an inline copy button next to the command so it can be copied without
selecting the text by hand.
* fix: stack Fleet/Security tab heading actions on mobile
The shared FleetTabHeading kept its title and action buttons on one row
at every width, so on phones the Security Suppressions heading and its
Export VEX / Add suppression buttons were crammed together. Stack the
heading and actions vertically below the md breakpoint and restore the
original row layout at md and up, so desktop is unchanged.
* feat: add node selector to mobile Home masthead
The mobile Home page showed the active node as static text, so switching
nodes was only possible from the Stacks page. Render the same compact
NodeSwitcher in the Home masthead kicker slot, giving a second place to
view and switch the active node with the identical popover and Manage
nodes action.
A batch of UI/UX polish:
- New independent "Reduced motion" appearance setting (separate from Reduced
effects). Drives framer-motion via MotionConfig and clamps CSS transitions via
data-motion on <html>; toasts are unaffected. Defaults off (OS preference
still honored).
- Stack-detail Files tab: rename "Files & Volumes" to "Files", add a persisted
word-wrap toggle to the file viewer (default on), and add a fullscreen toggle
that collapses the Command Center + Logs column so the editor fills the width.
- Create Stack > From Git: remove the nested scroll clamp so the deploy toggle
and footer are reachable.
- Fleet: full-width tab band with icon-only Refresh / Export Dossier, icon-only
Check-for-updates / Add-node on the Overview toolbar, theme-aware empty-state
headings (calm drops the italic), and fix the Actions card body overlapping
the action-row divider.
- Snapshots: restyle Restore and Restore all to the ghost button design used by
View / Preview / Download, and right-align the per-stack Restore.
- Settings sidebar: App Store gradient active style and standard font size.
- Compose Doctor: dismiss the high-risk banner (and clear the tab dot) until the
findings change, via a shared fingerprint-keyed hook.
- Stack-detail Storage: link the "no recent fleet snapshot" warning to the Fleet
Snapshots tab (FleetView tabs are now controlled to support the deep link).
Extract the Secrets tab's header and empty-card markup into shared
primitives (FleetTabHeading, FleetEmptyState, FleetEmptyCard) and adopt
them across Snapshots, Deployments, Routing, Federation, and Secrets so
the Fleet area presents one consistent layout. The empty card sits
vertically centered below a title/subtitle header. Deployments keeps its
onboarding steps inside the shared shell; Federation's sections are
unchanged.