Skip to content

bc-ka5y.22: The type scale is the half of bc-03pz that needs deciding — 22 sizes - #702

Open
mordam wants to merge 5 commits into
mainfrom
worktree-type-scale-snap-ka5y22-b7c
Open

bc-ka5y.22: The type scale is the half of bc-03pz that needs deciding — 22 sizes#702
mordam wants to merge 5 commits into
mainfrom
worktree-type-scale-snap-ka5y22-b7c

Conversation

@mordam

@mordam mordam commented Aug 24, 2026

Copy link
Copy Markdown
Owner

Every font-size in the app is now on a six-step scale — 9 / 11 / 13 / 16 / 19 / 24 — and
test/metricscale.mjs fails the build on a seventh value, which is the third and last of
the metric axes bc-03pz opened. 356 of the 518 declarations in public/style.css and
public/flow.js moved, none of them by more than 2px, and 11 / 13 / 16 / 24 stayed exactly
where they were: those four already carried the app, and keeping them is most of why this is
cheap.

The scale was chosen on a measurement, not on the argument, and the tie rule is part of
it.
Three sizes were equidistant from two steps — 10px (×9 declarations), 12px (×71) and
14.5px (×18) — and Adam's answer rounds all 98 of them down, to 9, 11 and 13. That is not
a detail: applying each candidate to the real sheet and diffing the computed-style
fingerprint gives 6 boxes taller and 27 shorter rounding down, against 29 taller and 7
shorter rounding up, with history/rows.html growing 83px and decisions/proposal.html
49px on the up variant. Same six numbers either way. The rounding rule is written into
test/metricscale.mjs's header, because a later 12px is not a near-miss to wave through —
it is 11px or 13px and the sheet has already decided which.

Two of the bead's own acceptance criteria could not be met by any type scale and were
rewritten on the bead three days ago rather than fudged here. "No box height changed
anywhere" is impossible: line-heights here are unitless multipliers, so 292 elements move by
≤4px without anything reflowing — the reflow set (|Δh| ≥ 5px) is what is worth reading, and
it is 33 elements over 15 cards. And the rendered distinct count does not reach the scale's
6: it lands at 8, because code at 0.94em resolves to 12px inside 13px prose and the
browser's own 13.3333px for small and a bare input has no declaration behind it at all.
Both are in a SIZE_FREE set, the way 0/inherit are free of the radius scale. (The bead
predicted 9–11; bc-ka5y.28 landing mid-branch removed the third source and took it to 8.)

Five cards lose a line and none gains one. The single card that grows on the design board
is decisions/options.html, whose option hint goes 19px → 39px — and that one I measured by
hand at real phone widths, because it is the card Adam reads answers on: at 360px and 393px
that hint is already two lines before this change (38px), and after it is 39px. The wrap
only appears at the board's own 440px viewport, which is wider than any phone the app
targets. The five that shrink are history/rows (−53px), prs/pr-open, chat/comments,
overlays/setup and utility/send-queue — text that used to wrap and now does not.

Prose: the four places that documented this as an open decision no longer do — the block in
test/metricscale.mjs, the paragraph in README.md, the axis table in
scripts/design/README.md, and the header of scripts/design/vocabulary.mjs — and the
foundations/type.html card in scripts/design/manifest.mjs is rewritten: it said "there is
no type scale as such" and drew four sample sizes, two of them (15px, 17px) hard-coded off
any scale. It now draws all six with the role each carries. I also put the two measurement
traps into vocabulary.mjs's and scripts/design/README.md's headers, since both cost me
real time: baseline.mjs's height column is not a wrap detector for a font change, and
vocabulary.mjs's per-size tallies are inflated by the card frame until bc-ka5y.28 lands.

Two things found on the way that are not mine. test/finishedepic.mjs is red on main —
24/25, "with the sweep on (the default), the advocate asks instead of opening a session",
reproduced standalone on a tree with this branch's seven files reverted out. There was no
bead for it, so it is now bc-ka5y.39; it matters beyond itself because npm test is
fail-fast and a red at suite 164 hides the 270 after it. And the bigger one:
bc-ka5y.28 landed on main mid-branch and its el.closest('[class*="ds-"]') over-skips:
[class*="ds-"] matches the wrappers the app's markup sits inside (.ds-stack, and
.ds-box/.ds-scale from the cards' own CSS), not just the .ds-note commentary it was
aimed at. The regression baseline now fingerprints 1084 elements where it fingerprinted
2654, across 73 of 77 cards, and prs/lamps.html — every span.lamp, span.diffstat,
span.board-checks — fingerprints as zero. An empty array diffs clean against an empty
array forever, so the tool reports success while watching nothing. Filed as bc-ka5y.38
(P2, auto-endorsed) with the one-line fix. It does not affect the numbers above: I took both
shots with the walk scoped to .ds-note, which watches 2276 elements, and the reflow set is
identical to the one measured before .28 landed.

What I am least sure of is the aesthetic half, which no harness can answer: a scale
necessarily widens the gap between neighbouring roles. flow.js's .fc .sub used to sit
0.5px under its body text and now sits 2px under it. Nothing reflowed and I think it reads
better, but it is the kind of thing that wants eyes rather than a fingerprint.

Tests: No-bail 6-way runner over all 434 suites, post-merge: 433/434. The one red is test/finishedepic.mjs, which reproduces standalone on a tree with this branch's seven files reverted to origin/main — pre-existing on main, now filed as bc-ka5y.39. test/metricscale.mjs 11/11 (the four new type checks among them). scripts/design/check.mjs 0 problems over 77 cards. scripts/design/contrast.mjs 0 below AA in 1316 text runs. scripts/topbar-check.mjs exit 0, every page at least 24px of slack at 360px. scripts/design/vocabulary.mjs 8 distinct rendered sizes, down from 22. test/swbump.mjs says no service-worker cache bump is owed and I agree: a cached old sheet against a new page is older text, not broken layout.

Worth knowing: 356 font-size declarations moved across a 1300-rule sheet, so the blast radius is every page at once. What bounds it is the fingerprint: 6 boxes gained height and 27 lost it, over 15 of 77 cards, and I have read all 33. The one that grows is decisions/options.html's option hint, 19px to 39px — measured by hand at 360px and 393px, where it is already two lines before this change; the wrap exists only at the design board's wider 440px viewport. The residual risk is a surface with no design card, since the fingerprint only covers what the 77 cards draw.

Left undone: android/ untouched — it is a WebView with no bundled CSS, so nothing to rebuild. bc-ka5y.38 (the ds- filter over-skip I found in main's baseline.mjs) is filed, not fixed: it is another bead's just-landed work and fixing it here would have put an unrelated file in this diff. The two em-relative sizes are documented as free of the scale rather than converted to px.

Files changed — 7 files · +483 −385 · against `main`
public/style.css               +327 −327
test/metricscale.mjs           +64 −8
public/flow.js                 +29 −29
README.md                      +26 −7
scripts/design/README.md       +14 −4
scripts/design/vocabulary.mjs  +15 −3
scripts/design/manifest.mjs    +8 −7

Opened by a beadcause worker session on bc-ka5y.22 — The type scale is the half of bc-03pz that needs deciding — 22 sizes, seven of them doing one job. It merges itself once the checks report; merging is what closes the bead. If this is still open, something stopped that, and the reason is on bc-ka5y.22 and in Adam's inbox.

bead: bc-ka5y.22

NeanderthalMan and others added 3 commits August 24, 2026 14:16
Every font-size in public/style.css and public/flow.js is on the six-step
scale Adam picked, and test/metricscale.mjs fails the build on a seventh
value — the third and last of the metric axes bc-03pz opened.

356 of 518 declarations moved, none by more than 2px. 11, 13, 16 and 24
stayed exactly where they were, which is most of why this is cheap. The
three equidistant sizes — 10px, 12px and 14.5px, 98 declarations between
them — round DOWN, which measured as 6 boxes taller and 27 shorter where
rounding up gave 29 taller and one card 83px longer.

The four places that documented this as an open decision no longer do, and
the foundations/type.html card draws all six steps instead of four sizes,
two of which were themselves off any scale.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…frame

bc-ka5y.28 landed while this branch was open and removed the third source of
inflation (the card frame's own .ds-note prose), so the header comment saying
"until bc-ka5y.28 lands" was wrong by the time it was written down.

Measured on the merged tree: 8 distinct rendered sizes, down from 22. The two
that are not scale steps are `code` at 0.94em resolving to 12px inside 13px
prose, and the browser's own 13.3333px for `small` and a bare `input` — both
already free of the scale in test/metricscale.mjs, and neither reachable by a
px scale at all.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mordam

mordam commented Aug 24, 2026

Copy link
Copy Markdown
Owner Author

A beadcause worker opened this and does not merge its own work. It is on the merge queue as bc-zsn0c.

@mordam

mordam commented Aug 27, 2026

Copy link
Copy Markdown
Owner Author

The beadcause merge queue tried to merge this and could not: it has been tried 3 times and stopped at the same place each time. 2 checks failing (shard 2, test). The base is green on them, so these failures came in with this branch. A merge queue will not merge over a check the branch broke. Tried 3 times — that was the last. It is Adam's call now — see bc-zsn0c.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants