{"version":3,"file":"helper.mjs","names":["offsetMiddleware","offset"],"sources":["../../../../../../packages/components/tour/src/helper.ts"],"sourcesContent":["import {\n  computed,\n  onBeforeUnmount,\n  onMounted,\n  ref,\n  unref,\n  watch,\n  watchEffect,\n} from 'vue'\nimport {\n  arrow,\n  autoUpdate,\n  computePosition,\n  detectOverflow,\n  flip,\n  offset as offsetMiddleware,\n  shift,\n} from '@floating-ui/dom'\nimport {\n  isArray,\n  isClient,\n  isFunction,\n  isString,\n  keysOf,\n} from '@element-plus/utils'\n\nimport type {\n  CSSProperties,\n  Component,\n  InjectionKey,\n  Ref,\n  SetupContext,\n} from 'vue'\nimport type { UseNamespaceReturn } from '@element-plus/hooks'\nimport type { PosInfo, TourGap, TourMask } from './types'\nimport type {\n  ComputePositionReturn,\n  Middleware,\n  Placement,\n  Strategy,\n  VirtualElement,\n} from '@floating-ui/dom'\nimport type { TourStepProps } from './step'\n\nexport const useTarget = (\n  target: Ref<\n    string | HTMLElement | (() => HTMLElement | null) | null | undefined\n  >,\n  open: Ref<boolean>,\n  gap: Ref<TourGap>,\n  mergedMask: Ref<TourMask>,\n  scrollIntoViewOptions: Ref<boolean | ScrollIntoViewOptions>\n) => {\n  const posInfo: Ref<PosInfo | null> = ref(null)\n\n  const getTargetEl = () => {\n    let targetEl: HTMLElement | null | undefined\n    if (isString(target.value)) {\n      targetEl = document.querySelector<HTMLElement>(target.value)\n    } else if (isFunction(target.value)) {\n      targetEl = target.value()\n    } else {\n      targetEl = target.value\n    }\n    return targetEl\n  }\n\n  const updatePosInfo = () => {\n    const targetEl = getTargetEl()\n    if (!targetEl || !open.value) {\n      posInfo.value = null\n      return\n    }\n    if (!isInViewPort(targetEl)) {\n      targetEl.scrollIntoView(scrollIntoViewOptions.value)\n    }\n    const { left, top, width, height } = targetEl.getBoundingClientRect()\n    posInfo.value = {\n      left,\n      top,\n      width,\n      height,\n      radius: 0,\n    }\n  }\n\n  onMounted(() => {\n    watch(\n      [open, target],\n      () => {\n        updatePosInfo()\n      },\n      {\n        immediate: true,\n      }\n    )\n    window.addEventListener('resize', updatePosInfo)\n  })\n\n  onBeforeUnmount(() => {\n    window.removeEventListener('resize', updatePosInfo)\n  })\n\n  const getGapOffset = (index: number) =>\n    (isArray(gap.value.offset) ? gap.value.offset[index] : gap.value.offset) ??\n    6\n\n  const mergedPosInfo = computed(() => {\n    if (!posInfo.value) return posInfo.value\n\n    const gapOffsetX = getGapOffset(0)\n    const gapOffsetY = getGapOffset(1)\n    const gapRadius = gap.value?.radius || 2\n\n    return {\n      left: posInfo.value.left - gapOffsetX,\n      top: posInfo.value.top - gapOffsetY,\n      width: posInfo.value.width + gapOffsetX * 2,\n      height: posInfo.value.height + gapOffsetY * 2,\n      radius: gapRadius,\n    }\n  })\n\n  const triggerTarget = computed(() => {\n    const targetEl = getTargetEl()\n    if (!mergedMask.value || !targetEl || !window.DOMRect) {\n      return targetEl || undefined\n    }\n\n    return {\n      getBoundingClientRect() {\n        return window.DOMRect.fromRect({\n          width: mergedPosInfo.value?.width || 0,\n          height: mergedPosInfo.value?.height || 0,\n          x: mergedPosInfo.value?.left || 0,\n          y: mergedPosInfo.value?.top || 0,\n        })\n      },\n    }\n  })\n\n  return {\n    mergedPosInfo,\n    triggerTarget,\n  }\n}\n\nexport interface TourContext {\n  currentStep: Ref<TourStepProps | undefined>\n  current: Ref<number>\n  total: Ref<number>\n  showClose: Ref<boolean>\n  closeIcon: Ref<string | Component | undefined>\n  mergedType: Ref<'default' | 'primary' | undefined>\n  ns: UseNamespaceReturn\n  slots: SetupContext['slots']\n  updateModelValue(modelValue: boolean): void\n  onClose(): void\n  onFinish(): void\n}\n\nexport const tourKey: InjectionKey<TourContext> = Symbol('ElTour')\n\nfunction isInViewPort(element: HTMLElement) {\n  const viewWidth = window.innerWidth || document.documentElement.clientWidth\n  const viewHeight = window.innerHeight || document.documentElement.clientHeight\n  const { top, right, bottom, left } = element.getBoundingClientRect()\n\n  return top >= 0 && left >= 0 && right <= viewWidth && bottom <= viewHeight\n}\n\nexport const useFloating = (\n  referenceRef: Ref<HTMLElement | VirtualElement | null>,\n  contentRef: Ref<HTMLElement | null>,\n  arrowRef: Ref<HTMLElement | null>,\n  placement: Ref<Placement | undefined>,\n  strategy: Ref<Strategy>,\n  offset: Ref<number>,\n  zIndex: Ref<number>,\n  showArrow: Ref<boolean>\n) => {\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 middleware = computed(() => {\n    const _middleware: Middleware[] = [\n      offsetMiddleware(unref(offset)),\n      flip(),\n      shift(),\n      overflowMiddleware(),\n    ]\n\n    if (unref(showArrow) && unref(arrowRef)) {\n      _middleware.push(\n        arrow({\n          element: unref(arrowRef)!,\n        })\n      )\n    }\n    return _middleware\n  })\n\n  const update = async () => {\n    if (!isClient) return\n\n    const referenceEl = unref(referenceRef)\n    const contentEl = unref(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  const contentStyle = computed<CSSProperties>(() => {\n    if (!unref(referenceRef)) {\n      return {\n        position: 'fixed',\n        top: '50%',\n        left: '50%',\n        transform: 'translate3d(-50%, -50%, 0)',\n        maxWidth: '100vw',\n        zIndex: unref(zIndex),\n      }\n    }\n\n    const { overflow } = unref(middlewareData)\n\n    return {\n      position: unref(strategy),\n      zIndex: unref(zIndex),\n      top: unref(y) != null ? `${unref(y)}px` : '',\n      left: unref(x) != null ? `${unref(x)}px` : '',\n      maxWidth: overflow?.maxWidth ? `${overflow?.maxWidth}px` : '',\n    }\n  })\n\n  const arrowStyle = computed<CSSProperties>(() => {\n    if (!unref(showArrow)) return {}\n\n    const { arrow } = unref(middlewareData)\n    return {\n      left: arrow?.x != null ? `${arrow?.x}px` : '',\n      top: arrow?.y != null ? `${arrow?.y}px` : '',\n    }\n  })\n\n  let cleanup: any\n  onMounted(() => {\n    const referenceEl = unref(referenceRef)\n    const contentEl = unref(contentRef)\n    if (referenceEl && contentEl) {\n      cleanup = autoUpdate(referenceEl, contentEl, update)\n    }\n\n    watchEffect(() => {\n      update()\n    })\n  })\n\n  onBeforeUnmount(() => {\n    cleanup && cleanup()\n  })\n\n  return {\n    update,\n    contentStyle,\n    arrowStyle,\n  }\n}\n\nconst overflowMiddleware = (): Middleware => {\n  return {\n    name: 'overflow',\n    async fn(state) {\n      const overflow = await detectOverflow(state)\n      let overWidth = 0\n      if (overflow.left > 0) overWidth = overflow.left\n      if (overflow.right > 0) overWidth = overflow.right\n      const floatingWidth = state.rects.floating.width\n      return {\n        data: {\n          maxWidth: floatingWidth - overWidth,\n        },\n      }\n    },\n  }\n}\n"],"mappings":"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"}