@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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @react-three/fiber
2
2
 
3
+ ## 8.17.13
4
+
5
+ ### Patch Changes
6
+
7
+ - 0a0f2acd: fix: upstream use-measure
8
+
9
+ ## 8.17.12
10
+
11
+ ### Patch Changes
12
+
13
+ - ff1a16f1: fix: narrow React peer dep range
14
+
3
15
  ## 8.17.11
4
16
 
5
17
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { Options as ResizeOptions } from './use-measure';
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 createDebounce = require('debounce');
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 createDebounce__default = /*#__PURE__*/_interopDefault(createDebounce);
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] = useMeasure({
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 createDebounce = require('debounce');
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 createDebounce__default = /*#__PURE__*/_interopDefault(createDebounce);
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] = useMeasure({
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 createDebounce from 'debounce';
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.11",
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.0",
64
- "react-dom": ">=18.0",
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 {};