// app.jsx — router shell for saraslot // Wraps the app tree in so every hook can read auth state, // and mounts the Login/Register modals at root. const { useState: useStateA, useEffect: useEffectA } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "theme": "gold", "showBanner": true, "marqueeSpeed": "normal", "accent": "default" }/*EDITMODE-END*/; function AppShell() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [bannerDismissed, setBannerDismissed] = useStateA(false); const [route, navigate] = useHashRoute(); const [theme, setTheme, themeHasStored] = useThemeStore(t.theme); const [authMode, setAuthMode] = useStateA(null); // null | "login" | "register" const branding = useBranding(); // Apply theme to useEffectA(() => { document.documentElement.setAttribute("data-theme", theme); }, [theme]); // Operator default theme — only when the visitor hasn't picked one themselves useEffectA(() => { const dt = branding.default_theme; const valid = window.THEMES || ["gold", "neon", "jade"]; if (themeHasStored && !themeHasStored.current && dt && valid.includes(dt) && dt !== theme) { setTheme(dt, false); } }, [branding.default_theme]); // Marquee speed control (from tweak panel) useEffectA(() => { if (t.marqueeSpeed === "slow") { document.documentElement.style.setProperty("--marquee-duration", "60s"); } else if (t.marqueeSpeed === "fast") { document.documentElement.style.setProperty("--marquee-duration", "18s"); } else { document.documentElement.style.removeProperty("--marquee-duration"); } }, [t.marqueeSpeed]); const showBanner = t.showBanner && !bannerDismissed && route === "/"; const handleThemeChange = (v) => { setTheme(v); setTweak("theme", v); }; return (
{showBanner && setBannerDismissed(true)} />}
setAuthMode("login")} onOpenRegister={() => setAuthMode("register")} /> {route === "/" && } {route === "/new" && } {route === "/history" && } {route === "/promo" && } {route === "/chat" && } {route === "/settings" && }
{branding.theme_fab_enabled !== false && ( )} setAuthMode(null)} onSwitchToRegister={() => setAuthMode("register")} /> setAuthMode(null)} onSwitchToLogin={() => setAuthMode("login")} />
{theme === "gold" && "Gold Rush — Premium Asian casino floor. Bold condensed sans, gold gradients, urgent."} {theme === "neon" && "Neon Pulse — Crypto/esports lounge. Glassmorphism, cyan→magenta, geometric tech sans."} {theme === "jade" && "Imperial Jade — VIP high-roller salon. Serif headlines, jade & antique gold, refined."}
{ setTweak("showBanner", v); setBannerDismissed(false); }} /> setTweak("marqueeSpeed", v)} />
); } function App() { return ( ); } ReactDOM.createRoot(document.getElementById("root")).render();