// Couture Events Worldwide — Portfolio, CaseStudy, About, Contact, Tweaks const { useState: useStateP, useEffect: useEffectP, useMemo: useMemoP, useCallback: useCallbackP } = React; // ──────────────────────────────────────────────────────────────── // Portfolio (filterable grid) // ──────────────────────────────────────────────────────────────── function Portfolio({ navigate }) { const [filter, setFilter] = useStateP('all'); useEffectP(() => { const onFilter = (e) => setFilter(e.detail || 'all'); window.addEventListener('cew:filter', onFilter); return () => window.removeEventListener('cew:filter', onFilter); }, []); const counts = useMemoP(() => { const c = { all: PROJECTS.length }; SECTORS.forEach(s => { c[s.id] = PROJECTS.filter(p => p.sector === s.id).length; }); return c; }, []); const filtered = useMemoP(() => { if (filter === 'all') return PROJECTS; return PROJECTS.filter(p => p.sector === filter); }, [filter]); // Asymmetric size pattern (cycles) const sizes = ['size-l', 'size-m', 'size-s', 'size-w', 'size-m', 'size-l']; return (
— The portfolio

Selected work,
2018 — present.

A working archive of recent commissions across our four practices. Filter by sector; click any project to read the case study. All imagery is reference for design — photographer credit, couple & client consent confirmed before publishing live.

{PROJECTS.length} projects · 4 sectors · Dubai & destination
{SECTORS.map(s => ( ))}
Showing {filtered.length} of {PROJECTS.length}
{filtered.map((p, idx) => (
navigate('case', p.slug)} >
{p.title}

{p.title}

{p.sector} · {p.venue} · {p.year}
{String(idx + 1).padStart(2, '0')}
))}
); } // ──────────────────────────────────────────────────────────────── // Case Study // ──────────────────────────────────────────────────────────────── function CaseStudy({ slug, navigate }) { const project = useMemoP(() => PROJECTS.find(p => p.slug === slug) || PROJECTS[0], [slug]); const [lb, setLb] = useStateP(null); // next & prev const idx = PROJECTS.findIndex(p => p.slug === project.slug); const next = PROJECTS[(idx + 1) % PROJECTS.length]; useEffectP(() => { const onKey = (e) => { if (e.key === 'Escape') setLb(null); }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, []); const phases = [ { num: '01', title: 'Plan', body: 'Brief, budget framework, venue selection, logistical and cultural design. Detailed run-of-show.' }, { num: '02', title: 'Design', body: 'Creative direction, scenography, floral architecture, lighting, sound, content. Mood, mock-ups, sample reviews.' }, { num: '03', title: 'Produce', body: 'Vendor curation and contracting, production timelines, crew briefs, technical rehearsals, rigging.' }, { num: '04', title: 'Execute', body: 'On-the-day direction, hospitality choreography, calls, discrete crisis management, guest experience.' }, ]; return (
{project.title}
/ {project.sector}

{project.title}

Sector{project.sector}
Venue{project.venue}
Location{project.location}
Guests{project.guests}
Year{project.year}
{project.lead}
{project.body.map((para, i) =>

{para}

)}
— How we work

Four phases, one team.

The studio runs an integrated creative + production team — one point of contact, one accountability.
{phases.map(p => (
{p.num}

{p.title}

{p.body}

))}
— Selected frames

The room, in detail.

{project.photographer}
{project.gallery.map((g, i) => (
setLb(g)} > {`${project.title}
{g.credit}
))}
— Next project

{next.title}

{next.sector} · {next.venue} · {next.year}
navigate('case', next.slug)}> {next.title}
{/* lightbox */} {lb && (
setLb(null)}>
{lb.credit}
)}
); } // ──────────────────────────────────────────────────────────────── // About // ──────────────────────────────────────────────────────────────── function About({ navigate }) { return (
— The studio

Twenty-one years
in the room.

Couture Events FZ-LLC was founded in Dubai in 2004 — a quiet luxury practice that has, over twenty-one years, become a familiar one. We work for couples, brands, royal households, and a long list of private hosts. We are deliberately small, and intentionally selective.

21
Years in business
500+
Events produced
4
Practices
14
Countries delivered in
— Founder & current leadership

A studio, in two acts.

Founded by Sarah Feyling in 2004 — one of the first dedicated luxury wedding planners in the region. Today the studio is led by Hannah Matthews, CEO & Creative Director.

ⓘ Public surname & founder status confirmation pending per design brief.

{TEAM.map((t) => (
{t.img ? {t.name} :
Portrait
requested
}
{t.role}

{t.name}

{t.bio}
— {t.yrs}
{t.note &&
ⓘ {t.note}
}
))}
— Studio history

A short chronology.

Independently held since 2004 · Couture Events FZ-LLC, Dubai
{TIMELINE.map(t => (
{t.yr}

{t.title}

{t.body}

))}
— Recognition

A small shelf.

We do not chase awards. These are noted because clients ask about them — each will appear with issuer and year, attributed and confirmed, before publishing.

{[ { name: 'Wedding Planner of the Year', issuer: 'WeddingsOnline (regional)', year: '2024', conf: 'attribution pending confirmation' }, { name: 'Conference of the Year', issuer: 'WOW Awards', year: '2024', conf: 'attribution pending confirmation' }, { name: '50 Under 50, MEA — Hannah Matthews', issuer: 'industry roundup', year: '2023', conf: 'attribution pending confirmation' }, { name: 'LinkedIn Top 200 Voices — Laura Shepherd', issuer: 'LinkedIn', year: '2024', conf: 'attribution pending confirmation' }, ].map(a => (

{a.name}

{a.year}
{a.issuer} · [ {a.conf} ]
))}
); } // ──────────────────────────────────────────────────────────────── // Contact (multi-step form) // ──────────────────────────────────────────────────────────────── function Contact({ navigate }) { const [step, setStep] = useStateP(0); const [data, setData] = useStateP({ name: '', email: '', phone: '', sector: '', when: '', guests: '', venue: '', message: '', }); const [errs, setErrs] = useStateP({}); const [submitted, setSubmitted] = useStateP(false); const sectors = [ { id: 'weddings', label: 'Wedding', desc: 'Single or multi-day' }, { id: 'corporate', label: 'Corporate', desc: 'Conference · launch · gala' }, { id: 'social', label: 'Social', desc: 'Birthday · anniversary · private' }, { id: 'proposals', label: 'Proposal', desc: 'Bespoke · couture' }, ]; const set = (k) => (e) => setData(d => ({ ...d, [k]: e.target.value })); const validate = (s) => { const e = {}; if (s === 0) { if (!data.sector) e.sector = 'Select an event type'; } if (s === 1) { if (!data.when) e.when = 'Approximate date or season'; if (!data.guests) e.guests = 'Estimated guest count'; } if (s === 2) { if (!data.name) e.name = 'Required'; if (!data.email || !/.+@.+\..+/.test(data.email)) e.email = 'Valid email required'; if (!data.phone) e.phone = 'Required'; } setErrs(e); return Object.keys(e).length === 0; }; const advance = () => { if (validate(step)) setStep(step + 1); }; const back = () => setStep(s => Math.max(0, s - 1)); const submit = () => { if (!validate(2)) return; setSubmitted(true); }; const steps = ['Practice', 'Event', 'Details']; return (
{!submitted ? ( <>
— Enquiry

Begin a conversation.

Tell us what you have in mind. We reply within one working day with next steps. Three short steps — no commitment, no price list.

{steps.map((s, i) => (
0{i + 1} · {s}
))}
{/* Step 0 — Practice */} {step === 0 && (
{sectors.map(s => (
{ setData(d => ({...d, sector: s.id})); setErrs(e => ({...e, sector: null})); }} >
{s.label}
{s.desc}
))}
{errs.sector &&
{errs.sector}
}
Step 1 of 3
)} {/* Step 1 — Event */} {step === 1 && (
{errs.when &&
{errs.when}
}
{errs.guests &&
{errs.guests}
}
)} {/* Step 2 — Details */} {step === 2 && (
{errs.name &&
{errs.name}
}
{errs.phone &&
{errs.phone}
}
{errs.email &&
{errs.email}
}