@tamagui/use-element-layout 2.0.0-rc.4 → 2.0.0-rc.40
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 +282 -132
- package/dist/cjs/index.native.js +356 -197
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/esm/index.js +265 -125
- package/dist/esm/index.js.map +1 -6
- package/dist/esm/index.mjs +267 -120
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +341 -185
- package/dist/esm/index.native.js.map +1 -1
- package/package.json +7 -10
- package/src/index.tsx +280 -89
- package/types/index.d.ts +2 -1
- package/types/index.d.ts.map +4 -4
- package/dist/cjs/index.js +0 -198
- package/dist/cjs/index.js.map +0 -6
package/dist/cjs/index.native.js
CHANGED
|
@@ -5,20 +5,22 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
7
|
var __export = (target, all) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
for (var name in all) __defProp(target, name, {
|
|
9
|
+
get: all[name],
|
|
10
|
+
enumerable: true
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
15
16
|
get: () => from[key],
|
|
16
17
|
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
17
18
|
});
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
20
22
|
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
21
|
-
value:
|
|
23
|
+
value: true
|
|
22
24
|
}), mod);
|
|
23
25
|
var index_exports = {};
|
|
24
26
|
__export(index_exports, {
|
|
@@ -33,242 +35,399 @@ __export(index_exports, {
|
|
|
33
35
|
measureInWindow: () => measureInWindow,
|
|
34
36
|
measureLayout: () => measureLayout,
|
|
35
37
|
measureNode: () => measureNode,
|
|
38
|
+
registerLayoutNode: () => registerLayoutNode,
|
|
36
39
|
setOnLayoutStrategy: () => setOnLayoutStrategy,
|
|
37
40
|
useElementLayout: () => useElementLayout
|
|
38
41
|
});
|
|
39
42
|
module.exports = __toCommonJS(index_exports);
|
|
40
|
-
var import_jsx_runtime = require("react/jsx-runtime")
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
import_react = require("react");
|
|
43
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
44
|
+
var import_constants = require("@tamagui/constants");
|
|
45
|
+
var import_react = require("react");
|
|
44
46
|
function _instanceof(left, right) {
|
|
45
|
-
|
|
47
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) return !!right[Symbol.hasInstance](left);else return left instanceof right;
|
|
46
48
|
}
|
|
47
|
-
var LayoutHandlers = /* @__PURE__ */new WeakMap()
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
49
|
+
var LayoutHandlers = /* @__PURE__ */new WeakMap();
|
|
50
|
+
var LayoutDisableKey = /* @__PURE__ */new WeakMap();
|
|
51
|
+
var Nodes = /* @__PURE__ */new Set();
|
|
52
|
+
var IntersectionState = /* @__PURE__ */new WeakMap();
|
|
53
|
+
var usePretransformDimensions = function () {
|
|
54
|
+
return globalThis.__TAMAGUI_ONLAYOUT_PRETRANSFORM === true || process.env.TAMAGUI_ONLAYOUT_PRETRANSFORM === "1";
|
|
55
|
+
};
|
|
56
|
+
var _debugLayout;
|
|
57
|
+
function isDebugLayout() {
|
|
58
|
+
if (_debugLayout === void 0) _debugLayout = typeof window !== "undefined" && new URLSearchParams(window.location.search).has("__tamaDebugLayout");
|
|
59
|
+
return _debugLayout;
|
|
60
|
+
}
|
|
61
|
+
var DisableLayoutContextValues = {};
|
|
62
|
+
var DisableLayoutContextKey = /* @__PURE__ */(0, import_react.createContext)("");
|
|
63
|
+
var ENABLE = false;
|
|
64
|
+
var LayoutMeasurementController = function (param) {
|
|
65
|
+
var {
|
|
66
|
+
disable,
|
|
67
|
+
children
|
|
68
|
+
} = param;
|
|
69
|
+
var id = (0, import_react.useId)();
|
|
70
|
+
(0, import_constants.useIsomorphicLayoutEffect)(function () {
|
|
71
|
+
DisableLayoutContextValues[id] = disable;
|
|
72
|
+
}, [disable, id]);
|
|
73
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(DisableLayoutContextKey.Provider, {
|
|
74
|
+
value: id,
|
|
75
|
+
children
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
var globalIntersectionObserver = null;
|
|
79
|
+
var strategy = "async";
|
|
69
80
|
function setOnLayoutStrategy(state) {
|
|
70
81
|
strategy = state;
|
|
71
82
|
}
|
|
72
|
-
var NodeRectCache = /* @__PURE__ */new WeakMap()
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
queuedUpdates = /* @__PURE__ */new Map();
|
|
83
|
+
var NodeRectCache = /* @__PURE__ */new WeakMap();
|
|
84
|
+
var avoidUpdates = true;
|
|
85
|
+
var queuedUpdates = /* @__PURE__ */new Map();
|
|
76
86
|
function enable() {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
87
|
+
if (avoidUpdates) {
|
|
88
|
+
avoidUpdates = false;
|
|
89
|
+
if (queuedUpdates) {
|
|
90
|
+
queuedUpdates.forEach(function (cb) {
|
|
91
|
+
return cb();
|
|
92
|
+
});
|
|
93
|
+
queuedUpdates.clear();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
80
96
|
}
|
|
81
97
|
function startGlobalObservers() {
|
|
82
|
-
!ENABLE || globalIntersectionObserver
|
|
83
|
-
|
|
98
|
+
if (!ENABLE || globalIntersectionObserver) return;
|
|
99
|
+
globalIntersectionObserver = new IntersectionObserver(function (entries) {
|
|
100
|
+
for (var i = 0; i < entries.length; i++) {
|
|
101
|
+
var entry = entries[i];
|
|
84
102
|
var node = entry.target;
|
|
85
|
-
IntersectionState.get(node) !== entry.isIntersecting
|
|
86
|
-
}
|
|
103
|
+
if (IntersectionState.get(node) !== entry.isIntersecting) IntersectionState.set(node, entry.isIntersecting);
|
|
104
|
+
}
|
|
87
105
|
}, {
|
|
88
106
|
threshold: 0
|
|
89
|
-
})
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function rectsEqual(a, b) {
|
|
110
|
+
return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
|
|
90
111
|
}
|
|
91
112
|
if (ENABLE) {
|
|
113
|
+
let ensureRectFetchObserver = function () {
|
|
114
|
+
if (rectFetchObserver) return rectFetchObserver;
|
|
115
|
+
rectFetchObserver = new IntersectionObserver(function (entries) {
|
|
116
|
+
lastCallbackDelay = Math.round(performance.now() - rectFetchStartTime);
|
|
117
|
+
for (var i = 0; i < entries.length; i++) BoundingRects.set(entries[i].target, entries[i].boundingClientRect);
|
|
118
|
+
if (process.env.NODE_ENV === "development" && isDebugLayout() && lastCallbackDelay > 50) console.warn("[onLayout-io-delay]", lastCallbackDelay + "ms", entries.length, "entries");
|
|
119
|
+
if (rectFetchResolve) {
|
|
120
|
+
rectFetchResolve(true);
|
|
121
|
+
rectFetchResolve = null;
|
|
122
|
+
}
|
|
123
|
+
}, {
|
|
124
|
+
threshold: 0
|
|
125
|
+
});
|
|
126
|
+
return rectFetchObserver;
|
|
127
|
+
};
|
|
92
128
|
var BoundingRects = /* @__PURE__ */new WeakMap();
|
|
129
|
+
var rectFetchObserver = null;
|
|
130
|
+
var rectFetchResolve = null;
|
|
131
|
+
var rectFetchStartTime = 0;
|
|
132
|
+
var lastCallbackDelay = 0;
|
|
93
133
|
async function updateLayoutIfChanged(node) {
|
|
94
134
|
var onLayout = LayoutHandlers.get(node);
|
|
95
|
-
if (typeof onLayout
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
135
|
+
if (typeof onLayout !== "function") return;
|
|
136
|
+
var parentNode = node.parentElement;
|
|
137
|
+
if (!parentNode) return;
|
|
138
|
+
var nodeRect;
|
|
139
|
+
var parentRect;
|
|
140
|
+
if (strategy === "async") {
|
|
141
|
+
nodeRect = BoundingRects.get(node);
|
|
142
|
+
parentRect = BoundingRects.get(parentNode);
|
|
143
|
+
if (!nodeRect || !parentRect) return;
|
|
144
|
+
} else {
|
|
145
|
+
nodeRect = node.getBoundingClientRect();
|
|
146
|
+
parentRect = parentNode.getBoundingClientRect();
|
|
147
|
+
}
|
|
148
|
+
var cachedRect = NodeRectCache.get(node);
|
|
149
|
+
var cachedParentRect = NodeRectCache.get(parentNode);
|
|
150
|
+
var nodeChanged = !cachedRect || !rectsEqual(cachedRect, nodeRect);
|
|
151
|
+
var parentChanged = !cachedParentRect || !rectsEqual(cachedParentRect, parentRect);
|
|
152
|
+
if (nodeChanged || parentChanged) {
|
|
153
|
+
NodeRectCache.set(node, nodeRect);
|
|
154
|
+
NodeRectCache.set(parentNode, parentRect);
|
|
155
|
+
var event = getElementLayoutEvent(nodeRect, parentRect, node);
|
|
156
|
+
if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] change", {
|
|
157
|
+
tag: node.tagName,
|
|
158
|
+
id: node.id || void 0,
|
|
159
|
+
className: (node.className || "").slice(0, 60) || void 0,
|
|
160
|
+
layout: event.nativeEvent.layout,
|
|
161
|
+
first: !cachedRect
|
|
162
|
+
});
|
|
163
|
+
if (avoidUpdates) queuedUpdates.set(node, function () {
|
|
164
|
+
return onLayout(event);
|
|
165
|
+
});else onLayout(event);
|
|
121
166
|
}
|
|
122
167
|
}
|
|
123
|
-
var
|
|
124
|
-
|
|
168
|
+
var rAF = typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : void 0;
|
|
169
|
+
var userSkipVal = process.env.TAMAGUI_LAYOUT_FRAME_SKIP;
|
|
170
|
+
var BASE_SKIP_FRAMES = userSkipVal ? +userSkipVal : 10;
|
|
171
|
+
var MAX_SKIP_FRAMES = 20;
|
|
172
|
+
var skipFrames = BASE_SKIP_FRAMES;
|
|
173
|
+
var frameCount = 0;
|
|
125
174
|
async function layoutOnAnimationFrame() {
|
|
175
|
+
if (frameCount++ % skipFrames !== 0) {
|
|
176
|
+
rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (frameCount >= Number.MAX_SAFE_INTEGER) frameCount = 0;
|
|
126
180
|
if (strategy !== "off") {
|
|
127
|
-
var visibleNodes = []
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
181
|
+
var visibleNodes = [];
|
|
182
|
+
var parentsToObserve = /* @__PURE__ */new Set();
|
|
183
|
+
var _iteratorNormalCompletion = true,
|
|
184
|
+
_didIteratorError = false,
|
|
185
|
+
_iteratorError = void 0;
|
|
186
|
+
try {
|
|
187
|
+
for (var _iterator = Nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
188
|
+
var node = _step.value;
|
|
189
|
+
var parentElement = node.parentElement;
|
|
190
|
+
if (!_instanceof(parentElement, HTMLElement)) {
|
|
191
|
+
cleanupNode(node);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
var disableKey = LayoutDisableKey.get(node);
|
|
195
|
+
if (disableKey && DisableLayoutContextValues[disableKey] === true) continue;
|
|
196
|
+
if (IntersectionState.get(node) === false) continue;
|
|
197
|
+
visibleNodes.push(node);
|
|
198
|
+
parentsToObserve.add(parentElement);
|
|
199
|
+
}
|
|
200
|
+
} catch (err) {
|
|
201
|
+
_didIteratorError = true;
|
|
202
|
+
_iteratorError = err;
|
|
203
|
+
} finally {
|
|
204
|
+
try {
|
|
205
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();
|
|
206
|
+
} finally {
|
|
207
|
+
if (_didIteratorError) throw _iteratorError;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (visibleNodes.length > 0) {
|
|
211
|
+
var io = ensureRectFetchObserver();
|
|
212
|
+
rectFetchStartTime = performance.now();
|
|
213
|
+
for (var i = 0; i < visibleNodes.length; i++) io.observe(visibleNodes[i]);
|
|
214
|
+
var _iteratorNormalCompletion1 = true,
|
|
215
|
+
_didIteratorError1 = false,
|
|
216
|
+
_iteratorError1 = void 0;
|
|
217
|
+
try {
|
|
218
|
+
for (var _iterator1 = parentsToObserve[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
|
|
219
|
+
var parent = _step1.value;
|
|
220
|
+
io.observe(parent);
|
|
221
|
+
}
|
|
222
|
+
} catch (err) {
|
|
223
|
+
_didIteratorError1 = true;
|
|
224
|
+
_iteratorError1 = err;
|
|
225
|
+
} finally {
|
|
156
226
|
try {
|
|
157
|
-
|
|
158
|
-
var node = _step.value;
|
|
159
|
-
if (_instanceof(node.parentElement, HTMLElement)) {
|
|
160
|
-
var disableKey = LayoutDisableKey.get(node);
|
|
161
|
-
disableKey && DisableLayoutContextValues[disableKey] === !0 || IntersectionState.get(node) !== !1 && (didObserve = !0, io.observe(node), io.observe(node.parentElement), visibleNodes.push(node));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
} catch (err) {
|
|
165
|
-
_didIteratorError = !0, _iteratorError = err;
|
|
227
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) _iterator1.return();
|
|
166
228
|
} finally {
|
|
167
|
-
|
|
168
|
-
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
169
|
-
} finally {
|
|
170
|
-
if (_didIteratorError) throw _iteratorError;
|
|
171
|
-
}
|
|
229
|
+
if (_didIteratorError1) throw _iteratorError1;
|
|
172
230
|
}
|
|
173
|
-
|
|
231
|
+
}
|
|
232
|
+
await new Promise(function (res) {
|
|
233
|
+
rectFetchResolve = res;
|
|
174
234
|
});
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
235
|
+
for (var i1 = 0; i1 < visibleNodes.length; i1++) io.unobserve(visibleNodes[i1]);
|
|
236
|
+
var _iteratorNormalCompletion2 = true,
|
|
237
|
+
_didIteratorError2 = false,
|
|
238
|
+
_iteratorError2 = void 0;
|
|
239
|
+
try {
|
|
240
|
+
for (var _iterator2 = parentsToObserve[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
241
|
+
var parent1 = _step2.value;
|
|
242
|
+
io.unobserve(parent1);
|
|
243
|
+
}
|
|
244
|
+
} catch (err) {
|
|
245
|
+
_didIteratorError2 = true;
|
|
246
|
+
_iteratorError2 = err;
|
|
247
|
+
} finally {
|
|
248
|
+
try {
|
|
249
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) _iterator2.return();
|
|
250
|
+
} finally {
|
|
251
|
+
if (_didIteratorError2) throw _iteratorError2;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (lastCallbackDelay > 50) skipFrames = Math.min(skipFrames + 2, MAX_SKIP_FRAMES);else if (lastCallbackDelay < 20) skipFrames = Math.max(skipFrames - 1, BASE_SKIP_FRAMES);
|
|
255
|
+
for (var i2 = 0; i2 < visibleNodes.length; i2++) updateLayoutIfChanged(visibleNodes[i2]);
|
|
256
|
+
}
|
|
178
257
|
}
|
|
179
|
-
setTimeout(layoutOnAnimationFrame, 16
|
|
258
|
+
rAF ? rAF(layoutOnAnimationFrame) : setTimeout(layoutOnAnimationFrame, 16);
|
|
180
259
|
}
|
|
181
260
|
layoutOnAnimationFrame();
|
|
182
261
|
}
|
|
183
|
-
var getElementLayoutEvent = function (nodeRect, parentRect) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
262
|
+
var getElementLayoutEvent = function (nodeRect, parentRect, node) {
|
|
263
|
+
return {
|
|
264
|
+
nativeEvent: {
|
|
265
|
+
layout: getRelativeDimensions(nodeRect, parentRect, node),
|
|
266
|
+
target: nodeRect
|
|
267
|
+
},
|
|
268
|
+
timeStamp: Date.now()
|
|
269
|
+
};
|
|
270
|
+
};
|
|
271
|
+
var getPreTransformDimensions = function (node) {
|
|
272
|
+
return {
|
|
273
|
+
width: node.offsetWidth,
|
|
274
|
+
height: node.offsetHeight
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
var getRelativeDimensions = function (a, b, aNode) {
|
|
278
|
+
var {
|
|
279
|
+
left,
|
|
280
|
+
top
|
|
281
|
+
} = a;
|
|
282
|
+
var x = left - b.left;
|
|
283
|
+
var y = top - b.top;
|
|
284
|
+
var {
|
|
285
|
+
width,
|
|
286
|
+
height
|
|
287
|
+
} = usePretransformDimensions() && aNode ? getPreTransformDimensions(aNode) : {
|
|
288
|
+
width: a.width,
|
|
289
|
+
height: a.height
|
|
290
|
+
};
|
|
291
|
+
return {
|
|
292
|
+
x,
|
|
293
|
+
y,
|
|
294
|
+
width,
|
|
295
|
+
height,
|
|
296
|
+
pageX: a.left,
|
|
297
|
+
pageY: a.top
|
|
209
298
|
};
|
|
299
|
+
};
|
|
300
|
+
function registerLayoutNode(node, onChange, disableKey) {
|
|
301
|
+
Nodes.add(node);
|
|
302
|
+
LayoutHandlers.set(node, onChange);
|
|
303
|
+
if (disableKey) LayoutDisableKey.set(node, disableKey);
|
|
304
|
+
startGlobalObservers();
|
|
305
|
+
if (globalIntersectionObserver) {
|
|
306
|
+
globalIntersectionObserver.observe(node);
|
|
307
|
+
IntersectionState.set(node, true);
|
|
308
|
+
}
|
|
309
|
+
return function () {
|
|
310
|
+
return cleanupNode(node);
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function cleanupNode(node) {
|
|
314
|
+
Nodes.delete(node);
|
|
315
|
+
LayoutHandlers.delete(node);
|
|
316
|
+
LayoutDisableKey.delete(node);
|
|
317
|
+
NodeRectCache.delete(node);
|
|
318
|
+
IntersectionState.delete(node);
|
|
319
|
+
if (globalIntersectionObserver) globalIntersectionObserver.unobserve(node);
|
|
320
|
+
}
|
|
321
|
+
var PrevHostNode = /* @__PURE__ */new WeakMap();
|
|
210
322
|
function useElementLayout(ref, onLayout) {
|
|
211
|
-
var _ref_current
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
node && onLayout
|
|
323
|
+
var _ref_current;
|
|
324
|
+
var disableKey = (0, import_react.useContext)(DisableLayoutContextKey);
|
|
325
|
+
var node = ensureWebElement((_ref_current = ref.current) === null || _ref_current === void 0 ? void 0 : _ref_current.host);
|
|
326
|
+
if (node && onLayout) {
|
|
327
|
+
LayoutHandlers.set(node, onLayout);
|
|
328
|
+
LayoutDisableKey.set(node, disableKey);
|
|
329
|
+
}
|
|
330
|
+
(0, import_constants.useIsomorphicLayoutEffect)(function () {
|
|
215
331
|
var _ref_current2;
|
|
216
|
-
if (onLayout)
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
332
|
+
if (!onLayout) return;
|
|
333
|
+
var nextNode = ensureWebElement((_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host);
|
|
334
|
+
var prevNode = PrevHostNode.get(ref);
|
|
335
|
+
if (nextNode === prevNode) return;
|
|
336
|
+
if (prevNode) cleanupNode(prevNode);
|
|
337
|
+
PrevHostNode.set(ref, nextNode);
|
|
338
|
+
if (!nextNode) return;
|
|
339
|
+
Nodes.add(nextNode);
|
|
340
|
+
startGlobalObservers();
|
|
341
|
+
if (globalIntersectionObserver) {
|
|
342
|
+
globalIntersectionObserver.observe(nextNode);
|
|
343
|
+
IntersectionState.set(nextNode, true);
|
|
225
344
|
}
|
|
345
|
+
var handler = LayoutHandlers.get(nextNode);
|
|
346
|
+
if (typeof handler !== "function") return;
|
|
347
|
+
var parentNode = nextNode.parentElement;
|
|
348
|
+
if (!parentNode) return;
|
|
349
|
+
var nodeRect = nextNode.getBoundingClientRect();
|
|
350
|
+
var parentRect = parentNode.getBoundingClientRect();
|
|
351
|
+
NodeRectCache.set(nextNode, nodeRect);
|
|
352
|
+
NodeRectCache.set(parentNode, parentRect);
|
|
353
|
+
handler(getElementLayoutEvent(nodeRect, parentRect, nextNode));
|
|
354
|
+
});
|
|
355
|
+
(0, import_constants.useIsomorphicLayoutEffect)(function () {
|
|
356
|
+
var _ref_current2;
|
|
357
|
+
if (!onLayout) return;
|
|
358
|
+
var node2 = (_ref_current2 = ref.current) === null || _ref_current2 === void 0 ? void 0 : _ref_current2.host;
|
|
359
|
+
if (!node2) return;
|
|
360
|
+
Nodes.add(node2);
|
|
361
|
+
startGlobalObservers();
|
|
362
|
+
if (globalIntersectionObserver) {
|
|
363
|
+
globalIntersectionObserver.observe(node2);
|
|
364
|
+
IntersectionState.set(node2, true);
|
|
365
|
+
}
|
|
366
|
+
if (process.env.NODE_ENV === "development" && isDebugLayout()) console.log("[useElementLayout] register", {
|
|
367
|
+
tag: node2.tagName,
|
|
368
|
+
id: node2.id || void 0,
|
|
369
|
+
className: (node2.className || "").slice(0, 60) || void 0,
|
|
370
|
+
totalNodes: Nodes.size
|
|
371
|
+
});
|
|
372
|
+
var parentNode = node2.parentNode;
|
|
373
|
+
if (parentNode) onLayout(getElementLayoutEvent(node2.getBoundingClientRect(), parentNode.getBoundingClientRect(), node2));
|
|
374
|
+
return function () {
|
|
375
|
+
cleanupNode(node2);
|
|
376
|
+
var swappedNode = PrevHostNode.get(ref);
|
|
377
|
+
if (swappedNode && swappedNode !== node2) cleanupNode(swappedNode);
|
|
378
|
+
PrevHostNode.delete(ref);
|
|
379
|
+
};
|
|
226
380
|
}, [ref, !!onLayout]);
|
|
227
381
|
}
|
|
228
382
|
function ensureWebElement(x) {
|
|
229
|
-
if (
|
|
383
|
+
if (typeof HTMLElement === "undefined") return;
|
|
384
|
+
return _instanceof(x, HTMLElement) ? x : void 0;
|
|
230
385
|
}
|
|
231
386
|
var getBoundingClientRectAsync = function (node) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
io.observe(node);
|
|
387
|
+
return new Promise(function (res) {
|
|
388
|
+
if (!node || node.nodeType !== 1) return res(false);
|
|
389
|
+
var io = new IntersectionObserver(function (entries) {
|
|
390
|
+
io.disconnect();
|
|
391
|
+
return res(entries[0].boundingClientRect);
|
|
392
|
+
}, {
|
|
393
|
+
threshold: 0
|
|
240
394
|
});
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
return
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
395
|
+
io.observe(node);
|
|
396
|
+
});
|
|
397
|
+
};
|
|
398
|
+
var measureNode = async function (node, relativeTo) {
|
|
399
|
+
var relativeNode = relativeTo || (node === null || node === void 0 ? void 0 : node.parentElement);
|
|
400
|
+
if (_instanceof(relativeNode, HTMLElement)) {
|
|
401
|
+
var [nodeDim, relativeNodeDim] = await Promise.all([getBoundingClientRectAsync(node), getBoundingClientRectAsync(relativeNode)]);
|
|
402
|
+
if (relativeNodeDim && nodeDim) return getRelativeDimensions(nodeDim, relativeNodeDim, node);
|
|
403
|
+
}
|
|
404
|
+
return null;
|
|
405
|
+
};
|
|
406
|
+
var measure = async function (node, callback) {
|
|
407
|
+
var out = await measureNode(node, _instanceof(node.parentNode, HTMLElement) ? node.parentNode : null);
|
|
408
|
+
if (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
|
|
409
|
+
return out;
|
|
410
|
+
};
|
|
254
411
|
function createMeasure(node) {
|
|
255
412
|
return function (callback) {
|
|
256
413
|
return measure(node, callback);
|
|
257
414
|
};
|
|
258
415
|
}
|
|
259
416
|
var measureInWindow = async function (node, callback) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
},
|
|
268
|
-
measureLayout = async function (node, relativeNode, callback) {
|
|
269
|
-
var out = await measureNode(node, relativeNode);
|
|
270
|
-
return out && callback?.(out.x, out.y, out.width, out.height, out.pageX, out.pageY), out;
|
|
417
|
+
var out = await measureNode(node, null);
|
|
418
|
+
if (out) callback === null || callback === void 0 || callback(out.pageX, out.pageY, out.width, out.height);
|
|
419
|
+
return out;
|
|
420
|
+
};
|
|
421
|
+
var createMeasureInWindow = function (node) {
|
|
422
|
+
return function (callback) {
|
|
423
|
+
return measureInWindow(node, callback);
|
|
271
424
|
};
|
|
425
|
+
};
|
|
426
|
+
var measureLayout = async function (node, relativeNode, callback) {
|
|
427
|
+
var out = await measureNode(node, relativeNode);
|
|
428
|
+
if (out) callback === null || callback === void 0 || callback(out.x, out.y, out.width, out.height, out.pageX, out.pageY);
|
|
429
|
+
return out;
|
|
430
|
+
};
|
|
272
431
|
function createMeasureLayout(node) {
|
|
273
432
|
return function (relativeTo, callback) {
|
|
274
433
|
return measureLayout(node, relativeTo, callback);
|