// Events page — properties hub + RedFest archive const { useState: useStateE } = React; function EventsPage({ t, go }) { const [active, setActive] = useStateE(PROPERTIES[0].id); const prop = PROPERTIES.find(p => p.id === active); return (
{t.sections.events}

What's
on.

Our home-grown live-entertainment properties. Upcoming dates and lineups are published only after client confirmation.

{/* Property selector tabs */}
{PROPERTIES.map(p => ( ))}
{/* Hero for active property */}
{prop.isStock && }
{prop.tag} · {prop.venue}

{prop.name}

{prop.blurb}

{/* Property meta */}
{[['Status', 'Dates TBA · awaiting confirmation'], [t.misc.venue, prop.venue], [t.misc.since, prop.since], [t.misc.cadence, prop.cadence]].map(([k,v])=>(
{k}
{v}
))}
{prop.note && (
Note {prop.note}
)}
{/* Archive — only meaningful for RedFest + DXBLaughs */} {prop.id === 'redfestdxb' && (
Past editions · 2014–2019

Six years.
Forty-plus headliners.

A factual archive of headliners verified through public sources. Post-2019 editions are not listed pending client confirmation.

{REDFEST_ARCHIVE.map(y => (
{y.year}
{y.headliners.map(h => ( {h}· ))}
{y.note &&
{y.note}
}
))}
)} {prop.id === 'dxblaughs' && (
Past performers · archive

The names that brought
the house down.

{DXBLAUGHS_ARCHIVE.map(n => (
{n} Archive
))}
Listed factually as historical archive. No endorsement implied. Artist names cleared for archival listing.
)} {prop.id !== 'redfestdxb' && prop.id !== 'dxblaughs' && (
Lineup & dates

{prop.name} dates and lineup will be published once confirmed by the client.

Join the newsletter to be first to know.

)} {/* All properties grid */}
All properties

The full slate.

{PROPERTIES.map(p => ( ))}
); } Object.assign(window, { EventsPage });