{"version":3,"file":"index.mjs","sources":["../../../../../packages/hooks/use-floating/index.ts"],"sourcesContent":["import { isRef, onMounted, ref, unref, watchEffect } from 'vue'\nimport { isClient, unrefElement } from '@vueuse/core'\nimport { isNil } from 'lodash-unified'\nimport { arrow as arrowCore, computePosition } from '@floating-ui/dom'\nimport { buildProps, keysOf } from '@vuesax-plus/utils'\n\nimport type { Ref, ToRefs } from 'vue'\nimport type {\n  ComputePositionReturn,\n  Middleware,\n  Placement,\n  SideObject,\n  Strategy,\n  VirtualElement,\n} from '@floating-ui/dom'\n\nexport const useFloatingProps = buildProps({} as const)\n\nexport type UseFloatingProps = ToRefs<{\n  middleware: Array<Middleware>\n  placement: Placement\n  strategy: Strategy\n}>\n\ntype ElementRef = Parameters<typeof unrefElement>['0']\n\nconst unrefReference = (\n  elRef: ElementRef | Ref<VirtualElement | undefined>\n) => {\n  if (!isClient) return\n  if (!elRef) return elRef\n  const unrefEl = unrefElement(elRef as ElementRef)\n  if (unrefEl) return unrefEl\n  return isRef(elRef) ? unrefEl : (elRef as VirtualElement)\n}\n\nexport const getPositionDataWithUnit = <T extends Record<string, number>>(\n  record: T | undefined,\n  key: keyof T\n) => {\n  const value = record?.[key]\n  return isNil(value) ? '' : `${value}px`\n}\n\nexport const useFloating = ({\n  middleware,\n  placement,\n  strategy,\n}: UseFloatingProps) => {\n  const referenceRef = ref<HTMLElement | VirtualElement>()\n  const contentRef = ref<HTMLElement>()\n  const x = ref<number>()\n  const y = ref<number>()\n  const middlewareData = ref<ComputePositionReturn['middlewareData']>({})\n\n  const states = {\n    x,\n    y,\n    placement,\n    strategy,\n    middlewareData,\n  } as const\n\n  const update = async () => {\n    if (!isClient) return\n\n    const referenceEl = unrefReference(referenceRef)\n    const contentEl = unrefElement(contentRef)\n    if (!referenceEl || !contentEl) return\n\n    const data = await computePosition(referenceEl, contentEl, {\n      placement: unref(placement),\n      strategy: unref(strategy),\n      middleware: unref(middleware),\n    })\n\n    keysOf(states).forEach((key) => {\n      states[key].value = data[key]\n    })\n  }\n\n  onMounted(() => {\n    watchEffect(() => {\n      update()\n    })\n  })\n\n  return {\n    ...states,\n    update,\n    referenceRef,\n    contentRef,\n  }\n}\n\nexport type ArrowMiddlewareProps = {\n  arrowRef: Ref<HTMLElement | null | undefined>\n  padding?: number | SideObject\n}\n\nexport const arrowMiddleware = ({\n  arrowRef,\n  padding,\n}: ArrowMiddlewareProps): Middleware => {\n  return {\n    name: 'arrow',\n    options: {\n      element: arrowRef,\n      padding,\n    },\n\n    fn(args) {\n      const arrowEl = unref(arrowRef)\n      if (!arrowEl) return {}\n\n      return arrowCore({\n        element: arrowEl,\n        padding,\n      }).fn(args)\n    },\n  }\n}\n"],"names":["arrowCore"],"mappings":";;;;;;;;AAgBa,MAAA,gBAAA,GAAmB,UAAW,CAAA,EAAW,EAAA;AAUtD,MAAM,cAAA,GAAiB,CACrB,KACG,KAAA;AACH,EAAA,IAAI,CAAC,QAAA;AAAU,IAAA,OAAA;AACf,EAAA,IAAI,CAAC,KAAA;AAAO,IAAO,OAAA,KAAA,CAAA;AACnB,EAAM,MAAA,OAAA,GAAU,aAAa,KAAmB,CAAA,CAAA;AAChD,EAAI,IAAA,OAAA;AAAS,IAAO,OAAA,OAAA,CAAA;AACpB,EAAO,OAAA,KAAA,CAAM,KAAK,CAAA,GAAI,OAAW,GAAA,KAAA,CAAA;AACnC,CAAA,CAAA;AAEa,MAAA,uBAAA,GAA0B,CACrC,MAAA,EACA,GACG,KAAA;AACH,EAAA,MAAM,QAAQ,MAAS,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA,CAAA;AACvB,EAAA,OAAO,KAAM,CAAA,KAAK,CAAI,GAAA,EAAA,GAAK,CAAG,EAAA,KAAA,CAAA,EAAA,CAAA,CAAA;AAChC,EAAA;AAEO,MAAM,cAAc,CAAC;AAAA,EAC1B,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AACF,CAAwB,KAAA;AACtB,EAAA,MAAM,eAAe,GAAkC,EAAA,CAAA;AACvD,EAAA,MAAM,aAAa,GAAiB,EAAA,CAAA;AACpC,EAAA,MAAM,IAAI,GAAY,EAAA,CAAA;AACtB,EAAA,MAAM,IAAI,GAAY,EAAA,CAAA;AACtB,EAAM,MAAA,cAAA,GAAiB,GAA6C,CAAA,EAAE,CAAA,CAAA;AAEtE,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,CAAA;AAAA,IACA,CAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI,CAAC,QAAA;AAAU,MAAA,OAAA;AAEf,IAAM,MAAA,WAAA,GAAc,eAAe,YAAY,CAAA,CAAA;AAC/C,IAAM,MAAA,SAAA,GAAY,aAAa,UAAU,CAAA,CAAA;AACzC,IAAI,IAAA,CAAC,eAAe,CAAC,SAAA;AAAW,MAAA,OAAA;AAEhC,IAAA,MAAM,IAAO,GAAA,MAAM,eAAgB,CAAA,WAAA,EAAa,SAAW,EAAA;AAAA,MACzD,SAAA,EAAW,MAAM,SAAS,CAAA;AAAA,MAC1B,QAAA,EAAU,MAAM,QAAQ,CAAA;AAAA,MACxB,UAAA,EAAY,MAAM,UAAU,CAAA;AAAA,KAC7B,CAAA,CAAA;AAED,IAAA,MAAA,CAAO,MAAM,CAAA,CAAE,OAAQ,CAAA,CAAC,GAAQ,KAAA;AAC9B,MAAO,MAAA,CAAA,GAAA,CAAA,CAAK,QAAQ,IAAK,CAAA,GAAA,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,MAAM;AAChB,MAAO,MAAA,EAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AAED,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,GACF,CAAA;AACF,EAAA;AAOO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AAAA,EACA,OAAA;AACF,CAAwC,KAAA;AACtC,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,OAAS,EAAA;AAAA,MACP,OAAS,EAAA,QAAA;AAAA,MACT,OAAA;AAAA,KACF;AAAA,IAEA,GAAG,IAAM,EAAA;AACP,MAAM,MAAA,OAAA,GAAU,MAAM,QAAQ,CAAA,CAAA;AAC9B,MAAA,IAAI,CAAC,OAAA;AAAS,QAAA,OAAO,EAAC,CAAA;AAEtB,MAAA,OAAOA,KAAU,CAAA;AAAA,QACf,OAAS,EAAA,OAAA;AAAA,QACT,OAAA;AAAA,OACD,CAAE,CAAA,EAAA,CAAG,IAAI,CAAA,CAAA;AAAA,KACZ;AAAA,GACF,CAAA;AACF;;;;"}