Spaces:
Sleeping
Sleeping
| "use client"; | |
| import { useState, useEffect } from "react"; | |
| import { usePathname } from "next/navigation"; | |
| import { Sidebar } from "./Sidebar"; | |
| import { TopNav } from "./TopNav"; | |
| export function AppShell({ children }: { children: React.ReactNode }) { | |
| const [sidebarOpen, setSidebarOpen] = useState(false); | |
| const pathname = usePathname(); | |
| // Close sidebar on route change (mobile nav tap) | |
| useEffect(() => { | |
| setSidebarOpen(false); | |
| }, [pathname]); | |
| // Prevent body scroll when sidebar is open on mobile | |
| useEffect(() => { | |
| document.body.style.overflow = sidebarOpen ? "hidden" : ""; | |
| return () => { document.body.style.overflow = ""; }; | |
| }, [sidebarOpen]); | |
| return ( | |
| <div className="app-layout"> | |
| {sidebarOpen && ( | |
| <div | |
| className="sidebar-backdrop" | |
| onClick={() => setSidebarOpen(false)} | |
| aria-hidden="true" | |
| /> | |
| )} | |
| <Sidebar isOpen={sidebarOpen} onClose={() => setSidebarOpen(false)} /> | |
| <div className="app-main"> | |
| <TopNav onMenuToggle={() => setSidebarOpen((v) => !v)} /> | |
| <main className="app-content">{children}</main> | |
| </div> | |
| </div> | |
| ); | |
| } | |