{activeCategoryLabel}
{filteredProducts.length} món
{searchQuery ? `Không tìm thấy món nào cho "${searchQuery}"` : "Chưa có món trong danh mục này"}
{searchQuery && ( )}"use client"; import { useState, useEffect } from "react"; import Navbar from "@/components/Navbar"; import CartProduct from "@/components/CartProduct"; import { MENU_CATEGORIES, MOCK_PRODUCTS } from "@/lib/constants"; /** * Main page — sidebar + product grid layout. * * Layout: * [Sidebar (sticky, collapsible)] | [Main content (scrollable)] * * Sidebar state: * - Desktop (≥ 1024px): expanded by default * - Mobile (< 1024px): collapsed by default * * Product grid columns (responsive, depends on sidebar state): * Collapsed sidebar: 2 → sm:2 → lg:3 → xl:4 → 2xl:5 * Expanded sidebar: 1 → sm:2 → lg:2 → xl:3 → 2xl:4 */ export default function Home() { const [isSidebarOpen, setIsSidebarOpen] = useState(false); const [activeCategory, setActiveCategory] = useState("all"); const [searchQuery, setSearchQuery] = useState(""); /* Default: expanded on desktop, collapsed on mobile */ useEffect(() => { const mq = window.matchMedia("(min-width: 1024px)"); setIsSidebarOpen(mq.matches); const handler = (e: MediaQueryListEvent) => setIsSidebarOpen(e.matches); mq.addEventListener("change", handler); return () => mq.removeEventListener("change", handler); }, []); /* Filter products by active category + search query */ const filteredProducts = MOCK_PRODUCTS.filter((p) => { const matchesCategory = activeCategory === "all" || p.category === activeCategory; const matchesSearch = searchQuery.trim() === "" || p.name.toLowerCase().includes(searchQuery.toLowerCase()) || p.description.toLowerCase().includes(searchQuery.toLowerCase()); return matchesCategory && matchesSearch; }); /* Active category label */ const activeCategoryLabel = MENU_CATEGORIES.find((c) => c.id === activeCategory)?.name ?? "Tất cả"; /* Responsive grid class based on sidebar state * Base (< 480px) : 1 col — very small phones * min-[480px] : 2 cols — larger phones * lg+ : 2/3 cols depending on sidebar */ const gridCols = isSidebarOpen ? "grid-cols-1 min-[480px]:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4" : "grid-cols-1 min-[480px]:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5"; return ( /* Outer wrapper: flex row, align-items: flex-start so sidebar sticks */
{filteredProducts.length} món
{searchQuery ? `Không tìm thấy món nào cho "${searchQuery}"` : "Chưa có món trong danh mục này"}
{searchQuery && ( )}