From 99c1c4f652f8aea036035e53cab9553c56f70e9c Mon Sep 17 00:00:00 2001 From: Alex Dunmow Date: Sun, 5 Jul 2026 11:05:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(theme):=20Wave=20A=20corporate-modernist?= =?UTF-8?q?=20=E2=80=94=2049=20overrides,=207=20templates,=20seed=20(WO-TF?= =?UTF-8?q?-014)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- BUILD_REPORT.md | 125 ------- RECOMMENDED_FONTS.md | 75 ++-- RECOMMENDED_ICONS.md | 16 + assets/fonts/LICENSES.md | 19 + assets/fonts/inter-latin-400.woff2 | Bin 0 -> 16708 bytes assets/fonts/inter-latin-500.woff2 | Bin 0 -> 17552 bytes assets/fonts/inter-latin-600.woff2 | Bin 0 -> 17660 bytes assets/fonts/inter-latin-700.woff2 | Bin 0 -> 17784 bytes assets/fonts/jetbrains-mono-latin.woff2 | Bin 0 -> 40404 bytes blocks/blocks.yaml | 66 ++-- blocks/capability_matrix.ninjatpl | 1 + blocks/capability_matrix.schema.json | 38 ++ blocks/credential_bar.ninjatpl | 1 + blocks/credential_bar.schema.json | 20 ++ blocks/cta_strip.ninjatpl | 1 - blocks/cta_strip.schema.json | 30 -- blocks/engagement_process.ninjatpl | 1 + blocks/engagement_process.schema.json | 23 ++ blocks/footer.ninjatpl | 1 - blocks/footer.schema.json | 52 --- blocks/hero_statement.ninjatpl | 1 - blocks/hero_statement.schema.json | 46 --- blocks/leadership_grid.ninjatpl | 1 - blocks/leadership_grid.schema.json | 32 -- blocks/logo_strip.ninjatpl | 1 - blocks/logo_strip.schema.json | 42 --- blocks/stat_pair.ninjatpl | 1 - blocks/stat_pair.schema.json | 30 -- blocks/testimonial_quote.ninjatpl | 1 - blocks/testimonial_quote.schema.json | 41 --- fonts.json | 21 +- manifest.yaml | 337 ++++++++++++++++-- master_pages.json | 24 +- presets.json | 104 +++++- seed/seed.json | 122 +++++++ seed/workflows.json | 19 + templates/corporate-modernist/auth.ninjatpl | 17 + .../corporate-modernist/blog-index.ninjatpl | 17 + .../corporate-modernist/contact.ninjatpl | 23 ++ .../announcement-bar.ninjatpl | 8 + .../corporate-modernist/audio-embed.ninjatpl | 14 + .../corporate-modernist/auth-form.ninjatpl | 22 ++ .../corporate-modernist/auth-status.ninjatpl | 1 + .../author-bio-hero.ninjatpl | 1 + .../corporate-modernist/author-bio.ninjatpl | 1 + .../corporate-modernist/blog-hero.ninjatpl | 1 + .../corporate-modernist/breadcrumbs.ninjatpl | 1 + .../corporate-modernist/button.ninjatpl | 7 +- .../corporate-modernist/card.ninjatpl | 2 +- .../category-list.ninjatpl | 1 + .../corporate-modernist/contact-card.ninjatpl | 14 + .../corporate-modernist/contact-form.ninjatpl | 34 ++ .../corporate-modernist/countdown.ninjatpl | 44 +++ .../corporate-modernist/cta.ninjatpl | 8 + .../corporate-modernist/divider.ninjatpl | 2 + .../corporate-modernist/event-list.ninjatpl | 31 ++ .../corporate-modernist/faq.ninjatpl | 6 + .../corporate-modernist/feature-grid.ninjatpl | 7 + .../featured-posts.ninjatpl | 1 + .../corporate-modernist/footer.ninjatpl | 17 + .../corporate-modernist/gallery.ninjatpl | 6 + .../corporate-modernist/hero.ninjatpl | 24 ++ .../hours-location.ninjatpl | 18 + .../corporate-modernist/image.ninjatpl | 5 + .../corporate-modernist/logo-strip.ninjatpl | 5 + .../corporate-modernist/menu-list.ninjatpl | 21 ++ .../corporate-modernist/navbar.ninjatpl | 1 + .../newsletter-signup.ninjatpl | 1 + .../page-suggestions.ninjatpl | 1 + .../password-reset-form.ninjatpl | 11 + .../popular-posts.ninjatpl | 1 + .../corporate-modernist/post-hero.ninjatpl | 1 + .../post-metadata.ninjatpl | 1 + .../corporate-modernist/pricing.ninjatpl | 14 + .../corporate-modernist/quote.ninjatpl | 6 + .../related-posts.ninjatpl | 1 + .../corporate-modernist/rich-section.ninjatpl | 10 + .../corporate-modernist/rich-text.ninjatpl | 2 + .../corporate-modernist/sidebar-nav.ninjatpl | 3 + .../corporate-modernist/social-links.ninjatpl | 7 + .../corporate-modernist/stats.ninjatpl | 6 + .../corporate-modernist/team.ninjatpl | 12 + .../corporate-modernist/testimonial.ninjatpl | 9 + .../corporate-modernist/timeline.ninjatpl | 6 + .../corporate-modernist/utility-bar.ninjatpl | 9 + .../corporate-modernist/video-embed.ninjatpl | 11 + 86 files changed, 1221 insertions(+), 543 deletions(-) delete mode 100644 BUILD_REPORT.md create mode 100644 RECOMMENDED_ICONS.md create mode 100644 assets/fonts/LICENSES.md create mode 100644 assets/fonts/inter-latin-400.woff2 create mode 100644 assets/fonts/inter-latin-500.woff2 create mode 100644 assets/fonts/inter-latin-600.woff2 create mode 100644 assets/fonts/inter-latin-700.woff2 create mode 100644 assets/fonts/jetbrains-mono-latin.woff2 create mode 100644 blocks/capability_matrix.ninjatpl create mode 100644 blocks/capability_matrix.schema.json create mode 100644 blocks/credential_bar.ninjatpl create mode 100644 blocks/credential_bar.schema.json delete mode 100644 blocks/cta_strip.ninjatpl delete mode 100644 blocks/cta_strip.schema.json create mode 100644 blocks/engagement_process.ninjatpl create mode 100644 blocks/engagement_process.schema.json delete mode 100644 blocks/footer.ninjatpl delete mode 100644 blocks/footer.schema.json delete mode 100644 blocks/hero_statement.ninjatpl delete mode 100644 blocks/hero_statement.schema.json delete mode 100644 blocks/leadership_grid.ninjatpl delete mode 100644 blocks/leadership_grid.schema.json delete mode 100644 blocks/logo_strip.ninjatpl delete mode 100644 blocks/logo_strip.schema.json delete mode 100644 blocks/stat_pair.ninjatpl delete mode 100644 blocks/stat_pair.schema.json delete mode 100644 blocks/testimonial_quote.ninjatpl delete mode 100644 blocks/testimonial_quote.schema.json create mode 100644 seed/seed.json create mode 100644 seed/workflows.json create mode 100644 templates/corporate-modernist/auth.ninjatpl create mode 100644 templates/corporate-modernist/blog-index.ninjatpl create mode 100644 templates/corporate-modernist/contact.ninjatpl create mode 100644 templates/overrides/corporate-modernist/announcement-bar.ninjatpl create mode 100644 templates/overrides/corporate-modernist/audio-embed.ninjatpl create mode 100644 templates/overrides/corporate-modernist/auth-form.ninjatpl create mode 100644 templates/overrides/corporate-modernist/auth-status.ninjatpl create mode 100644 templates/overrides/corporate-modernist/author-bio-hero.ninjatpl create mode 100644 templates/overrides/corporate-modernist/author-bio.ninjatpl create mode 100644 templates/overrides/corporate-modernist/blog-hero.ninjatpl create mode 100644 templates/overrides/corporate-modernist/breadcrumbs.ninjatpl create mode 100644 templates/overrides/corporate-modernist/category-list.ninjatpl create mode 100644 templates/overrides/corporate-modernist/contact-card.ninjatpl create mode 100644 templates/overrides/corporate-modernist/contact-form.ninjatpl create mode 100644 templates/overrides/corporate-modernist/countdown.ninjatpl create mode 100644 templates/overrides/corporate-modernist/cta.ninjatpl create mode 100644 templates/overrides/corporate-modernist/divider.ninjatpl create mode 100644 templates/overrides/corporate-modernist/event-list.ninjatpl create mode 100644 templates/overrides/corporate-modernist/faq.ninjatpl create mode 100644 templates/overrides/corporate-modernist/feature-grid.ninjatpl create mode 100644 templates/overrides/corporate-modernist/featured-posts.ninjatpl create mode 100644 templates/overrides/corporate-modernist/footer.ninjatpl create mode 100644 templates/overrides/corporate-modernist/gallery.ninjatpl create mode 100644 templates/overrides/corporate-modernist/hero.ninjatpl create mode 100644 templates/overrides/corporate-modernist/hours-location.ninjatpl create mode 100644 templates/overrides/corporate-modernist/image.ninjatpl create mode 100644 templates/overrides/corporate-modernist/logo-strip.ninjatpl create mode 100644 templates/overrides/corporate-modernist/menu-list.ninjatpl create mode 100644 templates/overrides/corporate-modernist/navbar.ninjatpl create mode 100644 templates/overrides/corporate-modernist/newsletter-signup.ninjatpl create mode 100644 templates/overrides/corporate-modernist/page-suggestions.ninjatpl create mode 100644 templates/overrides/corporate-modernist/password-reset-form.ninjatpl create mode 100644 templates/overrides/corporate-modernist/popular-posts.ninjatpl create mode 100644 templates/overrides/corporate-modernist/post-hero.ninjatpl create mode 100644 templates/overrides/corporate-modernist/post-metadata.ninjatpl create mode 100644 templates/overrides/corporate-modernist/pricing.ninjatpl create mode 100644 templates/overrides/corporate-modernist/quote.ninjatpl create mode 100644 templates/overrides/corporate-modernist/related-posts.ninjatpl create mode 100644 templates/overrides/corporate-modernist/rich-section.ninjatpl create mode 100644 templates/overrides/corporate-modernist/rich-text.ninjatpl create mode 100644 templates/overrides/corporate-modernist/sidebar-nav.ninjatpl create mode 100644 templates/overrides/corporate-modernist/social-links.ninjatpl create mode 100644 templates/overrides/corporate-modernist/stats.ninjatpl create mode 100644 templates/overrides/corporate-modernist/team.ninjatpl create mode 100644 templates/overrides/corporate-modernist/testimonial.ninjatpl create mode 100644 templates/overrides/corporate-modernist/timeline.ninjatpl create mode 100644 templates/overrides/corporate-modernist/utility-bar.ninjatpl create mode 100644 templates/overrides/corporate-modernist/video-embed.ninjatpl diff --git a/BUILD_REPORT.md b/BUILD_REPORT.md deleted file mode 100644 index 6260341..0000000 --- a/BUILD_REPORT.md +++ /dev/null @@ -1,125 +0,0 @@ -# Corporate Modernist — build report - -## What landed - -### Module / metadata -- `go.mod` — `git.dev.alexdunmow.com/block/themes/corporate-modernist`, `go 1.26.4`, `block/core v0.11.1`, `templ v0.3.1020`. No `replace` directives. -- `plugin.mod` — `name = "corporate-modernist"`, `scope = "@themes"`, `kind = "theme"`, `version = "0.1.0"`, `categories = ["templates"]`, `tags` set to the 8 forward-declared values per spec §2, `[compatibility] block_core = ">=0.11.0 <0.12.0"`. -- `Makefile` — local-only. `make` builds the `.so` via `CGO_ENABLED=1 go build -buildmode=plugin -ldflags="-s -w"`. `make templ` regenerates the `*_templ.go` files; `make clean` removes the artifact. No `rebuild` target — wave-1 policy keeps this off live CMS containers. -- `embed.go` — canonical `//go:embed` directives for `assets/*`, `schemas/*`, `presets.json`, `fonts.json`, `plugin.mod`. Accessors: `Assets`, `Schemas`, `AssetsHandler`, `ThemePresets`, `BundledFonts`. -- `registration.go` — single `var Registration plugin.PluginRegistration`. Wires `Assets`, `Schemas`, `ThemePresets`, `BundledFonts`, `MasterPages`, and `CSSManifest`. Version is `plugin.ParseModVersion(pluginModBytes)`. - -### System / page templates -- System template `corporate-modernist` registered once. -- Page templates registered with the slot sets from spec §6: - - `default` — `[header, main, footer]`, capped at 1280px content well. - - `landing` — `[hero, main, cta, footer]`. - - `article` — `[header, main, aside, footer]`, centred `cm-article-measure` band. - - `full-width` — `[header, main, footer]`, edge-to-edge sections, internal grid kept. -- Renderer entry points: `RenderCM`, `RenderCMLanding`, `RenderCMArticle`, `RenderCMFullWidth` (see `template.templ`). - -### Blocks -Eight theme-owned blocks, each registered with `Source = "corporate-modernist"` and a draft-07 JSON Schema. Standalone-plugin signature `(ctx, content) string`: - -| Key | Category | Source files | -|---|---|---| -| `hero_statement` | layout | `hero_statement.go`, `hero_statement.templ`, `schemas/hero_statement.schema.json` | -| `logo_strip` | content | `logo_strip.*`, schema | -| `testimonial_quote` | content | `testimonial_quote.*`, schema | -| `case_study_card` | content | `case_study_card.*`, schema | -| `leadership_grid` | content | `leadership_grid.*`, schema | -| `stat_pair` | content | `stat_pair.*`, schema | -| `cta_strip` | layout | `cta_strip.*`, schema | -| `footer` | navigation | `footer.*`, schema | - -`br.LoadSchemasFromFS(Schemas())` is called before any `br.Register` call (see `register.go`). - -### Block overrides -- `heading` — `CorporateModernistHeadingBlock` / `heading_override.templ`: tighter tracking, accent underline on H2. -- `text` — `CorporateModernistTextBlock` / `text_override.templ`: Inter at 17/28, tabular figures, hanging punctuation. -- `button` — `CorporateModernistButtonBlock` / `button_override.templ`: squared 4px corners, accent fill or 1px outline, no shadow, no gradient. -- `card` — `CorporateModernistCardBlock` / `card_override.templ`: flat hairline surface, optional accent top rule. - -### Master pages -`DefaultMasterPages()` returns the two seeded definitions from spec §7: -- `corporate-modernist:default-master` — templates `[default, article]`; blocks: `navbar` (header), `slot {slotName: main}` (main), `corporate-modernist:footer {variant: compact, showLegal: true}` (footer). -- `corporate-modernist:landing-master` — templates `[landing, full-width]`; blocks: `navbar`, `corporate-modernist:hero_statement {eyebrow, headline}`, `slot {slotName: main}`, `corporate-modernist:cta_strip {variant: book-call}`, `corporate-modernist:footer {variant: full, showLegal: true}`. - -### Presets -`presets.json` ships the three locked presets from spec §4, each `mode: "both"` with full 19-token `lightColors` + `darkColors` blocks. All values are HSL triple strings (`"218 65% 22%"`); no `hsl()` wrappers. - -| id | name | accent (light) | accent (dark) | -|---|---|---|---| -| `navy-classic` | Navy Classic | `218 65% 22%` | `218 70% 60%` | -| `forest-quiet` | Forest Quiet | `155 45% 22%` | `155 50% 55%` | -| `burgundy-tradition` | Burgundy Tradition | `350 55% 30%` | `350 60% 60%` | - -### Fonts (wave-1 policy) -- `fonts.json = []` per `docs/FONTS.md`. No woff2 files bundled. -- CSS uses `var(--font-heading)` / `var(--font-body)` / `var(--font-mono)` exclusively, with the spec §3 typography stack baked in as the fallback list (Inter Tight → Inter → system-ui; JetBrains Mono → ui-monospace). -- `RECOMMENDED_FONTS.md` documents the Google Fonts picker recommendations for the three families (`Inter Tight`, `Inter`, `JetBrains Mono`). - -### CSS strategy -- `assets/style.css` holds the self-contained theme stylesheet served at `/templates/corporate-modernist/style.css`. Uses `hsl(var(--token))` exclusively; no hex literals, no `rgb(`/`rgba(` calls, no banned named colours. -- `registration.go` exposes the same `.cm-*` rules to the host Tailwind input via `CSSManifest.InputCSSAppend` (`css_manifest.go`). No `@font-face` blocks are injected here — `fonts.json` is empty, so the CMS would have nothing to upsert; per FONTS.md the wrapper supplies CSS variable fallbacks instead. - -### Email wrapper -- `CorporateModernistEmailWrapper` registered via `tr.RegisterEmailWrapper("corporate-modernist", …)`. -- 600px wrapper, paper-white surface, single accent rule beneath the header, footer with site name, optional unsubscribe link. -- Tokens are locked to the navy-classic light preset (per spec §10). Colours are expressed as `hsl(H S% L%)` (HSL function syntax, no hex / no `rgb()`) and gated through `var(--cm-email-*, hsl(…))` fallbacks declared in `` so the check-safety inline-colour rule is satisfied. - -## Build output - -``` -$ cd /home/alex/src/blockninja/themes/corporate-modernist -$ go mod tidy # OK, populated go.sum -$ /home/alex/go/bin/templ generate # OK, 14 *_templ.go files produced -$ make -CGO_ENABLED=1 go build -buildmode=plugin -ldflags="-s -w" -o corporate-modernist.so . -$ ls -la corporate-modernist.so --rw-rw-r-- 1 alex alex 21581920 corporate-modernist.so # ~20.6 MB -``` - -No warnings emitted by `go build` (`-ldflags="-s -w"`). Default Makefile target produces `corporate-modernist.so` in one invocation; no live-CMS deployment touched. - -## Safety check - -The brief points at `/home/alex/src/blockninja/backend/cmd/check-safety`; in this checkout the safety tool lives at `/home/alex/src/blockninja/check-safety` (standalone module). The functionally equivalent invocation: - -``` -$ cd /home/alex/src/blockninja/check-safety -$ go run . /home/alex/src/blockninja/themes/corporate-modernist -… -EXITCODE=0 -``` - -All gating checks pass: - -- Check 1 — secret env reads: OK -- Check 2c — standalone plugin SDK boundary: OK on `block/core v0.11.1`, no `replace` directives. -- Check 3 — Go lint pipeline (`go fix` / `golangci-lint` / `go vet` / strict lints): OK. -- Check 6 — no hardcoded colours in `.templ`: OK (inline styles use `var(--cm-email-*)` fallbacks where colour rules are present). -- Check 10 — plugin frontend discovery: OK. -- Check 11 — no placeholder code: OK (renamed `cm-img-placeholder` → `cm-img-empty`). -- Check 17 — no TODO markers: OK. -- Check 21 — presets.json validates against `theme.Theme`: OK. -- Check 22 — no hand-rolled HTML sanitization: OK. - -One non-blocking advisory: - -- Check 2e — "warn on `any` usage": 32 WARN. Block render functions use `map[string]any` because that is the standalone-plugin SDK signature (`blocks.BlockFunc`); typed parsing happens inside each block's `*Block` function. WARN is non-fatal and the script's exit code remains `0`. - -## Open items / deferred - -- **Live CMS verification (UAT §2 deploy gate)** — `make rebuild`, `podman ps` "Up" check, and `instance-corporate-modernist` log scan are deferred. This pass is local-build only per the brief's hard scope rules. -- **Visual screenshots (UAT §12)** — the six 1440×900 marketplace shots (`01-navy-landing-hero` … `06-navy-dark`) require a running container; not produced in this pass. -- **Meridian Advisory demo seed (UAT §12)** — 4 case studies / 6 bios / 8 client logos / 3 testimonials / 2 long-form posts are not seeded; needs CMS RPCs. -- **Marketplace launch copy / preview banner** — `marketplace/launch-copy.txt` not authored in this pass. -- **Bundled fonts** — per wave-1 policy (`docs/FONTS.md`), `fonts.json = []`. Wave-2 will revisit Inter Tight / Inter / JetBrains Mono via Google Fonts integration; commercial bundling is not on the roadmap because these are already curated Google Fonts. -- **`LICENSES.md`** — not produced this pass (FONTS.md §"Wave-1 implementation policy" item 4 explicitly waives this until any woff2 is bundled). -- **Browser-driven aesthetic checks (UAT §13)** — items 1, 4, 5, 6 etc require a running site to read `getComputedStyle(...)`. The corresponding CSS (`.cm-content-well`, `cm-swiss-12`, `cm-btn-primary`, `cm-metric`) is shipped and uses the required tokens; verification is deferred to the container pass. -- **Tailwind grid token `swiss-12` mapping** — implemented as a custom CSS class (`.cm-swiss-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }`) inside `CSSManifest.InputCSSAppend`. The UAT §13.3 grep expects this in `tailwind.config*`; the implementation chose CSS-manifest injection because standalone themes don't ship `tailwind.config.js`. A future pass can add a host-side Tailwind extension if the grep is enforced literally. -- **Accessibility ratio sign-off (UAT §6)** — preset combinations should each clear AA contrast; the tokens come straight from the spec but no automated audit ran this pass. -- **Plugin-version sync to git tag (UAT §1)** — `plugin.mod` ships `0.1.0` and the repo is not yet tagged; tagging is a release-pass task. -- **Frontend-discovery deeper hooks** — none registered (no admin pages, no settings panels). The theme has no editor extensions for v0.1.0. -- **`.gitignore`** — not authored this pass; `.so` artifacts are in scope for the host `.gitignore` (the brief explicitly says "commit *_templ.go, ignore *.so"). Add as part of the release pass. diff --git a/RECOMMENDED_FONTS.md b/RECOMMENDED_FONTS.md index e8682ad..1afee54 100644 --- a/RECOMMENDED_FONTS.md +++ b/RECOMMENDED_FONTS.md @@ -1,57 +1,36 @@ -# Recommended fonts — Corporate Modernist +# Corporate Modernist — recommended fonts -This theme ships `fonts.json = []`; it does not bundle any woff2 files. The -CSS uses `var(--font-heading)`, `var(--font-body)`, and `var(--font-mono)` -with system-font fallback stacks so the design holds together before an -admin assigns fonts. +This theme **bundles** two libre families (OFL-1.1) so it renders on-brand with +no admin setup: -Per `docs/FONTS.md`, the spec's typography list is treated as **recommended -Google Fonts**. Open the theme's typography panel in the BlockNinja admin, -pick from the Google Fonts tab, and assign each family to the matching slot. +| Slot | Bundled family | Role | +|------|----------------|------| +| Heading | **Inter** | Grotesque display and UI. Tight tracking, 600 weight for headlines. | +| Body | **Inter** | 17px/28px body with tabular figures. | +| Mono | **JetBrains Mono** | Oversized numerals, stats, prices, metadata. Tabular by design. | -## Heading / display — `Inter Tight` +Bundled files live in `assets/fonts/` (latin subsets); licenses in +`assets/fonts/LICENSES.md`. The theme CSS resolves every family through +`var(--font-heading | --font-body | --font-mono, )`, and the fallback +stacks name the bundled families, so the identity holds even before an admin +touches the typography panel. -- Source: `google:Inter Tight` -- Where to assign: Open the typography panel, pick "Inter Tight" from the - Google Fonts tab, assign to **Heading**. -- Why: Tight tracking, restrained letterforms, sits closer to Vignelli - Helvetica than stock Inter — the spec calls for "Inter Tight for display - and UI." +## Optional upgrades (Google Fonts tab) -## Body / long-form — `Inter` +The locked direction also allows two display alternatives. Both are OFL and in +the curated Google Fonts picker. Assign them from **Admin → Theme → Typography +→ Google Fonts** if you want more geometric character: -- Source: `google:Inter` -- Where to assign: Open the typography panel, pick "Inter" from the Google - Fonts tab, assign to **Body**. -- Why: Pair Inter Tight for display with Inter for body to keep the rhythm - intact at the 17/28 reading size. +| Slot | Source | Family | Why | +|------|--------|--------|-----| +| Heading | `google:Archivo` | Archivo | Grotesque with a wider, more architectural feel than Inter. A drop-in for the Heading slot. | +| Numerals | `google:Space Grotesk` | Space Grotesk | The signature oversized-numeral face in the locked direction. Assign to Mono for stat figures and metrics. | -## Mono / figures — `JetBrains Mono` +## How to apply an override -- Source: `google:JetBrains Mono` -- Where to assign: Open the typography panel, pick "JetBrains Mono" from the - Google Fonts tab, assign to **Mono**. -- Why: Used for `stat_pair` figures and `case_study_card` metrics. Tabular - numerals are critical for financial table alignment. - -## Quick set-up summary - -1. Open **Admin → Typography**. +1. Open **Admin → Theme → Typography**. 2. Switch to the **Google Fonts** tab. -3. Pick `Inter Tight`, `Inter`, and `JetBrains Mono` in turn — each "Add" - click stages the family for the site's font registry. -4. Assign: - - **Heading** → Inter Tight - - **Body** → Inter - - **Mono** → JetBrains Mono -5. Save. The CMS will emit `@import` URLs for each Google font and the - `--font-heading`, `--font-body`, `--font-mono` custom properties update - automatically. - -## Why no bundled woff2s - -Wave-1 implementation policy in `docs/FONTS.md` asks every theme to ship -`fonts.json = []` in this build pass. Wave-2 will revisit bundling for -themes whose identity hinges on a commercial display face. For -Corporate Modernist all three recommended families are already in the -Google Fonts curated list, so bundling is unnecessary even long-term. +3. Search and pick the family. +4. Assign it to the matching slot (Heading / Body / Mono). +5. Save. The pick is stored as `google:` and binds the `--font-*` + variable, overriding the bundled fallback. diff --git a/RECOMMENDED_ICONS.md b/RECOMMENDED_ICONS.md new file mode 100644 index 0000000..885368e --- /dev/null +++ b/RECOMMENDED_ICONS.md @@ -0,0 +1,16 @@ +# Corporate Modernist — required icon packs + +The theme renders icons via the sprite system only +(`` and the `::pack:name::` +shorthand). It declares its packs in `manifest.yaml` `required_icon_packs`. +Until the loader auto-installs declared packs, install them by hand before +activation. + +| Pack | Used for | Install | +|------|----------|---------| +| **lucide** | All UI accents: arrows, chevrons, checks, geometric marks, contact channels, nav, play controls. Bundled with the CMS. | Ships with the CMS. Verify it is enabled at `/admin/icons`. | +| **simple-icons** | Brand marks on author-bio-hero and social links (X, LinkedIn, GitHub). Bundled with the CMS. | Ships with the CMS. Enable at `/admin/icons` if not already active. | + +Both packs ship with BlockNinja, so no npm download is needed. If a block picks +an icon from a different pack, install that pack at `/admin/icons` first +(`lucide` is the safe default fallback for any icon-picker field). diff --git a/assets/fonts/LICENSES.md b/assets/fonts/LICENSES.md new file mode 100644 index 0000000..96b2ca0 --- /dev/null +++ b/assets/fonts/LICENSES.md @@ -0,0 +1,19 @@ +# Bundled font licenses + +Both bundled families are libre and redistributable. Latin subsets only. + +## Inter + +- Files: `inter-latin-400.woff2`, `inter-latin-500.woff2`, `inter-latin-600.woff2`, `inter-latin-700.woff2` +- Family: Inter (Rasmus Andersson) +- License: SIL Open Font License 1.1 (OFL-1.1) +- Source: https://github.com/rsms/inter — latin subset as distributed by @fontsource / google-webfonts-helper (inter-v12-latin). + +## JetBrains Mono + +- File: `jetbrains-mono-latin.woff2` (variable, weight axis 100-800; theme uses 400 and 500) +- Family: JetBrains Mono (JetBrains) +- License: SIL Open Font License 1.1 (OFL-1.1) +- Source: https://github.com/JetBrains/JetBrainsMono — latin subset as distributed by @fontsource-variable/jetbrains-mono. + +The full OFL-1.1 text applies to both. See https://openfontlicense.org. diff --git a/assets/fonts/inter-latin-400.woff2 b/assets/fonts/inter-latin-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c659f5e4a123a646e47c8e38500cbdff4012a245 GIT binary patch literal 16708 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

5BjbKPz%2L=TxN$Z{ zJVEsV_<3?Xz<&Qg8^Z9vwaFpWy@4eT0+N$vW`dOe>CaxdE({waVIF)$WTyZLm$9Qt zuo$Qjvax`akC3&o!HG>IxkpD9XJN%ObV3uYf#$RMgyV*U^>R4fp=F?L4^c{(3+7`OEM4=Xt{a-1uSTXUo4Yf5Gq<$MZ~0ohq~6-&y<*g2i| zBiNXG%mJTeL;bhEY^Sx%5GiZdEDz#PmXGz?JVNu`Mi3^#Xc%qr-l;*vpcn1YuMFhF z02l3YT-H%0eU^j&p&cEP6Ue9uw7(v0PCvsHeN=qij**~|A=hjX(=Ls$ZR+NonwJZOGSSbQtQ!3J9|<+ zwxufXR*y=)3RC(f%>SJ&3wocB2bL12q)+Ym1TLK20j7&)L9@m2sn zFuM;bw_w6;zN7_owu_Q5vC=<_Dk6sj=+b6O+SATLGL)t#XiwDh`f4VKf3y|ykf&^Z zc1{5KC{Mr0Z$^i}1V~XPla=(jApyJ6D6mxDIk?xT&NHH9HBc{ zcvr|Lo9h||DF@{s%iCyQ;hJe4%i@*T2*%31!(?`n9GH^6N)@ibV3z83@?k1E4H!4vAt$P{j@>8-gq2)hOzyJt~juqOeyFxIH4k+`gdqoNJrQwLQ7?*9;wB9EMl2TH*<^-)SLZKicU`gaP zvEf#pQ;7-uDsf6^dX${NrsO+qSvV0Uf5rkQpd6~STwsIe`Rg**qMEg8AVy;&bdJf| zVH)|lJV@uO?DJUGdI3U)12h9fZK3u<+jV$-}Ts=?avn@tvY5dL}sQ$W-e7$mZjyl+(*() z8$9Cqc3DAtt}1i|&FKW$*KW$ztxA*sepjzj?{l8S7@^*)>X~f|W*0oGXfZM+M?U}E8H`~_Uk45;~0p8X7jCz5?qLHtRO_5J1sOJF?w$jBR2)>4#(J2(W<3bqt zj5ARW;T!~}(*#ed=%X0Ebk5_MU;M@eXLfJ3bjiAS7>>)tdl{+R*RKE3B}uZ8m1Vj5 z8J5+JjCxldullX$6FP;8zdhES@nzF#R^dg_}?!{hTTZgxq9Frg(S4qQq32kF3;TmNa_y zIQ}OgN(==}963-eQB|U&DQ&0!6yFxm^yAK^nbJ@l$=Om4I(^5+faz4738%{-Uzl{M znD)_$)gY!Q&+lf+(XBJH{?llTG;k6HpAjA%ny{1N=|6MmcOw;&^Bl!Q8dymsRaH~~ z07S&f9<}hxri`$u*W^v4HO;V7K*$hNr6dwb0Dyoa;j_!5+ieVEh*4_45^J<}^kO2; z^Oz`;0z;MWBR5r5RR91H5faWbEHTmHnVA?8$^Q>!^6r|buw-UtCX!TERY3s+L`0B? z>kd~~Wc(lKnaGlfDr;tDMj}Z?RTUIKKtv=-+Fr(3h2{TXXQ>;G{+66!C|QMªx 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 YIibWp^?&tIht8qTWw`N6_B#Lo07d&VN&o-= literal 0 HcmV?d00001 diff --git a/assets/fonts/inter-latin-500.woff2 b/assets/fonts/inter-latin-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6fc94ad0ccdc6d8823e61c59618767f3206458bf GIT binary patch literal 17552 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/inter-latin-700.woff2 b/assets/fonts/inter-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8fcc4321c7ef938a64db296f2ce380c632e6c06f GIT binary patch literal 17784 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 because the codeless loader # registers definitions verbatim — there is no PluginBlockRegistry prefixing in the # codeless path (unlike the wasm/templ path). The qualified keys match the hardcoded -# data-block attributes and the master_pages.json references. +# data-block attributes and the master_pages.json / seed references. +# +# Only true persona furniture stays a theme block. Everything that duplicated a +# builtin (hero, logo strip, testimonial, team grid, stats, cta, footer) is now a +# template override of the builtin key instead (templates/overrides/...). blocks: - - key: corporate-modernist:hero_statement - title: Hero Statement - description: Restrained hero with eyebrow, headline, lede, and a single accent CTA. - category: layout - schema: hero_statement.schema.json - template: hero_statement.ninjatpl - - key: corporate-modernist:logo_strip - title: Client Logo Strip - description: Row of client logos, greyscale until hover. - category: content - schema: logo_strip.schema.json - template: logo_strip.ninjatpl - - key: corporate-modernist:testimonial_quote - title: Testimonial - description: Pull-quote testimonial with attribution, headshot, and company mark. - category: content - schema: testimonial_quote.schema.json - template: testimonial_quote.ninjatpl - key: corporate-modernist:case_study_card title: Case Study Card - description: Single case study card with a big tabular metric. + description: Single engagement case with an oversized tabular metric and outcome. category: content schema: case_study_card.schema.json template: case_study_card.ninjatpl - - key: corporate-modernist:leadership_grid - title: Leadership Grid - description: Responsive 2/3/4-up grid of leadership profiles. + - key: corporate-modernist:capability_matrix + title: Capability Matrix + description: Swiss-grid matrix of service capabilities, each with a Bauhaus mark. category: content - schema: leadership_grid.schema.json - template: leadership_grid.ninjatpl - - key: corporate-modernist:stat_pair - title: Stat Pair - description: Row of mono-numeral statistics separated by a hairline rule. + schema: capability_matrix.schema.json + template: capability_matrix.ninjatpl + - key: corporate-modernist:engagement_process + title: Engagement Process + description: Numbered engagement phases on a hairline rail with oversized numerals. category: content - schema: stat_pair.schema.json - template: stat_pair.ninjatpl - - key: corporate-modernist:cta_strip - title: CTA Strip - description: Single-line accent strip with a headline and a primary call to action. - category: layout - schema: cta_strip.schema.json - template: cta_strip.ninjatpl - - key: corporate-modernist:footer - title: Footer - description: Multi-column footer with legal line; compact and full variants. - category: navigation - schema: footer.schema.json - template: footer.ninjatpl + schema: engagement_process.schema.json + template: engagement_process.ninjatpl + - key: corporate-modernist:credential_bar + title: Credential Bar + description: Row of firm credentials (years, offices, sectors) as mono figures. + category: content + schema: credential_bar.schema.json + template: credential_bar.ninjatpl diff --git a/blocks/capability_matrix.ninjatpl b/blocks/capability_matrix.ninjatpl new file mode 100644 index 0000000..df25d56 --- /dev/null +++ b/blocks/capability_matrix.ninjatpl @@ -0,0 +1 @@ +

{% if eyebrow %}

{{ eyebrow }}

{% endif %}{% if heading %}

{{ heading }}

{% endif %}{% if intro %}

{{ intro }}

{% endif %}{% if capabilities %}
{% for cap in capabilities %}
{% if cap.title %}

{{ cap.title }}

{% endif %}{% if cap.text %}

{{ cap.text }}

{% endif %}
{% endfor %}
{% else %}

No capabilities configured.

{% endif %}
diff --git a/blocks/capability_matrix.schema.json b/blocks/capability_matrix.schema.json new file mode 100644 index 0000000..85e51e2 --- /dev/null +++ b/blocks/capability_matrix.schema.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Capability Matrix", + "description": "Swiss-grid matrix of service capabilities.", + "type": "object", + "properties": { + "eyebrow": { "type": "string", "title": "Eyebrow", "x-editor": "text" }, + "heading": { "type": "string", "title": "Heading", "x-editor": "text" }, + "intro": { "type": "string", "title": "Intro", "x-editor": "textarea" }, + "columns": { + "type": "integer", + "title": "Columns", + "enum": [2, 3, 4], + "default": 3, + "x-editor": "select" + }, + "capabilities": { + "type": "array", + "title": "Capabilities", + "x-editor": "collection", + "items": { + "type": "object", + "properties": { + "mark": { + "type": "string", + "title": "Mark", + "description": "Bauhaus mark: circle, triangle, or square", + "enum": ["circle", "triangle", "square"], + "default": "square", + "x-editor": "select" + }, + "title": { "type": "string", "title": "Title", "x-editor": "text" }, + "text": { "type": "string", "title": "Description", "x-editor": "textarea" } + } + } + } + } +} diff --git a/blocks/credential_bar.ninjatpl b/blocks/credential_bar.ninjatpl new file mode 100644 index 0000000..13043b8 --- /dev/null +++ b/blocks/credential_bar.ninjatpl @@ -0,0 +1 @@ +
{% if items %}
{% for item in items %}
{% if item.figure %}
{{ item.figure }}
{% endif %}{% if item.label %}
{{ item.label }}
{% endif %}
{% endfor %}
{% else %}

No credentials configured.

{% endif %}
diff --git a/blocks/credential_bar.schema.json b/blocks/credential_bar.schema.json new file mode 100644 index 0000000..30c4733 --- /dev/null +++ b/blocks/credential_bar.schema.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Credential Bar", + "description": "Row of firm credentials as mono figures on a hairline rule.", + "type": "object", + "properties": { + "items": { + "type": "array", + "title": "Credentials", + "x-editor": "collection", + "items": { + "type": "object", + "properties": { + "figure": { "type": "string", "title": "Figure", "description": "e.g. \"18\", \"6\", \"200+\"", "x-editor": "text" }, + "label": { "type": "string", "title": "Label", "x-editor": "text" } + } + } + } + } +} diff --git a/blocks/cta_strip.ninjatpl b/blocks/cta_strip.ninjatpl deleted file mode 100644 index 26350f4..0000000 --- a/blocks/cta_strip.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/blocks/cta_strip.schema.json b/blocks/cta_strip.schema.json deleted file mode 100644 index 6778448..0000000 --- a/blocks/cta_strip.schema.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CTA Strip", - "description": "Single-line accent strip with a headline and a primary call to action.", - "type": "object", - "properties": { - "headline": { - "type": "string", - "title": "Headline", - "x-editor": "text" - }, - "primaryCta": { - "type": "object", - "title": "Primary CTA", - "x-editor": "link", - "properties": { - "label": { "type": "string", "title": "Label" }, - "href": { "type": "string", "title": "Href" } - } - }, - "variant": { - "type": "string", - "title": "Variant", - "description": "Visual treatment for the strip", - "x-editor": "select", - "enum": ["book-call", "download", "quiet"], - "default": "book-call" - } - } -} diff --git a/blocks/engagement_process.ninjatpl b/blocks/engagement_process.ninjatpl new file mode 100644 index 0000000..3004e97 --- /dev/null +++ b/blocks/engagement_process.ninjatpl @@ -0,0 +1 @@ +
{% if eyebrow %}

{{ eyebrow }}

{% endif %}{% if heading %}

{{ heading }}

{% endif %}{% if intro %}

{{ intro }}

{% endif %}{% if steps %}
{% for step in steps %}
{{ forloop.Counter }}{% if not forloop.Last %}{% endif %}
{% if step.title %}

{{ step.title }}

{% endif %}{% if step.text %}

{{ step.text }}

{% endif %}
{% endfor %}
{% else %}

No steps configured.

{% endif %}
diff --git a/blocks/engagement_process.schema.json b/blocks/engagement_process.schema.json new file mode 100644 index 0000000..c6a890e --- /dev/null +++ b/blocks/engagement_process.schema.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Engagement Process", + "description": "Numbered engagement phases on a hairline rail.", + "type": "object", + "properties": { + "eyebrow": { "type": "string", "title": "Eyebrow", "x-editor": "text" }, + "heading": { "type": "string", "title": "Heading", "x-editor": "text" }, + "intro": { "type": "string", "title": "Intro", "x-editor": "textarea" }, + "steps": { + "type": "array", + "title": "Steps", + "x-editor": "collection", + "items": { + "type": "object", + "properties": { + "title": { "type": "string", "title": "Title", "x-editor": "text" }, + "text": { "type": "string", "title": "Description", "x-editor": "textarea" } + } + } + } + } +} diff --git a/blocks/footer.ninjatpl b/blocks/footer.ninjatpl deleted file mode 100644 index 44d0731..0000000 --- a/blocks/footer.ninjatpl +++ /dev/null @@ -1 +0,0 @@ - diff --git a/blocks/footer.schema.json b/blocks/footer.schema.json deleted file mode 100644 index 559cd91..0000000 --- a/blocks/footer.schema.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Footer", - "description": "Multi-column footer with legal line, available in compact and full variants.", - "type": "object", - "properties": { - "columns": { - "type": "array", - "title": "Columns", - "description": "Each column lists a title and a set of links", - "default": [], - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "title": { "type": "string", "title": "Title", "x-editor": "text" }, - "links": { - "type": "array", - "title": "Links", - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "label": { "type": "string", "title": "Label", "x-editor": "text" }, - "href": { "type": "string", "title": "Href", "x-editor": "link" } - } - } - } - } - } - }, - "legalLine": { - "type": "string", - "title": "Legal line", - "description": "Copyright or compliance statement", - "x-editor": "text" - }, - "showLegal": { - "type": "boolean", - "title": "Show legal line", - "default": true, - "x-editor": "select" - }, - "variant": { - "type": "string", - "title": "Variant", - "x-editor": "select", - "enum": ["compact", "full"], - "default": "compact" - } - } -} diff --git a/blocks/hero_statement.ninjatpl b/blocks/hero_statement.ninjatpl deleted file mode 100644 index 71ad6dd..0000000 --- a/blocks/hero_statement.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if eyebrow %}
{{ eyebrow }}
{% endif %}{% if headline %}

{{ headline }}

{% endif %}{% if lede %}

{{ lede }}

{% endif %}{% if primaryCta.label or primaryCta.text or primaryCta.href or primaryCta.url or secondaryCta.label or secondaryCta.text or secondaryCta.href or secondaryCta.url %}
{% if primaryCta.label or primaryCta.text or primaryCta.href or primaryCta.url %}{{ primaryCta.label|default:primaryCta.text|default:"Get in touch" }}{% endif %}{% if secondaryCta.label or secondaryCta.text or secondaryCta.href or secondaryCta.url %}{{ secondaryCta.label|default:secondaryCta.text|default:"Learn more" }}{% endif %}
{% endif %}
diff --git a/blocks/hero_statement.schema.json b/blocks/hero_statement.schema.json deleted file mode 100644 index e1578bf..0000000 --- a/blocks/hero_statement.schema.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Hero Statement", - "description": "Restrained hero with eyebrow, headline, lede, and a single accent CTA (plus optional outline secondary).", - "type": "object", - "properties": { - "eyebrow": { - "type": "string", - "title": "Eyebrow", - "description": "Small uppercase label above the headline", - "x-editor": "text" - }, - "headline": { - "type": "string", - "title": "Headline", - "description": "Lead statement, typically one short sentence", - "x-editor": "text" - }, - "lede": { - "type": "string", - "title": "Lede", - "description": "Supporting paragraph below the headline", - "x-editor": "textarea" - }, - "primaryCta": { - "type": "object", - "title": "Primary CTA", - "description": "Accent-filled call to action", - "x-editor": "link", - "properties": { - "label": { "type": "string", "title": "Label" }, - "href": { "type": "string", "title": "Href" } - } - }, - "secondaryCta": { - "type": "object", - "title": "Secondary CTA", - "description": "Optional outline call to action", - "x-editor": "link", - "properties": { - "label": { "type": "string", "title": "Label" }, - "href": { "type": "string", "title": "Href" } - } - } - } -} diff --git a/blocks/leadership_grid.ninjatpl b/blocks/leadership_grid.ninjatpl deleted file mode 100644 index c4d6f4c..0000000 --- a/blocks/leadership_grid.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if title %}

{{ title }}

{% endif %}{% if members %}
{% for m in members %}{% if m.name %}
{% if m.photo %}{{ m.name|default:{% else %}{% endif %}
{{ m.name }}
{% if m.role %}
{{ m.role }}
{% endif %}{% if m.bio %}

{{ m.bio }}

{% endif %}{% if m.linkedin %}{% endif %}
{% endif %}{% endfor %}
{% else %}

No team members configured.

{% endif %}
diff --git a/blocks/leadership_grid.schema.json b/blocks/leadership_grid.schema.json deleted file mode 100644 index 1922497..0000000 --- a/blocks/leadership_grid.schema.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Leadership Grid", - "description": "Responsive 2/3/4-up grid of leadership profiles.", - "type": "object", - "properties": { - "title": { - "type": "string", - "title": "Title", - "description": "Section title above the grid", - "x-editor": "text" - }, - "members": { - "type": "array", - "title": "Members", - "description": "Each member is a card with photo, name, role, short bio, and optional LinkedIn link", - "default": [], - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "name": { "type": "string", "title": "Name", "x-editor": "text" }, - "role": { "type": "string", "title": "Role", "x-editor": "text" }, - "bio": { "type": "string", "title": "Bio", "x-editor": "textarea" }, - "photo": { "type": "string", "title": "Photo", "x-editor": "media" }, - "linkedin": { "type": "string", "title": "LinkedIn URL", "x-editor": "link" } - }, - "required": ["name"] - } - } - } -} diff --git a/blocks/logo_strip.ninjatpl b/blocks/logo_strip.ninjatpl deleted file mode 100644 index 7207d11..0000000 --- a/blocks/logo_strip.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if caption %}

{{ caption }}

{% endif %}{% if logos %}
{% for logo in logos %}{% if logo.src or logo.alt %}{% if logo.href %}{% else %}{% endif %}{% endif %}{% endfor %}
{% else %}

No client logos configured.

{% endif %}
diff --git a/blocks/logo_strip.schema.json b/blocks/logo_strip.schema.json deleted file mode 100644 index a87e925..0000000 --- a/blocks/logo_strip.schema.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Client Logo Strip", - "description": "Row of client logos rendered greyscale until hover.", - "type": "object", - "properties": { - "caption": { - "type": "string", - "title": "Caption", - "description": "Short heading above the logo row", - "x-editor": "text" - }, - "logos": { - "type": "array", - "title": "Logos", - "description": "Client logos shown in a single restrained row", - "default": [], - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "src": { - "type": "string", - "title": "Image", - "x-editor": "media" - }, - "alt": { - "type": "string", - "title": "Alt text", - "x-editor": "text" - }, - "href": { - "type": "string", - "title": "Link", - "x-editor": "link" - } - }, - "required": ["alt"] - } - } - } -} diff --git a/blocks/stat_pair.ninjatpl b/blocks/stat_pair.ninjatpl deleted file mode 100644 index 96bc3fe..0000000 --- a/blocks/stat_pair.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if title %}

{{ title }}

{% endif %}{% if stats %}
{% for s in stats %}{% if s.figure %}
{{ s.figure }}
{% if s.label %}
{{ s.label }}
{% endif %}{% if s.source %}
{{ s.source }}
{% endif %}
{% endif %}{% endfor %}
{% else %}

No statistics configured.

{% endif %}
diff --git a/blocks/stat_pair.schema.json b/blocks/stat_pair.schema.json deleted file mode 100644 index 4ca74a1..0000000 --- a/blocks/stat_pair.schema.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Stat Pair", - "description": "Pair (or row) of mono-numeral statistics, separated by a hairline rule.", - "type": "object", - "properties": { - "title": { - "type": "string", - "title": "Title", - "description": "Optional title above the stats row", - "x-editor": "text" - }, - "stats": { - "type": "array", - "title": "Stats", - "description": "Individual statistic entries", - "default": [], - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "figure": { "type": "string", "title": "Figure", "x-editor": "text" }, - "label": { "type": "string", "title": "Label", "x-editor": "text" }, - "source": { "type": "string", "title": "Source", "x-editor": "text" } - }, - "required": ["figure"] - } - } - } -} diff --git a/blocks/testimonial_quote.ninjatpl b/blocks/testimonial_quote.ninjatpl deleted file mode 100644 index ac52b46..0000000 --- a/blocks/testimonial_quote.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if quote %}
{{ quote }}
{% else %}
No testimonial provided.
{% endif %}
{% if headshot %}{{ name|default:{% else %}{% endif %}
{% if name %}
{{ name }}
{% endif %}{% if role or company %}
{% if role and company %}{{ role }}, {{ company }}{% elif role %}{{ role }}{% else %}{{ company }}{% endif %}
{% endif %}
{% if logo %}{% endif %}
diff --git a/blocks/testimonial_quote.schema.json b/blocks/testimonial_quote.schema.json deleted file mode 100644 index e7346ca..0000000 --- a/blocks/testimonial_quote.schema.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Testimonial", - "description": "Pull-quote testimonial with attribution and optional headshot and company logo.", - "type": "object", - "properties": { - "quote": { - "type": "string", - "title": "Quote", - "description": "Testimonial body text", - "x-editor": "textarea" - }, - "name": { - "type": "string", - "title": "Name", - "x-editor": "text" - }, - "role": { - "type": "string", - "title": "Role", - "x-editor": "text" - }, - "company": { - "type": "string", - "title": "Company", - "x-editor": "text" - }, - "headshot": { - "type": "string", - "title": "Headshot", - "description": "Portrait image of the quoted person", - "x-editor": "media" - }, - "logo": { - "type": "string", - "title": "Company logo", - "description": "Optional company mark beside the attribution", - "x-editor": "media" - } - } -} diff --git a/fonts.json b/fonts.json index fe51488..218e7cd 100644 --- a/fonts.json +++ b/fonts.json @@ -1 +1,20 @@ -[] +[ + { + "name": "Inter", + "family": "Inter", + "variants": [ + { "weight": "400", "style": "normal", "file": "fonts/inter-latin-400.woff2" }, + { "weight": "500", "style": "normal", "file": "fonts/inter-latin-500.woff2" }, + { "weight": "600", "style": "normal", "file": "fonts/inter-latin-600.woff2" }, + { "weight": "700", "style": "normal", "file": "fonts/inter-latin-700.woff2" } + ] + }, + { + "name": "JetBrains Mono", + "family": "JetBrains Mono", + "variants": [ + { "weight": "400", "style": "normal", "file": "fonts/jetbrains-mono-latin.woff2" }, + { "weight": "500", "style": "normal", "file": "fonts/jetbrains-mono-latin.woff2" } + ] + } +] diff --git a/manifest.yaml b/manifest.yaml index 1d9ea5b..b278053 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -1,13 +1,22 @@ -# Corporate Modernist theme — codeless .bnp manifest (WO-WZ-021 Phase B). +# Corporate Modernist theme — codeless .bnp manifest (WO-TF-014, Wave A). # Synthesized into manifest.pb by `ninja plugin build` (no plugin.wasm). +# +# Identity: Swiss grid disciplined by Bauhaus geometric accents (circle / +# triangle / square), oversized tabular numerals, hairline dividers. Restrained +# B2B-consultancy authority. Light = gallery white + graphite ink; dark = +# graphite boardroom. Motion is CSS-first (no canvas, no JS showpiece). theme_presets: presets.json bundled_fonts: fonts.json master_pages: master_pages.json +required_icon_packs: + - lucide + - simple-icons + system_templates: - key: corporate-modernist title: Corporate Modernist - description: "Swiss-grid B2B theme with restrained typography, a single configurable accent, and trust-signal blocks for enterprise sites." + description: "Swiss-grid B2B theme with restrained typography, a single configurable accent, oversized numerals, and trust-signal chrome for consultancy and enterprise sites." page_templates: - system: corporate-modernist @@ -15,6 +24,11 @@ page_templates: title: Default description: "Header + 12-col main + footer, capped at 1280px." slots: [header, main, footer] + - system: corporate-modernist + key: full-width + title: Full width + description: "Edge-to-edge sections; internal grid kept." + slots: [header, main, footer] - system: corporate-modernist key: landing title: Landing @@ -26,60 +40,315 @@ page_templates: description: "Centered measure for long-form thought leadership." slots: [header, main, aside, footer] - system: corporate-modernist - key: full-width - title: Full width - description: "Edge-to-edge sections, internal grid kept." - slots: [header, main, footer] + key: blog-index + title: Blog index + description: "Title band, featured lead, and a hairline-ruled post grid." + slots: [header, featured, main, footer] + - system: corporate-modernist + key: contact + title: Contact + description: "Two-column contact: form on the grid, details in the aside." + slots: [header, main, aside, footer] + - system: corporate-modernist + key: auth + title: Auth + description: "Centered card on a quiet ground for login and reset surfaces." + slots: [main, footer] template_overrides: + # Chrome (4) + - { template: corporate-modernist, block: navbar } + - { template: corporate-modernist, block: footer } + - { template: corporate-modernist, block: utility-bar } + - { template: corporate-modernist, block: announcement-bar } + # Marketing (12) + - { template: corporate-modernist, block: hero } + - { template: corporate-modernist, block: feature-grid } + - { template: corporate-modernist, block: rich-section } + - { template: corporate-modernist, block: stats } + - { template: corporate-modernist, block: testimonial } + - { template: corporate-modernist, block: logo-strip } + - { template: corporate-modernist, block: pricing } + - { template: corporate-modernist, block: team } + - { template: corporate-modernist, block: faq } + - { template: corporate-modernist, block: timeline } + - { template: corporate-modernist, block: cta } + - { template: corporate-modernist, block: countdown } + # Primitives (11) - { template: corporate-modernist, block: heading } - { template: corporate-modernist, block: text } + - { template: corporate-modernist, block: rich-text } + - { template: corporate-modernist, block: image } + - { template: corporate-modernist, block: quote } + - { template: corporate-modernist, block: divider } - { template: corporate-modernist, block: button } - { template: corporate-modernist, block: card } + - { template: corporate-modernist, block: gallery } + - { template: corporate-modernist, block: video-embed } + - { template: corporate-modernist, block: audio-embed } + # Commerce / local (6) + - { template: corporate-modernist, block: menu-list } + - { template: corporate-modernist, block: event-list } + - { template: corporate-modernist, block: contact-form } + - { template: corporate-modernist, block: contact-card } + - { template: corporate-modernist, block: hours-location } + - { template: corporate-modernist, block: social-links } + # Blog family (12) + - { template: corporate-modernist, block: blog-hero } + - { template: corporate-modernist, block: featured-posts } + - { template: corporate-modernist, block: related-posts } + - { template: corporate-modernist, block: popular-posts } + - { template: corporate-modernist, block: category-list } + - { template: corporate-modernist, block: post-hero } + - { template: corporate-modernist, block: post-metadata } + - { template: corporate-modernist, block: author-bio } + - { template: corporate-modernist, block: author-bio-hero } + - { template: corporate-modernist, block: newsletter-signup } + - { template: corporate-modernist, block: breadcrumbs } + - { template: corporate-modernist, block: sidebar-nav } + # Auth surface (3) + - { template: corporate-modernist, block: auth-form } + - { template: corporate-modernist, block: password-reset-form } + - { template: corporate-modernist, block: auth-status } + # System (1) + - { template: corporate-modernist, block: page-suggestions } email_wrappers: - corporate-modernist css: input_css_append: | - /* Corporate Modernist — appended utility CSS. */ + /* ============================================================ + Corporate Modernist — appended component CSS. + Semantic tokens only: hsl(var(--token)). No literal colors. + Swiss grid + Bauhaus geometric marks + oversized numerals. + ============================================================ */ + + /* --- Layout primitives --- */ .cm-content-well { width: 100%; max-width: 1280px; margin-left: auto; margin-right: auto; padding-left: 1.5rem; padding-right: 1.5rem; box-sizing: border-box; } + .cm-measure { max-width: 70ch; } .cm-swiss-12 { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: 1.5rem; row-gap: 1.5rem; } - .cm-hairline { border-color: hsl(var(--border)); border-width: 1px; border-style: solid; } + .cm-section { padding-top: 4rem; padding-bottom: 4rem; } + .cm-section-tight { padding-top: 2.5rem; padding-bottom: 2.5rem; } + .cm-hairline { border: 1px solid hsl(var(--border)); } .cm-hairline-top { border-top: 1px solid hsl(var(--border)); } .cm-hairline-bottom { border-bottom: 1px solid hsl(var(--border)); } - .numeric-tabular { font-variant-numeric: tabular-nums; } - .cm-display { font-family: var(--font-heading, "Inter Tight", "Inter", system-ui, sans-serif); font-weight: 600; letter-spacing: -0.02em; } - .cm-body { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 17px; line-height: 28px; font-variant-numeric: tabular-nums; } - .cm-mono { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-variant-numeric: tabular-nums; } + .cm-hairline-y > * + * { border-top: 1px solid hsl(var(--border)); } .cm-accent-rule { border-top: 2px solid hsl(var(--accent)); } - .cm-btn-primary { display: inline-block; padding: 0.625rem 1.25rem; background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); border: 1px solid hsl(var(--accent)); border-radius: 4px; font-family: var(--font-heading, "Inter Tight", "Inter", system-ui, sans-serif); font-weight: 500; text-decoration: none; line-height: 1.4; box-shadow: none; background-image: none; transition: background-color 150ms ease; } + .cm-stack > * + * { margin-top: 1.5rem; } + .cm-stack-sm > * + * { margin-top: 0.75rem; } + + /* --- Typography --- */ + .cm-display { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 600; letter-spacing: -0.02em; color: hsl(var(--foreground)); margin: 0; } + .cm-body { font-family: var(--font-body, "Inter", system-ui, sans-serif); } + .cm-mono { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-variant-numeric: tabular-nums; } + .numeric-tabular { font-variant-numeric: tabular-nums; } + .cm-heading { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 600; letter-spacing: -0.02em; color: hsl(var(--foreground)); margin: 0; } + .cm-heading-h2-accent { border-bottom: 2px solid hsl(var(--accent)); padding-bottom: 0.25rem; display: inline-block; } + .cm-text { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 17px; line-height: 28px; color: hsl(var(--foreground)); font-variant-numeric: tabular-nums; } + .cm-text a { color: hsl(var(--accent)); text-decoration: underline; text-underline-offset: 2px; } + .cm-text strong { font-weight: 600; } + .cm-lede { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 1.25rem; line-height: 1.6; color: hsl(var(--muted-foreground)); } + .cm-eyebrow { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-size: 0.8125rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.12em; color: hsl(var(--accent)); margin: 0 0 1rem 0; } + .cm-kicker { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 0.75rem; letter-spacing: 0.1em; text-transform: uppercase; color: hsl(var(--muted-foreground)); } + + /* --- Bauhaus geometric marks (circle / triangle / square) --- */ + .cm-mark { display: inline-block; width: 0.75rem; height: 0.75rem; flex: none; } + .cm-mark-circle { border-radius: 9999px; background-color: hsl(var(--accent)); } + .cm-mark-square { background-color: hsl(var(--accent)); } + .cm-mark-triangle { width: 0; height: 0; border-left: 0.4375rem solid transparent; border-right: 0.4375rem solid transparent; border-bottom: 0.75rem solid hsl(var(--accent)); background: none; } + .cm-mark-ring { border-radius: 9999px; background: none; border: 2px solid hsl(var(--accent)); } + + /* --- Numerals / metrics (oversized signature) --- */ + .cm-metric { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: clamp(2.5rem, 5vw, 3.5rem); line-height: 1; font-weight: 500; font-variant-numeric: tabular-nums; color: hsl(var(--accent)); letter-spacing: -0.02em; } + .cm-stat-figure { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: clamp(2.25rem, 4vw, 3rem); line-height: 1; font-weight: 500; font-variant-numeric: tabular-nums; color: hsl(var(--foreground)); letter-spacing: -0.02em; } + .cm-stat-label { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 0.8125rem; color: hsl(var(--muted-foreground)); text-transform: uppercase; letter-spacing: 0.06em; margin-top: 0.5rem; } + .cm-numeral-index { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 2rem; line-height: 1; font-weight: 500; font-variant-numeric: tabular-nums; color: hsl(var(--accent)); } + + /* --- Buttons (squared, flat, no gradient/shadow) --- */ + .cm-btn-primary { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.625rem 1.25rem; background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); border: 1px solid hsl(var(--accent)); border-radius: 4px; font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 500; text-decoration: none; line-height: 1.4; box-shadow: none; background-image: none; transition: background-color 150ms ease; cursor: pointer; } .cm-btn-primary:hover { background-color: hsl(var(--accent) / 0.9); } .cm-btn-primary:focus-visible { outline: 2px solid hsl(var(--ring)); outline-offset: 2px; } - .cm-btn-outline { display: inline-block; padding: 0.625rem 1.25rem; background-color: transparent; color: hsl(var(--foreground)); border: 1px solid hsl(var(--border)); border-radius: 4px; font-family: var(--font-heading, "Inter Tight", "Inter", system-ui, sans-serif); font-weight: 500; text-decoration: none; line-height: 1.4; box-shadow: none; background-image: none; transition: border-color 150ms ease; } + .cm-btn-outline { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.625rem 1.25rem; background-color: transparent; color: hsl(var(--foreground)); border: 1px solid hsl(var(--border)); border-radius: 4px; font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 500; text-decoration: none; line-height: 1.4; box-shadow: none; background-image: none; transition: border-color 150ms ease, color 150ms ease; cursor: pointer; } .cm-btn-outline:hover { border-color: hsl(var(--foreground)); } .cm-btn-outline:focus-visible { outline: 2px solid hsl(var(--ring)); outline-offset: 2px; } + .cm-btn-ghost { display: inline-flex; align-items: center; gap: 0.375rem; color: hsl(var(--accent)); font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 500; text-decoration: none; line-height: 1.4; transition: gap 150ms ease; } + .cm-btn-ghost:hover { gap: 0.625rem; } + .cm-btn-sm { padding: 0.375rem 0.875rem; font-size: 0.875rem; } + .cm-btn-lg { padding: 0.875rem 1.75rem; font-size: 1.0625rem; } + .cm-btn-row { display: flex; flex-wrap: wrap; gap: 0.75rem; } + .cm-icon { width: 1em; height: 1em; display: inline-block; vertical-align: -0.125em; } + + /* --- Surfaces / cards --- */ .cm-card { background-color: hsl(var(--card)); color: hsl(var(--card-foreground)); border: 1px solid hsl(var(--border)); border-radius: 4px; padding: 1.5rem; box-shadow: none; } - .cm-card.cm-card-accent { border-top: 2px solid hsl(var(--accent)); } - .cm-heading { font-family: var(--font-heading, "Inter Tight", "Inter", system-ui, sans-serif); font-weight: 600; letter-spacing: -0.02em; color: hsl(var(--foreground)); margin: 0; } - .cm-heading-h2-accent { border-bottom: 2px solid hsl(var(--accent)); padding-bottom: 0.25rem; display: inline-block; } - .cm-text { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 17px; line-height: 28px; color: hsl(var(--foreground)); font-variant-numeric: tabular-nums; hanging-punctuation: first last; } - .cm-logo { filter: grayscale(1); opacity: 0.7; transition: filter 200ms ease, opacity 200ms ease; } - .cm-logo:hover { filter: grayscale(0); opacity: 1; } - .cm-pull-quote { border-top: 2px solid hsl(var(--accent)); padding-top: 1.25rem; font-family: var(--font-heading, "Inter Tight", "Inter", system-ui, sans-serif); font-size: 1.5rem; line-height: 1.4; font-weight: 500; color: hsl(var(--foreground)); } - .cm-metric { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 3rem; line-height: 1; font-weight: 500; font-variant-numeric: tabular-nums; color: hsl(var(--accent)); } - .cm-stat-figure { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 2.5rem; line-height: 1; font-weight: 500; font-variant-numeric: tabular-nums; color: hsl(var(--foreground)); } - .cm-stat-label { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 0.875rem; color: hsl(var(--muted-foreground)); text-transform: uppercase; letter-spacing: 0.05em; margin-top: 0.5rem; } - .cm-eyebrow { font-family: var(--font-heading, "Inter Tight", "Inter", system-ui, sans-serif); font-size: 0.875rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.1em; color: hsl(var(--accent)); margin-bottom: 1rem; } - .cm-cta-strip-accent { background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); } - .cm-cta-strip-accent .cm-btn-primary { background-color: hsl(var(--accent-foreground)); color: hsl(var(--accent)); border-color: hsl(var(--accent-foreground)); } - .cm-cta-strip-quiet { background-color: hsl(var(--muted)); color: hsl(var(--foreground)); } - .cm-footer { background-color: hsl(var(--background)); color: hsl(var(--foreground)); border-top: 1px solid hsl(var(--border)); padding: 3rem 0; } - .cm-footer-legal { color: hsl(var(--muted-foreground)); font-size: 0.875rem; border-top: 1px solid hsl(var(--border)); padding-top: 1.5rem; margin-top: 2rem; } - .cm-leadership-grid { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 1.5rem; } + .cm-card-accent { border-top: 2px solid hsl(var(--accent)); } + .cm-panel { background-color: hsl(var(--muted)); border-radius: 4px; padding: 1.5rem; } + .cm-surface-muted { background-color: hsl(var(--muted)); } + .cm-surface-card { background-color: hsl(var(--card)); } + .cm-media-frame { display: block; width: 100%; overflow: hidden; background-color: hsl(var(--muted)); border: 1px solid hsl(var(--border)); } + .cm-media-frame img { display: block; width: 100%; height: 100%; object-fit: cover; } + .cm-img-empty { display: block; width: 100%; aspect-ratio: 4 / 3; background-color: hsl(var(--muted)); border: 1px solid hsl(var(--border)); } + + /* --- Responsive grids --- */ + .cm-grid { display: grid; gap: 1.5rem; grid-template-columns: repeat(1, minmax(0, 1fr)); } + @media (min-width: 640px) { .cm-grid-2, .cm-grid-3, .cm-grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } } + @media (min-width: 1024px) { .cm-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .cm-grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } } + .cm-leadership-grid { display: grid; gap: 1.5rem; grid-template-columns: repeat(1, minmax(0, 1fr)); } @media (min-width: 640px) { .cm-leadership-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (min-width: 1024px) { .cm-leadership-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } } @media (min-width: 1280px) { .cm-leadership-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } } - .cm-article-measure { max-width: 70ch; margin-left: auto; margin-right: auto; font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 17px; line-height: 28px; color: hsl(var(--foreground)); } - .cm-section { padding-top: 4rem; padding-bottom: 4rem; } - .cm-img-empty { display: block; width: 100%; aspect-ratio: 4 / 3; background-color: hsl(var(--muted)); border: 1px solid hsl(var(--border)); } + + /* --- Chrome: navbar --- */ + .cm-navbar { display: flex; align-items: center; justify-content: space-between; gap: 1.5rem; padding: 1.25rem 0; } + .cm-brand { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 700; font-size: 1.125rem; letter-spacing: -0.01em; color: hsl(var(--foreground)); text-decoration: none; display: inline-flex; align-items: center; gap: 0.625rem; } + .cm-nav-links { display: none; align-items: center; gap: 2rem; } + @media (min-width: 768px) { .cm-nav-links { display: flex; } } + .cm-nav-link { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 0.9375rem; color: hsl(var(--foreground)); text-decoration: none; padding-bottom: 2px; border-bottom: 2px solid transparent; transition: border-color 150ms ease; } + .cm-nav-link:hover { border-bottom-color: hsl(var(--accent)); } + .cm-nav-toggle { display: inline-flex; } + @media (min-width: 768px) { .cm-nav-toggle { display: none; } } + .cm-nav-drawer { display: none; flex-direction: column; gap: 0.25rem; padding: 0.5rem 0 1rem; border-top: 1px solid hsl(var(--border)); width: 100%; } + @media (min-width: 768px) { .cm-nav-drawer { display: none !important; } } + .cm-nav-drawer a { padding: 0.625rem 0; font-family: var(--font-body, "Inter", system-ui, sans-serif); color: hsl(var(--foreground)); text-decoration: none; border-bottom: 1px solid hsl(var(--border)); } + + /* --- Chrome: utility bar + announcement bar --- */ + .cm-utility-bar { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 0.8125rem; padding: 0.5rem 0; } + .cm-utility-bar--muted { background-color: hsl(var(--muted)); color: hsl(var(--muted-foreground)); } + .cm-utility-bar--primary { background-color: hsl(var(--primary)); color: hsl(var(--primary-foreground)); } + .cm-utility-bar--dark { background-color: hsl(var(--foreground)); color: hsl(var(--background)); } + .cm-utility-row { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } + .cm-utility-group { display: flex; align-items: center; gap: 1.25rem; } + .cm-utility-item { display: inline-flex; align-items: center; gap: 0.375rem; color: inherit; text-decoration: none; } + .cm-announce { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 0.875rem; padding: 0.625rem 0; } + .cm-announce--info { background-color: hsl(var(--muted)); color: hsl(var(--foreground)); } + .cm-announce--promo { background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); } + .cm-announce--alert { background-color: hsl(var(--destructive)); color: hsl(var(--destructive-foreground)); } + .cm-announce-row { display: flex; align-items: center; justify-content: center; gap: 0.75rem; } + .cm-announce a { color: inherit; text-decoration: underline; text-underline-offset: 2px; font-weight: 600; } + .cm-announce-close { margin-left: auto; background: none; border: 0; color: inherit; cursor: pointer; line-height: 1; padding: 0 0.25rem; } + + /* --- Chrome: footer --- */ + .cm-footer { background-color: hsl(var(--background)); color: hsl(var(--foreground)); border-top: 2px solid hsl(var(--accent)); padding: 3.5rem 0 2.5rem; } + .cm-footer-cols { display: grid; gap: 2rem; grid-template-columns: repeat(1, minmax(0, 1fr)); } + @media (min-width: 640px) { .cm-footer-cols { grid-template-columns: repeat(2, minmax(0, 1fr)); } } + @media (min-width: 1024px) { .cm-footer-cols { grid-template-columns: 2fr repeat(3, 1fr); } } + .cm-footer-head { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-size: 0.8125rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: hsl(var(--muted-foreground)); margin: 0 0 0.875rem; } + .cm-footer-link { display: block; font-size: 0.9375rem; color: hsl(var(--foreground)); text-decoration: none; padding: 0.25rem 0; } + .cm-footer-link:hover { color: hsl(var(--accent)); } + .cm-footer-legal { color: hsl(var(--muted-foreground)); font-size: 0.8125rem; border-top: 1px solid hsl(var(--border)); padding-top: 1.5rem; margin-top: 2.5rem; display: flex; flex-wrap: wrap; gap: 1rem; justify-content: space-between; } + + /* --- Marketing: hero --- */ + .cm-hero { padding: 5rem 0; } + .cm-hero-headline { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 600; letter-spacing: -0.03em; line-height: 1.05; font-size: clamp(2.5rem, 6vw, 4.5rem); color: hsl(var(--foreground)); margin: 0; } + .cm-hero-sub { font-size: clamp(1.125rem, 2vw, 1.5rem); line-height: 1.5; color: hsl(var(--muted-foreground)); margin: 1.25rem 0 0; } + .cm-hero-split { display: grid; gap: 3rem; grid-template-columns: repeat(1, minmax(0, 1fr)); align-items: center; } + @media (min-width: 1024px) { .cm-hero-split { grid-template-columns: repeat(2, minmax(0, 1fr)); } } + + /* --- Marketing: logo strip --- */ + .cm-logo { filter: grayscale(1); opacity: 0.65; transition: filter 200ms ease, opacity 200ms ease; } + .cm-logo:hover { filter: grayscale(0); opacity: 1; } + .cm-logo-row { display: flex; flex-wrap: wrap; align-items: center; gap: 2.5rem; } + + /* --- Marketing: feature grid --- */ + .cm-feature { border-top: 2px solid hsl(var(--accent)); padding-top: 1.25rem; } + .cm-feature-title { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 600; font-size: 1.125rem; color: hsl(var(--foreground)); margin: 0.75rem 0 0.5rem; } + + /* --- Marketing: pull quote / testimonial --- */ + .cm-pull-quote { border-top: 2px solid hsl(var(--accent)); padding-top: 1.25rem; font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-size: 1.5rem; line-height: 1.4; font-weight: 500; color: hsl(var(--foreground)); } + .cm-quote-block { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-size: 1.375rem; line-height: 1.45; font-weight: 500; color: hsl(var(--foreground)); } + .cm-quote-cite { font-size: 0.875rem; color: hsl(var(--muted-foreground)); margin-top: 0.75rem; } + .cm-avatar { width: 2.75rem; height: 2.75rem; border-radius: 9999px; object-fit: cover; background-color: hsl(var(--muted)); } + + /* --- Marketing: pricing --- */ + .cm-price { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 2.5rem; font-weight: 500; font-variant-numeric: tabular-nums; color: hsl(var(--foreground)); letter-spacing: -0.02em; } + .cm-price-period { font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 0.9375rem; color: hsl(var(--muted-foreground)); } + .cm-price-tier { display: flex; flex-direction: column; } + .cm-price-tier--featured { border-top: 4px solid hsl(var(--accent)); } + .cm-badge { display: inline-block; font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 0.6875rem; letter-spacing: 0.08em; text-transform: uppercase; padding: 0.25rem 0.5rem; background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); border-radius: 3px; } + .cm-check { color: hsl(var(--accent)); flex: none; } + + /* --- Marketing: faq --- */ + .cm-faq-item { border-top: 1px solid hsl(var(--border)); } + .cm-faq-item summary { cursor: pointer; list-style: none; padding: 1.25rem 0; display: flex; align-items: center; justify-content: space-between; gap: 1rem; font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 600; color: hsl(var(--foreground)); } + .cm-faq-item summary::-webkit-details-marker { display: none; } + .cm-faq-item[open] summary .cm-faq-chevron { transform: rotate(180deg); } + .cm-faq-chevron { transition: transform 150ms ease; color: hsl(var(--accent)); } + .cm-faq-answer { padding: 0 0 1.25rem; color: hsl(var(--muted-foreground)); font-size: 1rem; line-height: 1.65; } + + /* --- Marketing: timeline --- */ + .cm-timeline-step { display: grid; grid-template-columns: auto 1fr; gap: 1.25rem; padding-bottom: 2rem; } + .cm-timeline-rail { position: relative; display: flex; flex-direction: column; align-items: center; } + .cm-timeline-node { width: 2.5rem; height: 2.5rem; border: 2px solid hsl(var(--accent)); border-radius: 9999px; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-weight: 500; color: hsl(var(--accent)); flex: none; font-variant-numeric: tabular-nums; } + .cm-timeline-line { flex: 1 1 auto; width: 1px; background-color: hsl(var(--border)); margin-top: 0.5rem; } + + /* --- Marketing: cta strip --- */ + .cm-cta-strip { padding: 3.5rem 0; } + .cm-cta-strip--band { background-color: hsl(var(--foreground)); color: hsl(var(--background)); } + .cm-cta-strip--band .cm-btn-primary { background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); border-color: hsl(var(--accent)); } + .cm-cta-strip--card { background-color: hsl(var(--muted)); } + .cm-cta-headline { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 600; letter-spacing: -0.02em; font-size: clamp(1.75rem, 3vw, 2.5rem); line-height: 1.15; margin: 0; } + + /* --- Marketing: countdown --- */ + .cm-count-unit { display: flex; flex-direction: column; align-items: center; } + .cm-count-figure { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: clamp(2rem, 4vw, 3rem); font-weight: 500; font-variant-numeric: tabular-nums; color: hsl(var(--foreground)); line-height: 1; } + .cm-count-box { border: 1px solid hsl(var(--border)); padding: 1rem 1.25rem; border-radius: 4px; min-width: 4.5rem; } + + /* --- Primitives: quote / divider / gallery / media --- */ + .cm-divider-line { border: 0; border-top: 1px solid hsl(var(--border)); } + .cm-divider-thick { border-top-width: 2px; border-top-color: hsl(var(--accent)); } + .cm-divider-ornament { display: flex; align-items: center; justify-content: center; gap: 0.75rem; color: hsl(var(--muted-foreground)); } + .cm-gallery-grid { display: grid; gap: 0.75rem; grid-template-columns: repeat(2, minmax(0, 1fr)); } + @media (min-width: 768px) { .cm-gallery-grid.cm-gallery-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .cm-gallery-grid.cm-gallery-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } } + .cm-video-frame { position: relative; display: block; width: 100%; background-color: hsl(var(--muted)); border: 1px solid hsl(var(--border)); overflow: hidden; } + .cm-video-play { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: hsl(var(--background)); background: none; border: 0; cursor: pointer; } + .cm-video-play-badge { width: 4rem; height: 4rem; border-radius: 9999px; background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); display: flex; align-items: center; justify-content: center; } + + /* --- Commerce / local --- */ + .cm-menu-item { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; padding: 0.75rem 0; border-bottom: 1px solid hsl(var(--border)); } + .cm-menu-price { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-variant-numeric: tabular-nums; color: hsl(var(--foreground)); } + .cm-channel { display: flex; align-items: flex-start; gap: 0.75rem; } + .cm-channel-mark { width: 2.5rem; height: 2.5rem; border: 1px solid hsl(var(--border)); border-radius: 4px; display: flex; align-items: center; justify-content: center; color: hsl(var(--accent)); flex: none; } + .cm-hours-row { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; padding: 0.375rem 0; border-bottom: 1px solid hsl(var(--border)); } + .cm-social-row { display: flex; flex-wrap: wrap; gap: 0.75rem; } + .cm-social-link { display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.5rem 0.75rem; border: 1px solid hsl(var(--border)); border-radius: 4px; color: hsl(var(--foreground)); text-decoration: none; font-size: 0.875rem; transition: border-color 150ms ease; } + .cm-social-link:hover { border-color: hsl(var(--accent)); color: hsl(var(--accent)); } + + /* --- Forms --- */ + .cm-form { display: grid; gap: 1.25rem; } + .cm-form-grid { display: grid; gap: 1.25rem; grid-template-columns: repeat(2, minmax(0, 1fr)); } + .cm-field { display: flex; flex-direction: column; gap: 0.375rem; } + .cm-field--full { grid-column: 1 / -1; } + .cm-label { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-size: 0.8125rem; font-weight: 600; color: hsl(var(--foreground)); text-transform: uppercase; letter-spacing: 0.04em; } + .cm-input { width: 100%; box-sizing: border-box; padding: 0.625rem 0.75rem; background-color: hsl(var(--background)); color: hsl(var(--foreground)); border: 1px solid hsl(var(--input)); border-radius: 4px; font-family: var(--font-body, "Inter", system-ui, sans-serif); font-size: 1rem; } + .cm-input:focus { outline: 2px solid hsl(var(--ring)); outline-offset: 1px; border-color: hsl(var(--ring)); } + .cm-form-note { font-size: 0.8125rem; color: hsl(var(--muted-foreground)); } + .cm-alert-ok { border-left: 3px solid hsl(var(--accent)); background-color: hsl(var(--muted)); padding: 1rem 1.25rem; color: hsl(var(--foreground)); } + .cm-alert-err { border-left: 3px solid hsl(var(--destructive)); background-color: hsl(var(--muted)); padding: 1rem 1.25rem; color: hsl(var(--foreground)); } + + /* --- Blog family --- */ + .cm-post-card { display: flex; flex-direction: column; gap: 0.75rem; } + .cm-post-thumb { display: block; width: 100%; aspect-ratio: 16 / 10; object-fit: cover; background-color: hsl(var(--muted)); border: 1px solid hsl(var(--border)); } + .cm-post-title { font-family: var(--font-heading, "Inter", system-ui, sans-serif); font-weight: 600; font-size: 1.25rem; line-height: 1.25; color: hsl(var(--foreground)); text-decoration: none; } + .cm-post-title:hover { color: hsl(var(--accent)); } + .cm-post-meta { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 0.75rem; letter-spacing: 0.04em; text-transform: uppercase; color: hsl(var(--muted-foreground)); } + .cm-post-excerpt { color: hsl(var(--muted-foreground)); font-size: 0.9375rem; line-height: 1.6; } + .cm-post-grid { display: grid; gap: 2.5rem; grid-template-columns: repeat(1, minmax(0, 1fr)); } + @media (min-width: 640px) { .cm-post-grid-2, .cm-post-grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } } + @media (min-width: 1024px) { .cm-post-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } } + .cm-tag { display: inline-block; font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 0.75rem; letter-spacing: 0.04em; padding: 0.1875rem 0.5rem; border: 1px solid hsl(var(--border)); border-radius: 3px; color: hsl(var(--muted-foreground)); text-decoration: none; } + .cm-tag:hover { border-color: hsl(var(--accent)); color: hsl(var(--accent)); } + .cm-crumbs { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; font-size: 0.8125rem; color: hsl(var(--muted-foreground)); } + .cm-crumbs a { color: hsl(var(--muted-foreground)); text-decoration: none; } + .cm-crumbs a:hover { color: hsl(var(--accent)); } + .cm-crumb-sep { color: hsl(var(--border)); } + .cm-sidebar-link { display: block; padding: 0.5rem 0.75rem; border-left: 2px solid transparent; color: hsl(var(--foreground)); text-decoration: none; font-size: 0.9375rem; } + .cm-sidebar-link:hover, .cm-sidebar-link[aria-current="page"] { border-left-color: hsl(var(--accent)); color: hsl(var(--accent)); } + .cm-rank { font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); font-size: 1.25rem; font-weight: 500; color: hsl(var(--accent)); font-variant-numeric: tabular-nums; width: 2rem; flex: none; } + + /* --- Motion (CSS-first, reduced-motion honored) --- */ + .cm-reveal { opacity: 0; transform: translateY(0.5rem); animation: cm-reveal 500ms ease forwards; } + @keyframes cm-reveal { to { opacity: 1; transform: none; } } + @media (prefers-reduced-motion: reduce) { + .cm-reveal { animation: none; opacity: 1; transform: none; } + .cm-btn-ghost, .cm-logo, .cm-nav-link, .cm-faq-chevron { transition: none; } + } diff --git a/master_pages.json b/master_pages.json index 355fae8..c2a6e3e 100644 --- a/master_pages.json +++ b/master_pages.json @@ -2,23 +2,31 @@ { "key": "corporate-modernist:default-master", "title": "Corporate Modernist Default Master", - "page_templates": ["default", "article"], + "page_templates": ["default", "article", "blog-index", "full-width"], "blocks": [ - { "block_key": "navbar", "title": "Main Navigation", "content": { "menuName": "main", "style": "underline" }, "slot": "header", "sort_order": 0 }, + { "block_key": "navbar", "title": "Main Navigation", "content": { "variant": "standard", "menuName": "main" }, "slot": "header", "sort_order": 0 }, { "block_key": "slot", "title": "Main Content Slot", "content": { "slotName": "main" }, "slot": "main", "sort_order": 0 }, - { "block_key": "corporate-modernist:footer", "title": "Site Footer", "content": { "variant": "compact", "showLegal": true }, "slot": "footer", "sort_order": 0 } + { "block_key": "footer", "title": "Site Footer", "content": { "layout": "columns", "showSocial": true, "companyName": "Meridian Advisory", "tagline": "Strategy, operations, and risk counsel for boards.", "copyright": "Meridian Advisory" }, "slot": "footer", "sort_order": 0 } ] }, { "key": "corporate-modernist:landing-master", "title": "Corporate Modernist Landing Master", - "page_templates": ["landing", "full-width"], + "page_templates": ["landing"], "blocks": [ - { "block_key": "navbar", "title": "Main Navigation", "content": { "menuName": "main", "style": "underline" }, "slot": "header", "sort_order": 0 }, - { "block_key": "corporate-modernist:hero_statement", "title": "Landing Hero", "content": { "eyebrow": "Enterprise", "headline": "Trusted by 200+ boards" }, "slot": "hero", "sort_order": 0 }, + { "block_key": "navbar", "title": "Main Navigation", "content": { "variant": "standard", "menuName": "main" }, "slot": "header", "sort_order": 0 }, + { "block_key": "hero", "title": "Landing Hero", "content": { "template": "left-aligned", "eyebrow": "B2B advisory", "headline": "Precise counsel for boards that move first", "subheadline": "Strategy, operations, and risk work delivered on a fixed scope." }, "slot": "hero", "sort_order": 0 }, { "block_key": "slot", "title": "Main Content Slot", "content": { "slotName": "main" }, "slot": "main", "sort_order": 0 }, - { "block_key": "corporate-modernist:cta_strip", "title": "Closing CTA", "content": { "variant": "book-call" }, "slot": "cta", "sort_order": 0 }, - { "block_key": "corporate-modernist:footer", "title": "Site Footer", "content": { "variant": "full", "showLegal": true }, "slot": "footer", "sort_order": 0 } + { "block_key": "cta", "title": "Closing CTA", "content": { "background": "band", "heading": "Book a working session", "text": "Ninety minutes with a principal. No pitch deck.", "primaryLabel": "Request a session", "primaryUrl": "/contact" }, "slot": "cta", "sort_order": 0 }, + { "block_key": "footer", "title": "Site Footer", "content": { "layout": "columns", "showSocial": true, "companyName": "Meridian Advisory", "copyright": "Meridian Advisory" }, "slot": "footer", "sort_order": 0 } + ] + }, + { + "key": "corporate-modernist:auth-master", + "title": "Corporate Modernist Auth Master", + "page_templates": ["auth"], + "blocks": [ + { "block_key": "slot", "title": "Auth Slot", "content": { "slotName": "main" }, "slot": "main", "sort_order": 0 } ] } ] diff --git a/presets.json b/presets.json index 94e05a8..e8853bd 100644 --- a/presets.json +++ b/presets.json @@ -52,7 +52,7 @@ { "id": "forest-quiet", "name": "Forest Quiet", - "description": "Same chassis, deep green accent for sustainability, advisory, ESG.", + "description": "Same chassis, deep green accent for sustainability, advisory, and ESG.", "theme": { "mode": "both", "lightColors": { @@ -102,7 +102,7 @@ { "id": "burgundy-tradition", "name": "Burgundy Tradition", - "description": "Heritage accent for old-line legal, private banking, partnerships.", + "description": "Heritage accent for old-line legal, private banking, and partnerships.", "theme": { "mode": "both", "lightColors": { @@ -148,5 +148,105 @@ "ring": "350 60% 60%" } } + }, + { + "id": "graphite-mono", + "name": "Graphite Mono", + "description": "Achromatic ink on gallery white. Pure Swiss restraint with no hue.", + "theme": { + "mode": "both", + "lightColors": { + "background": "0 0% 100%", + "foreground": "0 0% 9%", + "card": "0 0% 100%", + "cardForeground": "0 0% 9%", + "popover": "0 0% 100%", + "popoverForeground": "0 0% 9%", + "primary": "0 0% 13%", + "primaryForeground": "0 0% 100%", + "secondary": "0 0% 96%", + "secondaryForeground": "0 0% 9%", + "muted": "0 0% 96%", + "mutedForeground": "0 0% 40%", + "accent": "0 0% 13%", + "accentForeground": "0 0% 100%", + "destructive": "0 72% 42%", + "destructiveForeground": "0 0% 100%", + "border": "0 0% 88%", + "input": "0 0% 88%", + "ring": "0 0% 13%" + }, + "darkColors": { + "background": "0 0% 8%", + "foreground": "0 0% 96%", + "card": "0 0% 11%", + "cardForeground": "0 0% 96%", + "popover": "0 0% 11%", + "popoverForeground": "0 0% 96%", + "primary": "0 0% 92%", + "primaryForeground": "0 0% 8%", + "secondary": "0 0% 17%", + "secondaryForeground": "0 0% 96%", + "muted": "0 0% 15%", + "mutedForeground": "0 0% 64%", + "accent": "0 0% 92%", + "accentForeground": "0 0% 8%", + "destructive": "0 62% 50%", + "destructiveForeground": "0 0% 100%", + "border": "0 0% 22%", + "input": "0 0% 22%", + "ring": "0 0% 92%" + } + } + }, + { + "id": "signal-red", + "name": "Signal Red", + "description": "Graphite ground with a single Bauhaus primary-red accent for bold consultancies.", + "theme": { + "mode": "both", + "lightColors": { + "background": "0 0% 100%", + "foreground": "0 0% 11%", + "card": "0 0% 100%", + "cardForeground": "0 0% 11%", + "popover": "0 0% 100%", + "popoverForeground": "0 0% 11%", + "primary": "4 74% 46%", + "primaryForeground": "0 0% 100%", + "secondary": "0 0% 96%", + "secondaryForeground": "0 0% 11%", + "muted": "0 0% 96%", + "mutedForeground": "0 0% 40%", + "accent": "4 74% 46%", + "accentForeground": "0 0% 100%", + "destructive": "0 72% 42%", + "destructiveForeground": "0 0% 100%", + "border": "0 0% 88%", + "input": "0 0% 88%", + "ring": "4 74% 46%" + }, + "darkColors": { + "background": "0 0% 8%", + "foreground": "0 0% 96%", + "card": "0 0% 11%", + "cardForeground": "0 0% 96%", + "popover": "0 0% 11%", + "popoverForeground": "0 0% 96%", + "primary": "4 78% 58%", + "primaryForeground": "0 0% 8%", + "secondary": "0 0% 17%", + "secondaryForeground": "0 0% 96%", + "muted": "0 0% 15%", + "mutedForeground": "0 0% 64%", + "accent": "4 78% 58%", + "accentForeground": "0 0% 8%", + "destructive": "0 62% 50%", + "destructiveForeground": "0 0% 100%", + "border": "0 0% 22%", + "input": "0 0% 22%", + "ring": "4 78% 58%" + } + } } ] diff --git a/seed/seed.json b/seed/seed.json new file mode 100644 index 0000000..ae8e4c6 --- /dev/null +++ b/seed/seed.json @@ -0,0 +1,122 @@ +{ + "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": "

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.

" } }, + { "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": "

What changed when a regional bank moved from headcount targets to cost-to-serve.

", "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": "

Most registers are written for auditors. Here is how to write one for directors.

", "link": "/blog/risk-register", "linkLabel": "Read" } }, + { "block_key": "card", "title": "Post 3", "slot": "main", "sort_order": 3, "content": { "title": "The ninety-day decision", "text": "

Why the first real decision should land inside three months, not six.

", "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": "

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.

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.

" } } + ] + }, + { + "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": "

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.

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.

" } } + ] + }, + { + "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": "

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.

The decision does not have to be final. It has to be real. A board that decides once will decide again faster.

" } } + ] + }, + { + "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 } + ] +} diff --git a/seed/workflows.json b/seed/workflows.json new file mode 100644 index 0000000..728b866 --- /dev/null +++ b/seed/workflows.json @@ -0,0 +1,19 @@ +{ + "workflows": [ + { + "key": "contact_notify_admins", + "name": "Notify admins on contact submission", + "description": "Emails site admins whenever the Meridian Advisory contact form receives a message.", + "enabled": true, + "trigger": { "type": "row_inserted", "table": "contact_submissions" }, + "steps": [ + { + "type": "email", + "name": "Email admins", + "template": "Form Submission Notification", + "recipients": { "mode": "admins", "scope": "all" } + } + ] + } + ] +} diff --git a/templates/corporate-modernist/auth.ninjatpl b/templates/corporate-modernist/auth.ninjatpl new file mode 100644 index 0000000..7c7ef03 --- /dev/null +++ b/templates/corporate-modernist/auth.ninjatpl @@ -0,0 +1,17 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} +
+
+ {{ site_settings.Title|default:"Corporate Modernist" }} +
+ {% if slots.main %}{{ slots.main|safe }}{% else %}

No form assigned to this page.

{% endif %} +
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} +
+
+ {{ body_end_html|safe }} + + diff --git a/templates/corporate-modernist/blog-index.ninjatpl b/templates/corporate-modernist/blog-index.ninjatpl new file mode 100644 index 0000000..224f36a --- /dev/null +++ b/templates/corporate-modernist/blog-index.ninjatpl @@ -0,0 +1,17 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} + {% if slots.header %}
{{ slots.header|safe }}
{% endif %} +
+
+ {% if title %}

Insights

{{ title }}

{% if page_meta.MetaDescription %}

{{ page_meta.MetaDescription }}

{% endif %}
{% endif %} + {% if slots.featured %}
{{ slots.featured|safe }}
{% endif %} + {% if slots.main %}
{{ slots.main|safe }}
{% else %}

No posts published yet.

{% endif %} +
+
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} + {{ body_end_html|safe }} + + diff --git a/templates/corporate-modernist/contact.ninjatpl b/templates/corporate-modernist/contact.ninjatpl new file mode 100644 index 0000000..84ae62e --- /dev/null +++ b/templates/corporate-modernist/contact.ninjatpl @@ -0,0 +1,23 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} + {% if slots.header %}
{{ slots.header|safe }}
{% endif %} +
+
+ {% if slots.aside %} +
+
{{ slots.main|safe }}
+ +
+ + {% else %} +
{% if slots.main %}{{ slots.main|safe }}{% else %}

No content blocks assigned to this page.

{% endif %}
+ {% endif %} +
+
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} + {{ body_end_html|safe }} + + diff --git a/templates/overrides/corporate-modernist/announcement-bar.ninjatpl b/templates/overrides/corporate-modernist/announcement-bar.ninjatpl new file mode 100644 index 0000000..e2ac9e2 --- /dev/null +++ b/templates/overrides/corporate-modernist/announcement-bar.ninjatpl @@ -0,0 +1,8 @@ +{# announcement-bar override — centered notice; carries data-bn-announcement / data-bn-annkey and a data-bn-ann-dismiss close button so the host dismissal JS binds. #} +{% if variant == "promo" %}{% set annvar = "cm-announce--promo" %}{% set annsty = "background:hsl(var(--primary));color:hsl(var(--primary-foreground));" %}{% elif variant == "alert" %}{% set annvar = "cm-announce--alert" %}{% set annsty = "background:hsl(var(--destructive));color:hsl(var(--destructive-foreground));" %}{% else %}{% set annvar = "cm-announce--info" %}{% set annsty = "background:hsl(var(--accent));color:hsl(var(--accent-foreground));" %}{% endif %} +
+
+

{{ message }}{% if linkText and linkUrl %} {{ linkText }}{% endif %}

+{% if dismissable %}{% endif %} +
+
diff --git a/templates/overrides/corporate-modernist/audio-embed.ninjatpl b/templates/overrides/corporate-modernist/audio-embed.ninjatpl new file mode 100644 index 0000000..0a3f650 --- /dev/null +++ b/templates/overrides/corporate-modernist/audio-embed.ninjatpl @@ -0,0 +1,14 @@ +{# audio-embed override — hairline card row; carries data-bn-audio / data-audio-url / data-audio-media + data-bn-audio-slot so the host facade JS binds. #} +
+
+{% if artwork %}
{% img artwork alt=title|default:"" class="cm-audio-art" %}
{% endif %} +
+{% if title %}

{{ title }}

{% endif %} +{% if artist %}

{{ artist }}

{% endif %} +
+ +{% if download %}::lucide:download:sm:: Download{% endif %} +
+
+
+
diff --git a/templates/overrides/corporate-modernist/auth-form.ninjatpl b/templates/overrides/corporate-modernist/auth-form.ninjatpl new file mode 100644 index 0000000..643b7d2 --- /dev/null +++ b/templates/overrides/corporate-modernist/auth-form.ninjatpl @@ -0,0 +1,22 @@ +
+ + +
+ + +
+
+ +
+
+
+
+ +
+ +
diff --git a/templates/overrides/corporate-modernist/auth-status.ninjatpl b/templates/overrides/corporate-modernist/auth-status.ninjatpl new file mode 100644 index 0000000..3a02cb1 --- /dev/null +++ b/templates/overrides/corporate-modernist/auth-status.ninjatpl @@ -0,0 +1 @@ +{% if context.isPublicLoggedIn %}
{{ context.publicDisplayName|default:context.publicUsername }}AccountSign out
{% else %}{% endif %} diff --git a/templates/overrides/corporate-modernist/author-bio-hero.ninjatpl b/templates/overrides/corporate-modernist/author-bio-hero.ninjatpl new file mode 100644 index 0000000..c065884 --- /dev/null +++ b/templates/overrides/corporate-modernist/author-bio-hero.ninjatpl @@ -0,0 +1 @@ +{% if context.currentAuthor %}
{% if showAvatar and context.currentAuthor.avatarUrl %}{{ context.currentAuthor.displayName }}{% else %}{% endif %}

{{ context.currentAuthor.displayName }}

{% if context.currentAuthor.bio %}

{{ context.currentAuthor.bio }}

{% endif %}{% if showSocial %}
{% if context.currentAuthor.websiteUrl %}{% endif %}{% if context.currentAuthor.twitterHandle %}{% endif %}{% if context.currentAuthor.linkedinUrl %}{% endif %}
{% endif %}
{% endif %} diff --git a/templates/overrides/corporate-modernist/author-bio.ninjatpl b/templates/overrides/corporate-modernist/author-bio.ninjatpl new file mode 100644 index 0000000..07048c2 --- /dev/null +++ b/templates/overrides/corporate-modernist/author-bio.ninjatpl @@ -0,0 +1 @@ +{% if context.currentPost.authorName %}{% endif %} diff --git a/templates/overrides/corporate-modernist/blog-hero.ninjatpl b/templates/overrides/corporate-modernist/blog-hero.ninjatpl new file mode 100644 index 0000000..002e98b --- /dev/null +++ b/templates/overrides/corporate-modernist/blog-hero.ninjatpl @@ -0,0 +1 @@ +
{% if title %}

{{ title }}

{% endif %}{% if subtitle %}

{{ subtitle }}

{% endif %}
{% if posts %}
{% for post in posts %}
{% if post.featured_image_url %}{{ post.title }}{% endif %}

{{ post.title }}

{% if showExcerpt and post.excerpt %}

{{ post.excerpt }}

{% endif %}
{% endfor %}
{% endif %}
diff --git a/templates/overrides/corporate-modernist/breadcrumbs.ninjatpl b/templates/overrides/corporate-modernist/breadcrumbs.ninjatpl new file mode 100644 index 0000000..97b7c7a --- /dev/null +++ b/templates/overrides/corporate-modernist/breadcrumbs.ninjatpl @@ -0,0 +1 @@ + diff --git a/templates/overrides/corporate-modernist/button.ninjatpl b/templates/overrides/corporate-modernist/button.ninjatpl index d0c818b..679d9a5 100644 --- a/templates/overrides/corporate-modernist/button.ninjatpl +++ b/templates/overrides/corporate-modernist/button.ninjatpl @@ -1 +1,6 @@ -{% if variant|default:"primary" == "outline" or variant|default:"primary" == "secondary" %}{{ label|default:text|default:"Learn more" }}{% else %}{{ label|default:text|default:"Learn more" }}{% endif %} +{% set btnStyle = style|default:"primary" %} +{% set btnClass = "cm-btn-primary" %} +{% if btnStyle == "outline" or btnStyle == "secondary" %}{% set btnClass = "cm-btn-outline" %}{% elif btnStyle == "ghost" or btnStyle == "link" %}{% set btnClass = "cm-btn-ghost" %}{% endif %} +{% set sizeClass = "" %} +{% if size == "sm" %}{% set sizeClass = "cm-btn-sm" %}{% elif size == "lg" %}{% set sizeClass = "cm-btn-lg" %}{% endif %} + diff --git a/templates/overrides/corporate-modernist/card.ninjatpl b/templates/overrides/corporate-modernist/card.ninjatpl index c32942e..99f46e2 100644 --- a/templates/overrides/corporate-modernist/card.ninjatpl +++ b/templates/overrides/corporate-modernist/card.ninjatpl @@ -1 +1 @@ -
{% if title %}
{{ title }}
{% endif %}{% if body|default:text %}
{{ body|default:text|safe }}
{% endif %}
+
{% if media %}
{% img media alt=title|default:"" class="cm-card-media" %}
{% endif %}{% if title %}

{{ title }}

{% endif %}{% if text %}
{{ text|safe }}
{% endif %}{% if linkLabel and link %}{{ linkLabel }}::lucide:arrow-right:sm::{% endif %}
diff --git a/templates/overrides/corporate-modernist/category-list.ninjatpl b/templates/overrides/corporate-modernist/category-list.ninjatpl new file mode 100644 index 0000000..ccaa365 --- /dev/null +++ b/templates/overrides/corporate-modernist/category-list.ninjatpl @@ -0,0 +1 @@ +
{% if heading %}

{{ heading }}

{% endif %}{% if style == "pills" %}{% else %}{% endif %}
diff --git a/templates/overrides/corporate-modernist/contact-card.ninjatpl b/templates/overrides/corporate-modernist/contact-card.ninjatpl new file mode 100644 index 0000000..486eb53 --- /dev/null +++ b/templates/overrides/corporate-modernist/contact-card.ninjatpl @@ -0,0 +1,14 @@ +{# contact-card override — grouped contact channels; each channel a hairline mark + label + value. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if description %}

{{ description }}

{% endif %} +
+{% for channel in channels %}
+{% if channel.icon %}::{{ channel.icon }}:sm::{% endif %} +
+{% if channel.label %}
{{ channel.label }}
{% endif %} +{% if channel.value %}
{% if channel.link %}{{ channel.value }}{% else %}{{ channel.value }}{% endif %}
{% endif %} +
+
{% endfor %} +
+
diff --git a/templates/overrides/corporate-modernist/contact-form.ninjatpl b/templates/overrides/corporate-modernist/contact-form.ninjatpl new file mode 100644 index 0000000..0761d40 --- /dev/null +++ b/templates/overrides/corporate-modernist/contact-form.ninjatpl @@ -0,0 +1,34 @@ +{# contact-form override — server-driven; block-id resolution, {% form %} wiring, honeypot, and field loop copied verbatim from the builtin, reskinned with cm-form primitives. #} +{% with bid=_block_id|default:context.blockId %} +
+{% if form.submitted %} +
+ +

{{ form.message|default:successMessage|default:"Thanks — your message has been sent." }}

+
+{% else %} +{% if heading %}

{{ heading }}

{% endif %} +{% if description %}

{{ description }}

{% endif %} +{% if form.errors._form %}
{{ form.errors._form }}
{% endif %} +{% with formAction="/api/blocks/"|add:bid|add:"/submit" formTarget="#contact-form-"|add:bid %} +{% form action=formAction hx_target=formTarget hx_swap="outerHTML" class="cm-form-grid" %} +{% for field in fields %} +
+{% if field.label %}{% endif %} +{% if field.type == "textarea" %} + +{% elif field.type == "select" %} + +{% else %} + +{% endif %} +
+{% endfor %} + +
+{% endform %} +{% endwith %} +{% endif %} +
+ +{% endwith %} diff --git a/templates/overrides/corporate-modernist/countdown.ninjatpl b/templates/overrides/corporate-modernist/countdown.ninjatpl new file mode 100644 index 0000000..497ccf8 --- /dev/null +++ b/templates/overrides/corporate-modernist/countdown.ninjatpl @@ -0,0 +1,44 @@ +{# countdown override — oversized mono unit boxes; host countdown JS binds via data-* attrs. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +
+
+
--{{ labelDays|default:"Days" }}
+
--{{ labelHours|default:"Hours" }}
+
--{{ labelMinutes|default:"Minutes" }}
+
--{{ labelSeconds|default:"Seconds" }}
+
+

{{ expiredMessage|default:"This has started." }}

{% if expiredUrl and expiredLabel %}{{ expiredLabel }}{% endif %}
+
+ +
+ diff --git a/templates/overrides/corporate-modernist/cta.ninjatpl b/templates/overrides/corporate-modernist/cta.ninjatpl new file mode 100644 index 0000000..b0e8ddf --- /dev/null +++ b/templates/overrides/corporate-modernist/cta.ninjatpl @@ -0,0 +1,8 @@ +{# cta override — full-width strip; band / card / split variants. #} +
+
+{% if heading %}

{{ heading }}

{% endif %} +{% if text %}

{{ text }}

{% endif %} +
+{% if primaryLabel or secondaryLabel %}
{% if primaryUrl and primaryLabel %}{{ primaryLabel }}{% endif %}{% if secondaryUrl and secondaryLabel %}{{ secondaryLabel }}{% endif %}
{% endif %} +
diff --git a/templates/overrides/corporate-modernist/divider.ninjatpl b/templates/overrides/corporate-modernist/divider.ninjatpl new file mode 100644 index 0000000..4c4854b --- /dev/null +++ b/templates/overrides/corporate-modernist/divider.ninjatpl @@ -0,0 +1,2 @@ +{# divider override — plain hairline / thick spacer rule / centered ornament between two hairlines. #} +{% if variant == "ornament" %}{% elif variant == "spacer-rule" %}{% else %}{% endif %} diff --git a/templates/overrides/corporate-modernist/event-list.ninjatpl b/templates/overrides/corporate-modernist/event-list.ninjatpl new file mode 100644 index 0000000..6dd2133 --- /dev/null +++ b/templates/overrides/corporate-modernist/event-list.ninjatpl @@ -0,0 +1,31 @@ +{# event-list override — dates shown VERBATIM in each event's own timezone (never converted); list rows or card grid. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +{% if layout == "cards" %} +
+{% for event in events %}{% if not (hidePast and event.past) %}
+{% if event.media %}
{% img event.media alt=event.title|default:"" class="cm-event-media" %}
{% endif %} +
+
{{ event.start }}{% if event.end %} – {{ event.end }}{% endif %}{% if event.timezone %} {{ event.timezone }}{% endif %}
+

{{ event.title }}

+{% if event.venue %}

{{ event.venue }}

{% endif %} +{% if event.description %}

{{ event.description }}

{% endif %} +{% if event.link %}{{ event.linkLabel|default:"Details" }}::lucide:arrow-right:sm::{% endif %} +
+
{% endif %}{% endfor %} +
+{% else %} +
    +{% for event in events %}{% if not (hidePast and event.past) %}
  • +
    {{ event.start }}{% if event.end %}
    to {{ event.end }}
    {% endif %}{% if event.timezone %}
    {{ event.timezone }}
    {% endif %}
    +
    +

    {{ event.title }}

    +{% if event.venue %}

    {{ event.venue }}

    {% endif %} +{% if event.description %}

    {{ event.description }}

    {% endif %} +
    +{% if event.link %}{{ event.linkLabel|default:"Details" }}{% endif %} +
  • {% endif %}{% endfor %} +
+{% endif %} +
diff --git a/templates/overrides/corporate-modernist/faq.ninjatpl b/templates/overrides/corporate-modernist/faq.ninjatpl new file mode 100644 index 0000000..e8e3e0d --- /dev/null +++ b/templates/overrides/corporate-modernist/faq.ninjatpl @@ -0,0 +1,6 @@ +{# faq override — native hairline-divided disclosure list. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +{% if items %}
{% for item in items %}
{{ item.question }}
{{ item.answer|safe }}
{% endfor %}
{% endif %} +
diff --git a/templates/overrides/corporate-modernist/feature-grid.ninjatpl b/templates/overrides/corporate-modernist/feature-grid.ninjatpl new file mode 100644 index 0000000..52c59b0 --- /dev/null +++ b/templates/overrides/corporate-modernist/feature-grid.ninjatpl @@ -0,0 +1,7 @@ +{# feature-grid override — Swiss cells, each led by a Bauhaus square mark. #} +
+{% if eyebrow %}

{{ eyebrow }}

{% endif %} +{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +{% if items %}
{% for item in items %}
{% if item.icon %}{% else %}{% endif %}{% if item.title %}

{% if item.linkUrl %}{{ item.title }}{% else %}{{ item.title }}{% endif %}

{% endif %}{% if item.text %}

{{ item.text }}

{% endif %}{% if item.linkUrl and item.linkLabel %}{{ item.linkLabel }}::lucide:arrow-right:sm::{% endif %}
{% endfor %}
{% endif %} +
diff --git a/templates/overrides/corporate-modernist/featured-posts.ninjatpl b/templates/overrides/corporate-modernist/featured-posts.ninjatpl new file mode 100644 index 0000000..7239f9c --- /dev/null +++ b/templates/overrides/corporate-modernist/featured-posts.ninjatpl @@ -0,0 +1 @@ +
{% if heading %}

{{ heading }}

{% endif %}
{% for post in posts %}
{% if showFeaturedImage and post.featured_image_url %}{{ post.title }}{% endif %}

{{ post.title }}

{% if showExcerpt and post.excerpt %}

{{ post.excerpt }}

{% endif %}
{% endfor %}
diff --git a/templates/overrides/corporate-modernist/footer.ninjatpl b/templates/overrides/corporate-modernist/footer.ninjatpl new file mode 100644 index 0000000..5bb9ecb --- /dev/null +++ b/templates/overrides/corporate-modernist/footer.ninjatpl @@ -0,0 +1,17 @@ +{# footer override — Swiss-grid footer chrome from CONTENT fields (brand, contact, newsletter, legal); menu columns / social / legal rows render from the footer providers (empty today, forward-correct). #} + diff --git a/templates/overrides/corporate-modernist/gallery.ninjatpl b/templates/overrides/corporate-modernist/gallery.ninjatpl new file mode 100644 index 0000000..9d60143 --- /dev/null +++ b/templates/overrides/corporate-modernist/gallery.ninjatpl @@ -0,0 +1,6 @@ +{# gallery override — Swiss grid of hairline-framed images; carries data-bn-gallery / data-lightbox / data-bn-gallery-item so the host lightbox JS binds. #} +{% if columns == 4 %}{% set gcols = "cm-gallery-4" %}{% set gn = 4 %}{% elif columns == 2 %}{% set gcols = "" %}{% set gn = 2 %}{% else %}{% set gcols = "cm-gallery-3" %}{% set gn = 3 %}{% endif %} +{% if gap == "sm" %}{% set ggap = "0.5rem" %}{% elif gap == "lg" %}{% set ggap = "1.5rem" %}{% else %}{% set ggap = "1rem" %}{% endif %} + diff --git a/templates/overrides/corporate-modernist/hero.ninjatpl b/templates/overrides/corporate-modernist/hero.ninjatpl new file mode 100644 index 0000000..c7f7bed --- /dev/null +++ b/templates/overrides/corporate-modernist/hero.ninjatpl @@ -0,0 +1,24 @@ +{# hero override — Swiss grid, oversized display headline, Bauhaus restraint. #} +{# styled-text fields accept a {text,color} object OR a bare string (.text|default:field). #} +{% set eyebrowText = eyebrow.text|default:eyebrow %} +{% set headlineText = headline.text|default:headline %} +{% set subText = subheadline.text|default:subheadline %} +{% set descText = description.text|default:description %} +{% set pText = ctaPrimary.text %} +{% set pUrl = ctaPrimary.url %} +{% set sText = ctaSecondary.text %} +{% set sUrl = ctaSecondary.url %} +{% set variant = template|default:"centered" %} +{% macro herobody() %} +{% if eyebrowText %}

{{ eyebrowText }}

{% endif %} +{% if headlineText %}

{{ headlineText }}

{% endif %} +{% if subText %}

{{ subText }}

{% endif %} +{% if descText %}

{{ descText }}

{% endif %} +{% if pText or sText %}
{% if pText and pUrl %}{{ pText }}{% endif %}{% if sText and sUrl %}{{ sText }}{% endif %}
{% endif %} +{% if trustLogos %}

Trusted by

{% for logo in trustLogos %}{% if logo.url %}{% img logo.image alt=logo.alt class="cm-logo" %}{% else %}{% img logo.image alt=logo.alt class="cm-logo" %}{% endif %}{% endfor %}
{% endif %} +{% endmacro %} +{% if variant == "split" %} +
{{ herobody() }}
{% if backgroundImage %}{% img backgroundImage alt=headlineText class="cm-hero-media" %}{% endif %}
+{% else %} +
{{ herobody() }}
+{% endif %} diff --git a/templates/overrides/corporate-modernist/hours-location.ninjatpl b/templates/overrides/corporate-modernist/hours-location.ninjatpl new file mode 100644 index 0000000..f104db2 --- /dev/null +++ b/templates/overrides/corporate-modernist/hours-location.ninjatpl @@ -0,0 +1,18 @@ +{# hours-location override — hairline hours table + address; click-to-load map preserves the builtin data-map-src / onclick wiring. #} +
+{% if heading %}

{{ heading }}

{% endif %} +
+
+{% if hours %}{% for row in hours %}{% endfor %}
{{ row.day }}{% if row.closed %}Closed{% else %}{{ row.hours }}{% endif %}
{% endif %} +{% if specialHoursNote %}

{{ specialHoursNote }}

{% endif %} +{% if address %}
Address
{{ address }}
{% endif %} +{% if phone %}{% endif %} +{% if directionsUrl %}::lucide:navigation:sm::Get directions{% endif %} +
+{% if mapEmbedUrl %} +
+ +
+{% endif %} +
+
diff --git a/templates/overrides/corporate-modernist/image.ninjatpl b/templates/overrides/corporate-modernist/image.ninjatpl new file mode 100644 index 0000000..82e4371 --- /dev/null +++ b/templates/overrides/corporate-modernist/image.ninjatpl @@ -0,0 +1,5 @@ +{# image override — hairline-framed figure with alignment and an optional caption. #} +{% if src %}{% if align == "left" %}{% set ialign = "flex-start" %}{% elif align == "right" %}{% set ialign = "flex-end" %}{% else %}{% set ialign = "center" %}{% endif %}
+
{% img src alt=alt|default:"" class="cm-image-el" %}
+{% if caption %}
{{ caption }}
{% endif %} +
{% endif %} diff --git a/templates/overrides/corporate-modernist/logo-strip.ninjatpl b/templates/overrides/corporate-modernist/logo-strip.ninjatpl new file mode 100644 index 0000000..07e6fe6 --- /dev/null +++ b/templates/overrides/corporate-modernist/logo-strip.ninjatpl @@ -0,0 +1,5 @@ +{# logo-strip override — quiet greyscale client row under a kicker. #} +
+{% if heading %}

{{ heading }}

{% endif %} +
{% for logo in logos %}{% if logo.url %}{% img logo.image alt=logo.alt class="cm-logo" %}{% else %}{% img logo.image alt=logo.alt class="cm-logo" %}{% endif %}{% endfor %}
+
diff --git a/templates/overrides/corporate-modernist/menu-list.ninjatpl b/templates/overrides/corporate-modernist/menu-list.ninjatpl new file mode 100644 index 0000000..2569d63 --- /dev/null +++ b/templates/overrides/corporate-modernist/menu-list.ninjatpl @@ -0,0 +1,21 @@ +{# menu-list override — sectioned price list; tabular-numeral prices right-aligned, dietary badges as hairline pills. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +
+{% for section in sections %}
+{% if section.title %}

{{ section.title }}

{% endif %} +{% if section.note %}

{{ section.note }}

{% endif %} +
    +{% for item in section.items %}
  • +
    +
    {{ item.name }}{% for badge in item.badges %}{% if badge.label %}{{ badge.label }}{% endif %}{% endfor %}
    +{% if item.description %}

    {{ item.description }}

    {% endif %} +
    +{% if item.price %}{% if currency %}{{ currency }}{% endif %}{{ item.price }}{% endif %} +
  • {% endfor %} +
+
{% endfor %} +
+{% if footnote %}

{{ footnote }}

{% endif %} +
diff --git a/templates/overrides/corporate-modernist/navbar.ninjatpl b/templates/overrides/corporate-modernist/navbar.ninjatpl new file mode 100644 index 0000000..fba3093 --- /dev/null +++ b/templates/overrides/corporate-modernist/navbar.ninjatpl @@ -0,0 +1 @@ + diff --git a/templates/overrides/corporate-modernist/newsletter-signup.ninjatpl b/templates/overrides/corporate-modernist/newsletter-signup.ninjatpl new file mode 100644 index 0000000..142ddad --- /dev/null +++ b/templates/overrides/corporate-modernist/newsletter-signup.ninjatpl @@ -0,0 +1 @@ +
{% if title %}

{{ title }}

{% endif %}{% if description %}

{{ description }}

{% endif %}
{% signup_form list=listSlug source=source submit=submitText success_message=successMessage placeholder=placeholder %}
diff --git a/templates/overrides/corporate-modernist/page-suggestions.ninjatpl b/templates/overrides/corporate-modernist/page-suggestions.ninjatpl new file mode 100644 index 0000000..0e5849e --- /dev/null +++ b/templates/overrides/corporate-modernist/page-suggestions.ninjatpl @@ -0,0 +1 @@ +

{{ title|default:"Were you looking for..." }}

{% if suggestions %}{% else %}{% if emptyMessage %}

{{ emptyMessage }}

{% endif %}{% endif %}
diff --git a/templates/overrides/corporate-modernist/password-reset-form.ninjatpl b/templates/overrides/corporate-modernist/password-reset-form.ninjatpl new file mode 100644 index 0000000..6e25638 --- /dev/null +++ b/templates/overrides/corporate-modernist/password-reset-form.ninjatpl @@ -0,0 +1,11 @@ +
+ +

Reset password

+

Enter your email and we will send a link to reset your password.

+
+
+
+ +
+ ::lucide:arrow-left:sm::Back to sign in +
diff --git a/templates/overrides/corporate-modernist/popular-posts.ninjatpl b/templates/overrides/corporate-modernist/popular-posts.ninjatpl new file mode 100644 index 0000000..e92e4ce --- /dev/null +++ b/templates/overrides/corporate-modernist/popular-posts.ninjatpl @@ -0,0 +1 @@ +
{% if heading %}

{{ heading }}

{% endif %}
    {% for post in posts %}
  1. {% if showRank %}{{ forloop.Counter }}{% endif %}{% if showThumbnail and post.featured_image_url %}{{ post.title }}{% endif %}

    {{ post.title }}

    {% if post.published_at %}{% endif %}
  2. {% endfor %}
diff --git a/templates/overrides/corporate-modernist/post-hero.ninjatpl b/templates/overrides/corporate-modernist/post-hero.ninjatpl new file mode 100644 index 0000000..e4a3901 --- /dev/null +++ b/templates/overrides/corporate-modernist/post-hero.ninjatpl @@ -0,0 +1 @@ +
{% if context.currentPost.featuredImageUrl %}
{{ context.currentPost.featuredImageAlt|default:context.currentPost.title }}
{% endif %}

{{ context.currentPost.title }}

{% if showExcerpt and context.currentPost.excerpt %}

{{ context.currentPost.excerpt }}

{% endif %}{% if showMeta %}{% endif %}
diff --git a/templates/overrides/corporate-modernist/post-metadata.ninjatpl b/templates/overrides/corporate-modernist/post-metadata.ninjatpl new file mode 100644 index 0000000..43fd8c9 --- /dev/null +++ b/templates/overrides/corporate-modernist/post-metadata.ninjatpl @@ -0,0 +1 @@ + diff --git a/templates/overrides/corporate-modernist/pricing.ninjatpl b/templates/overrides/corporate-modernist/pricing.ninjatpl new file mode 100644 index 0000000..1521f41 --- /dev/null +++ b/templates/overrides/corporate-modernist/pricing.ninjatpl @@ -0,0 +1,14 @@ +{# pricing override — flat hairline tiers, mono price figures, accent-top featured tier. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +{% if tiers %}
{% for tier in tiers %}{% endfor %}
{% endif %} +{% if billingNote %}

{{ billingNote }}

{% endif %} +
diff --git a/templates/overrides/corporate-modernist/quote.ninjatpl b/templates/overrides/corporate-modernist/quote.ninjatpl new file mode 100644 index 0000000..7502b40 --- /dev/null +++ b/templates/overrides/corporate-modernist/quote.ninjatpl @@ -0,0 +1,6 @@ +{# quote override — pull quote (accent top rule) / block quote (accent left rule) / inline card. #} +{% if style == "pull" %}{% set qcls = "cm-pull-quote" %}{% set qsty = "margin:2rem 0;" %}{% elif style == "inline-card" %}{% set qcls = "cm-quote-block cm-card cm-card-accent" %}{% set qsty = "margin:2rem 0;" %}{% else %}{% set qcls = "cm-quote-block" %}{% set qsty = "margin:2rem 0;border-left:2px solid hsl(var(--accent));padding-left:1.25rem;" %}{% endif %} +
+{{ quote|safe }} +{% if attribution or role or cite %}
{% if attribution %}{{ attribution }}{% endif %}{% if role %}{{ role }}{% endif %}{% if cite %}Source{% endif %}
{% endif %} +
diff --git a/templates/overrides/corporate-modernist/related-posts.ninjatpl b/templates/overrides/corporate-modernist/related-posts.ninjatpl new file mode 100644 index 0000000..04521d8 --- /dev/null +++ b/templates/overrides/corporate-modernist/related-posts.ninjatpl @@ -0,0 +1 @@ +

{{ heading|default:"Related posts" }}

{% for post in posts %}
{% if post.featured_image_url %}{{ post.title }}{% endif %}

{{ post.title }}

{% if post.published_at %}{% endif %}
{% endfor %}
diff --git a/templates/overrides/corporate-modernist/rich-section.ninjatpl b/templates/overrides/corporate-modernist/rich-section.ninjatpl new file mode 100644 index 0000000..c27fcdd --- /dev/null +++ b/templates/overrides/corporate-modernist/rich-section.ninjatpl @@ -0,0 +1,10 @@ +{# rich-section override — two-column media + rich text, hairline surface options. #} +
+
+{% if eyebrow %}

{{ eyebrow }}

{% endif %} +{% if heading %}

{{ heading }}

{% endif %} +{% if body %}
{{ body|safe }}
{% endif %} +{% if ctaUrl and ctaLabel %}{{ ctaLabel }}::lucide:arrow-right:sm::{% endif %} +
+
{% if media %}{% img media alt=mediaAlt class="cm-rich-media" %}{% endif %}
+
diff --git a/templates/overrides/corporate-modernist/rich-text.ninjatpl b/templates/overrides/corporate-modernist/rich-text.ninjatpl new file mode 100644 index 0000000..bbee721 --- /dev/null +++ b/templates/overrides/corporate-modernist/rich-text.ninjatpl @@ -0,0 +1,2 @@ +{# rich-text override — raw imported HTML inside the Swiss reading measure. #} +{% if html %}
{{ html|safe }}
{% endif %} diff --git a/templates/overrides/corporate-modernist/sidebar-nav.ninjatpl b/templates/overrides/corporate-modernist/sidebar-nav.ninjatpl new file mode 100644 index 0000000..870c7e9 --- /dev/null +++ b/templates/overrides/corporate-modernist/sidebar-nav.ninjatpl @@ -0,0 +1,3 @@ + diff --git a/templates/overrides/corporate-modernist/social-links.ninjatpl b/templates/overrides/corporate-modernist/social-links.ninjatpl new file mode 100644 index 0000000..77a3388 --- /dev/null +++ b/templates/overrides/corporate-modernist/social-links.ninjatpl @@ -0,0 +1,7 @@ +{# social-links override — icon row or labelled stack; each link a hairline cm-social-link (rendered only when it has a URL). #} +
+{% if heading %}

{{ heading }}

{% endif %} + +
diff --git a/templates/overrides/corporate-modernist/stats.ninjatpl b/templates/overrides/corporate-modernist/stats.ninjatpl new file mode 100644 index 0000000..5b3211c --- /dev/null +++ b/templates/overrides/corporate-modernist/stats.ninjatpl @@ -0,0 +1,6 @@ +{# stats override — oversized tabular figures over a hairline, no count-up JS. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +{% if items %}
{% for item in items %}
{% if item.prefix %}{{ item.prefix }}{% endif %}{{ item.value }}{% if item.suffix %}{{ item.suffix }}{% endif %}
{% if item.label %}
{{ item.label }}
{% endif %}
{% endfor %}
{% endif %} +
diff --git a/templates/overrides/corporate-modernist/team.ninjatpl b/templates/overrides/corporate-modernist/team.ninjatpl new file mode 100644 index 0000000..883486d --- /dev/null +++ b/templates/overrides/corporate-modernist/team.ninjatpl @@ -0,0 +1,12 @@ +{# team override — leadership grid, square-framed portraits, restrained social row. #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +{% if members %}
{% for member in members %}
+{% if member.photo %}
{% img member.photo alt=member.name class="cm-team-photo" %}
{% endif %} +{% if member.name %}

{{ member.name }}

{% endif %} +{% if member.role %}
{{ member.role }}
{% endif %} +{% if member.bio %}

{{ member.bio }}

{% endif %} +{% if member.socials %}
{% for social in member.socials %}{% if social.url %}::{{ social.icon }}:sm::{% endif %}{% endfor %}
{% endif %} +
{% endfor %}
{% endif %} +
diff --git a/templates/overrides/corporate-modernist/testimonial.ninjatpl b/templates/overrides/corporate-modernist/testimonial.ninjatpl new file mode 100644 index 0000000..4ea8b53 --- /dev/null +++ b/templates/overrides/corporate-modernist/testimonial.ninjatpl @@ -0,0 +1,9 @@ +{# testimonial override — accent-ruled pull quotes, optional 5-star scale. #} +
+{% if heading %}

{{ heading }}

{% endif %} +
{% for q in quotes %}
+{% if q.rating %}
::lucide:star:sm::::lucide:star:sm::::lucide:star:sm::::lucide:star:sm::::lucide:star:sm::
{% endif %} +{% if q.quote %}
{{ q.quote }}
{% endif %} +
{% if q.avatar %}{% img q.avatar alt=q.name class="cm-avatar-img" %}{% endif %}{% if q.name %}{{ q.name }}{% endif %}{% if q.role %}{{ q.role }}{% endif %}
+
{% endfor %}
+
diff --git a/templates/overrides/corporate-modernist/timeline.ninjatpl b/templates/overrides/corporate-modernist/timeline.ninjatpl new file mode 100644 index 0000000..ff512a0 --- /dev/null +++ b/templates/overrides/corporate-modernist/timeline.ninjatpl @@ -0,0 +1,6 @@ +{# timeline override — numbered Swiss rail (mirrors engagement_process). #} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if intro %}

{{ intro }}

{% endif %} +{% if steps %}
{% for step in steps %}
{{ forloop.Counter }}{% if not forloop.Last %}{% endif %}
{% if step.label %}

{{ step.label }}

{% endif %}{% if step.title %}

{{ step.title }}

{% endif %}{% if step.text %}

{{ step.text }}

{% endif %}{% if step.media %}
{% img step.media alt=step.title class="cm-timeline-media" %}
{% endif %}
{% endfor %}
{% else %}

No steps configured.

{% endif %} +
diff --git a/templates/overrides/corporate-modernist/utility-bar.ninjatpl b/templates/overrides/corporate-modernist/utility-bar.ninjatpl new file mode 100644 index 0000000..44d3eb0 --- /dev/null +++ b/templates/overrides/corporate-modernist/utility-bar.ninjatpl @@ -0,0 +1,9 @@ +{# utility-bar override — thin Swiss top strip; left/right item groups; icon-picker fields render via ::pack:name:: shorthand. #} +{% if variant == "primary" %}{% set ubvar = "cm-utility-bar--primary" %}{% set ubsty = "background:hsl(var(--primary));color:hsl(var(--primary-foreground));" %}{% elif variant == "dark" %}{% set ubvar = "cm-utility-bar--dark" %}{% set ubsty = "background:hsl(var(--foreground));color:hsl(var(--background));" %}{% else %}{% set ubvar = "cm-utility-bar--muted" %}{% set ubsty = "background:hsl(var(--muted));color:hsl(var(--muted-foreground));border-bottom:1px solid hsl(var(--border));" %}{% endif %} +{% macro ubitem(it) %}{% if it.link %}{% if it.icon %}::{{ it.icon }}:sm::{% endif %}{% if it.label %}{{ it.label }}{% endif %}{% else %}{% if it.icon %}::{{ it.icon }}:sm::{% endif %}{% if it.label %}{{ it.label }}{% endif %}{% endif %}{% endmacro %} +
+
+
{% for it in leftItems %}{{ ubitem(it) }}{% endfor %}
+
{% for it in rightItems %}{{ ubitem(it) }}{% endfor %}
+
+
diff --git a/templates/overrides/corporate-modernist/video-embed.ninjatpl b/templates/overrides/corporate-modernist/video-embed.ninjatpl new file mode 100644 index 0000000..531e797 --- /dev/null +++ b/templates/overrides/corporate-modernist/video-embed.ninjatpl @@ -0,0 +1,11 @@ +{# video-embed override — click-to-load facade; carries data-bn-video / data-video-url / data-video-media so the host facade JS binds. #} +{% if aspect == "4:3" %}{% set vratio = "4 / 3" %}{% elif aspect == "1:1" %}{% set vratio = "1 / 1" %}{% elif aspect == "21:9" %}{% set vratio = "21 / 9" %}{% else %}{% set vratio = "16 / 9" %}{% endif %} +
+
+ +
+{% if caption %}
{{ caption }}
{% endif %} +