feat(toilville): wire toilville.com into the deck to WP surface pipeline #101

Merged
peterswimm merged 1 commit from feat/toilville-site-surfaces into main 2026-09-09 20:35:47 +00:00
Owner

Stacked on #100. Base is feat/toilville-web-palette-tokens.

Puts the approved toilville.com design through the existing
.dc.html → ForgeBlock → WP FSE pattern ingestor, instead of shipping the
Claude Design export's 508 raw hex literals.

What landed

SourcesMedia/Decks/templates/toilville/: the canvas's five artboards
split into ToilvilleLanding.dc.html + four *Page.dc.html. The stale bundled
token snapshot is dropped; the helmet links the live
dist/toilville/skin.css, so the sources can't drift from generated tokens.

udg/products/toilville/wp-style.json — a palette_map that actually
resolves: 24 entries, including the new accent.spelwork /
accent.rituals / neutral.warm-* tokens.

Worth flagging separately: spelwork's existing map resolves to an empty
palette
— its paths use color.primary, which isn't a token key — which is
why its generated patterns carry no colour at all. tctd resolves exactly 1
of its entries. Probably worth a follow-up.

build_surfaces.pytoilville added to BRANDS, plus a *Page.dc.html
glob so a five-screen site isn't collapsed into one landing.php. Purely
additive; no existing brand ships a *Page source.

CTAs — annotated with the converter's own explicit grammar
(data-block="button" / "actions") rather than by changing the converter.
16 buttons across 7 groups. They now emit real wp:buttons bound to the
palette:

<!-- wp:button {"backgroundColor":"brand-primary"} -->
<a class="wp-block-button__link has-brand-primary-background-color …" href="#rituals">See Rituals</a>

Output

Page Blocks Actions
Landing (Home) 47 2
Rituals 62 2
Spelwork 73 3
News 18 0
Contact 15 0

5 patterns + 5 CLI renderings, and 5 forgeblock fixtures that pass
forgeblock_validate (gate went 21 → 26 fixtures).

Known fidelity gaps — please read before merging

These patterns are a token-bound content skeleton, not a pixel rendering of
the design. The heuristic converter was built for 6–12KB single-screen decks;
these artboards are 8–25KB each with interactive demos. Still lossy:

  • inline <em> in headings is displaced — "Governance should be a , not a
    plugin. primitive"
  • feature bullets reduce to (--)
  • grids/columns flatten — no column_set / fact_set detected
  • Contact's form and News's post list come through unstructured
  • Contact and News detect no actions (their CTAs aren't styled button-ish)

Each is fixable the same way the CTAs were — more data-block annotation on the
sources, no converter changes. I stopped here rather than spend the annotation
pass without checking whether you want the patterns to be faithful or whether
you'd rather hand-build the templates and keep these as content scaffolding.

Verification

  • just check — fully green; toilville now shows in wp_theme.py check
  • pytest generator/tests/ tools/wp_theme_ingestor/test_*.py — 267 passed
  • No dist/ changes (this PR touches sources + wp-preview only)

https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78

**Stacked on #100.** Base is `feat/toilville-web-palette-tokens`. Puts the approved toilville.com design through the **existing** `.dc.html → ForgeBlock → WP FSE pattern` ingestor, instead of shipping the Claude Design export's 508 raw hex literals. ## What landed **Sources** — `Media/Decks/templates/toilville/`: the canvas's five artboards split into `ToilvilleLanding.dc.html` + four `*Page.dc.html`. The stale bundled token snapshot is dropped; the helmet links the live `dist/toilville/skin.css`, so the sources can't drift from generated tokens. **`udg/products/toilville/wp-style.json`** — a `palette_map` that actually resolves: **24 entries**, including the new `accent.spelwork` / `accent.rituals` / `neutral.warm-*` tokens. > Worth flagging separately: `spelwork`'s existing map resolves to an **empty > palette** — its paths use `color.primary`, which isn't a token key — which is > why its generated patterns carry no colour at all. `tctd` resolves exactly 1 > of its entries. Probably worth a follow-up. **`build_surfaces.py`** — `toilville` added to `BRANDS`, plus a `*Page.dc.html` glob so a five-screen site isn't collapsed into one `landing.php`. Purely additive; no existing brand ships a `*Page` source. **CTAs** — annotated with the converter's *own* explicit grammar (`data-block="button"` / `"actions"`) rather than by changing the converter. 16 buttons across 7 groups. They now emit real `wp:buttons` bound to the palette: ```html <!-- wp:button {"backgroundColor":"brand-primary"} --> <a class="wp-block-button__link has-brand-primary-background-color …" href="#rituals">See Rituals</a> ``` ## Output | Page | Blocks | Actions | |---|---|---| | Landing (Home) | 47 | 2 | | Rituals | 62 | 2 | | Spelwork | 73 | 3 | | News | 18 | 0 | | Contact | 15 | 0 | 5 patterns + 5 CLI renderings, and 5 forgeblock fixtures that pass `forgeblock_validate` (gate went 21 → 26 fixtures). ## Known fidelity gaps — please read before merging These patterns are a **token-bound content skeleton, not a pixel rendering** of the design. The heuristic converter was built for 6–12KB single-screen decks; these artboards are 8–25KB each with interactive demos. Still lossy: - inline `<em>` in headings is displaced — *"Governance should be a , not a plugin. primitive"* - feature bullets reduce to `(--)` - grids/columns flatten — no `column_set` / `fact_set` detected - Contact's form and News's post list come through unstructured - Contact and News detect no actions (their CTAs aren't styled button-ish) Each is fixable the same way the CTAs were — more `data-block` annotation on the sources, no converter changes. I stopped here rather than spend the annotation pass without checking whether you want the patterns to be faithful or whether you'd rather hand-build the templates and keep these as content scaffolding. ## Verification - `just check` — fully green; `toilville` now shows in `wp_theme.py check` - `pytest generator/tests/ tools/wp_theme_ingestor/test_*.py` — 267 passed - No `dist/` changes (this PR touches sources + wp-preview only) https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78
feat(toilville): wire toilville.com into the deck -> WP surface pipeline
Some checks failed
PR policy check / policy-gate (pull_request) Failing after 0s
Security Scans / Trivy filesystem scan (pull_request) Successful in 38s
Security Scans / Gitleaks secret scan (pull_request) Successful in 28s
Test Generator / lint-workflows (pull_request) Successful in 25s
Test Generator / lint-prose (pull_request) Successful in 23s
UDG dist drift gate / dist/ matches dtcg + udg sources (pull_request) Successful in 19s
Test Generator / test (pull_request) Successful in 3m30s
5f8f8b3b86
Puts the approved website design through the existing
.dc.html -> ForgeBlock -> WP FSE pattern ingestor instead of shipping the
Claude Design export's 508 raw hex literals.

Sources (Media/Decks/templates/toilville/): the canvas's five artboards split
into ToilvilleLanding.dc.html plus four *Page.dc.html. The stale bundled token
snapshot is dropped; the helmet links the live dist/toilville/skin.css, so the
sources cannot drift from the generated tokens.

wp-style.json: a palette_map that actually resolves — 24 entries, including the
new accent.spelwork / accent.rituals / neutral.warm-* tokens. For contrast,
spelwork's existing map resolves to an EMPTY palette (its paths use
color.primary, which is not a token key), which is why its patterns carry no
colour at all. Worth fixing separately.

build_surfaces.py: toilville added to BRANDS, plus a *Page.dc.html glob so a
multi-screen site is not collapsed into one landing.php. Additive — no existing
brand ships a *Page source. _page_slug() derives the output name.

CTAs are annotated with the converter's own explicit grammar
(data-block="button"/"actions") rather than by changing the converter: 16
buttons across 7 groups. They now emit real wp:buttons blocks bound to the
palette (has-brand-primary-background-color), not hex.

Output: 5 patterns + 5 CLI renderings per page, and 5 forgeblock fixtures that
pass forgeblock_validate (21 -> 26 fixtures in the gate).

KNOWN FIDELITY GAPS — these patterns are a token-bound content skeleton, not a
pixel rendering of the design. Still to do:
  - inline <em> in headings is displaced ("a , not a plugin. primitive")
  - feature bullets reduce to "(--)"
  - grids/columns flatten (no column_set/fact_set detected)
  - Contact's form and News's post list are unstructured
  - Contact/News detect no actions

Claude-Session: https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78
peterswimm deleted branch feat/toilville-site-surfaces 2026-09-09 20:35:47 +00:00
Sign in to join this conversation.
No description provided.