Take the prose reset and footer from @robertblust/design v0.4.0 - #40
Merged
Conversation
companygraph.io's landing page carried class="ctameta mono" with no .mono rule anywhere on the page, so the one element marked as a record value rendered in the body sans face in production. monoDefined reads the computed font-family of every .mono element and fails when it equals the body's — monoScope alone could never catch this, since it only asserts mono stays off nav/prose, never that data actually gets mono. verify/design.mjs is copied verbatim, not retyped; its md5 matches companygraph.io's and guestgraph.io's byte for byte. Armed on this site's six prose pages. blust.ch's own landing page also has no .mono rule, but it has no .mono element either, so the check correctly returns null and the page passes — this site never had the bug.
Deleting the header contract fence from /privacy/ left `design:check` green. The block is meant to be byte-identical on sixteen pages and one page simply stopped having it. Deleting the language fence instead does fail `npm run verify` — eight `ReferenceError: langFromUrl is not defined`, a mobile menu that will not open, and a failed language handoff — but none of that says a fence is missing. A person debugging goes hunting for a JS bug in code that is fine. design sync rewrites the fences it finds — it was never able to see this, and the spec says so: discovery drives writing, PAGES drives coverage. The covering check was tokenVersion, which asserts one marker out of the four fences that now exist. `fences` takes the list from PAGES, which is the site's own declaration of what it ships, and asserts both markers of each. Demonstrated against the same language-fence deletion before this commit: the same JS errors, now alongside one line that names the actual cause — `fences: carries no \`language\` fence`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
blust.ch adopts the
prose resetandprose footerfences from@robertblust/design@0.4.0(tag-pinned via
github:robertblust/design#v0.4.0), taking theplainfooter variant — thissite is the one the other two credit, so it carries no
footer .creditrules.header contractalso moves v2 → v3 in this release (one word in its own comment), which is expected on all six
pages and not something this PR causes.
All six prose pages now carry both new fences:
index.html,talks/index.html,privacy/index.html,ideas/index.html,principles/index.html,model/index.html. Deck pagesare untouched.
What actually rendered differently
privacy/index.htmlwas synced first and read as the gate: beyond the marker lines and theheader's v2→v3 word, its reset and footer bodies did not change at all — it was already one of
the pages carrying the package's majority form.
On the other five pages, syncing surfaced real byte-level drift the package now corrects:
Body font stack loses a redundant fallback (
index.html,ideas/index.html):"Segoe UI"is a Windows-only face already covered bysans-serif; it added nothing these twopages' siblings didn't already omit.
Footer font stack loses a redundant fallback (
index.html,talks/index.html):index.htmlgains the.monorule — it had none before, which meant nothing on this pagecould correctly mark a value as data:
+ .mono{font-family:"Plex Mono", ui-monospace, "SF Mono", Menlo, monospace}.brand svg{color:var(--c-mid)}added for consistency, not a fix, on the three pages thatlacked it (
index.html,ideas/index.html,talks/index.html). This site's brand mark is<rect class="plate">plus<text class="rb">, filled directly by.brand .plate{fill:...}and.brand .rb{fill:var(--c-mid)}— nocurrentColor, nostroke, anywhere in it. Settingcoloron the
<svg>changes nothing rendered here; it was added by hand (this sits outside the fenceby design, since each site's mark carries its own colours) to match the ten pages across
companygraph.io and guestgraph.io where the identical rule is load-bearing, because their marks
do use
stroke="currentColor":Confirmed harmless, not by reading the diff —
.brand .rb{fill:var(--c-mid)}sets the mark'scolour directly and is unaffected by the
svg'scolorproperty either way, on all fouraffected/gate pages (
/,/ideas/,/talks/,/privacy/).One consequence beyond the brief's checklist, verified harmless:
index.html,talks/index.htmlandideas/index.htmlhad only 3 footer rules (nofooter a[aria-current="page"]{color:var(--c-firm)}) before this change — the shared blockalways ships that 4th rule, so syncing adds it. None of those three pages currently marks any
footer link
aria-current="page", so the new rule is inert today; it's normalization ahead offuture need, not a visible change.
Verification
npm run verify— all checks pass (all 8 pages, sitemap, favicon, robots.txt).npm run design:check—✓ 7 file(s) and 35 fence(s) match @robertblust/design, exit 0.npm run og/npm run og:check— all 8 cards re-rendered;og:checkreports every cardmatches the page it renders. (Only each page's
og.shachanged — the rendered pixels came outbyte-identical, since nothing visible moved.)
Test plan
npm run verifypasses againstpython3 -m http.server 8000npm run design:checkexits 0npm run og:checkexits 0.brand .rbfill is unaffected by.brand svg{color:...}on/,/ideas/,/talks/,/privacy/— the rule is added for consistency with companygraph.io/guestgraph.io, notbecause it changes anything rendered on blust.ch