/* WHY NOT? POKER NIGHT × FONTAINEBLEAU LAS VEGAS — private registration */
const { useState, useEffect, useMemo, useRef } = React;
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"heroImage": "Poker Night",
"accent": "#89764A",
"eventDate": "Thursday, September 17, 2026",
"eventTime": "6:00 PM",
"venue": "Solo Lounge"
}/*EDITMODE-END*/;
const HERO_IMAGES = {
"Poker Night": "fontainebleau/assets/hero-poker.jpg",
"Penthouse": "fontainebleau/assets/hero-penthouse.jpg",
"Lobby": "fontainebleau/assets/lobby.jpg",
"Exterior": "fontainebleau/assets/exterior.jpg",
};
const TIERS = [
{
id: "salon", name: "Salon Seat", suit: "\u2660", price: 2500, unit: "per seat", perSeat: true,
list: ["Private tournament entry & chip stack", "Champagne reception & seated dinner", "Bowtie welcome gift & commemorative chips"],
},
{
id: "table", name: "Reserved Table", suit: "\u2666", price: 18000, unit: "table of eight", perSeat: false, seats: 8,
list: ["Eight seats, premier salon placement", "Dedicated host & reserved bottle service", "Recognition on event signage", "Welcome gifts for the full table"],
},
{
id: "patron", name: "Founding Patron", suit: "\u2663", price: 40000, unit: "presenting partner", perSeat: false, seats: 8,
list: ["Branded table of eight, prime placement", "Private suite access for up to ten guests", "Logo on step-and-repeat & program", "Overnight suite at Fontainebleau Las Vegas"],
},
];
const fmt = (n) => n.toLocaleString("en-US");
/* ---------- scroll utilities ---------- */
function useReveal() {
useEffect(() => {
const els = [...document.querySelectorAll(".reveal")];
const reveal = (el) => el.classList.add("in");
const check = () => {
const h = window.innerHeight || 800;
els.forEach((el) => {
if (el.classList.contains("in")) return;
const r = el.getBoundingClientRect();
if (r.top < h * 0.92 && r.bottom > 0) reveal(el);
});
};
check();
window.addEventListener("scroll", check, { passive: true });
window.addEventListener("resize", check);
let io;
if ("IntersectionObserver" in window) {
io = new IntersectionObserver(
(entries) => entries.forEach((e) => { if (e.isIntersecting) reveal(e.target); }),
{ threshold: 0, rootMargin: "0px 0px -6% 0px" }
);
els.forEach((el) => io.observe(el));
}
const safety = setTimeout(() => els.forEach(reveal), 2600);
return () => {
window.removeEventListener("scroll", check);
window.removeEventListener("resize", check);
io && io.disconnect();
clearTimeout(safety);
};
}, []);
}
function useScrolled() {
const [s, setS] = useState(false);
useEffect(() => {
const onScroll = () => setS(window.scrollY > 60);
window.addEventListener("scroll", onScroll, { passive: true });
return () => window.removeEventListener("scroll", onScroll);
}, []);
return s;
}
const scrollTo = (id) => document.getElementById(id)?.scrollIntoView({ behavior: "smooth", block: "start" });
const SuitRule = ({ className = "" }) => (
);
/* ---------- NAV ---------- */
function Nav() {
const scrolled = useScrolled();
return (
);
}
/* ---------- HERO SLIDER (splash + venue gallery in one) ---------- */
const SLIDES = [
{ kind: "splash", img: "https://whynotfoundation.org/wp-content/uploads/2026/06/hero-westbrook-v3.jpg" },
{ kind: "venue", img: "fontainebleau/assets/exterior.jpg", title: "Fontainebleau Las Vegas", sub: "The Strip's most anticipated address." },
{ kind: "venue", img: "fontainebleau/assets/lobby.jpg", title: "The Grand Lobby", sub: "Brass, marble, and a thousand roses beneath the dome." },
{ kind: "venue", img: "fontainebleau/assets/bleaubar.jpg", title: "The Casino Floor", sub: "The social heart of the room, crowned in light." },
{ kind: "venue", img: "fontainebleau/assets/hero-penthouse.jpg", title: "The Penthouse Salon", sub: "Where our private evening of play unfolds, high above the city." },
];
function Hero({ t }) {
const [i, setI] = useState(0);
const timer = useRef(null);
const auto = () => { clearInterval(timer.current); timer.current = setInterval(() => setI((p) => (p + 1) % SLIDES.length), 7000); };
const go = (n) => { setI((n + SLIDES.length) % SLIDES.length); auto(); };
useEffect(() => { auto(); return () => clearInterval(timer.current); }, []);
return (
clearInterval(timer.current)} onMouseLeave={auto}>
{SLIDES.map((s, idx) => (
))}
The 6th Annual Why Not? Poker Night
{t.eventDate}
·
{t.venue}
scrollTo("register")}>
Request Your Place →
scrollTo("invite")}>The Evening
go(i - 1)}>‹
go(i + 1)}>›
{SLIDES.map((_, idx) => (
go(idx)} />
))}
);
}
/* ---------- INVITATION / WELCOME ---------- */
function Invitation() {
return (
An Evening of Consequence,Hosted in the Sky
For one private evening, the Why Not? Foundation takes residence at Fontainebleau
Las Vegas — the Strip's most anticipated address — for a night of cards, cause, and
quiet glamour reserved for our closest friends and patrons.
Every seat at the table directly funds the foundation's mission of creating pathways
of empowerment for underserved populations in South Los Angeles. This registration is
extended by invitation; your access code accompanies your invitation.
);
}
/* ---------- THE VENUE ---------- */
function Venue() {
return (
The Venue
Solo Lounge,at Fontainebleau
Tucked within Fontainebleau Las Vegas, Solo Lounge sets the stage for the evening —
an intimate room of brass, marble, and candlelight, steps from the casino floor.
Cocktails and conversation give way to the tables, where the night's play unfolds
in quiet luxury, just for our guests.
);
}
/* ---------- DETAILS ---------- */
function Details({ t }) {
const cells = [
{ k: "Date", v: t.eventDate.split(",")[0], s: t.eventDate.split(",").slice(1).join(",").trim() },
{ k: "Venue", v: t.venue, s: "at Fontainebleau Las Vegas" },
{ k: "Attire", v: "Black Tie", s: "Cocktail optional" },
];
return (
The Particulars
The Evening
{cells.map((c, i) => (
))}
);
}
/* ---------- REGISTER ---------- */
function Register({ t, onConfirm }) {
const [tierId, setTierId] = useState("table");
const [seats, setSeats] = useState(2);
const [form, setForm] = useState({ code: "", name: "", email: "", phone: "", org: "", guests: "", diet: "", comments: "" });
const [errors, setErrors] = useState({});
const tier = TIERS.find((x) => x.id === tierId);
const total = useMemo(() => (tier.perSeat ? tier.price * seats : tier.price), [tier, seats]);
const set = (k, v) => setForm((f) => ({ ...f, [k]: v }));
const validate = () => {
const e = {};
if (!form.code.trim()) e.code = "Your invitation code is required";
if (!form.name.trim()) e.name = "Required";
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(form.email)) e.email = "Enter a valid email";
if (!form.phone.trim()) e.phone = "Required";
setErrors(e);
return Object.keys(e).length === 0;
};
const submit = (ev) => {
ev.preventDefault();
if (!validate()) { document.querySelector(".field.err input")?.focus(); return; }
onConfirm({
name: form.name, email: form.email,
tierName: tier.name, seats: tier.perSeat ? seats : tier.seats, total,
});
};
return (
Reserve Your Place
Registration
Select your table and confirm your details below. Every reservation directly
supports the foundation's work in South Los Angeles.
{TIERS.map((x) => (
setTierId(x.id)}>
{x.name}
$ {fmt(x.price)}
{x.unit}
{x.list.map((l, i) => {l} )}
{tierId === x.id ? "Selected" : "Select"}
))}
);
}
function Field({ id, label, req, type = "text", val, err, onChange, placeholder, textarea }) {
return (
{label}{req && * }
{textarea
?
);
}
/* ---------- CONFIRMATION ---------- */
function Confirmation({ data, onClose }) {
return (
{data && (
e.stopPropagation()}>
✕
You Are Confirmed
We Shall See You at the Table
Thank you, {data.name.split(" ")[0]} . Your {data.tierName}
{data.seats ? <> — {data.seats} {data.seats > 1 ? "seats" : "seat"}> : null} is reserved for the
private Why Not? Poker Night at Fontainebleau Las Vegas.
A confirmation, suite details, and arrival instructions are on their way to {data.email} .
Done
)}
);
}
/* ---------- FOOTER ---------- */
function Footer() {
return (
);
}
/* ---------- APP ---------- */
function App() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [confirm, setConfirm] = useState(null);
useReveal();
useEffect(() => {
document.documentElement.style.setProperty("--gold", t.accent);
}, [t.accent]);
useEffect(() => {
const el = document.getElementById("loader");
if (!el) return;
const t1 = setTimeout(() => el.classList.add("hide"), 1700);
const t2 = setTimeout(() => { el.remove(); }, 2500);
return () => { clearTimeout(t1); clearTimeout(t2); };
}, []);
return (
<>
setConfirm(null)} />
setTweak("heroImage", v)} />
setTweak("accent", v)} />
setTweak("eventDate", v)} />
setTweak("eventTime", v)} />
setTweak("venue", v)} />
>
);
}
ReactDOM.createRoot(document.getElementById("root")).render( );