{"version":3,"file":"use-content.mjs","names":[],"sources":["../../../../../../../packages/components/popper/src/composables/use-content.ts"],"sourcesContent":["import {\n  computed,\n  inject,\n  onBeforeUnmount,\n  onMounted,\n  ref,\n  unref,\n  watch,\n} from 'vue'\nimport { useResizeObserver } from '@vueuse/core'\nimport { isUndefined } from 'lodash-unified'\nimport { usePopper } from '@element-plus/hooks'\nimport { POPPER_INJECTION_KEY } from '../constants'\nimport { buildPopperOptions, unwrapMeasurableEl } from '../utils'\n\nimport type { Modifier } from '@popperjs/core'\nimport type { PartialOptions } from '@element-plus/hooks'\nimport type { PopperContentProps } from '../content'\n\nconst DEFAULT_ARROW_OFFSET = 0\n\nexport const usePopperContent = (props: PopperContentProps) => {\n  const { popperInstanceRef, contentRef, triggerRef, role } = inject(\n    POPPER_INJECTION_KEY,\n    undefined\n  )!\n\n  const arrowRef = ref<HTMLElement>()\n  const arrowOffset = computed(() => props.arrowOffset)\n\n  const eventListenerModifier = computed(() => {\n    return {\n      name: 'eventListeners',\n      enabled: !!props.visible,\n    } as Modifier<'eventListeners', any>\n  })\n\n  const arrowModifier = computed(() => {\n    const arrowEl = unref(arrowRef)\n    const offset = unref(arrowOffset) ?? DEFAULT_ARROW_OFFSET\n    // Seems like the `phase` and `fn` is required by Modifier type\n    // But on its documentation they didn't specify that.\n    // Refer to https://popper.js.org/docs/v2/modifiers/arrow/\n    return {\n      name: 'arrow',\n      enabled: !isUndefined(arrowEl),\n      options: {\n        element: arrowEl,\n        padding: offset,\n      },\n    } as any\n  })\n\n  const options = computed<PartialOptions>(() => {\n    return {\n      onFirstUpdate: () => {\n        update()\n      },\n      ...buildPopperOptions(props, [\n        unref(arrowModifier),\n        unref(eventListenerModifier),\n      ]),\n    }\n  })\n\n  const computedReference = computed(\n    () => unwrapMeasurableEl(props.referenceEl) || unref(triggerRef)\n  )\n\n  const { attributes, state, styles, update, forceUpdate, instanceRef } =\n    usePopper(computedReference, contentRef, options)\n\n  watch(instanceRef, (instance) => (popperInstanceRef.value = instance), {\n    flush: 'sync',\n  })\n\n  onMounted(() => {\n    watch(\n      () => unref(computedReference)?.getBoundingClientRect?.(),\n      () => {\n        update()\n      }\n    )\n  })\n\n  // todo: Replace with onCleanup when vue in peerDependencies is ^3.5.0.\n  let stopResizeObserver: (() => void) | undefined\n  watch(\n    () => props.visible,\n    (visible) => {\n      stopResizeObserver?.()\n      stopResizeObserver = undefined\n      if (visible) {\n        stopResizeObserver = useResizeObserver(contentRef, update).stop\n      }\n    }\n  )\n\n  onBeforeUnmount(() => {\n    popperInstanceRef.value = undefined\n    stopResizeObserver?.()\n    stopResizeObserver = undefined\n  })\n\n  return {\n    attributes,\n    arrowRef,\n    contentRef,\n    instanceRef,\n    state,\n    styles,\n    role,\n\n    forceUpdate,\n    update,\n  }\n}\n\nexport type UsePopperContentReturn = ReturnType<typeof usePopperContent>\n"],"mappings":";;;;;;;;AAmBA,MAAM,uBAAuB;AAE7B,MAAa,oBAAoB,UAA8B;CAC7D,MAAM,EAAE,mBAAmB,YAAY,YAAY,SAAS,OAC1D,sBACA,OACD;CAED,MAAM,WAAW,KAAkB;CACnC,MAAM,cAAc,eAAe,MAAM,YAAY;CAErD,MAAM,wBAAwB,eAAe;AAC3C,SAAO;GACL,MAAM;GACN,SAAS,CAAC,CAAC,MAAM;GAClB;GACD;CAEF,MAAM,gBAAgB,eAAe;EACnC,MAAM,UAAU,MAAM,SAAS;EAC/B,MAAM,SAAS,MAAM,YAAY,IAAI;AAIrC,SAAO;GACL,MAAM;GACN,SAAS,CAAC,YAAY,QAAQ;GAC9B,SAAS;IACP,SAAS;IACT,SAAS;IACV;GACF;GACD;CAEF,MAAM,UAAU,eAA+B;AAC7C,SAAO;GACL,qBAAqB;AACnB,YAAQ;;GAEV,GAAG,mBAAmB,OAAO,CAC3B,MAAM,cAAc,EACpB,MAAM,sBAAsB,CAC7B,CAAC;GACH;GACD;CAEF,MAAM,oBAAoB,eAClB,mBAAmB,MAAM,YAAY,IAAI,MAAM,WAAW,CACjE;CAED,MAAM,EAAE,YAAY,OAAO,QAAQ,QAAQ,aAAa,gBACtD,UAAU,mBAAmB,YAAY,QAAQ;AAEnD,OAAM,cAAc,aAAc,kBAAkB,QAAQ,UAAW,EACrE,OAAO,QACR,CAAC;AAEF,iBAAgB;AACd,cACQ,MAAM,kBAAkB,EAAE,yBAAyB,QACnD;AACJ,WAAQ;IAEX;GACD;CAGF,IAAI;AACJ,aACQ,MAAM,UACX,YAAY;AACX,wBAAsB;AACtB,uBAAqB;AACrB,MAAI,QACF,sBAAqB,kBAAkB,YAAY,OAAO,CAAC;GAGhE;AAED,uBAAsB;AACpB,oBAAkB,QAAQ;AAC1B,wBAAsB;AACtB,uBAAqB;GACrB;AAEF,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACD"}