// app.jsx — router shell for saraslot const { useState: useStateA, useEffect: useEffectA } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "theme": "gold", "showBanner": true, "marqueeSpeed": "normal", "accent": "default" }/*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [bannerDismissed, setBannerDismissed] = useStateA(false); const [route, navigate] = useHashRoute(); const [theme, setTheme] = useThemeStore(t.theme); // Apply theme to root + marquee speed useEffectA(() => { document.documentElement.setAttribute("data-theme", theme); }, [theme]); 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]); // Stitch tweak panel → store sync (one-way: panel drives store) useEffectA(() => { if (t.theme && t.theme !== theme) setTheme(t.theme); }, [t.theme]); const showBanner = t.showBanner && !bannerDismissed && route === "/"; const handleThemeChange = (v) => { setTheme(v); setTweak("theme", v); }; return (