// ─────────── Booking (multi-step) ─────────── const BOOK_TREATMENTS = [ { id: 'consult', name: 'Free Consult', desc: 'Just exploring' }, { id: 'invisalign', name: 'Invisalign', desc: 'Clear aligners' }, { id: 'braces', name: 'Braces', desc: 'Orthodontics' }, { id: 'implants', name: 'Implants', desc: 'Single or full-arch' }, { id: 'cosmetic', name: 'Crowns / Veneers', desc: 'Smile design' }, { id: 'rct', name: 'Root Canal', desc: 'Painless RCT' }, { id: 'whitening', name: 'Whitening', desc: 'Laser session' }, { id: 'kids', name: 'Paediatric', desc: 'For my child' }, ]; const BOOK_BRANCHES = [ { id: 'east', name: 'Mulund East', desc: 'Neelam Nagar' }, { id: 'west', name: 'Mulund West', desc: 'The Gateway' }, ]; const BOOK_TIMES = ['10:00', '11:00', '12:00', '14:00', '15:30', '17:00', '18:00', '19:00']; const dateLabels = () => { const out = []; const days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']; const today = new Date(); for (let i = 0; i < 6; i++) { const d = new Date(today); d.setDate(today.getDate() + i); out.push({ id: d.toISOString().slice(0,10), day: i === 0 ? 'Today' : i === 1 ? 'Tomorrow' : days[d.getDay()], date: d.getDate(), month: d.toLocaleString('en', { month: 'short' }), }); } return out; }; const BookingSection = () => { const [step, setStep] = React.useState(0); const [data, setData] = React.useState({ treatment: '', branch: '', date: '', time: '', name: '', phone: '', email: '', note: '', }); const dates = React.useMemo(() => dateLabels(), []); const set = (k, v) => setData(d => ({ ...d, [k]: v })); const canNext = () => { if (step === 0) return !!data.treatment; if (step === 1) return !!data.branch; if (step === 2) return !!data.date && !!data.time; if (step === 3) return data.name.length > 1 && data.phone.length > 6; return false; }; const confirmBooking = () => { const treatmentName = BOOK_TREATMENTS.find(t => t.id === data.treatment)?.name || data.treatment; const branchName = BOOK_BRANCHES.find(b => b.id === data.branch)?.name || data.branch; const lines = [ '🦷 *New Appointment Request — Align-O-Dent*', '', `*Name:* ${data.name}`, `*Phone:* ${data.phone}`, data.email ? `*Email:* ${data.email}` : null, `*Treatment:* ${treatmentName}`, `*Branch:* ${branchName}`, `*When:* ${data.date}, ${data.time}`, data.note ? `*Note:* ${data.note}` : null, ].filter(Boolean).join('\n'); const url = `https://wa.me/919321859061?text=${encodeURIComponent(lines)}`; window.open(url, '_blank', 'noopener,noreferrer'); setStep(4); }; const steps = ['Treatment', 'Branch', 'Time', 'You', 'Done']; return (

Book an appointment

Tell us what you need.
We'll handle the rest.

{steps.map((s, i) => (
{i < step ? : i + 1} {s}
))}
{step === 0 && (
{BOOK_TREATMENTS.map(t => ( ))}
Prefer to pick a slot yourself? Schedule a meeting with me
)} {step === 1 && (
{BOOK_BRANCHES.map(b => ( ))}
)} {step === 2 && (
{dates.map(d => ( ))}
Available slots
{BOOK_TIMES.map((t, i) => ( ))}
)} {step === 3 && (
set('name', e.target.value)} />
set('phone', e.target.value)} /> set('email', e.target.value)} />
)} {step === 4 && (

You're booked in.

Your request has been sent to the clinic via WhatsApp. The team will confirm your slot on {data.phone} shortly.

Treatment{BOOK_TREATMENTS.find(t => t.id === data.treatment)?.name}
Branch{BOOK_BRANCHES.find(t => t.id === data.branch)?.name}
When{data.date} · {data.time}
Patient{data.name}
)} {step < 4 && ( <> {step === 3 && (
Treatment{BOOK_TREATMENTS.find(t => t.id === data.treatment)?.name}
Branch{BOOK_BRANCHES.find(t => t.id === data.branch)?.name}
When{data.date}, {data.time}
)}
)}
WhatsApp confirmation No card needed Reschedule free up to 4h before
); }; // ─────────── FAQ ─────────── const FAQS = [ { q: 'Is the first consultation really free?', a: 'Yes. The first sit-down, including X-ray review if you bring one, is on us. We use it to listen, examine, and tell you whether you actually need treatment. No pressure, no card on file.' }, { q: 'How long do Invisalign or braces take?', a: 'Most cases finish between 8 and 24 months depending on complexity. We give you a written timeline on day one and re-confirm it after each adjustment.' }, { q: 'Do you handle dental emergencies?', a: 'Yes, call +91 93218 59061 directly. We keep buffer slots every day for emergencies and try to see you within 24 hours.' }, { q: 'Is the root canal really painless?', a: 'Numbing is given proper time to take full effect, then we use rotary instruments and apex locators. Most patients say the procedure is more comfortable than the toothache that brought them in.' }, { q: 'Do you accept insurance?', a: 'We work with cashless billing for major Indian and corporate insurers. Let us know your provider when you book and we\'ll confirm coverage.' }, { q: 'Are children seen at both branches?', a: 'Yes. We use behavioural-management techniques with younger children. No straps, no fear-words. Parents stay in the room.' }, ]; const FAQSection = () => { const [open, setOpen] = React.useState(0); return (

FAQs

Patient Questions.

{FAQS.map((f, i) => (

{f.a}

))}
); }; // ─────────── Footer ─────────── const Footer = () => ( ); Object.assign(window, { BookingSection, FAQSection, Footer });