/* Programmes page โ€” tabbed */ const PROGRAMMES = [ { key: 'playschool', label: 'Playschool', age: '2 โ€“ 3 years', color: 'sky', emoji: '๐Ÿงธ', tagline: 'A gentle, joyful first step', intro: "For our youngest learners,\nA soft, secure introduction to school built on routine, play, and lots of cuddles.", schedule: [{ name: 'Midday', hours: 'Monโ€“Thu 7amโ€“2pm ยท Fri 8amโ€“12.30pm' }, { name: 'Full Day', hours: 'Monโ€“Fri 7amโ€“6.30pm', tag: 'Most popular' }], pillars: [ { icon: '๐Ÿ‘ถ', title: 'Settling in', desc: 'Gentle separation from parents with familiar routines and trusted teachers.' }, { icon: '๐ŸŽต', title: 'Songs & rhymes', desc: 'Daily Islamic nasyid, English songs and Malay rhymes โ€” a love for language begins early.' }, { icon: '๐Ÿคฒ', title: 'Tiny doa', desc: 'Doa makan, doa tidur, doa naik kereta โ€” small habits, big iman.' }, { icon: '๐Ÿงฉ', title: 'Sensory play', desc: 'Sand, water, dough, blocks โ€” exploring the world through hands and senses.' }], typicalDay: ['Welcome circle & doa', 'Letters & sound', 'Outdoor / sensory play', 'Number time', 'Snack & rest', 'Thematic play', 'Story & song', 'Free play & pickup'] }, { key: 'nursery', label: 'Nursery', age: '4 years', color: 'mint', emoji: '๐ŸŽจ', tagline: 'Curiosity unleashed', intro: 'Phonics foundations, fine motor skills, and Islamic adab โ€” all delivered through themed, hands-on play.', schedule: [{ name: 'Basic', hours: 'Monโ€“Fri 8amโ€“12pm', tag: 'Half day' }, { name: 'Midday', hours: 'Monโ€“Thu 8amโ€“2pm ยท Fri 8amโ€“12.30pm' }, { name: 'Full Day', hours: 'Monโ€“Fri 7amโ€“6pm' }], pillars: [ { icon: '๐Ÿ”ค', title: 'Phonics', desc: 'Jolly Phonics-based programme โ€” children begin blending and reading simple words.' }, { icon: '๐Ÿ”ข', title: 'Early Maths', desc: 'Numbers, patterns, shapes through manipulatives and games.' }, { icon: '๐Ÿ“ฟ', title: 'Quran & Iqra', desc: 'Iqra reading, surah memorisation, hadith of the week.' }, { icon: '๐Ÿ”ฌ', title: 'Science wonder', desc: 'Weekly science experiments โ€” children become little scientists.' }], typicalDay: ['Islamic Studies', 'Phonics & Literacy', 'Maths & Science experiments', 'Hafazan', 'Snack & outdoor play', 'Music & Movement', 'Arts & Craft', 'Sensory play', 'Lunch & pickup'] }, { key: 'reception', label: 'Reception', age: '5 years', color: 'rose', emoji: '๐Ÿ“–', tagline: 'Reading takes off', intro: 'Reading fluency, early Maths, Quran tahfiz, and confident communication โ€” building blocks for primary school.', schedule: [{ name: 'Midday', hours: 'Monโ€“Thu 8amโ€“2.30pm ยท Fri 8amโ€“12.30pm' }, { name: 'Full Day', hours: 'Monโ€“Fri 7amโ€“6pm', tag: 'Most popular' }], pillars: [ { icon: '๐Ÿ“š', title: 'Reading fluency', desc: 'Levelled readers, comprehension and creative writing in English.' }, { icon: 'โœ๏ธ', title: 'Handwriting', desc: 'Cursive and print, building beautiful, confident writing.' }, { icon: '๐Ÿ•Œ', title: 'Tahfiz', desc: 'Memorisation of short surahs with tajweed basics.' }, { icon: '๐ŸŒ', title: 'World awareness', desc: 'Geography, cultures, and the wonders of Allah\'s creation.' }], typicalDay: ['Islamic Studies & Solat', 'Phonics & Literacy', 'Maths', 'Outdoor break', 'Hafazan', 'Theme project', 'Lunch', 'Specials (Speech & Drama, Arts, PE)', 'Reflection & pickup'] }, { key: 'year1', label: 'Year One', age: '6 years', color: 'yellow', emoji: '๐ŸŽ“', tagline: 'School-ready & shining', intro: 'A bridge year,\nChildren are well prepared for primary, confident in acquired skills and grounded in their faith.', schedule: [{ name: 'Midday', hours: 'Monโ€“Thu 8amโ€“3pm ยท Fri 8amโ€“12.30pm' }, { name: 'Full Day', hours: 'Monโ€“Fri 7amโ€“6pm', tag: 'Most popular' }], pillars: [ { icon: '๐Ÿ†', title: 'Primary readiness', desc: 'BM, English, Maths and Science aligned with Year 1 KSSR expectations.' }, { icon: '๐Ÿ—ฃ๏ธ', title: 'Confident speakers', desc: 'Show & tell, debates, presentations where every child finds their voice.' }, { icon: '๐Ÿ•‹', title: 'Hajj cilik', desc: 'A signature programme where children experience the rites of hajj in miniature.' }, { icon: '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง', title: 'Graduation', desc: 'A meaningful send-off into primary school, Insya\'Allah well-prepared.' }], typicalDay: ['Islamic Studies & Practice', 'Hafazan', 'Reading & Literacy', 'Bahasa Melayu & Pemahaman', 'Performing Arts', 'Mathematics & Science experiments', 'Arts & Craft', 'Outdoor break & Physical Education', 'Extra curriculum (Club Activities)'] }, { key: 'transit', label: 'Transit', age: 'After school', color: 'lilac', emoji: '๐ŸšŒ', tagline: 'Safe, structured, snacked', intro: 'For families needing after-school care โ€” homework guidance, hot meals, Quran time, and supervised play until pickup.', schedule: [{ name: 'After-school', hours: 'After school โ€“ 6.30pm' }], pillars: [ { icon: '๐Ÿ“', title: 'Homework support', desc: 'Trained teachers help with daily homework and revision.' }, { icon: '๐Ÿฑ', title: 'Halal hot meals', desc: 'Nutritious, freshly cooked lunch and tea provided.' }, { icon: '๐Ÿ“ฟ', title: 'Quran time', desc: 'Daily Quran reading and revision keeps the connection alive.' }, { icon: '๐ŸŽจ', title: 'Free play', desc: 'Art, board games, outdoor play โ€” childhood after the school bell.' }], typicalDay: ['Pickup from school', 'Lunch', 'Rest / Quran', 'Homework', 'Tea', 'Free play / activities', 'Parent pickup'] }]; function ProgrammesHero() { return (
Programmes

A programme for every stage

From toddler steps to school-ready strides, five carefully designed pathways, each grounded in Islamic values and delivered fully in English.

); } function ProgrammeTabs({ active, setActive }) { return (
{PROGRAMMES.map((p) => )}
); } /* Map keywords in step text โ†’ relevant emoji icon */ const STEP_ICONS = [ { match: /islamic/i, icon: '๐Ÿ•Œ' }, { match: /quran|doa|tahfiz|prayer|solat|hafazan/i, icon: '๐Ÿ“ฟ' }, { match: /circle|welcome|morning/i, icon: '๐ŸŒ…' }, { match: /\bthematic\b|\btheme\b|\bthemed\b/i, icon: '๐ŸŽญ' }, { match: /performing/i, icon: '๐ŸŽญ' }, { match: /club|extra/i, icon: '๐ŸŽช' }, { match: /sensory/i, icon: '๐Ÿงฉ' }, { match: /movement|dance/i, icon: '๐Ÿ’ƒ' }, { match: /art|craft/i, icon: '๐ŸŽจ' }, { match: /music|nasyid|song/i, icon: '๐ŸŽต' }, { match: /outdoor|recess|break|play/i, icon: '๐Ÿƒ' }, { match: /snack|tea/i, icon: '๐Ÿช' }, { match: /lunch/i, icon: '๐Ÿฑ' }, { match: /rest|nap/i, icon: '๐Ÿ˜ด' }, { match: /specials|speech|drama/i, icon: '๐ŸŽค' }, { match: /story|song/i, icon: '๐ŸŽต' }, { match: /letter|sound|alphabet/i, icon: '๐Ÿ”ค' }, { match: /number/i, icon: '๐Ÿ”ข' }, { match: /english|literacy|phonics|reading/i, icon: '๐Ÿ“–' }, { match: /bm|bahasa/i, icon: '๐Ÿ“' }, { match: /math/i, icon: '๐Ÿงฎ' }, { match: /science/i, icon: '๐Ÿ”ฌ' }, { match: /pe|sport/i, icon: 'โšฝ' }, { match: /homework/i, icon: 'โœ๏ธ' }, { match: /pickup|free play/i, icon: '๐Ÿ‘‹' }, { match: /reflection/i, icon: '๐Ÿ’ญ' }]; function iconFor(step) { for (const r of STEP_ICONS) if (r.match.test(step)) return r.icon; return 'โญ'; } function DayStepBox({ step, index }) { const [hover, setHover] = React.useState(false); const icon = iconFor(step); return (
setHover(true)} onMouseLeave={() => setHover(false)} style={{ position: 'relative', background: '#fff', borderRadius: 16, padding: '16px 14px 14px', boxShadow: hover ? '0 10px 24px rgba(42,42,42,0.16)' : '0 3px 10px rgba(42,42,42,0.06)', border: '2px solid', borderColor: hover ? 'var(--orange)' : 'rgba(42,42,42,0.06)', cursor: 'default', transition: 'all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1)', transform: hover ? 'translateY(-3px)' : 'translateY(0)', overflow: 'visible' }}> {/* Floating icon โ€” pops up on hover */}
{String(index + 1).padStart(2, '0')}
{step}
); } function ProgrammeDetail({ p, onEnroll }) { const tone = p.color === 'yellow' ? 'orange-warm' : p.color; return (
{p.age}

{p.label}
{p.tagline}

{p.intro}

View fees
{p.emoji}

What we focus on

{p.pillars.map((pillar, i) =>
{pillar.icon}

{pillar.title}

{pillar.desc}

)}

๐Ÿ“… Available programmes

{p.schedule.map((s, i) =>
{s.name} {s.tag && {s.tag}}
{s.hours}
)}

๐ŸŒž A typical day

{p.typicalDay.map((step, i) => )}
); } function ProgrammesApp() { const initial = typeof window !== 'undefined' && window.location.hash.replace('#', '') || 'playschool'; const [active, setActive] = useState(PROGRAMMES.find((p) => p.key === initial) ? initial : 'playschool'); const [enrollOpen, setEnrollOpen] = useState(false); const current = PROGRAMMES.find((p) => p.key === active); return (
setEnrollOpen(true)} /> {setActive(k);window.history.replaceState(null, '', `#${k}`);}} /> setEnrollOpen(true)} />
); } ReactDOM.createRoot(document.getElementById('root')).render();