Skip to content

Commit

Permalink
fix(NavigationMenu): pointerEvent closing content premature (#749)
Browse files Browse the repository at this point in the history
  • Loading branch information
zernonia committed Mar 11, 2024
1 parent 17099af commit 0c14fdc
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 13 deletions.
13 changes: 3 additions & 10 deletions packages/radix-vue/src/NavigationMenu/NavigationMenuContent.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<script lang="ts">
import type { PointerDownOutsideEvent } from '@/DismissableLayer'
import type { NavigationMenuContentImplEmits, NavigationMenuContentImplProps } from './NavigationMenuContentImpl.vue'
export type NavigationMenuContentEmits = NavigationMenuContentImplEmits
Expand All @@ -17,7 +16,7 @@ export interface NavigationMenuContentProps extends NavigationMenuContentImplPro
import { computed } from 'vue'
import { injectNavigationMenuContext } from './NavigationMenuRoot.vue'
import { injectNavigationMenuItemContext } from './NavigationMenuItem.vue'
import { getOpenState } from './utils'
import { getOpenState, whenMouse } from './utils'
import { Presence } from '@/Presence'
import NavigationMenuContentImpl from './NavigationMenuContentImpl.vue'
import { useEmitAsProps, useForwardExpose } from '@/shared'
Expand Down Expand Up @@ -46,12 +45,6 @@ const isLastActiveValue = computed(() => {
return (menuContext.previousValue.value === itemContext.value)
return false
})
function handlePointerDown(ev: PointerDownOutsideEvent) {
emits('pointerDownOutside', ev)
if (!ev.preventDefault)
menuContext.onContentLeave()
}
</script>

<template>
Expand All @@ -65,8 +58,8 @@ function handlePointerDown(ev: PointerDownOutsideEvent) {
}"
v-bind="{ ...$attrs, ...props, ...emitsAsProps }"
@pointerenter="menuContext.onContentEnter(itemContext.value)"
@pointerleave="menuContext.onContentLeave()"
@pointerdown="handlePointerDown"
@pointerleave="whenMouse(() => menuContext.onContentLeave())"
@pointer-down-outside="emits('pointerDownOutside', $event)"
@focus-outside="emits('focusOutside', $event)"
@interact-outside="emits('interactOutside', $event)"
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ function handlePointerDownOutside(ev: PointerDownOutsideEvent) {
item.contains(target),
)
const isRootViewport
= menuContext.isRootMenu && menuContext.viewport.value?.contains(target)
= menuContext.isRootMenu && menuContext.viewport.value?.contains(target)
if (isTrigger || isRootViewport || !menuContext.isRootMenu)
ev.preventDefault()
Expand All @@ -112,6 +112,7 @@ watchEffect((cleanupFn) => {
if (menuContext.isRootMenu && content) {
// Bubble dismiss to the root content node and focus its trigger
const handleClose = () => {
menuContext.onItemDismiss()
itemContext.onRootContentClose()
if (content.contains(document.activeElement))
itemContext.triggerRef.value?.focus()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {
} from 'vue'
import { useResizeObserver } from '@vueuse/core'
import { injectNavigationMenuContext } from './NavigationMenuRoot.vue'
import { getOpenState } from './utils'
import { getOpenState, whenMouse } from './utils'
import {
Primitive,
} from '@/Primitive'
Expand Down Expand Up @@ -85,7 +85,7 @@ useResizeObserver(content, () => {
['--radix-navigation-menu-viewport-height' as any]: size ? `${size?.height}px` : undefined,
}"
@pointerenter="menuContext.onContentEnter(menuContext.modelValue.value)"
@pointerleave="menuContext.onContentLeave()"
@pointerleave="whenMouse(() => menuContext.onContentLeave())"
>
<slot />
</Primitive>
Expand Down
4 changes: 4 additions & 0 deletions packages/radix-vue/src/NavigationMenu/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,7 @@ export function removeFromTabOrder(candidates: HTMLElement[]) {
})
}
}

export function whenMouse<E extends PointerEvent>(handler: (event?: E) => void) {
return (event: E) => (event.pointerType === 'mouse' ? handler(event) : undefined)
}

0 comments on commit 0c14fdc

Please sign in to comment.