diff --git a/apps/main/src/components/Layout.tsx b/apps/main/src/components/Layout.tsx index 3c4f7f8..a844ede 100644 --- a/apps/main/src/components/Layout.tsx +++ b/apps/main/src/components/Layout.tsx @@ -1,7 +1,7 @@ import { Button } from "@xtablo/ui/components/button"; -import { MenuIcon } from "lucide-react"; -import { useEffect, useState } from "react"; -import { Outlet } from "react-router-dom"; +import { MenuIcon, XIcon } from "lucide-react"; +import { useCallback, useEffect, useState } from "react"; +import { Outlet, useLocation } from "react-router-dom"; import { twMerge } from "tailwind-merge"; import { SideNavigation } from "./NavigationBar"; import { OnboardingModal } from "./OnboardingModal"; @@ -12,6 +12,7 @@ const ONBOARDING_STORAGE_KEY = "xtablo-onboarding-completed"; export function Layout() { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [showOnboarding, setShowOnboarding] = useState(false); + const location = useLocation(); useEffect(() => { // Check if user has completed onboarding @@ -21,30 +22,64 @@ export function Layout() { } }, []); + // Close mobile menu on route change + useEffect(() => { + setIsMobileMenuOpen(false); + }, [location.pathname]); + const handleOnboardingComplete = () => { localStorage.setItem(ONBOARDING_STORAGE_KEY, "true"); setShowOnboarding(false); }; + const closeMobileMenu = useCallback(() => { + setIsMobileMenuOpen(false); + }, []); + return (
+ {/* Mobile menu toggle button - 44px min touch target */} + {/* Mobile backdrop overlay */}