function _array_like_to_array(arr, len) {
    if (len == null || len > arr.length) len = arr.length;
    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
    return arr2;
}
function _array_with_holes(arr) {
    if (Array.isArray(arr)) return arr;
}
function _iterable_to_array_limit(arr, i) {
    var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
    if (_i == null) return;
    var _arr = [];
    var _n = true;
    var _d = false;
    var _s, _e;
    try {
        for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
            _arr.push(_s.value);
            if (i && _arr.length === i) break;
        }
    } catch (err) {
        _d = true;
        _e = err;
    } finally{
        try {
            if (!_n && _i["return"] != null) _i["return"]();
        } finally{
            if (_d) throw _e;
        }
    }
    return _arr;
}
function _non_iterable_rest() {
    throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _sliced_to_array(arr, i) {
    return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
}
function _unsupported_iterable_to_array(o, minLen) {
    if (!o) return;
    if (typeof o === "string") return _array_like_to_array(o, minLen);
    var n = Object.prototype.toString.call(o).slice(8, -1);
    if (n === "Object" && o.constructor) n = o.constructor.name;
    if (n === "Map" || n === "Set") return Array.from(n);
    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
}
import { useEffect, useState } from "react";
/**
 * useElementSize Hook - 监听元素的实时宽高
 *
 * @description
 * - SSR / 旧浏览器（无 ResizeObserver）下安全降级：直接返回初始 `{0, 0}` 不抛错
 * - 兼容 Safari 13 / 旧 jsdom：当 `entry.borderBoxSize` 不存在时回退到 `contentRect`
 * - 在每次渲染时把 `element.current` 同步到本地 state，effect 依赖该 state，
 *   从而能感知到 ref.current 被替换（如父组件根据条件渲染不同 DOM 节点的场景）。
 *   单纯依赖 `element`（ref 对象本身引用稳定）会导致 effect 永远不重建。
 *
 * @param element - 目标元素的 ref
 * @returns 元素当前的 `{ width, height }`
 */ export var useElementSize = function useElementSize(element) {
    var _useState = _sliced_to_array(useState({
        width: 0,
        height: 0
    }), 2), size = _useState[0], setSize = _useState[1];
    // 用 state 持有当前 ref 指向的 DOM 节点 —— 当父组件把 ref 指向不同节点时，
    // 渲染期间发现差异即触发 setState，下一次 effect 就能 observe 新节点。
    // 注意：这里读 element.current 不会破坏 React 严格模式（ref 读不算副作用），
    // 但 setState 必须放进条件分支只在变化时触发，否则会无限渲染。
    var _useState1 = _sliced_to_array(useState(function() {
        var _element_current;
        return (_element_current = element.current) !== null && _element_current !== void 0 ? _element_current : null;
    }), 2), observedElement = _useState1[0], setObservedElement = _useState1[1];
    if (element.current !== observedElement) {
        var _element_current;
        setObservedElement((_element_current = element.current) !== null && _element_current !== void 0 ? _element_current : null);
    }
    useEffect(function() {
        if (!observedElement) return;
        // SSR 或旧浏览器无 ResizeObserver：安全跳过，不抛 ReferenceError
        if (typeof ResizeObserver === 'undefined') return;
        var resizeObserver = new ResizeObserver(function(entries) {
            var _ref, _ref1;
            var _entry_borderBoxSize;
            var entry = entries[0];
            if (!entry) return;
            // Safari 13 / 旧 jsdom 不支持 borderBoxSize，回退到 contentRect
            var borderBox = (_entry_borderBoxSize = entry.borderBoxSize) === null || _entry_borderBoxSize === void 0 ? void 0 : _entry_borderBoxSize[0];
            var width = (_ref = borderBox === null || borderBox === void 0 ? void 0 : borderBox.inlineSize) !== null && _ref !== void 0 ? _ref : entry.contentRect.width;
            var height = (_ref1 = borderBox === null || borderBox === void 0 ? void 0 : borderBox.blockSize) !== null && _ref1 !== void 0 ? _ref1 : entry.contentRect.height;
            setSize({
                width: width,
                height: height
            });
        });
        resizeObserver.observe(observedElement);
        return function() {
            resizeObserver.disconnect();
        };
    }, [
        observedElement
    ]);
    return size;
};
