Public: anyone can read this; the crew can change it.
The milestones list is keyboard-first: j/k move between milestones, enter opens one #10362
Check · Review · Land · Live done — Landed and live in production.
Each limb row on the milestones page now joins the shell's `j`/`k` traversal, so `j`/`k` move between milestones and `o` or Enter opens one. No new JavaScript. I did not touch `src/web/client.ts` or `src/web/ui.ts`, and the page's shortcuts and `?` overlay are unchanged.
shipped production is serving it deploy abf00b0
Each limb row on the milestones page now joins the shell's j/k traversal, so j/k move between milestones and o or Enter opens one. No new JavaScript. I did not touch src/web/client.ts or src/web/ui.ts, and the page's shortcuts and ? overlay are unchanged.
What changed
- In
src/web/pages/milestones.ts,limbLine()now passesnav: truetorow(). That is one line. limbLine()is shared, so the "Limbs" section on a single milestone's page gets the same traversal.- A page with no limbs renders as before, with no
data-nav. - Each row keeps one primary link, the title link to the milestone. The row has no
href, so it renders as a<div>withdata-nav, not a link, and no link is nested inside another. Enter clicks the first link in the row, which is the title. The Raise/Lower buttons come after it in the row, so they can't take Enter. test/keys-milestones.test.tsseeds two limbs and one empty repo. It asserts onedata-nav tabindex="-1"row per limb, each linking first to/alice/full/milestones/<n>, and nodata-navon the empty page. I confirmed it fails without thesrcchange.
Checks
bun x tsc --noEmitis clean.bun scripts/design-lint.tsis clean.- The new test and the existing
keys,help-keys,milestonesandmilestones-timingtests pass. In that run 16 passed and 10 were skipped; the skip message namesssh-keygenas missing, so thekeys.test.tstests that drive it did not run here. - There is no
scripts/gate.tsorscripts/fast.tsin this clone, so I named the test files myself.
Not done
- I did not add whole-row links.
row()would have nested the Raise/Lower buttons inside an<a>, which breaks Enter.
To try it
Open /<owner>/<repo>/milestones on the preview, then press j/k to move through the milestones and Enter to open one.
I had to amend the commit once: the pre-push hook refused a commit message without a Try: line, so the message now has one.
Each row on the milestones list now joins j/k traversal, the same way the apps list does. This push fixes one of the three failing checks. Another is a failure already on main, and the third passed when I re-ran it.
- Milestones golden: I pinned
test/fixtures/milestones-golden.htmlto the new row markup, which now carriesdata-nav tabindex="-1"on each row. I had changed the markup without updating the fixture. The test passes now. - First-view budget (
test/attention.test.ts): this one comes frommain, not from my change. A fresh worktree oforigin/mainfails it the same way. Therepositoryandapppages are over budget at both widths, by 8 words and 1 block, and I touched neither page. I left it alone, so the check may still show this test red. - Idle-pull sleep test (
test/apps-idle.test.ts): it passes here, so I couldn't reproduce the failure. It looked timing-sensitive, and I changed nothing for it.
I merged main into the branch. bun x tsc --noEmit is clean.
One line (nav: true in limbLine) plus a pinned golden and a test that fails without it. No new JS, no key handler, no new component, no README change. Each row keeps a single primary link, so Enter opens the milestone and Raise/Lower buttons stay reachable by Tab. Not verified on the preview: the page I fetched had no limb rows, so I judged the markup from the diff, golden and test. Next two things: (1) add a one-line how-to for j/k on milestones to docs/features if a keys page exists, and say the terminal door is out of scope here; (2) confirm the single-milestone Limbs section, which now shares this traversal, has its own assertion.
Each limb row on the milestones page now joins the shell's
j/ktraversal, soj/kmove between milestones andoor Enter opens one. No new JavaScript. I did not touchsrc/web/client.tsorsrc/web/ui.ts, and the page's shortcuts and?overlay are unchanged.What changed
src/web/pages/milestones.ts,limbLine()now passesnav: truetorow(). That is one line.limbLine()is shared, so the "Limbs" section on a single milestone's page gets the same traversal.data-nav.href, so it renders as a<div>withdata-nav, not a link, and no link is nested inside another. Enter clicks the first link in the row, which is the title. The Raise/Lower buttons come after it in the row, so they can't take Enter.test/keys-milestones.test.tsseeds two limbs and one empty repo. It asserts onedata-nav tabindex="-1"row per limb, each linking first to/alice/full/milestones/<n>, and nodata-navon the empty page. I confirmed it fails without thesrcchange.Checks
bun x tsc --noEmitis clean.bun scripts/design-lint.tsis clean.keys,help-keys,milestonesandmilestones-timingtests pass. In that run 16 passed and 10 were skipped; the skip message namesssh-keygenas missing, so thekeys.test.tstests that drive it did not run here.scripts/gate.tsorscripts/fast.tsin this clone, so I named the test files myself.Not done
row()would have nested the Raise/Lower buttons inside an<a>, which breaks Enter.To try it Open
/<owner>/<repo>/milestoneson the preview, then pressj/kto move through the milestones and Enter to open one.I had to amend the commit once: the pre-push hook refused a commit message without a
Try:line, so the message now has one.Closes #10345