@react-three/fiber 9.0.0-rc.8 → 9.0.0

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
+ ## 9.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 226d2ec: feat: React 19 support
8
+
9
+ ## 8.18.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 54a3330f: feat: make children optional in Canvas
14
+
3
15
  ## 8.17.14
4
16
 
5
17
  ### Patch Changes
@@ -56,6 +56,7 @@ export interface EventHandlers {
56
56
  onPointerMissed?: (event: MouseEvent) => void;
57
57
  onPointerCancel?: (event: ThreeEvent<PointerEvent>) => void;
58
58
  onWheel?: (event: ThreeEvent<WheelEvent>) => void;
59
+ onLostPointerCapture?: (event: ThreeEvent<PointerEvent>) => void;
59
60
  }
60
61
  export type FilterFunction = (items: THREE.Intersection[], state: RootState) => THREE.Intersection[];
61
62
  export type ComputeFunction = (event: DomEvent, root: RootState, previous?: RootState) => void;
@@ -31,11 +31,13 @@ export declare function useFrame(callback: RenderCallback, renderPriority?: numb
31
31
  * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#usegraph
32
32
  */
33
33
  export declare function useGraph(object: THREE.Object3D): ObjectMap;
34
- type LoaderLike = THREE.Loader<any, string | string[] | string[][] | Readonly<string | string[] | string[][]>>;
35
- type LoaderInstance<T extends LoaderLike | ConstructorRepresentation<LoaderLike>> = T extends ConstructorRepresentation<LoaderLike> ? InstanceType<T> : T;
36
- export type LoaderResult<T extends LoaderLike | ConstructorRepresentation<LoaderLike>> = Awaited<ReturnType<LoaderInstance<T>['loadAsync']>> extends infer R ? R extends {
34
+ type InputLike = string | string[] | string[][] | Readonly<string | string[] | string[][]>;
35
+ type LoaderLike = THREE.Loader<any, InputLike>;
36
+ type GLTFLike = {
37
37
  scene: THREE.Object3D;
38
- } ? R & ObjectMap : R : never;
38
+ };
39
+ type LoaderInstance<T extends LoaderLike | ConstructorRepresentation<LoaderLike>> = T extends ConstructorRepresentation<LoaderLike> ? InstanceType<T> : T;
40
+ export type LoaderResult<T extends LoaderLike | ConstructorRepresentation<LoaderLike>> = Awaited<ReturnType<LoaderInstance<T>['loadAsync']>> extends infer R ? R extends GLTFLike ? R & ObjectMap : R : never;
39
41
  export type Extensions<T extends LoaderLike | ConstructorRepresentation<LoaderLike>> = (loader: LoaderInstance<T>) => void;
40
42
  /**
41
43
  * Synchronously loads and caches assets with a three loader.
@@ -43,9 +45,9 @@ export type Extensions<T extends LoaderLike | ConstructorRepresentation<LoaderLi
43
45
  * Note: this hook's caller must be wrapped with `React.Suspense`
44
46
  * @see https://docs.pmnd.rs/react-three-fiber/api/hooks#useloader
45
47
  */
46
- export declare function useLoader<T, U extends string | string[] | string[][], L extends LoaderLike | ConstructorRepresentation<LoaderLike>>(loader: L, input: U, extensions?: Extensions<L>, onProgress?: (event: ProgressEvent<EventTarget>) => void): U extends any[] ? LoaderResult<L>[] : LoaderResult<L>;
48
+ export declare function useLoader<I extends InputLike, L extends LoaderLike | ConstructorRepresentation<LoaderLike>>(loader: L, input: I, extensions?: Extensions<L>, onProgress?: (event: ProgressEvent<EventTarget>) => void): I extends any[] ? LoaderResult<L>[] : LoaderResult<L>;
47
49
  export declare namespace useLoader {
48
- var preload: <T, U extends string | string[] | string[][], L extends LoaderLike | ConstructorRepresentation<LoaderLike>>(loader: L, input: U, extensions?: Extensions<L> | undefined) => void;
49
- var clear: <T, U extends string | string[] | string[][], L extends LoaderLike | ConstructorRepresentation<LoaderLike>>(loader: L, input: U) => void;
50
+ var preload: <I extends InputLike, L extends LoaderLike | ConstructorRepresentation<LoaderLike>>(loader: L, input: I, extensions?: Extensions<L> | undefined) => void;
51
+ var clear: <I extends InputLike, L extends LoaderLike | ConstructorRepresentation<LoaderLike>>(loader: L, input: I) => void;
50
52
  }
51
53
  export {};
@@ -27,6 +27,7 @@ export type Camera = (THREE.OrthographicCamera | THREE.PerspectiveCamera) & {
27
27
  };
28
28
  export declare const isOrthographicCamera: (def: Camera) => def is THREE.OrthographicCamera;
29
29
  export declare const isRef: (obj: any) => obj is React.RefObject<unknown>;
30
+ export declare const isColorRepresentation: (value: unknown) => value is THREE.ColorRepresentation;
30
31
  /**
31
32
  * An SSR-friendly useLayoutEffect.
32
33
  *
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { View, type ViewProps, type ViewStyle } from 'react-native';
3
3
  import { RenderProps } from "../core/index.js";
4
4
  export interface CanvasProps extends Omit<RenderProps<HTMLCanvasElement>, 'size' | 'dpr'>, Omit<ViewProps, 'children'> {
5
- children: React.ReactNode;
5
+ children?: React.ReactNode;
6
6
  style?: ViewStyle;
7
7
  ref?: React.Ref<View>;
8
8
  }
@@ -37,9 +37,10 @@ type DuplicateKeys<T, U> = Extract<keyof T, keyof U>;
37
37
  type Conflicts = DuplicateKeys<JSX.IntrinsicElements, {
38
38
  [K in keyof ThreeExports as Uncapitalize<K>]: any;
39
39
  }>;
40
- type ThreeElementsImpl = {
41
- [K in keyof ThreeExports as Uncapitalize<K> extends Conflicts ? `three${Capitalize<K>}` : Uncapitalize<K>]: ThreeExports[K] extends ConstructorRepresentation ? ThreeElement<ThreeExports[K]> : never;
40
+ export type ThreeToJSXElements<T extends Record<string, any>> = {
41
+ [K in keyof T & string as Uncapitalize<K> extends Conflicts ? `three${Capitalize<K>}` : Uncapitalize<K>]: T[K] extends ConstructorRepresentation ? ThreeElement<T[K]> : never;
42
42
  };
43
+ type ThreeElementsImpl = ThreeToJSXElements<ThreeExports>;
43
44
  export interface ThreeElements extends ThreeElementsImpl {
44
45
  primitive: Omit<ThreeElement<any>, 'args'> & {
45
46
  object: object;
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { Options as ResizeOptions } from 'react-use-measure';
3
3
  import { RenderProps } from "../core/index.js";
4
4
  export interface CanvasProps extends Omit<RenderProps<HTMLCanvasElement>, 'size'>, React.HTMLAttributes<HTMLDivElement> {
5
- children: React.ReactNode;
5
+ children?: React.ReactNode;
6
6
  ref?: React.Ref<HTMLCanvasElement>;
7
7
  /** Canvas fallback content, similar to img's alt prop */
8
8
  fallback?: React.ReactNode;
@@ -26,6 +26,7 @@ function findInitialRoot(instance) {
26
26
  const act = React.act;
27
27
  const isOrthographicCamera = def => def && def.isOrthographicCamera;
28
28
  const isRef = obj => obj && obj.hasOwnProperty('current');
29
+ const isColorRepresentation = value => value != null && (typeof value === 'string' || typeof value === 'number' || value.isColor);
29
30
 
30
31
  /**
31
32
  * An SSR-friendly useLayoutEffect.
@@ -370,19 +371,22 @@ function applyProps(object, props) {
370
371
  if (target instanceof THREE.Layers && value instanceof THREE.Layers) {
371
372
  target.mask = value.mask;
372
373
  }
374
+ // Set colors if valid color representation for automatic conversion (copy)
375
+ else if (target instanceof THREE.Color && isColorRepresentation(value)) {
376
+ target.set(value);
377
+ }
373
378
  // Copy if properties match signatures and implement math interface (likely read-only)
374
- else if (target && typeof target.set === 'function' && typeof target.copy === 'function' && value != null && value.constructor && target.constructor === value.constructor) {
379
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && typeof target.copy === 'function' && value != null && value.constructor && target.constructor === value.constructor) {
375
380
  target.copy(value);
376
381
  }
377
382
  // Set array types
378
- else if (target && typeof target.set === 'function' && Array.isArray(value)) {
383
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && Array.isArray(value)) {
379
384
  if (typeof target.fromArray === 'function') target.fromArray(value);else target.set(...value);
380
385
  }
381
386
  // Set literal types
382
- else if (target && typeof target.set === 'function' && typeof value === 'number') {
383
- // Allow setting array scalars (don't call setScalar for Color since it skips conversions)
384
- const isColor = target.isColor;
385
- if (!isColor && typeof target.setScalar === 'function') target.setScalar(value);
387
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && typeof value === 'number') {
388
+ // Allow setting array scalars
389
+ if (typeof target.setScalar === 'function') target.setScalar(value);
386
390
  // Otherwise just set single value
387
391
  else target.set(value);
388
392
  }
@@ -2296,7 +2300,7 @@ function createPointerEvents(store) {
2296
2300
  compute(event, state, previous) {
2297
2301
  // https://github.com/pmndrs/react-three-fiber/pull/782
2298
2302
  // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
2299
- state.pointer.set((event.offsetX - state.size.left) / state.size.width * 2 - 1, -((event.offsetY - state.size.top) / state.size.height) * 2 + 1);
2303
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
2300
2304
  state.raycaster.setFromCamera(state.pointer, state.camera);
2301
2305
  },
2302
2306
  connected: undefined,
@@ -52,6 +52,7 @@ function findInitialRoot(instance) {
52
52
  const act = React__namespace.act;
53
53
  const isOrthographicCamera = def => def && def.isOrthographicCamera;
54
54
  const isRef = obj => obj && obj.hasOwnProperty('current');
55
+ const isColorRepresentation = value => value != null && (typeof value === 'string' || typeof value === 'number' || value.isColor);
55
56
 
56
57
  /**
57
58
  * An SSR-friendly useLayoutEffect.
@@ -396,19 +397,22 @@ function applyProps(object, props) {
396
397
  if (target instanceof THREE__namespace.Layers && value instanceof THREE__namespace.Layers) {
397
398
  target.mask = value.mask;
398
399
  }
400
+ // Set colors if valid color representation for automatic conversion (copy)
401
+ else if (target instanceof THREE__namespace.Color && isColorRepresentation(value)) {
402
+ target.set(value);
403
+ }
399
404
  // Copy if properties match signatures and implement math interface (likely read-only)
400
- else if (target && typeof target.set === 'function' && typeof target.copy === 'function' && value != null && value.constructor && target.constructor === value.constructor) {
405
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && typeof target.copy === 'function' && value != null && value.constructor && target.constructor === value.constructor) {
401
406
  target.copy(value);
402
407
  }
403
408
  // Set array types
404
- else if (target && typeof target.set === 'function' && Array.isArray(value)) {
409
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && Array.isArray(value)) {
405
410
  if (typeof target.fromArray === 'function') target.fromArray(value);else target.set(...value);
406
411
  }
407
412
  // Set literal types
408
- else if (target && typeof target.set === 'function' && typeof value === 'number') {
409
- // Allow setting array scalars (don't call setScalar for Color since it skips conversions)
410
- const isColor = target.isColor;
411
- if (!isColor && typeof target.setScalar === 'function') target.setScalar(value);
413
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && typeof value === 'number') {
414
+ // Allow setting array scalars
415
+ if (typeof target.setScalar === 'function') target.setScalar(value);
412
416
  // Otherwise just set single value
413
417
  else target.set(value);
414
418
  }
@@ -2322,7 +2326,7 @@ function createPointerEvents(store) {
2322
2326
  compute(event, state, previous) {
2323
2327
  // https://github.com/pmndrs/react-three-fiber/pull/782
2324
2328
  // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
2325
- state.pointer.set((event.offsetX - state.size.left) / state.size.width * 2 - 1, -((event.offsetY - state.size.top) / state.size.height) * 2 + 1);
2329
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
2326
2330
  state.raycaster.setFromCamera(state.pointer, state.camera);
2327
2331
  },
2328
2332
  connected: undefined,
@@ -52,6 +52,7 @@ function findInitialRoot(instance) {
52
52
  const act = React__namespace.act;
53
53
  const isOrthographicCamera = def => def && def.isOrthographicCamera;
54
54
  const isRef = obj => obj && obj.hasOwnProperty('current');
55
+ const isColorRepresentation = value => value != null && (typeof value === 'string' || typeof value === 'number' || value.isColor);
55
56
 
56
57
  /**
57
58
  * An SSR-friendly useLayoutEffect.
@@ -396,19 +397,22 @@ function applyProps(object, props) {
396
397
  if (target instanceof THREE__namespace.Layers && value instanceof THREE__namespace.Layers) {
397
398
  target.mask = value.mask;
398
399
  }
400
+ // Set colors if valid color representation for automatic conversion (copy)
401
+ else if (target instanceof THREE__namespace.Color && isColorRepresentation(value)) {
402
+ target.set(value);
403
+ }
399
404
  // Copy if properties match signatures and implement math interface (likely read-only)
400
- else if (target && typeof target.set === 'function' && typeof target.copy === 'function' && value != null && value.constructor && target.constructor === value.constructor) {
405
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && typeof target.copy === 'function' && value != null && value.constructor && target.constructor === value.constructor) {
401
406
  target.copy(value);
402
407
  }
403
408
  // Set array types
404
- else if (target && typeof target.set === 'function' && Array.isArray(value)) {
409
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && Array.isArray(value)) {
405
410
  if (typeof target.fromArray === 'function') target.fromArray(value);else target.set(...value);
406
411
  }
407
412
  // Set literal types
408
- else if (target && typeof target.set === 'function' && typeof value === 'number') {
409
- // Allow setting array scalars (don't call setScalar for Color since it skips conversions)
410
- const isColor = target.isColor;
411
- if (!isColor && typeof target.setScalar === 'function') target.setScalar(value);
413
+ else if (target !== null && typeof target === 'object' && typeof target.set === 'function' && typeof value === 'number') {
414
+ // Allow setting array scalars
415
+ if (typeof target.setScalar === 'function') target.setScalar(value);
412
416
  // Otherwise just set single value
413
417
  else target.set(value);
414
418
  }
@@ -2322,7 +2326,7 @@ function createPointerEvents(store) {
2322
2326
  compute(event, state, previous) {
2323
2327
  // https://github.com/pmndrs/react-three-fiber/pull/782
2324
2328
  // Events trigger outside of canvas when moved, use offsetX/Y by default and allow overrides
2325
- state.pointer.set((event.offsetX - state.size.left) / state.size.width * 2 - 1, -((event.offsetY - state.size.top) / state.size.height) * 2 + 1);
2329
+ state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
2326
2330
  state.raycaster.setFromCamera(state.pointer, state.camera);
2327
2331
  },
2328
2332
  connected: undefined,
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('./events-89dd614d.cjs.dev.js');
5
+ var events = require('./events-29e84b1f.cjs.dev.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var useMeasure = require('react-use-measure');
@@ -135,7 +135,7 @@ function CanvasImpl({
135
135
  fallback: /*#__PURE__*/jsxRuntime.jsx(events.Block, {
136
136
  set: setBlock
137
137
  }),
138
- children: children
138
+ children: children != null ? children : null
139
139
  })
140
140
  })
141
141
  }));
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('./events-b4105f71.cjs.prod.js');
5
+ var events = require('./events-8ef03cf1.cjs.prod.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var useMeasure = require('react-use-measure');
@@ -135,7 +135,7 @@ function CanvasImpl({
135
135
  fallback: /*#__PURE__*/jsxRuntime.jsx(events.Block, {
136
136
  set: setBlock
137
137
  }),
138
- children: children
138
+ children: children != null ? children : null
139
139
  })
140
140
  })
141
141
  }));
@@ -1,5 +1,5 @@
1
- import { e as extend, u as useBridge, a as useMutableCallback, b as useIsomorphicLayoutEffect, c as createRoot, i as isRef, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents } from './events-5b423474.esm.js';
2
- export { t as ReactThreeFiber, _ as _roots, w as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, q as applyProps, x as buildGraph, p as context, g as createEvents, o as createPortal, c as createRoot, v as dispose, f as events, e as extend, h as flushGlobalEffects, s as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, C as useFrame, D as useGraph, y as useInstanceHandle, F as useLoader, z as useStore, A as useThree } from './events-5b423474.esm.js';
1
+ import { e as extend, u as useBridge, a as useMutableCallback, b as useIsomorphicLayoutEffect, c as createRoot, i as isRef, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents } from './events-0dc84b81.esm.js';
2
+ export { t as ReactThreeFiber, _ as _roots, w as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, q as applyProps, x as buildGraph, p as context, g as createEvents, o as createPortal, c as createRoot, v as dispose, f as events, e as extend, h as flushGlobalEffects, s as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, C as useFrame, D as useGraph, y as useInstanceHandle, F as useLoader, z as useStore, A as useThree } from './events-0dc84b81.esm.js';
3
3
  import * as React from 'react';
4
4
  import * as THREE from 'three';
5
5
  import useMeasure from 'react-use-measure';
@@ -108,7 +108,7 @@ function CanvasImpl({
108
108
  fallback: /*#__PURE__*/jsx(Block, {
109
109
  set: setBlock
110
110
  }),
111
- children: children
111
+ children: children != null ? children : null
112
112
  })
113
113
  })
114
114
  }));
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('../../dist/events-89dd614d.cjs.dev.js');
5
+ var events = require('../../dist/events-29e84b1f.cjs.dev.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var reactNative = require('react-native');
@@ -239,7 +239,7 @@ function CanvasImpl({
239
239
  fallback: /*#__PURE__*/jsxRuntime.jsx(events.Block, {
240
240
  set: setBlock
241
241
  }),
242
- children: children
242
+ children: children != null ? children : null
243
243
  })
244
244
  })
245
245
  }));
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var events = require('../../dist/events-b4105f71.cjs.prod.js');
5
+ var events = require('../../dist/events-8ef03cf1.cjs.prod.js');
6
6
  var React = require('react');
7
7
  var THREE = require('three');
8
8
  var reactNative = require('react-native');
@@ -239,7 +239,7 @@ function CanvasImpl({
239
239
  fallback: /*#__PURE__*/jsxRuntime.jsx(events.Block, {
240
240
  set: setBlock
241
241
  }),
242
- children: children
242
+ children: children != null ? children : null
243
243
  })
244
244
  })
245
245
  }));
@@ -1,5 +1,5 @@
1
- import { e as extend, u as useBridge, a as useMutableCallback, c as createRoot, b as useIsomorphicLayoutEffect, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents, g as createEvents } from '../../dist/events-5b423474.esm.js';
2
- export { t as ReactThreeFiber, _ as _roots, w as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, q as applyProps, x as buildGraph, p as context, g as createEvents, o as createPortal, c as createRoot, v as dispose, e as extend, h as flushGlobalEffects, s as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, C as useFrame, D as useGraph, y as useInstanceHandle, F as useLoader, z as useStore, A as useThree } from '../../dist/events-5b423474.esm.js';
1
+ import { e as extend, u as useBridge, a as useMutableCallback, c as createRoot, b as useIsomorphicLayoutEffect, E as ErrorBoundary, B as Block, d as unmountComponentAtNode, f as createPointerEvents, g as createEvents } from '../../dist/events-0dc84b81.esm.js';
2
+ export { t as ReactThreeFiber, _ as _roots, w as act, k as addAfterEffect, j as addEffect, l as addTail, n as advance, q as applyProps, x as buildGraph, p as context, g as createEvents, o as createPortal, c as createRoot, v as dispose, e as extend, h as flushGlobalEffects, s as getRootState, m as invalidate, r as reconciler, d as unmountComponentAtNode, C as useFrame, D as useGraph, y as useInstanceHandle, F as useLoader, z as useStore, A as useThree } from '../../dist/events-0dc84b81.esm.js';
3
3
  import * as React from 'react';
4
4
  import * as THREE from 'three';
5
5
  import { PanResponder, PixelRatio, StyleSheet, View, Platform, Image, NativeModules } from 'react-native';
@@ -214,7 +214,7 @@ function CanvasImpl({
214
214
  fallback: /*#__PURE__*/jsx(Block, {
215
215
  set: setBlock
216
216
  }),
217
- children: children
217
+ children: children != null ? children : null
218
218
  })
219
219
  })
220
220
  }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/fiber",
3
- "version": "9.0.0-rc.8",
3
+ "version": "9.0.0",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",
@@ -43,16 +43,16 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@babel/runtime": "^7.17.8",
46
- "@types/react-reconciler": "^0.28.8",
46
+ "@types/react-reconciler": "^0.28.9",
47
47
  "@types/webxr": "*",
48
48
  "base64-js": "^1.5.1",
49
49
  "buffer": "^6.0.3",
50
- "its-fine": "^1.2.5",
51
- "react-reconciler": "0.31.0",
50
+ "its-fine": "^2.0.0",
51
+ "react-reconciler": "^0.31.0",
52
52
  "react-use-measure": "^2.1.7",
53
- "scheduler": "0.25.0",
53
+ "scheduler": "^0.25.0",
54
54
  "suspend-react": "^0.1.3",
55
- "zustand": "^4.1.2"
55
+ "zustand": "^5.0.3"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "expo": ">=43.0",
package/readme.md CHANGED
@@ -139,7 +139,7 @@ npm install expo-cli -g
139
139
  expo init my-app
140
140
  cd my-app
141
141
  # Install dependencies
142
- npm install three @react-three/fiber@beta react@rc
142
+ npm install three @react-three/fiber react
143
143
  # Start
144
144
  expo start
145
145
  ```