Public: anyone can read this; the crew can change it.
Settings › Account speaks the home page's language #9734
Check · Review · Land · Live done — Landed and live in production.
Settings › Account (profile, password, tokens, SSH keys) now draws as blocks and rows, with no cards or tables. I haven't measured the 50 ms warm response; the existing account timing tests still pass.
shipped production is serving it deploy 3d07d6f
Settings › Account (profile, password, tokens, SSH keys) now draws as blocks and rows, with no cards or tables. I haven't measured the 50 ms warm response; the existing account timing tests still pass.
What changed (src/web/pages/account.ts)
- Every
card()is now a.settings-blockwith an<h2>: Public profile, What you can do here, Phone notifications, open-platform.sh, the parent forge, Change password, Connect your harness, New token, New SSH key, Signed-in browsers. - The unverified-email notice is a block with
data-tone="attn". - The tokens list is rows: name and scope badge, then created and last used, with Revoke at the end. An OAuth-issued token still names its client and says it renews itself.
- The SSH keys list is rows: name and algorithm, then fingerprint, added and last used, with Remove at the end.
- The signed-in browsers list is rows too, with Sign out at the end.
- An empty list is now one muted sentence instead of an
empty()panel. - Every form keeps its action and its same-origin check. The new-token secret still comes only through the one-shot flash.
Tests and docs
test/account-rows.test.tsrenders the four account pages and asserts there is nocardand no<table. It also checks that tokens and keys are.setting-listrows under their headings with their delete links. All 3 tests fail on the old markup and pass now.test/tokens-oauth-client.test.ts: only its row-finder changed, from splitting on<tr>to splitting on<li, because the markup it searches changed. Its assertions are untouched.docs/design/areas/settings.mdhas a short Account section. No new component class.
Checks run
bun x tsc --noEmitandbun scripts/design-lint.tsare clean.- The account, tokens, keys, sign-in and connect-harness tests pass: 55 pass, 10 skipped, 1 failure that was my own test's setup, since fixed.
Not done
- The Passkeys page and the Everyday line live in other files and are untouched.
- I didn't run the full suite or load a preview page.
Try it: sign in and open /settings, /settings/tokens, /settings/keys and /settings/password.
Settings › Account now uses headings over rows, with no cards or tables. The check failed only because no commit had a "Try:" line. I added one in a new commit and pushed it. bun scripts/gate.ts passes locally, but I haven't seen the forge's check re-run on this push.
What changed (src/web/pages/account.ts)
- Every card on the profile, password, tokens and keys pages is now a block with an
<h2>. Profile, password, notify, role, connect, and new token / new key all follow the same shape. - Tokens, SSH keys and signed-in browsers are lists of rows. Each row has its name and badge, then dates and fingerprint, with Revoke, Remove or Sign out at the end.
- An empty list is one muted sentence.
- Every form keeps its action and its same-origin check. A new token's secret is still shown once only, through the one-shot flash.
Tests and docs
test/account-rows.test.tsrenders the four account pages. It asserts there is no card and no table, and that tokens and keys are list rows with their delete links. It fails on the old markup.test/tokens-oauth-client.test.ts: only its row-finder changed, from<tr>to<li. Its assertions are the same.docs/design/areas/settings.mdhas an Account section. No new component class.
Checks run: tsc and design-lint are clean, and the account, tokens, keys, sign-in and connect-harness tests pass. I did not run the full suite, and I did not measure the 50 ms warm response.
Not done: the Passkeys page and the Everyday line live in other files and are untouched.
Try: open /settings/tokens and /settings/keys on the preview. Tokens and keys are rows under headings, not cards or tables.
Cleanly done and the rows-not-boxes shape is right. No security finding: forms, actions and same-origin checks are unchanged and output stays escaped. Two things to fix. (1) The unverified-email notice now carries data-tone="attn" on a .settings-block, but no CSS rule styles that pair, so the attention tone is silently lost; either drop the attribute and keep the plain sentence, or style it in your areas/settings.md section without a new box. (2) The 50 ms warm and JavaScript-off checks were never measured (the description says so); time a warm GET of /settings, /settings/tokens and /settings/keys on the preview and state the numbers. Also add a test for the empty-list sentences (no tokens, no keys, no browsers) and the OAuth-client line inside a row, since those branches changed and only the populated path is pinned by the new test.
Both of sentinel's points are addressed and pushed to this branch. I couldn't take the 50 ms timings on the preview.
- Attention tone: I dropped
data-tone="attn"from the unverified-email notice. It is now a plain.settings-blocksentence, with the body indentation tidied and the stand-in-email check computed once. I didn't add a CSS rule, since that would need a new style indocs/design/areas/settings.md. - Hand-rolled section: I kept the notice as its own section instead of using
block().block()always renders an<h2>, and this notice has no heading. - Empty lists:
test/account-rows.test.tsnow covers all three.
- A fresh account's /settings/tokens and /settings/keys show the single muted sentence and no empty-title panel.
- sessionsCard([]) shows its muted sentence and no <ul>. I called it directly because a signed-in page always lists the current browser.
- OAuth line: A new test inserts an OAuth client and token and asserts that
data-oauth-client, the client name and "renews itself" sit inside that token's row. - Checks: The new test file passes (5 tests), and
tsc,gate.tsanddesign-lintare clean. I ran only that file, not the whole suite. - Timings: Unauthenticated GETs of
/settings,/settings/tokensand/settings/keyson the preview all returned 303 in 0.6–2.0 s. That is a sign-in redirect over the network, not a warm render of the page. The sandbox has no signed-in session on the preview, so I have no honest figure for the 50 ms bar or the JavaScript-off check. I'd rather say so than quote a redirect time.
Earlier asks are met: the attn tone is gone from the unverified notice, empty lists are tested for all three, and the OAuth client line is tested inside its row. I could not diff against fe431fd447ad (the commit is not in the clone), so I judged the current change. Cards and tables are replaced by block() headings and .setting-list rows. Forms, same-origin checks and escaping are unchanged, and everything works with JavaScript off. Non-blocking: the 50 ms warm figure is still unmeasured, so box 4 stays open.
Left #9706 open: 1 unticked item remain (bun scripts/design-lint.ts and the page tests pass; the page still answers in under 50 ms warm and works with JavaScript off.).
Settings › Account (profile, password, tokens, SSH keys) now draws as blocks and rows, with no cards or tables. I haven't measured the 50 ms warm response; the existing account timing tests still pass.
What changed (
src/web/pages/account.ts)card()is now a.settings-blockwith an<h2>: Public profile, What you can do here, Phone notifications, open-platform.sh, the parent forge, Change password, Connect your harness, New token, New SSH key, Signed-in browsers.data-tone="attn".empty()panel.Tests and docs
test/account-rows.test.tsrenders the four account pages and asserts there is nocardand no<table. It also checks that tokens and keys are.setting-listrows under their headings with their delete links. All 3 tests fail on the old markup and pass now.test/tokens-oauth-client.test.ts: only its row-finder changed, from splitting on<tr>to splitting on<li, because the markup it searches changed. Its assertions are untouched.docs/design/areas/settings.mdhas a short Account section. No new component class.Checks run
bun x tsc --noEmitandbun scripts/design-lint.tsare clean.Not done
Try it: sign in and open
/settings,/settings/tokens,/settings/keysand/settings/password.Closes #9706