/* eslint-disable */ // BOOK PAGE — multi-step mock flow const PB_B = window.PB_DATA; // Curated booking-flow service set with mock prices (clearly tagged "estimate" — research has only colour verified). const BOOK_SERVICES = [ { id: 'airtouch-crown', name: 'Airtouch Crown', cat: 'Hair Colour', dur: '3 hr', price: 1000, verified: true }, { id: 'balayage', name: 'Balayage / Shatush', cat: 'Hair Colour', dur: '5 hr 20 min', price: 1200, verified: true, from: true }, { id: 'roots-colour', name: 'Roots Colour', cat: 'Hair Colour', dur: '2 hr', price: 357, verified: true }, { id: 'blow-dry', name: 'Signature Blow Dry', cat: 'Hair Styling', dur: '40 min', consult: true }, { id: 'buccal', name: 'Buccal Cosmetology', cat: 'Skin', dur: '60 min', consult: true }, { id: 'salmon-dna', name: 'Salmon DNA Facial', cat: 'Skin', dur: '75 min', consult: true }, { id: 'gua-sha', name: 'Gua Sha Facial', cat: 'Skin', dur: '60 min', consult: true }, { id: 'jp-mani', name: 'Japanese Manicure', cat: 'Nails', dur: '60 min', consult: true }, ]; const BOOK_STYLISTS = [ { id: 'any', name: 'Any available', role: '— First open chair', rating: null, img: null }, { id: 'anastasia', name: 'Anastasiia', role: 'Hair Stylist', rating: 5.0, img: 'media/team-anastasia.webp' }, { id: 'iness', name: 'Ines', role: 'Hair Stylist', rating: 5.0, img: 'media/team-iness.webp' }, { id: 'ayan', name: 'Ayan', role: 'Hair Stylist', rating: 5.0, img: 'media/team-ayan.webp' }, { id: 'joanne', name: 'Jo Anne', role: 'Masseur', rating: 5.0, img: 'media/team-joanne.webp' }, { id: 'diane', name: 'Diana May', role: 'Nail Technician', rating: 4.9, img: 'media/team-diane.webp' }, { id: 'namarig', name: 'Namarig', role: 'Cosmetologist', rating: 4.8, img: 'media/team-namarig.webp' }, ]; function generateDays() { // Next 14 days starting today const out = []; const start = new Date('2026-05-22T10:00:00'); // pinned for reproducibility const dow = ['SUN','MON','TUE','WED','THU','FRI','SAT']; for (let i = 0; i < 14; i++) { const d = new Date(start.getTime() + i * 86400000); out.push({ key: d.toISOString().slice(0,10), dow: dow[d.getDay()], dt: d.getDate(), month: d.toLocaleString('en-US',{ month: 'short' }), disabled: false, // open Mon-Sun }); } return out; } const TIME_SLOTS = ['10:00','10:30','11:00','11:30','12:00','12:30','13:00','13:30','14:00','14:30','15:00','15:30','16:00','16:30','17:00','17:30','18:00','18:30','19:00','19:30']; const DISABLED_SLOTS = new Set(['12:00','15:30','17:00']); // fake "booked" times function StepBar({ step }) { const labels = ['Service', 'Stylist', 'Date & Time', 'Your details', 'Confirm']; return (
{labels.map((l, i) => (
i ? ' is-done' : '')}> {step > i ? '✓' : String(i + 1).padStart(2,'0')} {l}
))}
); } function PageBook() { const [step, setStep] = React.useState(0); const [svc, setSvc] = React.useState(null); const [stylist, setStylist] = React.useState(BOOK_STYLISTS[0]); const [day, setDay] = React.useState(null); const [slot, setSlot] = React.useState(null); const [details, setDetails] = React.useState({ name: '', phone: '', email: '', notes: '' }); const days = React.useMemo(generateDays, []); const canNext = () => { if (step === 0) return !!svc; if (step === 1) return !!stylist; if (step === 2) return !!day && !!slot; if (step === 3) return details.name && details.phone; return true; }; const next = () => setStep((s) => Math.min(s + 1, 4)); const back = () => setStep((s) => Math.max(s - 1, 0)); return (
Home/Book

Reserve
your chair.

Book online in under a minute — or send us a note on WhatsApp. Every appointment opens with a complimentary consultation.

{/* LEFT — flow */}
{step < 4 && } {/* STEP 0: SERVICE */} {step === 0 && (

What would you like to book?

{BOOK_SERVICES.map((s) => ( ))}
)} {/* STEP 1: STYLIST */} {step === 1 && (

Which specialist?

Our clients return for specific stylists. Choose by name, or pick the first open chair.

{BOOK_STYLISTS.map((s) => ( ))}
)} {/* STEP 2: DATE & TIME */} {step === 2 && (

Pick a date.

{days.slice(0,14).map((d) => ( ))}

Then a time.

{TIME_SLOTS.map((t) => { const dis = DISABLED_SLOTS.has(t); return ( ); })}
)} {/* STEP 3: DETAILS */} {step === 3 && (

Just your details.

setDetails({...details, name: e.target.value})} placeholder="As you'd like us to greet you" />
setDetails({...details, phone: e.target.value})} placeholder="+971 ..." />
setDetails({...details, email: e.target.value})} placeholder="you@email.com" />