# 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/.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 + `.schema.json` (draft-07) + `.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, )`. ### 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.