Skip to content

Take the prose reset and footer from @robertblust/design v0.4.0 - #40

Merged
robertblust merged 3 commits into
mainfrom
prose-kit
Aug 31, 2026
Merged

Take the prose reset and footer from @robertblust/design v0.4.0#40
robertblust merged 3 commits into
mainfrom
prose-kit

Conversation

@robertblust

@robertblust robertblust commented Aug 31, 2026

Copy link
Copy Markdown
Owner

Summary

blust.ch adopts the prose reset and prose footer fences from @robertblust/design@0.4.0
(tag-pinned via github:robertblust/design#v0.4.0), taking the plain footer variant — this
site is the one the other two credit, so it carries no footer .credit rules. header contract
also 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 pages
are untouched.

What actually rendered differently

privacy/index.html was synced first and read as the gate: beyond the marker lines and the
header'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):

-    font-family:"Instrument Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
+    font-family:"Instrument Sans", ui-sans-serif, system-ui, -apple-system, sans-serif;

"Segoe UI" is a Windows-only face already covered by sans-serif; it added nothing these two
pages' siblings didn't already omit.

Footer font stack loses a redundant fallback (index.html, talks/index.html):

-         font-family:"Plex Mono", ui-monospace, monospace; font-size:.76rem;
-         letter-spacing:.08em; color:var(--dim)}
+         font-family:"Plex Mono",monospace; font-size:.76rem; letter-spacing:.08em; color:var(--dim)}

index.html gains the .mono rule — it had none before, which meant nothing on this page
could 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 that
lacked 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)} — no currentColor, no stroke, anywhere in it. Setting color
on the <svg> changes nothing rendered here; it was added by hand (this sits outside the fence
by 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":

-  .brand svg{width:28px; height:28px; flex:0 0 auto}
+  .brand svg{width:28px; height:28px; color:var(--c-mid); flex:0 0 auto}

Confirmed harmless, not by reading the diff — .brand .rb{fill:var(--c-mid)} sets the mark's
colour directly and is unaffected by the svg's color property either way, on all four
affected/gate pages (/, /ideas/, /talks/, /privacy/).

One consequence beyond the brief's checklist, verified harmless: index.html,
talks/index.html and ideas/index.html had only 3 footer rules (no
footer a[aria-current="page"]{color:var(--c-firm)}) before this change — the shared block
always 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 of
future 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:check reports every card
    matches the page it renders. (Only each page's og.sha changed — the rendered pixels came out
    byte-identical, since nothing visible moved.)

Test plan

  • npm run verify passes against python3 -m http.server 8000
  • npm run design:check exits 0
  • npm run og:check exits 0
  • .brand .rb fill is unaffected by .brand svg{color:...} on /, /ideas/, /talks/,
    /privacy/ — the rule is added for consistency with companygraph.io/guestgraph.io, not
    because it changes anything rendered on blust.ch

robertblust and others added 3 commits August 31, 2026 17:30
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>
@robertblust
robertblust merged commit 29b2069 into main Aug 31, 2026
1 check passed
@robertblust
robertblust deleted the prose-kit branch August 31, 2026 22:39
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.

1 participant