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>
256 lines
12 KiB
JSON
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 }
|
|
]
|
|
}
|