{"version":3,"file":"useElementRect.mjs","sources":["../../src/hooks/useElementRect.ts"],"sourcesContent":["import { ref, shallowRef, Ref, ShallowRef, unref, watch, onMounted, onUnmounted } from 'vue';\nimport { useResizeObserver } from './useResizeObserver';\n\nexport type ElementOrRef = string | Element | null | undefined;\n\nexport interface UseElementRectOptions {\n  /** 是否立即计算边界 */\n  immediate?: boolean;\n  /** 是否监听元素尺寸变化 */\n  resizeObserver?: boolean;\n}\n\nexport interface ElementRect {\n  top: number;\n  bottom: number;\n  left: number;\n  right: number;\n  width: number;\n  height: number;\n}\n\n/**\n * 解析元素，支持：字符串选择器、Element 对象\n * @param element 元素或选择器\n * @returns HTMLElement\n */\nfunction resolveElement(element: ElementOrRef): HTMLElement | null {\n  if (!element) return null;\n\n  if (typeof element === 'string') {\n    // 字符串选择器\n    return document.querySelector(element);\n  }\n\n  if (element instanceof HTMLElement) {\n    // 直接传入的 HTMLElement\n    return element;\n  }\n\n  return null;\n}\n\n/**\n * 获取元素的边界信息\n * @param element HTMLElement\n * @returns ElementRect\n */\nfunction getElementRect(element: HTMLElement): ElementRect {\n  const rect = element.getBoundingClientRect();\n  return {\n    top: rect.top,\n    bottom: rect.bottom,\n    left: rect.left,\n    right: rect.right,\n    width: rect.width,\n    height: rect.height,\n  };\n}\n\n/**\n * 用于获取和监听元素边界信息的 hook\n * @param element 元素或选择器，支持 Ref<...> 类型\n * @param options 配置选项\n * @returns 返回元素引用和边界信息\n *\n * @example\n * // 基础用法\n * const { element, rect } = useElementRect(myRef);\n *\n * @example\n * // 只需要高度（兼容 useElementHeight）\n * const { rect: { height } } = useElementRect(myRef);\n *\n * @example\n * // 监听元素尺寸变化\n * const { element, rect } = useElementRect(myRef, { resizeObserver: true });\n *\n * @example\n * // 延迟计算\n * const { element, rect, updateElement } = useElementRect(myRef, { immediate: false });\n */\nexport default function useElementRect(\n  element: Ref<ElementOrRef> | ElementOrRef,\n  options: UseElementRectOptions = {},\n): {\n  element: ShallowRef<HTMLElement | null>;\n  rect: Ref<ElementRect>;\n  updateElement: () => void;\n} {\n  const { immediate = true, resizeObserver: enableResizeObserver = false } = options;\n  const elementRef = shallowRef<HTMLElement | null>(null);\n  const rect = ref<ElementRect>({\n    top: 0,\n    bottom: 0,\n    left: 0,\n    right: 0,\n    width: 0,\n    height: 0,\n  });\n\n  const updateElement = () => {\n    // 使用 unref 统一处理 Ref 和非 Ref 类型\n    const elementValue = unref(element);\n    const el = resolveElement(elementValue);\n    elementRef.value = el;\n\n    if (el) {\n      rect.value = getElementRect(el);\n    }\n  };\n\n  // 使用统一的 ResizeObserver hook\n  const { stop: stopResizeObserver, start: startResizeObserver } = useResizeObserver(\n    elementRef,\n    () => {\n      if (elementRef.value) {\n        rect.value = getElementRect(elementRef.value);\n      }\n    },\n    { immediate: false, onResize: true, onVisibilityChange: false },\n  );\n\n  // 监听 element 参数变化\n  watch(\n    () => unref(element),\n    () => {\n      stopResizeObserver();\n      updateElement();\n      if (enableResizeObserver) {\n        startResizeObserver();\n      }\n    },\n    { flush: 'post' },\n  );\n\n  onMounted(() => {\n    if (immediate) {\n      updateElement();\n      if (enableResizeObserver) {\n        startResizeObserver();\n      }\n    }\n  });\n\n  onUnmounted(() => {\n    stopResizeObserver();\n  });\n\n  return {\n    element: elementRef,\n    rect,\n    updateElement,\n  };\n}\n\n/**\n * @deprecated 使用 useElementRect 替代\n * 用于计算元素高度的 hook\n * @param target 元素 ref\n * @param options 配置选项\n * @returns 返回高度和重新计算的方法\n */\nexport function useElementHeight(target: Ref<HTMLElement | undefined>, options: UseElementRectOptions = {}) {\n  const { rect } = useElementRect(target, options);\n\n  return {\n    height: ref(() => rect.value.height),\n    calculateHeight: () => {\n      // useElementRect 内部会自动更新，这里保持兼容性\n    },\n  };\n}\n\nexport { resolveElement, getElementRect };\n"],"names":["resolveElement","element","document","querySelector","HTMLElement","getElementRect","rect","getBoundingClientRect","top","bottom","left","right","width","height","useElementRect","options","arguments","length","undefined","_options$immediate","immediate","_options$resizeObserv","resizeObserver","enableResizeObserver","elementRef","shallowRef","ref","updateElement","elementValue","unref","el","value","_useResizeObserver","useResizeObserver","onResize","onVisibilityChange","stopResizeObserver","stop","startResizeObserver","start","watch","flush","onMounted","onUnmounted","useElementHeight","target","_useElementRect","calculateHeight"],"mappings":"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"}