Skip to content

feat(shell): ambient in-progress indicator (accent chase bar)#111

Merged
stuffbucket merged 1 commit into
mainfrom
feat/busybar-progress-indicator
Jun 11, 2026
Merged

feat(shell): ambient in-progress indicator (accent chase bar)#111
stuffbucket merged 1 commit into
mainfrom
feat/busybar-progress-indicator

Conversation

@stuffbucket

Copy link
Copy Markdown
Owner

Addresses the second half of your feedback — "no indication that anything is in progress." A subtle accent line that chases across the top of the window while a transient operation runs (sign-in, gh-reuse, sign-out, sidecar restart). Designed by a fan-out: a design subagent produced the spec from .design-context.md + the design-* skills; this implements it.

What

  • .busybar (first child of <body>): position:fixed, 2px (--border-width-thick), an accent-gradient segment that chases via transform only (60fps, no layout). Shown by data-busy on <html>. z-index:10 (sticky-header tier), pointer-events:none. Sits below the native macOS titlebar (no in-window drag region to avoid).
  • Reduced motion (Principle 5): an explicit override — under prefers-reduced-motion: reduce the chase is replaced by a static full-width accent fill at 0.55 opacity. (Without it, the global reduce guard would clamp the animation and freeze the segment at its off-screen keyframe = invisible.)
  • setBusy(on, label) — ref-counted so overlapping ops compose; an sr-only role=status announces once.
  • Wiring: useGhAccount (the stuck-sign-in case — bar runs through the whole import + reboot poll) and signOut (stays up across the reboot via waitForSidecarBack until the sidecar responds again).

Scope

Settings window only (where sign-in/out/switch happen). The dashboard mirror (the spec covers it) is a small follow-up.

Validation

Shell tsc clean. A Playwright+vision verification of the rendered bar (chase + the reduced-motion static variant) is running; I'll confirm. The real-app integration (bar during an actual restart) carries the usual macOS-no-WebDriver caveat.

Pairs with #110 (guard timers): together, an in-progress op is now both visible and bounded.

Addresses 'no indication anything is in progress.' A thin accent line that
chases across the top of the window while a transient op runs — built to a
design-subagent spec from .design-context.md + the design-* skills.

- .busybar element (first child of body) + CSS: fixed 2px (--border-width-thick)
  accent gradient segment, transform-only chase (60fps), shown via data-busy
  on <html>. Reduced-motion: explicit override to a STATIC accent fill at 0.55
  opacity (the global reduce guard would otherwise freeze the segment
  off-screen = invisible) — Principle 5.
- Ref-counted setBusy(on,label) so overlapping ops compose; sr-only role=status
  announces once. Wired into useGhAccount (the stuck-sign-in case) and signOut
  (stays up across the reboot via waitForSidecarBack until the sidecar returns).

Scoped to the settings window (where sign-in/out/switch live); dashboard mirror
is a follow-up. shell tsc clean.
@stuffbucket stuffbucket merged commit dc0dcf0 into main Jun 11, 2026
4 checks passed
@stuffbucket stuffbucket deleted the feat/busybar-progress-indicator branch June 11, 2026 02:43
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