├── .gitignore ├── README.md ├── assets └── demo.jpg ├── index.html ├── main.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | splatter-three.js 3 | 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Three.js / splatter.app integration demo 2 | 3 | This is an example of integrating [splatter.app](https://splatter.app) in a simple Three.js application. 4 | 5 | To run it, first do `npm install` and then run `npx vite`. 6 | 7 | ![](assets/demo.jpg) 8 | 9 | ## API 10 | 11 | A minimum integration consists of these steps: 12 | 13 | ```js 14 | import { Splatter } from 'splatter-three'; 15 | const splatter = new Splatter(context, {splatId: '7yr-idb'}); 16 | ``` 17 | 18 | Then render the splats at the end of the frame, over existing opaque Three.js content. 19 | Depth testing ensures correct visibility/occlusion of the content. 20 | ```js 21 | splatter.render(camera); 22 | ``` 23 | 24 | ## Licensing 25 | 26 | The `splatter-three` module is available for licensing to Business and Enterprise customers. Please contact [info@splatter.app](mailto:info@splatter.app) to get access. 27 | 28 | 29 | -------------------------------------------------------------------------------- /assets/demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/splatter-app/three-demo/c96f083599fc076ca2a569149b501131be80ddeb/assets/demo.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Three.js / splatter.app integration demo 6 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; 3 | import { Splatter } from 'splatter-three'; 4 | 5 | // create WebGL2 context -- required for Splatter 6 | const options = { 7 | antialias: false, 8 | alpha: true, 9 | powerPreference: 'high-performance', 10 | } 11 | const canvas = document.createElement('canvas'); 12 | const context = canvas.getContext('webgl2', options); 13 | if (!context) { 14 | alert('WebGL2 not supported in this browser'); 15 | throw new Error('WebGL2 not supported'); 16 | } 17 | document.body.appendChild(canvas); 18 | 19 | // set up Three.js renderer 20 | const renderer = new THREE.WebGLRenderer({ canvas, context }); 21 | renderer.setSize(window.innerWidth, window.innerHeight); 22 | renderer.setPixelRatio(window.devicePixelRatio); 23 | renderer.setClearColor(0x000000); 24 | 25 | // set up Splatter 26 | const splatter = new Splatter(context, {splatId: '7yr-idb'}); 27 | splatter.setTransform(new THREE.Matrix4().makeRotationX(130 / 180 * Math.PI)); 28 | 29 | // set up scene 30 | const scene = new THREE.Scene(); 31 | 32 | const grid = new THREE.GridHelper(10, 10); 33 | grid.position.set(0, -1, 0); 34 | scene.add(grid); 35 | 36 | const cubeMaterial = new THREE.MeshStandardMaterial({ color: 0x44aa88 }); 37 | const cube = new THREE.Mesh(new THREE.BoxGeometry(), cubeMaterial); 38 | scene.add(cube); 39 | 40 | const ballMaterial = new THREE.MeshStandardMaterial({ color: 0xffff00 }); 41 | const ball = new THREE.Mesh(new THREE.SphereGeometry(0.1, 16, 8), ballMaterial); 42 | scene.add(ball); 43 | 44 | const light = new THREE.DirectionalLight(0xffffff, 1); 45 | light.position.set(5, 10, 7.5); 46 | scene.add(light); 47 | scene.add(new THREE.AmbientLight(0xffffff)); 48 | 49 | // set up camera and controls 50 | const camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000); 51 | camera.position.set(3, 3, 3); 52 | 53 | const controls = new OrbitControls(camera, canvas); 54 | controls.enableDamping = true; 55 | controls.dampingFactor = 0.25; 56 | controls.rotateSpeed = 0.5; 57 | 58 | // set up a simple splat shader effect 59 | splatter.addUniform('vec3', 'uWeights'); 60 | splatter.setShaderEffect(` 61 | // make the splats grayscale 62 | float gray = dot(color, uWeights); 63 | color = vec3(gray); 64 | `); 65 | 66 | // clipping demo: remove splats on the fly with GLSL code 67 | splatter.setClipTest(` 68 | // discard splats beyond a certain distance from origin 69 | if (length(position) + radius > 10.0) { return false; } 70 | `); 71 | 72 | // render scene (on demand) 73 | function render(deltaTime) { 74 | frameRequested = false; 75 | 76 | renderer.render(scene, camera); 77 | splatter.setUniform('uWeights', [0.299, 0.587, 0.114]); 78 | splatter.render(camera, controls.target); 79 | 80 | if (controls.update(deltaTime)) { 81 | update(); 82 | }; 83 | } 84 | 85 | // request redraw 86 | let frameRequested = false; 87 | function update() { 88 | if (!frameRequested) { 89 | requestAnimationFrame(render); 90 | frameRequested = true; 91 | } 92 | } 93 | 94 | // handle window resize 95 | function resize() { 96 | let [width, height] = [window.innerWidth, window.innerHeight]; 97 | camera.aspect = width / height; 98 | camera.updateProjectionMatrix(); 99 | renderer.setSize(width, height); 100 | update(); 101 | } 102 | 103 | // recenter on double-click 104 | let lastTime = -1e3; 105 | function onclick(event) { 106 | if (performance.now() - lastTime < 300) { 107 | let pt = splatter.hitTest(camera, [event.clientX, event.clientY]); 108 | if (pt) { 109 | controls.target.copy(pt); 110 | ball.position.copy(pt); 111 | update(); 112 | } 113 | } 114 | lastTime = performance.now(); 115 | } 116 | 117 | // watch number of loaded/displayed Gaussians, hide spinner when enough displayed 118 | function onloaded(totalLoaded, numDisplayed) { 119 | if (totalLoaded > splatter.totalSize/2 || numDisplayed > 1e6) { 120 | document.getElementById('spinner').style.display = 'none'; 121 | } 122 | } 123 | 124 | resize(); 125 | update(); 126 | 127 | window.addEventListener('resize', resize); 128 | controls.addEventListener('change', update); 129 | splatter.addEventListener('update', update); // important: redraw on streaming updates! 130 | splatter.addEventListener('loaded', onloaded); 131 | canvas.addEventListener('pointerdown', onclick); 132 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "three-demo", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "splatter-three": "github:splatter-app/splatter-three", 9 | "three": "^0.176.0" 10 | }, 11 | "devDependencies": { 12 | "vite": "^6.3.4" 13 | } 14 | }, 15 | "node_modules/@esbuild/aix-ppc64": { 16 | "version": "0.25.10", 17 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", 18 | "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", 19 | "cpu": [ 20 | "ppc64" 21 | ], 22 | "dev": true, 23 | "license": "MIT", 24 | "optional": true, 25 | "os": [ 26 | "aix" 27 | ], 28 | "engines": { 29 | "node": ">=18" 30 | } 31 | }, 32 | "node_modules/@esbuild/android-arm": { 33 | "version": "0.25.10", 34 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", 35 | "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", 36 | "cpu": [ 37 | "arm" 38 | ], 39 | "dev": true, 40 | "license": "MIT", 41 | "optional": true, 42 | "os": [ 43 | "android" 44 | ], 45 | "engines": { 46 | "node": ">=18" 47 | } 48 | }, 49 | "node_modules/@esbuild/android-arm64": { 50 | "version": "0.25.10", 51 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", 52 | "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", 53 | "cpu": [ 54 | "arm64" 55 | ], 56 | "dev": true, 57 | "license": "MIT", 58 | "optional": true, 59 | "os": [ 60 | "android" 61 | ], 62 | "engines": { 63 | "node": ">=18" 64 | } 65 | }, 66 | "node_modules/@esbuild/android-x64": { 67 | "version": "0.25.10", 68 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", 69 | "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", 70 | "cpu": [ 71 | "x64" 72 | ], 73 | "dev": true, 74 | "license": "MIT", 75 | "optional": true, 76 | "os": [ 77 | "android" 78 | ], 79 | "engines": { 80 | "node": ">=18" 81 | } 82 | }, 83 | "node_modules/@esbuild/darwin-arm64": { 84 | "version": "0.25.10", 85 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", 86 | "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", 87 | "cpu": [ 88 | "arm64" 89 | ], 90 | "dev": true, 91 | "license": "MIT", 92 | "optional": true, 93 | "os": [ 94 | "darwin" 95 | ], 96 | "engines": { 97 | "node": ">=18" 98 | } 99 | }, 100 | "node_modules/@esbuild/darwin-x64": { 101 | "version": "0.25.10", 102 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", 103 | "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", 104 | "cpu": [ 105 | "x64" 106 | ], 107 | "dev": true, 108 | "license": "MIT", 109 | "optional": true, 110 | "os": [ 111 | "darwin" 112 | ], 113 | "engines": { 114 | "node": ">=18" 115 | } 116 | }, 117 | "node_modules/@esbuild/freebsd-arm64": { 118 | "version": "0.25.10", 119 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", 120 | "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", 121 | "cpu": [ 122 | "arm64" 123 | ], 124 | "dev": true, 125 | "license": "MIT", 126 | "optional": true, 127 | "os": [ 128 | "freebsd" 129 | ], 130 | "engines": { 131 | "node": ">=18" 132 | } 133 | }, 134 | "node_modules/@esbuild/freebsd-x64": { 135 | "version": "0.25.10", 136 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", 137 | "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", 138 | "cpu": [ 139 | "x64" 140 | ], 141 | "dev": true, 142 | "license": "MIT", 143 | "optional": true, 144 | "os": [ 145 | "freebsd" 146 | ], 147 | "engines": { 148 | "node": ">=18" 149 | } 150 | }, 151 | "node_modules/@esbuild/linux-arm": { 152 | "version": "0.25.10", 153 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", 154 | "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", 155 | "cpu": [ 156 | "arm" 157 | ], 158 | "dev": true, 159 | "license": "MIT", 160 | "optional": true, 161 | "os": [ 162 | "linux" 163 | ], 164 | "engines": { 165 | "node": ">=18" 166 | } 167 | }, 168 | "node_modules/@esbuild/linux-arm64": { 169 | "version": "0.25.10", 170 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", 171 | "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", 172 | "cpu": [ 173 | "arm64" 174 | ], 175 | "dev": true, 176 | "license": "MIT", 177 | "optional": true, 178 | "os": [ 179 | "linux" 180 | ], 181 | "engines": { 182 | "node": ">=18" 183 | } 184 | }, 185 | "node_modules/@esbuild/linux-ia32": { 186 | "version": "0.25.10", 187 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", 188 | "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", 189 | "cpu": [ 190 | "ia32" 191 | ], 192 | "dev": true, 193 | "license": "MIT", 194 | "optional": true, 195 | "os": [ 196 | "linux" 197 | ], 198 | "engines": { 199 | "node": ">=18" 200 | } 201 | }, 202 | "node_modules/@esbuild/linux-loong64": { 203 | "version": "0.25.10", 204 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", 205 | "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", 206 | "cpu": [ 207 | "loong64" 208 | ], 209 | "dev": true, 210 | "license": "MIT", 211 | "optional": true, 212 | "os": [ 213 | "linux" 214 | ], 215 | "engines": { 216 | "node": ">=18" 217 | } 218 | }, 219 | "node_modules/@esbuild/linux-mips64el": { 220 | "version": "0.25.10", 221 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", 222 | "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", 223 | "cpu": [ 224 | "mips64el" 225 | ], 226 | "dev": true, 227 | "license": "MIT", 228 | "optional": true, 229 | "os": [ 230 | "linux" 231 | ], 232 | "engines": { 233 | "node": ">=18" 234 | } 235 | }, 236 | "node_modules/@esbuild/linux-ppc64": { 237 | "version": "0.25.10", 238 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", 239 | "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", 240 | "cpu": [ 241 | "ppc64" 242 | ], 243 | "dev": true, 244 | "license": "MIT", 245 | "optional": true, 246 | "os": [ 247 | "linux" 248 | ], 249 | "engines": { 250 | "node": ">=18" 251 | } 252 | }, 253 | "node_modules/@esbuild/linux-riscv64": { 254 | "version": "0.25.10", 255 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", 256 | "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", 257 | "cpu": [ 258 | "riscv64" 259 | ], 260 | "dev": true, 261 | "license": "MIT", 262 | "optional": true, 263 | "os": [ 264 | "linux" 265 | ], 266 | "engines": { 267 | "node": ">=18" 268 | } 269 | }, 270 | "node_modules/@esbuild/linux-s390x": { 271 | "version": "0.25.10", 272 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", 273 | "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", 274 | "cpu": [ 275 | "s390x" 276 | ], 277 | "dev": true, 278 | "license": "MIT", 279 | "optional": true, 280 | "os": [ 281 | "linux" 282 | ], 283 | "engines": { 284 | "node": ">=18" 285 | } 286 | }, 287 | "node_modules/@esbuild/linux-x64": { 288 | "version": "0.25.10", 289 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", 290 | "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", 291 | "cpu": [ 292 | "x64" 293 | ], 294 | "dev": true, 295 | "license": "MIT", 296 | "optional": true, 297 | "os": [ 298 | "linux" 299 | ], 300 | "engines": { 301 | "node": ">=18" 302 | } 303 | }, 304 | "node_modules/@esbuild/netbsd-arm64": { 305 | "version": "0.25.10", 306 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", 307 | "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", 308 | "cpu": [ 309 | "arm64" 310 | ], 311 | "dev": true, 312 | "license": "MIT", 313 | "optional": true, 314 | "os": [ 315 | "netbsd" 316 | ], 317 | "engines": { 318 | "node": ">=18" 319 | } 320 | }, 321 | "node_modules/@esbuild/netbsd-x64": { 322 | "version": "0.25.10", 323 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", 324 | "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", 325 | "cpu": [ 326 | "x64" 327 | ], 328 | "dev": true, 329 | "license": "MIT", 330 | "optional": true, 331 | "os": [ 332 | "netbsd" 333 | ], 334 | "engines": { 335 | "node": ">=18" 336 | } 337 | }, 338 | "node_modules/@esbuild/openbsd-arm64": { 339 | "version": "0.25.10", 340 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", 341 | "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", 342 | "cpu": [ 343 | "arm64" 344 | ], 345 | "dev": true, 346 | "license": "MIT", 347 | "optional": true, 348 | "os": [ 349 | "openbsd" 350 | ], 351 | "engines": { 352 | "node": ">=18" 353 | } 354 | }, 355 | "node_modules/@esbuild/openbsd-x64": { 356 | "version": "0.25.10", 357 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", 358 | "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", 359 | "cpu": [ 360 | "x64" 361 | ], 362 | "dev": true, 363 | "license": "MIT", 364 | "optional": true, 365 | "os": [ 366 | "openbsd" 367 | ], 368 | "engines": { 369 | "node": ">=18" 370 | } 371 | }, 372 | "node_modules/@esbuild/openharmony-arm64": { 373 | "version": "0.25.10", 374 | "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", 375 | "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", 376 | "cpu": [ 377 | "arm64" 378 | ], 379 | "dev": true, 380 | "license": "MIT", 381 | "optional": true, 382 | "os": [ 383 | "openharmony" 384 | ], 385 | "engines": { 386 | "node": ">=18" 387 | } 388 | }, 389 | "node_modules/@esbuild/sunos-x64": { 390 | "version": "0.25.10", 391 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", 392 | "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", 393 | "cpu": [ 394 | "x64" 395 | ], 396 | "dev": true, 397 | "license": "MIT", 398 | "optional": true, 399 | "os": [ 400 | "sunos" 401 | ], 402 | "engines": { 403 | "node": ">=18" 404 | } 405 | }, 406 | "node_modules/@esbuild/win32-arm64": { 407 | "version": "0.25.10", 408 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", 409 | "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", 410 | "cpu": [ 411 | "arm64" 412 | ], 413 | "dev": true, 414 | "license": "MIT", 415 | "optional": true, 416 | "os": [ 417 | "win32" 418 | ], 419 | "engines": { 420 | "node": ">=18" 421 | } 422 | }, 423 | "node_modules/@esbuild/win32-ia32": { 424 | "version": "0.25.10", 425 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", 426 | "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", 427 | "cpu": [ 428 | "ia32" 429 | ], 430 | "dev": true, 431 | "license": "MIT", 432 | "optional": true, 433 | "os": [ 434 | "win32" 435 | ], 436 | "engines": { 437 | "node": ">=18" 438 | } 439 | }, 440 | "node_modules/@esbuild/win32-x64": { 441 | "version": "0.25.10", 442 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", 443 | "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", 444 | "cpu": [ 445 | "x64" 446 | ], 447 | "dev": true, 448 | "license": "MIT", 449 | "optional": true, 450 | "os": [ 451 | "win32" 452 | ], 453 | "engines": { 454 | "node": ">=18" 455 | } 456 | }, 457 | "node_modules/@rollup/rollup-android-arm-eabi": { 458 | "version": "4.52.4", 459 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", 460 | "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", 461 | "cpu": [ 462 | "arm" 463 | ], 464 | "dev": true, 465 | "license": "MIT", 466 | "optional": true, 467 | "os": [ 468 | "android" 469 | ] 470 | }, 471 | "node_modules/@rollup/rollup-android-arm64": { 472 | "version": "4.52.4", 473 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", 474 | "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", 475 | "cpu": [ 476 | "arm64" 477 | ], 478 | "dev": true, 479 | "license": "MIT", 480 | "optional": true, 481 | "os": [ 482 | "android" 483 | ] 484 | }, 485 | "node_modules/@rollup/rollup-darwin-arm64": { 486 | "version": "4.52.4", 487 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", 488 | "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", 489 | "cpu": [ 490 | "arm64" 491 | ], 492 | "dev": true, 493 | "license": "MIT", 494 | "optional": true, 495 | "os": [ 496 | "darwin" 497 | ] 498 | }, 499 | "node_modules/@rollup/rollup-darwin-x64": { 500 | "version": "4.52.4", 501 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", 502 | "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", 503 | "cpu": [ 504 | "x64" 505 | ], 506 | "dev": true, 507 | "license": "MIT", 508 | "optional": true, 509 | "os": [ 510 | "darwin" 511 | ] 512 | }, 513 | "node_modules/@rollup/rollup-freebsd-arm64": { 514 | "version": "4.52.4", 515 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", 516 | "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", 517 | "cpu": [ 518 | "arm64" 519 | ], 520 | "dev": true, 521 | "license": "MIT", 522 | "optional": true, 523 | "os": [ 524 | "freebsd" 525 | ] 526 | }, 527 | "node_modules/@rollup/rollup-freebsd-x64": { 528 | "version": "4.52.4", 529 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", 530 | "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", 531 | "cpu": [ 532 | "x64" 533 | ], 534 | "dev": true, 535 | "license": "MIT", 536 | "optional": true, 537 | "os": [ 538 | "freebsd" 539 | ] 540 | }, 541 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 542 | "version": "4.52.4", 543 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", 544 | "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", 545 | "cpu": [ 546 | "arm" 547 | ], 548 | "dev": true, 549 | "license": "MIT", 550 | "optional": true, 551 | "os": [ 552 | "linux" 553 | ] 554 | }, 555 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 556 | "version": "4.52.4", 557 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", 558 | "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", 559 | "cpu": [ 560 | "arm" 561 | ], 562 | "dev": true, 563 | "license": "MIT", 564 | "optional": true, 565 | "os": [ 566 | "linux" 567 | ] 568 | }, 569 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 570 | "version": "4.52.4", 571 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", 572 | "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", 573 | "cpu": [ 574 | "arm64" 575 | ], 576 | "dev": true, 577 | "license": "MIT", 578 | "optional": true, 579 | "os": [ 580 | "linux" 581 | ] 582 | }, 583 | "node_modules/@rollup/rollup-linux-arm64-musl": { 584 | "version": "4.52.4", 585 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", 586 | "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", 587 | "cpu": [ 588 | "arm64" 589 | ], 590 | "dev": true, 591 | "license": "MIT", 592 | "optional": true, 593 | "os": [ 594 | "linux" 595 | ] 596 | }, 597 | "node_modules/@rollup/rollup-linux-loong64-gnu": { 598 | "version": "4.52.4", 599 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", 600 | "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", 601 | "cpu": [ 602 | "loong64" 603 | ], 604 | "dev": true, 605 | "license": "MIT", 606 | "optional": true, 607 | "os": [ 608 | "linux" 609 | ] 610 | }, 611 | "node_modules/@rollup/rollup-linux-ppc64-gnu": { 612 | "version": "4.52.4", 613 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", 614 | "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", 615 | "cpu": [ 616 | "ppc64" 617 | ], 618 | "dev": true, 619 | "license": "MIT", 620 | "optional": true, 621 | "os": [ 622 | "linux" 623 | ] 624 | }, 625 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 626 | "version": "4.52.4", 627 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", 628 | "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", 629 | "cpu": [ 630 | "riscv64" 631 | ], 632 | "dev": true, 633 | "license": "MIT", 634 | "optional": true, 635 | "os": [ 636 | "linux" 637 | ] 638 | }, 639 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 640 | "version": "4.52.4", 641 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", 642 | "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", 643 | "cpu": [ 644 | "riscv64" 645 | ], 646 | "dev": true, 647 | "license": "MIT", 648 | "optional": true, 649 | "os": [ 650 | "linux" 651 | ] 652 | }, 653 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 654 | "version": "4.52.4", 655 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", 656 | "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", 657 | "cpu": [ 658 | "s390x" 659 | ], 660 | "dev": true, 661 | "license": "MIT", 662 | "optional": true, 663 | "os": [ 664 | "linux" 665 | ] 666 | }, 667 | "node_modules/@rollup/rollup-linux-x64-gnu": { 668 | "version": "4.52.4", 669 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", 670 | "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", 671 | "cpu": [ 672 | "x64" 673 | ], 674 | "dev": true, 675 | "license": "MIT", 676 | "optional": true, 677 | "os": [ 678 | "linux" 679 | ] 680 | }, 681 | "node_modules/@rollup/rollup-linux-x64-musl": { 682 | "version": "4.52.4", 683 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", 684 | "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", 685 | "cpu": [ 686 | "x64" 687 | ], 688 | "dev": true, 689 | "license": "MIT", 690 | "optional": true, 691 | "os": [ 692 | "linux" 693 | ] 694 | }, 695 | "node_modules/@rollup/rollup-openharmony-arm64": { 696 | "version": "4.52.4", 697 | "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", 698 | "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", 699 | "cpu": [ 700 | "arm64" 701 | ], 702 | "dev": true, 703 | "license": "MIT", 704 | "optional": true, 705 | "os": [ 706 | "openharmony" 707 | ] 708 | }, 709 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 710 | "version": "4.52.4", 711 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", 712 | "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", 713 | "cpu": [ 714 | "arm64" 715 | ], 716 | "dev": true, 717 | "license": "MIT", 718 | "optional": true, 719 | "os": [ 720 | "win32" 721 | ] 722 | }, 723 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 724 | "version": "4.52.4", 725 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", 726 | "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", 727 | "cpu": [ 728 | "ia32" 729 | ], 730 | "dev": true, 731 | "license": "MIT", 732 | "optional": true, 733 | "os": [ 734 | "win32" 735 | ] 736 | }, 737 | "node_modules/@rollup/rollup-win32-x64-gnu": { 738 | "version": "4.52.4", 739 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", 740 | "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", 741 | "cpu": [ 742 | "x64" 743 | ], 744 | "dev": true, 745 | "license": "MIT", 746 | "optional": true, 747 | "os": [ 748 | "win32" 749 | ] 750 | }, 751 | "node_modules/@rollup/rollup-win32-x64-msvc": { 752 | "version": "4.52.4", 753 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", 754 | "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", 755 | "cpu": [ 756 | "x64" 757 | ], 758 | "dev": true, 759 | "license": "MIT", 760 | "optional": true, 761 | "os": [ 762 | "win32" 763 | ] 764 | }, 765 | "node_modules/@types/estree": { 766 | "version": "1.0.8", 767 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 768 | "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 769 | "dev": true, 770 | "license": "MIT" 771 | }, 772 | "node_modules/esbuild": { 773 | "version": "0.25.10", 774 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", 775 | "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", 776 | "dev": true, 777 | "hasInstallScript": true, 778 | "license": "MIT", 779 | "bin": { 780 | "esbuild": "bin/esbuild" 781 | }, 782 | "engines": { 783 | "node": ">=18" 784 | }, 785 | "optionalDependencies": { 786 | "@esbuild/aix-ppc64": "0.25.10", 787 | "@esbuild/android-arm": "0.25.10", 788 | "@esbuild/android-arm64": "0.25.10", 789 | "@esbuild/android-x64": "0.25.10", 790 | "@esbuild/darwin-arm64": "0.25.10", 791 | "@esbuild/darwin-x64": "0.25.10", 792 | "@esbuild/freebsd-arm64": "0.25.10", 793 | "@esbuild/freebsd-x64": "0.25.10", 794 | "@esbuild/linux-arm": "0.25.10", 795 | "@esbuild/linux-arm64": "0.25.10", 796 | "@esbuild/linux-ia32": "0.25.10", 797 | "@esbuild/linux-loong64": "0.25.10", 798 | "@esbuild/linux-mips64el": "0.25.10", 799 | "@esbuild/linux-ppc64": "0.25.10", 800 | "@esbuild/linux-riscv64": "0.25.10", 801 | "@esbuild/linux-s390x": "0.25.10", 802 | "@esbuild/linux-x64": "0.25.10", 803 | "@esbuild/netbsd-arm64": "0.25.10", 804 | "@esbuild/netbsd-x64": "0.25.10", 805 | "@esbuild/openbsd-arm64": "0.25.10", 806 | "@esbuild/openbsd-x64": "0.25.10", 807 | "@esbuild/openharmony-arm64": "0.25.10", 808 | "@esbuild/sunos-x64": "0.25.10", 809 | "@esbuild/win32-arm64": "0.25.10", 810 | "@esbuild/win32-ia32": "0.25.10", 811 | "@esbuild/win32-x64": "0.25.10" 812 | } 813 | }, 814 | "node_modules/fdir": { 815 | "version": "6.5.0", 816 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 817 | "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 818 | "dev": true, 819 | "license": "MIT", 820 | "engines": { 821 | "node": ">=12.0.0" 822 | }, 823 | "peerDependencies": { 824 | "picomatch": "^3 || ^4" 825 | }, 826 | "peerDependenciesMeta": { 827 | "picomatch": { 828 | "optional": true 829 | } 830 | } 831 | }, 832 | "node_modules/fsevents": { 833 | "version": "2.3.3", 834 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 835 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 836 | "dev": true, 837 | "hasInstallScript": true, 838 | "license": "MIT", 839 | "optional": true, 840 | "os": [ 841 | "darwin" 842 | ], 843 | "engines": { 844 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 845 | } 846 | }, 847 | "node_modules/nanoid": { 848 | "version": "3.3.11", 849 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 850 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 851 | "dev": true, 852 | "funding": [ 853 | { 854 | "type": "github", 855 | "url": "https://github.com/sponsors/ai" 856 | } 857 | ], 858 | "license": "MIT", 859 | "bin": { 860 | "nanoid": "bin/nanoid.cjs" 861 | }, 862 | "engines": { 863 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 864 | } 865 | }, 866 | "node_modules/picocolors": { 867 | "version": "1.1.1", 868 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 869 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 870 | "dev": true, 871 | "license": "ISC" 872 | }, 873 | "node_modules/picomatch": { 874 | "version": "4.0.3", 875 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 876 | "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 877 | "dev": true, 878 | "license": "MIT", 879 | "engines": { 880 | "node": ">=12" 881 | }, 882 | "funding": { 883 | "url": "https://github.com/sponsors/jonschlinkert" 884 | } 885 | }, 886 | "node_modules/postcss": { 887 | "version": "8.5.6", 888 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 889 | "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 890 | "dev": true, 891 | "funding": [ 892 | { 893 | "type": "opencollective", 894 | "url": "https://opencollective.com/postcss/" 895 | }, 896 | { 897 | "type": "tidelift", 898 | "url": "https://tidelift.com/funding/github/npm/postcss" 899 | }, 900 | { 901 | "type": "github", 902 | "url": "https://github.com/sponsors/ai" 903 | } 904 | ], 905 | "license": "MIT", 906 | "dependencies": { 907 | "nanoid": "^3.3.11", 908 | "picocolors": "^1.1.1", 909 | "source-map-js": "^1.2.1" 910 | }, 911 | "engines": { 912 | "node": "^10 || ^12 || >=14" 913 | } 914 | }, 915 | "node_modules/rollup": { 916 | "version": "4.52.4", 917 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", 918 | "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", 919 | "dev": true, 920 | "license": "MIT", 921 | "dependencies": { 922 | "@types/estree": "1.0.8" 923 | }, 924 | "bin": { 925 | "rollup": "dist/bin/rollup" 926 | }, 927 | "engines": { 928 | "node": ">=18.0.0", 929 | "npm": ">=8.0.0" 930 | }, 931 | "optionalDependencies": { 932 | "@rollup/rollup-android-arm-eabi": "4.52.4", 933 | "@rollup/rollup-android-arm64": "4.52.4", 934 | "@rollup/rollup-darwin-arm64": "4.52.4", 935 | "@rollup/rollup-darwin-x64": "4.52.4", 936 | "@rollup/rollup-freebsd-arm64": "4.52.4", 937 | "@rollup/rollup-freebsd-x64": "4.52.4", 938 | "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", 939 | "@rollup/rollup-linux-arm-musleabihf": "4.52.4", 940 | "@rollup/rollup-linux-arm64-gnu": "4.52.4", 941 | "@rollup/rollup-linux-arm64-musl": "4.52.4", 942 | "@rollup/rollup-linux-loong64-gnu": "4.52.4", 943 | "@rollup/rollup-linux-ppc64-gnu": "4.52.4", 944 | "@rollup/rollup-linux-riscv64-gnu": "4.52.4", 945 | "@rollup/rollup-linux-riscv64-musl": "4.52.4", 946 | "@rollup/rollup-linux-s390x-gnu": "4.52.4", 947 | "@rollup/rollup-linux-x64-gnu": "4.52.4", 948 | "@rollup/rollup-linux-x64-musl": "4.52.4", 949 | "@rollup/rollup-openharmony-arm64": "4.52.4", 950 | "@rollup/rollup-win32-arm64-msvc": "4.52.4", 951 | "@rollup/rollup-win32-ia32-msvc": "4.52.4", 952 | "@rollup/rollup-win32-x64-gnu": "4.52.4", 953 | "@rollup/rollup-win32-x64-msvc": "4.52.4", 954 | "fsevents": "~2.3.2" 955 | } 956 | }, 957 | "node_modules/source-map-js": { 958 | "version": "1.2.1", 959 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 960 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 961 | "dev": true, 962 | "license": "BSD-3-Clause", 963 | "engines": { 964 | "node": ">=0.10.0" 965 | } 966 | }, 967 | "node_modules/splatter-three": { 968 | "version": "0.10.0", 969 | "resolved": "git+ssh://git@github.com/splatter-app/splatter-three.git#ba95ceefb9d0b362a285412dc02d61402205a1ef" 970 | }, 971 | "node_modules/three": { 972 | "version": "0.176.0", 973 | "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", 974 | "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==", 975 | "license": "MIT" 976 | }, 977 | "node_modules/tinyglobby": { 978 | "version": "0.2.15", 979 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", 980 | "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 981 | "dev": true, 982 | "license": "MIT", 983 | "dependencies": { 984 | "fdir": "^6.5.0", 985 | "picomatch": "^4.0.3" 986 | }, 987 | "engines": { 988 | "node": ">=12.0.0" 989 | }, 990 | "funding": { 991 | "url": "https://github.com/sponsors/SuperchupuDev" 992 | } 993 | }, 994 | "node_modules/vite": { 995 | "version": "6.3.6", 996 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", 997 | "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", 998 | "dev": true, 999 | "license": "MIT", 1000 | "dependencies": { 1001 | "esbuild": "^0.25.0", 1002 | "fdir": "^6.4.4", 1003 | "picomatch": "^4.0.2", 1004 | "postcss": "^8.5.3", 1005 | "rollup": "^4.34.9", 1006 | "tinyglobby": "^0.2.13" 1007 | }, 1008 | "bin": { 1009 | "vite": "bin/vite.js" 1010 | }, 1011 | "engines": { 1012 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1013 | }, 1014 | "funding": { 1015 | "url": "https://github.com/vitejs/vite?sponsor=1" 1016 | }, 1017 | "optionalDependencies": { 1018 | "fsevents": "~2.3.3" 1019 | }, 1020 | "peerDependencies": { 1021 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1022 | "jiti": ">=1.21.0", 1023 | "less": "*", 1024 | "lightningcss": "^1.21.0", 1025 | "sass": "*", 1026 | "sass-embedded": "*", 1027 | "stylus": "*", 1028 | "sugarss": "*", 1029 | "terser": "^5.16.0", 1030 | "tsx": "^4.8.1", 1031 | "yaml": "^2.4.2" 1032 | }, 1033 | "peerDependenciesMeta": { 1034 | "@types/node": { 1035 | "optional": true 1036 | }, 1037 | "jiti": { 1038 | "optional": true 1039 | }, 1040 | "less": { 1041 | "optional": true 1042 | }, 1043 | "lightningcss": { 1044 | "optional": true 1045 | }, 1046 | "sass": { 1047 | "optional": true 1048 | }, 1049 | "sass-embedded": { 1050 | "optional": true 1051 | }, 1052 | "stylus": { 1053 | "optional": true 1054 | }, 1055 | "sugarss": { 1056 | "optional": true 1057 | }, 1058 | "terser": { 1059 | "optional": true 1060 | }, 1061 | "tsx": { 1062 | "optional": true 1063 | }, 1064 | "yaml": { 1065 | "optional": true 1066 | } 1067 | } 1068 | } 1069 | } 1070 | } 1071 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "splatter-three": "github:splatter-app/splatter-three", 4 | "three": "^0.176.0" 5 | }, 6 | "devDependencies": { 7 | "vite": "^6.3.4" 8 | } 9 | } 10 | --------------------------------------------------------------------------------