├── .codesandbox └── tasks.json ├── .devcontainer └── devcontainer.json ├── .eslintrc.json ├── .github └── dependabot.yml ├── .gitignore ├── .prettierrc ├── .zed └── settings.json ├── README.md ├── index.html ├── lib ├── Fluid.tsx ├── constant.ts ├── effect │ ├── Fluid.tsx │ └── FluidEffect.tsx ├── glsl.d.ts ├── glsl │ ├── advection.frag │ ├── base.vert │ ├── clear.frag │ ├── composite.frag │ ├── curl.frag │ ├── divergence.frag │ ├── gradientSubstract.frag │ ├── pressure.frag │ ├── splat.frag │ └── vorticity.frag ├── hooks │ ├── useConfig.tsx │ ├── useDoubleFBO.tsx │ ├── useFBOs.tsx │ ├── useMaterials.tsx │ └── usePointer.tsx ├── index.ts ├── types.ts ├── utils.ts └── utils │ └── colors.ts ├── package.json ├── pnpm-lock.yaml ├── src ├── assets │ ├── abc-normal.ttf │ ├── decay.otf │ ├── github-mark-white.svg │ ├── img.jpg │ ├── img2.jpg │ └── screen_capture.png ├── example │ ├── Canvas.tsx │ ├── Example1.tsx │ ├── Example2.tsx │ ├── Example3.tsx │ ├── Layout.tsx │ ├── Text.tsx │ └── tunel.ts ├── main.tsx ├── styles.css └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.codesandbox/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // These tasks will run in order when initializing your CodeSandbox project. 3 | "setupTasks": [ 4 | { 5 | "command": "pnpm install", 6 | "name": "Install Dependencies" 7 | } 8 | ], 9 | 10 | // These tasks can be run from CodeSandbox. Running one will open a log in the app. 11 | "tasks": { 12 | "dev": { 13 | "name": "dev", 14 | "command": "pnpm dev", 15 | "runAtStart": true 16 | }, 17 | "build": { 18 | "name": "build", 19 | "command": "pnpm build" 20 | }, 21 | "lint": { 22 | "name": "lint", 23 | "command": "pnpm lint" 24 | }, 25 | "preview": { 26 | "name": "preview", 27 | "command": "pnpm preview" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the 2 | // README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node 3 | { 4 | "name": "Node.js & TypeScript", 5 | // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile 6 | "image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bullseye" 7 | 8 | // Features to add to the dev container. More info: https://containers.dev/features. 9 | // "features": {}, 10 | 11 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 12 | // "forwardPorts": [], 13 | 14 | // Use 'postCreateCommand' to run commands after the container is created. 15 | // "postCreateCommand": "yarn install", 16 | 17 | // Configure tool-specific properties. 18 | // "customizations": {}, 19 | 20 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 21 | // "remoteUser": "root" 22 | } 23 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "env": { "browser": true, "es2020": true }, 4 | "extends": [ 5 | "eslint:recommended", 6 | "plugin:@typescript-eslint/recommended", 7 | "plugin:react-hooks/recommended" 8 | ], 9 | "ignorePatterns": ["dist", ".eslintrc.cjs"], 10 | "parser": "@typescript-eslint/parser", 11 | "plugins": ["react-refresh"], 12 | "rules": { 13 | "no-undef": "error", 14 | "no-extra-semi": "off", 15 | "@typescript-eslint/no-explicit-any": "off" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for more information: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | # https://containers.dev/guide/dependabot 6 | 7 | version: 2 8 | updates: 9 | - package-ecosystem: "devcontainers" 10 | directory: "/" 11 | schedule: 12 | interval: weekly 13 | -------------------------------------------------------------------------------- /.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 | *.tsbuildinfo 15 | .pnpm-store 16 | 17 | 18 | # Editor directories and files 19 | .vscode/* 20 | !.vscode/extensions.json 21 | .idea 22 | .DS_Store 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw? 28 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "tabWidth": 4, 4 | "printWidth": 100, 5 | "singleQuote": true, 6 | "jsxSingleQuote": true, 7 | "trailingComma": "all", 8 | "bracketSpacing": true, 9 | "bracketSameLine": true, 10 | "singleAttributePerLine": false, 11 | "object-curly-spacing": "always" 12 | } 13 | -------------------------------------------------------------------------------- /.zed/settings.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whatisjery/react-fluid-distortion/962eaf3c927416b0c0aa94868cb0563ad82f1229/.zed/settings.json -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Version](https://img.shields.io/npm/v/@whatisjery/react-fluid-distortion?style=flat&colorA=000000&colorB=000000)](https://www.npmjs.com/package/@whatisjery/react-fluid-distortion) 2 | 3 | # Fluid Distortion for React Three Fiber 4 | 5 | ![screen capture](./src/assets/screen_capture.png) 6 | 7 | Implementing post-processing fluid distortion effects in response to cursor interactions for React-Three-Fiber. 8 | Based on the shaders developed by [Pavel Dobryakov](https://github.com/PavelDoGreat/WebGL-Fluid-Simulation) 9 | 10 | --- 11 | 12 | From the [react-three-fiber](https://github.com/pmndrs/react-three-fiber) documentation : 13 | 14 | > [!WARNING] 15 | > Three-fiber is a React renderer, it must pair with a major version of React, just like react-dom, react-native, etc. @react-three/fiber@8 pairs with react@18, @react-three/fiber@9 pairs with react@19. 16 | 17 | --- 18 | 19 | ## Try it : 20 | 21 | [codesandbox](https://codesandbox.io/p/github/whatisjery/react-fluid-distortion/draft/empty-leaf) 22 | 23 | ## Installation : 24 | 25 | ```bash 26 | npm install @whatisjery/react-fluid-distortion @react-three/drei @react-three/postprocessing postprocessing leva 27 | ``` 28 | 29 | ## Example of use : 30 | 31 | ```jsx 32 | import { Fluid } from '@whatisjery/react-fluid-distortion'; 33 | import { EffectComposer } from '@react-three/postprocessing'; 34 | import { Canvas } from '@react-three/fiber'; 35 | 36 | 45 | 46 | 47 | {... other effets} 48 | 49 | ; 50 | ``` 51 | 52 | ## Display configuration panel : 53 | 54 | Show a debug panel to test options more easily. 55 | 56 | ```jsx 57 | const config = useConfig(); 58 | 59 | ... 60 | 61 | 62 | ``` 63 | 64 | ## Options : 65 | 66 | | Name | Type | Default Value | Description | 67 | | ---------------------- | ----------- | ------------- | ---------------------------------------------------------------------------------------------- | 68 | | `fluidColor` | hexadecimal | `#005eff` | Sets the fluid color. Effective only when `rainbow` is set to `false`. | 69 | | `backgroundColor` | string | `#070410` | Sets the background color. Effective only when `showBackground` is `true`. | 70 | | `showBackground` | boolean | `false` | Toggles the background color's visibility. If `false` it becomes transprent. | 71 | | `blend` | number | `5` | Blends fluid into the scene when `showBackground` is true. Valid range: `0.00` to `10.0`. | 72 | | `intensity` | number | `10` | Sets the fluid intensity. Valid range: `0` to `10`. | 73 | | `force` | number | `2` | Multiplies the mouse velocity to increase fluid splatter. Valid range: `0.0` to `20`. | 74 | | `distortion` | number | `2` | Sets the distortion amount. Valid range: `0.00` to `2.00`. | 75 | | `radius` | number | `0.3` | Sets the fluid radius. Valid range: `0.01` to `1.00`. | 76 | | `curl` | number | `10` | Sets the amount of the curl effect. Valid range: `0.0` to `50`. | 77 | | `swirl` | number | `20` | Sets the amount of the swirling effect. Valid range: `0` to `20`. | 78 | | `velocityDissipation` | number | `0.99` | Reduces the fluid velocity over time. Valid range: `0.00` to `1.00`. | 79 | | `densitionDissipation` | number | `0.95` | Reduces the fluid density over time. Valid range: `0.00` to `1.00`. | 80 | | `pressure` | number | `0.80` | Controls the reduction of pressure. Valid range: `0.00` to `1.00`. | 81 | | `rainbow` | boolean | `true` | Activates color mode based on mouse direction. No range applicable as this is a boolean value. | 82 | 83 | ## Usage with nextjs 84 | 85 | If you're working with an older version of Next.js, you may get this type of error: 86 | 87 | ```javascript 88 | TypeError: Cannot read properties of undefined (reading '__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED') 89 | ``` 90 | 91 | To fix it, you can enable package transpilation in your next.config file. Here’s how: 92 | 93 | ```javascript 94 | const nextConfig = { 95 | transpilePackages: ['@whatisjery/react-fluid-distortion'], 96 | }; 97 | 98 | module.exports = nextConfig; 99 | ``` 100 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /lib/Fluid.tsx: -------------------------------------------------------------------------------- 1 | import { createPortal, useFrame, useThree } from '@react-three/fiber'; 2 | import { useCallback, useMemo, useRef } from 'react'; 3 | import { Camera, Color, Mesh, Scene, Texture, Vector2, Vector3 } from 'three'; 4 | import { ShaderPass } from 'three/examples/jsm/Addons.js'; 5 | import { Effect as FluidEffect } from './effect/Fluid'; 6 | import { useFBOs } from './hooks/useFBOs'; 7 | import { useMaterials } from './hooks/useMaterials'; 8 | import { Props } from './types'; 9 | import { OPTS } from './constant'; 10 | import { usePointer } from './hooks/usePointer'; 11 | import { BlendFunction } from 'postprocessing'; 12 | import { normalizeScreenHz } from './utils'; 13 | 14 | type Uniforms = { 15 | uColor: Vector3 | Color; 16 | uPointer: Vector2; 17 | uTarget: Texture | null; 18 | uVelocity: Texture; 19 | uCurl: Texture; 20 | uTexture: Texture; 21 | uPressure: Texture; 22 | uDivergence: Texture; 23 | uSource: Texture; 24 | uRadius: number; 25 | uClearValue: number; 26 | uCurlValue: number; 27 | uDissipation: number; 28 | }; 29 | 30 | export const Fluid = ({ 31 | blend = OPTS.blend, 32 | force = OPTS.force, 33 | radius = OPTS.radius, 34 | curl = OPTS.curl, 35 | swirl = OPTS.swirl, 36 | intensity = OPTS.intensity, 37 | distortion = OPTS.distortion, 38 | fluidColor = OPTS.fluidColor, 39 | backgroundColor = OPTS.backgroundColor, 40 | showBackground = OPTS.showBackground, 41 | rainbow = OPTS.rainbow, 42 | pressure = OPTS.pressure, 43 | densityDissipation = OPTS.densityDissipation, 44 | velocityDissipation = OPTS.velocityDissipation, 45 | blendFunction = BlendFunction.NORMAL, 46 | }: Props) => { 47 | const size = useThree((three) => three.size); 48 | const gl = useThree((three) => three.gl); 49 | 50 | const bufferScene = useMemo(() => new Scene(), []); 51 | const bufferCamera = useMemo(() => new Camera(), []); 52 | 53 | const meshRef = useRef(null); 54 | const postRef = useRef(null); 55 | const pointerRef = useRef(new Vector2()); 56 | const colorRef = useRef(new Vector3()); 57 | 58 | const FBOs = useFBOs(); 59 | const materials = useMaterials(); 60 | const { onPointerMove, splatStack } = usePointer({ force }); 61 | 62 | const setShaderMaterial = useCallback( 63 | (name: keyof ReturnType) => { 64 | if (!meshRef.current) return; 65 | 66 | meshRef.current.material = materials[name]; 67 | meshRef.current.material.needsUpdate = true; 68 | }, 69 | [materials], 70 | ); 71 | 72 | const setRenderTarget = useCallback( 73 | (name: keyof ReturnType) => { 74 | const target = FBOs[name]; 75 | 76 | if ('write' in target) { 77 | gl.setRenderTarget(target.write); 78 | gl.clear(); 79 | gl.render(bufferScene, bufferCamera); 80 | target.swap(); 81 | } else { 82 | gl.setRenderTarget(target); 83 | gl.clear(); 84 | gl.render(bufferScene, bufferCamera); 85 | } 86 | }, 87 | [bufferCamera, bufferScene, FBOs, gl], 88 | ); 89 | 90 | const setUniforms = useCallback( 91 | ( 92 | material: keyof ReturnType, 93 | uniform: K, 94 | value: Uniforms[K], 95 | ) => { 96 | const mat = materials[material]; 97 | 98 | if (mat && mat.uniforms[uniform]) { 99 | mat.uniforms[uniform].value = value; 100 | } 101 | }, 102 | [materials], 103 | ); 104 | 105 | useFrame((_, delta) => { 106 | if (!meshRef.current || !postRef.current) return; 107 | 108 | for (let i = splatStack.length - 1; i >= 0; i--) { 109 | const { mouseX, mouseY, velocityX, velocityY } = splatStack[i]; 110 | 111 | pointerRef.current.set(mouseX, mouseY); 112 | colorRef.current.set(velocityX, velocityY, 10.0); 113 | 114 | setShaderMaterial('splat'); 115 | setUniforms('splat', 'uTarget', FBOs.velocity.read.texture); 116 | setUniforms('splat', 'uPointer', pointerRef.current); 117 | setUniforms('splat', 'uColor', colorRef.current); 118 | setUniforms('splat', 'uRadius', radius / 100.0); 119 | setRenderTarget('velocity'); 120 | setUniforms('splat', 'uTarget', FBOs.density.read.texture); 121 | setRenderTarget('density'); 122 | 123 | splatStack.pop(); 124 | } 125 | 126 | setShaderMaterial('curl'); 127 | setUniforms('curl', 'uVelocity', FBOs.velocity.read.texture); 128 | setRenderTarget('curl'); 129 | 130 | setShaderMaterial('vorticity'); 131 | setUniforms('vorticity', 'uVelocity', FBOs.velocity.read.texture); 132 | setUniforms('vorticity', 'uCurl', FBOs.curl.texture); 133 | setUniforms('vorticity', 'uCurlValue', curl); 134 | setRenderTarget('velocity'); 135 | 136 | setShaderMaterial('divergence'); 137 | setUniforms('divergence', 'uVelocity', FBOs.velocity.read.texture); 138 | setRenderTarget('divergence'); 139 | 140 | setShaderMaterial('clear'); 141 | setUniforms('clear', 'uTexture', FBOs.pressure.read.texture); 142 | setUniforms('clear', 'uClearValue', normalizeScreenHz(pressure, delta)); 143 | setRenderTarget('pressure'); 144 | 145 | setShaderMaterial('pressure'); 146 | setUniforms('pressure', 'uDivergence', FBOs.divergence.texture); 147 | 148 | for (let i = 0; i < swirl; i++) { 149 | setUniforms('pressure', 'uPressure', FBOs.pressure.read.texture); 150 | setRenderTarget('pressure'); 151 | } 152 | 153 | setShaderMaterial('gradientSubstract'); 154 | setUniforms('gradientSubstract', 'uPressure', FBOs.pressure.read.texture); 155 | setUniforms('gradientSubstract', 'uVelocity', FBOs.velocity.read.texture); 156 | setRenderTarget('velocity'); 157 | 158 | setShaderMaterial('advection'); 159 | setUniforms('advection', 'uVelocity', FBOs.velocity.read.texture); 160 | setUniforms('advection', 'uSource', FBOs.velocity.read.texture); 161 | setUniforms('advection', 'uDissipation', normalizeScreenHz(velocityDissipation, delta)); 162 | 163 | setRenderTarget('velocity'); 164 | setUniforms('advection', 'uVelocity', FBOs.velocity.read.texture); 165 | setUniforms('advection', 'uSource', FBOs.density.read.texture); 166 | setUniforms('advection', 'uDissipation', normalizeScreenHz(densityDissipation, delta)); 167 | 168 | setRenderTarget('density'); 169 | }); 170 | 171 | return ( 172 | <> 173 | {createPortal( 174 | 178 | 179 | , 180 | bufferScene, 181 | )} 182 | 183 | 195 | 196 | ); 197 | }; 198 | -------------------------------------------------------------------------------- /lib/constant.ts: -------------------------------------------------------------------------------- 1 | export const OPTS = { 2 | blend: 5, 3 | intensity: 2, 4 | force: 1.1, 5 | distortion: 0.4, 6 | curl: 1.9, 7 | radius: 0.3, 8 | swirl: 4, 9 | pressure: 0.8, 10 | densityDissipation: 0.96, 11 | velocityDissipation: 1.0, 12 | fluidColor: '#3300ff', 13 | backgroundColor: '#070410', 14 | showBackground: true, 15 | rainbow: false, 16 | dyeRes: 512, 17 | simRes: 128, 18 | refreshRate: 60, 19 | } as const; 20 | -------------------------------------------------------------------------------- /lib/effect/Fluid.tsx: -------------------------------------------------------------------------------- 1 | import { forwardRef, useEffect, useMemo } from 'react'; 2 | import { EffectProps } from '../types'; 3 | import { FluidEffect } from './FluidEffect'; 4 | 5 | export const Effect = forwardRef(function Fluid(props: EffectProps, ref) { 6 | // prevent re-creating the effect on every render 7 | // eslint-disable-next-line react-hooks/exhaustive-deps 8 | const effect = useMemo(() => new FluidEffect(props), []); 9 | 10 | useEffect(() => { 11 | effect.state = { ...props }; 12 | effect.update(); 13 | }, [effect, props]); 14 | 15 | useEffect(() => { 16 | return () => { 17 | effect.dispose?.(); 18 | }; 19 | }, [effect]); 20 | 21 | return ; 22 | }); 23 | -------------------------------------------------------------------------------- /lib/effect/FluidEffect.tsx: -------------------------------------------------------------------------------- 1 | import { Effect } from 'postprocessing'; 2 | import { Texture, Uniform, Vector3 } from 'three'; 3 | import { EffectProps } from '../types'; 4 | import { hexToRgb } from '../utils'; 5 | import compositeFrag from '../glsl/composite.frag'; 6 | 7 | type Uniforms = { 8 | tFluid: Texture | null; 9 | uColor: Vector3; 10 | uBackgroundColor: Vector3; 11 | uRainbow: boolean; 12 | uShowBackground: boolean; 13 | uDistort: number; 14 | uBlend: number; 15 | uIntensity: number; 16 | }; 17 | 18 | export class FluidEffect extends Effect { 19 | state: Partial; 20 | 21 | constructor(props: EffectProps = {}) { 22 | const uniforms: Record = { 23 | tFluid: new Uniform(props.tFluid), 24 | uDistort: new Uniform(props.distortion), 25 | uRainbow: new Uniform(props.rainbow), 26 | uIntensity: new Uniform(props.intensity), 27 | uBlend: new Uniform(props.blend), 28 | uShowBackground: new Uniform(props.showBackground), 29 | 30 | uColor: new Uniform(hexToRgb(props.fluidColor!)), 31 | uBackgroundColor: new Uniform(hexToRgb(props.backgroundColor!)), 32 | }; 33 | 34 | super('FluidEffect', compositeFrag, { 35 | blendFunction: props.blendFunction, 36 | uniforms: new Map(Object.entries(uniforms)), 37 | }); 38 | 39 | this.state = { 40 | ...props, 41 | }; 42 | } 43 | 44 | private updateUniform(key: K, value: Uniforms[K]) { 45 | const uniform = this.uniforms.get(key); 46 | if (uniform) { 47 | uniform.value = value; 48 | } 49 | } 50 | 51 | update() { 52 | this.updateUniform('uIntensity', this.state.intensity!); 53 | this.updateUniform('uDistort', this.state.distortion!); 54 | this.updateUniform('uRainbow', this.state.rainbow!); 55 | this.updateUniform('uBlend', this.state.blend!); 56 | this.updateUniform('uShowBackground', this.state.showBackground!); 57 | this.updateUniform('uColor', hexToRgb(this.state.fluidColor!)); 58 | this.updateUniform('uBackgroundColor', hexToRgb(this.state.backgroundColor!)); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/glsl.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.glsl' { 2 | const value: string; 3 | export default value; 4 | } 5 | 6 | declare module '*.vert' { 7 | const value: string; 8 | export default value; 9 | } 10 | 11 | declare module '*.frag' { 12 | const value: string; 13 | export default value; 14 | } 15 | -------------------------------------------------------------------------------- /lib/glsl/advection.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying vec2 vUv; 4 | uniform sampler2D uVelocity; 5 | uniform sampler2D uSource; 6 | uniform vec2 texelSize; 7 | uniform float dt; 8 | uniform float uDissipation; 9 | 10 | void main() { 11 | vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; 12 | 13 | gl_FragColor = uDissipation * texture2D(uSource, coord); 14 | 15 | gl_FragColor.a = 1.0; 16 | } -------------------------------------------------------------------------------- /lib/glsl/base.vert: -------------------------------------------------------------------------------- 1 | varying vec2 vUv; 2 | varying vec2 vL; 3 | varying vec2 vR; 4 | varying vec2 vT; 5 | varying vec2 vB; 6 | uniform vec2 texelSize; 7 | 8 | void main() { 9 | vUv = uv; 10 | 11 | vL = vUv - vec2(texelSize.x, 0.0); 12 | 13 | vR = vUv + vec2(texelSize.x, 0.0); 14 | 15 | vT = vUv + vec2(0.0, texelSize.y); 16 | 17 | vB = vUv - vec2(0.0, texelSize.y); 18 | 19 | gl_Position = vec4(position, 1.0); 20 | } 21 | -------------------------------------------------------------------------------- /lib/glsl/clear.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying vec2 vUv; 4 | uniform sampler2D uTexture; 5 | uniform float uClearValue; 6 | 7 | void main() { gl_FragColor = uClearValue * texture2D(uTexture, vUv); } 8 | -------------------------------------------------------------------------------- /lib/glsl/composite.frag: -------------------------------------------------------------------------------- 1 | uniform sampler2D tFluid; 2 | 3 | uniform vec3 uColor; 4 | uniform vec3 uBackgroundColor; 5 | 6 | uniform float uDistort; 7 | uniform float uIntensity; 8 | uniform float uRainbow; 9 | uniform float uBlend; 10 | uniform float uShowBackground; 11 | 12 | void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) { 13 | 14 | vec3 fluidColor = texture2D(tFluid, uv).rgb; 15 | 16 | vec2 distortedUv = uv - fluidColor.rg * uDistort * 0.001; 17 | 18 | vec4 texture = texture2D(inputBuffer, distortedUv); 19 | 20 | float intensity = length(fluidColor) * uIntensity * 0.0001; 21 | 22 | vec3 selectedColor = uColor * length(fluidColor); 23 | 24 | vec4 colorForFluidEffect = vec4(uRainbow == 1.0 ? fluidColor : selectedColor, 1.0); 25 | 26 | vec4 computedBgColor = vec4(uBackgroundColor, 1.); 27 | 28 | outputColor = mix(texture, colorForFluidEffect, intensity); 29 | 30 | vec4 computedFluidColor = mix(texture, colorForFluidEffect, uBlend * 0.01); 31 | 32 | vec4 finalColor; 33 | 34 | if(texture.a < 0.1) { 35 | finalColor = mix(computedBgColor, colorForFluidEffect, intensity); 36 | } else { 37 | finalColor = mix(computedFluidColor, computedBgColor, 1.0 - texture.a); 38 | } 39 | 40 | outputColor = finalColor; 41 | } 42 | -------------------------------------------------------------------------------- /lib/glsl/curl.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying vec2 vUv; 4 | varying vec2 vL; 5 | varying vec2 vR; 6 | varying vec2 vT; 7 | varying vec2 vB; 8 | 9 | uniform sampler2D uVelocity; 10 | 11 | void main() { 12 | float L = texture2D(uVelocity, vL).y; 13 | 14 | float R = texture2D(uVelocity, vR).y; 15 | 16 | float T = texture2D(uVelocity, vT).x; 17 | 18 | float B = texture2D(uVelocity, vB).x; 19 | 20 | float vorticity = R - L - T + B; 21 | 22 | gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); 23 | } -------------------------------------------------------------------------------- /lib/glsl/divergence.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying highp vec2 vUv; 4 | varying highp vec2 vL; 5 | varying highp vec2 vR; 6 | varying highp vec2 vT; 7 | varying highp vec2 vB; 8 | 9 | uniform sampler2D uVelocity; 10 | 11 | void main() { 12 | float L = texture2D(uVelocity, vL).x; 13 | 14 | float R = texture2D(uVelocity, vR).x; 15 | 16 | float T = texture2D(uVelocity, vT).y; 17 | 18 | float B = texture2D(uVelocity, vB).y; 19 | 20 | vec2 C = texture2D(uVelocity, vUv).xy; 21 | 22 | if(vL.x < 0.0) { 23 | L = -C.x; 24 | } 25 | 26 | if(vR.x > 1.0) { 27 | R = -C.x; 28 | } 29 | 30 | if(vT.y > 1.0) { 31 | T = -C.y; 32 | } 33 | 34 | if(vB.y < 0.0) { 35 | B = -C.y; 36 | } 37 | 38 | float div = 0.5 * (R - L + T - B); 39 | 40 | gl_FragColor = vec4(div, 0.0, 0.0, 1.0); 41 | } -------------------------------------------------------------------------------- /lib/glsl/gradientSubstract.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying highp vec2 vUv; 4 | varying highp vec2 vL; 5 | varying highp vec2 vR; 6 | varying highp vec2 vT; 7 | varying highp vec2 vB; 8 | 9 | uniform sampler2D uPressure; 10 | uniform sampler2D uVelocity; 11 | 12 | void main() { 13 | float L = texture2D(uPressure, vL).x; 14 | 15 | float R = texture2D(uPressure, vR).x; 16 | 17 | float T = texture2D(uPressure, vT).x; 18 | 19 | float B = texture2D(uPressure, vB).x; 20 | 21 | vec2 velocity = texture2D(uVelocity, vUv).xy; 22 | 23 | velocity.xy -= vec2(R - L, T - B); 24 | 25 | gl_FragColor = vec4(velocity, 0.0, 1.0); 26 | } -------------------------------------------------------------------------------- /lib/glsl/pressure.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying highp vec2 vUv; 4 | varying highp vec2 vL; 5 | varying highp vec2 vR; 6 | varying highp vec2 vT; 7 | varying highp vec2 vB; 8 | 9 | uniform sampler2D uPressure; 10 | uniform sampler2D uDivergence; 11 | 12 | void main() { 13 | float L = texture2D(uPressure, vL).x; 14 | 15 | float R = texture2D(uPressure, vR).x; 16 | 17 | float T = texture2D(uPressure, vT).x; 18 | 19 | float B = texture2D(uPressure, vB).x; 20 | 21 | float C = texture2D(uPressure, vUv).x; 22 | 23 | float divergence = texture2D(uDivergence, vUv).x; 24 | 25 | float pressure = (L + R + B + T - divergence) * 0.25; 26 | 27 | gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0); 28 | } 29 | -------------------------------------------------------------------------------- /lib/glsl/splat.frag: -------------------------------------------------------------------------------- 1 | varying vec2 vUv; 2 | 3 | uniform sampler2D uTarget; 4 | uniform float aspectRatio; 5 | uniform vec3 uColor; 6 | uniform vec2 uPointer; 7 | uniform float uRadius; 8 | 9 | void main() { 10 | vec2 p = vUv - uPointer.xy; 11 | 12 | p.x *= aspectRatio; 13 | 14 | vec3 splat = exp(-dot(p, p) / uRadius) * uColor; 15 | 16 | vec3 base = texture2D(uTarget, vUv).xyz; 17 | 18 | gl_FragColor = vec4(base + splat, 1.0); 19 | } 20 | -------------------------------------------------------------------------------- /lib/glsl/vorticity.frag: -------------------------------------------------------------------------------- 1 | precision highp float; 2 | 3 | varying vec2 vUv; 4 | varying vec2 vL; 5 | varying vec2 vR; 6 | varying vec2 vT; 7 | varying vec2 vB; 8 | 9 | uniform sampler2D uVelocity; 10 | uniform sampler2D uCurl; 11 | uniform float uCurlValue; 12 | uniform float dt; 13 | 14 | void main() { 15 | float L = texture2D(uCurl, vL).x; 16 | 17 | float R = texture2D(uCurl, vR).x; 18 | 19 | float T = texture2D(uCurl, vT).x; 20 | 21 | float B = texture2D(uCurl, vB).x; 22 | 23 | float C = texture2D(uCurl, vUv).x; 24 | 25 | vec2 force = vec2(abs(T) - abs(B), abs(R) - abs(L)) * 0.5; 26 | 27 | force /= length(force) + 1.; 28 | 29 | force *= uCurlValue * C; 30 | 31 | force.y *= -1.; 32 | 33 | vec2 vel = texture2D(uVelocity, vUv).xy; 34 | 35 | gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); 36 | } -------------------------------------------------------------------------------- /lib/hooks/useConfig.tsx: -------------------------------------------------------------------------------- 1 | import { useControls, button } from 'leva'; 2 | import { OPTS } from '../constant'; 3 | 4 | export const useConfig = () => { 5 | const handleReset = () => { 6 | return set( 7 | Object.fromEntries( 8 | Object.keys(params).map((key) => { 9 | return [key, OPTS[key as keyof typeof OPTS]]; 10 | }), 11 | ), 12 | ); 13 | }; 14 | 15 | const [params, set] = useControls('Settings', () => ({ 16 | intensity: { 17 | value: OPTS.intensity, 18 | min: 0.0, 19 | max: 10, 20 | step: 0.01, 21 | label: 'intensity', 22 | }, 23 | 24 | force: { 25 | value: OPTS.force, 26 | min: 0, 27 | max: 20, 28 | step: 0.1, 29 | label: 'force', 30 | }, 31 | 32 | distortion: { 33 | value: OPTS.distortion, 34 | min: 0, 35 | max: 2, 36 | step: 0.01, 37 | label: 'distortion', 38 | }, 39 | 40 | curl: { 41 | value: OPTS.curl, 42 | min: 0, 43 | max: 50, 44 | step: 0.1, 45 | label: 'curl', 46 | }, 47 | 48 | swirl: { 49 | value: OPTS.swirl, 50 | min: 0, 51 | max: 20, 52 | step: 1, 53 | label: 'swirl', 54 | }, 55 | 56 | fluidColor: { 57 | value: OPTS.fluidColor, 58 | label: 'fluid color', 59 | }, 60 | 61 | backgroundColor: { 62 | value: OPTS.backgroundColor, 63 | label: 'background color', 64 | }, 65 | 66 | blend: { 67 | value: OPTS.blend, 68 | min: 0.0, 69 | max: 10, 70 | step: 0.01, 71 | label: 'blend', 72 | }, 73 | 74 | showBackground: { 75 | value: OPTS.showBackground, 76 | label: 'show background', 77 | }, 78 | 79 | rainbow: { 80 | value: OPTS.rainbow, 81 | label: 'rainbow mode', 82 | }, 83 | 84 | pressure: { 85 | value: OPTS.pressure, 86 | min: 0, 87 | max: 1, 88 | step: 0.01, 89 | label: 'pressure reduction', 90 | }, 91 | 92 | densityDissipation: { 93 | value: OPTS.densityDissipation, 94 | min: 0, 95 | max: 1, 96 | step: 0.01, 97 | label: 'density dissipation', 98 | }, 99 | 100 | velocityDissipation: { 101 | value: OPTS.velocityDissipation, 102 | min: 0, 103 | max: 1, 104 | step: 0.01, 105 | label: 'velocity dissipation', 106 | }, 107 | 108 | radius: { 109 | value: OPTS.radius, 110 | min: 0.01, 111 | max: 1, 112 | step: 0.01, 113 | label: 'radius', 114 | }, 115 | 'reset settings': button(handleReset), 116 | })); 117 | 118 | return params; 119 | }; 120 | -------------------------------------------------------------------------------- /lib/hooks/useDoubleFBO.tsx: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | import { useFBO } from '@react-three/drei'; 3 | import { useRef } from 'react'; 4 | 5 | type FBO = { 6 | read: THREE.WebGLRenderTarget; 7 | write: THREE.WebGLRenderTarget; 8 | swap: () => void; 9 | dispose: () => void; 10 | setGenerateMipmaps: (value: boolean) => void; 11 | }; 12 | 13 | type Options = { 14 | minFilter?: THREE.TextureFilter; 15 | format?: THREE.PixelFormat; 16 | type?: THREE.TextureDataType; 17 | depth: boolean; 18 | }; 19 | 20 | export const useDoubleFBO = (width: number, height: number, options: Options) => { 21 | const read = useFBO(width, height, options); 22 | 23 | const write = useFBO(width, height, options); 24 | 25 | const fbo = useRef({ 26 | read, 27 | write, 28 | swap: () => { 29 | const temp = fbo.read; 30 | fbo.read = fbo.write; 31 | fbo.write = temp; 32 | }, 33 | dispose: () => { 34 | read.dispose(); 35 | write.dispose(); 36 | }, 37 | setGenerateMipmaps: (value: boolean) => { 38 | read.texture.generateMipmaps = value; 39 | write.texture.generateMipmaps = value; 40 | }, 41 | }).current; 42 | 43 | return fbo; 44 | }; 45 | -------------------------------------------------------------------------------- /lib/hooks/useFBOs.tsx: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | 3 | import { useFBO } from '@react-three/drei'; 4 | import { useEffect, useMemo } from 'react'; 5 | import { useDoubleFBO } from '../hooks/useDoubleFBO'; 6 | import { OPTS } from '../constant'; 7 | 8 | export const useFBOs = () => { 9 | const density = useDoubleFBO(OPTS.dyeRes, OPTS.dyeRes, { 10 | type: THREE.HalfFloatType, 11 | format: THREE.RGBAFormat, 12 | minFilter: THREE.LinearFilter, 13 | depth: false, 14 | }); 15 | 16 | const velocity = useDoubleFBO(OPTS.simRes, OPTS.simRes, { 17 | type: THREE.HalfFloatType, 18 | format: THREE.RGFormat, 19 | minFilter: THREE.LinearFilter, 20 | depth: false, 21 | }); 22 | 23 | const pressure = useDoubleFBO(OPTS.simRes, OPTS.simRes, { 24 | type: THREE.HalfFloatType, 25 | format: THREE.RedFormat, 26 | minFilter: THREE.NearestFilter, 27 | depth: false, 28 | }); 29 | 30 | const divergence = useFBO(OPTS.simRes, OPTS.simRes, { 31 | type: THREE.HalfFloatType, 32 | format: THREE.RedFormat, 33 | minFilter: THREE.NearestFilter, 34 | depth: false, 35 | }); 36 | 37 | const curl = useFBO(OPTS.simRes, OPTS.simRes, { 38 | type: THREE.HalfFloatType, 39 | format: THREE.RedFormat, 40 | minFilter: THREE.NearestFilter, 41 | depth: false, 42 | }); 43 | 44 | const FBOs = useMemo(() => { 45 | return { 46 | density, 47 | velocity, 48 | pressure, 49 | divergence, 50 | curl, 51 | }; 52 | }, [curl, density, divergence, pressure, velocity]); 53 | 54 | useEffect(() => { 55 | for (const FBO of Object.values(FBOs)) { 56 | if ('write' in FBO) { 57 | FBO.setGenerateMipmaps(false); 58 | } else { 59 | FBO.texture.generateMipmaps = false; 60 | } 61 | } 62 | 63 | return () => { 64 | for (const FBO of Object.values(FBOs)) { 65 | FBO.dispose(); 66 | } 67 | }; 68 | }, [FBOs]); 69 | 70 | return FBOs; 71 | }; 72 | -------------------------------------------------------------------------------- /lib/hooks/useMaterials.tsx: -------------------------------------------------------------------------------- 1 | import { ShaderMaterial, Texture, Vector2, Vector3 } from 'three'; 2 | import { useEffect, useMemo } from 'react'; 3 | import { useThree } from '@react-three/fiber'; 4 | import { OPTS } from '../constant'; 5 | 6 | import baseVertex from '../glsl/base.vert'; 7 | import clearFrag from '../glsl/clear.frag'; 8 | import curlFrag from '../glsl/curl.frag'; 9 | import divergenceFrag from '../glsl/divergence.frag'; 10 | import gradientSubstractFrag from '../glsl/gradientSubstract.frag'; 11 | import pressureFrag from '../glsl/pressure.frag'; 12 | import splatFrag from '../glsl/splat.frag'; 13 | import advectionFrag from '../glsl/advection.frag'; 14 | import vorticityFrag from '../glsl/vorticity.frag'; 15 | 16 | export const useMaterials = (): { [key: string]: ShaderMaterial } => { 17 | const size = useThree((s) => s.size); 18 | 19 | const shaderMaterials = useMemo(() => { 20 | const advection = new ShaderMaterial({ 21 | uniforms: { 22 | uVelocity: { 23 | value: new Texture(), 24 | }, 25 | uSource: { 26 | value: new Texture(), 27 | }, 28 | dt: { 29 | value: 1 / OPTS.refreshRate, 30 | }, 31 | uDissipation: { 32 | value: 1.0, 33 | }, 34 | texelSize: { value: new Vector2() }, 35 | }, 36 | fragmentShader: advectionFrag, 37 | vertexShader: baseVertex, 38 | depthTest: false, 39 | depthWrite: false, 40 | }); 41 | 42 | const clear = new ShaderMaterial({ 43 | uniforms: { 44 | uTexture: { 45 | value: new Texture(), 46 | }, 47 | uClearValue: { 48 | value: OPTS.pressure, 49 | }, 50 | texelSize: { 51 | value: new Vector2(), 52 | }, 53 | }, 54 | fragmentShader: clearFrag, 55 | vertexShader: baseVertex, 56 | depthTest: false, 57 | depthWrite: false, 58 | }); 59 | 60 | const curl = new ShaderMaterial({ 61 | uniforms: { 62 | uVelocity: { 63 | value: new Texture(), 64 | }, 65 | texelSize: { 66 | value: new Vector2(), 67 | }, 68 | }, 69 | fragmentShader: curlFrag, 70 | vertexShader: baseVertex, 71 | depthTest: false, 72 | depthWrite: false, 73 | }); 74 | 75 | const divergence = new ShaderMaterial({ 76 | uniforms: { 77 | uVelocity: { 78 | value: new Texture(), 79 | }, 80 | texelSize: { 81 | value: new Vector2(), 82 | }, 83 | }, 84 | fragmentShader: divergenceFrag, 85 | vertexShader: baseVertex, 86 | depthTest: false, 87 | depthWrite: false, 88 | }); 89 | 90 | const gradientSubstract = new ShaderMaterial({ 91 | uniforms: { 92 | uPressure: { 93 | value: new Texture(), 94 | }, 95 | uVelocity: { 96 | value: new Texture(), 97 | }, 98 | texelSize: { 99 | value: new Vector2(), 100 | }, 101 | }, 102 | fragmentShader: gradientSubstractFrag, 103 | vertexShader: baseVertex, 104 | depthTest: false, 105 | depthWrite: false, 106 | }); 107 | 108 | const pressure = new ShaderMaterial({ 109 | uniforms: { 110 | uPressure: { 111 | value: new Texture(), 112 | }, 113 | uDivergence: { 114 | value: new Texture(), 115 | }, 116 | texelSize: { 117 | value: new Vector2(), 118 | }, 119 | }, 120 | fragmentShader: pressureFrag, 121 | vertexShader: baseVertex, 122 | depthTest: false, 123 | depthWrite: false, 124 | }); 125 | 126 | const splat = new ShaderMaterial({ 127 | uniforms: { 128 | uTarget: { 129 | value: new Texture(), 130 | }, 131 | aspectRatio: { 132 | value: size.width / size.height, 133 | }, 134 | uColor: { 135 | value: new Vector3(), 136 | }, 137 | uPointer: { 138 | value: new Vector2(), 139 | }, 140 | uRadius: { 141 | value: OPTS.radius / 100.0, 142 | }, 143 | texelSize: { 144 | value: new Vector2(), 145 | }, 146 | }, 147 | fragmentShader: splatFrag, 148 | vertexShader: baseVertex, 149 | depthTest: false, 150 | depthWrite: false, 151 | }); 152 | 153 | const vorticity = new ShaderMaterial({ 154 | uniforms: { 155 | uVelocity: { 156 | value: new Texture(), 157 | }, 158 | uCurl: { 159 | value: new Texture(), 160 | }, 161 | uCurlValue: { 162 | value: OPTS.curl, 163 | }, 164 | dt: { 165 | value: 1 / OPTS.refreshRate, 166 | }, 167 | texelSize: { 168 | value: new Vector2(), 169 | }, 170 | }, 171 | fragmentShader: vorticityFrag, 172 | vertexShader: baseVertex, 173 | depthTest: false, 174 | depthWrite: false, 175 | }); 176 | 177 | return { 178 | splat, 179 | curl, 180 | clear, 181 | divergence, 182 | pressure, 183 | gradientSubstract, 184 | advection, 185 | vorticity, 186 | }; 187 | }, [size]); 188 | 189 | useEffect(() => { 190 | for (const material of Object.values(shaderMaterials)) { 191 | const aspectRatio = size.width / (size.height + 400); 192 | material.uniforms.texelSize.value.set(1 / (OPTS.simRes * aspectRatio), 1 / OPTS.simRes); 193 | } 194 | 195 | return () => { 196 | for (const material of Object.values(shaderMaterials)) { 197 | material.dispose(); 198 | } 199 | }; 200 | }, [shaderMaterials, size]); 201 | 202 | return shaderMaterials; 203 | }; 204 | -------------------------------------------------------------------------------- /lib/hooks/usePointer.tsx: -------------------------------------------------------------------------------- 1 | import { ThreeEvent, useThree } from '@react-three/fiber'; 2 | import { useCallback, useRef } from 'react'; 3 | import { Vector2 } from 'three'; 4 | 5 | type SplatStack = { 6 | mouseX: number; 7 | mouseY: number; 8 | velocityX: number; 9 | velocityY: number; 10 | }; 11 | 12 | export const usePointer = ({ force }: { force: number }) => { 13 | const size = useThree((three) => three.size); 14 | 15 | const splatStack: SplatStack[] = useRef([]).current; 16 | 17 | const lastMouse = useRef(new Vector2()); 18 | const hasMoved = useRef(false); 19 | 20 | const onPointerMove = useCallback( 21 | (event: ThreeEvent) => { 22 | const deltaX = event.x - lastMouse.current.x; 23 | const deltaY = event.y - lastMouse.current.y; 24 | 25 | if (!hasMoved.current) { 26 | hasMoved.current = true; 27 | lastMouse.current.set(event.x, event.y); 28 | return; 29 | } 30 | 31 | lastMouse.current.set(event.x, event.y); 32 | 33 | splatStack.push({ 34 | mouseX: event.x / size.width, 35 | mouseY: 1.0 - event.y / size.height, 36 | velocityX: deltaX * force, 37 | velocityY: -deltaY * force, 38 | }); 39 | }, 40 | [force, size.height, size.width, splatStack], 41 | ); 42 | 43 | return { onPointerMove, splatStack }; 44 | }; 45 | -------------------------------------------------------------------------------- /lib/index.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | export type { Props } from './types'; 4 | 5 | export { Fluid } from './Fluid'; 6 | export { useConfig } from './hooks/useConfig'; 7 | -------------------------------------------------------------------------------- /lib/types.ts: -------------------------------------------------------------------------------- 1 | import { BlendFunction } from 'postprocessing'; 2 | import { Texture } from 'three'; 3 | 4 | export type SharedProps = { 5 | blend?: number; 6 | intensity?: number; 7 | distortion?: number; 8 | rainbow?: boolean; 9 | fluidColor?: string; 10 | backgroundColor?: string; 11 | showBackground?: boolean; 12 | blendFunction?: BlendFunction; 13 | }; 14 | 15 | export type Props = SharedProps & { 16 | densityDissipation?: number; 17 | pressure?: number; 18 | velocityDissipation?: number; 19 | force?: number; 20 | radius?: number; 21 | curl?: number; 22 | swirl?: number; 23 | }; 24 | 25 | export type EffectProps = SharedProps & { 26 | tFluid?: Texture; 27 | }; 28 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { Color, Vector3 } from 'three'; 2 | import { OPTS } from './constant'; 3 | 4 | export const hexToRgb = (hex: string) => { 5 | const color = new Color(hex); 6 | 7 | return new Vector3(color.r, color.g, color.b); 8 | }; 9 | 10 | export const normalizeScreenHz = (value: number, dt: number) => { 11 | return Math.pow(value, dt * OPTS.refreshRate); 12 | }; 13 | -------------------------------------------------------------------------------- /lib/utils/colors.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | 3 | export const hexToRgb = (hex: string) => { 4 | const color = new THREE.Color(hex); 5 | 6 | return new THREE.Vector3(color.r, color.g, color.b); 7 | }; 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@whatisjery/react-fluid-distortion", 3 | "description": "A react-three-fiber component for creating fluid distortion effects", 4 | "author": "Jeremie Nallet", 5 | "private": false, 6 | "version": "1.4.4", 7 | "type": "module", 8 | "main": "dist/index.umd.js", 9 | "module": "dist/index.es.js", 10 | "types": "dist/lib/index.d.ts", 11 | ".": { 12 | "import": "./dist/index.es.js", 13 | "require": "./dist/index.umd.js" 14 | }, 15 | "scripts": { 16 | "dev": "vite", 17 | "build": "tsc && vite build", 18 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 19 | "preview": "vite preview" 20 | }, 21 | "license": "MIT", 22 | "peerDependencies": { 23 | "@react-three/fiber": "*", 24 | "@react-three/postprocessing": "*", 25 | "postprocessing": "*", 26 | "leva": "*", 27 | "react": "*", 28 | "react-dom": "*", 29 | "three": "*" 30 | }, 31 | "devDependencies": { 32 | "@react-three/drei": "^10.0.1", 33 | "@react-three/fiber": "^9.0.4", 34 | "@react-three/postprocessing": "^3.0.4", 35 | "@types/node": "^22.13.5", 36 | "@types/react": "^19.0.10", 37 | "@types/react-dom": "^19.0.4", 38 | "@types/three": "^0.173.0", 39 | "@typescript-eslint/eslint-plugin": "^8.24.1", 40 | "@typescript-eslint/parser": "^8.24.1", 41 | "@vitejs/plugin-react": "^4.3.4", 42 | "clang-format": "^1.8.0", 43 | "eslint": "^9.21.0", 44 | "eslint-plugin-react-hooks": "^5.1.0", 45 | "eslint-plugin-react-refresh": "^0.4.19", 46 | "leva": "^0.10.0", 47 | "postprocessing": "6.36.7", 48 | "react": "^19.0.0", 49 | "react-dom": "^19.0.0", 50 | "react-router-dom": "^7.2.0", 51 | "three": "^0.173.0", 52 | "tunnel-rat": "^0.1.2", 53 | "typescript": "^5.7.3", 54 | "vite": "^6.1.1", 55 | "vite-plugin-dts": "^4.5.0", 56 | "vite-plugin-glsl": "^1.3.1", 57 | "vite-tsconfig-paths": "^5.1.4" 58 | }, 59 | "files": [ 60 | "dist", 61 | "lib" 62 | ], 63 | "publishConfig": { 64 | "access": "public" 65 | }, 66 | "include": [ 67 | "lib" 68 | ], 69 | "keywords": [ 70 | "react", 71 | "fluid", 72 | "react three fiber", 73 | "webgl", 74 | "postprocessing", 75 | "three js", 76 | "hover effect", 77 | "shaders", 78 | "glsl" 79 | ], 80 | "bugs": { 81 | "url": "https://github.com/whatisjery/react-fluid-distortion/issues" 82 | }, 83 | "repository": { 84 | "type": "git", 85 | "url": "git+https://github.com/whatisjery/react-fluid-distortion" 86 | }, 87 | "homepage": "https://github.com/whatisjery/react-fluid-distortion#readme" 88 | } 89 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@react-three/drei': 12 | specifier: ^10.0.1 13 | version: 10.0.6(@react-three/fiber@9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0))(@types/react@19.1.2)(@types/three@0.173.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0) 14 | '@react-three/fiber': 15 | specifier: ^9.0.4 16 | version: 9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0) 17 | '@react-three/postprocessing': 18 | specifier: ^3.0.4 19 | version: 3.0.4(@react-three/fiber@9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0))(@types/three@0.173.0)(react@19.1.0)(three@0.173.0) 20 | '@types/node': 21 | specifier: ^22.13.5 22 | version: 22.14.1 23 | '@types/react': 24 | specifier: ^19.0.10 25 | version: 19.1.2 26 | '@types/react-dom': 27 | specifier: ^19.0.4 28 | version: 19.1.2(@types/react@19.1.2) 29 | '@types/three': 30 | specifier: ^0.173.0 31 | version: 0.173.0 32 | '@typescript-eslint/eslint-plugin': 33 | specifier: ^8.24.1 34 | version: 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) 35 | '@typescript-eslint/parser': 36 | specifier: ^8.24.1 37 | version: 8.30.1(eslint@9.24.0)(typescript@5.8.3) 38 | '@vitejs/plugin-react': 39 | specifier: ^4.3.4 40 | version: 4.4.0(vite@6.2.6(@types/node@22.14.1)) 41 | clang-format: 42 | specifier: ^1.8.0 43 | version: 1.8.0 44 | eslint: 45 | specifier: ^9.21.0 46 | version: 9.24.0 47 | eslint-plugin-react-hooks: 48 | specifier: ^5.1.0 49 | version: 5.2.0(eslint@9.24.0) 50 | eslint-plugin-react-refresh: 51 | specifier: ^0.4.19 52 | version: 0.4.19(eslint@9.24.0) 53 | leva: 54 | specifier: ^0.10.0 55 | version: 0.10.0(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 56 | postprocessing: 57 | specifier: 6.36.7 58 | version: 6.36.7(three@0.173.0) 59 | react: 60 | specifier: ^19.0.0 61 | version: 19.1.0 62 | react-dom: 63 | specifier: ^19.0.0 64 | version: 19.1.0(react@19.1.0) 65 | react-router-dom: 66 | specifier: ^7.2.0 67 | version: 7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 68 | three: 69 | specifier: ^0.173.0 70 | version: 0.173.0 71 | tunnel-rat: 72 | specifier: ^0.1.2 73 | version: 0.1.2(@types/react@19.1.2)(react@19.1.0) 74 | typescript: 75 | specifier: ^5.7.3 76 | version: 5.8.3 77 | vite: 78 | specifier: ^6.1.1 79 | version: 6.2.6(@types/node@22.14.1) 80 | vite-plugin-dts: 81 | specifier: ^4.5.0 82 | version: 4.5.3(@types/node@22.14.1)(rollup@4.40.0)(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)) 83 | vite-plugin-glsl: 84 | specifier: ^1.3.1 85 | version: 1.4.0(rollup@4.40.0)(vite@6.2.6(@types/node@22.14.1)) 86 | vite-tsconfig-paths: 87 | specifier: ^5.1.4 88 | version: 5.1.4(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)) 89 | 90 | packages: 91 | 92 | '@ampproject/remapping@2.3.0': 93 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 94 | engines: {node: '>=6.0.0'} 95 | 96 | '@babel/code-frame@7.26.2': 97 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 98 | engines: {node: '>=6.9.0'} 99 | 100 | '@babel/compat-data@7.26.8': 101 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 102 | engines: {node: '>=6.9.0'} 103 | 104 | '@babel/core@7.26.10': 105 | resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} 106 | engines: {node: '>=6.9.0'} 107 | 108 | '@babel/generator@7.27.0': 109 | resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} 110 | engines: {node: '>=6.9.0'} 111 | 112 | '@babel/helper-compilation-targets@7.27.0': 113 | resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} 114 | engines: {node: '>=6.9.0'} 115 | 116 | '@babel/helper-module-imports@7.25.9': 117 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 118 | engines: {node: '>=6.9.0'} 119 | 120 | '@babel/helper-module-transforms@7.26.0': 121 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 122 | engines: {node: '>=6.9.0'} 123 | peerDependencies: 124 | '@babel/core': ^7.0.0 125 | 126 | '@babel/helper-plugin-utils@7.26.5': 127 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 128 | engines: {node: '>=6.9.0'} 129 | 130 | '@babel/helper-string-parser@7.25.9': 131 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 132 | engines: {node: '>=6.9.0'} 133 | 134 | '@babel/helper-validator-identifier@7.25.9': 135 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 136 | engines: {node: '>=6.9.0'} 137 | 138 | '@babel/helper-validator-option@7.25.9': 139 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 140 | engines: {node: '>=6.9.0'} 141 | 142 | '@babel/helpers@7.27.0': 143 | resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} 144 | engines: {node: '>=6.9.0'} 145 | 146 | '@babel/parser@7.27.0': 147 | resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} 148 | engines: {node: '>=6.0.0'} 149 | hasBin: true 150 | 151 | '@babel/plugin-transform-react-jsx-self@7.25.9': 152 | resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} 153 | engines: {node: '>=6.9.0'} 154 | peerDependencies: 155 | '@babel/core': ^7.0.0-0 156 | 157 | '@babel/plugin-transform-react-jsx-source@7.25.9': 158 | resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} 159 | engines: {node: '>=6.9.0'} 160 | peerDependencies: 161 | '@babel/core': ^7.0.0-0 162 | 163 | '@babel/runtime@7.27.0': 164 | resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} 165 | engines: {node: '>=6.9.0'} 166 | 167 | '@babel/template@7.27.0': 168 | resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} 169 | engines: {node: '>=6.9.0'} 170 | 171 | '@babel/traverse@7.27.0': 172 | resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} 173 | engines: {node: '>=6.9.0'} 174 | 175 | '@babel/types@7.27.0': 176 | resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} 177 | engines: {node: '>=6.9.0'} 178 | 179 | '@esbuild/aix-ppc64@0.25.2': 180 | resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} 181 | engines: {node: '>=18'} 182 | cpu: [ppc64] 183 | os: [aix] 184 | 185 | '@esbuild/android-arm64@0.25.2': 186 | resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} 187 | engines: {node: '>=18'} 188 | cpu: [arm64] 189 | os: [android] 190 | 191 | '@esbuild/android-arm@0.25.2': 192 | resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} 193 | engines: {node: '>=18'} 194 | cpu: [arm] 195 | os: [android] 196 | 197 | '@esbuild/android-x64@0.25.2': 198 | resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} 199 | engines: {node: '>=18'} 200 | cpu: [x64] 201 | os: [android] 202 | 203 | '@esbuild/darwin-arm64@0.25.2': 204 | resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} 205 | engines: {node: '>=18'} 206 | cpu: [arm64] 207 | os: [darwin] 208 | 209 | '@esbuild/darwin-x64@0.25.2': 210 | resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} 211 | engines: {node: '>=18'} 212 | cpu: [x64] 213 | os: [darwin] 214 | 215 | '@esbuild/freebsd-arm64@0.25.2': 216 | resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} 217 | engines: {node: '>=18'} 218 | cpu: [arm64] 219 | os: [freebsd] 220 | 221 | '@esbuild/freebsd-x64@0.25.2': 222 | resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} 223 | engines: {node: '>=18'} 224 | cpu: [x64] 225 | os: [freebsd] 226 | 227 | '@esbuild/linux-arm64@0.25.2': 228 | resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} 229 | engines: {node: '>=18'} 230 | cpu: [arm64] 231 | os: [linux] 232 | 233 | '@esbuild/linux-arm@0.25.2': 234 | resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} 235 | engines: {node: '>=18'} 236 | cpu: [arm] 237 | os: [linux] 238 | 239 | '@esbuild/linux-ia32@0.25.2': 240 | resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} 241 | engines: {node: '>=18'} 242 | cpu: [ia32] 243 | os: [linux] 244 | 245 | '@esbuild/linux-loong64@0.25.2': 246 | resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} 247 | engines: {node: '>=18'} 248 | cpu: [loong64] 249 | os: [linux] 250 | 251 | '@esbuild/linux-mips64el@0.25.2': 252 | resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} 253 | engines: {node: '>=18'} 254 | cpu: [mips64el] 255 | os: [linux] 256 | 257 | '@esbuild/linux-ppc64@0.25.2': 258 | resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} 259 | engines: {node: '>=18'} 260 | cpu: [ppc64] 261 | os: [linux] 262 | 263 | '@esbuild/linux-riscv64@0.25.2': 264 | resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} 265 | engines: {node: '>=18'} 266 | cpu: [riscv64] 267 | os: [linux] 268 | 269 | '@esbuild/linux-s390x@0.25.2': 270 | resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} 271 | engines: {node: '>=18'} 272 | cpu: [s390x] 273 | os: [linux] 274 | 275 | '@esbuild/linux-x64@0.25.2': 276 | resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} 277 | engines: {node: '>=18'} 278 | cpu: [x64] 279 | os: [linux] 280 | 281 | '@esbuild/netbsd-arm64@0.25.2': 282 | resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} 283 | engines: {node: '>=18'} 284 | cpu: [arm64] 285 | os: [netbsd] 286 | 287 | '@esbuild/netbsd-x64@0.25.2': 288 | resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} 289 | engines: {node: '>=18'} 290 | cpu: [x64] 291 | os: [netbsd] 292 | 293 | '@esbuild/openbsd-arm64@0.25.2': 294 | resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} 295 | engines: {node: '>=18'} 296 | cpu: [arm64] 297 | os: [openbsd] 298 | 299 | '@esbuild/openbsd-x64@0.25.2': 300 | resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} 301 | engines: {node: '>=18'} 302 | cpu: [x64] 303 | os: [openbsd] 304 | 305 | '@esbuild/sunos-x64@0.25.2': 306 | resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} 307 | engines: {node: '>=18'} 308 | cpu: [x64] 309 | os: [sunos] 310 | 311 | '@esbuild/win32-arm64@0.25.2': 312 | resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} 313 | engines: {node: '>=18'} 314 | cpu: [arm64] 315 | os: [win32] 316 | 317 | '@esbuild/win32-ia32@0.25.2': 318 | resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} 319 | engines: {node: '>=18'} 320 | cpu: [ia32] 321 | os: [win32] 322 | 323 | '@esbuild/win32-x64@0.25.2': 324 | resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} 325 | engines: {node: '>=18'} 326 | cpu: [x64] 327 | os: [win32] 328 | 329 | '@eslint-community/eslint-utils@4.6.0': 330 | resolution: {integrity: sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==} 331 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 332 | peerDependencies: 333 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 334 | 335 | '@eslint-community/regexpp@4.12.1': 336 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 337 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 338 | 339 | '@eslint/config-array@0.20.0': 340 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 341 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 342 | 343 | '@eslint/config-helpers@0.2.1': 344 | resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} 345 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 346 | 347 | '@eslint/core@0.12.0': 348 | resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} 349 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 350 | 351 | '@eslint/core@0.13.0': 352 | resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} 353 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 354 | 355 | '@eslint/eslintrc@3.3.1': 356 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 357 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 358 | 359 | '@eslint/js@9.24.0': 360 | resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} 361 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 362 | 363 | '@eslint/object-schema@2.1.6': 364 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 365 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 366 | 367 | '@eslint/plugin-kit@0.2.8': 368 | resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} 369 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 370 | 371 | '@floating-ui/core@0.7.3': 372 | resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} 373 | 374 | '@floating-ui/dom@0.5.4': 375 | resolution: {integrity: sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==} 376 | 377 | '@floating-ui/react-dom@0.7.2': 378 | resolution: {integrity: sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==} 379 | peerDependencies: 380 | react: '>=16.8.0' 381 | react-dom: '>=16.8.0' 382 | 383 | '@humanfs/core@0.19.1': 384 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 385 | engines: {node: '>=18.18.0'} 386 | 387 | '@humanfs/node@0.16.6': 388 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 389 | engines: {node: '>=18.18.0'} 390 | 391 | '@humanwhocodes/module-importer@1.0.1': 392 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 393 | engines: {node: '>=12.22'} 394 | 395 | '@humanwhocodes/retry@0.3.1': 396 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 397 | engines: {node: '>=18.18'} 398 | 399 | '@humanwhocodes/retry@0.4.2': 400 | resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 401 | engines: {node: '>=18.18'} 402 | 403 | '@jridgewell/gen-mapping@0.3.8': 404 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 405 | engines: {node: '>=6.0.0'} 406 | 407 | '@jridgewell/resolve-uri@3.1.2': 408 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 409 | engines: {node: '>=6.0.0'} 410 | 411 | '@jridgewell/set-array@1.2.1': 412 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 413 | engines: {node: '>=6.0.0'} 414 | 415 | '@jridgewell/sourcemap-codec@1.5.0': 416 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 417 | 418 | '@jridgewell/trace-mapping@0.3.25': 419 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 420 | 421 | '@mediapipe/tasks-vision@0.10.17': 422 | resolution: {integrity: sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==} 423 | 424 | '@microsoft/api-extractor-model@7.30.5': 425 | resolution: {integrity: sha512-0ic4rcbcDZHz833RaTZWTGu+NpNgrxVNjVaor0ZDUymfDFzjA/Uuk8hYziIUIOEOSTfmIQqyzVwlzxZxPe7tOA==} 426 | 427 | '@microsoft/api-extractor@7.52.3': 428 | resolution: {integrity: sha512-QEs6l8h7p9eOSHrQ9NBBUZhUuq+j/2QKcRgigbSs2YQepKz8glvsqmsUOp+nvuaY60ps7KkpVVYQCj81WLoMVQ==} 429 | hasBin: true 430 | 431 | '@microsoft/tsdoc-config@0.17.1': 432 | resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} 433 | 434 | '@microsoft/tsdoc@0.15.1': 435 | resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} 436 | 437 | '@monogrid/gainmap-js@3.1.0': 438 | resolution: {integrity: sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw==} 439 | peerDependencies: 440 | three: '>= 0.159.0' 441 | 442 | '@nodelib/fs.scandir@2.1.5': 443 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 444 | engines: {node: '>= 8'} 445 | 446 | '@nodelib/fs.stat@2.0.5': 447 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 448 | engines: {node: '>= 8'} 449 | 450 | '@nodelib/fs.walk@1.2.8': 451 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 452 | engines: {node: '>= 8'} 453 | 454 | '@radix-ui/primitive@1.0.0': 455 | resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} 456 | 457 | '@radix-ui/react-arrow@1.0.2': 458 | resolution: {integrity: sha512-fqYwhhI9IarZ0ll2cUSfKuXHlJK0qE4AfnRrPBbRwEH/4mGQn04/QFGomLi8TXWIdv9WJk//KgGm+aDxVIr1wA==} 459 | peerDependencies: 460 | react: ^16.8 || ^17.0 || ^18.0 461 | react-dom: ^16.8 || ^17.0 || ^18.0 462 | 463 | '@radix-ui/react-compose-refs@1.0.0': 464 | resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} 465 | peerDependencies: 466 | react: ^16.8 || ^17.0 || ^18.0 467 | 468 | '@radix-ui/react-context@1.0.0': 469 | resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} 470 | peerDependencies: 471 | react: ^16.8 || ^17.0 || ^18.0 472 | 473 | '@radix-ui/react-dismissable-layer@1.0.3': 474 | resolution: {integrity: sha512-nXZOvFjOuHS1ovumntGV7NNoLaEp9JEvTht3MBjP44NSW5hUKj/8OnfN3+8WmB+CEhN44XaGhpHoSsUIEl5P7Q==} 475 | peerDependencies: 476 | react: ^16.8 || ^17.0 || ^18.0 477 | react-dom: ^16.8 || ^17.0 || ^18.0 478 | 479 | '@radix-ui/react-id@1.0.0': 480 | resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} 481 | peerDependencies: 482 | react: ^16.8 || ^17.0 || ^18.0 483 | 484 | '@radix-ui/react-popper@1.1.1': 485 | resolution: {integrity: sha512-keYDcdMPNMjSC8zTsZ8wezUMiWM9Yj14wtF3s0PTIs9srnEPC9Kt2Gny1T3T81mmSeyDjZxsD9N5WCwNNb712w==} 486 | peerDependencies: 487 | react: ^16.8 || ^17.0 || ^18.0 488 | react-dom: ^16.8 || ^17.0 || ^18.0 489 | 490 | '@radix-ui/react-portal@1.0.2': 491 | resolution: {integrity: sha512-swu32idoCW7KA2VEiUZGBSu9nB6qwGdV6k6HYhUoOo3M1FFpD+VgLzUqtt3mwL1ssz7r2x8MggpLSQach2Xy/Q==} 492 | peerDependencies: 493 | react: ^16.8 || ^17.0 || ^18.0 494 | react-dom: ^16.8 || ^17.0 || ^18.0 495 | 496 | '@radix-ui/react-presence@1.0.0': 497 | resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} 498 | peerDependencies: 499 | react: ^16.8 || ^17.0 || ^18.0 500 | react-dom: ^16.8 || ^17.0 || ^18.0 501 | 502 | '@radix-ui/react-primitive@1.0.2': 503 | resolution: {integrity: sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw==} 504 | peerDependencies: 505 | react: ^16.8 || ^17.0 || ^18.0 506 | react-dom: ^16.8 || ^17.0 || ^18.0 507 | 508 | '@radix-ui/react-slot@1.0.1': 509 | resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==} 510 | peerDependencies: 511 | react: ^16.8 || ^17.0 || ^18.0 512 | 513 | '@radix-ui/react-tooltip@1.0.5': 514 | resolution: {integrity: sha512-cDKVcfzyO6PpckZekODJZDe5ZxZ2fCZlzKzTmPhe4mX9qTHRfLcKgqb0OKf22xLwDequ2tVleim+ZYx3rabD5w==} 515 | peerDependencies: 516 | react: ^16.8 || ^17.0 || ^18.0 517 | react-dom: ^16.8 || ^17.0 || ^18.0 518 | 519 | '@radix-ui/react-use-callback-ref@1.0.0': 520 | resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} 521 | peerDependencies: 522 | react: ^16.8 || ^17.0 || ^18.0 523 | 524 | '@radix-ui/react-use-controllable-state@1.0.0': 525 | resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} 526 | peerDependencies: 527 | react: ^16.8 || ^17.0 || ^18.0 528 | 529 | '@radix-ui/react-use-escape-keydown@1.0.2': 530 | resolution: {integrity: sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==} 531 | peerDependencies: 532 | react: ^16.8 || ^17.0 || ^18.0 533 | 534 | '@radix-ui/react-use-layout-effect@1.0.0': 535 | resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} 536 | peerDependencies: 537 | react: ^16.8 || ^17.0 || ^18.0 538 | 539 | '@radix-ui/react-use-rect@1.0.0': 540 | resolution: {integrity: sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==} 541 | peerDependencies: 542 | react: ^16.8 || ^17.0 || ^18.0 543 | 544 | '@radix-ui/react-use-size@1.0.0': 545 | resolution: {integrity: sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==} 546 | peerDependencies: 547 | react: ^16.8 || ^17.0 || ^18.0 548 | 549 | '@radix-ui/react-visually-hidden@1.0.2': 550 | resolution: {integrity: sha512-qirnJxtYn73HEk1rXL12/mXnu2rwsNHDID10th2JGtdK25T9wX+mxRmGt7iPSahw512GbZOc0syZX1nLQGoEOg==} 551 | peerDependencies: 552 | react: ^16.8 || ^17.0 || ^18.0 553 | react-dom: ^16.8 || ^17.0 || ^18.0 554 | 555 | '@radix-ui/rect@1.0.0': 556 | resolution: {integrity: sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==} 557 | 558 | '@react-three/drei@10.0.6': 559 | resolution: {integrity: sha512-QtiAv/a1BaP+ZYfp8BphV8BMSO0O1BNhIPye3Zqm5iDqgX6JeiknPR6f2UmzUdBfPLwjZEaqjfULgJFvTUWgkg==} 560 | peerDependencies: 561 | '@react-three/fiber': ^9.0.0 562 | react: ^19 563 | react-dom: ^19 564 | three: '>=0.159' 565 | peerDependenciesMeta: 566 | react-dom: 567 | optional: true 568 | 569 | '@react-three/fiber@9.1.2': 570 | resolution: {integrity: sha512-k8FR9yVHV9kIF3iuOD0ds5hVymXYXfgdKklqziBVod9ZEJ8uk05Zjw29J/omU3IKeUfLNAIHfxneN3TUYM4I2w==} 571 | peerDependencies: 572 | expo: '>=43.0' 573 | expo-asset: '>=8.4' 574 | expo-file-system: '>=11.0' 575 | expo-gl: '>=11.0' 576 | react: ^19.0.0 577 | react-dom: ^19.0.0 578 | react-native: '>=0.78' 579 | three: '>=0.156' 580 | peerDependenciesMeta: 581 | expo: 582 | optional: true 583 | expo-asset: 584 | optional: true 585 | expo-file-system: 586 | optional: true 587 | expo-gl: 588 | optional: true 589 | react-dom: 590 | optional: true 591 | react-native: 592 | optional: true 593 | 594 | '@react-three/postprocessing@3.0.4': 595 | resolution: {integrity: sha512-e4+F5xtudDYvhxx3y0NtWXpZbwvQ0x1zdOXWTbXMK6fFLVDd4qucN90YaaStanZGS4Bd5siQm0lGL/5ogf8iDQ==} 596 | peerDependencies: 597 | '@react-three/fiber': ^9.0.0 598 | react: ^19.0 599 | three: '>= 0.156.0' 600 | 601 | '@rollup/pluginutils@5.1.4': 602 | resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 603 | engines: {node: '>=14.0.0'} 604 | peerDependencies: 605 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 606 | peerDependenciesMeta: 607 | rollup: 608 | optional: true 609 | 610 | '@rollup/rollup-android-arm-eabi@4.40.0': 611 | resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} 612 | cpu: [arm] 613 | os: [android] 614 | 615 | '@rollup/rollup-android-arm64@4.40.0': 616 | resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} 617 | cpu: [arm64] 618 | os: [android] 619 | 620 | '@rollup/rollup-darwin-arm64@4.40.0': 621 | resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} 622 | cpu: [arm64] 623 | os: [darwin] 624 | 625 | '@rollup/rollup-darwin-x64@4.40.0': 626 | resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} 627 | cpu: [x64] 628 | os: [darwin] 629 | 630 | '@rollup/rollup-freebsd-arm64@4.40.0': 631 | resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} 632 | cpu: [arm64] 633 | os: [freebsd] 634 | 635 | '@rollup/rollup-freebsd-x64@4.40.0': 636 | resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} 637 | cpu: [x64] 638 | os: [freebsd] 639 | 640 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0': 641 | resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} 642 | cpu: [arm] 643 | os: [linux] 644 | 645 | '@rollup/rollup-linux-arm-musleabihf@4.40.0': 646 | resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} 647 | cpu: [arm] 648 | os: [linux] 649 | 650 | '@rollup/rollup-linux-arm64-gnu@4.40.0': 651 | resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} 652 | cpu: [arm64] 653 | os: [linux] 654 | 655 | '@rollup/rollup-linux-arm64-musl@4.40.0': 656 | resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} 657 | cpu: [arm64] 658 | os: [linux] 659 | 660 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0': 661 | resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} 662 | cpu: [loong64] 663 | os: [linux] 664 | 665 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': 666 | resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} 667 | cpu: [ppc64] 668 | os: [linux] 669 | 670 | '@rollup/rollup-linux-riscv64-gnu@4.40.0': 671 | resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} 672 | cpu: [riscv64] 673 | os: [linux] 674 | 675 | '@rollup/rollup-linux-riscv64-musl@4.40.0': 676 | resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} 677 | cpu: [riscv64] 678 | os: [linux] 679 | 680 | '@rollup/rollup-linux-s390x-gnu@4.40.0': 681 | resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} 682 | cpu: [s390x] 683 | os: [linux] 684 | 685 | '@rollup/rollup-linux-x64-gnu@4.40.0': 686 | resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} 687 | cpu: [x64] 688 | os: [linux] 689 | 690 | '@rollup/rollup-linux-x64-musl@4.40.0': 691 | resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} 692 | cpu: [x64] 693 | os: [linux] 694 | 695 | '@rollup/rollup-win32-arm64-msvc@4.40.0': 696 | resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} 697 | cpu: [arm64] 698 | os: [win32] 699 | 700 | '@rollup/rollup-win32-ia32-msvc@4.40.0': 701 | resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} 702 | cpu: [ia32] 703 | os: [win32] 704 | 705 | '@rollup/rollup-win32-x64-msvc@4.40.0': 706 | resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} 707 | cpu: [x64] 708 | os: [win32] 709 | 710 | '@rushstack/node-core-library@5.13.0': 711 | resolution: {integrity: sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==} 712 | peerDependencies: 713 | '@types/node': '*' 714 | peerDependenciesMeta: 715 | '@types/node': 716 | optional: true 717 | 718 | '@rushstack/rig-package@0.5.3': 719 | resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} 720 | 721 | '@rushstack/terminal@0.15.2': 722 | resolution: {integrity: sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==} 723 | peerDependencies: 724 | '@types/node': '*' 725 | peerDependenciesMeta: 726 | '@types/node': 727 | optional: true 728 | 729 | '@rushstack/ts-command-line@4.23.7': 730 | resolution: {integrity: sha512-Gr9cB7DGe6uz5vq2wdr89WbVDKz0UeuFEn5H2CfWDe7JvjFFaiV15gi6mqDBTbHhHCWS7w8mF1h3BnIfUndqdA==} 731 | 732 | '@stitches/react@1.2.8': 733 | resolution: {integrity: sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==} 734 | peerDependencies: 735 | react: '>= 16.3.0' 736 | 737 | '@tweenjs/tween.js@23.1.3': 738 | resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} 739 | 740 | '@types/argparse@1.0.38': 741 | resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} 742 | 743 | '@types/babel__core@7.20.5': 744 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 745 | 746 | '@types/babel__generator@7.27.0': 747 | resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 748 | 749 | '@types/babel__template@7.4.4': 750 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 751 | 752 | '@types/babel__traverse@7.20.7': 753 | resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 754 | 755 | '@types/cookie@0.6.0': 756 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 757 | 758 | '@types/draco3d@1.4.10': 759 | resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} 760 | 761 | '@types/estree@1.0.7': 762 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 763 | 764 | '@types/json-schema@7.0.15': 765 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 766 | 767 | '@types/node@22.14.1': 768 | resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} 769 | 770 | '@types/offscreencanvas@2019.7.3': 771 | resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} 772 | 773 | '@types/react-dom@19.1.2': 774 | resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} 775 | peerDependencies: 776 | '@types/react': ^19.0.0 777 | 778 | '@types/react-reconciler@0.28.9': 779 | resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} 780 | peerDependencies: 781 | '@types/react': '*' 782 | 783 | '@types/react@19.1.2': 784 | resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} 785 | 786 | '@types/stats.js@0.17.3': 787 | resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==} 788 | 789 | '@types/three@0.173.0': 790 | resolution: {integrity: sha512-KtNjfI/CRB6JVKIVeZM1R3GYDX2wkoV2itNcQu2j4d7qkhjGOuB+s2oF6jl9mztycDLGMtrAnJQYxInC8Bb20A==} 791 | 792 | '@types/webxr@0.5.22': 793 | resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} 794 | 795 | '@typescript-eslint/eslint-plugin@8.30.1': 796 | resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} 797 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 798 | peerDependencies: 799 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 800 | eslint: ^8.57.0 || ^9.0.0 801 | typescript: '>=4.8.4 <5.9.0' 802 | 803 | '@typescript-eslint/parser@8.30.1': 804 | resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} 805 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 806 | peerDependencies: 807 | eslint: ^8.57.0 || ^9.0.0 808 | typescript: '>=4.8.4 <5.9.0' 809 | 810 | '@typescript-eslint/scope-manager@8.30.1': 811 | resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} 812 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 813 | 814 | '@typescript-eslint/type-utils@8.30.1': 815 | resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} 816 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 817 | peerDependencies: 818 | eslint: ^8.57.0 || ^9.0.0 819 | typescript: '>=4.8.4 <5.9.0' 820 | 821 | '@typescript-eslint/types@8.30.1': 822 | resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} 823 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 824 | 825 | '@typescript-eslint/typescript-estree@8.30.1': 826 | resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} 827 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 828 | peerDependencies: 829 | typescript: '>=4.8.4 <5.9.0' 830 | 831 | '@typescript-eslint/utils@8.30.1': 832 | resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} 833 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 834 | peerDependencies: 835 | eslint: ^8.57.0 || ^9.0.0 836 | typescript: '>=4.8.4 <5.9.0' 837 | 838 | '@typescript-eslint/visitor-keys@8.30.1': 839 | resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} 840 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 841 | 842 | '@use-gesture/core@10.3.1': 843 | resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} 844 | 845 | '@use-gesture/react@10.3.1': 846 | resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} 847 | peerDependencies: 848 | react: '>= 16.8.0' 849 | 850 | '@vitejs/plugin-react@4.4.0': 851 | resolution: {integrity: sha512-x/EztcTKVj+TDeANY1WjNeYsvZjZdfWRMP/KXi5Yn8BoTzpa13ZltaQqKfvWYbX8CE10GOHHdC5v86jY9x8i/g==} 852 | engines: {node: ^14.18.0 || >=16.0.0} 853 | peerDependencies: 854 | vite: ^4.2.0 || ^5.0.0 || ^6.0.0 855 | 856 | '@volar/language-core@2.4.12': 857 | resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} 858 | 859 | '@volar/source-map@2.4.12': 860 | resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} 861 | 862 | '@volar/typescript@2.4.12': 863 | resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} 864 | 865 | '@vue/compiler-core@3.5.13': 866 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 867 | 868 | '@vue/compiler-dom@3.5.13': 869 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 870 | 871 | '@vue/compiler-vue2@2.7.16': 872 | resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} 873 | 874 | '@vue/language-core@2.2.0': 875 | resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} 876 | peerDependencies: 877 | typescript: '*' 878 | peerDependenciesMeta: 879 | typescript: 880 | optional: true 881 | 882 | '@vue/shared@3.5.13': 883 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 884 | 885 | '@webgpu/types@0.1.60': 886 | resolution: {integrity: sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==} 887 | 888 | acorn-jsx@5.3.2: 889 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 890 | peerDependencies: 891 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 892 | 893 | acorn@8.14.1: 894 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 895 | engines: {node: '>=0.4.0'} 896 | hasBin: true 897 | 898 | ajv-draft-04@1.0.0: 899 | resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} 900 | peerDependencies: 901 | ajv: ^8.5.0 902 | peerDependenciesMeta: 903 | ajv: 904 | optional: true 905 | 906 | ajv-formats@3.0.1: 907 | resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} 908 | peerDependencies: 909 | ajv: ^8.0.0 910 | peerDependenciesMeta: 911 | ajv: 912 | optional: true 913 | 914 | ajv@6.12.6: 915 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 916 | 917 | ajv@8.12.0: 918 | resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} 919 | 920 | ajv@8.13.0: 921 | resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} 922 | 923 | alien-signals@0.4.14: 924 | resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} 925 | 926 | ansi-styles@4.3.0: 927 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 928 | engines: {node: '>=8'} 929 | 930 | argparse@1.0.10: 931 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 932 | 933 | argparse@2.0.1: 934 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 935 | 936 | assign-symbols@1.0.0: 937 | resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} 938 | engines: {node: '>=0.10.0'} 939 | 940 | async@3.2.6: 941 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 942 | 943 | attr-accept@2.2.5: 944 | resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} 945 | engines: {node: '>=4'} 946 | 947 | balanced-match@1.0.2: 948 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 949 | 950 | base64-js@1.5.1: 951 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 952 | 953 | bidi-js@1.0.3: 954 | resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} 955 | 956 | brace-expansion@1.1.11: 957 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 958 | 959 | brace-expansion@2.0.1: 960 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 961 | 962 | braces@3.0.3: 963 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 964 | engines: {node: '>=8'} 965 | 966 | browserslist@4.24.4: 967 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 968 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 969 | hasBin: true 970 | 971 | buffer@6.0.3: 972 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 973 | 974 | callsites@3.1.0: 975 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 976 | engines: {node: '>=6'} 977 | 978 | camera-controls@2.10.1: 979 | resolution: {integrity: sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==} 980 | peerDependencies: 981 | three: '>=0.126.1' 982 | 983 | caniuse-lite@1.0.30001713: 984 | resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} 985 | 986 | chalk@4.1.2: 987 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 988 | engines: {node: '>=10'} 989 | 990 | clang-format@1.8.0: 991 | resolution: {integrity: sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw==} 992 | hasBin: true 993 | 994 | color-convert@2.0.1: 995 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 996 | engines: {node: '>=7.0.0'} 997 | 998 | color-name@1.1.4: 999 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1000 | 1001 | colord@2.9.3: 1002 | resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} 1003 | 1004 | compare-versions@6.1.1: 1005 | resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} 1006 | 1007 | concat-map@0.0.1: 1008 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1009 | 1010 | confbox@0.1.8: 1011 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 1012 | 1013 | confbox@0.2.2: 1014 | resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} 1015 | 1016 | convert-source-map@2.0.0: 1017 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1018 | 1019 | cookie@1.0.2: 1020 | resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} 1021 | engines: {node: '>=18'} 1022 | 1023 | cross-env@7.0.3: 1024 | resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} 1025 | engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} 1026 | hasBin: true 1027 | 1028 | cross-spawn@7.0.6: 1029 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1030 | engines: {node: '>= 8'} 1031 | 1032 | csstype@3.1.3: 1033 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1034 | 1035 | de-indent@1.0.2: 1036 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 1037 | 1038 | debug@4.4.0: 1039 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 1040 | engines: {node: '>=6.0'} 1041 | peerDependencies: 1042 | supports-color: '*' 1043 | peerDependenciesMeta: 1044 | supports-color: 1045 | optional: true 1046 | 1047 | deep-is@0.1.4: 1048 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1049 | 1050 | dequal@2.0.3: 1051 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1052 | engines: {node: '>=6'} 1053 | 1054 | detect-gpu@5.0.70: 1055 | resolution: {integrity: sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==} 1056 | 1057 | draco3d@1.5.7: 1058 | resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} 1059 | 1060 | electron-to-chromium@1.5.137: 1061 | resolution: {integrity: sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==} 1062 | 1063 | entities@4.5.0: 1064 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1065 | engines: {node: '>=0.12'} 1066 | 1067 | esbuild@0.25.2: 1068 | resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} 1069 | engines: {node: '>=18'} 1070 | hasBin: true 1071 | 1072 | escalade@3.2.0: 1073 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1074 | engines: {node: '>=6'} 1075 | 1076 | escape-string-regexp@4.0.0: 1077 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1078 | engines: {node: '>=10'} 1079 | 1080 | eslint-plugin-react-hooks@5.2.0: 1081 | resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} 1082 | engines: {node: '>=10'} 1083 | peerDependencies: 1084 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 1085 | 1086 | eslint-plugin-react-refresh@0.4.19: 1087 | resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} 1088 | peerDependencies: 1089 | eslint: '>=8.40' 1090 | 1091 | eslint-scope@8.3.0: 1092 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 1093 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1094 | 1095 | eslint-visitor-keys@3.4.3: 1096 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1097 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1098 | 1099 | eslint-visitor-keys@4.2.0: 1100 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 1101 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1102 | 1103 | eslint@9.24.0: 1104 | resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} 1105 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1106 | hasBin: true 1107 | peerDependencies: 1108 | jiti: '*' 1109 | peerDependenciesMeta: 1110 | jiti: 1111 | optional: true 1112 | 1113 | espree@10.3.0: 1114 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 1115 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1116 | 1117 | esquery@1.6.0: 1118 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 1119 | engines: {node: '>=0.10'} 1120 | 1121 | esrecurse@4.3.0: 1122 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1123 | engines: {node: '>=4.0'} 1124 | 1125 | estraverse@5.3.0: 1126 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1127 | engines: {node: '>=4.0'} 1128 | 1129 | estree-walker@2.0.2: 1130 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1131 | 1132 | esutils@2.0.3: 1133 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1134 | engines: {node: '>=0.10.0'} 1135 | 1136 | exsolve@1.0.4: 1137 | resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} 1138 | 1139 | extend-shallow@2.0.1: 1140 | resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} 1141 | engines: {node: '>=0.10.0'} 1142 | 1143 | extend-shallow@3.0.2: 1144 | resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} 1145 | engines: {node: '>=0.10.0'} 1146 | 1147 | fast-deep-equal@3.1.3: 1148 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1149 | 1150 | fast-glob@3.3.3: 1151 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 1152 | engines: {node: '>=8.6.0'} 1153 | 1154 | fast-json-stable-stringify@2.1.0: 1155 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1156 | 1157 | fast-levenshtein@2.0.6: 1158 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1159 | 1160 | fastq@1.19.1: 1161 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1162 | 1163 | fflate@0.6.10: 1164 | resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} 1165 | 1166 | fflate@0.8.2: 1167 | resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} 1168 | 1169 | file-entry-cache@8.0.0: 1170 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1171 | engines: {node: '>=16.0.0'} 1172 | 1173 | file-selector@0.5.0: 1174 | resolution: {integrity: sha512-s8KNnmIDTBoD0p9uJ9uD0XY38SCeBOtj0UMXyQSLg1Ypfrfj8+dAvwsLjYQkQ2GjhVtp2HrnF5cJzMhBjfD8HA==} 1175 | engines: {node: '>= 10'} 1176 | 1177 | fill-range@7.1.1: 1178 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1179 | engines: {node: '>=8'} 1180 | 1181 | find-up@5.0.0: 1182 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1183 | engines: {node: '>=10'} 1184 | 1185 | flat-cache@4.0.1: 1186 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1187 | engines: {node: '>=16'} 1188 | 1189 | flatted@3.3.3: 1190 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1191 | 1192 | for-in@1.0.2: 1193 | resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} 1194 | engines: {node: '>=0.10.0'} 1195 | 1196 | fs-extra@11.3.0: 1197 | resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} 1198 | engines: {node: '>=14.14'} 1199 | 1200 | fs.realpath@1.0.0: 1201 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1202 | 1203 | fsevents@2.3.3: 1204 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1205 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1206 | os: [darwin] 1207 | 1208 | function-bind@1.1.2: 1209 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1210 | 1211 | gensync@1.0.0-beta.2: 1212 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1213 | engines: {node: '>=6.9.0'} 1214 | 1215 | get-value@2.0.6: 1216 | resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} 1217 | engines: {node: '>=0.10.0'} 1218 | 1219 | glob-parent@5.1.2: 1220 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1221 | engines: {node: '>= 6'} 1222 | 1223 | glob-parent@6.0.2: 1224 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1225 | engines: {node: '>=10.13.0'} 1226 | 1227 | glob@7.2.3: 1228 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1229 | deprecated: Glob versions prior to v9 are no longer supported 1230 | 1231 | globals@11.12.0: 1232 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1233 | engines: {node: '>=4'} 1234 | 1235 | globals@14.0.0: 1236 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1237 | engines: {node: '>=18'} 1238 | 1239 | globrex@0.1.2: 1240 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1241 | 1242 | glsl-noise@0.0.0: 1243 | resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} 1244 | 1245 | graceful-fs@4.2.11: 1246 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1247 | 1248 | graphemer@1.4.0: 1249 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1250 | 1251 | has-flag@4.0.0: 1252 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1253 | engines: {node: '>=8'} 1254 | 1255 | hasown@2.0.2: 1256 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1257 | engines: {node: '>= 0.4'} 1258 | 1259 | he@1.2.0: 1260 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 1261 | hasBin: true 1262 | 1263 | hls.js@1.6.2: 1264 | resolution: {integrity: sha512-rx+pETSCJEDThm/JCm8CuadcAC410cVjb1XVXFNDKFuylaayHk1+tFxhkjvnMDAfqsJHxZXDAJ3Uc2d5xQyWlQ==} 1265 | 1266 | ieee754@1.2.1: 1267 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1268 | 1269 | ignore@5.3.2: 1270 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1271 | engines: {node: '>= 4'} 1272 | 1273 | immediate@3.0.6: 1274 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} 1275 | 1276 | import-fresh@3.3.1: 1277 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1278 | engines: {node: '>=6'} 1279 | 1280 | import-lazy@4.0.0: 1281 | resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} 1282 | engines: {node: '>=8'} 1283 | 1284 | imurmurhash@0.1.4: 1285 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1286 | engines: {node: '>=0.8.19'} 1287 | 1288 | inflight@1.0.6: 1289 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1290 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 1291 | 1292 | inherits@2.0.4: 1293 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1294 | 1295 | is-core-module@2.16.1: 1296 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1297 | engines: {node: '>= 0.4'} 1298 | 1299 | is-extendable@0.1.1: 1300 | resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} 1301 | engines: {node: '>=0.10.0'} 1302 | 1303 | is-extendable@1.0.1: 1304 | resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} 1305 | engines: {node: '>=0.10.0'} 1306 | 1307 | is-extglob@2.1.1: 1308 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1309 | engines: {node: '>=0.10.0'} 1310 | 1311 | is-glob@4.0.3: 1312 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1313 | engines: {node: '>=0.10.0'} 1314 | 1315 | is-number@7.0.0: 1316 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1317 | engines: {node: '>=0.12.0'} 1318 | 1319 | is-plain-object@2.0.4: 1320 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 1321 | engines: {node: '>=0.10.0'} 1322 | 1323 | is-promise@2.2.2: 1324 | resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} 1325 | 1326 | isexe@2.0.0: 1327 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1328 | 1329 | isobject@3.0.1: 1330 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 1331 | engines: {node: '>=0.10.0'} 1332 | 1333 | its-fine@2.0.0: 1334 | resolution: {integrity: sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==} 1335 | peerDependencies: 1336 | react: ^19.0.0 1337 | 1338 | jju@1.4.0: 1339 | resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} 1340 | 1341 | js-tokens@4.0.0: 1342 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1343 | 1344 | js-yaml@4.1.0: 1345 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1346 | hasBin: true 1347 | 1348 | jsesc@3.1.0: 1349 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1350 | engines: {node: '>=6'} 1351 | hasBin: true 1352 | 1353 | json-buffer@3.0.1: 1354 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1355 | 1356 | json-schema-traverse@0.4.1: 1357 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1358 | 1359 | json-schema-traverse@1.0.0: 1360 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1361 | 1362 | json-stable-stringify-without-jsonify@1.0.1: 1363 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1364 | 1365 | json5@2.2.3: 1366 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1367 | engines: {node: '>=6'} 1368 | hasBin: true 1369 | 1370 | jsonfile@6.1.0: 1371 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1372 | 1373 | keyv@4.5.4: 1374 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1375 | 1376 | kolorist@1.8.0: 1377 | resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1378 | 1379 | leva@0.10.0: 1380 | resolution: {integrity: sha512-RiNJWmeqQdKIeHuVXgshmxIHu144a2AMYtLxKf8Nm1j93pisDPexuQDHKNdQlbo37wdyDQibLjY9JKGIiD7gaw==} 1381 | peerDependencies: 1382 | react: ^18.0.0 || ^19.0.0 1383 | react-dom: ^18.0.0 || ^19.0.0 1384 | 1385 | levn@0.4.1: 1386 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1387 | engines: {node: '>= 0.8.0'} 1388 | 1389 | lie@3.3.0: 1390 | resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} 1391 | 1392 | local-pkg@1.1.1: 1393 | resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} 1394 | engines: {node: '>=14'} 1395 | 1396 | locate-path@6.0.0: 1397 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1398 | engines: {node: '>=10'} 1399 | 1400 | lodash.merge@4.6.2: 1401 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1402 | 1403 | lodash@4.17.21: 1404 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1405 | 1406 | loose-envify@1.4.0: 1407 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1408 | hasBin: true 1409 | 1410 | lru-cache@5.1.1: 1411 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1412 | 1413 | lru-cache@6.0.0: 1414 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1415 | engines: {node: '>=10'} 1416 | 1417 | maath@0.10.8: 1418 | resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==} 1419 | peerDependencies: 1420 | '@types/three': '>=0.134.0' 1421 | three: '>=0.134.0' 1422 | 1423 | maath@0.6.0: 1424 | resolution: {integrity: sha512-dSb2xQuP7vDnaYqfoKzlApeRcR2xtN8/f7WV/TMAkBC8552TwTLtOO0JTcSygkYMjNDPoo6V01jTw/aPi4JrMw==} 1425 | peerDependencies: 1426 | '@types/three': '>=0.144.0' 1427 | three: '>=0.144.0' 1428 | 1429 | magic-string@0.30.17: 1430 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1431 | 1432 | merge-value@1.0.0: 1433 | resolution: {integrity: sha512-fJMmvat4NeKz63Uv9iHWcPDjCWcCkoiRoajRTEO8hlhUC6rwaHg0QCF9hBOTjZmm4JuglPckPSTtcuJL5kp0TQ==} 1434 | engines: {node: '>=0.10.0'} 1435 | 1436 | merge2@1.4.1: 1437 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1438 | engines: {node: '>= 8'} 1439 | 1440 | meshline@3.3.1: 1441 | resolution: {integrity: sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==} 1442 | peerDependencies: 1443 | three: '>=0.137' 1444 | 1445 | meshoptimizer@0.18.1: 1446 | resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} 1447 | 1448 | micromatch@4.0.8: 1449 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1450 | engines: {node: '>=8.6'} 1451 | 1452 | minimatch@3.0.8: 1453 | resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} 1454 | 1455 | minimatch@3.1.2: 1456 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1457 | 1458 | minimatch@9.0.5: 1459 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1460 | engines: {node: '>=16 || 14 >=14.17'} 1461 | 1462 | mixin-deep@1.3.2: 1463 | resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} 1464 | engines: {node: '>=0.10.0'} 1465 | 1466 | mlly@1.7.4: 1467 | resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} 1468 | 1469 | ms@2.1.3: 1470 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1471 | 1472 | muggle-string@0.4.1: 1473 | resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 1474 | 1475 | n8ao@1.9.4: 1476 | resolution: {integrity: sha512-gbpAorQecZn2oGK/rheHxPTNwOxVsEC6216+Jr9tXHUk9L5VCE2q/uxsSrQpfNkZDoCmQHf7oSg3SYFWCAt0wg==} 1477 | peerDependencies: 1478 | postprocessing: '>=6.30.0' 1479 | three: '>=0.137' 1480 | 1481 | nanoid@3.3.11: 1482 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1483 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1484 | hasBin: true 1485 | 1486 | natural-compare@1.4.0: 1487 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1488 | 1489 | node-releases@2.0.19: 1490 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1491 | 1492 | object-assign@4.1.1: 1493 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1494 | engines: {node: '>=0.10.0'} 1495 | 1496 | once@1.4.0: 1497 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1498 | 1499 | optionator@0.9.4: 1500 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1501 | engines: {node: '>= 0.8.0'} 1502 | 1503 | p-limit@3.1.0: 1504 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1505 | engines: {node: '>=10'} 1506 | 1507 | p-locate@5.0.0: 1508 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1509 | engines: {node: '>=10'} 1510 | 1511 | parent-module@1.0.1: 1512 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1513 | engines: {node: '>=6'} 1514 | 1515 | path-browserify@1.0.1: 1516 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1517 | 1518 | path-exists@4.0.0: 1519 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1520 | engines: {node: '>=8'} 1521 | 1522 | path-is-absolute@1.0.1: 1523 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1524 | engines: {node: '>=0.10.0'} 1525 | 1526 | path-key@3.1.1: 1527 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1528 | engines: {node: '>=8'} 1529 | 1530 | path-parse@1.0.7: 1531 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1532 | 1533 | pathe@2.0.3: 1534 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1535 | 1536 | picocolors@1.1.1: 1537 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1538 | 1539 | picomatch@2.3.1: 1540 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1541 | engines: {node: '>=8.6'} 1542 | 1543 | picomatch@4.0.2: 1544 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1545 | engines: {node: '>=12'} 1546 | 1547 | pkg-types@1.3.1: 1548 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1549 | 1550 | pkg-types@2.1.0: 1551 | resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} 1552 | 1553 | postcss@8.5.3: 1554 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1555 | engines: {node: ^10 || ^12 || >=14} 1556 | 1557 | postprocessing@6.36.7: 1558 | resolution: {integrity: sha512-X6B3xt9dy4Osv19kqnVGqV01I2Tm7VwV6rLegRIZkZJPH3ozKLypHSBK1xKx7P/Ols++OkXe6L8dBGTaDUL5aw==} 1559 | peerDependencies: 1560 | three: '>= 0.157.0 < 0.174.0' 1561 | 1562 | potpack@1.0.2: 1563 | resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} 1564 | 1565 | prelude-ls@1.2.1: 1566 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1567 | engines: {node: '>= 0.8.0'} 1568 | 1569 | promise-worker-transferable@1.0.4: 1570 | resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} 1571 | 1572 | prop-types@15.8.1: 1573 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1574 | 1575 | punycode@2.3.1: 1576 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1577 | engines: {node: '>=6'} 1578 | 1579 | quansync@0.2.10: 1580 | resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} 1581 | 1582 | queue-microtask@1.2.3: 1583 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1584 | 1585 | react-colorful@5.6.1: 1586 | resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} 1587 | peerDependencies: 1588 | react: '>=16.8.0' 1589 | react-dom: '>=16.8.0' 1590 | 1591 | react-dom@19.1.0: 1592 | resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} 1593 | peerDependencies: 1594 | react: ^19.1.0 1595 | 1596 | react-dropzone@12.1.0: 1597 | resolution: {integrity: sha512-iBYHA1rbopIvtzokEX4QubO6qk5IF/x3BtKGu74rF2JkQDXnwC4uO/lHKpaw4PJIV6iIAYOlwLv2FpiGyqHNog==} 1598 | engines: {node: '>= 10.13'} 1599 | peerDependencies: 1600 | react: '>= 16.8' 1601 | 1602 | react-is@16.13.1: 1603 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1604 | 1605 | react-reconciler@0.31.0: 1606 | resolution: {integrity: sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==} 1607 | engines: {node: '>=0.10.0'} 1608 | peerDependencies: 1609 | react: ^19.0.0 1610 | 1611 | react-refresh@0.17.0: 1612 | resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} 1613 | engines: {node: '>=0.10.0'} 1614 | 1615 | react-router-dom@7.5.0: 1616 | resolution: {integrity: sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==} 1617 | engines: {node: '>=20.0.0'} 1618 | peerDependencies: 1619 | react: '>=18' 1620 | react-dom: '>=18' 1621 | 1622 | react-router@7.5.0: 1623 | resolution: {integrity: sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==} 1624 | engines: {node: '>=20.0.0'} 1625 | peerDependencies: 1626 | react: '>=18' 1627 | react-dom: '>=18' 1628 | peerDependenciesMeta: 1629 | react-dom: 1630 | optional: true 1631 | 1632 | react-use-measure@2.1.7: 1633 | resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} 1634 | peerDependencies: 1635 | react: '>=16.13' 1636 | react-dom: '>=16.13' 1637 | peerDependenciesMeta: 1638 | react-dom: 1639 | optional: true 1640 | 1641 | react@19.1.0: 1642 | resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} 1643 | engines: {node: '>=0.10.0'} 1644 | 1645 | regenerator-runtime@0.14.1: 1646 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1647 | 1648 | require-from-string@2.0.2: 1649 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1650 | engines: {node: '>=0.10.0'} 1651 | 1652 | resolve-from@4.0.0: 1653 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1654 | engines: {node: '>=4'} 1655 | 1656 | resolve@1.22.10: 1657 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1658 | engines: {node: '>= 0.4'} 1659 | hasBin: true 1660 | 1661 | reusify@1.1.0: 1662 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1663 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1664 | 1665 | rollup@4.40.0: 1666 | resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} 1667 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1668 | hasBin: true 1669 | 1670 | run-parallel@1.2.0: 1671 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1672 | 1673 | scheduler@0.25.0: 1674 | resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} 1675 | 1676 | scheduler@0.26.0: 1677 | resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} 1678 | 1679 | semver@6.3.1: 1680 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1681 | hasBin: true 1682 | 1683 | semver@7.5.4: 1684 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1685 | engines: {node: '>=10'} 1686 | hasBin: true 1687 | 1688 | semver@7.7.1: 1689 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1690 | engines: {node: '>=10'} 1691 | hasBin: true 1692 | 1693 | set-cookie-parser@2.7.1: 1694 | resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} 1695 | 1696 | set-value@2.0.1: 1697 | resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} 1698 | engines: {node: '>=0.10.0'} 1699 | 1700 | shebang-command@2.0.0: 1701 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1702 | engines: {node: '>=8'} 1703 | 1704 | shebang-regex@3.0.0: 1705 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1706 | engines: {node: '>=8'} 1707 | 1708 | source-map-js@1.2.1: 1709 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1710 | engines: {node: '>=0.10.0'} 1711 | 1712 | source-map@0.6.1: 1713 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1714 | engines: {node: '>=0.10.0'} 1715 | 1716 | split-string@3.1.0: 1717 | resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} 1718 | engines: {node: '>=0.10.0'} 1719 | 1720 | sprintf-js@1.0.3: 1721 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1722 | 1723 | stats-gl@2.4.2: 1724 | resolution: {integrity: sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==} 1725 | peerDependencies: 1726 | '@types/three': '*' 1727 | three: '*' 1728 | 1729 | stats.js@0.17.0: 1730 | resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} 1731 | 1732 | string-argv@0.3.2: 1733 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 1734 | engines: {node: '>=0.6.19'} 1735 | 1736 | strip-json-comments@3.1.1: 1737 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1738 | engines: {node: '>=8'} 1739 | 1740 | supports-color@7.2.0: 1741 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1742 | engines: {node: '>=8'} 1743 | 1744 | supports-color@8.1.1: 1745 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1746 | engines: {node: '>=10'} 1747 | 1748 | supports-preserve-symlinks-flag@1.0.0: 1749 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1750 | engines: {node: '>= 0.4'} 1751 | 1752 | suspend-react@0.1.3: 1753 | resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} 1754 | peerDependencies: 1755 | react: '>=17.0' 1756 | 1757 | three-mesh-bvh@0.8.3: 1758 | resolution: {integrity: sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==} 1759 | peerDependencies: 1760 | three: '>= 0.159.0' 1761 | 1762 | three-stdlib@2.35.15: 1763 | resolution: {integrity: sha512-2XbhiOV7jVCchUoWxTmsj5dNhTe8eYb58Nyrfoa2F2yL+6h/+2VRaU2gENljRW1d/P1mk4/uwNzbdkKWV3hwzw==} 1764 | peerDependencies: 1765 | three: '>=0.128.0' 1766 | 1767 | three@0.173.0: 1768 | resolution: {integrity: sha512-AUwVmViIEUgBwxJJ7stnF0NkPpZxx1aZ6WiAbQ/Qq61h6I9UR4grXtZDmO8mnlaNORhHnIBlXJ1uBxILEKuVyw==} 1769 | 1770 | to-regex-range@5.0.1: 1771 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1772 | engines: {node: '>=8.0'} 1773 | 1774 | troika-three-text@0.52.4: 1775 | resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} 1776 | peerDependencies: 1777 | three: '>=0.125.0' 1778 | 1779 | troika-three-utils@0.52.4: 1780 | resolution: {integrity: sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==} 1781 | peerDependencies: 1782 | three: '>=0.125.0' 1783 | 1784 | troika-worker-utils@0.52.0: 1785 | resolution: {integrity: sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==} 1786 | 1787 | ts-api-utils@2.1.0: 1788 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1789 | engines: {node: '>=18.12'} 1790 | peerDependencies: 1791 | typescript: '>=4.8.4' 1792 | 1793 | tsconfck@3.1.5: 1794 | resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} 1795 | engines: {node: ^18 || >=20} 1796 | hasBin: true 1797 | peerDependencies: 1798 | typescript: ^5.0.0 1799 | peerDependenciesMeta: 1800 | typescript: 1801 | optional: true 1802 | 1803 | tslib@2.8.1: 1804 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1805 | 1806 | tunnel-rat@0.1.2: 1807 | resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} 1808 | 1809 | turbo-stream@2.4.0: 1810 | resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} 1811 | 1812 | type-check@0.4.0: 1813 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1814 | engines: {node: '>= 0.8.0'} 1815 | 1816 | typescript@5.8.2: 1817 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 1818 | engines: {node: '>=14.17'} 1819 | hasBin: true 1820 | 1821 | typescript@5.8.3: 1822 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1823 | engines: {node: '>=14.17'} 1824 | hasBin: true 1825 | 1826 | ufo@1.6.1: 1827 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1828 | 1829 | undici-types@6.21.0: 1830 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1831 | 1832 | universalify@2.0.1: 1833 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1834 | engines: {node: '>= 10.0.0'} 1835 | 1836 | update-browserslist-db@1.1.3: 1837 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1838 | hasBin: true 1839 | peerDependencies: 1840 | browserslist: '>= 4.21.0' 1841 | 1842 | uri-js@4.4.1: 1843 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1844 | 1845 | use-isomorphic-layout-effect@1.2.0: 1846 | resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} 1847 | peerDependencies: 1848 | '@types/react': '*' 1849 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1850 | peerDependenciesMeta: 1851 | '@types/react': 1852 | optional: true 1853 | 1854 | use-sync-external-store@1.5.0: 1855 | resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} 1856 | peerDependencies: 1857 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1858 | 1859 | utility-types@3.11.0: 1860 | resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} 1861 | engines: {node: '>= 4'} 1862 | 1863 | v8n@1.5.1: 1864 | resolution: {integrity: sha512-LdabyT4OffkyXFCe9UT+uMkxNBs5rcTVuZClvxQr08D5TUgo1OFKkoT65qYRCsiKBl/usHjpXvP4hHMzzDRj3A==} 1865 | 1866 | vite-plugin-dts@4.5.3: 1867 | resolution: {integrity: sha512-P64VnD00dR+e8S26ESoFELqc17+w7pKkwlBpgXteOljFyT0zDwD8hH4zXp49M/kciy//7ZbVXIwQCekBJjfWzA==} 1868 | peerDependencies: 1869 | typescript: '*' 1870 | vite: '*' 1871 | peerDependenciesMeta: 1872 | vite: 1873 | optional: true 1874 | 1875 | vite-plugin-glsl@1.4.0: 1876 | resolution: {integrity: sha512-mjT4AaU4qRmlpawgd0M2Qz72tvK4WF0ii2p0WbVRpr7ga6+cRScJUT3oIMv5coT8u/lqUe9u9T5+0zJLZ1uhug==} 1877 | engines: {node: '>= 20.17.0', npm: '>= 10.8.3'} 1878 | peerDependencies: 1879 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 1880 | 1881 | vite-tsconfig-paths@5.1.4: 1882 | resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} 1883 | peerDependencies: 1884 | vite: '*' 1885 | peerDependenciesMeta: 1886 | vite: 1887 | optional: true 1888 | 1889 | vite@6.2.6: 1890 | resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} 1891 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1892 | hasBin: true 1893 | peerDependencies: 1894 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1895 | jiti: '>=1.21.0' 1896 | less: '*' 1897 | lightningcss: ^1.21.0 1898 | sass: '*' 1899 | sass-embedded: '*' 1900 | stylus: '*' 1901 | sugarss: '*' 1902 | terser: ^5.16.0 1903 | tsx: ^4.8.1 1904 | yaml: ^2.4.2 1905 | peerDependenciesMeta: 1906 | '@types/node': 1907 | optional: true 1908 | jiti: 1909 | optional: true 1910 | less: 1911 | optional: true 1912 | lightningcss: 1913 | optional: true 1914 | sass: 1915 | optional: true 1916 | sass-embedded: 1917 | optional: true 1918 | stylus: 1919 | optional: true 1920 | sugarss: 1921 | optional: true 1922 | terser: 1923 | optional: true 1924 | tsx: 1925 | optional: true 1926 | yaml: 1927 | optional: true 1928 | 1929 | vscode-uri@3.1.0: 1930 | resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} 1931 | 1932 | webgl-constants@1.1.1: 1933 | resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} 1934 | 1935 | webgl-sdf-generator@1.1.1: 1936 | resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} 1937 | 1938 | which@2.0.2: 1939 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1940 | engines: {node: '>= 8'} 1941 | hasBin: true 1942 | 1943 | word-wrap@1.2.5: 1944 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1945 | engines: {node: '>=0.10.0'} 1946 | 1947 | wrappy@1.0.2: 1948 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1949 | 1950 | yallist@3.1.1: 1951 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1952 | 1953 | yallist@4.0.0: 1954 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1955 | 1956 | yocto-queue@0.1.0: 1957 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1958 | engines: {node: '>=10'} 1959 | 1960 | zustand@3.7.2: 1961 | resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} 1962 | engines: {node: '>=12.7.0'} 1963 | peerDependencies: 1964 | react: '>=16.8' 1965 | peerDependenciesMeta: 1966 | react: 1967 | optional: true 1968 | 1969 | zustand@4.5.6: 1970 | resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==} 1971 | engines: {node: '>=12.7.0'} 1972 | peerDependencies: 1973 | '@types/react': '>=16.8' 1974 | immer: '>=9.0.6' 1975 | react: '>=16.8' 1976 | peerDependenciesMeta: 1977 | '@types/react': 1978 | optional: true 1979 | immer: 1980 | optional: true 1981 | react: 1982 | optional: true 1983 | 1984 | zustand@5.0.3: 1985 | resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} 1986 | engines: {node: '>=12.20.0'} 1987 | peerDependencies: 1988 | '@types/react': '>=18.0.0' 1989 | immer: '>=9.0.6' 1990 | react: '>=18.0.0' 1991 | use-sync-external-store: '>=1.2.0' 1992 | peerDependenciesMeta: 1993 | '@types/react': 1994 | optional: true 1995 | immer: 1996 | optional: true 1997 | react: 1998 | optional: true 1999 | use-sync-external-store: 2000 | optional: true 2001 | 2002 | snapshots: 2003 | 2004 | '@ampproject/remapping@2.3.0': 2005 | dependencies: 2006 | '@jridgewell/gen-mapping': 0.3.8 2007 | '@jridgewell/trace-mapping': 0.3.25 2008 | 2009 | '@babel/code-frame@7.26.2': 2010 | dependencies: 2011 | '@babel/helper-validator-identifier': 7.25.9 2012 | js-tokens: 4.0.0 2013 | picocolors: 1.1.1 2014 | 2015 | '@babel/compat-data@7.26.8': {} 2016 | 2017 | '@babel/core@7.26.10': 2018 | dependencies: 2019 | '@ampproject/remapping': 2.3.0 2020 | '@babel/code-frame': 7.26.2 2021 | '@babel/generator': 7.27.0 2022 | '@babel/helper-compilation-targets': 7.27.0 2023 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 2024 | '@babel/helpers': 7.27.0 2025 | '@babel/parser': 7.27.0 2026 | '@babel/template': 7.27.0 2027 | '@babel/traverse': 7.27.0 2028 | '@babel/types': 7.27.0 2029 | convert-source-map: 2.0.0 2030 | debug: 4.4.0 2031 | gensync: 1.0.0-beta.2 2032 | json5: 2.2.3 2033 | semver: 6.3.1 2034 | transitivePeerDependencies: 2035 | - supports-color 2036 | 2037 | '@babel/generator@7.27.0': 2038 | dependencies: 2039 | '@babel/parser': 7.27.0 2040 | '@babel/types': 7.27.0 2041 | '@jridgewell/gen-mapping': 0.3.8 2042 | '@jridgewell/trace-mapping': 0.3.25 2043 | jsesc: 3.1.0 2044 | 2045 | '@babel/helper-compilation-targets@7.27.0': 2046 | dependencies: 2047 | '@babel/compat-data': 7.26.8 2048 | '@babel/helper-validator-option': 7.25.9 2049 | browserslist: 4.24.4 2050 | lru-cache: 5.1.1 2051 | semver: 6.3.1 2052 | 2053 | '@babel/helper-module-imports@7.25.9': 2054 | dependencies: 2055 | '@babel/traverse': 7.27.0 2056 | '@babel/types': 7.27.0 2057 | transitivePeerDependencies: 2058 | - supports-color 2059 | 2060 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': 2061 | dependencies: 2062 | '@babel/core': 7.26.10 2063 | '@babel/helper-module-imports': 7.25.9 2064 | '@babel/helper-validator-identifier': 7.25.9 2065 | '@babel/traverse': 7.27.0 2066 | transitivePeerDependencies: 2067 | - supports-color 2068 | 2069 | '@babel/helper-plugin-utils@7.26.5': {} 2070 | 2071 | '@babel/helper-string-parser@7.25.9': {} 2072 | 2073 | '@babel/helper-validator-identifier@7.25.9': {} 2074 | 2075 | '@babel/helper-validator-option@7.25.9': {} 2076 | 2077 | '@babel/helpers@7.27.0': 2078 | dependencies: 2079 | '@babel/template': 7.27.0 2080 | '@babel/types': 7.27.0 2081 | 2082 | '@babel/parser@7.27.0': 2083 | dependencies: 2084 | '@babel/types': 7.27.0 2085 | 2086 | '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': 2087 | dependencies: 2088 | '@babel/core': 7.26.10 2089 | '@babel/helper-plugin-utils': 7.26.5 2090 | 2091 | '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': 2092 | dependencies: 2093 | '@babel/core': 7.26.10 2094 | '@babel/helper-plugin-utils': 7.26.5 2095 | 2096 | '@babel/runtime@7.27.0': 2097 | dependencies: 2098 | regenerator-runtime: 0.14.1 2099 | 2100 | '@babel/template@7.27.0': 2101 | dependencies: 2102 | '@babel/code-frame': 7.26.2 2103 | '@babel/parser': 7.27.0 2104 | '@babel/types': 7.27.0 2105 | 2106 | '@babel/traverse@7.27.0': 2107 | dependencies: 2108 | '@babel/code-frame': 7.26.2 2109 | '@babel/generator': 7.27.0 2110 | '@babel/parser': 7.27.0 2111 | '@babel/template': 7.27.0 2112 | '@babel/types': 7.27.0 2113 | debug: 4.4.0 2114 | globals: 11.12.0 2115 | transitivePeerDependencies: 2116 | - supports-color 2117 | 2118 | '@babel/types@7.27.0': 2119 | dependencies: 2120 | '@babel/helper-string-parser': 7.25.9 2121 | '@babel/helper-validator-identifier': 7.25.9 2122 | 2123 | '@esbuild/aix-ppc64@0.25.2': 2124 | optional: true 2125 | 2126 | '@esbuild/android-arm64@0.25.2': 2127 | optional: true 2128 | 2129 | '@esbuild/android-arm@0.25.2': 2130 | optional: true 2131 | 2132 | '@esbuild/android-x64@0.25.2': 2133 | optional: true 2134 | 2135 | '@esbuild/darwin-arm64@0.25.2': 2136 | optional: true 2137 | 2138 | '@esbuild/darwin-x64@0.25.2': 2139 | optional: true 2140 | 2141 | '@esbuild/freebsd-arm64@0.25.2': 2142 | optional: true 2143 | 2144 | '@esbuild/freebsd-x64@0.25.2': 2145 | optional: true 2146 | 2147 | '@esbuild/linux-arm64@0.25.2': 2148 | optional: true 2149 | 2150 | '@esbuild/linux-arm@0.25.2': 2151 | optional: true 2152 | 2153 | '@esbuild/linux-ia32@0.25.2': 2154 | optional: true 2155 | 2156 | '@esbuild/linux-loong64@0.25.2': 2157 | optional: true 2158 | 2159 | '@esbuild/linux-mips64el@0.25.2': 2160 | optional: true 2161 | 2162 | '@esbuild/linux-ppc64@0.25.2': 2163 | optional: true 2164 | 2165 | '@esbuild/linux-riscv64@0.25.2': 2166 | optional: true 2167 | 2168 | '@esbuild/linux-s390x@0.25.2': 2169 | optional: true 2170 | 2171 | '@esbuild/linux-x64@0.25.2': 2172 | optional: true 2173 | 2174 | '@esbuild/netbsd-arm64@0.25.2': 2175 | optional: true 2176 | 2177 | '@esbuild/netbsd-x64@0.25.2': 2178 | optional: true 2179 | 2180 | '@esbuild/openbsd-arm64@0.25.2': 2181 | optional: true 2182 | 2183 | '@esbuild/openbsd-x64@0.25.2': 2184 | optional: true 2185 | 2186 | '@esbuild/sunos-x64@0.25.2': 2187 | optional: true 2188 | 2189 | '@esbuild/win32-arm64@0.25.2': 2190 | optional: true 2191 | 2192 | '@esbuild/win32-ia32@0.25.2': 2193 | optional: true 2194 | 2195 | '@esbuild/win32-x64@0.25.2': 2196 | optional: true 2197 | 2198 | '@eslint-community/eslint-utils@4.6.0(eslint@9.24.0)': 2199 | dependencies: 2200 | eslint: 9.24.0 2201 | eslint-visitor-keys: 3.4.3 2202 | 2203 | '@eslint-community/regexpp@4.12.1': {} 2204 | 2205 | '@eslint/config-array@0.20.0': 2206 | dependencies: 2207 | '@eslint/object-schema': 2.1.6 2208 | debug: 4.4.0 2209 | minimatch: 3.1.2 2210 | transitivePeerDependencies: 2211 | - supports-color 2212 | 2213 | '@eslint/config-helpers@0.2.1': {} 2214 | 2215 | '@eslint/core@0.12.0': 2216 | dependencies: 2217 | '@types/json-schema': 7.0.15 2218 | 2219 | '@eslint/core@0.13.0': 2220 | dependencies: 2221 | '@types/json-schema': 7.0.15 2222 | 2223 | '@eslint/eslintrc@3.3.1': 2224 | dependencies: 2225 | ajv: 6.12.6 2226 | debug: 4.4.0 2227 | espree: 10.3.0 2228 | globals: 14.0.0 2229 | ignore: 5.3.2 2230 | import-fresh: 3.3.1 2231 | js-yaml: 4.1.0 2232 | minimatch: 3.1.2 2233 | strip-json-comments: 3.1.1 2234 | transitivePeerDependencies: 2235 | - supports-color 2236 | 2237 | '@eslint/js@9.24.0': {} 2238 | 2239 | '@eslint/object-schema@2.1.6': {} 2240 | 2241 | '@eslint/plugin-kit@0.2.8': 2242 | dependencies: 2243 | '@eslint/core': 0.13.0 2244 | levn: 0.4.1 2245 | 2246 | '@floating-ui/core@0.7.3': {} 2247 | 2248 | '@floating-ui/dom@0.5.4': 2249 | dependencies: 2250 | '@floating-ui/core': 0.7.3 2251 | 2252 | '@floating-ui/react-dom@0.7.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2253 | dependencies: 2254 | '@floating-ui/dom': 0.5.4 2255 | react: 19.1.0 2256 | react-dom: 19.1.0(react@19.1.0) 2257 | use-isomorphic-layout-effect: 1.2.0(@types/react@19.1.2)(react@19.1.0) 2258 | transitivePeerDependencies: 2259 | - '@types/react' 2260 | 2261 | '@humanfs/core@0.19.1': {} 2262 | 2263 | '@humanfs/node@0.16.6': 2264 | dependencies: 2265 | '@humanfs/core': 0.19.1 2266 | '@humanwhocodes/retry': 0.3.1 2267 | 2268 | '@humanwhocodes/module-importer@1.0.1': {} 2269 | 2270 | '@humanwhocodes/retry@0.3.1': {} 2271 | 2272 | '@humanwhocodes/retry@0.4.2': {} 2273 | 2274 | '@jridgewell/gen-mapping@0.3.8': 2275 | dependencies: 2276 | '@jridgewell/set-array': 1.2.1 2277 | '@jridgewell/sourcemap-codec': 1.5.0 2278 | '@jridgewell/trace-mapping': 0.3.25 2279 | 2280 | '@jridgewell/resolve-uri@3.1.2': {} 2281 | 2282 | '@jridgewell/set-array@1.2.1': {} 2283 | 2284 | '@jridgewell/sourcemap-codec@1.5.0': {} 2285 | 2286 | '@jridgewell/trace-mapping@0.3.25': 2287 | dependencies: 2288 | '@jridgewell/resolve-uri': 3.1.2 2289 | '@jridgewell/sourcemap-codec': 1.5.0 2290 | 2291 | '@mediapipe/tasks-vision@0.10.17': {} 2292 | 2293 | '@microsoft/api-extractor-model@7.30.5(@types/node@22.14.1)': 2294 | dependencies: 2295 | '@microsoft/tsdoc': 0.15.1 2296 | '@microsoft/tsdoc-config': 0.17.1 2297 | '@rushstack/node-core-library': 5.13.0(@types/node@22.14.1) 2298 | transitivePeerDependencies: 2299 | - '@types/node' 2300 | 2301 | '@microsoft/api-extractor@7.52.3(@types/node@22.14.1)': 2302 | dependencies: 2303 | '@microsoft/api-extractor-model': 7.30.5(@types/node@22.14.1) 2304 | '@microsoft/tsdoc': 0.15.1 2305 | '@microsoft/tsdoc-config': 0.17.1 2306 | '@rushstack/node-core-library': 5.13.0(@types/node@22.14.1) 2307 | '@rushstack/rig-package': 0.5.3 2308 | '@rushstack/terminal': 0.15.2(@types/node@22.14.1) 2309 | '@rushstack/ts-command-line': 4.23.7(@types/node@22.14.1) 2310 | lodash: 4.17.21 2311 | minimatch: 3.0.8 2312 | resolve: 1.22.10 2313 | semver: 7.5.4 2314 | source-map: 0.6.1 2315 | typescript: 5.8.2 2316 | transitivePeerDependencies: 2317 | - '@types/node' 2318 | 2319 | '@microsoft/tsdoc-config@0.17.1': 2320 | dependencies: 2321 | '@microsoft/tsdoc': 0.15.1 2322 | ajv: 8.12.0 2323 | jju: 1.4.0 2324 | resolve: 1.22.10 2325 | 2326 | '@microsoft/tsdoc@0.15.1': {} 2327 | 2328 | '@monogrid/gainmap-js@3.1.0(three@0.173.0)': 2329 | dependencies: 2330 | promise-worker-transferable: 1.0.4 2331 | three: 0.173.0 2332 | 2333 | '@nodelib/fs.scandir@2.1.5': 2334 | dependencies: 2335 | '@nodelib/fs.stat': 2.0.5 2336 | run-parallel: 1.2.0 2337 | 2338 | '@nodelib/fs.stat@2.0.5': {} 2339 | 2340 | '@nodelib/fs.walk@1.2.8': 2341 | dependencies: 2342 | '@nodelib/fs.scandir': 2.1.5 2343 | fastq: 1.19.1 2344 | 2345 | '@radix-ui/primitive@1.0.0': 2346 | dependencies: 2347 | '@babel/runtime': 7.27.0 2348 | 2349 | '@radix-ui/react-arrow@1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2350 | dependencies: 2351 | '@babel/runtime': 7.27.0 2352 | '@radix-ui/react-primitive': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2353 | react: 19.1.0 2354 | react-dom: 19.1.0(react@19.1.0) 2355 | 2356 | '@radix-ui/react-compose-refs@1.0.0(react@19.1.0)': 2357 | dependencies: 2358 | '@babel/runtime': 7.27.0 2359 | react: 19.1.0 2360 | 2361 | '@radix-ui/react-context@1.0.0(react@19.1.0)': 2362 | dependencies: 2363 | '@babel/runtime': 7.27.0 2364 | react: 19.1.0 2365 | 2366 | '@radix-ui/react-dismissable-layer@1.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2367 | dependencies: 2368 | '@babel/runtime': 7.27.0 2369 | '@radix-ui/primitive': 1.0.0 2370 | '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) 2371 | '@radix-ui/react-primitive': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2372 | '@radix-ui/react-use-callback-ref': 1.0.0(react@19.1.0) 2373 | '@radix-ui/react-use-escape-keydown': 1.0.2(react@19.1.0) 2374 | react: 19.1.0 2375 | react-dom: 19.1.0(react@19.1.0) 2376 | 2377 | '@radix-ui/react-id@1.0.0(react@19.1.0)': 2378 | dependencies: 2379 | '@babel/runtime': 7.27.0 2380 | '@radix-ui/react-use-layout-effect': 1.0.0(react@19.1.0) 2381 | react: 19.1.0 2382 | 2383 | '@radix-ui/react-popper@1.1.1(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2384 | dependencies: 2385 | '@babel/runtime': 7.27.0 2386 | '@floating-ui/react-dom': 0.7.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2387 | '@radix-ui/react-arrow': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2388 | '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) 2389 | '@radix-ui/react-context': 1.0.0(react@19.1.0) 2390 | '@radix-ui/react-primitive': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2391 | '@radix-ui/react-use-callback-ref': 1.0.0(react@19.1.0) 2392 | '@radix-ui/react-use-layout-effect': 1.0.0(react@19.1.0) 2393 | '@radix-ui/react-use-rect': 1.0.0(react@19.1.0) 2394 | '@radix-ui/react-use-size': 1.0.0(react@19.1.0) 2395 | '@radix-ui/rect': 1.0.0 2396 | react: 19.1.0 2397 | react-dom: 19.1.0(react@19.1.0) 2398 | transitivePeerDependencies: 2399 | - '@types/react' 2400 | 2401 | '@radix-ui/react-portal@1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2402 | dependencies: 2403 | '@babel/runtime': 7.27.0 2404 | '@radix-ui/react-primitive': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2405 | react: 19.1.0 2406 | react-dom: 19.1.0(react@19.1.0) 2407 | 2408 | '@radix-ui/react-presence@1.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2409 | dependencies: 2410 | '@babel/runtime': 7.27.0 2411 | '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) 2412 | '@radix-ui/react-use-layout-effect': 1.0.0(react@19.1.0) 2413 | react: 19.1.0 2414 | react-dom: 19.1.0(react@19.1.0) 2415 | 2416 | '@radix-ui/react-primitive@1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2417 | dependencies: 2418 | '@babel/runtime': 7.27.0 2419 | '@radix-ui/react-slot': 1.0.1(react@19.1.0) 2420 | react: 19.1.0 2421 | react-dom: 19.1.0(react@19.1.0) 2422 | 2423 | '@radix-ui/react-slot@1.0.1(react@19.1.0)': 2424 | dependencies: 2425 | '@babel/runtime': 7.27.0 2426 | '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) 2427 | react: 19.1.0 2428 | 2429 | '@radix-ui/react-tooltip@1.0.5(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2430 | dependencies: 2431 | '@babel/runtime': 7.27.0 2432 | '@radix-ui/primitive': 1.0.0 2433 | '@radix-ui/react-compose-refs': 1.0.0(react@19.1.0) 2434 | '@radix-ui/react-context': 1.0.0(react@19.1.0) 2435 | '@radix-ui/react-dismissable-layer': 1.0.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2436 | '@radix-ui/react-id': 1.0.0(react@19.1.0) 2437 | '@radix-ui/react-popper': 1.1.1(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2438 | '@radix-ui/react-portal': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2439 | '@radix-ui/react-presence': 1.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2440 | '@radix-ui/react-primitive': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2441 | '@radix-ui/react-slot': 1.0.1(react@19.1.0) 2442 | '@radix-ui/react-use-controllable-state': 1.0.0(react@19.1.0) 2443 | '@radix-ui/react-visually-hidden': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2444 | react: 19.1.0 2445 | react-dom: 19.1.0(react@19.1.0) 2446 | transitivePeerDependencies: 2447 | - '@types/react' 2448 | 2449 | '@radix-ui/react-use-callback-ref@1.0.0(react@19.1.0)': 2450 | dependencies: 2451 | '@babel/runtime': 7.27.0 2452 | react: 19.1.0 2453 | 2454 | '@radix-ui/react-use-controllable-state@1.0.0(react@19.1.0)': 2455 | dependencies: 2456 | '@babel/runtime': 7.27.0 2457 | '@radix-ui/react-use-callback-ref': 1.0.0(react@19.1.0) 2458 | react: 19.1.0 2459 | 2460 | '@radix-ui/react-use-escape-keydown@1.0.2(react@19.1.0)': 2461 | dependencies: 2462 | '@babel/runtime': 7.27.0 2463 | '@radix-ui/react-use-callback-ref': 1.0.0(react@19.1.0) 2464 | react: 19.1.0 2465 | 2466 | '@radix-ui/react-use-layout-effect@1.0.0(react@19.1.0)': 2467 | dependencies: 2468 | '@babel/runtime': 7.27.0 2469 | react: 19.1.0 2470 | 2471 | '@radix-ui/react-use-rect@1.0.0(react@19.1.0)': 2472 | dependencies: 2473 | '@babel/runtime': 7.27.0 2474 | '@radix-ui/rect': 1.0.0 2475 | react: 19.1.0 2476 | 2477 | '@radix-ui/react-use-size@1.0.0(react@19.1.0)': 2478 | dependencies: 2479 | '@babel/runtime': 7.27.0 2480 | '@radix-ui/react-use-layout-effect': 1.0.0(react@19.1.0) 2481 | react: 19.1.0 2482 | 2483 | '@radix-ui/react-visually-hidden@1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': 2484 | dependencies: 2485 | '@babel/runtime': 7.27.0 2486 | '@radix-ui/react-primitive': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2487 | react: 19.1.0 2488 | react-dom: 19.1.0(react@19.1.0) 2489 | 2490 | '@radix-ui/rect@1.0.0': 2491 | dependencies: 2492 | '@babel/runtime': 7.27.0 2493 | 2494 | '@react-three/drei@10.0.6(@react-three/fiber@9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0))(@types/react@19.1.2)(@types/three@0.173.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0)': 2495 | dependencies: 2496 | '@babel/runtime': 7.27.0 2497 | '@mediapipe/tasks-vision': 0.10.17 2498 | '@monogrid/gainmap-js': 3.1.0(three@0.173.0) 2499 | '@react-three/fiber': 9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0) 2500 | '@use-gesture/react': 10.3.1(react@19.1.0) 2501 | camera-controls: 2.10.1(three@0.173.0) 2502 | cross-env: 7.0.3 2503 | detect-gpu: 5.0.70 2504 | glsl-noise: 0.0.0 2505 | hls.js: 1.6.2 2506 | maath: 0.10.8(@types/three@0.173.0)(three@0.173.0) 2507 | meshline: 3.3.1(three@0.173.0) 2508 | react: 19.1.0 2509 | stats-gl: 2.4.2(@types/three@0.173.0)(three@0.173.0) 2510 | stats.js: 0.17.0 2511 | suspend-react: 0.1.3(react@19.1.0) 2512 | three: 0.173.0 2513 | three-mesh-bvh: 0.8.3(three@0.173.0) 2514 | three-stdlib: 2.35.15(three@0.173.0) 2515 | troika-three-text: 0.52.4(three@0.173.0) 2516 | tunnel-rat: 0.1.2(@types/react@19.1.2)(react@19.1.0) 2517 | use-sync-external-store: 1.5.0(react@19.1.0) 2518 | utility-types: 3.11.0 2519 | zustand: 5.0.3(@types/react@19.1.2)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) 2520 | optionalDependencies: 2521 | react-dom: 19.1.0(react@19.1.0) 2522 | transitivePeerDependencies: 2523 | - '@types/react' 2524 | - '@types/three' 2525 | - immer 2526 | 2527 | '@react-three/fiber@9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0)': 2528 | dependencies: 2529 | '@babel/runtime': 7.27.0 2530 | '@types/react-reconciler': 0.28.9(@types/react@19.1.2) 2531 | '@types/webxr': 0.5.22 2532 | base64-js: 1.5.1 2533 | buffer: 6.0.3 2534 | its-fine: 2.0.0(@types/react@19.1.2)(react@19.1.0) 2535 | react: 19.1.0 2536 | react-reconciler: 0.31.0(react@19.1.0) 2537 | react-use-measure: 2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 2538 | scheduler: 0.25.0 2539 | suspend-react: 0.1.3(react@19.1.0) 2540 | three: 0.173.0 2541 | use-sync-external-store: 1.5.0(react@19.1.0) 2542 | zustand: 5.0.3(@types/react@19.1.2)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) 2543 | optionalDependencies: 2544 | react-dom: 19.1.0(react@19.1.0) 2545 | transitivePeerDependencies: 2546 | - '@types/react' 2547 | - immer 2548 | 2549 | '@react-three/postprocessing@3.0.4(@react-three/fiber@9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0))(@types/three@0.173.0)(react@19.1.0)(three@0.173.0)': 2550 | dependencies: 2551 | '@react-three/fiber': 9.1.2(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(three@0.173.0) 2552 | maath: 0.6.0(@types/three@0.173.0)(three@0.173.0) 2553 | n8ao: 1.9.4(postprocessing@6.36.7(three@0.173.0))(three@0.173.0) 2554 | postprocessing: 6.36.7(three@0.173.0) 2555 | react: 19.1.0 2556 | three: 0.173.0 2557 | transitivePeerDependencies: 2558 | - '@types/three' 2559 | 2560 | '@rollup/pluginutils@5.1.4(rollup@4.40.0)': 2561 | dependencies: 2562 | '@types/estree': 1.0.7 2563 | estree-walker: 2.0.2 2564 | picomatch: 4.0.2 2565 | optionalDependencies: 2566 | rollup: 4.40.0 2567 | 2568 | '@rollup/rollup-android-arm-eabi@4.40.0': 2569 | optional: true 2570 | 2571 | '@rollup/rollup-android-arm64@4.40.0': 2572 | optional: true 2573 | 2574 | '@rollup/rollup-darwin-arm64@4.40.0': 2575 | optional: true 2576 | 2577 | '@rollup/rollup-darwin-x64@4.40.0': 2578 | optional: true 2579 | 2580 | '@rollup/rollup-freebsd-arm64@4.40.0': 2581 | optional: true 2582 | 2583 | '@rollup/rollup-freebsd-x64@4.40.0': 2584 | optional: true 2585 | 2586 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0': 2587 | optional: true 2588 | 2589 | '@rollup/rollup-linux-arm-musleabihf@4.40.0': 2590 | optional: true 2591 | 2592 | '@rollup/rollup-linux-arm64-gnu@4.40.0': 2593 | optional: true 2594 | 2595 | '@rollup/rollup-linux-arm64-musl@4.40.0': 2596 | optional: true 2597 | 2598 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0': 2599 | optional: true 2600 | 2601 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': 2602 | optional: true 2603 | 2604 | '@rollup/rollup-linux-riscv64-gnu@4.40.0': 2605 | optional: true 2606 | 2607 | '@rollup/rollup-linux-riscv64-musl@4.40.0': 2608 | optional: true 2609 | 2610 | '@rollup/rollup-linux-s390x-gnu@4.40.0': 2611 | optional: true 2612 | 2613 | '@rollup/rollup-linux-x64-gnu@4.40.0': 2614 | optional: true 2615 | 2616 | '@rollup/rollup-linux-x64-musl@4.40.0': 2617 | optional: true 2618 | 2619 | '@rollup/rollup-win32-arm64-msvc@4.40.0': 2620 | optional: true 2621 | 2622 | '@rollup/rollup-win32-ia32-msvc@4.40.0': 2623 | optional: true 2624 | 2625 | '@rollup/rollup-win32-x64-msvc@4.40.0': 2626 | optional: true 2627 | 2628 | '@rushstack/node-core-library@5.13.0(@types/node@22.14.1)': 2629 | dependencies: 2630 | ajv: 8.13.0 2631 | ajv-draft-04: 1.0.0(ajv@8.13.0) 2632 | ajv-formats: 3.0.1(ajv@8.13.0) 2633 | fs-extra: 11.3.0 2634 | import-lazy: 4.0.0 2635 | jju: 1.4.0 2636 | resolve: 1.22.10 2637 | semver: 7.5.4 2638 | optionalDependencies: 2639 | '@types/node': 22.14.1 2640 | 2641 | '@rushstack/rig-package@0.5.3': 2642 | dependencies: 2643 | resolve: 1.22.10 2644 | strip-json-comments: 3.1.1 2645 | 2646 | '@rushstack/terminal@0.15.2(@types/node@22.14.1)': 2647 | dependencies: 2648 | '@rushstack/node-core-library': 5.13.0(@types/node@22.14.1) 2649 | supports-color: 8.1.1 2650 | optionalDependencies: 2651 | '@types/node': 22.14.1 2652 | 2653 | '@rushstack/ts-command-line@4.23.7(@types/node@22.14.1)': 2654 | dependencies: 2655 | '@rushstack/terminal': 0.15.2(@types/node@22.14.1) 2656 | '@types/argparse': 1.0.38 2657 | argparse: 1.0.10 2658 | string-argv: 0.3.2 2659 | transitivePeerDependencies: 2660 | - '@types/node' 2661 | 2662 | '@stitches/react@1.2.8(react@19.1.0)': 2663 | dependencies: 2664 | react: 19.1.0 2665 | 2666 | '@tweenjs/tween.js@23.1.3': {} 2667 | 2668 | '@types/argparse@1.0.38': {} 2669 | 2670 | '@types/babel__core@7.20.5': 2671 | dependencies: 2672 | '@babel/parser': 7.27.0 2673 | '@babel/types': 7.27.0 2674 | '@types/babel__generator': 7.27.0 2675 | '@types/babel__template': 7.4.4 2676 | '@types/babel__traverse': 7.20.7 2677 | 2678 | '@types/babel__generator@7.27.0': 2679 | dependencies: 2680 | '@babel/types': 7.27.0 2681 | 2682 | '@types/babel__template@7.4.4': 2683 | dependencies: 2684 | '@babel/parser': 7.27.0 2685 | '@babel/types': 7.27.0 2686 | 2687 | '@types/babel__traverse@7.20.7': 2688 | dependencies: 2689 | '@babel/types': 7.27.0 2690 | 2691 | '@types/cookie@0.6.0': {} 2692 | 2693 | '@types/draco3d@1.4.10': {} 2694 | 2695 | '@types/estree@1.0.7': {} 2696 | 2697 | '@types/json-schema@7.0.15': {} 2698 | 2699 | '@types/node@22.14.1': 2700 | dependencies: 2701 | undici-types: 6.21.0 2702 | 2703 | '@types/offscreencanvas@2019.7.3': {} 2704 | 2705 | '@types/react-dom@19.1.2(@types/react@19.1.2)': 2706 | dependencies: 2707 | '@types/react': 19.1.2 2708 | 2709 | '@types/react-reconciler@0.28.9(@types/react@19.1.2)': 2710 | dependencies: 2711 | '@types/react': 19.1.2 2712 | 2713 | '@types/react@19.1.2': 2714 | dependencies: 2715 | csstype: 3.1.3 2716 | 2717 | '@types/stats.js@0.17.3': {} 2718 | 2719 | '@types/three@0.173.0': 2720 | dependencies: 2721 | '@tweenjs/tween.js': 23.1.3 2722 | '@types/stats.js': 0.17.3 2723 | '@types/webxr': 0.5.22 2724 | '@webgpu/types': 0.1.60 2725 | fflate: 0.8.2 2726 | meshoptimizer: 0.18.1 2727 | 2728 | '@types/webxr@0.5.22': {} 2729 | 2730 | '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)': 2731 | dependencies: 2732 | '@eslint-community/regexpp': 4.12.1 2733 | '@typescript-eslint/parser': 8.30.1(eslint@9.24.0)(typescript@5.8.3) 2734 | '@typescript-eslint/scope-manager': 8.30.1 2735 | '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) 2736 | '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) 2737 | '@typescript-eslint/visitor-keys': 8.30.1 2738 | eslint: 9.24.0 2739 | graphemer: 1.4.0 2740 | ignore: 5.3.2 2741 | natural-compare: 1.4.0 2742 | ts-api-utils: 2.1.0(typescript@5.8.3) 2743 | typescript: 5.8.3 2744 | transitivePeerDependencies: 2745 | - supports-color 2746 | 2747 | '@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3)': 2748 | dependencies: 2749 | '@typescript-eslint/scope-manager': 8.30.1 2750 | '@typescript-eslint/types': 8.30.1 2751 | '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) 2752 | '@typescript-eslint/visitor-keys': 8.30.1 2753 | debug: 4.4.0 2754 | eslint: 9.24.0 2755 | typescript: 5.8.3 2756 | transitivePeerDependencies: 2757 | - supports-color 2758 | 2759 | '@typescript-eslint/scope-manager@8.30.1': 2760 | dependencies: 2761 | '@typescript-eslint/types': 8.30.1 2762 | '@typescript-eslint/visitor-keys': 8.30.1 2763 | 2764 | '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': 2765 | dependencies: 2766 | '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) 2767 | '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) 2768 | debug: 4.4.0 2769 | eslint: 9.24.0 2770 | ts-api-utils: 2.1.0(typescript@5.8.3) 2771 | typescript: 5.8.3 2772 | transitivePeerDependencies: 2773 | - supports-color 2774 | 2775 | '@typescript-eslint/types@8.30.1': {} 2776 | 2777 | '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': 2778 | dependencies: 2779 | '@typescript-eslint/types': 8.30.1 2780 | '@typescript-eslint/visitor-keys': 8.30.1 2781 | debug: 4.4.0 2782 | fast-glob: 3.3.3 2783 | is-glob: 4.0.3 2784 | minimatch: 9.0.5 2785 | semver: 7.7.1 2786 | ts-api-utils: 2.1.0(typescript@5.8.3) 2787 | typescript: 5.8.3 2788 | transitivePeerDependencies: 2789 | - supports-color 2790 | 2791 | '@typescript-eslint/utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': 2792 | dependencies: 2793 | '@eslint-community/eslint-utils': 4.6.0(eslint@9.24.0) 2794 | '@typescript-eslint/scope-manager': 8.30.1 2795 | '@typescript-eslint/types': 8.30.1 2796 | '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) 2797 | eslint: 9.24.0 2798 | typescript: 5.8.3 2799 | transitivePeerDependencies: 2800 | - supports-color 2801 | 2802 | '@typescript-eslint/visitor-keys@8.30.1': 2803 | dependencies: 2804 | '@typescript-eslint/types': 8.30.1 2805 | eslint-visitor-keys: 4.2.0 2806 | 2807 | '@use-gesture/core@10.3.1': {} 2808 | 2809 | '@use-gesture/react@10.3.1(react@19.1.0)': 2810 | dependencies: 2811 | '@use-gesture/core': 10.3.1 2812 | react: 19.1.0 2813 | 2814 | '@vitejs/plugin-react@4.4.0(vite@6.2.6(@types/node@22.14.1))': 2815 | dependencies: 2816 | '@babel/core': 7.26.10 2817 | '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) 2818 | '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) 2819 | '@types/babel__core': 7.20.5 2820 | react-refresh: 0.17.0 2821 | vite: 6.2.6(@types/node@22.14.1) 2822 | transitivePeerDependencies: 2823 | - supports-color 2824 | 2825 | '@volar/language-core@2.4.12': 2826 | dependencies: 2827 | '@volar/source-map': 2.4.12 2828 | 2829 | '@volar/source-map@2.4.12': {} 2830 | 2831 | '@volar/typescript@2.4.12': 2832 | dependencies: 2833 | '@volar/language-core': 2.4.12 2834 | path-browserify: 1.0.1 2835 | vscode-uri: 3.1.0 2836 | 2837 | '@vue/compiler-core@3.5.13': 2838 | dependencies: 2839 | '@babel/parser': 7.27.0 2840 | '@vue/shared': 3.5.13 2841 | entities: 4.5.0 2842 | estree-walker: 2.0.2 2843 | source-map-js: 1.2.1 2844 | 2845 | '@vue/compiler-dom@3.5.13': 2846 | dependencies: 2847 | '@vue/compiler-core': 3.5.13 2848 | '@vue/shared': 3.5.13 2849 | 2850 | '@vue/compiler-vue2@2.7.16': 2851 | dependencies: 2852 | de-indent: 1.0.2 2853 | he: 1.2.0 2854 | 2855 | '@vue/language-core@2.2.0(typescript@5.8.3)': 2856 | dependencies: 2857 | '@volar/language-core': 2.4.12 2858 | '@vue/compiler-dom': 3.5.13 2859 | '@vue/compiler-vue2': 2.7.16 2860 | '@vue/shared': 3.5.13 2861 | alien-signals: 0.4.14 2862 | minimatch: 9.0.5 2863 | muggle-string: 0.4.1 2864 | path-browserify: 1.0.1 2865 | optionalDependencies: 2866 | typescript: 5.8.3 2867 | 2868 | '@vue/shared@3.5.13': {} 2869 | 2870 | '@webgpu/types@0.1.60': {} 2871 | 2872 | acorn-jsx@5.3.2(acorn@8.14.1): 2873 | dependencies: 2874 | acorn: 8.14.1 2875 | 2876 | acorn@8.14.1: {} 2877 | 2878 | ajv-draft-04@1.0.0(ajv@8.13.0): 2879 | optionalDependencies: 2880 | ajv: 8.13.0 2881 | 2882 | ajv-formats@3.0.1(ajv@8.13.0): 2883 | optionalDependencies: 2884 | ajv: 8.13.0 2885 | 2886 | ajv@6.12.6: 2887 | dependencies: 2888 | fast-deep-equal: 3.1.3 2889 | fast-json-stable-stringify: 2.1.0 2890 | json-schema-traverse: 0.4.1 2891 | uri-js: 4.4.1 2892 | 2893 | ajv@8.12.0: 2894 | dependencies: 2895 | fast-deep-equal: 3.1.3 2896 | json-schema-traverse: 1.0.0 2897 | require-from-string: 2.0.2 2898 | uri-js: 4.4.1 2899 | 2900 | ajv@8.13.0: 2901 | dependencies: 2902 | fast-deep-equal: 3.1.3 2903 | json-schema-traverse: 1.0.0 2904 | require-from-string: 2.0.2 2905 | uri-js: 4.4.1 2906 | 2907 | alien-signals@0.4.14: {} 2908 | 2909 | ansi-styles@4.3.0: 2910 | dependencies: 2911 | color-convert: 2.0.1 2912 | 2913 | argparse@1.0.10: 2914 | dependencies: 2915 | sprintf-js: 1.0.3 2916 | 2917 | argparse@2.0.1: {} 2918 | 2919 | assign-symbols@1.0.0: {} 2920 | 2921 | async@3.2.6: {} 2922 | 2923 | attr-accept@2.2.5: {} 2924 | 2925 | balanced-match@1.0.2: {} 2926 | 2927 | base64-js@1.5.1: {} 2928 | 2929 | bidi-js@1.0.3: 2930 | dependencies: 2931 | require-from-string: 2.0.2 2932 | 2933 | brace-expansion@1.1.11: 2934 | dependencies: 2935 | balanced-match: 1.0.2 2936 | concat-map: 0.0.1 2937 | 2938 | brace-expansion@2.0.1: 2939 | dependencies: 2940 | balanced-match: 1.0.2 2941 | 2942 | braces@3.0.3: 2943 | dependencies: 2944 | fill-range: 7.1.1 2945 | 2946 | browserslist@4.24.4: 2947 | dependencies: 2948 | caniuse-lite: 1.0.30001713 2949 | electron-to-chromium: 1.5.137 2950 | node-releases: 2.0.19 2951 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 2952 | 2953 | buffer@6.0.3: 2954 | dependencies: 2955 | base64-js: 1.5.1 2956 | ieee754: 1.2.1 2957 | 2958 | callsites@3.1.0: {} 2959 | 2960 | camera-controls@2.10.1(three@0.173.0): 2961 | dependencies: 2962 | three: 0.173.0 2963 | 2964 | caniuse-lite@1.0.30001713: {} 2965 | 2966 | chalk@4.1.2: 2967 | dependencies: 2968 | ansi-styles: 4.3.0 2969 | supports-color: 7.2.0 2970 | 2971 | clang-format@1.8.0: 2972 | dependencies: 2973 | async: 3.2.6 2974 | glob: 7.2.3 2975 | resolve: 1.22.10 2976 | 2977 | color-convert@2.0.1: 2978 | dependencies: 2979 | color-name: 1.1.4 2980 | 2981 | color-name@1.1.4: {} 2982 | 2983 | colord@2.9.3: {} 2984 | 2985 | compare-versions@6.1.1: {} 2986 | 2987 | concat-map@0.0.1: {} 2988 | 2989 | confbox@0.1.8: {} 2990 | 2991 | confbox@0.2.2: {} 2992 | 2993 | convert-source-map@2.0.0: {} 2994 | 2995 | cookie@1.0.2: {} 2996 | 2997 | cross-env@7.0.3: 2998 | dependencies: 2999 | cross-spawn: 7.0.6 3000 | 3001 | cross-spawn@7.0.6: 3002 | dependencies: 3003 | path-key: 3.1.1 3004 | shebang-command: 2.0.0 3005 | which: 2.0.2 3006 | 3007 | csstype@3.1.3: {} 3008 | 3009 | de-indent@1.0.2: {} 3010 | 3011 | debug@4.4.0: 3012 | dependencies: 3013 | ms: 2.1.3 3014 | 3015 | deep-is@0.1.4: {} 3016 | 3017 | dequal@2.0.3: {} 3018 | 3019 | detect-gpu@5.0.70: 3020 | dependencies: 3021 | webgl-constants: 1.1.1 3022 | 3023 | draco3d@1.5.7: {} 3024 | 3025 | electron-to-chromium@1.5.137: {} 3026 | 3027 | entities@4.5.0: {} 3028 | 3029 | esbuild@0.25.2: 3030 | optionalDependencies: 3031 | '@esbuild/aix-ppc64': 0.25.2 3032 | '@esbuild/android-arm': 0.25.2 3033 | '@esbuild/android-arm64': 0.25.2 3034 | '@esbuild/android-x64': 0.25.2 3035 | '@esbuild/darwin-arm64': 0.25.2 3036 | '@esbuild/darwin-x64': 0.25.2 3037 | '@esbuild/freebsd-arm64': 0.25.2 3038 | '@esbuild/freebsd-x64': 0.25.2 3039 | '@esbuild/linux-arm': 0.25.2 3040 | '@esbuild/linux-arm64': 0.25.2 3041 | '@esbuild/linux-ia32': 0.25.2 3042 | '@esbuild/linux-loong64': 0.25.2 3043 | '@esbuild/linux-mips64el': 0.25.2 3044 | '@esbuild/linux-ppc64': 0.25.2 3045 | '@esbuild/linux-riscv64': 0.25.2 3046 | '@esbuild/linux-s390x': 0.25.2 3047 | '@esbuild/linux-x64': 0.25.2 3048 | '@esbuild/netbsd-arm64': 0.25.2 3049 | '@esbuild/netbsd-x64': 0.25.2 3050 | '@esbuild/openbsd-arm64': 0.25.2 3051 | '@esbuild/openbsd-x64': 0.25.2 3052 | '@esbuild/sunos-x64': 0.25.2 3053 | '@esbuild/win32-arm64': 0.25.2 3054 | '@esbuild/win32-ia32': 0.25.2 3055 | '@esbuild/win32-x64': 0.25.2 3056 | 3057 | escalade@3.2.0: {} 3058 | 3059 | escape-string-regexp@4.0.0: {} 3060 | 3061 | eslint-plugin-react-hooks@5.2.0(eslint@9.24.0): 3062 | dependencies: 3063 | eslint: 9.24.0 3064 | 3065 | eslint-plugin-react-refresh@0.4.19(eslint@9.24.0): 3066 | dependencies: 3067 | eslint: 9.24.0 3068 | 3069 | eslint-scope@8.3.0: 3070 | dependencies: 3071 | esrecurse: 4.3.0 3072 | estraverse: 5.3.0 3073 | 3074 | eslint-visitor-keys@3.4.3: {} 3075 | 3076 | eslint-visitor-keys@4.2.0: {} 3077 | 3078 | eslint@9.24.0: 3079 | dependencies: 3080 | '@eslint-community/eslint-utils': 4.6.0(eslint@9.24.0) 3081 | '@eslint-community/regexpp': 4.12.1 3082 | '@eslint/config-array': 0.20.0 3083 | '@eslint/config-helpers': 0.2.1 3084 | '@eslint/core': 0.12.0 3085 | '@eslint/eslintrc': 3.3.1 3086 | '@eslint/js': 9.24.0 3087 | '@eslint/plugin-kit': 0.2.8 3088 | '@humanfs/node': 0.16.6 3089 | '@humanwhocodes/module-importer': 1.0.1 3090 | '@humanwhocodes/retry': 0.4.2 3091 | '@types/estree': 1.0.7 3092 | '@types/json-schema': 7.0.15 3093 | ajv: 6.12.6 3094 | chalk: 4.1.2 3095 | cross-spawn: 7.0.6 3096 | debug: 4.4.0 3097 | escape-string-regexp: 4.0.0 3098 | eslint-scope: 8.3.0 3099 | eslint-visitor-keys: 4.2.0 3100 | espree: 10.3.0 3101 | esquery: 1.6.0 3102 | esutils: 2.0.3 3103 | fast-deep-equal: 3.1.3 3104 | file-entry-cache: 8.0.0 3105 | find-up: 5.0.0 3106 | glob-parent: 6.0.2 3107 | ignore: 5.3.2 3108 | imurmurhash: 0.1.4 3109 | is-glob: 4.0.3 3110 | json-stable-stringify-without-jsonify: 1.0.1 3111 | lodash.merge: 4.6.2 3112 | minimatch: 3.1.2 3113 | natural-compare: 1.4.0 3114 | optionator: 0.9.4 3115 | transitivePeerDependencies: 3116 | - supports-color 3117 | 3118 | espree@10.3.0: 3119 | dependencies: 3120 | acorn: 8.14.1 3121 | acorn-jsx: 5.3.2(acorn@8.14.1) 3122 | eslint-visitor-keys: 4.2.0 3123 | 3124 | esquery@1.6.0: 3125 | dependencies: 3126 | estraverse: 5.3.0 3127 | 3128 | esrecurse@4.3.0: 3129 | dependencies: 3130 | estraverse: 5.3.0 3131 | 3132 | estraverse@5.3.0: {} 3133 | 3134 | estree-walker@2.0.2: {} 3135 | 3136 | esutils@2.0.3: {} 3137 | 3138 | exsolve@1.0.4: {} 3139 | 3140 | extend-shallow@2.0.1: 3141 | dependencies: 3142 | is-extendable: 0.1.1 3143 | 3144 | extend-shallow@3.0.2: 3145 | dependencies: 3146 | assign-symbols: 1.0.0 3147 | is-extendable: 1.0.1 3148 | 3149 | fast-deep-equal@3.1.3: {} 3150 | 3151 | fast-glob@3.3.3: 3152 | dependencies: 3153 | '@nodelib/fs.stat': 2.0.5 3154 | '@nodelib/fs.walk': 1.2.8 3155 | glob-parent: 5.1.2 3156 | merge2: 1.4.1 3157 | micromatch: 4.0.8 3158 | 3159 | fast-json-stable-stringify@2.1.0: {} 3160 | 3161 | fast-levenshtein@2.0.6: {} 3162 | 3163 | fastq@1.19.1: 3164 | dependencies: 3165 | reusify: 1.1.0 3166 | 3167 | fflate@0.6.10: {} 3168 | 3169 | fflate@0.8.2: {} 3170 | 3171 | file-entry-cache@8.0.0: 3172 | dependencies: 3173 | flat-cache: 4.0.1 3174 | 3175 | file-selector@0.5.0: 3176 | dependencies: 3177 | tslib: 2.8.1 3178 | 3179 | fill-range@7.1.1: 3180 | dependencies: 3181 | to-regex-range: 5.0.1 3182 | 3183 | find-up@5.0.0: 3184 | dependencies: 3185 | locate-path: 6.0.0 3186 | path-exists: 4.0.0 3187 | 3188 | flat-cache@4.0.1: 3189 | dependencies: 3190 | flatted: 3.3.3 3191 | keyv: 4.5.4 3192 | 3193 | flatted@3.3.3: {} 3194 | 3195 | for-in@1.0.2: {} 3196 | 3197 | fs-extra@11.3.0: 3198 | dependencies: 3199 | graceful-fs: 4.2.11 3200 | jsonfile: 6.1.0 3201 | universalify: 2.0.1 3202 | 3203 | fs.realpath@1.0.0: {} 3204 | 3205 | fsevents@2.3.3: 3206 | optional: true 3207 | 3208 | function-bind@1.1.2: {} 3209 | 3210 | gensync@1.0.0-beta.2: {} 3211 | 3212 | get-value@2.0.6: {} 3213 | 3214 | glob-parent@5.1.2: 3215 | dependencies: 3216 | is-glob: 4.0.3 3217 | 3218 | glob-parent@6.0.2: 3219 | dependencies: 3220 | is-glob: 4.0.3 3221 | 3222 | glob@7.2.3: 3223 | dependencies: 3224 | fs.realpath: 1.0.0 3225 | inflight: 1.0.6 3226 | inherits: 2.0.4 3227 | minimatch: 3.1.2 3228 | once: 1.4.0 3229 | path-is-absolute: 1.0.1 3230 | 3231 | globals@11.12.0: {} 3232 | 3233 | globals@14.0.0: {} 3234 | 3235 | globrex@0.1.2: {} 3236 | 3237 | glsl-noise@0.0.0: {} 3238 | 3239 | graceful-fs@4.2.11: {} 3240 | 3241 | graphemer@1.4.0: {} 3242 | 3243 | has-flag@4.0.0: {} 3244 | 3245 | hasown@2.0.2: 3246 | dependencies: 3247 | function-bind: 1.1.2 3248 | 3249 | he@1.2.0: {} 3250 | 3251 | hls.js@1.6.2: {} 3252 | 3253 | ieee754@1.2.1: {} 3254 | 3255 | ignore@5.3.2: {} 3256 | 3257 | immediate@3.0.6: {} 3258 | 3259 | import-fresh@3.3.1: 3260 | dependencies: 3261 | parent-module: 1.0.1 3262 | resolve-from: 4.0.0 3263 | 3264 | import-lazy@4.0.0: {} 3265 | 3266 | imurmurhash@0.1.4: {} 3267 | 3268 | inflight@1.0.6: 3269 | dependencies: 3270 | once: 1.4.0 3271 | wrappy: 1.0.2 3272 | 3273 | inherits@2.0.4: {} 3274 | 3275 | is-core-module@2.16.1: 3276 | dependencies: 3277 | hasown: 2.0.2 3278 | 3279 | is-extendable@0.1.1: {} 3280 | 3281 | is-extendable@1.0.1: 3282 | dependencies: 3283 | is-plain-object: 2.0.4 3284 | 3285 | is-extglob@2.1.1: {} 3286 | 3287 | is-glob@4.0.3: 3288 | dependencies: 3289 | is-extglob: 2.1.1 3290 | 3291 | is-number@7.0.0: {} 3292 | 3293 | is-plain-object@2.0.4: 3294 | dependencies: 3295 | isobject: 3.0.1 3296 | 3297 | is-promise@2.2.2: {} 3298 | 3299 | isexe@2.0.0: {} 3300 | 3301 | isobject@3.0.1: {} 3302 | 3303 | its-fine@2.0.0(@types/react@19.1.2)(react@19.1.0): 3304 | dependencies: 3305 | '@types/react-reconciler': 0.28.9(@types/react@19.1.2) 3306 | react: 19.1.0 3307 | transitivePeerDependencies: 3308 | - '@types/react' 3309 | 3310 | jju@1.4.0: {} 3311 | 3312 | js-tokens@4.0.0: {} 3313 | 3314 | js-yaml@4.1.0: 3315 | dependencies: 3316 | argparse: 2.0.1 3317 | 3318 | jsesc@3.1.0: {} 3319 | 3320 | json-buffer@3.0.1: {} 3321 | 3322 | json-schema-traverse@0.4.1: {} 3323 | 3324 | json-schema-traverse@1.0.0: {} 3325 | 3326 | json-stable-stringify-without-jsonify@1.0.1: {} 3327 | 3328 | json5@2.2.3: {} 3329 | 3330 | jsonfile@6.1.0: 3331 | dependencies: 3332 | universalify: 2.0.1 3333 | optionalDependencies: 3334 | graceful-fs: 4.2.11 3335 | 3336 | keyv@4.5.4: 3337 | dependencies: 3338 | json-buffer: 3.0.1 3339 | 3340 | kolorist@1.8.0: {} 3341 | 3342 | leva@0.10.0(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 3343 | dependencies: 3344 | '@radix-ui/react-portal': 1.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 3345 | '@radix-ui/react-tooltip': 1.0.5(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 3346 | '@stitches/react': 1.2.8(react@19.1.0) 3347 | '@use-gesture/react': 10.3.1(react@19.1.0) 3348 | colord: 2.9.3 3349 | dequal: 2.0.3 3350 | merge-value: 1.0.0 3351 | react: 19.1.0 3352 | react-colorful: 5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 3353 | react-dom: 19.1.0(react@19.1.0) 3354 | react-dropzone: 12.1.0(react@19.1.0) 3355 | v8n: 1.5.1 3356 | zustand: 3.7.2(react@19.1.0) 3357 | transitivePeerDependencies: 3358 | - '@types/react' 3359 | 3360 | levn@0.4.1: 3361 | dependencies: 3362 | prelude-ls: 1.2.1 3363 | type-check: 0.4.0 3364 | 3365 | lie@3.3.0: 3366 | dependencies: 3367 | immediate: 3.0.6 3368 | 3369 | local-pkg@1.1.1: 3370 | dependencies: 3371 | mlly: 1.7.4 3372 | pkg-types: 2.1.0 3373 | quansync: 0.2.10 3374 | 3375 | locate-path@6.0.0: 3376 | dependencies: 3377 | p-locate: 5.0.0 3378 | 3379 | lodash.merge@4.6.2: {} 3380 | 3381 | lodash@4.17.21: {} 3382 | 3383 | loose-envify@1.4.0: 3384 | dependencies: 3385 | js-tokens: 4.0.0 3386 | 3387 | lru-cache@5.1.1: 3388 | dependencies: 3389 | yallist: 3.1.1 3390 | 3391 | lru-cache@6.0.0: 3392 | dependencies: 3393 | yallist: 4.0.0 3394 | 3395 | maath@0.10.8(@types/three@0.173.0)(three@0.173.0): 3396 | dependencies: 3397 | '@types/three': 0.173.0 3398 | three: 0.173.0 3399 | 3400 | maath@0.6.0(@types/three@0.173.0)(three@0.173.0): 3401 | dependencies: 3402 | '@types/three': 0.173.0 3403 | three: 0.173.0 3404 | 3405 | magic-string@0.30.17: 3406 | dependencies: 3407 | '@jridgewell/sourcemap-codec': 1.5.0 3408 | 3409 | merge-value@1.0.0: 3410 | dependencies: 3411 | get-value: 2.0.6 3412 | is-extendable: 1.0.1 3413 | mixin-deep: 1.3.2 3414 | set-value: 2.0.1 3415 | 3416 | merge2@1.4.1: {} 3417 | 3418 | meshline@3.3.1(three@0.173.0): 3419 | dependencies: 3420 | three: 0.173.0 3421 | 3422 | meshoptimizer@0.18.1: {} 3423 | 3424 | micromatch@4.0.8: 3425 | dependencies: 3426 | braces: 3.0.3 3427 | picomatch: 2.3.1 3428 | 3429 | minimatch@3.0.8: 3430 | dependencies: 3431 | brace-expansion: 1.1.11 3432 | 3433 | minimatch@3.1.2: 3434 | dependencies: 3435 | brace-expansion: 1.1.11 3436 | 3437 | minimatch@9.0.5: 3438 | dependencies: 3439 | brace-expansion: 2.0.1 3440 | 3441 | mixin-deep@1.3.2: 3442 | dependencies: 3443 | for-in: 1.0.2 3444 | is-extendable: 1.0.1 3445 | 3446 | mlly@1.7.4: 3447 | dependencies: 3448 | acorn: 8.14.1 3449 | pathe: 2.0.3 3450 | pkg-types: 1.3.1 3451 | ufo: 1.6.1 3452 | 3453 | ms@2.1.3: {} 3454 | 3455 | muggle-string@0.4.1: {} 3456 | 3457 | n8ao@1.9.4(postprocessing@6.36.7(three@0.173.0))(three@0.173.0): 3458 | dependencies: 3459 | postprocessing: 6.36.7(three@0.173.0) 3460 | three: 0.173.0 3461 | 3462 | nanoid@3.3.11: {} 3463 | 3464 | natural-compare@1.4.0: {} 3465 | 3466 | node-releases@2.0.19: {} 3467 | 3468 | object-assign@4.1.1: {} 3469 | 3470 | once@1.4.0: 3471 | dependencies: 3472 | wrappy: 1.0.2 3473 | 3474 | optionator@0.9.4: 3475 | dependencies: 3476 | deep-is: 0.1.4 3477 | fast-levenshtein: 2.0.6 3478 | levn: 0.4.1 3479 | prelude-ls: 1.2.1 3480 | type-check: 0.4.0 3481 | word-wrap: 1.2.5 3482 | 3483 | p-limit@3.1.0: 3484 | dependencies: 3485 | yocto-queue: 0.1.0 3486 | 3487 | p-locate@5.0.0: 3488 | dependencies: 3489 | p-limit: 3.1.0 3490 | 3491 | parent-module@1.0.1: 3492 | dependencies: 3493 | callsites: 3.1.0 3494 | 3495 | path-browserify@1.0.1: {} 3496 | 3497 | path-exists@4.0.0: {} 3498 | 3499 | path-is-absolute@1.0.1: {} 3500 | 3501 | path-key@3.1.1: {} 3502 | 3503 | path-parse@1.0.7: {} 3504 | 3505 | pathe@2.0.3: {} 3506 | 3507 | picocolors@1.1.1: {} 3508 | 3509 | picomatch@2.3.1: {} 3510 | 3511 | picomatch@4.0.2: {} 3512 | 3513 | pkg-types@1.3.1: 3514 | dependencies: 3515 | confbox: 0.1.8 3516 | mlly: 1.7.4 3517 | pathe: 2.0.3 3518 | 3519 | pkg-types@2.1.0: 3520 | dependencies: 3521 | confbox: 0.2.2 3522 | exsolve: 1.0.4 3523 | pathe: 2.0.3 3524 | 3525 | postcss@8.5.3: 3526 | dependencies: 3527 | nanoid: 3.3.11 3528 | picocolors: 1.1.1 3529 | source-map-js: 1.2.1 3530 | 3531 | postprocessing@6.36.7(three@0.173.0): 3532 | dependencies: 3533 | three: 0.173.0 3534 | 3535 | potpack@1.0.2: {} 3536 | 3537 | prelude-ls@1.2.1: {} 3538 | 3539 | promise-worker-transferable@1.0.4: 3540 | dependencies: 3541 | is-promise: 2.2.2 3542 | lie: 3.3.0 3543 | 3544 | prop-types@15.8.1: 3545 | dependencies: 3546 | loose-envify: 1.4.0 3547 | object-assign: 4.1.1 3548 | react-is: 16.13.1 3549 | 3550 | punycode@2.3.1: {} 3551 | 3552 | quansync@0.2.10: {} 3553 | 3554 | queue-microtask@1.2.3: {} 3555 | 3556 | react-colorful@5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 3557 | dependencies: 3558 | react: 19.1.0 3559 | react-dom: 19.1.0(react@19.1.0) 3560 | 3561 | react-dom@19.1.0(react@19.1.0): 3562 | dependencies: 3563 | react: 19.1.0 3564 | scheduler: 0.26.0 3565 | 3566 | react-dropzone@12.1.0(react@19.1.0): 3567 | dependencies: 3568 | attr-accept: 2.2.5 3569 | file-selector: 0.5.0 3570 | prop-types: 15.8.1 3571 | react: 19.1.0 3572 | 3573 | react-is@16.13.1: {} 3574 | 3575 | react-reconciler@0.31.0(react@19.1.0): 3576 | dependencies: 3577 | react: 19.1.0 3578 | scheduler: 0.25.0 3579 | 3580 | react-refresh@0.17.0: {} 3581 | 3582 | react-router-dom@7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 3583 | dependencies: 3584 | react: 19.1.0 3585 | react-dom: 19.1.0(react@19.1.0) 3586 | react-router: 7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) 3587 | 3588 | react-router@7.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 3589 | dependencies: 3590 | '@types/cookie': 0.6.0 3591 | cookie: 1.0.2 3592 | react: 19.1.0 3593 | set-cookie-parser: 2.7.1 3594 | turbo-stream: 2.4.0 3595 | optionalDependencies: 3596 | react-dom: 19.1.0(react@19.1.0) 3597 | 3598 | react-use-measure@2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): 3599 | dependencies: 3600 | react: 19.1.0 3601 | optionalDependencies: 3602 | react-dom: 19.1.0(react@19.1.0) 3603 | 3604 | react@19.1.0: {} 3605 | 3606 | regenerator-runtime@0.14.1: {} 3607 | 3608 | require-from-string@2.0.2: {} 3609 | 3610 | resolve-from@4.0.0: {} 3611 | 3612 | resolve@1.22.10: 3613 | dependencies: 3614 | is-core-module: 2.16.1 3615 | path-parse: 1.0.7 3616 | supports-preserve-symlinks-flag: 1.0.0 3617 | 3618 | reusify@1.1.0: {} 3619 | 3620 | rollup@4.40.0: 3621 | dependencies: 3622 | '@types/estree': 1.0.7 3623 | optionalDependencies: 3624 | '@rollup/rollup-android-arm-eabi': 4.40.0 3625 | '@rollup/rollup-android-arm64': 4.40.0 3626 | '@rollup/rollup-darwin-arm64': 4.40.0 3627 | '@rollup/rollup-darwin-x64': 4.40.0 3628 | '@rollup/rollup-freebsd-arm64': 4.40.0 3629 | '@rollup/rollup-freebsd-x64': 4.40.0 3630 | '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 3631 | '@rollup/rollup-linux-arm-musleabihf': 4.40.0 3632 | '@rollup/rollup-linux-arm64-gnu': 4.40.0 3633 | '@rollup/rollup-linux-arm64-musl': 4.40.0 3634 | '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 3635 | '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 3636 | '@rollup/rollup-linux-riscv64-gnu': 4.40.0 3637 | '@rollup/rollup-linux-riscv64-musl': 4.40.0 3638 | '@rollup/rollup-linux-s390x-gnu': 4.40.0 3639 | '@rollup/rollup-linux-x64-gnu': 4.40.0 3640 | '@rollup/rollup-linux-x64-musl': 4.40.0 3641 | '@rollup/rollup-win32-arm64-msvc': 4.40.0 3642 | '@rollup/rollup-win32-ia32-msvc': 4.40.0 3643 | '@rollup/rollup-win32-x64-msvc': 4.40.0 3644 | fsevents: 2.3.3 3645 | 3646 | run-parallel@1.2.0: 3647 | dependencies: 3648 | queue-microtask: 1.2.3 3649 | 3650 | scheduler@0.25.0: {} 3651 | 3652 | scheduler@0.26.0: {} 3653 | 3654 | semver@6.3.1: {} 3655 | 3656 | semver@7.5.4: 3657 | dependencies: 3658 | lru-cache: 6.0.0 3659 | 3660 | semver@7.7.1: {} 3661 | 3662 | set-cookie-parser@2.7.1: {} 3663 | 3664 | set-value@2.0.1: 3665 | dependencies: 3666 | extend-shallow: 2.0.1 3667 | is-extendable: 0.1.1 3668 | is-plain-object: 2.0.4 3669 | split-string: 3.1.0 3670 | 3671 | shebang-command@2.0.0: 3672 | dependencies: 3673 | shebang-regex: 3.0.0 3674 | 3675 | shebang-regex@3.0.0: {} 3676 | 3677 | source-map-js@1.2.1: {} 3678 | 3679 | source-map@0.6.1: {} 3680 | 3681 | split-string@3.1.0: 3682 | dependencies: 3683 | extend-shallow: 3.0.2 3684 | 3685 | sprintf-js@1.0.3: {} 3686 | 3687 | stats-gl@2.4.2(@types/three@0.173.0)(three@0.173.0): 3688 | dependencies: 3689 | '@types/three': 0.173.0 3690 | three: 0.173.0 3691 | 3692 | stats.js@0.17.0: {} 3693 | 3694 | string-argv@0.3.2: {} 3695 | 3696 | strip-json-comments@3.1.1: {} 3697 | 3698 | supports-color@7.2.0: 3699 | dependencies: 3700 | has-flag: 4.0.0 3701 | 3702 | supports-color@8.1.1: 3703 | dependencies: 3704 | has-flag: 4.0.0 3705 | 3706 | supports-preserve-symlinks-flag@1.0.0: {} 3707 | 3708 | suspend-react@0.1.3(react@19.1.0): 3709 | dependencies: 3710 | react: 19.1.0 3711 | 3712 | three-mesh-bvh@0.8.3(three@0.173.0): 3713 | dependencies: 3714 | three: 0.173.0 3715 | 3716 | three-stdlib@2.35.15(three@0.173.0): 3717 | dependencies: 3718 | '@types/draco3d': 1.4.10 3719 | '@types/offscreencanvas': 2019.7.3 3720 | '@types/webxr': 0.5.22 3721 | draco3d: 1.5.7 3722 | fflate: 0.6.10 3723 | potpack: 1.0.2 3724 | three: 0.173.0 3725 | 3726 | three@0.173.0: {} 3727 | 3728 | to-regex-range@5.0.1: 3729 | dependencies: 3730 | is-number: 7.0.0 3731 | 3732 | troika-three-text@0.52.4(three@0.173.0): 3733 | dependencies: 3734 | bidi-js: 1.0.3 3735 | three: 0.173.0 3736 | troika-three-utils: 0.52.4(three@0.173.0) 3737 | troika-worker-utils: 0.52.0 3738 | webgl-sdf-generator: 1.1.1 3739 | 3740 | troika-three-utils@0.52.4(three@0.173.0): 3741 | dependencies: 3742 | three: 0.173.0 3743 | 3744 | troika-worker-utils@0.52.0: {} 3745 | 3746 | ts-api-utils@2.1.0(typescript@5.8.3): 3747 | dependencies: 3748 | typescript: 5.8.3 3749 | 3750 | tsconfck@3.1.5(typescript@5.8.3): 3751 | optionalDependencies: 3752 | typescript: 5.8.3 3753 | 3754 | tslib@2.8.1: {} 3755 | 3756 | tunnel-rat@0.1.2(@types/react@19.1.2)(react@19.1.0): 3757 | dependencies: 3758 | zustand: 4.5.6(@types/react@19.1.2)(react@19.1.0) 3759 | transitivePeerDependencies: 3760 | - '@types/react' 3761 | - immer 3762 | - react 3763 | 3764 | turbo-stream@2.4.0: {} 3765 | 3766 | type-check@0.4.0: 3767 | dependencies: 3768 | prelude-ls: 1.2.1 3769 | 3770 | typescript@5.8.2: {} 3771 | 3772 | typescript@5.8.3: {} 3773 | 3774 | ufo@1.6.1: {} 3775 | 3776 | undici-types@6.21.0: {} 3777 | 3778 | universalify@2.0.1: {} 3779 | 3780 | update-browserslist-db@1.1.3(browserslist@4.24.4): 3781 | dependencies: 3782 | browserslist: 4.24.4 3783 | escalade: 3.2.0 3784 | picocolors: 1.1.1 3785 | 3786 | uri-js@4.4.1: 3787 | dependencies: 3788 | punycode: 2.3.1 3789 | 3790 | use-isomorphic-layout-effect@1.2.0(@types/react@19.1.2)(react@19.1.0): 3791 | dependencies: 3792 | react: 19.1.0 3793 | optionalDependencies: 3794 | '@types/react': 19.1.2 3795 | 3796 | use-sync-external-store@1.5.0(react@19.1.0): 3797 | dependencies: 3798 | react: 19.1.0 3799 | 3800 | utility-types@3.11.0: {} 3801 | 3802 | v8n@1.5.1: {} 3803 | 3804 | vite-plugin-dts@4.5.3(@types/node@22.14.1)(rollup@4.40.0)(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)): 3805 | dependencies: 3806 | '@microsoft/api-extractor': 7.52.3(@types/node@22.14.1) 3807 | '@rollup/pluginutils': 5.1.4(rollup@4.40.0) 3808 | '@volar/typescript': 2.4.12 3809 | '@vue/language-core': 2.2.0(typescript@5.8.3) 3810 | compare-versions: 6.1.1 3811 | debug: 4.4.0 3812 | kolorist: 1.8.0 3813 | local-pkg: 1.1.1 3814 | magic-string: 0.30.17 3815 | typescript: 5.8.3 3816 | optionalDependencies: 3817 | vite: 6.2.6(@types/node@22.14.1) 3818 | transitivePeerDependencies: 3819 | - '@types/node' 3820 | - rollup 3821 | - supports-color 3822 | 3823 | vite-plugin-glsl@1.4.0(rollup@4.40.0)(vite@6.2.6(@types/node@22.14.1)): 3824 | dependencies: 3825 | '@rollup/pluginutils': 5.1.4(rollup@4.40.0) 3826 | vite: 6.2.6(@types/node@22.14.1) 3827 | transitivePeerDependencies: 3828 | - rollup 3829 | 3830 | vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.2.6(@types/node@22.14.1)): 3831 | dependencies: 3832 | debug: 4.4.0 3833 | globrex: 0.1.2 3834 | tsconfck: 3.1.5(typescript@5.8.3) 3835 | optionalDependencies: 3836 | vite: 6.2.6(@types/node@22.14.1) 3837 | transitivePeerDependencies: 3838 | - supports-color 3839 | - typescript 3840 | 3841 | vite@6.2.6(@types/node@22.14.1): 3842 | dependencies: 3843 | esbuild: 0.25.2 3844 | postcss: 8.5.3 3845 | rollup: 4.40.0 3846 | optionalDependencies: 3847 | '@types/node': 22.14.1 3848 | fsevents: 2.3.3 3849 | 3850 | vscode-uri@3.1.0: {} 3851 | 3852 | webgl-constants@1.1.1: {} 3853 | 3854 | webgl-sdf-generator@1.1.1: {} 3855 | 3856 | which@2.0.2: 3857 | dependencies: 3858 | isexe: 2.0.0 3859 | 3860 | word-wrap@1.2.5: {} 3861 | 3862 | wrappy@1.0.2: {} 3863 | 3864 | yallist@3.1.1: {} 3865 | 3866 | yallist@4.0.0: {} 3867 | 3868 | yocto-queue@0.1.0: {} 3869 | 3870 | zustand@3.7.2(react@19.1.0): 3871 | optionalDependencies: 3872 | react: 19.1.0 3873 | 3874 | zustand@4.5.6(@types/react@19.1.2)(react@19.1.0): 3875 | dependencies: 3876 | use-sync-external-store: 1.5.0(react@19.1.0) 3877 | optionalDependencies: 3878 | '@types/react': 19.1.2 3879 | react: 19.1.0 3880 | 3881 | zustand@5.0.3(@types/react@19.1.2)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): 3882 | optionalDependencies: 3883 | '@types/react': 19.1.2 3884 | react: 19.1.0 3885 | use-sync-external-store: 1.5.0(react@19.1.0) 3886 | -------------------------------------------------------------------------------- /src/assets/abc-normal.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whatisjery/react-fluid-distortion/962eaf3c927416b0c0aa94868cb0563ad82f1229/src/assets/abc-normal.ttf -------------------------------------------------------------------------------- /src/assets/decay.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whatisjery/react-fluid-distortion/962eaf3c927416b0c0aa94868cb0563ad82f1229/src/assets/decay.otf -------------------------------------------------------------------------------- /src/assets/github-mark-white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whatisjery/react-fluid-distortion/962eaf3c927416b0c0aa94868cb0563ad82f1229/src/assets/img.jpg -------------------------------------------------------------------------------- /src/assets/img2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whatisjery/react-fluid-distortion/962eaf3c927416b0c0aa94868cb0563ad82f1229/src/assets/img2.jpg -------------------------------------------------------------------------------- /src/assets/screen_capture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/whatisjery/react-fluid-distortion/962eaf3c927416b0c0aa94868cb0563ad82f1229/src/assets/screen_capture.png -------------------------------------------------------------------------------- /src/example/Canvas.tsx: -------------------------------------------------------------------------------- 1 | import { Canvas as R3fCanvas } from '@react-three/fiber'; 2 | import { ThreeTunnel } from './tunel'; 3 | import { Suspense } from 'react'; 4 | 5 | const Canvas = () => { 6 | return ( 7 | 15 | 16 | 17 | 18 | 19 | ); 20 | }; 21 | 22 | export default Canvas; 23 | -------------------------------------------------------------------------------- /src/example/Example1.tsx: -------------------------------------------------------------------------------- 1 | import { useTexture } from '@react-three/drei'; 2 | import { EffectComposer } from '@react-three/postprocessing'; 3 | import { Fluid } from '../../lib/Fluid'; 4 | import { ThreeTunnel } from './tunel'; 5 | 6 | import img from '@/assets/img.jpg'; 7 | import Text from './Text'; 8 | 9 | const Image = () => { 10 | const texture = useTexture(img); 11 | 12 | return ( 13 | 14 | 15 | 16 | 17 | ); 18 | }; 19 | 20 | const Example1 = () => { 21 | return ( 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | ); 30 | }; 31 | 32 | export default Example1; 33 | -------------------------------------------------------------------------------- /src/example/Example2.tsx: -------------------------------------------------------------------------------- 1 | import { Environment, MeshTransmissionMaterial } from '@react-three/drei'; 2 | import { useFrame } from '@react-three/fiber'; 3 | import { EffectComposer } from '@react-three/postprocessing'; 4 | import { useRef } from 'react'; 5 | import { Mesh } from 'three'; 6 | import { Fluid, useConfig } from '../../lib'; 7 | import { ThreeTunnel } from './tunel'; 8 | 9 | import Text from './Text'; 10 | 11 | const Torus = () => { 12 | const meshRef = useRef(null); 13 | 14 | useFrame(() => { 15 | if (!meshRef.current) return; 16 | 17 | meshRef.current.rotation.y += 0.01; 18 | meshRef.current.rotation.x += 0.005; 19 | }); 20 | return ( 21 | <> 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 35 | 36 | 37 | ); 38 | }; 39 | 40 | const Example2 = () => { 41 | const { ...config } = useConfig(); 42 | 43 | return ( 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | ); 53 | }; 54 | 55 | export default Example2; 56 | -------------------------------------------------------------------------------- /src/example/Example3.tsx: -------------------------------------------------------------------------------- 1 | import { useTexture } from '@react-three/drei'; 2 | import { EffectComposer } from '@react-three/postprocessing'; 3 | import { Fluid } from '../../lib'; 4 | import { ThreeTunnel } from './tunel'; 5 | 6 | import img from '@/assets/img2.jpg'; 7 | 8 | import Text from './Text'; 9 | 10 | const Image = () => { 11 | const texture = useTexture(img); 12 | 13 | return ( 14 | 15 | 16 | 17 | 18 | ); 19 | }; 20 | 21 | const Example3 = () => { 22 | return ( 23 | 24 | 25 | 26 | 27 | 43 | 44 | 45 | ); 46 | }; 47 | 48 | export default Example3; 49 | -------------------------------------------------------------------------------- /src/example/Layout.tsx: -------------------------------------------------------------------------------- 1 | import { Link, Outlet } from 'react-router-dom'; 2 | import Canvas from './Canvas'; 3 | import Github from '@/assets/github-mark-white.svg'; 4 | 5 | const Layout = () => { 6 | return ( 7 | <> 8 |
9 | 10 | icon 11 | 12 | 13 | 18 |
19 | 20 | 21 | 22 | 23 | ); 24 | }; 25 | 26 | export default Layout; 27 | -------------------------------------------------------------------------------- /src/example/Text.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { Text as DreiText } from '@react-three/drei'; 4 | 5 | import abc_font from '@/assets/abc-normal.ttf'; 6 | import decay_font from '@/assets/decay.otf'; 7 | 8 | const Text = () => { 9 | return ( 10 | 11 | 18 | REACT POST 19 | 20 | 21 | 27 | FLUID-DISTORTION 28 | 29 | 30 | 38 | A FLUID POST PROCESSING DISTORTION EFFECT MADE TO WORK WITH THE REACT-THREE-FIBER 39 | EFFECT COMPOSER. MOVE YOUR MOUSE AROUND TO SEE HOW IT INTERRACT WITH THE 3D OBJECTS 40 | IN THE SCENE. 41 | 42 | 43 | ); 44 | }; 45 | 46 | export default Text; 47 | -------------------------------------------------------------------------------- /src/example/tunel.ts: -------------------------------------------------------------------------------- 1 | import tunnel from 'tunnel-rat'; 2 | 3 | export const ThreeTunnel = tunnel(); 4 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import './styles.css'; 2 | 3 | import React from 'react'; 4 | import ReactDOM from 'react-dom/client'; 5 | 6 | import { RouterProvider, createBrowserRouter } from 'react-router-dom'; 7 | 8 | import Layout from './example/Layout'; 9 | import Example1 from './example/Example1'; 10 | import Example2 from './example/Example2'; 11 | import Example3 from './example/Example3'; 12 | 13 | const router = createBrowserRouter([ 14 | { 15 | path: '/', 16 | element: , 17 | children: [ 18 | { path: '/', element: }, 19 | { path: '/example2', element: }, 20 | { path: '/example3', element: }, 21 | ], 22 | }, 23 | ]); 24 | 25 | ReactDOM.createRoot(document.getElementById('root')!).render( 26 | 27 | 28 | , 29 | ); 30 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | body { 8 | color: white; 9 | font-family: 'ABCNormal-Light'; 10 | background: rgb(0, 0, 0); 11 | font-size: 1.3rem; 12 | } 13 | 14 | a { 15 | text-transform: none; 16 | color: white; 17 | margin-right: 0.5rem; 18 | pointer-events: initial; 19 | text-decoration: underline; 20 | } 21 | 22 | a:hover { 23 | text-decoration: none; 24 | } 25 | 26 | canvas { 27 | pointer-events: initial; 28 | } 29 | 30 | .layout { 31 | display: flex; 32 | flex-direction: column; 33 | justify-content: space-between; 34 | align-items: center; 35 | padding: 2rem; 36 | height: 100vh; 37 | pointer-events: none; 38 | z-index: 2; 39 | position: relative; 40 | text-transform: uppercase; 41 | } 42 | 43 | .icon { 44 | width: 1.7rem; 45 | } 46 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "composite": true, 5 | "useDefineForClassFields": true, 6 | "allowSyntheticDefaultImports": true, 7 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 8 | "module": "ESNext", 9 | "skipLibCheck": true, 10 | "moduleResolution": "Node", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "esModuleInterop": true, 14 | "isolatedModules": true, 15 | "declarationMap": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx", 18 | "baseUrl": ".", 19 | "paths": { 20 | "@/*": ["src/*"], 21 | "index": ["lib/index.ts"] 22 | }, 23 | 24 | "typeRoots": ["node_modules/@types", "lib/dist/index.d.ts"], 25 | "types": ["node"], 26 | "strict": true, 27 | "noUnusedLocals": true, 28 | "noUnusedParameters": true, 29 | "noFallthroughCasesInSwitch": true, 30 | "declaration": true 31 | }, 32 | 33 | "include": ["src", "lib", "lib/glsl.d.ts"], 34 | "references": [{ "path": "./tsconfig.node.json" }] 35 | } 36 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import { defineConfig } from 'vite'; 3 | import { fileURLToPath } from 'node:url'; 4 | import tsConfigPaths from 'vite-tsconfig-paths'; 5 | import react from '@vitejs/plugin-react'; 6 | import glsl from 'vite-plugin-glsl'; 7 | import dts from 'vite-plugin-dts'; 8 | 9 | export default defineConfig({ 10 | plugins: [react(), glsl(), dts({ include: 'lib', insertTypesEntry: true }), tsConfigPaths()], 11 | 12 | resolve: { 13 | alias: [ 14 | { 15 | find: '@', 16 | replacement: fileURLToPath(new URL('./src', import.meta.url)), 17 | }, 18 | ], 19 | }, 20 | build: { 21 | lib: { 22 | // eslint-disable-next-line no-undef 23 | entry: path.resolve(__dirname, 'lib/index.ts'), 24 | name: 'reactFluidDistortion', 25 | formats: ['es', 'umd'], 26 | fileName: (format) => `index.${format}.js`, 27 | }, 28 | rollupOptions: { 29 | external: [ 30 | 'react', 31 | '@react-three/fiber', 32 | '@react-three/drei', 33 | 'three', 34 | 'leva', 35 | 'postprocessing', 36 | ], 37 | output: { 38 | globals: { 39 | react: 'React', 40 | '@react-three/fiber': 'reactThreeFiber', 41 | '@react-three/drei': 'drei', 42 | three: 'THREE', 43 | leva: 'leva', 44 | postprocessing: 'postprocessing', 45 | }, 46 | }, 47 | }, 48 | sourcemap: true, 49 | emptyOutDir: true, 50 | copyPublicDir: false, 51 | }, 52 | }); 53 | --------------------------------------------------------------------------------