@tamagui/use-element-layout 1.129.10 → 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.
- package/dist/cjs/index.cjs +17 -14
- package/dist/cjs/index.js +16 -15
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +30 -27
- package/dist/cjs/index.native.js.map +2 -2
- package/dist/esm/index.js +16 -15
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +17 -14
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +27 -26
- package/dist/esm/index.native.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +25 -20
- package/types/index.d.ts.map +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -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,
|
|
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
|
|
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 =
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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,
|
|
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
|
|
62
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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"
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAoD,+BACpD,0BAA+B;AAG/B,MAAM,iBAAiB,oBAAI,QAA+B,GACpD,QAAQ,oBAAI,IAAiB;AAQnC,IAAI,WAAsC;AAEnC,SAAS,oBAAoB,OAAwC;AAC1E,aAAW;AACb;AAmBA,MAAM,gBAAgB,oBAAI,QAA8B,GAClD,kBAAkB,oBAAI,QAA8B;AAE1D,MAAM,iBAAiB,oBAAI,QAA6B,GAElD,MAAM,OAAO,SAAW,MAAc,OAAO,wBAAwB;AAG3E,IAAI,eAAe;AACnB,MAAM,gBAAgB,oBAAI,IAA2B;AAE9C,SAAS,SAAe;AAC7B,EAAI,iBACF,eAAe,IACX,kBACF,cAAc,QAAQ,CAAC,OAAO,GAAG,CAAC,GAClC,cAAc,MAAM;AAG1B;AAEA,IAAI;AACF,MAAI,KAAK;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["node"]
|
|
6
6
|
}
|
package/dist/cjs/index.native.js
CHANGED
|
@@ -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,
|
|
44
|
-
|
|
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()
|
|
56
|
+
var layoutOnAnimationFrame2 = layoutOnAnimationFrame, lastFrameAt = Date.now();
|
|
52
57
|
async function updateLayoutIfChanged(node, frameId) {
|
|
53
|
-
var
|
|
54
|
-
if (
|
|
55
|
-
var
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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,
|
|
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", "
|
|
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,
|
|
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
|
|
37
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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"
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,UAAU,iCAAiC;AACpD,SAAS,sBAAsB;AAG/B,MAAM,iBAAiB,oBAAI,QAA+B,GACpD,QAAQ,oBAAI,IAAiB;AAQnC,IAAI,WAAsC;AAEnC,SAAS,oBAAoB,OAAwC;AAC1E,aAAW;AACb;AAmBA,MAAM,gBAAgB,oBAAI,QAA8B,GAClD,kBAAkB,oBAAI,QAA8B;AAE1D,MAAM,iBAAiB,oBAAI,QAA6B,GAElD,MAAM,OAAO,SAAW,MAAc,OAAO,wBAAwB;AAG3E,IAAI,eAAe;AACnB,MAAM,gBAAgB,oBAAI,IAA2B;AAE9C,SAAS,SAAe;AAC7B,EAAI,iBACF,eAAe,IACX,kBACF,cAAc,QAAQ,CAAC,OAAO,GAAG,CAAC,GAClC,cAAc,MAAM;AAG1B;AAEA,IAAI;AACF,MAAI,KAAK;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["node"]
|
|
6
6
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -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,
|
|
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
|
|
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 =
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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: {
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -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","
|
|
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":[]}
|
package/dist/esm/index.native.js
CHANGED
|
@@ -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,
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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 =
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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","
|
|
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.
|
|
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.
|
|
35
|
-
"@tamagui/is-equal-shallow": "1.129.
|
|
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.
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
106
|
-
|
|
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
|
|
package/types/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
}
|