Skip to content

Run Inspector UI refresh: chart interaction, accessibility, and layout fixes - #139

Merged
kateebonner merged 1 commit into
mainfrom
kate/inspector-ui-refresh
Jul 15, 2026
Merged

kateebonner merged 1 commit into
mainfrom
kate/inspector-ui-refresh

Conversation

@kateebonner

@kateebonner kateebonner commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

What

A ui-ux-pro-audit-driven refresh of the Run Inspector webview, building on the #117 redesign. Webview-only (media/ui + brand.css tokens): no protocol changes, the .pane/.pill router contract is untouched, and the device inspector (which shares these atoms) inherits the fixes.

Pulse plot gets its missing interaction layer (overlay mode)

  • Crosshair readout — hovering snaps a hairline to the nearest rendered knot and a compact strip pinned to the plot's top edge lists every drive's value at that time (you never have to hit a 2px line). Arrow keys / Home / End / Escape drive the same readout from the keyboard; the strip flips sides so it stays out of the crosshair's half. Live-refreshes as new pulse records stream in.
  • Interactive legend — legend keys are now buttons: hover/focus emphasizes that drive (others fade), click toggles it down to a trace opacity. Toggling never removes: the scale, the legend, and every drive's color assignment hold still (dataviz: color follows the entity).

Layout fix (pre-existing #117 bug)

The overlay's holder was an anonymous div — not a flex item — so the plot region collapsed to the SVG's intrinsic ~62px no matter how tall the panel was (small-multiples mode already flexed correctly). The plot now spends the panel's height: insp-body grows on tall panels but never shrinks below content, so short panels scroll the pane instead of painting the metrics rail underneath the footer.

Accessibility (there were no focus rings anywhere)

  • :focus-visible rings (--vscode-focusBorder) on control buttons, legend keys, and the plot
  • Status pill announces run-state changes (role="status"); control buttons get glyph-free aria-labels; plot carries a live aria-label; readout is aria-live="polite"
  • prefers-reduced-motion now gates the running-dot pulse and all new animation/transitions

Styles

  • Status pills wear a 10% tint of their state color — state presence without color-only meaning (text + border still carry it)
  • Fidelity hero grows (--text-hero 1.3em → 1.55em, tabular figures) and its card lights up with a faint accent wash the moment the number lands; pending metrics (the "–" placeholder) recede to dim ink until then
  • Buttons get hover (accent 8% wash) and press (16%) feedback with a 150ms transition; legend keys get a hover wash
  • Theme-native scrollbars (VS Code slider tokens) replace the default web-page scrollbar

Polish

  • The objective card no longer carries the convergence sparkline (design call: the metric doesn't need the objective plotted beside it); the component + its test stay in the library
  • Empty state is a centered composition (Amico mark + label + hint) instead of a bare sentence in the top-left corner
  • Warming state breathes its hint gently (reduced-motion gated)

Verification

  • tsc --noEmit clean; pnpm -r build clean; all 570 tests pass (inspector router + contract + device inspector untouched)
  • Headless harness mounted the real view against the real message protocol and screenshotted dark + light at 300px and 520px panel heights: readout values verified against the generated drives, toggle/emphasis opacities probed (1 / 0.25 / 0.12), converged/warming/empty states exercised in both themes
  • Reviewed live in the installed extension (VSIX built from this branch + local opencode vendor)

🤖 Generated with Claude Code

@kateebonner
kateebonner force-pushed the kate/inspector-ui-refresh branch from 2a7125b to 6931d61 Compare July 15, 2026 00:15
…e Run Inspector

Pulse plot (overlay mode) gains its missing interaction layer:
- crosshair readout — hover snaps to the nearest rendered knot; a compact
  strip pinned to the plot's top edge lists every drive's value at that
  time (arrow keys / Home / End / Escape give the same readout from the
  keyboard; the strip flips sides so it never covers the crosshair)
- interactive legend — keys are now buttons: hover/focus emphasizes that
  drive, click toggles it to a trace opacity (never removed: scale,
  legend, and color assignments hold still)
- layout fix: the overlay holder was an anonymous div, not a flex item,
  so the plot region collapsed to the SVG's intrinsic ~62px regardless
  of panel height (pp-multi already flexed). The plot now spends a tall
  panel's height; .insp-body grows but never shrinks below content, so
  short panels scroll instead of painting the rail under the footer.

Accessibility (ui-ux-pro audit):
- :focus-visible rings (--vscode-focusBorder) on buttons, legend keys,
  and the plot; there were none anywhere
- the status pill announces state changes (role=status); control buttons
  get glyph-free aria-labels; the plot carries a live aria-label; the
  readout is aria-live=polite
- prefers-reduced-motion now gates the running-dot pulse and all new
  animation and transitions

Styles:
- status pills wear a 10% tint of their state color (state presence
  without color-only meaning — text + border still carry it)
- the fidelity hero grows (--text-hero 1.3em → 1.55em, tabular figures)
  and its card lights up with a faint accent wash once the number lands;
  pending metrics (the “–” placeholder) recede to dim ink until then
- buttons get hover (accent 8% wash) and press (16%) feedback with a
  150ms transition; legend keys get a hover wash
- theme-native scrollbars (VS Code slider tokens) replace the default
  web-page scrollbar

Polish:
- the objective card no longer carries the convergence sparkline (Kate:
  the metric doesn't need the objective plotted with it) — the component
  stays in the library, the inspector just stops mounting it
- empty state is a centered composition (Amico mark + label + hint)
  instead of a bare sentence in the corner
- warming state breathes its hint gently

Webview-only (media/ui + brand.css tokens): no protocol changes; the
.pane/.pill router contract holds and the full suite (570) is green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner force-pushed the kate/inspector-ui-refresh branch from 6931d61 to 0aedf5b Compare July 15, 2026 00:38
@kateebonner
kateebonner merged commit acfc21d into main Jul 15, 2026
5 checks passed
@kateebonner
kateebonner deleted the kate/inspector-ui-refresh branch July 15, 2026 01:00
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.

1 participant