From a66113fce042d518260b8cf12c133137f0888349 Mon Sep 17 00:00:00 2001 From: Alex Dunmow Date: Sun, 5 Jul 2026 11:22:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(editorial):=20Wave=20A=20theme=20lane=20(W?= =?UTF-8?q?O-TF-017)=20=E2=80=94=20personal=20essayist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deliver the full Wave A contract for the editorial theme (personal essayist / independent newsletter persona). - 49 mandatory builtin overrides in templates/overrides/editorial/, re-skinned from the frozen builtins: hairline rules, small-caps labels, drop caps, narrow reading measure, oxblood accent. All content fields, provider fields, custom tags ({% img %}/{% form %}/{% signup_form %}), hx wiring, navbar drawer JS and auth/contact form wiring preserved verbatim; legacy button/card field reads reconciled (link/style/label, media/text). - 7 page templates (default, full-width, landing, article, blog-index, contact, auth); article is the reading centrepiece with drop-cap opener, marginalia rail and a CSS-only reading-progress underline. All set the html.dark class and route body font through var(--font-body). - Block rework: masthead/byline/pullquote/section_label/colophon deleted (now overrides of navbar/post-metadata/quote/divider/footer). Persona blocks: dropcap_intro, marginalia, reading_list, field_notes. - 4 presets, all mode "both", book-paper light + sepia-on-charcoal dark. - Bundled Playfair Display + Source Serif 4 (OFL, latin subset) in assets/fonts with license record; fonts.json populated; every font-family via var(--font-heading|body|mono, fallback). - Themed email-safe wrapper (tables, inline styles, literal fonts). - Master pages + seed demo site (home, about, blog with 3 essays, contact with form + data table + row_inserted email-admins workflow, login) in essayist voice. - required_icon_packs=["lucide"]; RECOMMENDED_FONTS/ICONS updated. Motion tier: CSS-first (progress underline, marginalia fade-in; prefers-reduced-motion honored). Verified: make + ninja plugin verify + check-safety all exit 0. Visual quality UNVERIFIED until Wave B. Co-Authored-By: Claude Opus 4.8 --- RECOMMENDED_FONTS.md | 67 +- RECOMMENDED_ICONS.md | 25 + assets/fonts/OFL.txt | 24 + assets/fonts/playfair-display-700.woff2 | Bin 0 -> 23224 bytes .../fonts/playfair-display-900-italic.woff2 | Bin 0 -> 21812 bytes assets/fonts/source-serif-4-400-italic.woff2 | Bin 0 -> 20092 bytes assets/fonts/source-serif-4-400.woff2 | Bin 0 -> 50824 bytes blocks/blocks.yaml | 57 +- blocks/byline.ninjatpl | 1 - blocks/byline.schema.json | 36 - blocks/colophon.ninjatpl | 1 - blocks/colophon.schema.json | 46 - blocks/field_notes.ninjatpl | 14 + blocks/field_notes.schema.json | 39 + blocks/masthead.ninjatpl | 1 - blocks/masthead.schema.json | 34 - blocks/pullquote.ninjatpl | 1 - blocks/pullquote.schema.json | 20 - blocks/reading_list.ninjatpl | 16 + blocks/reading_list.schema.json | 57 ++ blocks/section_label.ninjatpl | 1 - blocks/section_label.schema.json | 22 - fonts.json | 19 +- manifest.yaml | 802 ++++++++++-------- master_pages.json | 30 +- plugin.mod | 5 +- presets.json | 247 ++++-- seed/seed.json | 196 +++++ seed/workflows.json | 19 + templates/editorial/article.ninjatpl | 15 +- templates/editorial/auth.ninjatpl | 18 + templates/editorial/blog-index.ninjatpl | 23 + templates/editorial/contact.ninjatpl | 22 + templates/editorial/default.ninjatpl | 12 +- templates/editorial/full-width.ninjatpl | 8 +- templates/editorial/landing.ninjatpl | 14 +- templates/email/editorial.ninjatpl | 88 +- .../editorial/announcement-bar.ninjatpl | 21 + .../overrides/editorial/audio-embed.ninjatpl | 16 + .../overrides/editorial/auth-form.ninjatpl | 33 + .../overrides/editorial/auth-status.ninjatpl | 31 + .../editorial/author-bio-hero.ninjatpl | 22 + .../overrides/editorial/author-bio.ninjatpl | 14 + .../overrides/editorial/blog-hero.ninjatpl | 24 + .../overrides/editorial/breadcrumbs.ninjatpl | 13 + templates/overrides/editorial/button.ninjatpl | 11 +- templates/overrides/editorial/card.ninjatpl | 4 + .../editorial/category-list.ninjatpl | 18 + .../overrides/editorial/contact-card.ninjatpl | 17 + .../overrides/editorial/contact-form.ninjatpl | 43 + .../overrides/editorial/countdown.ninjatpl | 48 ++ templates/overrides/editorial/cta.ninjatpl | 14 + .../overrides/editorial/divider.ninjatpl | 12 + .../overrides/editorial/event-list.ninjatpl | 41 + templates/overrides/editorial/faq.ninjatpl | 17 + .../overrides/editorial/feature-grid.ninjatpl | 17 + .../editorial/featured-posts.ninjatpl | 24 + templates/overrides/editorial/footer.ninjatpl | 40 + .../overrides/editorial/gallery.ninjatpl | 52 ++ .../overrides/editorial/heading.ninjatpl | 8 +- templates/overrides/editorial/hero.ninjatpl | 39 + .../editorial/hours-location.ninjatpl | 31 + templates/overrides/editorial/image.ninjatpl | 12 +- .../overrides/editorial/logo-strip.ninjatpl | 15 + .../overrides/editorial/menu-list.ninjatpl | 30 + templates/overrides/editorial/navbar.ninjatpl | 104 +++ .../editorial/newsletter-signup.ninjatpl | 13 + .../editorial/page-suggestions.ninjatpl | 21 + .../editorial/password-reset-form.ninjatpl | 13 + .../editorial/popular-posts.ninjatpl | 16 + .../overrides/editorial/post-hero.ninjatpl | 23 + .../editorial/post-metadata.ninjatpl | 9 + .../overrides/editorial/pricing.ninjatpl | 25 + templates/overrides/editorial/quote.ninjatpl | 8 + .../editorial/related-posts.ninjatpl | 17 + .../overrides/editorial/rich-section.ninjatpl | 13 + .../overrides/editorial/rich-text.ninjatpl | 2 + .../overrides/editorial/sidebar-nav.ninjatpl | 13 + .../overrides/editorial/social-links.ninjatpl | 13 + templates/overrides/editorial/stats.ninjatpl | 48 ++ templates/overrides/editorial/team.ninjatpl | 21 + .../overrides/editorial/testimonial.ninjatpl | 27 + templates/overrides/editorial/text.ninjatpl | 3 +- .../overrides/editorial/timeline.ninjatpl | 21 + .../overrides/editorial/utility-bar.ninjatpl | 10 + .../overrides/editorial/video-embed.ninjatpl | 23 + 86 files changed, 2396 insertions(+), 694 deletions(-) create mode 100644 RECOMMENDED_ICONS.md create mode 100644 assets/fonts/OFL.txt create mode 100644 assets/fonts/playfair-display-700.woff2 create mode 100644 assets/fonts/playfair-display-900-italic.woff2 create mode 100644 assets/fonts/source-serif-4-400-italic.woff2 create mode 100644 assets/fonts/source-serif-4-400.woff2 delete mode 100644 blocks/byline.ninjatpl delete mode 100644 blocks/byline.schema.json delete mode 100644 blocks/colophon.ninjatpl delete mode 100644 blocks/colophon.schema.json create mode 100644 blocks/field_notes.ninjatpl create mode 100644 blocks/field_notes.schema.json delete mode 100644 blocks/masthead.ninjatpl delete mode 100644 blocks/masthead.schema.json delete mode 100644 blocks/pullquote.ninjatpl delete mode 100644 blocks/pullquote.schema.json create mode 100644 blocks/reading_list.ninjatpl create mode 100644 blocks/reading_list.schema.json delete mode 100644 blocks/section_label.ninjatpl delete mode 100644 blocks/section_label.schema.json create mode 100644 seed/seed.json create mode 100644 seed/workflows.json create mode 100644 templates/editorial/auth.ninjatpl create mode 100644 templates/editorial/blog-index.ninjatpl create mode 100644 templates/editorial/contact.ninjatpl create mode 100644 templates/overrides/editorial/announcement-bar.ninjatpl create mode 100644 templates/overrides/editorial/audio-embed.ninjatpl create mode 100644 templates/overrides/editorial/auth-form.ninjatpl create mode 100644 templates/overrides/editorial/auth-status.ninjatpl create mode 100644 templates/overrides/editorial/author-bio-hero.ninjatpl create mode 100644 templates/overrides/editorial/author-bio.ninjatpl create mode 100644 templates/overrides/editorial/blog-hero.ninjatpl create mode 100644 templates/overrides/editorial/breadcrumbs.ninjatpl create mode 100644 templates/overrides/editorial/card.ninjatpl create mode 100644 templates/overrides/editorial/category-list.ninjatpl create mode 100644 templates/overrides/editorial/contact-card.ninjatpl create mode 100644 templates/overrides/editorial/contact-form.ninjatpl create mode 100644 templates/overrides/editorial/countdown.ninjatpl create mode 100644 templates/overrides/editorial/cta.ninjatpl create mode 100644 templates/overrides/editorial/divider.ninjatpl create mode 100644 templates/overrides/editorial/event-list.ninjatpl create mode 100644 templates/overrides/editorial/faq.ninjatpl create mode 100644 templates/overrides/editorial/feature-grid.ninjatpl create mode 100644 templates/overrides/editorial/featured-posts.ninjatpl create mode 100644 templates/overrides/editorial/footer.ninjatpl create mode 100644 templates/overrides/editorial/gallery.ninjatpl create mode 100644 templates/overrides/editorial/hero.ninjatpl create mode 100644 templates/overrides/editorial/hours-location.ninjatpl create mode 100644 templates/overrides/editorial/logo-strip.ninjatpl create mode 100644 templates/overrides/editorial/menu-list.ninjatpl create mode 100644 templates/overrides/editorial/navbar.ninjatpl create mode 100644 templates/overrides/editorial/newsletter-signup.ninjatpl create mode 100644 templates/overrides/editorial/page-suggestions.ninjatpl create mode 100644 templates/overrides/editorial/password-reset-form.ninjatpl create mode 100644 templates/overrides/editorial/popular-posts.ninjatpl create mode 100644 templates/overrides/editorial/post-hero.ninjatpl create mode 100644 templates/overrides/editorial/post-metadata.ninjatpl create mode 100644 templates/overrides/editorial/pricing.ninjatpl create mode 100644 templates/overrides/editorial/quote.ninjatpl create mode 100644 templates/overrides/editorial/related-posts.ninjatpl create mode 100644 templates/overrides/editorial/rich-section.ninjatpl create mode 100644 templates/overrides/editorial/rich-text.ninjatpl create mode 100644 templates/overrides/editorial/sidebar-nav.ninjatpl create mode 100644 templates/overrides/editorial/social-links.ninjatpl create mode 100644 templates/overrides/editorial/stats.ninjatpl create mode 100644 templates/overrides/editorial/team.ninjatpl create mode 100644 templates/overrides/editorial/testimonial.ninjatpl create mode 100644 templates/overrides/editorial/timeline.ninjatpl create mode 100644 templates/overrides/editorial/utility-bar.ninjatpl create mode 100644 templates/overrides/editorial/video-embed.ninjatpl diff --git a/RECOMMENDED_FONTS.md b/RECOMMENDED_FONTS.md index 7e8a2c3..348ea31 100644 --- a/RECOMMENDED_FONTS.md +++ b/RECOMMENDED_FONTS.md @@ -1,39 +1,44 @@ -# Editorial — recommended Google Fonts +# Editorial — fonts -This theme ships with no bundled fonts in the current build pass -(`fonts.json = []`). Admins assign fonts via the BlockNinja typography panel. -The theme's CSS routes every `font-family` through the host-provided -`--font-heading`, `--font-body`, and `--font-mono` custom properties with -fallback stacks taken from spec §5, so the layout is usable before any font -is picked. +This theme **bundles** a Latin subset of two open-licence (SIL OFL 1.1) +serif families, so it looks correct the moment it is activated — no admin +setup required. The bundled faces are declared in `fonts.json` and land in +the typography picker as `source=template` rows. -For the intended editorial aesthetic, open the typography panel in admin and -add each of the following from the **Google Fonts** tab: +| Slot | Bundled family | Weights / styles | Role | +|---------|-------------------|---------------------------|-------------------------------------------------------------| +| Heading | Playfair Display | 700 normal, 900 italic | Didone display face for the masthead wordmark and headlines | +| Body | Source Serif 4 | 400 normal, 400 italic | Long-read body type; italic for marginalia and captions | -| Slot | Family | Source | Weights / styles | Why | -|-----------|-----------------------|--------------------|------------------------------------------------------------------|----------------------------------------------------------------------| -| Heading | Playfair Display | `google:Playfair Display` | 700 normal, 900 italic | Didone display face for the masthead wordmark and headlines. | -| Body | Source Serif 4 | `google:Source Serif 4` | 400 normal, 400 italic, 600 normal | Long-read body type; italic for marginalia and figcaptions. | -| UI / caption (body slot) | Inter | `google:Inter` | 500 normal, 600 normal | Byline names, timestamps, and small-caps section labels. | -| Mono | JetBrains Mono | `google:JetBrains Mono` | 400 normal | Code, datelines on financial copy, ISSN in the colophon. | +The bundled woff2 files and their licence record live in `assets/fonts/` +(`OFL.txt`). Every `font-family` in the theme is routed through +`var(--font-heading, ...)`, `var(--font-body, ...)` and `var(--font-mono, ...)` +with a fallback stack, so the layout is usable before any font is assigned +and the admin font picker stays in full control. -## How to assign +## Assigning the bundled faces 1. In the BlockNinja admin, open **Settings → Theme → Typography**. -2. Click the **Google Fonts** tab. -3. Search for the family above (e.g. "Playfair Display"), then click **Add**. -4. Once added, the family appears in the picker for that slot. -5. Assign **Playfair Display** to the *Heading* slot. -6. Assign **Source Serif 4** to the *Body* slot. -7. Assign **JetBrains Mono** to the *Mono* slot. -8. (Optional) For UI / caption elements that ride the body slot but want a - sans-serif treatment, override per-block via the editor. +2. In the **Bundled** tab, assign **Playfair Display** to the *Heading* slot. +3. Assign **Source Serif 4** to the *Body* slot. +4. Leave *Mono* as the system default, or assign **JetBrains Mono** from the + Google Fonts tab — it is used for the masthead kicker, datelines and the + colophon ISSN. -## Wave-2 (out of scope here) +## Optional upgrades (Google Fonts tab) -If the editorial brand is going to be locked in to a specific commercial -display face (e.g. *Migra* or *PP Editorial New* instead of *Playfair -Display*), licence and bundle the woff2 set, then update `fonts.json` to -declare the family + variants. The CSS does not change — the same -`var(--font-heading)` consumer pattern picks up the bundled face once an -admin assigns it. +- **Spectral** (`google:Spectral`) — a refined small-caps serif. Assign it to + the body slot if you want the small-caps section labels to carry true + small-caps rather than the synthesized `font-variant: small-caps` fallback. +- **Newsreader** (`google:Newsreader`) — an alternative reading serif for the + body slot; swaps in without any CSS change via `var(--font-body)`. +- **JetBrains Mono** (`google:JetBrains Mono`) — for the *Mono* slot + (kicker / dateline / ISSN). + +## Bundling a commercial display face (out of scope for Wave A) + +If the brand locks in a licensed display face (e.g. *Migra* or *PP Editorial +New*) in place of Playfair Display, licence and subset the woff2 set, drop it +in `assets/fonts/`, and add the family + variants to `fonts.json`. The CSS +does not change — the same `var(--font-heading)` consumer picks up whichever +face an admin assigns. diff --git a/RECOMMENDED_ICONS.md b/RECOMMENDED_ICONS.md new file mode 100644 index 0000000..e3deeca --- /dev/null +++ b/RECOMMENDED_ICONS.md @@ -0,0 +1,25 @@ +# Recommended Icons — Editorial + +Editorial is a typographic theme. It leans on hairline rules and small-caps +labels, not iconography, so it references only a single bundled pack. +`plugin.mod` declares it in `required_icon_packs`; until the loader +auto-installs declared packs, an admin should confirm it is enabled before +activation. + +## Required pack + +- **lucide** — ships bundled with the CMS (v0.460). Enabled by default. No + action needed in most installs; if icons render as empty boxes, open + `/admin/icons` and confirm **Lucide** is installed and enabled. + +## Icons used by the theme chrome and overrides + +All via the sprite pipeline (`` +or the `::lucide:::` shorthand): + +`arrow-right`, `chevron-down`, `chevron-left`, `chevron-right`, `x`, `check`, +`play`, `map-pin`, `diamond`, `minus`. + +Block content that stores an icon (feature-grid items, social links, contact +channels) may reference any installed pack as a `pack:name` string; the +schemas default to `lucide` so the theme renders without extra setup. diff --git a/assets/fonts/OFL.txt b/assets/fonts/OFL.txt new file mode 100644 index 0000000..6ef2ae9 --- /dev/null +++ b/assets/fonts/OFL.txt @@ -0,0 +1,24 @@ +Bundled fonts — license record (SIL Open Font License, Version 1.1) +==================================================================== + +The woff2 files in this directory are Latin subsets of the following +open-source families, both distributed under the SIL Open Font License 1.1 +(https://openfontlicense.org). Subsetting and format conversion (TTF to +woff2) are expressly permitted by the OFL; the derived subsets remain under +the same license. + +Playfair Display + playfair-display-700.woff2, playfair-display-900-italic.woff2 + Copyright (c) Claus Eggers Sorensen (https://www.forthehearts.net), with + Reserved Font Name "Playfair Display". Display face for masthead wordmarks + and headlines. + +Source Serif 4 + source-serif-4-400.woff2, source-serif-4-400-italic.woff2 + Copyright (c) Adobe (https://github.com/adobe-fonts/source-serif), with + Reserved Font Name "Source Serif". Long-read body face; italic for + marginalia and figure captions. + +The full SIL Open Font License 1.1 text applies to each family and is +available at https://openfontlicense.org. This file records the license and +copyright attribution as required for redistribution under the OFL. diff --git a/assets/fonts/playfair-display-700.woff2 b/assets/fonts/playfair-display-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..39eefe0333444ed21139388621c18781e832ce5e GIT binary patch literal 23224 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 LZ$roar+2l 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/source-serif-4-400-italic.woff2 b/assets/fonts/source-serif-4-400-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3595a721b4d26a55ef10df6ca177ef63e65b3879 GIT binary patch literal 20092 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

;E$KkF8~ul#OH9CpnK=&Cnrm>TWV-qC{3#_^vK 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/source-serif-4-400.woff2 b/assets/fonts/source-serif-4-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..30dbe2d6277f9764c9c1bdc697da340eff0b6ef8 GIT binary patch literal 50824 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 literal 0 HcmV?d00001 diff --git a/blocks/blocks.yaml b/blocks/blocks.yaml index d84eae3..30516be 100644 --- a/blocks/blocks.yaml +++ b/blocks/blocks.yaml @@ -1,48 +1,33 @@ -# Editorial theme block definitions (codeless .bnp, WO-WZ-021). -# Keys are fully qualified (editorial:) 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. +# Editorial theme block definitions (codeless .bnp, WO-TF-017). +# +# These are the theme's TRUE persona blocks — furniture with no builtin +# equivalent. Everything else the theme used to ship as a block (masthead, +# byline, pull quote, section label, colophon) is now a re-skin OVERRIDE of a +# builtin (navbar, post-metadata, quote, divider, footer) and lives in +# templates/overrides/editorial/. Keys are fully qualified (editorial:) +# because the codeless loader registers definitions verbatim. blocks: - - key: editorial:masthead - title: Masthead - description: Newspaper-style masthead with Playfair wordmark and hairline rule - category: navigation - schema: masthead.schema.json - template: masthead.ninjatpl - - key: editorial:byline - title: Byline - description: Author byline with optional photo, dateline, and read time - category: theme - schema: byline.schema.json - template: byline.ninjatpl - - key: editorial:pullquote - title: Pull Quote - description: Large oxblood pull quote in Playfair italic - category: theme - schema: pullquote.schema.json - template: pullquote.ninjatpl - key: editorial:dropcap_intro title: Drop Cap Intro - description: Opening paragraph with an oxblood Playfair drop cap + description: Opening paragraph whose first letter renders as an oxblood Playfair drop cap category: theme schema: dropcap_intro.schema.json template: dropcap_intro.ninjatpl - key: editorial:marginalia title: Marginalia Rail - description: Right-rail italic notes for longform articles + description: Right-rail italic notes for longform articles; collapses inline on narrow viewports category: theme schema: marginalia.schema.json template: marginalia.ninjatpl - - key: editorial:section_label - title: Section Label - description: Small-caps section label with optional hairline divider + - key: editorial:reading_list + title: Reading List + description: A curated further-reading list — small-caps heading over hairline-ruled links with notes category: theme - schema: section_label.schema.json - template: section_label.ninjatpl - - key: editorial:colophon - title: Colophon - description: Editorial footer with ISSN, subscribe stub, and link list - category: navigation - schema: colophon.schema.json - template: colophon.ninjatpl + schema: reading_list.schema.json + template: reading_list.ninjatpl + - key: editorial:field_notes + title: Field Notes + description: Dated notebook entries in small caps, separated by hairline rules + category: theme + schema: field_notes.schema.json + template: field_notes.ninjatpl diff --git a/blocks/byline.ninjatpl b/blocks/byline.ninjatpl deleted file mode 100644 index d17b1a0..0000000 --- a/blocks/byline.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -

diff --git a/blocks/byline.schema.json b/blocks/byline.schema.json deleted file mode 100644 index c23a51e..0000000 --- a/blocks/byline.schema.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Byline", - "description": "Article byline with author name, optional photo, optional read-time, and dateline.", - "type": "object", - "properties": { - "authorSlug": { - "type": "string", - "title": "Author Slug", - "description": "Slug of the author whose name and photo should be rendered.", - "x-editor": "slug" - }, - "showPhoto": { - "type": "string", - "title": "Show Photo", - "description": "Render the author's avatar to the left of the name.", - "x-editor": "select", - "enum": ["false", "true"], - "default": "true" - }, - "showReadTime": { - "type": "string", - "title": "Show Read Time", - "description": "Include the read-time estimate next to the dateline.", - "x-editor": "select", - "enum": ["false", "true"], - "default": "true" - }, - "dateline": { - "type": "string", - "title": "Dateline", - "description": "Optional explicit dateline (e.g. \"London, March 14\"). Rendered in small caps.", - "x-editor": "text" - } - } -} diff --git a/blocks/colophon.ninjatpl b/blocks/colophon.ninjatpl deleted file mode 100644 index cd476e5..0000000 --- a/blocks/colophon.ninjatpl +++ /dev/null @@ -1 +0,0 @@ - diff --git a/blocks/colophon.schema.json b/blocks/colophon.schema.json deleted file mode 100644 index 733c8d9..0000000 --- a/blocks/colophon.schema.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Colophon", - "description": "Editorial footer with print-convention ISSN field, optional subscribe stub, and a list of footer links.", - "type": "object", - "properties": { - "showSignup": { - "type": "string", - "title": "Show Subscribe Stub", - "description": "Render the newsletter subscribe stub above the link list.", - "x-editor": "select", - "enum": ["false", "true"], - "default": "false" - }, - "issn": { - "type": "string", - "title": "ISSN", - "description": "Print-convention ISSN number. Rendered in JetBrains Mono small caps.", - "x-editor": "text" - }, - "links": { - "type": "array", - "title": "Footer Links", - "description": "Inline footer link list.", - "default": [], - "x-editor": "array", - "items": { - "type": "object", - "properties": { - "text": { - "type": "string", - "title": "Link Text", - "description": "Display text.", - "x-editor": "text" - }, - "url": { - "type": "string", - "title": "URL", - "description": "External URL.", - "x-editor": "link" - } - } - } - } - } -} diff --git a/blocks/field_notes.ninjatpl b/blocks/field_notes.ninjatpl new file mode 100644 index 0000000..1c61e8b --- /dev/null +++ b/blocks/field_notes.ninjatpl @@ -0,0 +1,14 @@ +{# field_notes (editorial) — dated notebook entries: small-caps dateline over a short note, hairline-ruled. Fields: title, notes[].date/note. #} +
+ {% if title %}{% endif %} + {% if notes %} +
+ {% for entry in notes %} +
+ {% if entry.date %}
{{ entry.date }}
{% endif %} + {% if entry.note %}
{{ entry.note|safe }}
{% endif %} +
+ {% endfor %} +
+ {% endif %} +
diff --git a/blocks/field_notes.schema.json b/blocks/field_notes.schema.json new file mode 100644 index 0000000..76c6f45 --- /dev/null +++ b/blocks/field_notes.schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Field Notes", + "description": "Dated notebook entries — a small-caps date over a short note, separated by hairline rules. The essayist's running observations.", + "type": "object", + "properties": { + "title": { + "type": "string", + "title": "Heading", + "description": "Small-caps section heading (e.g. \"Field notes\").", + "x-editor": "text", + "default": "Field notes" + }, + "notes": { + "type": "array", + "title": "Notes", + "description": "The dated entries, newest first.", + "default": [], + "x-editor": "array", + "items": { + "type": "object", + "properties": { + "date": { + "type": "string", + "title": "Date", + "description": "The dateline, rendered in small caps (e.g. \"March 14\").", + "x-editor": "text" + }, + "note": { + "type": "string", + "title": "Note", + "description": "The entry body. Rich text is permitted.", + "x-editor": "richtext" + } + } + } + } + } +} diff --git a/blocks/masthead.ninjatpl b/blocks/masthead.ninjatpl deleted file mode 100644 index e2f0f96..0000000 --- a/blocks/masthead.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if compact == true or compact == "true" %}
{{ title|default:"Editorial" }}{% if menuName %}{{ menuName }}{% endif %}

{% else %}
{% if kicker %}
{{ kicker }}
{% endif %}{{ title|default:"Editorial" }}
{% if menuName %}{% endif %}
{% endif %}
diff --git a/blocks/masthead.schema.json b/blocks/masthead.schema.json deleted file mode 100644 index 0846b96..0000000 --- a/blocks/masthead.schema.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Masthead", - "description": "Newspaper-style masthead with wordmark, optional kicker, hairline rule, and section navigation menu.", - "type": "object", - "properties": { - "title": { - "type": "string", - "title": "Wordmark", - "description": "The publication name. Rendered in Playfair Display 900 italic.", - "x-editor": "text" - }, - "kicker": { - "type": "string", - "title": "Kicker", - "description": "Small mono caption above the wordmark (e.g. issue label or established date).", - "x-editor": "text" - }, - "menuName": { - "type": "string", - "title": "Section Menu", - "description": "Menu providing the section navigation links rendered beneath the masthead.", - "x-editor": "menu-select" - }, - "compact": { - "type": "string", - "title": "Compact Mode", - "description": "Use the compact masthead variant (single line) on article pages.", - "x-editor": "select", - "enum": ["false", "true"], - "default": "false" - } - } -} diff --git a/blocks/pullquote.ninjatpl b/blocks/pullquote.ninjatpl deleted file mode 100644 index e053801..0000000 --- a/blocks/pullquote.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -{% if quote %}{% endif %} diff --git a/blocks/pullquote.schema.json b/blocks/pullquote.schema.json deleted file mode 100644 index cd14338..0000000 --- a/blocks/pullquote.schema.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Pull Quote", - "description": "Large oxblood pull quote rendered in Playfair Display italic with optional attribution.", - "type": "object", - "properties": { - "quote": { - "type": "string", - "title": "Quote", - "description": "The pull quote text. Rich text is permitted so authors can emphasise inline.", - "x-editor": "richtext" - }, - "attribution": { - "type": "string", - "title": "Attribution", - "description": "Optional source attribution rendered in small caps below the quote.", - "x-editor": "text" - } - } -} diff --git a/blocks/reading_list.ninjatpl b/blocks/reading_list.ninjatpl new file mode 100644 index 0000000..f61caaf --- /dev/null +++ b/blocks/reading_list.ninjatpl @@ -0,0 +1,16 @@ +{# reading_list (editorial) — curated further-reading list: small-caps heading over hairline-ruled entries with optional source + note. Fields: title, intro, items[].label/url/source/note. #} +
+ {% if title %}{% endif %} + {% if intro %}

{{ intro }}

{% endif %} + {% if items %} +
    + {% for item in items %} +
  • + {% if item.url %}{{ item.label }}{% else %}{{ item.label }}{% endif %} + {% if item.source %}{{ item.source }}{% endif %} + {% if item.note %}

    {{ item.note }}

    {% endif %} +
  • + {% endfor %} +
+ {% endif %} +
diff --git a/blocks/reading_list.schema.json b/blocks/reading_list.schema.json new file mode 100644 index 0000000..7fa59cc --- /dev/null +++ b/blocks/reading_list.schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Reading List", + "description": "A curated further-reading list rendered under a small-caps heading, each entry a hairline-ruled link with an optional note and source.", + "type": "object", + "properties": { + "title": { + "type": "string", + "title": "Heading", + "description": "Small-caps section heading (e.g. \"Further reading\").", + "x-editor": "text", + "default": "Further reading" + }, + "intro": { + "type": "string", + "title": "Intro", + "description": "Optional short line of context above the list.", + "x-editor": "textarea" + }, + "items": { + "type": "array", + "title": "Entries", + "description": "The reading-list entries.", + "default": [], + "x-editor": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "title": "Title", + "description": "The title of the piece.", + "x-editor": "text" + }, + "url": { + "type": "string", + "title": "URL", + "description": "Where the entry links to.", + "x-editor": "link" + }, + "source": { + "type": "string", + "title": "Source", + "description": "Optional author or publication, rendered in small caps.", + "x-editor": "text" + }, + "note": { + "type": "string", + "title": "Note", + "description": "Optional one-line note on why it is worth reading.", + "x-editor": "text" + } + } + } + } + } +} diff --git a/blocks/section_label.ninjatpl b/blocks/section_label.ninjatpl deleted file mode 100644 index 2bb3c9f..0000000 --- a/blocks/section_label.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -{% if label %}
{% if divider != "false" and divider != false %}{% endif %}
{% endif %} diff --git a/blocks/section_label.schema.json b/blocks/section_label.schema.json deleted file mode 100644 index b3aacba..0000000 --- a/blocks/section_label.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Section Label", - "description": "Small-caps section label followed by an optional hairline divider rule.", - "type": "object", - "properties": { - "label": { - "type": "string", - "title": "Label", - "description": "Section label text. Rendered uppercase with small-caps.", - "x-editor": "text" - }, - "divider": { - "type": "string", - "title": "Divider", - "description": "Whether to render a hairline rule beneath the label.", - "x-editor": "select", - "enum": ["true", "false"], - "default": "true" - } - } -} diff --git a/fonts.json b/fonts.json index fe51488..9130534 100644 --- a/fonts.json +++ b/fonts.json @@ -1 +1,18 @@ -[] +[ + { + "name": "Playfair Display", + "family": "Playfair Display", + "variants": [ + { "weight": "700", "style": "normal", "file": "fonts/playfair-display-700.woff2" }, + { "weight": "900", "style": "italic", "file": "fonts/playfair-display-900-italic.woff2" } + ] + }, + { + "name": "Source Serif 4", + "family": "Source Serif 4", + "variants": [ + { "weight": "400", "style": "normal", "file": "fonts/source-serif-4-400.woff2" }, + { "weight": "400", "style": "italic", "file": "fonts/source-serif-4-400-italic.woff2" } + ] + } +] diff --git a/manifest.yaml b/manifest.yaml index ba51251..1448a11 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -1,5 +1,10 @@ -# Editorial theme — codeless .bnp manifest (WO-WZ-021 Phase B). +# Editorial theme — codeless .bnp manifest (Theme Fleet Wave A, WO-TF-017). # Synthesized into manifest.pb by `ninja plugin build` (no plugin.wasm). +# +# Persona: a personal essayist / independent newsletter. A reading experience +# above all — serif baseline grid, drop caps, running marginalia, small-caps +# section labels, author byline foregrounded. Typography does the design work; +# ornament is limited to hairline rules and generous whitespace. theme_presets: presets.json bundled_fonts: fonts.json master_pages: master_pages.json @@ -7,378 +12,485 @@ master_pages: master_pages.json system_templates: - key: editorial title: Editorial - description: "Didone display type, narrow measure, and hairline rules for newsrooms, longform writers, and opinion columnists." + description: "A personal essayist's reading room: serif baseline grid, drop caps, running marginalia and small-caps labels. Built for longform writers and independent newsletters." page_templates: - system: editorial key: default title: Default - description: "Standard page with masthead, narrow main column, footer." + description: "Standard page: masthead, narrow reading column, colophon." + slots: [header, main, footer] + - system: editorial + key: full-width + title: Full Width + description: "Edge-to-edge for photo essays and cover images." slots: [header, main, footer] - system: editorial key: landing - title: Section Front - description: "Front-page-style stack: masthead, lead story, river, footer." + title: Front Page + description: "Front-page stack: masthead, lead essay, river of stories, colophon." slots: [masthead, lead, river, footer] - system: editorial key: article title: Article - description: "Single-column long read with byline, drop cap, marginalia rail." + description: "The reading centrepiece: byline, drop-cap opener, single column with a marginalia rail." slots: [header, byline, main, marginalia, footer] - system: editorial - key: full-width - title: Full Width - description: "Edge-to-edge for photo essays and data graphics." - slots: [header, main, footer] + key: blog-index + title: Archive + description: "Essay archive: masthead, featured essay, and a river of entries." + slots: [header, featured, main, footer] + - system: editorial + key: contact + title: Correspondence + description: "Contact layout with an optional aside for hours and location." + slots: [header, main, aside, footer] + - system: editorial + key: auth + title: Members + description: "Centred members shell with wordmark and hairline rule." + slots: [main, footer] template_overrides: + # Chrome + - { template: editorial, block: navbar } + - { template: editorial, block: footer } + - { template: editorial, block: utility-bar } + - { template: editorial, block: announcement-bar } + # Marketing + - { template: editorial, block: hero } + - { template: editorial, block: feature-grid } + - { template: editorial, block: rich-section } + - { template: editorial, block: stats } + - { template: editorial, block: testimonial } + - { template: editorial, block: logo-strip } + - { template: editorial, block: pricing } + - { template: editorial, block: team } + - { template: editorial, block: faq } + - { template: editorial, block: timeline } + - { template: editorial, block: cta } + - { template: editorial, block: countdown } + # Primitives - { template: editorial, block: heading } - { template: editorial, block: text } - - { template: editorial, block: button } + - { template: editorial, block: rich-text } - { template: editorial, block: image } + - { template: editorial, block: quote } + - { template: editorial, block: divider } + - { template: editorial, block: button } + - { template: editorial, block: card } + - { template: editorial, block: gallery } + - { template: editorial, block: video-embed } + - { template: editorial, block: audio-embed } + # Commerce / local + - { template: editorial, block: menu-list } + - { template: editorial, block: event-list } + - { template: editorial, block: contact-form } + - { template: editorial, block: contact-card } + - { template: editorial, block: hours-location } + - { template: editorial, block: social-links } + # Blog family + - { template: editorial, block: blog-hero } + - { template: editorial, block: featured-posts } + - { template: editorial, block: related-posts } + - { template: editorial, block: popular-posts } + - { template: editorial, block: category-list } + - { template: editorial, block: post-hero } + - { template: editorial, block: post-metadata } + - { template: editorial, block: author-bio } + - { template: editorial, block: author-bio-hero } + - { template: editorial, block: newsletter-signup } + - { template: editorial, block: breadcrumbs } + - { template: editorial, block: sidebar-nav } + # Auth surface + - { template: editorial, block: auth-form } + - { template: editorial, block: password-reset-form } + - { template: editorial, block: auth-status } + # System + - { template: editorial, block: page-suggestions } email_wrappers: - editorial css: input_css_append: | - /* === Editorial theme — utility layer === */ + /* === Editorial theme — utility layer === + * + * Personal-essayist identity: hairline rules, small-caps labels, drop caps, + * marginalia, narrow reading measure. Colour is ALWAYS consumed via + * hsl(var(--token)); font families ALWAYS via var(--font-heading|body|mono, + * ). No literal colours, no hardcoded families. + */ - :root { - --editorial-measure: 64ch; - --editorial-rule: 1px solid hsl(var(--border)); - } - - /* --- Narrow editorial column with indented continuation paragraphs --- */ - - .prose-editorial { - max-width: var(--editorial-measure); - margin-left: auto; - margin-right: auto; - font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); - color: hsl(var(--foreground)); - line-height: 1.65; - } - - .prose-editorial p { - margin: 0 0 1em 0; - text-indent: 0; - } - - .prose-editorial p + p { - text-indent: 1.5em; - } - - .prose-editorial h1, - .prose-editorial h2, - .prose-editorial h3, - .prose-editorial h4 { - font-family: var(--font-heading, "Playfair Display", Georgia, serif); - font-weight: 700; - letter-spacing: -0.01em; - color: hsl(var(--foreground)); - } - - .prose-editorial a { - color: hsl(var(--accent)); - text-decoration: underline; - text-decoration-thickness: 1px; - text-underline-offset: 2px; - } - - /* --- Drop cap — oxblood accent first letter, ≥ 3x body size --- */ - - .editorial-dropcap p:first-of-type::first-letter { - font-family: var(--font-heading, "Playfair Display", Georgia, serif); - font-weight: 900; - font-style: italic; - color: hsl(var(--accent)); - float: left; - font-size: 4.5em; - line-height: 0.85; - padding-right: 0.12em; - padding-top: 0.05em; - margin-bottom: -0.1em; - } - - /* --- Marginalia rail (right-side italic notes) --- */ - - .editorial-marginalia { - font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); - font-style: italic; - font-size: 12px; - line-height: 1.5; - color: hsl(var(--muted-foreground)); - } - - .editorial-marginalia aside { - margin: 0 0 1.5rem 0; - padding-left: 0.75rem; - border-left: var(--editorial-rule); - } - - @media (max-width: 768px) { - .editorial-marginalia { - margin-top: 1.5rem; - border-top: var(--editorial-rule); - padding-top: 1rem; + @layer utilities { + :root { + --editorial-measure: 64ch; + --editorial-rule: 1px solid hsl(var(--border)); } - } - /* --- Masthead wordmark --- */ - - .editorial-masthead-wordmark { - font-family: var(--font-heading, "Playfair Display", Georgia, serif); - font-weight: 900; - font-style: italic; - letter-spacing: -0.02em; - color: hsl(var(--foreground)); - } - - .editorial-masthead-kicker { - font-family: var(--font-mono, "JetBrains Mono", "SF Mono", ui-monospace, monospace); - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.15em; - color: hsl(var(--muted-foreground)); - } - - .editorial-masthead-rule { - border: 0; - border-top: var(--editorial-rule); - margin: 0.5rem 0 0 0; - } - - /* --- Pull quote — Playfair italic in oxblood --- */ - - .editorial-pullquote { - font-family: var(--font-heading, "Playfair Display", Georgia, serif); - font-style: italic; - font-size: 38px; - line-height: 1.2; - color: hsl(var(--accent)); - margin: 2.5rem auto; - max-width: var(--editorial-measure); - border: none; - } - - .editorial-pullquote-attribution { - display: block; - margin-top: 1rem; - font-family: var(--font-body, "Source Serif 4", Georgia, serif); - font-style: normal; - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.12em; - color: hsl(var(--muted-foreground)); - } - - /* --- Section label — small-caps with hairline rule --- */ - - .editorial-section-label { - font-family: var(--font-body, "Source Serif 4", Georgia, serif); - text-transform: uppercase; - font-variant: small-caps; - font-feature-settings: "smcp"; - letter-spacing: 0.15em; - font-size: 13px; - color: hsl(var(--foreground)); - } - - .editorial-section-label-rule { - border: 0; - border-top: var(--editorial-rule); - margin: 0.5rem 0 1.5rem 0; - } - - /* --- Hairline rules --- */ - - hr.editorial-rule, - .editorial-hairline { - border: 0; - border-top: var(--editorial-rule); - margin: 1.5rem 0; - } - - /* --- Byline --- */ - - .editorial-byline { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 0.75rem 0; - border-top: var(--editorial-rule); - border-bottom: var(--editorial-rule); - } - - .editorial-byline-photo { - width: 36px; - height: 36px; - border-radius: 50%; - background-color: hsl(var(--muted)); - flex-shrink: 0; - object-fit: cover; - } - - .editorial-byline-author { - font-family: var(--font-mono, "JetBrains Mono", monospace), var(--font-body, "Source Serif 4", Georgia, serif); - /* The spec calls for Inter for UI bylines. Fallback to Inter then system. */ - font-family: var(--font-body, "Inter", -apple-system, sans-serif); - font-weight: 500; - font-size: 15px; - color: hsl(var(--foreground)); - } - - .editorial-byline-meta { - font-family: var(--font-body, "Inter", -apple-system, sans-serif); - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.1em; - color: hsl(var(--muted-foreground)); - } - - /* --- Override: heading (Playfair, tight tracking, optional small-caps kicker) --- */ - - .editorial-heading { - font-family: var(--font-heading, "Playfair Display", Georgia, serif); - font-weight: 700; - letter-spacing: -0.015em; - color: hsl(var(--foreground)); - line-height: 1.15; - } - - .editorial-heading-kicker { - display: block; - margin-bottom: 0.5rem; - font-family: var(--font-body, "Inter", -apple-system, sans-serif); - font-size: 12px; - text-transform: uppercase; - font-variant: small-caps; - font-feature-settings: "smcp"; - letter-spacing: 0.18em; - color: hsl(var(--muted-foreground)); - } - - /* --- Override: text body (Source Serif, hanging quotes) --- */ - - .editorial-text { - font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); - color: hsl(var(--foreground)); - line-height: 1.7; - max-width: var(--editorial-measure); - } - - .editorial-text p + p { - text-indent: 1.5em; - margin-top: 0; - } - - .editorial-text blockquote { - hanging-punctuation: first; - font-style: italic; - border-left: var(--editorial-rule); - padding-left: 1rem; - margin-left: 0; - } - - /* --- Override: button (hairline border, no fill, accent on hover) --- */ - - .editorial-button { - display: inline-block; - padding: 0.5rem 1rem; - font-family: var(--font-body, "Inter", -apple-system, sans-serif); - font-size: 13px; - text-transform: uppercase; - letter-spacing: 0.12em; - background-color: transparent; - color: hsl(var(--foreground)); - border: 1px solid hsl(var(--border)); - text-decoration: none; - cursor: pointer; - transition: color 150ms ease, border-color 150ms ease; - } - - .editorial-button:hover, - .editorial-button:focus { - color: hsl(var(--accent)); - border-color: hsl(var(--accent)); - } - - .editorial-button:focus-visible { - outline: 2px solid hsl(var(--ring)); - outline-offset: 2px; - } - - /* --- Override: image (Source Serif italic caption with hairline above) --- */ - - .editorial-figure { - margin: 1.5rem 0; - } - - .editorial-figure img { - display: block; - width: 100%; - height: auto; - } - - .editorial-figure figcaption { - margin-top: 0.75rem; - padding-top: 0.5rem; - border-top: var(--editorial-rule); - font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); - font-style: italic; - font-size: 14px; - color: hsl(var(--muted-foreground)); - } - - /* --- Colophon --- */ - - .editorial-colophon { - border-top: var(--editorial-rule); - padding-top: 1.5rem; - font-family: var(--font-body, "Inter", -apple-system, sans-serif); - font-size: 13px; - color: hsl(var(--muted-foreground)); - } - - .editorial-colophon-issn { - font-family: var(--font-mono, "JetBrains Mono", monospace); - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.1em; - } - - /* --- Page layout — narrow editorial column --- */ - - .editorial-column { - max-width: var(--editorial-measure); - margin-left: auto; - margin-right: auto; - padding-left: 1rem; - padding-right: 1rem; - } - - .editorial-wide { - max-width: 96rem; - margin-left: auto; - margin-right: auto; - padding-left: 1rem; - padding-right: 1rem; - } - - .editorial-article-grid { - display: grid; - grid-template-columns: 1fr; - gap: 1.5rem; - max-width: 80rem; - margin-left: auto; - margin-right: auto; - padding-left: 1rem; - padding-right: 1rem; - } - - @media (min-width: 1024px) { + /* --- Reading column + page widths --- */ + .editorial-column { + max-width: var(--editorial-measure); + margin-left: auto; + margin-right: auto; + padding-left: 1rem; + padding-right: 1rem; + } + .editorial-wide { + max-width: 72rem; + margin-left: auto; + margin-right: auto; + padding-left: 1rem; + padding-right: 1rem; + } .editorial-article-grid { - grid-template-columns: minmax(0, 64ch) 16rem; + display: grid; + grid-template-columns: 1fr; + gap: 1.5rem; + max-width: 80rem; + margin-left: auto; + margin-right: auto; + padding-left: 1rem; + padding-right: 1rem; + } + @media (min-width: 1024px) { + .editorial-article-grid { + grid-template-columns: minmax(0, 64ch) 16rem; + } + } + + /* --- Narrow prose column with indented continuation paragraphs --- */ + .prose-editorial { + max-width: var(--editorial-measure); + margin-left: auto; + margin-right: auto; + font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); + color: hsl(var(--foreground)); + line-height: 1.7; + } + .prose-editorial p { margin: 0 0 1em 0; } + .prose-editorial p + p { text-indent: 1.5em; } + .prose-editorial h1, + .prose-editorial h2, + .prose-editorial h3, + .prose-editorial h4 { + font-family: var(--font-heading, "Playfair Display", Georgia, serif); + font-weight: 700; + letter-spacing: -0.01em; + color: hsl(var(--foreground)); + } + .prose-editorial a { + color: hsl(var(--accent)); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 2px; + } + .prose-editorial blockquote { + hanging-punctuation: first; + font-style: italic; + border-left: var(--editorial-rule); + padding-left: 1rem; + margin-left: 0; + color: hsl(var(--muted-foreground)); + } + + /* --- Small-caps / tracked labels (kickers, eyebrows, meta) --- */ + .editorial-caps { + font-family: var(--font-body, "Source Serif 4", Georgia, serif); + text-transform: uppercase; + letter-spacing: 0.16em; + font-size: 0.72rem; + line-height: 1.4; + } + .editorial-meta { + font-family: var(--font-body, "Inter", -apple-system, sans-serif); + text-transform: uppercase; + letter-spacing: 0.1em; + font-size: 0.72rem; + color: hsl(var(--muted-foreground)); + } + .editorial-section-label { + font-family: var(--font-body, "Source Serif 4", Georgia, serif); + text-transform: uppercase; + font-variant: small-caps; + font-feature-settings: "smcp"; + letter-spacing: 0.15em; + font-size: 0.8rem; + color: hsl(var(--foreground)); + } + .editorial-section-label-rule { + border: 0; + border-top: var(--editorial-rule); + margin: 0.5rem 0 1.5rem 0; + } + + /* --- Hairline rules --- */ + hr.editorial-rule, + .editorial-rule, + .editorial-hairline { + border: 0; + border-top: var(--editorial-rule); + margin: 0; + } + + /* --- Heading (Playfair, tight tracking, optional kicker) --- */ + .editorial-heading { + font-family: var(--font-heading, "Playfair Display", Georgia, serif); + font-weight: 700; + letter-spacing: -0.015em; + color: hsl(var(--foreground)); + line-height: 1.15; + } + .editorial-heading-kicker { + display: block; + margin-bottom: 0.5rem; + font-family: var(--font-body, "Inter", -apple-system, sans-serif); + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.18em; + color: hsl(var(--muted-foreground)); + } + .editorial-underline { + position: relative; + padding-bottom: 0.35em; + } + .editorial-underline::after { + content: ""; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 1px; + background: hsl(var(--border)); + } + + /* --- Body text override --- */ + .editorial-text { + font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); + color: hsl(var(--foreground)); + line-height: 1.7; + } + .editorial-text p + p { text-indent: 1.5em; margin-top: 0; } + + /* --- Inline accent link --- */ + .editorial-link { + color: hsl(var(--accent)); + text-decoration: underline; + text-decoration-thickness: 1px; + text-underline-offset: 3px; + transition: color 150ms ease, text-decoration-color 150ms ease; + } + .editorial-link:hover, + .editorial-link:focus-visible { color: hsl(var(--foreground)); } + + /* --- Button (hairline border, no fill, accent on hover) --- */ + .editorial-button { + display: inline-block; + padding: 0.55rem 1.1rem; + font-family: var(--font-body, "Inter", -apple-system, sans-serif); + font-size: 0.78rem; + text-transform: uppercase; + letter-spacing: 0.14em; + background-color: transparent; + color: hsl(var(--foreground)); + border: 1px solid hsl(var(--border)); + text-decoration: none; + cursor: pointer; + transition: color 150ms ease, border-color 150ms ease; + } + .editorial-button:hover, + .editorial-button:focus { + color: hsl(var(--accent)); + border-color: hsl(var(--accent)); + } + .editorial-button:focus-visible { + outline: 2px solid hsl(var(--ring)); + outline-offset: 2px; + } + + /* --- Panel / card (hairline frame, no shadow) --- */ + .editorial-panel, + .editorial-card { + border: 1px solid hsl(var(--border)); + background-color: hsl(var(--card)); + transition: border-color 150ms ease; + } + .editorial-panel:hover, + .editorial-card:hover { border-color: hsl(var(--accent)); } + + /* --- Form field (hairline border, accent focus) --- */ + .editorial-input { + width: 100%; + border: 1px solid hsl(var(--input)); + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); + padding: 0.55rem 0.75rem; + font-family: var(--font-body, "Source Serif 4", Georgia, serif); + font-size: 0.95rem; + } + .editorial-input::placeholder { color: hsl(var(--muted-foreground)); } + .editorial-input:focus { + outline: none; + border-color: hsl(var(--accent)); + box-shadow: 0 0 0 1px hsl(var(--accent)); + } + + /* --- Figure / image caption --- */ + .editorial-figure { margin: 1.5rem 0; } + .editorial-figure img { display: block; width: 100%; height: auto; } + .editorial-figure figcaption { + margin-top: 0.75rem; + padding-top: 0.5rem; + border-top: var(--editorial-rule); + font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); + font-style: italic; + font-size: 0.85rem; + color: hsl(var(--muted-foreground)); + } + + /* --- Drop cap — oxblood accent first letter --- */ + .editorial-dropcap p:first-of-type::first-letter { + font-family: var(--font-heading, "Playfair Display", Georgia, serif); + font-weight: 900; + font-style: italic; + color: hsl(var(--accent)); + float: left; + font-size: 4.5em; + line-height: 0.85; + padding-right: 0.12em; + padding-top: 0.05em; + margin-bottom: -0.1em; + } + + /* --- Marginalia rail (right-side italic notes) --- */ + .editorial-marginalia { + font-family: var(--font-body, "Source Serif 4", "Source Serif Pro", Georgia, serif); + font-style: italic; + font-size: 0.8rem; + line-height: 1.5; + color: hsl(var(--muted-foreground)); + } + .editorial-marginalia aside { + margin: 0 0 1.5rem 0; + padding-left: 0.75rem; + border-left: var(--editorial-rule); + opacity: 0; + animation: editorial-fade-in 600ms ease forwards; + } + @keyframes editorial-fade-in { to { opacity: 1; } } + @media (prefers-reduced-motion: reduce) { + .editorial-marginalia aside { animation: none; opacity: 1; } + } + @media (max-width: 768px) { + .editorial-marginalia { + margin-top: 1.5rem; + border-top: var(--editorial-rule); + padding-top: 1rem; + } + } + + /* --- Masthead wordmark --- */ + .editorial-masthead-wordmark { + font-family: var(--font-heading, "Playfair Display", Georgia, serif); + font-weight: 900; + font-style: italic; + letter-spacing: -0.02em; + color: hsl(var(--foreground)); + } + .editorial-masthead-kicker { + font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.15em; + color: hsl(var(--muted-foreground)); + } + .editorial-masthead-rule { + border: 0; + border-top: var(--editorial-rule); + margin: 0.5rem 0 0 0; + } + + /* --- Pull quote — Playfair italic in oxblood --- */ + .editorial-pullquote { + font-family: var(--font-heading, "Playfair Display", Georgia, serif); + font-style: italic; + font-size: 2rem; + line-height: 1.2; + color: hsl(var(--accent)); + margin: 2.5rem auto; + max-width: var(--editorial-measure); + border: none; + } + .editorial-pullquote-attribution { + display: block; + margin-top: 1rem; + font-family: var(--font-body, "Source Serif 4", Georgia, serif); + font-style: normal; + font-size: 0.85rem; + text-transform: uppercase; + letter-spacing: 0.12em; + color: hsl(var(--muted-foreground)); + } + + /* --- Byline --- */ + .editorial-byline { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.75rem 0; + border-top: var(--editorial-rule); + border-bottom: var(--editorial-rule); + } + .editorial-byline-photo { + width: 36px; + height: 36px; + border-radius: 50%; + background-color: hsl(var(--muted)); + flex-shrink: 0; + object-fit: cover; + } + .editorial-byline-author { + font-family: var(--font-body, "Inter", -apple-system, sans-serif); + font-weight: 500; + font-size: 0.95rem; + color: hsl(var(--foreground)); + } + .editorial-byline-meta { + font-family: var(--font-body, "Inter", -apple-system, sans-serif); + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.1em; + color: hsl(var(--muted-foreground)); + } + + /* --- Colophon --- */ + .editorial-colophon { + border-top: var(--editorial-rule); + padding-top: 1.5rem; + font-family: var(--font-body, "Inter", -apple-system, sans-serif); + font-size: 0.8rem; + color: hsl(var(--muted-foreground)); + } + .editorial-colophon-issn { + font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.1em; + } + + /* --- Reading-progress underline (CSS-only atmosphere) --- */ + .editorial-progress { + position: sticky; + top: 0; + height: 2px; + background: hsl(var(--accent)); + transform-origin: 0 50%; + animation: editorial-progress linear both; + animation-timeline: scroll(root block); + z-index: 50; + } + @keyframes editorial-progress { from { transform: scaleX(0); } to { transform: scaleX(1); } } + @media (prefers-reduced-motion: reduce) { + .editorial-progress { animation: none; transform: scaleX(0); } } } diff --git a/master_pages.json b/master_pages.json index 54fb9e2..8e9761e 100644 --- a/master_pages.json +++ b/master_pages.json @@ -2,12 +2,24 @@ { "key": "editorial:default-master", "title": "Editorial Default Master", - "page_templates": ["default", "landing", "full-width"], + "page_templates": ["default", "full-width", "blog-index", "contact"], "blocks": [ - { "block_key": "editorial:masthead", "title": "Masthead", "content": { "menuName": "main", "kicker": "EST. 2026" }, "slot": "header", "sort_order": 0 }, - { "block_key": "navbar", "title": "Section Nav", "content": { "menuName": "sections" }, "slot": "header", "sort_order": 1 }, + { "block_key": "navbar", "title": "Masthead Navigation", "content": { "menuName": "main", "logoType": "text", "logoText": { "text": "The Margin" } }, "slot": "header", "sort_order": 0 }, + { "block_key": "slot", "title": "Featured", "content": { "slotName": "featured" }, "slot": "featured", "sort_order": 0 }, { "block_key": "slot", "title": "Main Content", "content": { "slotName": "main", "placeholder": "Page content" }, "slot": "main", "sort_order": 0 }, - { "block_key": "editorial:colophon", "title": "Colophon", "content": { "showSignup": true, "issn": "0000-0000" }, "slot": "footer", "sort_order": 0 } + { "block_key": "slot", "title": "Aside", "content": { "slotName": "aside" }, "slot": "aside", "sort_order": 0 }, + { "block_key": "footer", "title": "Colophon", "content": { "layout": "centered", "companyName": "The Margin", "tagline": "A newsletter about paying attention.", "showNewsletter": true, "newsletterTitle": "Subscribe", "newsletterDescription": "New essays, every other Sunday.", "copyright": "The Margin" }, "slot": "footer", "sort_order": 0 } + ] + }, + { + "key": "editorial:landing-master", + "title": "Editorial Front Page Master", + "page_templates": ["landing"], + "blocks": [ + { "block_key": "navbar", "title": "Masthead Navigation", "content": { "menuName": "main", "logoType": "text", "logoText": { "text": "The Margin" } }, "slot": "masthead", "sort_order": 0 }, + { "block_key": "slot", "title": "Lead", "content": { "slotName": "lead", "placeholder": "Lead essay" }, "slot": "lead", "sort_order": 0 }, + { "block_key": "slot", "title": "River", "content": { "slotName": "river", "placeholder": "Recent essays" }, "slot": "river", "sort_order": 0 }, + { "block_key": "footer", "title": "Colophon", "content": { "layout": "centered", "companyName": "The Margin", "tagline": "A newsletter about paying attention.", "showNewsletter": true, "newsletterTitle": "Subscribe", "newsletterDescription": "New essays, every other Sunday.", "copyright": "The Margin" }, "slot": "footer", "sort_order": 0 } ] }, { @@ -15,11 +27,11 @@ "title": "Editorial Article Master", "page_templates": ["article"], "blocks": [ - { "block_key": "editorial:masthead", "title": "Masthead", "content": { "menuName": "main", "compact": true }, "slot": "header", "sort_order": 0 }, - { "block_key": "editorial:byline", "title": "Byline", "content": { "showPhoto": true, "showReadTime": true }, "slot": "byline", "sort_order": 0 }, - { "block_key": "slot", "title": "Article Body", "content": { "slotName": "main" }, "slot": "main", "sort_order": 0 }, - { "block_key": "editorial:marginalia", "title": "Marginalia Rail", "content": { "items": [] }, "slot": "marginalia", "sort_order": 0 }, - { "block_key": "editorial:colophon", "title": "Colophon", "content": { "showSignup": true }, "slot": "footer", "sort_order": 0 } + { "block_key": "navbar", "title": "Masthead Navigation", "content": { "menuName": "main", "logoType": "text", "logoText": { "text": "The Margin" } }, "slot": "header", "sort_order": 0 }, + { "block_key": "slot", "title": "Byline", "content": { "slotName": "byline" }, "slot": "byline", "sort_order": 0 }, + { "block_key": "slot", "title": "Article Body", "content": { "slotName": "main", "placeholder": "Essay body" }, "slot": "main", "sort_order": 0 }, + { "block_key": "slot", "title": "Marginalia Rail", "content": { "slotName": "marginalia" }, "slot": "marginalia", "sort_order": 0 }, + { "block_key": "footer", "title": "Colophon", "content": { "layout": "centered", "companyName": "The Margin", "tagline": "A newsletter about paying attention.", "copyright": "The Margin" }, "slot": "footer", "sort_order": 0 } ] } ] diff --git a/plugin.mod b/plugin.mod index 6f38ff4..6d16cce 100644 --- a/plugin.mod +++ b/plugin.mod @@ -3,7 +3,8 @@ name = "editorial" display_name = "Editorial" scope = "@themes" version = "0.2.0" -description = "Didone display type, narrow measure, and hairline rules for newsrooms, longform writers, and opinion columnists." +description = "A personal essayist's reading room: warm book-paper light, sepia-on-charcoal dark, serif baseline grid, drop caps, running marginalia and small-caps labels for longform writers and independent newsletters." kind = "theme" categories = ["templates"] -tags = ["editorial", "serif", "news", "longform", "magazine", "law", "finance", "opinion"] +tags = ["editorial", "serif", "essay", "newsletter", "longform", "reading", "typographic", "blog", "writer"] +required_icon_packs = ["lucide"] diff --git a/presets.json b/presets.json index 69151d9..c544a57 100644 --- a/presets.json +++ b/presets.json @@ -1,88 +1,201 @@ [ { - "id": "broadsheet", - "name": "Broadsheet", - "description": "Default light: cream paper, ink black, oxblood accent. Newsroom front page.", + "id": "book-paper", + "name": "Book Paper", + "description": "The default. Warm off-white paper and dark serif ink by day, low-glare charcoal with sepia type by night. Oxblood accent throughout.", "theme": { - "mode": "light", + "mode": "both", "lightColors": { - "background": "36 30% 96%", - "foreground": "20 14% 10%", - "card": "36 30% 98%", - "cardForeground": "20 14% 10%", - "popover": "36 30% 98%", - "popoverForeground": "20 14% 10%", - "primary": "20 14% 10%", - "primaryForeground": "36 30% 96%", - "secondary": "36 20% 90%", - "secondaryForeground": "20 14% 10%", - "muted": "36 20% 92%", - "mutedForeground": "20 10% 38%", - "accent": "0 55% 28%", - "accentForeground": "36 30% 96%", - "destructive": "0 72% 42%", - "destructiveForeground": "36 30% 96%", - "border": "30 12% 82%", - "input": "30 12% 82%", - "ring": "0 55% 28%" + "background": "38 32% 95%", + "foreground": "24 16% 12%", + "card": "38 34% 97%", + "cardForeground": "24 16% 12%", + "popover": "38 34% 97%", + "popoverForeground": "24 16% 12%", + "primary": "24 16% 12%", + "primaryForeground": "38 32% 95%", + "secondary": "36 22% 89%", + "secondaryForeground": "24 16% 14%", + "muted": "36 22% 91%", + "mutedForeground": "26 10% 38%", + "accent": "3 58% 34%", + "accentForeground": "38 32% 95%", + "destructive": "0 70% 42%", + "destructiveForeground": "38 32% 95%", + "border": "32 16% 82%", + "input": "32 16% 80%", + "ring": "3 58% 34%" + }, + "darkColors": { + "background": "26 10% 10%", + "foreground": "36 22% 82%", + "card": "26 10% 13%", + "cardForeground": "36 22% 82%", + "popover": "26 10% 13%", + "popoverForeground": "36 22% 82%", + "primary": "36 22% 82%", + "primaryForeground": "26 10% 10%", + "secondary": "26 8% 18%", + "secondaryForeground": "36 20% 80%", + "muted": "26 8% 16%", + "mutedForeground": "34 12% 58%", + "accent": "6 62% 56%", + "accentForeground": "26 10% 10%", + "destructive": "0 68% 52%", + "destructiveForeground": "36 22% 88%", + "border": "28 8% 22%", + "input": "28 8% 20%", + "ring": "6 62% 56%" } } }, { - "id": "nightdesk", - "name": "Nightdesk", - "description": "Dark mode for after-hours reading. Inverted broadsheet with deeper accent.", + "id": "sepia-review", + "name": "Sepia Review", + "description": "Warm sepia in both modes for a soft, magazine-like read. Amber paper and umber ink by day, deep tobacco ground by night.", "theme": { - "mode": "dark", + "mode": "both", + "lightColors": { + "background": "34 44% 93%", + "foreground": "22 30% 16%", + "card": "34 46% 96%", + "cardForeground": "22 30% 16%", + "popover": "34 46% 96%", + "popoverForeground": "22 30% 16%", + "primary": "22 30% 16%", + "primaryForeground": "34 44% 93%", + "secondary": "32 30% 87%", + "secondaryForeground": "22 30% 18%", + "muted": "32 28% 89%", + "mutedForeground": "24 18% 40%", + "accent": "14 62% 38%", + "accentForeground": "34 44% 94%", + "destructive": "0 70% 42%", + "destructiveForeground": "34 44% 94%", + "border": "30 22% 78%", + "input": "30 22% 76%", + "ring": "14 62% 38%" + }, "darkColors": { - "background": "24 10% 8%", - "foreground": "36 20% 92%", - "card": "24 10% 11%", - "cardForeground": "36 20% 92%", - "popover": "24 10% 11%", - "popoverForeground": "36 20% 92%", - "primary": "36 20% 92%", - "primaryForeground": "24 10% 8%", - "secondary": "24 8% 16%", - "secondaryForeground": "36 20% 92%", - "muted": "24 8% 14%", - "mutedForeground": "36 12% 62%", - "accent": "0 60% 52%", - "accentForeground": "24 10% 8%", - "destructive": "0 72% 50%", - "destructiveForeground": "36 20% 92%", - "border": "24 8% 20%", - "input": "24 8% 18%", - "ring": "0 60% 52%" + "background": "24 18% 11%", + "foreground": "34 30% 80%", + "card": "24 18% 14%", + "cardForeground": "34 30% 80%", + "popover": "24 18% 14%", + "popoverForeground": "34 30% 80%", + "primary": "34 30% 80%", + "primaryForeground": "24 18% 11%", + "secondary": "24 14% 19%", + "secondaryForeground": "34 28% 78%", + "muted": "24 14% 17%", + "mutedForeground": "32 16% 60%", + "accent": "18 68% 54%", + "accentForeground": "24 18% 10%", + "destructive": "0 68% 52%", + "destructiveForeground": "34 30% 86%", + "border": "26 14% 23%", + "input": "26 14% 21%", + "ring": "18 68% 54%" } } }, { "id": "legal-pad", "name": "Legal Pad", - "description": "Warm cream for law and finance verticals. Tighter saturation, deeper ink.", + "description": "Deeper cream and near-black ink for law, finance and long essays. Tight saturation by day, cool ink-black night desk.", "theme": { - "mode": "light", + "mode": "both", "lightColors": { - "background": "48 40% 94%", - "foreground": "28 30% 14%", - "card": "48 40% 97%", - "cardForeground": "28 30% 14%", - "popover": "48 40% 97%", - "popoverForeground": "28 30% 14%", - "primary": "28 30% 14%", - "primaryForeground": "48 40% 94%", - "secondary": "44 30% 86%", - "secondaryForeground": "28 30% 14%", - "muted": "44 28% 90%", - "mutedForeground": "28 18% 36%", - "accent": "10 60% 30%", - "accentForeground": "48 40% 94%", - "destructive": "0 72% 42%", - "destructiveForeground": "48 40% 94%", - "border": "40 20% 78%", - "input": "40 20% 80%", - "ring": "10 60% 30%" + "background": "48 42% 93%", + "foreground": "30 28% 13%", + "card": "48 44% 96%", + "cardForeground": "30 28% 13%", + "popover": "48 44% 96%", + "popoverForeground": "30 28% 13%", + "primary": "30 28% 13%", + "primaryForeground": "48 42% 93%", + "secondary": "46 30% 86%", + "secondaryForeground": "30 28% 15%", + "muted": "46 28% 89%", + "mutedForeground": "30 16% 36%", + "accent": "10 58% 32%", + "accentForeground": "48 42% 94%", + "destructive": "0 70% 42%", + "destructiveForeground": "48 42% 94%", + "border": "42 22% 77%", + "input": "42 22% 75%", + "ring": "10 58% 32%" + }, + "darkColors": { + "background": "220 12% 9%", + "foreground": "44 20% 84%", + "card": "220 12% 12%", + "cardForeground": "44 20% 84%", + "popover": "220 12% 12%", + "popoverForeground": "44 20% 84%", + "primary": "44 20% 84%", + "primaryForeground": "220 12% 9%", + "secondary": "220 10% 17%", + "secondaryForeground": "44 18% 82%", + "muted": "220 10% 15%", + "mutedForeground": "40 12% 58%", + "accent": "8 64% 55%", + "accentForeground": "220 12% 9%", + "destructive": "0 68% 52%", + "destructiveForeground": "44 20% 88%", + "border": "220 10% 21%", + "input": "220 10% 19%", + "ring": "8 64% 55%" + } + } + }, + { + "id": "nightdesk", + "name": "Nightdesk", + "description": "Cooler neutral paper and a crisp after-hours reading mode. A brighter red accent for the late edition.", + "theme": { + "mode": "both", + "lightColors": { + "background": "40 20% 96%", + "foreground": "220 14% 14%", + "card": "40 22% 98%", + "cardForeground": "220 14% 14%", + "popover": "40 22% 98%", + "popoverForeground": "220 14% 14%", + "primary": "220 14% 14%", + "primaryForeground": "40 20% 96%", + "secondary": "40 14% 90%", + "secondaryForeground": "220 14% 16%", + "muted": "40 14% 92%", + "mutedForeground": "220 8% 40%", + "accent": "352 60% 42%", + "accentForeground": "40 20% 96%", + "destructive": "0 72% 44%", + "destructiveForeground": "40 20% 96%", + "border": "36 12% 83%", + "input": "36 12% 81%", + "ring": "352 60% 42%" + }, + "darkColors": { + "background": "222 16% 9%", + "foreground": "40 16% 86%", + "card": "222 16% 12%", + "cardForeground": "40 16% 86%", + "popover": "222 16% 12%", + "popoverForeground": "40 16% 86%", + "primary": "40 16% 86%", + "primaryForeground": "222 16% 9%", + "secondary": "222 12% 17%", + "secondaryForeground": "40 14% 84%", + "muted": "222 12% 15%", + "mutedForeground": "40 10% 60%", + "accent": "352 70% 58%", + "accentForeground": "222 16% 9%", + "destructive": "0 70% 54%", + "destructiveForeground": "40 16% 90%", + "border": "222 12% 22%", + "input": "222 12% 20%", + "ring": "352 70% 58%" } } } diff --git a/seed/seed.json b/seed/seed.json new file mode 100644 index 0000000..df336f4 --- /dev/null +++ b/seed/seed.json @@ -0,0 +1,196 @@ +{ + "demo": true, + "settings": { + "merge": { + "companyName": "The Margin", + "tagline": "A newsletter about paying attention." + } + }, + "data_tables": [ + { + "key": "contact_submissions", + "name": "Letters", + "description": "Seeded contact-form submissions for the The Margin demo. A submission becomes a row here and emails the site admins.", + "columns": [ + { "key": "name", "label": "Name", "type": "text", "required": true }, + { "key": "email", "label": "Email", "type": "email", "required": true }, + { "key": "subject", "label": "Subject", "type": "text", "required": false }, + { "key": "message", "label": "Message", "type": "text", "required": true } + ] + } + ], + "pages": [ + { + "slug": "/", + "title": "The Margin", + "template_key": "landing", + "blocks": [ + { + "block_key": "hero", + "title": "Lead", + "slot": "lead", + "sort_order": 1, + "content": { + "template": "centered", + "eyebrow": { "text": "Issue 12" }, + "headline": { "text": "The Margin" }, + "subheadline": { "text": "A newsletter about paying attention." }, + "description": { "text": "Essays on reading, attention, and the slow work of noticing. New writing lands every other Sunday, free to your inbox." }, + "ctaPrimary": { "text": "Read the latest", "url": "/blog", "style": "primary" }, + "ctaSecondary": { "text": "About the writer", "url": "/about", "style": "outline" } + } + }, + { + "block_key": "heading", + "title": "Recent heading", + "slot": "river", + "sort_order": 1, + "content": { "text": "Recent essays", "level": 2 } + }, + { + "block_key": "card", + "title": "Essay: On Attention", + "slot": "river", + "sort_order": 2, + "content": { "layout": "vertical", "title": "On attention", "text": "

What it costs to look at one thing for a long time, and what it gives back.

", "link": "/blog/on-attention", "linkLabel": "Read the essay" } + }, + { + "block_key": "card", + "title": "Essay: The Slow Read", + "slot": "river", + "sort_order": 3, + "content": { "layout": "vertical", "title": "The slow read", "text": "

A case for reading less, and reading it twice.

", "link": "/blog/the-slow-read", "linkLabel": "Read the essay" } + }, + { + "block_key": "card", + "title": "Essay: Notes on Noticing", + "slot": "river", + "sort_order": 4, + "content": { "layout": "vertical", "title": "Notes on noticing", "text": "

Small habits that keep the world from going quiet.

", "link": "/blog/notes-on-noticing", "linkLabel": "Read the essay" } + }, + { + "block_key": "newsletter-signup", + "title": "Subscribe", + "slot": "river", + "sort_order": 5, + "content": { "title": "Subscribe", "description": "New essays every other Sunday. No noise, no schedule creep.", "listSlug": "main", "source": "home", "submitText": "Subscribe", "successMessage": "You are on the list. Look for the next issue on Sunday.", "placeholder": "you@example.com", "layout": "card" } + } + ] + }, + { + "slug": "/about", + "title": "About", + "template_key": "default", + "blocks": [ + { "block_key": "heading", "title": "Heading", "slot": "main", "sort_order": 1, "content": { "text": "About", "level": 1 } }, + { "block_key": "rich-text", "title": "Bio", "slot": "main", "sort_order": 2, "content": { "html": "

The Margin is a newsletter by Frances Hale. It is about reading, attention, and the slow work of noticing.

I write one essay every other week. Some are short. Some take the long way around. All of them start in the margins of a book.

You can read the archive for free. Members get the full run and the occasional letter.

" } }, + { "block_key": "editorial:reading_list", "title": "Shelf", "slot": "main", "sort_order": 3, "content": { "title": "On the shelf", "intro": "Books I keep going back to.", "items": [ { "label": "The Writing Life", "source": "Annie Dillard", "note": "On the daily cost of the work." }, { "label": "Ways of Seeing", "source": "John Berger", "note": "How looking is never neutral." }, { "label": "The Art of Stillness", "source": "Pico Iyer", "note": "A short book about going nowhere." } ] } }, + { "block_key": "quote", "title": "Quote", "slot": "main", "sort_order": 4, "content": { "style": "block", "align": "center", "quote": "Attention is the beginning of devotion.", "attribution": "Mary Oliver" } } + ] + }, + { + "slug": "/blog", + "title": "The archive", + "template_key": "blog-index", + "blocks": [ + { "block_key": "card", "title": "Featured: On Attention", "slot": "featured", "sort_order": 1, "content": { "layout": "horizontal", "title": "On attention", "text": "

What it costs to look at one thing for a long time, and what it gives back. The lead essay this issue.

", "link": "/blog/on-attention", "linkLabel": "Read the essay" } }, + { "block_key": "card", "title": "Post: The Slow Read", "slot": "main", "sort_order": 1, "content": { "layout": "vertical", "title": "The slow read", "text": "

A case for reading less, and reading it twice.

", "link": "/blog/the-slow-read", "linkLabel": "Read on" } }, + { "block_key": "card", "title": "Post: Notes on Noticing", "slot": "main", "sort_order": 2, "content": { "layout": "vertical", "title": "Notes on noticing", "text": "

Small habits that keep the world from going quiet.

", "link": "/blog/notes-on-noticing", "linkLabel": "Read on" } }, + { "block_key": "card", "title": "Post: The Second Draft", "slot": "main", "sort_order": 3, "content": { "layout": "vertical", "title": "The second draft", "text": "

Where the real writing happens, once the first draft is out of the way.

", "link": "/blog/on-attention", "linkLabel": "Read on" } } + ] + }, + { + "slug": "/blog/on-attention", + "title": "On attention", + "template_key": "article", + "parent_slug": "/blog", + "blocks": [ + { "block_key": "text", "title": "Byline", "slot": "byline", "sort_order": 1, "content": { "text": "

By Frances Hale. Issue 12.

" } }, + { "block_key": "editorial:dropcap_intro", "title": "Lead", "slot": "main", "sort_order": 1, "content": { "lead": "

There is a kind of looking that costs something. You give a thing your whole attention and the rest of the world goes quiet for a while. It is not comfortable. It is not always rewarded. But it is the only way I know to see anything clearly.

" } }, + { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

I started keeping a notebook of things I had failed to notice. A tree I passed every day for a year. The way a friend says my name. The list grew fast, which told me something about how little I had been paying attention.

Attention is not a switch. It is a muscle, and it gets tired. The trick is not to force it but to make room for it. Read slower. Walk without a phone. Let one thing be the whole thing for an hour.

What you get back is not efficiency. It is the world, a little louder than before.

" } }, + { "block_key": "editorial:marginalia", "title": "Marginalia", "slot": "marginalia", "sort_order": 1, "content": { "items": [ { "anchor": "On notebooks", "note": "I use a cheap one. A nice notebook makes me careful, and careful is the enemy here." }, { "anchor": "On walking", "note": "The phone stays home. That is the whole method." } ] } } + ] + }, + { + "slug": "/blog/the-slow-read", + "title": "The slow read", + "template_key": "article", + "parent_slug": "/blog", + "blocks": [ + { "block_key": "text", "title": "Byline", "slot": "byline", "sort_order": 1, "content": { "text": "

By Frances Hale. Issue 11.

" } }, + { "block_key": "editorial:dropcap_intro", "title": "Lead", "slot": "main", "sort_order": 1, "content": { "lead": "

Most of what I read once, I forget by the weekend. The books that stay with me are the ones I read twice. So I have started reading less, on purpose, and going back.

" } }, + { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

The second reading is a different book. You know where it is going, so you stop rushing. You notice the joins. You see what the writer set up on page ten and paid off on page two hundred.

This is slower, and that is the point. A shelf of books read once is a list. A shelf of books read twice is a conversation.

" } }, + { "block_key": "editorial:marginalia", "title": "Marginalia", "slot": "marginalia", "sort_order": 1, "content": { "items": [ { "anchor": "A rule", "note": "One new book for every reread. It keeps the shelf honest." } ] } } + ] + }, + { + "slug": "/blog/notes-on-noticing", + "title": "Notes on noticing", + "template_key": "article", + "parent_slug": "/blog", + "blocks": [ + { "block_key": "text", "title": "Byline", "slot": "byline", "sort_order": 1, "content": { "text": "

By Frances Hale. Issue 10.

" } }, + { "block_key": "editorial:dropcap_intro", "title": "Lead", "slot": "main", "sort_order": 1, "content": { "lead": "

Noticing is a habit before it is a talent. Here are the small ones that keep my world from going quiet, collected over a slow year of trying.

" } }, + { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

Name one thing you saw today that you had not seen before. Do it out loud, at dinner, and make someone else do it too.

Carry a small notebook. Write the thing down before you explain it to yourself. The explanation can wait.

None of this is hard. That is what makes it easy to skip. Do it anyway, and the days stop blurring together.

" } }, + { "block_key": "editorial:field_notes", "title": "Field notes", "slot": "main", "sort_order": 3, "content": { "title": "Field notes", "notes": [ { "date": "March 14", "note": "

A heron on the river wall, standing so still I mistook it for a post.

" }, { "date": "March 9", "note": "

The bakery changed its bread and told no one. I noticed on the second bite.

" } ] } }, + { "block_key": "editorial:marginalia", "title": "Marginalia", "slot": "marginalia", "sort_order": 1, "content": { "items": [ { "anchor": "Try it", "note": "The dinner question works on children better than on adults. Adults think it is a test." } ] } } + ] + }, + { + "slug": "/contact", + "title": "Say hello", + "template_key": "contact", + "blocks": [ + { + "block_key": "contact-form", + "title": "Write to me", + "slot": "main", + "sort_order": 1, + "content": { + "heading": "Write to me", + "description": "A note, a question, a book you think I should read. I answer everything, though it can take a week.", + "submitLabel": "Send", + "successMessage": "Thank you. Your note has been received. I will write back soon.", + "fields": [ + { "name": "name", "label": "Your name", "type": "text", "required": true, "width": "half" }, + { "name": "email", "label": "Email", "type": "email", "required": true, "width": "half" }, + { "name": "subject", "label": "Subject", "type": "text", "required": false, "width": "full" }, + { "name": "message", "label": "Your note", "type": "textarea", "required": true, "width": "full" } + ], + "formConfig": { "enabled": true, "captchaEnabled": false, "targetTable": "contact_submissions" } + } + }, + { + "block_key": "contact-card", + "title": "Other ways to reach me", + "slot": "aside", + "sort_order": 1, + "content": { + "heading": "Elsewhere", + "description": "The inbox is best. These work too.", + "columns": 1, + "channels": [ + { "icon": "lucide:mail", "label": "Email", "value": "frances@themargin.example", "link": "mailto:frances@themargin.example" }, + { "icon": "lucide:rss", "label": "Feed", "value": "Subscribe by RSS", "link": "/feed" } + ] + } + } + ] + }, + { + "slug": "/login", + "title": "Members", + "template_key": "auth", + "blocks": [ + { "block_key": "auth-form", "title": "Sign in", "slot": "main", "sort_order": 1, "content": { "default_tab": "login", "show_social": false } }, + { "block_key": "text", "title": "Foot", "slot": "footer", "sort_order": 1, "content": { "text": "

Members get the full archive and the occasional letter.

" } } + ] + } + ], + "menu_items": [ + { "menu": "main", "label": "Home", "page_slug": "/", "sort_order": 1 }, + { "menu": "main", "label": "Essays", "page_slug": "/blog", "sort_order": 2 }, + { "menu": "main", "label": "About", "page_slug": "/about", "sort_order": 3 }, + { "menu": "main", "label": "Say hello", "page_slug": "/contact", "sort_order": 4 } + ] +} diff --git a/seed/workflows.json b/seed/workflows.json new file mode 100644 index 0000000..252aafb --- /dev/null +++ b/seed/workflows.json @@ -0,0 +1,19 @@ +{ + "workflows": [ + { + "key": "contact_notify_admins", + "name": "Letter to admins", + "description": "On a contact-form submission, email the site admins.", + "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/editorial/article.ninjatpl b/templates/editorial/article.ninjatpl index c578d44..38c5bf4 100644 --- a/templates/editorial/article.ninjatpl +++ b/templates/editorial/article.ninjatpl @@ -1,15 +1,16 @@ - + {{ head_html|safe }} - + + {{ admin_banner_html|safe }} -
{{ slots.header|safe }}
-
{{ slots.byline|safe }}
+ {% if slots.header %}
{{ slots.header|safe }}
{% endif %} + {% if slots.byline %}
{{ slots.byline|safe }}
{% endif %}
-
{% if slots.main %}{{ slots.main|safe }}{% else %}

No content blocks assigned to this page.

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

This essay has no content yet.

{% endif %}
+
-
{{ slots.footer|safe }}
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} {{ body_end_html|safe }} diff --git a/templates/editorial/auth.ninjatpl b/templates/editorial/auth.ninjatpl new file mode 100644 index 0000000..b794c65 --- /dev/null +++ b/templates/editorial/auth.ninjatpl @@ -0,0 +1,18 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} +
+
+ + {% if site_settings.Logo %}{{ site_settings.LogoAlt }}{% else %}{{ site_settings.Title|default:"Editorial" }}{% endif %} + +
+
{% 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/editorial/blog-index.ninjatpl b/templates/editorial/blog-index.ninjatpl new file mode 100644 index 0000000..be365bf --- /dev/null +++ b/templates/editorial/blog-index.ninjatpl @@ -0,0 +1,23 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} + {% if slots.header %}
{{ slots.header|safe }}
{% endif %} +
+
+ {% if title %} +
+

{{ 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 essays published yet.

{% endif %} +
+
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} + {{ body_end_html|safe }} + + diff --git a/templates/editorial/contact.ninjatpl b/templates/editorial/contact.ninjatpl new file mode 100644 index 0000000..64d42fa --- /dev/null +++ b/templates/editorial/contact.ninjatpl @@ -0,0 +1,22 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} + {% if slots.header %}
{{ slots.header|safe }}
{% endif %} +
+
+ {% if slots.aside %} +
+
{% if slots.main %}{{ slots.main|safe }}{% endif %}
+ +
+ {% 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/editorial/default.ninjatpl b/templates/editorial/default.ninjatpl index 4c7e528..434bd80 100644 --- a/templates/editorial/default.ninjatpl +++ b/templates/editorial/default.ninjatpl @@ -1,11 +1,13 @@ - + {{ head_html|safe }} - + {{ admin_banner_html|safe }} -
{{ slots.header|safe }}
-
{% if slots.main %}{{ slots.main|safe }}{% else %}

No content blocks assigned to this page.

{% endif %}
-
{{ slots.footer|safe }}
+ {% if slots.header %}
{{ slots.header|safe }}
{% endif %} +
+ {% if slots.main %}
{{ slots.main|safe }}
{% else %}

No content blocks assigned to this page.

{% endif %} +
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} {{ body_end_html|safe }} diff --git a/templates/editorial/full-width.ninjatpl b/templates/editorial/full-width.ninjatpl index fc86238..b5a34af 100644 --- a/templates/editorial/full-width.ninjatpl +++ b/templates/editorial/full-width.ninjatpl @@ -1,11 +1,11 @@ - + {{ head_html|safe }} - + {{ admin_banner_html|safe }} -
{{ slots.header|safe }}
+ {% if slots.header %}
{{ slots.header|safe }}
{% endif %}
{% if slots.main %}{{ slots.main|safe }}{% else %}

No content blocks assigned to this page.

{% endif %}
-
{{ slots.footer|safe }}
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} {{ body_end_html|safe }} diff --git a/templates/editorial/landing.ninjatpl b/templates/editorial/landing.ninjatpl index 9d036c4..3ae7119 100644 --- a/templates/editorial/landing.ninjatpl +++ b/templates/editorial/landing.ninjatpl @@ -1,12 +1,14 @@ - + {{ head_html|safe }} - + {{ admin_banner_html|safe }} -
{{ slots.masthead|safe }}
-
{{ slots.lead|safe }}
-
{{ slots.river|safe }}
-
{{ slots.footer|safe }}
+ {% if slots.masthead %}
{{ slots.masthead|safe }}
{% endif %} +
+ {% if slots.lead %}
{{ slots.lead|safe }}
{% endif %} + {% if slots.river %}

{{ slots.river|safe }}
{% endif %} +
+ {% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} {{ body_end_html|safe }} diff --git a/templates/email/editorial.ninjatpl b/templates/email/editorial.ninjatpl index c5e949a..f2a2d54 100644 --- a/templates/email/editorial.ninjatpl +++ b/templates/email/editorial.ninjatpl @@ -1,14 +1,74 @@ -{{ site_name }}{% if preview_text %}
{{ preview_text }}
{% endif %}
+ + + + + + + + + {{ site_name }} + + + + {% if preview_text %}
{{ preview_text }}
{% endif %} + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/templates/overrides/editorial/announcement-bar.ninjatpl b/templates/overrides/editorial/announcement-bar.ninjatpl new file mode 100644 index 0000000..b386802 --- /dev/null +++ b/templates/overrides/editorial/announcement-bar.ninjatpl @@ -0,0 +1,21 @@ +{# announcement-bar override — quiet notice on a hairline panel, small-caps message. Dismiss {% endif %} diff --git a/templates/overrides/editorial/audio-embed.ninjatpl b/templates/overrides/editorial/audio-embed.ninjatpl new file mode 100644 index 0000000..4ef4a4e --- /dev/null +++ b/templates/overrides/editorial/audio-embed.ninjatpl @@ -0,0 +1,16 @@ +{# audio-embed override — editorial hairline player card. Fields + facade JS mirror builtin verbatim: url, media, artwork, title, artist, download. #} +
{% if artwork %}
{% img artwork alt=title|default:"" class="h-full w-full object-cover" %}
{% endif %}
{% if title %}

{{ title }}

{% endif %}{% if artist %}

{{ artist }}

{% endif %}
{% if download %}::lucide:download:sm:: Download{% endif %}
diff --git a/templates/overrides/editorial/auth-form.ninjatpl b/templates/overrides/editorial/auth-form.ninjatpl new file mode 100644 index 0000000..6159cec --- /dev/null +++ b/templates/overrides/editorial/auth-form.ninjatpl @@ -0,0 +1,33 @@ +{# auth-form (editorial) — typographic login/register in an editorial-panel with small-caps labels, hairline tab rules and oxblood active tab. Wiring UNTOUCHABLE: single shared #auth-message, /api/auth/login (email,password) and /api/auth/register (username,email,password), hx-target #auth-message, captcha injected from _captcha_widget. #} +{% if context.isPublicLoggedIn %} +
+

You are signed in as {{ context.publicUsername }}

+ My account +
+{% else %} +
+
+
+ + +
+
+
+
+
+ {% if _captcha_widget %}{{ _captcha_widget|safe }}{% endif %} + +

Forgot password?

+
+
+
+
+
+
+
+ {% if _captcha_widget %}{{ _captcha_widget|safe }}{% endif %} + +
+
+
+{% endif %} diff --git a/templates/overrides/editorial/auth-status.ninjatpl b/templates/overrides/editorial/auth-status.ninjatpl new file mode 100644 index 0000000..423218e --- /dev/null +++ b/templates/overrides/editorial/auth-status.ninjatpl @@ -0,0 +1,31 @@ +{# auth-status (editorial) — header login state; small-caps links, hairline monogram and quiet editorial-panel dropdown. Driven by context.isPublicLoggedIn / context.publicDisplayName / context.publicUsername; logout posts /api/auth/logout. #} +{% if context.isPublicLoggedIn %} +
+ + + +
+{% else %} + +{% endif %} diff --git a/templates/overrides/editorial/author-bio-hero.ninjatpl b/templates/overrides/editorial/author-bio-hero.ninjatpl new file mode 100644 index 0000000..c8bb084 --- /dev/null +++ b/templates/overrides/editorial/author-bio-hero.ninjatpl @@ -0,0 +1,22 @@ +{# author-bio-hero (editorial) — author-page header framed by hairline rules over generous whitespace. #} +{% if author %} +
+
+{% if showAvatar and author.avatar_url %}
{% img author.avatar_url alt=author.display_name class="h-full w-full object-cover" %}
{% endif %} +
+

{{ author.display_name }}

+{% if author.job_title or author.company %}

{{ author.job_title }}{% if author.job_title and author.company %} · {% endif %}{{ author.company }}

{% endif %} +{% if author.bio %}

{{ author.bio }}

{% endif %} +
+{% if showPostCount %}{{ author.post_count|default:0 }} post{% if author.post_count != 1 %}s{% endif %}{% endif %} +{% if author.location %}{{ author.location }}{% endif %} +
+{% if showSocial %}
+{% if author.website_url %}{% endif %} +{% if author.twitter_handle %}{% endif %} +{% if author.linkedin_url %}{% endif %} +{% if author.github_url %}{% endif %} +
{% endif %} +
+
+{% endif %} diff --git a/templates/overrides/editorial/author-bio.ninjatpl b/templates/overrides/editorial/author-bio.ninjatpl new file mode 100644 index 0000000..2bd8753 --- /dev/null +++ b/templates/overrides/editorial/author-bio.ninjatpl @@ -0,0 +1,14 @@ +{# author-bio (editorial) — byline card in an editorial-panel with hairline rule and small-caps label. #} +{% if post.author_name %} + +{% endif %} diff --git a/templates/overrides/editorial/blog-hero.ninjatpl b/templates/overrides/editorial/blog-hero.ninjatpl new file mode 100644 index 0000000..6bc030e --- /dev/null +++ b/templates/overrides/editorial/blog-hero.ninjatpl @@ -0,0 +1,24 @@ +{# blog-hero (editorial) — blog-index header + featured posts from the `posts` provider; typographic, hairline rules. #} +
+
+
+{% if title %}

{{ title }}

{% endif %} +{% if subtitle %}

{{ subtitle }}

{% endif %} +
+{% if posts %} +
+{% for post in posts %} + +{% endfor %} +
+{% endif %} +
+
diff --git a/templates/overrides/editorial/breadcrumbs.ninjatpl b/templates/overrides/editorial/breadcrumbs.ninjatpl new file mode 100644 index 0000000..539674f --- /dev/null +++ b/templates/overrides/editorial/breadcrumbs.ninjatpl @@ -0,0 +1,13 @@ +{# breadcrumbs (editorial) — small-caps trail with hairline oxblood separators; current item plain. #} +{% set arrows = template == "arrows" %} + diff --git a/templates/overrides/editorial/button.ninjatpl b/templates/overrides/editorial/button.ninjatpl index 3693bb8..47e816b 100644 --- a/templates/overrides/editorial/button.ninjatpl +++ b/templates/overrides/editorial/button.ninjatpl @@ -1 +1,10 @@ -{% if text %}{% if url %}{% else %}{% endif %}{% endif %} +{# button override — hairline uppercase button; ghost/link/secondary styles render as an inline oxblood underline link. Fields: link, style, label, size, icon, iconPosition, newTab, align. #} +{% with align=align|default:"left" %} + +{% endwith %} diff --git a/templates/overrides/editorial/card.ninjatpl b/templates/overrides/editorial/card.ninjatpl new file mode 100644 index 0000000..8ba2fc4 --- /dev/null +++ b/templates/overrides/editorial/card.ninjatpl @@ -0,0 +1,4 @@ +{# card override — editorial hairline panel; accent border on hover, oxblood link. Fields mirror builtin: layout, link, media, title, text, linkLabel. Media via {% img %}. #} +{% with layout=layout|default:"vertical" %} + +{% endwith %} diff --git a/templates/overrides/editorial/category-list.ninjatpl b/templates/overrides/editorial/category-list.ninjatpl new file mode 100644 index 0000000..168f3ba --- /dev/null +++ b/templates/overrides/editorial/category-list.ninjatpl @@ -0,0 +1,18 @@ +{# category-list (editorial) — from the `categories` provider. hairline list or bordered chips. #} +{% set pills = style == "pills" %} +
+{% if heading %}

{{ heading }}

{% endif %} +{% if pills %} +
+{% for cat in categories %} +{{ cat.name }}{% if showCount %}{{ cat.post_count }}{% endif %} +{% endfor %} +
+{% else %} + +{% endif %} +
diff --git a/templates/overrides/editorial/contact-card.ninjatpl b/templates/overrides/editorial/contact-card.ninjatpl new file mode 100644 index 0000000..b70de05 --- /dev/null +++ b/templates/overrides/editorial/contact-card.ninjatpl @@ -0,0 +1,17 @@ +
+
+ {% if heading %}

{{ heading }}

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

{{ description }}

{% endif %} +
+ {% for channel in channels %} +
+ {% if channel.icon %}{% 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/editorial/contact-form.ninjatpl b/templates/overrides/editorial/contact-form.ninjatpl new file mode 100644 index 0000000..4fdae18 --- /dev/null +++ b/templates/overrides/editorial/contact-form.ninjatpl @@ -0,0 +1,43 @@ +{# contact-form override — editorial enquiry form. ALL form wiring preserved verbatim from builtin: bid, {% form %} action/hx attrs, honeypot, field loop, form.submitted/errors, submit target. Only inputs restyled to hairline editorial fields. #} +{% with bid=_block_id|default:context.blockId %} +
+
+ {% if form.submitted %} +
+
::lucide:check:lg::
+

{{ form.message|default:successMessage|default:"Thank you. Your table request has been received." }}

+
+ {% 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="mt-8 grid grid-cols-1 gap-5 sm:grid-cols-2" %} + {% 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/editorial/countdown.ninjatpl b/templates/overrides/editorial/countdown.ninjatpl new file mode 100644 index 0000000..b0fe083 --- /dev/null +++ b/templates/overrides/editorial/countdown.ninjatpl @@ -0,0 +1,48 @@ +
+
+ {% if heading %}

{{ heading }}

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

{{ intro }}

{% endif %} +
+
+
--{{ labelDays|default:"Days" }}
+
--{{ labelHours|default:"Hours" }}
+
--{{ labelMinutes|default:"Minutes" }}
+
--{{ labelSeconds|default:"Seconds" }}
+
+ +
+ +
+
+ diff --git a/templates/overrides/editorial/cta.ninjatpl b/templates/overrides/editorial/cta.ninjatpl new file mode 100644 index 0000000..8fcbd7e --- /dev/null +++ b/templates/overrides/editorial/cta.ninjatpl @@ -0,0 +1,14 @@ +
+
+
+
+ {% if heading %}

{{ heading }}

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

{{ text }}

{% endif %} +
+
+ {% if primaryUrl and primaryLabel %}{{ primaryLabel }}{% endif %} + {% if secondaryUrl and secondaryLabel %}{{ secondaryLabel }}{% endif %} +
+
+
+
diff --git a/templates/overrides/editorial/divider.ninjatpl b/templates/overrides/editorial/divider.ninjatpl new file mode 100644 index 0000000..333a1c6 --- /dev/null +++ b/templates/overrides/editorial/divider.ninjatpl @@ -0,0 +1,12 @@ +{# divider override — editorial hairline rules. Fields mirror builtin: variant (line|ornament|spacer-rule), weight, width, icon. ornament renders an icon flanked by hairline rules; spacer-rule a short centred hairline; line a full hairline rule. #} +{% with variant=variant|default:"line" weight=weight|default:"thin" width=width|default:"full" %} +{% if variant == "ornament" %} + +{% elif variant == "spacer-rule" %} + +{% else %} + +{% endif %} +{% endwith %} diff --git a/templates/overrides/editorial/event-list.ninjatpl b/templates/overrides/editorial/event-list.ninjatpl new file mode 100644 index 0000000..e5a6eec --- /dev/null +++ b/templates/overrides/editorial/event-list.ninjatpl @@ -0,0 +1,41 @@ +{# event-list override — editorial listings: hairline panels/rules, oxblood dates, Playfair titles. Fields mirror builtin: heading, intro, layout, hidePast, events[].* . #} +
+
+ {% 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 class="h-full w-full object-cover" %}
{% 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" }}{% 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/editorial/faq.ninjatpl b/templates/overrides/editorial/faq.ninjatpl new file mode 100644 index 0000000..4bdd166 --- /dev/null +++ b/templates/overrides/editorial/faq.ninjatpl @@ -0,0 +1,17 @@ +
+
+ {% if heading %}

{{ heading }}

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

{{ intro }}

{% endif %} +
+ {% for item in items %} +
+ + {{ item.question }} + + +
{{ item.answer|safe }}
+
+ {% endfor %} +
+
+
diff --git a/templates/overrides/editorial/feature-grid.ninjatpl b/templates/overrides/editorial/feature-grid.ninjatpl new file mode 100644 index 0000000..40ed9e4 --- /dev/null +++ b/templates/overrides/editorial/feature-grid.ninjatpl @@ -0,0 +1,17 @@ +
+
+ {% if eyebrow %}

{{ eyebrow }}

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

{{ heading }}

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

{{ intro }}

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

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

+ {% if item.text %}

{{ item.text }}

{% endif %} + {% if item.linkUrl and item.linkLabel %}{{ item.linkLabel }}{% endif %} +
+ {% endfor %} +
+
+
diff --git a/templates/overrides/editorial/featured-posts.ninjatpl b/templates/overrides/editorial/featured-posts.ninjatpl new file mode 100644 index 0000000..c237a52 --- /dev/null +++ b/templates/overrides/editorial/featured-posts.ninjatpl @@ -0,0 +1,24 @@ +{# featured-posts (editorial) — grid of hairline-framed cards from the `posts` provider #} +{# (params: limit, featured=true). Card: image, title, excerpt, meta. #} +
+
+{% if heading %}

{{ heading }}

{% endif %} +
+{% for post in posts %} +
+{% if showFeaturedImage and post.featured_image_url %}{% img post.featured_image_url alt=post.title class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" %}{% endif %} +
+

{{ post.title }}

+ +{% if showExcerpt and post.excerpt %}

{{ post.excerpt }}

{% endif %} +
+{% if showAuthor and post.author_name %}{{ post.author_name }}{% endif %} +{% if showDate and post.published_at %}{{ post.published_at|date:"M j, Y" }}{% endif %} +{% if post.reading_time %}{{ post.reading_time }} min read{% endif %} +
+
+
+{% endfor %} +
+
+
diff --git a/templates/overrides/editorial/footer.ninjatpl b/templates/overrides/editorial/footer.ninjatpl new file mode 100644 index 0000000..e345bdd --- /dev/null +++ b/templates/overrides/editorial/footer.ninjatpl @@ -0,0 +1,40 @@ +{# footer override — quiet editorial colophon: hairline rules, small-caps labels, address, reservations, social on a card panel. Structure/fields/signup_form preserved from builtin; reskinned to editorial. #} +{% set fl = layout %} +{% if not fl %}{% if template == "centered" %}{% set fl = "centered" %}{% else %}{% set fl = "columns" %}{% endif %}{% endif %} +{% set fbg = backgroundColor|default:"bg-card text-card-foreground" %} +{% macro sociallinks(cls) %}{% if social_items %}{% endif %}{% endmacro %} +{% macro newsletter() %}{% if showNewsletter %}

{{ newsletterTitle|default:"Join the guest list" }}

{% if newsletterDescription %}

{{ newsletterDescription }}

{% endif %}
{% signup_form list=newsletterListSlug|default:"main" source="footer" submit=newsletterButtonText|default:"Subscribe" %}
{% endif %}{% endmacro %} +{% macro legalbar() %}

{% if copyright %}© {{ copyright }}{% else %}© {{ companyName }}{% endif %}

{% if legal_items %}{% endif %}
{% endmacro %} +
+
+{% if fl == "minimal" %} +
+
{% if logo %}{{ companyName }}{% elif companyName %}{{ companyName }}{% endif %}{% if tagline %}{% endif %}
+{{ sociallinks("") }} +
+{{ legalbar() }} +{% elif fl == "centered" %} +
+{% if logo %}{{ companyName }}{% elif companyName %}{{ companyName }}{% endif %} + +{% if tagline %}

{{ tagline }}

{% endif %} +{% if columns %}{% endif %} +{{ newsletter() }} +{{ sociallinks("justify-center") }} +
+{{ legalbar() }} +{% else %} +
+
+{% if logo %}{{ companyName }}{% elif companyName %}{{ companyName }}{% endif %} +{% if tagline %}

{{ tagline }}

{% endif %} +{% if address or email or phone %}
{% if address %}
{{ address }}
{% endif %}{% if email %}{% endif %}{% if phone %}{% endif %}
{% endif %} +{{ sociallinks("mt-5") }} +
+{% for col in columns %}

{{ col.header }}

{% endfor %} +{% if showNewsletter %}
{{ newsletter() }}
{% endif %} +
+{{ legalbar() }} +{% endif %} +
+
diff --git a/templates/overrides/editorial/gallery.ninjatpl b/templates/overrides/editorial/gallery.ninjatpl new file mode 100644 index 0000000..8943898 --- /dev/null +++ b/templates/overrides/editorial/gallery.ninjatpl @@ -0,0 +1,52 @@ +{# gallery override — editorial grid: plain hairline framing, generous whitespace, unchanged lightbox. Fields + lightbox JS mirror builtin verbatim: layout, gap, columns, lightbox, images[].src/.alt/.caption. #} +{% with layout=layout|default:"grid" gap=gap|default:"md" cols=columns|default:3 %}{% if lightbox %}{% endif %}{% endwith %} diff --git a/templates/overrides/editorial/heading.ninjatpl b/templates/overrides/editorial/heading.ninjatpl index 067e99e..620b1a6 100644 --- a/templates/overrides/editorial/heading.ninjatpl +++ b/templates/overrides/editorial/heading.ninjatpl @@ -1 +1,7 @@ -{% if level|integer == 1 %}
{% if kicker %}{{ kicker }}{% endif %}

{{ text }}

{% elif level|integer == 3 %}

{{ text }}

{% elif level|integer == 4 %}

{{ text }}

{% elif level|integer == 5 %}
{{ text }}
{% elif level|integer == 6 %}
{{ text }}
{% else %}

{{ text }}

{% endif %} +{# heading override — editorial display serif with a hairline underline. Fields: text, level, textClass (mirrors builtin). #} +{% if level == 1 %}

{{ text }}

+{% elif level == 3 %}

{{ text }}

+{% elif level == 4 %}

{{ text }}

+{% elif level == 5 %}
{{ text }}
+{% elif level == 6 %}
{{ text }}
+{% else %}

{{ text }}

{% endif %} diff --git a/templates/overrides/editorial/hero.ninjatpl b/templates/overrides/editorial/hero.ninjatpl new file mode 100644 index 0000000..fc6394e --- /dev/null +++ b/templates/overrides/editorial/hero.ninjatpl @@ -0,0 +1,39 @@ +{# hero override — editorial masthead: hairline eyebrow rules, small-caps Playfair headline, roomy reading measure. Structure/fields/{% img %} calls preserved from builtin. Styled-text fields accept {text,color} or a bare string. #} +{% 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" %} +{% set hasImage = backgroundImage %} +{% set showOverlay = hasImage and overlayColor != "none" and overlayColor != "" %} +{% macro herocontent(align) %} +{% 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 %}
+

Acclaim

+
{% for logo in trustLogos %}{% if logo.url %}{% img logo.image alt=logo.alt class="h-8 w-auto" %}{% else %}{% img logo.image alt=logo.alt class="h-8 w-auto opacity-60" %}{% endif %}{% endfor %}
+
{% endif %} +{% endmacro %} +{% if variant == "split" %} +
+
{% if hasImage %}{% img backgroundImage alt=headlineText class="absolute inset-0 h-full w-full object-cover" layout="hero" %}{% endif %}
+
{{ herocontent("left") }}
+
+{% else %} +{% set align = "center" %} +{% if variant == "left-aligned" %}{% set align = "left" %}{% endif %} +
+{% if hasImage %}
{% img backgroundImage alt=headlineText class="h-full w-full object-cover" layout="hero" %}{% if showOverlay %}
{% endif %}
{% endif %} +
{{ herocontent(align) }}
+
+{% endif %} diff --git a/templates/overrides/editorial/hours-location.ninjatpl b/templates/overrides/editorial/hours-location.ninjatpl new file mode 100644 index 0000000..6c125be --- /dev/null +++ b/templates/overrides/editorial/hours-location.ninjatpl @@ -0,0 +1,31 @@ +{# hours-location override (editorial) — typographic hours ledger + hairline-framed map. Map facade + + {% endif %} + + + diff --git a/templates/overrides/editorial/image.ninjatpl b/templates/overrides/editorial/image.ninjatpl index 8769d22..4d4c7fe 100644 --- a/templates/overrides/editorial/image.ninjatpl +++ b/templates/overrides/editorial/image.ninjatpl @@ -1 +1,11 @@ -{% if src %}
{{ alt }}{% if caption %}
{{ caption }}
{% endif %}
{% endif %} +{# image override — plain editorial plate, no ornament frame. Fields mirror builtin: src, alt, caption, size, align, aspectRatio, objectFit. Media resolved via {% img %} (media filter is not registered in the block render path). #} +{% with size=size|default:"full" align=align|default:"center" objectFit=objectFit|default:"cover" %} +
+
+
+ {% if objectFit == "contain" %}{% img src alt=alt class="w-full h-full object-contain" layout=size %}{% elif objectFit == "fill" %}{% img src alt=alt class="w-full h-full object-fill" layout=size %}{% elif objectFit == "none" %}{% img src alt=alt class="w-full h-full object-none" layout=size %}{% else %}{% img src alt=alt class="w-full h-full object-cover" layout=size %}{% endif %} +
+
+ {% if caption %}
{{ caption }}
{% endif %} +
+{% endwith %} diff --git a/templates/overrides/editorial/logo-strip.ninjatpl b/templates/overrides/editorial/logo-strip.ninjatpl new file mode 100644 index 0000000..0c6721b --- /dev/null +++ b/templates/overrides/editorial/logo-strip.ninjatpl @@ -0,0 +1,15 @@ +
+
+ {% if heading %}

{{ heading }}

{% endif %} +
+
+ {% for logo in logos %} + {% if logo.url %}{% endif %} + {% img logo.image alt=logo.alt class="h-8 w-auto object-contain" %} + {% if logo.url %}{% endif %} + {% endfor %} +
+
+
+
+{% if marquee %}{% endif %} diff --git a/templates/overrides/editorial/menu-list.ninjatpl b/templates/overrides/editorial/menu-list.ninjatpl new file mode 100644 index 0000000..65c78c4 --- /dev/null +++ b/templates/overrides/editorial/menu-list.ninjatpl @@ -0,0 +1,30 @@ +{# menu-list override — editorial menu: Playfair section titles, hairline leader rules, generous columns. Fields mirror builtin: heading, intro, columns, sections[].title/.note/.items[].name/.badges/.description/.price, currency, footnote. #} +
+
+ {% if heading %}

{{ heading }}

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

{{ intro }}

{% endif %} + +
+ {% for section in sections %} + + {% endfor %} +
+ {% if footnote %}

{{ footnote }}

{% endif %} +
+
diff --git a/templates/overrides/editorial/navbar.ninjatpl b/templates/overrides/editorial/navbar.ninjatpl new file mode 100644 index 0000000..6289f28 --- /dev/null +++ b/templates/overrides/editorial/navbar.ninjatpl @@ -0,0 +1,104 @@ +{# navbar override — editorial masthead. Structure, fixed drawer ids, focus-trap JS and all data-* preserved verbatim from the builtin; presentation reskinned to editorial (hairline rules, small-caps labels). Fields identical: variant/stickyBehavior/megaMenu/logoType/logoText/logo/companyName/cta/menu.items/... #} +{% set nv = variant %} +{% if not nv %}{% if template == "centered" %}{% set nv = "centered-logo" %}{% elif template == "transparent" %}{% set nv = "transparent-over-hero" %}{% else %}{% set nv = "standard" %}{% endif %}{% endif %} +{% set sb = stickyBehavior %} +{% if not sb %}{% if sticky %}{% set sb = "sticky" %}{% else %}{% set sb = "none" %}{% endif %}{% endif %} +{% set use_mega = megaMenu or template == "mega" %} +{% set is_transparent = nv == "transparent-over-hero" %} +{% set cta_text = cta.text|default:ctaLabel %} +{% set cta_url = cta.url|default:ctaUrl %} +{% set bg = backgroundColor|default:"bg-background" %} +{% macro navlink(item) %}{{ item.label }}{% endmacro %} +{% macro dropdown(item) %}
+ +{% if use_mega %} +{% else %}{% endif %} +
{% endmacro %} +{% macro brand(size) %}{% if logoType == "text" and logoText.text %}{{ logoText.text }}{% elif logo %}{{ alt|default:companyName }}{% elif companyName %}{{ companyName }}{% endif %}{% endmacro %} +{% macro ctabtn(extra) %}{% if cta_text %}{{ cta_text }}{% endif %}{% endmacro %} + + + diff --git a/templates/overrides/editorial/newsletter-signup.ninjatpl b/templates/overrides/editorial/newsletter-signup.ninjatpl new file mode 100644 index 0000000..bcc1b23 --- /dev/null +++ b/templates/overrides/editorial/newsletter-signup.ninjatpl @@ -0,0 +1,13 @@ +{# newsletter-signup (editorial) — the {% signup_form %} tag carries the #} +{# untouchable subscribe wiring (/api/lists/subscribe HTMX post + honeypot); #} +{# this template wraps it in a quiet editorial-panel — no loud filled band. #} +
+
+
+
+{% 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/editorial/page-suggestions.ninjatpl b/templates/overrides/editorial/page-suggestions.ninjatpl new file mode 100644 index 0000000..14c8d33 --- /dev/null +++ b/templates/overrides/editorial/page-suggestions.ninjatpl @@ -0,0 +1,21 @@ +{# page-suggestions (editorial) — 404 suggestions with underlined heading and oxblood markers. Fields: title, showDescription, emptyMessage; suggestions[] (.slug/.title/.excerpt). #} +{% if suggestions %} +
+ {% if title %}

{{ title }}

{% endif %} +
    + {% for suggestion in suggestions %} +
  • + ::lucide:chevron-right:sm:: +
    + {{ suggestion.title }} + {% if showDescription and suggestion.excerpt %}

    {{ suggestion.excerpt }}

    {% endif %} +
    +
  • + {% endfor %} +
+
+{% elif emptyMessage %} +
+

{{ emptyMessage }}

+
+{% endif %} diff --git a/templates/overrides/editorial/password-reset-form.ninjatpl b/templates/overrides/editorial/password-reset-form.ninjatpl new file mode 100644 index 0000000..6d6b6d4 --- /dev/null +++ b/templates/overrides/editorial/password-reset-form.ninjatpl @@ -0,0 +1,13 @@ +{# password-reset-form (editorial) — request stage in an editorial-panel with small-caps label. Wiring UNTOUCHABLE: /api/auth/request-password-reset (email), hx-target #reset-message. #} +
+
+
+

Reset password

+

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

+
+
+ +
+

Back to sign in

+
+
diff --git a/templates/overrides/editorial/popular-posts.ninjatpl b/templates/overrides/editorial/popular-posts.ninjatpl new file mode 100644 index 0000000..f9d79f2 --- /dev/null +++ b/templates/overrides/editorial/popular-posts.ninjatpl @@ -0,0 +1,16 @@ +{# popular-posts (editorial) — compact ranked list from the `posts` provider, hairline-ruled. #} +
+{% if heading %}

{{ heading }}

{% endif %} +
    +{% for post in posts %} +
  1. +{% if showRank %}{{ forloop.Counter }}{% endif %} +{% if showThumbnail and post.featured_image_url %}{% img post.featured_image_url alt=post.title class="h-full w-full object-cover" %}{% endif %} +
    +

    {{ post.title }}

    +{% if post.published_at %}

    {{ post.published_at|date:"M j, Y" }}

    {% endif %} +
    +
  2. +{% endfor %} +
+
diff --git a/templates/overrides/editorial/post-hero.ninjatpl b/templates/overrides/editorial/post-hero.ninjatpl new file mode 100644 index 0000000..ecd22d3 --- /dev/null +++ b/templates/overrides/editorial/post-hero.ninjatpl @@ -0,0 +1,23 @@ +{# post-hero (editorial) — current post from the `post` provider. When the post #} +{# has a featured image it becomes an overlaid banner; otherwise a clean text hero. #} +{% set center = align != "left" %} +{% if post.featured_image_url %} +
+
{% img post.featured_image_url alt=post.featured_image_alt class="h-full w-full object-cover" layout="hero" %}
+
+{% if center %}
{% endif %} +

{{ post.title }}

+{% if showExcerpt and post.excerpt %}

{{ post.excerpt }}

{% endif %} +{% if showMeta %}
{% if post.author_name %}{{ post.author_name }}{% endif %}{% if post.published_at %}{{ post.published_at|date:"F j, Y" }}{% endif %}{% if post.reading_time %}{{ post.reading_time }} min read{% endif %}
{% endif %} +
+
+{% else %} +
+
+{% if center %}
{% endif %} +

{{ post.title }}

+{% if showExcerpt and post.excerpt %}

{{ post.excerpt }}

{% endif %} +{% if showMeta %}
{% if post.author_name %}{{ post.author_name }}{% endif %}{% if post.published_at %}{{ post.published_at|date:"F j, Y" }}{% endif %}{% if post.reading_time %}{{ post.reading_time }} min read{% endif %}
{% endif %} +
+
+{% endif %} diff --git a/templates/overrides/editorial/post-metadata.ninjatpl b/templates/overrides/editorial/post-metadata.ninjatpl new file mode 100644 index 0000000..085d1ee --- /dev/null +++ b/templates/overrides/editorial/post-metadata.ninjatpl @@ -0,0 +1,9 @@ +{# post-metadata (editorial) — author/date/reading-time row from the `post` provider, hairline chips. #} +{% if post %} +
+{% if showAuthor and post.author_name %}{% if showAvatar and post.author_avatar %}{% img post.author_avatar alt=post.author_name class="h-7 w-7 rounded-full object-cover ring-1 ring-[hsl(var(--border))]" %}{% endif %}{{ post.author_name }}{% endif %} +{% if showDate and post.published_at %}{% endif %} +{% if showReadingTime and post.reading_time %}{{ post.reading_time }} min read{% endif %} +{% if post.categories %}{% for cat in post.categories %}{{ cat.name }}{% endfor %}{% endif %} +
+{% endif %} diff --git a/templates/overrides/editorial/pricing.ninjatpl b/templates/overrides/editorial/pricing.ninjatpl new file mode 100644 index 0000000..d7bc788 --- /dev/null +++ b/templates/overrides/editorial/pricing.ninjatpl @@ -0,0 +1,25 @@ +
+
+ {% if heading %}

{{ heading }}

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

{{ intro }}

{% endif %} +
+ {% for tier in tiers %} +
+ {% if tier.badge %}{{ tier.badge }}{% endif %} +

{{ tier.name }}

+
+

+ {% if currency %}{{ currency }}{% else %}${% endif %}{{ tier.price }} + {% if tier.period %}{{ tier.period }}{% endif %} +

+ {% if tier.description %}

{{ tier.description }}

{% endif %} + {% if tier.features %}
    + {% for feature in tier.features %}
  • {{ feature }}
  • {% endfor %} +
{% endif %} + {% if tier.ctaUrl and tier.ctaLabel %}{% if tier.highlighted %}{{ tier.ctaLabel }}{% else %}{{ tier.ctaLabel }}{% endif %}{% endif %} +
+ {% endfor %} +
+ {% if billingNote %}

{{ billingNote }}

{% endif %} +
+
diff --git a/templates/overrides/editorial/quote.ninjatpl b/templates/overrides/editorial/quote.ninjatpl new file mode 100644 index 0000000..2a16b9d --- /dev/null +++ b/templates/overrides/editorial/quote.ninjatpl @@ -0,0 +1,8 @@ +{# quote override — editorial pull-quote: large italic Source Serif, hairline panel or oxblood accent rule; centred quotes get a short centred hairline. Fields mirror builtin: quote, style, align, cite, attribution, role. #} +{% with style=style|default:"block" align=align|default:"left" %} +
+ {% if align == "center" %}{% endif %} + {{ quote|safe }} + {% if attribution or role or cite %}
{% if attribution %}{{ attribution }}{% endif %}{% if role %}{{ role }}{% endif %}{% if cite %}Source{% endif %}
{% endif %} +
+{% endwith %} diff --git a/templates/overrides/editorial/related-posts.ninjatpl b/templates/overrides/editorial/related-posts.ninjatpl new file mode 100644 index 0000000..2f0fee7 --- /dev/null +++ b/templates/overrides/editorial/related-posts.ninjatpl @@ -0,0 +1,17 @@ +{# related-posts (editorial) — hairline-topped grid from the `posts` provider. #} +{% if posts %} +
+
+

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

+
+{% for post in posts %} + +{% endfor %} +
+
+
+{% endif %} diff --git a/templates/overrides/editorial/rich-section.ninjatpl b/templates/overrides/editorial/rich-section.ninjatpl new file mode 100644 index 0000000..77f56aa --- /dev/null +++ b/templates/overrides/editorial/rich-section.ninjatpl @@ -0,0 +1,13 @@ +
+
+
+ {% if eyebrow %}

{{ eyebrow }}

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

{{ heading }}

{% endif %} + {% if body %}
{{ body|safe }}
{% endif %} + {% if ctaUrl and ctaLabel %}{{ ctaLabel }}{% endif %} +
+
+ {% if media %}
{% img media alt=mediaAlt class="w-full h-auto object-cover" %}
{% endif %} +
+
+
diff --git a/templates/overrides/editorial/rich-text.ninjatpl b/templates/overrides/editorial/rich-text.ninjatpl new file mode 100644 index 0000000..4ee4eb8 --- /dev/null +++ b/templates/overrides/editorial/rich-text.ninjatpl @@ -0,0 +1,2 @@ +{# rich-text override — long-form Source Serif editorial column with oxblood links and hairline blockquotes. Field: html (mirrors builtin). #} +{% if html %}
{{ html|safe }}
{% endif %} diff --git a/templates/overrides/editorial/sidebar-nav.ninjatpl b/templates/overrides/editorial/sidebar-nav.ninjatpl new file mode 100644 index 0000000..800c4dc --- /dev/null +++ b/templates/overrides/editorial/sidebar-nav.ninjatpl @@ -0,0 +1,13 @@ +{# sidebar-nav (editorial) — small-caps vertical menu with hairline divider rule and oxblood link/icon accents. #} +{% set compact = template == "compact" %} + +{% if highlightCurrent %}{% endif %} diff --git a/templates/overrides/editorial/social-links.ninjatpl b/templates/overrides/editorial/social-links.ninjatpl new file mode 100644 index 0000000..c5998c6 --- /dev/null +++ b/templates/overrides/editorial/social-links.ninjatpl @@ -0,0 +1,13 @@ + diff --git a/templates/overrides/editorial/stats.ninjatpl b/templates/overrides/editorial/stats.ninjatpl new file mode 100644 index 0000000..d5945e2 --- /dev/null +++ b/templates/overrides/editorial/stats.ninjatpl @@ -0,0 +1,48 @@ +
+
+ {% if heading %}

{{ heading }}

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

{{ intro }}

{% endif %} +
+ {% 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 %} +
+
+
+{% if countUp %}{% endif %} diff --git a/templates/overrides/editorial/team.ninjatpl b/templates/overrides/editorial/team.ninjatpl new file mode 100644 index 0000000..aabb213 --- /dev/null +++ b/templates/overrides/editorial/team.ninjatpl @@ -0,0 +1,21 @@ +
+
+ {% if heading %}

{{ heading }}

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

{{ intro }}

{% endif %} +
+ {% for member in members %} +
+ {% if member.photo %}{% img member.photo alt=member.name class="h-full w-full object-cover" %}{% 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 %}{% endif %}{% endfor %} +
{% endif %} +
+
+ {% endfor %} +
+
+
diff --git a/templates/overrides/editorial/testimonial.ninjatpl b/templates/overrides/editorial/testimonial.ninjatpl new file mode 100644 index 0000000..fbc6829 --- /dev/null +++ b/templates/overrides/editorial/testimonial.ninjatpl @@ -0,0 +1,27 @@ +
+
+ {% if heading %}

{{ heading }}

{% endif %} +
+ {% for q in quotes %} +
+ {% if q.rating %}
+ + + + + +
{% endif %} +
{% if q.quote %}“{{ q.quote }}”{% endif %}
+
+
+ {% if q.avatar %}{% img q.avatar alt=q.name class="h-full w-full object-cover" %}{% endif %} + + {% if q.name %}{{ q.name }}{% endif %} + {% if q.role %}{{ q.role }}{% endif %} + +
+
+ {% endfor %} +
+
+
diff --git a/templates/overrides/editorial/text.ninjatpl b/templates/overrides/editorial/text.ninjatpl index 806161a..44dc43f 100644 --- a/templates/overrides/editorial/text.ninjatpl +++ b/templates/overrides/editorial/text.ninjatpl @@ -1 +1,2 @@ -
{{ text|safe }}
+{# text override — Source Serif reading measure with oxblood underlined links. Fields: text, proseClass (mirrors builtin). Dropcap is reserved for the article template, not forced on every text block. #} +
{{ text|safe }}
diff --git a/templates/overrides/editorial/timeline.ninjatpl b/templates/overrides/editorial/timeline.ninjatpl new file mode 100644 index 0000000..6d05a05 --- /dev/null +++ b/templates/overrides/editorial/timeline.ninjatpl @@ -0,0 +1,21 @@ +
+
+ {% if heading %}

{{ heading }}

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

{{ intro }}

{% endif %} +
    + {% for step in steps %} +
  1. + + {% if marker == "numbered" %}{{ forloop.counter }}{% elif marker == "dot" %}{% else %}{% 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="w-full h-auto object-cover" %}
    {% endif %} +
    +
  2. + {% endfor %} +
+
+
diff --git a/templates/overrides/editorial/utility-bar.ninjatpl b/templates/overrides/editorial/utility-bar.ninjatpl new file mode 100644 index 0000000..fa18812 --- /dev/null +++ b/templates/overrides/editorial/utility-bar.ninjatpl @@ -0,0 +1,10 @@ +{# utility-bar override — quiet contact strip on a hairline-bordered panel, small-caps labels. Fields mirror builtin: variant, showOnMobile, leftItems/rightItems {icon,label,link}. #} +{% set ubcls = "editorial-panel" %} +{% if variant == "primary" %}{% set ubcls = "editorial-panel" %}{% elif variant == "dark" %}{% set ubcls = "editorial-panel" %}{% endif %} +{% macro ubitem(it) %}{% if it.link %}{% if it.icon %}::{{ it.icon }}::{% endif %}{% if it.label %}{{ it.label }}{% endif %}{% else %}{% if it.icon %}::{{ it.icon }}::{% 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/editorial/video-embed.ninjatpl b/templates/overrides/editorial/video-embed.ninjatpl new file mode 100644 index 0000000..fc6faae --- /dev/null +++ b/templates/overrides/editorial/video-embed.ninjatpl @@ -0,0 +1,23 @@ +{# video-embed override — editorial hairline frame; oxblood play medallion. Fields + facade JS mirror builtin verbatim: aspect, url, media, poster, title, caption. #} +{% with aspect=aspect|default:"16:9" %}
{% if caption %}
{{ caption }}
{% endif %}
{% endwith %}