// weddings.jsx — Real Weddings index + Case Study template function WeddingsIndex({ lang, onOpen, initialFilter }) { const ar = lang === 'ar'; const [venue, setVenue] = useState(initialFilter?.venue || 'all'); const [style, setStyle] = useState('All styles'); const [season, setSeason] = useState('All seasons'); useEffect(() => { if (initialFilter?.venue) setVenue(initialFilter.venue); }, [initialFilter]); const filtered = useMemo(() => { return WEDDINGS.filter(w => { if (venue !== 'all' && w.venueKey !== venue) return false; if (style !== 'All styles' && !w.style.includes(style)) return false; if (season !== 'All seasons' && !w.season.includes(season)) return false; return true; }); }, [venue, style, season]); return (
{/* Header */}
{ar ? 'حفلات حقيقية' : 'Real weddings · since 2012'}

Every
wedding tells
a story.

{ar ? 'استكشفي بورتفوليونا من الأعراس الحقيقية في دبي والإمارات. كل حفلة موثّقة بموافقة الزوجين واعتماد المصوّر.' : 'Browse our portfolio of real weddings across Dubai, RAK, and the UAE. Every wedding here is published with couple consent and full photographer credit.'}

{/* Filter bar */}
[v.key, v.label])}/> [s, s])}/> [s, s])}/>
{filtered.length} {ar ? 'حفلة' : (filtered.length === 1 ? 'wedding' : 'weddings')} {(venue !== 'all' || style !== 'All styles' || season !== 'All seasons') && ( )}
{/* Grid */}
{filtered.length === 0 ? (

No weddings match that combination — try broadening a filter.

) : (
{filtered.map((w, i) => (
))}
)}
); } function FilterMenu({ label, value, options, onChange }) { return ( ); } // ----------------- CASE STUDY ---------------------------------- function CaseStudy({ id, lang, onBack, onOpen }) { const ar = lang === 'ar'; const w = WEDDINGS.find(x => x.id === id) || WEDDINGS[0]; const next = WEDDINGS[(WEDDINGS.indexOf(w) + 1) % WEDDINGS.length]; return (
{/* Hero */}
{ar ? 'قصة عرس' : 'A wedding story'} · {w.season}

{w.title.replace('A ', '')}

{[ ['Venue', w.venue], ['Season', w.season], ['Style', w.style], ['Guests', w.guests], ].map(([k, v]) => (
{k}
{v}
))}
{/* The story */}
01 · The Story

How we
made it theirs.

"{w.concept}"

The couple came to us with a Pinterest board, a venue contract, and a knot in their stomachs about the budget. We spent the first chat listening, the second one cutting things they didn't actually care about, and the third one drawing the wedding back together — same dream, smaller spend, more of the bits that mattered.

Florals were designed by Joelle and delivered through The Lovely Flower Shop. Stationery was hand-set by Mona. The photographer was someone the couple already loved.

{/* Palette */}
Palette
{w.palette.map((c, i) => (
{c}
))}
{/* What we did */}
What we did
    {w.services.map(s => (
  • {s}
  • ))}
{/* Gallery — editorial layout */}
02 · The Gallery

Photographs from the day

{/* Editorial grid */}
{w.gallery.slice(0, 6).map((src, i) => { const layouts = [ { gc:'span 7', ar: 4/5 }, { gc:'span 5', ar: 4/5 }, { gc:'span 4', ar: 1 }, { gc:'span 4', ar: 1 }, { gc:'span 4', ar: 1 }, { gc:'span 12', ar: 21/9 }, ]; const l = layouts[i] || { gc:'span 6', ar: 4/5 }; return (
); })}
{/* Photographer credit row */}
Photography — {w.photographer} Published with the couple's consent
{/* Pull quote */}

"Joelle didn't sell us a wedding. She built ours, one honest conversation at a time. The day looked like us — only somehow prettier."

— A note from the couple
{/* Next wedding */}
Next story

{next.title}

{next.venue} · {next.season}
{e.preventDefault(); onOpen(next.id);}}>
); } Object.assign(window, { WeddingsIndex, CaseStudy });