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

4.1 KiB

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.