feat(layout): auto-collapse sidebar when clicking main content area

- Import `useUiStore` into `main-layout.tsx` to access the global sidebar state.
- Add an `onClick` event listener to the main content wrapper.
- Automatically close the sidebar if it is expanded and the user clicks outside of it.
- Enhance overall UX by providing a more intuitive, frictionless way to dismiss the navigation menu.
This commit is contained in:
seriouselly
2026-06-12 12:57:30 +07:00
parent 3b8cb49f2a
commit bc58b16ddd
+13 -1
View File
@@ -3,19 +3,29 @@ import { Footer } from "./footer";
import { Sidebar } from "./sidebar"; import { Sidebar } from "./sidebar";
import { MobileNav } from "./mobile-nav"; import { MobileNav } from "./mobile-nav";
import { Leaf, Menu } from "lucide-react"; import { Leaf, Menu } from "lucide-react";
import { useUiStore } from "@/store/ui-store";
type Props = { children: ReactNode }; type Props = { children: ReactNode };
export function MainLayout({ children }: Props) { export function MainLayout({ children }: Props) {
const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
const isSidebarOpen = useUiStore((state) => state.isSidebarOpen);
const setIsSidebarOpen = useUiStore((state) => state.setIsSidebarOpen);
return ( return (
<div className="flex w-full h-screen bg-[#ECF4E8] overflow-hidden relative"> <div className="flex w-full h-screen bg-[#ECF4E8] overflow-hidden relative">
{/* Sidebar Desktop */} {/* Sidebar Desktop */}
<Sidebar /> <Sidebar />
{/* Main Content */} {/* Main Content */}
<div className="flex-1 flex flex-col w-full h-screen overflow-hidden"> <div className="flex-1 flex flex-col w-full h-screen overflow-hidden"
onClick={() => {
if (isSidebarOpen) {
setIsSidebarOpen(false);
}
}}
>
{/* Header Mobile */} {/* Header Mobile */}
<div className="md:hidden flex items-center justify-between px-5 h-20 bg-[#306D29] text-white shrink-0 shadow-sm z-20"> <div className="md:hidden flex items-center justify-between px-5 h-20 bg-[#306D29] text-white shrink-0 shadow-sm z-20">
<div className="flex items-center gap-3 font-semibold"> <div className="flex items-center gap-3 font-semibold">
@@ -40,10 +50,12 @@ export function MainLayout({ children }: Props) {
</div> </div>
{/* Mobile Navigation */} {/* Mobile Navigation */}
<div className="block md:hidden shrink-0">
<MobileNav <MobileNav
open={mobileMenuOpen} open={mobileMenuOpen}
onClose={() => setMobileMenuOpen(false)} onClose={() => setMobileMenuOpen(false)}
/> />
</div>
{/* Page Content */} {/* Page Content */}
<main className="flex-1 overflow-y-auto p-4 sm:p-6 lg:p-8"> <main className="flex-1 overflow-y-auto p-4 sm:p-6 lg:p-8">