@react-three/fiber 9.0.0-alpha.1 → 9.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +962 -444
  2. package/dist/declarations/src/core/events.d.ts +91 -69
  3. package/dist/declarations/src/core/hooks.d.ts +53 -24
  4. package/dist/declarations/src/core/index.d.ts +15 -61
  5. package/dist/declarations/src/core/loop.d.ts +31 -13
  6. package/dist/declarations/src/core/reconciler.d.ts +43 -0
  7. package/dist/declarations/src/core/renderer.d.ts +85 -51
  8. package/dist/declarations/src/core/stages.d.ts +64 -59
  9. package/dist/declarations/src/core/store.d.ts +147 -110
  10. package/dist/declarations/src/core/utils.d.ts +128 -81
  11. package/dist/declarations/src/index.d.ts +6 -12
  12. package/dist/declarations/src/native/Canvas.d.ts +14 -8
  13. package/dist/declarations/src/native/events.d.ts +4 -4
  14. package/dist/declarations/src/native.d.ts +6 -10
  15. package/dist/declarations/src/three-types.d.ts +56 -331
  16. package/dist/declarations/src/web/Canvas.d.ts +24 -9
  17. package/dist/declarations/src/web/events.d.ts +4 -4
  18. package/dist/loop-0698c205.cjs.dev.js +2496 -0
  19. package/dist/loop-a0ef8208.cjs.prod.js +2496 -0
  20. package/dist/loop-b2aca207.esm.js +2434 -0
  21. package/dist/react-three-fiber.cjs.d.ts +1 -0
  22. package/dist/react-three-fiber.cjs.dev.js +139 -100
  23. package/dist/react-three-fiber.cjs.prod.js +139 -100
  24. package/dist/react-three-fiber.esm.js +104 -68
  25. package/native/dist/react-three-fiber-native.cjs.d.ts +1 -0
  26. package/native/dist/react-three-fiber-native.cjs.dev.js +287 -212
  27. package/native/dist/react-three-fiber-native.cjs.prod.js +287 -212
  28. package/native/dist/react-three-fiber-native.esm.js +251 -181
  29. package/native/package.json +5 -5
  30. package/package.json +18 -11
  31. package/readme.md +253 -202
  32. package/dist/declarations/src/native/polyfills.d.ts +0 -1
  33. package/dist/index-2e1b7052.cjs.prod.js +0 -2362
  34. package/dist/index-65e750e4.cjs.dev.js +0 -2362
  35. package/dist/index-a9c7a6cd.esm.js +0 -2304
@@ -2,11 +2,12 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('./index-2e1b7052.cjs.prod.js');
5
+ var loop = require('./loop-a0ef8208.cjs.prod.js');
6
6
  var _extends = require('@babel/runtime/helpers/extends');
7
7
  var React = require('react');
8
8
  var THREE = require('three');
9
9
  var useMeasure = require('react-use-measure');
10
+ var itsFine = require('its-fine');
10
11
  require('react-reconciler/constants');
11
12
  require('zustand');
12
13
  require('react-reconciler');
@@ -49,64 +50,72 @@ const DOM_EVENTS = {
49
50
  onPointerCancel: ['pointercancel', true],
50
51
  onLostPointerCapture: ['lostpointercapture', true]
51
52
  };
52
- /** Default R3F event manager for web */
53
53
 
54
+ /** Default R3F event manager for web */
54
55
  function createPointerEvents(store) {
55
56
  const {
56
57
  handlePointer
57
- } = index.createEvents(store);
58
+ } = loop.createEvents(store);
58
59
  return {
59
60
  priority: 1,
60
61
  enabled: true,
61
-
62
62
  compute(event, state, previous) {
63
63
  // https://github.com/pmndrs/react-three-fiber/pull/782
64
64
  // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
65
65
  state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
66
66
  state.raycaster.setFromCamera(state.pointer, state.camera);
67
67
  },
68
-
69
68
  connected: undefined,
70
- handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({ ...acc,
69
+ handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
70
+ ...acc,
71
71
  [key]: handlePointer(key)
72
72
  }), {}),
73
+ update: () => {
74
+ var _internal$lastEvent;
75
+ const {
76
+ events,
77
+ internal
78
+ } = store.getState();
79
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) events.handlers.onPointerMove(internal.lastEvent.current);
80
+ },
73
81
  connect: target => {
74
- var _events$handlers;
75
-
76
82
  const {
77
83
  set,
78
84
  events
79
85
  } = store.getState();
80
86
  events.disconnect == null ? void 0 : events.disconnect();
81
87
  set(state => ({
82
- events: { ...state.events,
88
+ events: {
89
+ ...state.events,
83
90
  connected: target
84
91
  }
85
92
  }));
86
- Object.entries((_events$handlers = events.handlers) != null ? _events$handlers : []).forEach(([name, event]) => {
87
- const [eventName, passive] = DOM_EVENTS[name];
88
- target.addEventListener(eventName, event, {
89
- passive
90
- });
91
- });
93
+ if (events.handlers) {
94
+ for (const name in events.handlers) {
95
+ const event = events.handlers[name];
96
+ const [eventName, passive] = DOM_EVENTS[name];
97
+ target.addEventListener(eventName, event, {
98
+ passive
99
+ });
100
+ }
101
+ }
92
102
  },
93
103
  disconnect: () => {
94
104
  const {
95
105
  set,
96
106
  events
97
107
  } = store.getState();
98
-
99
108
  if (events.connected) {
100
- var _events$handlers2;
101
-
102
- Object.entries((_events$handlers2 = events.handlers) != null ? _events$handlers2 : []).forEach(([name, event]) => {
103
- if (events && events.connected instanceof HTMLElement) {
109
+ if (events.handlers) {
110
+ for (const name in events.handlers) {
111
+ const event = events.handlers[name];
104
112
  const [eventName] = DOM_EVENTS[name];
105
113
  events.connected.removeEventListener(eventName, event);
106
114
  }
107
- });
115
+ }
108
116
  set(state => ({
109
- events: { ...state.events,
117
+ events: {
118
+ ...state.events,
110
119
  connected: undefined
111
120
  }
112
121
  }));
@@ -115,17 +124,15 @@ function createPointerEvents(store) {
115
124
  };
116
125
  }
117
126
 
118
- /**
119
- * A DOM canvas which accepts threejs elements as children.
120
- * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
121
- */
122
- const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
127
+ const CanvasImpl = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
123
128
  children,
124
129
  fallback,
125
130
  resize,
126
131
  style,
127
132
  gl,
128
133
  events = createPointerEvents,
134
+ eventSource,
135
+ eventPrefix,
129
136
  shadows,
130
137
  linear,
131
138
  flat,
@@ -136,6 +143,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
136
143
  performance,
137
144
  raycaster,
138
145
  camera,
146
+ scene,
139
147
  onPointerMissed,
140
148
  onCreated,
141
149
  stages,
@@ -144,7 +152,8 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
144
152
  // Create a known catalogue of Threejs-native elements
145
153
  // This will include the entire THREE namespace by default, users can extend
146
154
  // their own elements by using the createRoot API instead
147
- React__namespace.useMemo(() => index.extend(THREE__namespace), []);
155
+ React__namespace.useMemo(() => loop.extend(THREE__namespace), []);
156
+ const Bridge = loop.useBridge();
148
157
  const [containerRef, containerRect] = useMeasure__default["default"]({
149
158
  scroll: true,
150
159
  debounce: {
@@ -155,56 +164,72 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
155
164
  });
156
165
  const canvasRef = React__namespace.useRef(null);
157
166
  const divRef = React__namespace.useRef(null);
158
- const [canvas, setCanvas] = React__namespace.useState(null);
159
167
  React__namespace.useImperativeHandle(forwardedRef, () => canvasRef.current);
160
- const handlePointerMissed = index.useMutableCallback(onPointerMissed);
168
+ const handlePointerMissed = loop.useMutableCallback(onPointerMissed);
161
169
  const [block, setBlock] = React__namespace.useState(false);
162
- const [error, setError] = React__namespace.useState(false); // Suspend this component if block is a promise (2nd run)
163
-
164
- if (block) throw block; // Throw exception outwards if anything within canvas throws
170
+ const [error, setError] = React__namespace.useState(false);
165
171
 
172
+ // Suspend this component if block is a promise (2nd run)
173
+ if (block) throw block;
174
+ // Throw exception outwards if anything within canvas throws
166
175
  if (error) throw error;
167
176
  const root = React__namespace.useRef(null);
168
-
169
- if (containerRect.width > 0 && containerRect.height > 0 && canvas) {
170
- if (!root.current) root.current = index.createRoot(canvas);
171
- root.current.configure({
172
- gl,
173
- events,
174
- shadows,
175
- linear,
176
- flat,
177
- legacy,
178
- orthographic,
179
- frameloop,
180
- dpr,
181
- performance,
182
- raycaster,
183
- camera,
184
- stages,
185
- size: containerRect,
186
- // Pass mutable reference to onPointerMissed so it's free to update
187
- onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
188
- onCreated: state => {
189
- state.events.connect == null ? void 0 : state.events.connect(divRef.current);
190
- onCreated == null ? void 0 : onCreated(state);
191
- }
192
- });
193
- root.current.render( /*#__PURE__*/React__namespace.createElement(index.ErrorBoundary, {
194
- set: setError
195
- }, /*#__PURE__*/React__namespace.createElement(React__namespace.Suspense, {
196
- fallback: /*#__PURE__*/React__namespace.createElement(index.Block, {
197
- set: setBlock
198
- })
199
- }, children)));
200
- }
201
-
202
- index.useIsomorphicLayoutEffect(() => {
203
- setCanvas(canvasRef.current);
204
- }, []);
177
+ loop.useIsomorphicLayoutEffect(() => {
178
+ const canvas = canvasRef.current;
179
+ if (containerRect.width > 0 && containerRect.height > 0 && canvas) {
180
+ if (!root.current) root.current = loop.createRoot(canvas);
181
+ root.current.configure({
182
+ gl,
183
+ scene,
184
+ events,
185
+ shadows,
186
+ linear,
187
+ flat,
188
+ legacy,
189
+ orthographic,
190
+ frameloop,
191
+ dpr,
192
+ performance,
193
+ raycaster,
194
+ camera,
195
+ size: containerRect,
196
+ // Pass mutable reference to onPointerMissed so it's free to update
197
+ onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
198
+ onCreated: state => {
199
+ // Connect to event source
200
+ state.events.connect == null ? void 0 : state.events.connect(eventSource ? loop.isRef(eventSource) ? eventSource.current : eventSource : divRef.current);
201
+ // Set up compute function
202
+ if (eventPrefix) {
203
+ state.setEvents({
204
+ compute: (event, state) => {
205
+ const x = event[eventPrefix + 'X'];
206
+ const y = event[eventPrefix + 'Y'];
207
+ state.pointer.set(x / state.size.width * 2 - 1, -(y / state.size.height) * 2 + 1);
208
+ state.raycaster.setFromCamera(state.pointer, state.camera);
209
+ }
210
+ });
211
+ }
212
+ // Call onCreated callback
213
+ onCreated == null ? void 0 : onCreated(state);
214
+ }
215
+ });
216
+ root.current.render( /*#__PURE__*/React__namespace.createElement(Bridge, null, /*#__PURE__*/React__namespace.createElement(loop.ErrorBoundary, {
217
+ set: setError
218
+ }, /*#__PURE__*/React__namespace.createElement(React__namespace.Suspense, {
219
+ fallback: /*#__PURE__*/React__namespace.createElement(loop.Block, {
220
+ set: setBlock
221
+ })
222
+ }, children))));
223
+ }
224
+ });
205
225
  React__namespace.useEffect(() => {
206
- if (canvas) return () => index.unmountComponentAtNode(canvas);
207
- }, [canvas]);
226
+ const canvas = canvasRef.current;
227
+ if (canvas) return () => loop.unmountComponentAtNode(canvas);
228
+ }, []);
229
+
230
+ // When the event source is not this div, we need to set pointer-events to none
231
+ // Or else the canvas will block events from reaching the event source
232
+ const pointerEvents = eventSource ? 'none' : 'auto';
208
233
  return /*#__PURE__*/React__namespace.createElement("div", _extends({
209
234
  ref: divRef,
210
235
  style: {
@@ -212,6 +237,7 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
212
237
  width: '100%',
213
238
  height: '100%',
214
239
  overflow: 'hidden',
240
+ pointerEvents,
215
241
  ...style
216
242
  }
217
243
  }, props), /*#__PURE__*/React__namespace.createElement("div", {
@@ -228,33 +254,46 @@ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function Canvas({
228
254
  }, fallback)));
229
255
  });
230
256
 
231
- exports.FixedStage = index.FixedStage;
232
- exports.ReactThreeFiber = index.threeTypes;
233
- exports.Stage = index.Stage;
234
- exports.Stages = index.Stages;
235
- exports._roots = index.roots;
236
- exports.act = index.act;
237
- exports.addAfterEffect = index.addAfterEffect;
238
- exports.addEffect = index.addEffect;
239
- exports.addTail = index.addTail;
240
- exports.advance = index.advance;
241
- exports.applyProps = index.applyProps;
242
- exports.context = index.context;
243
- exports.createEvents = index.createEvents;
244
- exports.createPortal = index.createPortal;
245
- exports.createRoot = index.createRoot;
246
- exports.dispose = index.dispose;
247
- exports.extend = index.extend;
248
- exports.getRootState = index.getRootState;
249
- exports.invalidate = index.invalidate;
250
- exports.reconciler = index.reconciler;
251
- exports.render = index.render;
252
- exports.unmountComponentAtNode = index.unmountComponentAtNode;
253
- exports.useFrame = index.useFrame;
254
- exports.useGraph = index.useGraph;
255
- exports.useLoader = index.useLoader;
256
- exports.useStore = index.useStore;
257
- exports.useThree = index.useThree;
258
- exports.useUpdate = index.useUpdate;
257
+ /**
258
+ * A DOM canvas which accepts threejs elements as children.
259
+ * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
260
+ */
261
+ const Canvas = /*#__PURE__*/React__namespace.forwardRef(function CanvasWrapper(props, ref) {
262
+ return /*#__PURE__*/React__namespace.createElement(itsFine.FiberProvider, null, /*#__PURE__*/React__namespace.createElement(CanvasImpl, _extends({}, props, {
263
+ ref: ref
264
+ })));
265
+ });
266
+
267
+ exports.FixedStage = loop.FixedStage;
268
+ exports.ReactThreeFiber = loop.threeTypes;
269
+ exports.Stage = loop.Stage;
270
+ exports.Stages = loop.Stages;
271
+ exports._roots = loop._roots;
272
+ exports.act = loop.act;
273
+ exports.addAfterEffect = loop.addAfterEffect;
274
+ exports.addEffect = loop.addEffect;
275
+ exports.addTail = loop.addTail;
276
+ exports.advance = loop.advance;
277
+ exports.applyProps = loop.applyProps;
278
+ exports.buildGraph = loop.buildGraph;
279
+ exports.context = loop.context;
280
+ exports.createEvents = loop.createEvents;
281
+ exports.createPortal = loop.createPortal;
282
+ exports.createRoot = loop.createRoot;
283
+ exports.dispose = loop.dispose;
284
+ exports.extend = loop.extend;
285
+ exports.flushGlobalEffects = loop.flushGlobalEffects;
286
+ exports.getRootState = loop.getRootState;
287
+ exports.invalidate = loop.invalidate;
288
+ exports.reconciler = loop.reconciler;
289
+ exports.render = loop.render;
290
+ exports.unmountComponentAtNode = loop.unmountComponentAtNode;
291
+ exports.useFrame = loop.useFrame;
292
+ exports.useGraph = loop.useGraph;
293
+ exports.useInstanceHandle = loop.useInstanceHandle;
294
+ exports.useLoader = loop.useLoader;
295
+ exports.useStore = loop.useStore;
296
+ exports.useThree = loop.useThree;
297
+ exports.useUpdate = loop.useUpdate;
259
298
  exports.Canvas = Canvas;
260
299
  exports.events = createPointerEvents;
@@ -1,9 +1,10 @@
1
- import { c as createEvents, e as extend, u as useMutableCallback, a as createRoot, E as ErrorBoundary, B as Block, b as useIsomorphicLayoutEffect, d as unmountComponentAtNode } from './index-a9c7a6cd.esm.js';
2
- export { F as FixedStage, t as ReactThreeFiber, S as Stage, f as Stages, v as _roots, s as act, o as addAfterEffect, n as addEffect, p as addTail, m as advance, j as applyProps, g as context, c as createEvents, h as createPortal, a as createRoot, k as dispose, e as extend, q as getRootState, l as invalidate, i as reconciler, r as render, d as unmountComponentAtNode, y as useFrame, A as useGraph, C as useLoader, w as useStore, x as useThree, z as useUpdate } from './index-a9c7a6cd.esm.js';
1
+ import { c as createEvents, e as extend, u as useBridge, a as useMutableCallback, b as useIsomorphicLayoutEffect, d as createRoot, i as isRef, E as ErrorBoundary, B as Block, f as unmountComponentAtNode } from './loop-b2aca207.esm.js';
2
+ export { F as FixedStage, t as ReactThreeFiber, S as Stage, p as Stages, _ as _roots, x as act, j as addAfterEffect, h as addEffect, k as addTail, m as advance, s as applyProps, y as buildGraph, q as context, c as createEvents, o as createPortal, d as createRoot, w as dispose, e as extend, g as flushGlobalEffects, v as getRootState, l as invalidate, r as reconciler, n as render, f as unmountComponentAtNode, D as useFrame, H as useGraph, z as useInstanceHandle, I as useLoader, A as useStore, C as useThree, G as useUpdate } from './loop-b2aca207.esm.js';
3
3
  import _extends from '@babel/runtime/helpers/esm/extends';
4
4
  import * as React from 'react';
5
5
  import * as THREE from 'three';
6
6
  import useMeasure from 'react-use-measure';
7
+ import { FiberProvider } from 'its-fine';
7
8
  import 'react-reconciler/constants';
8
9
  import 'zustand';
9
10
  import 'react-reconciler';
@@ -22,8 +23,8 @@ const DOM_EVENTS = {
22
23
  onPointerCancel: ['pointercancel', true],
23
24
  onLostPointerCapture: ['lostpointercapture', true]
24
25
  };
25
- /** Default R3F event manager for web */
26
26
 
27
+ /** Default R3F event manager for web */
27
28
  function createPointerEvents(store) {
28
29
  const {
29
30
  handlePointer
@@ -31,55 +32,63 @@ function createPointerEvents(store) {
31
32
  return {
32
33
  priority: 1,
33
34
  enabled: true,
34
-
35
35
  compute(event, state, previous) {
36
36
  // https://github.com/pmndrs/react-three-fiber/pull/782
37
37
  // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
38
38
  state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
39
39
  state.raycaster.setFromCamera(state.pointer, state.camera);
40
40
  },
41
-
42
41
  connected: undefined,
43
- handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({ ...acc,
42
+ handlers: Object.keys(DOM_EVENTS).reduce((acc, key) => ({
43
+ ...acc,
44
44
  [key]: handlePointer(key)
45
45
  }), {}),
46
+ update: () => {
47
+ var _internal$lastEvent;
48
+ const {
49
+ events,
50
+ internal
51
+ } = store.getState();
52
+ if ((_internal$lastEvent = internal.lastEvent) != null && _internal$lastEvent.current && events.handlers) events.handlers.onPointerMove(internal.lastEvent.current);
53
+ },
46
54
  connect: target => {
47
- var _events$handlers;
48
-
49
55
  const {
50
56
  set,
51
57
  events
52
58
  } = store.getState();
53
59
  events.disconnect == null ? void 0 : events.disconnect();
54
60
  set(state => ({
55
- events: { ...state.events,
61
+ events: {
62
+ ...state.events,
56
63
  connected: target
57
64
  }
58
65
  }));
59
- Object.entries((_events$handlers = events.handlers) != null ? _events$handlers : []).forEach(([name, event]) => {
60
- const [eventName, passive] = DOM_EVENTS[name];
61
- target.addEventListener(eventName, event, {
62
- passive
63
- });
64
- });
66
+ if (events.handlers) {
67
+ for (const name in events.handlers) {
68
+ const event = events.handlers[name];
69
+ const [eventName, passive] = DOM_EVENTS[name];
70
+ target.addEventListener(eventName, event, {
71
+ passive
72
+ });
73
+ }
74
+ }
65
75
  },
66
76
  disconnect: () => {
67
77
  const {
68
78
  set,
69
79
  events
70
80
  } = store.getState();
71
-
72
81
  if (events.connected) {
73
- var _events$handlers2;
74
-
75
- Object.entries((_events$handlers2 = events.handlers) != null ? _events$handlers2 : []).forEach(([name, event]) => {
76
- if (events && events.connected instanceof HTMLElement) {
82
+ if (events.handlers) {
83
+ for (const name in events.handlers) {
84
+ const event = events.handlers[name];
77
85
  const [eventName] = DOM_EVENTS[name];
78
86
  events.connected.removeEventListener(eventName, event);
79
87
  }
80
- });
88
+ }
81
89
  set(state => ({
82
- events: { ...state.events,
90
+ events: {
91
+ ...state.events,
83
92
  connected: undefined
84
93
  }
85
94
  }));
@@ -88,17 +97,15 @@ function createPointerEvents(store) {
88
97
  };
89
98
  }
90
99
 
91
- /**
92
- * A DOM canvas which accepts threejs elements as children.
93
- * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
94
- */
95
- const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
100
+ const CanvasImpl = /*#__PURE__*/React.forwardRef(function Canvas({
96
101
  children,
97
102
  fallback,
98
103
  resize,
99
104
  style,
100
105
  gl,
101
106
  events = createPointerEvents,
107
+ eventSource,
108
+ eventPrefix,
102
109
  shadows,
103
110
  linear,
104
111
  flat,
@@ -109,6 +116,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
109
116
  performance,
110
117
  raycaster,
111
118
  camera,
119
+ scene,
112
120
  onPointerMissed,
113
121
  onCreated,
114
122
  stages,
@@ -118,6 +126,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
118
126
  // This will include the entire THREE namespace by default, users can extend
119
127
  // their own elements by using the createRoot API instead
120
128
  React.useMemo(() => extend(THREE), []);
129
+ const Bridge = useBridge();
121
130
  const [containerRef, containerRect] = useMeasure({
122
131
  scroll: true,
123
132
  debounce: {
@@ -128,56 +137,72 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
128
137
  });
129
138
  const canvasRef = React.useRef(null);
130
139
  const divRef = React.useRef(null);
131
- const [canvas, setCanvas] = React.useState(null);
132
140
  React.useImperativeHandle(forwardedRef, () => canvasRef.current);
133
141
  const handlePointerMissed = useMutableCallback(onPointerMissed);
134
142
  const [block, setBlock] = React.useState(false);
135
- const [error, setError] = React.useState(false); // Suspend this component if block is a promise (2nd run)
136
-
137
- if (block) throw block; // Throw exception outwards if anything within canvas throws
143
+ const [error, setError] = React.useState(false);
138
144
 
145
+ // Suspend this component if block is a promise (2nd run)
146
+ if (block) throw block;
147
+ // Throw exception outwards if anything within canvas throws
139
148
  if (error) throw error;
140
149
  const root = React.useRef(null);
141
-
142
- if (containerRect.width > 0 && containerRect.height > 0 && canvas) {
143
- if (!root.current) root.current = createRoot(canvas);
144
- root.current.configure({
145
- gl,
146
- events,
147
- shadows,
148
- linear,
149
- flat,
150
- legacy,
151
- orthographic,
152
- frameloop,
153
- dpr,
154
- performance,
155
- raycaster,
156
- camera,
157
- stages,
158
- size: containerRect,
159
- // Pass mutable reference to onPointerMissed so it's free to update
160
- onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
161
- onCreated: state => {
162
- state.events.connect == null ? void 0 : state.events.connect(divRef.current);
163
- onCreated == null ? void 0 : onCreated(state);
164
- }
165
- });
166
- root.current.render( /*#__PURE__*/React.createElement(ErrorBoundary, {
167
- set: setError
168
- }, /*#__PURE__*/React.createElement(React.Suspense, {
169
- fallback: /*#__PURE__*/React.createElement(Block, {
170
- set: setBlock
171
- })
172
- }, children)));
173
- }
174
-
175
150
  useIsomorphicLayoutEffect(() => {
176
- setCanvas(canvasRef.current);
177
- }, []);
151
+ const canvas = canvasRef.current;
152
+ if (containerRect.width > 0 && containerRect.height > 0 && canvas) {
153
+ if (!root.current) root.current = createRoot(canvas);
154
+ root.current.configure({
155
+ gl,
156
+ scene,
157
+ events,
158
+ shadows,
159
+ linear,
160
+ flat,
161
+ legacy,
162
+ orthographic,
163
+ frameloop,
164
+ dpr,
165
+ performance,
166
+ raycaster,
167
+ camera,
168
+ size: containerRect,
169
+ // Pass mutable reference to onPointerMissed so it's free to update
170
+ onPointerMissed: (...args) => handlePointerMissed.current == null ? void 0 : handlePointerMissed.current(...args),
171
+ onCreated: state => {
172
+ // Connect to event source
173
+ state.events.connect == null ? void 0 : state.events.connect(eventSource ? isRef(eventSource) ? eventSource.current : eventSource : divRef.current);
174
+ // Set up compute function
175
+ if (eventPrefix) {
176
+ state.setEvents({
177
+ compute: (event, state) => {
178
+ const x = event[eventPrefix + 'X'];
179
+ const y = event[eventPrefix + 'Y'];
180
+ state.pointer.set(x / state.size.width * 2 - 1, -(y / state.size.height) * 2 + 1);
181
+ state.raycaster.setFromCamera(state.pointer, state.camera);
182
+ }
183
+ });
184
+ }
185
+ // Call onCreated callback
186
+ onCreated == null ? void 0 : onCreated(state);
187
+ }
188
+ });
189
+ root.current.render( /*#__PURE__*/React.createElement(Bridge, null, /*#__PURE__*/React.createElement(ErrorBoundary, {
190
+ set: setError
191
+ }, /*#__PURE__*/React.createElement(React.Suspense, {
192
+ fallback: /*#__PURE__*/React.createElement(Block, {
193
+ set: setBlock
194
+ })
195
+ }, children))));
196
+ }
197
+ });
178
198
  React.useEffect(() => {
199
+ const canvas = canvasRef.current;
179
200
  if (canvas) return () => unmountComponentAtNode(canvas);
180
- }, [canvas]);
201
+ }, []);
202
+
203
+ // When the event source is not this div, we need to set pointer-events to none
204
+ // Or else the canvas will block events from reaching the event source
205
+ const pointerEvents = eventSource ? 'none' : 'auto';
181
206
  return /*#__PURE__*/React.createElement("div", _extends({
182
207
  ref: divRef,
183
208
  style: {
@@ -185,6 +210,7 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
185
210
  width: '100%',
186
211
  height: '100%',
187
212
  overflow: 'hidden',
213
+ pointerEvents,
188
214
  ...style
189
215
  }
190
216
  }, props), /*#__PURE__*/React.createElement("div", {
@@ -201,4 +227,14 @@ const Canvas = /*#__PURE__*/React.forwardRef(function Canvas({
201
227
  }, fallback)));
202
228
  });
203
229
 
230
+ /**
231
+ * A DOM canvas which accepts threejs elements as children.
232
+ * @see https://docs.pmnd.rs/react-three-fiber/api/canvas
233
+ */
234
+ const Canvas = /*#__PURE__*/React.forwardRef(function CanvasWrapper(props, ref) {
235
+ return /*#__PURE__*/React.createElement(FiberProvider, null, /*#__PURE__*/React.createElement(CanvasImpl, _extends({}, props, {
236
+ ref: ref
237
+ })));
238
+ });
239
+
204
240
  export { Canvas, createPointerEvents as events };
@@ -1 +1,2 @@
1
1
  export * from "../../dist/declarations/src/native";
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdGhyZWUtZmliZXItbmF0aXZlLmNqcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGlzdC9kZWNsYXJhdGlvbnMvc3JjL25hdGl2ZS5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=