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

Settings › Backups speaks the home page's language #9754

Merged opened this

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

Merged

Settings › Backups now follows the home page's shape. Its sections are headings over rows, and no box (card) remains.

shipped production is serving it deploy 4cb4bc0

opened this

Settings › Backups now follows the home page's shape. Its sections are headings over rows, and no box (card) remains.

  • Sections: Lanes, Where and when, Snapshots, Destination, Off-box mirror and Failure domains are each a <section class="settings-block"> with an <h2>.
  • Snapshot list: snapshots are row()s in <ul class="list setting-list" id="snapshots">. The restore command sits under them as plain text in the same section.
  • Empty states: the "None yet" box and the "No snapshots are taken" box are now one plain sentence each.
  • Live region: #backups-live and its data-live and data-live-src attributes are unchanged. A test asserts this.
  • Design docs: no new component class. docs/design/areas/backups.md records the shape.
  • Tests: test/backups-parts.test.ts has a new test that asserts the rows-not-boxes shape and fails on the old markup. I changed one older test in the same file, because it checked that the restore command sat in a card body. It now checks the Snapshots section and that no card remains.
  • Checks run: bun x tsc --noEmit and bun scripts/design-lint.ts are clean. The backup, mcp-backups and tui-backups test files pass (116 pass, 0 fail).

Not done:

  • The 50 ms warm response was not measured here, and the JavaScript-off case was not tried in a browser. The change only swaps markup, so I expect no slowdown.
  • No hand-made looks, as the issue asked.

Closes #9708

commented

Settings › Backups now follows the home page's shape. Its sections are headings over rows, and no box (card) remains.

  • Sections: Lanes, Where and when, Snapshots, Destination, Off-box mirror and Failure domains are each a <section class="settings-block"> with an <h2>.
  • Snapshot list: snapshots are row()s in <ul class="list setting-list" id="snapshots">. The restore command sits under them as plain text in the same section.
  • Empty states: the "None yet" box and the "No snapshots are taken" box are now one plain sentence each.
  • Live region: #backups-live and its data-live and data-live-src attributes are unchanged. A test asserts this.
  • Design docs: no new component class. docs/design/areas/backups.md records the shape.
  • Tests: test/backups-parts.test.ts has a new test that asserts the rows-not-boxes shape and fails on the old markup. I changed one older test in the same file, because it checked that the restore command sat in a card body. It now checks the Snapshots section and that no card remains.
  • Checks run: bun x tsc --noEmit and bun scripts/design-lint.ts are clean. The backup, mcp-backups and tui-backups test files pass (116 pass, 0 fail).

Not done:

  • The 50 ms warm response was not measured here, and the JavaScript-off case was not tried in a browser. The change only swaps markup, so I expect no slowdown.
  • No hand-made looks, as the issue asked.
commented

I added the missing "Try:" line in a new commit and pushed it. No code changed, so the earlier test and type-check results still stand. bun scripts/gate.ts printed nothing when I ran it locally. The forge's check will now re-run on the push.

What changed. Settings › Backups now follows the home page's shape: headings over rows, no cards. Lanes, Where and when, Snapshots, Destination, Off-box mirror and Failure domains are each a settings-block section with an <h2>. Snapshots are rows in ul#snapshots. The two empty-state boxes became one plain sentence each.

Unchanged. #backups-live and its data-live attributes are as they were, and a test asserts it. No new component class; the shape is recorded in docs/design/areas/backups.md. test/backups-parts.test.ts has a new rows-not-boxes test that fails on the old markup. I changed one older test in that file, because it checked that the restore command sat in a card body. It now checks the Snapshots section and that no card remains.

Left out. I didn't measure the 50 ms warm response or try the page with JavaScript off. The change only swaps markup. No hand-made looks.

Try: open /settings/backups on the preview as an admin. Snapshots is a list of rows under a heading, with no boxes.

🤖 Generated with Claude Code

Changes requested — before the latest push

The markup change is right: headings over rows, no card left, #backups-live untouched, no new class. One fix first: the rewritten restore-command test no longer asserts anything, so tighten it. Also add two assertions: the Lanes and Failure domains h2s, and the no-store empty state (a plain h2 plus sentence, no empty/card markup). Both are new behaviour with no test. The preview redirects to sign-in for me (303), so I could not see the page as an admin; the 50 ms warm and JavaScript-off checks were never run, and the pull says so. Please measure the warm answer once and say the number in the pull.

commented

I've addressed all of @juniper's points on the same branch and pushed. test/backups-parts.test.ts passes (8 tests), and tsc, bun scripts/gate.ts and bun scripts/design-lint.ts came back clean.

Warm answer: I measured /settings/backups as an admin in-process, with a store holding one snapshot: median 5.0 ms and worst 26.2 ms over 30 warm requests, well under 50 ms. This measures the page's own handler, not a browser over the network.

Test changes:

  • Restore command: the test now slices from <h2>Snapshots</h2> to the next </section> and requires the <pre> and id="snapshots" inside that slice. The old comparison is gone.
  • Lanes and Failure domains: a new test seeds one lane read, then asserts <h2>Lanes</h2> holds #backup-lanes and <h2>Failure domains</h2> holds #resilience-list, with no class="card anywhere.
  • No store set: a new test boots a bare app and asserts a plain <h2>No snapshots are taken</h2> followed by its sentence, with no class="card, class="empty or card-body.

Not checked:

  • JavaScript off: the page is server-rendered and every form is a plain POST. I did not try it in a browser with scripts disabled.
  • Preview as admin: I can't sign in to the preview from here, so I haven't seen the page there as an admin either.

Try: open /settings/backups on the preview as an admin. With no store set, a plain heading and sentence replace the empty box.

🤖 Generated with Claude Code

Approved

Earlier asks are met: the restore-command test now checks the Snapshots section, Lanes and Failure domains have a test, and the no-store empty state has a test. The warm answer was measured at a 5 ms median. Every section is a settings-block with an h2, snapshots are rows in ul#snapshots, no card or empty box remains, #backups-live is unchanged, and docs/design/areas/backups.md records the shape with no new class. The preview redirects me (303) because I cannot sign in as admin, so I read the markup and tests instead. Next, non-blocking: (1) try the page with JavaScript off in a browser. (2) Add the JS-off and 50 ms checks to the page test.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs