{"version":3,"file":"useTarget.mjs","sources":["../../../../../../../packages/vue-components/vc-tour/src/hooks/useTarget.ts"],"sourcesContent":["import type { Ref } from 'vue';\nimport type { TourStepInfo } from '../interface';\nimport { useState } from '@antdv/hooks';\nimport { computed, onBeforeUnmount, onMounted, watch, watchEffect } from 'vue';\nimport { isInViewPort } from '../util';\n\nexport interface Gap {\n  offset?: number;\n  radius?: number;\n}\n\nexport interface PosInfo {\n  left: number;\n  top: number;\n  height: number;\n  width: number;\n  radius: number;\n}\n\nexport default function useTarget(\n  target: Ref<TourStepInfo['target']>,\n  open: Ref<boolean>,\n  gap?: Ref<Gap>,\n  scrollIntoViewOptions?: Ref<boolean | ScrollIntoViewOptions>,\n): [Ref<PosInfo>, Ref<HTMLElement>] {\n  // ========================= Target =========================\n  // We trade `undefined` as not get target by function yet.\n  // `null` as empty target.\n  const [targetElement, setTargetElement] = useState<null | HTMLElement | undefined>(undefined);\n\n  watchEffect(\n    () => {\n      const nextElement\n        = typeof target.value === 'function' ? (target.value as any)() : target.value;\n\n      setTargetElement(nextElement || null);\n    },\n    { flush: 'post' },\n  );\n\n  // ========================= Align ==========================\n  const [posInfo, setPosInfo] = useState<PosInfo>(null);\n\n  const updatePos = () => {\n    if (!open.value) {\n      setPosInfo(null);\n      return;\n    }\n    if (targetElement.value) {\n      // Exist target element. We should scroll and get target position\n      if (!isInViewPort(targetElement.value) && open.value)\n        targetElement.value.scrollIntoView(scrollIntoViewOptions.value);\n\n      const { left, top, width, height } = targetElement.value.getBoundingClientRect();\n      const nextPosInfo: PosInfo = { left, top, width, height, radius: 0 };\n      if (JSON.stringify(posInfo.value) !== JSON.stringify(nextPosInfo))\n        setPosInfo(nextPosInfo);\n    } else {\n      // Not exist target which means we just show in center\n      setPosInfo(null);\n    }\n  };\n\n  onMounted(() => {\n    watch(\n      [open, targetElement],\n      () => {\n        updatePos();\n      },\n      { flush: 'post', immediate: true },\n    );\n    // update when window resize\n    window.addEventListener('resize', updatePos);\n  });\n  onBeforeUnmount(() => {\n    window.removeEventListener('resize', updatePos);\n  });\n\n  // ======================== PosInfo =========================\n  const mergedPosInfo = computed(() => {\n    if (!posInfo.value)\n      return posInfo.value;\n\n    const gapOffset = gap.value?.offset || 6;\n    const gapRadius = gap.value?.radius || 2;\n\n    return {\n      left: posInfo.value.left - gapOffset,\n      top: posInfo.value.top - gapOffset,\n      width: posInfo.value.width + gapOffset * 2,\n      height: posInfo.value.height + gapOffset * 2,\n      radius: gapRadius,\n    };\n  });\n\n  return [mergedPosInfo, targetElement];\n}\n"],"names":[],"mappings":";;;;;AAmBA,SAAwB,SACtB,CAAA,MAAA,EACA,IACA,EAAA,GAAA,EACA,qBACkC,EAAA;AAIlC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAyC,KAAS,CAAA,CAAA,CAAA;AAE5F,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAM,MAAA,WAAA,GACF,OAAO,MAAO,CAAA,KAAA,KAAU,aAAc,MAAO,CAAA,KAAA,KAAkB,MAAO,CAAA,KAAA,CAAA;AAE1E,MAAA,gBAAA,CAAiB,eAAe,IAAI,CAAA,CAAA;AAAA,KACtC;AAAA,IACA,EAAE,OAAO,MAAO,EAAA;AAAA,GAClB,CAAA;AAGA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAkB,IAAI,CAAA,CAAA;AAEpD,EAAA,MAAM,YAAY,MAAM;AACtB,IAAI,IAAA,CAAC,KAAK,KAAO,EAAA;AACf,MAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AACf,MAAA,OAAA;AAAA,KACF;AACA,IAAA,IAAI,cAAc,KAAO,EAAA;AAEvB,MAAA,IAAI,CAAC,YAAA,CAAa,aAAc,CAAA,KAAK,KAAK,IAAK,CAAA,KAAA;AAC7C,QAAc,aAAA,CAAA,KAAA,CAAM,cAAe,CAAA,qBAAA,CAAsB,KAAK,CAAA,CAAA;AAEhE,MAAM,MAAA,EAAE,MAAM,GAAK,EAAA,KAAA,EAAO,QAAW,GAAA,aAAA,CAAc,MAAM,qBAAsB,EAAA,CAAA;AAC/E,MAAA,MAAM,cAAuB,EAAE,IAAA,EAAM,KAAK,KAAO,EAAA,MAAA,EAAQ,QAAQ,CAAE,EAAA,CAAA;AACnE,MAAA,IAAI,KAAK,SAAU,CAAA,OAAA,CAAQ,KAAK,CAAM,KAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAC9D,QAAA,UAAA,CAAW,WAAW,CAAA,CAAA;AAAA,KACnB,MAAA;AAEL,MAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,KACjB;AAAA,GACF,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,KAAA;AAAA,MACE,CAAC,MAAM,aAAa,CAAA;AAAA,MACpB,MAAM;AACJ,QAAU,SAAA,EAAA,CAAA;AAAA,OACZ;AAAA,MACA,EAAE,KAAA,EAAO,MAAQ,EAAA,SAAA,EAAW,IAAK,EAAA;AAAA,KACnC,CAAA;AAEA,IAAO,MAAA,CAAA,gBAAA,CAAiB,UAAU,SAAS,CAAA,CAAA;AAAA,GAC5C,CAAA,CAAA;AACD,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAO,MAAA,CAAA,mBAAA,CAAoB,UAAU,SAAS,CAAA,CAAA;AAAA,GAC/C,CAAA,CAAA;AAGD,EAAM,MAAA,aAAA,GAAgB,SAAS,MAAM;AA/EvC,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAgFI,IAAA,IAAI,CAAC,OAAQ,CAAA,KAAA;AACX,MAAA,OAAO,OAAQ,CAAA,KAAA,CAAA;AAEjB,IAAA,MAAM,SAAY,GAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,KAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAW,MAAU,KAAA,CAAA,CAAA;AACvC,IAAA,MAAM,SAAY,GAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,KAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAW,MAAU,KAAA,CAAA,CAAA;AAEvC,IAAO,OAAA;AAAA,MACL,IAAA,EAAM,OAAQ,CAAA,KAAA,CAAM,IAAO,GAAA,SAAA;AAAA,MAC3B,GAAA,EAAK,OAAQ,CAAA,KAAA,CAAM,GAAM,GAAA,SAAA;AAAA,MACzB,KAAO,EAAA,OAAA,CAAQ,KAAM,CAAA,KAAA,GAAQ,SAAY,GAAA,CAAA;AAAA,MACzC,MAAQ,EAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,GAAS,SAAY,GAAA,CAAA;AAAA,MAC3C,MAAQ,EAAA,SAAA;AAAA,KACV,CAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAO,OAAA,CAAC,eAAe,aAAa,CAAA,CAAA;AACtC;;;;"}