@tamagui/use-element-layout 1.129.9 → 1.129.11-1751323254461

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.
@@ -47,42 +47,45 @@ const queuedUpdates = /* @__PURE__ */new Map();
47
47
  function enable() {
48
48
  avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(cb => cb()), queuedUpdates.clear()));
49
49
  }
50
+ const expectedFrameTime = 16.67,
51
+ numDroppedFramesUntilPause = 10;
50
52
  if (import_constants.isClient) if (rAF) {
51
53
  let layoutOnAnimationFrame = function () {
52
54
  const now = Date.now(),
53
55
  timeSinceLastFrame = now - lastFrameAt;
54
- lastFrameAt = now, strategy !== "off" && (timeSinceLastFrame > 16.67 * numDroppedFramesUntilPause || Nodes.forEach(node => {
56
+ if (lastFrameAt = now, frameCount < runEveryXFrames) {
57
+ frameCount++, rAF(layoutOnAnimationFrame);
58
+ return;
59
+ }
60
+ frameCount = 0, strategy !== "off" && (timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause || Nodes.forEach(node => {
55
61
  updateLayoutIfChanged(node, lastFrameAt);
56
62
  })), rAF(layoutOnAnimationFrame);
57
63
  },
58
64
  lastFrameAt = Date.now();
59
- const numDroppedFramesUntilPause = 2;
60
65
  async function updateLayoutIfChanged(node, frameId) {
66
+ const onLayout = LayoutHandlers.get(node);
67
+ if (typeof onLayout != "function") return;
61
68
  const parentNode = node.parentElement;
69
+ if (!parentNode) return;
62
70
  let nodeRect, parentRect;
63
71
  if (strategy === "async") {
64
72
  const [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
65
73
  if (frameId !== lastFrameAt) return;
66
74
  nodeRect = nr, parentRect = pr;
67
- } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode?.getBoundingClientRect();
68
- if (!parentRect) return;
69
- const onLayout = LayoutHandlers.get(node);
70
- if (typeof onLayout != "function") return;
75
+ } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
71
76
  const cachedRect = NodeRectCache.get(node),
72
- cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
77
+ cachedParentRect = NodeRectCache.get(parentNode);
73
78
  if (!cachedRect ||
74
79
  // has changed one rect
75
80
  !(0, import_is_equal_shallow.isEqualShallow)(cachedRect, nodeRect) && (!cachedParentRect || !(0, import_is_equal_shallow.isEqualShallow)(cachedParentRect, parentRect))) {
76
- if (NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect), avoidUpdates) {
77
- const event = getElementLayoutEvent(nodeRect, parentRect);
78
- queuedUpdates.set(node, () => onLayout(event));
79
- } else if (strategy !== "async") {
80
- const event = getElementLayoutEvent(nodeRect, parentRect);
81
- onLayout(event);
82
- }
81
+ NodeRectCache.set(node, nodeRect), ParentRectCache.set(parentNode, parentRect);
82
+ const event = getElementLayoutEvent(nodeRect, parentRect);
83
+ avoidUpdates ? queuedUpdates.set(node, () => onLayout(event)) : onLayout(event);
83
84
  }
84
85
  }
85
86
  rAF(layoutOnAnimationFrame);
87
+ let frameCount = 0;
88
+ const runEveryXFrames = 6;
86
89
  } else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
87
90
  const getElementLayoutEvent = (nodeRect, parentRect) => ({
88
91
  nativeEvent: {
package/dist/cjs/index.js CHANGED
@@ -37,17 +37,24 @@ const queuedUpdates = /* @__PURE__ */ new Map();
37
37
  function enable() {
38
38
  avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach((cb) => cb()), queuedUpdates.clear()));
39
39
  }
40
+ const expectedFrameTime = 16.67, numDroppedFramesUntilPause = 10;
40
41
  if (import_constants.isClient)
41
42
  if (rAF) {
42
43
  let layoutOnAnimationFrame = function() {
43
44
  const now = Date.now(), timeSinceLastFrame = now - lastFrameAt;
44
- lastFrameAt = now, strategy !== "off" && (timeSinceLastFrame > 16.67 * numDroppedFramesUntilPause || Nodes.forEach((node) => {
45
+ if (lastFrameAt = now, frameCount < runEveryXFrames) {
46
+ frameCount++, rAF(layoutOnAnimationFrame);
47
+ return;
48
+ }
49
+ frameCount = 0, strategy !== "off" && (timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause || Nodes.forEach((node) => {
45
50
  updateLayoutIfChanged(node, lastFrameAt);
46
51
  })), rAF(layoutOnAnimationFrame);
47
52
  }, lastFrameAt = Date.now();
48
- const numDroppedFramesUntilPause = 2;
49
53
  async function updateLayoutIfChanged(node, frameId) {
54
+ const onLayout = LayoutHandlers.get(node);
55
+ if (typeof onLayout != "function") return;
50
56
  const parentNode = node.parentElement;
57
+ if (!parentNode) return;
51
58
  let nodeRect, parentRect;
52
59
  if (strategy === "async") {
53
60
  const [nr, pr] = await Promise.all([
@@ -58,24 +65,18 @@ if (import_constants.isClient)
58
65
  return;
59
66
  nodeRect = nr, parentRect = pr;
60
67
  } else
61
- nodeRect = node.getBoundingClientRect(), parentRect = parentNode?.getBoundingClientRect();
62
- if (!parentRect)
63
- return;
64
- const onLayout = LayoutHandlers.get(node);
65
- if (typeof onLayout != "function") return;
66
- const cachedRect = NodeRectCache.get(node), cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
68
+ nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
69
+ const cachedRect = NodeRectCache.get(node), cachedParentRect = NodeRectCache.get(parentNode);
67
70
  if (!cachedRect || // has changed one rect
68
71
  !(0, import_is_equal_shallow.isEqualShallow)(cachedRect, nodeRect) && (!cachedParentRect || !(0, import_is_equal_shallow.isEqualShallow)(cachedParentRect, parentRect))) {
69
- if (NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect), avoidUpdates) {
70
- const event = getElementLayoutEvent(nodeRect, parentRect);
71
- queuedUpdates.set(node, () => onLayout(event));
72
- } else if (strategy !== "async") {
73
- const event = getElementLayoutEvent(nodeRect, parentRect);
74
- onLayout(event);
75
- }
72
+ NodeRectCache.set(node, nodeRect), ParentRectCache.set(parentNode, parentRect);
73
+ const event = getElementLayoutEvent(nodeRect, parentRect);
74
+ avoidUpdates ? queuedUpdates.set(node, () => onLayout(event)) : onLayout(event);
76
75
  }
77
76
  }
78
77
  rAF(layoutOnAnimationFrame);
78
+ let frameCount = 0;
79
+ const runEveryXFrames = 6;
79
80
  } else
80
81
  process.env.NODE_ENV === "development" && console.warn(
81
82
  "No requestAnimationFrame - please polyfill for onLayout to work correctly"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["node"]
6
6
  }
@@ -36,51 +36,54 @@ function enable() {
36
36
  return cb();
37
37
  }), queuedUpdates.clear()));
38
38
  }
39
+ var expectedFrameTime = 16.67, numDroppedFramesUntilPause = 10;
39
40
  if (import_constants.isClient)
40
41
  if (rAF) {
41
42
  let layoutOnAnimationFrame = function() {
42
43
  var now = Date.now(), timeSinceLastFrame = now - lastFrameAt;
43
- if (lastFrameAt = now, strategy !== "off") {
44
- var expectedFrameTime = 16.67, hasRecentSyncWork = timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause;
44
+ if (lastFrameAt = now, frameCount < runEveryXFrames) {
45
+ frameCount++, rAF(layoutOnAnimationFrame);
46
+ return;
47
+ }
48
+ if (frameCount = 0, strategy !== "off") {
49
+ var hasRecentSyncWork = timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause;
45
50
  hasRecentSyncWork || Nodes.forEach(function(node) {
46
51
  updateLayoutIfChanged(node, lastFrameAt);
47
52
  });
48
53
  }
49
54
  rAF(layoutOnAnimationFrame);
50
55
  };
51
- var layoutOnAnimationFrame2 = layoutOnAnimationFrame, lastFrameAt = Date.now(), numDroppedFramesUntilPause = 2;
56
+ var layoutOnAnimationFrame2 = layoutOnAnimationFrame, lastFrameAt = Date.now();
52
57
  async function updateLayoutIfChanged(node, frameId) {
53
- var parentNode = node.parentElement, nodeRect, parentRect;
54
- if (strategy === "async") {
55
- var [nr, pr] = await Promise.all([
56
- getBoundingClientRectAsync(node),
57
- getBoundingClientRectAsync(parentNode)
58
- ]);
59
- if (frameId !== lastFrameAt)
60
- return;
61
- nodeRect = nr, parentRect = pr;
62
- } else
63
- nodeRect = node.getBoundingClientRect(), parentRect = parentNode == null ? void 0 : parentNode.getBoundingClientRect();
64
- if (parentRect) {
65
- var onLayout = LayoutHandlers.get(node);
66
- if (typeof onLayout == "function") {
67
- var cachedRect = NodeRectCache.get(node), cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
58
+ var onLayout = LayoutHandlers.get(node);
59
+ if (typeof onLayout == "function") {
60
+ var parentNode = node.parentElement;
61
+ if (parentNode) {
62
+ var nodeRect, parentRect;
63
+ if (strategy === "async") {
64
+ var [nr, pr] = await Promise.all([
65
+ getBoundingClientRectAsync(node),
66
+ getBoundingClientRectAsync(parentNode)
67
+ ]);
68
+ if (frameId !== lastFrameAt)
69
+ return;
70
+ nodeRect = nr, parentRect = pr;
71
+ } else
72
+ nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
73
+ var cachedRect = NodeRectCache.get(node), cachedParentRect = NodeRectCache.get(parentNode);
68
74
  if (!cachedRect || // has changed one rect
69
75
  !(0, import_is_equal_shallow.isEqualShallow)(cachedRect, nodeRect) && (!cachedParentRect || !(0, import_is_equal_shallow.isEqualShallow)(cachedParentRect, parentRect))) {
70
- if (NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect), avoidUpdates) {
71
- var event = getElementLayoutEvent(nodeRect, parentRect);
72
- queuedUpdates.set(node, function() {
73
- return onLayout(event);
74
- });
75
- } else if (strategy !== "async") {
76
- var event1 = getElementLayoutEvent(nodeRect, parentRect);
77
- onLayout(event1);
78
- }
76
+ NodeRectCache.set(node, nodeRect), ParentRectCache.set(parentNode, parentRect);
77
+ var event = getElementLayoutEvent(nodeRect, parentRect);
78
+ avoidUpdates ? queuedUpdates.set(node, function() {
79
+ return onLayout(event);
80
+ }) : onLayout(event);
79
81
  }
80
82
  }
81
83
  }
82
84
  }
83
85
  rAF(layoutOnAnimationFrame);
86
+ var frameCount = 0, runEveryXFrames = 6;
84
87
  } else
85
88
  process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
86
89
  var getElementLayoutEvent = function(nodeRect, parentRect) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;uBAAoD,+BACpD,0BAA+B,sCAGzBA,iBAAiB,oBAAIC,QAAAA,GACrBC,QAAQ,oBAAIC,IAAAA,GAQdC,WAAsC;AAEnC,SAASC,oBAAoBC,OAAgC;AAClEF,aAAWE;AACb;AAmBA,IAAMC,gBAAgB,oBAAIN,QAAAA,GACpBO,kBAAkB,oBAAIP,QAAAA;AAE5B,IAAMQ,iBAAiB,oBAAIC,QAAAA,GAErBC,MAAM,OAAOC,SAAW,MAAcA,OAAOC,wBAAwBC,QAGvEC,eAAe,IACbC,gBAAgB,oBAAIC,IAAAA;AAEnB,SAASC,SAAAA;AACd,EAAIH,iBACFA,eAAe,IACXC,kBACFA,cAAcG,QAAQ,SAACC,IAAAA;WAAOA,GAAAA;MAC9BJ,cAAcK,MAAK;AAGzB;AAEA,IAAIC;AACF,MAAIX,KAAK;AAkEP,QAASY,yBAAT,WAASA;AACP,UAAMC,MAAMC,KAAKD,IAAG,GACdE,qBAAqBF,MAAMG;AAGjC,UAFAA,cAAcH,KAEVI,aAAa,OAAO;AAGtB,YAAMC,oBAAoB,OACpBC,oBACJJ,qBAAqBG,oBAAoBE;AAE3C,QAAKD,qBACHE,MAAMb,QAAQ,SAACc,MAAAA;AACbC,gCAAsBD,MAAMN,WAAAA;QAC9B,CAAA;MAEJ;AAEAhB,UAAKY,sBAAAA;IACP;AApBSA,QAAAA,0BAAAA,wBAhELI,cAAcF,KAAKD,IAAG,GACpBO,6BAA6B;AAEnC,mBAAeG,sBAAsBD,MAAmBE,SAAe;AACrE,UAAMC,aAAaH,KAAKI,eAEpBC,UACAC;AAEJ,UAAIX,aAAa,SAAS;AACxB,YAAM,CAACY,IAAIC,EAAAA,IAAM,MAAMC,QAAQC,IAAI;UACjCC,2BAA2BX,IAAAA;UAC3BW,2BAA2BR,UAAAA;SAC5B;AAGD,YAAID,YAAYR;AACd;AAGFW,mBAAWE,IACXD,aAAaE;MACf;AACEH,mBAAWL,KAAKY,sBAAqB,GACrCN,aAAaH,cAAAA,OAAAA,SAAAA,WAAYS,sBAAqB;AAGhD,UAAKN,YAIL;YAAMO,WAAWC,eAAeC,IAAIf,IAAAA;AACpC,YAAI,OAAOa,YAAa,YAExB;cAAMG,aAAaC,cAAcF,IAAIf,IAAAA,GAC/BkB,mBAAmBf,aAAac,cAAcF,IAAIZ,UAAAA,IAAc;AAEtE,cACE,CAACa;UAEA,KAACG,wCAAeH,YAAYX,QAAAA,MAC1B,CAACa,oBAAoB,KAACC,wCAAeD,kBAAkBZ,UAAAA;AAO1D,gBALAW,cAAcG,IAAIpB,MAAMK,QAAAA,GACpBC,cAAcH,cAChBkB,gBAAgBD,IAAIjB,YAAYG,UAAAA,GAG9BxB,cAAc;AAEhB,kBAAMwC,QAAQC,sBAAsBlB,UAAUC,UAAAA;AAC9CvB,4BAAcqC,IAAIpB,MAAM,WAAA;uBAAMa,SAASS,KAAAA;;YACzC,WAAW3B,aAAa,SACjB;AAEL,kBAAM2B,SAAQC,sBAAsBlB,UAAUC,UAAAA;AAC9CO,uBAASS,MAAAA;YACX;;;;IAEJ;AAGA5C,QAAKY,sBAAAA;EAuBP;AACE,IAAIkC,QAAQC,IAAIC,aAAa,iBAC3BC,QAAQC,KACN,2EAA2E;AAM5E,IAAML,wBAAwB,SACnClB,UACAC,YAAAA;AAEA,SAAO;IACLuB,aAAa;MACXC,QAAQC,sBAAsB1B,UAAUC,UAAAA;MACxC0B,QAAQ3B;IACV;IACA4B,WAAWzC,KAAKD,IAAG;EACrB;AACF,GAEa2C,gBAAgB,SAC3BlC,MACAmC,YACAC,UAAAA;AASA,MAAMC,eAAeF,eAAcnC,QAAAA,OAAAA,SAAAA,KAAMI;AACzC,MAAIiC,wBAAwBC,aAAa;AACvC,QAAMC,UAAUvC,KAAKY,sBAAqB,GACpC4B,kBAAkBH,aAAazB,sBAAqB;AAE1D,QAAI4B,mBAAmBD,SAAS;AAC9B,UAAM,EAAEE,GAAGC,GAAGC,OAAOC,QAAQC,MAAMC,IAAG,IAAKf,sBACzCQ,SACAC,eAAAA;AAEFJ,eAASK,GAAGC,GAAGC,OAAOC,QAAQC,MAAMC,GAAAA;IACtC;EACF;AACF,GAEaC,6BAA6B,eACxCf,QAAAA;AAEA,MAAMF,SAAS,MAAMkB,mBAAmBhB,MAAAA;AACxC,MAAI,CAACF;AACH,UAAM,IAAImB,MAAM,cAAI;AAEtB,SAAO;IACLpB,aAAa;MACXC;MACAE;IACF;IACAC,WAAWzC,KAAKD,IAAG;EACrB;AACF,GAEayD,qBAAqB,eAChChD,MACAmC,YAAAA;AAEA,MAAME,eAAeF,eAAcnC,QAAAA,OAAAA,SAAAA,KAAMI;AACzC,MAAIiC,wBAAwBC,aAAa;AACvC,QAAM,CAACC,SAASC,eAAAA,IAAmB,MAAM/B,QAAQC,IAAI;MACnDC,2BAA2BX,IAAAA;MAC3BW,2BAA2B0B,YAAAA;KAC5B;AAED,QAAIG,mBAAmBD,SAAS;AAC9B,UAAM,EAAEE,GAAGC,GAAGC,OAAOC,QAAQC,MAAMC,IAAG,IAAKf,sBACzCQ,SACAC,eAAAA;AAEF,aAAO;QAAEC;QAAGC;QAAGC;QAAOC;QAAQC;QAAMC;MAAI;IAC1C;EACF;AACA,SAAO;AACT,GAEMf,wBAAwB,SAACmB,GAAoBC,GAAAA;AACjD,MAAM,EAAEP,QAAQC,MAAMC,KAAKH,MAAK,IAAKO,GAC/BT,IAAII,OAAOM,EAAEN,MACbH,IAAII,MAAMK,EAAEL;AAClB,SAAO;IAAEL;IAAGC;IAAGC;IAAOC;IAAQC;IAAMC;EAAI;AAC1C;AAEO,SAASM,iBACdC,KACAxC,UAA4C;MAGdwC,cAAxBrD,OAAOsD,kBAAiBD,eAAAA,IAAIE,aAAO,QAAXF,iBAAAA,SAAAA,SAAAA,aAAaG,IAAI;AAC/C,EAAIxD,QAAQa,YACVC,eAAeM,IAAIpB,MAAMa,QAAAA,OAG3B4C,4CAA0B,WAAA;QAEXJ;AADb,QAAKxC,UACL;UAAMb,SAAOqD,gBAAAA,IAAIE,aAAO,QAAXF,kBAAAA,SAAAA,SAAAA,cAAaG;AAC1B,UAAKxD,OAELc;uBAAeM,IAAIpB,OAAMa,QAAAA,GACzBd,MAAM2D,IAAI1D,KAAAA;AAGV,YAAMG,aAAaH,MAAKG;AACxB,eAAIA,cACFU,SACEU,sBACEvB,MAAKY,sBAAqB,GAC1BT,WAAWS,sBAAqB,CAAA,CAAA,GAK/B,WAAA;AACLb,gBAAM4D,OAAO3D,KAAAA,GACbc,eAAe6C,OAAO3D,KAAAA,GACtBiB,cAAc0C,OAAO3D,KAAAA,GACrBxB,eAAemF,OAAO3D,KAAAA;QACxB;;;EACF,GAAG;IAACqD;IAAK,CAAC,CAACxC;GAAS;AACtB;AAEA,SAASyC,iBAAoBb,GAAI;AAC/B,MAAI,SAAOH,cAAgB;AAG3B,WAAOG,aAAaH,cAAcG,IAAI5D;AACxC;AAEA,IAAM8B,6BAA6B,SACjCX,MAAAA;AAEA,SAAO,IAAIS,QAAyB,SAACmD,KAAAA;AACnC,QAAI,GAAC5D,QAAQA,KAAK6D,aAAa,IAC/B;UAAMC,KAAK,IAAIC,qBACb,SAACC,SAAAA;AACCF,kBAAGG,WAAU,GACNL,IAAII,QAAQ,CAAA,EAAGE,kBAAkB;MAC1C,GACA;QACEC,WAAW;MACb,CAAA;AAEFL,SAAGM,QAAQpE,IAAAA;;EACb,CAAA;AACF,GAEMY,wBAAwB,SAACZ,MAAAA;MAEtBA;AADP,MAAI,GAACA,QAAQA,KAAK6D,aAAa;AAC/B,YAAO7D,8BAAAA,KAAKY,2BAAqB,QAA1BZ,gCAAAA,SAAAA,SAAAA,4BAAAA,KAAAA,IAAAA;AACT,GAEaqE,UAAU,SAACrE,MAAAA;AACtB,MAAMsE,OAAO1D,sBAAsBZ,IAAAA;AACnC,MAAKsE,MACL;QAAM,EAAE7B,GAAGC,GAAGI,KAAKD,KAAI,IAAKyB;AAC5B,WAAO;MAAE7B;MAAGC;MAAGC,OAAO3C,KAAKuE;MAAa3B,QAAQ5C,KAAKwE;MAAc1B;MAAKD;IAAK;;AAC/E;",
5
- "names": ["LayoutHandlers", "WeakMap", "Nodes", "Set", "strategy", "setOnLayoutStrategy", "state", "NodeRectCache", "ParentRectCache", "LastChangeTime", "WeakMap", "rAF", "window", "requestAnimationFrame", "undefined", "avoidUpdates", "queuedUpdates", "Map", "enable", "forEach", "cb", "clear", "isClient", "layoutOnAnimationFrame", "now", "Date", "timeSinceLastFrame", "lastFrameAt", "strategy", "expectedFrameTime", "hasRecentSyncWork", "numDroppedFramesUntilPause", "Nodes", "node", "updateLayoutIfChanged", "frameId", "parentNode", "parentElement", "nodeRect", "parentRect", "nr", "pr", "Promise", "all", "getBoundingClientRectAsync", "getBoundingClientRect", "onLayout", "LayoutHandlers", "get", "cachedRect", "NodeRectCache", "cachedParentRect", "isEqualShallow", "set", "ParentRectCache", "event", "getElementLayoutEvent", "process", "env", "NODE_ENV", "console", "warn", "nativeEvent", "layout", "getRelativeDimensions", "target", "timeStamp", "measureLayout", "relativeTo", "callback", "relativeNode", "HTMLElement", "nodeDim", "relativeNodeDim", "x", "y", "width", "height", "left", "top", "getElementLayoutEventAsync", "measureLayoutAsync", "Error", "a", "b", "useElementLayout", "ref", "ensureWebElement", "current", "host", "useIsomorphicLayoutEffect", "add", "delete", "res", "nodeType", "io", "IntersectionObserver", "entries", "disconnect", "boundingClientRect", "threshold", "observe", "getRect", "rect", "offsetWidth", "offsetHeight"]
4
+ "mappings": "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",
5
+ "names": ["LayoutHandlers", "WeakMap", "Nodes", "Set", "strategy", "setOnLayoutStrategy", "state", "NodeRectCache", "ParentRectCache", "LastChangeTime", "WeakMap", "rAF", "window", "requestAnimationFrame", "undefined", "avoidUpdates", "queuedUpdates", "Map", "enable", "forEach", "cb", "clear", "expectedFrameTime", "numDroppedFramesUntilPause", "isClient", "layoutOnAnimationFrame", "now", "Date", "timeSinceLastFrame", "lastFrameAt", "frameCount", "runEveryXFrames", "strategy", "hasRecentSyncWork", "Nodes", "node", "updateLayoutIfChanged", "frameId", "onLayout", "LayoutHandlers", "get", "parentNode", "parentElement", "nodeRect", "parentRect", "nr", "pr", "Promise", "all", "getBoundingClientRectAsync", "getBoundingClientRect", "cachedRect", "NodeRectCache", "cachedParentRect", "isEqualShallow", "set", "ParentRectCache", "event", "getElementLayoutEvent", "process", "env", "NODE_ENV", "console", "warn", "nativeEvent", "layout", "getRelativeDimensions", "target", "timeStamp", "measureLayout", "relativeTo", "callback", "relativeNode", "HTMLElement", "nodeDim", "relativeNodeDim", "x", "y", "width", "height", "left", "top", "getElementLayoutEventAsync", "measureLayoutAsync", "Error", "a", "b", "useElementLayout", "ref", "ensureWebElement", "current", "host", "useIsomorphicLayoutEffect", "add", "delete", "res", "nodeType", "io", "IntersectionObserver", "entries", "disconnect", "boundingClientRect", "threshold", "observe", "getRect", "rect", "offsetWidth", "offsetHeight"]
6
6
  }
package/dist/esm/index.js CHANGED
@@ -12,17 +12,24 @@ const queuedUpdates = /* @__PURE__ */ new Map();
12
12
  function enable() {
13
13
  avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach((cb) => cb()), queuedUpdates.clear()));
14
14
  }
15
+ const expectedFrameTime = 16.67, numDroppedFramesUntilPause = 10;
15
16
  if (isClient)
16
17
  if (rAF) {
17
18
  let layoutOnAnimationFrame = function() {
18
19
  const now = Date.now(), timeSinceLastFrame = now - lastFrameAt;
19
- lastFrameAt = now, strategy !== "off" && (timeSinceLastFrame > 16.67 * numDroppedFramesUntilPause || Nodes.forEach((node) => {
20
+ if (lastFrameAt = now, frameCount < runEveryXFrames) {
21
+ frameCount++, rAF(layoutOnAnimationFrame);
22
+ return;
23
+ }
24
+ frameCount = 0, strategy !== "off" && (timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause || Nodes.forEach((node) => {
20
25
  updateLayoutIfChanged(node, lastFrameAt);
21
26
  })), rAF(layoutOnAnimationFrame);
22
27
  }, lastFrameAt = Date.now();
23
- const numDroppedFramesUntilPause = 2;
24
28
  async function updateLayoutIfChanged(node, frameId) {
29
+ const onLayout = LayoutHandlers.get(node);
30
+ if (typeof onLayout != "function") return;
25
31
  const parentNode = node.parentElement;
32
+ if (!parentNode) return;
26
33
  let nodeRect, parentRect;
27
34
  if (strategy === "async") {
28
35
  const [nr, pr] = await Promise.all([
@@ -33,24 +40,18 @@ if (isClient)
33
40
  return;
34
41
  nodeRect = nr, parentRect = pr;
35
42
  } else
36
- nodeRect = node.getBoundingClientRect(), parentRect = parentNode?.getBoundingClientRect();
37
- if (!parentRect)
38
- return;
39
- const onLayout = LayoutHandlers.get(node);
40
- if (typeof onLayout != "function") return;
41
- const cachedRect = NodeRectCache.get(node), cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
43
+ nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
44
+ const cachedRect = NodeRectCache.get(node), cachedParentRect = NodeRectCache.get(parentNode);
42
45
  if (!cachedRect || // has changed one rect
43
46
  !isEqualShallow(cachedRect, nodeRect) && (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect))) {
44
- if (NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect), avoidUpdates) {
45
- const event = getElementLayoutEvent(nodeRect, parentRect);
46
- queuedUpdates.set(node, () => onLayout(event));
47
- } else if (strategy !== "async") {
48
- const event = getElementLayoutEvent(nodeRect, parentRect);
49
- onLayout(event);
50
- }
47
+ NodeRectCache.set(node, nodeRect), ParentRectCache.set(parentNode, parentRect);
48
+ const event = getElementLayoutEvent(nodeRect, parentRect);
49
+ avoidUpdates ? queuedUpdates.set(node, () => onLayout(event)) : onLayout(event);
51
50
  }
52
51
  }
53
52
  rAF(layoutOnAnimationFrame);
53
+ let frameCount = 0;
54
+ const runEveryXFrames = 6;
54
55
  } else
55
56
  process.env.NODE_ENV === "development" && console.warn(
56
57
  "No requestAnimationFrame - please polyfill for onLayout to work correctly"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["node"]
6
6
  }
@@ -15,42 +15,45 @@ const queuedUpdates = /* @__PURE__ */new Map();
15
15
  function enable() {
16
16
  avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(cb => cb()), queuedUpdates.clear()));
17
17
  }
18
+ const expectedFrameTime = 16.67,
19
+ numDroppedFramesUntilPause = 10;
18
20
  if (isClient) if (rAF) {
19
21
  let layoutOnAnimationFrame = function () {
20
22
  const now = Date.now(),
21
23
  timeSinceLastFrame = now - lastFrameAt;
22
- lastFrameAt = now, strategy !== "off" && (timeSinceLastFrame > 16.67 * numDroppedFramesUntilPause || Nodes.forEach(node => {
24
+ if (lastFrameAt = now, frameCount < runEveryXFrames) {
25
+ frameCount++, rAF(layoutOnAnimationFrame);
26
+ return;
27
+ }
28
+ frameCount = 0, strategy !== "off" && (timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause || Nodes.forEach(node => {
23
29
  updateLayoutIfChanged(node, lastFrameAt);
24
30
  })), rAF(layoutOnAnimationFrame);
25
31
  },
26
32
  lastFrameAt = Date.now();
27
- const numDroppedFramesUntilPause = 2;
28
33
  async function updateLayoutIfChanged(node, frameId) {
34
+ const onLayout = LayoutHandlers.get(node);
35
+ if (typeof onLayout != "function") return;
29
36
  const parentNode = node.parentElement;
37
+ if (!parentNode) return;
30
38
  let nodeRect, parentRect;
31
39
  if (strategy === "async") {
32
40
  const [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
33
41
  if (frameId !== lastFrameAt) return;
34
42
  nodeRect = nr, parentRect = pr;
35
- } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode?.getBoundingClientRect();
36
- if (!parentRect) return;
37
- const onLayout = LayoutHandlers.get(node);
38
- if (typeof onLayout != "function") return;
43
+ } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
39
44
  const cachedRect = NodeRectCache.get(node),
40
- cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
45
+ cachedParentRect = NodeRectCache.get(parentNode);
41
46
  if (!cachedRect ||
42
47
  // has changed one rect
43
48
  !isEqualShallow(cachedRect, nodeRect) && (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect))) {
44
- if (NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect), avoidUpdates) {
45
- const event = getElementLayoutEvent(nodeRect, parentRect);
46
- queuedUpdates.set(node, () => onLayout(event));
47
- } else if (strategy !== "async") {
48
- const event = getElementLayoutEvent(nodeRect, parentRect);
49
- onLayout(event);
50
- }
49
+ NodeRectCache.set(node, nodeRect), ParentRectCache.set(parentNode, parentRect);
50
+ const event = getElementLayoutEvent(nodeRect, parentRect);
51
+ avoidUpdates ? queuedUpdates.set(node, () => onLayout(event)) : onLayout(event);
51
52
  }
52
53
  }
53
54
  rAF(layoutOnAnimationFrame);
55
+ let frameCount = 0;
56
+ const runEveryXFrames = 6;
54
57
  } else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
55
58
  const getElementLayoutEvent = (nodeRect, parentRect) => ({
56
59
  nativeEvent: {
@@ -1 +1 @@
1
- {"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","layoutOnAnimationFrame","now","Date","timeSinceLastFrame","lastFrameAt","numDroppedFramesUntilPause","node","updateLayoutIfChanged","frameId","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","onLayout","get","cachedRect","cachedParentRect","set","event","getElementLayoutEvent","process","env","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","target","timeStamp","measureLayout","relativeTo","callback","relativeNode","HTMLElement","nodeDim","relativeNodeDim","x","y","width","height","left","top","getElementLayoutEventAsync","measureLayoutAsync","Error","a","b","useElementLayout","ref","ensureWebElement","current","host","node2","add","delete","res","nodeType","io","IntersectionObserver","entries","disconnect","boundingClientRect","threshold","observe","getRect","rect","offsetWidth","offsetHeight"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","expectedFrameTime","numDroppedFramesUntilPause","layoutOnAnimationFrame","now","Date","timeSinceLastFrame","lastFrameAt","frameCount","runEveryXFrames","node","updateLayoutIfChanged","frameId","onLayout","get","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","cachedRect","cachedParentRect","set","event","getElementLayoutEvent","process","env","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","target","timeStamp","measureLayout","relativeTo","callback","relativeNode","HTMLElement","nodeDim","relativeNodeDim","x","y","width","height","left","top","getElementLayoutEventAsync","measureLayoutAsync","Error","a","b","useElementLayout","ref","ensureWebElement","current","host","node2","add","delete","res","nodeType","io","IntersectionObserver","entries","disconnect","boundingClientRect","threshold","observe","getRect","rect","offsetWidth","offsetHeight"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -17,13 +17,18 @@ function enable() {
17
17
  return cb();
18
18
  }), queuedUpdates.clear()));
19
19
  }
20
+ var expectedFrameTime = 16.67,
21
+ numDroppedFramesUntilPause = 10;
20
22
  if (isClient) if (rAF) {
21
23
  let layoutOnAnimationFrame = function () {
22
24
  var now = Date.now(),
23
25
  timeSinceLastFrame = now - lastFrameAt;
24
- if (lastFrameAt = now, strategy !== "off") {
25
- var expectedFrameTime = 16.67,
26
- hasRecentSyncWork = timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause;
26
+ if (lastFrameAt = now, frameCount < runEveryXFrames) {
27
+ frameCount++, rAF(layoutOnAnimationFrame);
28
+ return;
29
+ }
30
+ if (frameCount = 0, strategy !== "off") {
31
+ var hasRecentSyncWork = timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause;
27
32
  hasRecentSyncWork || Nodes.forEach(function (node) {
28
33
  updateLayoutIfChanged(node, lastFrameAt);
29
34
  });
@@ -31,39 +36,35 @@ if (isClient) if (rAF) {
31
36
  rAF(layoutOnAnimationFrame);
32
37
  };
33
38
  var layoutOnAnimationFrame2 = layoutOnAnimationFrame,
34
- lastFrameAt = Date.now(),
35
- numDroppedFramesUntilPause = 2;
39
+ lastFrameAt = Date.now();
36
40
  async function updateLayoutIfChanged(node, frameId) {
37
- var parentNode = node.parentElement,
38
- nodeRect,
39
- parentRect;
40
- if (strategy === "async") {
41
- var [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
42
- if (frameId !== lastFrameAt) return;
43
- nodeRect = nr, parentRect = pr;
44
- } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode?.getBoundingClientRect();
45
- if (parentRect) {
46
- var onLayout = LayoutHandlers.get(node);
47
- if (typeof onLayout == "function") {
41
+ var onLayout = LayoutHandlers.get(node);
42
+ if (typeof onLayout == "function") {
43
+ var parentNode = node.parentElement;
44
+ if (parentNode) {
45
+ var nodeRect, parentRect;
46
+ if (strategy === "async") {
47
+ var [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
48
+ if (frameId !== lastFrameAt) return;
49
+ nodeRect = nr, parentRect = pr;
50
+ } else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
48
51
  var cachedRect = NodeRectCache.get(node),
49
- cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null;
52
+ cachedParentRect = NodeRectCache.get(parentNode);
50
53
  if (!cachedRect ||
51
54
  // has changed one rect
52
55
  !isEqualShallow(cachedRect, nodeRect) && (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect))) {
53
- if (NodeRectCache.set(node, nodeRect), parentRect && parentNode && ParentRectCache.set(parentNode, parentRect), avoidUpdates) {
54
- var event = getElementLayoutEvent(nodeRect, parentRect);
55
- queuedUpdates.set(node, function () {
56
- return onLayout(event);
57
- });
58
- } else if (strategy !== "async") {
59
- var event1 = getElementLayoutEvent(nodeRect, parentRect);
60
- onLayout(event1);
61
- }
56
+ NodeRectCache.set(node, nodeRect), ParentRectCache.set(parentNode, parentRect);
57
+ var event = getElementLayoutEvent(nodeRect, parentRect);
58
+ avoidUpdates ? queuedUpdates.set(node, function () {
59
+ return onLayout(event);
60
+ }) : onLayout(event);
62
61
  }
63
62
  }
64
63
  }
65
64
  }
66
65
  rAF(layoutOnAnimationFrame);
66
+ var frameCount = 0,
67
+ runEveryXFrames = 6;
67
68
  } else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
68
69
  var getElementLayoutEvent = function (nodeRect, parentRect) {
69
70
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","layoutOnAnimationFrame","now","Date","timeSinceLastFrame","lastFrameAt","expectedFrameTime","hasRecentSyncWork","numDroppedFramesUntilPause","node","updateLayoutIfChanged","layoutOnAnimationFrame2","frameId","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","onLayout","get","cachedRect","cachedParentRect","set","event","getElementLayoutEvent","event1","process","env","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","target","timeStamp","measureLayout","relativeTo","callback","relativeNode","HTMLElement","nodeDim","relativeNodeDim","x","y","width","height","left","top","getElementLayoutEventAsync","measureLayoutAsync","Error","a","b","useElementLayout","ref","_ref_current","ensureWebElement","current","host","_ref_current2","node2","add","delete","res","nodeType","io","IntersectionObserver","entries"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","expectedFrameTime","numDroppedFramesUntilPause","layoutOnAnimationFrame","now","Date","timeSinceLastFrame","lastFrameAt","frameCount","runEveryXFrames","hasRecentSyncWork","node","updateLayoutIfChanged","layoutOnAnimationFrame2","frameId","onLayout","get","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","cachedRect","cachedParentRect","set","event","getElementLayoutEvent","process","env","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","target","timeStamp","measureLayout","relativeTo","callback","relativeNode","HTMLElement","nodeDim","relativeNodeDim","x","y","width","height","left","top","getElementLayoutEventAsync","measureLayoutAsync","Error","a","b","useElementLayout","ref","_ref_current","ensureWebElement","current","host","_ref_current2","node2","add","delete","res"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/use-element-layout",
3
- "version": "1.129.9",
3
+ "version": "1.129.11-1751323254461",
4
4
  "types": "./types/index.d.ts",
5
5
  "main": "dist/cjs",
6
6
  "module": "dist/esm",
@@ -31,11 +31,11 @@
31
31
  }
32
32
  },
33
33
  "dependencies": {
34
- "@tamagui/constants": "1.129.9",
35
- "@tamagui/is-equal-shallow": "1.129.9"
34
+ "@tamagui/constants": "1.129.11-1751323254461",
35
+ "@tamagui/is-equal-shallow": "1.129.11-1751323254461"
36
36
  },
37
37
  "devDependencies": {
38
- "@tamagui/build": "1.129.9",
38
+ "@tamagui/build": "1.129.11-1751323254461",
39
39
  "react": "*"
40
40
  },
41
41
  "publishConfig": {
package/src/index.ts CHANGED
@@ -55,17 +55,23 @@ export function enable(): void {
55
55
  }
56
56
  }
57
57
 
58
+ const expectedFrameTime = 16.67 // ~60fps
59
+ const numDroppedFramesUntilPause = 10
60
+
58
61
  if (isClient) {
59
62
  if (rAF) {
60
63
  // track frame timing to detect sync work and avoid updates during heavy periods
61
64
  let lastFrameAt = Date.now()
62
- const numDroppedFramesUntilPause = 2 // adjust sensitivity
63
65
 
64
66
  async function updateLayoutIfChanged(node: HTMLElement, frameId: number) {
67
+ const onLayout = LayoutHandlers.get(node)
68
+ if (typeof onLayout !== 'function') return
69
+
65
70
  const parentNode = node.parentElement
71
+ if (!parentNode) return
66
72
 
67
73
  let nodeRect: DOMRectReadOnly
68
- let parentRect: DOMRectReadOnly | undefined
74
+ let parentRect: DOMRectReadOnly
69
75
 
70
76
  if (strategy === 'async') {
71
77
  const [nr, pr] = await Promise.all([
@@ -82,18 +88,11 @@ if (isClient) {
82
88
  parentRect = pr
83
89
  } else {
84
90
  nodeRect = node.getBoundingClientRect()
85
- parentRect = parentNode?.getBoundingClientRect()
91
+ parentRect = parentNode.getBoundingClientRect()
86
92
  }
87
93
 
88
- if (!parentRect) {
89
- return
90
- }
91
-
92
- const onLayout = LayoutHandlers.get(node)
93
- if (typeof onLayout !== 'function') return
94
-
95
94
  const cachedRect = NodeRectCache.get(node)
96
- const cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null
95
+ const cachedParentRect = NodeRectCache.get(parentNode)
97
96
 
98
97
  if (
99
98
  !cachedRect ||
@@ -102,18 +101,13 @@ if (isClient) {
102
101
  (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect)))
103
102
  ) {
104
103
  NodeRectCache.set(node, nodeRect)
105
- if (parentRect && parentNode) {
106
- ParentRectCache.set(parentNode, parentRect)
107
- }
104
+ ParentRectCache.set(parentNode, parentRect)
105
+
106
+ const event = getElementLayoutEvent(nodeRect, parentRect)
108
107
 
109
108
  if (avoidUpdates) {
110
- // Use sync version for queued updates to avoid promise complications
111
- const event = getElementLayoutEvent(nodeRect, parentRect)
112
109
  queuedUpdates.set(node, () => onLayout(event))
113
- } else if (strategy === 'async') {
114
110
  } else {
115
- // Sync strategy - use sync version
116
- const event = getElementLayoutEvent(nodeRect, parentRect)
117
111
  onLayout(event)
118
112
  }
119
113
  }
@@ -122,15 +116,26 @@ if (isClient) {
122
116
  // note that getBoundingClientRect() does not thrash layout if its after an animation frame
123
117
  rAF!(layoutOnAnimationFrame)
124
118
 
119
+ // only run once in a few frames, this could be adjustable
120
+ let frameCount = 0
121
+ const runEveryXFrames = 6
122
+
125
123
  function layoutOnAnimationFrame() {
126
124
  const now = Date.now()
127
125
  const timeSinceLastFrame = now - lastFrameAt
128
126
  lastFrameAt = now
129
127
 
128
+ if (frameCount < runEveryXFrames) {
129
+ frameCount++
130
+ rAF!(layoutOnAnimationFrame)
131
+ return
132
+ }
133
+
134
+ frameCount = 0
135
+
130
136
  if (strategy !== 'off') {
131
137
  // for both strategies:
132
138
  // avoid updates if we've been dropping frames (indicates sync work happening)
133
- const expectedFrameTime = 16.67 // ~60fps
134
139
  const hasRecentSyncWork =
135
140
  timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause
136
141
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "mappings": "AAEA,cAAc,iBAAiB,OAAO;KAKjC,+BAA+B;CAClC;AACD;KAEI,4BAA4B,QAAQ,SAAS;AAIlD,OAAO,iBAAS,oBAAoBA,OAAO;AAI3C,YAAY,cAAc;CACxB;CACA;CACA;CACA;CACA;CACA;AACD;AAED,YAAY,cAAc;CACxB,aAAa;EACX,QAAQ;EACR;CACD;CACD;AACD;AAaD,OAAO,iBAAS;AA2GhB,OAAO,cAAM,wBACXC,UAAU,iBACVC,YAAY,oBACX;AAUH,OAAO,cAAM,gBACXC,MAAM,aACNC,YAAY,oBACZC,WACEC,WACAC,WACAC,eACAC,gBACAC,cACAC;AAkBJ,OAAO,cAAM,6BACXC,QAAQ,gBACP,QAAQ;AAcX,OAAO,cAAM,qBACXT,MAAM,aACNU,aAAa,uBACZ,eAAe;AA0BlB,OAAO,iBAAS,iBACdC,KAAK,UAAU,+BACfC,aAAaC,GAAG;AAkElB,OAAO,cAAM,UAAWb,MAAM,gBAAc",
2
+ "mappings": "AAEA,cAAc,iBAAiB,OAAO;KAKjC,+BAA+B;CAClC;AACD;KAEI,4BAA4B,QAAQ,SAAS;AAIlD,OAAO,iBAAS,oBAAoBA,OAAO;AAI3C,YAAY,cAAc;CACxB;CACA;CACA;CACA;CACA;CACA;AACD;AAED,YAAY,cAAc;CACxB,aAAa;EACX,QAAQ;EACR;CACD;CACD;AACD;AAaD,OAAO,iBAAS;AAgHhB,OAAO,cAAM,wBACXC,UAAU,iBACVC,YAAY,oBACX;AAUH,OAAO,cAAM,gBACXC,MAAM,aACNC,YAAY,oBACZC,WACEC,WACAC,WACAC,eACAC,gBACAC,cACAC;AAkBJ,OAAO,cAAM,6BACXC,QAAQ,gBACP,QAAQ;AAcX,OAAO,cAAM,qBACXT,MAAM,aACNU,aAAa,uBACZ,eAAe;AA0BlB,OAAO,iBAAS,iBACdC,KAAK,UAAU,+BACfC,aAAaC,GAAG;AAkElB,OAAO,cAAM,UAAWb,MAAM,gBAAc",
3
3
  "names": [
4
4
  "state: LayoutMeasurementStrategy",
5
5
  "nodeRect: DOMRectReadOnly",
@@ -23,7 +23,7 @@
23
23
  "src/index.ts"
24
24
  ],
25
25
  "sourcesContent": [
26
- "import { isClient, useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { isEqualShallow } from '@tamagui/is-equal-shallow'\nimport type { RefObject } from 'react'\n\nconst LayoutHandlers = new WeakMap<HTMLElement, Function>()\nconst Nodes = new Set<HTMLElement>()\n\ntype TamaguiComponentStatePartial = {\n host?: any\n}\n\ntype LayoutMeasurementStrategy = 'off' | 'sync' | 'async'\n\nlet strategy: LayoutMeasurementStrategy = 'async'\n\nexport function setOnLayoutStrategy(state: LayoutMeasurementStrategy): void {\n strategy = state\n}\n\nexport type LayoutValue = {\n x: number\n y: number\n width: number\n height: number\n left: number\n top: number\n}\n\nexport type LayoutEvent = {\n nativeEvent: {\n layout: LayoutValue\n target: any\n }\n timeStamp: number\n}\n\nconst NodeRectCache = new WeakMap<HTMLElement, DOMRect>()\nconst ParentRectCache = new WeakMap<HTMLElement, DOMRect>()\nconst DebounceTimers = new WeakMap<HTMLElement, NodeJS.Timeout>()\nconst LastChangeTime = new WeakMap<HTMLElement, number>()\n\nconst rAF = typeof window !== 'undefined' ? window.requestAnimationFrame : undefined\n\n// prevent thrashing during first hydration (somewhat, streaming gets trickier)\nlet avoidUpdates = true\nconst queuedUpdates = new Map<HTMLElement, Function>()\n\nexport function enable(): void {\n if (avoidUpdates) {\n avoidUpdates = false\n if (queuedUpdates) {\n queuedUpdates.forEach((cb) => cb())\n queuedUpdates.clear()\n }\n }\n}\n\nif (isClient) {\n if (rAF) {\n // track frame timing to detect sync work and avoid updates during heavy periods\n let lastFrameAt = Date.now()\n const numDroppedFramesUntilPause = 2 // adjust sensitivity\n\n async function updateLayoutIfChanged(node: HTMLElement, frameId: number) {\n const parentNode = node.parentElement\n\n let nodeRect: DOMRectReadOnly\n let parentRect: DOMRectReadOnly | undefined\n\n if (strategy === 'async') {\n const [nr, pr] = await Promise.all([\n getBoundingClientRectAsync(node),\n getBoundingClientRectAsync(parentNode),\n ])\n\n // cancel if we skipped a frame\n if (frameId !== lastFrameAt) {\n return\n }\n\n nodeRect = nr\n parentRect = pr\n } else {\n nodeRect = node.getBoundingClientRect()\n parentRect = parentNode?.getBoundingClientRect()\n }\n\n if (!parentRect) {\n return\n }\n\n const onLayout = LayoutHandlers.get(node)\n if (typeof onLayout !== 'function') return\n\n const cachedRect = NodeRectCache.get(node)\n const cachedParentRect = parentNode ? NodeRectCache.get(parentNode) : null\n\n if (\n !cachedRect ||\n // has changed one rect\n (!isEqualShallow(cachedRect, nodeRect) &&\n (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect)))\n ) {\n NodeRectCache.set(node, nodeRect)\n if (parentRect && parentNode) {\n ParentRectCache.set(parentNode, parentRect)\n }\n\n if (avoidUpdates) {\n // Use sync version for queued updates to avoid promise complications\n const event = getElementLayoutEvent(nodeRect, parentRect)\n queuedUpdates.set(node, () => onLayout(event))\n } else if (strategy === 'async') {\n } else {\n // Sync strategy - use sync version\n const event = getElementLayoutEvent(nodeRect, parentRect)\n onLayout(event)\n }\n }\n }\n\n // note that getBoundingClientRect() does not thrash layout if its after an animation frame\n rAF!(layoutOnAnimationFrame)\n\n function layoutOnAnimationFrame() {\n const now = Date.now()\n const timeSinceLastFrame = now - lastFrameAt\n lastFrameAt = now\n\n if (strategy !== 'off') {\n // for both strategies:\n // avoid updates if we've been dropping frames (indicates sync work happening)\n const expectedFrameTime = 16.67 // ~60fps\n const hasRecentSyncWork =\n timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause\n\n if (!hasRecentSyncWork) {\n Nodes.forEach((node) => {\n updateLayoutIfChanged(node, lastFrameAt)\n })\n }\n }\n\n rAF!(layoutOnAnimationFrame)\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `No requestAnimationFrame - please polyfill for onLayout to work correctly`\n )\n }\n }\n}\n\nexport const getElementLayoutEvent = (\n nodeRect: DOMRectReadOnly,\n parentRect: DOMRectReadOnly\n): LayoutEvent => {\n return {\n nativeEvent: {\n layout: getRelativeDimensions(nodeRect, parentRect),\n target: nodeRect,\n },\n timeStamp: Date.now(),\n }\n}\n\nexport const measureLayout = (\n node: HTMLElement,\n relativeTo: HTMLElement | null,\n callback: (\n x: number,\n y: number,\n width: number,\n height: number,\n left: number,\n top: number\n ) => void\n): void => {\n const relativeNode = relativeTo || node?.parentElement\n if (relativeNode instanceof HTMLElement) {\n const nodeDim = node.getBoundingClientRect()\n const relativeNodeDim = relativeNode.getBoundingClientRect()\n\n if (relativeNodeDim && nodeDim) {\n const { x, y, width, height, left, top } = getRelativeDimensions(\n nodeDim,\n relativeNodeDim\n )\n callback(x, y, width, height, left, top)\n }\n }\n}\n\nexport const getElementLayoutEventAsync = async (\n target: HTMLElement\n): Promise<LayoutEvent> => {\n const layout = await measureLayoutAsync(target)\n if (!layout) {\n throw new Error(`‼️`) // impossible\n }\n return {\n nativeEvent: {\n layout,\n target,\n },\n timeStamp: Date.now(),\n }\n}\n\nexport const measureLayoutAsync = async (\n node: HTMLElement,\n relativeTo?: HTMLElement | null\n): Promise<null | LayoutValue> => {\n const relativeNode = relativeTo || node?.parentElement\n if (relativeNode instanceof HTMLElement) {\n const [nodeDim, relativeNodeDim] = await Promise.all([\n getBoundingClientRectAsync(node),\n getBoundingClientRectAsync(relativeNode),\n ])\n\n if (relativeNodeDim && nodeDim) {\n const { x, y, width, height, left, top } = getRelativeDimensions(\n nodeDim,\n relativeNodeDim\n )\n return { x, y, width, height, left, top }\n }\n }\n return null\n}\n\nconst getRelativeDimensions = (a: DOMRectReadOnly, b: DOMRectReadOnly) => {\n const { height, left, top, width } = a\n const x = left - b.left\n const y = top - b.top\n return { x, y, width, height, left, top }\n}\n\nexport function useElementLayout(\n ref: RefObject<TamaguiComponentStatePartial>,\n onLayout?: ((e: LayoutEvent) => void) | null\n): void {\n // ensure always up to date so we can avoid re-running effect\n const node = ensureWebElement(ref.current?.host)\n if (node && onLayout) {\n LayoutHandlers.set(node, onLayout)\n }\n\n useIsomorphicLayoutEffect(() => {\n if (!onLayout) return\n const node = ref.current?.host\n if (!node) return\n\n LayoutHandlers.set(node, onLayout)\n Nodes.add(node)\n\n // always do one immediate sync layout event no matter the strategy for accuracy\n const parentNode = node.parentNode\n if (parentNode) {\n onLayout(\n getElementLayoutEvent(\n node.getBoundingClientRect(),\n parentNode.getBoundingClientRect()\n )\n )\n }\n\n return () => {\n Nodes.delete(node)\n LayoutHandlers.delete(node)\n NodeRectCache.delete(node)\n LastChangeTime.delete(node)\n }\n }, [ref, !!onLayout])\n}\n\nfunction ensureWebElement<X>(x: X): HTMLElement | undefined {\n if (typeof HTMLElement === 'undefined') {\n return undefined\n }\n return x instanceof HTMLElement ? x : undefined\n}\n\nconst getBoundingClientRectAsync = (\n node: HTMLElement | null\n): Promise<DOMRectReadOnly> => {\n return new Promise<DOMRectReadOnly>((res) => {\n if (!node || node.nodeType !== 1) return\n const io = new IntersectionObserver(\n (entries) => {\n io.disconnect()\n return res(entries[0].boundingClientRect)\n },\n {\n threshold: 0,\n }\n )\n io.observe(node)\n })\n}\n\nconst getBoundingClientRect = (node: HTMLElement | null): undefined | DOMRect => {\n if (!node || node.nodeType !== 1) return\n return node.getBoundingClientRect?.()\n}\n\nexport const getRect = (node: HTMLElement): LayoutValue | undefined => {\n const rect = getBoundingClientRect(node)\n if (!rect) return\n const { x, y, top, left } = rect\n return { x, y, width: node.offsetWidth, height: node.offsetHeight, top, left }\n}\n"
26
+ "import { isClient, useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { isEqualShallow } from '@tamagui/is-equal-shallow'\nimport type { RefObject } from 'react'\n\nconst LayoutHandlers = new WeakMap<HTMLElement, Function>()\nconst Nodes = new Set<HTMLElement>()\n\ntype TamaguiComponentStatePartial = {\n host?: any\n}\n\ntype LayoutMeasurementStrategy = 'off' | 'sync' | 'async'\n\nlet strategy: LayoutMeasurementStrategy = 'async'\n\nexport function setOnLayoutStrategy(state: LayoutMeasurementStrategy): void {\n strategy = state\n}\n\nexport type LayoutValue = {\n x: number\n y: number\n width: number\n height: number\n left: number\n top: number\n}\n\nexport type LayoutEvent = {\n nativeEvent: {\n layout: LayoutValue\n target: any\n }\n timeStamp: number\n}\n\nconst NodeRectCache = new WeakMap<HTMLElement, DOMRect>()\nconst ParentRectCache = new WeakMap<HTMLElement, DOMRect>()\nconst DebounceTimers = new WeakMap<HTMLElement, NodeJS.Timeout>()\nconst LastChangeTime = new WeakMap<HTMLElement, number>()\n\nconst rAF = typeof window !== 'undefined' ? window.requestAnimationFrame : undefined\n\n// prevent thrashing during first hydration (somewhat, streaming gets trickier)\nlet avoidUpdates = true\nconst queuedUpdates = new Map<HTMLElement, Function>()\n\nexport function enable(): void {\n if (avoidUpdates) {\n avoidUpdates = false\n if (queuedUpdates) {\n queuedUpdates.forEach((cb) => cb())\n queuedUpdates.clear()\n }\n }\n}\n\nconst expectedFrameTime = 16.67 // ~60fps\nconst numDroppedFramesUntilPause = 10\n\nif (isClient) {\n if (rAF) {\n // track frame timing to detect sync work and avoid updates during heavy periods\n let lastFrameAt = Date.now()\n\n async function updateLayoutIfChanged(node: HTMLElement, frameId: number) {\n const onLayout = LayoutHandlers.get(node)\n if (typeof onLayout !== 'function') return\n\n const parentNode = node.parentElement\n if (!parentNode) return\n\n let nodeRect: DOMRectReadOnly\n let parentRect: DOMRectReadOnly\n\n if (strategy === 'async') {\n const [nr, pr] = await Promise.all([\n getBoundingClientRectAsync(node),\n getBoundingClientRectAsync(parentNode),\n ])\n\n // cancel if we skipped a frame\n if (frameId !== lastFrameAt) {\n return\n }\n\n nodeRect = nr\n parentRect = pr\n } else {\n nodeRect = node.getBoundingClientRect()\n parentRect = parentNode.getBoundingClientRect()\n }\n\n const cachedRect = NodeRectCache.get(node)\n const cachedParentRect = NodeRectCache.get(parentNode)\n\n if (\n !cachedRect ||\n // has changed one rect\n (!isEqualShallow(cachedRect, nodeRect) &&\n (!cachedParentRect || !isEqualShallow(cachedParentRect, parentRect)))\n ) {\n NodeRectCache.set(node, nodeRect)\n ParentRectCache.set(parentNode, parentRect)\n\n const event = getElementLayoutEvent(nodeRect, parentRect)\n\n if (avoidUpdates) {\n queuedUpdates.set(node, () => onLayout(event))\n } else {\n onLayout(event)\n }\n }\n }\n\n // note that getBoundingClientRect() does not thrash layout if its after an animation frame\n rAF!(layoutOnAnimationFrame)\n\n // only run once in a few frames, this could be adjustable\n let frameCount = 0\n const runEveryXFrames = 6\n\n function layoutOnAnimationFrame() {\n const now = Date.now()\n const timeSinceLastFrame = now - lastFrameAt\n lastFrameAt = now\n\n if (frameCount < runEveryXFrames) {\n frameCount++\n rAF!(layoutOnAnimationFrame)\n return\n }\n\n frameCount = 0\n\n if (strategy !== 'off') {\n // for both strategies:\n // avoid updates if we've been dropping frames (indicates sync work happening)\n const hasRecentSyncWork =\n timeSinceLastFrame > expectedFrameTime * numDroppedFramesUntilPause\n\n if (!hasRecentSyncWork) {\n Nodes.forEach((node) => {\n updateLayoutIfChanged(node, lastFrameAt)\n })\n }\n }\n\n rAF!(layoutOnAnimationFrame)\n }\n } else {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `No requestAnimationFrame - please polyfill for onLayout to work correctly`\n )\n }\n }\n}\n\nexport const getElementLayoutEvent = (\n nodeRect: DOMRectReadOnly,\n parentRect: DOMRectReadOnly\n): LayoutEvent => {\n return {\n nativeEvent: {\n layout: getRelativeDimensions(nodeRect, parentRect),\n target: nodeRect,\n },\n timeStamp: Date.now(),\n }\n}\n\nexport const measureLayout = (\n node: HTMLElement,\n relativeTo: HTMLElement | null,\n callback: (\n x: number,\n y: number,\n width: number,\n height: number,\n left: number,\n top: number\n ) => void\n): void => {\n const relativeNode = relativeTo || node?.parentElement\n if (relativeNode instanceof HTMLElement) {\n const nodeDim = node.getBoundingClientRect()\n const relativeNodeDim = relativeNode.getBoundingClientRect()\n\n if (relativeNodeDim && nodeDim) {\n const { x, y, width, height, left, top } = getRelativeDimensions(\n nodeDim,\n relativeNodeDim\n )\n callback(x, y, width, height, left, top)\n }\n }\n}\n\nexport const getElementLayoutEventAsync = async (\n target: HTMLElement\n): Promise<LayoutEvent> => {\n const layout = await measureLayoutAsync(target)\n if (!layout) {\n throw new Error(`‼️`) // impossible\n }\n return {\n nativeEvent: {\n layout,\n target,\n },\n timeStamp: Date.now(),\n }\n}\n\nexport const measureLayoutAsync = async (\n node: HTMLElement,\n relativeTo?: HTMLElement | null\n): Promise<null | LayoutValue> => {\n const relativeNode = relativeTo || node?.parentElement\n if (relativeNode instanceof HTMLElement) {\n const [nodeDim, relativeNodeDim] = await Promise.all([\n getBoundingClientRectAsync(node),\n getBoundingClientRectAsync(relativeNode),\n ])\n\n if (relativeNodeDim && nodeDim) {\n const { x, y, width, height, left, top } = getRelativeDimensions(\n nodeDim,\n relativeNodeDim\n )\n return { x, y, width, height, left, top }\n }\n }\n return null\n}\n\nconst getRelativeDimensions = (a: DOMRectReadOnly, b: DOMRectReadOnly) => {\n const { height, left, top, width } = a\n const x = left - b.left\n const y = top - b.top\n return { x, y, width, height, left, top }\n}\n\nexport function useElementLayout(\n ref: RefObject<TamaguiComponentStatePartial>,\n onLayout?: ((e: LayoutEvent) => void) | null\n): void {\n // ensure always up to date so we can avoid re-running effect\n const node = ensureWebElement(ref.current?.host)\n if (node && onLayout) {\n LayoutHandlers.set(node, onLayout)\n }\n\n useIsomorphicLayoutEffect(() => {\n if (!onLayout) return\n const node = ref.current?.host\n if (!node) return\n\n LayoutHandlers.set(node, onLayout)\n Nodes.add(node)\n\n // always do one immediate sync layout event no matter the strategy for accuracy\n const parentNode = node.parentNode\n if (parentNode) {\n onLayout(\n getElementLayoutEvent(\n node.getBoundingClientRect(),\n parentNode.getBoundingClientRect()\n )\n )\n }\n\n return () => {\n Nodes.delete(node)\n LayoutHandlers.delete(node)\n NodeRectCache.delete(node)\n LastChangeTime.delete(node)\n }\n }, [ref, !!onLayout])\n}\n\nfunction ensureWebElement<X>(x: X): HTMLElement | undefined {\n if (typeof HTMLElement === 'undefined') {\n return undefined\n }\n return x instanceof HTMLElement ? x : undefined\n}\n\nconst getBoundingClientRectAsync = (\n node: HTMLElement | null\n): Promise<DOMRectReadOnly> => {\n return new Promise<DOMRectReadOnly>((res) => {\n if (!node || node.nodeType !== 1) return\n const io = new IntersectionObserver(\n (entries) => {\n io.disconnect()\n return res(entries[0].boundingClientRect)\n },\n {\n threshold: 0,\n }\n )\n io.observe(node)\n })\n}\n\nconst getBoundingClientRect = (node: HTMLElement | null): undefined | DOMRect => {\n if (!node || node.nodeType !== 1) return\n return node.getBoundingClientRect?.()\n}\n\nexport const getRect = (node: HTMLElement): LayoutValue | undefined => {\n const rect = getBoundingClientRect(node)\n if (!rect) return\n const { x, y, top, left } = rect\n return { x, y, width: node.offsetWidth, height: node.offsetHeight, top, left }\n}\n"
27
27
  ],
28
28
  "version": 3
29
29
  }