{"version":3,"file":"popover.mjs","sources":["../../../../../../../packages/components/popover/src/popover.tsx"],"sourcesContent":["import {\n  type CSSProperties,\n  type ExtractPropTypes,\n  type PropType,\n  type TeleportProps,\n  defineComponent,\n  nextTick,\n  onBeforeUnmount,\n  onMounted,\n  ref,\n  watch,\n  watchEffect,\n} from 'vue'\nimport { createPopper, offset } from '@popperjs/core'\n\n// Utils\nimport {\n  type ComponentInstance,\n  createNamespace,\n  extend,\n  inBrowser,\n  makeArrayProp,\n  makeObjectProp,\n  makeStringProp,\n  numericProp,\n  pick,\n  truthProp,\n  unknownProp,\n} from '@xzx-design/utils'\n\n// Composables\nimport { useClickAway, useScopeId, useSyncPropRef } from '@xzx-design/hooks'\n// Components\nimport { Icon, Popup } from '@xzx-design/components'\nimport type { IconsComponent } from '@xzx-design/components'\n\n// Types\nimport type {\n  PopoverAction,\n  PopoverActionsDirection,\n  PopoverPlacement,\n  PopoverTheme,\n  PopoverTrigger,\n} from './types'\nimport type { Instance } from '@popperjs/core'\n\nconst [name, bem] = createNamespace('popover')\n\nconst popupProps = [\n  'overlay',\n  'duration',\n  'teleport',\n  'overlayStyle',\n  'overlayClass',\n  'closeOnClickOverlay',\n] as const\n\nexport const popoverProps = {\n  show: Boolean,\n  theme: makeStringProp<PopoverTheme>('light'),\n  overlay: Boolean,\n  actions: makeArrayProp<PopoverAction>(),\n  actionsDirection: makeStringProp<PopoverActionsDirection>('vertical'),\n  trigger: makeStringProp<PopoverTrigger>('click'),\n  duration: numericProp,\n  showArrow: Boolean,\n  placement: makeStringProp<PopoverPlacement>('bottom'),\n  iconPrefix: makeObjectProp<IconsComponent>(null),\n  overlayClass: unknownProp,\n  overlayStyle: Object as PropType<CSSProperties>,\n  closeOnClickAction: truthProp,\n  closeOnClickOverlay: truthProp,\n  closeOnClickOutside: truthProp,\n  offset: {\n    type: Array as unknown as PropType<[number, number]>,\n    default: () => [0, 8],\n  },\n  teleport: {\n    type: [String, Object] as PropType<TeleportProps['to']>,\n    default: 'body',\n  },\n}\n\nexport type PopoverProps = ExtractPropTypes<typeof popoverProps>\n\nexport default defineComponent({\n  name,\n\n  props: popoverProps,\n\n  emits: ['select', 'touchstart', 'update:show'],\n\n  setup(props, { emit, slots, attrs }) {\n    let popper: Instance | null\n\n    const popupRef = ref<HTMLElement>()\n    const wrapperRef = ref<HTMLElement>()\n    const popoverRef = ref<ComponentInstance>()\n\n    const show = useSyncPropRef(\n      () => props.show,\n      (value) => emit('update:show', value)\n    )\n\n    const getPopoverOptions = () => ({\n      placement: props.placement,\n      modifiers: [\n        {\n          name: 'computeStyles',\n          options: {\n            adaptive: false,\n            gpuAcceleration: false,\n          },\n        },\n        extend({}, offset, {\n          options: {\n            offset: props.offset,\n          },\n        }),\n      ],\n    })\n\n    const createPopperInstance = () => {\n      if (wrapperRef.value && popoverRef.value) {\n        return createPopper(\n          wrapperRef.value,\n          popoverRef.value.popupRef.value,\n          getPopoverOptions()\n        )\n      }\n      return null\n    }\n\n    const updateLocation = () => {\n      nextTick(() => {\n        if (!show.value) {\n          return\n        }\n\n        if (!popper) {\n          popper = createPopperInstance()\n          if (inBrowser) {\n            window.addEventListener('animationend', updateLocation)\n            window.addEventListener('transitionend', updateLocation)\n          }\n        } else {\n          popper.setOptions(getPopoverOptions())\n        }\n      })\n    }\n\n    const updateShow = (value: boolean) => {\n      show.value = value\n    }\n\n    const onClickWrapper = () => {\n      if (props.trigger === 'click') {\n        show.value = !show.value\n      }\n    }\n\n    const onClickAction = (action: PopoverAction, index: number) => {\n      if (action.disabled) {\n        return\n      }\n\n      emit('select', action, index)\n\n      if (props.closeOnClickAction) {\n        show.value = false\n      }\n    }\n\n    const onClickAway = () => {\n      if (\n        show.value &&\n        props.closeOnClickOutside &&\n        (!props.overlay || props.closeOnClickOverlay)\n      ) {\n        show.value = false\n      }\n    }\n\n    const renderActionContent = (action: PopoverAction, index: number) => {\n      if (slots.action) {\n        return slots.action({ action, index })\n      }\n\n      return [\n        action.icon && (\n          <Icon classPrefix={props.iconPrefix} class={bem('action-icon')}>\n            <action.icon />\n          </Icon>\n        ),\n        <div class={[bem('action-text')]}>{action.text}</div>,\n      ]\n    }\n\n    const renderAction = (action: PopoverAction, index: number) => {\n      const { icon, color, disabled, className } = action\n      return (\n        <div\n          role=\"menuitem\"\n          class={[bem('action', { disabled, 'with-icon': icon }), className]}\n          style={{ color }}\n          tabindex={disabled ? undefined : 0}\n          aria-disabled={disabled || undefined}\n          onClick={() => onClickAction(action, index)}\n        >\n          {renderActionContent(action, index)}\n        </div>\n      )\n    }\n\n    onMounted(() => {\n      updateLocation()\n      watchEffect(() => {\n        popupRef.value = popoverRef.value?.popupRef.value\n      })\n    })\n\n    onBeforeUnmount(() => {\n      if (popper) {\n        if (inBrowser) {\n          window.removeEventListener('animationend', updateLocation)\n          window.removeEventListener('transitionend', updateLocation)\n        }\n        popper.destroy()\n        popper = null\n      }\n    })\n\n    watch(() => [show.value, props.offset, props.placement], updateLocation)\n\n    useClickAway([wrapperRef, popupRef], onClickAway, {\n      eventName: 'touchstart',\n    })\n\n    return () => (\n      <>\n        <span ref={wrapperRef} class={bem('wrapper')} onClick={onClickWrapper}>\n          {slots.reference?.()}\n        </span>\n        <Popup\n          ref={popoverRef}\n          show={show.value}\n          class={bem([props.theme])}\n          position={''}\n          transition=\"xzx-popover-zoom\"\n          lockScroll={false}\n          onUpdate:show={updateShow}\n          {...attrs}\n          {...useScopeId()}\n          {...pick(props, popupProps)}\n        >\n          {props.showArrow && <div class={bem('arrow')} />}\n          <div role=\"menu\" class={bem('content', props.actionsDirection)}>\n            {slots.default ? slots.default() : props.actions.map(renderAction)}\n          </div>\n        </Popup>\n      </>\n    )\n  },\n})\n"],"names":["name","bem","createNamespace","popupProps","popoverProps","show","Boolean","theme","makeStringProp","overlay","actions","makeArrayProp","actionsDirection","trigger","duration","numericProp","showArrow","placement","iconPrefix","makeObjectProp","overlayClass","unknownProp","overlayStyle","Object","closeOnClickAction","truthProp","closeOnClickOverlay","closeOnClickOutside","offset","type","Array","default","teleport","String","defineComponent","props","emits","setup","emit","slots","attrs","popper","popupRef","ref","wrapperRef","popoverRef","useSyncPropRef","value","getPopoverOptions","modifiers","options","adaptive","gpuAcceleration","extend","createPopperInstance","createPopper","updateLocation","nextTick","inBrowser","window","addEventListener","setOptions","updateShow","onClickWrapper","onClickAction","action","index","disabled","onClickAway","renderActionContent","icon","_createVNode","Icon","text","renderAction","color","className","undefined","onClick","onMounted","watchEffect","onBeforeUnmount","removeEventListener","destroy","watch","useClickAway","eventName","_Fragment","reference","Popup","_mergeProps","useScopeId","pick","map"],"mappings":"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"}