/* App shell: router, register modal, mount */ const { useState: useStateApp, useEffect: useEffectApp } = React; const ROUTES = { home: HomePage, events: EventsPage, about: AboutPage, community: CommunityPage, poets: PoetsPage, journal: JournalPage, library: LibraryPage, perform: PerformPage, membership: MembershipPage, partners: PartnersPage, contact: ContactPage, }; function RegisterModal({ payload, onClose }) { const isMember = !!payload.membership; const [step, setStep] = useStateApp(1); const [guests, setGuests] = useStateApp(1); useEffectApp(() => { document.body.style.overflow = "hidden"; return () => { document.body.style.overflow = ""; }; }, []); return (
e.stopPropagation()}> {step === 1 ? (
{isMember ? "Become a member" : payload.status === "wait" ? "Join the waitlist" : "Reserve your seat"}

{isMember ? payload.membership : payload.title}

{isMember ? `${payload.price} / ${payload.per} · cancel anytime` : `${payload.date} · ${payload.time} · ${payload.venue}`}

{ e.preventDefault(); setStep(2); }} style={{ display: "grid", gap: 18 }}>
{!isMember && payload.status !== "wait" && (
{guests}
{payload.price} each · {payload.price.replace(/[^0-9]/g, "") * guests ? "₹" + (parseInt(payload.price.replace(/[^0-9]/g, "")) * guests).toLocaleString("en-IN") : payload.price}
)}

This is a demo — no payment is taken.

) : (
1 ? "s" : ""} for ${payload.title}. A confirmation is on its way to your inbox.`} />
)}
); } function App() { const [route, setRoute] = useStateApp(() => (location.hash.replace("#/", "") || "home")); const [reg, setReg] = useStateApp(null); const go = (to) => { if (to === route) { window.scrollTo({ top: 0, behavior: "smooth" }); return; } location.hash = "#/" + to; }; useEffectApp(() => { const onHash = () => { const r = location.hash.replace("#/", "") || "home"; setRoute(ROUTES[r] ? r : "home"); window.scrollTo({ top: 0, behavior: "instant" in window ? "instant" : "auto" }); }; window.addEventListener("hashchange", onHash); return () => window.removeEventListener("hashchange", onHash); }, []); useEffectApp(() => { const playVids = () => { document.querySelectorAll("video").forEach((v) => v.play().catch(() => {})); }; playVids(); const evs = ["pointerdown", "touchstart", "scroll", "keydown"]; const once = () => { playVids(); evs.forEach((e) => window.removeEventListener(e, once)); }; evs.forEach((e) => window.addEventListener(e, once, { passive: true })); return () => evs.forEach((e) => window.removeEventListener(e, once)); }, [route]); const Page = ROUTES[route] || HomePage; const onRegister = (payload) => setReg(payload); return (