@tamagui/core 1.126.17 → 1.127.0

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.
Files changed (33) hide show
  1. package/dist/cjs/helpers/getBoundingClientRect.cjs +16 -3
  2. package/dist/cjs/helpers/getBoundingClientRect.js +17 -2
  3. package/dist/cjs/helpers/getBoundingClientRect.js.map +1 -1
  4. package/dist/cjs/helpers/getBoundingClientRect.native.js +20 -2
  5. package/dist/cjs/helpers/getBoundingClientRect.native.js.map +2 -2
  6. package/dist/cjs/hooks/useElementLayout.cjs +90 -22
  7. package/dist/cjs/hooks/useElementLayout.js +72 -16
  8. package/dist/cjs/hooks/useElementLayout.js.map +1 -1
  9. package/dist/cjs/hooks/useElementLayout.native.js +82 -20
  10. package/dist/cjs/hooks/useElementLayout.native.js.map +2 -2
  11. package/dist/esm/helpers/getBoundingClientRect.js +17 -2
  12. package/dist/esm/helpers/getBoundingClientRect.js.map +1 -1
  13. package/dist/esm/helpers/getBoundingClientRect.mjs +15 -3
  14. package/dist/esm/helpers/getBoundingClientRect.mjs.map +1 -1
  15. package/dist/esm/helpers/getBoundingClientRect.native.js +22 -4
  16. package/dist/esm/helpers/getBoundingClientRect.native.js.map +1 -1
  17. package/dist/esm/hooks/useElementLayout.js +72 -16
  18. package/dist/esm/hooks/useElementLayout.js.map +1 -1
  19. package/dist/esm/hooks/useElementLayout.mjs +89 -23
  20. package/dist/esm/hooks/useElementLayout.mjs.map +1 -1
  21. package/dist/esm/hooks/useElementLayout.native.js +101 -36
  22. package/dist/esm/hooks/useElementLayout.native.js.map +1 -1
  23. package/dist/native.js +77 -21
  24. package/dist/native.js.map +2 -2
  25. package/dist/test.native.js +77 -21
  26. package/dist/test.native.js.map +2 -2
  27. package/package.json +7 -7
  28. package/src/helpers/getBoundingClientRect.tsx +26 -0
  29. package/src/hooks/useElementLayout.tsx +107 -8
  30. package/types/helpers/getBoundingClientRect.d.ts +1 -0
  31. package/types/helpers/getBoundingClientRect.d.ts.map +1 -1
  32. package/types/hooks/useElementLayout.d.ts +4 -2
  33. package/types/hooks/useElementLayout.d.ts.map +1 -1
package/dist/native.js CHANGED
@@ -12351,42 +12351,66 @@ var getRect = function(node) {
12351
12351
  };
12352
12352
 
12353
12353
  // src/hooks/useElementLayout.tsx
12354
- var import_constants = __toESM(require_index_native2()), import_web = __toESM(require_index_native8()), LayoutHandlers = /* @__PURE__ */ new WeakMap(), Nodes = /* @__PURE__ */ new Set(), status = "active";
12354
+ var import_constants = __toESM(require_index_native2()), import_web = __toESM(require_index_native8()), LayoutHandlers = /* @__PURE__ */ new WeakMap(), Nodes = /* @__PURE__ */ new Set(), strategy = "async";
12355
12355
  function setOnLayoutStrategy(state) {
12356
- status = state;
12356
+ strategy = state;
12357
12357
  }
12358
- var NodeRectCache = /* @__PURE__ */ new WeakMap(), ParentRectCache = /* @__PURE__ */ new WeakMap(), rAF = typeof window < "u" ? window.requestAnimationFrame : void 0;
12358
+ var NodeRectCache = /* @__PURE__ */ new WeakMap(), ParentRectCache = /* @__PURE__ */ new WeakMap(), DebounceTimers = /* @__PURE__ */ new WeakMap(), LastChangeTime = /* @__PURE__ */ new WeakMap(), rAF = typeof window < "u" ? window.requestAnimationFrame : void 0, DEBOUNCE_DELAY = 32;
12359
12359
  if (import_constants.isClient)
12360
12360
  if (rAF) {
12361
- let updateLayoutIfChanged = function(node) {
12362
- var nodeRect = node.getBoundingClientRect(), parentNode = node.parentElement, parentRect = parentNode == null ? void 0 : parentNode.getBoundingClientRect(), onLayout = LayoutHandlers.get(node);
12363
- if (typeof onLayout == "function") {
12364
- var cachedRect = NodeRectCache.get(node), cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
12365
- if (!cachedRect || // has changed one rect
12366
- !(0, import_web.isEqualShallow)(cachedRect, nodeRect) && (!cachedParentRect || !(0, import_web.isEqualShallow)(cachedParentRect, parentRect))) {
12367
- NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect);
12368
- var event = getElementLayoutEvent(node);
12369
- avoidUpdates ? queuedUpdates.set(node, function() {
12370
- return onLayout(event);
12371
- }) : onLayout(event);
12372
- }
12373
- }
12374
- }, layoutOnAnimationFrame = function() {
12361
+ let layoutOnAnimationFrame = function() {
12375
12362
  var now = Date.now(), timeSinceLastFrame = now - lastFrameAt;
12376
- if (lastFrameAt = now, status !== "inactive") {
12363
+ if (lastFrameAt = now, strategy !== "off") {
12377
12364
  var expectedFrameTime = 16.67, hasRecentSyncWork = timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause;
12378
12365
  hasRecentSyncWork || Nodes.forEach(updateLayoutIfChanged);
12379
12366
  }
12380
12367
  rAF(layoutOnAnimationFrame);
12381
12368
  };
12382
- updateLayoutIfChanged2 = updateLayoutIfChanged, layoutOnAnimationFrame2 = layoutOnAnimationFrame, avoidUpdates = !0, queuedUpdates = /* @__PURE__ */ new Map(), lastFrameAt = Date.now(), numDroppedFramesUntilPause = 2, (0, import_web.___onDidFinishClientRender)(function() {
12369
+ layoutOnAnimationFrame2 = layoutOnAnimationFrame, avoidUpdates = !0, queuedUpdates = /* @__PURE__ */ new Map(), lastFrameAt = Date.now(), numDroppedFramesUntilPause = 2, (0, import_web.___onDidFinishClientRender)(function() {
12383
12370
  avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(function(cb) {
12384
12371
  return cb();
12385
12372
  }), queuedUpdates.clear());
12386
- }), rAF(layoutOnAnimationFrame);
12373
+ });
12374
+ async function updateLayoutIfChanged(node) {
12375
+ var nodeRect = node.getBoundingClientRect(), parentNode = node.parentElement, parentRect = parentNode == null ? void 0 : parentNode.getBoundingClientRect(), onLayout = LayoutHandlers.get(node);
12376
+ if (typeof onLayout == "function") {
12377
+ var cachedRect = NodeRectCache.get(node), cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
12378
+ if (!cachedRect || // has changed one rect
12379
+ !(0, import_web.isEqualShallow)(cachedRect, nodeRect) && (!cachedParentRect || !(0, import_web.isEqualShallow)(cachedParentRect, parentRect)))
12380
+ if (NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect), avoidUpdates) {
12381
+ var event = getElementLayoutEvent(node);
12382
+ queuedUpdates.set(node, function() {
12383
+ return onLayout(event);
12384
+ });
12385
+ } else if (strategy === "async") {
12386
+ var now = Date.now();
12387
+ LastChangeTime.set(node, now);
12388
+ var existingTimer = DebounceTimers.get(node);
12389
+ existingTimer && clearTimeout(existingTimer);
12390
+ var timer = setTimeout(async function() {
12391
+ var lastChange = LastChangeTime.get(node) || 0, timeSinceChange = Date.now() - lastChange;
12392
+ if (timeSinceChange >= DEBOUNCE_DELAY) {
12393
+ var event2 = await getElementLayoutEventAsync(node);
12394
+ onLayout(event2), DebounceTimers.delete(node);
12395
+ } else {
12396
+ var remainingDelay = DEBOUNCE_DELAY - timeSinceChange, newTimer = setTimeout(async function() {
12397
+ var event3 = await getElementLayoutEventAsync(node);
12398
+ onLayout(event3), DebounceTimers.delete(node);
12399
+ }, remainingDelay);
12400
+ DebounceTimers.set(node, newTimer);
12401
+ }
12402
+ }, DEBOUNCE_DELAY);
12403
+ DebounceTimers.set(node, timer);
12404
+ } else {
12405
+ var event1 = getElementLayoutEvent(node);
12406
+ onLayout(event1);
12407
+ }
12408
+ }
12409
+ }
12410
+ rAF(layoutOnAnimationFrame);
12387
12411
  } else
12388
12412
  process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
12389
- var avoidUpdates, queuedUpdates, lastFrameAt, numDroppedFramesUntilPause, updateLayoutIfChanged2, layoutOnAnimationFrame2, getElementLayoutEvent = function(target) {
12413
+ var avoidUpdates, queuedUpdates, lastFrameAt, numDroppedFramesUntilPause, layoutOnAnimationFrame2, getElementLayoutEvent = function(target) {
12390
12414
  var res = null;
12391
12415
  if (measureLayout(target, null, function(x, y, width, height, left, top) {
12392
12416
  res = {
@@ -12415,6 +12439,38 @@ var avoidUpdates, queuedUpdates, lastFrameAt, numDroppedFramesUntilPause, update
12415
12439
  callback(x, y, width, height, left, top);
12416
12440
  }
12417
12441
  }
12442
+ }, getElementLayoutEventAsync = async function(target) {
12443
+ var res = null;
12444
+ if (await measureLayoutAsync(target, null, function(x, y, width, height, left, top) {
12445
+ res = {
12446
+ nativeEvent: {
12447
+ layout: {
12448
+ x,
12449
+ y,
12450
+ width,
12451
+ height,
12452
+ left,
12453
+ top
12454
+ },
12455
+ target
12456
+ },
12457
+ timeStamp: Date.now()
12458
+ };
12459
+ }), !res)
12460
+ throw new Error("\u203C\uFE0F");
12461
+ return res;
12462
+ }, measureLayoutAsync = async function(node, relativeTo, callback) {
12463
+ var relativeNode = relativeTo || (node == null ? void 0 : node.parentElement);
12464
+ if (relativeNode instanceof HTMLElement) {
12465
+ var [nodeDim, relativeNodeDim] = await Promise.all([
12466
+ node.getBoundingClientRect(),
12467
+ relativeNode.getBoundingClientRect()
12468
+ ]);
12469
+ if (relativeNodeDim && nodeDim) {
12470
+ var { x, y, width, height, left, top } = getRelativeDimensions(nodeDim, relativeNodeDim);
12471
+ callback(x, y, width, height, left, top);
12472
+ }
12473
+ }
12418
12474
  }, getRelativeDimensions = function(a, b) {
12419
12475
  var { height, left, top, width } = a, x = left - b.left, y = top - b.top;
12420
12476
  return {