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