Make runs table rows real links for middle-click + a11y (BEN-46)#50
Merged
benSepanski merged 1 commit intomainfrom May 4, 2026
Merged
Make runs table rows real links for middle-click + a11y (BEN-46)#50benSepanski merged 1 commit intomainfrom
benSepanski merged 1 commit intomainfrom
Conversation
…-46) The dashboard runs table previously used a <tr role="link"> + onClick + onKeyDown shim. Tab + Enter worked, but middle-click / Cmd-click / right "open in new tab" did not — the row wasn't a real link. Replace the <table> with a CSS-grid-styled <ul> of one <a href="#/runs/<id>"> per row, matching the ErrorFeed and Search pattern. Each row is a single, genuine anchor: keyboard nav, screen-reader semantics, and the native new-tab affordances all come for free.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Context
BEN-46: the dashboard runs table used
<tr role="link"> + onClick + onKeyDown(added in BEN-42). Tab + Enter worked, but middle-click / Cmd-click / right-click "open in new tab" didn't — the row wasn't a real link. The ticket strongly preferred wrapping each row in an actual<a href>(the ErrorFeed pattern).TL;DR
Replace the
<table>with a CSS-grid-styled<ul>of one<a href="#/runs/<id>">per row, so middle-click / Cmd-click open a new tab and keyboard nav comes from the native anchor.Summary
src/web/Dashboard.tsx::RunsTable— drop the<table>/<tr role="link">shim and the manualonClick+onKeyDown. Each row is now a single<a href="#/runs/${r.id}">laid out withgrid grid-cols-[6rem_minmax(0,1fr)_5rem_8rem_4rem_5rem_5rem_minmax(8rem,max-content)_minmax(8rem,max-content)].<div>mirroring the samegrid-cols-[…]template so columns line up with rows.aria-label="Open run BEN-46: <title>"; focus ring (focus-visible:ring-2 ring-cyan-500) and hover background match BEN-42 styling.ErrorFeed/SearchResultspatterns (<ul>of<a>); no behavior change for callers, no API change.Demo
n/a — this CI environment has no browser to capture a screencast (same constraint flagged by PRs #47 and #48). Manual repro:
pnpm dev WORKFLOW.md --mock, openhttp://127.0.0.1:4000, then on any runs-table row:Alternatives
<table>and wrap each<td>'s content in its own<a>. Rejected: nine anchors per row with the same target adds nine tab stops (or ARIA gymnastics to suppress them) and trips axe-core "duplicate link" heuristics. The ticket cited ErrorFeed as the reference shape — ErrorFeed is a<ul>of single anchors, not a multi-anchor table.<tr role="link">shim and addonAuxClick/onMouseDownshims for middle-click. Rejected: still loses right-click "Open in New Tab" + "Copy Link", and re-implements behaviour the browser already gives you for free on<a href>.Test Plan
pnpm all— typecheck + fmt:check + lint + 120 tests + 5 evals all green.pnpm build:web— bundle builds (227.06 kB JS / 21.93 kB CSS); confirmed the arbitrarygrid-cols-[…]class compiled into the CSS bundle (grid-template-columns:6rem minmax(0,1fr) 5rem …).Closes BEN-46.
Generated by Claude Code