import React from 'react'; import { Sidebar } from './components/Sidebar'; import { Topbar } from './components/Topbar'; import { usePage } from '@inertiajs/react'; interface Props { children: React.ReactNode; } export default function AuthenticatedLayout({ children }: Props) { const { system_settings } = usePage().props as any; const primaryColor = system_settings?.primary_color; const [theme, setTheme] = React.useState(() => { if (typeof window !== 'undefined') { return localStorage.getItem('theme') || 'light'; } return 'light'; }); const [sidebarOpen, setSidebarOpen] = React.useState(false); React.useEffect(() => { if (theme === 'dark') { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } localStorage.setItem('theme', theme); }, [theme]); // Close sidebar on route change (mobile) const url = usePage().url; React.useEffect(() => { setSidebarOpen(false); }, [url]); return (
{/* Mobile overlay */}
setSidebarOpen(false)} className={`fixed inset-0 z-10 bg-black/40 backdrop-blur-sm lg:hidden transition-opacity duration-300 ${sidebarOpen ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'}`} /> {/* Sidebar — desktop: always visible in flow; mobile: fixed slide-in */}
setTheme(t => t === 'dark' ? 'light' : 'dark')} onMenuToggle={() => setSidebarOpen(o => !o)} sidebarOpen={sidebarOpen} />
{children}
); }