v0.4.0 — the prose reset and footer blocks
Two new blocks, and a defect in the variant machinery that needing them exposed.
blocks/reset.css — the five rules every prose page opens with
Four of the five had drifted across the sixteen prose pages:
| rule | what was wrong |
|---|---|
.mono |
missing from two landing pages — and on one, an element marked as data was rendering as prose, in production, with every check green |
a{color:inherit} |
missing from one |
body font stack |
gained "Segoe UI" on five pages; lost ui-sans-serif, -apple-system and -webkit-font-smoothing on one |
"Segoe UI" is dropped rather than adopted: ten pages omit it, five carry it, the split follows no
site and no page type, and system-ui already resolves to it on Windows.
blocks/footer.css + blocks/footer-credit.css — the footer, in two variants
companygraph.io and guestgraph.io credit blust.ch in their footer; blust.ch is that site and does
not credit itself. Ten prose pages carry nine credit rules and six carry none. That is a fact about
the sites, not a preference, so the wrong variant word is an error rather than a style choice.
parts — a third kind of substitution
blockFor could fill a variant word the package owns, and parameters the site owns.
Package-owned content appearing under one variant and not another had no name. Two whole block
files would have duplicated the four rules the variants share, which is the duplication this
package exists to remove.
The defect this exposed, shipping since v0.3.1
findFence hardcoded VARIANTS = new Set(["page","deck"]) while FENCES declares variants per
fence. A marker reading · credit therefore parsed as no variant at all, and the tool rejected
it saying "declares no variant" — about a fence whose opening line plainly declared one. The parser
now reports the word it finds; the manifest decides whether it is allowed, and says both what it
found and what is permitted.
This is also why the general variant-consistency guard shipped in v0.3.0 had never been driven end
to end. The stated reason was that no fence had variants differing by more than a :root brace.
The real reason underneath it: no fence could have, because a new variant word was unparseable.
It now fires on a real fence.
Also
header→ v3. Its block said the row is byte-identical on all fifteen pages; there are sixteen. Correcting one word changes the block's bytes, so it waited for a release that re-syncs every page.- Every fence's emitted version is now asserted against
versions.json. It was asserted for one fence out of four, and the test that appeared to cover the rest comparedversions.jsonwith itself. - The font-family guard covers every block the package ships, not one. This project shipped
IBM Plex Mono— declared in no@font-face, present on no machine — for months.
106 tests.