{"version":3,"file":"dropdown.vue2.mjs","sources":["../../../components/dropdown/dropdown.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { Popper } from '@/components/popper'\r\n\r\nimport { computed, inject, nextTick, onMounted, provide, reactive, ref, toRef, watch } from 'vue'\r\n\r\nimport {\r\n  placementWhileList,\r\n  useClickOutside,\r\n  usePopper,\r\n  useRtl,\r\n  useSetTimeout,\r\n} from '@vexip-ui/hooks'\r\nimport { emitEvent, useHoverDelay, useNameHelper, useProps } from '@vexip-ui/config'\r\nimport DropdownDrop from './dropdown-drop'\r\nimport { dropdownProps } from './props'\r\nimport { useLabel } from './hooks'\r\nimport { DROPDOWN_STATE, SELECT_HANDLER } from './symbol'\r\n\r\nimport type { PopperExposed } from '@/components/popper'\r\nimport type { Placement } from '@vexip-ui/hooks'\r\n\r\ndefineOptions({ name: 'Dropdown' })\r\n\r\nconst nh = useNameHelper('dropdown')\r\n\r\nconst _props = defineProps(dropdownProps)\r\nconst props = useProps('dropdown', _props, {\r\n  visible: {\r\n    default: false,\r\n    static: true,\r\n  },\r\n  placement: {\r\n    default: 'bottom',\r\n    validator: value => placementWhileList.includes(value),\r\n  },\r\n  outsideClose: true,\r\n  trigger: {\r\n    default: 'hover',\r\n    validator: value => ['hover', 'click', 'custom'].includes(value),\r\n  },\r\n  label: {\r\n    default: null,\r\n    static: true,\r\n  },\r\n  transitionName: () => nh.ns('drop'),\r\n  transfer: false,\r\n  dropClass: null,\r\n  appear: false,\r\n  meta: null,\r\n  alive: false,\r\n  custom: false,\r\n  shift: true,\r\n})\r\n\r\nconst emit = defineEmits(['update:visible'])\r\n\r\nconst parentState = inject(DROPDOWN_STATE, null)\r\nconst { isRtl } = useRtl()\r\nconst hoverDelay = useHoverDelay()\r\n\r\nconst isNested = !!parentState\r\nconst label = toRef(props, 'label')\r\nconst placement = ref(props.placement)\r\nconst currentVisible = ref(props.visible)\r\nconst popperAlive = ref(false)\r\n\r\nconst transfer = isNested ? ref(false) : toRef(props, 'transfer')\r\n\r\nconst shift = computed(() => !!(parentState?.shift || props.shift))\r\n\r\nconst wrapper = useClickOutside(handleClickOutside)\r\nconst popper = ref<PopperExposed>()\r\nconst { reference, transferTo, updatePopper } = usePopper({\r\n  placement,\r\n  shift,\r\n  transfer,\r\n  wrapper,\r\n  popper: computed(() => popper.value?.wrapper),\r\n  isDrop: true,\r\n  offset: isNested ? [-5, 0] : undefined,\r\n})\r\nconst currentLabel = useLabel(label, reference)\r\n\r\nconst className = computed(() => {\r\n  return {\r\n    [nh.b()]: true,\r\n    [nh.bs('vars')]: true,\r\n    [nh.bm('inherit')]: props.inherit,\r\n    [nh.bm('visible')]: currentVisible.value,\r\n  }\r\n})\r\nconst isAlive = computed(() => parentState?.alive || props.alive)\r\n\r\nprovide(SELECT_HANDLER, null!)\r\n!props.custom &&\r\n  provide(\r\n    DROPDOWN_STATE,\r\n    reactive({\r\n      alive: isAlive,\r\n      shift,\r\n      handleSelect,\r\n      handleTriggerEnter,\r\n      handleTriggerLeave,\r\n    }),\r\n  )\r\n\r\nwatch(\r\n  () => props.visible,\r\n  value => {\r\n    currentVisible.value = value\r\n  },\r\n)\r\n\r\nwatch(\r\n  () => props.placement,\r\n  value => {\r\n    setPlacement(value)\r\n  },\r\n)\r\n\r\nwatch(currentVisible, value => {\r\n  if (value) {\r\n    updatePopper()\r\n  }\r\n})\r\n\r\nonMounted(() => {\r\n  nextTick(() => {\r\n    setPlacement(props.placement)\r\n  })\r\n})\r\n\r\ndefineExpose({\r\n  isNested,\r\n  currentVisible,\r\n  isAlive,\r\n  wrapper,\r\n  reference,\r\n  popper,\r\n  handleTriggerEnter,\r\n  handleTriggerLeave,\r\n  handleTriggerClick,\r\n})\r\n\r\nfunction setVisible(visible: boolean) {\r\n  if (currentVisible.value === visible) return\r\n\r\n  currentVisible.value = visible\r\n\r\n  emit('update:visible', visible)\r\n  emitEvent(props.onToggle, visible)\r\n}\r\n\r\nfunction handleClickOutside() {\r\n  emitEvent(props.onClickOutside)\r\n\r\n  if (props.outsideClose && props.trigger !== 'custom' && currentVisible.value) {\r\n    setVisible(false)\r\n    emitEvent(props.onOutsideClose)\r\n  }\r\n}\r\n\r\nfunction handleSelect(labels: (string | number)[], metaList: Array<Record<string, any>>) {\r\n  if (props.trigger !== 'custom') {\r\n    setVisible(false)\r\n    emitEvent(props.onSelect, labels, metaList)\r\n  }\r\n\r\n  if (typeof parentState?.handleSelect === 'function') {\r\n    parentState.handleSelect([currentLabel.value!, ...labels], [props.meta || {}, ...metaList])\r\n  }\r\n}\r\n\r\nfunction setPlacement(value: Placement) {\r\n  const [xPlacement] = value.split('-')\r\n\r\n  if (isNested && xPlacement !== 'right' && xPlacement !== 'left') {\r\n    placement.value = isRtl.value ? 'left-start' : 'right-start'\r\n  } else {\r\n    placement.value = value\r\n  }\r\n}\r\n\r\nconst { timer } = useSetTimeout()\r\n\r\nfunction handleTriggerEnter() {\r\n  if (props.trigger === 'hover') {\r\n    clearTimeout(timer.hover)\r\n\r\n    if (typeof parentState?.handleTriggerEnter === 'function') {\r\n      parentState.handleTriggerEnter()\r\n    }\r\n\r\n    timer.hover = setTimeout(() => {\r\n      setVisible(true)\r\n    }, hoverDelay.value)\r\n  }\r\n}\r\n\r\nfunction handleTriggerLeave() {\r\n  if (props.trigger === 'hover') {\r\n    clearTimeout(timer.hover)\r\n\r\n    if (typeof parentState?.handleTriggerLeave === 'function') {\r\n      parentState.handleTriggerLeave()\r\n    }\r\n\r\n    timer.hover = setTimeout(() => {\r\n      setVisible(false)\r\n    }, hoverDelay.value)\r\n  }\r\n}\r\n\r\nfunction handleTriggerClick() {\r\n  if (props.trigger === 'click') {\r\n    setVisible(!currentVisible.value)\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <div\r\n    ref=\"wrapper\"\r\n    :class=\"className\"\r\n    @mouseenter=\"handleTriggerEnter\"\r\n    @mouseleave=\"handleTriggerLeave\"\r\n  >\r\n    <div\r\n      ref=\"reference\"\r\n      :class=\"[nh.be('trigger'), currentVisible ? nh.bem('trigger', 'active') : '']\"\r\n      @click=\"handleTriggerClick\"\r\n      @keydown.enter.prevent=\"handleTriggerClick\"\r\n      @keydown.space.prevent=\"handleTriggerClick\"\r\n    >\r\n      <slot></slot>\r\n    </div>\r\n    <DropdownDrop>\r\n      <Popper\r\n        ref=\"popper\"\r\n        :class=\"[\r\n          nh.be('popper'),\r\n          nh.bs('vars'),\r\n          isNested ? nh.bem('popper', 'nested') : null,\r\n          props.dropClass\r\n        ]\"\r\n        :visible=\"currentVisible\"\r\n        :alive=\"isAlive || popperAlive\"\r\n        :to=\"transferTo\"\r\n        :transition=\"props.transitionName\"\r\n        :appear=\"props.appear\"\r\n        @mouseenter=\"handleTriggerEnter\"\r\n        @mouseleave=\"handleTriggerLeave\"\r\n        @after-enter=\"popperAlive = true\"\r\n        @after-leave=\"popperAlive = false\"\r\n      >\r\n        <slot name=\"drop\"></slot>\r\n      </Popper>\r\n    </DropdownDrop>\r\n  </div>\r\n</template>\r\n"],"names":["nh","useNameHelper","props","useProps","__props","value","placementWhileList","emit","__emit","parentState","inject","DROPDOWN_STATE","isRtl","useRtl","hoverDelay","useHoverDelay","isNested","label","toRef","placement","ref","currentVisible","popperAlive","transfer","shift","computed","wrapper","useClickOutside","handleClickOutside","popper","reference","transferTo","updatePopper","usePopper","_a","currentLabel","useLabel","className","isAlive","provide","SELECT_HANDLER","reactive","handleSelect","handleTriggerEnter","handleTriggerLeave","watch","setPlacement","onMounted","nextTick","__expose","handleTriggerClick","setVisible","visible","emitEvent","labels","metaList","xPlacement","timer","useSetTimeout","_createElementBlock","_createElementVNode","_normalizeClass","_unref","_renderSlot","_ctx","_createVNode","DropdownDrop","Popper"],"mappings":"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"}