@tamagui/use-element-layout 1.130.3 → 1.130.5
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 +13 -15
- package/dist/cjs/index.js +13 -13
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +11 -14
- package/dist/cjs/index.native.js.map +2 -2
- package/dist/esm/index.js +13 -13
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +13 -15
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +11 -17
- package/dist/esm/index.native.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +16 -34
- package/types/index.d.ts.map +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -49,8 +49,6 @@ const queuedUpdates = /* @__PURE__ */new Map();
|
|
|
49
49
|
function enable() {
|
|
50
50
|
avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(cb => cb()), queuedUpdates.clear()));
|
|
51
51
|
}
|
|
52
|
-
const expectedFrameTime = 16.67,
|
|
53
|
-
numDroppedFramesUntilPause = 10;
|
|
54
52
|
function startGlobalIntersectionObserver() {
|
|
55
53
|
!import_constants.isClient || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(entries => {
|
|
56
54
|
entries.forEach(entry => {
|
|
@@ -63,19 +61,19 @@ function startGlobalIntersectionObserver() {
|
|
|
63
61
|
}
|
|
64
62
|
if (import_constants.isClient) if (rAF) {
|
|
65
63
|
let layoutOnAnimationFrame = function () {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
if (strategy !== "off") {
|
|
65
|
+
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
66
|
+
rAF(layoutOnAnimationFrame);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach(node => {
|
|
70
|
+
updateLayoutIfChanged(node);
|
|
71
|
+
});
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
-
updateLayoutIfChanged(node, lastFrameAt);
|
|
74
|
-
})), rAF(layoutOnAnimationFrame);
|
|
73
|
+
rAF(layoutOnAnimationFrame);
|
|
75
74
|
};
|
|
76
75
|
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
77
|
-
|
|
78
|
-
async function updateLayoutIfChanged(node, frameId) {
|
|
76
|
+
async function updateLayoutIfChanged(node) {
|
|
79
77
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility()) return;
|
|
80
78
|
const onLayout = LayoutHandlers.get(node);
|
|
81
79
|
if (typeof onLayout != "function") return;
|
|
@@ -84,7 +82,7 @@ if (import_constants.isClient) if (rAF) {
|
|
|
84
82
|
let nodeRect, parentRect;
|
|
85
83
|
if (strategy === "async") {
|
|
86
84
|
const [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
|
|
87
|
-
if (nr === !1 || pr === !1
|
|
85
|
+
if (nr === !1 || pr === !1) return;
|
|
88
86
|
nodeRect = nr, parentRect = pr;
|
|
89
87
|
} else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
|
|
90
88
|
const cachedRect = NodeRectCache.get(node),
|
|
@@ -102,7 +100,7 @@ if (import_constants.isClient) if (rAF) {
|
|
|
102
100
|
}
|
|
103
101
|
rAF(layoutOnAnimationFrame);
|
|
104
102
|
let frameCount = 0;
|
|
105
|
-
const RUN_EVERY_X_FRAMES =
|
|
103
|
+
const RUN_EVERY_X_FRAMES = 8;
|
|
106
104
|
} else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
107
105
|
const getElementLayoutEvent = (nodeRect, parentRect) => ({
|
|
108
106
|
nativeEvent: {
|
|
@@ -189,7 +187,7 @@ function useElementLayout(ref, onLayout) {
|
|
|
189
187
|
if (!onLayout) return;
|
|
190
188
|
const node2 = ref.current?.host;
|
|
191
189
|
if (!node2) return;
|
|
192
|
-
|
|
190
|
+
Nodes.add(node2), startGlobalIntersectionObserver(), globalIntersectionObserver && (globalIntersectionObserver.observe(node2), IntersectionState.set(node2, !0));
|
|
193
191
|
const parentNode = node2.parentNode;
|
|
194
192
|
return parentNode && onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect())), () => {
|
|
195
193
|
Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2), LastChangeTime.delete(node2), IntersectionState.delete(node2), globalIntersectionObserver && globalIntersectionObserver.unobserve(node2);
|
package/dist/cjs/index.js
CHANGED
|
@@ -36,7 +36,6 @@ const queuedUpdates = /* @__PURE__ */ new Map();
|
|
|
36
36
|
function enable() {
|
|
37
37
|
avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach((cb) => cb()), queuedUpdates.clear()));
|
|
38
38
|
}
|
|
39
|
-
const expectedFrameTime = 16.67, numDroppedFramesUntilPause = 10;
|
|
40
39
|
function startGlobalIntersectionObserver() {
|
|
41
40
|
!import_constants.isClient || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(
|
|
42
41
|
(entries) => {
|
|
@@ -53,18 +52,19 @@ function startGlobalIntersectionObserver() {
|
|
|
53
52
|
if (import_constants.isClient)
|
|
54
53
|
if (rAF) {
|
|
55
54
|
let layoutOnAnimationFrame = function() {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
if (strategy !== "off") {
|
|
56
|
+
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
57
|
+
rAF(layoutOnAnimationFrame);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach((node) => {
|
|
61
|
+
updateLayoutIfChanged(node);
|
|
62
|
+
});
|
|
60
63
|
}
|
|
61
|
-
|
|
62
|
-
updateLayoutIfChanged(node, lastFrameAt);
|
|
63
|
-
})), rAF(layoutOnAnimationFrame);
|
|
64
|
+
rAF(layoutOnAnimationFrame);
|
|
64
65
|
};
|
|
65
66
|
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
66
|
-
|
|
67
|
-
async function updateLayoutIfChanged(node, frameId) {
|
|
67
|
+
async function updateLayoutIfChanged(node) {
|
|
68
68
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())
|
|
69
69
|
return;
|
|
70
70
|
const onLayout = LayoutHandlers.get(node);
|
|
@@ -77,7 +77,7 @@ if (import_constants.isClient)
|
|
|
77
77
|
getBoundingClientRectAsync(node),
|
|
78
78
|
getBoundingClientRectAsync(parentNode)
|
|
79
79
|
]);
|
|
80
|
-
if (nr === !1 || pr === !1
|
|
80
|
+
if (nr === !1 || pr === !1)
|
|
81
81
|
return;
|
|
82
82
|
nodeRect = nr, parentRect = pr;
|
|
83
83
|
} else
|
|
@@ -94,7 +94,7 @@ if (import_constants.isClient)
|
|
|
94
94
|
}
|
|
95
95
|
rAF(layoutOnAnimationFrame);
|
|
96
96
|
let frameCount = 0;
|
|
97
|
-
const RUN_EVERY_X_FRAMES =
|
|
97
|
+
const RUN_EVERY_X_FRAMES = 8;
|
|
98
98
|
} else
|
|
99
99
|
process.env.NODE_ENV === "development" && console.warn(
|
|
100
100
|
"No requestAnimationFrame - please polyfill for onLayout to work correctly"
|
|
@@ -154,7 +154,7 @@ function useElementLayout(ref, onLayout) {
|
|
|
154
154
|
if (!onLayout) return;
|
|
155
155
|
const node2 = ref.current?.host;
|
|
156
156
|
if (!node2) return;
|
|
157
|
-
|
|
157
|
+
Nodes.add(node2), startGlobalIntersectionObserver(), globalIntersectionObserver && (globalIntersectionObserver.observe(node2), IntersectionState.set(node2, !0));
|
|
158
158
|
const parentNode = node2.parentNode;
|
|
159
159
|
return parentNode && onLayout(
|
|
160
160
|
getElementLayoutEvent(
|
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,GAC7B,oBAAoB,oBAAI,QAA8B;AAG5D,IAAI,6BAA0D,MAQ1D,WAAsC;AAEnC,SAAS,oBAAoB,OAAwC;AAC1E,aAAW;AACb;AAmBA,MAAM,gBAAgB,oBAAI,QAA8B,GAClD,kBAAkB,oBAAI,QAA8B,GACpD,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,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["node"]
|
|
6
6
|
}
|
package/dist/cjs/index.native.js
CHANGED
|
@@ -35,7 +35,6 @@ function enable() {
|
|
|
35
35
|
return cb();
|
|
36
36
|
}), queuedUpdates.clear()));
|
|
37
37
|
}
|
|
38
|
-
var expectedFrameTime = 16.67, numDroppedFramesUntilPause = 10;
|
|
39
38
|
function startGlobalIntersectionObserver() {
|
|
40
39
|
!import_constants.isClient || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(function(entries) {
|
|
41
40
|
entries.forEach(function(entry) {
|
|
@@ -49,21 +48,19 @@ function startGlobalIntersectionObserver() {
|
|
|
49
48
|
if (import_constants.isClient)
|
|
50
49
|
if (rAF) {
|
|
51
50
|
let layoutOnAnimationFrame = function() {
|
|
52
|
-
var now = Date.now(), timeSinceLastFrame = now - lastFrameAt;
|
|
53
|
-
if (lastFrameAt = now, frameCount++, frameCount % RUN_EVERY_X_FRAMES === 0) {
|
|
54
|
-
frameCount = 0, rAF(layoutOnAnimationFrame);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
51
|
if (strategy !== "off") {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
52
|
+
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
53
|
+
rAF(layoutOnAnimationFrame);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach(function(node) {
|
|
57
|
+
updateLayoutIfChanged(node);
|
|
61
58
|
});
|
|
62
59
|
}
|
|
63
60
|
rAF(layoutOnAnimationFrame);
|
|
64
61
|
};
|
|
65
|
-
var layoutOnAnimationFrame2 = layoutOnAnimationFrame, supportsCheckVisibility = "checkVisibility" in document.body
|
|
66
|
-
async function updateLayoutIfChanged(node
|
|
62
|
+
var layoutOnAnimationFrame2 = layoutOnAnimationFrame, supportsCheckVisibility = "checkVisibility" in document.body;
|
|
63
|
+
async function updateLayoutIfChanged(node) {
|
|
67
64
|
if (IntersectionState.get(node) !== !1 && !(process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())) {
|
|
68
65
|
var onLayout = LayoutHandlers.get(node);
|
|
69
66
|
if (typeof onLayout == "function") {
|
|
@@ -75,7 +72,7 @@ if (import_constants.isClient)
|
|
|
75
72
|
getBoundingClientRectAsync(node),
|
|
76
73
|
getBoundingClientRectAsync(parentNode)
|
|
77
74
|
]);
|
|
78
|
-
if (nr === !1 || pr === !1
|
|
75
|
+
if (nr === !1 || pr === !1)
|
|
79
76
|
return;
|
|
80
77
|
nodeRect = nr, parentRect = pr;
|
|
81
78
|
} else
|
|
@@ -96,7 +93,7 @@ if (import_constants.isClient)
|
|
|
96
93
|
}
|
|
97
94
|
}
|
|
98
95
|
rAF(layoutOnAnimationFrame);
|
|
99
|
-
var frameCount = 0, RUN_EVERY_X_FRAMES =
|
|
96
|
+
var frameCount = 0, RUN_EVERY_X_FRAMES = 8;
|
|
100
97
|
} else
|
|
101
98
|
process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
102
99
|
var getElementLayoutEvent = function(nodeRect, parentRect) {
|
|
@@ -165,7 +162,7 @@ function useElementLayout(ref, onLayout) {
|
|
|
165
162
|
if (onLayout) {
|
|
166
163
|
var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
|
|
167
164
|
if (node2) {
|
|
168
|
-
|
|
165
|
+
Nodes.add(node2), startGlobalIntersectionObserver(), globalIntersectionObserver && (globalIntersectionObserver.observe(node2), IntersectionState.set(node2, !0));
|
|
169
166
|
var parentNode = node2.parentNode;
|
|
170
167
|
return parentNode && onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect())), function() {
|
|
171
168
|
Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2), LastChangeTime.delete(node2), IntersectionState.delete(node2), globalIntersectionObserver && globalIntersectionObserver.unobserve(node2);
|
|
@@ -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,GACZC,oBAAoB,oBAAIH,QAAAA,GAG1BI,6BAA0D,MAQ1DC,WAAsC;AAEnC,SAASC,oBAAoBC,OAAgC;AAClEF,aAAWE;AACb;AAmBA,IAAMC,gBAAgB,oBAAIR,QAAAA,GACpBS,kBAAkB,oBAAIT,QAAAA,GACtBU,iBAAiB,oBAAIV,QAAAA,GAErBW,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,
|
|
5
|
-
"names": ["LayoutHandlers", "WeakMap", "Nodes", "Set", "IntersectionState", "globalIntersectionObserver", "strategy", "setOnLayoutStrategy", "state", "NodeRectCache", "ParentRectCache", "LastChangeTime", "rAF", "window", "requestAnimationFrame", "undefined", "avoidUpdates", "queuedUpdates", "Map", "enable", "forEach", "cb", "clear", "
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["LayoutHandlers", "WeakMap", "Nodes", "Set", "IntersectionState", "globalIntersectionObserver", "strategy", "setOnLayoutStrategy", "state", "NodeRectCache", "ParentRectCache", "LastChangeTime", "rAF", "window", "requestAnimationFrame", "undefined", "avoidUpdates", "queuedUpdates", "Map", "enable", "forEach", "cb", "clear", "startGlobalIntersectionObserver", "isClient", "IntersectionObserver", "entries", "entry", "node", "target", "get", "isIntersecting", "set", "threshold", "layoutOnAnimationFrame", "frameCount", "RUN_EVERY_X_FRAMES", "Number", "MAX_SAFE_INTEGER", "updateLayoutIfChanged", "supportsCheckVisibility", "document", "body", "process", "env", "TAMAGUI_ONLAYOUT_VISIBILITY_CHECK", "checkVisibility", "onLayout", "parentNode", "parentElement", "nodeRect", "parentRect", "nr", "pr", "Promise", "all", "getBoundingClientRectAsync", "getBoundingClientRect", "cachedRect", "cachedParentRect", "isEqualShallow", "event", "getElementLayoutEvent", "NODE_ENV", "console", "warn", "nativeEvent", "layout", "getRelativeDimensions", "timeStamp", "Date", "now", "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", "observe", "delete", "unobserve", "res", "nodeType", "io", "disconnect", "boundingClientRect", "getRect", "rect", "offsetWidth", "offsetHeight"]
|
|
6
6
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -11,7 +11,6 @@ const queuedUpdates = /* @__PURE__ */ new Map();
|
|
|
11
11
|
function enable() {
|
|
12
12
|
avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach((cb) => cb()), queuedUpdates.clear()));
|
|
13
13
|
}
|
|
14
|
-
const expectedFrameTime = 16.67, numDroppedFramesUntilPause = 10;
|
|
15
14
|
function startGlobalIntersectionObserver() {
|
|
16
15
|
!isClient || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(
|
|
17
16
|
(entries) => {
|
|
@@ -28,18 +27,19 @@ function startGlobalIntersectionObserver() {
|
|
|
28
27
|
if (isClient)
|
|
29
28
|
if (rAF) {
|
|
30
29
|
let layoutOnAnimationFrame = function() {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
if (strategy !== "off") {
|
|
31
|
+
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
32
|
+
rAF(layoutOnAnimationFrame);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach((node) => {
|
|
36
|
+
updateLayoutIfChanged(node);
|
|
37
|
+
});
|
|
35
38
|
}
|
|
36
|
-
|
|
37
|
-
updateLayoutIfChanged(node, lastFrameAt);
|
|
38
|
-
})), rAF(layoutOnAnimationFrame);
|
|
39
|
+
rAF(layoutOnAnimationFrame);
|
|
39
40
|
};
|
|
40
41
|
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
41
|
-
|
|
42
|
-
async function updateLayoutIfChanged(node, frameId) {
|
|
42
|
+
async function updateLayoutIfChanged(node) {
|
|
43
43
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())
|
|
44
44
|
return;
|
|
45
45
|
const onLayout = LayoutHandlers.get(node);
|
|
@@ -52,7 +52,7 @@ if (isClient)
|
|
|
52
52
|
getBoundingClientRectAsync(node),
|
|
53
53
|
getBoundingClientRectAsync(parentNode)
|
|
54
54
|
]);
|
|
55
|
-
if (nr === !1 || pr === !1
|
|
55
|
+
if (nr === !1 || pr === !1)
|
|
56
56
|
return;
|
|
57
57
|
nodeRect = nr, parentRect = pr;
|
|
58
58
|
} else
|
|
@@ -69,7 +69,7 @@ if (isClient)
|
|
|
69
69
|
}
|
|
70
70
|
rAF(layoutOnAnimationFrame);
|
|
71
71
|
let frameCount = 0;
|
|
72
|
-
const RUN_EVERY_X_FRAMES =
|
|
72
|
+
const RUN_EVERY_X_FRAMES = 8;
|
|
73
73
|
} else
|
|
74
74
|
process.env.NODE_ENV === "development" && console.warn(
|
|
75
75
|
"No requestAnimationFrame - please polyfill for onLayout to work correctly"
|
|
@@ -129,7 +129,7 @@ function useElementLayout(ref, onLayout) {
|
|
|
129
129
|
if (!onLayout) return;
|
|
130
130
|
const node2 = ref.current?.host;
|
|
131
131
|
if (!node2) return;
|
|
132
|
-
|
|
132
|
+
Nodes.add(node2), startGlobalIntersectionObserver(), globalIntersectionObserver && (globalIntersectionObserver.observe(node2), IntersectionState.set(node2, !0));
|
|
133
133
|
const parentNode = node2.parentNode;
|
|
134
134
|
return parentNode && onLayout(
|
|
135
135
|
getElementLayoutEvent(
|
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,GAC7B,oBAAoB,oBAAI,QAA8B;AAG5D,IAAI,6BAA0D,MAQ1D,WAAsC;AAEnC,SAAS,oBAAoB,OAAwC;AAC1E,aAAW;AACb;AAmBA,MAAM,gBAAgB,oBAAI,QAA8B,GAClD,kBAAkB,oBAAI,QAA8B,GACpD,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,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["node"]
|
|
6
6
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -17,8 +17,6 @@ const queuedUpdates = /* @__PURE__ */new Map();
|
|
|
17
17
|
function enable() {
|
|
18
18
|
avoidUpdates && (avoidUpdates = !1, queuedUpdates && (queuedUpdates.forEach(cb => cb()), queuedUpdates.clear()));
|
|
19
19
|
}
|
|
20
|
-
const expectedFrameTime = 16.67,
|
|
21
|
-
numDroppedFramesUntilPause = 10;
|
|
22
20
|
function startGlobalIntersectionObserver() {
|
|
23
21
|
!isClient || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(entries => {
|
|
24
22
|
entries.forEach(entry => {
|
|
@@ -31,19 +29,19 @@ function startGlobalIntersectionObserver() {
|
|
|
31
29
|
}
|
|
32
30
|
if (isClient) if (rAF) {
|
|
33
31
|
let layoutOnAnimationFrame = function () {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
if (strategy !== "off") {
|
|
33
|
+
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
34
|
+
rAF(layoutOnAnimationFrame);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach(node => {
|
|
38
|
+
updateLayoutIfChanged(node);
|
|
39
|
+
});
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
-
updateLayoutIfChanged(node, lastFrameAt);
|
|
42
|
-
})), rAF(layoutOnAnimationFrame);
|
|
41
|
+
rAF(layoutOnAnimationFrame);
|
|
43
42
|
};
|
|
44
43
|
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
45
|
-
|
|
46
|
-
async function updateLayoutIfChanged(node, frameId) {
|
|
44
|
+
async function updateLayoutIfChanged(node) {
|
|
47
45
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility()) return;
|
|
48
46
|
const onLayout = LayoutHandlers.get(node);
|
|
49
47
|
if (typeof onLayout != "function") return;
|
|
@@ -52,7 +50,7 @@ if (isClient) if (rAF) {
|
|
|
52
50
|
let nodeRect, parentRect;
|
|
53
51
|
if (strategy === "async") {
|
|
54
52
|
const [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
|
|
55
|
-
if (nr === !1 || pr === !1
|
|
53
|
+
if (nr === !1 || pr === !1) return;
|
|
56
54
|
nodeRect = nr, parentRect = pr;
|
|
57
55
|
} else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
|
|
58
56
|
const cachedRect = NodeRectCache.get(node),
|
|
@@ -70,7 +68,7 @@ if (isClient) if (rAF) {
|
|
|
70
68
|
}
|
|
71
69
|
rAF(layoutOnAnimationFrame);
|
|
72
70
|
let frameCount = 0;
|
|
73
|
-
const RUN_EVERY_X_FRAMES =
|
|
71
|
+
const RUN_EVERY_X_FRAMES = 8;
|
|
74
72
|
} else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
75
73
|
const getElementLayoutEvent = (nodeRect, parentRect) => ({
|
|
76
74
|
nativeEvent: {
|
|
@@ -157,7 +155,7 @@ function useElementLayout(ref, onLayout) {
|
|
|
157
155
|
if (!onLayout) return;
|
|
158
156
|
const node2 = ref.current?.host;
|
|
159
157
|
if (!node2) return;
|
|
160
|
-
|
|
158
|
+
Nodes.add(node2), startGlobalIntersectionObserver(), globalIntersectionObserver && (globalIntersectionObserver.observe(node2), IntersectionState.set(node2, !0));
|
|
161
159
|
const parentNode = node2.parentNode;
|
|
162
160
|
return parentNode && onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect())), () => {
|
|
163
161
|
Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2), LastChangeTime.delete(node2), IntersectionState.delete(node2), globalIntersectionObserver && globalIntersectionObserver.unobserve(node2);
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","IntersectionState","globalIntersectionObserver","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","
|
|
1
|
+
{"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","IntersectionState","globalIntersectionObserver","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","startGlobalIntersectionObserver","IntersectionObserver","entries","entry","node","target","get","isIntersecting","set","threshold","layoutOnAnimationFrame","frameCount","RUN_EVERY_X_FRAMES","Number","MAX_SAFE_INTEGER","updateLayoutIfChanged","supportsCheckVisibility","document","body","process","env","TAMAGUI_ONLAYOUT_VISIBILITY_CHECK","checkVisibility","onLayout","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","cachedRect","cachedParentRect","event","getElementLayoutEvent","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","timeStamp","Date","now","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","observe","delete","unobserve","res","nodeType","io","disconnect","boundingClientRect","getRect","rect","offsetWidth","offsetHeight"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/esm/index.native.js
CHANGED
|
@@ -19,8 +19,6 @@ function enable() {
|
|
|
19
19
|
return cb();
|
|
20
20
|
}), queuedUpdates.clear()));
|
|
21
21
|
}
|
|
22
|
-
var expectedFrameTime = 16.67,
|
|
23
|
-
numDroppedFramesUntilPause = 10;
|
|
24
22
|
function startGlobalIntersectionObserver() {
|
|
25
23
|
!isClient || globalIntersectionObserver || (globalIntersectionObserver = new IntersectionObserver(function (entries) {
|
|
26
24
|
entries.forEach(function (entry) {
|
|
@@ -33,24 +31,20 @@ function startGlobalIntersectionObserver() {
|
|
|
33
31
|
}
|
|
34
32
|
if (isClient) if (rAF) {
|
|
35
33
|
let layoutOnAnimationFrame = function () {
|
|
36
|
-
var now = Date.now(),
|
|
37
|
-
timeSinceLastFrame = now - lastFrameAt;
|
|
38
|
-
if (lastFrameAt = now, frameCount++, frameCount % RUN_EVERY_X_FRAMES === 0) {
|
|
39
|
-
frameCount = 0, rAF(layoutOnAnimationFrame);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
34
|
if (strategy !== "off") {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
36
|
+
rAF(layoutOnAnimationFrame);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach(function (node) {
|
|
40
|
+
updateLayoutIfChanged(node);
|
|
46
41
|
});
|
|
47
42
|
}
|
|
48
43
|
rAF(layoutOnAnimationFrame);
|
|
49
44
|
};
|
|
50
45
|
var layoutOnAnimationFrame2 = layoutOnAnimationFrame,
|
|
51
|
-
supportsCheckVisibility = "checkVisibility" in document.body
|
|
52
|
-
|
|
53
|
-
async function updateLayoutIfChanged(node, frameId) {
|
|
46
|
+
supportsCheckVisibility = "checkVisibility" in document.body;
|
|
47
|
+
async function updateLayoutIfChanged(node) {
|
|
54
48
|
if (IntersectionState.get(node) !== !1 && !(process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())) {
|
|
55
49
|
var onLayout = LayoutHandlers.get(node);
|
|
56
50
|
if (typeof onLayout == "function") {
|
|
@@ -59,7 +53,7 @@ if (isClient) if (rAF) {
|
|
|
59
53
|
var nodeRect, parentRect;
|
|
60
54
|
if (strategy === "async") {
|
|
61
55
|
var [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
|
|
62
|
-
if (nr === !1 || pr === !1
|
|
56
|
+
if (nr === !1 || pr === !1) return;
|
|
63
57
|
nodeRect = nr, parentRect = pr;
|
|
64
58
|
} else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
|
|
65
59
|
var cachedRect = NodeRectCache.get(node),
|
|
@@ -82,7 +76,7 @@ if (isClient) if (rAF) {
|
|
|
82
76
|
}
|
|
83
77
|
rAF(layoutOnAnimationFrame);
|
|
84
78
|
var frameCount = 0,
|
|
85
|
-
RUN_EVERY_X_FRAMES =
|
|
79
|
+
RUN_EVERY_X_FRAMES = 8;
|
|
86
80
|
} else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
87
81
|
var getElementLayoutEvent = function (nodeRect, parentRect) {
|
|
88
82
|
return {
|
|
@@ -173,7 +167,7 @@ function useElementLayout(ref, onLayout) {
|
|
|
173
167
|
if (onLayout) {
|
|
174
168
|
var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
|
|
175
169
|
if (node2) {
|
|
176
|
-
|
|
170
|
+
Nodes.add(node2), startGlobalIntersectionObserver(), globalIntersectionObserver && (globalIntersectionObserver.observe(node2), IntersectionState.set(node2, !0));
|
|
177
171
|
var parentNode = node2.parentNode;
|
|
178
172
|
return parentNode && onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect())), function () {
|
|
179
173
|
Nodes.delete(node2), LayoutHandlers.delete(node2), NodeRectCache.delete(node2), LastChangeTime.delete(node2), IntersectionState.delete(node2), globalIntersectionObserver && globalIntersectionObserver.unobserve(node2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","IntersectionState","globalIntersectionObserver","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","
|
|
1
|
+
{"version":3,"names":["isClient","useIsomorphicLayoutEffect","isEqualShallow","LayoutHandlers","WeakMap","Nodes","Set","IntersectionState","globalIntersectionObserver","strategy","setOnLayoutStrategy","state","NodeRectCache","ParentRectCache","LastChangeTime","rAF","window","requestAnimationFrame","avoidUpdates","queuedUpdates","Map","enable","forEach","cb","clear","startGlobalIntersectionObserver","IntersectionObserver","entries","entry","node","target","get","isIntersecting","set","threshold","layoutOnAnimationFrame","frameCount","RUN_EVERY_X_FRAMES","Number","MAX_SAFE_INTEGER","updateLayoutIfChanged","layoutOnAnimationFrame2","supportsCheckVisibility","document","body","process","env","TAMAGUI_ONLAYOUT_VISIBILITY_CHECK","checkVisibility","onLayout","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","cachedRect","cachedParentRect","event","getElementLayoutEvent","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","timeStamp","Date","now","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","observe","delete","unobserve","res","nodeType","io","disconnect","boundingClientRect"],"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.130.
|
|
3
|
+
"version": "1.130.5",
|
|
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.130.
|
|
35
|
-
"@tamagui/is-equal-shallow": "1.130.
|
|
34
|
+
"@tamagui/constants": "1.130.5",
|
|
35
|
+
"@tamagui/is-equal-shallow": "1.130.5"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@tamagui/build": "1.130.
|
|
38
|
+
"@tamagui/build": "1.130.5",
|
|
39
39
|
"react": "*"
|
|
40
40
|
},
|
|
41
41
|
"publishConfig": {
|
package/src/index.ts
CHANGED
|
@@ -58,9 +58,6 @@ export function enable(): void {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
const expectedFrameTime = 16.67 // ~60fps
|
|
62
|
-
const numDroppedFramesUntilPause = 10
|
|
63
|
-
|
|
64
61
|
function startGlobalIntersectionObserver() {
|
|
65
62
|
if (!isClient || globalIntersectionObserver) return
|
|
66
63
|
|
|
@@ -82,10 +79,8 @@ function startGlobalIntersectionObserver() {
|
|
|
82
79
|
if (isClient) {
|
|
83
80
|
if (rAF) {
|
|
84
81
|
const supportsCheckVisibility = 'checkVisibility' in document.body
|
|
85
|
-
// track frame timing to detect sync work and avoid updates during heavy periods
|
|
86
|
-
let lastFrameAt = Date.now()
|
|
87
82
|
|
|
88
|
-
async function updateLayoutIfChanged(node: HTMLElement
|
|
83
|
+
async function updateLayoutIfChanged(node: HTMLElement) {
|
|
89
84
|
if (IntersectionState.get(node) === false) {
|
|
90
85
|
// avoid due to not intersecting
|
|
91
86
|
return
|
|
@@ -117,11 +112,6 @@ if (isClient) {
|
|
|
117
112
|
return
|
|
118
113
|
}
|
|
119
114
|
|
|
120
|
-
// cancel if we skipped a frame
|
|
121
|
-
if (frameId !== lastFrameAt) {
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
|
|
125
115
|
nodeRect = nr
|
|
126
116
|
parentRect = pr
|
|
127
117
|
} else {
|
|
@@ -154,36 +144,29 @@ if (isClient) {
|
|
|
154
144
|
}
|
|
155
145
|
|
|
156
146
|
// note that getBoundingClientRect() does not thrash layout if its after an animation frame
|
|
147
|
+
// ok new note: *if* it needed recalc then yea, but browsers often skip that, so it does
|
|
148
|
+
// which is why we use async strategy in general
|
|
157
149
|
rAF!(layoutOnAnimationFrame)
|
|
158
150
|
|
|
159
151
|
// only run once in a few frames, this could be adjustable
|
|
160
152
|
let frameCount = 0
|
|
161
|
-
const RUN_EVERY_X_FRAMES =
|
|
153
|
+
const RUN_EVERY_X_FRAMES = 8
|
|
162
154
|
|
|
163
155
|
function layoutOnAnimationFrame() {
|
|
164
|
-
const now = Date.now()
|
|
165
|
-
const timeSinceLastFrame = now - lastFrameAt
|
|
166
|
-
lastFrameAt = now
|
|
167
|
-
|
|
168
|
-
frameCount++
|
|
169
|
-
|
|
170
|
-
if (frameCount % RUN_EVERY_X_FRAMES === 0) {
|
|
171
|
-
frameCount = 0
|
|
172
|
-
rAF!(layoutOnAnimationFrame)
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
|
|
176
156
|
if (strategy !== 'off') {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (!hasRecentSyncWork) {
|
|
183
|
-
Nodes.forEach((node) => {
|
|
184
|
-
updateLayoutIfChanged(node, lastFrameAt)
|
|
185
|
-
})
|
|
157
|
+
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
158
|
+
// skip a few frames to avoid work
|
|
159
|
+
rAF!(layoutOnAnimationFrame)
|
|
160
|
+
return
|
|
186
161
|
}
|
|
162
|
+
|
|
163
|
+
if (frameCount === Number.MAX_SAFE_INTEGER) {
|
|
164
|
+
frameCount = 0
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
Nodes.forEach((node) => {
|
|
168
|
+
updateLayoutIfChanged(node)
|
|
169
|
+
})
|
|
187
170
|
}
|
|
188
171
|
|
|
189
172
|
rAF!(layoutOnAnimationFrame)
|
|
@@ -297,7 +280,6 @@ export function useElementLayout(
|
|
|
297
280
|
const node = ref.current?.host
|
|
298
281
|
if (!node) return
|
|
299
282
|
|
|
300
|
-
LayoutHandlers.set(node, onLayout)
|
|
301
283
|
Nodes.add(node)
|
|
302
284
|
|
|
303
285
|
// Add node to intersection observer
|
package/types/index.d.ts.map
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"mappings": "AAEA,cAAc,iBAAiB,OAAO;KASjC,+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;AAYD,OAAO,iBAAS;
|
|
2
|
+
"mappings": "AAEA,cAAc,iBAAiB,OAAO;KASjC,+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;AAYD,OAAO,iBAAS;AAoIhB,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;AAgFlB,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>()\nconst IntersectionState = new WeakMap<HTMLElement, boolean>()\n\n// Single persistent IntersectionObserver for all nodes\nlet globalIntersectionObserver: IntersectionObserver | null = null\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 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\nfunction startGlobalIntersectionObserver() {\n if (!isClient || globalIntersectionObserver) return\n\n globalIntersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const node = entry.target as HTMLElement\n if (IntersectionState.get(node) !== entry.isIntersecting) {\n IntersectionState.set(node, entry.isIntersecting)\n }\n })\n },\n {\n threshold: 0,\n }\n )\n}\n\nif (isClient) {\n if (rAF) {\n const supportsCheckVisibility = 'checkVisibility' in document.body\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 if (IntersectionState.get(node) === false) {\n // avoid due to not intersecting\n return\n }\n // triggers style recalculation in safari which is slower than not\n if (process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === '1') {\n if (supportsCheckVisibility && !(node as any).checkVisibility()) {\n // avoid due to not visible\n return\n }\n }\n\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 if (nr === false || pr === false) {\n return\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 // @ts-expect-error DOMRectReadOnly can go into object\n (!isEqualShallow(cachedRect, nodeRect) &&\n // @ts-expect-error DOMRectReadOnly can go into object\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 RUN_EVERY_X_FRAMES = 4\n\n function layoutOnAnimationFrame() {\n const now = Date.now()\n const timeSinceLastFrame = now - lastFrameAt\n lastFrameAt = now\n\n frameCount++\n\n if (frameCount % RUN_EVERY_X_FRAMES === 0) {\n frameCount = 0\n rAF!(layoutOnAnimationFrame)\n return\n }\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 // Add node to intersection observer\n startGlobalIntersectionObserver()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(node)\n // Initialize as intersecting by default\n IntersectionState.set(node, true)\n }\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 IntersectionState.delete(node)\n\n // Remove from intersection observer\n if (globalIntersectionObserver) {\n globalIntersectionObserver.unobserve(node)\n }\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 | false> => {\n return new Promise<DOMRectReadOnly | false>((res) => {\n if (!node || node.nodeType !== 1) return res(false)\n\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>()\nconst IntersectionState = new WeakMap<HTMLElement, boolean>()\n\n// Single persistent IntersectionObserver for all nodes\nlet globalIntersectionObserver: IntersectionObserver | null = null\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 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\nfunction startGlobalIntersectionObserver() {\n if (!isClient || globalIntersectionObserver) return\n\n globalIntersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const node = entry.target as HTMLElement\n if (IntersectionState.get(node) !== entry.isIntersecting) {\n IntersectionState.set(node, entry.isIntersecting)\n }\n })\n },\n {\n threshold: 0,\n }\n )\n}\n\nif (isClient) {\n if (rAF) {\n const supportsCheckVisibility = 'checkVisibility' in document.body\n\n async function updateLayoutIfChanged(node: HTMLElement) {\n if (IntersectionState.get(node) === false) {\n // avoid due to not intersecting\n return\n }\n // triggers style recalculation in safari which is slower than not\n if (process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === '1') {\n if (supportsCheckVisibility && !(node as any).checkVisibility()) {\n // avoid due to not visible\n return\n }\n }\n\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 if (nr === false || pr === false) {\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 // @ts-expect-error DOMRectReadOnly can go into object\n (!isEqualShallow(cachedRect, nodeRect) &&\n // @ts-expect-error DOMRectReadOnly can go into object\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 // ok new note: *if* it needed recalc then yea, but browsers often skip that, so it does\n // which is why we use async strategy in general\n rAF!(layoutOnAnimationFrame)\n\n // only run once in a few frames, this could be adjustable\n let frameCount = 0\n const RUN_EVERY_X_FRAMES = 8\n\n function layoutOnAnimationFrame() {\n if (strategy !== 'off') {\n if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {\n // skip a few frames to avoid work\n rAF!(layoutOnAnimationFrame)\n return\n }\n\n if (frameCount === Number.MAX_SAFE_INTEGER) {\n frameCount = 0\n }\n\n Nodes.forEach((node) => {\n updateLayoutIfChanged(node)\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 Nodes.add(node)\n\n // Add node to intersection observer\n startGlobalIntersectionObserver()\n if (globalIntersectionObserver) {\n globalIntersectionObserver.observe(node)\n // Initialize as intersecting by default\n IntersectionState.set(node, true)\n }\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 IntersectionState.delete(node)\n\n // Remove from intersection observer\n if (globalIntersectionObserver) {\n globalIntersectionObserver.unobserve(node)\n }\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 | false> => {\n return new Promise<DOMRectReadOnly | false>((res) => {\n if (!node || node.nodeType !== 1) return res(false)\n\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
|
}
|