themes-gotham/seed/seed.json
Alex Dunmow 8da60d7d5a feat(gotham): Wave A theme-fleet rework — nightlife/private-club identity (WO-TF-018)
Re-skin gotham to the locked nightlife / private members' club persona:
cinematic near-black luxe, brass hairline accents, letterboxed heroes and
tall condensed display type. Codeless .bnp; MID motion tier (JS effects, no
canvas), prefers-reduced-motion honored, no-JS fallback.

- 49 mandatory builtin overrides in templates/overrides/gotham/ (chrome,
  marketing, primitives, commerce/local, blog family, auth surface, 404).
  Field reads, provider fields, form wiring and block JS preserved verbatim
  from the frozen builtins (cms a0f07e2ae); only presentation reskinned.
- 8 page templates (default, landing, article, full-width, blog-index,
  contact, auth + retained centered), dual-mode via theme_mode.
- 4 persona blocks: door_strip, events_marquee, membership_tiers, bottle_menu.
  Removed old theme blocks that duplicated builtins (hero, stats, features,
  footer) — now overrides.
- 5 dual-mode presets (all 19 tokens, light + dark intentional).
- Bundled OFL woff2: Antonio (heading), Cormorant Garamond (body), Inter
  (meta), IBM Plex Mono (mono); all font-family via var(--font-*).
- Themed email-safe wrapper, master pages, seed demo (home/about/blog x3/
  contact+workflow/login) in private-club voice.
- Gotham utility CSS (reel-*, film-grain, spotlight, letterbox-scrim, reveal)
  via manifest css.input_css_append; semantic color tokens only.
- plugin.mod kind="theme", required_icon_packs=["lucide"]; *.bnp gitignored.

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

256 lines
12 KiB
JSON

{
"demo": true,
"settings": {
"merge": {
"companyName": "Gotham House",
"tagline": "A members' club after dark."
}
},
"data_tables": [
{
"key": "contact_submissions",
"name": "Door Enquiries",
"description": "Seeded contact-form submissions for the Gotham House 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": "party", "label": "Party size", "type": "text", "required": false },
{ "key": "message", "label": "Message", "type": "text", "required": true }
]
}
],
"pages": [
{
"slug": "/",
"title": "Gotham House",
"template_key": "landing",
"blocks": [
{
"block_key": "hero",
"title": "Hero",
"slot": "main",
"sort_order": 1,
"content": {
"template": "centered",
"minHeight": "75vh",
"eyebrow": "Members only",
"headline": "Gotham House",
"subheadline": "A members' club after dark.",
"description": "Late rooms, a long bar and a short guest list. Doors from nine, Thursday to Sunday. Bring your card.",
"ctaPrimary": { "text": "Request the guest list", "url": "/contact" },
"ctaSecondary": { "text": "See the programme", "url": "#programme" }
}
},
{
"block_key": "gotham:events_marquee",
"title": "Programme",
"slot": "main",
"sort_order": 2,
"content": {
"eyebrow": "The programme",
"title": "Tonight and after",
"events": [
{ "date": "Thu", "name": "Late Set", "room": "Main Room", "note": "Resident selectors. Slow start, long finish.", "url": "/contact" },
{ "date": "Fri", "name": "The Gilt Sessions", "room": "The Brass Room", "note": "House and disco on the good system.", "url": "/contact" },
{ "date": "Sat", "name": "Members' Night", "room": "Whole House", "note": "Card on the door. No list, no entry.", "url": "/contact" },
{ "date": "Sun", "name": "Last Pour", "room": "The Cellar Bar", "note": "Quiet room. Records and a nightcap.", "url": "/contact" }
]
}
},
{
"block_key": "gotham:membership_tiers",
"title": "Membership",
"slot": "main",
"sort_order": 3,
"content": {
"eyebrow": "Membership",
"title": "Join the house",
"intro": "Two ways in. Both start at the door.",
"tiers": [
{
"name": "House",
"price": "$40",
"cadence": "/ month",
"description": "The standard card. Enough for most nights.",
"featured": false,
"applyLabel": "Apply",
"applyUrl": "/contact",
"features": [
{ "label": "Priority on the guest list" },
{ "label": "The main room and the cellar bar" },
{ "label": "Two guests a night" }
]
},
{
"name": "Brass",
"price": "$120",
"cadence": "/ month",
"description": "The full card. Every room, every night.",
"featured": true,
"applyLabel": "Apply",
"applyUrl": "/contact",
"features": [
{ "label": "Everything in House" },
{ "label": "The Brass Room and private booths" },
{ "label": "First call on bottle service" },
{ "label": "Four guests a night" }
]
}
]
}
},
{
"block_key": "gotham:bottle_menu",
"title": "Bottle service",
"slot": "main",
"sort_order": 4,
"content": {
"eyebrow": "The cellar",
"title": "Bottle service",
"footnote": "Booths hold six. Ask the host for the full list.",
"sections": [
{
"title": "Champagne",
"items": [
{ "name": "House brut", "note": "By the glass or the bottle.", "price": "$95" },
{ "name": "Vintage rose", "note": "A short shelf. Ask first.", "price": "$180" }
]
},
{
"title": "Spirits",
"items": [
{ "name": "Aged rye", "note": "Neat, one large cube.", "price": "$140" },
{ "name": "Single malt", "note": "Islay. Bring water.", "price": "$160" }
]
}
]
}
},
{
"block_key": "cta",
"title": "Closing CTA",
"slot": "cta",
"sort_order": 1,
"content": {
"background": "band",
"heading": "The list closes at nine",
"text": "Send your name and party. We reply the same day.",
"primaryLabel": "Request the guest list",
"primaryUrl": "/contact"
}
}
]
},
{
"slug": "/about",
"title": "The House",
"template_key": "default",
"blocks": [
{ "block_key": "heading", "title": "Heading", "slot": "main", "sort_order": 1, "content": { "text": "The House", "level": 1 } },
{ "block_key": "rich-text", "title": "Story", "slot": "main", "sort_order": 2, "content": { "html": "<p>Gotham House keeps late hours behind an unmarked door. We run four nights a week and hold the rest of the week back.</p><p>The rooms are dark by design. The bar is long. The list is short. Members come first, and their guests come with them.</p>" } },
{ "block_key": "divider", "title": "Divider", "slot": "main", "sort_order": 3, "content": { "variant": "ornament", "icon": "lucide:diamond" } },
{ "block_key": "quote", "title": "Quote", "slot": "main", "sort_order": 4, "content": { "style": "block", "align": "center", "quote": "Come late. Stay later.", "attribution": "The House" } }
]
},
{
"slug": "/blog",
"title": "The Journal",
"template_key": "blog-index",
"blocks": [
{ "block_key": "card", "title": "Post: The Door", "slot": "main", "sort_order": 1, "content": { "layout": "vertical", "title": "How the door works", "text": "<p>The list, the card and the guests. What to send and when.</p>", "link": "/blog/how-the-door-works", "linkLabel": "Read on" } },
{ "block_key": "card", "title": "Post: A Night", "slot": "main", "sort_order": 2, "content": { "layout": "vertical", "title": "A night at the house", "text": "<p>From the first pour to the last record. How the evening runs.</p>", "link": "/blog/a-night-at-the-house", "linkLabel": "Read on" } },
{ "block_key": "card", "title": "Post: The Cellar", "slot": "main", "sort_order": 3, "content": { "layout": "vertical", "title": "Notes from the cellar", "text": "<p>What we pour after midnight and why the list stays short.</p>", "link": "/blog/notes-from-the-cellar", "linkLabel": "Read on" } }
]
},
{
"slug": "/blog/how-the-door-works",
"title": "How the door works",
"template_key": "article",
"parent_slug": "/blog",
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "How the door works", "level": 1 } },
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>Send your name and party by nine. We hold the list until then and reply the same day.</p><p>Members lead. Guests come with them, and there is a cap. Bring your card. The door checks it.</p>" } }
]
},
{
"slug": "/blog/a-night-at-the-house",
"title": "A night at the house",
"template_key": "article",
"parent_slug": "/blog",
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "A night at the house", "level": 1 } },
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>Doors open at nine. The first set starts slow. The main room fills after eleven and holds until the lights come up.</p><p>The cellar bar stays quiet. That is the point. Records, a nightcap and the last pour.</p>" } }
]
},
{
"slug": "/blog/notes-from-the-cellar",
"title": "Notes from the cellar",
"template_key": "article",
"parent_slug": "/blog",
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Notes from the cellar", "level": 1 } },
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>The list is short by choice. We pour champagne by the glass, keep a bench of rye and hold a small shelf for members who ask.</p><p>Tell the host what you are drinking. The rest follows.</p>" } }
]
},
{
"slug": "/contact",
"title": "The Door",
"template_key": "contact",
"blocks": [
{
"block_key": "contact-form",
"title": "Guest List Enquiry",
"slot": "main",
"sort_order": 1,
"content": {
"heading": "Request the guest list",
"description": "Send your name, the night and the party. We reply the same day.",
"submitLabel": "Send to the door",
"successMessage": "Thank you. Your name is with the door. We will reply by email.",
"fields": [
{ "name": "name", "label": "Your name", "type": "text", "required": true, "width": "half" },
{ "name": "email", "label": "Email", "type": "email", "required": true, "width": "half" },
{ "name": "party", "label": "Party size", "type": "text", "required": false, "width": "half" },
{ "name": "message", "label": "Which night, and any notes", "type": "textarea", "required": true, "width": "full" }
],
"formConfig": { "enabled": true, "captchaEnabled": false, "targetTable": "contact_submissions" }
}
},
{
"block_key": "hours-location",
"title": "Door & Hours",
"slot": "aside",
"sort_order": 1,
"content": {
"heading": "The Door",
"hours": [
{ "day": "Thursday", "hours": "9pm to late" },
{ "day": "Friday to Saturday", "hours": "9pm to 4am" },
{ "day": "Sunday", "hours": "9pm to 2am" },
{ "day": "Monday to Wednesday", "closed": true }
],
"specialHoursNote": "Members' Night runs Saturday. Card on the door.",
"address": "1 Vane Court\nThe Old Quarter",
"phone": "+1 555 0139"
}
}
]
},
{
"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 book priority nights and private booths.</p>" } }
]
}
],
"menu_items": [
{ "menu": "main", "label": "Home", "page_slug": "/", "sort_order": 1 },
{ "menu": "main", "label": "The House", "page_slug": "/about", "sort_order": 2 },
{ "menu": "main", "label": "The Journal", "page_slug": "/blog", "sort_order": 3 },
{ "menu": "main", "label": "The Door", "page_slug": "/contact", "sort_order": 4 }
]
}