From f5538ed621f9698ee2395c8ec540e82ca6cccba3 Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Mon, 24 Aug 2026 22:08:46 +0530 Subject: [PATCH] fix(ui): keep mega menu open across hover gap --- bun.lock | 2 +- docs/ui-visual-contract-0.8.json | 2 +- packages/ui/components/MegaMenu.wrn | 24 ++++++++++++++++++++++-- packages/ui/package.json | 2 +- packages/ui/test/ui.test.ts | 9 +++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index dac8f2c6..225a0c6d 100644 --- a/bun.lock +++ b/bun.lock @@ -688,7 +688,7 @@ }, "packages/ui": { "name": "@wrnexus/ui", - "version": "0.8.31", + "version": "0.8.32", "dependencies": { "@wrnexus/core": "workspace:*", }, diff --git a/docs/ui-visual-contract-0.8.json b/docs/ui-visual-contract-0.8.json index b13bdbcd..add62132 100644 --- a/docs/ui-visual-contract-0.8.json +++ b/docs/ui-visual-contract-0.8.json @@ -55,7 +55,7 @@ "packages/ui/components/Map.wrn": "3e6d5de5a21dd050c5c65950d6fb2f89af4024e1856a48f055b65b88fcd7b890", "packages/ui/components/MarketingSectionHeader.wrn": "39b79499b77dc1c7d34e4e5ecb45a9ddc6182f78c2a2586671c4fa07f44679ad", "packages/ui/components/Marquee.wrn": "81cd80732be34c8d7e4bf28b00347e1a9273166afdf66589d9f5d5774b69403b", - "packages/ui/components/MegaMenu.wrn": "c86a18489b5316047466b54a7c0b439e1b56539ab446ac88eb413a0d2c33781b", + "packages/ui/components/MegaMenu.wrn": "1fdd962bfc30a5f0eaa563e5b055760d86f9c737f0d664286977894485d7b045", "packages/ui/components/MetricCard.wrn": "513a6e99be3d9db46d96af9942b51331a0a048b184603e77e814506f0a52bdc5", "packages/ui/components/MetricGrid.wrn": "1fcebf51dcbe8520fe16bda904c1ef206c25c3900438d53877492c64ea21a1a5", "packages/ui/components/Modal.wrn": "7fa4b877772736f29f690e24d8742922b310397ef3083f0b78acb67a9f0d14b2", diff --git a/packages/ui/components/MegaMenu.wrn b/packages/ui/components/MegaMenu.wrn index b969b2d1..d5869732 100644 --- a/packages/ui/components/MegaMenu.wrn +++ b/packages/ui/components/MegaMenu.wrn @@ -44,6 +44,7 @@ component MegaMenu { } state visible = defaultOpen + state closeTimer = null functions { shared function columnList() { @@ -59,15 +60,32 @@ component MegaMenu { } client function showPanel(sourceEvent) { + cancelScheduledHide() visible = true output.open({ sourceEvent: sourceEvent }) } client function hidePanel(reason) { + cancelScheduledHide() visible = false output.close({ reason: reason }) } + client function cancelScheduledHide() { + if (closeTimer) { + window.clearTimeout(closeTimer) + closeTimer = null + } + } + + client function scheduleHide() { + cancelScheduledHide() + closeTimer = window.setTimeout(function () { + closeTimer = null + hidePanel("pointer-leave") + }, 220) + } + client function togglePanel(sourceEvent) { if (visible) { hidePanel("toggle") @@ -121,7 +139,8 @@ component MegaMenu { data-full-width='{fullWidth ? "true" : "false"}' data-column-count='{columnCount}' @keydown='handleKeydown(event)' - @mouseleave='hidePanel("pointer-leave")' + @mouseenter='cancelScheduledHide()' + @mouseleave='scheduleHide()' >