fix(theme): self-host DM Mono — the site loaded it nowhere #133

Closed
peterswimm wants to merge 1 commit from feat/rituals-hero-and-contact into main
Owner

Every mono label on toilville.com names 'DM Mono' — eyebrows, breadcrumbs,
form labels, the footer, fourteen blocks in all — and nothing loaded it:
theme.json declared the family with no fontFace, and neither theme nor plugin
enqueues fonts. Production would have shown Courier New throughout.

Nobody saw it because the preview harness pulled Sora and DM Mono from Google
Fonts, so every render showed the real face. The harness now loads exactly what
the theme loads — @font-face rules built from theme.json's fontFace entries,
served from the theme's own files — so a preview can no longer flatter
production. A family with no fontFace gets none there either.

DM Mono 300/400/500 are vendored from google/fonts (SIL OFL 1.1, licence
alongside), named like the theme's Sora files. This implements the brand's
existing typography spec — DM Mono is the documented mono face — rather than
choosing a new one. (An earlier commit of mine declared the family without a
face on the theory that it only served five footer labels; the gate below found
fourteen blocks.)

New gate: every web font a block's CSS names must be loaded by a theme.json
fontFace, and every fontFace must point at a file that exists. Verified red:
without the faces it lists 'dm mono' against all fourteen blocks.

Scope

Testing

Impact Statement

  • Existing features:
  • Public APIs / contracts:
  • Schemas:
  • Data / artifacts:
  • Integrations:
  • Mappings:
  • Backward compatibility:

Docs

Every mono label on toilville.com names 'DM Mono' — eyebrows, breadcrumbs, form labels, the footer, fourteen blocks in all — and nothing loaded it: theme.json declared the family with no fontFace, and neither theme nor plugin enqueues fonts. Production would have shown Courier New throughout. Nobody saw it because the preview harness pulled Sora and DM Mono from Google Fonts, so every render showed the real face. The harness now loads exactly what the theme loads — @font-face rules built from theme.json's fontFace entries, served from the theme's own files — so a preview can no longer flatter production. A family with no fontFace gets none there either. DM Mono 300/400/500 are vendored from google/fonts (SIL OFL 1.1, licence alongside), named like the theme's Sora files. This implements the brand's existing typography spec — DM Mono is the documented mono face — rather than choosing a new one. (An earlier commit of mine declared the family without a face on the theory that it only served five footer labels; the gate below found fourteen blocks.) New gate: every web font a block's CSS names must be loaded by a theme.json fontFace, and every fontFace must point at a file that exists. Verified red: without the faces it lists 'dm mono' against all fourteen blocks. <!-- BEGIN ORG-POLICY (managed by .spel/bin/forge-policy-sync.sh — do not hand-edit; source: core.contributor_review_policy, policy_key=org_contributor_review) --> ## Scope <!-- One major feature or closely-related family only. Note any unrelated work split into a separate PR. --> ## Testing <!-- What tests were added/updated? If this is docs-only and skips behavior tests, say why. --> ## Impact Statement - Existing features: - Public APIs / contracts: - Schemas: - Data / artifacts: - Integrations: - Mappings: - Backward compatibility: <!-- "No expected impact" is fine per line above, but only after actually considering it. --> ## Docs <!-- Updated docs/examples/schemas/migration notes if the public contract changed? --> <!-- END ORG-POLICY -->
fix(theme): self-host DM Mono — the site loaded it nowhere
Some checks failed
PR policy check / policy-gate (pull_request) Successful in 0s
Security Scans / Gitleaks secret scan (pull_request) Successful in 29s
Security Scans / Trivy filesystem scan (pull_request) Successful in 33s
Test Generator / lint-workflows (pull_request) Successful in 24s
Test Generator / lint-prose (pull_request) Successful in 18s
Test Generator / test (pull_request) Failing after 52s
UDG dist drift gate / dist/ matches dtcg + udg sources (pull_request) Successful in 20s
Copy coverage / Design copy reaching rendered HTML (pull_request) Failing after 27s
9d4443252c
Every mono label on toilville.com names 'DM Mono' — eyebrows, breadcrumbs,
form labels, the footer, fourteen blocks in all — and nothing loaded it:
theme.json declared the family with no fontFace, and neither theme nor plugin
enqueues fonts. Production would have shown Courier New throughout.

Nobody saw it because the preview harness pulled Sora and DM Mono from Google
Fonts, so every render showed the real face. The harness now loads exactly what
the theme loads — @font-face rules built from theme.json's fontFace entries,
served from the theme's own files — so a preview can no longer flatter
production. A family with no fontFace gets none there either.

DM Mono 300/400/500 are vendored from google/fonts (SIL OFL 1.1, licence
alongside), named like the theme's Sora files. This implements the brand's
existing typography spec — DM Mono is the documented mono face — rather than
choosing a new one. (An earlier commit of mine declared the family without a
face on the theory that it only served five footer labels; the gate below found
fourteen blocks.)

New gate: every web font a block's CSS names must be loaded by a theme.json
fontFace, and every fontFace must point at a file that exists. Verified red:
without the faces it lists 'dm mono' against all fourteen blocks.
peterswimm closed this pull request 2026-09-12 18:05:30 +00:00
peterswimm deleted branch feat/rituals-hero-and-contact 2026-09-12 18:05:33 +00:00
Some checks failed
PR policy check / policy-gate (pull_request) Successful in 0s
Security Scans / Gitleaks secret scan (pull_request) Successful in 29s
Security Scans / Trivy filesystem scan (pull_request) Successful in 33s
Test Generator / lint-workflows (pull_request) Successful in 24s
Test Generator / lint-prose (pull_request) Successful in 18s
Test Generator / test (pull_request) Failing after 52s
UDG dist drift gate / dist/ matches dtcg + udg sources (pull_request) Successful in 20s
Copy coverage / Design copy reaching rendered HTML (pull_request) Failing after 27s

Pull request closed

Sign in to join this conversation.
No description provided.