reka-ui
Version:
Vue port for Radix UI Primitives.
1 lines • 8.09 kB
Source Map (JSON)
{"version":3,"file":"NavigationMenuTrigger.cjs","sources":["../../src/NavigationMenu/NavigationMenuTrigger.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { VNode } from 'vue'\nimport type { PrimitiveProps } from '@/Primitive'\nimport { useForwardExpose } from '@/shared'\nimport { useCollection } from '@/Collection'\n\nexport interface NavigationMenuTriggerProps extends PrimitiveProps {\n /** When `true`, prevents the user from interacting with item */\n disabled?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport { refAutoReset, unrefElement } from '@vueuse/core'\nimport { injectNavigationMenuContext } from './NavigationMenuRoot.vue'\nimport { injectNavigationMenuItemContext } from './NavigationMenuItem.vue'\nimport { getOpenState, makeContentId, makeTriggerId } from './utils'\nimport {\n Primitive,\n} from '@/Primitive'\nimport { VisuallyHidden } from '@/VisuallyHidden'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<NavigationMenuTriggerProps>(), {\n as: 'button',\n})\n\nconst menuContext = injectNavigationMenuContext()\nconst itemContext = injectNavigationMenuItemContext()\n\nconst { CollectionItem } = useCollection({ key: 'NavigationMenu' })\nconst { forwardRef, currentElement: triggerElement } = useForwardExpose()\nconst triggerId = ref('')\nconst contentId = ref('')\n\nconst hasPointerMoveOpenedRef = refAutoReset(false, 300)\nconst wasClickCloseRef = ref(false)\n\nconst open = computed(() => itemContext.value === menuContext.modelValue.value)\n\nonMounted(() => {\n itemContext.triggerRef = triggerElement\n triggerId.value = makeTriggerId(menuContext.baseId, itemContext.value)\n contentId.value = makeContentId(menuContext.baseId, itemContext.value)\n})\n\nfunction handlePointerEnter() {\n if (menuContext.disableHoverTrigger.value)\n return\n\n wasClickCloseRef.value = false\n itemContext.wasEscapeCloseRef.value = false\n}\n\nfunction handlePointerMove(ev: PointerEvent) {\n if (menuContext.disableHoverTrigger.value)\n return\n\n if (ev.pointerType === 'mouse') {\n if (\n props.disabled\n || wasClickCloseRef.value\n || itemContext.wasEscapeCloseRef.value\n || hasPointerMoveOpenedRef.value\n ) {\n return\n }\n\n menuContext.onTriggerEnter(itemContext.value)\n hasPointerMoveOpenedRef.value = true\n }\n}\n\nfunction handlePointerLeave(ev: PointerEvent) {\n if (menuContext.disableHoverTrigger.value)\n return\n\n if (ev.pointerType === 'mouse') {\n if (props.disabled)\n return\n menuContext.onTriggerLeave()\n hasPointerMoveOpenedRef.value = false\n }\n}\n\nfunction handleClick(event: PointerEvent) {\n if (event.pointerType === 'mouse' && menuContext.disableClickTrigger.value)\n return\n\n // if open via pointermove, we prevent click event\n if (hasPointerMoveOpenedRef.value)\n return\n\n if (open.value)\n menuContext.onItemSelect('')\n else menuContext.onItemSelect(itemContext.value)\n\n wasClickCloseRef.value = open.value\n}\n\nfunction handleKeydown(ev: KeyboardEvent) {\n const verticalEntryKey = menuContext.dir.value === 'rtl' ? 'ArrowLeft' : 'ArrowRight'\n const entryKey = { horizontal: 'ArrowDown', vertical: verticalEntryKey }[\n menuContext.orientation\n ]\n if (open.value && ev.key === entryKey) {\n itemContext.onEntryKeyDown()\n // Prevent FocusGroupItem from handling the event\n ev.preventDefault()\n ev.stopPropagation()\n }\n}\n\nfunction setFocusProxyRef(node: VNode) {\n // @ts-expect-error unrefElement expect MaybeRef, but also support Vnode\n itemContext.focusProxyRef.value = unrefElement(node)\n return undefined\n}\n\nfunction handleVisuallyHiddenFocus(ev: FocusEvent) {\n const content = document.getElementById(itemContext.contentId)\n const prevFocusedElement = ev.relatedTarget as HTMLElement | null\n\n const wasTriggerFocused = prevFocusedElement === triggerElement.value\n const wasFocusFromContent = content?.contains(prevFocusedElement)\n\n if (wasTriggerFocused || !wasFocusFromContent)\n itemContext.onFocusProxyEnter(wasTriggerFocused ? 'start' : 'end')\n}\n</script>\n\n<template>\n <CollectionItem>\n <Primitive\n :id=\"triggerId\"\n :ref=\"forwardRef\"\n :disabled=\"disabled\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-state=\"getOpenState(open)\"\n data-navigation-menu-trigger\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n :as-child=\"props.asChild\"\n :as=\"as\"\n v-bind=\"$attrs\"\n @pointerenter=\"handlePointerEnter\"\n @pointermove=\"handlePointerMove\"\n @pointerleave=\"handlePointerLeave\"\n @click=\"handleClick\"\n @keydown=\"handleKeydown\"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n\n <template v-if=\"open\">\n <VisuallyHidden\n :ref=\"setFocusProxyRef\"\n aria-hidden=\"true\"\n :tabindex=\"0\"\n @focus=\"handleVisuallyHiddenFocus\"\n />\n <span\n v-if=\"menuContext.viewport\"\n :aria-owns=\"contentId\"\n />\n </template>\n</template>\n"],"names":["injectNavigationMenuContext","injectNavigationMenuItemContext","useCollection","useForwardExpose","ref","refAutoReset","computed","onMounted","makeTriggerId","makeContentId","unrefElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2BA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAId,IAAA,MAAM,cAAcA,6DAA4B,EAAA;AAChD,IAAA,MAAM,cAAcC,iEAAgC,EAAA;AAEpD,IAAA,MAAM,EAAE,cAAe,EAAA,GAAIC,oCAAc,EAAE,GAAA,EAAK,kBAAkB,CAAA;AAClE,IAAA,MAAM,EAAE,UAAA,EAAY,cAAgB,EAAA,cAAA,KAAmBC,wCAAiB,EAAA;AACxE,IAAM,MAAA,SAAA,GAAYC,QAAI,EAAE,CAAA;AACxB,IAAM,MAAA,SAAA,GAAYA,QAAI,EAAE,CAAA;AAExB,IAAM,MAAA,uBAAA,GAA0BC,iBAAa,CAAA,KAAA,EAAO,GAAG,CAAA;AACvD,IAAM,MAAA,gBAAA,GAAmBD,QAAI,KAAK,CAAA;AAElC,IAAA,MAAM,OAAOE,YAAS,CAAA,MAAM,YAAY,KAAU,KAAA,WAAA,CAAY,WAAW,KAAK,CAAA;AAE9E,IAAAC,aAAA,CAAU,MAAM;AACd,MAAA,WAAA,CAAY,UAAa,GAAA,cAAA;AACzB,MAAA,SAAA,CAAU,KAAQ,GAAAC,kCAAA,CAAc,WAAY,CAAA,MAAA,EAAQ,YAAY,KAAK,CAAA;AACrE,MAAA,SAAA,CAAU,KAAQ,GAAAC,kCAAA,CAAc,WAAY,CAAA,MAAA,EAAQ,YAAY,KAAK,CAAA;AAAA,KACtE,CAAA;AAED,IAAA,SAAS,kBAAqB,GAAA;AAC5B,MAAA,IAAI,YAAY,mBAAoB,CAAA,KAAA;AAClC,QAAA;AAEF,MAAA,gBAAA,CAAiB,KAAQ,GAAA,KAAA;AACzB,MAAA,WAAA,CAAY,kBAAkB,KAAQ,GAAA,KAAA;AAAA;AAGxC,IAAA,SAAS,kBAAkB,EAAkB,EAAA;AAC3C,MAAA,IAAI,YAAY,mBAAoB,CAAA,KAAA;AAClC,QAAA;AAEF,MAAI,IAAA,EAAA,CAAG,gBAAgB,OAAS,EAAA;AAC9B,QACE,IAAA,KAAA,CAAM,YACH,gBAAiB,CAAA,KAAA,IACjB,YAAY,iBAAkB,CAAA,KAAA,IAC9B,wBAAwB,KAC3B,EAAA;AACA,UAAA;AAAA;AAGF,QAAY,WAAA,CAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAC5C,QAAA,uBAAA,CAAwB,KAAQ,GAAA,IAAA;AAAA;AAClC;AAGF,IAAA,SAAS,mBAAmB,EAAkB,EAAA;AAC5C,MAAA,IAAI,YAAY,mBAAoB,CAAA,KAAA;AAClC,QAAA;AAEF,MAAI,IAAA,EAAA,CAAG,gBAAgB,OAAS,EAAA;AAC9B,QAAA,IAAI,KAAM,CAAA,QAAA;AACR,UAAA;AACF,QAAA,WAAA,CAAY,cAAe,EAAA;AAC3B,QAAA,uBAAA,CAAwB,KAAQ,GAAA,KAAA;AAAA;AAClC;AAGF,IAAA,SAAS,YAAY,KAAqB,EAAA;AACxC,MAAA,IAAI,KAAM,CAAA,WAAA,KAAgB,OAAW,IAAA,WAAA,CAAY,mBAAoB,CAAA,KAAA;AACnE,QAAA;AAGF,MAAA,IAAI,uBAAwB,CAAA,KAAA;AAC1B,QAAA;AAEF,MAAA,IAAI,IAAK,CAAA,KAAA;AACP,QAAA,WAAA,CAAY,aAAa,EAAE,CAAA;AAAA,WACxB,WAAA,CAAY,YAAa,CAAA,WAAA,CAAY,KAAK,CAAA;AAE/C,MAAA,gBAAA,CAAiB,QAAQ,IAAK,CAAA,KAAA;AAAA;AAGhC,IAAA,SAAS,cAAc,EAAmB,EAAA;AACxC,MAAA,MAAM,gBAAmB,GAAA,WAAA,CAAY,GAAI,CAAA,KAAA,KAAU,QAAQ,WAAc,GAAA,YAAA;AACzE,MAAM,MAAA,QAAA,GAAW,EAAE,UAAY,EAAA,WAAA,EAAa,UAAU,gBAAiB,EAAA,CACrE,YAAY,WACd,CAAA;AACA,MAAA,IAAI,IAAK,CAAA,KAAA,IAAS,EAAG,CAAA,GAAA,KAAQ,QAAU,EAAA;AACrC,QAAA,WAAA,CAAY,cAAe,EAAA;AAE3B,QAAA,EAAA,CAAG,cAAe,EAAA;AAClB,QAAA,EAAA,CAAG,eAAgB,EAAA;AAAA;AACrB;AAGF,IAAA,SAAS,iBAAiB,IAAa,EAAA;AAErC,MAAY,WAAA,CAAA,aAAA,CAAc,KAAQ,GAAAC,iBAAA,CAAa,IAAI,CAAA;AACnD,MAAO,OAAA,MAAA;AAAA;AAGT,IAAA,SAAS,0BAA0B,EAAgB,EAAA;AACjD,MAAA,MAAM,OAAU,GAAA,QAAA,CAAS,cAAe,CAAA,WAAA,CAAY,SAAS,CAAA;AAC7D,MAAA,MAAM,qBAAqB,EAAG,CAAA,aAAA;AAE9B,MAAM,MAAA,iBAAA,GAAoB,uBAAuB,cAAe,CAAA,KAAA;AAChE,MAAM,MAAA,mBAAA,GAAsB,OAAS,EAAA,QAAA,CAAS,kBAAkB,CAAA;AAEhE,MAAA,IAAI,qBAAqB,CAAC,mBAAA;AACxB,QAAY,WAAA,CAAA,iBAAA,CAAkB,iBAAoB,GAAA,OAAA,GAAU,KAAK,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}