From 1aa7802a6129f430291e7853cf67f961ea3259a2 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Sun, 6 Sep 2026 21:04:16 +0000 Subject: [PATCH] =?UTF-8?q?fix(navbar):=20el=20men=C3=BA=20Departamentos?= =?UTF-8?q?=20no=20se=20cierra=20al=20mover=20el=20cursor=20hacia=20=C3=A9?= =?UTF-8?q?l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El panel del mega-menu tenía mt-1 respecto al botón -- como es position:absolute no suma a la altura del contenedor que escucha mouseenter/mouseleave, así que ese margen quedaba como una franja muerta: mover el cursor del botón hacia el panel disparaba mouseleave a mitad de camino y cerraba el menú antes de poder hacer clic en una categoría (reportado en vivo). Se elimina el gap (mt-1) y se agrega un delay de 200ms antes de cerrar, cancelable si el cursor vuelve a entrar, como margen extra para movimientos rápidos o en diagonal cerca del borde. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01THZFwPzrwv6VAbuwmaf5vR --- .../ecommerce/components/layout/navbar.tsx | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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) => (