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
Check · Review · Land · Live done — Landed and live in production.
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
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
featuresSectioninsrc/web/pages/system.tsnow draws each row withrow({ 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 healthydata-*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 everydata-shortcutare untouched, and no JavaScript was added.test/keys-system.test.tschecks the empty page has nodata-nav. It also seeds two absorbed apps and asserts exactly twodata-navrows, each withtabindex="-1"and its own/ada/oneor/ada/twolink.
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.tssetsinnerHTML), 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.
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.
On
/system, only the "Features from apps" rows are now keyboard rows.j/kmove between them, andoor 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.tsandtest/help-keys.test.ts(18 pass, 10 skipped, 0 fail).tscis clean anddesign-lintis clean. The 10 skips are intest/keys.test.ts, becausessh-keygenisn't installed here. I did not run the new test against the old code to confirm it fails there. The old rows had nodata-nav, so it should.bun scripts/gate.tsfailed 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
featuresSectioninsrc/web/pages/system.tsnow draws each row withrow({ nav: true, href })instead of a hand-written<li>.data-nav tabindex="-1"and no nested links. The "Settings › Features" link stays outside the rows. The slug and healthydata-*hooks are kept.data-nav.src/web/client.ts,src/web/ui.ts, the?overlay and everydata-shortcutare untouched, and no JavaScript was added.test/keys-system.test.tschecks the empty page has nodata-nav. It also seeds two absorbed apps and asserts exactly twodata-navrows, each withtabindex="-1"and its own/ada/oneor/ada/twolink.What I left out
system-live.tssetsinnerHTML), which would drop focus.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. Pressj, then Enter.Closes #10340