Alex Dunmow df6ed78281 feat(kindergarten): Wave A theme lane (WO-TF-019) — 49 overrides, 7 templates, GO-BIG mascot hero
Preschool / daycare identity: crayon borders, sticker badges, confetti, and a
dependency-free bouncing-mascot + confetti-canvas hero showpiece (hero/landing
only, lazy-init, prefers-reduced-motion honored, static no-JS fallback).

- All 49 mandatory builtin overrides (OVERRIDE-CONTRACT §1), field-correct
  against the frozen cms builtins, re-skinned to the crayon design system.
  Legacy button (label/link/style) and card (text/media) field reads reconciled.
- 7 page templates: default, full-width, landing, article, blog-index, contact,
  auth — standard header/main/footer slots, dotted-paper chrome, dual-mode.
- Blocks reworked: mascot_hero/big_cta/gallery_of_art/numbers_counter/
  storybook_quote/footer converted to builtin overrides; 4 persona blocks kept/
  added — alphabet_strip (array-shaped, gotcha-safe), schedule, art_wall,
  story_time.
- 5 presets, all mode "both", bright-classroom light + quiet-time navy dark.
- Bundled OFL woff2 (Baloo 2 700, Quicksand 400/700) in assets/fonts + LICENSES;
  all font-family via var(--font-*); RECOMMENDED_FONTS/ICONS updated;
  required_icon_packs declared.
- Themed email-safe wrapper; master pages (site + auth); seed demo site
  (home/about/blog+3 posts/contact form+row_inserted email workflow/login),
  preschool voice.

Known platform limit (OVERRIDE-CONTRACT §11): auth-form/auth-status/
password-reset-form/page-suggestions overrides are authored correct-to-model but
do not dispatch (compiled BlockFuncs). page-suggestions also omits the dynamic
suggestion list (no FTS in codeless).

Verified: `make` (ninja plugin build) exit 0; check-safety exit 0. Visual quality
UNVERIFIED until Wave B.

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

229 lines
11 KiB
JSON

{
"demo": true,
"settings": {
"merge": {
"companyName": "Little Sprouts",
"tagline": "A warm, playful place to learn and grow."
}
},
"data_tables": [
{
"key": "contact_submissions",
"name": "Visit Requests",
"description": "Seeded contact-form submissions for the Little Sprouts demo. A submission becomes a row here and emails the site admins.",
"columns": [
{ "key": "name", "label": "Parent name", "type": "text", "required": true },
{ "key": "email", "label": "Email", "type": "email", "required": true },
{ "key": "childAge", "label": "Child's age", "type": "text", "required": false },
{ "key": "message", "label": "Message", "type": "text", "required": true }
]
}
],
"pages": [
{
"slug": "/",
"title": "Little Sprouts",
"template_key": "landing",
"blocks": [
{
"block_key": "hero",
"title": "Hero",
"slot": "main",
"sort_order": 1,
"content": {
"template": "centered",
"minHeight": "screen",
"eyebrow": "Now enrolling",
"headline": "A happy place to start",
"subheadline": "Play-based preschool for ages 2 to 5.",
"description": "Small groups, warm teachers, and a garden to dig in. Come and see a normal day.",
"ctaPrimary": { "text": "Book a visit", "url": "/contact" },
"ctaSecondary": { "text": "See our day", "url": "/about" }
}
},
{
"block_key": "feature-grid",
"title": "Why families choose us",
"slot": "main",
"sort_order": 2,
"content": {
"eyebrow": "Why families choose us",
"heading": "What your child gets",
"intro": "Every day has room to move, make, and rest.",
"layout": "card",
"columns": 3,
"items": [
{ "icon": "lucide:sun", "title": "Time outside every day", "text": "Rain or shine, we head to the garden and the yard." },
{ "icon": "lucide:book-open", "title": "Stories and songs", "text": "We read together, sing together, and make up our own tales." },
{ "icon": "lucide:palette", "title": "Room to make a mess", "text": "Paint, clay, glue, and glitter. Aprons on, big ideas out." }
]
}
},
{
"block_key": "kindergarten:schedule",
"title": "A day in the Sunflower Room",
"slot": "main",
"sort_order": 3,
"content": {
"title": "A day in the Sunflower Room",
"items": [
{ "time": "09:00", "activity": "Arrival and free play", "icon": "play" },
{ "time": "10:00", "activity": "Morning circle and songs", "icon": "book" },
{ "time": "10:30", "activity": "Snack and fruit", "icon": "snack" },
{ "time": "11:00", "activity": "Garden and outside play", "icon": "sun" },
{ "time": "12:00", "activity": "Lunch together", "icon": "snack" },
{ "time": "13:00", "activity": "Quiet time and rest", "icon": "nap" },
{ "time": "14:00", "activity": "Painting and making", "icon": "paint" }
]
}
},
{
"block_key": "kindergarten:art_wall",
"title": "Fresh off the easel",
"slot": "main",
"sort_order": 4,
"content": {
"title": "Fresh off the easel",
"showChildName": true,
"items": [
{ "childName": "Mia", "age": "4" },
{ "childName": "Noah", "age": "3" },
{ "childName": "Ada", "age": "5" }
]
}
},
{
"block_key": "cta",
"title": "CTA",
"slot": "main",
"sort_order": 5,
"content": {
"background": "band",
"heading": "Come and see for yourself",
"text": "Visits run most mornings. We will show you around and answer everything.",
"primaryLabel": "Book a visit",
"primaryUrl": "/contact"
}
}
]
},
{
"slug": "/about",
"title": "About us",
"template_key": "default",
"blocks": [
{ "block_key": "heading", "title": "Heading", "slot": "main", "sort_order": 1, "content": { "text": "About Little Sprouts", "level": 1 } },
{ "block_key": "rich-text", "title": "Story", "slot": "main", "sort_order": 2, "content": { "html": "<p>Little Sprouts started in a church hall with six children and a box of blocks. Families kept asking for more days, so we grew into a proper little school with a garden out the back.</p><p>Our rooms are small on purpose. Teachers learn every child by name in the first week. We follow the children's lead, keep the day gentle, and send them home tired and happy.</p>" } },
{
"block_key": "kindergarten:story_time",
"title": "Story time",
"slot": "main",
"sort_order": 3,
"content": {
"bookTitle": "The Very Sleepy Bear",
"author": "our reading corner",
"line": "The bear yawned, and the whole forest yawned back."
}
},
{ "block_key": "divider", "title": "Divider", "slot": "main", "sort_order": 4, "content": { "variant": "line", "weight": "medium" } },
{ "block_key": "quote", "title": "Quote", "slot": "main", "sort_order": 5, "content": { "style": "pull", "quote": "My daughter runs to the door every morning.", "attribution": "A Little Sprouts parent" } }
]
},
{
"slug": "/blog",
"title": "Stories",
"template_key": "blog-index",
"blocks": [
{ "block_key": "card", "title": "Post: Settling in", "slot": "main", "sort_order": 1, "content": { "layout": "vertical", "title": "Settling in: the first week", "text": "<p>Little tips that help a new child feel at home, from the drop-off wave to the goodbye routine.</p>", "link": "/blog/settling-in", "linkLabel": "Read on" } },
{ "block_key": "card", "title": "Post: What to pack", "slot": "main", "sort_order": 2, "content": { "layout": "vertical", "title": "What to pack for a preschool day", "text": "<p>A short list of what to bring, what to label, and what to leave at home.</p>", "link": "/blog/what-to-pack", "linkLabel": "Read on" } },
{ "block_key": "card", "title": "Post: Reading at home", "slot": "main", "sort_order": 3, "content": { "layout": "vertical", "title": "Ways to read at home", "text": "<p>Reading together does not need to be fancy. Here is how we keep it easy and fun.</p>", "link": "/blog/reading-at-home", "linkLabel": "Read on" } }
]
},
{
"slug": "/blog/settling-in",
"title": "Settling in: the first week",
"template_key": "article",
"parent_slug": "/blog",
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Settling in: the first week", "level": 1 } },
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>The first week is a big change for everyone. Some children walk straight in. Others hold on tight at the door. Both are normal.</p><p>Keep goodbyes short and warm. Tell your child when you will be back, then go. We will send a photo once they settle, and most do within minutes.</p>" } }
]
},
{
"slug": "/blog/what-to-pack",
"title": "What to pack for a preschool day",
"template_key": "article",
"parent_slug": "/blog",
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "What to pack for a preschool day", "level": 1 } },
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>Pack a spare set of clothes, a hat, and a water bottle. Label everything with your child's name.</p><p>Leave toys from home in the car. They tend to go missing, and sharing them is hard on a new friend. We have plenty here to play with.</p>" } }
]
},
{
"slug": "/blog/reading-at-home",
"title": "Ways to read at home",
"template_key": "article",
"parent_slug": "/blog",
"blocks": [
{ "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Ways to read at home", "level": 1 } },
{ "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "<p>Read the same book as often as they ask. Repetition is how young children learn the shape of a story.</p><p>Point at the pictures and ask what happens next. Let them turn the pages. The goal is a warm few minutes together, not a perfect reading.</p>" } }
]
},
{
"slug": "/contact",
"title": "Book a visit",
"template_key": "contact",
"blocks": [
{
"block_key": "contact-form",
"title": "Book a visit",
"slot": "main",
"sort_order": 1,
"content": {
"heading": "Book a visit",
"description": "Tell us a little about your family. We will call to set up a time.",
"submitLabel": "Send",
"successMessage": "Thanks. We will be in touch very soon.",
"fields": [
{ "name": "name", "label": "Your name", "type": "text", "required": true, "width": "half" },
{ "name": "email", "label": "Email", "type": "email", "required": true, "width": "half" },
{ "name": "childAge", "label": "Your child's age", "type": "text", "required": false, "width": "full" },
{ "name": "message", "label": "Anything you would like us to know", "type": "textarea", "required": true, "width": "full" }
],
"formConfig": { "enabled": true, "captchaEnabled": false, "targetTable": "contact_submissions" }
}
},
{
"block_key": "contact-card",
"title": "Find us",
"slot": "main",
"sort_order": 2,
"content": {
"heading": "Find us",
"columns": 3,
"channels": [
{ "icon": "lucide:mail", "label": "Email", "value": "hello@littlesprouts.example", "link": "mailto:hello@littlesprouts.example" },
{ "icon": "lucide:phone", "label": "Phone", "value": "(02) 5550 1234", "link": "tel:+61255501234" },
{ "icon": "lucide:map-pin", "label": "Visit", "value": "14 Garden Lane, Riverside" }
]
}
}
]
},
{
"slug": "/login",
"title": "Sign in",
"template_key": "auth",
"blocks": [
{ "block_key": "auth-form", "title": "Sign in", "slot": "main", "sort_order": 1, "content": { "default_tab": "login", "show_social": false } }
]
}
],
"menu_items": [
{ "menu": "main", "label": "Home", "page_slug": "/", "sort_order": 1 },
{ "menu": "main", "label": "About", "page_slug": "/about", "sort_order": 2 },
{ "menu": "main", "label": "Stories", "page_slug": "/blog", "sort_order": 3 },
{ "menu": "main", "label": "Visit", "page_slug": "/contact", "sort_order": 4 }
]
}