diff --git a/apps/website/package.json b/apps/website/package.json
index 06230d50..b9e69095 100644
--- a/apps/website/package.json
+++ b/apps/website/package.json
@@ -153,6 +153,7 @@
"@demo/threejs-journey-portal": "workspace:*",
"@demo/thunder-clouds": "workspace:*",
"@demo/trails": "workspace:*",
+ "@demo/trails-r3f-9.7.0": "workspace:*",
"@demo/transformcontrols-and-makedefault": "workspace:*",
"@demo/transparent-aesop-bottles": "workspace:*",
"@demo/trigger-meshes": "workspace:*",
diff --git a/demos/trails-r3f-9.7.0/.prettierrc b/demos/trails-r3f-9.7.0/.prettierrc
new file mode 100755
index 00000000..6043ce2c
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/.prettierrc
@@ -0,0 +1,10 @@
+{
+ "printWidth": 160,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "bracketSpacing": true,
+ "jsxBracketSameLine": true
+}
\ No newline at end of file
diff --git a/demos/trails-r3f-9.7.0/README.md b/demos/trails-r3f-9.7.0/README.md
new file mode 100644
index 00000000..704030e0
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/README.md
@@ -0,0 +1,9 @@
+[](https://pmndrs.github.io/examples/trails-r3f-9.7.0)
+[](https://codesandbox.io/s/github/pmndrs/examples/tree/main/demos/trails-r3f-9.7.0)
+[](https://stackblitz.com/github/pmndrs/examples/tree/main/demos/trails-r3f-9.7.0)
+
+```sh
+$ npx degit pmndrs/examples/demos/trails-r3f-9.7.0
+```
+
+
diff --git a/demos/trails-r3f-9.7.0/index.html b/demos/trails-r3f-9.7.0/index.html
new file mode 100644
index 00000000..31ae1683
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ React Three Fiber v9.7.0
+
+
+
+
+
+
diff --git a/demos/trails-r3f-9.7.0/package.json b/demos/trails-r3f-9.7.0/package.json
new file mode 100644
index 00000000..77c5e545
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "@demo/trails-r3f-9.7.0",
+ "version": "1.0.0",
+ "dependencies": {
+ "@pmndrs/branding": "^0.0.8",
+ "@react-three/cannon": "^6.6.0",
+ "@react-three/drei": "10.7.7",
+ "@react-three/fiber": "9.7.0",
+ "lamina": "1.2.2",
+ "react": "19.2.8",
+ "react-dom": "19.2.8",
+ "three": "0.165.0"
+ },
+ "devDependencies": {
+ "@types/react": "19.2.17",
+ "@types/react-dom": "19.2.3",
+ "@types/three": "^0.165.0",
+ "@vitejs/plugin-react": "^6.0.4",
+ "typescript": "^7.0.2",
+ "vite": "^8.1.5"
+ },
+ "scripts": {
+ "dev": "vite --host",
+ "dev3": "e2e-dev $npm_package_name",
+ "build": "tsc && vite build",
+ "build2": "tsc && e2e-build $npm_package_name",
+ "preview": "vite preview"
+ },
+ "browserslist": [
+ "> 1%",
+ "not dead",
+ "not ie 11",
+ "not op_mini all"
+ ],
+ "type": "module",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/pmndrs/examples/tree/main/demos/trails-r3f-9.7.0"
+ }
+}
diff --git a/demos/trails-r3f-9.7.0/pmndrs.json b/demos/trails-r3f-9.7.0/pmndrs.json
new file mode 100644
index 00000000..c874fe02
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/pmndrs.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "../../schemas/pmndrs.schema.json",
+ "title": "Trails with React Three Fiber 9.7.0",
+ "description": "A v9.7.0 release riff on the trails demo: a swarm of physics-driven extruded version numbers orbits an immovable 9.7.0, and clicking detonates them in a burst of pmndrs logos.",
+ "tags": ["trail", "meshline", "physics", "gradient", "text3d", "release"],
+ "authors": ["Faraz Shaikh", "Kris Baumgartner"],
+ "publishedAt": "2026-07-31",
+ "source": "https://github.com/pmndrs/examples/tree/main/demos/trails",
+ "libraries": ["@react-three/cannon", "@react-three/drei", "@react-three/fiber", "lamina"],
+ "assets": []
+}
diff --git a/demos/trails-r3f-9.7.0/public/vite.svg b/demos/trails-r3f-9.7.0/public/vite.svg
new file mode 100644
index 00000000..ee9fadaf
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/public/vite.svg
@@ -0,0 +1 @@
+
diff --git a/demos/trails-r3f-9.7.0/src/App.jsx b/demos/trails-r3f-9.7.0/src/App.jsx
new file mode 100644
index 00000000..c3b19851
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/src/App.jsx
@@ -0,0 +1,196 @@
+import { useEffect, useMemo, useRef, useState } from 'react'
+import * as THREE from 'three'
+import { Canvas, useThree, useFrame } from '@react-three/fiber'
+import { useGLTF, Edges, Trail } from '@react-three/drei'
+import { Physics, useCompoundBody } from '@react-three/cannon'
+import { LayerMaterial, Depth, Fresnel } from 'lamina'
+import { FontLoader, TextGeometry } from 'three-stdlib'
+
+import boldFont from 'three/examples/fonts/helvetiker_bold.typeface.json'
+import pmndrsModel from './pmndrs.glb?url'
+import cursorModel from './cursor.glb?url'
+
+// One centered, extruded "9.7.0" shared by every block in the scene
+const font = new FontLoader().parse(boldFont)
+const text = new TextGeometry('9.7.0', { font, size: 0.7, height: 0.35, curveSegments: 16, letterSpacing: 0.02 })
+text.center()
+
+const vec = new THREE.Vector3()
+const dir = new THREE.Vector3()
+// The swarm gathers slightly behind the hero so it frames it instead of covering it
+const attractor = new THREE.Vector3(0, 0, -1)
+// Live registry of swarm bodies so the cursor can blast them apart on click
+const blocks = new Set()
+// Set by ; the cursor calls it on click to spawn logo shrapnel at its position
+let burst = () => {}
+const white = new THREE.MeshBasicMaterial({ color: '#fefefe', toneMapped: false })
+const pink = new THREE.MeshBasicMaterial({ color: '#ff0080', toneMapped: false })
+// Accent blocks cycle through the cursor-gradient palette
+const accents = ['#ff0080', '#f7b955', '#5786f5'].map((color) => new THREE.MeshBasicMaterial({ color, toneMapped: false }))
+
+export const App = ({ amount = 11 }) => (
+
+)
+
+function Bursts() {
+ const { nodes } = useGLTF(pmndrsModel)
+ // The glb logo pivot is off-center; recenter a clone so shrapnel spins around itself
+ const logo = useMemo(() => {
+ const geometry = nodes.logo.geometry.clone()
+ geometry.center()
+ return geometry
+ }, [nodes])
+ const [bursts, setBursts] = useState([])
+ const id = useRef(0)
+ useEffect(() => {
+ burst = (origin) => setBursts((all) => [...all, { id: ++id.current, origin }])
+ return () => (burst = () => {})
+ }, [])
+ return bursts.map(({ id, origin }) => (
+ setBursts((all) => all.filter((b) => b.id !== id))} />
+ ))
+}
+
+// Purely visual logo shrapnel: flies outward, tumbles, shrinks away — no physics cost
+function Burst({ geometry, origin, onDone, count = 16, life = 1.5 }) {
+ const group = useRef()
+ const age = useRef(0)
+ const particles = useMemo(
+ () =>
+ Array.from({ length: count }, (_, i) => ({
+ // random sphere, biased towards the camera so debris whooshes past the viewer
+ dir: new THREE.Vector3().randomDirection().add(vec.set(0, 0, 0.5)).normalize(),
+ speed: 5 + Math.random() * 7,
+ rotation: [Math.random() * Math.PI * 2, Math.random() * Math.PI * 2, Math.random() * Math.PI * 2],
+ spin: [(Math.random() - 0.5) * 12, (Math.random() - 0.5) * 12, (Math.random() - 0.5) * 12],
+ size: 0.4 + Math.random() * 0.8,
+ material: Math.random() < 0.45 ? accents[i % accents.length] : white
+ })),
+ [count]
+ )
+ useFrame((_, delta) => {
+ age.current += delta
+ const k = age.current / life
+ if (k >= 1) return onDone()
+ // pop in fast, decelerate, shrink to nothing
+ const envelope = Math.min(k * 10, 1) * (1 - k)
+ group.current.children.forEach((child, i) => {
+ const p = particles[i]
+ child.position.addScaledVector(p.dir, p.speed * (1 - 0.7 * k) * delta)
+ child.rotation.x += p.spin[0] * delta
+ child.rotation.y += p.spin[1] * delta
+ child.rotation.z += p.spin[2] * delta
+ child.scale.set(0.188, 0.188, 0.97).multiplyScalar(p.size * envelope)
+ })
+ })
+ return (
+
+ {particles.map((p, i) => (
+
+
+
+ ))}
+
+ )
+}
+
+function Block({ scale = 1, material = white, edge = 'black', ...props }) {
+ return (
+
+
+
+
+
+ )
+}
+
+// One box approximating the extruded "9.7.0" word, baked to the visual scale
+const wordBox = (scale) => [{ type: 'Box', args: [2.2 * scale, 0.55 * scale, 0.35 * scale], position: [0, 0, 0] }]
+
+// Immovable billboard version number the swarm and cursor bounce off
+function Hero({ scale = 1.2 }) {
+ const [ref] = useCompoundBody(() => ({ mass: 0, position: [0, 0, 1.5], shapes: wordBox(scale) }))
+ return
+}
+
+function Version({ scale = 1, material = white, ...props }) {
+ const [ref, api] = useCompoundBody(() => ({ mass: 4 * scale, ...props, shapes: wordBox(scale) }))
+ useEffect(() => {
+ const entry = { ref, api, scale }
+ blocks.add(entry)
+ return () => blocks.delete(entry)
+ }, [ref, api, scale])
+ // Pull every block back towards the gather point behind the hero
+ useFrame(() => api.applyForce(vec.setFromMatrixPosition(ref.current.matrix).sub(attractor).normalize().multiplyScalar(-40 * scale).toArray(), [0, 0, 0]))
+ return
+}
+
+function Cursor({ speed = 10, gradient = 0.7, ...props }) {
+ const { nodes } = useGLTF(cursorModel)
+ const viewport = useThree((state) => state.viewport)
+ // follows this object3d, parented to the cursor body so the ribbon trails its tip
+ const trail = useRef()
+ const [ref, api] = useCompoundBody(() => ({
+ ...props,
+ shapes: [
+ { type: 'Cylinder', args: [0.6, 0.6, 0.5, 3], position: [0, 0.2, 0], rotation: [Math.PI / 2, Math.PI, 0] },
+ { type: 'Box', args: [0.25, 1, 0.3], position: [0, -0.45, 0] }
+ ]
+ }))
+ useFrame((state) => {
+ vec.setFromMatrixPosition(ref.current.matrix)
+ // Chase the pointer, diving to the swarm's gather depth so it plows through the clump
+ api.velocity.set(((state.mouse.x * viewport.width) / 2 - vec.x) * speed, ((state.mouse.y * viewport.height) / 2 - vec.y) * speed, (attractor.z - vec.z) * 2)
+ })
+ useEffect(() => {
+ // Click detonates: every block gets a distance-falloff impulse away from the cursor,
+ // applied slightly off-center so they tumble. The attractor then reels them back in.
+ const explode = () => {
+ vec.setFromMatrixPosition(ref.current.matrix)
+ burst(vec.toArray())
+ for (const block of blocks) {
+ dir.setFromMatrixPosition(block.ref.current.matrix).sub(vec)
+ const falloff = Math.max(dir.length(), 1)
+ dir.normalize().multiplyScalar((42 * block.scale) / falloff)
+ block.api.applyImpulse(dir.toArray(), [(Math.random() - 0.5) * 0.4, (Math.random() - 0.5) * 0.4, (Math.random() - 0.5) * 0.4])
+ }
+ }
+ window.addEventListener('pointerdown', explode)
+ return () => window.removeEventListener('pointerdown', explode)
+ }, [])
+ return (
+ <>
+ w * 2} />
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
diff --git a/demos/trails-r3f-9.7.0/src/cursor.glb b/demos/trails-r3f-9.7.0/src/cursor.glb
new file mode 100755
index 00000000..c87ded4b
Binary files /dev/null and b/demos/trails-r3f-9.7.0/src/cursor.glb differ
diff --git a/demos/trails-r3f-9.7.0/src/index.jsx b/demos/trails-r3f-9.7.0/src/index.jsx
new file mode 100644
index 00000000..e3121f25
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/src/index.jsx
@@ -0,0 +1,45 @@
+import { createRoot } from 'react-dom/client'
+import { Suspense } from 'react'
+import { Logo } from '@pmndrs/branding'
+import './styles.css'
+import { App } from './App'
+
+createRoot(document.getElementById('root')).render(
+ <>
+ @react-three/fiber v9.7.0 —
+
+
+
+ pmnd.rs
+
+ dev collective
+
31/07/2026
+
+
+
+
+
+ >
+)
diff --git a/demos/trails-r3f-9.7.0/src/pmndrs.glb b/demos/trails-r3f-9.7.0/src/pmndrs.glb
new file mode 100755
index 00000000..ce5c278d
Binary files /dev/null and b/demos/trails-r3f-9.7.0/src/pmndrs.glb differ
diff --git a/demos/trails-r3f-9.7.0/src/styles.css b/demos/trails-r3f-9.7.0/src/styles.css
new file mode 100644
index 00000000..274411a7
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/src/styles.css
@@ -0,0 +1,48 @@
+@import url('https://rsms.me/inter/inter.css');
+
+* {
+ box-sizing: border-box;
+}
+
+html,
+body,
+#root {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font-family: inter;
+ font-size: 13px;
+ color: #fefefe;
+ background: black;
+ cursor: none;
+}
+
+@keyframes fade-in {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+canvas {
+ opacity: 0;
+ touch-action: none;
+ animation: fade-in 2s ease 0.3s forwards;
+ animation-delay: 0s;
+}
+
+svg {
+ fill: #fefefe;
+}
+
+a {
+ pointer-events: all;
+ color: white;
+ text-decoration: none;
+}
diff --git a/demos/trails-r3f-9.7.0/src/vite-env.d.ts b/demos/trails-r3f-9.7.0/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/demos/trails-r3f-9.7.0/thumbnail.webp b/demos/trails-r3f-9.7.0/thumbnail.webp
new file mode 100644
index 00000000..09bf1e69
Binary files /dev/null and b/demos/trails-r3f-9.7.0/thumbnail.webp differ
diff --git a/demos/trails-r3f-9.7.0/tsconfig.json b/demos/trails-r3f-9.7.0/tsconfig.json
new file mode 100644
index 00000000..2bb228a4
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/demos/trails-r3f-9.7.0/tsconfig.node.json b/demos/trails-r3f-9.7.0/tsconfig.node.json
new file mode 100644
index 00000000..16dfedc6
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/demos/trails-r3f-9.7.0/vite.config.ts b/demos/trails-r3f-9.7.0/vite.config.ts
new file mode 100644
index 00000000..eca6e2f3
--- /dev/null
+++ b/demos/trails-r3f-9.7.0/vite.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+export default defineConfig({
+ plugins: [react()]
+})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0ff3af0d..f95eb194 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -467,6 +467,9 @@ importers:
'@demo/trails':
specifier: workspace:*
version: link:../../demos/trails
+ '@demo/trails-r3f-9.7.0':
+ specifier: workspace:*
+ version: link:../../demos/trails-r3f-9.7.0
'@demo/transformcontrols-and-makedefault':
specifier: workspace:*
version: link:../../demos/transformcontrols-and-makedefault
@@ -6617,6 +6620,52 @@ importers:
specifier: ^8.1.5
version: 8.1.5(@types/node@20.19.39)(jiti@2.7.0)(yaml@2.9.0)
+ demos/trails-r3f-9.7.0:
+ dependencies:
+ '@pmndrs/branding':
+ specifier: ^0.0.8
+ version: 0.0.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@react-three/cannon':
+ specifier: ^6.6.0
+ version: 6.6.0(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(react@19.2.8)(three@0.165.0)(typescript@7.0.2)
+ '@react-three/drei':
+ specifier: 10.7.7
+ version: 10.7.7(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(@types/react@19.2.17)(@types/three@0.165.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
+ '@react-three/fiber':
+ specifier: 9.7.0
+ version: 9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
+ lamina:
+ specifier: 1.2.2
+ version: 1.2.2(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
+ react:
+ specifier: 19.2.8
+ version: 19.2.8
+ react-dom:
+ specifier: 19.2.8
+ version: 19.2.8(react@19.2.8)
+ three:
+ specifier: 0.165.0
+ version: 0.165.0
+ devDependencies:
+ '@types/react':
+ specifier: 19.2.17
+ version: 19.2.17
+ '@types/react-dom':
+ specifier: 19.2.3
+ version: 19.2.3(@types/react@19.2.17)
+ '@types/three':
+ specifier: ^0.165.0
+ version: 0.165.0
+ '@vitejs/plugin-react':
+ specifier: ^6.0.4
+ version: 6.0.4(vite@8.1.5(@types/node@20.19.39)(jiti@2.7.0)(yaml@2.9.0))
+ typescript:
+ specifier: ^7.0.2
+ version: 7.0.2
+ vite:
+ specifier: ^8.1.5
+ version: 8.1.5(@types/node@20.19.39)(jiti@2.7.0)(yaml@2.9.0)
+
demos/transformcontrols-and-makedefault:
dependencies:
'@react-three/drei':
@@ -7505,18 +7554,12 @@ packages:
'@emnapi/core@1.11.1':
resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
- '@emnapi/core@1.9.2':
- resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==}
-
'@emnapi/runtime@1.11.1':
resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
'@emnapi/runtime@1.9.2':
resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==}
- '@emnapi/wasi-threads@1.2.1':
- resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
-
'@emnapi/wasi-threads@1.2.2':
resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==}
@@ -9224,6 +9267,31 @@ packages:
react-native:
optional: true
+ '@react-three/fiber@9.7.0':
+ resolution: {integrity: sha512-EWm9FwcaOZQu/ExFW5rggoCMM1NJet5YbxVxKaOE+KSncrjU0Wx7017qSyGFvupviK89nMYGCWU3BIK4dI1clw==}
+ peerDependencies:
+ expo: '>=43.0'
+ expo-asset: '>=8.4'
+ expo-file-system: '>=11.0'
+ expo-gl: '>=11.0'
+ react: '>=19 <19.3'
+ react-dom: '>=19 <19.3'
+ react-native: '>=0.78'
+ three: '>=0.156'
+ peerDependenciesMeta:
+ expo:
+ optional: true
+ expo-asset:
+ optional: true
+ expo-file-system:
+ optional: true
+ expo-gl:
+ optional: true
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+
'@react-three/flex@1.0.1':
resolution: {integrity: sha512-m1zcuE0BWyUP6ASX09SGYZWHkyMS9GVcP4WGXjdSdxWi228D0p8hti9nHlnv+fpZvQO8v+Qz4EXmrf302mEzXQ==}
peerDependencies:
@@ -13231,10 +13299,6 @@ packages:
resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==}
engines: {node: '>=18'}
- tinyglobby@0.2.15:
- resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
- engines: {node: '>=12.0.0'}
-
tinyglobby@0.2.17:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
@@ -14010,12 +14074,6 @@ snapshots:
tslib: 2.8.1
optional: true
- '@emnapi/core@1.9.2':
- dependencies:
- '@emnapi/wasi-threads': 1.2.1
- tslib: 2.8.1
- optional: true
-
'@emnapi/runtime@1.11.1':
dependencies:
tslib: 2.8.1
@@ -14026,11 +14084,6 @@ snapshots:
tslib: 2.8.1
optional: true
- '@emnapi/wasi-threads@1.2.1':
- dependencies:
- tslib: 2.8.1
- optional: true
-
'@emnapi/wasi-threads@1.2.2':
dependencies:
tslib: 2.8.1
@@ -14391,8 +14444,8 @@ snapshots:
'@napi-rs/wasm-runtime@0.2.12':
dependencies:
- '@emnapi/core': 1.9.2
- '@emnapi/runtime': 1.9.2
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
'@tybys/wasm-util': 0.10.1
optional: true
@@ -14466,13 +14519,13 @@ snapshots:
'@radix-ui/number@1.0.0':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@radix-ui/number@1.1.3': {}
'@radix-ui/primitive@1.0.0':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@radix-ui/primitive@1.1.3': {}
@@ -14610,7 +14663,7 @@ snapshots:
'@radix-ui/react-compose-refs@1.0.0(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
react: 19.2.8
'@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.17)(react@19.2.8)':
@@ -14640,7 +14693,7 @@ snapshots:
'@radix-ui/react-context@1.0.0(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
react: 19.2.8
'@radix-ui/react-context@1.1.2(@types/react@19.2.17)(react@19.2.8)':
@@ -14680,7 +14733,7 @@ snapshots:
'@radix-ui/react-direction@1.0.0(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
react: 19.2.8
'@radix-ui/react-direction@1.1.4(@types/react@19.2.17)(react@19.2.8)':
@@ -15003,7 +15056,7 @@ snapshots:
'@radix-ui/react-portal@1.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@radix-ui/react-primitive': 1.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
@@ -15040,7 +15093,7 @@ snapshots:
'@radix-ui/react-presence@1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@radix-ui/react-compose-refs': 1.0.0(react@19.2.8)
'@radix-ui/react-use-layout-effect': 1.0.0(react@19.2.8)
react: 19.2.8
@@ -15067,7 +15120,7 @@ snapshots:
'@radix-ui/react-primitive@1.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@radix-ui/react-slot': 1.0.1(react@19.2.8)
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
@@ -15362,7 +15415,7 @@ snapshots:
'@radix-ui/react-tooltip@1.0.5(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@radix-ui/primitive': 1.0.0
'@radix-ui/react-compose-refs': 1.0.0(react@19.2.8)
'@radix-ui/react-context': 1.0.0(react@19.2.8)
@@ -15423,7 +15476,7 @@ snapshots:
'@radix-ui/react-use-callback-ref@1.0.0(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
react: 19.2.8
'@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.17)(react@19.2.8)':
@@ -15503,7 +15556,7 @@ snapshots:
'@radix-ui/react-use-layout-effect@1.0.0(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
react: 19.2.8
'@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.17)(react@19.2.8)':
@@ -15599,7 +15652,7 @@ snapshots:
'@rc-component/async-validator@5.1.0':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@rc-component/color-picker@2.0.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
@@ -15612,14 +15665,14 @@ snapshots:
'@rc-component/context@1.4.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
rc-util: 5.44.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
'@rc-component/mini-decimal@1.1.3':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@rc-component/mutate-observer@1.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
@@ -15631,7 +15684,7 @@ snapshots:
'@rc-component/portal@1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
classnames: 2.5.1
rc-util: 5.44.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
react: 19.2.8
@@ -15755,6 +15808,17 @@ snapshots:
transitivePeerDependencies:
- typescript
+ '@react-three/cannon@6.6.0(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(react@19.2.8)(three@0.165.0)(typescript@7.0.2)':
+ dependencies:
+ '@pmndrs/cannon-worker-api': 2.4.0(three@0.165.0)
+ '@react-three/fiber': 9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
+ cannon-es: 0.20.0
+ cannon-es-debugger: 1.0.0(cannon-es@0.20.0)(three@0.165.0)(typescript@7.0.2)
+ react: 19.2.8
+ three: 0.165.0
+ transitivePeerDependencies:
+ - typescript
+
'@react-three/csg@4.0.0(three@0.165.0)':
dependencies:
three-bvh-csg: 0.0.16(three-mesh-bvh@0.6.8(three@0.165.0))(three@0.165.0)
@@ -15764,7 +15828,7 @@ snapshots:
'@react-three/drei@10.7.7(@react-three/fiber@9.6.1(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(@types/react@19.2.17)(@types/three@0.165.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@mediapipe/tasks-vision': 0.10.17
'@monogrid/gainmap-js': 3.4.0(three@0.165.0)
'@react-three/fiber': 9.6.1(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
@@ -15795,6 +15859,39 @@ snapshots:
- '@types/three'
- immer
+ '@react-three/drei@10.7.7(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(@types/react@19.2.17)(@types/three@0.165.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@mediapipe/tasks-vision': 0.10.17
+ '@monogrid/gainmap-js': 3.4.0(three@0.165.0)
+ '@react-three/fiber': 9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
+ '@use-gesture/react': 10.3.1(react@19.2.8)
+ camera-controls: 3.1.2(three@0.165.0)
+ cross-env: 7.0.3
+ detect-gpu: 5.0.70
+ glsl-noise: 0.0.0
+ hls.js: 1.6.15
+ maath: 0.10.8(@types/three@0.165.0)(three@0.165.0)
+ meshline: 3.3.1(three@0.165.0)
+ react: 19.2.8
+ stats-gl: 2.4.2(@types/three@0.165.0)(three@0.165.0)
+ stats.js: 0.17.0
+ suspend-react: 0.1.3(react@19.2.8)
+ three: 0.165.0
+ three-mesh-bvh: 0.8.3(three@0.165.0)
+ three-stdlib: 2.36.1(three@0.165.0)
+ troika-three-text: 0.52.4(three@0.165.0)
+ tunnel-rat: 0.1.2(@types/react@19.2.17)(react@19.2.8)
+ use-sync-external-store: 1.6.0(react@19.2.8)
+ utility-types: 3.11.0
+ zustand: 5.0.14(@types/react@19.2.17)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))
+ optionalDependencies:
+ react-dom: 19.2.8(react@19.2.8)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/three'
+ - immer
+
'@react-three/drei@9.122.0(@react-three/fiber@9.6.1(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(@types/react@19.2.17)(@types/three@0.165.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)(use-sync-external-store@1.6.0(react@19.2.8))':
dependencies:
'@babel/runtime': 7.29.2
@@ -15850,6 +15947,26 @@ snapshots:
- '@types/react'
- immer
+ '@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@types/webxr': 0.5.24
+ base64-js: 1.5.1
+ buffer: 6.0.3
+ its-fine: 2.0.0(@types/react@19.2.17)(react@19.2.8)
+ react: 19.2.8
+ react-use-measure: 2.1.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ scheduler: 0.27.0
+ suspend-react: 0.1.3(react@19.2.8)
+ three: 0.165.0
+ use-sync-external-store: 1.6.0(react@19.2.8)
+ zustand: 5.0.14(@types/react@19.2.17)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))
+ optionalDependencies:
+ react-dom: 19.2.8(react@19.2.8)
+ transitivePeerDependencies:
+ - '@types/react'
+ - immer
+
'@react-three/flex@1.0.1(@react-three/fiber@9.6.1(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(react@19.2.8)(three@0.165.0)':
dependencies:
'@react-pdf/yoga': 2.0.4
@@ -16236,7 +16353,7 @@ snapshots:
debug: 4.4.3(supports-color@7.2.0)
minimatch: 10.2.6
semver: 7.7.4
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.17
ts-api-utils: 2.5.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
@@ -16424,7 +16541,7 @@ snapshots:
'@vue/shared': 3.5.32
estree-walker: 2.0.2
magic-string: 0.30.21
- postcss: 8.5.8
+ postcss: 8.5.25
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.32':
@@ -17272,7 +17389,7 @@ snapshots:
get-tsconfig: 4.13.7
is-bun-module: 2.0.0
stable-hash: 0.0.5
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.17
unrs-resolver: 1.11.1
optionalDependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1(supports-color@7.2.0))(supports-color@7.2.0)
@@ -17563,10 +17680,6 @@ snapshots:
dependencies:
reusify: 1.1.0
- fdir@6.5.0(picomatch@4.0.4):
- optionalDependencies:
- picomatch: 4.0.4
-
fdir@6.5.0(picomatch@4.0.5):
optionalDependencies:
picomatch: 4.0.5
@@ -18215,6 +18328,23 @@ snapshots:
- '@types/react'
- '@types/react-dom'
+ lamina@1.2.2(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0):
+ dependencies:
+ glsl-token-descope: 1.0.2
+ glsl-token-functions: 1.0.1
+ glsl-token-string: 1.0.1
+ glsl-tokenizer: 2.1.5
+ leva: 0.10.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ three: 0.165.0
+ three-custom-shader-material: 6.4.0(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(react@19.2.8)(three@0.165.0)
+ optionalDependencies:
+ '@react-three/fiber': 9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+
language-subtag-registry@0.3.23: {}
language-tags@1.0.9:
@@ -19129,7 +19259,7 @@ snapshots:
rc-overflow@1.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
classnames: 2.5.1
rc-resize-observer: 1.4.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
rc-util: 5.44.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
@@ -19306,7 +19436,7 @@ snapshots:
rc-virtual-list@3.19.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
classnames: 2.5.1
rc-resize-observer: 1.4.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
rc-util: 5.44.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
@@ -20035,6 +20165,13 @@ snapshots:
'@react-three/fiber': 9.6.1(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
react: 19.2.8
+ three-custom-shader-material@6.4.0(@react-three/fiber@9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0))(react@19.2.8)(three@0.165.0):
+ dependencies:
+ three: 0.165.0
+ optionalDependencies:
+ '@react-three/fiber': 9.7.0(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(three@0.165.0)
+ react: 19.2.8
+
three-mesh-bvh@0.6.8(three@0.165.0):
dependencies:
three: 0.165.0
@@ -20074,15 +20211,10 @@ snapshots:
tinyexec@1.2.4: {}
- tinyglobby@0.2.15:
- dependencies:
- fdir: 6.5.0(picomatch@4.0.4)
- picomatch: 4.0.4
-
tinyglobby@0.2.17:
dependencies:
- fdir: 6.5.0(picomatch@4.0.4)
- picomatch: 4.0.4
+ fdir: 6.5.0(picomatch@4.0.5)
+ picomatch: 4.0.5
to-readable-stream@1.0.0: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index ed92b422..858a0c49 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -23,3 +23,4 @@ patchedDependencies:
minimumReleaseAgeExclude:
- material-theme-builder@3.0.0
+ - '@react-three/fiber@9.7.0'