Skip to content

Show Version details in a right-side drawer - #4025

Draft
rossnelson wants to merge 10 commits into
rossnelson/multi-region-computefrom
rossnelson/version-drawer
Draft

rossnelson wants to merge 10 commits into
rossnelson/multi-region-computefrom
rossnelson/version-drawer

Conversation

@rossnelson

@rossnelson rossnelson commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Stacked on #4020.

CleanShot 2026-10-12 at 17 21 05

What

Worker Deployment Version details move from an inline row expansion to a 560px right-side drawer.

  • Open: click the Build ID, or View Details in the row menu. The open Version is in ?version=<buildId>, so you can link to it. Back, Escape, the close button, and an outside click close it.
  • Layout: the header (Build ID, status, Deployment) is pinned to the top. Edit, View Workflows, and More sit in a pinned bottom bar. Only the body scrolls. The page behind the drawer is dimmed.
  • Lifecycle: the timestamps that fit the status. A current Version shows how long it has been live. A draining Version shows when drainage was last checked. Other timestamps are under More Timestamps.
  • Compute Config: one block per region. On a Namespace with a replica, the primary and the replica are cards. The replica collapses Access and Scaling to "Same as us-east-1 · Primary" when they match. It tags the fields that differ. When no replica is configured, it shows a warning.
  • Task Queues: name, type, backlog count, and oldest task age. The stats come from a second request with reportTaskQueueStats, so a slow stats call does not hold up the drawer.
  • Metadata (collapsed) and Last modified by, when set.

Why

The inline row could not fit two long ARNs. It also inherited the outer table's cell styles, and it had no room for lifecycle, task queue, or metadata data.

Notes

  • Actions: the row's confirm modals move into a VersionActions component. The drawer renders its own copy inside itself. The drawer makes the rest of the page inert, so modals rendered outside it would be unreachable.
  • Shared drawer (drawer.svelte):
    • role="dialog", aria-modal, and an aria-labelledby prop
    • Escape closes it, unless a dialog or menu inside it is open
    • the close button's fixed aria-controls is removed
    • an opt-in backdrop prop that dims the page; a click on it closes the drawer
    • focusTrap starts focus on a [data-autofocus] element when the trap has one
  • Removed: the row chevron, version-row-details.svelte, version-compute-details.svelte, and the unused version-details.svelte.

Testing

  • pnpm check: clean apart from the existing catalog errors
  • pnpm lint: 0 errors
  • New unit tests in version-details.test.ts cover the href, the lifecycle rows, the region blocks, the replica comparison, and the metadata decoding.
  • Reviewed in the browser against a local server with an HA Namespace.

@vercel

vercel Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
holocene Ready Ready Preview Oct 19, 2026 1:43pm UTC

Request Review

The inline row expansion could not fit two long ARNs, inherited the outer
table's styles, and had no room for lifecycle or task queue data. Open a
560px drawer instead, from the Build ID link or "View Details" in the row
menu. The open Version lives in ?version=<buildId>, so the drawer can be
linked, and Back closes it.

The drawer pins the Version header to the top and the actions to a bottom
bar. The body scrolls and shows:
- Lifecycle: the timestamps that fit the Version's status, with the rest
  under "More Timestamps".
- Compute Config: one block per region. On a Namespace with a replica, the
  primary and replica are cards. The replica collapses Access and Scaling
  to "Same as <primary>" when they match, tags fields that differ, and
  warns when no replica is configured.
- Task Queues: names and types, with backlog count and age from a second
  request that asks for task queue stats.
- Metadata and the last modifier, when set.

The row's confirm modals move into a VersionActions component. The drawer
renders its own copy inside itself, so the modals stay reachable while
the page behind the drawer is inert.

The shared drawer now has dialog semantics, a label, and Escape to close,
and focus can start on a [data-autofocus] element such as a heading.

Remove the row chevron, the inline details, and the unused
version-details.svelte.
The drawer is a focused task, like a modal, so it uses the modal's
blurred backdrop. The backdrop is opt-in on the shared drawer, and a
click on it closes the drawer.
The blur hid too much. A dim alone still shows the page is inert.
The slide-in and the backdrop fade drop to 0ms when the user prefers
reduced motion.
Render the drawer in each state: multi-region with a replica that
inherits, is customized, or is missing; single region while ramping;
self-managed Workers; loading; not found; and a load error. The stories
mock the page URL and stub the version endpoint.
Keep each ARN on one line. The full value shows on hover, and the copy
button copies all of it.
Put ARNs, the service account, and the external ID in the same
two-column grid as the other fields. A narrow column cuts the middle of
an identifier, so the region and the resource name stay visible. The
full value shows on hover, and the copy button copies all of it.
The copy button is taller than a line of text, so rows with an
identifier grew and their labels sat high. Fix the row height to one
line and let the button center on it.
jsdom has no matchMedia, and Svelte's prefersReducedMotion reads it when
the drawer loads, so every test that rendered the drawer failed.

This branch was successfully deployed

1 active deployment
Preview — a55c716d Deployed Oct 19, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant