@react-three/fiber 8.17.11 → 8.17.13
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/CHANGELOG.md +12 -0
- package/dist/declarations/src/web/Canvas.d.ts +1 -1
- package/dist/react-three-fiber.cjs.dev.js +3 -197
- package/dist/react-three-fiber.cjs.prod.js +3 -197
- package/dist/react-three-fiber.esm.js +1 -196
- package/package.json +4 -5
- package/dist/declarations/src/web/use-measure.d.ts +0 -34
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { Options as ResizeOptions } from '
|
|
2
|
+
import { Options as ResizeOptions } from 'react-use-measure';
|
|
3
3
|
import { RenderProps } from '../core';
|
|
4
4
|
export interface CanvasProps extends Omit<RenderProps<HTMLCanvasElement>, 'size'>, React.HTMLAttributes<HTMLDivElement> {
|
|
5
5
|
children: React.ReactNode;
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var events = require('./events-d0566a2e.cjs.dev.js');
|
|
6
6
|
var React = require('react');
|
|
7
7
|
var THREE = require('three');
|
|
8
|
-
var
|
|
8
|
+
var useMeasure = require('react-use-measure');
|
|
9
9
|
var itsFine = require('its-fine');
|
|
10
10
|
var jsxRuntime = require('react/jsx-runtime');
|
|
11
11
|
require('react-reconciler/constants');
|
|
@@ -36,201 +36,7 @@ function _interopNamespace(e) {
|
|
|
36
36
|
|
|
37
37
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
38
38
|
var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
/* eslint-disable react-hooks/rules-of-hooks */
|
|
42
|
-
function useMeasure({
|
|
43
|
-
debounce,
|
|
44
|
-
scroll,
|
|
45
|
-
polyfill,
|
|
46
|
-
offsetSize
|
|
47
|
-
} = {
|
|
48
|
-
debounce: 0,
|
|
49
|
-
scroll: false,
|
|
50
|
-
offsetSize: false
|
|
51
|
-
}) {
|
|
52
|
-
const ResizeObserver = polyfill || typeof window !== 'undefined' && window.ResizeObserver;
|
|
53
|
-
const [bounds, set] = React.useState({
|
|
54
|
-
left: 0,
|
|
55
|
-
top: 0,
|
|
56
|
-
width: 0,
|
|
57
|
-
height: 0,
|
|
58
|
-
bottom: 0,
|
|
59
|
-
right: 0,
|
|
60
|
-
x: 0,
|
|
61
|
-
y: 0
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// In test mode
|
|
65
|
-
if (!ResizeObserver) {
|
|
66
|
-
// @ts-ignore
|
|
67
|
-
bounds.width = 1280;
|
|
68
|
-
// @ts-ignore
|
|
69
|
-
bounds.height = 800;
|
|
70
|
-
return [() => {}, bounds, () => {}];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// keep all state in a ref
|
|
74
|
-
const state = React.useRef({
|
|
75
|
-
element: null,
|
|
76
|
-
scrollContainers: null,
|
|
77
|
-
resizeObserver: null,
|
|
78
|
-
lastBounds: bounds,
|
|
79
|
-
orientationHandler: null
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// set actual debounce values early, so effects know if they should react accordingly
|
|
83
|
-
const scrollDebounce = debounce ? typeof debounce === 'number' ? debounce : debounce.scroll : null;
|
|
84
|
-
const resizeDebounce = debounce ? typeof debounce === 'number' ? debounce : debounce.resize : null;
|
|
85
|
-
|
|
86
|
-
// make sure to update state only as long as the component is truly mounted
|
|
87
|
-
const mounted = React.useRef(false);
|
|
88
|
-
React.useEffect(() => {
|
|
89
|
-
mounted.current = true;
|
|
90
|
-
return () => void (mounted.current = false);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// memoize handlers, so event-listeners know when they should update
|
|
94
|
-
const [forceRefresh, resizeChange, scrollChange] = React.useMemo(() => {
|
|
95
|
-
const callback = () => {
|
|
96
|
-
if (!state.current.element) return;
|
|
97
|
-
const {
|
|
98
|
-
left,
|
|
99
|
-
top,
|
|
100
|
-
width,
|
|
101
|
-
height,
|
|
102
|
-
bottom,
|
|
103
|
-
right,
|
|
104
|
-
x,
|
|
105
|
-
y
|
|
106
|
-
} = state.current.element.getBoundingClientRect();
|
|
107
|
-
const size = {
|
|
108
|
-
left,
|
|
109
|
-
top,
|
|
110
|
-
width,
|
|
111
|
-
height,
|
|
112
|
-
bottom,
|
|
113
|
-
right,
|
|
114
|
-
x,
|
|
115
|
-
y
|
|
116
|
-
};
|
|
117
|
-
if (state.current.element instanceof HTMLElement && offsetSize) {
|
|
118
|
-
size.height = state.current.element.offsetHeight;
|
|
119
|
-
size.width = state.current.element.offsetWidth;
|
|
120
|
-
}
|
|
121
|
-
Object.freeze(size);
|
|
122
|
-
if (mounted.current && !areBoundsEqual(state.current.lastBounds, size)) set(state.current.lastBounds = size);
|
|
123
|
-
};
|
|
124
|
-
return [callback, resizeDebounce ? createDebounce__default["default"](callback, resizeDebounce) : callback, scrollDebounce ? createDebounce__default["default"](callback, scrollDebounce) : callback];
|
|
125
|
-
}, [set, offsetSize, scrollDebounce, resizeDebounce]);
|
|
126
|
-
|
|
127
|
-
// cleanup current scroll-listeners / observers
|
|
128
|
-
function removeListeners() {
|
|
129
|
-
if (state.current.scrollContainers) {
|
|
130
|
-
state.current.scrollContainers.forEach(element => element.removeEventListener('scroll', scrollChange, true));
|
|
131
|
-
state.current.scrollContainers = null;
|
|
132
|
-
}
|
|
133
|
-
if (state.current.resizeObserver) {
|
|
134
|
-
state.current.resizeObserver.disconnect();
|
|
135
|
-
state.current.resizeObserver = null;
|
|
136
|
-
}
|
|
137
|
-
if (state.current.orientationHandler) {
|
|
138
|
-
if ('orientation' in screen && 'removeEventListener' in screen.orientation) {
|
|
139
|
-
screen.orientation.removeEventListener('change', state.current.orientationHandler);
|
|
140
|
-
} else if ('onorientationchange' in window) {
|
|
141
|
-
window.removeEventListener('orientationchange', state.current.orientationHandler);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// add scroll-listeners / observers
|
|
147
|
-
function addListeners() {
|
|
148
|
-
var _state$current$resize;
|
|
149
|
-
if (!state.current.element) return;
|
|
150
|
-
state.current.resizeObserver = new ResizeObserver(resizeChange);
|
|
151
|
-
(_state$current$resize = state.current.resizeObserver) == null ? void 0 : _state$current$resize.observe(state.current.element);
|
|
152
|
-
if (scroll && state.current.scrollContainers) {
|
|
153
|
-
state.current.scrollContainers.forEach(scrollContainer => scrollContainer.addEventListener('scroll', scrollChange, {
|
|
154
|
-
capture: true,
|
|
155
|
-
passive: true
|
|
156
|
-
}));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Handle orientation changes
|
|
160
|
-
state.current.orientationHandler = () => {
|
|
161
|
-
scrollChange();
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
// Use screen.orientation if available
|
|
165
|
-
if ('orientation' in screen && 'addEventListener' in screen.orientation) {
|
|
166
|
-
screen.orientation.addEventListener('change', state.current.orientationHandler);
|
|
167
|
-
} else if ('onorientationchange' in window) {
|
|
168
|
-
// Fallback to orientationchange event
|
|
169
|
-
window.addEventListener('orientationchange', state.current.orientationHandler);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// the ref we expose to the user
|
|
174
|
-
const ref = node => {
|
|
175
|
-
if (!node || node === state.current.element) return;
|
|
176
|
-
removeListeners();
|
|
177
|
-
state.current.element = node;
|
|
178
|
-
state.current.scrollContainers = findScrollContainers(node);
|
|
179
|
-
addListeners();
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
// add general event listeners
|
|
183
|
-
useOnWindowScroll(scrollChange, Boolean(scroll));
|
|
184
|
-
useOnWindowResize(resizeChange);
|
|
185
|
-
|
|
186
|
-
// respond to changes that are relevant for the listeners
|
|
187
|
-
React.useEffect(() => {
|
|
188
|
-
removeListeners();
|
|
189
|
-
addListeners();
|
|
190
|
-
}, [scroll, scrollChange, resizeChange]);
|
|
191
|
-
|
|
192
|
-
// remove all listeners when the components unmounts
|
|
193
|
-
React.useEffect(() => removeListeners, []);
|
|
194
|
-
return [ref, bounds, forceRefresh];
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Adds native resize listener to window
|
|
198
|
-
function useOnWindowResize(onWindowResize) {
|
|
199
|
-
React.useEffect(() => {
|
|
200
|
-
const cb = onWindowResize;
|
|
201
|
-
window.addEventListener('resize', cb);
|
|
202
|
-
return () => void window.removeEventListener('resize', cb);
|
|
203
|
-
}, [onWindowResize]);
|
|
204
|
-
}
|
|
205
|
-
function useOnWindowScroll(onScroll, enabled) {
|
|
206
|
-
React.useEffect(() => {
|
|
207
|
-
if (enabled) {
|
|
208
|
-
const cb = onScroll;
|
|
209
|
-
window.addEventListener('scroll', cb, {
|
|
210
|
-
capture: true,
|
|
211
|
-
passive: true
|
|
212
|
-
});
|
|
213
|
-
return () => void window.removeEventListener('scroll', cb, true);
|
|
214
|
-
}
|
|
215
|
-
}, [onScroll, enabled]);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Returns a list of scroll offsets
|
|
219
|
-
function findScrollContainers(element) {
|
|
220
|
-
const result = [];
|
|
221
|
-
if (!element || element === document.body) return result;
|
|
222
|
-
const {
|
|
223
|
-
overflow,
|
|
224
|
-
overflowX,
|
|
225
|
-
overflowY
|
|
226
|
-
} = window.getComputedStyle(element);
|
|
227
|
-
if ([overflow, overflowX, overflowY].some(prop => prop === 'auto' || prop === 'scroll')) result.push(element);
|
|
228
|
-
return [...result, ...findScrollContainers(element.parentElement)];
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Checks if element boundaries are equal
|
|
232
|
-
const keys = ['x', 'y', 'top', 'bottom', 'left', 'right', 'width', 'height'];
|
|
233
|
-
const areBoundsEqual = (a, b) => keys.every(key => a[key] === b[key]);
|
|
39
|
+
var useMeasure__default = /*#__PURE__*/_interopDefault(useMeasure);
|
|
234
40
|
|
|
235
41
|
const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
236
42
|
children,
|
|
@@ -261,7 +67,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
|
261
67
|
// their own elements by using the createRoot API instead
|
|
262
68
|
React__namespace.useMemo(() => events.extend(THREE__namespace), []);
|
|
263
69
|
const Bridge = itsFine.useContextBridge();
|
|
264
|
-
const [containerRef, containerRect] =
|
|
70
|
+
const [containerRef, containerRect] = useMeasure__default["default"]({
|
|
265
71
|
scroll: true,
|
|
266
72
|
debounce: {
|
|
267
73
|
scroll: 50,
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var events = require('./events-0e73ba93.cjs.prod.js');
|
|
6
6
|
var React = require('react');
|
|
7
7
|
var THREE = require('three');
|
|
8
|
-
var
|
|
8
|
+
var useMeasure = require('react-use-measure');
|
|
9
9
|
var itsFine = require('its-fine');
|
|
10
10
|
var jsxRuntime = require('react/jsx-runtime');
|
|
11
11
|
require('react-reconciler/constants');
|
|
@@ -36,201 +36,7 @@ function _interopNamespace(e) {
|
|
|
36
36
|
|
|
37
37
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
38
38
|
var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
/* eslint-disable react-hooks/rules-of-hooks */
|
|
42
|
-
function useMeasure({
|
|
43
|
-
debounce,
|
|
44
|
-
scroll,
|
|
45
|
-
polyfill,
|
|
46
|
-
offsetSize
|
|
47
|
-
} = {
|
|
48
|
-
debounce: 0,
|
|
49
|
-
scroll: false,
|
|
50
|
-
offsetSize: false
|
|
51
|
-
}) {
|
|
52
|
-
const ResizeObserver = polyfill || typeof window !== 'undefined' && window.ResizeObserver;
|
|
53
|
-
const [bounds, set] = React.useState({
|
|
54
|
-
left: 0,
|
|
55
|
-
top: 0,
|
|
56
|
-
width: 0,
|
|
57
|
-
height: 0,
|
|
58
|
-
bottom: 0,
|
|
59
|
-
right: 0,
|
|
60
|
-
x: 0,
|
|
61
|
-
y: 0
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// In test mode
|
|
65
|
-
if (!ResizeObserver) {
|
|
66
|
-
// @ts-ignore
|
|
67
|
-
bounds.width = 1280;
|
|
68
|
-
// @ts-ignore
|
|
69
|
-
bounds.height = 800;
|
|
70
|
-
return [() => {}, bounds, () => {}];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// keep all state in a ref
|
|
74
|
-
const state = React.useRef({
|
|
75
|
-
element: null,
|
|
76
|
-
scrollContainers: null,
|
|
77
|
-
resizeObserver: null,
|
|
78
|
-
lastBounds: bounds,
|
|
79
|
-
orientationHandler: null
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// set actual debounce values early, so effects know if they should react accordingly
|
|
83
|
-
const scrollDebounce = debounce ? typeof debounce === 'number' ? debounce : debounce.scroll : null;
|
|
84
|
-
const resizeDebounce = debounce ? typeof debounce === 'number' ? debounce : debounce.resize : null;
|
|
85
|
-
|
|
86
|
-
// make sure to update state only as long as the component is truly mounted
|
|
87
|
-
const mounted = React.useRef(false);
|
|
88
|
-
React.useEffect(() => {
|
|
89
|
-
mounted.current = true;
|
|
90
|
-
return () => void (mounted.current = false);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// memoize handlers, so event-listeners know when they should update
|
|
94
|
-
const [forceRefresh, resizeChange, scrollChange] = React.useMemo(() => {
|
|
95
|
-
const callback = () => {
|
|
96
|
-
if (!state.current.element) return;
|
|
97
|
-
const {
|
|
98
|
-
left,
|
|
99
|
-
top,
|
|
100
|
-
width,
|
|
101
|
-
height,
|
|
102
|
-
bottom,
|
|
103
|
-
right,
|
|
104
|
-
x,
|
|
105
|
-
y
|
|
106
|
-
} = state.current.element.getBoundingClientRect();
|
|
107
|
-
const size = {
|
|
108
|
-
left,
|
|
109
|
-
top,
|
|
110
|
-
width,
|
|
111
|
-
height,
|
|
112
|
-
bottom,
|
|
113
|
-
right,
|
|
114
|
-
x,
|
|
115
|
-
y
|
|
116
|
-
};
|
|
117
|
-
if (state.current.element instanceof HTMLElement && offsetSize) {
|
|
118
|
-
size.height = state.current.element.offsetHeight;
|
|
119
|
-
size.width = state.current.element.offsetWidth;
|
|
120
|
-
}
|
|
121
|
-
Object.freeze(size);
|
|
122
|
-
if (mounted.current && !areBoundsEqual(state.current.lastBounds, size)) set(state.current.lastBounds = size);
|
|
123
|
-
};
|
|
124
|
-
return [callback, resizeDebounce ? createDebounce__default["default"](callback, resizeDebounce) : callback, scrollDebounce ? createDebounce__default["default"](callback, scrollDebounce) : callback];
|
|
125
|
-
}, [set, offsetSize, scrollDebounce, resizeDebounce]);
|
|
126
|
-
|
|
127
|
-
// cleanup current scroll-listeners / observers
|
|
128
|
-
function removeListeners() {
|
|
129
|
-
if (state.current.scrollContainers) {
|
|
130
|
-
state.current.scrollContainers.forEach(element => element.removeEventListener('scroll', scrollChange, true));
|
|
131
|
-
state.current.scrollContainers = null;
|
|
132
|
-
}
|
|
133
|
-
if (state.current.resizeObserver) {
|
|
134
|
-
state.current.resizeObserver.disconnect();
|
|
135
|
-
state.current.resizeObserver = null;
|
|
136
|
-
}
|
|
137
|
-
if (state.current.orientationHandler) {
|
|
138
|
-
if ('orientation' in screen && 'removeEventListener' in screen.orientation) {
|
|
139
|
-
screen.orientation.removeEventListener('change', state.current.orientationHandler);
|
|
140
|
-
} else if ('onorientationchange' in window) {
|
|
141
|
-
window.removeEventListener('orientationchange', state.current.orientationHandler);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// add scroll-listeners / observers
|
|
147
|
-
function addListeners() {
|
|
148
|
-
var _state$current$resize;
|
|
149
|
-
if (!state.current.element) return;
|
|
150
|
-
state.current.resizeObserver = new ResizeObserver(resizeChange);
|
|
151
|
-
(_state$current$resize = state.current.resizeObserver) == null ? void 0 : _state$current$resize.observe(state.current.element);
|
|
152
|
-
if (scroll && state.current.scrollContainers) {
|
|
153
|
-
state.current.scrollContainers.forEach(scrollContainer => scrollContainer.addEventListener('scroll', scrollChange, {
|
|
154
|
-
capture: true,
|
|
155
|
-
passive: true
|
|
156
|
-
}));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Handle orientation changes
|
|
160
|
-
state.current.orientationHandler = () => {
|
|
161
|
-
scrollChange();
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
// Use screen.orientation if available
|
|
165
|
-
if ('orientation' in screen && 'addEventListener' in screen.orientation) {
|
|
166
|
-
screen.orientation.addEventListener('change', state.current.orientationHandler);
|
|
167
|
-
} else if ('onorientationchange' in window) {
|
|
168
|
-
// Fallback to orientationchange event
|
|
169
|
-
window.addEventListener('orientationchange', state.current.orientationHandler);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// the ref we expose to the user
|
|
174
|
-
const ref = node => {
|
|
175
|
-
if (!node || node === state.current.element) return;
|
|
176
|
-
removeListeners();
|
|
177
|
-
state.current.element = node;
|
|
178
|
-
state.current.scrollContainers = findScrollContainers(node);
|
|
179
|
-
addListeners();
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
// add general event listeners
|
|
183
|
-
useOnWindowScroll(scrollChange, Boolean(scroll));
|
|
184
|
-
useOnWindowResize(resizeChange);
|
|
185
|
-
|
|
186
|
-
// respond to changes that are relevant for the listeners
|
|
187
|
-
React.useEffect(() => {
|
|
188
|
-
removeListeners();
|
|
189
|
-
addListeners();
|
|
190
|
-
}, [scroll, scrollChange, resizeChange]);
|
|
191
|
-
|
|
192
|
-
// remove all listeners when the components unmounts
|
|
193
|
-
React.useEffect(() => removeListeners, []);
|
|
194
|
-
return [ref, bounds, forceRefresh];
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Adds native resize listener to window
|
|
198
|
-
function useOnWindowResize(onWindowResize) {
|
|
199
|
-
React.useEffect(() => {
|
|
200
|
-
const cb = onWindowResize;
|
|
201
|
-
window.addEventListener('resize', cb);
|
|
202
|
-
return () => void window.removeEventListener('resize', cb);
|
|
203
|
-
}, [onWindowResize]);
|
|
204
|
-
}
|
|
205
|
-
function useOnWindowScroll(onScroll, enabled) {
|
|
206
|
-
React.useEffect(() => {
|
|
207
|
-
if (enabled) {
|
|
208
|
-
const cb = onScroll;
|
|
209
|
-
window.addEventListener('scroll', cb, {
|
|
210
|
-
capture: true,
|
|
211
|
-
passive: true
|
|
212
|
-
});
|
|
213
|
-
return () => void window.removeEventListener('scroll', cb, true);
|
|
214
|
-
}
|
|
215
|
-
}, [onScroll, enabled]);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Returns a list of scroll offsets
|
|
219
|
-
function findScrollContainers(element) {
|
|
220
|
-
const result = [];
|
|
221
|
-
if (!element || element === document.body) return result;
|
|
222
|
-
const {
|
|
223
|
-
overflow,
|
|
224
|
-
overflowX,
|
|
225
|
-
overflowY
|
|
226
|
-
} = window.getComputedStyle(element);
|
|
227
|
-
if ([overflow, overflowX, overflowY].some(prop => prop === 'auto' || prop === 'scroll')) result.push(element);
|
|
228
|
-
return [...result, ...findScrollContainers(element.parentElement)];
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Checks if element boundaries are equal
|
|
232
|
-
const keys = ['x', 'y', 'top', 'bottom', 'left', 'right', 'width', 'height'];
|
|
233
|
-
const areBoundsEqual = (a, b) => keys.every(key => a[key] === b[key]);
|
|
39
|
+
var useMeasure__default = /*#__PURE__*/_interopDefault(useMeasure);
|
|
234
40
|
|
|
235
41
|
const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
236
42
|
children,
|
|
@@ -261,7 +67,7 @@ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
|
|
|
261
67
|
// their own elements by using the createRoot API instead
|
|
262
68
|
React__namespace.useMemo(() => events.extend(THREE__namespace), []);
|
|
263
69
|
const Bridge = itsFine.useContextBridge();
|
|
264
|
-
const [containerRef, containerRect] =
|
|
70
|
+
const [containerRef, containerRect] = useMeasure__default["default"]({
|
|
265
71
|
scroll: true,
|
|
266
72
|
debounce: {
|
|
267
73
|
scroll: 50,
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { c as createPointerEvents, e as extend, u as useMutableCallback, a as useIsomorphicLayoutEffect, b as createRoot, i as isRef, E as ErrorBoundary, B as Block, d as unmountComponentAtNode } from './events-776716bd.esm.js';
|
|
2
2
|
export { t as ReactThreeFiber, z as _roots, x as act, p as addAfterEffect, o as addEffect, q as addTail, n as advance, k as applyProps, y as buildGraph, g as context, f as createEvents, c as createPointerEvents, h as createPortal, b as createRoot, l as dispose, c as events, e as extend, s as flushGlobalEffects, v as flushSync, w as getRootState, m as invalidate, j as reconciler, r as render, d as unmountComponentAtNode, F as useFrame, G as useGraph, A as useInstanceHandle, H as useLoader, C as useStore, D as useThree } from './events-776716bd.esm.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import { useState, useRef, useEffect, useMemo } from 'react';
|
|
5
4
|
import * as THREE from 'three';
|
|
6
|
-
import
|
|
5
|
+
import useMeasure from 'react-use-measure';
|
|
7
6
|
import { FiberProvider, useContextBridge } from 'its-fine';
|
|
8
7
|
import { jsx } from 'react/jsx-runtime';
|
|
9
8
|
import 'react-reconciler/constants';
|
|
@@ -12,200 +11,6 @@ import 'suspend-react';
|
|
|
12
11
|
import 'react-reconciler';
|
|
13
12
|
import 'scheduler';
|
|
14
13
|
|
|
15
|
-
/* eslint-disable react-hooks/rules-of-hooks */
|
|
16
|
-
function useMeasure({
|
|
17
|
-
debounce,
|
|
18
|
-
scroll,
|
|
19
|
-
polyfill,
|
|
20
|
-
offsetSize
|
|
21
|
-
} = {
|
|
22
|
-
debounce: 0,
|
|
23
|
-
scroll: false,
|
|
24
|
-
offsetSize: false
|
|
25
|
-
}) {
|
|
26
|
-
const ResizeObserver = polyfill || typeof window !== 'undefined' && window.ResizeObserver;
|
|
27
|
-
const [bounds, set] = useState({
|
|
28
|
-
left: 0,
|
|
29
|
-
top: 0,
|
|
30
|
-
width: 0,
|
|
31
|
-
height: 0,
|
|
32
|
-
bottom: 0,
|
|
33
|
-
right: 0,
|
|
34
|
-
x: 0,
|
|
35
|
-
y: 0
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// In test mode
|
|
39
|
-
if (!ResizeObserver) {
|
|
40
|
-
// @ts-ignore
|
|
41
|
-
bounds.width = 1280;
|
|
42
|
-
// @ts-ignore
|
|
43
|
-
bounds.height = 800;
|
|
44
|
-
return [() => {}, bounds, () => {}];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// keep all state in a ref
|
|
48
|
-
const state = useRef({
|
|
49
|
-
element: null,
|
|
50
|
-
scrollContainers: null,
|
|
51
|
-
resizeObserver: null,
|
|
52
|
-
lastBounds: bounds,
|
|
53
|
-
orientationHandler: null
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// set actual debounce values early, so effects know if they should react accordingly
|
|
57
|
-
const scrollDebounce = debounce ? typeof debounce === 'number' ? debounce : debounce.scroll : null;
|
|
58
|
-
const resizeDebounce = debounce ? typeof debounce === 'number' ? debounce : debounce.resize : null;
|
|
59
|
-
|
|
60
|
-
// make sure to update state only as long as the component is truly mounted
|
|
61
|
-
const mounted = useRef(false);
|
|
62
|
-
useEffect(() => {
|
|
63
|
-
mounted.current = true;
|
|
64
|
-
return () => void (mounted.current = false);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
// memoize handlers, so event-listeners know when they should update
|
|
68
|
-
const [forceRefresh, resizeChange, scrollChange] = useMemo(() => {
|
|
69
|
-
const callback = () => {
|
|
70
|
-
if (!state.current.element) return;
|
|
71
|
-
const {
|
|
72
|
-
left,
|
|
73
|
-
top,
|
|
74
|
-
width,
|
|
75
|
-
height,
|
|
76
|
-
bottom,
|
|
77
|
-
right,
|
|
78
|
-
x,
|
|
79
|
-
y
|
|
80
|
-
} = state.current.element.getBoundingClientRect();
|
|
81
|
-
const size = {
|
|
82
|
-
left,
|
|
83
|
-
top,
|
|
84
|
-
width,
|
|
85
|
-
height,
|
|
86
|
-
bottom,
|
|
87
|
-
right,
|
|
88
|
-
x,
|
|
89
|
-
y
|
|
90
|
-
};
|
|
91
|
-
if (state.current.element instanceof HTMLElement && offsetSize) {
|
|
92
|
-
size.height = state.current.element.offsetHeight;
|
|
93
|
-
size.width = state.current.element.offsetWidth;
|
|
94
|
-
}
|
|
95
|
-
Object.freeze(size);
|
|
96
|
-
if (mounted.current && !areBoundsEqual(state.current.lastBounds, size)) set(state.current.lastBounds = size);
|
|
97
|
-
};
|
|
98
|
-
return [callback, resizeDebounce ? createDebounce(callback, resizeDebounce) : callback, scrollDebounce ? createDebounce(callback, scrollDebounce) : callback];
|
|
99
|
-
}, [set, offsetSize, scrollDebounce, resizeDebounce]);
|
|
100
|
-
|
|
101
|
-
// cleanup current scroll-listeners / observers
|
|
102
|
-
function removeListeners() {
|
|
103
|
-
if (state.current.scrollContainers) {
|
|
104
|
-
state.current.scrollContainers.forEach(element => element.removeEventListener('scroll', scrollChange, true));
|
|
105
|
-
state.current.scrollContainers = null;
|
|
106
|
-
}
|
|
107
|
-
if (state.current.resizeObserver) {
|
|
108
|
-
state.current.resizeObserver.disconnect();
|
|
109
|
-
state.current.resizeObserver = null;
|
|
110
|
-
}
|
|
111
|
-
if (state.current.orientationHandler) {
|
|
112
|
-
if ('orientation' in screen && 'removeEventListener' in screen.orientation) {
|
|
113
|
-
screen.orientation.removeEventListener('change', state.current.orientationHandler);
|
|
114
|
-
} else if ('onorientationchange' in window) {
|
|
115
|
-
window.removeEventListener('orientationchange', state.current.orientationHandler);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// add scroll-listeners / observers
|
|
121
|
-
function addListeners() {
|
|
122
|
-
var _state$current$resize;
|
|
123
|
-
if (!state.current.element) return;
|
|
124
|
-
state.current.resizeObserver = new ResizeObserver(resizeChange);
|
|
125
|
-
(_state$current$resize = state.current.resizeObserver) == null ? void 0 : _state$current$resize.observe(state.current.element);
|
|
126
|
-
if (scroll && state.current.scrollContainers) {
|
|
127
|
-
state.current.scrollContainers.forEach(scrollContainer => scrollContainer.addEventListener('scroll', scrollChange, {
|
|
128
|
-
capture: true,
|
|
129
|
-
passive: true
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Handle orientation changes
|
|
134
|
-
state.current.orientationHandler = () => {
|
|
135
|
-
scrollChange();
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
// Use screen.orientation if available
|
|
139
|
-
if ('orientation' in screen && 'addEventListener' in screen.orientation) {
|
|
140
|
-
screen.orientation.addEventListener('change', state.current.orientationHandler);
|
|
141
|
-
} else if ('onorientationchange' in window) {
|
|
142
|
-
// Fallback to orientationchange event
|
|
143
|
-
window.addEventListener('orientationchange', state.current.orientationHandler);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// the ref we expose to the user
|
|
148
|
-
const ref = node => {
|
|
149
|
-
if (!node || node === state.current.element) return;
|
|
150
|
-
removeListeners();
|
|
151
|
-
state.current.element = node;
|
|
152
|
-
state.current.scrollContainers = findScrollContainers(node);
|
|
153
|
-
addListeners();
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
// add general event listeners
|
|
157
|
-
useOnWindowScroll(scrollChange, Boolean(scroll));
|
|
158
|
-
useOnWindowResize(resizeChange);
|
|
159
|
-
|
|
160
|
-
// respond to changes that are relevant for the listeners
|
|
161
|
-
useEffect(() => {
|
|
162
|
-
removeListeners();
|
|
163
|
-
addListeners();
|
|
164
|
-
}, [scroll, scrollChange, resizeChange]);
|
|
165
|
-
|
|
166
|
-
// remove all listeners when the components unmounts
|
|
167
|
-
useEffect(() => removeListeners, []);
|
|
168
|
-
return [ref, bounds, forceRefresh];
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Adds native resize listener to window
|
|
172
|
-
function useOnWindowResize(onWindowResize) {
|
|
173
|
-
useEffect(() => {
|
|
174
|
-
const cb = onWindowResize;
|
|
175
|
-
window.addEventListener('resize', cb);
|
|
176
|
-
return () => void window.removeEventListener('resize', cb);
|
|
177
|
-
}, [onWindowResize]);
|
|
178
|
-
}
|
|
179
|
-
function useOnWindowScroll(onScroll, enabled) {
|
|
180
|
-
useEffect(() => {
|
|
181
|
-
if (enabled) {
|
|
182
|
-
const cb = onScroll;
|
|
183
|
-
window.addEventListener('scroll', cb, {
|
|
184
|
-
capture: true,
|
|
185
|
-
passive: true
|
|
186
|
-
});
|
|
187
|
-
return () => void window.removeEventListener('scroll', cb, true);
|
|
188
|
-
}
|
|
189
|
-
}, [onScroll, enabled]);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Returns a list of scroll offsets
|
|
193
|
-
function findScrollContainers(element) {
|
|
194
|
-
const result = [];
|
|
195
|
-
if (!element || element === document.body) return result;
|
|
196
|
-
const {
|
|
197
|
-
overflow,
|
|
198
|
-
overflowX,
|
|
199
|
-
overflowY
|
|
200
|
-
} = window.getComputedStyle(element);
|
|
201
|
-
if ([overflow, overflowX, overflowY].some(prop => prop === 'auto' || prop === 'scroll')) result.push(element);
|
|
202
|
-
return [...result, ...findScrollContainers(element.parentElement)];
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Checks if element boundaries are equal
|
|
206
|
-
const keys = ['x', 'y', 'top', 'bottom', 'left', 'right', 'width', 'height'];
|
|
207
|
-
const areBoundsEqual = (a, b) => keys.every(key => a[key] === b[key]);
|
|
208
|
-
|
|
209
14
|
const CanvasImpl = /*#__PURE__*/React.forwardRef(function Canvas({
|
|
210
15
|
children,
|
|
211
16
|
fallback,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-three/fiber",
|
|
3
|
-
"version": "8.17.
|
|
3
|
+
"version": "8.17.13",
|
|
4
4
|
"description": "A React renderer for Threejs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -43,14 +43,13 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@babel/runtime": "^7.17.8",
|
|
46
|
-
"@types/debounce": "^1.2.1",
|
|
47
46
|
"@types/react-reconciler": "^0.26.7",
|
|
48
47
|
"@types/webxr": "*",
|
|
49
48
|
"base64-js": "^1.5.1",
|
|
50
49
|
"buffer": "^6.0.3",
|
|
51
|
-
"debounce": "^1.2.1",
|
|
52
50
|
"its-fine": "^1.0.6",
|
|
53
51
|
"react-reconciler": "^0.27.0",
|
|
52
|
+
"react-use-measure": "^2.1.6",
|
|
54
53
|
"scheduler": "^0.21.0",
|
|
55
54
|
"suspend-react": "^0.1.3",
|
|
56
55
|
"zustand": "^3.7.1"
|
|
@@ -60,8 +59,8 @@
|
|
|
60
59
|
"expo-asset": ">=8.4",
|
|
61
60
|
"expo-gl": ">=11.0",
|
|
62
61
|
"expo-file-system": ">=11.0",
|
|
63
|
-
"react": ">=18
|
|
64
|
-
"react-dom": ">=18
|
|
62
|
+
"react": ">=18 <19",
|
|
63
|
+
"react-dom": ">=18 <19",
|
|
65
64
|
"react-native": ">=0.64",
|
|
66
65
|
"three": ">=0.133"
|
|
67
66
|
},
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
declare type ResizeObserverCallback = (entries: any[], observer: ResizeObserver) => void;
|
|
2
|
-
declare class ResizeObserver {
|
|
3
|
-
constructor(callback: ResizeObserverCallback);
|
|
4
|
-
observe(target: Element, options?: any): void;
|
|
5
|
-
unobserve(target: Element): void;
|
|
6
|
-
disconnect(): void;
|
|
7
|
-
static toString(): string;
|
|
8
|
-
}
|
|
9
|
-
export interface RectReadOnly {
|
|
10
|
-
readonly x: number;
|
|
11
|
-
readonly y: number;
|
|
12
|
-
readonly width: number;
|
|
13
|
-
readonly height: number;
|
|
14
|
-
readonly top: number;
|
|
15
|
-
readonly right: number;
|
|
16
|
-
readonly bottom: number;
|
|
17
|
-
readonly left: number;
|
|
18
|
-
[key: string]: number;
|
|
19
|
-
}
|
|
20
|
-
declare type HTMLOrSVGElement = HTMLElement | SVGElement;
|
|
21
|
-
declare type Result = [(element: HTMLOrSVGElement | null) => void, RectReadOnly, () => void];
|
|
22
|
-
export declare type Options = {
|
|
23
|
-
debounce?: number | {
|
|
24
|
-
scroll: number;
|
|
25
|
-
resize: number;
|
|
26
|
-
};
|
|
27
|
-
scroll?: boolean;
|
|
28
|
-
polyfill?: {
|
|
29
|
-
new (cb: ResizeObserverCallback): ResizeObserver;
|
|
30
|
-
};
|
|
31
|
-
offsetSize?: boolean;
|
|
32
|
-
};
|
|
33
|
-
export declare function useMeasure({ debounce, scroll, polyfill, offsetSize }?: Options): Result;
|
|
34
|
-
export {};
|