// 432 Bleu — Box Office · main app
//
// OPTIMIZATION NOTES (future):
// - Replace Babel CDN + runtime JSX with a Vite build — removes ~1MB of babel.min.js overhead
// - Add og:image + og:description meta tags to index.html for social sharing previews
// - Lazy-load TicketDrawer (never needed on initial render)
const { useState: uS, useEffect: uE } = React;
function addToCalendar(show) {
const start = new Date(show.dateISO);
const end = new Date(start.getTime() + 3 * 60 * 60 * 1000);
const fmt = (d) => d.toISOString().replace(/[-:]/g, '').split('.')[0] + 'Z';
const url = 'https://calendar.google.com/calendar/render?action=TEMPLATE' +
'&text=' + encodeURIComponent('432.BLEU — ' + show.artist) +
'&dates=' + fmt(start) + '/' + fmt(end) +
'&details=' + encodeURIComponent(show.tagline + '\n\nhttps://boxoffice.432bleu.com') +
'&location=' + encodeURIComponent('432.BLEU · ' + show.room);
window.open(url, '_blank');
}
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "#00f0ff",
"intensity": 0.7,
"heroLayout": "split"
} /*EDITMODE-END*/;
function useViewport() {
const [w, setW] = uS(typeof window !== 'undefined' ? window.innerWidth : 1200);
uE(() => {
const on = () => setW(window.innerWidth);
window.addEventListener('resize', on);
return () => window.removeEventListener('resize', on);
}, []);
return w;
}
function BoxOffice() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [active, setActive] = uS(null); // selected show for drawer
const [filter, setFilter] = uS('all');
const [shows, setShows] = uS([]);
const [loading, setLoading] = uS(true);
const vw = useViewport();
const mobile = vw < 760;
const accent = t.accent;
uE(() => {
fetchShows().then(setShows).finally(() => setLoading(false));
}, []);
const [headline, ...rest] = shows;
const filtered = rest.filter((s) => {
if (filter === 'all') return true;
if (filter === 'available') return s.status !== 'sold-out';
return s.status === filter;
});
return (
{loading ? (
) : headline ? (
<>
setActive(headline)} />
>
) : (
)}
setActive(null)} />
setTweak('accent', v)} />
setTweak('intensity', v)} />
setTweak('heroLayout', v)} />
);
}
/* ───────────────────────── LOADING / EMPTY ───────────────────────── */
function LoadingState() {
return (
TUNING IN…
);
}
function EmptyState({ accent }) {
return (
NO SIGNAL
No upcoming shows
Check back soon — the season is being tuned.
);
}
/* ───────────────────────── NAV ───────────────────────── */
function Nav({ accent, mobile }) {
return (
);
}
/* ───────────────────────── HERO ───────────────────────── */
function Hero({ show, accent, mobile, layout, onGet }) {
const meta = STATUS_META[show.status];
const centered = layout === 'centered';
const eyebrow =
SEASON OPENER · {show.hz} Hz
;
const title =
{show.artist}
;
const tagline =
{show.tagline}
;
const datestack =
{[['DATE', show.dateLabel], ...(show.doorsLabel ? [['DOORS', show.doorsLabel]] : []), ['SHOW', show.timeLabel], ['ROOM', show.room]].map(([k, v]) =>
)}
;
const tierline =
{show.tiers.map((tr) =>
{tr.name}
{formatPrice(tr)}
)}
;
const cta =
;
// shared blob backdrop
const blob = (opacity, scale) =>
;
if (centered) {
return (
);
}
// split layout
return (
);
}
function StatusPill({ status, accent }) {
const meta = STATUS_META[status];
const colorMap = { cyan: accent, lime: BLEU.lime, mute: 'rgba(255,255,255,0.4)' };
const c = colorMap[meta.key];
return (
{meta.label}
);
}
/* ───────────────────────── CALENDAR ───────────────────────── */
function Calendar({ shows, accent, mobile, filter, setFilter, onPick }) {
const filters = [['all', 'ALL'], ['available', 'AVAILABLE'], ['sold-out', 'SOLD OUT']];
return (
THE SEASON · JUN 2026
Upcoming nights
{filters.map(([k, label]) =>
)}
{shows.length === 0 &&
NO NIGHTS MATCH THIS FILTER.
}
{shows.map((s, i) =>
)}
);
}
function ShowRow({ show, accent, mobile, onPick, first }) {
const [hov, setHov] = uS(false);
const soldOut = show.status === 'sold-out';
if (mobile) {
return (
onPick(show)} style={{
border: '1px solid rgba(95,230,221,0.16)', padding: '18px', cursor: 'pointer',
background: 'rgba(6,29,40,0.4)' }}>
{show.dateLabel}
{show.artist}
{show.doorsLabel ? `DOORS ${show.doorsLabel} · SHOW ` : ''}{show.timeLabel} · {show.room}
FROM {priceFrom(show)}
{soldOut ? 'WAITLIST →' : 'TICKETS →'}
);
}
return (
onPick(show)}
onMouseEnter={() => setHov(true)} onMouseLeave={() => setHov(false)}
style={{ display: 'grid', gridTemplateColumns: '150px 1fr 150px 150px 160px',
alignItems: 'center', gap: 20, padding: '24px 18px', cursor: 'pointer',
borderTop: first ? 'none' : '1px solid rgba(95,230,221,0.12)',
background: hov ? 'rgba(0,240,255,0.05)' : 'transparent',
transition: 'background 0.2s ease, padding-left 0.2s ease',
paddingLeft: hov ? 28 : 18,
position: 'relative' }}>
{hov &&
}
{show.dateLabel}
{show.doorsLabel ? `DOORS ${show.doorsLabel} · SHOW ` : ''}{show.timeLabel}
{show.artist}
{show.tagline}
{show.room}
);
}
/* ───────────────────────── FOOTER ───────────────────────── */
function FooterBlock({ accent, mobile }) {
return (
);
}
ReactDOM.createRoot(document.getElementById('root')).render();