feat(theme): the real nav and footer, extracted from the design canvas #118

Merged
peterswimm merged 1 commit from feat/nav-and-footer into main 2026-09-10 19:47:28 +00:00
Owner

parts/footer.html was 134 bytes of wp:spacer — no sitemap, no tagline, no copyright. Template parts sit outside the ForgeBlock pattern pipeline, so when the pre-split canvas was cut into per-page decks the chrome was dropped and every gate stayed green.

Extracted, not re-authored. The canvas still had <header> and <footer> intact. Both now come into the repo as ToilvilleSiteChrome.dc.html so the extraction has a source that can be gated, and both parts carry 100% of its copy.

header

Rituals · Spelwork · News, with Contact as a pill.

This replaces wp:navigation {"ref":35} — a hard-coded nav-menu post id that exists on exactly one install and silently renders nothing anywhere else. Explicit navigation-links need no menu to be created first.

The three-column sitemap (Product · Developers · Company), the tagline, the contact address and the copyright rule.

Tokenised, not transcribed

The design's #4A443F, #A6432B and #C05734 are exactly neutral-warm-body, accent-rituals and primary. Its two near-identical muted greys both collapse to neutral-warm-muted; the 8%-ink hairlines become the border preset. No raw hex in either part.

theme.json gains a dm-mono font family for the mono labels — the stack the blocks already use literally, with no fontFace, because the brand's mono voice degrades to Courier New rather than shipping a webfont for five footer labels.

Why wp:site-logo and not the new product-logo block

The chrome should survive the plugin being deactivated, and the site logo is admin-settable — that's the FSE idiom for site identity. Product lockups inside page content still use toilville/product-logo (toilville_rituals#376).

New gate

test_template_parts.py, verified red on both regressions: dropping a nav item fails, and restoring the spacer footer fails.

It reads block attributes as well as text nodes, because a nav label lives in the block comment as {"label":"Rituals"} and never appears as a text node — the exact mirror of copy_coverage.py, which must ignore attributes for the opposite reason.

just check green; 285 tests pass.

https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78

`parts/footer.html` was **134 bytes of `wp:spacer`** — no sitemap, no tagline, no copyright. Template parts sit outside the ForgeBlock pattern pipeline, so when the pre-split canvas was cut into per-page decks the chrome was dropped and every gate stayed green. **Extracted, not re-authored.** The canvas still had `<header>` and `<footer>` intact. Both now come into the repo as `ToilvilleSiteChrome.dc.html` so the extraction has a source that can be gated, and both parts carry **100%** of its copy. ### header `Rituals · Spelwork · News`, with `Contact` as a pill. This replaces `wp:navigation {"ref":35}` — a hard-coded nav-menu post id that exists on exactly one install and silently renders nothing anywhere else. Explicit `navigation-link`s need no menu to be created first. ### footer The three-column sitemap (Product · Developers · Company), the tagline, the contact address and the copyright rule. ### Tokenised, not transcribed The design's `#4A443F`, `#A6432B` and `#C05734` are *exactly* `neutral-warm-body`, `accent-rituals` and `primary`. Its two near-identical muted greys both collapse to `neutral-warm-muted`; the 8%-ink hairlines become the `border` preset. **No raw hex in either part.** `theme.json` gains a `dm-mono` font family for the mono labels — the stack the blocks already use literally, with no `fontFace`, because the brand's mono voice degrades to Courier New rather than shipping a webfont for five footer labels. ### Why `wp:site-logo` and not the new `product-logo` block The chrome should survive the plugin being deactivated, and the site logo is admin-settable — that's the FSE idiom for site identity. Product lockups *inside page content* still use `toilville/product-logo` (toilville_rituals#376). ### New gate `test_template_parts.py`, **verified red on both regressions**: dropping a nav item fails, and restoring the spacer footer fails. It reads block **attributes** as well as text nodes, because a nav label lives in the block comment as `{"label":"Rituals"}` and never appears as a text node — the exact mirror of `copy_coverage.py`, which must *ignore* attributes for the opposite reason. `just check` green; 285 tests pass. https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78
feat(theme): the real nav and footer, extracted from the design canvas
Some checks failed
PR policy check / policy-gate (pull_request) Failing after 0s
Security Scans / Trivy filesystem scan (pull_request) Successful in 2m55s
Security Scans / Gitleaks secret scan (pull_request) Successful in 2m3s
Test Generator / test (pull_request) Failing after 2m3s
Test Generator / lint-workflows (pull_request) Successful in 2m26s
Test Generator / lint-prose (pull_request) Successful in 2m38s
UDG dist drift gate / dist/ matches dtcg + udg sources (pull_request) Successful in 3m11s
ac85f6ce56
`parts/footer.html` was 134 bytes of `wp:spacer` — no sitemap, no tagline, no
copyright. Template parts sit outside the ForgeBlock pattern pipeline, so when
the pre-split canvas was cut into per-page decks the chrome was dropped and
every gate stayed green.

Extracted, not re-authored. The canvas still had <header> and <footer> intact;
both now come into the repo as ToilvilleSiteChrome.dc.html so the extraction has
a source that can be gated, and both template parts carry 100% of its copy.

  header — Rituals · Spelwork · News, with Contact as a pill. Replaces
  `wp:navigation {"ref":35}`: a hard-coded nav-menu post id that exists on
  exactly one install and silently renders nothing anywhere else. Explicit
  navigation-links need no menu to be created first.

  footer — the three-column sitemap (Product · Developers · Company), the
  tagline, the contact address and the copyright rule.

Tokenised rather than transcribed: the design's #4A443F, #A6432B and #C05734 are
exactly `neutral-warm-body`, `accent-rituals` and `primary`; its two near-identical
muted greys both collapse to `neutral-warm-muted`; the 8%-ink hairlines become the
`border` preset. No raw hex in either part.

theme.json gains a `dm-mono` font family for the mono labels — the stack the
blocks already use literally, with no fontFace, because the brand's mono voice
degrades to Courier New rather than shipping a webfont for five footer labels.

Site identity uses `wp:site-logo`, not the new toilville/product-logo block:
the chrome should survive the plugin being deactivated, and the logo is
admin-settable. Product lockups inside page content still use the block.

New gate, verified red on both regressions: dropping a nav item and restoring
the spacer footer each fail. It reads block ATTRIBUTES as well as text nodes,
because a nav label lives in the block comment as {"label":"Rituals"} — the
mirror of copy_coverage.py, which must ignore attributes for the opposite reason.

Claude-Session: https://claude.ai/code/session_01Kbzfscp4w5enUrZxMnDt78
peterswimm deleted branch feat/nav-and-footer 2026-09-10 19:47:28 +00:00
Sign in to join this conversation.
No description provided.