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 <noreply@anthropic.com>
197 lines
13 KiB
JSON
197 lines
13 KiB
JSON
{
|
|
"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": "<p>What it costs to look at one thing for a long time, and what it gives back.</p>", "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": "<p>A case for reading less, and reading it twice.</p>", "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": "<p>Small habits that keep the world from going quiet.</p>", "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": "<p>The Margin is a newsletter by Frances Hale. It is about reading, attention, and the slow work of noticing.</p><p>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.</p><p>You can read the archive for free. Members get the full run and the occasional letter.</p>" } },
|
|
{ "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": "<p>What it costs to look at one thing for a long time, and what it gives back. The lead essay this issue.</p>", "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": "<p>A case for reading less, and reading it twice.</p>", "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": "<p>Small habits that keep the world from going quiet.</p>", "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": "<p>Where the real writing happens, once the first draft is out of the way.</p>", "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": "<p>By Frances Hale. Issue 12.</p>" } },
|
|
{ "block_key": "editorial:dropcap_intro", "title": "Lead", "slot": "main", "sort_order": 1, "content": { "lead": "<p>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.</p>" } },
|
|
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>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.</p><p>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.</p><p>What you get back is not efficiency. It is the world, a little louder than before.</p>" } },
|
|
{ "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": "<p>By Frances Hale. Issue 11.</p>" } },
|
|
{ "block_key": "editorial:dropcap_intro", "title": "Lead", "slot": "main", "sort_order": 1, "content": { "lead": "<p>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.</p>" } },
|
|
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>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.</p><p>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.</p>" } },
|
|
{ "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": "<p>By Frances Hale. Issue 10.</p>" } },
|
|
{ "block_key": "editorial:dropcap_intro", "title": "Lead", "slot": "main", "sort_order": 1, "content": { "lead": "<p>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.</p>" } },
|
|
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>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.</p><p>Carry a small notebook. Write the thing down before you explain it to yourself. The explanation can wait.</p><p>None of this is hard. That is what makes it easy to skip. Do it anyway, and the days stop blurring together.</p>" } },
|
|
{ "block_key": "editorial:field_notes", "title": "Field notes", "slot": "main", "sort_order": 3, "content": { "title": "Field notes", "notes": [ { "date": "March 14", "note": "<p>A heron on the river wall, standing so still I mistook it for a post.</p>" }, { "date": "March 9", "note": "<p>The bakery changed its bread and told no one. I noticed on the second bite.</p>" } ] } },
|
|
{ "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": "<p>Members get the full archive and the occasional letter.</p>" } }
|
|
]
|
|
}
|
|
],
|
|
"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 }
|
|
]
|
|
}
|