├── .gitattributes ├── .gitignore ├── .husky └── pre-commit ├── .prettierignore ├── .prettierrc.json ├── .yarn └── releases │ └── yarn-3.2.1.cjs ├── .yarnrc.yml ├── LICENSE ├── README.md ├── assets ├── docs │ ├── example.jpg │ └── screenshot.jpg ├── github.png └── twitter.png ├── favicon.ico ├── index.html ├── package-lock.json ├── package.json ├── public └── textures │ ├── cloud-noise.png │ ├── color-noise.png │ └── fiber-noise.png ├── scripts └── cleanup.js ├── src ├── engine │ ├── Camera.ts │ ├── Engine.ts │ ├── Experience.ts │ ├── GameEntity.ts │ ├── RenderEngine.ts │ ├── RenderLoop.ts │ ├── Resources.ts │ ├── Sizes.ts │ ├── interface │ │ ├── DebugUI.ts │ │ ├── InfoUI.ts │ │ ├── Loader.ts │ │ ├── info.scss │ │ └── loader.scss │ └── utilities │ │ └── EventEmitter.ts ├── main.ts ├── pencil-lines │ ├── Box.ts │ ├── PencilLines.ts │ ├── PencilLinesPass.ts │ ├── PencilLinesShader.ts │ └── shaders │ │ ├── gradientNoise.glsl │ │ ├── pencil-lines.frag │ │ ├── pencil-lines.vert │ │ ├── shader.frag │ │ └── shader.vert ├── style.scss ├── types │ └── glsl.d.ts └── vite-env.d.ts ├── tsconfig.json ├── vite.config.js └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | /.yarn/releases/** binary 2 | /.yarn/plugins/** binary 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | .pnp.* 27 | .yarn/* 28 | !.yarn/patches 29 | !.yarn/plugins 30 | !.yarn/releases 31 | !.yarn/sdks 32 | !.yarn/versions 33 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | assets 3 | public 4 | 5 | .yarn 6 | .husky 7 | package-lock.json 8 | .yarnrc.yml 9 | 10 | *.glsl 11 | *.vert 12 | *.frag 13 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | yarnPath: .yarn/releases/yarn-3.2.1.cjs 2 | nodeLinker: 'node-modules' 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Maya Nedeljkovich Batić 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sketchy Pencil Lines Post-Processing Effect 2 | 3 | ✏️[Link to live demo](https://pencil-lines.vercel.app/) 4 | 5 | ![example scene](./assets/docs/screenshot.jpg) 6 | 7 | ## Prerequisites 8 | 9 | - [Node.js](https://nodejs.org) 10 | - [yarn](https://yarnpkg.com) OR [npm](https://www.npmjs.com) 11 | 12 | > 💡 This project uses **yarn@3.2.1** and **npm@8.1.2**. Other versions might lead to different package resolutions, proceed with caution. Example commands use **yarn**. 13 | 14 | ## Development 15 | 16 | To start the development server, run the following command: 17 | 18 | ```bash 19 | yarn install 20 | yarn dev 21 | ``` 22 | 23 | To build the project, run: 24 | 25 | ```bash 26 | yarn build 27 | ``` 28 | 29 | And if you wish to automatically start a server to preview your build, you can run: 30 | 31 | ```bash 32 | yarn build && yarn preview 33 | ``` 34 | -------------------------------------------------------------------------------- /assets/docs/example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/docs/example.jpg -------------------------------------------------------------------------------- /assets/docs/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/docs/screenshot.jpg -------------------------------------------------------------------------------- /assets/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/github.png -------------------------------------------------------------------------------- /assets/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/twitter.png -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Simple Three.js + TypeScript Starter 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-threejs-typescript-starter", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "simple-threejs-typescript-starter", 9 | "version": "0.1.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "lil-gui": "^0.16.1", 13 | "three": "^0.141.0" 14 | }, 15 | "devDependencies": { 16 | "@types/three": "^0.141.0", 17 | "sass": "^1.52.3", 18 | "typescript": "^4.7.4", 19 | "vite": "^2.9.12", 20 | "vite-plugin-glsl": "^0.1.5" 21 | } 22 | }, 23 | "node_modules/@rollup/pluginutils": { 24 | "version": "4.2.1", 25 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 26 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 27 | "dev": true, 28 | "dependencies": { 29 | "estree-walker": "^2.0.1", 30 | "picomatch": "^2.2.2" 31 | }, 32 | "engines": { 33 | "node": ">= 8.0.0" 34 | } 35 | }, 36 | "node_modules/@types/three": { 37 | "version": "0.141.0", 38 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.141.0.tgz", 39 | "integrity": "sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA==", 40 | "dev": true, 41 | "dependencies": { 42 | "@types/webxr": "*" 43 | } 44 | }, 45 | "node_modules/@types/webxr": { 46 | "version": "0.4.0", 47 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.4.0.tgz", 48 | "integrity": "sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==", 49 | "dev": true 50 | }, 51 | "node_modules/anymatch": { 52 | "version": "3.1.2", 53 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 54 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 55 | "dev": true, 56 | "dependencies": { 57 | "normalize-path": "^3.0.0", 58 | "picomatch": "^2.0.4" 59 | }, 60 | "engines": { 61 | "node": ">= 8" 62 | } 63 | }, 64 | "node_modules/binary-extensions": { 65 | "version": "2.2.0", 66 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 67 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 68 | "dev": true, 69 | "engines": { 70 | "node": ">=8" 71 | } 72 | }, 73 | "node_modules/braces": { 74 | "version": "3.0.2", 75 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 76 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 77 | "dev": true, 78 | "dependencies": { 79 | "fill-range": "^7.0.1" 80 | }, 81 | "engines": { 82 | "node": ">=8" 83 | } 84 | }, 85 | "node_modules/chokidar": { 86 | "version": "3.5.3", 87 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 88 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 89 | "dev": true, 90 | "funding": [ 91 | { 92 | "type": "individual", 93 | "url": "https://paulmillr.com/funding/" 94 | } 95 | ], 96 | "dependencies": { 97 | "anymatch": "~3.1.2", 98 | "braces": "~3.0.2", 99 | "glob-parent": "~5.1.2", 100 | "is-binary-path": "~2.1.0", 101 | "is-glob": "~4.0.1", 102 | "normalize-path": "~3.0.0", 103 | "readdirp": "~3.6.0" 104 | }, 105 | "engines": { 106 | "node": ">= 8.10.0" 107 | }, 108 | "optionalDependencies": { 109 | "fsevents": "~2.3.2" 110 | } 111 | }, 112 | "node_modules/esbuild": { 113 | "version": "0.14.45", 114 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.45.tgz", 115 | "integrity": "sha512-JOxGUD8jcs8xE8DjyGWC8by/vLMCXTJ/wuauWipL5kJRZx1dhpqIntb31QHjA45GZJWaXv7SjC/Zwu1bCkXWtQ==", 116 | "dev": true, 117 | "hasInstallScript": true, 118 | "bin": { 119 | "esbuild": "bin/esbuild" 120 | }, 121 | "engines": { 122 | "node": ">=12" 123 | }, 124 | "optionalDependencies": { 125 | "esbuild-android-64": "0.14.45", 126 | "esbuild-android-arm64": "0.14.45", 127 | "esbuild-darwin-64": "0.14.45", 128 | "esbuild-darwin-arm64": "0.14.45", 129 | "esbuild-freebsd-64": "0.14.45", 130 | "esbuild-freebsd-arm64": "0.14.45", 131 | "esbuild-linux-32": "0.14.45", 132 | "esbuild-linux-64": "0.14.45", 133 | "esbuild-linux-arm": "0.14.45", 134 | "esbuild-linux-arm64": "0.14.45", 135 | "esbuild-linux-mips64le": "0.14.45", 136 | "esbuild-linux-ppc64le": "0.14.45", 137 | "esbuild-linux-riscv64": "0.14.45", 138 | "esbuild-linux-s390x": "0.14.45", 139 | "esbuild-netbsd-64": "0.14.45", 140 | "esbuild-openbsd-64": "0.14.45", 141 | "esbuild-sunos-64": "0.14.45", 142 | "esbuild-windows-32": "0.14.45", 143 | "esbuild-windows-64": "0.14.45", 144 | "esbuild-windows-arm64": "0.14.45" 145 | } 146 | }, 147 | "node_modules/esbuild-android-64": { 148 | "version": "0.14.45", 149 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.45.tgz", 150 | "integrity": "sha512-krVmwL2uXQN1A+Ci4u2MR+Y0IAvQK0u3no5TsgguHVhTy138szjuohScCGjkpvLCpGLk7P4kFP1LKuntvJ0d4A==", 151 | "cpu": [ 152 | "x64" 153 | ], 154 | "dev": true, 155 | "optional": true, 156 | "os": [ 157 | "android" 158 | ], 159 | "engines": { 160 | "node": ">=12" 161 | } 162 | }, 163 | "node_modules/esbuild-android-arm64": { 164 | "version": "0.14.45", 165 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.45.tgz", 166 | "integrity": "sha512-62POGdzAjM+XOXEM5MmFW6k9Pjdjg1hTrXKKBbPE700LFF36B+1Jv9QkskT5UadbTk4cdH9BQ7bGiRPYY0p/Dw==", 167 | "cpu": [ 168 | "arm64" 169 | ], 170 | "dev": true, 171 | "optional": true, 172 | "os": [ 173 | "android" 174 | ], 175 | "engines": { 176 | "node": ">=12" 177 | } 178 | }, 179 | "node_modules/esbuild-darwin-64": { 180 | "version": "0.14.45", 181 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.45.tgz", 182 | "integrity": "sha512-dbkVUAnGx5IeZesWnIhnvxy7dSvgUQvfy0TVLzd9XVP3oI/VsKs8UNsfPrxI5HiN4SINv7oPAbxWceMpB7IqNA==", 183 | "cpu": [ 184 | "x64" 185 | ], 186 | "dev": true, 187 | "optional": true, 188 | "os": [ 189 | "darwin" 190 | ], 191 | "engines": { 192 | "node": ">=12" 193 | } 194 | }, 195 | "node_modules/esbuild-darwin-arm64": { 196 | "version": "0.14.45", 197 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.45.tgz", 198 | "integrity": "sha512-O6Bz7nnOae5rvbh2Ueo8ibSr7+/eLjsbPdgeMsAZri+LkOa7nsVPnhmocpO3Hy/LWfagTtHy1O9HRPIaArPmTg==", 199 | "cpu": [ 200 | "arm64" 201 | ], 202 | "dev": true, 203 | "optional": true, 204 | "os": [ 205 | "darwin" 206 | ], 207 | "engines": { 208 | "node": ">=12" 209 | } 210 | }, 211 | "node_modules/esbuild-freebsd-64": { 212 | "version": "0.14.45", 213 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.45.tgz", 214 | "integrity": "sha512-y1X2nr3XSWnDC7MRcy21EVAT0TiCtdefOntJ+SQcZnPBTURzX77f99S8lDF2KswukChkiacpd2Wd4VZieo7w7Q==", 215 | "cpu": [ 216 | "x64" 217 | ], 218 | "dev": true, 219 | "optional": true, 220 | "os": [ 221 | "freebsd" 222 | ], 223 | "engines": { 224 | "node": ">=12" 225 | } 226 | }, 227 | "node_modules/esbuild-freebsd-arm64": { 228 | "version": "0.14.45", 229 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.45.tgz", 230 | "integrity": "sha512-r3ZNejkx1BKXQ6sYOP6C5rTwgiUajyAh03wygLWZtl+SLyygvAnu+OouqtveesufjBDgujp4wZXP/n8PVqXkqg==", 231 | "cpu": [ 232 | "arm64" 233 | ], 234 | "dev": true, 235 | "optional": true, 236 | "os": [ 237 | "freebsd" 238 | ], 239 | "engines": { 240 | "node": ">=12" 241 | } 242 | }, 243 | "node_modules/esbuild-linux-32": { 244 | "version": "0.14.45", 245 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.45.tgz", 246 | "integrity": "sha512-Qk9cCO3PJig/Y+SdslN/Th4pbAjgaH9oUjVH28eMsLTPf6QDUuK6EED91jepJdR3vxhcnVjyl6JqtOWmP+uxCg==", 247 | "cpu": [ 248 | "ia32" 249 | ], 250 | "dev": true, 251 | "optional": true, 252 | "os": [ 253 | "linux" 254 | ], 255 | "engines": { 256 | "node": ">=12" 257 | } 258 | }, 259 | "node_modules/esbuild-linux-64": { 260 | "version": "0.14.45", 261 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.45.tgz", 262 | "integrity": "sha512-IybO2ugqvc/Zzn1Kih3x0FVjYAy3GTCwhtcp91dbdqk3wPqxYCzObYspa8ca0s+OovI0Cnb+rhXrUtq8gBqlqw==", 263 | "cpu": [ 264 | "x64" 265 | ], 266 | "dev": true, 267 | "optional": true, 268 | "os": [ 269 | "linux" 270 | ], 271 | "engines": { 272 | "node": ">=12" 273 | } 274 | }, 275 | "node_modules/esbuild-linux-arm": { 276 | "version": "0.14.45", 277 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.45.tgz", 278 | "integrity": "sha512-qKWJ4A4TAcxXV2TBLPw3Av5X2SYNfyNnBHNJTQJ5VuevK6Aq5i6XEMvUgdlcVuZ9MYPfS5aJZWglzDzJMf1Lpw==", 279 | "cpu": [ 280 | "arm" 281 | ], 282 | "dev": true, 283 | "optional": true, 284 | "os": [ 285 | "linux" 286 | ], 287 | "engines": { 288 | "node": ">=12" 289 | } 290 | }, 291 | "node_modules/esbuild-linux-arm64": { 292 | "version": "0.14.45", 293 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.45.tgz", 294 | "integrity": "sha512-UNEyuHTwztrkEU/+mWIxGzKrYBo2cEtjYAZQVZB1kliANKgRITktg2miaO/b/VtNe84ob1aXSvW8XOPEn5RTGQ==", 295 | "cpu": [ 296 | "arm64" 297 | ], 298 | "dev": true, 299 | "optional": true, 300 | "os": [ 301 | "linux" 302 | ], 303 | "engines": { 304 | "node": ">=12" 305 | } 306 | }, 307 | "node_modules/esbuild-linux-mips64le": { 308 | "version": "0.14.45", 309 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.45.tgz", 310 | "integrity": "sha512-s/jcfw3Vpku5dIVSFVY7idJsGdIpIJ88IrkyprVgCG2yBeXatb67B7yIt0E1tL+OHrJJdNBw6GikCiMPAAu1VA==", 311 | "cpu": [ 312 | "mips64el" 313 | ], 314 | "dev": true, 315 | "optional": true, 316 | "os": [ 317 | "linux" 318 | ], 319 | "engines": { 320 | "node": ">=12" 321 | } 322 | }, 323 | "node_modules/esbuild-linux-ppc64le": { 324 | "version": "0.14.45", 325 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.45.tgz", 326 | "integrity": "sha512-lJItl6ESZnhSx951U9R7MTBopgwIELHlQzC6SBR023V5JC1rPRFDZ/UEBsV+7BFcCAfqlyb+odGEAmcBSf4XCA==", 327 | "cpu": [ 328 | "ppc64" 329 | ], 330 | "dev": true, 331 | "optional": true, 332 | "os": [ 333 | "linux" 334 | ], 335 | "engines": { 336 | "node": ">=12" 337 | } 338 | }, 339 | "node_modules/esbuild-linux-riscv64": { 340 | "version": "0.14.45", 341 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.45.tgz", 342 | "integrity": "sha512-8anMu+QLl9MununVCGJN2I/JvUWPm1EVsBBLq/J+Nz4hr8t6QOCuEp0HRaeMohyl2XiMFBchVu0mwa05rF7GFQ==", 343 | "cpu": [ 344 | "riscv64" 345 | ], 346 | "dev": true, 347 | "optional": true, 348 | "os": [ 349 | "linux" 350 | ], 351 | "engines": { 352 | "node": ">=12" 353 | } 354 | }, 355 | "node_modules/esbuild-linux-s390x": { 356 | "version": "0.14.45", 357 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.45.tgz", 358 | "integrity": "sha512-1TPeNvNCoahMw745KNTA6POKaFfSqQrBb3fdOL82GXZqyKU/6rHNwGP0NgHe88bAUMp3QZfjGfCGKxfBHL77RQ==", 359 | "cpu": [ 360 | "s390x" 361 | ], 362 | "dev": true, 363 | "optional": true, 364 | "os": [ 365 | "linux" 366 | ], 367 | "engines": { 368 | "node": ">=12" 369 | } 370 | }, 371 | "node_modules/esbuild-netbsd-64": { 372 | "version": "0.14.45", 373 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.45.tgz", 374 | "integrity": "sha512-55f2eZ8EQhhOZosqX0mApgRoI9PrVyXlHd9Uivk+B0B4WTKUgzkoHaVk4EkIUtNRQTpDWPciTlpb/C2tUYVejA==", 375 | "cpu": [ 376 | "x64" 377 | ], 378 | "dev": true, 379 | "optional": true, 380 | "os": [ 381 | "netbsd" 382 | ], 383 | "engines": { 384 | "node": ">=12" 385 | } 386 | }, 387 | "node_modules/esbuild-openbsd-64": { 388 | "version": "0.14.45", 389 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.45.tgz", 390 | "integrity": "sha512-Z5sNcT3oN9eryMW3mGn5HAgg7XCxiUS4isqH1tZXpsdOdOESbgbTEP0mBEJU0WU7Vt2gIN5XMbAp7Oigm0k71g==", 391 | "cpu": [ 392 | "x64" 393 | ], 394 | "dev": true, 395 | "optional": true, 396 | "os": [ 397 | "openbsd" 398 | ], 399 | "engines": { 400 | "node": ">=12" 401 | } 402 | }, 403 | "node_modules/esbuild-sunos-64": { 404 | "version": "0.14.45", 405 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.45.tgz", 406 | "integrity": "sha512-WmWu4wAm8mIxxK9aWFCj5VHunY3BHQDT3dAPexMLLszPyMF7RDtUYf+Dash9tjyitvnoxPAvR7DpWpirDLQIlQ==", 407 | "cpu": [ 408 | "x64" 409 | ], 410 | "dev": true, 411 | "optional": true, 412 | "os": [ 413 | "sunos" 414 | ], 415 | "engines": { 416 | "node": ">=12" 417 | } 418 | }, 419 | "node_modules/esbuild-windows-32": { 420 | "version": "0.14.45", 421 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.45.tgz", 422 | "integrity": "sha512-DPPehKwPJFBoSG+jILc/vcJNN8pTwz1m6FWojxqtqPhgw8OabTgN4vL7gNMqL/FSeDxF+zyvZeeMrZFYF1d81Q==", 423 | "cpu": [ 424 | "ia32" 425 | ], 426 | "dev": true, 427 | "optional": true, 428 | "os": [ 429 | "win32" 430 | ], 431 | "engines": { 432 | "node": ">=12" 433 | } 434 | }, 435 | "node_modules/esbuild-windows-64": { 436 | "version": "0.14.45", 437 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.45.tgz", 438 | "integrity": "sha512-t6bxFZcp9bLmSs+1pCNL/BW2bq3QEQHxU4HoiMEyWfF8QBU8iNXFI1iLGdyCzB1Ue2739h55tpOvojFrfyNPWA==", 439 | "cpu": [ 440 | "x64" 441 | ], 442 | "dev": true, 443 | "optional": true, 444 | "os": [ 445 | "win32" 446 | ], 447 | "engines": { 448 | "node": ">=12" 449 | } 450 | }, 451 | "node_modules/esbuild-windows-arm64": { 452 | "version": "0.14.45", 453 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.45.tgz", 454 | "integrity": "sha512-DnhrvjECBJ2L0owoznPb4RqQKZ498SM8J+YHqmqzi0Gf/enkUwwTjB8vPCK6dDuFnNU/NE8f94FhKdkBHYruDQ==", 455 | "cpu": [ 456 | "arm64" 457 | ], 458 | "dev": true, 459 | "optional": true, 460 | "os": [ 461 | "win32" 462 | ], 463 | "engines": { 464 | "node": ">=12" 465 | } 466 | }, 467 | "node_modules/estree-walker": { 468 | "version": "2.0.2", 469 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 470 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 471 | "dev": true 472 | }, 473 | "node_modules/fill-range": { 474 | "version": "7.0.1", 475 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 476 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 477 | "dev": true, 478 | "dependencies": { 479 | "to-regex-range": "^5.0.1" 480 | }, 481 | "engines": { 482 | "node": ">=8" 483 | } 484 | }, 485 | "node_modules/fsevents": { 486 | "version": "2.3.2", 487 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 488 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 489 | "dev": true, 490 | "hasInstallScript": true, 491 | "optional": true, 492 | "os": [ 493 | "darwin" 494 | ], 495 | "engines": { 496 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 497 | } 498 | }, 499 | "node_modules/function-bind": { 500 | "version": "1.1.1", 501 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 502 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 503 | "dev": true 504 | }, 505 | "node_modules/glob-parent": { 506 | "version": "5.1.2", 507 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 508 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 509 | "dev": true, 510 | "dependencies": { 511 | "is-glob": "^4.0.1" 512 | }, 513 | "engines": { 514 | "node": ">= 6" 515 | } 516 | }, 517 | "node_modules/has": { 518 | "version": "1.0.3", 519 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 520 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 521 | "dev": true, 522 | "dependencies": { 523 | "function-bind": "^1.1.1" 524 | }, 525 | "engines": { 526 | "node": ">= 0.4.0" 527 | } 528 | }, 529 | "node_modules/immutable": { 530 | "version": "4.1.0", 531 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", 532 | "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", 533 | "dev": true 534 | }, 535 | "node_modules/is-binary-path": { 536 | "version": "2.1.0", 537 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 538 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 539 | "dev": true, 540 | "dependencies": { 541 | "binary-extensions": "^2.0.0" 542 | }, 543 | "engines": { 544 | "node": ">=8" 545 | } 546 | }, 547 | "node_modules/is-core-module": { 548 | "version": "2.9.0", 549 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 550 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 551 | "dev": true, 552 | "dependencies": { 553 | "has": "^1.0.3" 554 | }, 555 | "funding": { 556 | "url": "https://github.com/sponsors/ljharb" 557 | } 558 | }, 559 | "node_modules/is-extglob": { 560 | "version": "2.1.1", 561 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 562 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 563 | "dev": true, 564 | "engines": { 565 | "node": ">=0.10.0" 566 | } 567 | }, 568 | "node_modules/is-glob": { 569 | "version": "4.0.3", 570 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 571 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 572 | "dev": true, 573 | "dependencies": { 574 | "is-extglob": "^2.1.1" 575 | }, 576 | "engines": { 577 | "node": ">=0.10.0" 578 | } 579 | }, 580 | "node_modules/is-number": { 581 | "version": "7.0.0", 582 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 583 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 584 | "dev": true, 585 | "engines": { 586 | "node": ">=0.12.0" 587 | } 588 | }, 589 | "node_modules/lil-gui": { 590 | "version": "0.16.1", 591 | "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.16.1.tgz", 592 | "integrity": "sha512-6wnnfBvQxJYRhdLyIA+w5b8utwbuVxNmtpTXElm36OSgHa8lyKp00Xz/4AEx3kvodT0AJYgbfadCFWAM0Q8DgQ==" 593 | }, 594 | "node_modules/nanoid": { 595 | "version": "3.3.4", 596 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 597 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 598 | "dev": true, 599 | "bin": { 600 | "nanoid": "bin/nanoid.cjs" 601 | }, 602 | "engines": { 603 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 604 | } 605 | }, 606 | "node_modules/normalize-path": { 607 | "version": "3.0.0", 608 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 609 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 610 | "dev": true, 611 | "engines": { 612 | "node": ">=0.10.0" 613 | } 614 | }, 615 | "node_modules/path-parse": { 616 | "version": "1.0.7", 617 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 618 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 619 | "dev": true 620 | }, 621 | "node_modules/picocolors": { 622 | "version": "1.0.0", 623 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 624 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 625 | "dev": true 626 | }, 627 | "node_modules/picomatch": { 628 | "version": "2.3.1", 629 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 630 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 631 | "dev": true, 632 | "engines": { 633 | "node": ">=8.6" 634 | }, 635 | "funding": { 636 | "url": "https://github.com/sponsors/jonschlinkert" 637 | } 638 | }, 639 | "node_modules/postcss": { 640 | "version": "8.4.14", 641 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", 642 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", 643 | "dev": true, 644 | "funding": [ 645 | { 646 | "type": "opencollective", 647 | "url": "https://opencollective.com/postcss/" 648 | }, 649 | { 650 | "type": "tidelift", 651 | "url": "https://tidelift.com/funding/github/npm/postcss" 652 | } 653 | ], 654 | "dependencies": { 655 | "nanoid": "^3.3.4", 656 | "picocolors": "^1.0.0", 657 | "source-map-js": "^1.0.2" 658 | }, 659 | "engines": { 660 | "node": "^10 || ^12 || >=14" 661 | } 662 | }, 663 | "node_modules/readdirp": { 664 | "version": "3.6.0", 665 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 666 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 667 | "dev": true, 668 | "dependencies": { 669 | "picomatch": "^2.2.1" 670 | }, 671 | "engines": { 672 | "node": ">=8.10.0" 673 | } 674 | }, 675 | "node_modules/resolve": { 676 | "version": "1.22.1", 677 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 678 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 679 | "dev": true, 680 | "dependencies": { 681 | "is-core-module": "^2.9.0", 682 | "path-parse": "^1.0.7", 683 | "supports-preserve-symlinks-flag": "^1.0.0" 684 | }, 685 | "bin": { 686 | "resolve": "bin/resolve" 687 | }, 688 | "funding": { 689 | "url": "https://github.com/sponsors/ljharb" 690 | } 691 | }, 692 | "node_modules/rollup": { 693 | "version": "2.75.6", 694 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz", 695 | "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==", 696 | "dev": true, 697 | "bin": { 698 | "rollup": "dist/bin/rollup" 699 | }, 700 | "engines": { 701 | "node": ">=10.0.0" 702 | }, 703 | "optionalDependencies": { 704 | "fsevents": "~2.3.2" 705 | } 706 | }, 707 | "node_modules/sass": { 708 | "version": "1.52.3", 709 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", 710 | "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", 711 | "dev": true, 712 | "dependencies": { 713 | "chokidar": ">=3.0.0 <4.0.0", 714 | "immutable": "^4.0.0", 715 | "source-map-js": ">=0.6.2 <2.0.0" 716 | }, 717 | "bin": { 718 | "sass": "sass.js" 719 | }, 720 | "engines": { 721 | "node": ">=12.0.0" 722 | } 723 | }, 724 | "node_modules/source-map-js": { 725 | "version": "1.0.2", 726 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 727 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 728 | "dev": true, 729 | "engines": { 730 | "node": ">=0.10.0" 731 | } 732 | }, 733 | "node_modules/supports-preserve-symlinks-flag": { 734 | "version": "1.0.0", 735 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 736 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 737 | "dev": true, 738 | "engines": { 739 | "node": ">= 0.4" 740 | }, 741 | "funding": { 742 | "url": "https://github.com/sponsors/ljharb" 743 | } 744 | }, 745 | "node_modules/three": { 746 | "version": "0.141.0", 747 | "resolved": "https://registry.npmjs.org/three/-/three-0.141.0.tgz", 748 | "integrity": "sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA==" 749 | }, 750 | "node_modules/to-regex-range": { 751 | "version": "5.0.1", 752 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 753 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 754 | "dev": true, 755 | "dependencies": { 756 | "is-number": "^7.0.0" 757 | }, 758 | "engines": { 759 | "node": ">=8.0" 760 | } 761 | }, 762 | "node_modules/tslib": { 763 | "version": "2.4.0", 764 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 765 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 766 | "dev": true 767 | }, 768 | "node_modules/typescript": { 769 | "version": "4.7.4", 770 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 771 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 772 | "dev": true, 773 | "bin": { 774 | "tsc": "bin/tsc", 775 | "tsserver": "bin/tsserver" 776 | }, 777 | "engines": { 778 | "node": ">=4.2.0" 779 | } 780 | }, 781 | "node_modules/vite": { 782 | "version": "2.9.12", 783 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz", 784 | "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==", 785 | "dev": true, 786 | "dependencies": { 787 | "esbuild": "^0.14.27", 788 | "postcss": "^8.4.13", 789 | "resolve": "^1.22.0", 790 | "rollup": "^2.59.0" 791 | }, 792 | "bin": { 793 | "vite": "bin/vite.js" 794 | }, 795 | "engines": { 796 | "node": ">=12.2.0" 797 | }, 798 | "optionalDependencies": { 799 | "fsevents": "~2.3.2" 800 | }, 801 | "peerDependencies": { 802 | "less": "*", 803 | "sass": "*", 804 | "stylus": "*" 805 | }, 806 | "peerDependenciesMeta": { 807 | "less": { 808 | "optional": true 809 | }, 810 | "sass": { 811 | "optional": true 812 | }, 813 | "stylus": { 814 | "optional": true 815 | } 816 | } 817 | }, 818 | "node_modules/vite-plugin-glsl": { 819 | "version": "0.1.5", 820 | "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-0.1.5.tgz", 821 | "integrity": "sha512-BsY0ndZthCXYipF/rc/Vri0s6N/JNwMyCDRJx7qiJNNY8+MiDgzhT2iOIHL7O7v3CvjOG9yOM2+WVTNvnHGT1w==", 822 | "dev": true, 823 | "dependencies": { 824 | "@rollup/pluginutils": "^4.2.1", 825 | "tslib": "^2.4.0" 826 | }, 827 | "engines": { 828 | "node": ">= 14.17.0", 829 | "npm": ">= 6.14.13" 830 | } 831 | } 832 | }, 833 | "dependencies": { 834 | "@rollup/pluginutils": { 835 | "version": "4.2.1", 836 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 837 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 838 | "dev": true, 839 | "requires": { 840 | "estree-walker": "^2.0.1", 841 | "picomatch": "^2.2.2" 842 | } 843 | }, 844 | "@types/three": { 845 | "version": "0.141.0", 846 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.141.0.tgz", 847 | "integrity": "sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA==", 848 | "dev": true, 849 | "requires": { 850 | "@types/webxr": "*" 851 | } 852 | }, 853 | "@types/webxr": { 854 | "version": "0.4.0", 855 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.4.0.tgz", 856 | "integrity": "sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==", 857 | "dev": true 858 | }, 859 | "anymatch": { 860 | "version": "3.1.2", 861 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 862 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 863 | "dev": true, 864 | "requires": { 865 | "normalize-path": "^3.0.0", 866 | "picomatch": "^2.0.4" 867 | } 868 | }, 869 | "binary-extensions": { 870 | "version": "2.2.0", 871 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 872 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 873 | "dev": true 874 | }, 875 | "braces": { 876 | "version": "3.0.2", 877 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 878 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 879 | "dev": true, 880 | "requires": { 881 | "fill-range": "^7.0.1" 882 | } 883 | }, 884 | "chokidar": { 885 | "version": "3.5.3", 886 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 887 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 888 | "dev": true, 889 | "requires": { 890 | "anymatch": "~3.1.2", 891 | "braces": "~3.0.2", 892 | "fsevents": "~2.3.2", 893 | "glob-parent": "~5.1.2", 894 | "is-binary-path": "~2.1.0", 895 | "is-glob": "~4.0.1", 896 | "normalize-path": "~3.0.0", 897 | "readdirp": "~3.6.0" 898 | } 899 | }, 900 | "esbuild": { 901 | "version": "0.14.45", 902 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.45.tgz", 903 | "integrity": "sha512-JOxGUD8jcs8xE8DjyGWC8by/vLMCXTJ/wuauWipL5kJRZx1dhpqIntb31QHjA45GZJWaXv7SjC/Zwu1bCkXWtQ==", 904 | "dev": true, 905 | "requires": { 906 | "esbuild-android-64": "0.14.45", 907 | "esbuild-android-arm64": "0.14.45", 908 | "esbuild-darwin-64": "0.14.45", 909 | "esbuild-darwin-arm64": "0.14.45", 910 | "esbuild-freebsd-64": "0.14.45", 911 | "esbuild-freebsd-arm64": "0.14.45", 912 | "esbuild-linux-32": "0.14.45", 913 | "esbuild-linux-64": "0.14.45", 914 | "esbuild-linux-arm": "0.14.45", 915 | "esbuild-linux-arm64": "0.14.45", 916 | "esbuild-linux-mips64le": "0.14.45", 917 | "esbuild-linux-ppc64le": "0.14.45", 918 | "esbuild-linux-riscv64": "0.14.45", 919 | "esbuild-linux-s390x": "0.14.45", 920 | "esbuild-netbsd-64": "0.14.45", 921 | "esbuild-openbsd-64": "0.14.45", 922 | "esbuild-sunos-64": "0.14.45", 923 | "esbuild-windows-32": "0.14.45", 924 | "esbuild-windows-64": "0.14.45", 925 | "esbuild-windows-arm64": "0.14.45" 926 | } 927 | }, 928 | "esbuild-android-64": { 929 | "version": "0.14.45", 930 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.45.tgz", 931 | "integrity": "sha512-krVmwL2uXQN1A+Ci4u2MR+Y0IAvQK0u3no5TsgguHVhTy138szjuohScCGjkpvLCpGLk7P4kFP1LKuntvJ0d4A==", 932 | "dev": true, 933 | "optional": true 934 | }, 935 | "esbuild-android-arm64": { 936 | "version": "0.14.45", 937 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.45.tgz", 938 | "integrity": "sha512-62POGdzAjM+XOXEM5MmFW6k9Pjdjg1hTrXKKBbPE700LFF36B+1Jv9QkskT5UadbTk4cdH9BQ7bGiRPYY0p/Dw==", 939 | "dev": true, 940 | "optional": true 941 | }, 942 | "esbuild-darwin-64": { 943 | "version": "0.14.45", 944 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.45.tgz", 945 | "integrity": "sha512-dbkVUAnGx5IeZesWnIhnvxy7dSvgUQvfy0TVLzd9XVP3oI/VsKs8UNsfPrxI5HiN4SINv7oPAbxWceMpB7IqNA==", 946 | "dev": true, 947 | "optional": true 948 | }, 949 | "esbuild-darwin-arm64": { 950 | "version": "0.14.45", 951 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.45.tgz", 952 | "integrity": "sha512-O6Bz7nnOae5rvbh2Ueo8ibSr7+/eLjsbPdgeMsAZri+LkOa7nsVPnhmocpO3Hy/LWfagTtHy1O9HRPIaArPmTg==", 953 | "dev": true, 954 | "optional": true 955 | }, 956 | "esbuild-freebsd-64": { 957 | "version": "0.14.45", 958 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.45.tgz", 959 | "integrity": "sha512-y1X2nr3XSWnDC7MRcy21EVAT0TiCtdefOntJ+SQcZnPBTURzX77f99S8lDF2KswukChkiacpd2Wd4VZieo7w7Q==", 960 | "dev": true, 961 | "optional": true 962 | }, 963 | "esbuild-freebsd-arm64": { 964 | "version": "0.14.45", 965 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.45.tgz", 966 | "integrity": "sha512-r3ZNejkx1BKXQ6sYOP6C5rTwgiUajyAh03wygLWZtl+SLyygvAnu+OouqtveesufjBDgujp4wZXP/n8PVqXkqg==", 967 | "dev": true, 968 | "optional": true 969 | }, 970 | "esbuild-linux-32": { 971 | "version": "0.14.45", 972 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.45.tgz", 973 | "integrity": "sha512-Qk9cCO3PJig/Y+SdslN/Th4pbAjgaH9oUjVH28eMsLTPf6QDUuK6EED91jepJdR3vxhcnVjyl6JqtOWmP+uxCg==", 974 | "dev": true, 975 | "optional": true 976 | }, 977 | "esbuild-linux-64": { 978 | "version": "0.14.45", 979 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.45.tgz", 980 | "integrity": "sha512-IybO2ugqvc/Zzn1Kih3x0FVjYAy3GTCwhtcp91dbdqk3wPqxYCzObYspa8ca0s+OovI0Cnb+rhXrUtq8gBqlqw==", 981 | "dev": true, 982 | "optional": true 983 | }, 984 | "esbuild-linux-arm": { 985 | "version": "0.14.45", 986 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.45.tgz", 987 | "integrity": "sha512-qKWJ4A4TAcxXV2TBLPw3Av5X2SYNfyNnBHNJTQJ5VuevK6Aq5i6XEMvUgdlcVuZ9MYPfS5aJZWglzDzJMf1Lpw==", 988 | "dev": true, 989 | "optional": true 990 | }, 991 | "esbuild-linux-arm64": { 992 | "version": "0.14.45", 993 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.45.tgz", 994 | "integrity": "sha512-UNEyuHTwztrkEU/+mWIxGzKrYBo2cEtjYAZQVZB1kliANKgRITktg2miaO/b/VtNe84ob1aXSvW8XOPEn5RTGQ==", 995 | "dev": true, 996 | "optional": true 997 | }, 998 | "esbuild-linux-mips64le": { 999 | "version": "0.14.45", 1000 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.45.tgz", 1001 | "integrity": "sha512-s/jcfw3Vpku5dIVSFVY7idJsGdIpIJ88IrkyprVgCG2yBeXatb67B7yIt0E1tL+OHrJJdNBw6GikCiMPAAu1VA==", 1002 | "dev": true, 1003 | "optional": true 1004 | }, 1005 | "esbuild-linux-ppc64le": { 1006 | "version": "0.14.45", 1007 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.45.tgz", 1008 | "integrity": "sha512-lJItl6ESZnhSx951U9R7MTBopgwIELHlQzC6SBR023V5JC1rPRFDZ/UEBsV+7BFcCAfqlyb+odGEAmcBSf4XCA==", 1009 | "dev": true, 1010 | "optional": true 1011 | }, 1012 | "esbuild-linux-riscv64": { 1013 | "version": "0.14.45", 1014 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.45.tgz", 1015 | "integrity": "sha512-8anMu+QLl9MununVCGJN2I/JvUWPm1EVsBBLq/J+Nz4hr8t6QOCuEp0HRaeMohyl2XiMFBchVu0mwa05rF7GFQ==", 1016 | "dev": true, 1017 | "optional": true 1018 | }, 1019 | "esbuild-linux-s390x": { 1020 | "version": "0.14.45", 1021 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.45.tgz", 1022 | "integrity": "sha512-1TPeNvNCoahMw745KNTA6POKaFfSqQrBb3fdOL82GXZqyKU/6rHNwGP0NgHe88bAUMp3QZfjGfCGKxfBHL77RQ==", 1023 | "dev": true, 1024 | "optional": true 1025 | }, 1026 | "esbuild-netbsd-64": { 1027 | "version": "0.14.45", 1028 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.45.tgz", 1029 | "integrity": "sha512-55f2eZ8EQhhOZosqX0mApgRoI9PrVyXlHd9Uivk+B0B4WTKUgzkoHaVk4EkIUtNRQTpDWPciTlpb/C2tUYVejA==", 1030 | "dev": true, 1031 | "optional": true 1032 | }, 1033 | "esbuild-openbsd-64": { 1034 | "version": "0.14.45", 1035 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.45.tgz", 1036 | "integrity": "sha512-Z5sNcT3oN9eryMW3mGn5HAgg7XCxiUS4isqH1tZXpsdOdOESbgbTEP0mBEJU0WU7Vt2gIN5XMbAp7Oigm0k71g==", 1037 | "dev": true, 1038 | "optional": true 1039 | }, 1040 | "esbuild-sunos-64": { 1041 | "version": "0.14.45", 1042 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.45.tgz", 1043 | "integrity": "sha512-WmWu4wAm8mIxxK9aWFCj5VHunY3BHQDT3dAPexMLLszPyMF7RDtUYf+Dash9tjyitvnoxPAvR7DpWpirDLQIlQ==", 1044 | "dev": true, 1045 | "optional": true 1046 | }, 1047 | "esbuild-windows-32": { 1048 | "version": "0.14.45", 1049 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.45.tgz", 1050 | "integrity": "sha512-DPPehKwPJFBoSG+jILc/vcJNN8pTwz1m6FWojxqtqPhgw8OabTgN4vL7gNMqL/FSeDxF+zyvZeeMrZFYF1d81Q==", 1051 | "dev": true, 1052 | "optional": true 1053 | }, 1054 | "esbuild-windows-64": { 1055 | "version": "0.14.45", 1056 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.45.tgz", 1057 | "integrity": "sha512-t6bxFZcp9bLmSs+1pCNL/BW2bq3QEQHxU4HoiMEyWfF8QBU8iNXFI1iLGdyCzB1Ue2739h55tpOvojFrfyNPWA==", 1058 | "dev": true, 1059 | "optional": true 1060 | }, 1061 | "esbuild-windows-arm64": { 1062 | "version": "0.14.45", 1063 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.45.tgz", 1064 | "integrity": "sha512-DnhrvjECBJ2L0owoznPb4RqQKZ498SM8J+YHqmqzi0Gf/enkUwwTjB8vPCK6dDuFnNU/NE8f94FhKdkBHYruDQ==", 1065 | "dev": true, 1066 | "optional": true 1067 | }, 1068 | "estree-walker": { 1069 | "version": "2.0.2", 1070 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1071 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1072 | "dev": true 1073 | }, 1074 | "fill-range": { 1075 | "version": "7.0.1", 1076 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1077 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1078 | "dev": true, 1079 | "requires": { 1080 | "to-regex-range": "^5.0.1" 1081 | } 1082 | }, 1083 | "fsevents": { 1084 | "version": "2.3.2", 1085 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1086 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1087 | "dev": true, 1088 | "optional": true 1089 | }, 1090 | "function-bind": { 1091 | "version": "1.1.1", 1092 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1093 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1094 | "dev": true 1095 | }, 1096 | "glob-parent": { 1097 | "version": "5.1.2", 1098 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1099 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1100 | "dev": true, 1101 | "requires": { 1102 | "is-glob": "^4.0.1" 1103 | } 1104 | }, 1105 | "has": { 1106 | "version": "1.0.3", 1107 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1108 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1109 | "dev": true, 1110 | "requires": { 1111 | "function-bind": "^1.1.1" 1112 | } 1113 | }, 1114 | "immutable": { 1115 | "version": "4.1.0", 1116 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", 1117 | "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", 1118 | "dev": true 1119 | }, 1120 | "is-binary-path": { 1121 | "version": "2.1.0", 1122 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1123 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1124 | "dev": true, 1125 | "requires": { 1126 | "binary-extensions": "^2.0.0" 1127 | } 1128 | }, 1129 | "is-core-module": { 1130 | "version": "2.9.0", 1131 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 1132 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 1133 | "dev": true, 1134 | "requires": { 1135 | "has": "^1.0.3" 1136 | } 1137 | }, 1138 | "is-extglob": { 1139 | "version": "2.1.1", 1140 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1141 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1142 | "dev": true 1143 | }, 1144 | "is-glob": { 1145 | "version": "4.0.3", 1146 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1147 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1148 | "dev": true, 1149 | "requires": { 1150 | "is-extglob": "^2.1.1" 1151 | } 1152 | }, 1153 | "is-number": { 1154 | "version": "7.0.0", 1155 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1156 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1157 | "dev": true 1158 | }, 1159 | "lil-gui": { 1160 | "version": "0.16.1", 1161 | "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.16.1.tgz", 1162 | "integrity": "sha512-6wnnfBvQxJYRhdLyIA+w5b8utwbuVxNmtpTXElm36OSgHa8lyKp00Xz/4AEx3kvodT0AJYgbfadCFWAM0Q8DgQ==" 1163 | }, 1164 | "nanoid": { 1165 | "version": "3.3.4", 1166 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1167 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1168 | "dev": true 1169 | }, 1170 | "normalize-path": { 1171 | "version": "3.0.0", 1172 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1173 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1174 | "dev": true 1175 | }, 1176 | "path-parse": { 1177 | "version": "1.0.7", 1178 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1179 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1180 | "dev": true 1181 | }, 1182 | "picocolors": { 1183 | "version": "1.0.0", 1184 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1185 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1186 | "dev": true 1187 | }, 1188 | "picomatch": { 1189 | "version": "2.3.1", 1190 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1191 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1192 | "dev": true 1193 | }, 1194 | "postcss": { 1195 | "version": "8.4.14", 1196 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", 1197 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", 1198 | "dev": true, 1199 | "requires": { 1200 | "nanoid": "^3.3.4", 1201 | "picocolors": "^1.0.0", 1202 | "source-map-js": "^1.0.2" 1203 | } 1204 | }, 1205 | "readdirp": { 1206 | "version": "3.6.0", 1207 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1208 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1209 | "dev": true, 1210 | "requires": { 1211 | "picomatch": "^2.2.1" 1212 | } 1213 | }, 1214 | "resolve": { 1215 | "version": "1.22.1", 1216 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1217 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1218 | "dev": true, 1219 | "requires": { 1220 | "is-core-module": "^2.9.0", 1221 | "path-parse": "^1.0.7", 1222 | "supports-preserve-symlinks-flag": "^1.0.0" 1223 | } 1224 | }, 1225 | "rollup": { 1226 | "version": "2.75.6", 1227 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz", 1228 | "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==", 1229 | "dev": true, 1230 | "requires": { 1231 | "fsevents": "~2.3.2" 1232 | } 1233 | }, 1234 | "sass": { 1235 | "version": "1.52.3", 1236 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz", 1237 | "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==", 1238 | "dev": true, 1239 | "requires": { 1240 | "chokidar": ">=3.0.0 <4.0.0", 1241 | "immutable": "^4.0.0", 1242 | "source-map-js": ">=0.6.2 <2.0.0" 1243 | } 1244 | }, 1245 | "source-map-js": { 1246 | "version": "1.0.2", 1247 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1248 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1249 | "dev": true 1250 | }, 1251 | "supports-preserve-symlinks-flag": { 1252 | "version": "1.0.0", 1253 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1254 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1255 | "dev": true 1256 | }, 1257 | "three": { 1258 | "version": "0.141.0", 1259 | "resolved": "https://registry.npmjs.org/three/-/three-0.141.0.tgz", 1260 | "integrity": "sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA==" 1261 | }, 1262 | "to-regex-range": { 1263 | "version": "5.0.1", 1264 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1265 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1266 | "dev": true, 1267 | "requires": { 1268 | "is-number": "^7.0.0" 1269 | } 1270 | }, 1271 | "tslib": { 1272 | "version": "2.4.0", 1273 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 1274 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 1275 | "dev": true 1276 | }, 1277 | "typescript": { 1278 | "version": "4.7.4", 1279 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 1280 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 1281 | "dev": true 1282 | }, 1283 | "vite": { 1284 | "version": "2.9.12", 1285 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz", 1286 | "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==", 1287 | "dev": true, 1288 | "requires": { 1289 | "esbuild": "^0.14.27", 1290 | "fsevents": "~2.3.2", 1291 | "postcss": "^8.4.13", 1292 | "resolve": "^1.22.0", 1293 | "rollup": "^2.59.0" 1294 | } 1295 | }, 1296 | "vite-plugin-glsl": { 1297 | "version": "0.1.5", 1298 | "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-0.1.5.tgz", 1299 | "integrity": "sha512-BsY0ndZthCXYipF/rc/Vri0s6N/JNwMyCDRJx7qiJNNY8+MiDgzhT2iOIHL7O7v3CvjOG9yOM2+WVTNvnHGT1w==", 1300 | "dev": true, 1301 | "requires": { 1302 | "@rollup/pluginutils": "^4.2.1", 1303 | "tslib": "^2.4.0" 1304 | } 1305 | } 1306 | } 1307 | } 1308 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-threejs-typescript-starter", 3 | "version": "0.1.0", 4 | "description": "Simple starter for Three.js projects with TypeScript", 5 | "main": "index.html", 6 | "repository": "https://github.com/mayacoda/simple-threejs-typescript-starter", 7 | "author": "Maya Nedeljković Batić", 8 | "license": "MIT", 9 | "scripts": { 10 | "dev": "vite", 11 | "build": "tsc && vite build", 12 | "preview": "vite preview", 13 | "cleanup": "node ./scripts/cleanup.js", 14 | "prepare": "husky install" 15 | }, 16 | "type": "module", 17 | "dependencies": { 18 | "lil-gui": "^0.17.0", 19 | "three": "^0.146.0" 20 | }, 21 | "devDependencies": { 22 | "@types/three": "^0.144.0", 23 | "husky": "^8.0.1", 24 | "lint-staged": "^13.0.3", 25 | "prettier": "2.7.1", 26 | "sass": "^1.52.3", 27 | "typescript": "^4.7.4", 28 | "vite": "^3.0.3", 29 | "vite-plugin-glsl": "^0.1.5" 30 | }, 31 | "packageManager": "yarn@3.2.1", 32 | "lint-staged": { 33 | "**/*": "prettier --write --ignore-unknown" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /public/textures/cloud-noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/public/textures/cloud-noise.png -------------------------------------------------------------------------------- /public/textures/color-noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/public/textures/color-noise.png -------------------------------------------------------------------------------- /public/textures/fiber-noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/public/textures/fiber-noise.png -------------------------------------------------------------------------------- /scripts/cleanup.js: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs' 2 | 3 | // remove src/demo directory 4 | fs.rm('./src/demo', { recursive: true }, () => {}) 5 | 6 | // remove public/space_dog directory 7 | fs.rm('./public/space_dog', { recursive: true }, () => {}) 8 | 9 | fs.rm('./assets/docs', { recursive: true }, () => {}) 10 | 11 | // rewrite src/main.ts to only include the style import 12 | fs.writeFileSync( 13 | './src/main.ts', 14 | `import './style.scss' 15 | import { Engine } from './engine/Engine' 16 | import { Experience } from './engine/Experience' 17 | 18 | new Engine({ 19 | canvas: document.querySelector('#canvas') as HTMLCanvasElement, 20 | experience: class implements Experience { 21 | resources = [] 22 | init() {} 23 | update() {} 24 | resize() {} 25 | } 26 | })` 27 | ) 28 | 29 | fs.writeFileSync( 30 | './README.md', 31 | `# Simple Three.js + TypeScript + Vite Starter 32 | 33 | Local development: 34 | \`\`\`bash 35 | yarn 36 | yarn dev 37 | \`\`\` 38 | ` 39 | ) 40 | 41 | console.log('🧹 Repo cleaned up') 42 | -------------------------------------------------------------------------------- /src/engine/Camera.ts: -------------------------------------------------------------------------------- 1 | import { Engine } from './Engine' 2 | import * as THREE from 'three' 3 | import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' 4 | import { GameEntity } from './GameEntity' 5 | 6 | export class Camera implements GameEntity { 7 | public instance!: THREE.PerspectiveCamera 8 | private controls!: OrbitControls 9 | 10 | constructor(private engine: Engine) { 11 | this.initCamera() 12 | this.initControls() 13 | } 14 | 15 | private initCamera() { 16 | this.instance = new THREE.PerspectiveCamera( 17 | 75, 18 | window.innerWidth / window.innerHeight, 19 | 0.1, 20 | 1000 21 | ) 22 | this.instance.position.z = 5 23 | this.instance.position.y = 2 24 | this.engine.scene.add(this.instance) 25 | } 26 | 27 | private initControls() { 28 | this.controls = new OrbitControls(this.instance, this.engine.canvas) 29 | this.controls.update() 30 | } 31 | 32 | resize() { 33 | this.instance.aspect = this.engine.sizes.aspectRatio 34 | this.instance.updateProjectionMatrix() 35 | } 36 | 37 | update() { 38 | this.controls.update() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/engine/Engine.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three' 2 | import { RenderEngine } from './RenderEngine' 3 | import { RenderLoop } from './RenderLoop' 4 | import { DebugUI } from './interface/DebugUI' 5 | import { Sizes } from './Sizes' 6 | import { Camera } from './Camera' 7 | import { Resources } from './Resources' 8 | import { InfoConfig, InfoUI } from './interface/InfoUI' 9 | import { Experience, ExperienceConstructor } from './Experience' 10 | import { Loader } from './interface/Loader' 11 | 12 | export class Engine { 13 | public readonly camera!: Camera 14 | public readonly scene!: THREE.Scene 15 | public readonly renderEngine!: RenderEngine 16 | public readonly time!: RenderLoop 17 | public readonly debug!: DebugUI 18 | public readonly infoUI!: InfoUI 19 | public readonly sizes!: Sizes 20 | public readonly canvas!: HTMLCanvasElement 21 | public readonly resources!: Resources 22 | public readonly experience!: Experience 23 | private readonly loader!: Loader 24 | 25 | constructor({ 26 | canvas, 27 | experience, 28 | info, 29 | }: { 30 | canvas: HTMLCanvasElement 31 | experience: ExperienceConstructor 32 | info?: InfoConfig 33 | }) { 34 | if (!canvas) { 35 | throw new Error('No canvas provided') 36 | } 37 | 38 | this.canvas = canvas 39 | this.sizes = new Sizes(this) 40 | this.debug = new DebugUI() 41 | this.time = new RenderLoop(this) 42 | this.scene = new THREE.Scene() 43 | this.camera = new Camera(this) 44 | this.infoUI = new InfoUI(info) 45 | this.renderEngine = new RenderEngine(this) 46 | this.experience = new experience(this) 47 | this.resources = new Resources(this.experience.resources) 48 | this.loader = new Loader() 49 | 50 | this.resources.on('loaded', () => { 51 | this.experience.init() 52 | this.loader.complete() 53 | }) 54 | 55 | this.resources.on('progress', (progress: number) => { 56 | this.loader.setProgress(progress) 57 | }) 58 | } 59 | 60 | update(delta: number) { 61 | this.camera.update() 62 | this.renderEngine.update() 63 | this.experience.update(delta) 64 | this.debug.update() 65 | } 66 | 67 | resize() { 68 | this.camera.resize() 69 | this.renderEngine.resize() 70 | if (this.experience.resize) { 71 | this.experience.resize() 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/engine/Experience.ts: -------------------------------------------------------------------------------- 1 | import { GameEntity } from './GameEntity' 2 | import { Engine } from './Engine' 3 | import { Resource } from './Resources' 4 | 5 | export type ExperienceConstructor = new (engine: Engine) => Experience 6 | export interface Experience extends GameEntity { 7 | init(): void 8 | resources: Resource[] 9 | } 10 | -------------------------------------------------------------------------------- /src/engine/GameEntity.ts: -------------------------------------------------------------------------------- 1 | export interface GameEntity { 2 | update(delta: number): void 3 | resize?(): void 4 | } 5 | -------------------------------------------------------------------------------- /src/engine/RenderEngine.ts: -------------------------------------------------------------------------------- 1 | import { WebGLRenderer } from 'three' 2 | import { Engine } from './Engine' 3 | import * as THREE from 'three' 4 | import { GameEntity } from './GameEntity' 5 | import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer' 6 | import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass' 7 | 8 | export class RenderEngine implements GameEntity { 9 | private readonly renderer: WebGLRenderer 10 | composer: EffectComposer 11 | 12 | constructor(private engine: Engine) { 13 | this.renderer = new WebGLRenderer({ 14 | canvas: this.engine.canvas, 15 | antialias: true, 16 | }) 17 | 18 | this.renderer.physicallyCorrectLights = true 19 | this.renderer.outputEncoding = THREE.sRGBEncoding 20 | this.renderer.toneMapping = THREE.CineonToneMapping 21 | this.renderer.toneMappingExposure = 1.75 22 | this.renderer.shadowMap.enabled = true 23 | this.renderer.shadowMap.type = THREE.PCFSoftShadowMap 24 | this.renderer.setClearColor('#ddd') 25 | this.renderer.setSize(this.engine.sizes.width, this.engine.sizes.height) 26 | this.renderer.setPixelRatio(Math.min(this.engine.sizes.pixelRatio, 2)) 27 | 28 | this.composer = new EffectComposer(this.renderer) 29 | 30 | const renderPass = new RenderPass( 31 | this.engine.scene, 32 | this.engine.camera.instance 33 | ) 34 | this.composer.addPass(renderPass) 35 | } 36 | 37 | update() { 38 | this.composer.render() 39 | } 40 | 41 | resize() { 42 | this.renderer.setSize(this.engine.sizes.width, this.engine.sizes.height) 43 | this.composer.setSize(this.engine.sizes.width, this.engine.sizes.height) 44 | this.composer.render() 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/engine/RenderLoop.ts: -------------------------------------------------------------------------------- 1 | import { Engine } from './Engine' 2 | import * as THREE from 'three' 3 | 4 | export class RenderLoop { 5 | private clock: THREE.Clock 6 | public deltaTime: number = 16 7 | public currentTime: number = 0 8 | 9 | constructor(private engine: Engine) { 10 | this.clock = new THREE.Clock() 11 | window.requestAnimationFrame(() => this.update()) 12 | } 13 | 14 | update() { 15 | const step = () => { 16 | requestAnimationFrame(step) 17 | const elapsedTime = this.clock.getElapsedTime() 18 | 19 | this.deltaTime = elapsedTime - this.currentTime 20 | 21 | this.currentTime = elapsedTime 22 | 23 | this.engine.update(this.deltaTime) 24 | } 25 | step() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/engine/Resources.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three' 2 | import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader' 3 | import { EventEmitter } from './utilities/EventEmitter' 4 | 5 | export type Resource = 6 | | { 7 | name: string 8 | type: Exclude 9 | path: string 10 | } 11 | | { 12 | name: string 13 | type: 'cubeTexture' 14 | path: string[] 15 | } 16 | 17 | type AssetType = 'gltf' | 'texture' | 'cubeTexture' 18 | 19 | type Loaders = { 20 | gltf: GLTFLoader 21 | texture: THREE.TextureLoader 22 | cubeTexture: THREE.CubeTextureLoader 23 | } 24 | 25 | export class Resources extends EventEmitter { 26 | private loadingManager = new THREE.LoadingManager( 27 | () => { 28 | this.emit('loaded') 29 | }, 30 | // @ts-ignore 31 | (url: string, item: number, total: number) => { 32 | this.emit('progress', item / total) 33 | }, 34 | (url: string) => { 35 | console.error(`Failed to load ${url}`) 36 | } 37 | ) 38 | private loaders!: Loaders 39 | public items: Record = {} 40 | 41 | constructor(private readonly resources: Resource[]) { 42 | super() 43 | this.initLoaders() 44 | this.load() 45 | } 46 | 47 | private initLoaders() { 48 | this.loaders = { 49 | gltf: new GLTFLoader(this.loadingManager), 50 | texture: new THREE.TextureLoader(this.loadingManager), 51 | cubeTexture: new THREE.CubeTextureLoader(this.loadingManager), 52 | } 53 | } 54 | 55 | getItem(name: string) { 56 | let item = this.items[name] 57 | if (!item) { 58 | throw new Error(`Resource ${name} not found`) 59 | } 60 | return item 61 | } 62 | 63 | load() { 64 | if (this.resources.length === 0) { 65 | setTimeout(() => { 66 | this.emit('loaded') 67 | }) 68 | } 69 | 70 | for (const resource of this.resources) { 71 | switch (resource.type) { 72 | case 'gltf': 73 | this.loaders.gltf.load( 74 | resource.path, 75 | (file) => (this.items[resource.name] = file) 76 | ) 77 | break 78 | case 'texture': 79 | this.loaders.texture.load( 80 | resource.path, 81 | (file) => (this.items[resource.name] = file) 82 | ) 83 | break 84 | case 'cubeTexture': 85 | this.loaders.cubeTexture.load( 86 | resource.path, 87 | (file) => (this.items[resource.name] = file) 88 | ) 89 | break 90 | } 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/engine/Sizes.ts: -------------------------------------------------------------------------------- 1 | import { Engine } from './Engine' 2 | import { EventEmitter } from './utilities/EventEmitter' 3 | 4 | type Sizing = 'cover' | 'contain' 5 | 6 | export class Sizes extends EventEmitter { 7 | public width!: number 8 | public height!: number 9 | public pixelRatio: number = Math.min(window.devicePixelRatio, 2) 10 | public aspectRatio!: number 11 | 12 | public sizing: Sizing = 'contain' 13 | 14 | constructor(private engine: Engine) { 15 | super() 16 | this.setContainsSizing() 17 | 18 | window.addEventListener('resize', () => { 19 | this.resize() 20 | this.engine.resize() 21 | this.emit('resize') 22 | }) 23 | } 24 | 25 | public setContainsSizing() { 26 | this.width = window.innerWidth 27 | this.height = window.innerHeight 28 | 29 | this.aspectRatio = this.width / this.height 30 | } 31 | 32 | public setCoverSizing() { 33 | const maxWidth = window.innerWidth 34 | const maxHeight = window.innerHeight 35 | 36 | if (maxWidth / maxHeight < this.aspectRatio) { 37 | this.width = maxWidth 38 | this.height = maxWidth / this.aspectRatio 39 | } else { 40 | this.width = maxHeight * this.aspectRatio 41 | this.height = maxHeight 42 | } 43 | } 44 | 45 | setAspectRatio(aspectRatio: number) { 46 | this.aspectRatio = aspectRatio 47 | } 48 | 49 | setSizing(sizing: Sizing) { 50 | this.sizing = sizing 51 | 52 | this.resize() 53 | } 54 | 55 | resize() { 56 | if (this.sizing === 'contain') { 57 | this.setContainsSizing() 58 | } else { 59 | this.setCoverSizing() 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/engine/interface/DebugUI.ts: -------------------------------------------------------------------------------- 1 | import * as lilGui from 'lil-gui' 2 | import Stats from 'three/examples/jsm/libs/stats.module' 3 | 4 | let instance: DebugUI | null = null 5 | 6 | export class DebugUI { 7 | gui!: lilGui.GUI 8 | stats!: Stats 9 | 10 | constructor() { 11 | if (instance) { 12 | return this 13 | } 14 | 15 | instance = this 16 | 17 | this.stats = Stats() 18 | document.body.appendChild(this.stats.dom) 19 | 20 | this.gui = new lilGui.GUI() 21 | 22 | if (!window.location.search.includes('debug')) { 23 | this.gui.hide() 24 | this.stats.dom.style.display = 'none' 25 | } 26 | 27 | window.addEventListener('keydown', (event) => { 28 | if (event.key === 'h') { 29 | if (this.gui._hidden) { 30 | this.gui.show() 31 | this.stats.dom.style.display = 'block' 32 | } else { 33 | this.gui.hide() 34 | this.stats.dom.style.display = 'none' 35 | } 36 | } 37 | }) 38 | } 39 | 40 | update() { 41 | this.stats.update() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/engine/interface/InfoUI.ts: -------------------------------------------------------------------------------- 1 | import './info.scss' 2 | import gitHubLogo from '../../../assets/github.png' 3 | import twitterLogo from '../../../assets/twitter.png' 4 | 5 | export type InfoConfig = { 6 | twitter?: string 7 | github?: string 8 | description?: string 9 | title?: string 10 | documentTitle?: string 11 | } 12 | 13 | export class InfoUI { 14 | constructor(config: InfoConfig = {}) { 15 | if (config.documentTitle) { 16 | document.title = config.documentTitle 17 | } 18 | 19 | const container = document.createElement('div') 20 | container.classList.add('info-container') 21 | container.insertAdjacentHTML( 22 | 'beforeend', 23 | ` 24 | ${config.title ? `

${config.title}

` : ''} 25 | ${ 26 | config.description 27 | ? `
28 |

${config.description}

29 |
` 30 | : `` 31 | } 32 | 48 | ` 49 | ) 50 | document.body.prepend(container) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/engine/interface/Loader.ts: -------------------------------------------------------------------------------- 1 | import './loader.scss' 2 | 3 | export class Loader { 4 | element: HTMLDivElement 5 | 6 | constructor() { 7 | this.element = document.createElement('div') 8 | this.element.classList.add('loader') 9 | this.element.insertAdjacentHTML( 10 | 'beforeend', 11 | ` 12 |
13 |

0%

14 |
15 |
16 | ` 17 | ) 18 | 19 | this.start() 20 | } 21 | 22 | start() { 23 | document.body.prepend(this.element) 24 | } 25 | 26 | setProgress(progress: number) { 27 | const progressNumber = this.element.querySelector( 28 | '.progress-number' 29 | ) as HTMLHeadingElement 30 | 31 | progressNumber!.innerText = `${Math.floor(progress * 100)}%` 32 | 33 | const progressBar = this.element.querySelector( 34 | '.progress-bar' 35 | ) as HTMLDivElement 36 | 37 | progressBar.style.width = `${progress * 100}%` 38 | } 39 | 40 | complete() { 41 | this.element.remove() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/engine/interface/info.scss: -------------------------------------------------------------------------------- 1 | .info-container { 2 | position: absolute; 3 | bottom: 0; 4 | left: 0; 5 | padding: 16px 20px; 6 | 7 | display: flex; 8 | flex-direction: column; 9 | 10 | user-select: none; 11 | opacity: 40%; 12 | transition: opacity 0.3s ease-in-out; 13 | 14 | color: #fff; 15 | font-family: 'Helvetica', 'Arial', sans-serif; 16 | text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); 17 | 18 | &:hover { 19 | opacity: 100%; 20 | } 21 | 22 | h1 { 23 | margin-bottom: 0; 24 | font-weight: normal; 25 | } 26 | 27 | .description { 28 | width: 250px; 29 | max-width: 100%; 30 | margin-bottom: 4px; 31 | } 32 | 33 | .social-container { 34 | display: flex; 35 | flex-direction: row; 36 | justify-content: flex-start; 37 | align-items: center; 38 | } 39 | 40 | .social-button { 41 | display: flex; 42 | width: 24px; 43 | height: 24px; 44 | padding: 8px; 45 | margin-right: 8px; 46 | border-radius: 50px; 47 | align-items: center; 48 | 49 | background: #fff; 50 | transition: box-shadow 0.3s ease-in-out; 51 | 52 | &:hover { 53 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); 54 | } 55 | 56 | img { 57 | max-width: 100%; 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/engine/interface/loader.scss: -------------------------------------------------------------------------------- 1 | .loader { 2 | width: 100%; 3 | height: 100%; 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | 8 | color: #fff; 9 | font-family: 'Helvetica', 'Arial', sans-serif; 10 | font-weight: normal; 11 | 12 | .loader-inner { 13 | width: 500px; 14 | max-width: 95%; 15 | } 16 | 17 | .progress-number { 18 | text-align: center; 19 | } 20 | 21 | .progress-bar { 22 | background-color: #fff; 23 | transition: width 0.3s ease-in-out; 24 | 25 | height: 5px; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/engine/utilities/EventEmitter.ts: -------------------------------------------------------------------------------- 1 | export class EventEmitter { 2 | private listeners: { [key: string]: Function[] } = {} 3 | 4 | public on(event: string, listener: Function) { 5 | if (!this.listeners[event]) { 6 | this.listeners[event] = [] 7 | } 8 | 9 | this.listeners[event].push(listener) 10 | 11 | return () => this.off(event, listener) 12 | } 13 | 14 | public off(event: string, listener: Function) { 15 | if (!this.listeners[event]) { 16 | return 17 | } 18 | 19 | const index = this.listeners[event].indexOf(listener) 20 | 21 | if (index === -1) { 22 | return 23 | } 24 | 25 | this.listeners[event].splice(index, 1) 26 | } 27 | 28 | public emit(event: string, ...args: any[]) { 29 | if (!this.listeners[event]) { 30 | return 31 | } 32 | 33 | this.listeners[event].forEach((listener) => listener(...args)) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import './style.scss' 2 | import { Engine } from './engine/Engine' 3 | import { PencilLines } from './pencil-lines/PencilLines' 4 | 5 | new Engine({ 6 | canvas: document.querySelector('#canvas') as HTMLCanvasElement, 7 | experience: PencilLines, 8 | info: { 9 | twitter: 'https://twitter.com/maya_ndljk', 10 | github: 'https://github.com/mayacoda/pencil-lines', 11 | description: 'Three.js postprocessing effect to mimic sketchy lines', 12 | documentTitle: 'Pencil Lines', 13 | title: 'Pencil Lines', 14 | }, 15 | }) 16 | -------------------------------------------------------------------------------- /src/pencil-lines/Box.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three' 2 | 3 | export class Box extends THREE.Mesh { 4 | constructor() { 5 | const geometry = new THREE.TorusKnotGeometry(1, 0.3, 200, 32) 6 | 7 | const material = new THREE.MeshBasicMaterial({ 8 | color: 0x99dd99, 9 | }) 10 | 11 | super(geometry, material) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/pencil-lines/PencilLines.ts: -------------------------------------------------------------------------------- 1 | import type { Experience } from '../engine/Experience' 2 | import type { Resource } from '../engine/Resources' 3 | import type { Engine } from '../engine/Engine' 4 | import * as THREE from 'three' 5 | import { Box } from './Box' 6 | import { PencilLinesPass } from './PencilLinesPass' 7 | 8 | export class PencilLines implements Experience { 9 | resources: Resource[] = [ 10 | { 11 | name: 'colorNoiseTexture', 12 | type: 'texture', 13 | path: 'textures/color-noise.png', 14 | }, 15 | { 16 | name: 'cloudTexture', 17 | type: 'texture', 18 | path: 'textures/cloud-noise.png', 19 | }, 20 | ] 21 | pencilLinesPass!: PencilLinesPass 22 | 23 | constructor(private engine: Engine) {} 24 | 25 | init() { 26 | const plane = new THREE.Mesh( 27 | new THREE.PlaneGeometry(10, 10), 28 | new THREE.MeshStandardMaterial({ color: 0xffffff }) 29 | ) 30 | 31 | plane.rotation.x = -Math.PI / 2 32 | plane.receiveShadow = true 33 | 34 | this.engine.scene.add(plane) 35 | this.engine.scene.add(new THREE.AmbientLight(0xffffff, 0.5)) 36 | 37 | let directionalLight = new THREE.DirectionalLight(0xffffff, 1) 38 | directionalLight.castShadow = true 39 | directionalLight.position.set(2, 2, 2) 40 | directionalLight.shadow.mapSize.width = 2048 41 | directionalLight.shadow.mapSize.height = 2048 42 | 43 | this.engine.scene.add(directionalLight) 44 | 45 | const box = new Box() 46 | box.castShadow = true 47 | box.rotation.y = Math.PI / 4 48 | box.position.set(0, 0.5, 0) 49 | 50 | this.engine.scene.add(box) 51 | 52 | this.pencilLinesPass = new PencilLinesPass(this.engine) 53 | this.engine.renderEngine.composer.addPass(this.pencilLinesPass) 54 | } 55 | 56 | update() {} 57 | } 58 | -------------------------------------------------------------------------------- /src/pencil-lines/PencilLinesPass.ts: -------------------------------------------------------------------------------- 1 | import { FullScreenQuad, Pass } from 'three/examples/jsm/postprocessing/Pass' 2 | import type { WebGLRenderer } from 'three' 3 | import { 4 | HalfFloatType, 5 | MeshNormalMaterial, 6 | NearestFilter, 7 | RGBAFormat, 8 | WebGLRenderTarget, 9 | } from 'three' 10 | import { PencilLinesShader } from './PencilLinesShader' 11 | import type { Engine } from '../engine/Engine' 12 | 13 | export class PencilLinesPass extends Pass { 14 | fsQuad: FullScreenQuad 15 | material: PencilLinesShader 16 | normalMaterial: MeshNormalMaterial 17 | 18 | surfaceBuffer: WebGLRenderTarget 19 | 20 | constructor(private engine: Engine) { 21 | super() 22 | 23 | this.fsQuad = new FullScreenQuad() 24 | this.material = new PencilLinesShader(this.engine) 25 | 26 | this.fsQuad.material = this.material 27 | 28 | const surfaceBuffer = new WebGLRenderTarget( 29 | this.engine.sizes.width, 30 | this.engine.sizes.height 31 | ) 32 | surfaceBuffer.texture.format = RGBAFormat 33 | surfaceBuffer.texture.type = HalfFloatType 34 | surfaceBuffer.texture.minFilter = NearestFilter 35 | surfaceBuffer.texture.magFilter = NearestFilter 36 | surfaceBuffer.texture.generateMipmaps = false 37 | surfaceBuffer.stencilBuffer = false 38 | this.surfaceBuffer = surfaceBuffer 39 | 40 | this.normalMaterial = new MeshNormalMaterial() 41 | 42 | this.material.uniforms.uCameraNear.value = this.engine.camera.instance.near 43 | this.material.uniforms.uCameraFar.value = this.engine.camera.instance.far 44 | } 45 | 46 | render( 47 | renderer: WebGLRenderer, 48 | writeBuffer: WebGLRenderTarget, 49 | readBuffer: WebGLRenderTarget 50 | ) { 51 | const depthBuffer = writeBuffer.depthBuffer 52 | writeBuffer.depthBuffer = false 53 | 54 | renderer.setRenderTarget(this.surfaceBuffer) 55 | const overrideMaterialValue = this.engine.scene.overrideMaterial 56 | 57 | this.engine.scene.overrideMaterial = this.normalMaterial 58 | renderer.render(this.engine.scene, this.engine.camera.instance) 59 | this.engine.scene.overrideMaterial = overrideMaterialValue 60 | 61 | this.material.uniforms.uDiffuse.value = readBuffer.texture 62 | this.material.uniforms.uDepthBuffer.value = readBuffer.depthTexture 63 | this.material.uniforms.uSurfaceBuffer.value = this.surfaceBuffer.texture 64 | 65 | if (this.renderToScreen) { 66 | renderer.setRenderTarget(null) 67 | this.fsQuad.render(renderer) 68 | } else { 69 | renderer.setRenderTarget(writeBuffer) 70 | if (this.clear) renderer.clear() 71 | this.fsQuad.render(renderer) 72 | } 73 | 74 | writeBuffer.depthBuffer = depthBuffer 75 | } 76 | 77 | dispose() { 78 | this.material.dispose() 79 | this.fsQuad.dispose() 80 | } 81 | 82 | setSize() { 83 | this.material.resize() 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/pencil-lines/PencilLinesShader.ts: -------------------------------------------------------------------------------- 1 | import { ShaderMaterial, Vector2 } from 'three' 2 | import fragmentShader from './shaders/pencil-lines.frag' 3 | import vertexShader from './shaders/pencil-lines.vert' 4 | import { GameEntity } from '../engine/GameEntity' 5 | import { Engine } from '../engine/Engine' 6 | 7 | export class PencilLinesShader extends ShaderMaterial implements GameEntity { 8 | constructor(private engine: Engine) { 9 | super({ 10 | uniforms: { 11 | uDiffuse: { value: null }, 12 | uResolution: { 13 | value: new Vector2(1, 1), 14 | }, 15 | uDepthBuffer: { value: null }, 16 | uSurfaceBuffer: { value: null }, 17 | uCameraNear: { value: engine.camera.instance.near }, 18 | uCameraFar: { value: engine.camera.instance.far }, 19 | 20 | uColorTexture: { 21 | value: engine.resources.getItem('colorNoiseTexture'), 22 | }, 23 | uCloudTexture: { 24 | value: engine.resources.getItem('cloudTexture'), 25 | }, 26 | }, 27 | fragmentShader, 28 | vertexShader, 29 | }) 30 | 31 | this.uniforms.uResolution.value = new Vector2( 32 | this.engine.sizes.width, 33 | this.engine.sizes.height 34 | ) 35 | } 36 | 37 | update() {} 38 | 39 | resize() { 40 | this.uniforms.uResolution.value = new Vector2( 41 | this.engine.sizes.width, 42 | this.engine.sizes.height 43 | ) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/pencil-lines/shaders/gradientNoise.glsl: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // Copyright © 2013 Inigo Quilez 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 4 | // https://www.youtube.com/c/InigoQuilez 5 | // https://iquilezles.org 6 | 7 | 8 | // Gradient Noise (http://en.wikipedia.org/wiki/Gradient_noise), not to be confused with 9 | // Value Noise, and neither with Perlin's Noise (which is one form of Gradient Noise) 10 | // is probably the most convenient way to generate noise (a random smooth signal with 11 | // mostly all its energy in the low frequencies) suitable for procedural texturing/shading, 12 | // modeling and animation. 13 | // 14 | // It produces smoother and higher quality than Value Noise, but it's of course slighty more 15 | // expensive. 16 | // 17 | // The princpiple is to create a virtual grid/latice all over the plane, and assign one 18 | // random vector to every vertex in the grid. When querying/requesting a noise value at 19 | // an arbitrary point in the plane, the grid cell in which the query is performed is 20 | // determined, the four vertices of the grid are determined and their random vectors 21 | // fetched. Then, the position of the current point under evaluation relative to each 22 | // vertex is doted (projected) with that vertex' random vector, and the result is 23 | // bilinearly interpolated with a smooth interpolant. 24 | 25 | 26 | // Value Noise 2D, Derivatives: https://www.shadertoy.com/view/4dXBRH 27 | // Gradient Noise 2D, Derivatives: https://www.shadertoy.com/view/XdXBRH 28 | // Value Noise 3D, Derivatives: https://www.shadertoy.com/view/XsXfRH 29 | // Gradient Noise 3D, Derivatives: https://www.shadertoy.com/view/4dffRH 30 | // Value Noise 2D : https://www.shadertoy.com/view/lsf3WH 31 | // Value Noise 3D : https://www.shadertoy.com/view/4sfGzS 32 | // Gradient Noise 2D : https://www.shadertoy.com/view/XdXGW8 33 | // Gradient Noise 3D : https://www.shadertoy.com/view/Xsl3Dl 34 | // Simplex Noise 2D : https://www.shadertoy.com/view/Msf3WH 35 | // Wave Noise 2D : https://www.shadertoy.com/view/tldSRj 36 | 37 | // replace this anything that returns a random vector 38 | vec2 grad(ivec2 z) { 39 | // 2D to 1D (feel free to replace by some other) 40 | int n = z.x+z.y*11111; 41 | 42 | // Hugo Elias hash (feel free to replace by another one) 43 | n = (n<<13)^n; 44 | n = (n*(n*n*15731+789221)+1376312589)>>16; 45 | 46 | #if 0 47 | 48 | // simple random vectors 49 | return vec2(cos(float(n)), sin(float(n))); 50 | 51 | #else 52 | 53 | // Perlin style vectors 54 | n &= 7; 55 | vec2 gr = vec2(n&1, n>>1)*2.0-1.0; 56 | return (n>=6) ? vec2(0.0, gr.x) : 57 | (n>=4) ? vec2(gr.x, 0.0) : 58 | gr; 59 | #endif 60 | } 61 | 62 | float noise(in vec2 p) { 63 | ivec2 i = ivec2(floor(p)); 64 | vec2 f = fract(p); 65 | 66 | vec2 u = f*f*(3.0-2.0*f);// feel free to replace by a quintic smoothstep instead 67 | 68 | return mix(mix(dot(grad(i+ivec2(0, 0)), f-vec2(0.0, 0.0)), 69 | dot(grad(i+ivec2(1, 0)), f-vec2(1.0, 0.0)), u.x), 70 | mix(dot(grad(i+ivec2(0, 1)), f-vec2(0.0, 1.0)), 71 | dot(grad(i+ivec2(1, 1)), f-vec2(1.0, 1.0)), u.x), u.y); 72 | } 73 | -------------------------------------------------------------------------------- /src/pencil-lines/shaders/pencil-lines.frag: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include ./gradientNoise.glsl; 4 | 5 | uniform sampler2D uDiffuse; 6 | uniform sampler2D uSurfaceBuffer; 7 | uniform sampler2D uDepthBuffer; 8 | 9 | uniform sampler2D uCloudTexture; 10 | uniform sampler2D uColorTexture; 11 | 12 | uniform float uNear; 13 | uniform float uFar; 14 | 15 | uniform vec2 uResolution; 16 | 17 | varying vec2 vUv; 18 | 19 | 20 | // The MIT License 21 | // Copyright © 2013 Inigo Quilez 22 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | // https://www.youtube.com/c/InigoQuilez 24 | // https://iquilezles.org/ 25 | // 26 | // https://www.shadertoy.com/view/lsf3WH 27 | // SimonDev: Renamed function to "Math_Random" from "hash" 28 | //float Math_Random(vec2 p) // replace this by something better 29 | //{ 30 | // p = 50.0*fract( p*0.3183099 + vec2(0.71,0.113)); 31 | // return -1.0+2.0*fract( p.x*p.y*(p.x+p.y) ); 32 | //} 33 | // 34 | //float noise( in vec2 p ) 35 | //{ 36 | // vec2 i = floor( p ); 37 | // vec2 f = fract( p ); 38 | // 39 | // vec2 u = f*f*(3.0-2.0*f); 40 | // 41 | // return mix( mix( Math_Random( i + vec2(0.0,0.0) ), 42 | // Math_Random( i + vec2(1.0,0.0) ), u.x), 43 | // mix( Math_Random( i + vec2(0.0,1.0) ), 44 | // Math_Random( i + vec2(1.0,1.0) ), u.x), u.y); 45 | //} 46 | 47 | float valueAtPoint(sampler2D image, vec2 coord, vec2 texel, vec2 point) { 48 | vec3 luma = vec3(0.299, 0.587, 0.114); 49 | 50 | return dot(texture2D(image, coord + texel * point).xyz, luma); 51 | } 52 | 53 | float diffuseValue(int x, int y) { 54 | float cutoff = 40.0; 55 | float offset = 0.5 / cutoff; 56 | float noiseValue = clamp(texture(uCloudTexture, vUv).r, 0.0, cutoff) / cutoff - offset; 57 | 58 | return valueAtPoint(uDiffuse, vUv + noiseValue, vec2(1.0 / uResolution.x, 1.0 / uResolution.y), vec2(x, y)) * 0.6; 59 | } 60 | 61 | float normalValue(int x, int y) { 62 | float cutoff = 50.0; 63 | float offset = 0.5 / cutoff; 64 | float noiseValue = clamp(texture(uCloudTexture, vUv).r, 0.0, cutoff) / cutoff - offset; 65 | 66 | return valueAtPoint(uSurfaceBuffer, vUv + noiseValue, vec2(1.0 / uResolution.x, 1.0 / uResolution.y), vec2(x, y)) * 0.3; 67 | } 68 | 69 | float getValue(int x, int y) { 70 | float noiseValue = noise(gl_FragCoord.xy); 71 | noiseValue = noiseValue * 2.0 - 1.0; 72 | noiseValue *= 10.0; 73 | 74 | return diffuseValue(x, y) + normalValue(x, y) * noiseValue; 75 | // return diffuseValue(x, y) + normalValue(x, y); 76 | } 77 | 78 | float getPixelDepth(int x, int y) { 79 | float fragCoordZ = texture2D(uDepthBuffer, vUv + vec2(x, y) * 1.0 / uResolution).x; 80 | float viewZ = perspectiveDepthToViewZ(fragCoordZ, uNear, uFar); 81 | return viewZToOrthographicDepth(viewZ, uNear, uFar); 82 | } 83 | 84 | vec3 getSurfaceValue(int x, int y) { 85 | return texture2D(uSurfaceBuffer, vUv + vec2(x, y) / uResolution).rgb; 86 | } 87 | 88 | float sobelFloat(sampler2D diffuse, vec2 uv, vec2 texel) { 89 | // kernel definition (in glsl matrices are filled in column-major order) 90 | const mat3 Gx = mat3(-1, -2, -1, 0, 0, 0, 1, 2, 1);// x direction kernel 91 | const mat3 Gy = mat3(-1, 0, 1, -2, 0, 2, -1, 0, 1);// y direction kernel 92 | 93 | // fetch the 3x3 neighbourhood of a fragment 94 | 95 | // first column 96 | float tx0y0 = getValue(-1, -1); 97 | float tx0y1 = getValue(-1, 0); 98 | float tx0y2 = getValue(-1, 1); 99 | 100 | // second column 101 | float tx1y0 = getValue(0, -1); 102 | float tx1y1 = getValue(0, 0); 103 | float tx1y2 = getValue(0, 1); 104 | 105 | // third column 106 | float tx2y0 = getValue(1, -1); 107 | float tx2y1 = getValue(1, 0); 108 | float tx2y2 = getValue(1, 1); 109 | 110 | // gradient value in x direction 111 | float valueGx = Gx[0][0] * tx0y0 + Gx[1][0] * tx1y0 + Gx[2][0] * tx2y0 + 112 | Gx[0][1] * tx0y1 + Gx[1][1] * tx1y1 + Gx[2][1] * tx2y1 + 113 | Gx[0][2] * tx0y2 + Gx[1][2] * tx1y2 + Gx[2][2] * tx2y2; 114 | 115 | // gradient value in y direction 116 | float valueGy = Gy[0][0] * tx0y0 + Gy[1][0] * tx1y0 + Gy[2][0] * tx2y0 + 117 | Gy[0][1] * tx0y1 + Gy[1][1] * tx1y1 + Gy[2][1] * tx2y1 + 118 | Gy[0][2] * tx0y2 + Gy[1][2] * tx1y2 + Gy[2][2] * tx2y2; 119 | 120 | // magnitute of the total gradient 121 | float G = (valueGx * valueGx) + (valueGy * valueGy); 122 | return clamp(G, 0.0, 1.0); 123 | } 124 | 125 | float readDepth( sampler2D depthSampler, vec2 coord ) { 126 | float fragCoordZ = texture2D( depthSampler, coord ).x; 127 | float viewZ = perspectiveDepthToViewZ( fragCoordZ, uNear, uFar ); 128 | return viewZToOrthographicDepth( viewZ, uNear, uFar ); 129 | } 130 | 131 | 132 | void main() { 133 | vec2 size = vec2(textureSize(uDiffuse, 0)); 134 | vec4 texel = texture2D(uDiffuse, vUv); 135 | 136 | vec2 fragCoord = gl_FragCoord.xy; 137 | 138 | vec2 noiseValue = vec2(noise(fragCoord)); 139 | noiseValue = noiseValue * 2.0 - 1.0; 140 | noiseValue *= 10.0; 141 | 142 | vec4 cloudNoiseValue = texture2D(uCloudTexture, vUv); 143 | 144 | float sobelValue = sobelFloat(uDiffuse, vUv, 1.0 / uResolution); 145 | sobelValue = smoothstep(0.01, 0.03, sobelValue); 146 | 147 | vec4 uLineColor = vec4(0.32, 0.12, 0.2, 1.0); 148 | 149 | if (sobelValue > 0.1) { 150 | gl_FragColor = uLineColor * 0.5; 151 | } else { 152 | gl_FragColor = texel; 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /src/pencil-lines/shaders/pencil-lines.vert: -------------------------------------------------------------------------------- 1 | varying vec2 vUv; 2 | 3 | void main() { 4 | 5 | vUv = uv; 6 | 7 | gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); 8 | } 9 | -------------------------------------------------------------------------------- /src/pencil-lines/shaders/shader.frag: -------------------------------------------------------------------------------- 1 | void main() { 2 | gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 3 | } 4 | -------------------------------------------------------------------------------- /src/pencil-lines/shaders/shader.vert: -------------------------------------------------------------------------------- 1 | void main() { 2 | gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); 3 | } 4 | -------------------------------------------------------------------------------- /src/style.scss: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | #canvas { 4 | height: 100%; 5 | width: 100%; 6 | margin: 0; 7 | padding: 0; 8 | overflow: hidden; 9 | background: #000; 10 | } 11 | 12 | #canvas { 13 | outline: none; 14 | } 15 | -------------------------------------------------------------------------------- /src/types/glsl.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.glsl' { 2 | const value: string 3 | export default value 4 | } 5 | 6 | declare module '*.frag' { 7 | const value: string 8 | export default value 9 | } 10 | 11 | declare module '*.vert' { 12 | const value: string 13 | export default value 14 | } 15 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ESNext", "DOM"], 7 | "moduleResolution": "Node", 8 | "strict": true, 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "isolatedModules": true, 12 | "esModuleInterop": true, 13 | "noEmit": true, 14 | "noUnusedLocals": true, 15 | "noUnusedParameters": true, 16 | "noImplicitReturns": true, 17 | "skipLibCheck": true 18 | }, 19 | "include": ["src"] 20 | } 21 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import glsl from 'vite-plugin-glsl' 2 | import { defineConfig } from 'vite' 3 | 4 | export default defineConfig({ 5 | plugins: [glsl.default()], //For some reason, cannot resolve glsl(). Workaround found on vite-plugin-glsl issue (https://github.com/UstymUkhman/vite-plugin-glsl/issues/1#issuecomment-972660771) 6 | }) 7 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 6 6 | cacheKey: 8 7 | 8 | "@gar/promisify@npm:^1.1.3": 9 | version: 1.1.3 10 | resolution: "@gar/promisify@npm:1.1.3" 11 | checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 12 | languageName: node 13 | linkType: hard 14 | 15 | "@npmcli/fs@npm:^2.1.0": 16 | version: 2.1.1 17 | resolution: "@npmcli/fs@npm:2.1.1" 18 | dependencies: 19 | "@gar/promisify": ^1.1.3 20 | semver: ^7.3.5 21 | checksum: 4944a0545d38d3e6e29780eeb3cd4be6059c1e9627509d2c9ced635c53b852d28b37cdc615a2adf815b51ab8673adb6507e370401a20a7e90c8a6dc4fac02389 22 | languageName: node 23 | linkType: hard 24 | 25 | "@npmcli/move-file@npm:^2.0.0": 26 | version: 2.0.0 27 | resolution: "@npmcli/move-file@npm:2.0.0" 28 | dependencies: 29 | mkdirp: ^1.0.4 30 | rimraf: ^3.0.2 31 | checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0 32 | languageName: node 33 | linkType: hard 34 | 35 | "@rollup/pluginutils@npm:^4.2.1": 36 | version: 4.2.1 37 | resolution: "@rollup/pluginutils@npm:4.2.1" 38 | dependencies: 39 | estree-walker: ^2.0.1 40 | picomatch: ^2.2.2 41 | checksum: 6bc41f22b1a0f1efec3043899e4d3b6b1497b3dea4d94292d8f83b4cf07a1073ecbaedd562a22d11913ff7659f459677b01b09e9598a98936e746780ecc93a12 42 | languageName: node 43 | linkType: hard 44 | 45 | "@tootallnate/once@npm:2": 46 | version: 2.0.0 47 | resolution: "@tootallnate/once@npm:2.0.0" 48 | checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 49 | languageName: node 50 | linkType: hard 51 | 52 | "@types/three@npm:^0.144.0": 53 | version: 0.144.0 54 | resolution: "@types/three@npm:0.144.0" 55 | dependencies: 56 | "@types/webxr": "*" 57 | checksum: 7ce69e1a48ba6d19dc9efb78c5c67a3e66c036f240386dd700eda7a5964e44550066ac45bc0997bd4fe7be446edae356313d992361c18415191468dfdbfb454d 58 | languageName: node 59 | linkType: hard 60 | 61 | "@types/webxr@npm:*": 62 | version: 0.4.0 63 | resolution: "@types/webxr@npm:0.4.0" 64 | checksum: 4388c18a5b08ef4aa97f2177d3d80d384c5557c4b06278215d46472585923128fb316353e5fb799d22ffe99be149af90d0c27c41cb3681e82228088e48b24184 65 | languageName: node 66 | linkType: hard 67 | 68 | "abbrev@npm:1": 69 | version: 1.1.1 70 | resolution: "abbrev@npm:1.1.1" 71 | checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 72 | languageName: node 73 | linkType: hard 74 | 75 | "agent-base@npm:6, agent-base@npm:^6.0.2": 76 | version: 6.0.2 77 | resolution: "agent-base@npm:6.0.2" 78 | dependencies: 79 | debug: 4 80 | checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d 81 | languageName: node 82 | linkType: hard 83 | 84 | "agentkeepalive@npm:^4.2.1": 85 | version: 4.2.1 86 | resolution: "agentkeepalive@npm:4.2.1" 87 | dependencies: 88 | debug: ^4.1.0 89 | depd: ^1.1.2 90 | humanize-ms: ^1.2.1 91 | checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 92 | languageName: node 93 | linkType: hard 94 | 95 | "aggregate-error@npm:^3.0.0": 96 | version: 3.1.0 97 | resolution: "aggregate-error@npm:3.1.0" 98 | dependencies: 99 | clean-stack: ^2.0.0 100 | indent-string: ^4.0.0 101 | checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 102 | languageName: node 103 | linkType: hard 104 | 105 | "ansi-escapes@npm:^4.3.0": 106 | version: 4.3.2 107 | resolution: "ansi-escapes@npm:4.3.2" 108 | dependencies: 109 | type-fest: ^0.21.3 110 | checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 111 | languageName: node 112 | linkType: hard 113 | 114 | "ansi-regex@npm:^5.0.1": 115 | version: 5.0.1 116 | resolution: "ansi-regex@npm:5.0.1" 117 | checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b 118 | languageName: node 119 | linkType: hard 120 | 121 | "ansi-regex@npm:^6.0.1": 122 | version: 6.0.1 123 | resolution: "ansi-regex@npm:6.0.1" 124 | checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 125 | languageName: node 126 | linkType: hard 127 | 128 | "ansi-styles@npm:^4.0.0": 129 | version: 4.3.0 130 | resolution: "ansi-styles@npm:4.3.0" 131 | dependencies: 132 | color-convert: ^2.0.1 133 | checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 134 | languageName: node 135 | linkType: hard 136 | 137 | "ansi-styles@npm:^6.0.0": 138 | version: 6.1.0 139 | resolution: "ansi-styles@npm:6.1.0" 140 | checksum: 7a7f8528c07a9d20c3a92bccd2b6bc3bb4d26e5cb775c02826921477377bd495d615d61f710d56216344b6238d1d11ef2b0348e146c5b128715578bfb3217229 141 | languageName: node 142 | linkType: hard 143 | 144 | "anymatch@npm:~3.1.2": 145 | version: 3.1.2 146 | resolution: "anymatch@npm:3.1.2" 147 | dependencies: 148 | normalize-path: ^3.0.0 149 | picomatch: ^2.0.4 150 | checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9 151 | languageName: node 152 | linkType: hard 153 | 154 | "aproba@npm:^1.0.3 || ^2.0.0": 155 | version: 2.0.0 156 | resolution: "aproba@npm:2.0.0" 157 | checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 158 | languageName: node 159 | linkType: hard 160 | 161 | "are-we-there-yet@npm:^3.0.0": 162 | version: 3.0.0 163 | resolution: "are-we-there-yet@npm:3.0.0" 164 | dependencies: 165 | delegates: ^1.0.0 166 | readable-stream: ^3.6.0 167 | checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981 168 | languageName: node 169 | linkType: hard 170 | 171 | "astral-regex@npm:^2.0.0": 172 | version: 2.0.0 173 | resolution: "astral-regex@npm:2.0.0" 174 | checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 175 | languageName: node 176 | linkType: hard 177 | 178 | "balanced-match@npm:^1.0.0": 179 | version: 1.0.2 180 | resolution: "balanced-match@npm:1.0.2" 181 | checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 182 | languageName: node 183 | linkType: hard 184 | 185 | "binary-extensions@npm:^2.0.0": 186 | version: 2.2.0 187 | resolution: "binary-extensions@npm:2.2.0" 188 | checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 189 | languageName: node 190 | linkType: hard 191 | 192 | "brace-expansion@npm:^1.1.7": 193 | version: 1.1.11 194 | resolution: "brace-expansion@npm:1.1.11" 195 | dependencies: 196 | balanced-match: ^1.0.0 197 | concat-map: 0.0.1 198 | checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 199 | languageName: node 200 | linkType: hard 201 | 202 | "brace-expansion@npm:^2.0.1": 203 | version: 2.0.1 204 | resolution: "brace-expansion@npm:2.0.1" 205 | dependencies: 206 | balanced-match: ^1.0.0 207 | checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 208 | languageName: node 209 | linkType: hard 210 | 211 | "braces@npm:^3.0.2, braces@npm:~3.0.2": 212 | version: 3.0.2 213 | resolution: "braces@npm:3.0.2" 214 | dependencies: 215 | fill-range: ^7.0.1 216 | checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 217 | languageName: node 218 | linkType: hard 219 | 220 | "cacache@npm:^16.1.0": 221 | version: 16.1.1 222 | resolution: "cacache@npm:16.1.1" 223 | dependencies: 224 | "@npmcli/fs": ^2.1.0 225 | "@npmcli/move-file": ^2.0.0 226 | chownr: ^2.0.0 227 | fs-minipass: ^2.1.0 228 | glob: ^8.0.1 229 | infer-owner: ^1.0.4 230 | lru-cache: ^7.7.1 231 | minipass: ^3.1.6 232 | minipass-collect: ^1.0.2 233 | minipass-flush: ^1.0.5 234 | minipass-pipeline: ^1.2.4 235 | mkdirp: ^1.0.4 236 | p-map: ^4.0.0 237 | promise-inflight: ^1.0.1 238 | rimraf: ^3.0.2 239 | ssri: ^9.0.0 240 | tar: ^6.1.11 241 | unique-filename: ^1.1.1 242 | checksum: 488524617008b793f0249b0c4ea2c330c710ca997921376e15650cc2415a8054491ae2dee9f01382c2015602c0641f3f977faf2fa7361aa33d2637dcfb03907a 243 | languageName: node 244 | linkType: hard 245 | 246 | "chokidar@npm:>=3.0.0 <4.0.0": 247 | version: 3.5.3 248 | resolution: "chokidar@npm:3.5.3" 249 | dependencies: 250 | anymatch: ~3.1.2 251 | braces: ~3.0.2 252 | fsevents: ~2.3.2 253 | glob-parent: ~5.1.2 254 | is-binary-path: ~2.1.0 255 | is-glob: ~4.0.1 256 | normalize-path: ~3.0.0 257 | readdirp: ~3.6.0 258 | dependenciesMeta: 259 | fsevents: 260 | optional: true 261 | checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c 262 | languageName: node 263 | linkType: hard 264 | 265 | "chownr@npm:^2.0.0": 266 | version: 2.0.0 267 | resolution: "chownr@npm:2.0.0" 268 | checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f 269 | languageName: node 270 | linkType: hard 271 | 272 | "clean-stack@npm:^2.0.0": 273 | version: 2.2.0 274 | resolution: "clean-stack@npm:2.2.0" 275 | checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 276 | languageName: node 277 | linkType: hard 278 | 279 | "cli-cursor@npm:^3.1.0": 280 | version: 3.1.0 281 | resolution: "cli-cursor@npm:3.1.0" 282 | dependencies: 283 | restore-cursor: ^3.1.0 284 | checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 285 | languageName: node 286 | linkType: hard 287 | 288 | "cli-truncate@npm:^2.1.0": 289 | version: 2.1.0 290 | resolution: "cli-truncate@npm:2.1.0" 291 | dependencies: 292 | slice-ansi: ^3.0.0 293 | string-width: ^4.2.0 294 | checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d 295 | languageName: node 296 | linkType: hard 297 | 298 | "cli-truncate@npm:^3.1.0": 299 | version: 3.1.0 300 | resolution: "cli-truncate@npm:3.1.0" 301 | dependencies: 302 | slice-ansi: ^5.0.0 303 | string-width: ^5.0.0 304 | checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a 305 | languageName: node 306 | linkType: hard 307 | 308 | "color-convert@npm:^2.0.1": 309 | version: 2.0.1 310 | resolution: "color-convert@npm:2.0.1" 311 | dependencies: 312 | color-name: ~1.1.4 313 | checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 314 | languageName: node 315 | linkType: hard 316 | 317 | "color-name@npm:~1.1.4": 318 | version: 1.1.4 319 | resolution: "color-name@npm:1.1.4" 320 | checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 321 | languageName: node 322 | linkType: hard 323 | 324 | "color-support@npm:^1.1.3": 325 | version: 1.1.3 326 | resolution: "color-support@npm:1.1.3" 327 | bin: 328 | color-support: bin.js 329 | checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b 330 | languageName: node 331 | linkType: hard 332 | 333 | "colorette@npm:^2.0.16, colorette@npm:^2.0.17": 334 | version: 2.0.19 335 | resolution: "colorette@npm:2.0.19" 336 | checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 337 | languageName: node 338 | linkType: hard 339 | 340 | "commander@npm:^9.3.0": 341 | version: 9.4.0 342 | resolution: "commander@npm:9.4.0" 343 | checksum: a322de584a6ccd1ea83c24f6a660e52d16ffbe2613fcfbb8d2cc68bc9dec637492456d754fe8bb5b039ad843ed8e04fb0b107e581a75f62cde9e1a0ab1546e09 344 | languageName: node 345 | linkType: hard 346 | 347 | "concat-map@npm:0.0.1": 348 | version: 0.0.1 349 | resolution: "concat-map@npm:0.0.1" 350 | checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af 351 | languageName: node 352 | linkType: hard 353 | 354 | "console-control-strings@npm:^1.1.0": 355 | version: 1.1.0 356 | resolution: "console-control-strings@npm:1.1.0" 357 | checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed 358 | languageName: node 359 | linkType: hard 360 | 361 | "cross-spawn@npm:^7.0.3": 362 | version: 7.0.3 363 | resolution: "cross-spawn@npm:7.0.3" 364 | dependencies: 365 | path-key: ^3.1.0 366 | shebang-command: ^2.0.0 367 | which: ^2.0.1 368 | checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 369 | languageName: node 370 | linkType: hard 371 | 372 | "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.3, debug@npm:^4.3.4": 373 | version: 4.3.4 374 | resolution: "debug@npm:4.3.4" 375 | dependencies: 376 | ms: 2.1.2 377 | peerDependenciesMeta: 378 | supports-color: 379 | optional: true 380 | checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 381 | languageName: node 382 | linkType: hard 383 | 384 | "delegates@npm:^1.0.0": 385 | version: 1.0.0 386 | resolution: "delegates@npm:1.0.0" 387 | checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd 388 | languageName: node 389 | linkType: hard 390 | 391 | "depd@npm:^1.1.2": 392 | version: 1.1.2 393 | resolution: "depd@npm:1.1.2" 394 | checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 395 | languageName: node 396 | linkType: hard 397 | 398 | "eastasianwidth@npm:^0.2.0": 399 | version: 0.2.0 400 | resolution: "eastasianwidth@npm:0.2.0" 401 | checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed 402 | languageName: node 403 | linkType: hard 404 | 405 | "emoji-regex@npm:^8.0.0": 406 | version: 8.0.0 407 | resolution: "emoji-regex@npm:8.0.0" 408 | checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 409 | languageName: node 410 | linkType: hard 411 | 412 | "emoji-regex@npm:^9.2.2": 413 | version: 9.2.2 414 | resolution: "emoji-regex@npm:9.2.2" 415 | checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 416 | languageName: node 417 | linkType: hard 418 | 419 | "encoding@npm:^0.1.13": 420 | version: 0.1.13 421 | resolution: "encoding@npm:0.1.13" 422 | dependencies: 423 | iconv-lite: ^0.6.2 424 | checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f 425 | languageName: node 426 | linkType: hard 427 | 428 | "env-paths@npm:^2.2.0": 429 | version: 2.2.1 430 | resolution: "env-paths@npm:2.2.1" 431 | checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e 432 | languageName: node 433 | linkType: hard 434 | 435 | "err-code@npm:^2.0.2": 436 | version: 2.0.3 437 | resolution: "err-code@npm:2.0.3" 438 | checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 439 | languageName: node 440 | linkType: hard 441 | 442 | "esbuild-android-64@npm:0.14.50": 443 | version: 0.14.50 444 | resolution: "esbuild-android-64@npm:0.14.50" 445 | conditions: os=android & cpu=x64 446 | languageName: node 447 | linkType: hard 448 | 449 | "esbuild-android-arm64@npm:0.14.50": 450 | version: 0.14.50 451 | resolution: "esbuild-android-arm64@npm:0.14.50" 452 | conditions: os=android & cpu=arm64 453 | languageName: node 454 | linkType: hard 455 | 456 | "esbuild-darwin-64@npm:0.14.50": 457 | version: 0.14.50 458 | resolution: "esbuild-darwin-64@npm:0.14.50" 459 | conditions: os=darwin & cpu=x64 460 | languageName: node 461 | linkType: hard 462 | 463 | "esbuild-darwin-arm64@npm:0.14.50": 464 | version: 0.14.50 465 | resolution: "esbuild-darwin-arm64@npm:0.14.50" 466 | conditions: os=darwin & cpu=arm64 467 | languageName: node 468 | linkType: hard 469 | 470 | "esbuild-freebsd-64@npm:0.14.50": 471 | version: 0.14.50 472 | resolution: "esbuild-freebsd-64@npm:0.14.50" 473 | conditions: os=freebsd & cpu=x64 474 | languageName: node 475 | linkType: hard 476 | 477 | "esbuild-freebsd-arm64@npm:0.14.50": 478 | version: 0.14.50 479 | resolution: "esbuild-freebsd-arm64@npm:0.14.50" 480 | conditions: os=freebsd & cpu=arm64 481 | languageName: node 482 | linkType: hard 483 | 484 | "esbuild-linux-32@npm:0.14.50": 485 | version: 0.14.50 486 | resolution: "esbuild-linux-32@npm:0.14.50" 487 | conditions: os=linux & cpu=ia32 488 | languageName: node 489 | linkType: hard 490 | 491 | "esbuild-linux-64@npm:0.14.50": 492 | version: 0.14.50 493 | resolution: "esbuild-linux-64@npm:0.14.50" 494 | conditions: os=linux & cpu=x64 495 | languageName: node 496 | linkType: hard 497 | 498 | "esbuild-linux-arm64@npm:0.14.50": 499 | version: 0.14.50 500 | resolution: "esbuild-linux-arm64@npm:0.14.50" 501 | conditions: os=linux & cpu=arm64 502 | languageName: node 503 | linkType: hard 504 | 505 | "esbuild-linux-arm@npm:0.14.50": 506 | version: 0.14.50 507 | resolution: "esbuild-linux-arm@npm:0.14.50" 508 | conditions: os=linux & cpu=arm 509 | languageName: node 510 | linkType: hard 511 | 512 | "esbuild-linux-mips64le@npm:0.14.50": 513 | version: 0.14.50 514 | resolution: "esbuild-linux-mips64le@npm:0.14.50" 515 | conditions: os=linux & cpu=mips64el 516 | languageName: node 517 | linkType: hard 518 | 519 | "esbuild-linux-ppc64le@npm:0.14.50": 520 | version: 0.14.50 521 | resolution: "esbuild-linux-ppc64le@npm:0.14.50" 522 | conditions: os=linux & cpu=ppc64 523 | languageName: node 524 | linkType: hard 525 | 526 | "esbuild-linux-riscv64@npm:0.14.50": 527 | version: 0.14.50 528 | resolution: "esbuild-linux-riscv64@npm:0.14.50" 529 | conditions: os=linux & cpu=riscv64 530 | languageName: node 531 | linkType: hard 532 | 533 | "esbuild-linux-s390x@npm:0.14.50": 534 | version: 0.14.50 535 | resolution: "esbuild-linux-s390x@npm:0.14.50" 536 | conditions: os=linux & cpu=s390x 537 | languageName: node 538 | linkType: hard 539 | 540 | "esbuild-netbsd-64@npm:0.14.50": 541 | version: 0.14.50 542 | resolution: "esbuild-netbsd-64@npm:0.14.50" 543 | conditions: os=netbsd & cpu=x64 544 | languageName: node 545 | linkType: hard 546 | 547 | "esbuild-openbsd-64@npm:0.14.50": 548 | version: 0.14.50 549 | resolution: "esbuild-openbsd-64@npm:0.14.50" 550 | conditions: os=openbsd & cpu=x64 551 | languageName: node 552 | linkType: hard 553 | 554 | "esbuild-sunos-64@npm:0.14.50": 555 | version: 0.14.50 556 | resolution: "esbuild-sunos-64@npm:0.14.50" 557 | conditions: os=sunos & cpu=x64 558 | languageName: node 559 | linkType: hard 560 | 561 | "esbuild-windows-32@npm:0.14.50": 562 | version: 0.14.50 563 | resolution: "esbuild-windows-32@npm:0.14.50" 564 | conditions: os=win32 & cpu=ia32 565 | languageName: node 566 | linkType: hard 567 | 568 | "esbuild-windows-64@npm:0.14.50": 569 | version: 0.14.50 570 | resolution: "esbuild-windows-64@npm:0.14.50" 571 | conditions: os=win32 & cpu=x64 572 | languageName: node 573 | linkType: hard 574 | 575 | "esbuild-windows-arm64@npm:0.14.50": 576 | version: 0.14.50 577 | resolution: "esbuild-windows-arm64@npm:0.14.50" 578 | conditions: os=win32 & cpu=arm64 579 | languageName: node 580 | linkType: hard 581 | 582 | "esbuild@npm:^0.14.47": 583 | version: 0.14.50 584 | resolution: "esbuild@npm:0.14.50" 585 | dependencies: 586 | esbuild-android-64: 0.14.50 587 | esbuild-android-arm64: 0.14.50 588 | esbuild-darwin-64: 0.14.50 589 | esbuild-darwin-arm64: 0.14.50 590 | esbuild-freebsd-64: 0.14.50 591 | esbuild-freebsd-arm64: 0.14.50 592 | esbuild-linux-32: 0.14.50 593 | esbuild-linux-64: 0.14.50 594 | esbuild-linux-arm: 0.14.50 595 | esbuild-linux-arm64: 0.14.50 596 | esbuild-linux-mips64le: 0.14.50 597 | esbuild-linux-ppc64le: 0.14.50 598 | esbuild-linux-riscv64: 0.14.50 599 | esbuild-linux-s390x: 0.14.50 600 | esbuild-netbsd-64: 0.14.50 601 | esbuild-openbsd-64: 0.14.50 602 | esbuild-sunos-64: 0.14.50 603 | esbuild-windows-32: 0.14.50 604 | esbuild-windows-64: 0.14.50 605 | esbuild-windows-arm64: 0.14.50 606 | dependenciesMeta: 607 | esbuild-android-64: 608 | optional: true 609 | esbuild-android-arm64: 610 | optional: true 611 | esbuild-darwin-64: 612 | optional: true 613 | esbuild-darwin-arm64: 614 | optional: true 615 | esbuild-freebsd-64: 616 | optional: true 617 | esbuild-freebsd-arm64: 618 | optional: true 619 | esbuild-linux-32: 620 | optional: true 621 | esbuild-linux-64: 622 | optional: true 623 | esbuild-linux-arm: 624 | optional: true 625 | esbuild-linux-arm64: 626 | optional: true 627 | esbuild-linux-mips64le: 628 | optional: true 629 | esbuild-linux-ppc64le: 630 | optional: true 631 | esbuild-linux-riscv64: 632 | optional: true 633 | esbuild-linux-s390x: 634 | optional: true 635 | esbuild-netbsd-64: 636 | optional: true 637 | esbuild-openbsd-64: 638 | optional: true 639 | esbuild-sunos-64: 640 | optional: true 641 | esbuild-windows-32: 642 | optional: true 643 | esbuild-windows-64: 644 | optional: true 645 | esbuild-windows-arm64: 646 | optional: true 647 | bin: 648 | esbuild: bin/esbuild 649 | checksum: 91e9b9403804ad24c61477d509bbe908ee17d53a6ad368e29882889da0e1c7d352937239ca8bad82c4357960c1606a8ef9c2ac97781e59aa82dc9dadff345525 650 | languageName: node 651 | linkType: hard 652 | 653 | "estree-walker@npm:^2.0.1": 654 | version: 2.0.2 655 | resolution: "estree-walker@npm:2.0.2" 656 | checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc 657 | languageName: node 658 | linkType: hard 659 | 660 | "execa@npm:^6.1.0": 661 | version: 6.1.0 662 | resolution: "execa@npm:6.1.0" 663 | dependencies: 664 | cross-spawn: ^7.0.3 665 | get-stream: ^6.0.1 666 | human-signals: ^3.0.1 667 | is-stream: ^3.0.0 668 | merge-stream: ^2.0.0 669 | npm-run-path: ^5.1.0 670 | onetime: ^6.0.0 671 | signal-exit: ^3.0.7 672 | strip-final-newline: ^3.0.0 673 | checksum: 1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e 674 | languageName: node 675 | linkType: hard 676 | 677 | "fill-range@npm:^7.0.1": 678 | version: 7.0.1 679 | resolution: "fill-range@npm:7.0.1" 680 | dependencies: 681 | to-regex-range: ^5.0.1 682 | checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 683 | languageName: node 684 | linkType: hard 685 | 686 | "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": 687 | version: 2.1.0 688 | resolution: "fs-minipass@npm:2.1.0" 689 | dependencies: 690 | minipass: ^3.0.0 691 | checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 692 | languageName: node 693 | linkType: hard 694 | 695 | "fs.realpath@npm:^1.0.0": 696 | version: 1.0.0 697 | resolution: "fs.realpath@npm:1.0.0" 698 | checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 699 | languageName: node 700 | linkType: hard 701 | 702 | "fsevents@npm:~2.3.2": 703 | version: 2.3.2 704 | resolution: "fsevents@npm:2.3.2" 705 | dependencies: 706 | node-gyp: latest 707 | checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f 708 | conditions: os=darwin 709 | languageName: node 710 | linkType: hard 711 | 712 | "fsevents@patch:fsevents@~2.3.2#~builtin": 713 | version: 2.3.2 714 | resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" 715 | dependencies: 716 | node-gyp: latest 717 | conditions: os=darwin 718 | languageName: node 719 | linkType: hard 720 | 721 | "function-bind@npm:^1.1.1": 722 | version: 1.1.1 723 | resolution: "function-bind@npm:1.1.1" 724 | checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a 725 | languageName: node 726 | linkType: hard 727 | 728 | "gauge@npm:^4.0.3": 729 | version: 4.0.4 730 | resolution: "gauge@npm:4.0.4" 731 | dependencies: 732 | aproba: ^1.0.3 || ^2.0.0 733 | color-support: ^1.1.3 734 | console-control-strings: ^1.1.0 735 | has-unicode: ^2.0.1 736 | signal-exit: ^3.0.7 737 | string-width: ^4.2.3 738 | strip-ansi: ^6.0.1 739 | wide-align: ^1.1.5 740 | checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d 741 | languageName: node 742 | linkType: hard 743 | 744 | "get-stream@npm:^6.0.1": 745 | version: 6.0.1 746 | resolution: "get-stream@npm:6.0.1" 747 | checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad 748 | languageName: node 749 | linkType: hard 750 | 751 | "glob-parent@npm:~5.1.2": 752 | version: 5.1.2 753 | resolution: "glob-parent@npm:5.1.2" 754 | dependencies: 755 | is-glob: ^4.0.1 756 | checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e 757 | languageName: node 758 | linkType: hard 759 | 760 | "glob@npm:^7.1.3, glob@npm:^7.1.4": 761 | version: 7.2.3 762 | resolution: "glob@npm:7.2.3" 763 | dependencies: 764 | fs.realpath: ^1.0.0 765 | inflight: ^1.0.4 766 | inherits: 2 767 | minimatch: ^3.1.1 768 | once: ^1.3.0 769 | path-is-absolute: ^1.0.0 770 | checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 771 | languageName: node 772 | linkType: hard 773 | 774 | "glob@npm:^8.0.1": 775 | version: 8.0.3 776 | resolution: "glob@npm:8.0.3" 777 | dependencies: 778 | fs.realpath: ^1.0.0 779 | inflight: ^1.0.4 780 | inherits: 2 781 | minimatch: ^5.0.1 782 | once: ^1.3.0 783 | checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 784 | languageName: node 785 | linkType: hard 786 | 787 | "graceful-fs@npm:^4.2.6": 788 | version: 4.2.10 789 | resolution: "graceful-fs@npm:4.2.10" 790 | checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da 791 | languageName: node 792 | linkType: hard 793 | 794 | "has-unicode@npm:^2.0.1": 795 | version: 2.0.1 796 | resolution: "has-unicode@npm:2.0.1" 797 | checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 798 | languageName: node 799 | linkType: hard 800 | 801 | "has@npm:^1.0.3": 802 | version: 1.0.3 803 | resolution: "has@npm:1.0.3" 804 | dependencies: 805 | function-bind: ^1.1.1 806 | checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 807 | languageName: node 808 | linkType: hard 809 | 810 | "http-cache-semantics@npm:^4.1.0": 811 | version: 4.1.0 812 | resolution: "http-cache-semantics@npm:4.1.0" 813 | checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 814 | languageName: node 815 | linkType: hard 816 | 817 | "http-proxy-agent@npm:^5.0.0": 818 | version: 5.0.0 819 | resolution: "http-proxy-agent@npm:5.0.0" 820 | dependencies: 821 | "@tootallnate/once": 2 822 | agent-base: 6 823 | debug: 4 824 | checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 825 | languageName: node 826 | linkType: hard 827 | 828 | "https-proxy-agent@npm:^5.0.0": 829 | version: 5.0.1 830 | resolution: "https-proxy-agent@npm:5.0.1" 831 | dependencies: 832 | agent-base: 6 833 | debug: 4 834 | checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 835 | languageName: node 836 | linkType: hard 837 | 838 | "human-signals@npm:^3.0.1": 839 | version: 3.0.1 840 | resolution: "human-signals@npm:3.0.1" 841 | checksum: f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354 842 | languageName: node 843 | linkType: hard 844 | 845 | "humanize-ms@npm:^1.2.1": 846 | version: 1.2.1 847 | resolution: "humanize-ms@npm:1.2.1" 848 | dependencies: 849 | ms: ^2.0.0 850 | checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 851 | languageName: node 852 | linkType: hard 853 | 854 | "husky@npm:^8.0.1": 855 | version: 8.0.1 856 | resolution: "husky@npm:8.0.1" 857 | bin: 858 | husky: lib/bin.js 859 | checksum: 943a73a13d0201318fd30e83d299bb81d866bd245b69e6277804c3b462638dc1921694cb94c2b8c920a4a187060f7d6058d3365152865406352e934c5fff70dc 860 | languageName: node 861 | linkType: hard 862 | 863 | "iconv-lite@npm:^0.6.2": 864 | version: 0.6.3 865 | resolution: "iconv-lite@npm:0.6.3" 866 | dependencies: 867 | safer-buffer: ">= 2.1.2 < 3.0.0" 868 | checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf 869 | languageName: node 870 | linkType: hard 871 | 872 | "immutable@npm:^4.0.0": 873 | version: 4.1.0 874 | resolution: "immutable@npm:4.1.0" 875 | checksum: b9bc1f14fb18eb382d48339c064b24a1f97ae4cf43102e0906c0a6e186a27afcd18b55ca4a0b63c98eefb58143e2b5ebc7755a5fb4da4a7ad84b7a6096ac5b13 876 | languageName: node 877 | linkType: hard 878 | 879 | "imurmurhash@npm:^0.1.4": 880 | version: 0.1.4 881 | resolution: "imurmurhash@npm:0.1.4" 882 | checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 883 | languageName: node 884 | linkType: hard 885 | 886 | "indent-string@npm:^4.0.0": 887 | version: 4.0.0 888 | resolution: "indent-string@npm:4.0.0" 889 | checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 890 | languageName: node 891 | linkType: hard 892 | 893 | "infer-owner@npm:^1.0.4": 894 | version: 1.0.4 895 | resolution: "infer-owner@npm:1.0.4" 896 | checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 897 | languageName: node 898 | linkType: hard 899 | 900 | "inflight@npm:^1.0.4": 901 | version: 1.0.6 902 | resolution: "inflight@npm:1.0.6" 903 | dependencies: 904 | once: ^1.3.0 905 | wrappy: 1 906 | checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd 907 | languageName: node 908 | linkType: hard 909 | 910 | "inherits@npm:2, inherits@npm:^2.0.3": 911 | version: 2.0.4 912 | resolution: "inherits@npm:2.0.4" 913 | checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 914 | languageName: node 915 | linkType: hard 916 | 917 | "ip@npm:^2.0.0": 918 | version: 2.0.0 919 | resolution: "ip@npm:2.0.0" 920 | checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 921 | languageName: node 922 | linkType: hard 923 | 924 | "is-binary-path@npm:~2.1.0": 925 | version: 2.1.0 926 | resolution: "is-binary-path@npm:2.1.0" 927 | dependencies: 928 | binary-extensions: ^2.0.0 929 | checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c 930 | languageName: node 931 | linkType: hard 932 | 933 | "is-core-module@npm:^2.9.0": 934 | version: 2.9.0 935 | resolution: "is-core-module@npm:2.9.0" 936 | dependencies: 937 | has: ^1.0.3 938 | checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce 939 | languageName: node 940 | linkType: hard 941 | 942 | "is-extglob@npm:^2.1.1": 943 | version: 2.1.1 944 | resolution: "is-extglob@npm:2.1.1" 945 | checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 946 | languageName: node 947 | linkType: hard 948 | 949 | "is-fullwidth-code-point@npm:^3.0.0": 950 | version: 3.0.0 951 | resolution: "is-fullwidth-code-point@npm:3.0.0" 952 | checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 953 | languageName: node 954 | linkType: hard 955 | 956 | "is-fullwidth-code-point@npm:^4.0.0": 957 | version: 4.0.0 958 | resolution: "is-fullwidth-code-point@npm:4.0.0" 959 | checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d 960 | languageName: node 961 | linkType: hard 962 | 963 | "is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": 964 | version: 4.0.3 965 | resolution: "is-glob@npm:4.0.3" 966 | dependencies: 967 | is-extglob: ^2.1.1 968 | checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 969 | languageName: node 970 | linkType: hard 971 | 972 | "is-lambda@npm:^1.0.1": 973 | version: 1.0.1 974 | resolution: "is-lambda@npm:1.0.1" 975 | checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 976 | languageName: node 977 | linkType: hard 978 | 979 | "is-number@npm:^7.0.0": 980 | version: 7.0.0 981 | resolution: "is-number@npm:7.0.0" 982 | checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a 983 | languageName: node 984 | linkType: hard 985 | 986 | "is-stream@npm:^3.0.0": 987 | version: 3.0.0 988 | resolution: "is-stream@npm:3.0.0" 989 | checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 990 | languageName: node 991 | linkType: hard 992 | 993 | "isexe@npm:^2.0.0": 994 | version: 2.0.0 995 | resolution: "isexe@npm:2.0.0" 996 | checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 997 | languageName: node 998 | linkType: hard 999 | 1000 | "lil-gui@npm:^0.17.0": 1001 | version: 0.17.0 1002 | resolution: "lil-gui@npm:0.17.0" 1003 | checksum: a6f33e90748ea98477f1f7af6d6cbdc4a1b38ce9da86d674d73f7b0bbdc7f3e947d81edee04c32f33fb28c69a108ba04c24270a8398064ffcc56ffeabc0a916e 1004 | languageName: node 1005 | linkType: hard 1006 | 1007 | "lilconfig@npm:2.0.5": 1008 | version: 2.0.5 1009 | resolution: "lilconfig@npm:2.0.5" 1010 | checksum: f7bb9e42656f06930ad04e583026f087508ae408d3526b8b54895e934eb2a966b7aafae569656f2c79a29fe6d779b3ec44ba577e80814734c8655d6f71cdf2d1 1011 | languageName: node 1012 | linkType: hard 1013 | 1014 | "lint-staged@npm:^13.0.3": 1015 | version: 13.0.3 1016 | resolution: "lint-staged@npm:13.0.3" 1017 | dependencies: 1018 | cli-truncate: ^3.1.0 1019 | colorette: ^2.0.17 1020 | commander: ^9.3.0 1021 | debug: ^4.3.4 1022 | execa: ^6.1.0 1023 | lilconfig: 2.0.5 1024 | listr2: ^4.0.5 1025 | micromatch: ^4.0.5 1026 | normalize-path: ^3.0.0 1027 | object-inspect: ^1.12.2 1028 | pidtree: ^0.6.0 1029 | string-argv: ^0.3.1 1030 | yaml: ^2.1.1 1031 | bin: 1032 | lint-staged: bin/lint-staged.js 1033 | checksum: 53d585007df06e162febab6b0836b55016d902586a267823c8a1158529d8c742dc7297e523f7023dff02250bef3eb0d6934f4ec4f9961adfc2ebbed5f54162d0 1034 | languageName: node 1035 | linkType: hard 1036 | 1037 | "listr2@npm:^4.0.5": 1038 | version: 4.0.5 1039 | resolution: "listr2@npm:4.0.5" 1040 | dependencies: 1041 | cli-truncate: ^2.1.0 1042 | colorette: ^2.0.16 1043 | log-update: ^4.0.0 1044 | p-map: ^4.0.0 1045 | rfdc: ^1.3.0 1046 | rxjs: ^7.5.5 1047 | through: ^2.3.8 1048 | wrap-ansi: ^7.0.0 1049 | peerDependencies: 1050 | enquirer: ">= 2.3.0 < 3" 1051 | peerDependenciesMeta: 1052 | enquirer: 1053 | optional: true 1054 | checksum: 7af31851abe25969ef0581c6db808117e36af15b131401795182427769d9824f451ba9e8aff6ccd25b6a4f6c8796f816292caf08e5f1f9b1775e8e9c313dc6c5 1055 | languageName: node 1056 | linkType: hard 1057 | 1058 | "log-update@npm:^4.0.0": 1059 | version: 4.0.0 1060 | resolution: "log-update@npm:4.0.0" 1061 | dependencies: 1062 | ansi-escapes: ^4.3.0 1063 | cli-cursor: ^3.1.0 1064 | slice-ansi: ^4.0.0 1065 | wrap-ansi: ^6.2.0 1066 | checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 1067 | languageName: node 1068 | linkType: hard 1069 | 1070 | "lru-cache@npm:^6.0.0": 1071 | version: 6.0.0 1072 | resolution: "lru-cache@npm:6.0.0" 1073 | dependencies: 1074 | yallist: ^4.0.0 1075 | checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 1076 | languageName: node 1077 | linkType: hard 1078 | 1079 | "lru-cache@npm:^7.7.1": 1080 | version: 7.13.1 1081 | resolution: "lru-cache@npm:7.13.1" 1082 | checksum: f53c7dd098a7afd6342b23f7182629edff206c7665de79445a7f5455440e768a4d1c6ec52e1a16175580c71535c9437dfb6f6bc22ca1a0e4a7454a97cde87329 1083 | languageName: node 1084 | linkType: hard 1085 | 1086 | "make-fetch-happen@npm:^10.0.3": 1087 | version: 10.2.0 1088 | resolution: "make-fetch-happen@npm:10.2.0" 1089 | dependencies: 1090 | agentkeepalive: ^4.2.1 1091 | cacache: ^16.1.0 1092 | http-cache-semantics: ^4.1.0 1093 | http-proxy-agent: ^5.0.0 1094 | https-proxy-agent: ^5.0.0 1095 | is-lambda: ^1.0.1 1096 | lru-cache: ^7.7.1 1097 | minipass: ^3.1.6 1098 | minipass-collect: ^1.0.2 1099 | minipass-fetch: ^2.0.3 1100 | minipass-flush: ^1.0.5 1101 | minipass-pipeline: ^1.2.4 1102 | negotiator: ^0.6.3 1103 | promise-retry: ^2.0.1 1104 | socks-proxy-agent: ^7.0.0 1105 | ssri: ^9.0.0 1106 | checksum: 2f6c294179972f56fab40fd8618f07841e06550692bb78f6da16e7afaa9dca78c345b08cf44a77a8907ef3948e4dc77e93eb7492b8381f1217d7ac057a7522f8 1107 | languageName: node 1108 | linkType: hard 1109 | 1110 | "merge-stream@npm:^2.0.0": 1111 | version: 2.0.0 1112 | resolution: "merge-stream@npm:2.0.0" 1113 | checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 1114 | languageName: node 1115 | linkType: hard 1116 | 1117 | "micromatch@npm:^4.0.5": 1118 | version: 4.0.5 1119 | resolution: "micromatch@npm:4.0.5" 1120 | dependencies: 1121 | braces: ^3.0.2 1122 | picomatch: ^2.3.1 1123 | checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc 1124 | languageName: node 1125 | linkType: hard 1126 | 1127 | "mimic-fn@npm:^2.1.0": 1128 | version: 2.1.0 1129 | resolution: "mimic-fn@npm:2.1.0" 1130 | checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a 1131 | languageName: node 1132 | linkType: hard 1133 | 1134 | "mimic-fn@npm:^4.0.0": 1135 | version: 4.0.0 1136 | resolution: "mimic-fn@npm:4.0.0" 1137 | checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 1138 | languageName: node 1139 | linkType: hard 1140 | 1141 | "minimatch@npm:^3.1.1": 1142 | version: 3.1.2 1143 | resolution: "minimatch@npm:3.1.2" 1144 | dependencies: 1145 | brace-expansion: ^1.1.7 1146 | checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a 1147 | languageName: node 1148 | linkType: hard 1149 | 1150 | "minimatch@npm:^5.0.1": 1151 | version: 5.1.0 1152 | resolution: "minimatch@npm:5.1.0" 1153 | dependencies: 1154 | brace-expansion: ^2.0.1 1155 | checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90 1156 | languageName: node 1157 | linkType: hard 1158 | 1159 | "minipass-collect@npm:^1.0.2": 1160 | version: 1.0.2 1161 | resolution: "minipass-collect@npm:1.0.2" 1162 | dependencies: 1163 | minipass: ^3.0.0 1164 | checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 1165 | languageName: node 1166 | linkType: hard 1167 | 1168 | "minipass-fetch@npm:^2.0.3": 1169 | version: 2.1.0 1170 | resolution: "minipass-fetch@npm:2.1.0" 1171 | dependencies: 1172 | encoding: ^0.1.13 1173 | minipass: ^3.1.6 1174 | minipass-sized: ^1.0.3 1175 | minizlib: ^2.1.2 1176 | dependenciesMeta: 1177 | encoding: 1178 | optional: true 1179 | checksum: 1334732859a3f7959ed22589bafd9c40384b885aebb5932328071c33f86b3eb181d54c86919675d1825ab5f1c8e4f328878c863873258d113c29d79a4b0c9c9f 1180 | languageName: node 1181 | linkType: hard 1182 | 1183 | "minipass-flush@npm:^1.0.5": 1184 | version: 1.0.5 1185 | resolution: "minipass-flush@npm:1.0.5" 1186 | dependencies: 1187 | minipass: ^3.0.0 1188 | checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf 1189 | languageName: node 1190 | linkType: hard 1191 | 1192 | "minipass-pipeline@npm:^1.2.4": 1193 | version: 1.2.4 1194 | resolution: "minipass-pipeline@npm:1.2.4" 1195 | dependencies: 1196 | minipass: ^3.0.0 1197 | checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b 1198 | languageName: node 1199 | linkType: hard 1200 | 1201 | "minipass-sized@npm:^1.0.3": 1202 | version: 1.0.3 1203 | resolution: "minipass-sized@npm:1.0.3" 1204 | dependencies: 1205 | minipass: ^3.0.0 1206 | checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 1207 | languageName: node 1208 | linkType: hard 1209 | 1210 | "minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": 1211 | version: 3.3.4 1212 | resolution: "minipass@npm:3.3.4" 1213 | dependencies: 1214 | yallist: ^4.0.0 1215 | checksum: 5d95a7738c54852ba78d484141e850c792e062666a2d0c681a5ac1021275beb7e1acb077e59f9523ff1defb80901aea4e30fac10ded9a20a25d819a42916ef1b 1216 | languageName: node 1217 | linkType: hard 1218 | 1219 | "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": 1220 | version: 2.1.2 1221 | resolution: "minizlib@npm:2.1.2" 1222 | dependencies: 1223 | minipass: ^3.0.0 1224 | yallist: ^4.0.0 1225 | checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 1226 | languageName: node 1227 | linkType: hard 1228 | 1229 | "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": 1230 | version: 1.0.4 1231 | resolution: "mkdirp@npm:1.0.4" 1232 | bin: 1233 | mkdirp: bin/cmd.js 1234 | checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f 1235 | languageName: node 1236 | linkType: hard 1237 | 1238 | "ms@npm:2.1.2": 1239 | version: 2.1.2 1240 | resolution: "ms@npm:2.1.2" 1241 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f 1242 | languageName: node 1243 | linkType: hard 1244 | 1245 | "ms@npm:^2.0.0": 1246 | version: 2.1.3 1247 | resolution: "ms@npm:2.1.3" 1248 | checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d 1249 | languageName: node 1250 | linkType: hard 1251 | 1252 | "nanoid@npm:^3.3.4": 1253 | version: 3.3.4 1254 | resolution: "nanoid@npm:3.3.4" 1255 | bin: 1256 | nanoid: bin/nanoid.cjs 1257 | checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c 1258 | languageName: node 1259 | linkType: hard 1260 | 1261 | "negotiator@npm:^0.6.3": 1262 | version: 0.6.3 1263 | resolution: "negotiator@npm:0.6.3" 1264 | checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 1265 | languageName: node 1266 | linkType: hard 1267 | 1268 | "node-gyp@npm:latest": 1269 | version: 9.1.0 1270 | resolution: "node-gyp@npm:9.1.0" 1271 | dependencies: 1272 | env-paths: ^2.2.0 1273 | glob: ^7.1.4 1274 | graceful-fs: ^4.2.6 1275 | make-fetch-happen: ^10.0.3 1276 | nopt: ^5.0.0 1277 | npmlog: ^6.0.0 1278 | rimraf: ^3.0.2 1279 | semver: ^7.3.5 1280 | tar: ^6.1.2 1281 | which: ^2.0.2 1282 | bin: 1283 | node-gyp: bin/node-gyp.js 1284 | checksum: 1437fa4a879b5b9010604128e8da8609b57c66034262087539ee04a8b764b8436af2be01bab66f8fc729a3adba2dcc21b10a32b9f552696c3fa8cd657d134fc4 1285 | languageName: node 1286 | linkType: hard 1287 | 1288 | "nopt@npm:^5.0.0": 1289 | version: 5.0.0 1290 | resolution: "nopt@npm:5.0.0" 1291 | dependencies: 1292 | abbrev: 1 1293 | bin: 1294 | nopt: bin/nopt.js 1295 | checksum: d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f 1296 | languageName: node 1297 | linkType: hard 1298 | 1299 | "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": 1300 | version: 3.0.0 1301 | resolution: "normalize-path@npm:3.0.0" 1302 | checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 1303 | languageName: node 1304 | linkType: hard 1305 | 1306 | "npm-run-path@npm:^5.1.0": 1307 | version: 5.1.0 1308 | resolution: "npm-run-path@npm:5.1.0" 1309 | dependencies: 1310 | path-key: ^4.0.0 1311 | checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 1312 | languageName: node 1313 | linkType: hard 1314 | 1315 | "npmlog@npm:^6.0.0": 1316 | version: 6.0.2 1317 | resolution: "npmlog@npm:6.0.2" 1318 | dependencies: 1319 | are-we-there-yet: ^3.0.0 1320 | console-control-strings: ^1.1.0 1321 | gauge: ^4.0.3 1322 | set-blocking: ^2.0.0 1323 | checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a 1324 | languageName: node 1325 | linkType: hard 1326 | 1327 | "object-inspect@npm:^1.12.2": 1328 | version: 1.12.2 1329 | resolution: "object-inspect@npm:1.12.2" 1330 | checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 1331 | languageName: node 1332 | linkType: hard 1333 | 1334 | "once@npm:^1.3.0": 1335 | version: 1.4.0 1336 | resolution: "once@npm:1.4.0" 1337 | dependencies: 1338 | wrappy: 1 1339 | checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 1340 | languageName: node 1341 | linkType: hard 1342 | 1343 | "onetime@npm:^5.1.0": 1344 | version: 5.1.2 1345 | resolution: "onetime@npm:5.1.2" 1346 | dependencies: 1347 | mimic-fn: ^2.1.0 1348 | checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 1349 | languageName: node 1350 | linkType: hard 1351 | 1352 | "onetime@npm:^6.0.0": 1353 | version: 6.0.0 1354 | resolution: "onetime@npm:6.0.0" 1355 | dependencies: 1356 | mimic-fn: ^4.0.0 1357 | checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 1358 | languageName: node 1359 | linkType: hard 1360 | 1361 | "p-map@npm:^4.0.0": 1362 | version: 4.0.0 1363 | resolution: "p-map@npm:4.0.0" 1364 | dependencies: 1365 | aggregate-error: ^3.0.0 1366 | checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c 1367 | languageName: node 1368 | linkType: hard 1369 | 1370 | "path-is-absolute@npm:^1.0.0": 1371 | version: 1.0.1 1372 | resolution: "path-is-absolute@npm:1.0.1" 1373 | checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 1374 | languageName: node 1375 | linkType: hard 1376 | 1377 | "path-key@npm:^3.1.0": 1378 | version: 3.1.1 1379 | resolution: "path-key@npm:3.1.1" 1380 | checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 1381 | languageName: node 1382 | linkType: hard 1383 | 1384 | "path-key@npm:^4.0.0": 1385 | version: 4.0.0 1386 | resolution: "path-key@npm:4.0.0" 1387 | checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 1388 | languageName: node 1389 | linkType: hard 1390 | 1391 | "path-parse@npm:^1.0.7": 1392 | version: 1.0.7 1393 | resolution: "path-parse@npm:1.0.7" 1394 | checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a 1395 | languageName: node 1396 | linkType: hard 1397 | 1398 | "picocolors@npm:^1.0.0": 1399 | version: 1.0.0 1400 | resolution: "picocolors@npm:1.0.0" 1401 | checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 1402 | languageName: node 1403 | linkType: hard 1404 | 1405 | "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": 1406 | version: 2.3.1 1407 | resolution: "picomatch@npm:2.3.1" 1408 | checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf 1409 | languageName: node 1410 | linkType: hard 1411 | 1412 | "pidtree@npm:^0.6.0": 1413 | version: 0.6.0 1414 | resolution: "pidtree@npm:0.6.0" 1415 | bin: 1416 | pidtree: bin/pidtree.js 1417 | checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a 1418 | languageName: node 1419 | linkType: hard 1420 | 1421 | "postcss@npm:^8.4.14": 1422 | version: 8.4.14 1423 | resolution: "postcss@npm:8.4.14" 1424 | dependencies: 1425 | nanoid: ^3.3.4 1426 | picocolors: ^1.0.0 1427 | source-map-js: ^1.0.2 1428 | checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816 1429 | languageName: node 1430 | linkType: hard 1431 | 1432 | "prettier@npm:2.7.1": 1433 | version: 2.7.1 1434 | resolution: "prettier@npm:2.7.1" 1435 | bin: 1436 | prettier: bin-prettier.js 1437 | checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b 1438 | languageName: node 1439 | linkType: hard 1440 | 1441 | "promise-inflight@npm:^1.0.1": 1442 | version: 1.0.1 1443 | resolution: "promise-inflight@npm:1.0.1" 1444 | checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 1445 | languageName: node 1446 | linkType: hard 1447 | 1448 | "promise-retry@npm:^2.0.1": 1449 | version: 2.0.1 1450 | resolution: "promise-retry@npm:2.0.1" 1451 | dependencies: 1452 | err-code: ^2.0.2 1453 | retry: ^0.12.0 1454 | checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 1455 | languageName: node 1456 | linkType: hard 1457 | 1458 | "readable-stream@npm:^3.6.0": 1459 | version: 3.6.0 1460 | resolution: "readable-stream@npm:3.6.0" 1461 | dependencies: 1462 | inherits: ^2.0.3 1463 | string_decoder: ^1.1.1 1464 | util-deprecate: ^1.0.1 1465 | checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 1466 | languageName: node 1467 | linkType: hard 1468 | 1469 | "readdirp@npm:~3.6.0": 1470 | version: 3.6.0 1471 | resolution: "readdirp@npm:3.6.0" 1472 | dependencies: 1473 | picomatch: ^2.2.1 1474 | checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 1475 | languageName: node 1476 | linkType: hard 1477 | 1478 | "resolve@npm:^1.22.1": 1479 | version: 1.22.1 1480 | resolution: "resolve@npm:1.22.1" 1481 | dependencies: 1482 | is-core-module: ^2.9.0 1483 | path-parse: ^1.0.7 1484 | supports-preserve-symlinks-flag: ^1.0.0 1485 | bin: 1486 | resolve: bin/resolve 1487 | checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e 1488 | languageName: node 1489 | linkType: hard 1490 | 1491 | "resolve@patch:resolve@^1.22.1#~builtin": 1492 | version: 1.22.1 1493 | resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" 1494 | dependencies: 1495 | is-core-module: ^2.9.0 1496 | path-parse: ^1.0.7 1497 | supports-preserve-symlinks-flag: ^1.0.0 1498 | bin: 1499 | resolve: bin/resolve 1500 | checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b 1501 | languageName: node 1502 | linkType: hard 1503 | 1504 | "restore-cursor@npm:^3.1.0": 1505 | version: 3.1.0 1506 | resolution: "restore-cursor@npm:3.1.0" 1507 | dependencies: 1508 | onetime: ^5.1.0 1509 | signal-exit: ^3.0.2 1510 | checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 1511 | languageName: node 1512 | linkType: hard 1513 | 1514 | "retry@npm:^0.12.0": 1515 | version: 0.12.0 1516 | resolution: "retry@npm:0.12.0" 1517 | checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c 1518 | languageName: node 1519 | linkType: hard 1520 | 1521 | "rfdc@npm:^1.3.0": 1522 | version: 1.3.0 1523 | resolution: "rfdc@npm:1.3.0" 1524 | checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 1525 | languageName: node 1526 | linkType: hard 1527 | 1528 | "rimraf@npm:^3.0.2": 1529 | version: 3.0.2 1530 | resolution: "rimraf@npm:3.0.2" 1531 | dependencies: 1532 | glob: ^7.1.3 1533 | bin: 1534 | rimraf: bin.js 1535 | checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 1536 | languageName: node 1537 | linkType: hard 1538 | 1539 | "rollup@npm:^2.75.6": 1540 | version: 2.77.2 1541 | resolution: "rollup@npm:2.77.2" 1542 | dependencies: 1543 | fsevents: ~2.3.2 1544 | dependenciesMeta: 1545 | fsevents: 1546 | optional: true 1547 | bin: 1548 | rollup: dist/bin/rollup 1549 | checksum: 5a84fb98a6f858906bceba091430442f6c1f362b07c5fa9123b708f87e39f52640e34a189cd9a1776ceae61300055c78ba648205fa03188451539ebeb19797df 1550 | languageName: node 1551 | linkType: hard 1552 | 1553 | "rxjs@npm:^7.5.5": 1554 | version: 7.5.6 1555 | resolution: "rxjs@npm:7.5.6" 1556 | dependencies: 1557 | tslib: ^2.1.0 1558 | checksum: fc05f01364a74dac57490fb3e07ea63b422af04017fae1db641a009073f902ef69f285c5daac31359620dc8d9aee7d81e42b370ca2a8573d1feae0b04329383b 1559 | languageName: node 1560 | linkType: hard 1561 | 1562 | "safe-buffer@npm:~5.2.0": 1563 | version: 5.2.1 1564 | resolution: "safe-buffer@npm:5.2.1" 1565 | checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 1566 | languageName: node 1567 | linkType: hard 1568 | 1569 | "safer-buffer@npm:>= 2.1.2 < 3.0.0": 1570 | version: 2.1.2 1571 | resolution: "safer-buffer@npm:2.1.2" 1572 | checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 1573 | languageName: node 1574 | linkType: hard 1575 | 1576 | "sass@npm:^1.52.3": 1577 | version: 1.52.3 1578 | resolution: "sass@npm:1.52.3" 1579 | dependencies: 1580 | chokidar: ">=3.0.0 <4.0.0" 1581 | immutable: ^4.0.0 1582 | source-map-js: ">=0.6.2 <2.0.0" 1583 | bin: 1584 | sass: sass.js 1585 | checksum: 175a073c0e7b67d1baff6d3969431228002ece681886cebc2a354c241134ff120fda5c12a0465989966dacfb1ca518d85507304f4d4cd03d4a91d71dbc77d978 1586 | languageName: node 1587 | linkType: hard 1588 | 1589 | "semver@npm:^7.3.5": 1590 | version: 7.3.7 1591 | resolution: "semver@npm:7.3.7" 1592 | dependencies: 1593 | lru-cache: ^6.0.0 1594 | bin: 1595 | semver: bin/semver.js 1596 | checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232 1597 | languageName: node 1598 | linkType: hard 1599 | 1600 | "set-blocking@npm:^2.0.0": 1601 | version: 2.0.0 1602 | resolution: "set-blocking@npm:2.0.0" 1603 | checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 1604 | languageName: node 1605 | linkType: hard 1606 | 1607 | "shebang-command@npm:^2.0.0": 1608 | version: 2.0.0 1609 | resolution: "shebang-command@npm:2.0.0" 1610 | dependencies: 1611 | shebang-regex: ^3.0.0 1612 | checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa 1613 | languageName: node 1614 | linkType: hard 1615 | 1616 | "shebang-regex@npm:^3.0.0": 1617 | version: 3.0.0 1618 | resolution: "shebang-regex@npm:3.0.0" 1619 | checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 1620 | languageName: node 1621 | linkType: hard 1622 | 1623 | "signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7": 1624 | version: 3.0.7 1625 | resolution: "signal-exit@npm:3.0.7" 1626 | checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 1627 | languageName: node 1628 | linkType: hard 1629 | 1630 | "simple-threejs-typescript-starter@workspace:.": 1631 | version: 0.0.0-use.local 1632 | resolution: "simple-threejs-typescript-starter@workspace:." 1633 | dependencies: 1634 | "@types/three": ^0.144.0 1635 | husky: ^8.0.1 1636 | lil-gui: ^0.17.0 1637 | lint-staged: ^13.0.3 1638 | prettier: 2.7.1 1639 | sass: ^1.52.3 1640 | three: ^0.146.0 1641 | typescript: ^4.7.4 1642 | vite: ^3.0.3 1643 | vite-plugin-glsl: ^0.1.5 1644 | languageName: unknown 1645 | linkType: soft 1646 | 1647 | "slice-ansi@npm:^3.0.0": 1648 | version: 3.0.0 1649 | resolution: "slice-ansi@npm:3.0.0" 1650 | dependencies: 1651 | ansi-styles: ^4.0.0 1652 | astral-regex: ^2.0.0 1653 | is-fullwidth-code-point: ^3.0.0 1654 | checksum: 5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 1655 | languageName: node 1656 | linkType: hard 1657 | 1658 | "slice-ansi@npm:^4.0.0": 1659 | version: 4.0.0 1660 | resolution: "slice-ansi@npm:4.0.0" 1661 | dependencies: 1662 | ansi-styles: ^4.0.0 1663 | astral-regex: ^2.0.0 1664 | is-fullwidth-code-point: ^3.0.0 1665 | checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 1666 | languageName: node 1667 | linkType: hard 1668 | 1669 | "slice-ansi@npm:^5.0.0": 1670 | version: 5.0.0 1671 | resolution: "slice-ansi@npm:5.0.0" 1672 | dependencies: 1673 | ansi-styles: ^6.0.0 1674 | is-fullwidth-code-point: ^4.0.0 1675 | checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e 1676 | languageName: node 1677 | linkType: hard 1678 | 1679 | "smart-buffer@npm:^4.2.0": 1680 | version: 4.2.0 1681 | resolution: "smart-buffer@npm:4.2.0" 1682 | checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b 1683 | languageName: node 1684 | linkType: hard 1685 | 1686 | "socks-proxy-agent@npm:^7.0.0": 1687 | version: 7.0.0 1688 | resolution: "socks-proxy-agent@npm:7.0.0" 1689 | dependencies: 1690 | agent-base: ^6.0.2 1691 | debug: ^4.3.3 1692 | socks: ^2.6.2 1693 | checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 1694 | languageName: node 1695 | linkType: hard 1696 | 1697 | "socks@npm:^2.6.2": 1698 | version: 2.7.0 1699 | resolution: "socks@npm:2.7.0" 1700 | dependencies: 1701 | ip: ^2.0.0 1702 | smart-buffer: ^4.2.0 1703 | checksum: 0b5d94e2b3c11e7937b40fc5dac1e80d8b92a330e68c51f1d271ce6980c70adca42a3f8cd47c4a5769956bada074823b53374f2dc5f2ea5c2121b222dec6eadf 1704 | languageName: node 1705 | linkType: hard 1706 | 1707 | "source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2": 1708 | version: 1.0.2 1709 | resolution: "source-map-js@npm:1.0.2" 1710 | checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c 1711 | languageName: node 1712 | linkType: hard 1713 | 1714 | "ssri@npm:^9.0.0": 1715 | version: 9.0.1 1716 | resolution: "ssri@npm:9.0.1" 1717 | dependencies: 1718 | minipass: ^3.1.1 1719 | checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb 1720 | languageName: node 1721 | linkType: hard 1722 | 1723 | "string-argv@npm:^0.3.1": 1724 | version: 0.3.1 1725 | resolution: "string-argv@npm:0.3.1" 1726 | checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf 1727 | languageName: node 1728 | linkType: hard 1729 | 1730 | "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": 1731 | version: 4.2.3 1732 | resolution: "string-width@npm:4.2.3" 1733 | dependencies: 1734 | emoji-regex: ^8.0.0 1735 | is-fullwidth-code-point: ^3.0.0 1736 | strip-ansi: ^6.0.1 1737 | checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb 1738 | languageName: node 1739 | linkType: hard 1740 | 1741 | "string-width@npm:^5.0.0": 1742 | version: 5.1.2 1743 | resolution: "string-width@npm:5.1.2" 1744 | dependencies: 1745 | eastasianwidth: ^0.2.0 1746 | emoji-regex: ^9.2.2 1747 | strip-ansi: ^7.0.1 1748 | checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 1749 | languageName: node 1750 | linkType: hard 1751 | 1752 | "string_decoder@npm:^1.1.1": 1753 | version: 1.3.0 1754 | resolution: "string_decoder@npm:1.3.0" 1755 | dependencies: 1756 | safe-buffer: ~5.2.0 1757 | checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 1758 | languageName: node 1759 | linkType: hard 1760 | 1761 | "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 1762 | version: 6.0.1 1763 | resolution: "strip-ansi@npm:6.0.1" 1764 | dependencies: 1765 | ansi-regex: ^5.0.1 1766 | checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c 1767 | languageName: node 1768 | linkType: hard 1769 | 1770 | "strip-ansi@npm:^7.0.1": 1771 | version: 7.0.1 1772 | resolution: "strip-ansi@npm:7.0.1" 1773 | dependencies: 1774 | ansi-regex: ^6.0.1 1775 | checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 1776 | languageName: node 1777 | linkType: hard 1778 | 1779 | "strip-final-newline@npm:^3.0.0": 1780 | version: 3.0.0 1781 | resolution: "strip-final-newline@npm:3.0.0" 1782 | checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 1783 | languageName: node 1784 | linkType: hard 1785 | 1786 | "supports-preserve-symlinks-flag@npm:^1.0.0": 1787 | version: 1.0.0 1788 | resolution: "supports-preserve-symlinks-flag@npm:1.0.0" 1789 | checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae 1790 | languageName: node 1791 | linkType: hard 1792 | 1793 | "tar@npm:^6.1.11, tar@npm:^6.1.2": 1794 | version: 6.1.11 1795 | resolution: "tar@npm:6.1.11" 1796 | dependencies: 1797 | chownr: ^2.0.0 1798 | fs-minipass: ^2.0.0 1799 | minipass: ^3.0.0 1800 | minizlib: ^2.1.1 1801 | mkdirp: ^1.0.3 1802 | yallist: ^4.0.0 1803 | checksum: a04c07bb9e2d8f46776517d4618f2406fb977a74d914ad98b264fc3db0fe8224da5bec11e5f8902c5b9bcb8ace22d95fbe3c7b36b8593b7dfc8391a25898f32f 1804 | languageName: node 1805 | linkType: hard 1806 | 1807 | "three@npm:^0.146.0": 1808 | version: 0.146.0 1809 | resolution: "three@npm:0.146.0" 1810 | checksum: c6eb2005d97c599de7f4eccf73c4b1e8731c353ca3e7b9bf9d3bc2b52a8e288c59c06c148fd93df16df323b28938947227a37e07cc6fbe04aa8f8725e49caa8a 1811 | languageName: node 1812 | linkType: hard 1813 | 1814 | "through@npm:^2.3.8": 1815 | version: 2.3.8 1816 | resolution: "through@npm:2.3.8" 1817 | checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd 1818 | languageName: node 1819 | linkType: hard 1820 | 1821 | "to-regex-range@npm:^5.0.1": 1822 | version: 5.0.1 1823 | resolution: "to-regex-range@npm:5.0.1" 1824 | dependencies: 1825 | is-number: ^7.0.0 1826 | checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed 1827 | languageName: node 1828 | linkType: hard 1829 | 1830 | "tslib@npm:^2.1.0, tslib@npm:^2.4.0": 1831 | version: 2.4.0 1832 | resolution: "tslib@npm:2.4.0" 1833 | checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 1834 | languageName: node 1835 | linkType: hard 1836 | 1837 | "type-fest@npm:^0.21.3": 1838 | version: 0.21.3 1839 | resolution: "type-fest@npm:0.21.3" 1840 | checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 1841 | languageName: node 1842 | linkType: hard 1843 | 1844 | "typescript@npm:^4.7.4": 1845 | version: 4.7.4 1846 | resolution: "typescript@npm:4.7.4" 1847 | bin: 1848 | tsc: bin/tsc 1849 | tsserver: bin/tsserver 1850 | checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df 1851 | languageName: node 1852 | linkType: hard 1853 | 1854 | "typescript@patch:typescript@^4.7.4#~builtin": 1855 | version: 4.7.4 1856 | resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=7ad353" 1857 | bin: 1858 | tsc: bin/tsc 1859 | tsserver: bin/tsserver 1860 | checksum: 9096d8f6c16cb80ef3bf96fcbbd055bf1c4a43bd14f3b7be45a9fbe7ada46ec977f604d5feed3263b4f2aa7d4c7477ce5f9cd87de0d6feedec69a983f3a4f93e 1861 | languageName: node 1862 | linkType: hard 1863 | 1864 | "unique-filename@npm:^1.1.1": 1865 | version: 1.1.1 1866 | resolution: "unique-filename@npm:1.1.1" 1867 | dependencies: 1868 | unique-slug: ^2.0.0 1869 | checksum: cf4998c9228cc7647ba7814e255dec51be43673903897b1786eff2ac2d670f54d4d733357eb08dea969aa5e6875d0e1bd391d668fbdb5a179744e7c7551a6f80 1870 | languageName: node 1871 | linkType: hard 1872 | 1873 | "unique-slug@npm:^2.0.0": 1874 | version: 2.0.2 1875 | resolution: "unique-slug@npm:2.0.2" 1876 | dependencies: 1877 | imurmurhash: ^0.1.4 1878 | checksum: 5b6876a645da08d505dedb970d1571f6cebdf87044cb6b740c8dbb24f0d6e1dc8bdbf46825fd09f994d7cf50760e6f6e063cfa197d51c5902c00a861702eb75a 1879 | languageName: node 1880 | linkType: hard 1881 | 1882 | "util-deprecate@npm:^1.0.1": 1883 | version: 1.0.2 1884 | resolution: "util-deprecate@npm:1.0.2" 1885 | checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 1886 | languageName: node 1887 | linkType: hard 1888 | 1889 | "vite-plugin-glsl@npm:^0.1.5": 1890 | version: 0.1.5 1891 | resolution: "vite-plugin-glsl@npm:0.1.5" 1892 | dependencies: 1893 | "@rollup/pluginutils": ^4.2.1 1894 | tslib: ^2.4.0 1895 | checksum: a7802ff40194dd9078dd2a5810769d1d1e2a285259887ccf6738defda24b4cc675d0d8637b8388e7af194bb9f3873c95dd4cc36cad7d052945bd99b3949584ba 1896 | languageName: node 1897 | linkType: hard 1898 | 1899 | "vite@npm:^3.0.3": 1900 | version: 3.0.3 1901 | resolution: "vite@npm:3.0.3" 1902 | dependencies: 1903 | esbuild: ^0.14.47 1904 | fsevents: ~2.3.2 1905 | postcss: ^8.4.14 1906 | resolve: ^1.22.1 1907 | rollup: ^2.75.6 1908 | peerDependencies: 1909 | less: "*" 1910 | sass: "*" 1911 | stylus: "*" 1912 | terser: ^5.4.0 1913 | dependenciesMeta: 1914 | fsevents: 1915 | optional: true 1916 | peerDependenciesMeta: 1917 | less: 1918 | optional: true 1919 | sass: 1920 | optional: true 1921 | stylus: 1922 | optional: true 1923 | terser: 1924 | optional: true 1925 | bin: 1926 | vite: bin/vite.js 1927 | checksum: 0b15d6bb062ab56dd8a0d47262344dcb48423d658c153c88a8a41f9301a70f32dd0fa2c037fa39a0a7888be1005cb763aad94235f82439441a13cef5103c29c4 1928 | languageName: node 1929 | linkType: hard 1930 | 1931 | "which@npm:^2.0.1, which@npm:^2.0.2": 1932 | version: 2.0.2 1933 | resolution: "which@npm:2.0.2" 1934 | dependencies: 1935 | isexe: ^2.0.0 1936 | bin: 1937 | node-which: ./bin/node-which 1938 | checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 1939 | languageName: node 1940 | linkType: hard 1941 | 1942 | "wide-align@npm:^1.1.5": 1943 | version: 1.1.5 1944 | resolution: "wide-align@npm:1.1.5" 1945 | dependencies: 1946 | string-width: ^1.0.2 || 2 || 3 || 4 1947 | checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 1948 | languageName: node 1949 | linkType: hard 1950 | 1951 | "wrap-ansi@npm:^6.2.0": 1952 | version: 6.2.0 1953 | resolution: "wrap-ansi@npm:6.2.0" 1954 | dependencies: 1955 | ansi-styles: ^4.0.0 1956 | string-width: ^4.1.0 1957 | strip-ansi: ^6.0.0 1958 | checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a 1959 | languageName: node 1960 | linkType: hard 1961 | 1962 | "wrap-ansi@npm:^7.0.0": 1963 | version: 7.0.0 1964 | resolution: "wrap-ansi@npm:7.0.0" 1965 | dependencies: 1966 | ansi-styles: ^4.0.0 1967 | string-width: ^4.1.0 1968 | strip-ansi: ^6.0.0 1969 | checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b 1970 | languageName: node 1971 | linkType: hard 1972 | 1973 | "wrappy@npm:1": 1974 | version: 1.0.2 1975 | resolution: "wrappy@npm:1.0.2" 1976 | checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 1977 | languageName: node 1978 | linkType: hard 1979 | 1980 | "yallist@npm:^4.0.0": 1981 | version: 4.0.0 1982 | resolution: "yallist@npm:4.0.0" 1983 | checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 1984 | languageName: node 1985 | linkType: hard 1986 | 1987 | "yaml@npm:^2.1.1": 1988 | version: 2.1.1 1989 | resolution: "yaml@npm:2.1.1" 1990 | checksum: f48bb209918aa57cfaf78ef6448d1a1f8187f45c746f933268b7023dc59e5456004611879126c9bb5ea55b0a2b1c2b392dfde436931ece0c703a3d754562bb96 1991 | languageName: node 1992 | linkType: hard 1993 | --------------------------------------------------------------------------------