├── .prettierrc ├── README.md ├── next14-app-r3f8-react18 ├── .dockerignore ├── .gitignore ├── Dockerfile ├── app │ ├── layout.js │ └── page.js ├── jsconfig.json ├── next.config.mjs ├── package-lock.json └── package.json ├── next14-pages-r3f8-react18 ├── .dockerignore ├── .gitignore ├── Dockerfile ├── jsconfig.json ├── next.config.mjs ├── package-lock.json ├── package.json └── pages │ └── index.js ├── next15-app-r3f9-react19-rsc ├── .dockerignore ├── .gitignore ├── Dockerfile ├── app │ ├── ClientBox.js │ ├── ClientCanvas.js │ ├── ClientOrbitControls.js │ ├── layout.js │ └── page.js ├── jsconfig.json ├── lib │ └── extend.js ├── next.config.mjs ├── package-lock.json └── package.json ├── next15-app-r3f9-react19 ├── .dockerignore ├── .gitignore ├── Dockerfile ├── app │ ├── layout.js │ └── page.js ├── jsconfig.json ├── lib │ └── extend.js ├── next.config.mjs ├── package-lock.json └── package.json ├── next15-pages-r3f9-react19 ├── .dockerignore ├── .gitignore ├── Dockerfile ├── jsconfig.json ├── lib │ └── extend.js ├── next.config.mjs ├── package-lock.json ├── package.json └── pages │ ├── _app.js │ └── index.js ├── sveltekit-threlte8 ├── .gitignore ├── .npmrc ├── Dockerfile ├── README.md ├── package-lock.json ├── package.json ├── src │ ├── app.d.ts │ ├── app.html │ ├── components │ │ └── BackendLogger.svelte │ ├── lib │ │ └── index.ts │ └── routes │ │ └── +page.svelte ├── static │ └── favicon.png ├── svelte.config.js ├── tsconfig.json └── vite.config.ts ├── vite-ts-swc-r3f8-react18 ├── .dockerignore ├── .gitignore ├── Dockerfile ├── index.html ├── package-lock.json ├── package.json ├── src │ ├── App.tsx │ ├── main.tsx │ └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── vite-ts-swc-r3f9-react19 ├── .dockerignore ├── .gitignore ├── Dockerfile ├── index.html ├── package-lock.json ├── package.json ├── src │ ├── App.tsx │ ├── extend.ts │ ├── main.tsx │ └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── vite-ts-threlte8 ├── .gitignore ├── Dockerfile ├── index.html ├── package-lock.json ├── package.json ├── src │ ├── App.svelte │ ├── BackendLogger.svelte │ ├── main.ts │ └── vite-env.d.ts ├── svelte.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── vite-vanilla-js-vertex-alpha ├── .dockerignore ├── .gitignore ├── Dockerfile ├── index.html ├── main.js ├── package-lock.json ├── package.json └── vite.config.js └── vite-vanilla-js ├── .dockerignore ├── .gitignore ├── Dockerfile ├── index.html ├── main.js ├── package-lock.json ├── package.json └── vite.config.js /.prettierrc: -------------------------------------------------------------------------------- 1 | trailingComma: 'es5' 2 | semi: false 3 | singleQuote: true 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Three.js WebGPU Ecosystem Integration Test Suite 2 | 3 | This is a collection of tests that incrementally add complexity to the setup. Testing is done with Three.js **r173** (2025-01-31). All tests use **WebGPURenderer**, a **TSL** node, and a test of the graphics backend type used. With vanilla [Three.js](https://threejs.org/), [React Three Fiber](https://r3f.docs.pmnd.rs/), and [Threlte](https://threlte.xyz/). 4 | 5 | ## How to test 6 | 7 | Go to a folder, like `next15-pages-vanilla-react19`. 8 | 9 | If you have Docker installed: 10 | 11 | - `npm run docker` to build and run the app in production mode. 12 | 13 | > The Docker image uses Node 20, before `navigator` was added in Node 21. 14 | 15 | Otherwise, to test with your local Node.js version: 16 | 17 | 1. `npm i` 18 | 2. `npm run dev` to check how it works in development. 19 | 3. `npm run start` to check how it works in production. 20 | 21 | ## Results 22 | 23 | A ✅ means the scene renders, and the project works in dev mode, and in production. 24 | 25 | - `next14-app-r3f8-react18`: ✅ 26 | - `next14-pages-r3f8-react18`: ✅ 27 | - `next15-app-r3f9-react19`: ✅ 28 | - `next15-app-r3f9-react19-rsc`: ✅ See [this note](#react-server-components-with-r3f) about RSCs 29 | - `next15-pages-r3f9-react19`: ✅ Unrelated Next.js [HMR warning](#hmr-appisrmanifest-issue) 30 | - `sveltekit-threlte8`: ✅ 31 | - `vite-ts-swc-r3f8-react18`: ✅ 32 | - `vite-ts-swc-r3f9-react19`: ✅ 33 | - `vite-ts-threlte8`: ✅ 34 | - `vite-vanilla-js`: ✅ 35 | 36 | ### Non-blocking issues 37 | 38 | - ⚠️ Importing a module with top-level await such as `three/examples/jsm/capabilities/WebGPU.js` requires a [Vite config change and causes warnings in Next.js](#top-level-await-issues). 39 | 40 | - ⚠️ WebGPURenderer is initialized with WebGPUBackend before falling back to WebGLBackend. You should [await the init method](#testing-the-backend-type) before checking the backend type or if encounter this [render warning](#render-called-before-backend-initialized-issue). 41 | 42 | ## Top-level Await issues 43 | 44 | Some Three.js modules, like `three/examples/jsm/capabilities/WebGPU`, contain top-level await statements. 45 | 46 | ### Vite 47 | 48 | Importing a module with top-level await will give you this error: 49 | 50 | > ❌ `Top-level await is not available in the configured target environment` 51 | 52 | Add this to your `vite.config.js`: 53 | 54 | ```js 55 | import { defineConfig } from 'vite' 56 | 57 | export default defineConfig({ 58 | optimizeDeps: { esbuildOptions: { target: 'esnext' } }, 59 | build: { target: 'esnext' }, 60 | }) 61 | ``` 62 | 63 | One of the options fixes development mode, the other fixes production. 64 | 65 | ### Next.js 66 | 67 | Importing a module with top-level await will give you this warning in the browser console and when compiling: 68 | 69 | ``` 70 | ./node_modules/three/examples/jsm/capabilities/WebGPU.js 71 | The generated code contains 'async/await' because this module is using "topLevelAwait". 72 | However, your target environment does not appear to support 'async/await'. 73 | As a result, the code may not run as expected or may cause runtime errors. 74 | ``` 75 | 76 | ## SSR issues with Next.js and Node.js 77 | 78 | Next.js uses Node.js to Server-Side Render pages on the server. When importing modules on the server, if those modules reference global browser objects like `window`, `document`, `self`, or `navigator` at the top level, you will get a compilation error. _Except_ for `navigator`, which got [added to Node.js 21](https://nodejs.org/en/blog/announcements/v21-release-announce#navigator-object-integration). 79 | 80 | Those top-level references are being tracked down in Three.js for better Next.js support, and this repository is also meant to help testing those issues. 81 | 82 | Generally speaking, as a Next.js developer working with libraries that are meant for browsers like Three.js, it is safer to execute browser-only code inside `useEffect` hooks or similar. See [this article](https://www.joshwcomeau.com/react/the-perils-of-rehydration/). 83 | 84 | ```js 85 | import { browserOnlyFunction } from 'three' 86 | 87 | browserOnlyFunction() // ❌ Don't do that, it runs on the server during SSR 88 | 89 | function MyComponent() { 90 | browserOnlyFunction() // ❌ Don't do that, it runs on the server during SSR 91 | 92 | useEffect(() => { 93 | browserOnlyFunction() // ✅ No problem, runs only in the browser 94 | }, []) 95 | 96 | return // ... 97 | } 98 | ``` 99 | 100 | ### ReactCurrentOwner issue 101 | 102 | > ❌ `TypeError: Cannot read properties of undefined (reading 'ReactCurrentOwner')` 103 | 104 | Also a related error during builds: 105 | 106 | > ❌ Cannot read properties of undefined (reading 'ReactCurrentBatchConfig') 107 | 108 | With Next 15, use React Three Fiber v9. 109 | 110 | ### React Server Components with R3F 111 | 112 | You can use React Server Components with R3F. This actually works without `'use client'`: 113 | 114 | ```js 115 | 116 | 117 | 118 | 119 | 120 | 121 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | ``` 135 | 136 | `ClientCanvas`, `ClientBox`, and `ClientOrbitControls` are marked with `'use client'`. You can interweave server and client components this way, but expect this approach to be pretty painful. 137 | 138 | ### HMR appIsrManifest issue 139 | 140 | > ⚠️ `[HMR] Invalid message: {"action":"appIsrManifest","data":{}}` 141 | 142 | > `TypeError: Cannot read properties of undefined (reading 'pathname')` 143 | 144 | [Issue on Next.js repo](https://github.com/vercel/next.js/issues/71974). 145 | 146 | **Fixed in `15.1.1-canary.24`.** 147 | 148 | ## Testing the backend type 149 | 150 | WebGPURenderer initially reports WebGPUBackend before falling back to WebGLBackend ([issue](https://github.com/mrdoob/three.js/issues/30024)). There are workarounds for it. 151 | 152 | With vanilla Three.js: 153 | 154 | ```js 155 | renderer = new THREE.WebGPURenderer() 156 | await renderer.init() 157 | console.log(renderer.backend) // WebGPUBackend or WebGLBackend 158 | ``` 159 | 160 | With React Three Fiber: 161 | 162 | ```js 163 | { 165 | const renderer = new WebGPURenderer(glProps) 166 | await renderer.init() 167 | return renderer 168 | }} 169 | /> 170 | ``` 171 | 172 | ## Drei Compatibility 173 | 174 | You should also expect to only be able to use a subset of [Drei](https://github.com/pmndrs/drei) and the Three.js ecosystem with WebGPU, since some libraries and composants are written in GLSL. 175 | 176 | The following Drei components have been tested with R3F + WebGPU: 177 | 178 | - ✅ BakeShadows 179 | - ✅ Billboard 180 | - ✅ Bvh 181 | - ✅ FlyControls 182 | - ✅ GradientTexture 183 | - ✅ Html 184 | - ✅ Instances 185 | - ✅ KeyboardControls 186 | - ✅ MapControls 187 | - ✅ Merged 188 | - ✅ OrbitControls 189 | - ✅ OrthographicCamera 190 | - ✅ Stats 191 | - ✅ StatsGl 192 | 193 | - ❌ Edges: `TypeError: Failed to execute 'drawIndexed' on 'GPURenderPassEncoder': Value is infinite and not of type 'unsigned long'.` 194 | - ❌ MeshTransmissionMaterial 195 | - ❌ Outlines: `NodeMaterial: Material "ShaderMaterial" is not compatible.` 196 | - ❌ Text: `TypeError: Failed to execute 'drawIndexed' on 'GPURenderPassEncoder': Value is infinite and not of type 'unsigned long'.` 197 | - ❌ Wireframe: Nothing shows up + `Requires non-indexed geometry, converting to non-indexed geometry.` 198 | 199 | You can run one of the R3F test cases of this repo and help complete the list. Don't commit code, just edit this README with the results of your tests. 200 | 201 | ## Minimal Vanilla Three.js + TSL Example 202 | 203 | ```js 204 | import { mix, vec3, uv } from 'three/tsl' 205 | import { MeshBasicNodeMaterial } from 'three/webgpu' 206 | 207 | const red = vec3(1, 0, 0) 208 | const green = vec3(0, 1, 0) 209 | const checkerboard = uv().mul(8).floor().dot(1).mod(2) 210 | const colorNode = mix(red, green, checkerboard) 211 | 212 | const material = new MeshBasicNodeMaterial() 213 | material.colorNode = colorNode 214 | ``` 215 | 216 | ## Minimal R3F9 + TS + TSL Example 217 | 218 | Extend somewhere top-level in your codebase (in your \_app.tsx in Next.js for example): 219 | 220 | ```ts 221 | import * as THREE from 'three/webgpu' 222 | import { Canvas, extend, type ThreeToJSXElements } from '@react-three/fiber' 223 | 224 | declare module '@react-three/fiber' { 225 | interface ThreeElements extends ThreeToJSXElements {} 226 | } 227 | 228 | extend(THREE as any) 229 | ``` 230 | 231 | Then: 232 | 233 | ```tsx 234 | import { mix, positionLocal, sin, time, vec3 } from 'three/tsl' 235 | 236 | const red = vec3(1, 0, 0) 237 | const blue = vec3(0, 0, 1) 238 | const currentTime = time.mul(0.5) 239 | const colorNode = mix(red, blue, sin(currentTime)) 240 | const positionNode = positionLocal.add(vec3(0, sin(currentTime).mul(0.2), 0)) 241 | 242 | const Plane = () => ( 243 | 244 | 245 | 246 | 247 | ) 248 | ``` 249 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist -------------------------------------------------------------------------------- /next14-app-r3f8-react18/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 3000 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/app/layout.js: -------------------------------------------------------------------------------- 1 | export default function RootLayout({ children }) { 2 | return ( 3 | 4 | {children} 5 | 6 | ) 7 | } 8 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/app/page.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React, { useMemo, useRef, useState } from 'react' 4 | import { Canvas, useFrame, useThree, extend } from '@react-three/fiber' 5 | import { OrbitControls } from '@react-three/drei' 6 | import { WebGPURenderer, MeshStandardNodeMaterial } from 'three/webgpu' 7 | import { uniform } from 'three/tsl' 8 | import { Color } from 'three' 9 | 10 | extend({ MeshStandardNodeMaterial }) 11 | 12 | const red = new Color('red') 13 | const blue = new Color('blue') 14 | 15 | function Box(props) { 16 | const meshRef = useRef() 17 | const [hovered, setHover] = useState(false) 18 | const [active, setActive] = useState(false) 19 | const { gl } = useThree() 20 | 21 | useFrame((state, delta) => (meshRef.current.rotation.x += delta)) 22 | 23 | console.log(gl.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend') 24 | 25 | const uColor = useMemo(() => uniform(blue), []) 26 | 27 | uColor.value = hovered ? red : blue 28 | 29 | return ( 30 | setActive(!active)} 35 | onPointerOver={() => setHover(true)} 36 | onPointerOut={() => setHover(false)} 37 | > 38 | 39 | 40 | 41 | ) 42 | } 43 | 44 | export default function IndexPage() { 45 | const [frameloop, setFrameloop] = useState('never') 46 | 47 | return ( 48 | { 52 | const renderer = new WebGPURenderer({ 53 | canvas, 54 | powerPreference: 'high-performance', 55 | antialias: true, 56 | alpha: true, 57 | }) 58 | renderer.init().then(() => setFrameloop('always')) 59 | return renderer 60 | }} 61 | > 62 | 63 | 64 | 71 | 72 | 73 | 74 | 75 | ) 76 | } 77 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | }; 5 | 6 | export default nextConfig; 7 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next14-app-r3f8-react18", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "@react-three/drei": "9.120.0", 9 | "@react-three/fiber": "8.17.10", 10 | "next": "14.2.20", 11 | "react": "18.3.1", 12 | "react-dom": "18.3.1", 13 | "three": "0.173.0" 14 | } 15 | }, 16 | "node_modules/@babel/runtime": { 17 | "version": "7.26.0", 18 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", 19 | "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", 20 | "license": "MIT", 21 | "dependencies": { 22 | "regenerator-runtime": "^0.14.0" 23 | }, 24 | "engines": { 25 | "node": ">=6.9.0" 26 | } 27 | }, 28 | "node_modules/@mediapipe/tasks-vision": { 29 | "version": "0.10.17", 30 | "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", 31 | "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", 32 | "license": "Apache-2.0" 33 | }, 34 | "node_modules/@monogrid/gainmap-js": { 35 | "version": "3.1.0", 36 | "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.1.0.tgz", 37 | "integrity": "sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw==", 38 | "license": "MIT", 39 | "dependencies": { 40 | "promise-worker-transferable": "^1.0.4" 41 | }, 42 | "peerDependencies": { 43 | "three": ">= 0.159.0" 44 | } 45 | }, 46 | "node_modules/@next/env": { 47 | "version": "14.2.20", 48 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.20.tgz", 49 | "integrity": "sha512-JfDpuOCB0UBKlEgEy/H6qcBSzHimn/YWjUHzKl1jMeUO+QVRdzmTTl8gFJaNO87c8DXmVKhFCtwxQ9acqB3+Pw==", 50 | "license": "MIT" 51 | }, 52 | "node_modules/@next/swc-darwin-arm64": { 53 | "version": "14.2.20", 54 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.20.tgz", 55 | "integrity": "sha512-WDfq7bmROa5cIlk6ZNonNdVhKmbCv38XteVFYsxea1vDJt3SnYGgxLGMTXQNfs5OkFvAhmfKKrwe7Y0Hs+rWOg==", 56 | "cpu": [ 57 | "arm64" 58 | ], 59 | "license": "MIT", 60 | "optional": true, 61 | "os": [ 62 | "darwin" 63 | ], 64 | "engines": { 65 | "node": ">= 10" 66 | } 67 | }, 68 | "node_modules/@next/swc-darwin-x64": { 69 | "version": "14.2.20", 70 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.20.tgz", 71 | "integrity": "sha512-XIQlC+NAmJPfa2hruLvr1H1QJJeqOTDV+v7tl/jIdoFvqhoihvSNykLU/G6NMgoeo+e/H7p/VeWSOvMUHKtTIg==", 72 | "cpu": [ 73 | "x64" 74 | ], 75 | "license": "MIT", 76 | "optional": true, 77 | "os": [ 78 | "darwin" 79 | ], 80 | "engines": { 81 | "node": ">= 10" 82 | } 83 | }, 84 | "node_modules/@next/swc-linux-arm64-gnu": { 85 | "version": "14.2.20", 86 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.20.tgz", 87 | "integrity": "sha512-pnzBrHTPXIMm5QX3QC8XeMkpVuoAYOmyfsO4VlPn+0NrHraNuWjdhe+3xLq01xR++iCvX+uoeZmJDKcOxI201Q==", 88 | "cpu": [ 89 | "arm64" 90 | ], 91 | "license": "MIT", 92 | "optional": true, 93 | "os": [ 94 | "linux" 95 | ], 96 | "engines": { 97 | "node": ">= 10" 98 | } 99 | }, 100 | "node_modules/@next/swc-linux-arm64-musl": { 101 | "version": "14.2.20", 102 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.20.tgz", 103 | "integrity": "sha512-WhJJAFpi6yqmUx1momewSdcm/iRXFQS0HU2qlUGlGE/+98eu7JWLD5AAaP/tkK1mudS/rH2f9E3WCEF2iYDydQ==", 104 | "cpu": [ 105 | "arm64" 106 | ], 107 | "license": "MIT", 108 | "optional": true, 109 | "os": [ 110 | "linux" 111 | ], 112 | "engines": { 113 | "node": ">= 10" 114 | } 115 | }, 116 | "node_modules/@next/swc-linux-x64-gnu": { 117 | "version": "14.2.20", 118 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.20.tgz", 119 | "integrity": "sha512-ao5HCbw9+iG1Kxm8XsGa3X174Ahn17mSYBQlY6VGsdsYDAbz/ZP13wSLfvlYoIDn1Ger6uYA+yt/3Y9KTIupRg==", 120 | "cpu": [ 121 | "x64" 122 | ], 123 | "license": "MIT", 124 | "optional": true, 125 | "os": [ 126 | "linux" 127 | ], 128 | "engines": { 129 | "node": ">= 10" 130 | } 131 | }, 132 | "node_modules/@next/swc-linux-x64-musl": { 133 | "version": "14.2.20", 134 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.20.tgz", 135 | "integrity": "sha512-CXm/kpnltKTT7945np6Td3w7shj/92TMRPyI/VvveFe8+YE+/YOJ5hyAWK5rpx711XO1jBCgXl211TWaxOtkaA==", 136 | "cpu": [ 137 | "x64" 138 | ], 139 | "license": "MIT", 140 | "optional": true, 141 | "os": [ 142 | "linux" 143 | ], 144 | "engines": { 145 | "node": ">= 10" 146 | } 147 | }, 148 | "node_modules/@next/swc-win32-arm64-msvc": { 149 | "version": "14.2.20", 150 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.20.tgz", 151 | "integrity": "sha512-upJn2HGQgKNDbXVfIgmqT2BN8f3z/mX8ddoyi1I565FHbfowVK5pnMEwauvLvaJf4iijvuKq3kw/b6E9oIVRWA==", 152 | "cpu": [ 153 | "arm64" 154 | ], 155 | "license": "MIT", 156 | "optional": true, 157 | "os": [ 158 | "win32" 159 | ], 160 | "engines": { 161 | "node": ">= 10" 162 | } 163 | }, 164 | "node_modules/@next/swc-win32-ia32-msvc": { 165 | "version": "14.2.20", 166 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.20.tgz", 167 | "integrity": "sha512-igQW/JWciTGJwj3G1ipalD2V20Xfx3ywQy17IV0ciOUBbFhNfyU1DILWsTi32c8KmqgIDviUEulW/yPb2FF90w==", 168 | "cpu": [ 169 | "ia32" 170 | ], 171 | "license": "MIT", 172 | "optional": true, 173 | "os": [ 174 | "win32" 175 | ], 176 | "engines": { 177 | "node": ">= 10" 178 | } 179 | }, 180 | "node_modules/@next/swc-win32-x64-msvc": { 181 | "version": "14.2.20", 182 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.20.tgz", 183 | "integrity": "sha512-AFmqeLW6LtxeFTuoB+MXFeM5fm5052i3MU6xD0WzJDOwku6SkZaxb1bxjBaRC8uNqTRTSPl0yMFtjNowIVI67w==", 184 | "cpu": [ 185 | "x64" 186 | ], 187 | "license": "MIT", 188 | "optional": true, 189 | "os": [ 190 | "win32" 191 | ], 192 | "engines": { 193 | "node": ">= 10" 194 | } 195 | }, 196 | "node_modules/@react-spring/animated": { 197 | "version": "9.7.5", 198 | "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", 199 | "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", 200 | "license": "MIT", 201 | "dependencies": { 202 | "@react-spring/shared": "~9.7.5", 203 | "@react-spring/types": "~9.7.5" 204 | }, 205 | "peerDependencies": { 206 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 207 | } 208 | }, 209 | "node_modules/@react-spring/core": { 210 | "version": "9.7.5", 211 | "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", 212 | "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", 213 | "license": "MIT", 214 | "dependencies": { 215 | "@react-spring/animated": "~9.7.5", 216 | "@react-spring/shared": "~9.7.5", 217 | "@react-spring/types": "~9.7.5" 218 | }, 219 | "funding": { 220 | "type": "opencollective", 221 | "url": "https://opencollective.com/react-spring/donate" 222 | }, 223 | "peerDependencies": { 224 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 225 | } 226 | }, 227 | "node_modules/@react-spring/rafz": { 228 | "version": "9.7.5", 229 | "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", 230 | "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", 231 | "license": "MIT" 232 | }, 233 | "node_modules/@react-spring/shared": { 234 | "version": "9.7.5", 235 | "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", 236 | "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", 237 | "license": "MIT", 238 | "dependencies": { 239 | "@react-spring/rafz": "~9.7.5", 240 | "@react-spring/types": "~9.7.5" 241 | }, 242 | "peerDependencies": { 243 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 244 | } 245 | }, 246 | "node_modules/@react-spring/three": { 247 | "version": "9.7.5", 248 | "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", 249 | "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", 250 | "license": "MIT", 251 | "dependencies": { 252 | "@react-spring/animated": "~9.7.5", 253 | "@react-spring/core": "~9.7.5", 254 | "@react-spring/shared": "~9.7.5", 255 | "@react-spring/types": "~9.7.5" 256 | }, 257 | "peerDependencies": { 258 | "@react-three/fiber": ">=6.0", 259 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0", 260 | "three": ">=0.126" 261 | } 262 | }, 263 | "node_modules/@react-spring/types": { 264 | "version": "9.7.5", 265 | "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", 266 | "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", 267 | "license": "MIT" 268 | }, 269 | "node_modules/@react-three/drei": { 270 | "version": "9.120.0", 271 | "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.120.0.tgz", 272 | "integrity": "sha512-RAZxvEACy9QXPs1gHOXuosZYqN8CY5bVBTpiqz7i52YH0w5YgF+cvvoMtK/fS06vaBNZTu/D84K6c+oM75ptaQ==", 273 | "license": "MIT", 274 | "dependencies": { 275 | "@babel/runtime": "^7.26.0", 276 | "@mediapipe/tasks-vision": "0.10.17", 277 | "@monogrid/gainmap-js": "^3.0.6", 278 | "@react-spring/three": "~9.7.5", 279 | "@use-gesture/react": "^10.3.1", 280 | "camera-controls": "^2.9.0", 281 | "cross-env": "^7.0.3", 282 | "detect-gpu": "^5.0.56", 283 | "glsl-noise": "^0.0.0", 284 | "hls.js": "^1.5.17", 285 | "maath": "^0.10.8", 286 | "meshline": "^3.3.1", 287 | "react-composer": "^5.0.3", 288 | "stats-gl": "^2.2.8", 289 | "stats.js": "^0.17.0", 290 | "suspend-react": "^0.1.3", 291 | "three-mesh-bvh": "^0.7.8", 292 | "three-stdlib": "^2.34.0", 293 | "troika-three-text": "^0.52.0", 294 | "tunnel-rat": "^0.1.2", 295 | "utility-types": "^3.11.0", 296 | "uuid": "^9.0.1", 297 | "zustand": "^5.0.1" 298 | }, 299 | "peerDependencies": { 300 | "@react-three/fiber": ">=8.0", 301 | "react": ">=18.0", 302 | "react-dom": ">=18.0", 303 | "three": ">=0.137" 304 | }, 305 | "peerDependenciesMeta": { 306 | "react-dom": { 307 | "optional": true 308 | } 309 | } 310 | }, 311 | "node_modules/@react-three/fiber": { 312 | "version": "8.17.10", 313 | "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.17.10.tgz", 314 | "integrity": "sha512-S6bqa4DqUooEkInYv/W+Jklv2zjSYCXAhm6qKpAQyOXhTEt5gBXnA7W6aoJ0bjmp9pAeaSj/AZUoz1HCSof/uA==", 315 | "license": "MIT", 316 | "dependencies": { 317 | "@babel/runtime": "^7.17.8", 318 | "@types/debounce": "^1.2.1", 319 | "@types/react-reconciler": "^0.26.7", 320 | "@types/webxr": "*", 321 | "base64-js": "^1.5.1", 322 | "buffer": "^6.0.3", 323 | "debounce": "^1.2.1", 324 | "its-fine": "^1.0.6", 325 | "react-reconciler": "^0.27.0", 326 | "scheduler": "^0.21.0", 327 | "suspend-react": "^0.1.3", 328 | "zustand": "^3.7.1" 329 | }, 330 | "peerDependencies": { 331 | "expo": ">=43.0", 332 | "expo-asset": ">=8.4", 333 | "expo-file-system": ">=11.0", 334 | "expo-gl": ">=11.0", 335 | "react": ">=18.0", 336 | "react-dom": ">=18.0", 337 | "react-native": ">=0.64", 338 | "three": ">=0.133" 339 | }, 340 | "peerDependenciesMeta": { 341 | "expo": { 342 | "optional": true 343 | }, 344 | "expo-asset": { 345 | "optional": true 346 | }, 347 | "expo-file-system": { 348 | "optional": true 349 | }, 350 | "expo-gl": { 351 | "optional": true 352 | }, 353 | "react-dom": { 354 | "optional": true 355 | }, 356 | "react-native": { 357 | "optional": true 358 | } 359 | } 360 | }, 361 | "node_modules/@react-three/fiber/node_modules/zustand": { 362 | "version": "3.7.2", 363 | "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", 364 | "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", 365 | "license": "MIT", 366 | "engines": { 367 | "node": ">=12.7.0" 368 | }, 369 | "peerDependencies": { 370 | "react": ">=16.8" 371 | }, 372 | "peerDependenciesMeta": { 373 | "react": { 374 | "optional": true 375 | } 376 | } 377 | }, 378 | "node_modules/@swc/counter": { 379 | "version": "0.1.3", 380 | "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", 381 | "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", 382 | "license": "Apache-2.0" 383 | }, 384 | "node_modules/@swc/helpers": { 385 | "version": "0.5.5", 386 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", 387 | "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", 388 | "license": "Apache-2.0", 389 | "dependencies": { 390 | "@swc/counter": "^0.1.3", 391 | "tslib": "^2.4.0" 392 | } 393 | }, 394 | "node_modules/@tweenjs/tween.js": { 395 | "version": "23.1.3", 396 | "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", 397 | "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", 398 | "license": "MIT" 399 | }, 400 | "node_modules/@types/debounce": { 401 | "version": "1.2.4", 402 | "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", 403 | "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", 404 | "license": "MIT" 405 | }, 406 | "node_modules/@types/draco3d": { 407 | "version": "1.4.10", 408 | "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", 409 | "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", 410 | "license": "MIT" 411 | }, 412 | "node_modules/@types/offscreencanvas": { 413 | "version": "2019.7.3", 414 | "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", 415 | "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", 416 | "license": "MIT" 417 | }, 418 | "node_modules/@types/react": { 419 | "version": "19.0.0", 420 | "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.0.tgz", 421 | "integrity": "sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==", 422 | "license": "MIT", 423 | "dependencies": { 424 | "csstype": "^3.0.2" 425 | } 426 | }, 427 | "node_modules/@types/react-reconciler": { 428 | "version": "0.26.7", 429 | "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", 430 | "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", 431 | "license": "MIT", 432 | "dependencies": { 433 | "@types/react": "*" 434 | } 435 | }, 436 | "node_modules/@types/stats.js": { 437 | "version": "0.17.3", 438 | "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", 439 | "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", 440 | "license": "MIT" 441 | }, 442 | "node_modules/@types/three": { 443 | "version": "0.170.0", 444 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.170.0.tgz", 445 | "integrity": "sha512-CUm2uckq+zkCY7ZbFpviRttY+6f9fvwm6YqSqPfA5K22s9w7R4VnA3rzJse8kHVvuzLcTx+CjNCs2NYe0QFAyg==", 446 | "license": "MIT", 447 | "dependencies": { 448 | "@tweenjs/tween.js": "~23.1.3", 449 | "@types/stats.js": "*", 450 | "@types/webxr": "*", 451 | "@webgpu/types": "*", 452 | "fflate": "~0.8.2", 453 | "meshoptimizer": "~0.18.1" 454 | } 455 | }, 456 | "node_modules/@types/webxr": { 457 | "version": "0.5.20", 458 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz", 459 | "integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==", 460 | "license": "MIT" 461 | }, 462 | "node_modules/@use-gesture/core": { 463 | "version": "10.3.1", 464 | "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", 465 | "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", 466 | "license": "MIT" 467 | }, 468 | "node_modules/@use-gesture/react": { 469 | "version": "10.3.1", 470 | "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", 471 | "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", 472 | "license": "MIT", 473 | "dependencies": { 474 | "@use-gesture/core": "10.3.1" 475 | }, 476 | "peerDependencies": { 477 | "react": ">= 16.8.0" 478 | } 479 | }, 480 | "node_modules/@webgpu/types": { 481 | "version": "0.1.51", 482 | "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.51.tgz", 483 | "integrity": "sha512-ktR3u64NPjwIViNCck+z9QeyN0iPkQCUOQ07ZCV1RzlkfP+olLTeEZ95O1QHS+v4w9vJeY9xj/uJuSphsHy5rQ==", 484 | "license": "BSD-3-Clause" 485 | }, 486 | "node_modules/base64-js": { 487 | "version": "1.5.1", 488 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 489 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 490 | "funding": [ 491 | { 492 | "type": "github", 493 | "url": "https://github.com/sponsors/feross" 494 | }, 495 | { 496 | "type": "patreon", 497 | "url": "https://www.patreon.com/feross" 498 | }, 499 | { 500 | "type": "consulting", 501 | "url": "https://feross.org/support" 502 | } 503 | ], 504 | "license": "MIT" 505 | }, 506 | "node_modules/bidi-js": { 507 | "version": "1.0.3", 508 | "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", 509 | "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", 510 | "license": "MIT", 511 | "dependencies": { 512 | "require-from-string": "^2.0.2" 513 | } 514 | }, 515 | "node_modules/buffer": { 516 | "version": "6.0.3", 517 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 518 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 519 | "funding": [ 520 | { 521 | "type": "github", 522 | "url": "https://github.com/sponsors/feross" 523 | }, 524 | { 525 | "type": "patreon", 526 | "url": "https://www.patreon.com/feross" 527 | }, 528 | { 529 | "type": "consulting", 530 | "url": "https://feross.org/support" 531 | } 532 | ], 533 | "license": "MIT", 534 | "dependencies": { 535 | "base64-js": "^1.3.1", 536 | "ieee754": "^1.2.1" 537 | } 538 | }, 539 | "node_modules/busboy": { 540 | "version": "1.6.0", 541 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 542 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 543 | "dependencies": { 544 | "streamsearch": "^1.1.0" 545 | }, 546 | "engines": { 547 | "node": ">=10.16.0" 548 | } 549 | }, 550 | "node_modules/camera-controls": { 551 | "version": "2.9.0", 552 | "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.9.0.tgz", 553 | "integrity": "sha512-TpCujnP0vqPppTXXJRYpvIy0xq9Tro6jQf2iYUxlDpPCNxkvE/XGaTuwIxnhINOkVP/ob2CRYXtY3iVYXeMEzA==", 554 | "license": "MIT", 555 | "peerDependencies": { 556 | "three": ">=0.126.1" 557 | } 558 | }, 559 | "node_modules/caniuse-lite": { 560 | "version": "1.0.30001686", 561 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz", 562 | "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==", 563 | "funding": [ 564 | { 565 | "type": "opencollective", 566 | "url": "https://opencollective.com/browserslist" 567 | }, 568 | { 569 | "type": "tidelift", 570 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 571 | }, 572 | { 573 | "type": "github", 574 | "url": "https://github.com/sponsors/ai" 575 | } 576 | ], 577 | "license": "CC-BY-4.0" 578 | }, 579 | "node_modules/client-only": { 580 | "version": "0.0.1", 581 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 582 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", 583 | "license": "MIT" 584 | }, 585 | "node_modules/cross-env": { 586 | "version": "7.0.3", 587 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", 588 | "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", 589 | "license": "MIT", 590 | "dependencies": { 591 | "cross-spawn": "^7.0.1" 592 | }, 593 | "bin": { 594 | "cross-env": "src/bin/cross-env.js", 595 | "cross-env-shell": "src/bin/cross-env-shell.js" 596 | }, 597 | "engines": { 598 | "node": ">=10.14", 599 | "npm": ">=6", 600 | "yarn": ">=1" 601 | } 602 | }, 603 | "node_modules/cross-spawn": { 604 | "version": "7.0.6", 605 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 606 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 607 | "license": "MIT", 608 | "dependencies": { 609 | "path-key": "^3.1.0", 610 | "shebang-command": "^2.0.0", 611 | "which": "^2.0.1" 612 | }, 613 | "engines": { 614 | "node": ">= 8" 615 | } 616 | }, 617 | "node_modules/csstype": { 618 | "version": "3.1.3", 619 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 620 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 621 | "license": "MIT" 622 | }, 623 | "node_modules/debounce": { 624 | "version": "1.2.1", 625 | "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", 626 | "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", 627 | "license": "MIT" 628 | }, 629 | "node_modules/detect-gpu": { 630 | "version": "5.0.59", 631 | "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.59.tgz", 632 | "integrity": "sha512-tBS01N6Lu7D2T6nmoA5or39u12PqtmO4RPCSfgvbgcOUGPhExU8RDiyUiT3iVxCKX9XTxIM1k+mVaeirLv6pwA==", 633 | "license": "MIT", 634 | "dependencies": { 635 | "webgl-constants": "^1.1.1" 636 | } 637 | }, 638 | "node_modules/draco3d": { 639 | "version": "1.5.7", 640 | "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", 641 | "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", 642 | "license": "Apache-2.0" 643 | }, 644 | "node_modules/fflate": { 645 | "version": "0.8.2", 646 | "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", 647 | "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", 648 | "license": "MIT" 649 | }, 650 | "node_modules/glsl-noise": { 651 | "version": "0.0.0", 652 | "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", 653 | "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", 654 | "license": "MIT" 655 | }, 656 | "node_modules/graceful-fs": { 657 | "version": "4.2.11", 658 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 659 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 660 | "license": "ISC" 661 | }, 662 | "node_modules/hls.js": { 663 | "version": "1.5.17", 664 | "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.17.tgz", 665 | "integrity": "sha512-wA66nnYFvQa1o4DO/BFgLNRKnBTVXpNeldGRBJ2Y0SvFtdwvFKCbqa9zhHoZLoxHhZ+jYsj3aIBkWQQCPNOhMw==", 666 | "license": "Apache-2.0" 667 | }, 668 | "node_modules/ieee754": { 669 | "version": "1.2.1", 670 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 671 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 672 | "funding": [ 673 | { 674 | "type": "github", 675 | "url": "https://github.com/sponsors/feross" 676 | }, 677 | { 678 | "type": "patreon", 679 | "url": "https://www.patreon.com/feross" 680 | }, 681 | { 682 | "type": "consulting", 683 | "url": "https://feross.org/support" 684 | } 685 | ], 686 | "license": "BSD-3-Clause" 687 | }, 688 | "node_modules/immediate": { 689 | "version": "3.0.6", 690 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 691 | "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", 692 | "license": "MIT" 693 | }, 694 | "node_modules/is-promise": { 695 | "version": "2.2.2", 696 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 697 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", 698 | "license": "MIT" 699 | }, 700 | "node_modules/isexe": { 701 | "version": "2.0.0", 702 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 703 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 704 | "license": "ISC" 705 | }, 706 | "node_modules/its-fine": { 707 | "version": "1.2.5", 708 | "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", 709 | "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", 710 | "license": "MIT", 711 | "dependencies": { 712 | "@types/react-reconciler": "^0.28.0" 713 | }, 714 | "peerDependencies": { 715 | "react": ">=18.0" 716 | } 717 | }, 718 | "node_modules/its-fine/node_modules/@types/react-reconciler": { 719 | "version": "0.28.8", 720 | "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", 721 | "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", 722 | "license": "MIT", 723 | "dependencies": { 724 | "@types/react": "*" 725 | } 726 | }, 727 | "node_modules/js-tokens": { 728 | "version": "4.0.0", 729 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 730 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 731 | "license": "MIT" 732 | }, 733 | "node_modules/lie": { 734 | "version": "3.3.0", 735 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 736 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 737 | "license": "MIT", 738 | "dependencies": { 739 | "immediate": "~3.0.5" 740 | } 741 | }, 742 | "node_modules/loose-envify": { 743 | "version": "1.4.0", 744 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 745 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 746 | "license": "MIT", 747 | "dependencies": { 748 | "js-tokens": "^3.0.0 || ^4.0.0" 749 | }, 750 | "bin": { 751 | "loose-envify": "cli.js" 752 | } 753 | }, 754 | "node_modules/maath": { 755 | "version": "0.10.8", 756 | "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", 757 | "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", 758 | "license": "MIT", 759 | "peerDependencies": { 760 | "@types/three": ">=0.134.0", 761 | "three": ">=0.134.0" 762 | } 763 | }, 764 | "node_modules/meshline": { 765 | "version": "3.3.1", 766 | "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", 767 | "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", 768 | "license": "MIT", 769 | "peerDependencies": { 770 | "three": ">=0.137" 771 | } 772 | }, 773 | "node_modules/meshoptimizer": { 774 | "version": "0.18.1", 775 | "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", 776 | "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", 777 | "license": "MIT" 778 | }, 779 | "node_modules/nanoid": { 780 | "version": "3.3.8", 781 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 782 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 783 | "funding": [ 784 | { 785 | "type": "github", 786 | "url": "https://github.com/sponsors/ai" 787 | } 788 | ], 789 | "license": "MIT", 790 | "bin": { 791 | "nanoid": "bin/nanoid.cjs" 792 | }, 793 | "engines": { 794 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 795 | } 796 | }, 797 | "node_modules/next": { 798 | "version": "14.2.20", 799 | "resolved": "https://registry.npmjs.org/next/-/next-14.2.20.tgz", 800 | "integrity": "sha512-yPvIiWsiyVYqJlSQxwmzMIReXn5HxFNq4+tlVQ812N1FbvhmE+fDpIAD7bcS2mGYQwPJ5vAsQouyme2eKsxaug==", 801 | "license": "MIT", 802 | "dependencies": { 803 | "@next/env": "14.2.20", 804 | "@swc/helpers": "0.5.5", 805 | "busboy": "1.6.0", 806 | "caniuse-lite": "^1.0.30001579", 807 | "graceful-fs": "^4.2.11", 808 | "postcss": "8.4.31", 809 | "styled-jsx": "5.1.1" 810 | }, 811 | "bin": { 812 | "next": "dist/bin/next" 813 | }, 814 | "engines": { 815 | "node": ">=18.17.0" 816 | }, 817 | "optionalDependencies": { 818 | "@next/swc-darwin-arm64": "14.2.20", 819 | "@next/swc-darwin-x64": "14.2.20", 820 | "@next/swc-linux-arm64-gnu": "14.2.20", 821 | "@next/swc-linux-arm64-musl": "14.2.20", 822 | "@next/swc-linux-x64-gnu": "14.2.20", 823 | "@next/swc-linux-x64-musl": "14.2.20", 824 | "@next/swc-win32-arm64-msvc": "14.2.20", 825 | "@next/swc-win32-ia32-msvc": "14.2.20", 826 | "@next/swc-win32-x64-msvc": "14.2.20" 827 | }, 828 | "peerDependencies": { 829 | "@opentelemetry/api": "^1.1.0", 830 | "@playwright/test": "^1.41.2", 831 | "react": "^18.2.0", 832 | "react-dom": "^18.2.0", 833 | "sass": "^1.3.0" 834 | }, 835 | "peerDependenciesMeta": { 836 | "@opentelemetry/api": { 837 | "optional": true 838 | }, 839 | "@playwright/test": { 840 | "optional": true 841 | }, 842 | "sass": { 843 | "optional": true 844 | } 845 | } 846 | }, 847 | "node_modules/object-assign": { 848 | "version": "4.1.1", 849 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 850 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 851 | "license": "MIT", 852 | "engines": { 853 | "node": ">=0.10.0" 854 | } 855 | }, 856 | "node_modules/path-key": { 857 | "version": "3.1.1", 858 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 859 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 860 | "license": "MIT", 861 | "engines": { 862 | "node": ">=8" 863 | } 864 | }, 865 | "node_modules/picocolors": { 866 | "version": "1.1.1", 867 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 868 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 869 | "license": "ISC" 870 | }, 871 | "node_modules/postcss": { 872 | "version": "8.4.31", 873 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 874 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 875 | "funding": [ 876 | { 877 | "type": "opencollective", 878 | "url": "https://opencollective.com/postcss/" 879 | }, 880 | { 881 | "type": "tidelift", 882 | "url": "https://tidelift.com/funding/github/npm/postcss" 883 | }, 884 | { 885 | "type": "github", 886 | "url": "https://github.com/sponsors/ai" 887 | } 888 | ], 889 | "license": "MIT", 890 | "dependencies": { 891 | "nanoid": "^3.3.6", 892 | "picocolors": "^1.0.0", 893 | "source-map-js": "^1.0.2" 894 | }, 895 | "engines": { 896 | "node": "^10 || ^12 || >=14" 897 | } 898 | }, 899 | "node_modules/potpack": { 900 | "version": "1.0.2", 901 | "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", 902 | "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", 903 | "license": "ISC" 904 | }, 905 | "node_modules/promise-worker-transferable": { 906 | "version": "1.0.4", 907 | "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", 908 | "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", 909 | "license": "Apache-2.0", 910 | "dependencies": { 911 | "is-promise": "^2.1.0", 912 | "lie": "^3.0.2" 913 | } 914 | }, 915 | "node_modules/prop-types": { 916 | "version": "15.8.1", 917 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 918 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 919 | "license": "MIT", 920 | "dependencies": { 921 | "loose-envify": "^1.4.0", 922 | "object-assign": "^4.1.1", 923 | "react-is": "^16.13.1" 924 | } 925 | }, 926 | "node_modules/react": { 927 | "version": "18.3.1", 928 | "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", 929 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", 930 | "license": "MIT", 931 | "dependencies": { 932 | "loose-envify": "^1.1.0" 933 | }, 934 | "engines": { 935 | "node": ">=0.10.0" 936 | } 937 | }, 938 | "node_modules/react-composer": { 939 | "version": "5.0.3", 940 | "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", 941 | "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", 942 | "license": "MIT", 943 | "dependencies": { 944 | "prop-types": "^15.6.0" 945 | }, 946 | "peerDependencies": { 947 | "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" 948 | } 949 | }, 950 | "node_modules/react-dom": { 951 | "version": "18.3.1", 952 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", 953 | "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", 954 | "license": "MIT", 955 | "dependencies": { 956 | "loose-envify": "^1.1.0", 957 | "scheduler": "^0.23.2" 958 | }, 959 | "peerDependencies": { 960 | "react": "^18.3.1" 961 | } 962 | }, 963 | "node_modules/react-dom/node_modules/scheduler": { 964 | "version": "0.23.2", 965 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", 966 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", 967 | "license": "MIT", 968 | "dependencies": { 969 | "loose-envify": "^1.1.0" 970 | } 971 | }, 972 | "node_modules/react-is": { 973 | "version": "16.13.1", 974 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 975 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 976 | "license": "MIT" 977 | }, 978 | "node_modules/react-reconciler": { 979 | "version": "0.27.0", 980 | "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", 981 | "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", 982 | "license": "MIT", 983 | "dependencies": { 984 | "loose-envify": "^1.1.0", 985 | "scheduler": "^0.21.0" 986 | }, 987 | "engines": { 988 | "node": ">=0.10.0" 989 | }, 990 | "peerDependencies": { 991 | "react": "^18.0.0" 992 | } 993 | }, 994 | "node_modules/regenerator-runtime": { 995 | "version": "0.14.1", 996 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 997 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", 998 | "license": "MIT" 999 | }, 1000 | "node_modules/require-from-string": { 1001 | "version": "2.0.2", 1002 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1003 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1004 | "license": "MIT", 1005 | "engines": { 1006 | "node": ">=0.10.0" 1007 | } 1008 | }, 1009 | "node_modules/scheduler": { 1010 | "version": "0.21.0", 1011 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", 1012 | "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", 1013 | "license": "MIT", 1014 | "dependencies": { 1015 | "loose-envify": "^1.1.0" 1016 | } 1017 | }, 1018 | "node_modules/shebang-command": { 1019 | "version": "2.0.0", 1020 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1021 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1022 | "license": "MIT", 1023 | "dependencies": { 1024 | "shebang-regex": "^3.0.0" 1025 | }, 1026 | "engines": { 1027 | "node": ">=8" 1028 | } 1029 | }, 1030 | "node_modules/shebang-regex": { 1031 | "version": "3.0.0", 1032 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1033 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1034 | "license": "MIT", 1035 | "engines": { 1036 | "node": ">=8" 1037 | } 1038 | }, 1039 | "node_modules/source-map-js": { 1040 | "version": "1.2.1", 1041 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1042 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1043 | "license": "BSD-3-Clause", 1044 | "engines": { 1045 | "node": ">=0.10.0" 1046 | } 1047 | }, 1048 | "node_modules/stats-gl": { 1049 | "version": "2.4.2", 1050 | "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", 1051 | "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", 1052 | "license": "MIT", 1053 | "dependencies": { 1054 | "@types/three": "*", 1055 | "three": "^0.170.0" 1056 | }, 1057 | "peerDependencies": { 1058 | "@types/three": "*", 1059 | "three": "*" 1060 | } 1061 | }, 1062 | "node_modules/stats-gl/node_modules/three": { 1063 | "version": "0.170.0", 1064 | "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", 1065 | "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", 1066 | "license": "MIT" 1067 | }, 1068 | "node_modules/stats.js": { 1069 | "version": "0.17.0", 1070 | "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", 1071 | "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", 1072 | "license": "MIT" 1073 | }, 1074 | "node_modules/streamsearch": { 1075 | "version": "1.1.0", 1076 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1077 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1078 | "engines": { 1079 | "node": ">=10.0.0" 1080 | } 1081 | }, 1082 | "node_modules/styled-jsx": { 1083 | "version": "5.1.1", 1084 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", 1085 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", 1086 | "license": "MIT", 1087 | "dependencies": { 1088 | "client-only": "0.0.1" 1089 | }, 1090 | "engines": { 1091 | "node": ">= 12.0.0" 1092 | }, 1093 | "peerDependencies": { 1094 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 1095 | }, 1096 | "peerDependenciesMeta": { 1097 | "@babel/core": { 1098 | "optional": true 1099 | }, 1100 | "babel-plugin-macros": { 1101 | "optional": true 1102 | } 1103 | } 1104 | }, 1105 | "node_modules/suspend-react": { 1106 | "version": "0.1.3", 1107 | "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", 1108 | "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", 1109 | "license": "MIT", 1110 | "peerDependencies": { 1111 | "react": ">=17.0" 1112 | } 1113 | }, 1114 | "node_modules/three": { 1115 | "version": "0.173.0", 1116 | "resolved": "https://registry.npmjs.org/three/-/three-0.173.0.tgz", 1117 | "integrity": "sha512-AUwVmViIEUgBwxJJ7stnF0NkPpZxx1aZ6WiAbQ/Qq61h6I9UR4grXtZDmO8mnlaNORhHnIBlXJ1uBxILEKuVyw==", 1118 | "license": "MIT" 1119 | }, 1120 | "node_modules/three-mesh-bvh": { 1121 | "version": "0.7.8", 1122 | "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.8.tgz", 1123 | "integrity": "sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==", 1124 | "deprecated": "Deprecated due to three.js version incompatibility. Please use v0.8.0, instead.", 1125 | "license": "MIT", 1126 | "peerDependencies": { 1127 | "three": ">= 0.151.0" 1128 | } 1129 | }, 1130 | "node_modules/three-stdlib": { 1131 | "version": "2.34.0", 1132 | "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.34.0.tgz", 1133 | "integrity": "sha512-U5qJYWgUKBFJqr1coMSbczA964uvouzBjQbtJlaI9LfMwy7hr+kc1Mfh0gqi/2872KmGu9utgff6lj8Oti8+VQ==", 1134 | "license": "MIT", 1135 | "dependencies": { 1136 | "@types/draco3d": "^1.4.0", 1137 | "@types/offscreencanvas": "^2019.6.4", 1138 | "@types/webxr": "^0.5.2", 1139 | "draco3d": "^1.4.1", 1140 | "fflate": "^0.6.9", 1141 | "potpack": "^1.0.1" 1142 | }, 1143 | "peerDependencies": { 1144 | "three": ">=0.128.0" 1145 | } 1146 | }, 1147 | "node_modules/three-stdlib/node_modules/fflate": { 1148 | "version": "0.6.10", 1149 | "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", 1150 | "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", 1151 | "license": "MIT" 1152 | }, 1153 | "node_modules/troika-three-text": { 1154 | "version": "0.52.2", 1155 | "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.2.tgz", 1156 | "integrity": "sha512-UGYwjKnR8RgmyOIpo0/KiSW0wySQ155BQXNLoSWA1liKzXG+RyHM+dvTIDawHGVQcqjqyunFlVY32xm/HDqjpw==", 1157 | "license": "MIT", 1158 | "dependencies": { 1159 | "bidi-js": "^1.0.2", 1160 | "troika-three-utils": "^0.52.0", 1161 | "troika-worker-utils": "^0.52.0", 1162 | "webgl-sdf-generator": "1.1.1" 1163 | }, 1164 | "peerDependencies": { 1165 | "three": ">=0.125.0" 1166 | } 1167 | }, 1168 | "node_modules/troika-three-utils": { 1169 | "version": "0.52.0", 1170 | "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.0.tgz", 1171 | "integrity": "sha512-00oxqIIehtEKInOTQekgyknBuRUj1POfOUE2q1OmL+Xlpp4gIu+S0oA0schTyXsDS4d9DkR04iqCdD40rF5R6w==", 1172 | "license": "MIT", 1173 | "peerDependencies": { 1174 | "three": ">=0.125.0" 1175 | } 1176 | }, 1177 | "node_modules/troika-worker-utils": { 1178 | "version": "0.52.0", 1179 | "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", 1180 | "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", 1181 | "license": "MIT" 1182 | }, 1183 | "node_modules/tslib": { 1184 | "version": "2.8.1", 1185 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1186 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1187 | "license": "0BSD" 1188 | }, 1189 | "node_modules/tunnel-rat": { 1190 | "version": "0.1.2", 1191 | "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", 1192 | "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", 1193 | "license": "MIT", 1194 | "dependencies": { 1195 | "zustand": "^4.3.2" 1196 | } 1197 | }, 1198 | "node_modules/tunnel-rat/node_modules/zustand": { 1199 | "version": "4.5.5", 1200 | "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", 1201 | "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", 1202 | "license": "MIT", 1203 | "dependencies": { 1204 | "use-sync-external-store": "1.2.2" 1205 | }, 1206 | "engines": { 1207 | "node": ">=12.7.0" 1208 | }, 1209 | "peerDependencies": { 1210 | "@types/react": ">=16.8", 1211 | "immer": ">=9.0.6", 1212 | "react": ">=16.8" 1213 | }, 1214 | "peerDependenciesMeta": { 1215 | "@types/react": { 1216 | "optional": true 1217 | }, 1218 | "immer": { 1219 | "optional": true 1220 | }, 1221 | "react": { 1222 | "optional": true 1223 | } 1224 | } 1225 | }, 1226 | "node_modules/use-sync-external-store": { 1227 | "version": "1.2.2", 1228 | "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", 1229 | "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", 1230 | "license": "MIT", 1231 | "peerDependencies": { 1232 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 1233 | } 1234 | }, 1235 | "node_modules/utility-types": { 1236 | "version": "3.11.0", 1237 | "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", 1238 | "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", 1239 | "license": "MIT", 1240 | "engines": { 1241 | "node": ">= 4" 1242 | } 1243 | }, 1244 | "node_modules/uuid": { 1245 | "version": "9.0.1", 1246 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", 1247 | "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", 1248 | "funding": [ 1249 | "https://github.com/sponsors/broofa", 1250 | "https://github.com/sponsors/ctavan" 1251 | ], 1252 | "license": "MIT", 1253 | "bin": { 1254 | "uuid": "dist/bin/uuid" 1255 | } 1256 | }, 1257 | "node_modules/webgl-constants": { 1258 | "version": "1.1.1", 1259 | "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", 1260 | "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" 1261 | }, 1262 | "node_modules/webgl-sdf-generator": { 1263 | "version": "1.1.1", 1264 | "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", 1265 | "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", 1266 | "license": "MIT" 1267 | }, 1268 | "node_modules/which": { 1269 | "version": "2.0.2", 1270 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1271 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1272 | "license": "ISC", 1273 | "dependencies": { 1274 | "isexe": "^2.0.0" 1275 | }, 1276 | "bin": { 1277 | "node-which": "bin/node-which" 1278 | }, 1279 | "engines": { 1280 | "node": ">= 8" 1281 | } 1282 | }, 1283 | "node_modules/zustand": { 1284 | "version": "5.0.2", 1285 | "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.2.tgz", 1286 | "integrity": "sha512-8qNdnJVJlHlrKXi50LDqqUNmUbuBjoKLrYQBnoChIbVph7vni+sY+YpvdjXG9YLd/Bxr6scMcR+rm5H3aSqPaw==", 1287 | "license": "MIT", 1288 | "engines": { 1289 | "node": ">=12.20.0" 1290 | }, 1291 | "peerDependencies": { 1292 | "@types/react": ">=18.0.0", 1293 | "immer": ">=9.0.6", 1294 | "react": ">=18.0.0", 1295 | "use-sync-external-store": ">=1.2.0" 1296 | }, 1297 | "peerDependenciesMeta": { 1298 | "@types/react": { 1299 | "optional": true 1300 | }, 1301 | "immer": { 1302 | "optional": true 1303 | }, 1304 | "react": { 1305 | "optional": true 1306 | }, 1307 | "use-sync-external-store": { 1308 | "optional": true 1309 | } 1310 | } 1311 | } 1312 | } 1313 | } 1314 | -------------------------------------------------------------------------------- /next14-app-r3f8-react18/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next dev", 5 | "start": "next build && next start", 6 | "docker": "docker build -t next14-app-r3f8-react18 . && docker run -p 3000:3000 next14-app-r3f8-react18" 7 | }, 8 | "dependencies": { 9 | "@react-three/drei": "9.120.0", 10 | "@react-three/fiber": "8.17.10", 11 | "react": "18.3.1", 12 | "react-dom": "18.3.1", 13 | "next": "14.2.20", 14 | "three": "0.173.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /next14-pages-r3f8-react18/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist -------------------------------------------------------------------------------- /next14-pages-r3f8-react18/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /next14-pages-r3f8-react18/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 3000 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /next14-pages-r3f8-react18/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /next14-pages-r3f8-react18/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | }; 5 | 6 | export default nextConfig; 7 | -------------------------------------------------------------------------------- /next14-pages-r3f8-react18/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next dev", 5 | "start": "next build && next start", 6 | "docker": "docker build -t next14-pages-r3f8-react18 . && docker run -p 3000:3000 next14-pages-r3f8-react18" 7 | }, 8 | "dependencies": { 9 | "@react-three/drei": "9.120.0", 10 | "@react-three/fiber": "8.17.10", 11 | "react": "18.3.1", 12 | "react-dom": "18.3.1", 13 | "next": "14.2.20", 14 | "three": "0.173.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /next14-pages-r3f8-react18/pages/index.js: -------------------------------------------------------------------------------- 1 | import React, { useMemo, useRef, useState } from 'react' 2 | import { Canvas, useFrame, useThree, extend } from '@react-three/fiber' 3 | import { OrbitControls } from '@react-three/drei' 4 | import { WebGPURenderer, MeshStandardNodeMaterial } from 'three/webgpu' 5 | import { uniform } from 'three/tsl' 6 | import { Color } from 'three' 7 | 8 | extend({ MeshStandardNodeMaterial }) 9 | 10 | const red = new Color('red') 11 | const blue = new Color('blue') 12 | 13 | function Box(props) { 14 | const meshRef = useRef() 15 | const [hovered, setHover] = useState(false) 16 | const [active, setActive] = useState(false) 17 | const { gl } = useThree() 18 | 19 | useFrame((state, delta) => (meshRef.current.rotation.x += delta)) 20 | 21 | console.log(gl.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend') 22 | 23 | const uColor = useMemo(() => uniform(blue), []) 24 | 25 | uColor.value = hovered ? red : blue 26 | 27 | return ( 28 | setActive(!active)} 33 | onPointerOver={() => setHover(true)} 34 | onPointerOut={() => setHover(false)} 35 | > 36 | 37 | 38 | 39 | ) 40 | } 41 | 42 | export default function IndexPage() { 43 | const [frameloop, setFrameloop] = useState('never') 44 | 45 | return ( 46 | { 50 | const renderer = new WebGPURenderer({ 51 | canvas, 52 | powerPreference: 'high-performance', 53 | antialias: true, 54 | alpha: true, 55 | }) 56 | renderer.init().then(() => setFrameloop('always')) 57 | return renderer 58 | }} 59 | > 60 | 61 | 62 | 69 | 70 | 71 | 72 | 73 | ) 74 | } 75 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # env files (can opt-in for committing if needed) 33 | .env* 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 3000 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/app/ClientBox.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useRef, useMemo, useState } from 'react' 4 | import { useFrame, useThree } from '@react-three/fiber' 5 | import { uniform } from 'three/tsl' 6 | import { Color } from 'three' 7 | 8 | const red = new Color('red') 9 | const blue = new Color('blue') 10 | 11 | export function ClientBox(props) { 12 | const meshRef = useRef() 13 | const [hovered, setHover] = useState(false) 14 | const [active, setActive] = useState(false) 15 | const { gl } = useThree() 16 | 17 | useFrame((state, delta) => (meshRef.current.rotation.x += delta)) 18 | 19 | console.log(gl.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend') 20 | 21 | const uColor = useMemo(() => uniform(blue), []) 22 | 23 | uColor.value = hovered ? red : blue 24 | 25 | return ( 26 | setActive(!active)} 31 | onPointerOver={() => setHover(true)} 32 | onPointerOut={() => setHover(false)} 33 | > 34 | 35 | 36 | 37 | ) 38 | } 39 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/app/ClientCanvas.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Canvas } from '@react-three/fiber' 4 | import { WebGPURenderer } from 'three/webgpu' 5 | import '../lib/extend' 6 | 7 | export function ClientCanvas({ children }) { 8 | return ( 9 | { 12 | const renderer = new WebGPURenderer(glProps) 13 | await renderer.init() 14 | return renderer 15 | }} 16 | > 17 | {children} 18 | 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/app/ClientOrbitControls.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { OrbitControls } from '@react-three/drei' 4 | 5 | export function ClientOrbitControls() { 6 | return 7 | } 8 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/app/layout.js: -------------------------------------------------------------------------------- 1 | export default function RootLayout({ children }) { 2 | return ( 3 | 4 | {children} 5 | 6 | ) 7 | } 8 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/app/page.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { ClientBox } from './ClientBox' 4 | import { ClientCanvas } from './ClientCanvas' 5 | import { ClientOrbitControls } from './ClientOrbitControls' 6 | 7 | export default function IndexPage() { 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/lib/extend.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three/webgpu' 2 | import { extend } from '@react-three/fiber' 3 | 4 | extend(THREE) 5 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | }; 5 | 6 | export default nextConfig; 7 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19-rsc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next dev", 5 | "start": "next build && next start", 6 | "docker": "docker build -t next15-app-r3f9-react19-rsc . && docker run -p 3000:3000 next15-app-r3f9-react19-rsc" 7 | }, 8 | "dependencies": { 9 | "@react-three/drei": "10.0.0", 10 | "@react-three/fiber": "9.0.0", 11 | "react": "19.0.0", 12 | "react-dom": "19.0.0", 13 | "next": "15.1.6", 14 | "three": "0.173.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist -------------------------------------------------------------------------------- /next15-app-r3f9-react19/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # env files (can opt-in for committing if needed) 33 | .env* 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 3000 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/app/layout.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import '../lib/extend' 4 | 5 | export default function RootLayout({ children }) { 6 | return ( 7 | 8 | {children} 9 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/app/page.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React, { useMemo, useRef, useState } from 'react' 4 | import { Canvas, useFrame, useThree } from '@react-three/fiber' 5 | import { OrbitControls } from '@react-three/drei' 6 | import { WebGPURenderer } from 'three/webgpu' 7 | import { uniform } from 'three/tsl' 8 | import { Color } from 'three' 9 | 10 | const red = new Color('red') 11 | const blue = new Color('blue') 12 | 13 | function Box(props) { 14 | const meshRef = useRef() 15 | const [hovered, setHover] = useState(false) 16 | const [active, setActive] = useState(false) 17 | const { gl } = useThree() 18 | 19 | useFrame((state, delta) => (meshRef.current.rotation.x += delta)) 20 | 21 | console.log(gl.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend') 22 | 23 | const uColor = useMemo(() => uniform(blue), []) 24 | 25 | uColor.value = hovered ? red : blue 26 | 27 | return ( 28 | setActive(!active)} 33 | onPointerOver={() => setHover(true)} 34 | onPointerOut={() => setHover(false)} 35 | > 36 | 37 | 38 | 39 | ) 40 | } 41 | 42 | export default function IndexPage() { 43 | return ( 44 | { 47 | const renderer = new WebGPURenderer(glProps) 48 | await renderer.init() 49 | return renderer 50 | }} 51 | > 52 | 53 | 54 | 61 | 62 | 63 | 64 | 65 | ) 66 | } 67 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/lib/extend.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three/webgpu' 2 | import { extend } from '@react-three/fiber' 3 | 4 | extend(THREE) 5 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | }; 5 | 6 | export default nextConfig; 7 | -------------------------------------------------------------------------------- /next15-app-r3f9-react19/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next15-app-r3f9-react19", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "start": "next build && next start", 8 | "docker": "docker build -t next15-app-r3f9-react19 . && docker run -p 3000:3000 next15-app-r3f9-react19" 9 | }, 10 | "dependencies": { 11 | "@react-three/drei": "10.0.0", 12 | "@react-three/fiber": "9.0.0", 13 | "react": "19.0.0", 14 | "react-dom": "19.0.0", 15 | "next": "15.1.6", 16 | "three": "0.173.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # env files (can opt-in for committing if needed) 33 | .env* 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 3000 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/lib/extend.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three/webgpu' 2 | import { extend } from '@react-three/fiber' 3 | 4 | extend(THREE) 5 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | }; 5 | 6 | export default nextConfig; 7 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next dev", 5 | "start": "next build && next start", 6 | "docker": "docker build -t next15-pages-r3f9-react19 . && docker run -p 3000:3000 next15-pages-r3f9-react19" 7 | }, 8 | "dependencies": { 9 | "@react-three/drei": "10.0.0", 10 | "@react-three/fiber": "9.0.0", 11 | "react": "19.0.0", 12 | "react-dom": "19.0.0", 13 | "next": "15.1.6", 14 | "three": "0.173.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/pages/_app.js: -------------------------------------------------------------------------------- 1 | import '../lib/extend' 2 | 3 | export default function MyApp({ Component, pageProps }) { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /next15-pages-r3f9-react19/pages/index.js: -------------------------------------------------------------------------------- 1 | import React, { useRef, useMemo, useState } from 'react' 2 | import { Canvas, useFrame, useThree } from '@react-three/fiber' 3 | import { OrbitControls } from '@react-three/drei' 4 | import { WebGPURenderer } from 'three/webgpu' 5 | import { uniform } from 'three/tsl' 6 | import { Color } from 'three' 7 | 8 | const red = new Color('red') 9 | const blue = new Color('blue') 10 | 11 | process.env.NODE_ENV === 'development' && 12 | console.log( 13 | 'The appIsrManifest error is fixed in Next.js 15.1.1-canary.24 (not merged into the main release yet)' 14 | ) 15 | 16 | function Box(props) { 17 | const meshRef = useRef() 18 | const [hovered, setHover] = useState(false) 19 | const [active, setActive] = useState(false) 20 | const { gl } = useThree() 21 | 22 | useFrame((state, delta) => (meshRef.current.rotation.x += delta)) 23 | 24 | console.log(gl.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend') 25 | 26 | const uColor = useMemo(() => uniform(blue), []) 27 | 28 | uColor.value = hovered ? red : blue 29 | 30 | return ( 31 | setActive(!active)} 36 | onPointerOver={() => setHover(true)} 37 | onPointerOut={() => setHover(false)} 38 | > 39 | 40 | 41 | 42 | ) 43 | } 44 | 45 | export default function IndexPage() { 46 | return ( 47 | { 50 | const renderer = new WebGPURenderer(glProps) 51 | await renderer.init() 52 | return renderer 53 | }} 54 | > 55 | 56 | 57 | 64 | 65 | 66 | 67 | 68 | ) 69 | } 70 | -------------------------------------------------------------------------------- /sveltekit-threlte8/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | # Output 4 | .output 5 | .vercel 6 | .netlify 7 | .wrangler 8 | /.svelte-kit 9 | /build 10 | 11 | # OS 12 | .DS_Store 13 | Thumbs.db 14 | 15 | # Env 16 | .env 17 | .env.* 18 | !.env.example 19 | !.env.test 20 | 21 | # Vite 22 | vite.config.js.timestamp-* 23 | vite.config.ts.timestamp-* 24 | -------------------------------------------------------------------------------- /sveltekit-threlte8/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /sveltekit-threlte8/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 4173 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /sveltekit-threlte8/README.md: -------------------------------------------------------------------------------- 1 | # sv 2 | 3 | Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npx sv create 12 | 13 | # create a new project in my-app 14 | npx sv create my-app 15 | ``` 16 | 17 | ## Developing 18 | 19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 | 21 | ```bash 22 | npm run dev 23 | 24 | # or start the server and open the app in a new browser tab 25 | npm run dev -- --open 26 | ``` 27 | 28 | ## Building 29 | 30 | To create a production version of your app: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | You can preview the production build with `npm run preview`. 37 | 38 | > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. 39 | -------------------------------------------------------------------------------- /sveltekit-threlte8/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "start": "vite build && vite preview --host", 7 | "docker": "docker build -t sveltekit-threlte8 . && docker run -p 4173:4173 sveltekit-threlte8" 8 | }, 9 | "dependencies": { 10 | "@threlte/core": "8.0.0-next.31", 11 | "@threlte/extras": "9.0.0-next.42", 12 | "three": "0.173.0" 13 | }, 14 | "devDependencies": { 15 | "@sveltejs/adapter-auto": "3.0.0", 16 | "@sveltejs/kit": "2.9.0", 17 | "@sveltejs/vite-plugin-svelte": "5.0.0", 18 | "svelte": "5.0.0", 19 | "svelte-check": "4.0.0", 20 | "typescript": "5.7.2", 21 | "vite": "6.0.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /sveltekit-threlte8/src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://svelte.dev/docs/kit/types#app.d.ts 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface PageState {} 9 | // interface Platform {} 10 | } 11 | } 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /sveltekit-threlte8/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /sveltekit-threlte8/src/components/BackendLogger.svelte: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /sveltekit-threlte8/src/lib/index.ts: -------------------------------------------------------------------------------- 1 | // place files you want to import through the `$lib` alias in this folder. 2 | -------------------------------------------------------------------------------- /sveltekit-threlte8/src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
10 | 12 | new WebGPURenderer({ 13 | canvas, 14 | antialias: true, 15 | alpha: true, 16 | powerPreference: 'high-performance', 17 | })} 18 | > 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 43 | -------------------------------------------------------------------------------- /sveltekit-threlte8/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/verekia/three-gpu-ecosystem-tests/48fddf2d18edc8e99866023cced9240c5aecaf98/sveltekit-threlte8/static/favicon.png -------------------------------------------------------------------------------- /sveltekit-threlte8/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://svelte.dev/docs/kit/integrations 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. 12 | // If your environment is not supported, or you settled on a specific environment, switch out the adapter. 13 | // See https://svelte.dev/docs/kit/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /sveltekit-threlte8/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "moduleResolution": "bundler" 13 | } 14 | // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias 15 | // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files 16 | // 17 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 18 | // from the referenced tsconfig.json - TypeScript does not merge them in 19 | } 20 | -------------------------------------------------------------------------------- /sveltekit-threlte8/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite' 2 | import { defineConfig } from 'vite' 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | // Those are needed when importing modules with top-level 7 | // await such as three/examples/jsm/capabilities/WebGPU 8 | // optimizeDeps: { esbuildOptions: { target: 'esnext' } }, 9 | // build: { target: 'esnext' }, 10 | }) 11 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist 7 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 4173 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "start": "tsc -b && vite build && vite preview --host", 7 | "docker": "docker build -t vite-ts-swc-r3f8-react18 . && docker run -p 4173:4173 vite-ts-swc-r3f8-react18" 8 | }, 9 | "dependencies": { 10 | "@react-three/drei": "9.120.0", 11 | "@react-three/fiber": "8.17.10", 12 | "react": "18.3.1", 13 | "react-dom": "18.3.1", 14 | "three": "0.173.0" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "9.13.0", 18 | "@types/react": "18.3.12", 19 | "@types/react-dom": "18.3.1", 20 | "@types/three": "0.173.0", 21 | "@vitejs/plugin-react-swc": "3.5.0", 22 | "eslint": "9.13.0", 23 | "eslint-plugin-react-hooks": "5.0.0", 24 | "eslint-plugin-react-refresh": "0.4.14", 25 | "globals": "15.11.0", 26 | "typescript": "~5.6.2", 27 | "typescript-eslint": "8.11.0", 28 | "vite": "5.4.10" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useMemo, useRef, useState } from 'react' 2 | import { 3 | Canvas, 4 | useFrame, 5 | useThree, 6 | extend, 7 | Object3DNode, 8 | } from '@react-three/fiber' 9 | import { OrbitControls } from '@react-three/drei' 10 | import { WebGPURenderer, MeshStandardNodeMaterial } from 'three/webgpu' 11 | import { uniform } from 'three/tsl' 12 | import { Color, type Mesh } from 'three' 13 | 14 | extend({ MeshStandardNodeMaterial }) 15 | 16 | const red = new Color('red') 17 | const blue = new Color('blue') 18 | 19 | declare module '@react-three/fiber' { 20 | interface ThreeElements { 21 | meshStandardNodeMaterial: Object3DNode< 22 | MeshStandardNodeMaterial, 23 | typeof MeshStandardNodeMaterial 24 | > 25 | } 26 | } 27 | 28 | function Box(props: any) { 29 | const meshRef = useRef(null!) 30 | const [hovered, setHover] = useState(false) 31 | const [active, setActive] = useState(false) 32 | const { gl } = useThree() 33 | 34 | useFrame((_, delta) => (meshRef.current.rotation.x += delta)) 35 | 36 | // @ts-expect-error 37 | console.log(gl.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend') 38 | 39 | const uColor = useMemo(() => uniform(blue), []) 40 | 41 | uColor.value = hovered ? red : blue 42 | 43 | return ( 44 | setActive(!active)} 49 | onPointerOver={() => setHover(true)} 50 | onPointerOut={() => setHover(false)} 51 | > 52 | 53 | 54 | 55 | ) 56 | } 57 | 58 | export default function App() { 59 | const [frameloop, setFrameloop] = useState<'never' | 'always'>('never') 60 | 61 | return ( 62 | { 66 | const renderer = new WebGPURenderer({ 67 | // @ts-expect-error 68 | canvas, 69 | powerPreference: 'high-performance', 70 | antialias: true, 71 | alpha: true, 72 | }) 73 | renderer.init().then(() => setFrameloop('always')) 74 | return renderer 75 | }} 76 | > 77 | 78 | 79 | 86 | 87 | 88 | 89 | 90 | ) 91 | } 92 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import App from './App.tsx' 4 | 5 | createRoot(document.getElementById('root')!).render( 6 | 7 | 8 | 9 | ) 10 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2020", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "Bundler", 12 | "allowImportingTsExtensions": true, 13 | "isolatedModules": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | "jsx": "react-jsx", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "noUncheckedSideEffectImports": true 24 | }, 25 | "include": ["src"] 26 | } 27 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "Bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f8-react18/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react-swc' 3 | 4 | export default defineConfig({ 5 | plugins: [react()], 6 | // Those are needed when importing modules with top-level 7 | // await such as three/examples/jsm/capabilities/WebGPU 8 | // optimizeDeps: { esbuildOptions: { target: 'esnext' } }, 9 | // build: { target: 'esnext' }, 10 | }) 11 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist 7 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 4173 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "start": "tsc -b && vite build && vite preview --host", 7 | "docker": "docker build -t vite-ts-swc-r3f9-react19 . && docker run -p 4173:4173 vite-ts-swc-r3f9-react19" 8 | }, 9 | "dependencies": { 10 | "@react-three/drei": "10.0.0", 11 | "@react-three/fiber": "9.0.0", 12 | "react": "19.0.0", 13 | "react-dom": "19.0.0", 14 | "three": "0.173.0" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "9.13.0", 18 | "@types/react": "18.3.12", 19 | "@types/react-dom": "18.3.1", 20 | "@types/three": "0.173.0", 21 | "@vitejs/plugin-react-swc": "3.5.0", 22 | "eslint": "9.13.0", 23 | "eslint-plugin-react-hooks": "5.0.0", 24 | "eslint-plugin-react-refresh": "0.4.14", 25 | "globals": "15.11.0", 26 | "typescript": "~5.6.2", 27 | "typescript-eslint": "8.11.0", 28 | "vite": "5.4.10" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useMemo, useRef, useState } from 'react' 2 | import { Canvas, useFrame, useThree } from '@react-three/fiber' 3 | import { OrbitControls } from '@react-three/drei' 4 | import { WebGPURenderer } from 'three/webgpu' 5 | import { uniform } from 'three/tsl' 6 | import { Color, type Mesh } from 'three' 7 | 8 | const red = new Color('red') 9 | const blue = new Color('blue') 10 | 11 | function Box(props: any) { 12 | const meshRef = useRef(null!) 13 | const [hovered, setHover] = useState(false) 14 | const [active, setActive] = useState(false) 15 | const { gl } = useThree() 16 | 17 | useFrame((_, delta) => (meshRef.current.rotation.x += delta)) 18 | 19 | // @ts-expect-error 20 | console.log(gl.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend') 21 | 22 | const uColor = useMemo(() => uniform(blue), []) 23 | 24 | uColor.value = hovered ? red : blue 25 | 26 | return ( 27 | setActive(!active)} 32 | onPointerOver={() => setHover(true)} 33 | onPointerOut={() => setHover(false)} 34 | > 35 | 36 | 37 | 38 | ) 39 | } 40 | 41 | export default function App() { 42 | return ( 43 | { 46 | // @ts-expect-error 47 | const renderer = new WebGPURenderer(glProps) 48 | await renderer.init() 49 | return renderer 50 | }} 51 | > 52 | 53 | 54 | 61 | 62 | 63 | 64 | 65 | ) 66 | } 67 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/src/extend.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three/webgpu' 2 | import { extend, type ThreeToJSXElements } from '@react-three/fiber' 3 | 4 | declare module '@react-three/fiber' { 5 | interface ThreeElements extends ThreeToJSXElements {} 6 | } 7 | 8 | extend(THREE as any) 9 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import App from './App.tsx' 4 | import './extend' 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | 10 | ) 11 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2020", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "Bundler", 12 | "allowImportingTsExtensions": true, 13 | "isolatedModules": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | "jsx": "react-jsx", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "noUncheckedSideEffectImports": true 24 | }, 25 | "include": ["src"] 26 | } 27 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "Bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /vite-ts-swc-r3f9-react19/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react-swc' 3 | 4 | export default defineConfig({ 5 | plugins: [react()], 6 | // Those are needed when importing modules with top-level 7 | // await such as three/examples/jsm/capabilities/WebGPU 8 | // optimizeDeps: { esbuildOptions: { target: 'esnext' } }, 9 | // build: { target: 'esnext' }, 10 | }) 11 | -------------------------------------------------------------------------------- /vite-ts-threlte8/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /vite-ts-threlte8/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 4173 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /vite-ts-threlte8/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Svelte + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /vite-ts-threlte8/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "start": "vite build && vite preview --host", 7 | "docker": "docker build -t vite-ts-threlte8 . && docker run -p 4173:4173 vite-ts-threlte8" 8 | }, 9 | "dependencies": { 10 | "@threlte/core": "8.0.0-next.31", 11 | "@threlte/extras": "9.0.0-next.42", 12 | "three": "0.173.0" 13 | }, 14 | "devDependencies": { 15 | "@sveltejs/vite-plugin-svelte": "5.0.0", 16 | "@tsconfig/svelte": "5.0.4", 17 | "svelte": "5.2.7", 18 | "svelte-check": "4.1.0", 19 | "tslib": "2.8.1", 20 | "typescript": "~5.6.2", 21 | "vite": "6.0.1" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /vite-ts-threlte8/src/App.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
10 | 12 | new WebGPURenderer({ 13 | canvas, 14 | antialias: true, 15 | alpha: true, 16 | powerPreference: 'high-performance', 17 | })} 18 | > 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 43 | -------------------------------------------------------------------------------- /vite-ts-threlte8/src/BackendLogger.svelte: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /vite-ts-threlte8/src/main.ts: -------------------------------------------------------------------------------- 1 | import { mount } from 'svelte' 2 | import App from './App.svelte' 3 | 4 | const app = mount(App, { target: document.getElementById('app')! }) 5 | 6 | export default app 7 | -------------------------------------------------------------------------------- /vite-ts-threlte8/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /vite-ts-threlte8/svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 2 | 3 | export default { 4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 5 | // for more information about preprocessors 6 | preprocess: vitePreprocess(), 7 | } 8 | -------------------------------------------------------------------------------- /vite-ts-threlte8/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "useDefineForClassFields": true, 6 | "module": "ESNext", 7 | "resolveJsonModule": true, 8 | /** 9 | * Typecheck JS in `.svelte` and `.js` files by default. 10 | * Disable checkJs if you'd like to use dynamic types in JS. 11 | * Note that setting allowJs false does not prevent the use 12 | * of JS in `.svelte` files. 13 | */ 14 | "allowJs": true, 15 | "checkJs": true, 16 | "isolatedModules": true, 17 | "moduleDetection": "force" 18 | }, 19 | "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /vite-ts-threlte8/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 5 | "skipLibCheck": true, 6 | "module": "ESNext", 7 | "moduleResolution": "bundler", 8 | "strict": true, 9 | "noEmit": true, 10 | "noUncheckedSideEffectImports": true 11 | }, 12 | "include": ["vite.config.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /vite-ts-threlte8/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { svelte } from '@sveltejs/vite-plugin-svelte' 3 | 4 | export default defineConfig({ 5 | plugins: [svelte()], 6 | // Those are needed when importing modules with top-level 7 | // await such as three/examples/jsm/capabilities/WebGPU 8 | // optimizeDeps: { esbuildOptions: { target: 'esnext' } }, 9 | // build: { target: 'esnext' }, 10 | }) 11 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist 7 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 4173 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 | 11 |
12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/main.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three' 2 | import { WebGPURenderer } from 'three/webgpu' 3 | 4 | const width = window.innerWidth 5 | const height = window.innerHeight 6 | 7 | const camera = new THREE.PerspectiveCamera(70, width / height, 0.01, 10) 8 | camera.position.z = 1 9 | 10 | const scene = new THREE.Scene() 11 | 12 | const geometry = new THREE.BufferGeometry() 13 | 14 | const vertices = new Float32Array([ 15 | -0.1, -0.1, 0.1, 0.1, -0.1, 0.1, 0.1, 0.1, 0.1, -0.1, 0.1, 0.1, -0.1, -0.1, 16 | -0.1, 0.1, -0.1, -0.1, 0.1, 0.1, -0.1, -0.1, 0.1, -0.1, 17 | ]) 18 | 19 | const colors = new Float32Array([ 20 | 1, 0, 0, 0.5, 1, 0, 0, 0.5, 1, 0, 0, 0.5, 1, 0, 0, 0.5, 0, 1, 0, 0.5, 0, 1, 0, 21 | 0.5, 0, 1, 0, 0.5, 0, 1, 0, 0.5, 22 | ]) 23 | 24 | const indices = new Uint16Array([ 25 | 0, 1, 2, 0, 2, 3, 1, 5, 6, 1, 6, 2, 5, 4, 7, 5, 7, 6, 4, 0, 3, 4, 3, 7, 3, 2, 26 | 6, 3, 6, 7, 4, 5, 1, 4, 1, 0, 27 | ]) 28 | 29 | geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)) 30 | geometry.setAttribute('color', new THREE.BufferAttribute(colors, 4)) // Using 4 components for RGBA 31 | geometry.setIndex(new THREE.BufferAttribute(indices, 1)) 32 | 33 | const material = new THREE.MeshLambertMaterial({ 34 | vertexColors: true, 35 | transparent: true, 36 | depthWrite: false, 37 | side: THREE.DoubleSide, 38 | }) 39 | 40 | const mesh = new THREE.Mesh(geometry, material) 41 | scene.add(mesh) 42 | 43 | // Doesn't work with WebGPURenderer: 44 | const renderer = new WebGPURenderer({ antialias: true }) 45 | await renderer.init() 46 | 47 | // Works with WebGLRenderer: 48 | // const renderer = new THREE.WebGLRenderer({ antialias: true }) 49 | // renderer.setClearColor(0xffffff) 50 | 51 | renderer.setSize(width, height) 52 | renderer.setAnimationLoop(animate) 53 | document.body.appendChild(renderer.domElement) 54 | 55 | const ambientLight = new THREE.AmbientLight(0xffffff, 10) 56 | scene.add(ambientLight) 57 | 58 | function animate(time) { 59 | mesh.rotation.x = time / 2000 60 | mesh.rotation.y = time / 1000 61 | 62 | renderer.render(scene, camera) 63 | } 64 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-vanilla-js", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vite-vanilla-js", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "three": "0.175.0" 12 | }, 13 | "devDependencies": { 14 | "vite": "5.4.10" 15 | } 16 | }, 17 | "node_modules/@esbuild/aix-ppc64": { 18 | "version": "0.21.5", 19 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 20 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 21 | "cpu": [ 22 | "ppc64" 23 | ], 24 | "dev": true, 25 | "license": "MIT", 26 | "optional": true, 27 | "os": [ 28 | "aix" 29 | ], 30 | "engines": { 31 | "node": ">=12" 32 | } 33 | }, 34 | "node_modules/@esbuild/android-arm": { 35 | "version": "0.21.5", 36 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 37 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 38 | "cpu": [ 39 | "arm" 40 | ], 41 | "dev": true, 42 | "license": "MIT", 43 | "optional": true, 44 | "os": [ 45 | "android" 46 | ], 47 | "engines": { 48 | "node": ">=12" 49 | } 50 | }, 51 | "node_modules/@esbuild/android-arm64": { 52 | "version": "0.21.5", 53 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 54 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 55 | "cpu": [ 56 | "arm64" 57 | ], 58 | "dev": true, 59 | "license": "MIT", 60 | "optional": true, 61 | "os": [ 62 | "android" 63 | ], 64 | "engines": { 65 | "node": ">=12" 66 | } 67 | }, 68 | "node_modules/@esbuild/android-x64": { 69 | "version": "0.21.5", 70 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 71 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 72 | "cpu": [ 73 | "x64" 74 | ], 75 | "dev": true, 76 | "license": "MIT", 77 | "optional": true, 78 | "os": [ 79 | "android" 80 | ], 81 | "engines": { 82 | "node": ">=12" 83 | } 84 | }, 85 | "node_modules/@esbuild/darwin-arm64": { 86 | "version": "0.21.5", 87 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 88 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 89 | "cpu": [ 90 | "arm64" 91 | ], 92 | "dev": true, 93 | "license": "MIT", 94 | "optional": true, 95 | "os": [ 96 | "darwin" 97 | ], 98 | "engines": { 99 | "node": ">=12" 100 | } 101 | }, 102 | "node_modules/@esbuild/darwin-x64": { 103 | "version": "0.21.5", 104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 105 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 106 | "cpu": [ 107 | "x64" 108 | ], 109 | "dev": true, 110 | "license": "MIT", 111 | "optional": true, 112 | "os": [ 113 | "darwin" 114 | ], 115 | "engines": { 116 | "node": ">=12" 117 | } 118 | }, 119 | "node_modules/@esbuild/freebsd-arm64": { 120 | "version": "0.21.5", 121 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 122 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 123 | "cpu": [ 124 | "arm64" 125 | ], 126 | "dev": true, 127 | "license": "MIT", 128 | "optional": true, 129 | "os": [ 130 | "freebsd" 131 | ], 132 | "engines": { 133 | "node": ">=12" 134 | } 135 | }, 136 | "node_modules/@esbuild/freebsd-x64": { 137 | "version": "0.21.5", 138 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 139 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 140 | "cpu": [ 141 | "x64" 142 | ], 143 | "dev": true, 144 | "license": "MIT", 145 | "optional": true, 146 | "os": [ 147 | "freebsd" 148 | ], 149 | "engines": { 150 | "node": ">=12" 151 | } 152 | }, 153 | "node_modules/@esbuild/linux-arm": { 154 | "version": "0.21.5", 155 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 156 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 157 | "cpu": [ 158 | "arm" 159 | ], 160 | "dev": true, 161 | "license": "MIT", 162 | "optional": true, 163 | "os": [ 164 | "linux" 165 | ], 166 | "engines": { 167 | "node": ">=12" 168 | } 169 | }, 170 | "node_modules/@esbuild/linux-arm64": { 171 | "version": "0.21.5", 172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 173 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 174 | "cpu": [ 175 | "arm64" 176 | ], 177 | "dev": true, 178 | "license": "MIT", 179 | "optional": true, 180 | "os": [ 181 | "linux" 182 | ], 183 | "engines": { 184 | "node": ">=12" 185 | } 186 | }, 187 | "node_modules/@esbuild/linux-ia32": { 188 | "version": "0.21.5", 189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 190 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 191 | "cpu": [ 192 | "ia32" 193 | ], 194 | "dev": true, 195 | "license": "MIT", 196 | "optional": true, 197 | "os": [ 198 | "linux" 199 | ], 200 | "engines": { 201 | "node": ">=12" 202 | } 203 | }, 204 | "node_modules/@esbuild/linux-loong64": { 205 | "version": "0.21.5", 206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 207 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 208 | "cpu": [ 209 | "loong64" 210 | ], 211 | "dev": true, 212 | "license": "MIT", 213 | "optional": true, 214 | "os": [ 215 | "linux" 216 | ], 217 | "engines": { 218 | "node": ">=12" 219 | } 220 | }, 221 | "node_modules/@esbuild/linux-mips64el": { 222 | "version": "0.21.5", 223 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 224 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 225 | "cpu": [ 226 | "mips64el" 227 | ], 228 | "dev": true, 229 | "license": "MIT", 230 | "optional": true, 231 | "os": [ 232 | "linux" 233 | ], 234 | "engines": { 235 | "node": ">=12" 236 | } 237 | }, 238 | "node_modules/@esbuild/linux-ppc64": { 239 | "version": "0.21.5", 240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 241 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 242 | "cpu": [ 243 | "ppc64" 244 | ], 245 | "dev": true, 246 | "license": "MIT", 247 | "optional": true, 248 | "os": [ 249 | "linux" 250 | ], 251 | "engines": { 252 | "node": ">=12" 253 | } 254 | }, 255 | "node_modules/@esbuild/linux-riscv64": { 256 | "version": "0.21.5", 257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 258 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 259 | "cpu": [ 260 | "riscv64" 261 | ], 262 | "dev": true, 263 | "license": "MIT", 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=12" 270 | } 271 | }, 272 | "node_modules/@esbuild/linux-s390x": { 273 | "version": "0.21.5", 274 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 275 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 276 | "cpu": [ 277 | "s390x" 278 | ], 279 | "dev": true, 280 | "license": "MIT", 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/linux-x64": { 290 | "version": "0.21.5", 291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 292 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 293 | "cpu": [ 294 | "x64" 295 | ], 296 | "dev": true, 297 | "license": "MIT", 298 | "optional": true, 299 | "os": [ 300 | "linux" 301 | ], 302 | "engines": { 303 | "node": ">=12" 304 | } 305 | }, 306 | "node_modules/@esbuild/netbsd-x64": { 307 | "version": "0.21.5", 308 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 309 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 310 | "cpu": [ 311 | "x64" 312 | ], 313 | "dev": true, 314 | "license": "MIT", 315 | "optional": true, 316 | "os": [ 317 | "netbsd" 318 | ], 319 | "engines": { 320 | "node": ">=12" 321 | } 322 | }, 323 | "node_modules/@esbuild/openbsd-x64": { 324 | "version": "0.21.5", 325 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 326 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 327 | "cpu": [ 328 | "x64" 329 | ], 330 | "dev": true, 331 | "license": "MIT", 332 | "optional": true, 333 | "os": [ 334 | "openbsd" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/@esbuild/sunos-x64": { 341 | "version": "0.21.5", 342 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 343 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 344 | "cpu": [ 345 | "x64" 346 | ], 347 | "dev": true, 348 | "license": "MIT", 349 | "optional": true, 350 | "os": [ 351 | "sunos" 352 | ], 353 | "engines": { 354 | "node": ">=12" 355 | } 356 | }, 357 | "node_modules/@esbuild/win32-arm64": { 358 | "version": "0.21.5", 359 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 360 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 361 | "cpu": [ 362 | "arm64" 363 | ], 364 | "dev": true, 365 | "license": "MIT", 366 | "optional": true, 367 | "os": [ 368 | "win32" 369 | ], 370 | "engines": { 371 | "node": ">=12" 372 | } 373 | }, 374 | "node_modules/@esbuild/win32-ia32": { 375 | "version": "0.21.5", 376 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 377 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 378 | "cpu": [ 379 | "ia32" 380 | ], 381 | "dev": true, 382 | "license": "MIT", 383 | "optional": true, 384 | "os": [ 385 | "win32" 386 | ], 387 | "engines": { 388 | "node": ">=12" 389 | } 390 | }, 391 | "node_modules/@esbuild/win32-x64": { 392 | "version": "0.21.5", 393 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 394 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 395 | "cpu": [ 396 | "x64" 397 | ], 398 | "dev": true, 399 | "license": "MIT", 400 | "optional": true, 401 | "os": [ 402 | "win32" 403 | ], 404 | "engines": { 405 | "node": ">=12" 406 | } 407 | }, 408 | "node_modules/@rollup/rollup-android-arm-eabi": { 409 | "version": "4.27.4", 410 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", 411 | "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", 412 | "cpu": [ 413 | "arm" 414 | ], 415 | "dev": true, 416 | "license": "MIT", 417 | "optional": true, 418 | "os": [ 419 | "android" 420 | ] 421 | }, 422 | "node_modules/@rollup/rollup-android-arm64": { 423 | "version": "4.27.4", 424 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", 425 | "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", 426 | "cpu": [ 427 | "arm64" 428 | ], 429 | "dev": true, 430 | "license": "MIT", 431 | "optional": true, 432 | "os": [ 433 | "android" 434 | ] 435 | }, 436 | "node_modules/@rollup/rollup-darwin-arm64": { 437 | "version": "4.27.4", 438 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", 439 | "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", 440 | "cpu": [ 441 | "arm64" 442 | ], 443 | "dev": true, 444 | "license": "MIT", 445 | "optional": true, 446 | "os": [ 447 | "darwin" 448 | ] 449 | }, 450 | "node_modules/@rollup/rollup-darwin-x64": { 451 | "version": "4.27.4", 452 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", 453 | "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", 454 | "cpu": [ 455 | "x64" 456 | ], 457 | "dev": true, 458 | "license": "MIT", 459 | "optional": true, 460 | "os": [ 461 | "darwin" 462 | ] 463 | }, 464 | "node_modules/@rollup/rollup-freebsd-arm64": { 465 | "version": "4.27.4", 466 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", 467 | "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", 468 | "cpu": [ 469 | "arm64" 470 | ], 471 | "dev": true, 472 | "license": "MIT", 473 | "optional": true, 474 | "os": [ 475 | "freebsd" 476 | ] 477 | }, 478 | "node_modules/@rollup/rollup-freebsd-x64": { 479 | "version": "4.27.4", 480 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", 481 | "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", 482 | "cpu": [ 483 | "x64" 484 | ], 485 | "dev": true, 486 | "license": "MIT", 487 | "optional": true, 488 | "os": [ 489 | "freebsd" 490 | ] 491 | }, 492 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 493 | "version": "4.27.4", 494 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", 495 | "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", 496 | "cpu": [ 497 | "arm" 498 | ], 499 | "dev": true, 500 | "license": "MIT", 501 | "optional": true, 502 | "os": [ 503 | "linux" 504 | ] 505 | }, 506 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 507 | "version": "4.27.4", 508 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", 509 | "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", 510 | "cpu": [ 511 | "arm" 512 | ], 513 | "dev": true, 514 | "license": "MIT", 515 | "optional": true, 516 | "os": [ 517 | "linux" 518 | ] 519 | }, 520 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 521 | "version": "4.27.4", 522 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", 523 | "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", 524 | "cpu": [ 525 | "arm64" 526 | ], 527 | "dev": true, 528 | "license": "MIT", 529 | "optional": true, 530 | "os": [ 531 | "linux" 532 | ] 533 | }, 534 | "node_modules/@rollup/rollup-linux-arm64-musl": { 535 | "version": "4.27.4", 536 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", 537 | "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", 538 | "cpu": [ 539 | "arm64" 540 | ], 541 | "dev": true, 542 | "license": "MIT", 543 | "optional": true, 544 | "os": [ 545 | "linux" 546 | ] 547 | }, 548 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 549 | "version": "4.27.4", 550 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", 551 | "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", 552 | "cpu": [ 553 | "ppc64" 554 | ], 555 | "dev": true, 556 | "license": "MIT", 557 | "optional": true, 558 | "os": [ 559 | "linux" 560 | ] 561 | }, 562 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 563 | "version": "4.27.4", 564 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", 565 | "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", 566 | "cpu": [ 567 | "riscv64" 568 | ], 569 | "dev": true, 570 | "license": "MIT", 571 | "optional": true, 572 | "os": [ 573 | "linux" 574 | ] 575 | }, 576 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 577 | "version": "4.27.4", 578 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", 579 | "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", 580 | "cpu": [ 581 | "s390x" 582 | ], 583 | "dev": true, 584 | "license": "MIT", 585 | "optional": true, 586 | "os": [ 587 | "linux" 588 | ] 589 | }, 590 | "node_modules/@rollup/rollup-linux-x64-gnu": { 591 | "version": "4.27.4", 592 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", 593 | "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", 594 | "cpu": [ 595 | "x64" 596 | ], 597 | "dev": true, 598 | "license": "MIT", 599 | "optional": true, 600 | "os": [ 601 | "linux" 602 | ] 603 | }, 604 | "node_modules/@rollup/rollup-linux-x64-musl": { 605 | "version": "4.27.4", 606 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", 607 | "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", 608 | "cpu": [ 609 | "x64" 610 | ], 611 | "dev": true, 612 | "license": "MIT", 613 | "optional": true, 614 | "os": [ 615 | "linux" 616 | ] 617 | }, 618 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 619 | "version": "4.27.4", 620 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", 621 | "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", 622 | "cpu": [ 623 | "arm64" 624 | ], 625 | "dev": true, 626 | "license": "MIT", 627 | "optional": true, 628 | "os": [ 629 | "win32" 630 | ] 631 | }, 632 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 633 | "version": "4.27.4", 634 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", 635 | "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", 636 | "cpu": [ 637 | "ia32" 638 | ], 639 | "dev": true, 640 | "license": "MIT", 641 | "optional": true, 642 | "os": [ 643 | "win32" 644 | ] 645 | }, 646 | "node_modules/@rollup/rollup-win32-x64-msvc": { 647 | "version": "4.27.4", 648 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", 649 | "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", 650 | "cpu": [ 651 | "x64" 652 | ], 653 | "dev": true, 654 | "license": "MIT", 655 | "optional": true, 656 | "os": [ 657 | "win32" 658 | ] 659 | }, 660 | "node_modules/@types/estree": { 661 | "version": "1.0.6", 662 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 663 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 664 | "dev": true, 665 | "license": "MIT" 666 | }, 667 | "node_modules/esbuild": { 668 | "version": "0.21.5", 669 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 670 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 671 | "dev": true, 672 | "hasInstallScript": true, 673 | "license": "MIT", 674 | "bin": { 675 | "esbuild": "bin/esbuild" 676 | }, 677 | "engines": { 678 | "node": ">=12" 679 | }, 680 | "optionalDependencies": { 681 | "@esbuild/aix-ppc64": "0.21.5", 682 | "@esbuild/android-arm": "0.21.5", 683 | "@esbuild/android-arm64": "0.21.5", 684 | "@esbuild/android-x64": "0.21.5", 685 | "@esbuild/darwin-arm64": "0.21.5", 686 | "@esbuild/darwin-x64": "0.21.5", 687 | "@esbuild/freebsd-arm64": "0.21.5", 688 | "@esbuild/freebsd-x64": "0.21.5", 689 | "@esbuild/linux-arm": "0.21.5", 690 | "@esbuild/linux-arm64": "0.21.5", 691 | "@esbuild/linux-ia32": "0.21.5", 692 | "@esbuild/linux-loong64": "0.21.5", 693 | "@esbuild/linux-mips64el": "0.21.5", 694 | "@esbuild/linux-ppc64": "0.21.5", 695 | "@esbuild/linux-riscv64": "0.21.5", 696 | "@esbuild/linux-s390x": "0.21.5", 697 | "@esbuild/linux-x64": "0.21.5", 698 | "@esbuild/netbsd-x64": "0.21.5", 699 | "@esbuild/openbsd-x64": "0.21.5", 700 | "@esbuild/sunos-x64": "0.21.5", 701 | "@esbuild/win32-arm64": "0.21.5", 702 | "@esbuild/win32-ia32": "0.21.5", 703 | "@esbuild/win32-x64": "0.21.5" 704 | } 705 | }, 706 | "node_modules/fsevents": { 707 | "version": "2.3.3", 708 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 709 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 710 | "dev": true, 711 | "hasInstallScript": true, 712 | "license": "MIT", 713 | "optional": true, 714 | "os": [ 715 | "darwin" 716 | ], 717 | "engines": { 718 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 719 | } 720 | }, 721 | "node_modules/nanoid": { 722 | "version": "3.3.8", 723 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 724 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 725 | "dev": true, 726 | "funding": [ 727 | { 728 | "type": "github", 729 | "url": "https://github.com/sponsors/ai" 730 | } 731 | ], 732 | "license": "MIT", 733 | "bin": { 734 | "nanoid": "bin/nanoid.cjs" 735 | }, 736 | "engines": { 737 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 738 | } 739 | }, 740 | "node_modules/picocolors": { 741 | "version": "1.1.1", 742 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 743 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 744 | "dev": true, 745 | "license": "ISC" 746 | }, 747 | "node_modules/postcss": { 748 | "version": "8.4.49", 749 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", 750 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", 751 | "dev": true, 752 | "funding": [ 753 | { 754 | "type": "opencollective", 755 | "url": "https://opencollective.com/postcss/" 756 | }, 757 | { 758 | "type": "tidelift", 759 | "url": "https://tidelift.com/funding/github/npm/postcss" 760 | }, 761 | { 762 | "type": "github", 763 | "url": "https://github.com/sponsors/ai" 764 | } 765 | ], 766 | "license": "MIT", 767 | "dependencies": { 768 | "nanoid": "^3.3.7", 769 | "picocolors": "^1.1.1", 770 | "source-map-js": "^1.2.1" 771 | }, 772 | "engines": { 773 | "node": "^10 || ^12 || >=14" 774 | } 775 | }, 776 | "node_modules/rollup": { 777 | "version": "4.27.4", 778 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", 779 | "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", 780 | "dev": true, 781 | "license": "MIT", 782 | "dependencies": { 783 | "@types/estree": "1.0.6" 784 | }, 785 | "bin": { 786 | "rollup": "dist/bin/rollup" 787 | }, 788 | "engines": { 789 | "node": ">=18.0.0", 790 | "npm": ">=8.0.0" 791 | }, 792 | "optionalDependencies": { 793 | "@rollup/rollup-android-arm-eabi": "4.27.4", 794 | "@rollup/rollup-android-arm64": "4.27.4", 795 | "@rollup/rollup-darwin-arm64": "4.27.4", 796 | "@rollup/rollup-darwin-x64": "4.27.4", 797 | "@rollup/rollup-freebsd-arm64": "4.27.4", 798 | "@rollup/rollup-freebsd-x64": "4.27.4", 799 | "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", 800 | "@rollup/rollup-linux-arm-musleabihf": "4.27.4", 801 | "@rollup/rollup-linux-arm64-gnu": "4.27.4", 802 | "@rollup/rollup-linux-arm64-musl": "4.27.4", 803 | "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", 804 | "@rollup/rollup-linux-riscv64-gnu": "4.27.4", 805 | "@rollup/rollup-linux-s390x-gnu": "4.27.4", 806 | "@rollup/rollup-linux-x64-gnu": "4.27.4", 807 | "@rollup/rollup-linux-x64-musl": "4.27.4", 808 | "@rollup/rollup-win32-arm64-msvc": "4.27.4", 809 | "@rollup/rollup-win32-ia32-msvc": "4.27.4", 810 | "@rollup/rollup-win32-x64-msvc": "4.27.4", 811 | "fsevents": "~2.3.2" 812 | } 813 | }, 814 | "node_modules/source-map-js": { 815 | "version": "1.2.1", 816 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 817 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 818 | "dev": true, 819 | "license": "BSD-3-Clause", 820 | "engines": { 821 | "node": ">=0.10.0" 822 | } 823 | }, 824 | "node_modules/three": { 825 | "version": "0.175.0", 826 | "resolved": "https://registry.npmjs.org/three/-/three-0.175.0.tgz", 827 | "integrity": "sha512-nNE3pnTHxXN/Phw768u0Grr7W4+rumGg/H6PgeseNJojkJtmeHJfZWi41Gp2mpXl1pg1pf1zjwR4McM1jTqkpg==", 828 | "license": "MIT" 829 | }, 830 | "node_modules/vite": { 831 | "version": "5.4.10", 832 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", 833 | "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", 834 | "dev": true, 835 | "license": "MIT", 836 | "dependencies": { 837 | "esbuild": "^0.21.3", 838 | "postcss": "^8.4.43", 839 | "rollup": "^4.20.0" 840 | }, 841 | "bin": { 842 | "vite": "bin/vite.js" 843 | }, 844 | "engines": { 845 | "node": "^18.0.0 || >=20.0.0" 846 | }, 847 | "funding": { 848 | "url": "https://github.com/vitejs/vite?sponsor=1" 849 | }, 850 | "optionalDependencies": { 851 | "fsevents": "~2.3.3" 852 | }, 853 | "peerDependencies": { 854 | "@types/node": "^18.0.0 || >=20.0.0", 855 | "less": "*", 856 | "lightningcss": "^1.21.0", 857 | "sass": "*", 858 | "sass-embedded": "*", 859 | "stylus": "*", 860 | "sugarss": "*", 861 | "terser": "^5.4.0" 862 | }, 863 | "peerDependenciesMeta": { 864 | "@types/node": { 865 | "optional": true 866 | }, 867 | "less": { 868 | "optional": true 869 | }, 870 | "lightningcss": { 871 | "optional": true 872 | }, 873 | "sass": { 874 | "optional": true 875 | }, 876 | "sass-embedded": { 877 | "optional": true 878 | }, 879 | "stylus": { 880 | "optional": true 881 | }, 882 | "sugarss": { 883 | "optional": true 884 | }, 885 | "terser": { 886 | "optional": true 887 | } 888 | } 889 | } 890 | } 891 | } 892 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-vanilla-js", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "start": "vite build && vite preview --host", 9 | "docker": "docker build -t vite-vanilla-js . && docker run -p 4173:4173 vite-vanilla-js" 10 | }, 11 | "dependencies": { 12 | "three": "0.175.0" 13 | }, 14 | "devDependencies": { 15 | "vite": "5.4.10" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /vite-vanilla-js-vertex-alpha/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | 3 | export default defineConfig({ 4 | // You might not need those. They are needed when importing modules with 5 | // top-level await such as three/examples/jsm/capabilities/WebGPU, 6 | // or if you use top-level await in your own code (which is the case here, 7 | // because we await renderer.init() in main.js). 8 | optimizeDeps: { esbuildOptions: { target: 'esnext' } }, 9 | build: { target: 'esnext' }, 10 | }) 11 | -------------------------------------------------------------------------------- /vite-vanilla-js/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | .next 4 | .dockerignore 5 | Dockerfile 6 | dist 7 | -------------------------------------------------------------------------------- /vite-vanilla-js/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /vite-vanilla-js/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.18.1-alpine3.19 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json . 6 | 7 | RUN npm install 8 | 9 | COPY . . 10 | 11 | EXPOSE 4173 12 | 13 | CMD ["npm", "start"] 14 | -------------------------------------------------------------------------------- /vite-vanilla-js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 | 11 |
12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /vite-vanilla-js/main.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three' 2 | import { WebGPURenderer } from 'three/webgpu' 3 | import { mix, vec3, uv } from 'three/tsl' 4 | import { MeshBasicNodeMaterial } from 'three/webgpu' 5 | 6 | const red = vec3(1, 0, 0) 7 | const green = vec3(0, 1, 0) 8 | const checkerboard = uv().mul(8).floor().dot(1).mod(2) 9 | const colorNode = mix(red, green, checkerboard) 10 | 11 | const width = window.innerWidth 12 | const height = window.innerHeight 13 | 14 | const camera = new THREE.PerspectiveCamera(70, width / height, 0.01, 10) 15 | camera.position.z = 1 16 | 17 | const scene = new THREE.Scene() 18 | 19 | const geometry = new THREE.BoxGeometry(0.2, 0.2, 0.2) 20 | const material = new MeshBasicNodeMaterial() 21 | material.colorNode = colorNode 22 | 23 | const mesh = new THREE.Mesh(geometry, material) 24 | scene.add(mesh) 25 | 26 | const renderer = new WebGPURenderer({ antialias: true }) 27 | await renderer.init() 28 | renderer.setSize(width, height) 29 | renderer.setAnimationLoop(animate) 30 | document.body.appendChild(renderer.domElement) 31 | 32 | console.log( 33 | renderer.backend.isWebGPUBackend ? 'WebGPU Backend' : 'WebGL Backend' 34 | ) 35 | 36 | function animate(time) { 37 | mesh.rotation.x = time / 2000 38 | mesh.rotation.y = time / 1000 39 | 40 | renderer.render(scene, camera) 41 | } 42 | -------------------------------------------------------------------------------- /vite-vanilla-js/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-vanilla-js", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vite-vanilla-js", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "three": "0.173.0" 12 | }, 13 | "devDependencies": { 14 | "vite": "5.4.10" 15 | } 16 | }, 17 | "node_modules/@esbuild/aix-ppc64": { 18 | "version": "0.21.5", 19 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 20 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 21 | "cpu": [ 22 | "ppc64" 23 | ], 24 | "dev": true, 25 | "license": "MIT", 26 | "optional": true, 27 | "os": [ 28 | "aix" 29 | ], 30 | "engines": { 31 | "node": ">=12" 32 | } 33 | }, 34 | "node_modules/@esbuild/android-arm": { 35 | "version": "0.21.5", 36 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 37 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 38 | "cpu": [ 39 | "arm" 40 | ], 41 | "dev": true, 42 | "license": "MIT", 43 | "optional": true, 44 | "os": [ 45 | "android" 46 | ], 47 | "engines": { 48 | "node": ">=12" 49 | } 50 | }, 51 | "node_modules/@esbuild/android-arm64": { 52 | "version": "0.21.5", 53 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 54 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 55 | "cpu": [ 56 | "arm64" 57 | ], 58 | "dev": true, 59 | "license": "MIT", 60 | "optional": true, 61 | "os": [ 62 | "android" 63 | ], 64 | "engines": { 65 | "node": ">=12" 66 | } 67 | }, 68 | "node_modules/@esbuild/android-x64": { 69 | "version": "0.21.5", 70 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 71 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 72 | "cpu": [ 73 | "x64" 74 | ], 75 | "dev": true, 76 | "license": "MIT", 77 | "optional": true, 78 | "os": [ 79 | "android" 80 | ], 81 | "engines": { 82 | "node": ">=12" 83 | } 84 | }, 85 | "node_modules/@esbuild/darwin-arm64": { 86 | "version": "0.21.5", 87 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 88 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 89 | "cpu": [ 90 | "arm64" 91 | ], 92 | "dev": true, 93 | "license": "MIT", 94 | "optional": true, 95 | "os": [ 96 | "darwin" 97 | ], 98 | "engines": { 99 | "node": ">=12" 100 | } 101 | }, 102 | "node_modules/@esbuild/darwin-x64": { 103 | "version": "0.21.5", 104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 105 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 106 | "cpu": [ 107 | "x64" 108 | ], 109 | "dev": true, 110 | "license": "MIT", 111 | "optional": true, 112 | "os": [ 113 | "darwin" 114 | ], 115 | "engines": { 116 | "node": ">=12" 117 | } 118 | }, 119 | "node_modules/@esbuild/freebsd-arm64": { 120 | "version": "0.21.5", 121 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 122 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 123 | "cpu": [ 124 | "arm64" 125 | ], 126 | "dev": true, 127 | "license": "MIT", 128 | "optional": true, 129 | "os": [ 130 | "freebsd" 131 | ], 132 | "engines": { 133 | "node": ">=12" 134 | } 135 | }, 136 | "node_modules/@esbuild/freebsd-x64": { 137 | "version": "0.21.5", 138 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 139 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 140 | "cpu": [ 141 | "x64" 142 | ], 143 | "dev": true, 144 | "license": "MIT", 145 | "optional": true, 146 | "os": [ 147 | "freebsd" 148 | ], 149 | "engines": { 150 | "node": ">=12" 151 | } 152 | }, 153 | "node_modules/@esbuild/linux-arm": { 154 | "version": "0.21.5", 155 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 156 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 157 | "cpu": [ 158 | "arm" 159 | ], 160 | "dev": true, 161 | "license": "MIT", 162 | "optional": true, 163 | "os": [ 164 | "linux" 165 | ], 166 | "engines": { 167 | "node": ">=12" 168 | } 169 | }, 170 | "node_modules/@esbuild/linux-arm64": { 171 | "version": "0.21.5", 172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 173 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 174 | "cpu": [ 175 | "arm64" 176 | ], 177 | "dev": true, 178 | "license": "MIT", 179 | "optional": true, 180 | "os": [ 181 | "linux" 182 | ], 183 | "engines": { 184 | "node": ">=12" 185 | } 186 | }, 187 | "node_modules/@esbuild/linux-ia32": { 188 | "version": "0.21.5", 189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 190 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 191 | "cpu": [ 192 | "ia32" 193 | ], 194 | "dev": true, 195 | "license": "MIT", 196 | "optional": true, 197 | "os": [ 198 | "linux" 199 | ], 200 | "engines": { 201 | "node": ">=12" 202 | } 203 | }, 204 | "node_modules/@esbuild/linux-loong64": { 205 | "version": "0.21.5", 206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 207 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 208 | "cpu": [ 209 | "loong64" 210 | ], 211 | "dev": true, 212 | "license": "MIT", 213 | "optional": true, 214 | "os": [ 215 | "linux" 216 | ], 217 | "engines": { 218 | "node": ">=12" 219 | } 220 | }, 221 | "node_modules/@esbuild/linux-mips64el": { 222 | "version": "0.21.5", 223 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 224 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 225 | "cpu": [ 226 | "mips64el" 227 | ], 228 | "dev": true, 229 | "license": "MIT", 230 | "optional": true, 231 | "os": [ 232 | "linux" 233 | ], 234 | "engines": { 235 | "node": ">=12" 236 | } 237 | }, 238 | "node_modules/@esbuild/linux-ppc64": { 239 | "version": "0.21.5", 240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 241 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 242 | "cpu": [ 243 | "ppc64" 244 | ], 245 | "dev": true, 246 | "license": "MIT", 247 | "optional": true, 248 | "os": [ 249 | "linux" 250 | ], 251 | "engines": { 252 | "node": ">=12" 253 | } 254 | }, 255 | "node_modules/@esbuild/linux-riscv64": { 256 | "version": "0.21.5", 257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 258 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 259 | "cpu": [ 260 | "riscv64" 261 | ], 262 | "dev": true, 263 | "license": "MIT", 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=12" 270 | } 271 | }, 272 | "node_modules/@esbuild/linux-s390x": { 273 | "version": "0.21.5", 274 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 275 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 276 | "cpu": [ 277 | "s390x" 278 | ], 279 | "dev": true, 280 | "license": "MIT", 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/linux-x64": { 290 | "version": "0.21.5", 291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 292 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 293 | "cpu": [ 294 | "x64" 295 | ], 296 | "dev": true, 297 | "license": "MIT", 298 | "optional": true, 299 | "os": [ 300 | "linux" 301 | ], 302 | "engines": { 303 | "node": ">=12" 304 | } 305 | }, 306 | "node_modules/@esbuild/netbsd-x64": { 307 | "version": "0.21.5", 308 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 309 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 310 | "cpu": [ 311 | "x64" 312 | ], 313 | "dev": true, 314 | "license": "MIT", 315 | "optional": true, 316 | "os": [ 317 | "netbsd" 318 | ], 319 | "engines": { 320 | "node": ">=12" 321 | } 322 | }, 323 | "node_modules/@esbuild/openbsd-x64": { 324 | "version": "0.21.5", 325 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 326 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 327 | "cpu": [ 328 | "x64" 329 | ], 330 | "dev": true, 331 | "license": "MIT", 332 | "optional": true, 333 | "os": [ 334 | "openbsd" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/@esbuild/sunos-x64": { 341 | "version": "0.21.5", 342 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 343 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 344 | "cpu": [ 345 | "x64" 346 | ], 347 | "dev": true, 348 | "license": "MIT", 349 | "optional": true, 350 | "os": [ 351 | "sunos" 352 | ], 353 | "engines": { 354 | "node": ">=12" 355 | } 356 | }, 357 | "node_modules/@esbuild/win32-arm64": { 358 | "version": "0.21.5", 359 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 360 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 361 | "cpu": [ 362 | "arm64" 363 | ], 364 | "dev": true, 365 | "license": "MIT", 366 | "optional": true, 367 | "os": [ 368 | "win32" 369 | ], 370 | "engines": { 371 | "node": ">=12" 372 | } 373 | }, 374 | "node_modules/@esbuild/win32-ia32": { 375 | "version": "0.21.5", 376 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 377 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 378 | "cpu": [ 379 | "ia32" 380 | ], 381 | "dev": true, 382 | "license": "MIT", 383 | "optional": true, 384 | "os": [ 385 | "win32" 386 | ], 387 | "engines": { 388 | "node": ">=12" 389 | } 390 | }, 391 | "node_modules/@esbuild/win32-x64": { 392 | "version": "0.21.5", 393 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 394 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 395 | "cpu": [ 396 | "x64" 397 | ], 398 | "dev": true, 399 | "license": "MIT", 400 | "optional": true, 401 | "os": [ 402 | "win32" 403 | ], 404 | "engines": { 405 | "node": ">=12" 406 | } 407 | }, 408 | "node_modules/@rollup/rollup-android-arm-eabi": { 409 | "version": "4.27.4", 410 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", 411 | "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", 412 | "cpu": [ 413 | "arm" 414 | ], 415 | "dev": true, 416 | "license": "MIT", 417 | "optional": true, 418 | "os": [ 419 | "android" 420 | ] 421 | }, 422 | "node_modules/@rollup/rollup-android-arm64": { 423 | "version": "4.27.4", 424 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", 425 | "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", 426 | "cpu": [ 427 | "arm64" 428 | ], 429 | "dev": true, 430 | "license": "MIT", 431 | "optional": true, 432 | "os": [ 433 | "android" 434 | ] 435 | }, 436 | "node_modules/@rollup/rollup-darwin-arm64": { 437 | "version": "4.27.4", 438 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", 439 | "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", 440 | "cpu": [ 441 | "arm64" 442 | ], 443 | "dev": true, 444 | "license": "MIT", 445 | "optional": true, 446 | "os": [ 447 | "darwin" 448 | ] 449 | }, 450 | "node_modules/@rollup/rollup-darwin-x64": { 451 | "version": "4.27.4", 452 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", 453 | "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", 454 | "cpu": [ 455 | "x64" 456 | ], 457 | "dev": true, 458 | "license": "MIT", 459 | "optional": true, 460 | "os": [ 461 | "darwin" 462 | ] 463 | }, 464 | "node_modules/@rollup/rollup-freebsd-arm64": { 465 | "version": "4.27.4", 466 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", 467 | "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", 468 | "cpu": [ 469 | "arm64" 470 | ], 471 | "dev": true, 472 | "license": "MIT", 473 | "optional": true, 474 | "os": [ 475 | "freebsd" 476 | ] 477 | }, 478 | "node_modules/@rollup/rollup-freebsd-x64": { 479 | "version": "4.27.4", 480 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", 481 | "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", 482 | "cpu": [ 483 | "x64" 484 | ], 485 | "dev": true, 486 | "license": "MIT", 487 | "optional": true, 488 | "os": [ 489 | "freebsd" 490 | ] 491 | }, 492 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 493 | "version": "4.27.4", 494 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", 495 | "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", 496 | "cpu": [ 497 | "arm" 498 | ], 499 | "dev": true, 500 | "license": "MIT", 501 | "optional": true, 502 | "os": [ 503 | "linux" 504 | ] 505 | }, 506 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 507 | "version": "4.27.4", 508 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", 509 | "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", 510 | "cpu": [ 511 | "arm" 512 | ], 513 | "dev": true, 514 | "license": "MIT", 515 | "optional": true, 516 | "os": [ 517 | "linux" 518 | ] 519 | }, 520 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 521 | "version": "4.27.4", 522 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", 523 | "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", 524 | "cpu": [ 525 | "arm64" 526 | ], 527 | "dev": true, 528 | "license": "MIT", 529 | "optional": true, 530 | "os": [ 531 | "linux" 532 | ] 533 | }, 534 | "node_modules/@rollup/rollup-linux-arm64-musl": { 535 | "version": "4.27.4", 536 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", 537 | "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", 538 | "cpu": [ 539 | "arm64" 540 | ], 541 | "dev": true, 542 | "license": "MIT", 543 | "optional": true, 544 | "os": [ 545 | "linux" 546 | ] 547 | }, 548 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 549 | "version": "4.27.4", 550 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", 551 | "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", 552 | "cpu": [ 553 | "ppc64" 554 | ], 555 | "dev": true, 556 | "license": "MIT", 557 | "optional": true, 558 | "os": [ 559 | "linux" 560 | ] 561 | }, 562 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 563 | "version": "4.27.4", 564 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", 565 | "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", 566 | "cpu": [ 567 | "riscv64" 568 | ], 569 | "dev": true, 570 | "license": "MIT", 571 | "optional": true, 572 | "os": [ 573 | "linux" 574 | ] 575 | }, 576 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 577 | "version": "4.27.4", 578 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", 579 | "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", 580 | "cpu": [ 581 | "s390x" 582 | ], 583 | "dev": true, 584 | "license": "MIT", 585 | "optional": true, 586 | "os": [ 587 | "linux" 588 | ] 589 | }, 590 | "node_modules/@rollup/rollup-linux-x64-gnu": { 591 | "version": "4.27.4", 592 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", 593 | "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", 594 | "cpu": [ 595 | "x64" 596 | ], 597 | "dev": true, 598 | "license": "MIT", 599 | "optional": true, 600 | "os": [ 601 | "linux" 602 | ] 603 | }, 604 | "node_modules/@rollup/rollup-linux-x64-musl": { 605 | "version": "4.27.4", 606 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", 607 | "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", 608 | "cpu": [ 609 | "x64" 610 | ], 611 | "dev": true, 612 | "license": "MIT", 613 | "optional": true, 614 | "os": [ 615 | "linux" 616 | ] 617 | }, 618 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 619 | "version": "4.27.4", 620 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", 621 | "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", 622 | "cpu": [ 623 | "arm64" 624 | ], 625 | "dev": true, 626 | "license": "MIT", 627 | "optional": true, 628 | "os": [ 629 | "win32" 630 | ] 631 | }, 632 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 633 | "version": "4.27.4", 634 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", 635 | "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", 636 | "cpu": [ 637 | "ia32" 638 | ], 639 | "dev": true, 640 | "license": "MIT", 641 | "optional": true, 642 | "os": [ 643 | "win32" 644 | ] 645 | }, 646 | "node_modules/@rollup/rollup-win32-x64-msvc": { 647 | "version": "4.27.4", 648 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", 649 | "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", 650 | "cpu": [ 651 | "x64" 652 | ], 653 | "dev": true, 654 | "license": "MIT", 655 | "optional": true, 656 | "os": [ 657 | "win32" 658 | ] 659 | }, 660 | "node_modules/@types/estree": { 661 | "version": "1.0.6", 662 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 663 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 664 | "dev": true, 665 | "license": "MIT" 666 | }, 667 | "node_modules/esbuild": { 668 | "version": "0.21.5", 669 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 670 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 671 | "dev": true, 672 | "hasInstallScript": true, 673 | "license": "MIT", 674 | "bin": { 675 | "esbuild": "bin/esbuild" 676 | }, 677 | "engines": { 678 | "node": ">=12" 679 | }, 680 | "optionalDependencies": { 681 | "@esbuild/aix-ppc64": "0.21.5", 682 | "@esbuild/android-arm": "0.21.5", 683 | "@esbuild/android-arm64": "0.21.5", 684 | "@esbuild/android-x64": "0.21.5", 685 | "@esbuild/darwin-arm64": "0.21.5", 686 | "@esbuild/darwin-x64": "0.21.5", 687 | "@esbuild/freebsd-arm64": "0.21.5", 688 | "@esbuild/freebsd-x64": "0.21.5", 689 | "@esbuild/linux-arm": "0.21.5", 690 | "@esbuild/linux-arm64": "0.21.5", 691 | "@esbuild/linux-ia32": "0.21.5", 692 | "@esbuild/linux-loong64": "0.21.5", 693 | "@esbuild/linux-mips64el": "0.21.5", 694 | "@esbuild/linux-ppc64": "0.21.5", 695 | "@esbuild/linux-riscv64": "0.21.5", 696 | "@esbuild/linux-s390x": "0.21.5", 697 | "@esbuild/linux-x64": "0.21.5", 698 | "@esbuild/netbsd-x64": "0.21.5", 699 | "@esbuild/openbsd-x64": "0.21.5", 700 | "@esbuild/sunos-x64": "0.21.5", 701 | "@esbuild/win32-arm64": "0.21.5", 702 | "@esbuild/win32-ia32": "0.21.5", 703 | "@esbuild/win32-x64": "0.21.5" 704 | } 705 | }, 706 | "node_modules/fsevents": { 707 | "version": "2.3.3", 708 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 709 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 710 | "dev": true, 711 | "hasInstallScript": true, 712 | "license": "MIT", 713 | "optional": true, 714 | "os": [ 715 | "darwin" 716 | ], 717 | "engines": { 718 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 719 | } 720 | }, 721 | "node_modules/nanoid": { 722 | "version": "3.3.8", 723 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 724 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 725 | "dev": true, 726 | "funding": [ 727 | { 728 | "type": "github", 729 | "url": "https://github.com/sponsors/ai" 730 | } 731 | ], 732 | "license": "MIT", 733 | "bin": { 734 | "nanoid": "bin/nanoid.cjs" 735 | }, 736 | "engines": { 737 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 738 | } 739 | }, 740 | "node_modules/picocolors": { 741 | "version": "1.1.1", 742 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 743 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 744 | "dev": true, 745 | "license": "ISC" 746 | }, 747 | "node_modules/postcss": { 748 | "version": "8.4.49", 749 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", 750 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", 751 | "dev": true, 752 | "funding": [ 753 | { 754 | "type": "opencollective", 755 | "url": "https://opencollective.com/postcss/" 756 | }, 757 | { 758 | "type": "tidelift", 759 | "url": "https://tidelift.com/funding/github/npm/postcss" 760 | }, 761 | { 762 | "type": "github", 763 | "url": "https://github.com/sponsors/ai" 764 | } 765 | ], 766 | "license": "MIT", 767 | "dependencies": { 768 | "nanoid": "^3.3.7", 769 | "picocolors": "^1.1.1", 770 | "source-map-js": "^1.2.1" 771 | }, 772 | "engines": { 773 | "node": "^10 || ^12 || >=14" 774 | } 775 | }, 776 | "node_modules/rollup": { 777 | "version": "4.27.4", 778 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", 779 | "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", 780 | "dev": true, 781 | "license": "MIT", 782 | "dependencies": { 783 | "@types/estree": "1.0.6" 784 | }, 785 | "bin": { 786 | "rollup": "dist/bin/rollup" 787 | }, 788 | "engines": { 789 | "node": ">=18.0.0", 790 | "npm": ">=8.0.0" 791 | }, 792 | "optionalDependencies": { 793 | "@rollup/rollup-android-arm-eabi": "4.27.4", 794 | "@rollup/rollup-android-arm64": "4.27.4", 795 | "@rollup/rollup-darwin-arm64": "4.27.4", 796 | "@rollup/rollup-darwin-x64": "4.27.4", 797 | "@rollup/rollup-freebsd-arm64": "4.27.4", 798 | "@rollup/rollup-freebsd-x64": "4.27.4", 799 | "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", 800 | "@rollup/rollup-linux-arm-musleabihf": "4.27.4", 801 | "@rollup/rollup-linux-arm64-gnu": "4.27.4", 802 | "@rollup/rollup-linux-arm64-musl": "4.27.4", 803 | "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", 804 | "@rollup/rollup-linux-riscv64-gnu": "4.27.4", 805 | "@rollup/rollup-linux-s390x-gnu": "4.27.4", 806 | "@rollup/rollup-linux-x64-gnu": "4.27.4", 807 | "@rollup/rollup-linux-x64-musl": "4.27.4", 808 | "@rollup/rollup-win32-arm64-msvc": "4.27.4", 809 | "@rollup/rollup-win32-ia32-msvc": "4.27.4", 810 | "@rollup/rollup-win32-x64-msvc": "4.27.4", 811 | "fsevents": "~2.3.2" 812 | } 813 | }, 814 | "node_modules/source-map-js": { 815 | "version": "1.2.1", 816 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 817 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 818 | "dev": true, 819 | "license": "BSD-3-Clause", 820 | "engines": { 821 | "node": ">=0.10.0" 822 | } 823 | }, 824 | "node_modules/three": { 825 | "version": "0.173.0", 826 | "resolved": "https://registry.npmjs.org/three/-/three-0.173.0.tgz", 827 | "integrity": "sha512-AUwVmViIEUgBwxJJ7stnF0NkPpZxx1aZ6WiAbQ/Qq61h6I9UR4grXtZDmO8mnlaNORhHnIBlXJ1uBxILEKuVyw==", 828 | "license": "MIT" 829 | }, 830 | "node_modules/vite": { 831 | "version": "5.4.10", 832 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", 833 | "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", 834 | "dev": true, 835 | "license": "MIT", 836 | "dependencies": { 837 | "esbuild": "^0.21.3", 838 | "postcss": "^8.4.43", 839 | "rollup": "^4.20.0" 840 | }, 841 | "bin": { 842 | "vite": "bin/vite.js" 843 | }, 844 | "engines": { 845 | "node": "^18.0.0 || >=20.0.0" 846 | }, 847 | "funding": { 848 | "url": "https://github.com/vitejs/vite?sponsor=1" 849 | }, 850 | "optionalDependencies": { 851 | "fsevents": "~2.3.3" 852 | }, 853 | "peerDependencies": { 854 | "@types/node": "^18.0.0 || >=20.0.0", 855 | "less": "*", 856 | "lightningcss": "^1.21.0", 857 | "sass": "*", 858 | "sass-embedded": "*", 859 | "stylus": "*", 860 | "sugarss": "*", 861 | "terser": "^5.4.0" 862 | }, 863 | "peerDependenciesMeta": { 864 | "@types/node": { 865 | "optional": true 866 | }, 867 | "less": { 868 | "optional": true 869 | }, 870 | "lightningcss": { 871 | "optional": true 872 | }, 873 | "sass": { 874 | "optional": true 875 | }, 876 | "sass-embedded": { 877 | "optional": true 878 | }, 879 | "stylus": { 880 | "optional": true 881 | }, 882 | "sugarss": { 883 | "optional": true 884 | }, 885 | "terser": { 886 | "optional": true 887 | } 888 | } 889 | } 890 | } 891 | } 892 | -------------------------------------------------------------------------------- /vite-vanilla-js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-vanilla-js", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "start": "vite build && vite preview --host", 9 | "docker": "docker build -t vite-vanilla-js . && docker run -p 4173:4173 vite-vanilla-js" 10 | }, 11 | "dependencies": { 12 | "three": "0.173.0" 13 | }, 14 | "devDependencies": { 15 | "vite": "5.4.10" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /vite-vanilla-js/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | 3 | export default defineConfig({ 4 | // You might not need those. They are needed when importing modules with 5 | // top-level await such as three/examples/jsm/capabilities/WebGPU, 6 | // or if you use top-level await in your own code (which is the case here, 7 | // because we await renderer.init() in main.js). 8 | optimizeDeps: { esbuildOptions: { target: 'esnext' } }, 9 | build: { target: 'esnext' }, 10 | }) 11 | --------------------------------------------------------------------------------