Public: anyone can read this; the crew can change it.

The map's issues are keyboard rows: j/k move between them, enter opens the issue #10359

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

The "Ready now" and "Blocked on" issue rows on a repository's map (`/:owner/:name/map`) now join the shell's `j`/`k` traversal; `o` or Enter opens the issue. The change is one line, `nav: true` on the `rankedList` rows in `src/web/pages/map.ts`. There's no new JavaScript, and `src/web/client.ts` and `src/web/ui.ts` are untouched.

shipped production is serving it deploy abf00b0

opened this

The "Ready now" and "Blocked on" issue rows on a repository's map (/:owner/:name/map) now join the shell's j/k traversal; o or Enter opens the issue. The change is one line, nav: true on the rankedList rows in src/web/pages/map.ts. There's no new JavaScript, and src/web/client.ts and src/web/ui.ts are untouched.

What I checked

  • test/keys-map.test.ts fails without the change. With the change it passes: the seeded map has data-nav links to the issue's own page, each with tabindex="-1", and a repo with no issues has no data-nav at all.
  • test/keys.test.ts, test/help-keys.test.ts and test/map-page-timing.test.ts pass. 10 tests across those files were skipped.
  • bun x tsc --noEmit is clean, and bun scripts/design-lint.ts is clean.
  • I did not run the full suite. I did not try the keys in a browser.

What I left out

  • Issue links in other lists: the by-pillar list, the roadmap's "Needs you" and issue rows, and the global /map lanes and "Next" list are not keyboard rows. The pillar list and the roadmap rows sit inside folded <details>, so j/k would land on rows nobody can see.
  • Roadmap and "Needs you" rows: these are single-link rows and could take nav safely, but src/web/pages/roadmap.ts isn't in this issue's file list. Say so if you want them added.
  • The "First" form: where the row has a "First" button, its form sits inside the row's link. That was already the case, and I left it as it was.

Try it: open any repository's /map, press j to focus a ready issue, then Enter.

The pre-push hook wanted a "Try:" commit, so the branch has an empty one.

🤖 Generated with Claude Code

Closes #10342

commented

The "Ready now" and "Blocked on" issue rows on a repository's map (/:owner/:name/map) now join the shell's j/k traversal; o or Enter opens the issue. The change is one line, nav: true on the rankedList rows in src/web/pages/map.ts. There's no new JavaScript, and src/web/client.ts and src/web/ui.ts are untouched.

What I checked

  • test/keys-map.test.ts fails without the change. With the change it passes: the seeded map has data-nav links to the issue's own page, each with tabindex="-1", and a repo with no issues has no data-nav at all.
  • test/keys.test.ts, test/help-keys.test.ts and test/map-page-timing.test.ts pass. 10 tests across those files were skipped.
  • bun x tsc --noEmit is clean, and bun scripts/design-lint.ts is clean.
  • I did not run the full suite. I did not try the keys in a browser.

What I left out

  • Issue links in other lists: the by-pillar list, the roadmap's "Needs you" and issue rows, and the global /map lanes and "Next" list are not keyboard rows. The pillar list and the roadmap rows sit inside folded <details>, so j/k would land on rows nobody can see.
  • Roadmap and "Needs you" rows: these are single-link rows and could take nav safely, but src/web/pages/roadmap.ts isn't in this issue's file list. Say so if you want them added.
  • The "First" form: where the row has a "First" button, its form sits inside the row's link. That was already the case, and I left it as it was.

Try it: open any repository's /map, press j to focus a ready issue, then Enter.

The pre-push hook wanted a "Try:" commit, so the branch has an empty one.

🤖 Generated with Claude Code

commented

The map's ready and blocked issue rows are now keyboard rows: j/k move between them and Enter opens the selected issue. The change is nav: true on the ranked rows in src/web/pages/map.ts, plus test/keys-map.test.ts.

I couldn't fix either failure the check reported, because neither comes from this change:

  • "each page stays inside its first-view budget" (test/attention.test.ts): this test arrived on main after I branched. It fails on origin/main itself: the repository and app pages are over their word and block budgets (197 words against 189, 29 blocks against 28). I merged main into the branch and left the budget alone. Someone needs to fix main or the budget.
  • "previews of idle pulls sleep" (test/apps-idle.test.ts): it passes when run alone, so I treated it as a timing flake under load in the full run. It touches nothing the map change reaches.

On the merged branch, bun x tsc --noEmit is clean and test/keys-map.test.ts and test/apps-idle.test.ts pass (5 tests). I didn't run scripts/gate.ts or the full suite here. test/map-layout-budget.test.ts timed out once (5 s limit) when I ran it with two other test files, and I didn't re-run it alone.

To try it: open /alice/busy/map, press j, then Enter on an issue row.

Approved

One line, nav: true on the ranked rows in rankedList, which is the pattern row() already offers. No new JS, no change to the shell's keys, and an empty list still renders the plain <p>. The test seeds a blocked pair and asserts the rows and the empty page.

Two things I would do next:

  1. Where a writer sees the First button, the <form> sits inside the row's <a>. That is invalid nesting and a Tab stop inside a j/k row. It was already so, but the row is now a keyboard row, so move the button out of the link (use after).
  2. Tighten the test: assert exactly one data-nav per rendered row (the issue says one per row, the test says at least 2), and add a writer case that checks the First form still posts.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs