themes-pastel-dream/BUILD_REPORT.md
Alex Dunmow 1ee98d318a feat(pastel-dream): WO-TF-023 bakery/patisserie theme — full Wave A rebuild
Pivot from the wellness/spa WZ-021 state to the locked bakery/patisserie
persona. Codeless .bnp, verified against cms a0f07e2ae (OVERRIDE-CONTRACT).

- 49 mandatory template overrides (+ manifest entries), re-skinned from the
  field-correct coffee sibling: every content field, provider var, custom tag
  and JS preserved verbatim; only styling + copy changed. §4 button/card reads
  reconciled (link/style/label, text/media).
- 7 page templates: default, landing, article, full-width, blog-index,
  contact, auth.
- 4 persona blocks: seasonal_specials, cake_gallery, order_ribbon, bakers_note
  (old 6 duplicate-builtin blocks deleted -> now overrides).
- 5 dual-mode presets (morning-haze/berry-cream/matcha-cream/lavender-honey/
  peach-blossom), all 19 tokens, tuned dusk-berry dark.
- Bundled OFL fonts: Fraunces (heading) + Quicksand (body); all font-family via
  var(--font-*). Themed email-safe wrapper. master_pages + demo seed (home,
  about, blog x3, contact w/ data-table + row_inserted email workflow, login).
- CSS-FIRST motion: watercolor washes, scalloped edges, soft pills; reduced-
  motion honored.

Gates: make -> exit 0 (codeless .bnp); check-safety -> 19 ok 13 skip, exit 0.
Known limits per contract §11/§12 (auth trio + page-suggestions + provider-
backed lists inert until cms fix). Visuals UNVERIFIED until Wave B.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 12:41:03 +08:00

86 lines
4.1 KiB
Markdown

# Pastel Dream — Build Report (Wave A, WO-TF-023)
Bakery / patisserie persona. Codeless `.bnp` theme (no Go, no wasm). Built and
verified against cms main at `a0f07e2ae` (OVERRIDE-CONTRACT freeze).
## What landed
### Identity
- `plugin.mod`: `name = "pastel-dream"`, `kind = "theme"`, `scope = "@themes"`,
`version = "0.2.0"`, bakery tags, `required_icon_packs = ["lucide", "simple-icons"]`.
- `manifest.yaml`: system template `pastel-dream`, 7 page templates, email
wrapper, 49 template overrides, `css.input_css_append` (pastel utility layer),
icon packs, presets/fonts/master-pages references.
### Overrides (49 mandatory keys)
- One `templates/overrides/pastel-dream/<key>.ninjatpl` per mandatory key, plus a
`template_overrides` entry per key. Re-skinned from the field-correct `coffee`
sibling (frozen at the same cms pin): every content field, provider var, custom
tag, and JS block preserved verbatim; only styling and copy changed to the
pastel bakery identity. Legacy button/card reads already reconciled per §4
(`link`/`style`/`label`, `text`/`media`).
### Page templates (7)
- `default`, `landing`, `article`, `full-width`, `blog-index`, `contact`, `auth`
under `templates/pastel-dream/`. Soft watercolor-wash chrome (`pd-paper` body).
### Persona blocks (4)
- `pastel-dream:seasonal_specials`, `pastel-dream:cake_gallery`,
`pastel-dream:order_ribbon`, `pastel-dream:bakers_note`. Each is a
`blocks/blocks.yaml` definition + `<key>.schema.json` (draft-07) +
`<key>.ninjatpl`. Media via `{% img %}`; arrays via `x-editor: collection`.
The six old duplicate-builtin blocks (soft-navbar, watercolor-hero,
affirmation, testimonial-soft, feature-grid-soft, cozy-footer) were deleted;
their surfaces are now the navbar/hero/quote/testimonial/feature-grid/footer
overrides.
### Presets (5, dual-mode)
- `morning-haze`, `berry-cream`, `matcha-cream`, `lavender-honey`,
`peach-blossom`. All `mode: "both"`, all 19 tokens per light + dark. Dark is a
tuned dusk plum/berry ground (not a lightened pastel) per the WO.
### Fonts (bundled, OFL)
- `fonts.json`: **Fraunces** 400/600 (heading) + **Quicksand** 400/700 (body),
woff2 in `assets/fonts/`, OFL-1.1 recorded in `assets/fonts/OFL.txt`. Every
`font-family` resolves through `var(--font-heading|body|mono, <fallback>)`.
### Email
- `templates/email/pastel-dream.ninjatpl`: table-based, inline styles, pastel
hex fallbacks for clients without CSS custom properties, scalloped divider.
### Master pages + seed
- `master_pages.json`: default/landing/blog/auth masters, "Petal & Crumb" brand.
- `seed/seed.json` (`demo: true`): home, about, blog index + 3 posts, contact,
login. Contact form → `contact_submissions` data table via
`formConfig.targetTable`. `seed/workflows.json`: `row_inserted`
email-admins ("Form Submission Notification", recipients admins/all). Bakery
voice, no LLM-isms, no em-dashes, no fabricated stats.
### Motion tier: CSS-FIRST
- Watercolor wash + gentle `pd-breathe` blob drift + brush draw-in only. No
canvas, no JS showpiece. All animation disabled under
`prefers-reduced-motion: reduce`.
## Verification (both exit 0)
```
$ cd themes/pastel-dream && make
Built pastel-dream@0.2.0 (codeless) → pastel-dream-0.2.0.bnp # EXIT 0
$ cd check-safety && go run . themes/pastel-dream
32 checks: 19 ok 13 skip -> OK # EXIT 0
```
Runtime template rendering is not exercised by these gates (codeless build +
check-safety are static). Visual correctness stays UNVERIFIED until Wave B.
## Known limits (platform gaps, per OVERRIDE-CONTRACT §11/§12)
- `auth-form`, `auth-status`, `password-reset-form`, `page-suggestions` overrides
are inert until the compiled-block override-dispatch fix lands (authored
correctly to model).
- Provider-backed overrides (navbar/footer menus, featured/related/popular posts,
category-list, breadcrumbs, blog-hero, sidebar-nav, author-bio-hero) render
themed chrome but empty lists until the codeless loader registers overrides via
the source path. Authored faithful to the builtin provider var names.
- `preview.png` is the old (wellness) render and must be regenerated in Wave B.