themes-pastel-dream/templates/email/pastel-dream.ninjatpl
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

100 lines
4.8 KiB
Plaintext

<!doctype html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="x-apple-disable-message-reformatting">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{ site_name }}</title>
<style type="text/css">
body, table, td, p, a, li, blockquote {
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
table, td {
mso-table-lspace: 0pt;
mso-table-rspace: 0pt;
}
img {
-ms-interpolation-mode: bicubic;
border: 0;
height: auto;
line-height: 100%;
outline: none;
text-decoration: none;
}
body {
margin: 0 !important;
padding: 0 !important;
width: 100% !important;
}
a[x-apple-data-detectors] {
color: inherit !important;
text-decoration: none !important;
}
h1, h2, h3, h4, h5, h6 {
font-family: "Fraunces", "Playfair Display", Georgia, "Times New Roman", serif;
font-weight: 600;
}
@media only screen and (max-width: 620px) {
.pd-email-container {
width: 100% !important;
max-width: 100% !important;
}
.pd-email-padding {
padding-left: 24px !important;
padding-right: 24px !important;
}
}
</style>
</head>
<body style="background-color: {{ colors.background|default:"#faf4ed" }}; margin: 0; padding: 0; font-family: &amp;#39;Quicksand&amp;#39;, &amp;#39;Nunito&amp;#39;, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, sans-serif;">
{% if preview_text %}<div style="display: none; max-height: 0; overflow: hidden; mso-hide: all;">{{ preview_text }}</div>{% endif %}
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td align="center" style="padding: 40px 10px; background-color: {{ colors.background|default:"#faf4ed" }};">
<table role="presentation" class="pd-email-container" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width: 560px; background-color: {{ colors.card|default:"#fdf9f4" }}; border: 1px solid {{ colors.border|default:"#e5d6c9" }}; border-radius: 4px;">
<tr>
<td align="center" style="padding: 32px 40px 16px; border-bottom: 1px dashed {{ colors.border|default:"#e5d6c9" }};">
{% if logo_url %}<img src="{{ logo_url }}" alt="{{ site_name }}" style="max-height: 48px; width: auto; display: block;">{% elif site_name %}<h1 style="margin: 0; font-size: 24px; letter-spacing: -0.01em; color: {{ colors.primary|default:"#d05a83" }};">{{ site_name }}</h1>{% endif %}
</td>
</tr>
<tr>
<td class="pd-email-padding" style="padding: 32px 40px; color: {{ colors.foreground|default:"#47323c" }}; font-size: 16px; line-height: 1.65;">{{ body|safe }}</td>
</tr>
<tr>
<td align="center" style="padding: 16px 40px 8px;">
<!-- inline SVG doodle divider, survives Outlook -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0"><tr><td>
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="32" viewBox="0 0 200 32" fill="none" stroke="{{ colors.primary|default:"#d05a83" }}" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M4 18 L80 18"></path>
<path d="M120 18 L196 18"></path>
<ellipse cx="95" cy="18" rx="6" ry="9"></ellipse>
<path d="M95 9 L95 27"></path>
<ellipse cx="108" cy="18" rx="6" ry="9"></ellipse>
<path d="M108 9 L108 27"></path>
</svg>
</td></tr></table>
</td>
</tr>
<tr>
<td style="padding: 16px 40px 32px; color: {{ colors.mutedForeground|default:"#79626c" }}; font-size: 12px; line-height: 1.6;">
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td align="center">
{% if site_name %}<p style="margin: 0 0 6px; font-size: 13px; color: {{ colors.foreground|default:"#47323c" }};">{{ site_name }}</p>{% endif %}
<p style="margin: 0 0 6px;">Fresh bakes from the morning. Cakes to order all week.</p>
{% if site_url %}<p style="margin: 0 0 8px;"><a href="{{ site_url }}" style="color: {{ colors.primary|default:"#d05a83" }}; text-decoration: none; border-bottom: 1px dashed {{ colors.primary|default:"#d05a83" }};">{{ site_url }}</a></p>{% endif %}
{% if unsubscribe_url %}<p style="margin: 0; font-size: 11px;"><a href="{{ unsubscribe_url }}" style="color: {{ colors.mutedForeground|default:"#79626c" }}; text-decoration: none;">Unsubscribe</a></p>{% endif %}
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>