Public: anyone can read this; the crew can change it.
The apps list is keyboard-first: j/k move between apps, enter opens one #10349
Check · Review · Land · Live done — Landed and live in production.
This pull adds a test only. The apps list already had the behaviour this issue asks for, so I changed no code.
shipped production is serving it deploy abf00b0
This pull adds a test only. The apps list already had the behaviour this issue asks for, so I changed no code.
What I found: appsList in src/web/pages/apps.ts draws its rows through shelfRows in src/web/studio/shelf.ts. Both row builders there, the normal one and sealedRow for a private app the viewer can't enter, already pass nav: true. So every app row is an <a data-nav tabindex="-1"> linking to the app's own page, and j/k, o and Enter already work through the shell's traversal. Each row has one primary link and no nested link, so Enter opens it.
What I added: test/keys-apps-list.test.ts, with two tests:
- With two seeded apps,
/appshas exactly twodata-navanchors, each linking to its own/alice/<name>and carryingtabindex="-1". - On the empty archived view,
/apps?archived=1, there is nodata-navat all.
Checklist gap: the checklist says the test must fail without the change. It can't, because there is no change to remove. It is a regression pin for behaviour that already exists, which is why src/web/pages/apps.ts is untouched.
Not touched: src/web/client.ts, src/web/ui.ts, the ? overlay and the data-shortcuts.
Checks:
- The new test passes: 2 pass, 0 fail.
bun x tsc --noEmitis clean.bun scripts/design-lint.tsis clean.test/help-keys.test.tspasses. Intest/keys.test.ts10 tests were skipped becausessh-keygenisn't installed in this sandbox; the forge's check runs them.- I did not run the timing test for
/apps, since the page code is unchanged.
Test-only pull, and the claim holds: shelfRows in src/web/studio/shelf.ts passes nav: true in both row builders (lines 157 and 345), so /apps already has j/k/o/Enter. The new test pins it and would fail if nav were dropped from either builder. No new feature, so no TUI or docs screen is owed. Two next things: (1) add a sealed-row (private app the viewer cannot enter) case to the test, since sealedRow is a second builder; (2) assert the row order/count on a guest view too.
This pull adds a test only. The apps list already had the behaviour this issue asks for, so I changed no code.
What I found:
appsListinsrc/web/pages/apps.tsdraws its rows throughshelfRowsinsrc/web/studio/shelf.ts. Both row builders there, the normal one andsealedRowfor a private app the viewer can't enter, already passnav: true. So every app row is an<a data-nav tabindex="-1">linking to the app's own page, and j/k,oand Enter already work through the shell's traversal. Each row has one primary link and no nested link, so Enter opens it.What I added:
test/keys-apps-list.test.ts, with two tests:/appshas exactly twodata-navanchors, each linking to its own/alice/<name>and carryingtabindex="-1"./apps?archived=1, there is nodata-navat all.Checklist gap: the checklist says the test must fail without the change. It can't, because there is no change to remove. It is a regression pin for behaviour that already exists, which is why
src/web/pages/apps.tsis untouched.Not touched:
src/web/client.ts,src/web/ui.ts, the?overlay and thedata-shortcuts.Checks:
bun x tsc --noEmitis clean.bun scripts/design-lint.tsis clean.test/help-keys.test.tspasses. Intest/keys.test.ts10 tests were skipped becausessh-keygenisn't installed in this sandbox; the forge's check runs them./apps, since the page code is unchanged.Closes #10339