/* ZEN SUSHI — router + app shell. */ const { useState: uS, useEffect: uE } = React; const SEOx = window.KZ_SEO; const BLOGX = window.KZ_DATA.BLOG; function parseRoute() { let h = location.hash.replace(/^#/, ""); if (!h || h === "/") return { name: "home" }; const parts = h.split("/").filter(Boolean); // e.g. ["blog","slug"] const top = parts[0]; if (top === "blog" && parts[1]) { const post = BLOGX.find((p) => p.slug === parts[1]); return post ? { name: "blogPost", post } : { name: "blog" }; } const known = { menu: "menu", reservas: "reservas", delivery: "delivery", localizacao: "localizacao", blog: "blog", admin: "admin" }; return { name: known[top] || "home" }; } function App() { const [route, setRoute] = uS(parseRoute()); const [audOpen, setAudOpen] = uS(false); const [audTab, setAudTab] = uS("audit"); uE(() => { const onHash = () => { const r = parseRoute(); setRoute(r); if (window.lenis) window.lenis.scrollTo(0, { immediate: true }); else window.scrollTo({ top: 0, behavior: "auto" }); }; window.addEventListener("hashchange", onHash); return () => window.removeEventListener("hashchange", onHash); }, []); // apply SEO head for the active route uE(() => { const meta = route.name === "blogPost" ? SEOx.ROUTES.blogPost(route.post) : (SEOx.ROUTES[route.name] || SEOx.ROUTES.home)(); SEOx.applyHead(meta); // A altura da página muda a cada rota → remede o limite da Lenis. if (window.lenis) { requestAnimationFrame(() => window.lenis.resize()); setTimeout(() => window.lenis && window.lenis.resize(), 350); } }, [route]); let Page = null; switch (route.name) { case "home": Page = ; break; case "menu": Page = ; break; case "reservas": Page = ; break; case "delivery": Page = ; break; case "localizacao": Page = ; break; case "blog": Page = ; break; case "blogPost": Page = ; break; case "admin": Page = ; break; default: Page = ; } const isAdmin = route.name === "admin"; return (