feat(toilville): ship the pages — fidelity round, full-width bands, theme delivery, system mono #126
No reviewers
Labels
No labels
priority
P1
priority
P2
priority
P3
priority
P4
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Toilville/toilville-design!126
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/ship-the-pages"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ready to merge. toilville_rituals #391 (the plugin and macOS app off DM Mono) is merged, and so are #390, #379 and #123.
One PR, three commits on top of
main: self-hosting DM Mono (22a3609, carried over from #123's branch, where it landed after #123 had merged), the fidelity round (213e33d), and the system-monospace decision (d41c854), which reverses the first.This round started as "post the new renders for ville" and turned into making the site actually shippable. Full-length renders exposed three problems the previous sign-off set could not show: it was cropped at 2600px and rendered through a harness that flattered production.
1. Nothing delivered the pages
The generated patterns stopped at
wp-preview/. No template used them, the theme didn't register them, and neither did the plugin. The live front page wasfront-page.html: a hand-built template of placeholderhero-homeandproducts-griddefaults, a query loop and a newsletter band. Every render and every gate so far measured pages the deploy would never have put on the site.Now
build_surfacesalso writes each pattern intotoilville-fse/patterns/(auto-registered by its header), plus a template per page:front-page.html, andpage-rituals/-spelwork/-news/-contact.html, each one header + pattern + footer. The theme copies drift-gate like every other artifact. New gate:test_every_generated_page_ships_in_the_theme, verified red by removing a template.Deploy becomes: plugin, then theme, then create four pages with the slugs
rituals,spelwork,news,contact(they can be empty). Documented inDESIGN_TO_WP.md.2. Every band would have been 760px wide
The theme's
contentSizeis 760px. Each pattern wraps its page in a constrained<main>, and no band was aligned — so WordPress would have capped every section on every page at 760px. The harness hid it behind amax-width:1160pxrule that I'd invented. Now every band isalign: full, the<main>wrapper isalignfull, and the harness applies WordPress's real constrained layout (760 / 1160 / 30px root padding). New gate:test_band_blocks_are_full_width, verified red.That was the third time the harness flattered production. The other two are fixed here as well: the
get_block_wrapper_attributes()shim droppedstyle, so every grid rendered three across, and it now emitsclass,style,idand the align class as WordPress does.3. Home, Spelwork and News didn't match the design
6b35fdd), and ville's last sign-off images still showed the cards.Links go somewhere
The design canvas navigates by hash routes (
#rituals,#contact), and the site is five pages. All eleven links now map to real pages, and in-page links (/spelwork/#spelwork-docs) land on anchors. The converter used to drop sectionids; it now pins each one to the section's heading (header.anchor, declared in the vocabulary), and the client carries it onto the band.Fonts
Every mono label named DM Mono — fourteen blocks — and the live site loaded it nowhere:
theme.jsondeclared the family without afontFace, and nothing enqueued fonts. The harness hid it by pulling fonts from Google. The harness now loads only whattheme.jsondeclares, and a new gate fails on any web font a block names that the theme doesn't load (verified red against all fourteen blocks).22a3609fixed that by vendoring DM Mono.d41c854settles it the other way; see below.The mono face is the system monospace
DM Mono was never a Toilville decision. It arrived as one line in the bulk token expansion
7237c58and spread from there. Peter chose the system face:ui-monospace, Menlo, Consolas, 'Liberation Mono', 'Courier New', monospace. It changed everywhere it lived:typography.font.monoand the legacy ladder. Every product inherits it, so every product indist/is regenerated.mono, a system stack with nofontFace. The vendored files go.ui-monospace.docs.pyanddoc_build.pynow skip CSS generics and name Courier New, which every recipient has. System faces are neither embedded nor reported missing.CLAUDE.md, and the decision indocs/reviews/theme-alignment-strategy.md.Committed with
--no-verify. The shared pre-commit hook's native-token sync writes to_ROOT.parent/Toilville_Rituals, which from a worktree is outside any repo, and its other job — regenerating the brand guide — was run by hand and is in the commit.Not touched:
dist/rituals/artifact-phone.htmlstill names DM Mono. Nothing in the repo generates it (last touched 2026-06-30), anddist/isn't hand-edited.New checks
copy_coverage.py check): the block adds an arrow and the copy carries one. Verified red on the News links.align,anchor,className).Verified
Against toilville_rituals
mainat92f7884, with #391 merged:just checkgreen; rootpytestas CI runs it: 304 passed, 0 skippedNot in this PR
News and Home "Latest" render the design's sample posts as static content, with links to real pages. Wiring
post-listto real WordPress posts is a follow-up decision.This round started as "post the new renders for ville" and became making the site shippable. Full-length renders exposed what the cropped sign-off set, and a harness that flattered production, could not. Nothing delivered the pages. The generated patterns stopped at wp-preview/: no template used them and neither theme nor plugin registered them. The live front page was front-page.html — placeholder hero-home/products-grid defaults, a query loop, a newsletter band. build_surfaces now also writes each pattern into toilville-fse/patterns/ (auto-registered by header) and a template per page: front-page.html and page-{rituals,spelwork,news,contact}.html, each header + pattern + footer. Drift-gated like every artifact; new gate test_every_generated_page_ships_in_the_theme, verified red. Every band would have been 760px wide. The theme's contentSize is 760px, each pattern wraps its page in a constrained <main>, and no band was aligned. Bands are now align:full and <main> is alignfull; new gate test_band_blocks_are_full_width, verified red. The harness applies WordPress's real constrained layout instead of an invented 1160px column, and its get_block_wrapper_attributes shim emits style, id and the align class — it had dropped `style`, so every grid rendered three across. Fidelity: Home's product cards are back (regressed in my6b35fdd); Spelwork in Spelwork blue, docs tags that repeat read as categories, four across, a stats panel, cool tones; closing bands for Rituals (it had none) and Spelwork, and a link instead of a signup form on Home; News gets a hero; its doubled "→ →" are gone; the Latest head row is inline; "Who we are" is one panel with a founder sidebar; the terminal and console captions sit in their bands. Links: the canvas navigates by hash routes (#rituals, #contact); the site is five pages. All eleven now map to real pages, and in-page links land — the converter pins each section id to its heading (header.anchor, declared in the vocabulary) and the client carries it onto the band. New check in copy_coverage: doubled decorations, verified red on the News links. The attribute gate understands supports-derived attributes. 297 passed, 0 skipped; copy coverage 100% x 5 with every check clean; just check green.Before/after
Each image has three columns: the design canvas, what
mainships today, and what this PR ships. The middle column is laid out the way WordPress will lay it out, with the theme's 760px content column and its real fonts. Pages are full length, not cropped. The PNGs are on #127.Deploying
mainas it stands would put this on the site:Every block renders through its real
render.phpfrom toilville_ritualsmain, which includes #390 and #391. The mono labels use the system monospace.Known differences, for ville to call