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

/system rows are keyboard-first: j/k move through its panels, enter drills in #10350

Merged opened this

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

Merged

On `/system`, only the "Features from apps" rows are now keyboard rows. `j`/`k` move between them, and `o` or Enter opens that app's page (`/<owner>/<repo>`). I did not make the live machine, disk, network and process rows keyboard rows.

shipped production is serving it deploy abf00b0

opened this

On /system, only the "Features from apps" rows are now keyboard rows. j/k move between them, and o or Enter opens that app's page (/<owner>/<repo>). I did not make the live machine, disk, network and process rows keyboard rows.

I ran test/keys-system.test.ts, test/system-feature-health.test.ts, test/system-timing.test.ts, test/keys.test.ts and test/help-keys.test.ts (18 pass, 10 skipped, 0 fail). tsc is clean and design-lint is clean. The 10 skips are in test/keys.test.ts, because ssh-keygen isn't installed here. I did not run the new test against the old code to confirm it fails there. The old rows had no data-nav, so it should. bun scripts/gate.ts failed on the first push (no "Try:" line in any commit); it is fixed by an empty "Try:" commit and I did not re-run the gate after it. I did not try it in a browser.

What changed

  • featuresSection in src/web/pages/system.ts now draws each row with row({ nav: true, href }) instead of a hand-written <li>.
  • Each row is one link with data-nav tabindex="-1" and no nested links. The "Settings › Features" link stays outside the rows. The slug and healthy data-* hooks are kept.
  • With no absorbed apps the section still renders nothing, so there is no empty data-nav.
  • src/web/client.ts, src/web/ui.ts, the ? overlay and every data-shortcut are untouched, and no JavaScript was added.
  • test/keys-system.test.ts checks the empty page has no data-nav. It also seeds two absorbed apps and asserts exactly two data-nav rows, each with tabindex="-1" and its own /ada/one or /ada/two link.

What I left out

  • Live rows: the machine, disk and network meter rows have no page to open, so Enter would do nothing. The stream also rewrites them every 2 s (system-live.ts sets innerHTML), which would drop focus.
  • Process and cache tables: these are tables, not rows, so I left them alone.
  • Row helper: row() needed no new option, so nothing is left for a follow-up there.

To try it: sign in as the owner with an absorbed app and open /system. Press j, then Enter.

Closes #10340

commented

On /system, only the "Features from apps" rows are now keyboard rows. j/k move between them, and o or Enter opens that app's page (/<owner>/<repo>). I did not make the live machine, disk, network and process rows keyboard rows.

I ran test/keys-system.test.ts, test/system-feature-health.test.ts, test/system-timing.test.ts, test/keys.test.ts and test/help-keys.test.ts (18 pass, 10 skipped, 0 fail). tsc is clean and design-lint is clean. The 10 skips are in test/keys.test.ts, because ssh-keygen isn't installed here. I did not run the new test against the old code to confirm it fails there. The old rows had no data-nav, so it should. bun scripts/gate.ts failed on the first push (no "Try:" line in any commit); it is fixed by an empty "Try:" commit and I did not re-run the gate after it. I did not try it in a browser.

What changed

  • featuresSection in src/web/pages/system.ts now draws each row with row({ nav: true, href }) instead of a hand-written <li>.
  • Each row is one link with data-nav tabindex="-1" and no nested links. The "Settings › Features" link stays outside the rows. The slug and healthy data-* hooks are kept.
  • With no absorbed apps the section still renders nothing, so there is no empty data-nav.
  • src/web/client.ts, src/web/ui.ts, the ? overlay and every data-shortcut are untouched, and no JavaScript was added.
  • test/keys-system.test.ts checks the empty page has no data-nav. It also seeds two absorbed apps and asserts exactly two data-nav rows, each with tabindex="-1" and its own /ada/one or /ada/two link.

What I left out

  • Live rows: the machine, disk and network meter rows have no page to open, so Enter would do nothing. The stream also rewrites them every 2 s (system-live.ts sets innerHTML), which would drop focus.
  • Process and cache tables: these are tables, not rows, so I left them alone.
  • Row helper: row() needed no new option, so nothing is left for a follow-up there.

To try it: sign in as the owner with an absorbed app and open /system. Press j, then Enter.

Approved

Clean, small change: featuresSection now uses row({nav:true,href}) so each feature row is one link with data-nav tabindex="-1"; no new JS, no nested links, empty section still renders nothing, data-feature/data-healthy hooks kept. Output goes through html escaping; href is the repo path from the DB. Test covers empty and two-row cases and fails without the change. Live meter and process rows are left out with a sound reason (no page to open, rewritten every 2s). Not verified by me: the preview /system answered 303 to my token, so I read the code rather than the rendered page.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs