/* Fees page — branch + programme switcher with itemized breakdown */ const FEE_DATA = { 'bukit-jelutong': { label: 'Bukit Jelutong', color: 'orange', discount: 200, discountNote: 'Discount valid until 25th Dec 2025 / Open Day', playschool: { enrolment: [ { name: 'Registration', sub: 'one-off, non-refundable', amt: 330 }, { name: 'Insurance Takaful', sub: 'coverage', amt: 11 }, { name: 'Learning Materials', sub: 'stationaries, arts & crafts', amt: 500 }, { name: 'Activities', sub: 'monthly themed activities', amt: 680 }, { name: 'Filing & assessments', sub: '', amt: 120 }, { name: 'Events', sub: 'sports, t-shirt, hajj cilik, PTM', amt: 120 }, ], monthly: [ { age: '2–3 years', basic: null, midday: 700, midday_hours: '8am–2pm', fullday: 850 }, ], }, preschool: { enrolment: [ { name: 'Registration', sub: 'one-off, non-refundable', amt: { nursery: 300, reception: 300, year1: 300 } }, { name: 'Administration', sub: '', amt: { nursery: 90, reception: 90, year1: 90 } }, { name: 'Uniform', sub: '1 set sports wear', amt: 'FOC' }, { name: 'Insurance Takaful', sub: 'coverage', amt: { nursery: 11, reception: 11, year1: 11 } }, { name: 'Learning Materials', sub: 'stationaries, arts & crafts, filing', amt: { nursery: 930, reception: 790, year1: 790 } }, { name: 'Activities', sub: 'monthly activities, science', amt: { nursery: 950, reception: 900, year1: 900 } }, { name: 'Books & worksheets', sub: '', amt: { nursery: 110, reception: 250, year1: 280 } }, { name: 'Events', sub: 'school trip, sports, hajj cilik, PTM', amt: { nursery: 300, reception: 400, year1: 470 }, sub2: 'Nursery: minus trip' }, ], monthly: [ { age: 'Nursery (4 yo)', basic: 400, midday: 550, midday_hours: '8am–2pm', fullday: 690 }, { age: 'Reception (5 yo)', basic: null, midday: 550, midday_hours: '8am–2.30pm', fullday: 690 }, { age: 'Year One (6 yo)', basic: null, midday: 550, midday_hours: '8am–3pm', fullday: 690 }, ], }, }, 'cyberjaya': { label: 'Cyberjaya', color: 'mint', discount: 200, discountNote: 'Discount valid until 25th Dec 2025 / Open Day', playschool: { enrolment: [ { name: 'Registration', sub: 'one-off, non-refundable', amt: 330 }, { name: 'Insurance Takaful', sub: 'coverage', amt: 11 }, { name: 'Learning Materials', sub: 'stationaries, arts & crafts', amt: 500 }, { name: 'Activities', sub: 'monthly themed activities', amt: 680 }, { name: 'Filing & assessments', sub: '', amt: 120 }, { name: 'Events', sub: 'sports, t-shirt, hajj cilik, PTM', amt: 120 }, ], monthly: [ { age: '2–3 years', basic: null, midday: 700, midday_hours: '8am–2pm', fullday: 850 }, ], }, preschool: { enrolment: [ { name: 'Registration', sub: 'one-off, non-refundable', amt: { nursery: 300, reception: 300, year1: 300 } }, { name: 'Administration', sub: '', amt: { nursery: 90, reception: 90, year1: 90 } }, { name: 'Uniform', sub: '1 set sports wear', amt: 'FOC' }, { name: 'Insurance Takaful', sub: 'coverage', amt: { nursery: 11, reception: 11, year1: 11 } }, { name: 'Learning Materials', sub: 'stationaries, arts & crafts, filing', amt: { nursery: 930, reception: 790, year1: 790 } }, { name: 'Activities', sub: 'monthly activities, science', amt: { nursery: 950, reception: 900, year1: 900 } }, { name: 'Books & worksheets', sub: '', amt: { nursery: 110, reception: 250, year1: 280 } }, { name: 'Events', sub: 'school trip, sports, hajj cilik, PTM', amt: { nursery: 300, reception: 400, year1: 470 } }, ], monthly: [ { age: 'Nursery (4 yo)', basic: 400, midday: 550, midday_hours: '8am–2pm', fullday: 690 }, { age: 'Reception (5 yo)', basic: null, midday: 550, midday_hours: '8am–2.30pm', fullday: 690 }, { age: 'Year One (6 yo)', basic: null, midday: 550, midday_hours: '8am–3pm', fullday: 690 }, ], }, }, 'kota-damansara': { label: 'Kota Damansara', color: 'sky', discount: 500, discountNote: 'Discount valid during Open Day only', playschool: null, preschool: { enrolment: [ { name: 'Registration', sub: 'one-off, non-refundable', amt: { nursery: 330, reception: 330, year1: 330 } }, { name: 'Insurance Takaful', sub: 'coverage', amt: { nursery: 11, reception: 11, year1: 11 } }, { name: 'Learning Materials', sub: 'stationaries, arts & crafts, filing', amt: { nursery: 990, reception: 850, year1: 850 } }, { name: 'Activities', sub: 'monthly activities, science', amt: { nursery: 950, reception: 900, year1: 900 } }, { name: 'Books & worksheets', sub: '', amt: { nursery: 110, reception: 250, year1: 280 } }, { name: 'Events', sub: 'school trip, sports, hajj cilik, PTM', amt: { nursery: 300, reception: 400, year1: 470 } }, ], monthly: [ { age: 'Nursery (4 yo)', basic: 400, midday: 500, midday_hours: '8am–2pm', fullday: 620, fullday2: 650 }, { age: 'Reception (5 yo)', basic: 400, midday: 500, midday_hours: '8am–2.30pm', fullday: 620, fullday2: 650 }, { age: 'Year One (6 yo)', basic: null, midday: 500, midday_hours: '8am–3pm', fullday: 620, fullday2: 650 }, ], }, }, }; const OPTIONAL_FEES = [ { name: 'Sports uniform', amt: 60 }, { name: 'Formal uniform', amt: 60 }, { name: 'Bedding', sub: 'one-off, full-day only', amt: 100 }, { name: 'Scarf for girls', amt: 25, unit: '/pc' }, { name: 'Potty training', sub: 'children with diapers', amt: 300 }, { name: 'Graduation', sub: 'Year One only', amt: 150 }, ]; function FeesHero() { return (
Enrolment 2026

Transparent fees,
no hidden surprises.

Pick a branch and programme to see the full breakdown. All amounts are in Malaysian Ringgit (MYR).

); } function BranchSwitcher({ branch, setBranch, programme, setProgramme }) { const branches = [ { key: 'bukit-jelutong', label: 'Bukit Jelutong' }, { key: 'cyberjaya', label: 'Cyberjaya' }, { key: 'kota-damansara', label: 'Kota Damansara' }, ]; const branchData = FEE_DATA[branch]; const availablePrograms = []; if (branchData.playschool) availablePrograms.push({ key: 'playschool', label: 'Playschool · 2-3 yo' }); if (branchData.preschool) availablePrograms.push({ key: 'preschool', label: 'Preschool · 4-6 yo' }); return (
1. Pick a branch
{branches.map(b => ( ))}
2. Pick a programme
{availablePrograms.map(p => ( ))}
); } function PreschoolFeesTable({ data, branchData }) { const cols = ['nursery', 'reception', 'year1']; const colLabels = { nursery: 'Nursery · 4 yo', reception: 'Reception · 5 yo', year1: 'Year One · 6 yo' }; const totals = cols.reduce((acc, c) => { acc[c] = data.enrolment.reduce((sum, item) => { const a = typeof item.amt === 'object' ? item.amt[c] : (item.amt === 'FOC' ? 0 : item.amt); return sum + (typeof a === 'number' ? a : 0); }, 0); return acc; }, {}); const afterDiscount = cols.reduce((acc, c) => { acc[c] = totals[c] - branchData.discount; return acc; }, {}); return (

Enrolment fees · 2026

One-off, paid before term starts
{cols.map(c => )} {data.enrolment.map((item, i) => ( {cols.map(c => { const a = typeof item.amt === 'object' ? item.amt[c] : item.amt; return ; })} ))} {cols.map(c => )} {cols.map(c => )}
Item{colLabels[c]}
{item.name}
{item.sub &&
{item.sub}
}
{a === 'FOC' ? 'FOC' : `RM ${a}`}
Total before discountRM {totals[c]}
Total after discount (–RM{branchData.discount})
{branchData.discountNote}
RM {afterDiscount[c]}
); } function PlayschoolFeesTable({ data, branchData }) { const total = data.enrolment.reduce((s, it) => s + (typeof it.amt === 'number' ? it.amt : 0), 0); const afterDiscount = total - branchData.discount; return (

Enrolment fees · 2026

For Playschool · 2-3 yo
{data.enrolment.map((item, i) => ( ))}
{item.name}
{item.sub &&
{item.sub}
}
RM {item.amt}
Total before discount RM {total}
Total after discount (–RM{branchData.discount})
{branchData.discountNote}
RM {afterDiscount}
); } function MonthlyTable({ data }) { return (

Monthly fees & programme

{data.monthly.map((row, i) => ( ))}
Age group Basic
Mon–Fri 8am–12pm
Midday
incl. lunch
Full Day
7am–6pm/6.30pm
{row.age} {row.basic ? RM {row.basic} : Not available} RM {row.midday} {row.midday_hours &&
{row.midday_hours}
}
RM {row.fullday} {row.fullday2 &&
or RM {row.fullday2} · 7am–6.30pm
}
Overtime charges of RM7 every 30 minutes after 6.30pm.
); } function OptionalFees() { return (

Optional add-ons

{OPTIONAL_FEES.map((it, i) => (
{it.name}
{it.sub &&
{it.sub}
}
RM {it.amt}{it.unit || ''}
))}
); } function FeesNotes({ branchData, onEnroll }) { return (

📌 Good to know

Ready to start?

Enroll now or chat with our admissions team — we'll walk you through every detail.

WhatsApp
); } function FeesApp() { const [branch, setBranch] = useState('bukit-jelutong'); const [programme, setProgramme] = useState('preschool'); const [enrollOpen, setEnrollOpen] = useState(false); const branchData = FEE_DATA[branch]; const data = branchData[programme]; return (
setEnrollOpen(true)} />
📍 {branchData.label}

{programme === 'playschool' ? 'Playschool · 2–3 years' : 'Preschool · 4–6 years'} fees

2026 enrolment open ✨
{programme === 'playschool' ? : } setEnrollOpen(true)} />
); } ReactDOM.createRoot(document.getElementById('root')).render();