diff --git a/src/app/layout/Menu.svelte b/src/app/layout/Menu.svelte index 1e0172e..3bbfd0b 100644 --- a/src/app/layout/Menu.svelte +++ b/src/app/layout/Menu.svelte @@ -58,7 +58,6 @@ let isTouch = $state(false); let isOpen = $state(false); let windowHeight = $state(0); - let pageLoadTimestamp = $state(0); // lifecycle $effect(() => { @@ -67,8 +66,6 @@ onMount(() => { document.addEventListener('astro:page-load', () => { - pageLoadTimestamp = Date.now(); - const touchStartListener = () => { isTouch = true; }; @@ -127,11 +124,16 @@ class:hidden={!(isOpen || showMenuPermanent)} class={isTouch ? 'pb-3' : 'group-hover/menu-bar:block pb-3'} onmouseenter={() => !isTouch && (isOpen = true)} - onmouseleave={() => { + onmouseleave={(event) => { if (isTouch) return; + // when navigated, the page reload may take a few ms and the menu isn't rendered, which js interprets as an mouse leave - // event. with the 50ms threshold this is mostly fixed, except for maybe slow connections - else if (Date.now() - pageLoadTimestamp > 50) isOpen = false; + // event + const { left, right, top, bottom } = event.currentTarget.getBoundingClientRect(); + const isOverMenu = + event.clientX >= left && event.clientX <= right && event.clientY >= top && event.clientY <= bottom; + + isOpen = isOverMenu; }} role="tooltip" >