@tamagui/use-element-layout 3.0.0-beta.807.1 → 3.0.0-beta.881.1

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.
@@ -32,7 +32,6 @@ __export(index_exports, {
32
32
  measureLayout: () => measureLayout,
33
33
  measureNode: () => measureNode,
34
34
  registerLayoutNode: () => registerLayoutNode,
35
- setOnLayoutStrategy: () => setOnLayoutStrategy,
36
35
  useElementLayout: () => useElementLayout
37
36
  });
38
37
  module.exports = __toCommonJS(index_exports);
@@ -42,12 +41,10 @@ var import_jsx_runtime = require("react/jsx-runtime");
42
41
  const LayoutHandlers = /* @__PURE__ */ new WeakMap();
43
42
  const LayoutDisableKey = /* @__PURE__ */ new WeakMap();
44
43
  const Nodes = /* @__PURE__ */ new Set();
44
+ const NodeRectCache = /* @__PURE__ */ new WeakMap();
45
+ const PrevHostNode = /* @__PURE__ */ new WeakMap();
45
46
  const usePretransformDimensions = () => globalThis.__TAMAGUI_ONLAYOUT_PRETRANSFORM === true || process.env.TAMAGUI_ONLAYOUT_PRETRANSFORM === "1";
46
- let _debugLayout;
47
- function isDebugLayout() {
48
- if (_debugLayout === void 0) _debugLayout = typeof window !== "undefined" && new URLSearchParams(window.location.search).has("__tamaDebugLayout");
49
- return _debugLayout;
50
- }
47
+ const isDebugLayout = () => typeof window !== "undefined" && window.location?.search?.includes("__tamaDebugLayout");
51
48
  const DisableLayoutContextValues = {};
52
49
  const DisableLayoutContextKey = (0, import_react.createContext)("");
53
50
  const ENABLE = typeof IntersectionObserver !== "undefined";
@@ -66,11 +63,6 @@ const LayoutMeasurementController = ({ disable, children }) => {
66
63
  let strategy = "async";
67
64
  let resumeLayoutLoop;
68
65
  let measureOnNextFrame;
69
- function setOnLayoutStrategy(state) {
70
- strategy = state;
71
- resumeLayoutLoop?.();
72
- }
73
- const NodeRectCache = /* @__PURE__ */ new WeakMap();
74
66
  let avoidUpdates = true;
75
67
  const queuedUpdates = /* @__PURE__ */ new Map();
76
68
  function enable() {
@@ -98,17 +90,7 @@ if (ENABLE) {
98
90
  }
99
91
  }, { threshold: 0 });
100
92
  return rectFetchObserver;
101
- }, scheduleLayoutFrame = function() {
102
- if (frameScheduled || strategy === "off" || Nodes.size === 0 || document.hidden) return;
103
- frameScheduled = true;
104
- rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
105
- };
106
- const BoundingRects = /* @__PURE__ */ new WeakMap();
107
- let rectFetchObserver = null;
108
- let rectFetchResolve = null;
109
- let rectFetchStartTime = 0;
110
- let lastCallbackDelay = 0;
111
- async function updateLayoutIfChanged(node) {
93
+ }, updateLayoutIfChanged = function(node) {
112
94
  if (typeof LayoutHandlers.get(node) !== "function") return;
113
95
  const parentNode = node.parentElement;
114
96
  if (!parentNode) return;
@@ -123,7 +105,16 @@ if (ENABLE) {
123
105
  parentRect = parentNode.getBoundingClientRect();
124
106
  }
125
107
  emitLayoutIfChanged(node, parentNode, nodeRect, parentRect);
126
- }
108
+ }, scheduleLayoutFrame = function() {
109
+ if (frameScheduled || strategy === "off" || Nodes.size === 0 || document.hidden) return;
110
+ frameScheduled = true;
111
+ rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
112
+ };
113
+ const BoundingRects = /* @__PURE__ */ new WeakMap();
114
+ let rectFetchObserver = null;
115
+ let rectFetchResolve = null;
116
+ let rectFetchStartTime = 0;
117
+ let lastCallbackDelay = 0;
127
118
  const rAF = typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : void 0;
128
119
  const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP;
129
120
  const BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10;
@@ -178,32 +169,27 @@ if (ENABLE) {
178
169
  document.addEventListener("visibilitychange", scheduleLayoutFrame);
179
170
  scheduleLayoutFrame();
180
171
  }
181
- const getElementLayoutEvent = (nodeRect, parentRect, node) => {
182
- return {
183
- nativeEvent: {
184
- layout: getRelativeDimensions(nodeRect, parentRect, node),
185
- target: nodeRect
186
- },
187
- timeStamp: Date.now()
188
- };
189
- };
190
- const getPreTransformDimensions = (node) => {
191
- return {
192
- width: node.offsetWidth,
193
- height: node.offsetHeight
194
- };
195
- };
172
+ const getElementLayoutEvent = (nodeRect, parentRect, node) => ({
173
+ nativeEvent: {
174
+ layout: getRelativeDimensions(nodeRect, parentRect, node),
175
+ target: nodeRect
176
+ },
177
+ timeStamp: Date.now()
178
+ });
179
+ const getPreTransformDimensions = (node) => ({
180
+ width: node.offsetWidth,
181
+ height: node.offsetHeight
182
+ });
196
183
  const getRelativeDimensions = (a, b, aNode) => {
197
- const { left, top } = a;
198
- const x = left - b.left;
199
- const y = top - b.top;
184
+ const left = a.left - b.left;
185
+ const top = a.top - b.top;
200
186
  const { width, height } = usePretransformDimensions() && aNode ? getPreTransformDimensions(aNode) : {
201
187
  width: a.width,
202
188
  height: a.height
203
189
  };
204
190
  return {
205
- x,
206
- y,
191
+ x: left,
192
+ y: top,
207
193
  width,
208
194
  height,
209
195
  pageX: a.left,
@@ -221,13 +207,6 @@ function emitLayoutIfChanged(node, parentNode, nodeRect, parentRect) {
221
207
  NodeRectCache.set(node, nodeRect);
222
208
  NodeRectCache.set(parentNode, parentRect);
223
209
  const event = getElementLayoutEvent(nodeRect, parentRect, node);
224
- if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] change", {
225
- tag: node.tagName,
226
- id: node.id || void 0,
227
- className: (node.className || "").slice(0, 60) || void 0,
228
- layout: event.nativeEvent.layout,
229
- first: !cachedRect
230
- });
231
210
  if (avoidUpdates) queuedUpdates.set(node, () => onLayout(event));
232
211
  else onLayout(event);
233
212
  }
@@ -248,7 +227,6 @@ function cleanupNode(node) {
248
227
  LayoutDisableKey.delete(node);
249
228
  NodeRectCache.delete(node);
250
229
  }
251
- const PrevHostNode = /* @__PURE__ */ new WeakMap();
252
230
  function emitLayoutSync(node) {
253
231
  const onLayout = LayoutHandlers.get(node);
254
232
  if (typeof onLayout !== "function") return;
@@ -271,48 +249,36 @@ function useElementLayout(ref, onLayout) {
271
249
  if (!onLayout) return;
272
250
  const nextNode = ensureWebElement(ref.current?.host);
273
251
  const prevNode = PrevHostNode.get(ref);
274
- if (nextNode === prevNode) return;
275
- if (prevNode) cleanupNode(prevNode);
276
- PrevHostNode.set(ref, nextNode);
277
- if (!nextNode) return;
278
- LayoutHandlers.set(nextNode, onLayout);
279
- observeLayoutNode(nextNode, disableKey);
280
- emitLayoutSync(nextNode);
281
- });
282
- (0, import_constants.useIsomorphicLayoutEffect)(() => {
283
- if (!onLayout) return;
284
- const node2 = ref.current?.host;
285
- if (!node2) return;
286
- LayoutHandlers.set(node2, onLayout);
287
- observeLayoutNode(node2, disableKey);
288
- if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] register", {
289
- tag: node2.tagName,
290
- id: node2.id || void 0,
291
- className: (node2.className || "").slice(0, 60) || void 0,
292
- totalNodes: Nodes.size
293
- });
252
+ if (nextNode !== prevNode) {
253
+ if (prevNode) cleanupNode(prevNode);
254
+ PrevHostNode.set(ref, nextNode);
255
+ if (nextNode) {
256
+ LayoutHandlers.set(nextNode, onLayout);
257
+ observeLayoutNode(nextNode, disableKey);
258
+ emitLayoutSync(nextNode);
259
+ }
260
+ }
294
261
  return () => {
295
- cleanupNode(node2);
296
- const swappedNode = PrevHostNode.get(ref);
297
- if (swappedNode && swappedNode !== node2) cleanupNode(swappedNode);
262
+ const activeNode = ensureWebElement(ref.current?.host);
263
+ if (activeNode) cleanupNode(activeNode);
264
+ const swapped = PrevHostNode.get(ref);
265
+ if (swapped && swapped !== activeNode) cleanupNode(swapped);
298
266
  PrevHostNode.delete(ref);
299
267
  };
300
268
  }, [ref, !!onLayout]);
301
269
  }
302
270
  function ensureWebElement(x) {
303
- if (typeof HTMLElement === "undefined") return;
271
+ if (typeof HTMLElement === "undefined") return void 0;
304
272
  return x instanceof HTMLElement ? x : void 0;
305
273
  }
306
- const getBoundingClientRectAsync = (node) => {
307
- return new Promise((res) => {
308
- if (!node || node.nodeType !== 1) return res(false);
309
- const io = new IntersectionObserver((entries) => {
310
- io.disconnect();
311
- return res(entries[0].boundingClientRect);
312
- }, { threshold: 0 });
313
- io.observe(node);
274
+ const getBoundingClientRectAsync = (node) => new Promise((res) => {
275
+ if (!node || node.nodeType !== 1) return res(false);
276
+ const io = new IntersectionObserver((entries) => {
277
+ io.disconnect();
278
+ res(entries[0].boundingClientRect);
314
279
  });
315
- };
280
+ io.observe(node);
281
+ });
316
282
  const measureNode = async (node, relativeTo) => {
317
283
  const relativeNode = relativeTo || node?.parentElement;
318
284
  if (relativeNode instanceof HTMLElement) {
@@ -322,26 +288,20 @@ const measureNode = async (node, relativeTo) => {
322
288
  return null;
323
289
  };
324
290
  const measure = async (node, callback) => {
325
- const out = await measureNode(node, node.parentNode instanceof HTMLElement ? node.parentNode : null);
291
+ const out = await measureNode(node, node.parentElement);
326
292
  if (out) callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
327
293
  return out;
328
294
  };
329
- function createMeasure(node) {
330
- return (callback) => measure(node, callback);
331
- }
295
+ const createMeasure = (node) => (callback) => measure(node, callback);
332
296
  const measureInWindow = async (node, callback) => {
333
297
  const out = await measureNode(node, null);
334
298
  if (out) callback?.(out.pageX, out.pageY, out.width, out.height);
335
299
  return out;
336
300
  };
337
- const createMeasureInWindow = (node) => {
338
- return (callback) => measureInWindow(node, callback);
339
- };
301
+ const createMeasureInWindow = (node) => (callback) => measureInWindow(node, callback);
340
302
  const measureLayout = async (node, relativeNode, callback) => {
341
303
  const out = await measureNode(node, relativeNode);
342
304
  if (out) callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
343
305
  return out;
344
306
  };
345
- function createMeasureLayout(node) {
346
- return (relativeTo, callback) => measureLayout(node, relativeTo, callback);
347
- }
307
+ const createMeasureLayout = (node) => (relativeTo, callback) => measureLayout(node, relativeTo, callback);
@@ -34,7 +34,6 @@ __export(index_exports, {
34
34
  measureLayout: () => measureLayout,
35
35
  measureNode: () => measureNode,
36
36
  registerLayoutNode: () => registerLayoutNode,
37
- setOnLayoutStrategy: () => setOnLayoutStrategy,
38
37
  useElementLayout: () => useElementLayout
39
38
  });
40
39
  module.exports = __toCommonJS(index_exports);
@@ -48,14 +47,15 @@ function _instanceof(left, right) {
48
47
  var LayoutHandlers = /* @__PURE__ */ new WeakMap();
49
48
  var LayoutDisableKey = /* @__PURE__ */ new WeakMap();
50
49
  var Nodes = /* @__PURE__ */ new Set();
50
+ var NodeRectCache = /* @__PURE__ */ new WeakMap();
51
+ var PrevHostNode = /* @__PURE__ */ new WeakMap();
51
52
  var usePretransformDimensions = function() {
52
53
  return globalThis.__TAMAGUI_ONLAYOUT_PRETRANSFORM === true || process.env.TAMAGUI_ONLAYOUT_PRETRANSFORM === "1";
53
54
  };
54
- var _debugLayout;
55
- function isDebugLayout() {
56
- if (_debugLayout === void 0) _debugLayout = typeof window !== "undefined" && new URLSearchParams(window.location.search).has("__tamaDebugLayout");
57
- return _debugLayout;
58
- }
55
+ var isDebugLayout = function() {
56
+ var _window_location_search, _window_location;
57
+ return typeof window !== "undefined" && ((_window_location = window.location) === null || _window_location === void 0 ? void 0 : (_window_location_search = _window_location.search) === null || _window_location_search === void 0 ? void 0 : _window_location_search.includes("__tamaDebugLayout"));
58
+ };
59
59
  var DisableLayoutContextValues = {};
60
60
  var DisableLayoutContextKey = /* @__PURE__ */ (0, import_react.createContext)("");
61
61
  var ENABLE = false;
@@ -75,11 +75,6 @@ var LayoutMeasurementController = function(param) {
75
75
  var strategy = "async";
76
76
  var resumeLayoutLoop;
77
77
  var measureOnNextFrame;
78
- function setOnLayoutStrategy(state) {
79
- strategy = state;
80
- resumeLayoutLoop === null || resumeLayoutLoop === void 0 || resumeLayoutLoop();
81
- }
82
- var NodeRectCache = /* @__PURE__ */ new WeakMap();
83
78
  var avoidUpdates = true;
84
79
  var queuedUpdates = /* @__PURE__ */ new Map();
85
80
  function enable() {
@@ -109,17 +104,7 @@ if (ENABLE) {
109
104
  }
110
105
  }, { threshold: 0 });
111
106
  return rectFetchObserver;
112
- }, scheduleLayoutFrame2 = function() {
113
- if (frameScheduled || strategy === "off" || Nodes.size === 0 || document.hidden) return;
114
- frameScheduled = true;
115
- rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
116
- };
117
- var BoundingRects = /* @__PURE__ */ new WeakMap();
118
- var rectFetchObserver = null;
119
- var rectFetchResolve = null;
120
- var rectFetchStartTime = 0;
121
- var lastCallbackDelay = 0;
122
- async function updateLayoutIfChanged(node) {
107
+ }, updateLayoutIfChanged2 = function(node) {
123
108
  if (typeof LayoutHandlers.get(node) !== "function") return;
124
109
  var parentNode = node.parentElement;
125
110
  if (!parentNode) return;
@@ -134,7 +119,16 @@ if (ENABLE) {
134
119
  parentRect = parentNode.getBoundingClientRect();
135
120
  }
136
121
  emitLayoutIfChanged(node, parentNode, nodeRect, parentRect);
137
- }
122
+ }, scheduleLayoutFrame2 = function() {
123
+ if (frameScheduled || strategy === "off" || Nodes.size === 0 || document.hidden) return;
124
+ frameScheduled = true;
125
+ rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
126
+ };
127
+ var BoundingRects = /* @__PURE__ */ new WeakMap();
128
+ var rectFetchObserver = null;
129
+ var rectFetchResolve = null;
130
+ var rectFetchStartTime = 0;
131
+ var lastCallbackDelay = 0;
138
132
  var rAF = typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : void 0;
139
133
  var userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP;
140
134
  var BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10;
@@ -218,7 +212,7 @@ if (ENABLE) {
218
212
  }
219
213
  if (lastCallbackDelay > 50) skipFrames = Math.min(skipFrames + 2, MAX_SKIP_FRAMES);
220
214
  else if (lastCallbackDelay < 20) skipFrames = Math.max(skipFrames - 1, BASE_SKIP_FRAMES);
221
- for (var i2 = 0; i2 < activeNodes.length; i2++) updateLayoutIfChanged(activeNodes[i2]);
215
+ for (var i2 = 0; i2 < activeNodes.length; i2++) updateLayoutIfChanged2(activeNodes[i2]);
222
216
  }
223
217
  }
224
218
  frameScheduled = false;
@@ -248,16 +242,15 @@ var getPreTransformDimensions = function(node) {
248
242
  };
249
243
  };
250
244
  var getRelativeDimensions = function(a, b, aNode) {
251
- var { left, top } = a;
252
- var x = left - b.left;
253
- var y = top - b.top;
245
+ var left = a.left - b.left;
246
+ var top = a.top - b.top;
254
247
  var { width, height } = usePretransformDimensions() && aNode ? getPreTransformDimensions(aNode) : {
255
248
  width: a.width,
256
249
  height: a.height
257
250
  };
258
251
  return {
259
- x,
260
- y,
252
+ x: left,
253
+ y: top,
261
254
  width,
262
255
  height,
263
256
  pageX: a.left,
@@ -275,13 +268,6 @@ function emitLayoutIfChanged(node, parentNode, nodeRect, parentRect) {
275
268
  NodeRectCache.set(node, nodeRect);
276
269
  NodeRectCache.set(parentNode, parentRect);
277
270
  var event = getElementLayoutEvent(nodeRect, parentRect, node);
278
- if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] change", {
279
- tag: node.tagName,
280
- id: node.id || void 0,
281
- className: (node.className || "").slice(0, 60) || void 0,
282
- layout: event.nativeEvent.layout,
283
- first: !cachedRect
284
- });
285
271
  if (avoidUpdates) queuedUpdates.set(node, function() {
286
272
  return onLayout(event);
287
273
  });
@@ -306,7 +292,6 @@ function cleanupNode(node) {
306
292
  LayoutDisableKey.delete(node);
307
293
  NodeRectCache.delete(node);
308
294
  }
309
- var PrevHostNode = /* @__PURE__ */ new WeakMap();
310
295
  function emitLayoutSync(node) {
311
296
  var onLayout = LayoutHandlers.get(node);
312
297
  if (typeof onLayout !== "function") return;
@@ -331,37 +316,27 @@ function useElementLayout(ref, onLayout) {
331
316
  if (!onLayout) return;
332
317
  var nextNode = ensureWebElement((_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host);
333
318
  var prevNode = PrevHostNode.get(ref);
334
- if (nextNode === prevNode) return;
335
- if (prevNode) cleanupNode(prevNode);
336
- PrevHostNode.set(ref, nextNode);
337
- if (!nextNode) return;
338
- LayoutHandlers.set(nextNode, onLayout);
339
- observeLayoutNode(nextNode, disableKey);
340
- emitLayoutSync(nextNode);
341
- });
342
- (0, import_constants.useIsomorphicLayoutEffect)(function() {
343
- var _ref_current2;
344
- if (!onLayout) return;
345
- var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
346
- if (!node2) return;
347
- LayoutHandlers.set(node2, onLayout);
348
- observeLayoutNode(node2, disableKey);
349
- if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] register", {
350
- tag: node2.tagName,
351
- id: node2.id || void 0,
352
- className: (node2.className || "").slice(0, 60) || void 0,
353
- totalNodes: Nodes.size
354
- });
319
+ if (nextNode !== prevNode) {
320
+ if (prevNode) cleanupNode(prevNode);
321
+ PrevHostNode.set(ref, nextNode);
322
+ if (nextNode) {
323
+ LayoutHandlers.set(nextNode, onLayout);
324
+ observeLayoutNode(nextNode, disableKey);
325
+ emitLayoutSync(nextNode);
326
+ }
327
+ }
355
328
  return function() {
356
- cleanupNode(node2);
357
- var swappedNode = PrevHostNode.get(ref);
358
- if (swappedNode && swappedNode !== node2) cleanupNode(swappedNode);
329
+ var _ref_current3;
330
+ var activeNode = ensureWebElement((_ref_current3 = ref.current) === null || _ref_current3 === void 0 ? void 0 : _ref_current3.host);
331
+ if (activeNode) cleanupNode(activeNode);
332
+ var swapped = PrevHostNode.get(ref);
333
+ if (swapped && swapped !== activeNode) cleanupNode(swapped);
359
334
  PrevHostNode.delete(ref);
360
335
  };
361
336
  }, [ref, !!onLayout]);
362
337
  }
363
338
  function ensureWebElement(x) {
364
- if (typeof HTMLElement === "undefined") return;
339
+ if (typeof HTMLElement === "undefined") return void 0;
365
340
  return _instanceof(x, HTMLElement) ? x : void 0;
366
341
  }
367
342
  var getBoundingClientRectAsync = function(node) {
@@ -369,8 +344,8 @@ var getBoundingClientRectAsync = function(node) {
369
344
  if (!node || node.nodeType !== 1) return res(false);
370
345
  var io = new IntersectionObserver(function(entries) {
371
346
  io.disconnect();
372
- return res(entries[0].boundingClientRect);
373
- }, { threshold: 0 });
347
+ res(entries[0].boundingClientRect);
348
+ });
374
349
  io.observe(node);
375
350
  });
376
351
  };
@@ -383,15 +358,15 @@ var measureNode = async function(node, relativeTo) {
383
358
  return null;
384
359
  };
385
360
  var measure = async function(node, callback) {
386
- var out = await measureNode(node, _instanceof(node.parentNode, HTMLElement) ? node.parentNode : null);
361
+ var out = await measureNode(node, node.parentElement);
387
362
  if (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
388
363
  return out;
389
364
  };
390
- function createMeasure(node) {
365
+ var createMeasure = function(node) {
391
366
  return function(callback) {
392
367
  return measure(node, callback);
393
368
  };
394
- }
369
+ };
395
370
  var measureInWindow = async function(node, callback) {
396
371
  var out = await measureNode(node, null);
397
372
  if (out) callback === null || callback === void 0 || callback(out.pageX, out.pageY, out.width, out.height);
@@ -407,8 +382,8 @@ var measureLayout = async function(node, relativeNode, callback) {
407
382
  if (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
408
383
  return out;
409
384
  };
410
- function createMeasureLayout(node) {
385
+ var createMeasureLayout = function(node) {
411
386
  return function(relativeTo, callback) {
412
387
  return measureLayout(node, relativeTo, callback);
413
388
  };
414
- }
389
+ };