Skip to content

feat(dashboard): cockpit chrome — drop Graze layout, slim sticky header#9

Merged
OriginalGary merged 1 commit intofeat/gary-cockpit-experimentfrom
feat/cockpit-chrome
May 8, 2026
Merged

feat(dashboard): cockpit chrome — drop Graze layout, slim sticky header#9
OriginalGary merged 1 commit intofeat/gary-cockpit-experimentfrom
feat/cockpit-chrome

Conversation

@OriginalGary
Copy link
Copy Markdown
Owner

Single biggest visual change. The cockpit no longer wraps in Graze's full DashboardLayout — sidebar (Home / Endpoints / API Manager / etc.), breadcrumb, and redundant page H1 are all gone.

Replaces all of that with one sticky 56px row:

  • status dot + gary cockpit wordmark
  • tabs: Inbox / Calibration / Activity (active tab gets a background fill, not a 2px underline)
  • Inbox tab badge with combined gate + send count
  • match-rate pill (color-toned at 75% / 50% thresholds)
  • last-refresh indicator ticking each second; tints amber and shows 'offline' if upstream unreachable

Adds /api/operator/status — one round-trip per 5s poll instead of three separate calls.

Removes FrequencyStrip and OperatorNav (replaced by the header). Frequency-telemetry data still lives on /calibration where it's the page subject; it was duplicating the match-rate chip on every other surface.

Drops the redundant page-level <header> + <h1> on each operator route since the active tab already names the surface.

Before / After

Before: ~300px of Graze sidebar on the left, top bar with breadcrumb + lang switcher + theme + logout, second row of redundant tabs, third row of frequency strip, then page <h1>. ~5 gate cards above the fold on 1440×900.

After: one 56px header. ~9 gate cards above the fold on 1440×900.

Test plan

  • OPERATOR_BUILD=true npm run dev. Live verified: /approvals=200, /calibration=200, /activity=200, /api/operator/status=200.
  • Header renders with status dot, tabs, Inbox count badge (24), match pill (41%), refresh indicator. Confirmed via Playwright snapshot.
  • Hot-reload still works.
  • Status pill flips to amber + 'offline' when gary-ui is down.

What's NOT in this PR

The (operator) route group no longer wraps in DashboardLayout. The
Graze admin sidebar (Home / Endpoints / API Manager / Providers / etc.)
and the top bar (lang switcher, theme toggle, breadcrumbs) are
irrelevant to running the operator's day and were stealing attention
from the actual decision surface.

Replaces all of that with one sticky 56px row:
  - status dot + 'gary cockpit' wordmark
  - tabs: Inbox / Calibration / Activity, with active background fill
  - Inbox tab badge showing combined gate + send count
  - match-rate pill (color-toned at 75% / 50% thresholds)
  - last-refresh indicator that ticks each second

Status pulled from new /api/operator/status — one round-trip per 5s
poll instead of three separate calls. Header tints amber and shows
'offline' label if the upstream gary-ui is unreachable.

Drops the redundant page-level <header> + <h1> on each operator route
since the active tab already names the surface. Renames Approvals to
Inbox in the cockpit (more cockpit-y; Calibration and Activity stay).

Removes FrequencyStrip and OperatorNav components (replaced by the
header). The frequency telemetry data lives entirely on /calibration
where it's the page subject — the strip was duplicating the match-rate
chip on every other surface.

Effect: gate cards visible above the fold went from 5 to 9. Cockpit
no longer reads as a guest page in someone else's app.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants