{"version":3,"file":"index.mjs","names":[],"sources":["../../../../../packages/hooks/use-popper/index.ts"],"sourcesContent":["import { computed, onBeforeUnmount, ref, shallowRef, unref, watch } from 'vue'\nimport { createPopper } from '@popperjs/core'\nimport { fromPairs } from 'lodash-unified'\n\nimport type { Ref } from 'vue'\nimport type {\n  Instance,\n  Modifier,\n  Options,\n  State,\n  VirtualElement,\n} from '@popperjs/core'\n\ntype ElementType = HTMLElement | undefined\ntype ReferenceElement = ElementType | VirtualElement\nexport type PartialOptions = Partial<Options>\n\nexport const usePopper = (\n  referenceElementRef: Ref<ReferenceElement>,\n  popperElementRef: Ref<ElementType>,\n  opts: Ref<PartialOptions> | PartialOptions = {} as PartialOptions\n) => {\n  const stateUpdater = {\n    name: 'updateState',\n    enabled: true,\n    phase: 'write',\n    fn: ({ state }) => {\n      const derivedState = deriveState(state)\n\n      Object.assign(states.value, derivedState)\n    },\n    requires: ['computeStyles'],\n  } as Modifier<'updateState', any>\n\n  const options = computed<Options>(() => {\n    const { onFirstUpdate, placement, strategy, modifiers } = unref(opts)\n\n    return {\n      onFirstUpdate,\n      placement: placement || 'bottom',\n      strategy: strategy || 'absolute',\n      modifiers: [\n        ...(modifiers || []),\n        stateUpdater,\n        { name: 'applyStyles', enabled: false },\n      ],\n    }\n  })\n\n  const instanceRef = shallowRef<Instance | undefined>()\n  const states = ref<Pick<State, 'styles' | 'attributes'>>({\n    styles: {\n      popper: {\n        position: unref(options).strategy,\n        left: '0',\n        top: '0',\n      },\n      arrow: {\n        position: 'absolute',\n      },\n    },\n    attributes: {},\n  })\n\n  const destroy = () => {\n    if (!instanceRef.value) return\n\n    instanceRef.value.destroy()\n    instanceRef.value = undefined\n  }\n\n  watch(\n    options,\n    (newOptions) => {\n      const instance = unref(instanceRef)\n      if (instance) {\n        instance.setOptions(newOptions)\n      }\n    },\n    {\n      deep: true,\n    }\n  )\n\n  watch(\n    [referenceElementRef, popperElementRef],\n    ([referenceElement, popperElement]) => {\n      destroy()\n      if (!referenceElement || !popperElement) return\n\n      instanceRef.value = createPopper(\n        referenceElement,\n        popperElement,\n        unref(options)\n      )\n    }\n  )\n\n  onBeforeUnmount(() => {\n    destroy()\n  })\n\n  return {\n    state: computed(() => ({ ...(unref(instanceRef)?.state || {}) })),\n    styles: computed(() => unref(states).styles),\n    attributes: computed(() => unref(states).attributes),\n    update: () => unref(instanceRef)?.update(),\n    forceUpdate: () => unref(instanceRef)?.forceUpdate(),\n    // Preventing end users from modifying the instance.\n    instanceRef: computed(() => unref(instanceRef)),\n  }\n}\n\nfunction deriveState(state: State) {\n  const elements = Object.keys(state.elements) as unknown as Array<\n    keyof State['elements']\n  >\n\n  const styles = fromPairs(\n    elements.map(\n      (element) =>\n        [element, state.styles[element] || {}] as [\n          string,\n          State['styles'][keyof State['styles']],\n        ]\n    )\n  )\n\n  const attributes = fromPairs(\n    elements.map(\n      (element) =>\n        [element, state.attributes[element]] as [\n          string,\n          State['attributes'][keyof State['attributes']],\n        ]\n    )\n  )\n\n  return {\n    styles,\n    attributes,\n  }\n}\n\nexport type UsePopperReturn = ReturnType<typeof usePopper>\n"],"mappings":";;;;;AAiBA,MAAa,aACX,qBACA,kBACA,OAA6C,EAAE,KAC5C;CACH,MAAM,eAAe;EACnB,MAAM;EACN,SAAS;EACT,OAAO;EACP,KAAK,EAAE,YAAY;GACjB,MAAM,eAAe,YAAY,MAAM;AAEvC,UAAO,OAAO,OAAO,OAAO,aAAa;;EAE3C,UAAU,CAAC,gBAAgB;EAC5B;CAED,MAAM,UAAU,eAAwB;EACtC,MAAM,EAAE,eAAe,WAAW,UAAU,cAAc,MAAM,KAAK;AAErE,SAAO;GACL;GACA,WAAW,aAAa;GACxB,UAAU,YAAY;GACtB,WAAW;IACT,GAAI,aAAa,EAAE;IACnB;IACA;KAAE,MAAM;KAAe,SAAS;KAAO;IACxC;GACF;GACD;CAEF,MAAM,cAAc,YAAkC;CACtD,MAAM,SAAS,IAA0C;EACvD,QAAQ;GACN,QAAQ;IACN,UAAU,MAAM,QAAQ,CAAC;IACzB,MAAM;IACN,KAAK;IACN;GACD,OAAO,EACL,UAAU,YACX;GACF;EACD,YAAY,EAAE;EACf,CAAC;CAEF,MAAM,gBAAgB;AACpB,MAAI,CAAC,YAAY,MAAO;AAExB,cAAY,MAAM,SAAS;AAC3B,cAAY,QAAQ;;AAGtB,OACE,UACC,eAAe;EACd,MAAM,WAAW,MAAM,YAAY;AACnC,MAAI,SACF,UAAS,WAAW,WAAW;IAGnC,EACE,MAAM,MACP,CACF;AAED,OACE,CAAC,qBAAqB,iBAAiB,GACtC,CAAC,kBAAkB,mBAAmB;AACrC,WAAS;AACT,MAAI,CAAC,oBAAoB,CAAC,cAAe;AAEzC,cAAY,QAAQ,aAClB,kBACA,eACA,MAAM,QAAQ,CACf;GAEJ;AAED,uBAAsB;AACpB,WAAS;GACT;AAEF,QAAO;EACL,OAAO,gBAAgB,EAAE,GAAI,MAAM,YAAY,EAAE,SAAS,EAAE,EAAG,EAAE;EACjE,QAAQ,eAAe,MAAM,OAAO,CAAC,OAAO;EAC5C,YAAY,eAAe,MAAM,OAAO,CAAC,WAAW;EACpD,cAAc,MAAM,YAAY,EAAE,QAAQ;EAC1C,mBAAmB,MAAM,YAAY,EAAE,aAAa;EAEpD,aAAa,eAAe,MAAM,YAAY,CAAC;EAChD;;AAGH,SAAS,YAAY,OAAc;CACjC,MAAM,WAAW,OAAO,KAAK,MAAM,SAAS;AAwB5C,QAAO;EACL,QArBa,UACb,SAAS,KACN,YACC,CAAC,SAAS,MAAM,OAAO,YAAY,EAAE,CAAC,CAIzC,CACF;EAcC,YAZiB,UACjB,SAAS,KACN,YACC,CAAC,SAAS,MAAM,WAAW,SAAS,CAIvC,CACF;EAKA"}