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

123 lines
11 KiB
JSON

{
"demo": true,
"settings": {
"merge": {
"site_name": "Meridian Advisory",
"tagline": "Strategy, operations, and risk counsel for boards."
}
},
"data_tables": [
{
"key": "contact_submissions",
"name": "Contact submissions",
"description": "Messages sent from the Meridian Advisory contact form.",
"primary_key": "id",
"columns": [
{ "key": "name", "label": "Name", "type": "text", "required": true },
{ "key": "email", "label": "Email", "type": "email", "required": true },
{ "key": "organisation", "label": "Organisation", "type": "text", "required": false },
{ "key": "message", "label": "Message", "type": "text", "required": true }
]
}
],
"pages": [
{
"slug": "/",
"title": "Meridian Advisory",
"template_key": "full-width",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "hero", "title": "Hero", "slot": "main", "sort_order": 1, "content": { "template": "left-aligned", "eyebrow": "B2B advisory", "headline": "Precise counsel for boards that move first", "subheadline": "We do strategy, operations, and risk work on a fixed scope. No retainers you cannot read.", "ctaPrimary": { "text": "Book a working session", "url": "/contact" }, "ctaSecondary": { "text": "See how we work", "url": "/about" } } },
{ "block_key": "corporate-modernist:credential_bar", "title": "Credentials", "slot": "main", "sort_order": 2, "content": { "items": [ { "figure": "18", "label": "Years in practice" }, { "figure": "6", "label": "Sectors served" }, { "figure": "40+", "label": "Board engagements" }, { "figure": "3", "label": "Continents" } ] } },
{ "block_key": "corporate-modernist:capability_matrix", "title": "Capabilities", "slot": "main", "sort_order": 3, "content": { "eyebrow": "What we do", "heading": "Three disciplines, one team", "intro": "Every engagement draws on the same three capabilities. We assign a principal to each.", "columns": 3, "capabilities": [ { "mark": "circle", "title": "Strategy", "text": "Market entry, portfolio choices, and the operating model that carries them." }, { "mark": "triangle", "title": "Operations", "text": "Cost structure, process design, and the metrics a board can hold." }, { "mark": "square", "title": "Risk", "text": "Controls, resilience, and the reporting that keeps regulators satisfied." } ] } },
{ "block_key": "stats", "title": "Outcomes", "slot": "main", "sort_order": 4, "content": { "heading": "Outcomes we measure", "columns": 3, "countUp": false, "items": [ { "value": "3.2", "suffix": "x", "label": "Median return on engagement" }, { "value": "90", "suffix": " days", "label": "Time to first decision" }, { "value": "12", "label": "Week average engagement" } ] } },
{ "block_key": "corporate-modernist:engagement_process", "title": "Process", "slot": "main", "sort_order": 5, "content": { "eyebrow": "How we work", "heading": "A fixed path from brief to handover", "steps": [ { "title": "Frame", "text": "We agree the question and the scope in one working session." }, { "title": "Diagnose", "text": "We gather evidence and test it against the board's own numbers." }, { "title": "Decide", "text": "We present options with a clear recommendation and the trade-offs." }, { "title": "Hand over", "text": "We leave the model, the plan, and the owners in place." } ] } },
{ "block_key": "cta", "title": "Closing CTA", "slot": "main", "sort_order": 6, "content": { "background": "band", "heading": "Book a working session", "text": "Ninety minutes with a principal. No pitch deck.", "primaryLabel": "Request a session", "primaryUrl": "/contact" } }
]
},
{
"slug": "/about",
"title": "About",
"template_key": "default",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "heading", "title": "Heading", "slot": "main", "sort_order": 1, "content": { "text": "A small firm by design", "level": 1 } },
{ "block_key": "text", "title": "Intro", "slot": "main", "sort_order": 2, "content": { "text": "<p>Meridian Advisory keeps a short bench. Every engagement is led by a principal, not passed to a junior team. We take fewer clients so we can go deeper on each one.</p>" } },
{ "block_key": "corporate-modernist:capability_matrix", "title": "Values", "slot": "main", "sort_order": 3, "content": { "eyebrow": "How we operate", "heading": "What holds across every brief", "columns": 3, "capabilities": [ { "mark": "square", "title": "Fixed scope", "text": "You know the price and the deadline before we start." }, { "mark": "circle", "title": "Evidence first", "text": "We argue from your data, not from a template deck." }, { "mark": "triangle", "title": "Clean handover", "text": "We finish by making ourselves unnecessary." } ] } },
{ "block_key": "team", "title": "Team", "slot": "main", "sort_order": 4, "content": { "heading": "The principals", "layout": "grid", "columns": 3, "members": [ { "name": "A. Reyes", "role": "Strategy", "bio": "Two decades in corporate strategy and market entry." }, { "name": "K. Osei", "role": "Operations", "bio": "Process and cost work across manufacturing and services." }, { "name": "M. Lindqvist", "role": "Risk", "bio": "Controls and resilience for regulated industries." } ] } },
{ "block_key": "corporate-modernist:case_study_card", "title": "Case study", "slot": "main", "sort_order": 5, "content": { "client": "Regional bank", "metric": "31%", "label": "Reduction in cost to serve", "summary": "A twelve-week operations review that reset the branch operating model.", "href": { "label": "Read the case", "href": "/blog/operations-reset" } } }
]
},
{
"slug": "/blog",
"title": "Insights",
"template_key": "blog-index",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "card", "title": "Post 1", "slot": "main", "sort_order": 1, "content": { "title": "Resetting a branch operating model", "text": "<p>What changed when a regional bank moved from headcount targets to cost-to-serve.</p>", "link": "/blog/operations-reset", "linkLabel": "Read" } },
{ "block_key": "card", "title": "Post 2", "slot": "main", "sort_order": 2, "content": { "title": "Reading a risk register the board will use", "text": "<p>Most registers are written for auditors. Here is how to write one for directors.</p>", "link": "/blog/risk-register", "linkLabel": "Read" } },
{ "block_key": "card", "title": "Post 3", "slot": "main", "sort_order": 3, "content": { "title": "The ninety-day decision", "text": "<p>Why the first real decision should land inside three months, not six.</p>", "link": "/blog/ninety-day-decision", "linkLabel": "Read" } }
]
},
{
"slug": "/blog/operations-reset",
"parent_slug": "/blog",
"title": "Resetting a branch operating model",
"template_key": "article",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Resetting a branch operating model", "level": 1 } },
{ "block_key": "text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "text": "<p>A regional bank asked us to cut cost to serve without closing branches. We started with the numbers the board already trusted. Then we tested each assumption against a week of real transactions.</p><p>The answer was not fewer branches. It was fewer tasks per branch. We moved back-office work to a shared team and gave each branch a single metric it could hold.</p>" } }
]
},
{
"slug": "/blog/risk-register",
"parent_slug": "/blog",
"title": "Reading a risk register the board will use",
"template_key": "article",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Reading a risk register the board will use", "level": 1 } },
{ "block_key": "text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "text": "<p>A risk register written for auditors lists everything. A register written for directors ranks a few things and says who owns them. The second kind gets read.</p><p>We keep the top ten risks on one page. Each has an owner, a trend, and a next action. Everything else lives in the appendix.</p>" } }
]
},
{
"slug": "/blog/ninety-day-decision",
"parent_slug": "/blog",
"title": "The ninety-day decision",
"template_key": "article",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "The ninety-day decision", "level": 1 } },
{ "block_key": "text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "text": "<p>Long engagements drift because no decision anchors them. We set a real decision inside the first ninety days. It forces the evidence to be good enough to act on.</p><p>The decision does not have to be final. It has to be real. A board that decides once will decide again faster.</p>" } }
]
},
{
"slug": "/contact",
"title": "Contact",
"template_key": "contact",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "contact-form", "title": "Contact form", "slot": "main", "sort_order": 1, "content": { "heading": "Request a working session", "description": "Tell us the question. We reply within one business day.", "submitLabel": "Send message", "successMessage": "Thank you. We will be in touch within one business day.", "formConfig": { "targetTable": "contact_submissions", "enabled": true, "captchaEnabled": false }, "fields": [ { "name": "name", "label": "Name", "type": "text", "required": true, "width": "half" }, { "name": "email", "label": "Email", "type": "email", "required": true, "width": "half" }, { "name": "organisation", "label": "Organisation", "type": "text", "required": false, "width": "full" }, { "name": "message", "label": "What can we help with?", "type": "textarea", "required": true, "width": "full" } ] } },
{ "block_key": "contact-card", "title": "Contact details", "slot": "aside", "sort_order": 1, "content": { "heading": "Direct", "columns": 1, "channels": [ { "icon": "lucide:mail", "label": "Email", "value": "hello@meridian.example", "link": "mailto:hello@meridian.example" }, { "icon": "lucide:phone", "label": "Phone", "value": "+61 2 5550 0100", "link": "tel:+61255500100" } ] } },
{ "block_key": "hours-location", "title": "Office hours", "slot": "aside", "sort_order": 2, "content": { "heading": "Office", "address": "Level 12, 100 Harbour Street, Sydney NSW 2000", "hours": [ { "day": "Monday to Friday", "hours": "9:00 to 17:30" }, { "day": "Saturday and Sunday", "closed": true } ] } }
]
},
{
"slug": "/login",
"title": "Sign in",
"template_key": "auth",
"reconcile_blocks": true,
"blocks": [
{ "block_key": "auth-form", "title": "Sign in", "slot": "main", "sort_order": 1, "content": { "default_tab": "login", "show_social": false } }
]
}
],
"menu_items": [
{ "menu": "main", "label": "Home", "page_slug": "/", "sort_order": 1 },
{ "menu": "main", "label": "About", "page_slug": "/about", "sort_order": 2 },
{ "menu": "main", "label": "Insights", "page_slug": "/blog", "sort_order": 3 },
{ "menu": "main", "label": "Contact", "page_slug": "/contact", "sort_order": 4 }
]
}