diff --git a/workloads/ecommerce/components/layout/navbar.tsx b/workloads/ecommerce/components/layout/navbar.tsx index b392300..57f122b 100644 --- a/workloads/ecommerce/components/layout/navbar.tsx +++ b/workloads/ecommerce/components/layout/navbar.tsx @@ -199,6 +199,24 @@ function CategoryNavBar({ function DepartmentsMegaMenu({ tree, isActive }: { tree: CategoryNode[]; isActive: (name: string) => boolean }) { const [open, setOpen] = useState(false); const containerRef = useRef(null); + const closeTimer = useRef | null>(null); + + const cancelClose = () => { + if (closeTimer.current) { + clearTimeout(closeTimer.current); + closeTimer.current = null; + } + }; + // Delay corto en vez de cerrar al toque: aunque el gap entre el boton y + // el panel ya se elimino (antes era la causa real -- el panel es + // absolute y no suma a la altura del contenedor, asi que un mt-1 ahi + // dejaba una franja muerta que cerraba el menu a mitad de camino, + // reportado en vivo), este margen extra tolera movimientos rapidos o en + // diagonal cerca del borde sin reabrir nada raro. + const scheduleClose = () => { + cancelClose(); + closeTimer.current = setTimeout(() => setOpen(false), 200); + }; useEffect(() => { if (!open) return; @@ -216,8 +234,15 @@ function DepartmentsMegaMenu({ tree, isActive }: { tree: CategoryNode[]; isActiv }; }, [open]); + useEffect(() => () => cancelClose(), []); + + const openNow = () => { + cancelClose(); + setOpen(true); + }; + return ( -
setOpen(true)} onMouseLeave={() => setOpen(false)}> +
{open && ( -
+
{tree.map((root) => (