Alex Dunmow 99c1c4f652 feat(theme): Wave A corporate-modernist — 49 overrides, 7 templates, seed (WO-TF-014)
Full Wave A OVERRIDE-CONTRACT delivery for the B2B-consultancy theme
(Swiss grid, Bauhaus geometric marks, oversized tabular numerals, hairlines).

- 49/49 mandatory builtin overrides + manifest template_overrides entries,
  authored against the frozen builtin schemas. Fixed legacy button (variant/
  href/text -> style/link/label) and card (body/image -> text/media) reads.
- 7 page templates: default, full-width, landing, article, blog-index,
  contact, auth.
- Blocks rework: deleted 7 duplicate theme blocks (now builtin overrides);
  kept case_study_card; added capability_matrix, engagement_process,
  credential_bar. master_pages.json rewired to builtins.
- 5 dual-mode presets (all 19 tokens, tuned dark): navy-classic, forest-quiet,
  burgundy-tradition, graphite-mono, signal-red.
- Bundled fonts (OFL-1.1 latin subsets): Inter + JetBrains Mono, licenses
  recorded; all font-family via var(--font-*). RECOMMENDED_FONTS/ICONS updated;
  required_icon_packs = [lucide, simple-icons].
- Complete .cm-* CSS component vocabulary in manifest css.input_css_append;
  CSS-first motion with prefers-reduced-motion honored.
- Themed email-safe wrapper (tables + inline styles).
- Demo seed (demo:true): Meridian Advisory home/about/blog+3 posts/contact/
  login; contact-form -> contact_submissions data table -> row_inserted
  email-admins workflow.
- Functional auth-form / password-reset-form overrides (real hx-post endpoints).

Verified: `make` exit 0 (codeless .bnp packs), check-safety 32 checks OK exit 0.
Visual identity UNVERIFIED until Wave B. Known limitation: data providers do not
reach declarative overrides in frozen cms (a0f07e2ae) render path — provider-
backed overrides authored faithfully, populate once the host wires providers.

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

24 lines
1.5 KiB
Plaintext

<!doctype html>
<html lang="en">
{{ head_html|safe }}
<body class="cm-body" style="margin: 0; min-height: 100vh; display: flex; flex-direction: column; background-color: hsl(var(--background)); color: hsl(var(--foreground));">
{{ admin_banner_html|safe }}
{% if slots.header %}<header class="cm-hairline-bottom" style="width: 100%;"><div class="cm-content-well">{{ slots.header|safe }}</div></header>{% endif %}
<main style="flex: 1 1 auto; width: 100%;" data-content-well>
<div class="cm-content-well cm-section">
{% if slots.aside %}
<div class="cm-swiss-12">
<div style="grid-column: span 12 / span 12;" class="cm-contact-main">{{ slots.main|safe }}</div>
<aside style="grid-column: span 12 / span 12;" class="cm-hairline-top cm-contact-aside">{{ slots.aside|safe }}</aside>
</div>
<style>@media (min-width: 1024px){.cm-contact-main{grid-column: span 7 / span 7 !important;} .cm-contact-aside{grid-column: 9 / span 4 !important; border-top: 0 !important; padding-left: 2rem; border-left: 1px solid hsl(var(--border));}}</style>
{% else %}
<div class="cm-swiss-12"><div style="grid-column: span 12 / span 12;" class="cm-measure">{% if slots.main %}{{ slots.main|safe }}{% else %}<p class="cm-stat-label">No content blocks assigned to this page.</p>{% endif %}</div></div>
{% endif %}
</div>
</main>
{% if slots.footer %}<footer style="width: 100%; margin-top: auto;">{{ slots.footer|safe }}</footer>{% endif %}
{{ body_end_html|safe }}
</body>
</html>