# 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.
