@tamagui/use-element-layout 2.0.0-rc.4 → 2.0.0-rc.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,20 +5,22 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
7
  var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, {
9
- get: all[name],
10
- enumerable: !0
11
- });
12
- },
13
- __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
15
16
  get: () => from[key],
16
17
  enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
18
  });
18
- return to;
19
- };
19
+ }
20
+ return to;
21
+ };
20
22
  var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
21
- value: !0
23
+ value: true
22
24
  }), mod);
23
25
  var index_exports = {};
24
26
  __export(index_exports, {
@@ -33,242 +35,399 @@ __export(index_exports, {
33
35
  measureInWindow: () => measureInWindow,
34
36
  measureLayout: () => measureLayout,
35
37
  measureNode: () => measureNode,
38
+ registerLayoutNode: () => registerLayoutNode,
36
39
  setOnLayoutStrategy: () => setOnLayoutStrategy,
37
40
  useElementLayout: () => useElementLayout
38
41
  });
39
42
  module.exports = __toCommonJS(index_exports);
40
- var import_jsx_runtime = require("react/jsx-runtime"),
41
- import_constants = require("@tamagui/constants"),
42
- import_is_equal_shallow = require("@tamagui/is-equal-shallow"),
43
- import_react = require("react");
43
+ var import_jsx_runtime = require("react/jsx-runtime");
44
+ var import_constants = require("@tamagui/constants");
45
+ var import_react = require("react");
44
46
  function _instanceof(left, right) {
45
- return right != null && typeof Symbol < "u" && right[Symbol.hasInstance] ? !!right[Symbol.hasInstance](left) : left instanceof right;
47
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) return !!right[Symbol.hasInstance](left);else return left instanceof right;
46
48
  }
47
- var LayoutHandlers = /* @__PURE__ */new WeakMap(),
48
- LayoutDisableKey = /* @__PURE__ */new WeakMap(),
49
- Nodes = /* @__PURE__ */new Set(),
50
- IntersectionState = /* @__PURE__ */new WeakMap(),
51
- DisableLayoutContextValues = {},
52
- DisableLayoutContextKey = /* @__PURE__ */(0, import_react.createContext)(""),
53
- ENABLE = !1,
54
- LayoutMeasurementController = function (param) {
55
- var {
56
- disable,
57
- children
58
- } = param,
59
- id = (0, import_react.useId)();
60
- return (0, import_constants.useIsomorphicLayoutEffect)(function () {
61
- DisableLayoutContextValues[id] = disable;
62
- }, [disable, id]), /* @__PURE__ */(0, import_jsx_runtime.jsx)(DisableLayoutContextKey.Provider, {
63
- value: id,
64
- children
65
- });
66
- },
67
- globalIntersectionObserver = null,
68
- strategy = "async";
49
+ var LayoutHandlers = /* @__PURE__ */new WeakMap();
50
+ var LayoutDisableKey = /* @__PURE__ */new WeakMap();
51
+ var Nodes = /* @__PURE__ */new Set();
52
+ var IntersectionState = /* @__PURE__ */new WeakMap();
53
+ var usePretransformDimensions = function () {
54
+ return globalThis.__TAMAGUI_ONLAYOUT_PRETRANSFORM === true || process.env.TAMAGUI_ONLAYOUT_PRETRANSFORM === "1";
55
+ };
56
+ var _debugLayout;
57
+ function isDebugLayout() {
58
+ if (_debugLayout === void 0) _debugLayout = typeof window !== "undefined" && new URLSearchParams(window.location.search).has("__tamaDebugLayout");
59
+ return _debugLayout;
60
+ }
61
+ var DisableLayoutContextValues = {};
62
+ var DisableLayoutContextKey = /* @__PURE__ */(0, import_react.createContext)("");
63
+ var ENABLE = false;
64
+ var LayoutMeasurementController = function (param) {
65
+ var {
66
+ disable,
67
+ children
68
+ } = param;
69
+ var id = (0, import_react.useId)();
70
+ (0, import_constants.useIsomorphicLayoutEffect)(function () {
71
+ DisableLayoutContextValues[id] = disable;
72
+ }, [disable, id]);
73
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(DisableLayoutContextKey.Provider, {
74
+ value: id,
75
+ children
76
+ });
77
+ };
78
+ var globalIntersectionObserver = null;
79
+ var strategy = "async";
69
80
  function setOnLayoutStrategy(state) {
70
81
  strategy = state;
71
82
  }
72
- var NodeRectCache = /* @__PURE__ */new WeakMap(),
73
- LastChangeTime = /* @__PURE__ */new WeakMap(),
74
- avoidUpdates = !0,
75
- queuedUpdates = /* @__PURE__ */new Map();
83
+ var NodeRectCache = /* @__PURE__ */new WeakMap();
84
+ var avoidUpdates = true;
85
+ var queuedUpdates = /* @__PURE__ */new Map();
76
86
  function enable() {
77
- avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(function (cb) {
78
- return cb();
79
- }), queuedUpdates.clear()));
87
+ if (avoidUpdates) {
88
+ avoidUpdates = false;
89
+ if (queuedUpdates) {
90
+ queuedUpdates.forEach(function (cb) {
91
+ return cb();
92
+ });
93
+ queuedUpdates.clear();
94
+ }
95
+ }
80
96
  }
81
97
  function startGlobalObservers() {
82
- !ENABLE || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(function (entries) {
83
- entries.forEach(function (entry) {
98
+ if (!ENABLE || globalIntersectionObserver) return;
99
+ globalIntersectionObserver = new IntersectionObserver(function (entries) {
100
+ for (var i = 0; i < entries.length; i++) {
101
+ var entry = entries[i];
84
102
  var node = entry.target;
85
- IntersectionState.get(node) !== entry.isIntersecting && IntersectionState.set(node, entry.isIntersecting);
86
- });
103
+ if (IntersectionState.get(node) !== entry.isIntersecting) IntersectionState.set(node, entry.isIntersecting);
104
+ }
87
105
  }, {
88
106
  threshold: 0
89
- }));
107
+ });
108
+ }
109
+ function rectsEqual(a, b) {
110
+ return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
90
111
  }
91
112
  if (ENABLE) {
113
+ let ensureRectFetchObserver = function () {
114
+ if (rectFetchObserver) return rectFetchObserver;
115
+ rectFetchObserver = new IntersectionObserver(function (entries) {
116
+ lastCallbackDelay = Math.round(performance.now() - rectFetchStartTime);
117
+ for (var i = 0; i < entries.length; i++) BoundingRects.set(entries[i].target, entries[i].boundingClientRect);
118
+ if (process.env.NODE_ENV === "development" && isDebugLayout() && lastCallbackDelay > 50) console.warn("[onLayout-io-delay]", lastCallbackDelay + "ms", entries.length, "entries");
119
+ if (rectFetchResolve) {
120
+ rectFetchResolve(true);
121
+ rectFetchResolve = null;
122
+ }
123
+ }, {
124
+ threshold: 0
125
+ });
126
+ return rectFetchObserver;
127
+ };
92
128
  var BoundingRects = /* @__PURE__ */new WeakMap();
129
+ var rectFetchObserver = null;
130
+ var rectFetchResolve = null;
131
+ var rectFetchStartTime = 0;
132
+ var lastCallbackDelay = 0;
93
133
  async function updateLayoutIfChanged(node) {
94
134
  var onLayout = LayoutHandlers.get(node);
95
- if (typeof onLayout == "function") {
96
- var parentNode = node.parentElement;
97
- if (parentNode) {
98
- var nodeRect, parentRect;
99
- if (strategy === "async") {
100
- var [nr, pr] = await Promise.all([BoundingRects.get(node), BoundingRects.get(parentNode)]);
101
- if (!nr || !pr) return;
102
- nodeRect = nr, parentRect = pr;
103
- } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
104
- if (!(!nodeRect || !parentRect)) {
105
- var cachedRect = NodeRectCache.get(node),
106
- cachedParentRect = NodeRectCache.get(parentNode);
107
- if (!cachedRect || !cachedParentRect ||
108
- // has changed one rect
109
- // @ts-expect-error DOMRectReadOnly can go into object
110
- !(0, import_is_equal_shallow.isEqualShallow)(cachedRect, nodeRect) ||
111
- // @ts-expect-error DOMRectReadOnly can go into object
112
- !(0, import_is_equal_shallow.isEqualShallow)(cachedParentRect, parentRect)) {
113
- NodeRectCache.set(node, nodeRect), NodeRectCache.set(parentNode, parentRect);
114
- var event = getElementLayoutEvent(nodeRect, parentRect);
115
- avoidUpdates ? queuedUpdates.set(node, function () {
116
- return onLayout(event);
117
- }) : onLayout(event);
118
- }
119
- }
120
- }
135
+ if (typeof onLayout !== "function") return;
136
+ var parentNode = node.parentElement;
137
+ if (!parentNode) return;
138
+ var nodeRect;
139
+ var parentRect;
140
+ if (strategy === "async") {
141
+ nodeRect = BoundingRects.get(node);
142
+ parentRect = BoundingRects.get(parentNode);
143
+ if (!nodeRect || !parentRect) return;
144
+ } else {
145
+ nodeRect = node.getBoundingClientRect();
146
+ parentRect = parentNode.getBoundingClientRect();
147
+ }
148
+ var cachedRect = NodeRectCache.get(node);
149
+ var cachedParentRect = NodeRectCache.get(parentNode);
150
+ var nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect);
151
+ var parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect);
152
+ if (nodeChanged || parentChanged) {
153
+ NodeRectCache.set(node, nodeRect);
154
+ NodeRectCache.set(parentNode, parentRect);
155
+ var event = getElementLayoutEvent(nodeRect, parentRect, node);
156
+ if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] change", {
157
+ tag: node.tagName,
158
+ id: node.id || void 0,
159
+ className: (node.className || "").slice(0, 60) || void 0,
160
+ layout: event.nativeEvent.layout,
161
+ first: !cachedRect
162
+ });
163
+ if (avoidUpdates) queuedUpdates.set(node, function () {
164
+ return onLayout(event);
165
+ });else onLayout(event);
121
166
  }
122
167
  }
123
- var userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP,
124
- RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 14;
168
+ var rAF = typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : void 0;
169
+ var userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP;
170
+ var BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10;
171
+ var MAX_SKIP_FRAMES = 20;
172
+ var skipFrames = BASE_SKIP_FRAMES;
173
+ var frameCount = 0;
125
174
  async function layoutOnAnimationFrame() {
175
+ if (frameCount++ % skipFrames !== 0) {
176
+ rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
177
+ return;
178
+ }
179
+ if (frameCount >= Number.MAX_SAFE_INTEGER) frameCount = 0;
126
180
  if (strategy !== "off") {
127
- var visibleNodes = [],
128
- didRun = await new Promise(function (res) {
129
- var io = new IntersectionObserver(function (entries) {
130
- io.disconnect();
131
- var _iteratorNormalCompletion2 = !0,
132
- _didIteratorError2 = !1,
133
- _iteratorError2 = void 0;
134
- try {
135
- for (var _iterator2 = entries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
136
- var entry = _step2.value;
137
- BoundingRects.set(entry.target, entry.boundingClientRect);
138
- }
139
- } catch (err) {
140
- _didIteratorError2 = !0, _iteratorError2 = err;
141
- } finally {
142
- try {
143
- !_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
144
- } finally {
145
- if (_didIteratorError2) throw _iteratorError2;
146
- }
147
- }
148
- res(!0);
149
- }, {
150
- threshold: 0
151
- }),
152
- didObserve = !1,
153
- _iteratorNormalCompletion = !0,
154
- _didIteratorError = !1,
155
- _iteratorError = void 0;
181
+ var visibleNodes = [];
182
+ var parentsToObserve = /* @__PURE__ */new Set();
183
+ var _iteratorNormalCompletion = true,
184
+ _didIteratorError = false,
185
+ _iteratorError = void 0;
186
+ try {
187
+ for (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
188
+ var node = _step.value;
189
+ var parentElement = node.parentElement;
190
+ if (!_instanceof(parentElement, HTMLElement)) {
191
+ cleanupNode(node);
192
+ continue;
193
+ }
194
+ var disableKey = LayoutDisableKey.get(node);
195
+ if (disableKey && DisableLayoutContextValues[disableKey] === true) continue;
196
+ if (IntersectionState.get(node) === false) continue;
197
+ visibleNodes.push(node);
198
+ parentsToObserve.add(parentElement);
199
+ }
200
+ } catch (err) {
201
+ _didIteratorError = true;
202
+ _iteratorError = err;
203
+ } finally {
204
+ try {
205
+ if (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();
206
+ } finally {
207
+ if (_didIteratorError) throw _iteratorError;
208
+ }
209
+ }
210
+ if (visibleNodes.length > 0) {
211
+ var io = ensureRectFetchObserver();
212
+ rectFetchStartTime = performance.now();
213
+ for (var i = 0; i < visibleNodes.length; i++) io.observe(visibleNodes[i]);
214
+ var _iteratorNormalCompletion1 = true,
215
+ _didIteratorError1 = false,
216
+ _iteratorError1 = void 0;
217
+ try {
218
+ for (var _iterator1 = parentsToObserve[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
219
+ var parent = _step1.value;
220
+ io.observe(parent);
221
+ }
222
+ } catch (err) {
223
+ _didIteratorError1 = true;
224
+ _iteratorError1 = err;
225
+ } finally {
156
226
  try {
157
- for (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
158
- var node = _step.value;
159
- if (_instanceof(node.parentElement, HTMLElement)) {
160
- var disableKey = LayoutDisableKey.get(node);
161
- disableKey && DisableLayoutContextValues[disableKey] === !0 || IntersectionState.get(node) !== !1 && (didObserve = !0, io.observe(node), io.observe(node.parentElement), visibleNodes.push(node));
162
- }
163
- }
164
- } catch (err) {
165
- _didIteratorError = !0, _iteratorError = err;
227
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) _iterator1.return();
166
228
  } finally {
167
- try {
168
- !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
169
- } finally {
170
- if (_didIteratorError) throw _iteratorError;
171
- }
229
+ if (_didIteratorError1) throw _iteratorError1;
172
230
  }
173
- didObserve || res(!1);
231
+ }
232
+ await new Promise(function (res) {
233
+ rectFetchResolve = res;
174
234
  });
175
- didRun && visibleNodes.forEach(function (node) {
176
- updateLayoutIfChanged(node);
177
- });
235
+ for (var i1 = 0; i1 < visibleNodes.length; i1++) io.unobserve(visibleNodes[i1]);
236
+ var _iteratorNormalCompletion2 = true,
237
+ _didIteratorError2 = false,
238
+ _iteratorError2 = void 0;
239
+ try {
240
+ for (var _iterator2 = parentsToObserve[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
241
+ var parent1 = _step2.value;
242
+ io.unobserve(parent1);
243
+ }
244
+ } catch (err) {
245
+ _didIteratorError2 = true;
246
+ _iteratorError2 = err;
247
+ } finally {
248
+ try {
249
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) _iterator2.return();
250
+ } finally {
251
+ if (_didIteratorError2) throw _iteratorError2;
252
+ }
253
+ }
254
+ if (lastCallbackDelay > 50) skipFrames = Math.min(skipFrames + 2, MAX_SKIP_FRAMES);else if (lastCallbackDelay < 20) skipFrames = Math.max(skipFrames - 1, BASE_SKIP_FRAMES);
255
+ for (var i2 = 0; i2 < visibleNodes.length; i2++) updateLayoutIfChanged(visibleNodes[i2]);
256
+ }
178
257
  }
179
- setTimeout(layoutOnAnimationFrame, 16.6667 * RUN_EVERY_X_FRAMES);
258
+ rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
180
259
  }
181
260
  layoutOnAnimationFrame();
182
261
  }
183
- var getElementLayoutEvent = function (nodeRect, parentRect) {
184
- return {
185
- nativeEvent: {
186
- layout: getRelativeDimensions(nodeRect, parentRect),
187
- target: nodeRect
188
- },
189
- timeStamp: Date.now()
190
- };
191
- },
192
- getRelativeDimensions = function (a, b) {
193
- var {
194
- height,
195
- left,
196
- top,
197
- width
198
- } = a,
199
- x = left - b.left,
200
- y = top - b.top;
201
- return {
202
- x,
203
- y,
204
- width,
205
- height,
206
- pageX: a.left,
207
- pageY: a.top
208
- };
262
+ var getElementLayoutEvent = function (nodeRect, parentRect, node) {
263
+ return {
264
+ nativeEvent: {
265
+ layout: getRelativeDimensions(nodeRect, parentRect, node),
266
+ target: nodeRect
267
+ },
268
+ timeStamp: Date.now()
269
+ };
270
+ };
271
+ var getPreTransformDimensions = function (node) {
272
+ return {
273
+ width: node.offsetWidth,
274
+ height: node.offsetHeight
275
+ };
276
+ };
277
+ var getRelativeDimensions = function (a, b, aNode) {
278
+ var {
279
+ left,
280
+ top
281
+ } = a;
282
+ var x = left - b.left;
283
+ var y = top - b.top;
284
+ var {
285
+ width,
286
+ height
287
+ } = usePretransformDimensions() && aNode ? getPreTransformDimensions(aNode) : {
288
+ width: a.width,
289
+ height: a.height
290
+ };
291
+ return {
292
+ x,
293
+ y,
294
+ width,
295
+ height,
296
+ pageX: a.left,
297
+ pageY: a.top
209
298
  };
299
+ };
300
+ function registerLayoutNode(node, onChange, disableKey) {
301
+ Nodes.add(node);
302
+ LayoutHandlers.set(node, onChange);
303
+ if (disableKey) LayoutDisableKey.set(node, disableKey);
304
+ startGlobalObservers();
305
+ if (globalIntersectionObserver) {
306
+ globalIntersectionObserver.observe(node);
307
+ IntersectionState.set(node, true);
308
+ }
309
+ return function () {
310
+ return cleanupNode(node);
311
+ };
312
+ }
313
+ function cleanupNode(node) {
314
+ Nodes.delete(node);
315
+ LayoutHandlers.delete(node);
316
+ LayoutDisableKey.delete(node);
317
+ NodeRectCache.delete(node);
318
+ IntersectionState.delete(node);
319
+ if (globalIntersectionObserver) globalIntersectionObserver.unobserve(node);
320
+ }
321
+ var PrevHostNode = /* @__PURE__ */new WeakMap();
210
322
  function useElementLayout(ref, onLayout) {
211
- var _ref_current,
212
- disableKey = (0, import_react.useContext)(DisableLayoutContextKey),
213
- node = ensureWebElement((_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host);
214
- node && onLayout && (LayoutHandlers.set(node, onLayout), LayoutDisableKey.set(node, disableKey)), (0, import_constants.useIsomorphicLayoutEffect)(function () {
323
+ var _ref_current;
324
+ var disableKey = (0, import_react.useContext)(DisableLayoutContextKey);
325
+ var node = ensureWebElement((_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host);
326
+ if (node && onLayout) {
327
+ LayoutHandlers.set(node, onLayout);
328
+ LayoutDisableKey.set(node, disableKey);
329
+ }
330
+ (0, import_constants.useIsomorphicLayoutEffect)(function () {
215
331
  var _ref_current2;
216
- if (onLayout) {
217
- var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
218
- if (node2) {
219
- Nodes.add(node2), startGlobalObservers(), globalIntersectionObserver && (globalIntersectionObserver.observe(node2), IntersectionState.set(node2, !0));
220
- var parentNode = node2.parentNode;
221
- return parentNode && onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect())), function () {
222
- Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2), LastChangeTime.delete(node2), IntersectionState.delete(node2), globalIntersectionObserver && globalIntersectionObserver.unobserve(node2);
223
- };
224
- }
332
+ if (!onLayout) return;
333
+ var nextNode = ensureWebElement((_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host);
334
+ var prevNode = PrevHostNode.get(ref);
335
+ if (nextNode === prevNode) return;
336
+ if (prevNode) cleanupNode(prevNode);
337
+ PrevHostNode.set(ref, nextNode);
338
+ if (!nextNode) return;
339
+ Nodes.add(nextNode);
340
+ startGlobalObservers();
341
+ if (globalIntersectionObserver) {
342
+ globalIntersectionObserver.observe(nextNode);
343
+ IntersectionState.set(nextNode, true);
225
344
  }
345
+ var handler = LayoutHandlers.get(nextNode);
346
+ if (typeof handler !== "function") return;
347
+ var parentNode = nextNode.parentElement;
348
+ if (!parentNode) return;
349
+ var nodeRect = nextNode.getBoundingClientRect();
350
+ var parentRect = parentNode.getBoundingClientRect();
351
+ NodeRectCache.set(nextNode, nodeRect);
352
+ NodeRectCache.set(parentNode, parentRect);
353
+ handler(getElementLayoutEvent(nodeRect, parentRect, nextNode));
354
+ });
355
+ (0, import_constants.useIsomorphicLayoutEffect)(function () {
356
+ var _ref_current2;
357
+ if (!onLayout) return;
358
+ var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
359
+ if (!node2) return;
360
+ Nodes.add(node2);
361
+ startGlobalObservers();
362
+ if (globalIntersectionObserver) {
363
+ globalIntersectionObserver.observe(node2);
364
+ IntersectionState.set(node2, true);
365
+ }
366
+ if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] register", {
367
+ tag: node2.tagName,
368
+ id: node2.id || void 0,
369
+ className: (node2.className || "").slice(0, 60) || void 0,
370
+ totalNodes: Nodes.size
371
+ });
372
+ var parentNode = node2.parentNode;
373
+ if (parentNode) onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect(), node2));
374
+ return function () {
375
+ cleanupNode(node2);
376
+ var swappedNode = PrevHostNode.get(ref);
377
+ if (swappedNode && swappedNode !== node2) cleanupNode(swappedNode);
378
+ PrevHostNode.delete(ref);
379
+ };
226
380
  }, [ref, !!onLayout]);
227
381
  }
228
382
  function ensureWebElement(x) {
229
- if (!(typeof HTMLElement > "u")) return _instanceof(x, HTMLElement) ? x : void 0;
383
+ if (typeof HTMLElement === "undefined") return;
384
+ return _instanceof(x, HTMLElement) ? x : void 0;
230
385
  }
231
386
  var getBoundingClientRectAsync = function (node) {
232
- return new Promise(function (res) {
233
- if (!node || node.nodeType !== 1) return res(!1);
234
- var io = new IntersectionObserver(function (entries) {
235
- return io.disconnect(), res(entries[0].boundingClientRect);
236
- }, {
237
- threshold: 0
238
- });
239
- io.observe(node);
387
+ return new Promise(function (res) {
388
+ if (!node || node.nodeType !== 1) return res(false);
389
+ var io = new IntersectionObserver(function (entries) {
390
+ io.disconnect();
391
+ return res(entries[0].boundingClientRect);
392
+ }, {
393
+ threshold: 0
240
394
  });
241
- },
242
- measureNode = async function (node, relativeTo) {
243
- var relativeNode = relativeTo || node?.parentElement;
244
- if (_instanceof(relativeNode, HTMLElement)) {
245
- var [nodeDim, relativeNodeDim] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(relativeNode)]);
246
- if (relativeNodeDim && nodeDim) return getRelativeDimensions(nodeDim, relativeNodeDim);
247
- }
248
- return null;
249
- },
250
- measure = async function (node, callback) {
251
- var out = await measureNode(node, _instanceof(node.parentNode, HTMLElement) ? node.parentNode : null);
252
- return out && callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY), out;
253
- };
395
+ io.observe(node);
396
+ });
397
+ };
398
+ var measureNode = async function (node, relativeTo) {
399
+ var relativeNode = relativeTo || (node === null || node === void 0 ? void 0 : node.parentElement);
400
+ if (_instanceof(relativeNode, HTMLElement)) {
401
+ var [nodeDim, relativeNodeDim] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(relativeNode)]);
402
+ if (relativeNodeDim && nodeDim) return getRelativeDimensions(nodeDim, relativeNodeDim, node);
403
+ }
404
+ return null;
405
+ };
406
+ var measure = async function (node, callback) {
407
+ var out = await measureNode(node, _instanceof(node.parentNode, HTMLElement) ? node.parentNode : null);
408
+ if (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
409
+ return out;
410
+ };
254
411
  function createMeasure(node) {
255
412
  return function (callback) {
256
413
  return measure(node, callback);
257
414
  };
258
415
  }
259
416
  var measureInWindow = async function (node, callback) {
260
- var out = await measureNode(node, null);
261
- return out && callback?.(out.pageX, out.pageY, out.width, out.height), out;
262
- },
263
- createMeasureInWindow = function (node) {
264
- return function (callback) {
265
- return measureInWindow(node, callback);
266
- };
267
- },
268
- measureLayout = async function (node, relativeNode, callback) {
269
- var out = await measureNode(node, relativeNode);
270
- return out && callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY), out;
417
+ var out = await measureNode(node, null);
418
+ if (out) callback === null || callback === void 0 || callback(out.pageX, out.pageY, out.width, out.height);
419
+ return out;
420
+ };
421
+ var createMeasureInWindow = function (node) {
422
+ return function (callback) {
423
+ return measureInWindow(node, callback);
271
424
  };
425
+ };
426
+ var measureLayout = async function (node, relativeNode, callback) {
427
+ var out = await measureNode(node, relativeNode);
428
+ if (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
429
+ return out;
430
+ };
272
431
  function createMeasureLayout(node) {
273
432
  return function (relativeTo, callback) {
274
433
  return measureLayout(node, relativeTo, callback);