hongluan-ui
Version:
Hongluan Component Library for Vue 3
1 lines • 4.68 kB
Source Map (JSON)
{"version":3,"file":"dropdown-item.mjs","sources":["../../../../../../packages/components/dropdown/src/dropdown-item.vue"],"sourcesContent":["<template>\n <hl-dropdown-collection-item\n :disabled=\"disabled\"\n :text-value=\"textValue ?? textContent\"\n >\n <hl-roving-focus-item :focusable=\"!disabled\">\n <hl-dropdown-item-impl\n v-bind=\"propsAndAttrs\"\n @pointerleave=\"handlePointerLeave\"\n @pointermove=\"handlePointerMove\"\n @clickimpl=\"handleClick\"\n >\n <slot name=\"icon\"></slot>\n <slot></slot>\n </hl-dropdown-item-impl>\n </hl-roving-focus-item>\n </hl-dropdown-collection-item>\n</template>\n<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n getCurrentInstance,\n inject,\n ref,\n unref,\n} from 'vue'\nimport { HlRovingFocusItem } from '@hongluan-ui/components/roving-focus-group'\nimport { composeEventHandlers, whenMouse } from '@hongluan-ui/utils'\nimport HlDropdownItemImpl from './dropdown-item-impl.vue'\nimport { useDropdown } from './useDropdown'\nimport {\n HlCollectionItem as HlDropdownCollectionItem,\n dropdownItemProps,\n} from './dropdown'\nimport { DROPDOWN_INJECTION_KEY } from './tokens'\n\nexport default defineComponent({\n name: 'DropdownItem',\n components: {\n HlDropdownCollectionItem,\n HlRovingFocusItem,\n HlDropdownItemImpl,\n },\n inheritAttrs: false,\n props: dropdownItemProps,\n emits: ['pointermove', 'pointerleave', 'click'],\n setup(props, { emit, attrs }) {\n const { hlDropdown } = useDropdown()\n const _instance = getCurrentInstance()\n const itemRef = ref<HTMLElement | null>(null)\n const textContent = computed(() => unref(itemRef)?.textContent ?? '')\n const { onItemEnter, onItemLeave } = inject(\n DROPDOWN_INJECTION_KEY,\n undefined,\n )\n\n const handlePointerMove = composeEventHandlers(\n (e: PointerEvent) => {\n emit('pointermove', e)\n return e.defaultPrevented\n },\n whenMouse(e => {\n if (props.disabled) {\n onItemLeave(e)\n return\n }\n\n const target = e.currentTarget as HTMLElement\n /**\n * This handles the following scenario:\n * when the item contains a form element such as input element\n * when the mouse is moving over the element itself which is contained by\n * the item, the default focusing logic should be prevented so that\n * it won't cause weird action.\n */\n if (\n target === document.activeElement ||\n target.contains(document.activeElement)\n ) {\n return\n }\n\n onItemEnter(e)\n if (!e.defaultPrevented) {\n target?.focus()\n }\n }),\n )\n\n const handlePointerLeave = composeEventHandlers((e: PointerEvent) => {\n emit('pointerleave', e)\n return e.defaultPrevented\n }, whenMouse(onItemLeave))\n\n const handleClick = composeEventHandlers(\n (e: PointerEvent) => {\n if (props.disabled) {\n return\n }\n emit('click', e)\n return e.type !== 'keydown' && e.defaultPrevented\n },\n e => {\n if (props.disabled) {\n e.stopImmediatePropagation()\n return\n }\n if (hlDropdown?.hideOnClick?.value) {\n hlDropdown.handleClick?.()\n }\n hlDropdown.commandHandler?.(props.command, _instance, e)\n },\n )\n\n // direct usage of v-bind={ ...$props, ...$attrs } causes type errors\n const propsAndAttrs = computed(() => ({ ...props, ...attrs }))\n\n return {\n handleClick,\n handlePointerMove,\n handlePointerLeave,\n textContent,\n propsAndAttrs,\n }\n },\n})\n</script>\n"],"names":["HlDropdownCollectionItem"],"mappings":";;;;;;;;;;;AAqCA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY;AAAA,8BACVA;AAAA,IACA;AAAA,IACA;AAAA;AACF,EACA,cAAc;AAAA,EACd,OAAO;AAAA,EACP,OAAO,CAAC,eAAe,gBAAgB,OAAO;AAAA,EAC9C,MAAM,OAAO,EAAE,MAAM,SAAS;AAC5B,UAAM,EAAE,eAAe;AACvB,UAAM,YAAY;AAClB,UAAM,UAAU,IAAwB,IAAI;AAC5C,UAAM,cAAc,SAAS,MAAM;AACnC,UAAM,EAAE;AAKR,8BAA0B,qBACxB;AACE;AACA;AAAS,IACX;AAEE,UAAI,gBAAgB;AAClB;AACA;AAAA,MACF;AAEA,qBAAe,EAAE;AAQjB;AAIE;AAAA,MACF;AAEA;AACA;AACE;AAAc,MAChB;AAAA,MAEJ;AAEA,+BAA2B;AACzB;AACA;AAAS,IACX,wBAAwB;AAExB,UAAM;AAEF;AACE;AAAA;AAEF;AACA,eAAS;AAAwB,OAEnC;AACE,UAAI;AACF;AACA;AAAA,MACF;AACA,UAAI;AACF;AAAyB;AAE3B;AAAuD;AAK3D,yCAAsC,gBAAe,QAAQ;AAE7D;AAAO,MACL;AAAA,MACA;AAAA;AACA;AACA,MACA;AAAA;AACF;AAEJ;;;;;;AA9GgC;AAdjB;AACe;;AAYH,kBAAA;AAAA,mBAVS;AAAG;;AAST;AAPD;AACN;AACD;AACF;;AAEa,0BAAA;AAAA;AACZ;;;;;;;;;;;;;;;;;;;"}