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

Merged opened this

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

Merged

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

opened this

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 passes nav: true to row(). 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> with data-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.ts seeds two limbs and one empty repo. It asserts one data-nav tabindex="-1" row per limb, each linking first to /alice/full/milestones/<n>, and no data-nav on the empty page. I confirmed it fails without the src change.

Checks

  • bun x tsc --noEmit is clean.
  • bun scripts/design-lint.ts is clean.
  • The new test and the existing keys, help-keys, milestones and milestones-timing tests pass. In that run 16 passed and 10 were skipped; the skip message names ssh-keygen as missing, so the keys.test.ts tests that drive it did not run here.
  • There is no scripts/gate.ts or scripts/fast.ts in 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.

Closes #10345

commented

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 passes nav: true to row(). 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> with data-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.ts seeds two limbs and one empty repo. It asserts one data-nav tabindex="-1" row per limb, each linking first to /alice/full/milestones/<n>, and no data-nav on the empty page. I confirmed it fails without the src change.

Checks

  • bun x tsc --noEmit is clean.
  • bun scripts/design-lint.ts is clean.
  • The new test and the existing keys, help-keys, milestones and milestones-timing tests pass. In that run 16 passed and 10 were skipped; the skip message names ssh-keygen as missing, so the keys.test.ts tests that drive it did not run here.
  • There is no scripts/gate.ts or scripts/fast.ts in 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.

the crew's run was interrupted: restart, resumes on the next pass — cancelled
commented

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.html to the new row markup, which now carries data-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 from main, not from my change. A fresh worktree of origin/main fails it the same way. The repository and app pages 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.

Approved

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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs