@tamagui/use-element-layout 1.132.2 → 1.132.3
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 +24 -14
- package/dist/cjs/index.js +29 -15
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +53 -15
- package/dist/cjs/index.native.js.map +2 -2
- package/dist/esm/index.js +29 -15
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +24 -14
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +56 -15
- package/dist/esm/index.native.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +28 -4
- package/types/index.d.ts.map +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -64,19 +64,8 @@ function startGlobalObservers() {
|
|
|
64
64
|
}));
|
|
65
65
|
}
|
|
66
66
|
if (import_constants.isClient) if (rAF) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
70
|
-
rAF(layoutOnAnimationFrame);
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach(node => {
|
|
74
|
-
updateLayoutIfChanged(node);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
rAF(layoutOnAnimationFrame);
|
|
78
|
-
};
|
|
79
|
-
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
67
|
+
const supportsCheckVisibility = "checkVisibility" in document.body,
|
|
68
|
+
BoundingRects = /* @__PURE__ */new WeakMap();
|
|
80
69
|
async function updateLayoutIfChanged(node) {
|
|
81
70
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility()) return;
|
|
82
71
|
const onLayout = LayoutHandlers.get(node);
|
|
@@ -85,7 +74,7 @@ if (import_constants.isClient) if (rAF) {
|
|
|
85
74
|
if (!parentNode) return;
|
|
86
75
|
let nodeRect, parentRect;
|
|
87
76
|
if (strategy === "async") {
|
|
88
|
-
const [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
|
|
77
|
+
const [nr, pr] = await Promise.all([BoundingRects.get(node) || getBoundingClientRectAsync(node), BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode)]);
|
|
89
78
|
if (nr === !1 || pr === !1) return;
|
|
90
79
|
nodeRect = nr, parentRect = pr;
|
|
91
80
|
} else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
|
|
@@ -106,6 +95,27 @@ if (import_constants.isClient) if (rAF) {
|
|
|
106
95
|
let frameCount = 0;
|
|
107
96
|
const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP,
|
|
108
97
|
RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10;
|
|
98
|
+
async function layoutOnAnimationFrame() {
|
|
99
|
+
if (strategy !== "off") {
|
|
100
|
+
if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
101
|
+
rAF(layoutOnAnimationFrame);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), await new Promise(res => {
|
|
105
|
+
const io = new IntersectionObserver(entries => {
|
|
106
|
+
io.disconnect();
|
|
107
|
+
for (const entry of entries) BoundingRects.set(entry.target, entry.boundingClientRect);
|
|
108
|
+
res();
|
|
109
|
+
}, {
|
|
110
|
+
threshold: 0
|
|
111
|
+
});
|
|
112
|
+
for (const node of Nodes) node.parentElement instanceof HTMLElement && (io.observe(node), io.observe(node.parentElement));
|
|
113
|
+
}), Nodes.forEach(node => {
|
|
114
|
+
updateLayoutIfChanged(node);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
rAF(layoutOnAnimationFrame);
|
|
118
|
+
}
|
|
109
119
|
} else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
110
120
|
const getElementLayoutEvent = (nodeRect, parentRect) => ({
|
|
111
121
|
nativeEvent: {
|
package/dist/cjs/index.js
CHANGED
|
@@ -55,19 +55,7 @@ function startGlobalObservers() {
|
|
|
55
55
|
}
|
|
56
56
|
if (import_constants.isClient)
|
|
57
57
|
if (rAF) {
|
|
58
|
-
|
|
59
|
-
if (strategy !== "off") {
|
|
60
|
-
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
61
|
-
rAF(layoutOnAnimationFrame);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), Nodes.forEach((node) => {
|
|
65
|
-
updateLayoutIfChanged(node);
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
rAF(layoutOnAnimationFrame);
|
|
69
|
-
};
|
|
70
|
-
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
58
|
+
const supportsCheckVisibility = "checkVisibility" in document.body, BoundingRects = /* @__PURE__ */ new WeakMap();
|
|
71
59
|
async function updateLayoutIfChanged(node) {
|
|
72
60
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())
|
|
73
61
|
return;
|
|
@@ -78,8 +66,8 @@ if (import_constants.isClient)
|
|
|
78
66
|
let nodeRect, parentRect;
|
|
79
67
|
if (strategy === "async") {
|
|
80
68
|
const [nr, pr] = await Promise.all([
|
|
81
|
-
getBoundingClientRectAsync(node),
|
|
82
|
-
getBoundingClientRectAsync(parentNode)
|
|
69
|
+
BoundingRects.get(node) || getBoundingClientRectAsync(node),
|
|
70
|
+
BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode)
|
|
83
71
|
]);
|
|
84
72
|
if (nr === !1 || pr === !1)
|
|
85
73
|
return;
|
|
@@ -99,6 +87,32 @@ if (import_constants.isClient)
|
|
|
99
87
|
rAF(layoutOnAnimationFrame);
|
|
100
88
|
let frameCount = 0;
|
|
101
89
|
const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP, RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10;
|
|
90
|
+
async function layoutOnAnimationFrame() {
|
|
91
|
+
if (strategy !== "off") {
|
|
92
|
+
if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
93
|
+
rAF(layoutOnAnimationFrame);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), await new Promise((res) => {
|
|
97
|
+
const io = new IntersectionObserver(
|
|
98
|
+
(entries) => {
|
|
99
|
+
io.disconnect();
|
|
100
|
+
for (const entry of entries)
|
|
101
|
+
BoundingRects.set(entry.target, entry.boundingClientRect);
|
|
102
|
+
res();
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
threshold: 0
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
for (const node of Nodes)
|
|
109
|
+
node.parentElement instanceof HTMLElement && (io.observe(node), io.observe(node.parentElement));
|
|
110
|
+
}), Nodes.forEach((node) => {
|
|
111
|
+
updateLayoutIfChanged(node);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
rAF(layoutOnAnimationFrame);
|
|
115
|
+
}
|
|
102
116
|
} else
|
|
103
117
|
process.env.NODE_ENV === "development" && console.warn(
|
|
104
118
|
"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;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,SAAS,uBAAuB;AAC9B,EAAI,CAAC,6BAAY,+BAEjB,6BAA6B,IAAI;AAAA,IAC/B,CAAC,YAAY;AACX,cAAQ,QAAQ,CAAC,UAAU;AACzB,cAAM,OAAO,MAAM;AACnB,QAAI,kBAAkB,IAAI,IAAI,MAAM,MAAM,kBACxC,kBAAkB,IAAI,MAAM,MAAM,cAAc;AAAA,MAEpD,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEA,IAAI;AACF,MAAI,KAAK;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["node"]
|
|
6
6
|
}
|
package/dist/cjs/index.native.js
CHANGED
|
@@ -51,19 +51,7 @@ function startGlobalObservers() {
|
|
|
51
51
|
}
|
|
52
52
|
if (import_constants.isClient)
|
|
53
53
|
if (rAF) {
|
|
54
|
-
|
|
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(function(node) {
|
|
61
|
-
updateLayoutIfChanged(node);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
rAF(layoutOnAnimationFrame);
|
|
65
|
-
};
|
|
66
|
-
var layoutOnAnimationFrame2 = layoutOnAnimationFrame, supportsCheckVisibility = "checkVisibility" in document.body;
|
|
54
|
+
var supportsCheckVisibility = "checkVisibility" in document.body, BoundingRects = /* @__PURE__ */ new WeakMap();
|
|
67
55
|
async function updateLayoutIfChanged(node) {
|
|
68
56
|
if (IntersectionState.get(node) !== !1 && !(process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())) {
|
|
69
57
|
var onLayout = LayoutHandlers.get(node);
|
|
@@ -73,8 +61,8 @@ if (import_constants.isClient)
|
|
|
73
61
|
var nodeRect, parentRect;
|
|
74
62
|
if (strategy === "async") {
|
|
75
63
|
var [nr, pr] = await Promise.all([
|
|
76
|
-
getBoundingClientRectAsync(node),
|
|
77
|
-
getBoundingClientRectAsync(parentNode)
|
|
64
|
+
BoundingRects.get(node) || getBoundingClientRectAsync(node),
|
|
65
|
+
BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode)
|
|
78
66
|
]);
|
|
79
67
|
if (nr === !1 || pr === !1)
|
|
80
68
|
return;
|
|
@@ -98,6 +86,56 @@ if (import_constants.isClient)
|
|
|
98
86
|
}
|
|
99
87
|
rAF(layoutOnAnimationFrame);
|
|
100
88
|
var frameCount = 0, userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP, RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10;
|
|
89
|
+
async function layoutOnAnimationFrame() {
|
|
90
|
+
if (strategy !== "off") {
|
|
91
|
+
if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
92
|
+
rAF(layoutOnAnimationFrame);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), await new Promise(function(res) {
|
|
96
|
+
var io = new IntersectionObserver(function(entries) {
|
|
97
|
+
io.disconnect();
|
|
98
|
+
var _iteratorNormalCompletion2 = !0, _didIteratorError2 = !1, _iteratorError2 = void 0;
|
|
99
|
+
try {
|
|
100
|
+
for (var _iterator2 = entries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
|
|
101
|
+
var entry = _step2.value;
|
|
102
|
+
BoundingRects.set(entry.target, entry.boundingClientRect);
|
|
103
|
+
}
|
|
104
|
+
} catch (err) {
|
|
105
|
+
_didIteratorError2 = !0, _iteratorError2 = err;
|
|
106
|
+
} finally {
|
|
107
|
+
try {
|
|
108
|
+
!_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
|
|
109
|
+
} finally {
|
|
110
|
+
if (_didIteratorError2)
|
|
111
|
+
throw _iteratorError2;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
res();
|
|
115
|
+
}, {
|
|
116
|
+
threshold: 0
|
|
117
|
+
}), _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0;
|
|
118
|
+
try {
|
|
119
|
+
for (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
120
|
+
var node = _step.value;
|
|
121
|
+
node.parentElement instanceof HTMLElement && (io.observe(node), io.observe(node.parentElement));
|
|
122
|
+
}
|
|
123
|
+
} catch (err) {
|
|
124
|
+
_didIteratorError = !0, _iteratorError = err;
|
|
125
|
+
} finally {
|
|
126
|
+
try {
|
|
127
|
+
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
128
|
+
} finally {
|
|
129
|
+
if (_didIteratorError)
|
|
130
|
+
throw _iteratorError;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}), Nodes.forEach(function(node) {
|
|
134
|
+
updateLayoutIfChanged(node);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
rAF(layoutOnAnimationFrame);
|
|
138
|
+
}
|
|
101
139
|
} else
|
|
102
140
|
process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
103
141
|
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,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,SAASC,uBAAAA;AACP,EAAI,CAACC,6BAAYnB,+BAEjBA,6BAA6B,IAAIoB,qBAC/B,SAACC,SAAAA;AACCA,YAAQN,QAAQ,SAACO,OAAAA;AACf,UAAMC,OAAOD,MAAME;AACnB,MAAIzB,kBAAkB0B,IAAIF,IAAAA,MAAUD,MAAMI,kBACxC3B,kBAAkB4B,IAAIJ,MAAMD,MAAMI,cAAc;IAEpD,CAAA;EACF,GACA;IACEE,WAAW;EACb,CAAA;AAEJ;AAEA,IAAIT;AACF,MAAIZ,KAAK;
|
|
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", "startGlobalObservers", "isClient", "IntersectionObserver", "entries", "entry", "node", "target", "get", "isIntersecting", "set", "threshold", "
|
|
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", "startGlobalObservers", "isClient", "IntersectionObserver", "entries", "entry", "node", "target", "get", "isIntersecting", "set", "threshold", "supportsCheckVisibility", "document", "body", "BoundingRects", "updateLayoutIfChanged", "process", "env", "TAMAGUI_ONLAYOUT_VISIBILITY_CHECK", "checkVisibility", "onLayout", "parentNode", "parentElement", "nodeRect", "parentRect", "nr", "pr", "Promise", "all", "getBoundingClientRectAsync", "getBoundingClientRect", "cachedRect", "cachedParentRect", "isEqualShallow", "event", "getElementLayoutEvent", "layoutOnAnimationFrame", "frameCount", "userSkipVal", "TAMAGUI_LAYOUT_FRAME_SKIP", "RUN_EVERY_X_FRAMES", "size", "Number", "MAX_SAFE_INTEGER", "res", "io", "disconnect", "_iteratorNormalCompletion", "_didIteratorError", "_iteratorError", "_iterator", "_step", "boundingClientRect", "HTMLElement", "observe", "NODE_ENV", "console", "warn", "nativeEvent", "layout", "getRelativeDimensions", "timeStamp", "Date", "now", "a", "b", "height", "left", "top", "width", "x", "y", "pageX", "pageY", "useElementLayout", "ref", "ensureWebElement", "current", "host", "useIsomorphicLayoutEffect", "add", "delete", "unobserve", "nodeType", "measureNode", "relativeTo", "relativeNode", "nodeDim", "relativeNodeDim", "measure", "callback", "out", "createMeasure", "measureInWindow", "createMeasureInWindow", "measureLayout", "createMeasureLayout"]
|
|
6
6
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -26,19 +26,7 @@ function startGlobalObservers() {
|
|
|
26
26
|
}
|
|
27
27
|
if (isClient)
|
|
28
28
|
if (rAF) {
|
|
29
|
-
|
|
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
|
-
});
|
|
38
|
-
}
|
|
39
|
-
rAF(layoutOnAnimationFrame);
|
|
40
|
-
};
|
|
41
|
-
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
29
|
+
const supportsCheckVisibility = "checkVisibility" in document.body, BoundingRects = /* @__PURE__ */ new WeakMap();
|
|
42
30
|
async function updateLayoutIfChanged(node) {
|
|
43
31
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())
|
|
44
32
|
return;
|
|
@@ -49,8 +37,8 @@ if (isClient)
|
|
|
49
37
|
let nodeRect, parentRect;
|
|
50
38
|
if (strategy === "async") {
|
|
51
39
|
const [nr, pr] = await Promise.all([
|
|
52
|
-
getBoundingClientRectAsync(node),
|
|
53
|
-
getBoundingClientRectAsync(parentNode)
|
|
40
|
+
BoundingRects.get(node) || getBoundingClientRectAsync(node),
|
|
41
|
+
BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode)
|
|
54
42
|
]);
|
|
55
43
|
if (nr === !1 || pr === !1)
|
|
56
44
|
return;
|
|
@@ -70,6 +58,32 @@ if (isClient)
|
|
|
70
58
|
rAF(layoutOnAnimationFrame);
|
|
71
59
|
let frameCount = 0;
|
|
72
60
|
const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP, RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10;
|
|
61
|
+
async function layoutOnAnimationFrame() {
|
|
62
|
+
if (strategy !== "off") {
|
|
63
|
+
if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
64
|
+
rAF(layoutOnAnimationFrame);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), await new Promise((res) => {
|
|
68
|
+
const io = new IntersectionObserver(
|
|
69
|
+
(entries) => {
|
|
70
|
+
io.disconnect();
|
|
71
|
+
for (const entry of entries)
|
|
72
|
+
BoundingRects.set(entry.target, entry.boundingClientRect);
|
|
73
|
+
res();
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
threshold: 0
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
for (const node of Nodes)
|
|
80
|
+
node.parentElement instanceof HTMLElement && (io.observe(node), io.observe(node.parentElement));
|
|
81
|
+
}), Nodes.forEach((node) => {
|
|
82
|
+
updateLayoutIfChanged(node);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
rAF(layoutOnAnimationFrame);
|
|
86
|
+
}
|
|
73
87
|
} else
|
|
74
88
|
process.env.NODE_ENV === "development" && console.warn(
|
|
75
89
|
"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,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,SAAS,uBAAuB;AAC9B,EAAI,CAAC,YAAY,+BAEjB,6BAA6B,IAAI;AAAA,IAC/B,CAAC,YAAY;AACX,cAAQ,QAAQ,CAAC,UAAU;AACzB,cAAM,OAAO,MAAM;AACnB,QAAI,kBAAkB,IAAI,IAAI,MAAM,MAAM,kBACxC,kBAAkB,IAAI,MAAM,MAAM,cAAc;AAAA,MAEpD,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEA,IAAI;AACF,MAAI,KAAK;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["node"]
|
|
6
6
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -28,19 +28,8 @@ function startGlobalObservers() {
|
|
|
28
28
|
}));
|
|
29
29
|
}
|
|
30
30
|
if (isClient) if (rAF) {
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
});
|
|
40
|
-
}
|
|
41
|
-
rAF(layoutOnAnimationFrame);
|
|
42
|
-
};
|
|
43
|
-
const supportsCheckVisibility = "checkVisibility" in document.body;
|
|
31
|
+
const supportsCheckVisibility = "checkVisibility" in document.body,
|
|
32
|
+
BoundingRects = /* @__PURE__ */new WeakMap();
|
|
44
33
|
async function updateLayoutIfChanged(node) {
|
|
45
34
|
if (IntersectionState.get(node) === !1 || process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility()) return;
|
|
46
35
|
const onLayout = LayoutHandlers.get(node);
|
|
@@ -49,7 +38,7 @@ if (isClient) if (rAF) {
|
|
|
49
38
|
if (!parentNode) return;
|
|
50
39
|
let nodeRect, parentRect;
|
|
51
40
|
if (strategy === "async") {
|
|
52
|
-
const [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
|
|
41
|
+
const [nr, pr] = await Promise.all([BoundingRects.get(node) || getBoundingClientRectAsync(node), BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode)]);
|
|
53
42
|
if (nr === !1 || pr === !1) return;
|
|
54
43
|
nodeRect = nr, parentRect = pr;
|
|
55
44
|
} else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
|
|
@@ -70,6 +59,27 @@ if (isClient) if (rAF) {
|
|
|
70
59
|
let frameCount = 0;
|
|
71
60
|
const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP,
|
|
72
61
|
RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10;
|
|
62
|
+
async function layoutOnAnimationFrame() {
|
|
63
|
+
if (strategy !== "off") {
|
|
64
|
+
if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
65
|
+
rAF(layoutOnAnimationFrame);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), await new Promise(res => {
|
|
69
|
+
const io = new IntersectionObserver(entries => {
|
|
70
|
+
io.disconnect();
|
|
71
|
+
for (const entry of entries) BoundingRects.set(entry.target, entry.boundingClientRect);
|
|
72
|
+
res();
|
|
73
|
+
}, {
|
|
74
|
+
threshold: 0
|
|
75
|
+
});
|
|
76
|
+
for (const node of Nodes) node.parentElement instanceof HTMLElement && (io.observe(node), io.observe(node.parentElement));
|
|
77
|
+
}), Nodes.forEach(node => {
|
|
78
|
+
updateLayoutIfChanged(node);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
rAF(layoutOnAnimationFrame);
|
|
82
|
+
}
|
|
73
83
|
} else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
74
84
|
const getElementLayoutEvent = (nodeRect, parentRect) => ({
|
|
75
85
|
nativeEvent: {
|
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","startGlobalObservers","IntersectionObserver","entries","entry","node","target","get","isIntersecting","set","threshold","
|
|
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","startGlobalObservers","IntersectionObserver","entries","entry","node","target","get","isIntersecting","set","threshold","supportsCheckVisibility","document","body","BoundingRects","updateLayoutIfChanged","process","env","TAMAGUI_ONLAYOUT_VISIBILITY_CHECK","checkVisibility","onLayout","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","cachedRect","cachedParentRect","event","getElementLayoutEvent","layoutOnAnimationFrame","frameCount","userSkipVal","TAMAGUI_LAYOUT_FRAME_SKIP","RUN_EVERY_X_FRAMES","size","Number","MAX_SAFE_INTEGER","res","io","disconnect","boundingClientRect","HTMLElement","observe","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","timeStamp","Date","now","a","b","height","left","top","width","x","y","pageX","pageY","useElementLayout","ref","ensureWebElement","current","host","node2","add","delete","unobserve","nodeType","measureNode","relativeTo","relativeNode","nodeDim","relativeNodeDim","measure","callback","out","createMeasure","measureInWindow","createMeasureInWindow","measureLayout","createMeasureLayout"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/esm/index.native.js
CHANGED
|
@@ -30,20 +30,8 @@ function startGlobalObservers() {
|
|
|
30
30
|
}));
|
|
31
31
|
}
|
|
32
32
|
if (isClient) if (rAF) {
|
|
33
|
-
|
|
34
|
-
|
|
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);
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
rAF(layoutOnAnimationFrame);
|
|
44
|
-
};
|
|
45
|
-
var layoutOnAnimationFrame2 = layoutOnAnimationFrame,
|
|
46
|
-
supportsCheckVisibility = "checkVisibility" in document.body;
|
|
33
|
+
var supportsCheckVisibility = "checkVisibility" in document.body,
|
|
34
|
+
BoundingRects = /* @__PURE__ */new WeakMap();
|
|
47
35
|
async function updateLayoutIfChanged(node) {
|
|
48
36
|
if (IntersectionState.get(node) !== !1 && !(process.env.TAMAGUI_ONLAYOUT_VISIBILITY_CHECK === "1" && supportsCheckVisibility && !node.checkVisibility())) {
|
|
49
37
|
var onLayout = LayoutHandlers.get(node);
|
|
@@ -52,7 +40,7 @@ if (isClient) if (rAF) {
|
|
|
52
40
|
if (parentNode) {
|
|
53
41
|
var nodeRect, parentRect;
|
|
54
42
|
if (strategy === "async") {
|
|
55
|
-
var [nr, pr] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(parentNode)]);
|
|
43
|
+
var [nr, pr] = await Promise.all([BoundingRects.get(node) || getBoundingClientRectAsync(node), BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode)]);
|
|
56
44
|
if (nr === !1 || pr === !1) return;
|
|
57
45
|
nodeRect = nr, parentRect = pr;
|
|
58
46
|
} else nodeRect = node.getBoundingClientRect(), parentRect = parentNode.getBoundingClientRect();
|
|
@@ -78,6 +66,59 @@ if (isClient) if (rAF) {
|
|
|
78
66
|
var frameCount = 0,
|
|
79
67
|
userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP,
|
|
80
68
|
RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10;
|
|
69
|
+
async function layoutOnAnimationFrame() {
|
|
70
|
+
if (strategy !== "off") {
|
|
71
|
+
if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
72
|
+
rAF(layoutOnAnimationFrame);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
frameCount === Number.MAX_SAFE_INTEGER && (frameCount = 0), await new Promise(function (res) {
|
|
76
|
+
var io = new IntersectionObserver(function (entries) {
|
|
77
|
+
io.disconnect();
|
|
78
|
+
var _iteratorNormalCompletion2 = !0,
|
|
79
|
+
_didIteratorError2 = !1,
|
|
80
|
+
_iteratorError2 = void 0;
|
|
81
|
+
try {
|
|
82
|
+
for (var _iterator2 = entries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
|
|
83
|
+
var entry = _step2.value;
|
|
84
|
+
BoundingRects.set(entry.target, entry.boundingClientRect);
|
|
85
|
+
}
|
|
86
|
+
} catch (err) {
|
|
87
|
+
_didIteratorError2 = !0, _iteratorError2 = err;
|
|
88
|
+
} finally {
|
|
89
|
+
try {
|
|
90
|
+
!_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
|
|
91
|
+
} finally {
|
|
92
|
+
if (_didIteratorError2) throw _iteratorError2;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
res();
|
|
96
|
+
}, {
|
|
97
|
+
threshold: 0
|
|
98
|
+
}),
|
|
99
|
+
_iteratorNormalCompletion = !0,
|
|
100
|
+
_didIteratorError = !1,
|
|
101
|
+
_iteratorError = void 0;
|
|
102
|
+
try {
|
|
103
|
+
for (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
104
|
+
var node = _step.value;
|
|
105
|
+
node.parentElement instanceof HTMLElement && (io.observe(node), io.observe(node.parentElement));
|
|
106
|
+
}
|
|
107
|
+
} catch (err) {
|
|
108
|
+
_didIteratorError = !0, _iteratorError = err;
|
|
109
|
+
} finally {
|
|
110
|
+
try {
|
|
111
|
+
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
112
|
+
} finally {
|
|
113
|
+
if (_didIteratorError) throw _iteratorError;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}), Nodes.forEach(function (node) {
|
|
117
|
+
updateLayoutIfChanged(node);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
rAF(layoutOnAnimationFrame);
|
|
121
|
+
}
|
|
81
122
|
} else process.env.NODE_ENV === "development" && console.warn("No requestAnimationFrame - please polyfill for onLayout to work correctly");
|
|
82
123
|
var getElementLayoutEvent = function (nodeRect, parentRect) {
|
|
83
124
|
return {
|
|
@@ -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","startGlobalObservers","IntersectionObserver","entries","entry","node","target","get","isIntersecting","set","threshold","
|
|
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","startGlobalObservers","IntersectionObserver","entries","entry","node","target","get","isIntersecting","set","threshold","supportsCheckVisibility","document","body","BoundingRects","updateLayoutIfChanged","process","env","TAMAGUI_ONLAYOUT_VISIBILITY_CHECK","checkVisibility","onLayout","parentNode","parentElement","nodeRect","parentRect","nr","pr","Promise","all","getBoundingClientRectAsync","getBoundingClientRect","cachedRect","cachedParentRect","event","getElementLayoutEvent","layoutOnAnimationFrame","frameCount","userSkipVal","TAMAGUI_LAYOUT_FRAME_SKIP","RUN_EVERY_X_FRAMES","size","Number","MAX_SAFE_INTEGER","res","io","disconnect","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_iterator2","Symbol","iterator","_step2","next","done","value","boundingClientRect","err","return","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","_step","HTMLElement","observe","NODE_ENV","console","warn","nativeEvent","layout","getRelativeDimensions","timeStamp","Date","now","a","b","height","left","top","width","x","y","pageX","pageY","useElementLayout","ref","_ref_current","ensureWebElement","current","host","_ref_current2","node2","add","delete","unobserve","nodeType"],"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.132.
|
|
3
|
+
"version": "1.132.3",
|
|
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.132.
|
|
35
|
-
"@tamagui/is-equal-shallow": "1.132.
|
|
34
|
+
"@tamagui/constants": "1.132.3",
|
|
35
|
+
"@tamagui/is-equal-shallow": "1.132.3"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@tamagui/build": "1.132.
|
|
38
|
+
"@tamagui/build": "1.132.3",
|
|
39
39
|
"react": "*"
|
|
40
40
|
},
|
|
41
41
|
"publishConfig": {
|
package/src/index.ts
CHANGED
|
@@ -80,6 +80,8 @@ if (isClient) {
|
|
|
80
80
|
if (rAF) {
|
|
81
81
|
const supportsCheckVisibility = 'checkVisibility' in document.body
|
|
82
82
|
|
|
83
|
+
const BoundingRects = new WeakMap<any, DOMRectReadOnly | undefined>()
|
|
84
|
+
|
|
83
85
|
async function updateLayoutIfChanged(node: HTMLElement) {
|
|
84
86
|
if (IntersectionState.get(node) === false) {
|
|
85
87
|
// avoid due to not intersecting
|
|
@@ -104,8 +106,8 @@ if (isClient) {
|
|
|
104
106
|
|
|
105
107
|
if (strategy === 'async') {
|
|
106
108
|
const [nr, pr] = await Promise.all([
|
|
107
|
-
getBoundingClientRectAsync(node),
|
|
108
|
-
getBoundingClientRectAsync(parentNode),
|
|
109
|
+
BoundingRects.get(node) || getBoundingClientRectAsync(node),
|
|
110
|
+
BoundingRects.get(parentNode) || getBoundingClientRectAsync(parentNode),
|
|
109
111
|
])
|
|
110
112
|
|
|
111
113
|
if (nr === false || pr === false) {
|
|
@@ -154,9 +156,9 @@ if (isClient) {
|
|
|
154
156
|
const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP
|
|
155
157
|
const RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10
|
|
156
158
|
|
|
157
|
-
function layoutOnAnimationFrame() {
|
|
159
|
+
async function layoutOnAnimationFrame() {
|
|
158
160
|
if (strategy !== 'off') {
|
|
159
|
-
if (frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
161
|
+
if (!Nodes.size || frameCount++ % RUN_EVERY_X_FRAMES !== 0) {
|
|
160
162
|
// skip a few frames to avoid work
|
|
161
163
|
rAF!(layoutOnAnimationFrame)
|
|
162
164
|
return
|
|
@@ -166,6 +168,28 @@ if (isClient) {
|
|
|
166
168
|
frameCount = 0
|
|
167
169
|
}
|
|
168
170
|
|
|
171
|
+
// do a 1 rather than N IntersectionObservers for performance
|
|
172
|
+
await new Promise<void>((res) => {
|
|
173
|
+
const io = new IntersectionObserver(
|
|
174
|
+
(entries) => {
|
|
175
|
+
io.disconnect()
|
|
176
|
+
for (const entry of entries) {
|
|
177
|
+
BoundingRects.set(entry.target, entry.boundingClientRect)
|
|
178
|
+
}
|
|
179
|
+
res()
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
threshold: 0,
|
|
183
|
+
}
|
|
184
|
+
)
|
|
185
|
+
for (const node of Nodes) {
|
|
186
|
+
if (node.parentElement instanceof HTMLElement) {
|
|
187
|
+
io.observe(node)
|
|
188
|
+
io.observe(node.parentElement)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
|
|
169
193
|
Nodes.forEach((node) => {
|
|
170
194
|
updateLayoutIfChanged(node)
|
|
171
195
|
})
|
package/types/index.d.ts.map
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"mappings": "AAEA,cAA2B,iBAAiB,OAAO;KAS9C,+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,cAA2B,iBAAiB,OAAO;KAS9C,+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;AA8JhB,OAAO,cAAM,wBACXC,UAAU,iBACVC,YAAY,oBACX;AAiBH,OAAO,iBAAS,iBACdC,KAAK,UAAU,+BACfC,aAAaC,GAAG;AAwDlB,OAAO,cAAM,6BACXC,MAAM,uBACL,QAAQ,kBAAkB;AAiB7B,OAAO,cAAM,cACXC,MAAM,aACNC,aAAa,uBACZ,eAAe;KAcb,qBAAqBC,WAAWC,WAAWC,eAAeC;KAE1D,aACHH,WACAC,WACAC,eACAC,gBACAC,eACAC;AAGF,OAAO,cAAM,UACXP,MAAM,aACNQ,UAAU,cACT,QAAQ;AAWX,OAAO,iBAAS,cACdR,MAAM,eACJQ,UAAU,cAAc,QAAQ;KAI/B,eAAe;CAAE;CAAe;CAAe;CAAe;AAAgB;AAEnF,OAAO,cAAM,kBACXR,MAAM,aACNS,UAAU,sBACT,QAAQ;AAQX,OAAO,cAAM,wBACXT,MAAM,kBACHS,UAAU,sBAAsB,QAAQ;AAI7C,OAAO,cAAM,gBACXT,MAAM,aACNU,cAAc,aACdF,UAAU,cACT,QAAQ;AAQX,OAAO,iBAAS,oBACdR,MAAM,eACJW,YAAY,aAAaH,UAAU,cAAc,QAAQ",
|
|
3
3
|
"names": [
|
|
4
4
|
"state: LayoutMeasurementStrategy",
|
|
5
5
|
"nodeRect: DOMRectReadOnly",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"src/index.ts"
|
|
26
26
|
],
|
|
27
27
|
"sourcesContent": [
|
|
28
|
-
"import { isClient, useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { isEqualShallow } from '@tamagui/is-equal-shallow'\nimport { useCallback, 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 pageX: number\n pageY: 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 startGlobalObservers() {\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\n const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP\n const RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10\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\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, pageX: a.left, pageY: a.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 startGlobalObservers()\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\nexport const 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\nexport const measureNode = 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 if (relativeNodeDim && nodeDim) {\n return getRelativeDimensions(nodeDim, relativeNodeDim)\n }\n }\n return null\n}\n\ntype MeasureInWindowCb = (x: number, y: number, width: number, height: number) => void\n\ntype MeasureCb = (\n x: number,\n y: number,\n width: number,\n height: number,\n pageX: number,\n pageY: number\n) => void\n\nexport const measure = async (\n node: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(\n node,\n node.parentNode instanceof HTMLElement ? node.parentNode : null\n )\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasure(\n node: HTMLElement\n): (callback: MeasureCb) => Promise<LayoutValue | null> {\n return (callback) => measure(node, callback)\n}\n\ntype WindowLayout = { pageX: number; pageY: number; width: number; height: number }\n\nexport const measureInWindow = async (\n node: HTMLElement,\n callback: MeasureInWindowCb\n): Promise<WindowLayout | null> => {\n const out = await measureNode(node, null)\n if (out) {\n callback?.(out.pageX, out.pageY, out.width, out.height)\n }\n return out\n}\n\nexport const createMeasureInWindow = (\n node: HTMLElement\n): ((callback: MeasureInWindowCb) => Promise<WindowLayout | null>) => {\n return (callback) => measureInWindow(node, callback)\n}\n\nexport const measureLayout = async (\n node: HTMLElement,\n relativeNode: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(node, relativeNode)\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasureLayout(\n node: HTMLElement\n): (relativeTo: HTMLElement, callback: MeasureCb) => Promise<LayoutValue | null> {\n return (relativeTo, callback) => measureLayout(node, relativeTo, callback)\n}\n"
|
|
28
|
+
"import { isClient, useIsomorphicLayoutEffect } from '@tamagui/constants'\nimport { isEqualShallow } from '@tamagui/is-equal-shallow'\nimport { useCallback, 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 pageX: number\n pageY: 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 startGlobalObservers() {\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 const BoundingRects = new WeakMap<any, DOMRectReadOnly | undefined>()\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 BoundingRects.get(node) || getBoundingClientRectAsync(node),\n BoundingRects.get(parentNode) || 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\n const userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP\n const RUN_EVERY_X_FRAMES = userSkipVal ? +userSkipVal : 10\n\n async function layoutOnAnimationFrame() {\n if (strategy !== 'off') {\n if (!Nodes.size || 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 // do a 1 rather than N IntersectionObservers for performance\n await new Promise<void>((res) => {\n const io = new IntersectionObserver(\n (entries) => {\n io.disconnect()\n for (const entry of entries) {\n BoundingRects.set(entry.target, entry.boundingClientRect)\n }\n res()\n },\n {\n threshold: 0,\n }\n )\n for (const node of Nodes) {\n if (node.parentElement instanceof HTMLElement) {\n io.observe(node)\n io.observe(node.parentElement)\n }\n }\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\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, pageX: a.left, pageY: a.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 startGlobalObservers()\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\nexport const 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\nexport const measureNode = 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 if (relativeNodeDim && nodeDim) {\n return getRelativeDimensions(nodeDim, relativeNodeDim)\n }\n }\n return null\n}\n\ntype MeasureInWindowCb = (x: number, y: number, width: number, height: number) => void\n\ntype MeasureCb = (\n x: number,\n y: number,\n width: number,\n height: number,\n pageX: number,\n pageY: number\n) => void\n\nexport const measure = async (\n node: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(\n node,\n node.parentNode instanceof HTMLElement ? node.parentNode : null\n )\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasure(\n node: HTMLElement\n): (callback: MeasureCb) => Promise<LayoutValue | null> {\n return (callback) => measure(node, callback)\n}\n\ntype WindowLayout = { pageX: number; pageY: number; width: number; height: number }\n\nexport const measureInWindow = async (\n node: HTMLElement,\n callback: MeasureInWindowCb\n): Promise<WindowLayout | null> => {\n const out = await measureNode(node, null)\n if (out) {\n callback?.(out.pageX, out.pageY, out.width, out.height)\n }\n return out\n}\n\nexport const createMeasureInWindow = (\n node: HTMLElement\n): ((callback: MeasureInWindowCb) => Promise<WindowLayout | null>) => {\n return (callback) => measureInWindow(node, callback)\n}\n\nexport const measureLayout = async (\n node: HTMLElement,\n relativeNode: HTMLElement,\n callback: MeasureCb\n): Promise<LayoutValue | null> => {\n const out = await measureNode(node, relativeNode)\n if (out) {\n callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY)\n }\n return out\n}\n\nexport function createMeasureLayout(\n node: HTMLElement\n): (relativeTo: HTMLElement, callback: MeasureCb) => Promise<LayoutValue | null> {\n return (relativeTo, callback) => measureLayout(node, relativeTo, callback)\n}\n"
|
|
29
29
|
],
|
|
30
30
|
"version": 3
|
|
31
31
|
}
|