{"version":3,"file":"useResizeObserver.mjs","sources":["../../src/hooks/useResizeObserver.ts"],"sourcesContent":["import { Ref, onMounted, onUnmounted, watch, unref } from 'vue';\n\nexport interface UseResizeObserverOptions {\n  /**\n   * 尺寸从 0 变为非 0 时触发回调（用于 v-show 场景）\n   * @default false\n   */\n  onVisibilityChange?: boolean;\n  /**\n   * 任意尺寸变化时触发回调\n   * @default true\n   */\n  onResize?: boolean;\n  /**\n   * 是否立即开始观察\n   * @default true\n   */\n  immediate?: boolean;\n}\n\nexport interface ResizeCallbackParams {\n  width: number;\n  height: number;\n  entry: ResizeObserverEntry;\n  /** 是否从不可见变为可见（尺寸从 0 变为非 0） */\n  becameVisible: boolean;\n}\n\nexport type ResizeCallback = (params: ResizeCallbackParams) => void;\n\ntype TargetRef = Ref<HTMLElement | null | undefined> | HTMLElement | null | undefined;\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\n/** 对比前后尺寸，得出「是否变化」与「是否从不可见变为可见」 */\nfunction getSizeChange(prev: Size, curr: Size) {\n  const wasHidden = prev.width === 0 || prev.height === 0;\n  const isVisible = curr.width > 0 && curr.height > 0;\n  return {\n    becameVisible: wasHidden && isVisible,\n    sizeChanged: curr.width !== prev.width || curr.height !== prev.height,\n  };\n}\n\n/**\n * 监听元素尺寸变化的通用 hook，并支持识别元素从不可见变为可见（v-show 场景）\n *\n * @param target 目标元素或 Ref\n * @param callback 尺寸变化时的回调\n * @param options 配置项\n *\n * @example\n * // 监听尺寸变化\n * useResizeObserver(elRef, ({ width, height }) => {});\n *\n * @example\n * // 仅监听可见性变化（v-show 场景）\n * useResizeObserver(elRef, ({ becameVisible }) => {}, { onVisibilityChange: true, onResize: false });\n */\nexport function useResizeObserver(target: TargetRef, callback: ResizeCallback, options: UseResizeObserverOptions = {}) {\n  const { onVisibilityChange = false, onResize = true, immediate = true } = options;\n\n  // 环境不支持时返回空实现，避免注册无效的生命周期钩子（与 tdesign-vue-next 对齐）\n  if (typeof ResizeObserver === 'undefined') {\n    return {\n      isSupported: false,\n      stop: () => {},\n      start: () => {},\n    };\n  }\n\n  // 仅内部记录，无响应式依赖，用普通变量避免多余的 reactivity 开销\n  let lastSize: Size = { width: 0, height: 0 };\n  let observer: ResizeObserver | null = null;\n  // 观察状态：由 start/stop 控制，决定 target 变化时是否自动重建观察\n  let isObserving = false;\n\n  const disconnect = () => {\n    observer?.disconnect();\n    observer = null;\n  };\n\n  // 处理单次 entry：计算尺寸语义并按配置决定是否触发回调\n  const handleEntry = (entry: ResizeObserverEntry) => {\n    const { width, height } = entry.contentRect;\n    const { becameVisible, sizeChanged } = getSizeChange(lastSize, { width, height });\n    lastSize = { width, height };\n\n    // becameVisible 时尺寸必然已变化（0 → 非 0），因此不能让它跳过 onResize，\n    // 否则元素重新可见（如 keep-alive 激活）后尺寸无法更新\n    const shouldTrigger = (onVisibilityChange && becameVisible) || (onResize && sizeChanged);\n    if (shouldTrigger) {\n      callback({ width, height, entry, becameVisible });\n    }\n  };\n\n  const observe = () => {\n    disconnect();\n\n    const element = unref(target);\n    if (!element) return;\n\n    lastSize = {\n      width: element.offsetWidth || 0,\n      height: element.offsetHeight || 0,\n    };\n\n    observer = new ResizeObserver((entries) => entries.forEach(handleEntry));\n    observer.observe(element);\n  };\n\n  const start = () => {\n    isObserving = true;\n    observe();\n  };\n\n  const stop = () => {\n    isObserving = false;\n    disconnect();\n  };\n\n  // target 变化时，仅在观察中才对新元素重建观察，避免未 start 时被意外启动\n  if (typeof target === 'object' && target !== null && 'value' in target) {\n    watch(\n      () => unref(target),\n      (newEl, oldEl) => {\n        if (newEl !== oldEl && isObserving) {\n          observe();\n        }\n      },\n      { flush: 'post' },\n    );\n  }\n\n  onMounted(() => {\n    if (immediate) {\n      start();\n    }\n  });\n\n  onUnmounted(stop);\n\n  return {\n    /** 是否支持 ResizeObserver */\n    isSupported: true,\n    /** 手动停止观察 */\n    stop,\n    /** 手动开始观察 */\n    start,\n  };\n}\n\n/**\n * 监听元素从不可见变为可见（v-show 场景的语法糖）\n *\n * @param target 目标元素或 Ref\n * @param callback 元素变为可见时的回调\n *\n * @example\n * useVisibilityObserver(elRef, () => updateLayout());\n */\nexport function useVisibilityObserver(target: TargetRef, callback: () => void) {\n  return useResizeObserver(\n    target,\n    ({ becameVisible }) => {\n      if (becameVisible) {\n        callback();\n      }\n    },\n    { onVisibilityChange: true, onResize: false },\n  );\n}\n\nexport default useResizeObserver;\n"],"names":["getSizeChange","prev","curr","wasHidden","width","height","isVisible","becameVisible","sizeChanged","useResizeObserver","target","callback","options","arguments","length","undefined","_options$onVisibility","onVisibilityChange","_options$onResize","onResize","_options$immediate","immediate","ResizeObserver","isSupported","stop","start","lastSize","observer","isObserving","disconnect","_observer","handleEntry","entry","_entry$contentRect","contentRect","_getSizeChange","shouldTrigger","observe","element","unref","offsetWidth","offsetHeight","entries","forEach","_typeof","watch","newEl","oldEl","flush","onMounted","onUnmounted","useVisibilityObserver","_ref"],"mappings":"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"}