// direction-obsidian.jsx — DIRECTION 01: Obsidian Cinema
// Cinematic, video-led, deep black, italic Cormorant serif, restrained gold.
// A refined evolution of the existing direction.
const obsidianStyles = {
bg: '#0A0908',
bgSoft: '#141312',
cream: '#E8E2D3',
gold: '#C9A24C',
goldSoft: '#A88B3A',
gray: '#6C6760',
graySoft: '#3B3833',
serif: '"Cormorant Garamond", Georgia, serif',
sans: '"Outfit", -apple-system, sans-serif',
mono: '"JetBrains Mono", ui-monospace, monospace'
};
function ObsidianHero({ onTickets, fullViewport } = {}) {
const s = obsidianStyles;
return (
{/* video bg */}
{/* vignette */}
{/* film grain */}
{/* top nav — only shown when standalone in canvas */}
{!fullViewport &&
Elevate Noir
The Evening Experience Sponsors Contact
Reserve
}
{/* corner marks */}
◇ EST 2026 · TORONTO
VOL · I · BLACK DREAM
{/* main content */}
A Luxury Experience Advancing Black Excellence
{[
['Date', GALA_DATA.date],
['Venue', GALA_DATA.venue + ' · Toronto'],
['Dress', GALA_DATA.dress],
['Theme', 'Black Dream']].
map(([k, v]) =>
)}
Reserve a Table →
{/* right edge scroll mark */}
);
}
// ----- sponsor flow -----
function ObsidianFlow() {
const s = obsidianStyles;
const flow = useSponsorFlow();
const StepDot = ({ n, label }) =>
= n ? s.gold : s.graySoft}`,
background: flow.step > n ? s.gold : 'transparent',
color: flow.step > n ? s.bg : flow.step === n ? s.gold : s.gray,
display: 'flex', alignItems: 'center', justifyContent: 'center',
fontFamily: s.mono, fontSize: 10, fontWeight: 500
}}>{flow.step > n ? '✓' : n}
= n ? s.cream : s.gray
}}>{label}
;
const Btn = ({ children, primary, onClick, disabled }) =>
{children} ;
return (
{/* faint background ornament */}
{/* header */}
SPONSORSHIP · 2026
Partner with us.
{/* step content */}
{flow.step === 1 &&
{TIERS.map((t) => {
const sel = flow.tierId === t.id;
return (
flow.setTierId(t.id)} style={{
background: sel ? `linear-gradient(180deg, ${s.gold}18, ${s.gold}04)` : s.bgSoft,
border: `1px solid ${sel ? s.gold : s.graySoft}`,
padding: '28px 22px', textAlign: 'left', cursor: 'pointer',
fontFamily: s.sans, color: s.cream, display: 'flex', flexDirection: 'column',
transition: 'all 0.25s', position: 'relative'
}}>
{String(TIERS.indexOf(t) + 1).padStart(2, '0')} · {t.avail} AVAIL
{t.name}
{money(t.price)}+
{t.perks.map((p) =>
— {p}
)}
{sel &&
●
}
);
})}
}
{flow.step === 2 &&
Add custom brand activations to amplify your visibility throughout the night. Optional — but each one is a moment.
{ACTIVATIONS.map((a) => {
const sel = flow.activations.includes(a.id);
return (
flow.toggleActivation(a.id)} style={{
background: sel ? `${s.gold}10` : s.bgSoft,
border: `1px solid ${sel ? s.gold : s.graySoft}`,
padding: '22px 26px', textAlign: 'left', cursor: 'pointer',
fontFamily: s.sans, color: s.cream, display: 'flex', alignItems: 'center', gap: 20
}}>
{sel && '✓'}
+{money(a.price)}
);
})}
}
{flow.step === 3 &&
{[
['Brand · Company', 'Acme Holdings Inc.'],
['Primary Contact', 'Ama Boateng'],
['Email', 'partnerships@acme.com'],
['Phone', '+1 416 555 0188']].
map(([label, ph], i) =>
)}
YOUR PARTNERSHIP
{flow.tier.name} Sponsor
{flow.tier.name} tier
{money(flow.tier.price)}
{flow.activations.map((id) => {
const a = ACTIVATIONS.find((x) => x.id === id);
return (
{a.name}
+{money(a.price)}
);
})}
Total
{money(flow.total)}
}
{flow.step === 4 &&
CONFIRMED · WELCOME TO THE TABLE
Thank you,partner.
We've received your {flow.tier.name.toLowerCase()} commitment of {money(flow.total)} . A partnership lead will reach out within 48 hours with the next steps.
Start again
}
{/* footer */}
{flow.step < 4 &&
Running Total
{money(flow.total)}
← Back
{flow.step === 3 ? 'Confirm Partnership →' : 'Continue →'}
}
);
}
Object.assign(window, { ObsidianHero, ObsidianFlow });