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

Merged opened this

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

Merged

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

opened this

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, /apps has exactly two data-nav anchors, each linking to its own /alice/<name> and carrying tabindex="-1".
  • On the empty archived view, /apps?archived=1, there is no data-nav at 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 --noEmit is clean.
  • bun scripts/design-lint.ts is clean.
  • test/help-keys.test.ts passes. In test/keys.test.ts 10 tests were skipped because ssh-keygen isn'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.

Closes #10339

commented

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, /apps has exactly two data-nav anchors, each linking to its own /alice/<name> and carrying tabindex="-1".
  • On the empty archived view, /apps?archived=1, there is no data-nav at 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 --noEmit is clean.
  • bun scripts/design-lint.ts is clean.
  • test/help-keys.test.ts passes. In test/keys.test.ts 10 tests were skipped because ssh-keygen isn'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.
Approved

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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs