// Couture Events Worldwide — App shell, routing, Nav, Home, Footer const { useState, useEffect, useRef, useMemo, useCallback } = React; // ──────────────────────────────────────────────────────────────── // Tweakable defaults // ──────────────────────────────────────────────────────────────── const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "ivory", "displayFont": "cormorant", "heroLayout": "cinematic", "showConsentStrip": true }/*EDITMODE-END*/; // Apply tweaks to DOM (palette & font) function applyTweaks(t) { const root = document.documentElement; const palettes = { ivory: { paper: '#FBF8F3', ivory: '#F3EBDF', ink: '#1A1614', gold: '#B6924E', goldPale: '#D9C39A', line: '#E6DCCD' }, noir: { paper: '#F5F0E8', ivory: '#1A1614', ink: '#0F0C0B', gold: '#C9A86A', goldPale: '#D9C39A', line: '#2A2522' }, sand: { paper: '#F4ECDE', ivory: '#E8DDC8', ink: '#2A211B', gold: '#A87A3E', goldPale: '#CDA86E', line: '#D8C9AC' }, pearl: { paper: '#F7F4ED', ivory: '#EBE4D5', ink: '#26201C', gold: '#7C6B4A', goldPale: '#B5A079', line: '#DDD2BD' }, }; const p = palettes[t.palette] || palettes.ivory; root.style.setProperty('--paper', p.paper); root.style.setProperty('--ivory', p.ivory); root.style.setProperty('--ink', p.ink); root.style.setProperty('--gold', p.gold); root.style.setProperty('--gold-pale', p.goldPale); root.style.setProperty('--line', p.line); const fonts = { cormorant: "'Cormorant Garamond', serif", playfair: "'Playfair Display', serif", tenor: "'Tenor Sans', serif", italiana: "'Italiana', serif", }; // override the display font globally let style = document.getElementById('__tweak-font-style'); if (!style) { style = document.createElement('style'); style.id = '__tweak-font-style'; document.head.appendChild(style); } style.textContent = ` h1, h2, h3, h4, h5, .feature-txt h3, .sector-tile h3, .proj-card h3, .pullquote, .hero-title, .cs-hero h1, .about-hero h1, .leader-card .info h3, .footer-brand, .nav-brand, .timeline-list .yr, .cs-intro .lead, .contact-form-side h1, .event-types .pick .label, .feature-img-wrap, .success h2, .about-hero .stat .num, .contact-info .block .value, .press-item, .serif { font-family: ${fonts[t.displayFont] || fonts.cormorant}; } `; } // ──────────────────────────────────────────────────────────────── // Router (state-based, no history) // ──────────────────────────────────────────────────────────────── function useRouter() { const [route, setRoute] = useState({ page: 'home', slug: null }); const navigate = useCallback((page, slug = null) => { setRoute({ page, slug }); window.scrollTo({ top: 0, behavior: 'instant' }); }, []); return [route, navigate]; } // ──────────────────────────────────────────────────────────────── // Nav // ──────────────────────────────────────────────────────────────── function Nav({ route, navigate, dark }) { const [scrolled, setScrolled] = useState(false); const [lang, setLang] = useState('en'); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 30); onScroll(); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); const isActive = (p) => route.page === p; const links = [ { id: 'portfolio', label: 'Portfolio' }, { id: 'weddings', label: 'Weddings', goto: { page: 'portfolio', filter: 'weddings' } }, { id: 'corporate', label: 'Corporate', goto: { page: 'portfolio', filter: 'corporate' } }, { id: 'about', label: 'Studio' }, { id: 'contact', label: 'Contact' }, ]; return ( ); } // ──────────────────────────────────────────────────────────────── // Hero (cinematic, multi-image fade) // ──────────────────────────────────────────────────────────────── function Hero({ navigate, layout }) { const slides = [ { img: 'media/hero-bulgari-garden.webp', loc: 'Bulgari · Jumeira Bay', label: 'A Garden Reception' }, { img: 'media/hero-armani-ballroom.webp', loc: 'Armani · Burj Khalifa', label: 'A Ballroom in Monochrome' }, { img: 'media/hero-four-seasons.webp', loc: 'Four Seasons · Jumeirah', label: 'A Henna by the Sea' }, { img: 'media/wedding-zabeel-saray.webp', loc: 'Zabeel Saray · Palm', label: 'A Quiet Ballroom' }, ]; const [i, setI] = useState(0); useEffect(() => { const t = setInterval(() => setI(v => (v + 1) % slides.length), 6500); return () => clearInterval(t); }, []); return (
); } // ──────────────────────────────────────────────────────────────── // Sector tiles // ──────────────────────────────────────────────────────────────── function SectorTiles({ navigate }) { const tiles = [ { id: 'weddings', num: '01', label: 'Weddings', blurb: 'Multicultural celebrations, destination ceremonies, multi-day events.', img: 'media/wedding-armani.webp' }, { id: 'corporate', num: '02', label: 'Corporate', blurb: 'Conferences, launches, awards, galas, exhibitions, PR & influencer.', img: 'media/corporate-emirates-event.webp' }, { id: 'social', num: '03', label: 'Social', blurb: 'Milestone birthdays, anniversaries, private dinners, brand-of-one moments.', img: 'media/decor-zen-den-lounge.webp' }, { id: 'proposals', num: '04', label: 'Proposals', blurb: 'Bespoke "couture proposals" — quiet, cinematic, unrepeatable.', img: 'media/wedding-inna-ceremony.webp' }, ]; return (
— What we make

Four practices,
one studio.

Each sector is a distinct creative practice with its own production crew and design vocabulary — held together by a single studio standard. Briefs are bespoke; we never publish a price list.

{tiles.map(t => ( ))}
); } // ──────────────────────────────────────────────────────────────── // Featured projects (alternating layout) // ──────────────────────────────────────────────────────────────── function FeaturedProjects({ navigate }) { const featured = PROJECTS.filter(p => ['armani-pavilion','bulgari-garden','emirates-conference'].includes(p.slug)); return (
— Selected work · 2023–24

Three recent productions.

{featured.map((p, idx) => (
navigate('case', p.slug)} style={{cursor:'pointer'}} >
{p.title}
Project · {String(idx + 1).padStart(2,'0')}

{p.title}

{p.lead}

Sector
{p.sector}
Venue
{p.venue}
Guests
{p.guests}
Year
{p.year}
))}
); } // ──────────────────────────────────────────────────────────────── // Editorial / venue grid + press strip // ──────────────────────────────────────────────────────────────── function VenuesEditorial() { return (
— Familiar grounds

The rooms we know best.

We have produced events at most of the region's flagship hotels and a long list of private venues. Each room has its own rhythm; the design follows the architecture, never fights it.

Atlantis the Royal
Atlantis the RoyalDubai · 2024
Jumeirah Golf Estates
Jumeirah Golf EstatesDubai · 2023
Glass Pavilion
Glass PavilionSharjah · 2024
Shangri-La Oman
Shangri-LaMuscat · 2024
Address Beach Resort
Address Beach ResortDubai · 2023
); } function PressStrip() { return (
As featured in
{PRESS.map(p => ( {p.name}[ pending ] ))}
); } // ──────────────────────────────────────────────────────────────── // Pull-quote / philosophy // ──────────────────────────────────────────────────────────────── function Philosophy() { return (
— Philosophy
Note no. 04

" Every detail is curated with intention, every concept executed with artistry — ensuring each event is not just an occasion, but an unforgettable experience.

— Hannah Matthews CEO & Creative Director
); } // ──────────────────────────────────────────────────────────────── // Closing CTA band // ──────────────────────────────────────────────────────────────── function CTABand({ navigate }) { return (

Begin a conversation.

Every commission starts with a quiet conversation. Tell us what you have in mind — a date, a guest count, a feeling. We will reply within one working day with next steps. No price list, no commitment.

Message on WhatsApp
); } // ──────────────────────────────────────────────────────────────── // Footer // ──────────────────────────────────────────────────────────────── function Footer({ navigate }) { return ( ); } // ──────────────────────────────────────────────────────────────── // Consent strip // ──────────────────────────────────────────────────────────────── function ConsentStrip() { return (
  Design mockup — all event imagery shown is reference only. Photographer credit, couple & client consent pending per Couture Events publishing policy.
); } // ──────────────────────────────────────────────────────────────── // WhatsApp FAB // ──────────────────────────────────────────────────────────────── function WhatsAppFab() { return ( WhatsApp the Studio ); } // ──────────────────────────────────────────────────────────────── // Home page // ──────────────────────────────────────────────────────────────── function Home({ navigate, tweaks }) { return (
{tweaks.showConsentStrip && }
); } // ──────────────────────────────────────────────────────────────── // App // ──────────────────────────────────────────────────────────────── function App() { const [route, navigate] = useRouter(); const [tweaks, setTweaks] = useState(TWEAK_DEFAULTS); useEffect(() => { applyTweaks(tweaks); }, [tweaks]); // Nav uses default light/black styling on every page (no transparent-dark variant). const darkNav = false; return (
); } Object.assign(window, { App, applyTweaks });