UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 15 kB
{"version":3,"file":"helper.mjs","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 onChange(): 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"],"names":["offset","offsetMiddleware","arrow"],"mappings":"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"}