reka-ui
Version:
Vue port for Radix UI Primitives.
1 lines • 3.71 kB
Source Map (JSON)
{"version":3,"file":"MenuItemImpl.cjs","sources":["../../src/Menu/MenuItemImpl.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\n\nexport interface MenuItemImplProps extends PrimitiveProps {\n /** When `true`, prevents the user from interacting with the item. */\n disabled?: boolean\n /**\n * Optional text used for typeahead purposes. By default the typeahead behavior will use the `.textContent` of the item. <br>\n * Use this when the content is complex, or you have non-textual content inside.\n */\n textValue?: string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { nextTick, ref } from 'vue'\nimport { isMouseEvent } from './utils'\nimport { injectMenuContentContext } from './MenuContentImpl.vue'\nimport {\n Primitive,\n} from '@/Primitive'\nimport { useCollection } from '@/Collection'\nimport { useForwardExpose } from '@/shared'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = defineProps<MenuItemImplProps>()\n\nconst contentContext = injectMenuContentContext()\nconst { forwardRef } = useForwardExpose()\nconst { CollectionItem } = useCollection()\n\nconst isFocused = ref(false)\n\nasync function handlePointerMove(event: PointerEvent) {\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n if (props.disabled) {\n contentContext.onItemLeave(event)\n }\n else {\n const defaultPrevented = contentContext.onItemEnter(event)\n if (!defaultPrevented) {\n const item = event.currentTarget;\n (item as HTMLElement)?.focus({ preventScroll: true })\n }\n }\n}\n\nasync function handlePointerLeave(event: PointerEvent) {\n await nextTick()\n if (event.defaultPrevented)\n return\n if (!isMouseEvent(event))\n return\n\n contentContext.onItemLeave(event)\n}\n</script>\n\n<template>\n <CollectionItem :value=\"{ textValue }\">\n <Primitive\n :ref=\"forwardRef\"\n role=\"menuitem\"\n tabindex=\"-1\"\n v-bind=\"$attrs\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-disabled=\"disabled || undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-highlighted=\"isFocused ? '' : undefined\"\n @pointermove=\"handlePointerMove\"\n @pointerleave=\"handlePointerLeave\"\n @focus=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented || disabled) return;\n isFocused = true;\n }\n \"\n @blur=\"\n async (event) => {\n await nextTick();\n if (event.defaultPrevented) return;\n isFocused = false;\n }\n \"\n >\n <slot />\n </Primitive>\n </CollectionItem>\n</template>\n"],"names":["injectMenuContentContext","useForwardExpose","useCollection","ref","isMouseEvent","nextTick"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,IAAA,MAAM,iBAAiBA,6CAAyB,EAAA;AAChD,IAAM,MAAA,EAAE,UAAW,EAAA,GAAIC,wCAAiB,EAAA;AACxC,IAAM,MAAA,EAAE,cAAe,EAAA,GAAIC,mCAAc,EAAA;AAEzC,IAAM,MAAA,SAAA,GAAYC,QAAI,KAAK,CAAA;AAE3B,IAAA,eAAe,kBAAkB,KAAqB,EAAA;AACpD,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAACC,wBAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA,OAE7B,MAAA;AACH,QAAM,MAAA,gBAAA,GAAmB,cAAe,CAAA,WAAA,CAAY,KAAK,CAAA;AACzD,QAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,UAAA,MAAM,OAAO,KAAM,CAAA,aAAA;AACnB,UAAC,IAAsB,EAAA,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA;AACtD;AACF;AAGF,IAAA,eAAe,mBAAmB,KAAqB,EAAA;AACrD,MAAA,MAAMC,YAAS,EAAA;AACf,MAAA,IAAI,KAAM,CAAA,gBAAA;AACR,QAAA;AACF,MAAI,IAAA,CAACD,wBAAa,KAAK,CAAA;AACrB,QAAA;AAEF,MAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}