diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json
index 217fa53fc..c81521fa3 100644
--- a/.codesandbox/ci.json
+++ b/.codesandbox/ci.json
@@ -1,5 +1,5 @@
{
"sandboxes": ["4nc1u", "bfplr", "1wh6f"],
"packages": ["dist"],
- "node": "18"
+ "node": "20"
}
diff --git a/.storybook/Setup.tsx b/.storybook/Setup.tsx
index 7e50ba92c..e3becb4d5 100644
--- a/.storybook/Setup.tsx
+++ b/.storybook/Setup.tsx
@@ -1,6 +1,6 @@
import * as React from 'react'
import { Vector3 } from 'three'
-import { Canvas, Props as CanvasProps } from '@react-three/fiber'
+import { Canvas, CanvasProps } from '@react-three/fiber'
import { OrbitControls } from '../src'
@@ -25,8 +25,8 @@ export const Setup = ({
{children}
{lights && (
<>
-
-
+
+
>
)}
{controls && }
diff --git a/.storybook/stories/AccumulativeShadows.stories.tsx b/.storybook/stories/AccumulativeShadows.stories.tsx
index eb71abacc..6aa968cb9 100644
--- a/.storybook/stories/AccumulativeShadows.stories.tsx
+++ b/.storybook/stories/AccumulativeShadows.stories.tsx
@@ -1,7 +1,7 @@
import * as THREE from 'three'
import * as React from 'react'
import { ComponentProps } from 'react'
-import { FlakesTexture } from 'three/examples/jsm/textures/FlakesTexture'
+import { FlakesTexture } from 'three-stdlib'
import { Meta, StoryObj } from '@storybook/react'
import { Setup } from '../Setup'
@@ -48,7 +48,7 @@ function Suzi(props: ComponentProps<'group'>) {
material.color.set('orange')
material.roughness = 0
material.normalMap = new THREE.CanvasTexture(
- new FlakesTexture(),
+ new FlakesTexture() as HTMLCanvasElement,
THREE.UVMapping,
THREE.RepeatWrapping,
THREE.RepeatWrapping
diff --git a/.storybook/stories/Adaptive.stories.tsx b/.storybook/stories/Adaptive.stories.tsx
index 3b12db54f..6c7eeecda 100644
--- a/.storybook/stories/Adaptive.stories.tsx
+++ b/.storybook/stories/Adaptive.stories.tsx
@@ -60,7 +60,7 @@ function AdaptiveScene(props: ComponentProps) {
) => {
* we will render our scene in a render target and use it as a map.
*/
const fbo = useFBO(400, 400)
- const virtualCamera = useRef()
+ const virtualCamera = useRef(null!)
const [virtualScene] = useState(() => new Scene())
useFrame(({ gl }) => {
diff --git a/.storybook/stories/BBAnchor.stories.tsx b/.storybook/stories/BBAnchor.stories.tsx
index c2ceb5e01..a3f6aad7d 100644
--- a/.storybook/stories/BBAnchor.stories.tsx
+++ b/.storybook/stories/BBAnchor.stories.tsx
@@ -30,7 +30,7 @@ function BBAnchorScene({
drawBoundingBox: boolean
children?: React.ReactNode
}) {
- const ref = React.useRef(null)
+ const ref = React.useRef>(null!)
useHelper(drawBoundingBox && ref, BoxHelper, 'cyan')
diff --git a/.storybook/stories/Bvh.stories.tsx b/.storybook/stories/Bvh.stories.tsx
index 57d793278..e0aa1f650 100644
--- a/.storybook/stories/Bvh.stories.tsx
+++ b/.storybook/stories/Bvh.stories.tsx
@@ -23,7 +23,7 @@ export default {
type Story = StoryObj
function TorusBVH({ z = 0, ...props }: { z: number } & React.ComponentProps) {
- const mesh = React.useRef>(null!)
+ const mesh = React.useRef>(null!)
useHelper(mesh, MeshBVHHelper)
@@ -122,7 +122,7 @@ const DebugRayCast = ({ grp }) => {
}
function Scene(props: React.ComponentProps) {
- const grp = React.useRef>(null)
+ const grp = React.useRef>(null)
const { raycaster } = useThree()
raycaster.firstHitOnly = true
diff --git a/.storybook/stories/CameraControls.stories.tsx b/.storybook/stories/CameraControls.stories.tsx
index c093e8c78..40ec47c48 100644
--- a/.storybook/stories/CameraControls.stories.tsx
+++ b/.storybook/stories/CameraControls.stories.tsx
@@ -1,6 +1,6 @@
import { createPortal, useFrame } from '@react-three/fiber'
import React, { ComponentProps, useRef, useState } from 'react'
-import { Scene } from 'three'
+import * as THREE from 'three'
import { Meta, StoryObj } from '@storybook/react'
import { Setup } from '../Setup'
@@ -47,9 +47,9 @@ const CameraControlsScene2 = (props: ComponentProps) => {
* we will render our scene in a render target and use it as a map.
*/
const fbo = useFBO(400, 400)
- const virtualCamera = useRef()
- const [virtualScene] = useState(() => new Scene())
- const cameraControlRef = useRef(null)
+ const virtualCamera = useRef(null!)
+ const [virtualScene] = useState(() => new THREE.Scene())
+ const cameraControlRef = useRef(null!)
useFrame(({ gl }) => {
if (virtualCamera.current) {
diff --git a/.storybook/stories/CubeCamera.stories.tsx b/.storybook/stories/CubeCamera.stories.tsx
index 55537eaa8..10addadf1 100644
--- a/.storybook/stories/CubeCamera.stories.tsx
+++ b/.storybook/stories/CubeCamera.stories.tsx
@@ -22,18 +22,16 @@ export default {
type Story = StoryObj
-declare global {
- namespace JSX {
- interface IntrinsicElements {
- axisHelper: object
- }
+declare module '@react-three/fiber' {
+ interface ThreeElements {
+ axisHelper: object
}
}
function Sphere({ offset = 0, ...props }: ComponentProps & { offset?: number }) {
- const ref = React.useRef>(null)
+ const ref = React.useRef(null!)
useFrame(({ clock }) => {
- ref.current!.position.y = Math.sin(offset + clock.elapsedTime) * 5
+ ref.current.position.y = Math.sin(offset + clock.elapsedTime) * 5
})
return (
diff --git a/.storybook/stories/CurveModifier.stories.tsx b/.storybook/stories/CurveModifier.stories.tsx
index 78bc8ec4b..a2ecf50cc 100644
--- a/.storybook/stories/CurveModifier.stories.tsx
+++ b/.storybook/stories/CurveModifier.stories.tsx
@@ -9,15 +9,13 @@ import { CurveModifier, CurveModifierRef } from '../../src'
extend({ StdText: TextGeometry })
-type TextGeometryImpl = JSX.IntrinsicElements['extrudeGeometry'] & {
+type TextGeometryImpl = ThreeElements['extrudeGeometry'] & {
args: [string, TextGeometryParameters]
}
-declare global {
- namespace JSX {
- interface IntrinsicElements {
- stdText: TextGeometryImpl
- }
+declare module '@react-three/fiber' {
+ interface ThreeElements {
+ stdText: TextGeometryImpl
}
}
diff --git a/.storybook/stories/Extrude.stories.tsx b/.storybook/stories/Extrude.stories.tsx
index a13488d5a..a3d26fcf0 100644
--- a/.storybook/stories/Extrude.stories.tsx
+++ b/.storybook/stories/Extrude.stories.tsx
@@ -22,7 +22,7 @@ export default {
type Story = StoryObj
function ExtrudeScene(props: React.ComponentProps) {
- const ref = useTurntable>()
+ const ref = useTurntable>()
return (
<>
diff --git a/.storybook/stories/FaceControls.stories.tsx b/.storybook/stories/FaceControls.stories.tsx
index 9855aa21e..436701a2f 100644
--- a/.storybook/stories/FaceControls.stories.tsx
+++ b/.storybook/stories/FaceControls.stories.tsx
@@ -7,7 +7,7 @@ import * as easing from 'maath/easing'
import { Setup } from '../Setup'
import { FaceLandmarker, FaceControls, Box, WebcamVideoTexture } from '../../src'
-import { ComponentProps, ElementRef, useRef, useState } from 'react'
+import { ComponentProps, ComponentRef, useRef, useState } from 'react'
import { FaceLandmarkerResult } from '@mediapipe/tasks-vision'
import { useFrame, useThree } from '@react-three/fiber'
@@ -55,8 +55,8 @@ export const FaceControlsSt = {
//
function FaceControlsScene2(props: ComponentProps) {
- const faceLandmarkerRef = useRef>(null)
- const videoTextureRef = useRef>(null)
+ const faceLandmarkerRef = useRef>(null)
+ const videoTextureRef = useRef>(null)
const [faceLandmarkerResult, setFaceLandmarkerResult] = useState()
@@ -99,7 +99,7 @@ export const FaceControlsSt2 = {
//
function FaceControlsScene3(props: ComponentProps) {
- const faceControlsRef = useRef>(null)
+ const faceControlsRef = useRef>(null)
const camera = useThree((state) => state.camera)
const [current] = useState(() => new THREE.Object3D())
diff --git a/.storybook/stories/Fbo.stories.tsx b/.storybook/stories/Fbo.stories.tsx
index d49cb8ee2..03b6118a1 100644
--- a/.storybook/stories/Fbo.stories.tsx
+++ b/.storybook/stories/Fbo.stories.tsx
@@ -22,7 +22,7 @@ export default {
type Story = StoryObj
function SpinningThing() {
- const mesh = React.useRef>(null!)
+ const mesh = React.useRef>(null!)
useFrame(() => {
mesh.current.rotation.x = mesh.current.rotation.y = mesh.current.rotation.z += 0.01
@@ -40,7 +40,7 @@ function FboScene(props: React.ComponentProps) {
}
function TargetWrapper({ target }: { target: THREE.WebGLRenderTarget }) {
- const cam = React.useRef>(null!)
+ const cam = React.useRef>(null!)
const scene = React.useMemo(() => {
const scene = new THREE.Scene()
diff --git a/.storybook/stories/HTML.stories.tsx b/.storybook/stories/HTML.stories.tsx
index 348f016d2..4ce810c6c 100644
--- a/.storybook/stories/HTML.stories.tsx
+++ b/.storybook/stories/HTML.stories.tsx
@@ -31,7 +31,7 @@ function HTMLScene({
color?: React.ComponentProps<'meshBasicMaterial'>['color']
children?: React.ReactNode
} & HtmlProps) {
- const ref = useTurntable>()
+ const ref = useTurntable>()
return (
@@ -123,8 +123,8 @@ function HTMLOrthographicScene(props: HtmlProps) {
Orthographic
}
-
-
+
+
>
)
}
@@ -164,8 +164,8 @@ export const HTMLCalculatePositionSt = {
//
function HTMLOccluderScene(props: HtmlProps) {
- const turntableRef = useTurntable>()
- const occluderRef = React.useRef>(null)
+ const turntableRef = useTurntable>()
+ const occluderRef = React.useRef>(null)
return (
<>
@@ -195,8 +195,8 @@ function HTMLOccluderScene(props: HtmlProps) {