[READ-ONLY] Mirror of https://github.com/flo-bit/flo-bit.github.io. my personal website, w/ astro, svelte, tailwind, typescript, threlte flo-bit.dev/
portfolio portfolio-website svelte sveltekit tailwind threejs threlte typescript
0

Configure Feed

Select the types of activity you want to include in your feed.

fix for ocean, turn everything lowercase

Florian (Jun 17, 2024, 11:38 PM +0200) e6913f66 125e2537

+3531 -795
+838 -678
package-lock.json
··· 47 47 "vite": "^5.0.3" 48 48 } 49 49 }, 50 - "node_modules/@aashutoshrathi/word-wrap": { 51 - "version": "1.2.6", 52 - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 53 - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 54 - "dev": true, 55 - "engines": { 56 - "node": ">=0.10.0" 57 - } 58 - }, 59 50 "node_modules/@alloc/quick-lru": { 60 51 "version": "5.2.0", 61 52 "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", ··· 68 59 } 69 60 }, 70 61 "node_modules/@ampproject/remapping": { 71 - "version": "2.2.1", 72 - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", 73 - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", 62 + "version": "2.3.0", 63 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 64 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 74 65 "dependencies": { 75 - "@jridgewell/gen-mapping": "^0.3.0", 76 - "@jridgewell/trace-mapping": "^0.3.9" 66 + "@jridgewell/gen-mapping": "^0.3.5", 67 + "@jridgewell/trace-mapping": "^0.3.24" 77 68 }, 78 69 "engines": { 79 70 "node": ">=6.0.0" 80 71 } 81 72 }, 82 73 "node_modules/@emnapi/runtime": { 83 - "version": "0.44.0", 84 - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.44.0.tgz", 85 - "integrity": "sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==", 74 + "version": "1.2.0", 75 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", 76 + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", 86 77 "optional": true, 87 78 "dependencies": { 88 79 "tslib": "^2.4.0" 89 80 } 90 81 }, 91 82 "node_modules/@esbuild/aix-ppc64": { 92 - "version": "0.19.11", 93 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", 94 - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", 83 + "version": "0.21.5", 84 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 85 + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 95 86 "cpu": [ 96 87 "ppc64" 97 88 ], ··· 104 95 } 105 96 }, 106 97 "node_modules/@esbuild/android-arm": { 107 - "version": "0.19.11", 108 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", 109 - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", 98 + "version": "0.21.5", 99 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 100 + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 110 101 "cpu": [ 111 102 "arm" 112 103 ], ··· 119 110 } 120 111 }, 121 112 "node_modules/@esbuild/android-arm64": { 122 - "version": "0.19.11", 123 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", 124 - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", 113 + "version": "0.21.5", 114 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 115 + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 125 116 "cpu": [ 126 117 "arm64" 127 118 ], ··· 134 125 } 135 126 }, 136 127 "node_modules/@esbuild/android-x64": { 137 - "version": "0.19.11", 138 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", 139 - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", 128 + "version": "0.21.5", 129 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 130 + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 140 131 "cpu": [ 141 132 "x64" 142 133 ], ··· 149 140 } 150 141 }, 151 142 "node_modules/@esbuild/darwin-arm64": { 152 - "version": "0.19.11", 153 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", 154 - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", 143 + "version": "0.21.5", 144 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 145 + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 155 146 "cpu": [ 156 147 "arm64" 157 148 ], ··· 164 155 } 165 156 }, 166 157 "node_modules/@esbuild/darwin-x64": { 167 - "version": "0.19.11", 168 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", 169 - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", 158 + "version": "0.21.5", 159 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 160 + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 170 161 "cpu": [ 171 162 "x64" 172 163 ], ··· 179 170 } 180 171 }, 181 172 "node_modules/@esbuild/freebsd-arm64": { 182 - "version": "0.19.11", 183 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", 184 - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", 173 + "version": "0.21.5", 174 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 175 + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 185 176 "cpu": [ 186 177 "arm64" 187 178 ], ··· 194 185 } 195 186 }, 196 187 "node_modules/@esbuild/freebsd-x64": { 197 - "version": "0.19.11", 198 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", 199 - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", 188 + "version": "0.21.5", 189 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 190 + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 200 191 "cpu": [ 201 192 "x64" 202 193 ], ··· 209 200 } 210 201 }, 211 202 "node_modules/@esbuild/linux-arm": { 212 - "version": "0.19.11", 213 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", 214 - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", 203 + "version": "0.21.5", 204 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 205 + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 215 206 "cpu": [ 216 207 "arm" 217 208 ], ··· 224 215 } 225 216 }, 226 217 "node_modules/@esbuild/linux-arm64": { 227 - "version": "0.19.11", 228 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", 229 - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", 218 + "version": "0.21.5", 219 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 220 + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 230 221 "cpu": [ 231 222 "arm64" 232 223 ], ··· 239 230 } 240 231 }, 241 232 "node_modules/@esbuild/linux-ia32": { 242 - "version": "0.19.11", 243 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", 244 - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", 233 + "version": "0.21.5", 234 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 235 + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 245 236 "cpu": [ 246 237 "ia32" 247 238 ], ··· 254 245 } 255 246 }, 256 247 "node_modules/@esbuild/linux-loong64": { 257 - "version": "0.19.11", 258 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", 259 - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", 248 + "version": "0.21.5", 249 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 250 + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 260 251 "cpu": [ 261 252 "loong64" 262 253 ], ··· 269 260 } 270 261 }, 271 262 "node_modules/@esbuild/linux-mips64el": { 272 - "version": "0.19.11", 273 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", 274 - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", 263 + "version": "0.21.5", 264 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 265 + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 275 266 "cpu": [ 276 267 "mips64el" 277 268 ], ··· 284 275 } 285 276 }, 286 277 "node_modules/@esbuild/linux-ppc64": { 287 - "version": "0.19.11", 288 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", 289 - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", 278 + "version": "0.21.5", 279 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 280 + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 290 281 "cpu": [ 291 282 "ppc64" 292 283 ], ··· 299 290 } 300 291 }, 301 292 "node_modules/@esbuild/linux-riscv64": { 302 - "version": "0.19.11", 303 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", 304 - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", 293 + "version": "0.21.5", 294 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 295 + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 305 296 "cpu": [ 306 297 "riscv64" 307 298 ], ··· 314 305 } 315 306 }, 316 307 "node_modules/@esbuild/linux-s390x": { 317 - "version": "0.19.11", 318 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", 319 - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", 308 + "version": "0.21.5", 309 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 310 + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 320 311 "cpu": [ 321 312 "s390x" 322 313 ], ··· 329 320 } 330 321 }, 331 322 "node_modules/@esbuild/linux-x64": { 332 - "version": "0.19.11", 333 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", 334 - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", 323 + "version": "0.21.5", 324 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 325 + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 335 326 "cpu": [ 336 327 "x64" 337 328 ], ··· 344 335 } 345 336 }, 346 337 "node_modules/@esbuild/netbsd-x64": { 347 - "version": "0.19.11", 348 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", 349 - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", 338 + "version": "0.21.5", 339 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 340 + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 350 341 "cpu": [ 351 342 "x64" 352 343 ], ··· 359 350 } 360 351 }, 361 352 "node_modules/@esbuild/openbsd-x64": { 362 - "version": "0.19.11", 363 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", 364 - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", 353 + "version": "0.21.5", 354 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 355 + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 365 356 "cpu": [ 366 357 "x64" 367 358 ], ··· 374 365 } 375 366 }, 376 367 "node_modules/@esbuild/sunos-x64": { 377 - "version": "0.19.11", 378 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", 379 - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", 368 + "version": "0.21.5", 369 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 370 + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 380 371 "cpu": [ 381 372 "x64" 382 373 ], ··· 389 380 } 390 381 }, 391 382 "node_modules/@esbuild/win32-arm64": { 392 - "version": "0.19.11", 393 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", 394 - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", 383 + "version": "0.21.5", 384 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 385 + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 395 386 "cpu": [ 396 387 "arm64" 397 388 ], ··· 404 395 } 405 396 }, 406 397 "node_modules/@esbuild/win32-ia32": { 407 - "version": "0.19.11", 408 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", 409 - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", 398 + "version": "0.21.5", 399 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 400 + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 410 401 "cpu": [ 411 402 "ia32" 412 403 ], ··· 419 410 } 420 411 }, 421 412 "node_modules/@esbuild/win32-x64": { 422 - "version": "0.19.11", 423 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", 424 - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", 413 + "version": "0.21.5", 414 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 415 + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 425 416 "cpu": [ 426 417 "x64" 427 418 ], ··· 449 440 } 450 441 }, 451 442 "node_modules/@eslint-community/regexpp": { 452 - "version": "4.10.0", 453 - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", 454 - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", 443 + "version": "4.10.1", 444 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", 445 + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", 455 446 "dev": true, 456 447 "engines": { 457 448 "node": "^12.0.0 || ^14.0.0 || >=16.0.0" ··· 503 494 } 504 495 }, 505 496 "node_modules/@eslint/js": { 506 - "version": "8.56.0", 507 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", 508 - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", 497 + "version": "8.57.0", 498 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", 499 + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", 509 500 "dev": true, 510 501 "engines": { 511 502 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 512 503 } 513 504 }, 514 505 "node_modules/@floating-ui/core": { 515 - "version": "1.5.2", 516 - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", 517 - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", 506 + "version": "1.6.2", 507 + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", 508 + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", 518 509 "dependencies": { 519 - "@floating-ui/utils": "^0.1.3" 510 + "@floating-ui/utils": "^0.2.0" 520 511 } 521 512 }, 522 513 "node_modules/@floating-ui/dom": { 523 - "version": "1.5.3", 524 - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", 525 - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", 514 + "version": "1.6.5", 515 + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", 516 + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", 526 517 "dependencies": { 527 - "@floating-ui/core": "^1.4.2", 528 - "@floating-ui/utils": "^0.1.3" 518 + "@floating-ui/core": "^1.0.0", 519 + "@floating-ui/utils": "^0.2.0" 529 520 } 530 521 }, 531 522 "node_modules/@floating-ui/utils": { 532 - "version": "0.1.6", 533 - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", 534 - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" 523 + "version": "0.2.2", 524 + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", 525 + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" 535 526 }, 536 527 "node_modules/@humanwhocodes/config-array": { 537 - "version": "0.11.13", 538 - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", 539 - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", 528 + "version": "0.11.14", 529 + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", 530 + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", 531 + "deprecated": "Use @eslint/config-array instead", 540 532 "dev": true, 541 533 "dependencies": { 542 - "@humanwhocodes/object-schema": "^2.0.1", 543 - "debug": "^4.1.1", 534 + "@humanwhocodes/object-schema": "^2.0.2", 535 + "debug": "^4.3.1", 544 536 "minimatch": "^3.0.5" 545 537 }, 546 538 "engines": { ··· 583 575 } 584 576 }, 585 577 "node_modules/@humanwhocodes/object-schema": { 586 - "version": "2.0.1", 587 - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", 588 - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", 578 + "version": "2.0.3", 579 + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", 580 + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 581 + "deprecated": "Use @eslint/object-schema instead", 589 582 "dev": true 590 583 }, 591 584 "node_modules/@img/sharp-darwin-arm64": { 592 - "version": "0.33.1", 593 - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.1.tgz", 594 - "integrity": "sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==", 585 + "version": "0.33.4", 586 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", 587 + "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", 595 588 "cpu": [ 596 589 "arm64" 597 590 ], ··· 610 603 "url": "https://opencollective.com/libvips" 611 604 }, 612 605 "optionalDependencies": { 613 - "@img/sharp-libvips-darwin-arm64": "1.0.0" 606 + "@img/sharp-libvips-darwin-arm64": "1.0.2" 614 607 } 615 608 }, 616 609 "node_modules/@img/sharp-darwin-x64": { 617 - "version": "0.33.1", 618 - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.1.tgz", 619 - "integrity": "sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==", 610 + "version": "0.33.4", 611 + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", 612 + "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", 620 613 "cpu": [ 621 614 "x64" 622 615 ], ··· 635 628 "url": "https://opencollective.com/libvips" 636 629 }, 637 630 "optionalDependencies": { 638 - "@img/sharp-libvips-darwin-x64": "1.0.0" 631 + "@img/sharp-libvips-darwin-x64": "1.0.2" 639 632 } 640 633 }, 641 634 "node_modules/@img/sharp-libvips-darwin-arm64": { 642 - "version": "1.0.0", 643 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz", 644 - "integrity": "sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==", 635 + "version": "1.0.2", 636 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", 637 + "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", 645 638 "cpu": [ 646 639 "arm64" 647 640 ], ··· 660 653 } 661 654 }, 662 655 "node_modules/@img/sharp-libvips-darwin-x64": { 663 - "version": "1.0.0", 664 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz", 665 - "integrity": "sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==", 656 + "version": "1.0.2", 657 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", 658 + "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", 666 659 "cpu": [ 667 660 "x64" 668 661 ], ··· 681 674 } 682 675 }, 683 676 "node_modules/@img/sharp-libvips-linux-arm": { 684 - "version": "1.0.0", 685 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz", 686 - "integrity": "sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==", 677 + "version": "1.0.2", 678 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", 679 + "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", 687 680 "cpu": [ 688 681 "arm" 689 682 ], ··· 702 695 } 703 696 }, 704 697 "node_modules/@img/sharp-libvips-linux-arm64": { 705 - "version": "1.0.0", 706 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz", 707 - "integrity": "sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==", 698 + "version": "1.0.2", 699 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", 700 + "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", 708 701 "cpu": [ 709 702 "arm64" 710 703 ], ··· 723 716 } 724 717 }, 725 718 "node_modules/@img/sharp-libvips-linux-s390x": { 726 - "version": "1.0.0", 727 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz", 728 - "integrity": "sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==", 719 + "version": "1.0.2", 720 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", 721 + "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", 729 722 "cpu": [ 730 723 "s390x" 731 724 ], ··· 744 737 } 745 738 }, 746 739 "node_modules/@img/sharp-libvips-linux-x64": { 747 - "version": "1.0.0", 748 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz", 749 - "integrity": "sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==", 740 + "version": "1.0.2", 741 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", 742 + "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", 750 743 "cpu": [ 751 744 "x64" 752 745 ], ··· 765 758 } 766 759 }, 767 760 "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 768 - "version": "1.0.0", 769 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz", 770 - "integrity": "sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==", 761 + "version": "1.0.2", 762 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", 763 + "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", 771 764 "cpu": [ 772 765 "arm64" 773 766 ], ··· 786 779 } 787 780 }, 788 781 "node_modules/@img/sharp-libvips-linuxmusl-x64": { 789 - "version": "1.0.0", 790 - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz", 791 - "integrity": "sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==", 782 + "version": "1.0.2", 783 + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", 784 + "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", 792 785 "cpu": [ 793 786 "x64" 794 787 ], ··· 807 800 } 808 801 }, 809 802 "node_modules/@img/sharp-linux-arm": { 810 - "version": "0.33.1", 811 - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.1.tgz", 812 - "integrity": "sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==", 803 + "version": "0.33.4", 804 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", 805 + "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", 813 806 "cpu": [ 814 807 "arm" 815 808 ], ··· 828 821 "url": "https://opencollective.com/libvips" 829 822 }, 830 823 "optionalDependencies": { 831 - "@img/sharp-libvips-linux-arm": "1.0.0" 824 + "@img/sharp-libvips-linux-arm": "1.0.2" 832 825 } 833 826 }, 834 827 "node_modules/@img/sharp-linux-arm64": { 835 - "version": "0.33.1", 836 - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.1.tgz", 837 - "integrity": "sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==", 828 + "version": "0.33.4", 829 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", 830 + "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", 838 831 "cpu": [ 839 832 "arm64" 840 833 ], ··· 853 846 "url": "https://opencollective.com/libvips" 854 847 }, 855 848 "optionalDependencies": { 856 - "@img/sharp-libvips-linux-arm64": "1.0.0" 849 + "@img/sharp-libvips-linux-arm64": "1.0.2" 857 850 } 858 851 }, 859 852 "node_modules/@img/sharp-linux-s390x": { 860 - "version": "0.33.1", 861 - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.1.tgz", 862 - "integrity": "sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==", 853 + "version": "0.33.4", 854 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", 855 + "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", 863 856 "cpu": [ 864 857 "s390x" 865 858 ], ··· 868 861 "linux" 869 862 ], 870 863 "engines": { 871 - "glibc": ">=2.28", 864 + "glibc": ">=2.31", 872 865 "node": "^18.17.0 || ^20.3.0 || >=21.0.0", 873 866 "npm": ">=9.6.5", 874 867 "pnpm": ">=7.1.0", ··· 878 871 "url": "https://opencollective.com/libvips" 879 872 }, 880 873 "optionalDependencies": { 881 - "@img/sharp-libvips-linux-s390x": "1.0.0" 874 + "@img/sharp-libvips-linux-s390x": "1.0.2" 882 875 } 883 876 }, 884 877 "node_modules/@img/sharp-linux-x64": { 885 - "version": "0.33.1", 886 - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.1.tgz", 887 - "integrity": "sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==", 878 + "version": "0.33.4", 879 + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", 880 + "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", 888 881 "cpu": [ 889 882 "x64" 890 883 ], ··· 903 896 "url": "https://opencollective.com/libvips" 904 897 }, 905 898 "optionalDependencies": { 906 - "@img/sharp-libvips-linux-x64": "1.0.0" 899 + "@img/sharp-libvips-linux-x64": "1.0.2" 907 900 } 908 901 }, 909 902 "node_modules/@img/sharp-linuxmusl-arm64": { 910 - "version": "0.33.1", 911 - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.1.tgz", 912 - "integrity": "sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==", 903 + "version": "0.33.4", 904 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", 905 + "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", 913 906 "cpu": [ 914 907 "arm64" 915 908 ], ··· 928 921 "url": "https://opencollective.com/libvips" 929 922 }, 930 923 "optionalDependencies": { 931 - "@img/sharp-libvips-linuxmusl-arm64": "1.0.0" 924 + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" 932 925 } 933 926 }, 934 927 "node_modules/@img/sharp-linuxmusl-x64": { 935 - "version": "0.33.1", 936 - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.1.tgz", 937 - "integrity": "sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==", 928 + "version": "0.33.4", 929 + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", 930 + "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", 938 931 "cpu": [ 939 932 "x64" 940 933 ], ··· 953 946 "url": "https://opencollective.com/libvips" 954 947 }, 955 948 "optionalDependencies": { 956 - "@img/sharp-libvips-linuxmusl-x64": "1.0.0" 949 + "@img/sharp-libvips-linuxmusl-x64": "1.0.2" 957 950 } 958 951 }, 959 952 "node_modules/@img/sharp-wasm32": { 960 - "version": "0.33.1", 961 - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.1.tgz", 962 - "integrity": "sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==", 953 + "version": "0.33.4", 954 + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", 955 + "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", 963 956 "cpu": [ 964 957 "wasm32" 965 958 ], 966 959 "optional": true, 967 960 "dependencies": { 968 - "@emnapi/runtime": "^0.44.0" 961 + "@emnapi/runtime": "^1.1.1" 969 962 }, 970 963 "engines": { 971 964 "node": "^18.17.0 || ^20.3.0 || >=21.0.0", ··· 978 971 } 979 972 }, 980 973 "node_modules/@img/sharp-win32-ia32": { 981 - "version": "0.33.1", 982 - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.1.tgz", 983 - "integrity": "sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==", 974 + "version": "0.33.4", 975 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", 976 + "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", 984 977 "cpu": [ 985 978 "ia32" 986 979 ], ··· 999 992 } 1000 993 }, 1001 994 "node_modules/@img/sharp-win32-x64": { 1002 - "version": "0.33.1", 1003 - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.1.tgz", 1004 - "integrity": "sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==", 995 + "version": "0.33.4", 996 + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", 997 + "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", 1005 998 "cpu": [ 1006 999 "x64" 1007 1000 ], ··· 1020 1013 } 1021 1014 }, 1022 1015 "node_modules/@internationalized/date": { 1023 - "version": "3.5.1", 1024 - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.1.tgz", 1025 - "integrity": "sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ==", 1016 + "version": "3.5.4", 1017 + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.4.tgz", 1018 + "integrity": "sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==", 1026 1019 "dependencies": { 1027 1020 "@swc/helpers": "^0.5.0" 1028 1021 } ··· 1069 1062 } 1070 1063 }, 1071 1064 "node_modules/@jridgewell/gen-mapping": { 1072 - "version": "0.3.3", 1073 - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 1074 - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 1065 + "version": "0.3.5", 1066 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 1067 + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 1075 1068 "dependencies": { 1076 - "@jridgewell/set-array": "^1.0.1", 1069 + "@jridgewell/set-array": "^1.2.1", 1077 1070 "@jridgewell/sourcemap-codec": "^1.4.10", 1078 - "@jridgewell/trace-mapping": "^0.3.9" 1071 + "@jridgewell/trace-mapping": "^0.3.24" 1079 1072 }, 1080 1073 "engines": { 1081 1074 "node": ">=6.0.0" 1082 1075 } 1083 1076 }, 1084 1077 "node_modules/@jridgewell/resolve-uri": { 1085 - "version": "3.1.1", 1086 - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 1087 - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 1078 + "version": "3.1.2", 1079 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1080 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1088 1081 "engines": { 1089 1082 "node": ">=6.0.0" 1090 1083 } 1091 1084 }, 1092 1085 "node_modules/@jridgewell/set-array": { 1093 - "version": "1.1.2", 1094 - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 1095 - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 1086 + "version": "1.2.1", 1087 + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 1088 + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 1096 1089 "engines": { 1097 1090 "node": ">=6.0.0" 1098 1091 } ··· 1103 1096 "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 1104 1097 }, 1105 1098 "node_modules/@jridgewell/trace-mapping": { 1106 - "version": "0.3.20", 1107 - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", 1108 - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", 1099 + "version": "0.3.25", 1100 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1101 + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1109 1102 "dependencies": { 1110 1103 "@jridgewell/resolve-uri": "^3.1.0", 1111 1104 "@jridgewell/sourcemap-codec": "^1.4.14" 1112 1105 } 1113 1106 }, 1114 1107 "node_modules/@melt-ui/pp": { 1115 - "version": "0.3.0", 1116 - "resolved": "https://registry.npmjs.org/@melt-ui/pp/-/pp-0.3.0.tgz", 1117 - "integrity": "sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==", 1108 + "version": "0.3.2", 1109 + "resolved": "https://registry.npmjs.org/@melt-ui/pp/-/pp-0.3.2.tgz", 1110 + "integrity": "sha512-xKkPvaIAFinklLXcQOpwZ8YSpqAFxykjWf8Y/fSJQwsixV/0rcFs07hJ49hJjPy5vItvw5Qa0uOjzFUbXzBypQ==", 1118 1111 "dependencies": { 1119 1112 "estree-walker": "^3.0.3", 1120 1113 "magic-string": "^0.30.5" 1121 - }, 1122 - "engines": { 1123 - "pnpm": ">=8.6.3" 1124 1114 }, 1125 1115 "peerDependencies": { 1126 1116 "@melt-ui/svelte": ">= 0.29.0", ··· 1141 1131 }, 1142 1132 "peerDependencies": { 1143 1133 "svelte": ">=3 <5" 1144 - } 1145 - }, 1146 - "node_modules/@melt-ui/svelte/node_modules/nanoid": { 1147 - "version": "4.0.2", 1148 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", 1149 - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", 1150 - "funding": [ 1151 - { 1152 - "type": "github", 1153 - "url": "https://github.com/sponsors/ai" 1154 - } 1155 - ], 1156 - "bin": { 1157 - "nanoid": "bin/nanoid.js" 1158 - }, 1159 - "engines": { 1160 - "node": "^14 || ^16 || >=18" 1161 1134 } 1162 1135 }, 1163 1136 "node_modules/@nodelib/fs.scandir": { ··· 1202 1175 } 1203 1176 }, 1204 1177 "node_modules/@polka/url": { 1205 - "version": "1.0.0-next.24", 1206 - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", 1207 - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" 1178 + "version": "1.0.0-next.25", 1179 + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", 1180 + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" 1208 1181 }, 1209 1182 "node_modules/@rollup/pluginutils": { 1210 1183 "version": "5.1.0", ··· 1233 1206 "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 1234 1207 }, 1235 1208 "node_modules/@rollup/rollup-android-arm-eabi": { 1236 - "version": "4.9.2", 1237 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz", 1238 - "integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==", 1209 + "version": "4.18.0", 1210 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", 1211 + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", 1239 1212 "cpu": [ 1240 1213 "arm" 1241 1214 ], ··· 1245 1218 ] 1246 1219 }, 1247 1220 "node_modules/@rollup/rollup-android-arm64": { 1248 - "version": "4.9.2", 1249 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz", 1250 - "integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==", 1221 + "version": "4.18.0", 1222 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", 1223 + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", 1251 1224 "cpu": [ 1252 1225 "arm64" 1253 1226 ], ··· 1257 1230 ] 1258 1231 }, 1259 1232 "node_modules/@rollup/rollup-darwin-arm64": { 1260 - "version": "4.9.2", 1261 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz", 1262 - "integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==", 1233 + "version": "4.18.0", 1234 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", 1235 + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", 1263 1236 "cpu": [ 1264 1237 "arm64" 1265 1238 ], ··· 1269 1242 ] 1270 1243 }, 1271 1244 "node_modules/@rollup/rollup-darwin-x64": { 1272 - "version": "4.9.2", 1273 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz", 1274 - "integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==", 1245 + "version": "4.18.0", 1246 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", 1247 + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", 1275 1248 "cpu": [ 1276 1249 "x64" 1277 1250 ], ··· 1281 1254 ] 1282 1255 }, 1283 1256 "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1284 - "version": "4.9.2", 1285 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz", 1286 - "integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==", 1257 + "version": "4.18.0", 1258 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", 1259 + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", 1260 + "cpu": [ 1261 + "arm" 1262 + ], 1263 + "optional": true, 1264 + "os": [ 1265 + "linux" 1266 + ] 1267 + }, 1268 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1269 + "version": "4.18.0", 1270 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", 1271 + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", 1287 1272 "cpu": [ 1288 1273 "arm" 1289 1274 ], ··· 1293 1278 ] 1294 1279 }, 1295 1280 "node_modules/@rollup/rollup-linux-arm64-gnu": { 1296 - "version": "4.9.2", 1297 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz", 1298 - "integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==", 1281 + "version": "4.18.0", 1282 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", 1283 + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", 1299 1284 "cpu": [ 1300 1285 "arm64" 1301 1286 ], ··· 1305 1290 ] 1306 1291 }, 1307 1292 "node_modules/@rollup/rollup-linux-arm64-musl": { 1308 - "version": "4.9.2", 1309 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz", 1310 - "integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==", 1293 + "version": "4.18.0", 1294 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", 1295 + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", 1311 1296 "cpu": [ 1312 1297 "arm64" 1313 1298 ], ··· 1316 1301 "linux" 1317 1302 ] 1318 1303 }, 1304 + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1305 + "version": "4.18.0", 1306 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", 1307 + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", 1308 + "cpu": [ 1309 + "ppc64" 1310 + ], 1311 + "optional": true, 1312 + "os": [ 1313 + "linux" 1314 + ] 1315 + }, 1319 1316 "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1320 - "version": "4.9.2", 1321 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz", 1322 - "integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==", 1317 + "version": "4.18.0", 1318 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", 1319 + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", 1323 1320 "cpu": [ 1324 1321 "riscv64" 1325 1322 ], ··· 1328 1325 "linux" 1329 1326 ] 1330 1327 }, 1328 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 1329 + "version": "4.18.0", 1330 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", 1331 + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", 1332 + "cpu": [ 1333 + "s390x" 1334 + ], 1335 + "optional": true, 1336 + "os": [ 1337 + "linux" 1338 + ] 1339 + }, 1331 1340 "node_modules/@rollup/rollup-linux-x64-gnu": { 1332 - "version": "4.9.2", 1333 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz", 1334 - "integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==", 1341 + "version": "4.18.0", 1342 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", 1343 + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", 1335 1344 "cpu": [ 1336 1345 "x64" 1337 1346 ], ··· 1341 1350 ] 1342 1351 }, 1343 1352 "node_modules/@rollup/rollup-linux-x64-musl": { 1344 - "version": "4.9.2", 1345 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz", 1346 - "integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==", 1353 + "version": "4.18.0", 1354 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", 1355 + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", 1347 1356 "cpu": [ 1348 1357 "x64" 1349 1358 ], ··· 1353 1362 ] 1354 1363 }, 1355 1364 "node_modules/@rollup/rollup-win32-arm64-msvc": { 1356 - "version": "4.9.2", 1357 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz", 1358 - "integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==", 1365 + "version": "4.18.0", 1366 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", 1367 + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", 1359 1368 "cpu": [ 1360 1369 "arm64" 1361 1370 ], ··· 1365 1374 ] 1366 1375 }, 1367 1376 "node_modules/@rollup/rollup-win32-ia32-msvc": { 1368 - "version": "4.9.2", 1369 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz", 1370 - "integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==", 1377 + "version": "4.18.0", 1378 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", 1379 + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", 1371 1380 "cpu": [ 1372 1381 "ia32" 1373 1382 ], ··· 1377 1386 ] 1378 1387 }, 1379 1388 "node_modules/@rollup/rollup-win32-x64-msvc": { 1380 - "version": "4.9.2", 1381 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz", 1382 - "integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==", 1389 + "version": "4.18.0", 1390 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", 1391 + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", 1383 1392 "cpu": [ 1384 1393 "x64" 1385 1394 ], ··· 1389 1398 ] 1390 1399 }, 1391 1400 "node_modules/@sveltejs/adapter-auto": { 1392 - "version": "3.1.0", 1393 - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.1.0.tgz", 1394 - "integrity": "sha512-igS5hqCwdiXWb8NoWzThKCVQQj9tKgUkbTtzfxBPgSLOyFjkiGNDX0SgCoY2QIUWBqOkfGTOqGlrW5Ynw9oUvw==", 1401 + "version": "3.2.2", 1402 + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.2.2.tgz", 1403 + "integrity": "sha512-Mso5xPCA8zgcKrv+QioVlqMZkyUQ5MjDJiEPuG/Z7cV/5tmwV7LmcVWk5tZ+H0NCOV1x12AsoSpt/CwFwuVXMA==", 1395 1404 "dev": true, 1396 1405 "dependencies": { 1397 - "import-meta-resolve": "^4.0.0" 1406 + "import-meta-resolve": "^4.1.0" 1398 1407 }, 1399 1408 "peerDependencies": { 1400 1409 "@sveltejs/kit": "^2.0.0" 1401 1410 } 1402 1411 }, 1403 1412 "node_modules/@sveltejs/adapter-static": { 1404 - "version": "3.0.1", 1405 - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.1.tgz", 1406 - "integrity": "sha512-6lMvf7xYEJ+oGeR5L8DFJJrowkefTK6ZgA4JiMqoClMkKq0s6yvsd3FZfCFvX1fQ0tpCD7fkuRVHsnUVgsHyNg==", 1413 + "version": "3.0.2", 1414 + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.2.tgz", 1415 + "integrity": "sha512-/EBFydZDwfwFfFEuF1vzUseBoRziwKP7AoHAwv+Ot3M084sE/HTVBHf9mCmXfdM9ijprY5YEugZjleflncX5fQ==", 1407 1416 "peerDependencies": { 1408 1417 "@sveltejs/kit": "^2.0.0" 1409 1418 } 1410 1419 }, 1411 1420 "node_modules/@sveltejs/kit": { 1412 - "version": "2.0.6", 1413 - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.0.6.tgz", 1414 - "integrity": "sha512-dnHtyjBLGXx+hrZQ9GuqLlSfTBixewJaByUVWai7LmB4dgV3FwkK155OltEgONDQW6KW64hLNS/uojdx3uC2/g==", 1421 + "version": "2.5.16", 1422 + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.16.tgz", 1423 + "integrity": "sha512-09Ypy+ibuhTCTpRFRnR+cDI3VARiu16o7vVSjETAA43ZCLtqvrNrVxUkJ/fKHrAjx2peKWilcHE8+SbW2Z/AsQ==", 1415 1424 "hasInstallScript": true, 1416 1425 "dependencies": { 1417 1426 "@types/cookie": "^0.6.0", 1418 1427 "cookie": "^0.6.0", 1419 - "devalue": "^4.3.2", 1428 + "devalue": "^5.0.0", 1420 1429 "esm-env": "^1.0.0", 1430 + "import-meta-resolve": "^4.1.0", 1421 1431 "kleur": "^4.1.5", 1422 1432 "magic-string": "^0.30.5", 1423 1433 "mrmime": "^2.0.0", ··· 1439 1449 } 1440 1450 }, 1441 1451 "node_modules/@sveltejs/vite-plugin-svelte": { 1442 - "version": "3.0.1", 1443 - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.1.tgz", 1444 - "integrity": "sha512-CGURX6Ps+TkOovK6xV+Y2rn8JKa8ZPUHPZ/NKgCxAmgBrXReavzFl8aOSCj3kQ1xqT7yGJj53hjcV/gqwDAaWA==", 1452 + "version": "3.1.1", 1453 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.1.tgz", 1454 + "integrity": "sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==", 1445 1455 "dependencies": { 1446 - "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0-next.0 || ^2.0.0", 1456 + "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", 1447 1457 "debug": "^4.3.4", 1448 1458 "deepmerge": "^4.3.1", 1449 1459 "kleur": "^4.1.5", 1450 - "magic-string": "^0.30.5", 1451 - "svelte-hmr": "^0.15.3", 1460 + "magic-string": "^0.30.10", 1461 + "svelte-hmr": "^0.16.0", 1452 1462 "vitefu": "^0.2.5" 1453 1463 }, 1454 1464 "engines": { ··· 1460 1470 } 1461 1471 }, 1462 1472 "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 1463 - "version": "2.0.0", 1464 - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz", 1465 - "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==", 1473 + "version": "2.1.0", 1474 + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", 1475 + "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", 1466 1476 "dependencies": { 1467 1477 "debug": "^4.3.4" 1468 1478 }, ··· 1476 1486 } 1477 1487 }, 1478 1488 "node_modules/@swc/helpers": { 1479 - "version": "0.5.3", 1480 - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", 1481 - "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", 1489 + "version": "0.5.11", 1490 + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", 1491 + "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", 1482 1492 "dependencies": { 1483 1493 "tslib": "^2.4.0" 1484 1494 } ··· 1492 1502 } 1493 1503 }, 1494 1504 "node_modules/@theatre/core": { 1495 - "version": "0.7.0", 1496 - "resolved": "https://registry.npmjs.org/@theatre/core/-/core-0.7.0.tgz", 1497 - "integrity": "sha512-CXRUxOaKQtb4biQa6+I6PW8wPsFj9NsZgr7VdosSB20WxlanQ8/ZR0xH/A3A3oCHdCXKaZxQlNcEOeByk4Yf/g==", 1505 + "version": "0.7.2", 1506 + "resolved": "https://registry.npmjs.org/@theatre/core/-/core-0.7.2.tgz", 1507 + "integrity": "sha512-IDQa/6WY7mIJAtsSd4EgNcM0IUZkl+FrqZ8DdYiCVTFap9ARDNmrngJOeFjJOsnnaHlc5GdEB/jj7fsjbIrAzQ==", 1498 1508 "dev": true, 1499 1509 "dependencies": { 1500 - "@theatre/dataverse": "0.7.0" 1510 + "@theatre/dataverse": "0.7.2" 1501 1511 } 1502 1512 }, 1503 1513 "node_modules/@theatre/dataverse": { 1504 - "version": "0.7.0", 1505 - "resolved": "https://registry.npmjs.org/@theatre/dataverse/-/dataverse-0.7.0.tgz", 1506 - "integrity": "sha512-NbhTZYOqETp9g0II7R9GypErnZ47TmoT6yzyQ0vGfgVLD1a+dsPG+CLvvyzssbGG/gfDDoMzkXNwWJAwNkqFvQ==", 1514 + "version": "0.7.2", 1515 + "resolved": "https://registry.npmjs.org/@theatre/dataverse/-/dataverse-0.7.2.tgz", 1516 + "integrity": "sha512-YyfoyX7EyhFUY2OM5fsM0LPrs1SdgLwpiTMkkvTIoZLdOwvQhstjYq4Yz/8ZncJlRoTWvakfmgvCaBN+QuBYxg==", 1507 1517 "dev": true, 1508 1518 "dependencies": { 1509 1519 "lodash-es": "^4.17.21" 1510 1520 } 1511 1521 }, 1512 1522 "node_modules/@theatre/studio": { 1513 - "version": "0.7.0", 1514 - "resolved": "https://registry.npmjs.org/@theatre/studio/-/studio-0.7.0.tgz", 1515 - "integrity": "sha512-aBkDUBmvajWaha5dd/6Fs7sHCDMQKqVlLX9SDGsMJkKoCEb9dzwD5F5FOZCWt+OhbbwIbP9dYR6S4n6abyDkBQ==", 1523 + "version": "0.7.2", 1524 + "resolved": "https://registry.npmjs.org/@theatre/studio/-/studio-0.7.2.tgz", 1525 + "integrity": "sha512-p6LTKzJWVlcHkpGzIlNHh9AkGbB3E+0q9Pjxv+OJoTDe1IK+CMKW695Wp+1//lB4vfC9qShe4z/p+Zaj1q8KtA==", 1516 1526 "dev": true, 1517 1527 "dependencies": { 1518 - "@theatre/dataverse": "0.7.0" 1528 + "@theatre/dataverse": "0.7.2" 1519 1529 }, 1520 1530 "peerDependencies": { 1521 1531 "@theatre/core": "*" 1522 1532 } 1523 1533 }, 1534 + "node_modules/@threejs-kit/instanced-sprite-mesh": { 1535 + "version": "2.4.7", 1536 + "resolved": "https://registry.npmjs.org/@threejs-kit/instanced-sprite-mesh/-/instanced-sprite-mesh-2.4.7.tgz", 1537 + "integrity": "sha512-31erNfFEF+msFyWH46sIbjaACXqBke/8qMr/xhv9E3INPCLTrLuN4C4W93znnyTiyuCQ3Waf5UOCT18OBWTUtw==", 1538 + "dev": true, 1539 + "dependencies": { 1540 + "diet-sprite": "^0.0.1", 1541 + "earcut": "^2.2.4", 1542 + "maath": "^0.10.7", 1543 + "three-instanced-uniforms-mesh": "^0.49.0", 1544 + "troika-three-utils": "^0.49.0" 1545 + }, 1546 + "peerDependencies": { 1547 + "three": ">=0.151.0" 1548 + } 1549 + }, 1524 1550 "node_modules/@threlte/core": { 1525 - "version": "7.0.12", 1526 - "resolved": "https://registry.npmjs.org/@threlte/core/-/core-7.0.12.tgz", 1527 - "integrity": "sha512-+I4+mVsxAfn4Og9it48x5+oQSDr3kg4O1qpCxUdVVPAzu69MpVd+2iYU9lnBlS1ZCSlNlTXU2UUFlw895HJ9ZA==", 1551 + "version": "7.3.0", 1552 + "resolved": "https://registry.npmjs.org/@threlte/core/-/core-7.3.0.tgz", 1553 + "integrity": "sha512-yedstu5kcjV1/V1W0xNjkFQmL8A+n57NzjxBK+cPC1fdUtOvBtmOPxvOZ0b/TlhTyZM8XkEv4BiKrGibOrBzyA==", 1528 1554 "dev": true, 1529 1555 "dependencies": { 1530 1556 "mitt": "^3.0.1" 1531 1557 }, 1532 1558 "peerDependencies": { 1533 1559 "svelte": ">=4", 1534 - "three": ">=0.133" 1560 + "three": ">=0.152" 1535 1561 } 1536 1562 }, 1537 1563 "node_modules/@threlte/extras": { 1538 - "version": "8.4.0", 1539 - "resolved": "https://registry.npmjs.org/@threlte/extras/-/extras-8.4.0.tgz", 1540 - "integrity": "sha512-JlvJUAdG9UsqPhJpk6aMF1XtSdWwRyPjhpsXsqrX6SVfge58n1KLnllbuw1hEYzrMJJC1CHZUrilbh08zDokYw==", 1564 + "version": "8.11.2", 1565 + "resolved": "https://registry.npmjs.org/@threlte/extras/-/extras-8.11.2.tgz", 1566 + "integrity": "sha512-4wXIh47EoQbgjOrcbwiXFlQ3s4fPxW5x3OSfXEZgn8GGBdC8ZGdMhALyProe/6VeLhGa50uEn21vX7TcQYgn1w==", 1541 1567 "dev": true, 1542 1568 "dependencies": { 1569 + "@threejs-kit/instanced-sprite-mesh": "^2.4.6", 1570 + "three-mesh-bvh": "^0.7.1", 1571 + "three-perf": "^1.0.10", 1543 1572 "troika-three-text": "^0.49.0" 1544 1573 }, 1545 1574 "peerDependencies": { 1546 1575 "svelte": ">=4", 1547 - "three": ">=0.133" 1576 + "three": ">=0.152" 1548 1577 } 1549 1578 }, 1550 1579 "node_modules/@threlte/theatre": { 1551 - "version": "2.1.5", 1552 - "resolved": "https://registry.npmjs.org/@threlte/theatre/-/theatre-2.1.5.tgz", 1553 - "integrity": "sha512-rusNx3Pw8n0TWgSoENM6sWYLHrDME0HopP5t52ueh8GXeOSw/zv9vM1rfhXY6ulyH7uJu4ZBbk4c18zaBhdUiQ==", 1580 + "version": "2.1.7", 1581 + "resolved": "https://registry.npmjs.org/@threlte/theatre/-/theatre-2.1.7.tgz", 1582 + "integrity": "sha512-VYNHsuwMKLrPcH0/gOW3FkYzPX/dXWXfedfamIt8C1DlpwfWn4c8sYdTMGyKqYah+a1hVQ1oQNu9pfTcj9c6qw==", 1554 1583 "dev": true, 1555 1584 "peerDependencies": { 1556 1585 "@theatre/core": ">=0.6", ··· 1558 1587 "@threlte/core": ">=6.0.3", 1559 1588 "@threlte/extras": ">=5.1.0", 1560 1589 "svelte": ">=4", 1561 - "three": ">=0.133" 1590 + "three": ">=0.152" 1562 1591 } 1563 1592 }, 1564 1593 "node_modules/@types/cookie": { ··· 1594 1623 "dev": true 1595 1624 }, 1596 1625 "node_modules/@types/semver": { 1597 - "version": "7.5.6", 1598 - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", 1599 - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", 1626 + "version": "7.5.8", 1627 + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", 1628 + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", 1600 1629 "dev": true 1601 1630 }, 1602 1631 "node_modules/@types/stats.js": { ··· 1618 1647 } 1619 1648 }, 1620 1649 "node_modules/@types/webxr": { 1621 - "version": "0.5.10", 1622 - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.10.tgz", 1623 - "integrity": "sha512-n3u5sqXQJhf1CS68mw3Wf16FQ4cRPNBBwdYLFzq3UddiADOim1Pn3Y6PBdDilz1vOJF3ybLxJ8ZEDlLIzrOQZg==", 1650 + "version": "0.5.16", 1651 + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.16.tgz", 1652 + "integrity": "sha512-0E0Cl84FECtzrB4qG19TNTqpunw0F1YF0QZZnFMF6pDw1kNKJtrlTKlVB34stGIsHbZsYQ7H0tNjPfZftkHHoA==", 1624 1653 "dev": true 1625 1654 }, 1626 1655 "node_modules/@typescript-eslint/eslint-plugin": { 1627 - "version": "6.17.0", 1628 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz", 1629 - "integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==", 1656 + "version": "6.21.0", 1657 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", 1658 + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", 1630 1659 "dev": true, 1631 1660 "dependencies": { 1632 1661 "@eslint-community/regexpp": "^4.5.1", 1633 - "@typescript-eslint/scope-manager": "6.17.0", 1634 - "@typescript-eslint/type-utils": "6.17.0", 1635 - "@typescript-eslint/utils": "6.17.0", 1636 - "@typescript-eslint/visitor-keys": "6.17.0", 1662 + "@typescript-eslint/scope-manager": "6.21.0", 1663 + "@typescript-eslint/type-utils": "6.21.0", 1664 + "@typescript-eslint/utils": "6.21.0", 1665 + "@typescript-eslint/visitor-keys": "6.21.0", 1637 1666 "debug": "^4.3.4", 1638 1667 "graphemer": "^1.4.0", 1639 1668 "ignore": "^5.2.4", ··· 1659 1688 } 1660 1689 }, 1661 1690 "node_modules/@typescript-eslint/parser": { 1662 - "version": "6.17.0", 1663 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz", 1664 - "integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==", 1691 + "version": "6.21.0", 1692 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", 1693 + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", 1665 1694 "dev": true, 1666 1695 "dependencies": { 1667 - "@typescript-eslint/scope-manager": "6.17.0", 1668 - "@typescript-eslint/types": "6.17.0", 1669 - "@typescript-eslint/typescript-estree": "6.17.0", 1670 - "@typescript-eslint/visitor-keys": "6.17.0", 1696 + "@typescript-eslint/scope-manager": "6.21.0", 1697 + "@typescript-eslint/types": "6.21.0", 1698 + "@typescript-eslint/typescript-estree": "6.21.0", 1699 + "@typescript-eslint/visitor-keys": "6.21.0", 1671 1700 "debug": "^4.3.4" 1672 1701 }, 1673 1702 "engines": { ··· 1687 1716 } 1688 1717 }, 1689 1718 "node_modules/@typescript-eslint/scope-manager": { 1690 - "version": "6.17.0", 1691 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz", 1692 - "integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==", 1719 + "version": "6.21.0", 1720 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", 1721 + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", 1693 1722 "dev": true, 1694 1723 "dependencies": { 1695 - "@typescript-eslint/types": "6.17.0", 1696 - "@typescript-eslint/visitor-keys": "6.17.0" 1724 + "@typescript-eslint/types": "6.21.0", 1725 + "@typescript-eslint/visitor-keys": "6.21.0" 1697 1726 }, 1698 1727 "engines": { 1699 1728 "node": "^16.0.0 || >=18.0.0" ··· 1704 1733 } 1705 1734 }, 1706 1735 "node_modules/@typescript-eslint/type-utils": { 1707 - "version": "6.17.0", 1708 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz", 1709 - "integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==", 1736 + "version": "6.21.0", 1737 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", 1738 + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", 1710 1739 "dev": true, 1711 1740 "dependencies": { 1712 - "@typescript-eslint/typescript-estree": "6.17.0", 1713 - "@typescript-eslint/utils": "6.17.0", 1741 + "@typescript-eslint/typescript-estree": "6.21.0", 1742 + "@typescript-eslint/utils": "6.21.0", 1714 1743 "debug": "^4.3.4", 1715 1744 "ts-api-utils": "^1.0.1" 1716 1745 }, ··· 1731 1760 } 1732 1761 }, 1733 1762 "node_modules/@typescript-eslint/types": { 1734 - "version": "6.17.0", 1735 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz", 1736 - "integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==", 1763 + "version": "6.21.0", 1764 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", 1765 + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", 1737 1766 "dev": true, 1738 1767 "engines": { 1739 1768 "node": "^16.0.0 || >=18.0.0" ··· 1744 1773 } 1745 1774 }, 1746 1775 "node_modules/@typescript-eslint/typescript-estree": { 1747 - "version": "6.17.0", 1748 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz", 1749 - "integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==", 1776 + "version": "6.21.0", 1777 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", 1778 + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", 1750 1779 "dev": true, 1751 1780 "dependencies": { 1752 - "@typescript-eslint/types": "6.17.0", 1753 - "@typescript-eslint/visitor-keys": "6.17.0", 1781 + "@typescript-eslint/types": "6.21.0", 1782 + "@typescript-eslint/visitor-keys": "6.21.0", 1754 1783 "debug": "^4.3.4", 1755 1784 "globby": "^11.1.0", 1756 1785 "is-glob": "^4.0.3", ··· 1772 1801 } 1773 1802 }, 1774 1803 "node_modules/@typescript-eslint/utils": { 1775 - "version": "6.17.0", 1776 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz", 1777 - "integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==", 1804 + "version": "6.21.0", 1805 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", 1806 + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", 1778 1807 "dev": true, 1779 1808 "dependencies": { 1780 1809 "@eslint-community/eslint-utils": "^4.4.0", 1781 1810 "@types/json-schema": "^7.0.12", 1782 1811 "@types/semver": "^7.5.0", 1783 - "@typescript-eslint/scope-manager": "6.17.0", 1784 - "@typescript-eslint/types": "6.17.0", 1785 - "@typescript-eslint/typescript-estree": "6.17.0", 1812 + "@typescript-eslint/scope-manager": "6.21.0", 1813 + "@typescript-eslint/types": "6.21.0", 1814 + "@typescript-eslint/typescript-estree": "6.21.0", 1786 1815 "semver": "^7.5.4" 1787 1816 }, 1788 1817 "engines": { ··· 1797 1826 } 1798 1827 }, 1799 1828 "node_modules/@typescript-eslint/visitor-keys": { 1800 - "version": "6.17.0", 1801 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz", 1802 - "integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==", 1829 + "version": "6.21.0", 1830 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", 1831 + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", 1803 1832 "dev": true, 1804 1833 "dependencies": { 1805 - "@typescript-eslint/types": "6.17.0", 1834 + "@typescript-eslint/types": "6.21.0", 1806 1835 "eslint-visitor-keys": "^3.4.1" 1807 1836 }, 1808 1837 "engines": { ··· 1820 1849 "dev": true 1821 1850 }, 1822 1851 "node_modules/acorn": { 1823 - "version": "8.11.3", 1824 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 1825 - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 1852 + "version": "8.12.0", 1853 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", 1854 + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", 1826 1855 "bin": { 1827 1856 "acorn": "bin/acorn" 1828 1857 }, ··· 1928 1957 } 1929 1958 }, 1930 1959 "node_modules/autoprefixer": { 1931 - "version": "10.4.16", 1932 - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", 1933 - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", 1960 + "version": "10.4.19", 1961 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", 1962 + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", 1934 1963 "funding": [ 1935 1964 { 1936 1965 "type": "opencollective", ··· 1946 1975 } 1947 1976 ], 1948 1977 "dependencies": { 1949 - "browserslist": "^4.21.10", 1950 - "caniuse-lite": "^1.0.30001538", 1951 - "fraction.js": "^4.3.6", 1978 + "browserslist": "^4.23.0", 1979 + "caniuse-lite": "^1.0.30001599", 1980 + "fraction.js": "^4.3.7", 1952 1981 "normalize-range": "^0.1.2", 1953 1982 "picocolors": "^1.0.0", 1954 1983 "postcss-value-parser": "^4.2.0" ··· 1964 1993 } 1965 1994 }, 1966 1995 "node_modules/axobject-query": { 1967 - "version": "3.2.1", 1968 - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", 1969 - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", 1996 + "version": "4.0.0", 1997 + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", 1998 + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", 1970 1999 "dependencies": { 1971 2000 "dequal": "^2.0.3" 1972 2001 } ··· 1986 2015 } 1987 2016 }, 1988 2017 "node_modules/binary-extensions": { 1989 - "version": "2.2.0", 1990 - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1991 - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2018 + "version": "2.3.0", 2019 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 2020 + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1992 2021 "engines": { 1993 2022 "node": ">=8" 2023 + }, 2024 + "funding": { 2025 + "url": "https://github.com/sponsors/sindresorhus" 1994 2026 } 1995 2027 }, 1996 2028 "node_modules/brace-expansion": { ··· 2002 2034 } 2003 2035 }, 2004 2036 "node_modules/braces": { 2005 - "version": "3.0.2", 2006 - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2007 - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2037 + "version": "3.0.3", 2038 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 2039 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 2008 2040 "dependencies": { 2009 - "fill-range": "^7.0.1" 2041 + "fill-range": "^7.1.1" 2010 2042 }, 2011 2043 "engines": { 2012 2044 "node": ">=8" 2013 2045 } 2014 2046 }, 2015 2047 "node_modules/browserslist": { 2016 - "version": "4.22.2", 2017 - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", 2018 - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", 2048 + "version": "4.23.1", 2049 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", 2050 + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", 2019 2051 "funding": [ 2020 2052 { 2021 2053 "type": "opencollective", ··· 2031 2063 } 2032 2064 ], 2033 2065 "dependencies": { 2034 - "caniuse-lite": "^1.0.30001565", 2035 - "electron-to-chromium": "^1.4.601", 2066 + "caniuse-lite": "^1.0.30001629", 2067 + "electron-to-chromium": "^1.4.796", 2036 2068 "node-releases": "^2.0.14", 2037 - "update-browserslist-db": "^1.0.13" 2069 + "update-browserslist-db": "^1.0.16" 2038 2070 }, 2039 2071 "bin": { 2040 2072 "browserslist": "cli.js" ··· 2044 2076 } 2045 2077 }, 2046 2078 "node_modules/buffer-crc32": { 2047 - "version": "0.2.13", 2048 - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 2049 - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 2079 + "version": "1.0.0", 2080 + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", 2081 + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", 2050 2082 "dev": true, 2051 2083 "engines": { 2052 - "node": "*" 2084 + "node": ">=8.0.0" 2053 2085 } 2054 2086 }, 2055 2087 "node_modules/callsites": { ··· 2070 2102 } 2071 2103 }, 2072 2104 "node_modules/caniuse-lite": { 2073 - "version": "1.0.30001574", 2074 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz", 2075 - "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==", 2105 + "version": "1.0.30001636", 2106 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", 2107 + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", 2076 2108 "funding": [ 2077 2109 { 2078 2110 "type": "opencollective", ··· 2105 2137 } 2106 2138 }, 2107 2139 "node_modules/chokidar": { 2108 - "version": "3.5.3", 2109 - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2110 - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2111 - "funding": [ 2112 - { 2113 - "type": "individual", 2114 - "url": "https://paulmillr.com/funding/" 2115 - } 2116 - ], 2140 + "version": "3.6.0", 2141 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 2142 + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 2117 2143 "dependencies": { 2118 2144 "anymatch": "~3.1.2", 2119 2145 "braces": "~3.0.2", ··· 2125 2151 }, 2126 2152 "engines": { 2127 2153 "node": ">= 8.10.0" 2154 + }, 2155 + "funding": { 2156 + "url": "https://paulmillr.com/funding/" 2128 2157 }, 2129 2158 "optionalDependencies": { 2130 2159 "fsevents": "~2.3.2" ··· 2249 2278 } 2250 2279 }, 2251 2280 "node_modules/debug": { 2252 - "version": "4.3.4", 2253 - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2254 - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2281 + "version": "4.3.5", 2282 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 2283 + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 2255 2284 "dependencies": { 2256 2285 "ms": "2.1.2" 2257 2286 }, ··· 2296 2325 } 2297 2326 }, 2298 2327 "node_modules/detect-libc": { 2299 - "version": "2.0.2", 2300 - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", 2301 - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", 2328 + "version": "2.0.3", 2329 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 2330 + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 2302 2331 "engines": { 2303 2332 "node": ">=8" 2304 2333 } 2305 2334 }, 2306 2335 "node_modules/devalue": { 2307 - "version": "4.3.2", 2308 - "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", 2309 - "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" 2336 + "version": "5.0.0", 2337 + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz", 2338 + "integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==" 2310 2339 }, 2311 2340 "node_modules/didyoumean": { 2312 2341 "version": "1.2.2", 2313 2342 "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 2314 2343 "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" 2344 + }, 2345 + "node_modules/diet-sprite": { 2346 + "version": "0.0.1", 2347 + "resolved": "https://registry.npmjs.org/diet-sprite/-/diet-sprite-0.0.1.tgz", 2348 + "integrity": "sha512-zSHI2WDAn1wJqJYxcmjWfJv3Iw8oL9reQIbEyx2x2/EZ4/qmUTIo8/5qOCurnAcq61EwtJJaZ0XTy2NRYqpB5A==", 2349 + "dev": true 2315 2350 }, 2316 2351 "node_modules/dir-glob": { 2317 2352 "version": "3.0.1", ··· 2342 2377 "node": ">=6.0.0" 2343 2378 } 2344 2379 }, 2380 + "node_modules/earcut": { 2381 + "version": "2.2.4", 2382 + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", 2383 + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", 2384 + "dev": true 2385 + }, 2345 2386 "node_modules/eastasianwidth": { 2346 2387 "version": "0.2.0", 2347 2388 "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 2348 2389 "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 2349 2390 }, 2350 2391 "node_modules/electron-to-chromium": { 2351 - "version": "1.4.621", 2352 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.621.tgz", 2353 - "integrity": "sha512-MGJM6S0MuF/wTzM9NoItWXN56J1kolrHS/vzl/KlhXAbVkogTy0wzKYliQDJgNypxSCFjxdRhHYS3bffyYUGEw==" 2392 + "version": "1.4.803", 2393 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.803.tgz", 2394 + "integrity": "sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==" 2354 2395 }, 2355 2396 "node_modules/emoji-regex": { 2356 2397 "version": "9.2.2", ··· 2364 2405 "dev": true 2365 2406 }, 2366 2407 "node_modules/esbuild": { 2367 - "version": "0.19.11", 2368 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", 2369 - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", 2408 + "version": "0.21.5", 2409 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 2410 + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 2370 2411 "hasInstallScript": true, 2371 2412 "bin": { 2372 2413 "esbuild": "bin/esbuild" ··· 2375 2416 "node": ">=12" 2376 2417 }, 2377 2418 "optionalDependencies": { 2378 - "@esbuild/aix-ppc64": "0.19.11", 2379 - "@esbuild/android-arm": "0.19.11", 2380 - "@esbuild/android-arm64": "0.19.11", 2381 - "@esbuild/android-x64": "0.19.11", 2382 - "@esbuild/darwin-arm64": "0.19.11", 2383 - "@esbuild/darwin-x64": "0.19.11", 2384 - "@esbuild/freebsd-arm64": "0.19.11", 2385 - "@esbuild/freebsd-x64": "0.19.11", 2386 - "@esbuild/linux-arm": "0.19.11", 2387 - "@esbuild/linux-arm64": "0.19.11", 2388 - "@esbuild/linux-ia32": "0.19.11", 2389 - "@esbuild/linux-loong64": "0.19.11", 2390 - "@esbuild/linux-mips64el": "0.19.11", 2391 - "@esbuild/linux-ppc64": "0.19.11", 2392 - "@esbuild/linux-riscv64": "0.19.11", 2393 - "@esbuild/linux-s390x": "0.19.11", 2394 - "@esbuild/linux-x64": "0.19.11", 2395 - "@esbuild/netbsd-x64": "0.19.11", 2396 - "@esbuild/openbsd-x64": "0.19.11", 2397 - "@esbuild/sunos-x64": "0.19.11", 2398 - "@esbuild/win32-arm64": "0.19.11", 2399 - "@esbuild/win32-ia32": "0.19.11", 2400 - "@esbuild/win32-x64": "0.19.11" 2419 + "@esbuild/aix-ppc64": "0.21.5", 2420 + "@esbuild/android-arm": "0.21.5", 2421 + "@esbuild/android-arm64": "0.21.5", 2422 + "@esbuild/android-x64": "0.21.5", 2423 + "@esbuild/darwin-arm64": "0.21.5", 2424 + "@esbuild/darwin-x64": "0.21.5", 2425 + "@esbuild/freebsd-arm64": "0.21.5", 2426 + "@esbuild/freebsd-x64": "0.21.5", 2427 + "@esbuild/linux-arm": "0.21.5", 2428 + "@esbuild/linux-arm64": "0.21.5", 2429 + "@esbuild/linux-ia32": "0.21.5", 2430 + "@esbuild/linux-loong64": "0.21.5", 2431 + "@esbuild/linux-mips64el": "0.21.5", 2432 + "@esbuild/linux-ppc64": "0.21.5", 2433 + "@esbuild/linux-riscv64": "0.21.5", 2434 + "@esbuild/linux-s390x": "0.21.5", 2435 + "@esbuild/linux-x64": "0.21.5", 2436 + "@esbuild/netbsd-x64": "0.21.5", 2437 + "@esbuild/openbsd-x64": "0.21.5", 2438 + "@esbuild/sunos-x64": "0.21.5", 2439 + "@esbuild/win32-arm64": "0.21.5", 2440 + "@esbuild/win32-ia32": "0.21.5", 2441 + "@esbuild/win32-x64": "0.21.5" 2401 2442 } 2402 2443 }, 2403 2444 "node_modules/escalade": { 2404 - "version": "3.1.1", 2405 - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2406 - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2445 + "version": "3.1.2", 2446 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 2447 + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 2407 2448 "engines": { 2408 2449 "node": ">=6" 2409 2450 } ··· 2421 2462 } 2422 2463 }, 2423 2464 "node_modules/eslint": { 2424 - "version": "8.56.0", 2425 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", 2426 - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", 2465 + "version": "8.57.0", 2466 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", 2467 + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", 2427 2468 "dev": true, 2428 2469 "dependencies": { 2429 2470 "@eslint-community/eslint-utils": "^4.2.0", 2430 2471 "@eslint-community/regexpp": "^4.6.1", 2431 2472 "@eslint/eslintrc": "^2.1.4", 2432 - "@eslint/js": "8.56.0", 2433 - "@humanwhocodes/config-array": "^0.11.13", 2473 + "@eslint/js": "8.57.0", 2474 + "@humanwhocodes/config-array": "^0.11.14", 2434 2475 "@humanwhocodes/module-importer": "^1.0.1", 2435 2476 "@nodelib/fs.walk": "^1.2.8", 2436 2477 "@ungap/structured-clone": "^1.2.0", ··· 2476 2517 } 2477 2518 }, 2478 2519 "node_modules/eslint-compat-utils": { 2479 - "version": "0.1.2", 2480 - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", 2481 - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", 2520 + "version": "0.5.1", 2521 + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", 2522 + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", 2482 2523 "dev": true, 2524 + "dependencies": { 2525 + "semver": "^7.5.4" 2526 + }, 2483 2527 "engines": { 2484 2528 "node": ">=12" 2485 2529 }, ··· 2500 2544 } 2501 2545 }, 2502 2546 "node_modules/eslint-plugin-svelte": { 2503 - "version": "2.35.1", 2504 - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz", 2505 - "integrity": "sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==", 2547 + "version": "2.40.0", 2548 + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.40.0.tgz", 2549 + "integrity": "sha512-JuOzmfVaMeEkBASL7smHu3tIU4D9rWkHuRNV+zm/5zgAwiZVvxrXM7TcfIOS+U7VXOr4uCZuE+kZTVTzS0IE+Q==", 2506 2550 "dev": true, 2507 2551 "dependencies": { 2508 - "@eslint-community/eslint-utils": "^4.2.0", 2509 - "@jridgewell/sourcemap-codec": "^1.4.14", 2510 - "debug": "^4.3.1", 2511 - "eslint-compat-utils": "^0.1.2", 2552 + "@eslint-community/eslint-utils": "^4.4.0", 2553 + "@jridgewell/sourcemap-codec": "^1.4.15", 2554 + "eslint-compat-utils": "^0.5.1", 2512 2555 "esutils": "^2.0.3", 2513 - "known-css-properties": "^0.29.0", 2514 - "postcss": "^8.4.5", 2556 + "known-css-properties": "^0.32.0", 2557 + "postcss": "^8.4.38", 2515 2558 "postcss-load-config": "^3.1.4", 2516 2559 "postcss-safe-parser": "^6.0.0", 2517 - "postcss-selector-parser": "^6.0.11", 2518 - "semver": "^7.5.3", 2519 - "svelte-eslint-parser": ">=0.33.0 <1.0.0" 2560 + "postcss-selector-parser": "^6.1.0", 2561 + "semver": "^7.6.2", 2562 + "svelte-eslint-parser": "^0.39.1" 2520 2563 }, 2521 2564 "engines": { 2522 2565 "node": "^14.17.0 || >=16.0.0" ··· 2525 2568 "url": "https://github.com/sponsors/ota-meshi" 2526 2569 }, 2527 2570 "peerDependencies": { 2528 - "eslint": "^7.0.0 || ^8.0.0-0", 2529 - "svelte": "^3.37.0 || ^4.0.0" 2571 + "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", 2572 + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.155" 2530 2573 }, 2531 2574 "peerDependenciesMeta": { 2532 2575 "svelte": { ··· 2701 2744 "dev": true 2702 2745 }, 2703 2746 "node_modules/fastq": { 2704 - "version": "1.16.0", 2705 - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", 2706 - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 2747 + "version": "1.17.1", 2748 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 2749 + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 2707 2750 "dependencies": { 2708 2751 "reusify": "^1.0.4" 2709 2752 } ··· 2727 2770 } 2728 2771 }, 2729 2772 "node_modules/fill-range": { 2730 - "version": "7.0.1", 2731 - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2732 - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2773 + "version": "7.1.1", 2774 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2775 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2733 2776 "dependencies": { 2734 2777 "to-regex-range": "^5.0.1" 2735 2778 }, ··· 2768 2811 } 2769 2812 }, 2770 2813 "node_modules/flatted": { 2771 - "version": "3.2.9", 2772 - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", 2773 - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", 2814 + "version": "3.3.1", 2815 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 2816 + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 2774 2817 "dev": true 2775 2818 }, 2776 2819 "node_modules/focus-trap": { ··· 2782 2825 } 2783 2826 }, 2784 2827 "node_modules/foreground-child": { 2785 - "version": "3.1.1", 2786 - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 2787 - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 2828 + "version": "3.2.1", 2829 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", 2830 + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", 2788 2831 "dependencies": { 2789 2832 "cross-spawn": "^7.0.0", 2790 2833 "signal-exit": "^4.0.1" ··· 2839 2882 "version": "7.2.3", 2840 2883 "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2841 2884 "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2885 + "deprecated": "Glob versions prior to v9 are no longer supported", 2842 2886 "dev": true, 2843 2887 "dependencies": { 2844 2888 "fs.realpath": "^1.0.0", ··· 2955 2999 } 2956 3000 }, 2957 3001 "node_modules/hasown": { 2958 - "version": "2.0.0", 2959 - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 2960 - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 3002 + "version": "2.0.2", 3003 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 3004 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2961 3005 "dependencies": { 2962 3006 "function-bind": "^1.1.2" 2963 3007 }, ··· 2966 3010 } 2967 3011 }, 2968 3012 "node_modules/ignore": { 2969 - "version": "5.3.0", 2970 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", 2971 - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", 3013 + "version": "5.3.1", 3014 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", 3015 + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", 2972 3016 "dev": true, 2973 3017 "engines": { 2974 3018 "node": ">= 4" ··· 3002 3046 } 3003 3047 }, 3004 3048 "node_modules/import-meta-resolve": { 3005 - "version": "4.0.0", 3006 - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", 3007 - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", 3008 - "dev": true, 3049 + "version": "4.1.0", 3050 + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", 3051 + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", 3009 3052 "funding": { 3010 3053 "type": "github", 3011 3054 "url": "https://github.com/sponsors/wooorm" ··· 3024 3067 "version": "1.0.6", 3025 3068 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 3026 3069 "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 3070 + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 3027 3071 "dev": true, 3028 3072 "dependencies": { 3029 3073 "once": "^1.3.0", ··· 3121 3165 "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 3122 3166 }, 3123 3167 "node_modules/jackspeak": { 3124 - "version": "2.3.6", 3125 - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", 3126 - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", 3168 + "version": "3.4.0", 3169 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", 3170 + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", 3127 3171 "dependencies": { 3128 3172 "@isaacs/cliui": "^8.0.2" 3129 3173 }, ··· 3138 3182 } 3139 3183 }, 3140 3184 "node_modules/jiti": { 3141 - "version": "1.21.0", 3142 - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", 3143 - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", 3185 + "version": "1.21.6", 3186 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", 3187 + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", 3144 3188 "bin": { 3145 3189 "jiti": "bin/jiti.js" 3146 3190 } ··· 3193 3237 } 3194 3238 }, 3195 3239 "node_modules/known-css-properties": { 3196 - "version": "0.29.0", 3197 - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", 3198 - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", 3240 + "version": "0.32.0", 3241 + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.32.0.tgz", 3242 + "integrity": "sha512-PXuex21brpp7qENI143ZL5cWQcMR4IZVeeZv9ew6dg+bZX2xRUu/NzGKudZJY5DO4APiMkNPYIF8VGIdY08Tdw==", 3199 3243 "dev": true 3200 3244 }, 3201 3245 "node_modules/levn": { ··· 3257 3301 "dev": true 3258 3302 }, 3259 3303 "node_modules/lru-cache": { 3260 - "version": "6.0.0", 3261 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 3262 - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 3263 - "dependencies": { 3264 - "yallist": "^4.0.0" 3265 - }, 3304 + "version": "10.2.2", 3305 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", 3306 + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", 3266 3307 "engines": { 3267 - "node": ">=10" 3308 + "node": "14 || >=16.14" 3309 + } 3310 + }, 3311 + "node_modules/maath": { 3312 + "version": "0.10.7", 3313 + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.7.tgz", 3314 + "integrity": "sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg==", 3315 + "dev": true, 3316 + "peerDependencies": { 3317 + "@types/three": ">=0.144.0", 3318 + "three": ">=0.144.0" 3268 3319 } 3269 3320 }, 3270 3321 "node_modules/magic-string": { 3271 - "version": "0.30.5", 3272 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", 3273 - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", 3322 + "version": "0.30.10", 3323 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 3324 + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 3274 3325 "dependencies": { 3275 3326 "@jridgewell/sourcemap-codec": "^1.4.15" 3276 - }, 3277 - "engines": { 3278 - "node": ">=12" 3279 3327 } 3280 3328 }, 3281 3329 "node_modules/mdn-data": { ··· 3298 3346 "dev": true 3299 3347 }, 3300 3348 "node_modules/micromatch": { 3301 - "version": "4.0.5", 3302 - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 3303 - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 3349 + "version": "4.0.7", 3350 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", 3351 + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", 3304 3352 "dependencies": { 3305 - "braces": "^3.0.2", 3353 + "braces": "^3.0.3", 3306 3354 "picomatch": "^2.3.1" 3307 3355 }, 3308 3356 "engines": { ··· 3322 3370 "version": "9.0.3", 3323 3371 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 3324 3372 "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 3373 + "dev": true, 3325 3374 "dependencies": { 3326 3375 "brace-expansion": "^2.0.1" 3327 3376 }, ··· 3342 3391 } 3343 3392 }, 3344 3393 "node_modules/minipass": { 3345 - "version": "7.0.4", 3346 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", 3347 - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", 3394 + "version": "7.1.2", 3395 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 3396 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 3348 3397 "engines": { 3349 3398 "node": ">=16 || 14 >=14.17" 3350 3399 } ··· 3404 3453 } 3405 3454 }, 3406 3455 "node_modules/nanoid": { 3407 - "version": "3.3.7", 3408 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 3409 - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 3456 + "version": "4.0.2", 3457 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", 3458 + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", 3410 3459 "funding": [ 3411 3460 { 3412 3461 "type": "github", ··· 3414 3463 } 3415 3464 ], 3416 3465 "bin": { 3417 - "nanoid": "bin/nanoid.cjs" 3466 + "nanoid": "bin/nanoid.js" 3418 3467 }, 3419 3468 "engines": { 3420 - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 3469 + "node": "^14 || ^16 || >=18" 3421 3470 } 3422 3471 }, 3423 3472 "node_modules/natural-compare": { ··· 3473 3522 } 3474 3523 }, 3475 3524 "node_modules/optionator": { 3476 - "version": "0.9.3", 3477 - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 3478 - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 3525 + "version": "0.9.4", 3526 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 3527 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 3479 3528 "dev": true, 3480 3529 "dependencies": { 3481 - "@aashutoshrathi/word-wrap": "^1.2.3", 3482 3530 "deep-is": "^0.1.3", 3483 3531 "fast-levenshtein": "^2.0.6", 3484 3532 "levn": "^0.4.1", 3485 3533 "prelude-ls": "^1.2.1", 3486 - "type-check": "^0.4.0" 3534 + "type-check": "^0.4.0", 3535 + "word-wrap": "^1.2.5" 3487 3536 }, 3488 3537 "engines": { 3489 3538 "node": ">= 0.8.0" ··· 3563 3612 "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 3564 3613 }, 3565 3614 "node_modules/path-scurry": { 3566 - "version": "1.10.1", 3567 - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", 3568 - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", 3615 + "version": "1.11.1", 3616 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 3617 + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 3569 3618 "dependencies": { 3570 - "lru-cache": "^9.1.1 || ^10.0.0", 3619 + "lru-cache": "^10.2.0", 3571 3620 "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 3572 3621 }, 3573 3622 "engines": { 3574 - "node": ">=16 || 14 >=14.17" 3623 + "node": ">=16 || 14 >=14.18" 3575 3624 }, 3576 3625 "funding": { 3577 3626 "url": "https://github.com/sponsors/isaacs" 3578 - } 3579 - }, 3580 - "node_modules/path-scurry/node_modules/lru-cache": { 3581 - "version": "10.1.0", 3582 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", 3583 - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", 3584 - "engines": { 3585 - "node": "14 || >=16.14" 3586 3627 } 3587 3628 }, 3588 3629 "node_modules/path-type": { ··· 3605 3646 } 3606 3647 }, 3607 3648 "node_modules/picocolors": { 3608 - "version": "1.0.0", 3609 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 3610 - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 3649 + "version": "1.0.1", 3650 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 3651 + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" 3611 3652 }, 3612 3653 "node_modules/picomatch": { 3613 3654 "version": "2.3.1", ··· 3637 3678 } 3638 3679 }, 3639 3680 "node_modules/postcss": { 3640 - "version": "8.4.32", 3641 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", 3642 - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", 3681 + "version": "8.4.38", 3682 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 3683 + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 3643 3684 "funding": [ 3644 3685 { 3645 3686 "type": "opencollective", ··· 3657 3698 "dependencies": { 3658 3699 "nanoid": "^3.3.7", 3659 3700 "picocolors": "^1.0.0", 3660 - "source-map-js": "^1.0.2" 3701 + "source-map-js": "^1.2.0" 3661 3702 }, 3662 3703 "engines": { 3663 3704 "node": "^10 || ^12 || >=14" ··· 3787 3828 } 3788 3829 }, 3789 3830 "node_modules/postcss-selector-parser": { 3790 - "version": "6.0.15", 3791 - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", 3792 - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", 3831 + "version": "6.1.0", 3832 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", 3833 + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", 3793 3834 "dependencies": { 3794 3835 "cssesc": "^3.0.0", 3795 3836 "util-deprecate": "^1.0.2" ··· 3803 3844 "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 3804 3845 "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 3805 3846 }, 3847 + "node_modules/postcss/node_modules/nanoid": { 3848 + "version": "3.3.7", 3849 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 3850 + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 3851 + "funding": [ 3852 + { 3853 + "type": "github", 3854 + "url": "https://github.com/sponsors/ai" 3855 + } 3856 + ], 3857 + "bin": { 3858 + "nanoid": "bin/nanoid.cjs" 3859 + }, 3860 + "engines": { 3861 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 3862 + } 3863 + }, 3806 3864 "node_modules/postprocessing": { 3807 - "version": "6.34.1", 3808 - "resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.34.1.tgz", 3809 - "integrity": "sha512-xae6A2XNs61V3ohGHR+i9sQDvB4dWaoG/AICw0hg8sOYQWAYDlf+esWMRmO4hixMaYo3AJBJ9WAA7JF7OiGakw==", 3865 + "version": "6.35.5", 3866 + "resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.35.5.tgz", 3867 + "integrity": "sha512-nO8pxbiQT7+u3qv/q4LL1x6tstZWuduDlkOLFWQm3vFFKHzAsRMxqwsGAktkHKMSGXVEwTBvT3TKPklNALQheg==", 3810 3868 "engines": { 3811 3869 "node": ">= 0.13.2" 3812 3870 }, 3813 3871 "peerDependencies": { 3814 - "three": ">= 0.138.0 < 0.161.0" 3872 + "three": ">= 0.152.0 < 0.166.0" 3815 3873 } 3816 3874 }, 3817 3875 "node_modules/prelude-ls": { ··· 3824 3882 } 3825 3883 }, 3826 3884 "node_modules/prettier": { 3827 - "version": "3.1.1", 3828 - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", 3829 - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", 3885 + "version": "3.3.2", 3886 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", 3887 + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", 3830 3888 "dev": true, 3831 3889 "bin": { 3832 3890 "prettier": "bin/prettier.cjs" ··· 3839 3897 } 3840 3898 }, 3841 3899 "node_modules/prettier-plugin-svelte": { 3842 - "version": "3.1.2", 3843 - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.1.2.tgz", 3844 - "integrity": "sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==", 3900 + "version": "3.2.4", 3901 + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.4.tgz", 3902 + "integrity": "sha512-tZv+ADfeOWFNQkXkRh6zUXE16w3Vla8x2Ug0B/EnSmjR4EnwdwZbGgL/liSwR1kcEALU5mAAyua98HBxheCxgg==", 3845 3903 "dev": true, 3846 3904 "peerDependencies": { 3847 3905 "prettier": "^3.0.0", ··· 3942 4000 "version": "3.0.2", 3943 4001 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3944 4002 "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 4003 + "deprecated": "Rimraf versions prior to v4 are no longer supported", 3945 4004 "dev": true, 3946 4005 "dependencies": { 3947 4006 "glob": "^7.1.3" ··· 3954 4013 } 3955 4014 }, 3956 4015 "node_modules/rollup": { 3957 - "version": "4.9.2", 3958 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.2.tgz", 3959 - "integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==", 4016 + "version": "4.18.0", 4017 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", 4018 + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", 4019 + "dependencies": { 4020 + "@types/estree": "1.0.5" 4021 + }, 3960 4022 "bin": { 3961 4023 "rollup": "dist/bin/rollup" 3962 4024 }, ··· 3965 4027 "npm": ">=8.0.0" 3966 4028 }, 3967 4029 "optionalDependencies": { 3968 - "@rollup/rollup-android-arm-eabi": "4.9.2", 3969 - "@rollup/rollup-android-arm64": "4.9.2", 3970 - "@rollup/rollup-darwin-arm64": "4.9.2", 3971 - "@rollup/rollup-darwin-x64": "4.9.2", 3972 - "@rollup/rollup-linux-arm-gnueabihf": "4.9.2", 3973 - "@rollup/rollup-linux-arm64-gnu": "4.9.2", 3974 - "@rollup/rollup-linux-arm64-musl": "4.9.2", 3975 - "@rollup/rollup-linux-riscv64-gnu": "4.9.2", 3976 - "@rollup/rollup-linux-x64-gnu": "4.9.2", 3977 - "@rollup/rollup-linux-x64-musl": "4.9.2", 3978 - "@rollup/rollup-win32-arm64-msvc": "4.9.2", 3979 - "@rollup/rollup-win32-ia32-msvc": "4.9.2", 3980 - "@rollup/rollup-win32-x64-msvc": "4.9.2", 4030 + "@rollup/rollup-android-arm-eabi": "4.18.0", 4031 + "@rollup/rollup-android-arm64": "4.18.0", 4032 + "@rollup/rollup-darwin-arm64": "4.18.0", 4033 + "@rollup/rollup-darwin-x64": "4.18.0", 4034 + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", 4035 + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", 4036 + "@rollup/rollup-linux-arm64-gnu": "4.18.0", 4037 + "@rollup/rollup-linux-arm64-musl": "4.18.0", 4038 + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", 4039 + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", 4040 + "@rollup/rollup-linux-s390x-gnu": "4.18.0", 4041 + "@rollup/rollup-linux-x64-gnu": "4.18.0", 4042 + "@rollup/rollup-linux-x64-musl": "4.18.0", 4043 + "@rollup/rollup-win32-arm64-msvc": "4.18.0", 4044 + "@rollup/rollup-win32-ia32-msvc": "4.18.0", 4045 + "@rollup/rollup-win32-x64-msvc": "4.18.0", 3981 4046 "fsevents": "~2.3.2" 3982 4047 } 3983 4048 }, ··· 4030 4095 "version": "2.7.1", 4031 4096 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 4032 4097 "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 4098 + "deprecated": "Rimraf versions prior to v4 are no longer supported", 4033 4099 "dev": true, 4034 4100 "dependencies": { 4035 4101 "glob": "^7.1.3" ··· 4039 4105 } 4040 4106 }, 4041 4107 "node_modules/semver": { 4042 - "version": "7.5.4", 4043 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 4044 - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 4045 - "dependencies": { 4046 - "lru-cache": "^6.0.0" 4047 - }, 4108 + "version": "7.6.2", 4109 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", 4110 + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", 4048 4111 "bin": { 4049 4112 "semver": "bin/semver.js" 4050 4113 }, ··· 4058 4121 "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" 4059 4122 }, 4060 4123 "node_modules/sharp": { 4061 - "version": "0.33.1", 4062 - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", 4063 - "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", 4124 + "version": "0.33.4", 4125 + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", 4126 + "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", 4064 4127 "hasInstallScript": true, 4065 4128 "dependencies": { 4066 4129 "color": "^4.2.3", 4067 - "detect-libc": "^2.0.2", 4068 - "semver": "^7.5.4" 4130 + "detect-libc": "^2.0.3", 4131 + "semver": "^7.6.0" 4069 4132 }, 4070 4133 "engines": { 4071 - "libvips": ">=8.15.0", 4134 + "libvips": ">=8.15.2", 4072 4135 "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 4073 4136 }, 4074 4137 "funding": { 4075 4138 "url": "https://opencollective.com/libvips" 4076 4139 }, 4077 4140 "optionalDependencies": { 4078 - "@img/sharp-darwin-arm64": "0.33.1", 4079 - "@img/sharp-darwin-x64": "0.33.1", 4080 - "@img/sharp-libvips-darwin-arm64": "1.0.0", 4081 - "@img/sharp-libvips-darwin-x64": "1.0.0", 4082 - "@img/sharp-libvips-linux-arm": "1.0.0", 4083 - "@img/sharp-libvips-linux-arm64": "1.0.0", 4084 - "@img/sharp-libvips-linux-s390x": "1.0.0", 4085 - "@img/sharp-libvips-linux-x64": "1.0.0", 4086 - "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", 4087 - "@img/sharp-libvips-linuxmusl-x64": "1.0.0", 4088 - "@img/sharp-linux-arm": "0.33.1", 4089 - "@img/sharp-linux-arm64": "0.33.1", 4090 - "@img/sharp-linux-s390x": "0.33.1", 4091 - "@img/sharp-linux-x64": "0.33.1", 4092 - "@img/sharp-linuxmusl-arm64": "0.33.1", 4093 - "@img/sharp-linuxmusl-x64": "0.33.1", 4094 - "@img/sharp-wasm32": "0.33.1", 4095 - "@img/sharp-win32-ia32": "0.33.1", 4096 - "@img/sharp-win32-x64": "0.33.1" 4141 + "@img/sharp-darwin-arm64": "0.33.4", 4142 + "@img/sharp-darwin-x64": "0.33.4", 4143 + "@img/sharp-libvips-darwin-arm64": "1.0.2", 4144 + "@img/sharp-libvips-darwin-x64": "1.0.2", 4145 + "@img/sharp-libvips-linux-arm": "1.0.2", 4146 + "@img/sharp-libvips-linux-arm64": "1.0.2", 4147 + "@img/sharp-libvips-linux-s390x": "1.0.2", 4148 + "@img/sharp-libvips-linux-x64": "1.0.2", 4149 + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", 4150 + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", 4151 + "@img/sharp-linux-arm": "0.33.4", 4152 + "@img/sharp-linux-arm64": "0.33.4", 4153 + "@img/sharp-linux-s390x": "0.33.4", 4154 + "@img/sharp-linux-x64": "0.33.4", 4155 + "@img/sharp-linuxmusl-arm64": "0.33.4", 4156 + "@img/sharp-linuxmusl-x64": "0.33.4", 4157 + "@img/sharp-wasm32": "0.33.4", 4158 + "@img/sharp-win32-ia32": "0.33.4", 4159 + "@img/sharp-win32-x64": "0.33.4" 4097 4160 } 4098 4161 }, 4099 4162 "node_modules/shebang-command": { ··· 4162 4225 } 4163 4226 }, 4164 4227 "node_modules/sorcery": { 4165 - "version": "0.11.0", 4166 - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", 4167 - "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", 4228 + "version": "0.11.1", 4229 + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.1.tgz", 4230 + "integrity": "sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==", 4168 4231 "dev": true, 4169 4232 "dependencies": { 4170 4233 "@jridgewell/sourcemap-codec": "^1.4.14", 4171 - "buffer-crc32": "^0.2.5", 4234 + "buffer-crc32": "^1.0.0", 4172 4235 "minimist": "^1.2.0", 4173 4236 "sander": "^0.5.0" 4174 4237 }, ··· 4177 4240 } 4178 4241 }, 4179 4242 "node_modules/source-map-js": { 4180 - "version": "1.0.2", 4181 - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 4182 - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 4243 + "version": "1.2.0", 4244 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 4245 + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 4183 4246 "engines": { 4184 4247 "node": ">=0.10.0" 4185 4248 } ··· 4313 4376 } 4314 4377 }, 4315 4378 "node_modules/sucrase/node_modules/glob": { 4316 - "version": "10.3.10", 4317 - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", 4318 - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", 4379 + "version": "10.4.1", 4380 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", 4381 + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", 4319 4382 "dependencies": { 4320 4383 "foreground-child": "^3.1.0", 4321 - "jackspeak": "^2.3.5", 4322 - "minimatch": "^9.0.1", 4323 - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", 4324 - "path-scurry": "^1.10.1" 4384 + "jackspeak": "^3.1.2", 4385 + "minimatch": "^9.0.4", 4386 + "minipass": "^7.1.2", 4387 + "path-scurry": "^1.11.1" 4325 4388 }, 4326 4389 "bin": { 4327 4390 "glob": "dist/esm/bin.mjs" 4391 + }, 4392 + "engines": { 4393 + "node": ">=16 || 14 >=14.18" 4394 + }, 4395 + "funding": { 4396 + "url": "https://github.com/sponsors/isaacs" 4397 + } 4398 + }, 4399 + "node_modules/sucrase/node_modules/minimatch": { 4400 + "version": "9.0.4", 4401 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", 4402 + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", 4403 + "dependencies": { 4404 + "brace-expansion": "^2.0.1" 4328 4405 }, 4329 4406 "engines": { 4330 4407 "node": ">=16 || 14 >=14.17" ··· 4357 4434 } 4358 4435 }, 4359 4436 "node_modules/svelte": { 4360 - "version": "4.2.8", 4361 - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.8.tgz", 4362 - "integrity": "sha512-hU6dh1MPl8gh6klQZwK/n73GiAHiR95IkFsesLPbMeEZi36ydaXL/ZAb4g9sayT0MXzpxyZjR28yderJHxcmYA==", 4437 + "version": "4.2.18", 4438 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.18.tgz", 4439 + "integrity": "sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==", 4363 4440 "dependencies": { 4364 4441 "@ampproject/remapping": "^2.2.1", 4365 4442 "@jridgewell/sourcemap-codec": "^1.4.15", 4366 4443 "@jridgewell/trace-mapping": "^0.3.18", 4444 + "@types/estree": "^1.0.1", 4367 4445 "acorn": "^8.9.0", 4368 4446 "aria-query": "^5.3.0", 4369 - "axobject-query": "^3.2.1", 4447 + "axobject-query": "^4.0.0", 4370 4448 "code-red": "^1.0.3", 4371 4449 "css-tree": "^2.3.1", 4372 4450 "estree-walker": "^3.0.3", ··· 4380 4458 } 4381 4459 }, 4382 4460 "node_modules/svelte-check": { 4383 - "version": "3.6.2", 4384 - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.2.tgz", 4385 - "integrity": "sha512-E6iFh4aUCGJLRz6QZXH3gcN/VFfkzwtruWSRmlKrLWQTiO6VzLsivR6q02WYLGNAGecV3EocqZuCDrC2uttZ0g==", 4461 + "version": "3.8.1", 4462 + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.8.1.tgz", 4463 + "integrity": "sha512-KlQ0TRVe01mdvh49Ylkr9FQxO/UWbQOtaIrccl3gjgkvby1TxY41VkT7ijCl6i29FjaJPE4m6YGmhdqov0MfkA==", 4386 4464 "dev": true, 4387 4465 "dependencies": { 4388 4466 "@jridgewell/trace-mapping": "^0.3.17", ··· 4391 4469 "import-fresh": "^3.2.1", 4392 4470 "picocolors": "^1.0.0", 4393 4471 "sade": "^1.7.4", 4394 - "svelte-preprocess": "^5.1.0", 4472 + "svelte-preprocess": "^5.1.3", 4395 4473 "typescript": "^5.0.3" 4396 4474 }, 4397 4475 "bin": { ··· 4402 4480 } 4403 4481 }, 4404 4482 "node_modules/svelte-eslint-parser": { 4405 - "version": "0.33.1", 4406 - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", 4407 - "integrity": "sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==", 4483 + "version": "0.39.1", 4484 + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.39.1.tgz", 4485 + "integrity": "sha512-0VR9gq2TOdSrJW94Qf2F3XrzXRQomXQtRZGFS3FEUr3G4J8DcpqXfBF1HJyOa3dACyGsKiBbOPF56pBgYaqXBA==", 4408 4486 "dev": true, 4409 4487 "dependencies": { 4410 - "eslint-scope": "^7.0.0", 4411 - "eslint-visitor-keys": "^3.0.0", 4412 - "espree": "^9.0.0", 4413 - "postcss": "^8.4.29", 4414 - "postcss-scss": "^4.0.8" 4488 + "eslint-scope": "^7.2.2", 4489 + "eslint-visitor-keys": "^3.4.3", 4490 + "espree": "^9.6.1", 4491 + "postcss": "^8.4.38", 4492 + "postcss-scss": "^4.0.9" 4415 4493 }, 4416 4494 "engines": { 4417 4495 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ··· 4420 4498 "url": "https://github.com/sponsors/ota-meshi" 4421 4499 }, 4422 4500 "peerDependencies": { 4423 - "svelte": "^3.37.0 || ^4.0.0" 4501 + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.115" 4424 4502 }, 4425 4503 "peerDependenciesMeta": { 4426 4504 "svelte": { ··· 4429 4507 } 4430 4508 }, 4431 4509 "node_modules/svelte-hmr": { 4432 - "version": "0.15.3", 4433 - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", 4434 - "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", 4510 + "version": "0.16.0", 4511 + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", 4512 + "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", 4435 4513 "engines": { 4436 4514 "node": "^12.20 || ^14.13.1 || >= 16" 4437 4515 }, ··· 4440 4518 } 4441 4519 }, 4442 4520 "node_modules/svelte-preprocess": { 4443 - "version": "5.1.3", 4444 - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.3.tgz", 4445 - "integrity": "sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==", 4521 + "version": "5.1.4", 4522 + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.4.tgz", 4523 + "integrity": "sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==", 4446 4524 "dev": true, 4447 4525 "hasInstallScript": true, 4448 4526 "dependencies": { ··· 4453 4531 "strip-indent": "^3.0.0" 4454 4532 }, 4455 4533 "engines": { 4456 - "node": ">= 16.0.0", 4457 - "pnpm": "^8.0.0" 4534 + "node": ">= 16.0.0" 4458 4535 }, 4459 4536 "peerDependencies": { 4460 4537 "@babel/core": "^7.10.2", ··· 4508 4585 "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" 4509 4586 }, 4510 4587 "node_modules/tailwindcss": { 4511 - "version": "3.4.0", 4512 - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", 4513 - "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", 4588 + "version": "3.4.4", 4589 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", 4590 + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", 4514 4591 "dependencies": { 4515 4592 "@alloc/quick-lru": "^5.2.0", 4516 4593 "arg": "^5.0.2", ··· 4520 4597 "fast-glob": "^3.3.0", 4521 4598 "glob-parent": "^6.0.2", 4522 4599 "is-glob": "^4.0.3", 4523 - "jiti": "^1.19.1", 4600 + "jiti": "^1.21.0", 4524 4601 "lilconfig": "^2.1.0", 4525 4602 "micromatch": "^4.0.5", 4526 4603 "normalize-path": "^3.0.0", ··· 4578 4655 } 4579 4656 }, 4580 4657 "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": { 4581 - "version": "3.0.0", 4582 - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", 4583 - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", 4658 + "version": "3.1.2", 4659 + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", 4660 + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", 4584 4661 "engines": { 4585 4662 "node": ">=14" 4663 + }, 4664 + "funding": { 4665 + "url": "https://github.com/sponsors/antonk52" 4586 4666 } 4587 4667 }, 4588 4668 "node_modules/tailwindcss/node_modules/yaml": { 4589 - "version": "2.3.4", 4590 - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", 4591 - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", 4669 + "version": "2.4.5", 4670 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", 4671 + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", 4672 + "bin": { 4673 + "yaml": "bin.mjs" 4674 + }, 4592 4675 "engines": { 4593 4676 "node": ">= 14" 4594 4677 } ··· 4623 4706 "resolved": "https://registry.npmjs.org/three/-/three-0.159.0.tgz", 4624 4707 "integrity": "sha512-eCmhlLGbBgucuo4VEA9IO3Qpc7dh8Bd4VKzr7WfW4+8hMcIfoAVi1ev0pJYN9PTTsCslbcKgBwr2wNZ1EvLInA==" 4625 4708 }, 4709 + "node_modules/three-instanced-uniforms-mesh": { 4710 + "version": "0.49.1", 4711 + "resolved": "https://registry.npmjs.org/three-instanced-uniforms-mesh/-/three-instanced-uniforms-mesh-0.49.1.tgz", 4712 + "integrity": "sha512-qPgPLA6JR2nQau2zAODwiVRknYndXNE6aYmTe5zESiwg9hO8AaNq1xC0hWDYOyyH+NbN2G8278NxX1hpZ+2ZgQ==", 4713 + "dev": true, 4714 + "dependencies": { 4715 + "troika-three-utils": "^0.49.0" 4716 + }, 4717 + "peerDependencies": { 4718 + "three": ">=0.125.0" 4719 + } 4720 + }, 4721 + "node_modules/three-mesh-bvh": { 4722 + "version": "0.7.5", 4723 + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.5.tgz", 4724 + "integrity": "sha512-WDd77RklE52pZSKZx8sDXzrd2JCF/gL/hugFvsIBylpMRlJxxwesKn2rW7TcQZ809NocDVkQx1UJo9pJtVAPYg==", 4725 + "dev": true, 4726 + "peerDependencies": { 4727 + "three": ">= 0.151.0" 4728 + } 4729 + }, 4730 + "node_modules/three-perf": { 4731 + "version": "1.0.10", 4732 + "resolved": "https://registry.npmjs.org/three-perf/-/three-perf-1.0.10.tgz", 4733 + "integrity": "sha512-lCur/i8U6m0ysWYhQ1yFGWOZB0QA2oVsDsfynYd65HhXxLxJfiAt8OsXmpv9PnTLacfaZclBcZHUOB9QKk3eaw==", 4734 + "dev": true, 4735 + "dependencies": { 4736 + "troika-three-text": "^0.47.2", 4737 + "tweakpane": "^3.1.10" 4738 + }, 4739 + "peerDependencies": { 4740 + "three": ">=0.151" 4741 + } 4742 + }, 4743 + "node_modules/three-perf/node_modules/troika-three-text": { 4744 + "version": "0.47.2", 4745 + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.47.2.tgz", 4746 + "integrity": "sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==", 4747 + "dev": true, 4748 + "dependencies": { 4749 + "bidi-js": "^1.0.2", 4750 + "troika-three-utils": "^0.47.2", 4751 + "troika-worker-utils": "^0.47.2", 4752 + "webgl-sdf-generator": "1.1.1" 4753 + }, 4754 + "peerDependencies": { 4755 + "three": ">=0.125.0" 4756 + } 4757 + }, 4758 + "node_modules/three-perf/node_modules/troika-three-utils": { 4759 + "version": "0.47.2", 4760 + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.47.2.tgz", 4761 + "integrity": "sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==", 4762 + "dev": true, 4763 + "peerDependencies": { 4764 + "three": ">=0.125.0" 4765 + } 4766 + }, 4767 + "node_modules/three-perf/node_modules/troika-worker-utils": { 4768 + "version": "0.47.2", 4769 + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz", 4770 + "integrity": "sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==", 4771 + "dev": true 4772 + }, 4626 4773 "node_modules/tiny-glob": { 4627 4774 "version": "0.2.9", 4628 4775 "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", ··· 4652 4799 } 4653 4800 }, 4654 4801 "node_modules/troika-three-text": { 4655 - "version": "0.49.0", 4656 - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.0.tgz", 4657 - "integrity": "sha512-sn9BNC6eIX8OO3iAkPwjecJ7Pn21Ve8P1UNFMNeQzXx759rrqS4i4pSZs7FLMYdWyCKVXBFGimBySFwRKLjq/Q==", 4802 + "version": "0.49.1", 4803 + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", 4804 + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", 4658 4805 "dev": true, 4659 4806 "dependencies": { 4660 4807 "bidi-js": "^1.0.2", ··· 4682 4829 "dev": true 4683 4830 }, 4684 4831 "node_modules/ts-api-utils": { 4685 - "version": "1.0.3", 4686 - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", 4687 - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", 4832 + "version": "1.3.0", 4833 + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", 4834 + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", 4688 4835 "dev": true, 4689 4836 "engines": { 4690 - "node": ">=16.13.0" 4837 + "node": ">=16" 4691 4838 }, 4692 4839 "peerDependencies": { 4693 4840 "typescript": ">=4.2.0" ··· 4699 4846 "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" 4700 4847 }, 4701 4848 "node_modules/tslib": { 4702 - "version": "2.6.2", 4703 - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 4704 - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 4849 + "version": "2.6.3", 4850 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 4851 + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" 4852 + }, 4853 + "node_modules/tweakpane": { 4854 + "version": "3.1.10", 4855 + "resolved": "https://registry.npmjs.org/tweakpane/-/tweakpane-3.1.10.tgz", 4856 + "integrity": "sha512-rqwnl/pUa7+inhI2E9ayGTqqP0EPOOn/wVvSWjZsRbZUItzNShny7pzwL3hVlaN4m9t/aZhsP0aFQ9U5VVR2VQ==", 4857 + "dev": true, 4858 + "funding": { 4859 + "url": "https://github.com/sponsors/cocopon" 4860 + } 4705 4861 }, 4706 4862 "node_modules/type-check": { 4707 4863 "version": "0.4.0", ··· 4728 4884 } 4729 4885 }, 4730 4886 "node_modules/typescript": { 4731 - "version": "5.3.3", 4732 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", 4733 - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", 4887 + "version": "5.4.5", 4888 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", 4889 + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", 4734 4890 "dev": true, 4735 4891 "bin": { 4736 4892 "tsc": "bin/tsc", ··· 4741 4897 } 4742 4898 }, 4743 4899 "node_modules/update-browserslist-db": { 4744 - "version": "1.0.13", 4745 - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", 4746 - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", 4900 + "version": "1.0.16", 4901 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", 4902 + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", 4747 4903 "funding": [ 4748 4904 { 4749 4905 "type": "opencollective", ··· 4759 4915 } 4760 4916 ], 4761 4917 "dependencies": { 4762 - "escalade": "^3.1.1", 4763 - "picocolors": "^1.0.0" 4918 + "escalade": "^3.1.2", 4919 + "picocolors": "^1.0.1" 4764 4920 }, 4765 4921 "bin": { 4766 4922 "update-browserslist-db": "cli.js" ··· 4784 4940 "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 4785 4941 }, 4786 4942 "node_modules/vite": { 4787 - "version": "5.0.10", 4788 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.10.tgz", 4789 - "integrity": "sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==", 4943 + "version": "5.3.1", 4944 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", 4945 + "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", 4790 4946 "dependencies": { 4791 - "esbuild": "^0.19.3", 4792 - "postcss": "^8.4.32", 4793 - "rollup": "^4.2.0" 4947 + "esbuild": "^0.21.3", 4948 + "postcss": "^8.4.38", 4949 + "rollup": "^4.13.0" 4794 4950 }, 4795 4951 "bin": { 4796 4952 "vite": "bin/vite.js" ··· 4880 5036 }, 4881 5037 "engines": { 4882 5038 "node": ">= 8" 5039 + } 5040 + }, 5041 + "node_modules/word-wrap": { 5042 + "version": "1.2.5", 5043 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 5044 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 5045 + "dev": true, 5046 + "engines": { 5047 + "node": ">=0.10.0" 4883 5048 } 4884 5049 }, 4885 5050 "node_modules/wrap-ansi": { ··· 4974 5139 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4975 5140 "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 4976 5141 "dev": true 4977 - }, 4978 - "node_modules/yallist": { 4979 - "version": "4.0.0", 4980 - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 4981 - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 4982 5142 }, 4983 5143 "node_modules/yaml": { 4984 5144 "version": "1.10.2",
static/nature/BirchTree_1.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_2.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_3.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_4.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_5.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Dead_Snow_1.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Dead_Snow_2.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Dead_Snow_3.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Dead_Snow_4.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Dead_Snow_5.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Snow_1.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Snow_2.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Snow_3.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Snow_4.glb

This is a binary file and will not be displayed.

static/nature/BirchTree_Snow_5.glb

This is a binary file and will not be displayed.

static/nature/Bush_Berries_1.glb

This is a binary file and will not be displayed.

static/nature/Bush_Berries_2.glb

This is a binary file and will not be displayed.

static/nature/Bush_Snow_1.glb

This is a binary file and will not be displayed.

static/nature/Bush_Snow_2.glb

This is a binary file and will not be displayed.

static/nature/Cactus_1.glb

This is a binary file and will not be displayed.

static/nature/Cactus_2.glb

This is a binary file and will not be displayed.

static/nature/Cactus_3.glb

This is a binary file and will not be displayed.

static/nature/Cactus_4.glb

This is a binary file and will not be displayed.

static/nature/Cactus_5.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_1.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_2.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_3.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_4.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_5.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Dead_Snow_1.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Dead_Snow_2.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Dead_Snow_3.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Dead_Snow_4.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Dead_Snow_5.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Snow_1.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Snow_2.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Snow_3.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Snow_4.glb

This is a binary file and will not be displayed.

static/nature/CommonTree_Snow_5.glb

This is a binary file and will not be displayed.

static/nature/PalmTree_1.glb

This is a binary file and will not be displayed.

static/nature/PalmTree_2.glb

This is a binary file and will not be displayed.

static/nature/PalmTree_3.glb

This is a binary file and will not be displayed.

static/nature/PalmTree_4.glb

This is a binary file and will not be displayed.

-4
src/lib/3D/PlanetModel.svelte
··· 47 47 material.flatShading={true} 48 48 /> 49 49 </T.Mesh> 50 - <T.Mesh> 51 - <T.SphereGeometry args={[1.3, 32, 32]} /> 52 - <FakeGlowMaterial glowColor={'#075985'} falloff={1.0} glowInternalRadius={1.0} /> 53 - </T.Mesh> 54 50 {:catch error} 55 51 <slot name="error" {error} /> 56 52 {/await}
+40 -31
src/lib/3D/Scene.svelte
··· 3 3 import { interactivity, useCursor } from '@threlte/extras'; 4 4 import { Color } from 'three'; 5 5 import { onMount } from 'svelte'; 6 - import { spring } from 'svelte/motion'; 6 + import { spring } from './Utils'; 7 + import { Text3DGeometry } from '@threlte/extras' 7 8 8 9 import Stars from './Stars.svelte'; 9 - import PlanetModel from './PlanetModel.svelte'; 10 10 import Nebula from './Nebula.svelte'; 11 + // import Planet from './planet/Planet.svelte'; 12 + import PlanetModel from './PlanetModel.svelte'; 11 13 12 - const { onPointerEnter, onPointerLeave } = useCursor() 14 + const { onPointerEnter, onPointerLeave } = useCursor(); 13 15 interactivity(); 14 16 15 - let rotate = spring( 16 - 0, 17 - { 18 - stiffness: 0.1, 19 - damping: 0.05 20 - } 21 - ); 22 - let size = spring( 23 - 2, 24 - { 25 - stiffness: 0.1, 26 - damping: 0.5 27 - } 28 - ); 17 + let rotate = 0; 18 + let rotateSpring = spring<number>(rotate, 0.1, 0.05); 19 + let size = 2; 20 + let sizeSpring = spring<number>(size, 0.1, 0.5); 29 21 30 22 let distance = 1; 31 23 ··· 33 25 useTask((delta) => { 34 26 // rotation += delta * rotationSpeed; 35 27 36 - rotate.set($rotate + delta * rotationSpeed); 28 + rotate = rotateSpring.update(delta); 29 + size = sizeSpring.update(delta); 30 + 31 + rotateSpring.set(rotate + delta * rotationSpeed); 37 32 38 33 if (window.innerWidth < 768) { 39 34 distance = 6; ··· 63 58 64 59 <T.DirectionalLight intensity={3} position={[-pos * 10 + 5, 2 + pos * 3, 2]} /> 65 60 66 - <T.AmbientLight intensity={0.0} /> 67 - 68 61 <PlanetModel 69 62 on:click={() => { 70 - rotate.set($rotate + 2); 63 + rotateSpring.set(rotate + 2); 71 64 }} 72 65 on:pointerleave={() => { 73 - size.set(2) 74 - onPointerLeave() 66 + sizeSpring.set(2); 67 + onPointerLeave(); 75 68 }} 76 69 on:pointerenter={() => { 77 - size.set(2.2) 78 - onPointerEnter()} 79 - } 80 - 81 - scale={$size} 82 - rotation.y={$rotate} 70 + sizeSpring.set(2.2); 71 + onPointerEnter(); 72 + }} 73 + scale={size} 74 + rotation.y={rotate} 83 75 rotation.z={0.1} 84 76 position.x={pos * 4 - 2} 85 77 position.z={-distance} 86 78 position.y={0.5} 87 79 /> 88 80 89 - <!-- this breaks scene background color :/ --> 90 - <!-- <Environment files="env.jpg" isBackground={false} /> --> 81 + <!-- <Planet 82 + on:click={() => { 83 + rotateSpring.set(rotate + 2); 84 + }} 85 + on:pointerleave={() => { 86 + sizeSpring.set(2); 87 + onPointerLeave(); 88 + }} 89 + on:pointerenter={() => { 90 + sizeSpring.set(2.2); 91 + onPointerEnter(); 92 + }} 93 + scale={size} 94 + rotation.y={rotate} 95 + rotation.z={0.1} 96 + position.x={pos * 4 - 2} 97 + position.z={-distance} 98 + position.y={0.5} 99 + ></Planet> --> 91 100 92 101 <Stars /> 93 102
+218
src/lib/3D/Utils.ts
··· 1 + /** 2 + * Returns a function that can be used to execute a child function every given number of seconds. 3 + * @param interval - The interval in seconds. 4 + * @param [randomMax]- The interval will be random, using this value as the upper bound and the interval param as the lower bound. 5 + * @example 6 + * 7 + * const everyFiveSeconds = interval(5) 8 + * 9 + * useTask((delta) => { 10 + * everyFiveSeconds(delta, () => { 11 + * // called every five seconds 12 + * }) 13 + * } 14 + */ 15 + export const interval = (interval: number, randomMax?: number) => { 16 + let clock = 0; 17 + let intervalCounter = 18 + randomMax && randomMax > interval 19 + ? Math.random() * (randomMax - interval) + interval 20 + : interval; 21 + let seconds = 0; 22 + return function (delta: number, fn: () => void) { 23 + clock += delta; 24 + if (clock > intervalCounter) { 25 + seconds = 0; 26 + intervalCounter += 27 + randomMax && randomMax > interval 28 + ? Math.random() * (randomMax - interval) + interval 29 + : interval; 30 + fn(); 31 + } 32 + seconds += delta; 33 + return seconds; 34 + }; 35 + }; 36 + 37 + /** 38 + * Similar behvour to Svelte's spring funtion but can be linked to Threlte's useTask. 39 + * An example of stiffness and damping values in action here: https://svelte.dev/examples/spring 40 + * @param [currentValue=0] - The starting value. 41 + * @param [stiffness=0.15] - Optional custom stiffness value 42 + * @param [damping=0.8] - Optional custom damping value 43 + * @param [damping=0.01] - Optional precision value value 44 + * @example 45 + * 46 + * // create spring 47 + * let sprungValue = 0 48 + * let newSpring = spring(sprungValue, 0.15, 0.8) 49 + * 50 + * // set new value to spring towards 51 + * newSpring.set(10) 52 + * 53 + * useTask((delta) => { 54 + * // update value every frame 55 + * sprungValue = newSpring.update(delta); 56 + * } 57 + */ 58 + export const spring = <T extends Record<string, number> | number>( 59 + currentValue: T, 60 + stiffness = 0.15, 61 + damping = 0.8, 62 + precision = 0.001 63 + ) => { 64 + let endValue = currentValue; 65 + let velocity = 0; 66 + let settled = false; 67 + const velocityArray: number[] = []; 68 + const settledArray: boolean[] = []; 69 + if (typeof currentValue === 'object' && currentValue) { 70 + Object.entries(currentValue).forEach(() => { 71 + velocityArray.push(0); 72 + settledArray.push(false); 73 + }); 74 + } 75 + 76 + const set = (value: T) => { 77 + endValue = value; 78 + settled = false; 79 + settledArray.forEach(function (part, index, theArray) { 80 + theArray[index] = false; 81 + }); 82 + }; 83 + const update = (delta: number) => { 84 + if (typeof currentValue === 'number' && typeof endValue === 'number') { 85 + if (settled) return currentValue; 86 + const { cv, s, v } = springTick( 87 + stiffness, 88 + damping, 89 + currentValue, 90 + endValue, 91 + delta, 92 + velocity, 93 + precision 94 + ); 95 + settled = s; 96 + velocity = v; 97 + currentValue = cv as T & number; 98 + } else if (typeof currentValue === 'object') { 99 + let s = true; 100 + settledArray.forEach((settled) => { 101 + if (!settled) s = false; 102 + }); 103 + if (s) return currentValue; 104 + let i = 0; 105 + Object.entries(currentValue).forEach(([key, value]) => { 106 + if (typeof endValue === 'number' || typeof currentValue === 'number') return; 107 + const { cv, s, v } = springTick( 108 + stiffness, 109 + damping, 110 + value, 111 + endValue[key], 112 + delta, 113 + velocityArray[i], 114 + precision 115 + ); 116 + settledArray[i] = s; 117 + velocityArray[i] = v; 118 + currentValue[key] = cv; 119 + i++; 120 + }); 121 + } 122 + return currentValue; 123 + }; 124 + return { set, update }; 125 + }; 126 + 127 + function springTick( 128 + stiffness: number, 129 + damping: number, 130 + currentValue: number, 131 + endValue: number, 132 + delta: number, 133 + velocity: number, 134 + precision: number 135 + ) { 136 + let settled = false; 137 + const tensionForce = -stiffness * (currentValue - endValue); 138 + const dampingForce = -damping * velocity; 139 + const acceleration = tensionForce + dampingForce; 140 + velocity = velocity + acceleration; 141 + currentValue += velocity * delta * 60; 142 + if (Math.abs(velocity) < precision && Math.abs(currentValue - endValue) < precision) { 143 + settled = true; 144 + } 145 + return { cv: currentValue, s: settled, v: velocity }; 146 + } 147 + 148 + /** 149 + * Similar behvour to Svelte's tweened funtion but linked to Threlte's useTask. 150 + * An example of easing functions available here: https://svelte.dev/examples/spring 151 + * @param currentValue - The starting value 152 + * @param [duration] - The duration of the tween in seconds 153 + * @param [easing] - Easing function 154 + * @example 155 + * 156 + * import { cubicInOut } from 'svelte/easing'; 157 + * 158 + * // create tween 159 + * let tweenedValue = 0 160 + * let newTween = spring(tweenedValue, 2, bounceOut) 161 + * 162 + * // set new value to move towards 163 + * newTween.set(10) 164 + * 165 + * useTask((delta) => { 166 + * // update value every frame 167 + * tweenedValue = newTween.update(delta); 168 + * } 169 + */ 170 + export const tween = <T extends Record<string, number> | number>( 171 + currentValue: T, 172 + duration = 1, 173 + easing = (t: number) => t 174 + ) => { 175 + let elapsed = 0; 176 + let startValue = currentValue; 177 + let endValue = currentValue; 178 + let inter = tweenInterpolator(startValue, endValue); 179 + const set = (value: T) => { 180 + elapsed = 0; 181 + startValue = currentValue; 182 + endValue = value; 183 + inter = tweenInterpolator(startValue, endValue); 184 + }; 185 + const update = (delta: number) => { 186 + if (elapsed < duration) { 187 + elapsed += delta; 188 + currentValue = inter(easing(elapsed / duration)) as T & number; 189 + } else { 190 + startValue = currentValue; 191 + } 192 + return currentValue; 193 + }; 194 + return { set, update }; 195 + }; 196 + 197 + function tweenInterpolator<T extends Record<string, number> | number>(a: T, b: T) { 198 + if (a === b || a !== a) return () => a; 199 + if (typeof b === 'object' && typeof a === 'object') { 200 + const keys = Object.keys(b); 201 + const interpolators: { [key: string]: (t: number) => number } = {}; 202 + keys.forEach((key) => { 203 + interpolators[key] = tweenInterpolator(a[key], b[key]) as (t: number) => typeof t; 204 + }); 205 + return (t: number) => { 206 + const result: { [key: string]: number } | number = {}; 207 + keys.forEach((key) => { 208 + result[key] = interpolators[key](t); 209 + }); 210 + return result; 211 + }; 212 + } else if (typeof a === 'number' && typeof b === 'number') { 213 + const delta = b - a; 214 + return (t: number) => a + t * delta; 215 + } else { 216 + return (t: number) => t; 217 + } 218 + }
+11 -11
src/lib/components/About.svelte
··· 23 23 <h1 24 24 class="text-4xl font-bold tracking-tight text-zinc-800 dark:text-zinc-100 sm:text-5xl" 25 25 > 26 - I'm Florian Killius. I live in Berlin, where I create things for the web. 26 + hey there, i'm florian. i live in berlin, where i create things for the web (and other places). 27 27 </h1> 28 28 <div class="mt-6 space-y-7 text-base text-zinc-600 dark:text-zinc-400"> 29 29 <p> 30 - I was one of the only kids in my class who didn't have some kind of game console at 31 - home. But we did have a computer and when I was 12, I got a coding book for Christmas 32 - and decided to try my hand at making my own games (using C and OpenGL). 30 + i was one of the only kids in my class who didn't have some kind of game console at 31 + home. but we did have a computer and when I was 12, i got a coding book for christmas 32 + and decided to try my hand at making my own games (using c and opengl). 33 33 </p> 34 34 <p> 35 - I never finished any of those games I tried to make then, but I was hooked. I've been 36 - programming ever since and after finishing school, I started studying computer science 35 + i never finished any of those games i tried to make then, but I was hooked. i've been 36 + programming ever since and after finishing school, i started studying computer science 37 37 and working as a software developer. 38 38 </p> 39 39 <p> 40 - I especially love the web, because it's so accessible. Anyone with some kind of 41 - electronic device and an internet connection can access your work in seconds. It's 40 + i especially love the web, because it's so accessible. anyone with some kind of 41 + electronic device and an internet connection can access your work in seconds. it's 42 42 also very easy to publish and share your work with the world, be it a static website, 43 43 a containerized application or a serverless function. 44 44 </p> 45 45 <p> 46 - Nowadays, I built lots of things for the web, from websites to PWAs and hybrid apps. 47 - I'm also interested in the intersection of design and development and how we can use 46 + nowadays, I built lots of things for the web, from websites to pwas and hybrid apps. 47 + i'm also interested in the intersection of design and development and how we can use 48 48 technology to make the world a better place. 49 49 </p> 50 50 <p> 51 - I also love to learn new things and I'm always looking for new challenges. If you have 51 + i also love to learn new things and I'm always looking for new challenges. if you have 52 52 any questions or just want to say hi, feel free to <a 53 53 href="#contact" 54 54 class="text-cyan-400 hover:text-cyan-300 font-semibold"
+7 -7
src/lib/components/Contact.svelte
··· 7 7 <div class="grid grid-cols-1 gap-x-8 gap-y-10 md:grid-cols-3"> 8 8 <div> 9 9 <h2 class="text-3xl font-bold tracking-tight text-zinc-900 dark:text-zinc-100 pointer-events-auto"> 10 - Get in touch 10 + get in touch 11 11 </h2> 12 12 <p class="mt-4 leading-7 text-zinc-600 dark:text-zinc-300 pointer-events-auto"> 13 - You have a project in mind? Let's talk about it. Drop me a line and I'll get back to you 13 + you have a project in mind? let's talk about it. drop me a line and I'll get back to you 14 14 as soon as possible. 15 15 </p> 16 16 ··· 26 26 /> 27 27 </svg> 28 28 </svelte:fragment> 29 - GitHub</SocialLink 29 + github</SocialLink 30 30 > 31 31 <SocialLink href="https://linkedin.com/in/floriankillius" class="mt-4"> 32 32 <svelte:fragment slot="icon"> ··· 36 36 /></svg 37 37 > 38 38 </svelte:fragment> 39 - LinkedIn 39 + linkedin 40 40 </SocialLink> 41 41 <SocialLink href="https://www.instagram.com/flobit.dev/" class="mt-4"> 42 42 <svelte:fragment slot="icon"> ··· 49 49 /> 50 50 </svg> 51 51 </svelte:fragment> 52 - Instagram 52 + instagram 53 53 </SocialLink> 54 54 <SocialLink href="https://youtube.com/@flobit" class="mt-4"> 55 55 <svelte:fragment slot="icon"> ··· 62 62 /> 63 63 </svg> 64 64 </svelte:fragment> 65 - Youtube 65 + youtube 66 66 </SocialLink> 67 67 <SocialLink href="https://flobit.substack.com/" class="mt-4"> 68 68 <svelte:fragment slot="icon"> ··· 81 81 /></svg 82 82 > 83 83 </svelte:fragment> 84 - Substack 84 + substack 85 85 </SocialLink> 86 86 87 87 <SocialLink href="mailto:flo.bit.dev@gmail.com" class="mt-8">
+1 -1
src/lib/components/Footer.svelte
··· 1 1 <footer class="bg-black relative isolate "> 2 2 <div class="mx-auto max-w-7xl overflow-hidden px-6 py-12 lg:px-8"> 3 3 <p class="mt-4 text-center text-xs leading-5 text-zinc-500 dark:text-zinc-400"> 4 - &copy; 2024 Florian Killius. All rights reserved. 4 + &copy; 2024 florian killius. all rights reserved. 5 5 </p> 6 6 </div> 7 7 </footer>
+14 -14
src/lib/components/Learning.svelte
··· 7 7 8 8 const learnings: Learning[] = [ 9 9 { 10 - title: 'Rust', 10 + title: 'rust', 11 11 description: 12 - 'Just started learning Rust. Still weirded out by the whole ownership thing, but other than that I like it so far.', 12 + 'just started learning rust. still weirded out by the whole ownership thing, but other than that i like it so far.', 13 13 date: '2024-01' 14 14 }, 15 15 { 16 - title: 'Threlte', 17 - description: 'Fun library combining Svelte and Three.js. Also used on this website.', 16 + title: 'threlte', 17 + description: 'fun library combining svelte and three.js. also used on this website.', 18 18 date: '2023-12' 19 19 }, 20 20 { 21 21 title: 'MongoDB', 22 - description: 'Switched from MySQL to MongoDB and never looked back.', 22 + description: 'switched from mysql to mongodb and never looked back.', 23 23 date: '2023-09' 24 24 }, 25 25 { 26 - title: 'Svelte and SvelteKit', 26 + title: 'svelte and sveltekit', 27 27 description: 28 - 'In my opinion the best framework for web development. I use it for most of my personal projects, including this website.', 28 + 'in my opinion the best framework for web development. i use it for most of my personal projects, including this website.', 29 29 date: '2023-06' 30 30 }, 31 31 { 32 - title: 'TailwindCSS', 32 + title: 'tailwindcss', 33 33 description: 34 - 'In my opinion the best bad idea in web development. Not great, but better than pure CSS by far. Used in most of my newer projects including this website.', 34 + 'in my opinion the best bad idea in web development. not great, but better than pure css by far. used in most of my newer projects including this website.', 35 35 date: '2023-05' 36 36 }, 37 37 { 38 - title: 'React, Next.js and ReactNative', 38 + title: 'react, next.js and reactnative', 39 39 description: 40 - "Not a huge fan of React, but it's still the most popular framework out there. I mostly use it for work.", 40 + "not a huge fan of react, but it's still the most popular framework out there. i mostly use it for work.", 41 41 date: '2023-01' 42 42 } 43 43 ]; ··· 55 55 <div id="learning" class="py-16 md:py-32 section"> 56 56 <div class="max-w-2xl"> 57 57 <h1 class="text-4xl font-bold tracking-tight text-zinc-800 dark:text-zinc-100 sm:text-5xl"> 58 - Always keep learning 58 + always keep learning 59 59 </h1> 60 60 <p class="mt-6 text-base text-zinc-600 dark:text-zinc-400"> 61 - One of the things I love most about programming is that there's always something new to 62 - learn. I try to learn something new every month. Here are some of the things I've been 61 + one of the things i love most about programming is that there's always something new to 62 + learn. i try to learn something new every month. here are some of the things i've been 63 63 learning lately: 64 64 </p> 65 65 </div>
+16 -10
src/lib/components/Posts.svelte
··· 8 8 9 9 const articles: Article[] = [ 10 10 { 11 - title: 'How I recreated this awesome text fluid effect', 12 - description: 'A step-by-step approach', 11 + title: 'how to become a great programmer (or anything else)', 12 + description: 'in one easy step', 13 + date: '2024-02-08', 14 + href: 'https://flobit.substack.com/p/how-i-recreated-this-awesome-text' 15 + }, 16 + { 17 + title: 'how i recreated this awesome text fluid effect', 18 + description: 'a step-by-step approach', 13 19 date: '2024-01-22', 14 20 href: 'https://flobit.substack.com/p/how-i-recreated-this-awesome-text' 15 21 }, 16 22 { 17 - title: 'Four free startup ideas for you', 23 + title: 'four free startup ideas for you', 18 24 description: 19 - 'Because there\'s not enough startups in this world', 25 + 'because there\'s not enough startups in this world', 20 26 date: '2024-01-15', 21 27 href: 'https://flobit.substack.com/p/four-free-startup-ideas-for-you' 22 28 }, 23 29 { 24 - title: 'How I use AI for Software Development', 30 + title: 'how i use ai for software development', 25 31 description: 26 - 'I admit it, I have asked ChatGPT at least 17 times how to center a div!', 32 + 'I admit it, I have asked chatgpt at least 17 times how to center a div!', 27 33 date: '2024-01-08', 28 34 href: 'https://flobit.substack.com/p/how-i-use-ai-for-software-development-474551a7aa7f' 29 35 } ··· 43 49 <div id="articles" class="py-16 md:py-32 section"> 44 50 <div class="max-w-2xl"> 45 51 <h1 class="text-4xl font-bold tracking-tight text-zinc-800 dark:text-zinc-100 sm:text-5xl"> 46 - My ramblings 52 + my ramblings 47 53 </h1> 48 54 <p class="mt-6 text-base text-zinc-600 dark:text-zinc-400"> 49 - Here are some of my thoughts on things I'm learning or working on. Powered by Substack. 55 + here are some of my thoughts on things i'm learning or working on. 50 56 </p> 51 57 </div> 52 58 <div class="mt-16"> ··· 65 71 <span class="absolute inset-y-0 left-0 flex items-center" aria-hidden="true"> 66 72 <span class="h-4 w-0.5 rounded-full bg-zinc-200 dark:bg-zinc-500" /> 67 73 </span> 68 - {formatDate(article.date)} 74 + {formatDate(article.date).toLowerCase()} 69 75 </div> 70 76 71 77 <p class="relative z-10 mt-2 text-sm text-zinc-600 dark:text-zinc-400"> ··· 78 84 /> 79 85 <span class="absolute -inset-x-4 -inset-y-6 z-20 sm:-inset-x-6 sm:rounded-2xl" /> 80 86 <span class="relative z-10 mt-4 flex items-center text-sm font-medium text-zinc-400 transition-colors duration-200 group-hover:text-cyan-400"> 81 - Read Article 87 + read 82 88 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-3 h-3 ml-1 mt-0.5"> 83 89 <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" /> 84 90 </svg>
+13 -14
src/lib/components/Projects.svelte
··· 7 7 link?: { href: string; label: string }; 8 8 logo?: string; 9 9 }[] = [ 10 - 11 10 { 12 - name: 'Hyperlumen', 11 + name: 'hyperlumen', 13 12 description: 14 - "Light-Up clothes that make you feel like you're in a sci-fi movie. Perfect for raves.", 13 + "light-up clothes that make you feel like you're in a sci-fi movie. perfect for raves.", 15 14 link: { href: 'http://hyperlumen.de', label: 'hyperlumen.de' } 16 15 }, 17 16 { 18 - name: 'Text Effect Fluid', 19 - description: "Text effect that looks like it's made of fluid.", 17 + name: 'text effect fluid', 18 + description: "text effect that looks like it's some kind of fluid.", 20 19 link: { href: 'https://github.com/flo-bit/text_effect_fluid', label: 'github.com' } 21 20 }, 22 21 { 23 - name: 'Image2Fake3D', 24 - description: "Turns an image into a fake 3D image that you can rotate with your mouse or gyro.", 22 + name: 'image2fake3d', 23 + description: "turns an image into a fake 3d image that you can rotate with your mouse or gyro sensor.", 25 24 link: { href: 'https://github.com/flo-bit/image2fake3d', label: 'github.com' } 26 25 }, 27 26 { 28 - name: 'Ball Game', 27 + name: 'marblellous', 29 28 description: 30 - 'Simple 3D browser game made with Threlte. Inspired by the game "Marble Blast Gold".', 29 + 'simple 3d browser game made with threlte. inspired by the game "marble blast gold".', 31 30 link: { href: 'https://github.com/flo-bit/ball-game', label: 'github.com' } 32 31 }, 33 32 { 34 - name: 'Svleek', 33 + name: 'svleek', 35 34 description: 36 - 'Generating a simple but slick documentation website from a folder of markdown files.', 35 + 'generating a simple but slick documentation website from a folder of markdown files.', 37 36 link: { href: 'https://github.com/flo-bit/svleek', label: 'github.com' } 38 37 }, 39 38 /*{ ··· 42 41 link: { href: 'https://github.com/flo-bit/mandala', label: 'github.com' } 43 42 },*/ 44 43 { 45 - name: 'Old Coding Projects', 44 + name: 'old coding projects', 46 45 description: "Some of my old coding projects. Please don't look at the code.", 47 46 link: { href: 'https://github.com/flo-bit/old-code', label: 'github.com' } 48 47 } ··· 110 109 <div class="mx-auto max-w-5xl px-6 lg:px-8"> 111 110 <div class="max-w-2xl"> 112 111 <h1 class="text-4xl font-bold tracking-tight text-zinc-800 dark:text-zinc-100 sm:text-5xl"> 113 - Things I've made 112 + things i've made 114 113 </h1> 115 114 <p class="mt-6 text-base text-zinc-600 dark:text-zinc-400"> 116 - I've worked on lots of little side projects over the years, here are some recent ones. Many 115 + i've worked on lots of little side projects over the years, here are some recent ones. many 117 116 of them are open-source, so if you see something that piques your interest, check out the 118 117 code and feel free to contribute. 119 118 </p>
+13 -13
src/lib/components/Resume.svelte
··· 17 17 end: string | { label: string; dateTime: string }; 18 18 }> = [ 19 19 { 20 - company: 'Hyperlumen', 21 - title: 'Co-Founder', 20 + company: 'hyperlumen', 21 + title: 'co-founder', 22 22 logo: { 23 23 src: hyperlumen, 24 24 rounded: true 25 25 }, 26 26 start: '2023', 27 27 end: { 28 - label: 'Present', 28 + label: 'present', 29 29 dateTime: new Date().getFullYear().toString() 30 30 } 31 31 }, 32 32 { 33 - company: 'Enna', 34 - title: 'Student Software Engineer', 33 + company: 'enna', 34 + title: 'student software engineer', 35 35 logo: enna, 36 36 start: '2022', 37 37 end: { 38 - label: 'Present', 38 + label: 'present', 39 39 dateTime: new Date().getFullYear().toString() 40 40 } 41 41 }, 42 42 { 43 - company: 'Puppet', 44 - title: 'Co-Founder', 43 + company: 'puppet', 44 + title: 'co-founder', 45 45 logo: puppet, 46 46 start: '2022', 47 47 end: { 48 - label: 'Present', 48 + label: 'present', 49 49 dateTime: new Date().getFullYear().toString() 50 50 } 51 51 }, 52 52 { 53 - company: 'TU Berlin', 54 - title: 'Computer Science', 53 + company: 'tu berlin', 54 + title: 'computer science', 55 55 logo: tub, 56 56 start: '2018', 57 57 end: { 58 - label: 'Present', 58 + label: 'present', 59 59 dateTime: new Date().getFullYear().toString() 60 60 } 61 61 } ··· 74 74 class="stroke-zinc-400 dark:stroke-zinc-500" 75 75 /> 76 76 </svg> 77 - <span class="ml-3">Work & Education</span> 77 + <span class="ml-3">work & education</span> 78 78 </h2> 79 79 <ol class="mt-6 space-y-4"> 80 80 {#each resume as role}
+29
src/lib/3D/planet/Planet.svelte
··· 1 + <script lang="ts"> 2 + import { onMount } from 'svelte'; 3 + import type { BufferGeometry, Mesh } from 'three'; 4 + import { Planet } from './worlds/planet'; 5 + import { T, forwardEventHandlers } from '@threlte/core'; 6 + import FakeGlowMaterial from '../FakeGlowMaterial/FakeGlowMaterial.svelte'; 7 + 8 + let planet: Mesh; 9 + let geometry: BufferGeometry; 10 + let ocean: Mesh; 11 + 12 + onMount(() => { 13 + const cube = new Planet({ preset: 'test' }, { scatter: 0.04 }).createMesh(); 14 + planet = cube; 15 + geometry = cube.geometry; 16 + ocean = cube.children[0] as Mesh; 17 + console.log(geometry); 18 + }); 19 + 20 + const component = forwardEventHandlers(); 21 + </script> 22 + 23 + <T.Group dispose={false} {...$$restProps} bind:this={$component}> 24 + <T.Mesh is={planet} /> 25 + <!-- <T.Mesh> 26 + <T.SphereGeometry args={[1.3, 32, 32]} /> 27 + <FakeGlowMaterial glowColor={'#075985'} falloff={1.0} glowInternalRadius={1.0} /> 28 + </T.Mesh> --> 29 + </T.Group>
+5 -5
src/lib/components/nav/DektopNavigation.svelte
··· 13 13 class="flex rounded-full bg-white/90 px-3 text-sm font-medium text-zinc-800 shadow-lg shadow-zinc-800/5 ring-1 ring-zinc-900/5 backdrop-blur dark:bg-white/5 dark:text-zinc-200 dark:ring-white/10" 14 14 > 15 15 <!-- <NavigationItem href="#home" isActive={active == 'home'}>Home</NavigationItem> --> 16 - <NavigationItem href="#about" isActive={active == 'about'}>About</NavigationItem> 17 - <NavigationItem href="#projects" isActive={active == 'projects'}>Projects</NavigationItem> 18 - <NavigationItem href="#articles" isActive={active == 'articles'}>Articles</NavigationItem> 19 - <NavigationItem href="#learning" isActive={active == 'learning'}>Learning</NavigationItem> 20 - <NavigationItem href="#contact" isActive={active == 'contact'}>Contact</NavigationItem> 16 + <NavigationItem href="#about" isActive={active == 'about'}>about</NavigationItem> 17 + <NavigationItem href="#projects" isActive={active == 'projects'}>projects</NavigationItem> 18 + <NavigationItem href="#articles" isActive={active == 'articles'}>articles</NavigationItem> 19 + <NavigationItem href="#learning" isActive={active == 'learning'}>learning</NavigationItem> 20 + <NavigationItem href="#contact" isActive={active == 'contact'}>contact</NavigationItem> 21 21 </ul> 22 22 </nav>
+7 -7
src/lib/components/nav/MobileNavigation.svelte
··· 26 26 use:melt={$trigger} 27 27 aria-label="Update dimensions" 28 28 > 29 - Menu 29 + menu 30 30 <svg 31 31 viewBox="0 0 8 6" 32 32 aria-hidden="true" ··· 58 58 <path d="m17.25 6.75-10.5 10.5M6.75 6.75l10.5 10.5" fill="none" stroke="currentColor" /> 59 59 </svg> 60 60 </button> 61 - <h2 class="text-sm font-medium text-zinc-600 dark:text-zinc-400">Navigation</h2> 61 + <h2 class="text-sm font-medium text-zinc-600 dark:text-zinc-400">navigation</h2> 62 62 </div> 63 63 <nav class="mt-6"> 64 64 <ul ··· 79 79 class="block py-2 {active == 'about' ? 'dark:text-cyan-400' : ''}" 80 80 on:click={hide} 81 81 > 82 - About 82 + about 83 83 </a> 84 84 </li> 85 85 <li> ··· 88 88 class="block py-2 {active == 'projects' ? 'dark:text-cyan-400' : ''}" 89 89 on:click={hide} 90 90 > 91 - Projects 91 + projects 92 92 </a> 93 93 </li> 94 94 <li> ··· 97 97 class="block py-2 {active == 'articles' ? 'dark:text-cyan-400' : ''}" 98 98 on:click={hide} 99 99 > 100 - Articles 100 + articles 101 101 </a> 102 102 </li> 103 103 <li> ··· 106 106 class="block py-2 {active == 'learning' ? 'dark:text-cyan-400' : ''}" 107 107 on:click={hide} 108 108 > 109 - Learning 109 + learning 110 110 </a> 111 111 </li> 112 112 <li> ··· 115 115 class="block py-2 {active == 'contact' ? 'dark:text-cyan-400' : ''}" 116 116 on:click={hide} 117 117 > 118 - Contact 118 + contact 119 119 </a> 120 120 </li> 121 121 </ul>
+167
src/lib/3D/planet/geometry/geometry-helper.ts
··· 1 + import { BufferGeometry, BufferAttribute, Vector3, Color, Vector2, Object3D, Mesh } from 'three'; 2 + 3 + import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; 4 + 5 + import { Vertex } from './vertex-helper'; 6 + 7 + export class GeometryHelper { 8 + static fromGeometry(geometry: BufferGeometry): Vertex[] { 9 + if (geometry.index) geometry = geometry.toNonIndexed(); 10 + const vertices = geometry.getAttribute('position'); 11 + const colors = geometry.getAttribute('color'); 12 + const uvs = geometry.getAttribute('uv'); 13 + const normals = geometry.getAttribute('normal'); 14 + 15 + console.log(normals ? normals.array.length : 'no normals'); 16 + 17 + const array: Vertex[] = []; 18 + for (let i = 0; i < vertices.count; i++) { 19 + const vertex: Vertex = new Vertex(vertices.getX(i), vertices.getY(i), vertices.getZ(i)); 20 + if (colors != undefined) 21 + vertex.color = new Color(colors.getX(i), colors.getY(i), colors.getZ(i)); 22 + if (uvs != undefined) vertex.uv = new Vector2(uvs.getX(i), uvs.getY(i)); 23 + if (normals != undefined) 24 + vertex.normal = new Vector3(normals.getX(i), normals.getY(i), normals.getZ(i)); 25 + array.push(vertex); 26 + } 27 + return array; 28 + } 29 + 30 + /** 31 + * creates a three.js buffer geometry from a list of vertices where each face is made of 3 subsequent vertices 32 + * vertices can also have an optional color, uv and normal 33 + * 34 + * @param {*} vertices - array of vertices with x, y and z coordinates (optional: color {r, g, b}, uv {x, y} and normal {x, y, z}) 35 + * @param {*} computeNormals - if true and no normals given, the normals will be computed from the vertices (per vertex normals) 36 + * @returns {BufferGeometry} 37 + */ 38 + static createGeometryFromVertices( 39 + vertices: Vertex[], 40 + computeNormals: boolean | undefined = undefined 41 + ): BufferGeometry { 42 + if (!vertices?.length) { 43 + throw new Error('No vertices given'); 44 + } 45 + 46 + const bufferedVertices = new Float32Array(vertices.length * 3); 47 + const bufferedColor: Float32Array | undefined = vertices[0].color 48 + ? new Float32Array(vertices.length * 3) 49 + : undefined; 50 + const bufferedUVs: Float32Array | undefined = vertices[0].uv 51 + ? new Float32Array(vertices.length * 2) 52 + : undefined; 53 + const bufferedNormals: Float32Array | undefined = vertices[0].normal 54 + ? new Float32Array(vertices.length * 3) 55 + : undefined; 56 + 57 + for (let i = 0; i < vertices.length; i++) { 58 + if (vertices[i] == undefined) { 59 + throw new Error('Some vertices are undefined'); 60 + } 61 + bufferedVertices[i * 3] = vertices[i].x; 62 + bufferedVertices[i * 3 + 1] = vertices[i].y; 63 + bufferedVertices[i * 3 + 2] = vertices[i].z; 64 + 65 + if (bufferedColor && vertices[i].color) { 66 + const color = vertices[i].color ?? new Color(0xffffff); 67 + bufferedColor[i * 3] = color.r; 68 + bufferedColor[i * 3 + 1] = color.g; 69 + bufferedColor[i * 3 + 2] = color.b; 70 + } 71 + if (bufferedUVs && vertices[i].uv) { 72 + const uv = vertices[i].uv ?? new Vector2(0, 0); 73 + bufferedUVs[i * 2] = uv.x; 74 + bufferedUVs[i * 2 + 1] = uv.y; 75 + } 76 + 77 + if (!bufferedNormals || !vertices[i].normal) continue; 78 + const normal = vertices[i].normal ?? new Vector3(0, 0, 0); 79 + bufferedNormals[i * 3] = normal.x; 80 + bufferedNormals[i * 3 + 1] = normal.y; 81 + bufferedNormals[i * 3 + 2] = normal.z; 82 + } 83 + 84 + return GeometryHelper.createGeometryFromArrays({ 85 + vertices: bufferedVertices, 86 + colors: bufferedColor, 87 + uvs: bufferedUVs, 88 + normals: bufferedNormals, 89 + computeNormals 90 + }); 91 + } 92 + 93 + static createGeometryFromArrays({ 94 + vertices, 95 + colors, 96 + uvs, 97 + normals, 98 + computeNormals 99 + }: { 100 + vertices: Float32Array; 101 + colors?: Float32Array; 102 + uvs?: Float32Array; 103 + normals?: Float32Array; 104 + computeNormals?: boolean; 105 + }): BufferGeometry { 106 + const geo = new BufferGeometry(); 107 + geo.setAttribute('position', new BufferAttribute(vertices, 3)); 108 + 109 + if (colors) geo.setAttribute('color', new BufferAttribute(colors, 3)); 110 + if (uvs) geo.setAttribute('uv', new BufferAttribute(uvs, 2)); 111 + 112 + if (normals && !computeNormals) geo.setAttribute('normal', new BufferAttribute(normals, 3)); 113 + else if (computeNormals !== false) geo.computeVertexNormals(); 114 + 115 + return geo; 116 + } 117 + } 118 + 119 + export class GLTFHelper { 120 + models: Record<string, any>; 121 + toLoad: number; 122 + loaded: number; 123 + done: (() => void) | undefined; 124 + 125 + gltfLoader: GLTFLoader; 126 + 127 + constructor(dict: Record<string, string>, callback: (() => void) | undefined = undefined) { 128 + this.models = {}; 129 + 130 + this.toLoad = 0; 131 + this.loaded = 0; 132 + 133 + this.done = callback; 134 + 135 + this.gltfLoader = new GLTFLoader(); 136 + 137 + const keys = Object.keys(dict); 138 + for (const k of keys) { 139 + this.load(dict[k], k); 140 + } 141 + } 142 + load(name: string, file: string) { 143 + this.toLoad += 1; 144 + 145 + this.gltfLoader.load(file, (model) => { 146 + model.scene.gltf = model; 147 + this.loaded += 1; 148 + 149 + this.models[name] = model.scene; 150 + 151 + if (this.done != undefined && this.toLoad == this.loaded) this.done(); 152 + }); 153 + } 154 + changeMaterials(name: string, changeFunction: (material: any, model: any, name: string) => any) { 155 + const model = this.models[name]; 156 + model.traverse((a: Object3D) => { 157 + if (a instanceof Mesh && a.material) { 158 + a.material = changeFunction(a.material, model, name); 159 + } 160 + }); 161 + } 162 + changeMaterialsAll(changeFunction: (material: any, model: any) => any) { 163 + for (const k of Object.keys(this.models)) { 164 + this.changeMaterials(k, changeFunction); 165 + } 166 + } 167 + }
+265
src/lib/3D/planet/geometry/geometry-modifier.ts
··· 1 + import { 2 + Vector3, 3 + Color, 4 + BufferGeometry, 5 + IcosahedronGeometry, 6 + PlaneGeometry, 7 + Mesh, 8 + MeshStandardMaterial, 9 + type MeshStandardMaterialParameters 10 + } from 'three'; 11 + 12 + import { Vertex, type Face, VertexHelper } from './vertex-helper'; 13 + 14 + import { GeometryHelper } from './geometry-helper'; 15 + 16 + import { mergeVertices, toCreasedNormals } from 'three/addons/utils/BufferGeometryUtils.js'; 17 + import UberNoise from '../noise/uber-noise'; 18 + 19 + export type ModifiedGeometryOptions = { 20 + name?: string; 21 + shape?: string; 22 + 23 + shapeOptions?: any; 24 + 25 + subdivisions?: number; 26 + 27 + length?: number; 28 + 29 + color?: Color | string | number; 30 + 31 + children?: (ModifiedGeometry | ModifiedGeometryOptions)[]; 32 + 33 + rotation?: Vector3; 34 + scale?: Vector3; 35 + position?: Vector3; 36 + 37 + scatter?: number; 38 + scatterScale?: number; 39 + 40 + array?: [number, number, number]; 41 + 42 + reverse?: boolean; 43 + 44 + geometry?: BufferGeometry; 45 + }; 46 + 47 + type VertexModifierFunction = (v: Vertex) => Vertex | Vertex[] | null | void; 48 + 49 + export type FaceModifierFunction = (f: Face) => Face | Face[] | null | void; 50 + 51 + export class ModifiedGeometry { 52 + isProceduralObject = true; 53 + 54 + vertices: Vertex[]; 55 + name: string; 56 + 57 + static Icosahedron( 58 + opts: ModifiedGeometryOptions & { detail?: number; radius?: number } = { 59 + detail: 0, 60 + radius: 1 61 + } 62 + ) { 63 + return new ModifiedGeometry({ 64 + ...opts, 65 + geometry: new IcosahedronGeometry(opts.radius, opts.detail) 66 + }); 67 + } 68 + 69 + static Plane( 70 + opts: ModifiedGeometryOptions & { 71 + width?: number; 72 + height?: number; 73 + widthSegments?: number; 74 + heightSegments?: number; 75 + } 76 + ) { 77 + return new ModifiedGeometry({ 78 + ...opts, 79 + geometry: new PlaneGeometry(opts.width, opts.height, opts.widthSegments, opts.heightSegments) 80 + }); 81 + } 82 + 83 + static fromMesh(mesh: THREE.Mesh) { 84 + return new ModifiedGeometry({ geometry: mesh.geometry }); 85 + } 86 + static fromGeometry(geometry: BufferGeometry) { 87 + return new ModifiedGeometry({ geometry }); 88 + } 89 + 90 + createGeometry() { 91 + return mergeVertices(GeometryHelper.createGeometryFromVertices(this.vertices)); 92 + } 93 + 94 + createMesh(opts: MeshStandardMaterialParameters = {}) { 95 + return new Mesh( 96 + this.createGeometry(), 97 + new MeshStandardMaterial({ 98 + vertexColors: true, 99 + flatShading: true, 100 + ...opts 101 + }) 102 + ); 103 + } 104 + 105 + setLengthFromNoise(noise: UberNoise) { 106 + this.modifyVertices((v) => { 107 + v.setLength(noise.get(v.x, v.y, v.z)); 108 + }); 109 + } 110 + 111 + setLengthFromFunction(func: (v: Vertex) => number) { 112 + this.modifyVertices((v) => { 113 + v.setLength(func(v)); 114 + }); 115 + } 116 + 117 + setFaceColorFromFunction(func: (f: Face) => Color) { 118 + this.modifyFaces((f) => { 119 + f.a.faceColor = func(f); 120 + }); 121 + } 122 + 123 + setLengthAndFaceColorFromFunction( 124 + lengthFunc: (v: Vertex) => number, 125 + colorFunc: (f: Face) => Color, 126 + modifyVertex = (v: Vertex, n: number) => { 127 + v.setLength(n); 128 + } 129 + ) { 130 + this.modifyFaces((f) => { 131 + modifyVertex(f.a, lengthFunc(f.a)); 132 + modifyVertex(f.b, lengthFunc(f.b)); 133 + modifyVertex(f.c, lengthFunc(f.c)); 134 + 135 + const color = colorFunc(f); 136 + f.a.color = color; 137 + f.b.color = color; 138 + f.c.color = color; 139 + }); 140 + } 141 + 142 + scatter(amount = 0.1, scale = 100, seed = 0) { 143 + const noise = new UberNoise({ 144 + min: -amount / 2, 145 + max: amount / 2, 146 + scale, 147 + seed 148 + }); 149 + this.modifyVertices((v) => { 150 + v.x += noise.get(v.x, v.y, v.z); 151 + v.y += noise.get(v.y + scale * 100, v.z + scale * 100, v.x + scale * 100); 152 + v.z += noise.get(v.z + scale * 200, v.x + scale * 200, v.y + scale * 200); 153 + }); 154 + } 155 + 156 + moveAlongNormalFromFunction(func: (v: Vertex) => number) { 157 + this.modifyFaces((f) => { 158 + f.a.addScaledVector(f.normal ?? new Vector3(0, 0, 0), func(f.a)); 159 + f.b.addScaledVector(f.normal ?? new Vector3(0, 0, 0), func(f.b)); 160 + f.c.addScaledVector(f.normal ?? new Vector3(0, 0, 0), func(f.c)); 161 + }); 162 + } 163 + 164 + moveAlongNormalAndColorFacesFromFunctions( 165 + lengthFunc: (v: Vertex) => number, 166 + colorFunc: (f: Face) => Color 167 + ) { 168 + this.modifyFaces((f) => { 169 + f.a.addScaledVector(f.a.normal ?? new Vector3(0, 0, 0), lengthFunc(f.a)); 170 + f.b.addScaledVector(f.b.normal ?? new Vector3(0, 0, 0), lengthFunc(f.b)); 171 + f.c.addScaledVector(f.c.normal ?? new Vector3(0, 0, 0), lengthFunc(f.c)); 172 + 173 + const color = colorFunc(f); 174 + f.a.color = color; 175 + f.b.color = color; 176 + f.c.color = color; 177 + }); 178 + } 179 + 180 + calculateVertexNormals(tolerance: number | undefined = undefined) { 181 + const geometry = toCreasedNormals( 182 + GeometryHelper.createGeometryFromVertices(this.vertices), 183 + tolerance 184 + ); 185 + 186 + console.log(geometry.getAttribute('position').array.length); 187 + this.vertices = GeometryHelper.fromGeometry(geometry); 188 + } 189 + 190 + constructor(opts: ModifiedGeometryOptions = {}) { 191 + this.isProceduralObject = true; 192 + 193 + this.vertices = []; 194 + this.name = opts.name ?? 'ProcObject'; 195 + 196 + if (opts.geometry) { 197 + this.vertices = GeometryHelper.fromGeometry(opts.geometry); 198 + } 199 + 200 + if (opts.subdivisions) this.subdivide(opts.subdivisions); 201 + } 202 + 203 + modifyVertices(modifier: VertexModifierFunction) { 204 + if (!modifier) return; 205 + 206 + let newVertices: Vertex[] | null = null; 207 + for (let i = 0; i < this.vertices.length; i++) { 208 + this.vertices[i].index = i; 209 + if (i % 3 === 0) { 210 + this.vertices[i].connectingVertices = [this.vertices[i + 1], this.vertices[i + 2]]; 211 + } else if (i % 3 === 1) { 212 + this.vertices[i].connectingVertices = [this.vertices[i - 1], this.vertices[i + 1]]; 213 + } else if (i % 3 === 2) { 214 + this.vertices[i].connectingVertices = [this.vertices[i - 2], this.vertices[i - 1]]; 215 + } 216 + const res = modifier(this.vertices[i]); 217 + if (!res) continue; 218 + 219 + newVertices = newVertices ?? []; 220 + if (Array.isArray(res)) newVertices.push(...res); 221 + else newVertices.push(res); 222 + } 223 + if (newVertices) this.vertices = newVertices; 224 + 225 + return this.vertices; 226 + } 227 + 228 + modifyFaces(modifier: FaceModifierFunction, calculateNormals = true) { 229 + if (!modifier) return; 230 + 231 + let newFaces: Face[] | null = null; 232 + for (let i = 0; i < this.vertices.length; i += 3) { 233 + const face = { 234 + a: this.vertices[i], 235 + b: this.vertices[i + 1], 236 + c: this.vertices[i + 2], 237 + index: i / 3, 238 + mid: VertexHelper.midpoint(this.vertices[i], this.vertices[i + 1], this.vertices[i + 2]), 239 + normal: calculateNormals 240 + ? VertexHelper.normalFromFace( 241 + this.vertices[i], 242 + this.vertices[i + 1], 243 + this.vertices[i + 2] 244 + ) 245 + : undefined 246 + }; 247 + const res = modifier(face); 248 + if (!res) continue; 249 + 250 + newFaces = newFaces ?? []; 251 + if (Array.isArray(res)) newFaces.push(...res); 252 + else newFaces.push(res); 253 + } 254 + if (newFaces) this.vertices = newFaces.flatMap((f) => [f.a, f.b, f.c]); 255 + 256 + return this.vertices; 257 + } 258 + 259 + subdivide(num = 1) { 260 + this.modifyFaces((f) => { 261 + return VertexHelper.subdivideFace(f); 262 + }); 263 + if (num > 1) this.subdivide(num - 1); 264 + } 265 + }
+315
src/lib/3D/planet/geometry/vertex-helper.ts
··· 1 + import { Vector3, Color, Vector2 } from 'three'; 2 + 3 + export class Vertex extends Vector3 { 4 + color?: Color; 5 + uv?: Vector2; 6 + normal?: Vector3; 7 + 8 + index?: number; 9 + 10 + connectingVertices?: Vertex[]; 11 + 12 + clone(): this { 13 + const clone = super.clone(); 14 + clone.color = this.color?.clone(); 15 + clone.uv = this.uv?.clone(); 16 + clone.normal = this.normal?.clone(); 17 + clone.index = this.index; 18 + 19 + if (this.connectingVertices) clone.connectingVertices = [...this.connectingVertices]; 20 + 21 + return clone; 22 + } 23 + 24 + get isFirstInFace() { 25 + return this.index != undefined && this.index % 3 === 0; 26 + } 27 + 28 + set faceColor(color: Color) { 29 + if (!this.connectingVertices) return; 30 + 31 + this.color = color; 32 + for (const vertex of this.connectingVertices) { 33 + vertex.color = color; 34 + } 35 + } 36 + 37 + lerp(v: Vertex, alpha: number): this { 38 + const lerp = super.lerp(v, alpha); 39 + if (this.color && v.color) lerp.color = this.color?.lerp(v.color, alpha); 40 + if (this.uv && v.uv) lerp.uv = this.uv?.lerp(v.uv, alpha); 41 + if (this.normal && v.normal) lerp.normal = this.normal?.lerp(v.normal, alpha); 42 + 43 + return lerp; 44 + } 45 + } 46 + 47 + export type Face = { 48 + a: Vertex; 49 + b: Vertex; 50 + c: Vertex; 51 + index?: number; 52 + mid?: Vector3; 53 + normal?: Vector3; 54 + }; 55 + 56 + export class VertexHelper { 57 + static subdivideFace(face: Face) { 58 + const newFaces: Face[] = []; 59 + const d = VertexHelper.midpoint(face.a, face.b); 60 + const e = VertexHelper.midpoint(face.b, face.c); 61 + const f = VertexHelper.midpoint(face.c, face.a); 62 + newFaces.push({ a: d.clone(), b: e.clone(), c: f.clone() }); 63 + newFaces.push({ a: face.a.clone(), b: d.clone(), c: f.clone() }); 64 + newFaces.push({ a: d.clone(), b: face.b.clone(), c: e.clone() }); 65 + newFaces.push({ a: e.clone(), b: face.c.clone(), c: f.clone() }); 66 + return newFaces; 67 + } 68 + 69 + static midpoint(a: Vertex, ...rest: Vertex[]): Vertex { 70 + const mid = a.clone(); 71 + for (const v of rest) { 72 + mid.add(v); 73 + } 74 + mid.divideScalar(rest.length + 1); 75 + return mid; 76 + } 77 + 78 + static normalFromFace(a: Vertex, b: Vertex, c: Vertex): Vector3 { 79 + const ab = b.clone().sub(a); 80 + const ac = c.clone().sub(a); 81 + return ab.cross(ac).normalize(); 82 + } 83 + } 84 + 85 + /* 86 + export class VertexHelper { 87 + static splitAlongLongestSide( 88 + a: Vertex, 89 + b: Vertex, 90 + c: Vertex, 91 + array: Vertex[] | undefined = undefined 92 + ) { 93 + array = array ?? []; 94 + let ab = a.distanceTo(b); 95 + let bc = b.distanceTo(c); 96 + let ca = c.distanceTo(a); 97 + if (ab > bc && ab > ca) { 98 + let mid = b.clone().add(a).divideScalar(2); 99 + array.push( 100 + a.clone(), 101 + mid.clone(), 102 + c.clone(), 103 + mid.clone(), 104 + b.clone(), 105 + c.clone() 106 + ); 107 + } else if (bc > ab && bc > ca) { 108 + let mid = c.clone().add(b).divideScalar(2); 109 + array.push( 110 + a.clone(), 111 + b.clone(), 112 + mid.clone(), 113 + mid.clone(), 114 + c.clone(), 115 + a.clone() 116 + ); 117 + } else { 118 + let mid = a.clone().add(c).divideScalar(2); 119 + array.push( 120 + a.clone(), 121 + b.clone(), 122 + mid.clone(), 123 + b.clone(), 124 + c.clone(), 125 + mid.clone() 126 + ); 127 + } 128 + return array; 129 + } 130 + 131 + // turns rectangle with sides ab, bc, cd, da into two triangles 132 + static makeFacesFromRect( 133 + a: Vertex, 134 + b: Vertex, 135 + c: Vertex, 136 + d: Vertex, 137 + array: Vertex[] | undefined = undefined 138 + ) { 139 + array = array || []; 140 + array.push( 141 + a.clone(), 142 + d.clone(), 143 + c.clone(), 144 + a.clone(), 145 + c.clone(), 146 + b.clone() 147 + ); 148 + return array; 149 + } 150 + 151 + static midpoint(a: Vertex, b: Vertex) { 152 + return a.clone().lerp(b, 0.5); 153 + } 154 + 155 + static createPerFaceVerticesFromIndices(ver, ind) { 156 + let vertices = []; 157 + for (let i = 0; i < ind.length; i++) { 158 + let vi = ind[i] * 3; 159 + vertices.push(Helper.makeVertex(ver[vi], ver[vi + 1], ver[vi + 2])); 160 + } 161 + return vertices; 162 + } 163 + 164 + static subdivideFace( 165 + a: Vertex, 166 + b: Vertex, 167 + c: Vertex, 168 + noClone: boolean = false 169 + ) { 170 + let newFaces = []; 171 + let d = Helper.midpoint(a, b); 172 + let e = Helper.midpoint(b, c); 173 + let f = Helper.midpoint(c, a); 174 + if (noClone == true) { 175 + newFaces.push(d, e, f); 176 + newFaces.push(a, d, f); 177 + newFaces.push(d, b, e); 178 + newFaces.push(e, c, f); 179 + } else { 180 + newFaces.push(d.clone(), e.clone(), f.clone()); 181 + newFaces.push(a.clone(), d.clone(), f.clone()); 182 + newFaces.push(d.clone(), b.clone(), e.clone()); 183 + newFaces.push(e.clone(), c.clone(), f.clone()); 184 + } 185 + return newFaces; 186 + } 187 + 188 + static addArrayToArray(toArr, fromArr) { 189 + for (let i of fromArr) { 190 + toArr.push(i); 191 + } 192 + } 193 + 194 + static vertexPosForAngle(a, h, r) { 195 + return new THREE.Vector3(Math.sin(a) * (r || 1), h, Math.cos(a) * (r || 1)); 196 + } 197 + 198 + static addMorphToGeo(geo, morphGeo) { 199 + if (geo.morphAttributes.position == undefined) 200 + geo.morphAttributes.position = []; 201 + if (geo.morphAttributes.normal == undefined) 202 + geo.morphAttributes.normal = []; 203 + 204 + let i = geo.morphAttributes.position.length; 205 + geo.morphAttributes.position[i] = morphGeo.getAttribute("position").clone(); 206 + geo.morphAttributes.normal[i] = morphGeo.getAttribute("normal").clone(); 207 + } 208 + 209 + static makeVertex(x, y, z) { 210 + return new THREE.Vector3(x, y, z); 211 + } 212 + static makeFace(a, b, c, index) { 213 + let mid = Helper.makeVertex( 214 + (a.x + b.x + c.x) / 3, 215 + (a.y + b.y + c.y) / 3, 216 + (a.z + b.z + c.z) / 3 217 + ); 218 + return { 219 + a: a, 220 + b: b, 221 + c: c, 222 + face: index, 223 + mid: mid, 224 + }; 225 + } 226 + 227 + // barycentric method 228 + static isPointInFace(face, v) { 229 + var v0 = face.c.clone().sub(face.a); 230 + var v1 = face.b.clone().sub(face.a); 231 + var v2 = v.clone().sub(face.a); 232 + var dot00 = v0.dot(v0); 233 + var dot01 = v0.dot(v1); 234 + var dot02 = v0.dot(v2); 235 + var dot11 = v1.dot(v1); 236 + var dot12 = v1.dot(v2); 237 + var invDenom = 1 / (dot00 * dot11 - dot01 * dot01); 238 + var u = (dot11 * dot02 - dot01 * dot12) * invDenom; 239 + var v = (dot00 * dot12 - dot01 * dot02) * invDenom; 240 + return u >= 0 && v >= 0 && u + v < 1; 241 + } 242 + 243 + static randomPointInFace(face, RNG) { 244 + // Call the corners of the triangle A, B, C, the side vectors AB, BC, AC 245 + let ab = face.b.clone().sub(face.a); 246 + let bc = face.c.clone().sub(face.b); 247 + let ac = face.c.clone().sub(face.a); 248 + // generate two random numbers in [0,1] called u and v. 249 + let u = RNG != undefined ? RNG.random() : Math.random(); 250 + let v = RNG != undefined ? RNG.random() : Math.random(); 251 + // Let p = u * AB + v * AC. 252 + let p = ab.clone().multiplyScalar(u).add(ac.clone().multiplyScalar(v)); 253 + 254 + // If A+p is inside the triangle, return A+p 255 + let point = face.a.clone().add(p); 256 + 257 + // If A+p is outside the triangle, return A + AB + AC - p 258 + if (!Helper.isPointInFace(face, point)) { 259 + point.sub(p.multiplyScalar(2)); 260 + point.add(ab); 261 + point.add(ac); 262 + } 263 + return point; 264 + } 265 + 266 + // load pixel data of image so we can access it with getPixel(data, x, y) where x, y in range [0, 1] 267 + static loadImageData(image) { 268 + let canvas = document.createElement("canvas"); 269 + canvas.width = image.width; 270 + canvas.height = image.height; 271 + 272 + let context = canvas.getContext("2d"); 273 + context.drawImage(image, 0, 0); 274 + 275 + return context.getImageData(0, 0, image.width, image.height); 276 + } 277 + // returns pixel as a THREE.Color() object with an addition alpha (a) 278 + static getPixel(imageData, x, y) { 279 + // convert from [0, 1] to [0, width/height in pixel] 280 + x = Math.min(Math.floor(imageData.width * x), imageData.width - 1); 281 + y = Math.min(Math.floor(imageData.height * y), imageData.height - 1); 282 + 283 + let position = (x + imageData.width * y) * 4, 284 + data = imageData.data; 285 + 286 + let color = new THREE.Color( 287 + data[position], 288 + data[position + 1], 289 + data[position + 2] 290 + ); 291 + color.a = data[position + 3]; 292 + return color; 293 + } 294 + } 295 + 296 + function rectToTriangles( 297 + a: Vector3, 298 + b: Vector3, 299 + c: Vector3, 300 + d: Vector3, 301 + array: Vector3[] | undefined = undefined 302 + ) { 303 + array = array ?? []; 304 + array.push(a.clone(), d.clone(), c.clone(), a.clone(), c.clone(), b.clone()); 305 + return array; 306 + } 307 + 308 + function vertexForAngleHeightRadius(angle = 0, height = 0, radius = 1) { 309 + return new Vector3( 310 + Math.sin(angle) * radius, 311 + height, 312 + Math.cos(angle) * radius 313 + ); 314 + } 315 + */
+207
src/lib/3D/planet/helper/colorgradient.ts
··· 1 + import { Color } from 'three'; 2 + 3 + const noColor = new Color(0xff00cc); 4 + 5 + export type ColorGradientOptions = 6 + | { 7 + between?: ColorGradientBetweenOptions; 8 + min?: number; 9 + max?: number; 10 + stops?: ColorGradientStopOptions[]; 11 + hsl?: boolean; 12 + mod?: ModifierFunction; 13 + } 14 + | [number, number][]; 15 + 16 + type ModifierFunction = ((number: number) => number) | undefined; 17 + 18 + type ColorGradientStop = { 19 + position: number; 20 + value: Color | ColorGradient; 21 + mod: ModifierFunction; 22 + }; 23 + 24 + type ColorGradientBetweenOptions = (number | Color | ColorGradient | ColorGradientOptions)[]; 25 + 26 + type ColorGradientStopOptions = 27 + | ColorGradientStop 28 + | [number, number | Color | ColorGradient | ColorGradientOptions] 29 + | [number, number | Color | ColorGradient | ColorGradientOptions, ModifierFunction]; 30 + 31 + export class ColorGradient { 32 + stops: ColorGradientStop[]; 33 + hsl: boolean = false; 34 + 35 + isColorGradient: boolean = true; 36 + 37 + defaultMod: ModifierFunction = undefined; 38 + 39 + constructor(opts: ColorGradientOptions = {}) { 40 + this.stops = []; 41 + 42 + if (opts instanceof Array) opts = { stops: opts }; 43 + 44 + this.hsl = opts.hsl ?? false; 45 + 46 + this.defaultMod = opts.mod; 47 + 48 + if (opts.between) this.addBetween(opts.between, opts.min, opts.max); 49 + if (opts.stops) this.addStops(opts.stops); 50 + } 51 + 52 + addStops(arr: ColorGradientStopOptions[]) { 53 + for (const s of arr) { 54 + this.addStop(s); 55 + } 56 + } 57 + 58 + // add stops in even spacing between min and max 59 + addBetween(arr: ColorGradientBetweenOptions, min: number = -1, max: number = 1) { 60 + if (arr.length < 2) console.warn('ColorGradient: addBetween requires at least 2 stops'); 61 + 62 + const step = (max - min) / (arr.length - 1); 63 + for (let i = 0; i < arr.length; i++) { 64 + this.addStop([i * step + min, arr[i]]); 65 + } 66 + } 67 + 68 + addStop(stop: ColorGradientStopOptions) { 69 + let pos, mixObject, mod; 70 + 71 + if (stop instanceof Array) { 72 + pos = stop[0]; 73 + mixObject = stop[1]; 74 + if (stop.length > 2) mod = stop[2]; 75 + } else { 76 + pos = stop.position; 77 + mixObject = stop.value; 78 + mod = stop.mod; 79 + } 80 + 81 + if (typeof mixObject == 'number') { 82 + mixObject = new Color(mixObject); 83 + } else if (!(mixObject instanceof Color) && !(mixObject instanceof ColorGradient)) { 84 + mixObject = new ColorGradient(mixObject); 85 + } 86 + 87 + let i = 0; 88 + while (i < this.stops.length && pos > this.stops[i].position) i++; 89 + 90 + this.stops.splice(i, 0, { 91 + position: pos, 92 + value: mixObject, 93 + mod: mod 94 + }); 95 + } 96 + 97 + /** 98 + * get the color at a specific index 99 + * 100 + * @param i - index of the color 101 + * @param y 102 + * @param z 103 + * @param w 104 + * @returns 105 + */ 106 + colorAtIndex( 107 + i: number, 108 + y: number | undefined = undefined, 109 + z: number | undefined = undefined, 110 + w: number | undefined = undefined 111 + ): Color | undefined { 112 + if (i < 0 || i >= this.stops.length) return; 113 + 114 + let c = this.stops[i].value; 115 + if (c instanceof ColorGradient) { 116 + c = c.get(y, z, w); 117 + } else { 118 + c = c.clone(); 119 + } 120 + return c; 121 + } 122 + 123 + dimensions() { 124 + let maxD = 0; 125 + for (const s of this.stops) { 126 + if (s.value instanceof ColorGradient) { 127 + maxD = Math.max(s.value.dimensions(), maxD); 128 + } 129 + } 130 + return maxD + 1; 131 + } 132 + 133 + /** 134 + * mix between two colors at a specific index 135 + * 136 + * @param i - index of the first color 137 + * @param j - index of the second color 138 + * @param amt - amount to mix between the two colors (0-1) 139 + * @param y 140 + * @param z 141 + * @param w 142 + * @returns the mixed color 143 + */ 144 + mix( 145 + i: number, 146 + j: number, 147 + amt: number, 148 + y: number | undefined = undefined, 149 + z: number | undefined = undefined, 150 + w: number | undefined = undefined 151 + ): Color | undefined { 152 + if (i < 0 || i >= this.stops.length || j < 0 || j >= this.stops.length) return; 153 + 154 + amt = Math.min(Math.max(0, amt), 1); 155 + 156 + const firstColor = this.colorAtIndex(i, y, z, w); 157 + if (!firstColor) return; 158 + 159 + if (i == j) return firstColor; 160 + 161 + const stop = this.stops[j]; 162 + if (stop.mod) { 163 + amt = stop.mod(amt); 164 + } 165 + if (this.defaultMod) { 166 + amt = this.defaultMod(amt); 167 + } 168 + 169 + const secondColor = this.colorAtIndex(j, y, z, w); 170 + if (!secondColor) return firstColor; 171 + 172 + if (this.hsl) firstColor.lerpHSL(secondColor, amt); 173 + else firstColor.lerp(secondColor, amt); 174 + 175 + return firstColor; 176 + } 177 + 178 + get( 179 + x: number = 0, 180 + y: number | undefined = undefined, 181 + z: number | undefined = undefined, 182 + w: number | undefined = undefined 183 + ): Color { 184 + if (this.stops.length < 1) return noColor; 185 + 186 + if (x <= this.stops[0].position || this.stops.length == 1) 187 + return this.mix(0, 0, 0, y, z, w) ?? noColor; 188 + 189 + for (let i = 0; i < this.stops.length - 1; i++) { 190 + const s1 = this.stops[i].position, 191 + s2 = this.stops[i + 1].position; 192 + if (s1 <= x && x <= s2) { 193 + const amt = (x - s1) / (s2 - s1); 194 + return this.mix(i, i + 1, amt, y, z, w) ?? noColor; 195 + } 196 + } 197 + return this.mix(this.stops.length - 1, this.stops.length - 1, 0, y, z, w) ?? noColor; 198 + } 199 + 200 + static between(arr: ColorGradientBetweenOptions, min: number, max: number) { 201 + return new ColorGradient({ 202 + between: arr, 203 + min: min, 204 + max: max 205 + }); 206 + } 207 + }
+136
src/lib/3D/planet/nature/BirchTree.svelte
··· 1 + <!-- 2 + Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf 3 + Command: npx @threlte/gltf@2.0.1 nature_edit/BirchTree_Snow_1.gltf --types -s -T --root nature_edit/ 4 + --> 5 + 6 + <script lang="ts"> 7 + import type * as THREE from 'three'; 8 + import { Group } from 'three'; 9 + import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'; 10 + import { useGltf } from '@threlte/extras'; 11 + 12 + type $$Props = Props<THREE.Group> & { 13 + leafsColor?: THREE.Color | string | number; 14 + leafsDarkColor?: THREE.Color | string | number; 15 + barkColor?: THREE.Color | string | number; 16 + barkAccentColor?: THREE.Color | string | number; 17 + snowColor?: THREE.Color | string | number; 18 + variant?: 1 | 2 | 3 | 4 | 5; 19 + dead?: boolean; 20 + snow?: boolean; 21 + }; 22 + type $$Events = Events<THREE.Group>; 23 + type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any } }; 24 + 25 + export const ref = new Group(); 26 + 27 + export let leafsColor: THREE.Color | string | number | undefined = undefined; 28 + export let leafsDarkColor: THREE.Color | string | number | undefined = undefined; 29 + 30 + export let barkColor: THREE.Color | string | number | undefined = undefined; 31 + export let barkAccentColor: THREE.Color | string | number | undefined = undefined; 32 + 33 + export let snowColor: THREE.Color | string | number | undefined = undefined; 34 + 35 + export let variant: 1 | 2 | 3 | 4 | 5 = 1; 36 + 37 + export let dead: boolean = false; 38 + 39 + export let snow: boolean = false; 40 + 41 + type GLTFResult = { 42 + nodes: { 43 + BirchTree_1: THREE.Mesh; 44 + BirchTree_2: THREE.Mesh; 45 + BirchTree_3: THREE.Mesh; 46 + BirchTree_4: THREE.Mesh; 47 + BirchTree_5: THREE.Mesh; 48 + }; 49 + materials: { 50 + Bark: THREE.MeshStandardMaterial; 51 + BarkAccent: THREE.MeshStandardMaterial; 52 + LeavesAccent: THREE.MeshStandardMaterial; 53 + Leaves: THREE.MeshStandardMaterial; 54 + Snow: THREE.MeshStandardMaterial; 55 + }; 56 + }; 57 + 58 + const gltf = useGltf<GLTFResult>( 59 + `nature/BirchTree${snow && dead ? '_Dead_Snow' : snow ? '_Snow' : ''}_${variant}.glb`, 60 + { 61 + useDraco: true 62 + } 63 + ); 64 + 65 + const component = forwardEventHandlers(); 66 + </script> 67 + 68 + <T is={ref} dispose={false} {...$$restProps} bind:this={$component}> 69 + {#await gltf} 70 + <slot name="fallback" /> 71 + {:then gltf} 72 + <T.Group rotation={[-Math.PI / 2, 0, 0]} scale={100}> 73 + <T.Mesh 74 + castShadow 75 + receiveShadow 76 + geometry={gltf.nodes.BirchTree_1.geometry} 77 + material={gltf.materials.Bark.clone()} 78 + material.metalness={0} 79 + material.roughness={1.0} 80 + material.color={barkColor} 81 + /> 82 + <T.Mesh 83 + castShadow 84 + receiveShadow 85 + geometry={gltf.nodes.BirchTree_2.geometry} 86 + material={gltf.materials.BarkAccent.clone()} 87 + material.metalness={0} 88 + material.roughness={1.0} 89 + material.color={barkAccentColor} 90 + /> 91 + 92 + {#if dead && snow} 93 + <T.Mesh 94 + castShadow 95 + receiveShadow 96 + geometry={gltf.nodes.BirchTree_3.geometry} 97 + material={gltf.materials.Snow.clone()} 98 + material.color={snowColor} 99 + /> 100 + {:else if !dead} 101 + <T.Mesh 102 + castShadow 103 + receiveShadow 104 + geometry={gltf.nodes.BirchTree_3.geometry} 105 + material={gltf.materials.LeavesAccent.clone()} 106 + material.metalness={0} 107 + material.roughness={1.0} 108 + material.color={leafsDarkColor} 109 + /> 110 + <T.Mesh 111 + castShadow 112 + receiveShadow 113 + geometry={gltf.nodes.BirchTree_4.geometry} 114 + material={gltf.materials.Leaves.clone()} 115 + material.metalness={0} 116 + material.roughness={1.0} 117 + material.color={leafsColor} 118 + /> 119 + 120 + {#if snow} 121 + <T.Mesh 122 + castShadow 123 + receiveShadow 124 + geometry={gltf.nodes.BirchTree_5.geometry} 125 + material={gltf.materials.Snow.clone()} 126 + material.color={snowColor} 127 + /> 128 + {/if} 129 + {/if} 130 + </T.Group> 131 + {:catch error} 132 + <slot name="error" {error} /> 133 + {/await} 134 + 135 + <slot {ref} /> 136 + </T>
+93
src/lib/3D/planet/nature/Bush.svelte
··· 1 + <!-- 2 + Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf 3 + Command: npx @threlte/gltf@2.0.1 nature_edit/Bush_Snow_1.gltf --types -s -T --root nature_edit/ 4 + --> 5 + 6 + <script lang="ts"> 7 + import type * as THREE from 'three'; 8 + import { Group } from 'three'; 9 + import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'; 10 + import { useGltf } from '@threlte/extras'; 11 + 12 + type $$Props = Props<THREE.Group> & { 13 + color?: THREE.Color | string | number; 14 + berriesColor?: THREE.Color | string | number; 15 + snowColor?: THREE.Color | string | number; 16 + variant?: 1 | 2; 17 + berries?: boolean; 18 + snow?: boolean; 19 + }; 20 + type $$Events = Events<THREE.Group>; 21 + type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any } }; 22 + 23 + export const ref = new Group(); 24 + 25 + export let color: THREE.Color | string | number | undefined = undefined; 26 + 27 + export let berriesColor: THREE.Color | string | number | undefined = undefined; 28 + export let snowColor: THREE.Color | string | number | undefined = undefined; 29 + 30 + export let variant: 1 | 2 = 1; 31 + 32 + export let berries: boolean = false; 33 + export let snow: boolean = false; 34 + 35 + type GLTFResult = { 36 + nodes: { 37 + Bush_1: THREE.Mesh; 38 + Bush_2: THREE.Mesh; 39 + }; 40 + materials: { 41 + Bush: THREE.MeshStandardMaterial; 42 + Snow: THREE.MeshStandardMaterial; 43 + Berries: THREE.MeshStandardMaterial; 44 + }; 45 + }; 46 + 47 + const gltf = useGltf<GLTFResult>(`nature/Bush_${(snow ? 'Snow_' : 'Berries_') + variant}.glb`, { 48 + useDraco: true 49 + }); 50 + 51 + const component = forwardEventHandlers(); 52 + </script> 53 + 54 + <T is={ref} dispose={false} {...$$restProps} bind:this={$component}> 55 + {#await gltf} 56 + <slot name="fallback" /> 57 + {:then gltf} 58 + <T.Group rotation={[-Math.PI / 2, 0, 0]} scale={100}> 59 + <T.Mesh 60 + castShadow 61 + receiveShadow 62 + geometry={gltf.nodes.Bush_1.geometry} 63 + material={gltf.materials.Bush.clone()} 64 + material.metalness={0} 65 + material.roughness={1} 66 + material.color={color} 67 + /> 68 + {#if snow} 69 + <T.Mesh 70 + castShadow 71 + receiveShadow 72 + geometry={gltf.nodes.Bush_2.geometry} 73 + material={gltf.materials.Snow.clone()} 74 + material.color={snowColor} 75 + /> 76 + {:else if berries} 77 + <T.Mesh 78 + castShadow 79 + receiveShadow 80 + geometry={gltf.nodes.Bush_2.geometry} 81 + material={gltf.materials.Berries.clone()} 82 + material.metalness={0} 83 + material.roughness={1} 84 + material.color={berriesColor} 85 + /> 86 + {/if} 87 + </T.Group> 88 + {:catch error} 89 + <slot name="error" {error} /> 90 + {/await} 91 + 92 + <slot {ref} /> 93 + </T>
+78
src/lib/3D/planet/nature/Cactus.svelte
··· 1 + <!-- 2 + Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf 3 + Command: npx @threlte/gltf@2.0.1 nature_edit/Cactus_1.gltf --types -s -T --root nature_edit/ 4 + --> 5 + 6 + <script lang="ts"> 7 + import type * as THREE from 'three'; 8 + import { Group } from 'three'; 9 + import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'; 10 + import { useGltf } from '@threlte/extras'; 11 + 12 + type $$Props = Props<THREE.Group> & { 13 + color?: THREE.Color | string | number; 14 + flowerColor?: THREE.Color | string | number; 15 + variant?: 1 | 2 | 3 | 4 | 5; 16 + flower?: boolean; 17 + }; 18 + type $$Events = Events<THREE.Group>; 19 + type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any } }; 20 + 21 + export const ref = new Group(); 22 + 23 + export let color: THREE.Color | string | number | undefined = undefined; 24 + 25 + export let flowerColor: THREE.Color | string | number | undefined = undefined; 26 + 27 + export let variant: 1 | 2 | 3 | 4 | 5 = 1; 28 + 29 + export let flower: boolean = false; 30 + 31 + type GLTFResult = { 32 + nodes: { 33 + Cactus_1: THREE.Mesh; 34 + Cactus_2: THREE.Mesh; 35 + }; 36 + materials: { 37 + Cactus: THREE.MeshStandardMaterial; 38 + Flower: THREE.MeshStandardMaterial; 39 + }; 40 + }; 41 + 42 + const gltf = useGltf<GLTFResult>(`nature/Cactus_${variant}.glb`, { useDraco: true }); 43 + 44 + const component = forwardEventHandlers(); 45 + </script> 46 + 47 + <T is={ref} dispose={false} {...$$restProps} bind:this={$component}> 48 + {#await gltf} 49 + <slot name="fallback" /> 50 + {:then gltf} 51 + <T.Group rotation={[-Math.PI / 2, 0, 0]} scale={100}> 52 + <T.Mesh 53 + castShadow 54 + receiveShadow 55 + geometry={gltf.nodes.Cactus_1.geometry} 56 + material={gltf.materials.Cactus.clone()} 57 + material.metalness={0} 58 + material.roughness={1} 59 + material.color={color} 60 + /> 61 + {#if flower} 62 + <T.Mesh 63 + castShadow 64 + receiveShadow 65 + geometry={gltf.nodes.Cactus_2.geometry} 66 + material={gltf.materials.Flower.clone()} 67 + material.metalness={0} 68 + material.roughness={1} 69 + material.color={flowerColor} 70 + /> 71 + {/if} 72 + </T.Group> 73 + {:catch error} 74 + <slot name="error" {error} /> 75 + {/await} 76 + 77 + <slot {ref} /> 78 + </T>
+139
src/lib/3D/planet/nature/CommonTree.svelte
··· 1 + <!-- 2 + Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf 3 + Command: npx @threlte/gltf@2.0.1 nature_edit/CommonTree_1.gltf --types -s -T --root nature_edit/ 4 + --> 5 + 6 + <script lang="ts"> 7 + import type * as THREE from 'three'; 8 + import { Group } from 'three'; 9 + import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'; 10 + import { useGltf } from '@threlte/extras'; 11 + 12 + type $$Props = Props<THREE.Group> & { 13 + leafsColor?: THREE.Color | string | number; 14 + leafsDarkColor?: THREE.Color | string | number; 15 + barkColor?: THREE.Color | string | number; 16 + snowColor?: THREE.Color | string | number; 17 + variant?: 1 | 2 | 3 | 4 | 5; 18 + dead?: boolean; 19 + snow?: boolean; 20 + }; 21 + type $$Events = Events<THREE.Group>; 22 + type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any } }; 23 + 24 + export const ref = new Group(); 25 + 26 + export let leafsColor: THREE.Color | string | number | undefined = undefined; 27 + export let leafsDarkColor: THREE.Color | string | number | undefined = undefined; 28 + 29 + export let barkColor: THREE.Color | string | number | undefined = undefined; 30 + 31 + export let snowColor: THREE.Color | string | number | undefined = undefined; 32 + 33 + export let variant: 1 | 2 | 3 | 4 | 5 = 1; 34 + 35 + export let dead: boolean = false; 36 + 37 + export let snow: boolean = false; 38 + 39 + type GLTFResult = { 40 + nodes: { 41 + CommonTree_1: THREE.Mesh; 42 + CommonTree_2: THREE.Mesh; 43 + CommonTree_3: THREE.Mesh; 44 + CommonTree_4: THREE.Mesh; 45 + }; 46 + materials: { 47 + Wood: THREE.MeshStandardMaterial; 48 + LeavesAccent: THREE.MeshStandardMaterial; 49 + Snow: THREE.MeshStandardMaterial; 50 + Leaves: THREE.MeshStandardMaterial; 51 + }; 52 + }; 53 + 54 + const gltf = useGltf<GLTFResult>( 55 + `nature/CommonTree${snow && dead ? '_Dead_Snow' : snow ? '_Snow' : ''}_${variant}.glb`, 56 + { useDraco: true } 57 + ); 58 + 59 + const component = forwardEventHandlers(); 60 + </script> 61 + 62 + <T is={ref} dispose={false} {...$$restProps} bind:this={$component}> 63 + {#await gltf} 64 + <slot name="fallback" /> 65 + {:then gltf} 66 + <T.Group rotation={[-Math.PI / 2, 0, 0]} scale={100}> 67 + <T.Mesh 68 + castShadow 69 + receiveShadow 70 + geometry={gltf.nodes.CommonTree_1.geometry} 71 + material={gltf.materials.Wood} 72 + material.metalness={0} 73 + material.roughness={1.0} 74 + material.color={barkColor} 75 + /> 76 + {#if !dead} 77 + <T.Mesh 78 + castShadow 79 + receiveShadow 80 + geometry={gltf.nodes.CommonTree_2.geometry} 81 + material={gltf.materials.Leaves} 82 + material.metalness={0} 83 + material.roughness={1.0} 84 + material.color={leafsColor} 85 + /> 86 + {/if} 87 + {#if snow && dead} 88 + <T.Mesh 89 + castShadow 90 + receiveShadow 91 + geometry={gltf.nodes.CommonTree_2.geometry} 92 + material={gltf.materials.Snow} 93 + material.metalness={0} 94 + material.roughness={1.0} 95 + material.color={snowColor} 96 + /> 97 + {/if} 98 + {#if !snow && !dead && gltf.nodes.CommonTree_3} 99 + <T.Mesh 100 + castShadow 101 + receiveShadow 102 + geometry={gltf.nodes.CommonTree_3.geometry} 103 + material={gltf.materials.LeavesAccent} 104 + material.metalness={0} 105 + material.roughness={1.0} 106 + material.color={leafsDarkColor} 107 + /> 108 + {/if} 109 + 110 + {#if snow} 111 + <T.Mesh 112 + castShadow 113 + receiveShadow 114 + geometry={gltf.nodes.CommonTree_3.geometry} 115 + material={gltf.materials.Snow} 116 + material.metalness={0} 117 + material.roughness={1.0} 118 + material.color={snowColor} 119 + /> 120 + {/if} 121 + {#if snow} 122 + <T.Mesh 123 + castShadow 124 + receiveShadow 125 + geometry={gltf.nodes.CommonTree_4.geometry} 126 + material={gltf.materials.LeavesAccent} 127 + material.metalness={0} 128 + material.roughness={1.0} 129 + material.color={leafsDarkColor} 130 + /> 131 + {/if} 132 + <!-- <T.Mesh castShadow receiveShadow geometry={gltf.nodes.CommonTree_4.geometry} material={gltf.materials.Leaves} /> --> 133 + </T.Group> 134 + {:catch error} 135 + <slot name="error" {error} /> 136 + {/await} 137 + 138 + <slot {ref} /> 139 + </T>
+105
src/lib/3D/planet/nature/PalmTree.svelte
··· 1 + <!-- 2 + Auto-generated by: https://github.com/threlte/threlte/tree/main/packages/gltf 3 + Command: npx @threlte/gltf@2.0.1 nature_edit/PalmTree_1.gltf --types -s -T --root nature_edit/ 4 + --> 5 + 6 + <script lang="ts"> 7 + import type * as THREE from 'three'; 8 + import { Group } from 'three'; 9 + import { T, type Props, type Events, type Slots, forwardEventHandlers } from '@threlte/core'; 10 + import { useGltf } from '@threlte/extras'; 11 + 12 + type $$Props = Props<THREE.Group> & { 13 + leafsColor?: THREE.Color | string | number; 14 + leafsDarkColor?: THREE.Color | string | number; 15 + barkColor?: THREE.Color | string | number; 16 + coconutColor?: THREE.Color | string | number; 17 + variant?: 1 | 2 | 3 | 4; 18 + coconuts?: boolean; 19 + } 20 + type $$Events = Events<THREE.Group>; 21 + type $$Slots = Slots<THREE.Group> & { fallback: {}; error: { error: any } }; 22 + 23 + export const ref = new Group(); 24 + 25 + 26 + export let leafsColor: THREE.Color | string | number | undefined = undefined; 27 + export let leafsDarkColor: THREE.Color | string | number | undefined = undefined; 28 + 29 + export let barkColor: THREE.Color | string | number | undefined = undefined; 30 + export let coconutColor: THREE.Color | string | number | undefined = undefined; 31 + 32 + export let variant: 1 | 2 | 3 | 4 = 1; 33 + 34 + export let coconuts: boolean = false; 35 + 36 + type GLTFResult = { 37 + nodes: { 38 + PalmTree_1: THREE.Mesh; 39 + PalmTree_2: THREE.Mesh; 40 + PalmTree_3: THREE.Mesh; 41 + PalmTree_4: THREE.Mesh; 42 + }; 43 + materials: { 44 + Bark: THREE.MeshStandardMaterial; 45 + Leaves: THREE.MeshStandardMaterial; 46 + LeavesAccent: THREE.MeshStandardMaterial; 47 + Coconuts: THREE.MeshStandardMaterial; 48 + }; 49 + }; 50 + 51 + const gltf = useGltf<GLTFResult>(`nature/PalmTree_${variant}.glb`, { useDraco: true }); 52 + 53 + const component = forwardEventHandlers(); 54 + </script> 55 + 56 + <T is={ref} dispose={false} {...$$restProps} bind:this={$component}> 57 + {#await gltf} 58 + <slot name="fallback" /> 59 + {:then gltf} 60 + <T.Group rotation={[-Math.PI / 2, 0, 0]} scale={100}> 61 + <T.Mesh 62 + castShadow 63 + receiveShadow 64 + geometry={gltf.nodes.PalmTree_1.geometry} 65 + material={gltf.materials.Bark.clone()} 66 + material.metalness={0} 67 + material.roughness={1} 68 + material.color={barkColor} 69 + /> 70 + <T.Mesh 71 + castShadow 72 + receiveShadow 73 + geometry={gltf.nodes.PalmTree_2.geometry} 74 + material={gltf.materials.Leaves.clone()} 75 + material.metalness={0} 76 + material.roughness={1} 77 + material.color={leafsColor} 78 + /> 79 + <T.Mesh 80 + castShadow 81 + receiveShadow 82 + geometry={gltf.nodes.PalmTree_3.geometry} 83 + material={gltf.materials.LeavesAccent.clone()} 84 + material.metalness={0} 85 + material.roughness={1} 86 + material.color={leafsDarkColor} 87 + /> 88 + {#if coconuts && (variant === 4 || variant === 3)} 89 + <T.Mesh 90 + castShadow 91 + receiveShadow 92 + geometry={gltf.nodes.PalmTree_4.geometry} 93 + material={gltf.materials.Coconuts.clone()} 94 + material.metalness={0} 95 + material.roughness={1} 96 + material.color={coconutColor} 97 + /> 98 + {/if} 99 + </T.Group> 100 + {:catch error} 101 + <slot name="error" {error} /> 102 + {/await} 103 + 104 + <slot {ref} /> 105 + </T>
+602
src/lib/3D/planet/noise/uber-noise.ts
··· 1 + import { 2 + type NoiseFunction2D, 3 + type NoiseFunction3D, 4 + type NoiseFunction4D, 5 + createNoise2D, 6 + createNoise3D, 7 + createNoise4D 8 + } from 'simplex-noise'; 9 + import alea from 'alea'; 10 + 11 + /** 12 + * 13 + * @property {number} seed - seed for the noise, if not provided, Math.random() will be used, 14 + * currently same results can only be guaranteed for newly created noise objects with same seed 15 + * (as opposed to an old noise object where you changed the seed) 16 + * 17 + * @property {number} min - minimun value of noise 18 + * @property {number} max - maximum value of noise 19 + * 20 + * @property {number} scale - scale of the noise 21 + * @property {number} power - power of the noise (1 = linear, 2 = quadratic, etc) 22 + * @property {Vector} shift - move noise in 2D, 3D or 4D space 23 + * 24 + * @property {number} octaves - number of layers for fbm noise 25 + * @property {number} gain - how much to multiply amplitude per layer 26 + * @property {number} lacunarity - how much to multiply scale per layer 27 + * @property {array} amps - array of amplitudes for each layer 28 + * @property {number} erosion - how much previous layers influence amplitude of later layers 29 + * @property {number} sharpness - billowed or rigded noise (0 = normal, 1 = billowed, -1 = ridged) 30 + * @property {number} steps - will turn noise into steps (integer, number of steps) 31 + * 32 + * @property {number} warp - how much to warp the noise 33 + * @property {number} warpNoise - noise to warp the noise with 34 + * @property {number} warp2 - second warp, can only be used if warp is used too 35 + * @property {number} warpNoise2 - second warp noise 36 + * 37 + * @property {boolean} invert - invert the noise 38 + * @property {boolean} abs - absolute value of the noise 39 + * @property {boolean} clamp - clamp the noise between min and max 40 + * @property {boolean} tileX - tile the noise in x direction 41 + * @property {boolean} tileY - tile the noise in y direction 42 + * @property {boolean} tile - tile the noise in all directions (will override tileX and tileY) 43 + * 44 + * @constructor 45 + */ 46 + 47 + function lerp(a: number, b: number, t: number): number { 48 + return (b - a) * t + a; 49 + } 50 + 51 + function setLength(vector: number[], length: number): number[] { 52 + const oldLength = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0)); 53 + if (oldLength === 0) return vector; 54 + const scale = length / oldLength; 55 + return vector.map((v) => v * scale); 56 + } 57 + 58 + // angle between two 3D vectors 59 + function angleTo(a: number[], b: number[]): number { 60 + const dot = a.reduce((sum, v, i) => sum + v * b[i], 0); 61 + const length = Math.sqrt( 62 + a.reduce((sum, v) => sum + v * v, 0) * b.reduce((sum, v) => sum + v * v, 0) 63 + ); 64 + return Math.acos(dot / length); 65 + } 66 + 67 + type ErosionUpFunction = (derivative: number[]) => number[]; 68 + 69 + export type VectorObject = { 70 + x: number; 71 + y: number; 72 + z?: number; 73 + w?: number; 74 + }; 75 + 76 + export type NoiseParameterInput = number | UberNoise | UberNoiseOptions; 77 + export type NoiseParameter = number | UberNoise; 78 + 79 + export type UberNoiseOptions = { 80 + seed?: string | number; 81 + 82 + min?: NoiseParameterInput; 83 + max?: NoiseParameterInput; 84 + 85 + scale?: NoiseParameterInput; 86 + power?: NoiseParameterInput; 87 + 88 + shift?: number[]; 89 + 90 + octaves?: number; 91 + gain?: NoiseParameterInput; 92 + lacunarity?: NoiseParameterInput; 93 + 94 + amps?: number[]; 95 + 96 + layers?: UberNoiseOptions[]; 97 + 98 + erosion?: NoiseParameterInput; 99 + erosionUp?: ErosionUpFunction; 100 + 101 + sharpness?: NoiseParameterInput; 102 + steps?: NoiseParameterInput; 103 + warp?: NoiseParameterInput; 104 + warpNoise?: UberNoise; 105 + warp2?: NoiseParameterInput; 106 + warpNoise2?: UberNoise; 107 + 108 + invert?: boolean; 109 + abs?: boolean; 110 + clamp?: boolean; 111 + tileX?: boolean; 112 + tileY?: boolean; 113 + tile?: boolean; 114 + }; 115 + 116 + export class UberNoise { 117 + private noise2D: NoiseFunction2D | undefined; 118 + private noise3D: NoiseFunction3D | undefined; 119 + private noise4D: NoiseFunction4D | undefined; 120 + private seed: string | number; 121 + 122 + private _min: NoiseParameter = -1; 123 + private _max: NoiseParameter = 1; 124 + 125 + private _scale: NoiseParameter = 1; 126 + private _power: NoiseParameter = 1; 127 + 128 + private shift: number[] = []; 129 + 130 + private octaves = 0; 131 + private _gain: NoiseParameter = 0.5; 132 + private _lacunarity: NoiseParameter = 2; 133 + 134 + private amps: number[] = []; 135 + 136 + private _erosion: NoiseParameter = 0; 137 + private _sharpness: NoiseParameter = 0; 138 + private _steps: NoiseParameter = 0; 139 + 140 + private _warp: NoiseParameter = 0; 141 + private _warpNoise: UberNoise | undefined; 142 + private _warp2: NoiseParameter = 0; 143 + private _warpNoise2: UberNoise | undefined; 144 + 145 + private tileX = false; 146 + private tileY = false; 147 + 148 + private erosionDelta = 0; 149 + private erosionDerivative?: number[] = undefined; 150 + private erosionUp?: ErosionUpFunction; 151 + 152 + private static erosionDefaultUp = [0, 0, 1]; 153 + 154 + private position = [0, 0]; 155 + 156 + private pngr; 157 + 158 + private layers: UberNoise[] = []; 159 + 160 + constructor(options: UberNoiseOptions = {}) { 161 + this.seed = options.seed ?? Math.random(); 162 + this.pngr = alea(this.seed); 163 + 164 + this.min = options.min ?? -1; 165 + this.max = options.max ?? 1; 166 + 167 + this.scale = options.scale ?? 1; 168 + this.power = options.power ?? 1; 169 + 170 + this.octaves = options.octaves ?? options.layers?.length ?? 0; 171 + this.gain = options.gain ?? 0.5; 172 + this.lacunarity = options.lacunarity ?? 2; 173 + 174 + this.erosion = options.erosion ?? 0; 175 + this.sharpness = options.sharpness ?? 0; 176 + this.steps = options.steps ?? 0; 177 + 178 + this.warp = options.warp ?? 0; 179 + this.warpNoise = options.warpNoise; 180 + this.warp2 = options.warp2 ?? 0; 181 + this.warpNoise2 = options.warpNoise2; 182 + 183 + this.processLayers(options); 184 + 185 + this.tileX = options.tileX ?? options.tile ?? false; 186 + this.tileY = options.tileY ?? options.tile ?? false; 187 + } 188 + 189 + processLayers(options: UberNoiseOptions) { 190 + this.amps = options.amps ?? []; 191 + 192 + for (let i = 0; i < this.octaves; i++) { 193 + const layerOptions = options.layers?.[i] ?? {}; 194 + if (layerOptions instanceof UberNoise) { 195 + this.layers[i] = layerOptions; 196 + } else { 197 + if (layerOptions.seed === undefined) layerOptions.seed = this.pngr(); 198 + this.layers[i] = new UberNoise(layerOptions); 199 + } 200 + } 201 + if (this.layers.length == 0) { 202 + this.noise2D = createNoise2D(this.pngr); 203 + this.noise3D = createNoise3D(this.pngr); 204 + this.noise4D = createNoise4D(this.pngr); 205 + } 206 + } 207 + 208 + // same as normalized but returns between min and max 209 + get( 210 + x: number | VectorObject | Array<number>, 211 + y: number | undefined = undefined, 212 + z: number | undefined = undefined, 213 + w: number | undefined = undefined 214 + ): number { 215 + const norm = this.normalized(x, y, z, w); 216 + return this.toMinMax(norm); 217 + } 218 + 219 + // same as get but returns between -1 and 1 220 + normalized( 221 + x: number | VectorObject | Array<number>, 222 + y: number | undefined = undefined, 223 + z: number | undefined = undefined, 224 + w: number | undefined = undefined 225 + ): number { 226 + // if x is an array, treat it as a vector 227 + if (Array.isArray(x)) { 228 + w = x[3]; 229 + z = x[2]; 230 + y = x[1]; 231 + x = x[0]; 232 + } else if (typeof x === 'object') { 233 + w = x.w; 234 + z = x.z; 235 + y = x.y; 236 + x = x.x; 237 + } 238 + // if y is undefined, treat it as 2D noise with y = 0 239 + y = y ?? 0; 240 + 241 + return this.getNoise(x, y, z, w); 242 + } 243 + 244 + private warpPosition(warp: number, warpNoise: UberNoise | undefined) { 245 + if (warp == undefined || warp == 0) return; 246 + 247 + if (warpNoise != undefined) warpNoise.position = this.position; 248 + 249 + let x = this.position[0], 250 + y = this.position[1], 251 + z = this.position[2], 252 + w = this.position[3]; 253 + 254 + const noise = warpNoise ?? this; 255 + const scl = this.scale; 256 + 257 + this.position = [x + 54.47 * scl, y + 34.98 * scl]; 258 + if (z != undefined) this.position.push(z + 21.63 * scl); 259 + if (w != undefined) this.position.push(w + 67.1 * scl); 260 + 261 + x += noise.getFBM() * warp; 262 + y += noise.getFBM() * warp; 263 + if (z != undefined) z += noise.getFBM() * warp; 264 + if (w != undefined) w += noise.getFBM() * warp; 265 + 266 + this.position = [x, y, z, w]; 267 + } 268 + 269 + private tilePosition() { 270 + if (!this.tileX && !this.tileY) return; 271 + const x = this.position[0]; 272 + const y = this.position[1]; 273 + let newX = 0, 274 + newY = 0, 275 + newZ = 0, 276 + newW = 0; 277 + if (this.tileX) { 278 + newX = Math.sin(x * Math.PI * 2); 279 + newY = Math.cos(x * Math.PI * 2); 280 + } 281 + if (this.tileY) { 282 + newZ = Math.sin(y * Math.PI * 2); 283 + newW = Math.cos(y * Math.PI * 2); 284 + } 285 + if (this.tileX && !this.tileY) { 286 + this.position = [newX, newY + y]; 287 + } else if (this.tileY && !this.tileX) { 288 + this.position = [newZ + x, newW]; 289 + } else if (this.tileX && this.tileY) { 290 + this.position = [newX, newY, newZ, newW]; 291 + } 292 + } 293 + 294 + private getDerivative( 295 + x: number, 296 + y: number, 297 + z: number, 298 + n: number | undefined = undefined 299 + ): number[] | undefined { 300 + // left side or central difference 301 + // very expensive (four/six noise calls), should be changed to analytical derivatives 302 + // see https://iquilezles.org/www/articles/morenoise/morenoise.htm 303 + 304 + if (z == undefined) return undefined; 305 + 306 + const mov = this.erosionDelta; 307 + 308 + const dx = (n ?? this.get(x - mov, y, z)) - this.get(x + mov, y, z); 309 + const dy = (n ?? this.get(x, y - mov, z)) - this.get(x, y + mov, z); 310 + const dz = (n ?? this.get(x, y, z - mov)) - this.get(x, y, z + mov); 311 + 312 + this.erosionDerivative = [dx, dy, dz]; 313 + return this.erosionDerivative; 314 + } 315 + 316 + private getBaseLayer(scale: number, x: number, y: number, z?: number, w?: number): number { 317 + if (z != undefined && w != undefined && this.noise4D != undefined) { 318 + return this.noise4D(x * scale, y * scale, z * scale, w * scale); 319 + } 320 + if (z != undefined && this.noise3D != undefined) { 321 + return this.noise3D(x * scale, y * scale, z * scale); 322 + } 323 + if (this.noise2D != undefined) { 324 + return this.noise2D(x * scale, y * scale); 325 + } 326 + return 0; 327 + } 328 + 329 + private getFBM(useErosion = false): number { 330 + const x = this.position[0], 331 + y = this.position[1], 332 + z = this.position[2], 333 + w = this.position[3]; 334 + 335 + const scale = this.scale; 336 + 337 + if (this.layers.length === 0) { 338 + return this.getBaseLayer(scale, x, y, z, w); 339 + } 340 + 341 + let maxAmp = 1; 342 + let amp = 1, 343 + freq = scale; 344 + 345 + const lacunarity = this.lacunarity; 346 + const gain = this.gain; 347 + 348 + // for now we'll always ignore erosion 349 + // remove the following line later to enable erosion 350 + useErosion = false; 351 + const erosion = useErosion ? this.erosion : 0; 352 + const up = 353 + this.erosionUp != undefined ? this.erosionUp(this.position) : UberNoise.erosionDefaultUp; 354 + const sum = [0, 0, 0]; 355 + 356 + let n = 0; 357 + 358 + for (let i = 0; i < this.octaves; i++) { 359 + const layer = this.layers[i]; 360 + 361 + const layerAmp = this.amps[i] ?? 1; 362 + 363 + const value = 364 + layer.get( 365 + x * freq, 366 + y * freq, 367 + z != undefined ? z * freq : undefined, 368 + w != undefined ? w * freq : undefined 369 + ) * 370 + amp * 371 + layerAmp; 372 + if (erosion > 0) { 373 + const derivative = layer.getDerivative(x * freq, y * freq, z * freq); 374 + 375 + if (derivative != undefined) { 376 + setLength(derivative, amp * layerAmp); 377 + sum[0] += derivative[0]; 378 + sum[1] += derivative[1]; 379 + sum[2] += derivative[2]; 380 + 381 + const mult = Math.abs(1 - angleTo(up, sum) / Math.PI); 382 + 383 + n += value * (mult * erosion + 1 - erosion); 384 + } 385 + } else { 386 + n += value; 387 + } 388 + 389 + amp *= gain; 390 + freq *= lacunarity; 391 + maxAmp += amp * layerAmp; 392 + } 393 + return n / maxAmp; 394 + } 395 + 396 + private getNoise( 397 + x: number, 398 + y: number, 399 + z: number | undefined = undefined, 400 + w: number | undefined = undefined 401 + ): number { 402 + // set position 403 + this.position[0] = x; 404 + this.position[1] = y; 405 + if (z !== undefined) { 406 + this.position[2] = z; 407 + } 408 + if (w !== undefined) { 409 + this.position[3] = w; 410 + } 411 + 412 + // apply shift 413 + const shift = this.shift; 414 + if (shift !== undefined) { 415 + for (let i = 0; i < this.position.length && i < shift.length; i++) { 416 + this.position[i] += shift[i]; 417 + } 418 + } 419 + 420 + // apply tiling 421 + this.tilePosition(); 422 + 423 + // apply warp 424 + this.warpPosition(this.warp, this.warpNoise); 425 + this.warpPosition(this.warp2, this.warpNoise2); 426 + 427 + let norm = this.getFBM(true); 428 + 429 + // apply power 430 + const power = this.power; 431 + if (power != 1) { 432 + // convert to [0 - 1], apply power and back to [-1, 1] 433 + norm = (Math.pow((norm + 1) * 0.5, power) - 0.5) * 2; 434 + } 435 + 436 + // apply sharpness 437 + const sharpness = this.sharpness; 438 + if (sharpness != 0) { 439 + const billow = (Math.abs(norm) - 0.5) * 2; 440 + const ridged = (0.5 - Math.abs(norm)) * 2; 441 + 442 + norm = lerp(norm, billow, Math.max(0, sharpness)); 443 + norm = lerp(norm, ridged, Math.max(0, -sharpness)); 444 + } 445 + 446 + // apply steps 447 + const steps = this.steps; 448 + if (steps != 0) { 449 + // convert from -1 to 1 to 0 to 1 450 + norm = (norm + 1) * 0.5; 451 + // apply steps 452 + norm = Math.floor(norm * steps) / steps; 453 + // convert back to -1 to 1 454 + norm = norm * 2 - 1; 455 + } 456 + 457 + return norm; 458 + } 459 + 460 + /** 461 + * value between min and max to normalized value between -1 and 1 462 + * 463 + * @param value {number} 464 + * @returns {number} 465 + */ 466 + toNormalized(value: number): number { 467 + return ((value - this.min) / (this.max - this.min)) * 2 - 1; 468 + } 469 + 470 + /** 471 + * normlized value to value between min and max 472 + * 473 + * @param value {number} 474 + * @returns {number} 475 + */ 476 + toMinMax(value: number): number { 477 + return (value + 1) * 0.5 * (this.max - this.min) + this.min; 478 + } 479 + 480 + private checkParameterInput(value: NoiseParameterInput): UberNoise | number { 481 + if (typeof value === 'object' && !(value instanceof UberNoise)) { 482 + if (value.seed === undefined) { 483 + value.seed = this.pngr(); 484 + } 485 + value = new UberNoise(value); 486 + } 487 + return value; 488 + } 489 + 490 + private getParameter(value: NoiseParameter): number { 491 + if (typeof value === 'number') { 492 + return value; 493 + } 494 + return value.get(this.position); 495 + } 496 + 497 + // getter and setter for min and max 498 + get min(): number { 499 + return this.getParameter(this._min); 500 + } 501 + set min(value: NoiseParameterInput) { 502 + this._min = this.checkParameterInput(value); 503 + } 504 + get max(): number { 505 + return this.getParameter(this._max); 506 + } 507 + set max(value: NoiseParameterInput) { 508 + this._max = this.checkParameterInput(value); 509 + } 510 + 511 + // getter and setter for scale and power 512 + get scale(): number { 513 + return this.getParameter(this._scale); 514 + } 515 + set scale(value: NoiseParameterInput) { 516 + this._scale = this.checkParameterInput(value); 517 + } 518 + get power(): number { 519 + return this.getParameter(this._power); 520 + } 521 + set power(value: NoiseParameterInput) { 522 + this._power = this.checkParameterInput(value); 523 + } 524 + 525 + // getter and setter for gain and lacunarity 526 + get gain(): number { 527 + return this.getParameter(this._gain); 528 + } 529 + set gain(value: NoiseParameterInput) { 530 + this._gain = this.checkParameterInput(value); 531 + } 532 + get lacunarity(): number { 533 + return this.getParameter(this._lacunarity); 534 + } 535 + set lacunarity(value: NoiseParameterInput) { 536 + this._lacunarity = this.checkParameterInput(value); 537 + } 538 + 539 + // getter and setter for erosion, sharpness and steps 540 + get erosion(): number { 541 + return this.getParameter(this._erosion); 542 + } 543 + set erosion(value: NoiseParameterInput) { 544 + this._erosion = this.checkParameterInput(value); 545 + } 546 + get sharpness(): number { 547 + return this.getParameter(this._sharpness); 548 + } 549 + set sharpness(value: NoiseParameterInput) { 550 + this._sharpness = this.checkParameterInput(value); 551 + } 552 + get steps(): number { 553 + return Math.round(this.getParameter(this._steps)); 554 + } 555 + set steps(value: NoiseParameterInput) { 556 + this._steps = this.checkParameterInput(value); 557 + } 558 + 559 + // getter and setter for warp, warpNoise, warp2 and warpNoise2 560 + get warp(): number { 561 + return this.getParameter(this._warp); 562 + } 563 + set warp(value: NoiseParameterInput) { 564 + this._warp = this.checkParameterInput(value); 565 + } 566 + get warpNoise(): UberNoise | undefined { 567 + return this._warpNoise; 568 + } 569 + set warpNoise(value: UberNoise | UberNoiseOptions | undefined) { 570 + if (value == undefined) { 571 + this._warpNoise = undefined; 572 + return; 573 + } 574 + 575 + const processed = this.checkParameterInput(value); 576 + if (processed instanceof UberNoise) { 577 + this._warpNoise = processed; 578 + } 579 + } 580 + get warp2(): number { 581 + return this.getParameter(this._warp2); 582 + } 583 + set warp2(value: NoiseParameterInput) { 584 + this._warp2 = this.checkParameterInput(value); 585 + } 586 + get warpNoise2(): UberNoise | undefined { 587 + return this._warpNoise2; 588 + } 589 + set warpNoise2(value: UberNoise | UberNoiseOptions | undefined) { 590 + if (value == undefined) { 591 + this._warpNoise2 = undefined; 592 + return; 593 + } 594 + 595 + const processed = this.checkParameterInput(value); 596 + if (processed instanceof UberNoise) { 597 + this._warpNoise2 = processed; 598 + } 599 + } 600 + } 601 + 602 + export default UberNoise;
+93
src/lib/3D/planet/worlds/biome.ts
··· 1 + /* 2 + 3 + a biome has a collection of items that can be found in it 4 + a height map and a color map 5 + 6 + */ 7 + import { UberNoise, type UberNoiseOptions } from '../noise/uber-noise'; 8 + import { Color, Vector3 } from 'three'; 9 + 10 + import { ColorGradient, type ColorGradientOptions } from '../helper/colorgradient'; 11 + 12 + export type BiomeOptions = { 13 + name?: string; 14 + 15 + preset?: string; 16 + 17 + noise?: UberNoiseOptions; 18 + colors?: ColorGradientOptions; 19 + 20 + vegetation?: { 21 + density: number; 22 + items: { 23 + name: string; 24 + chance: number; 25 + }[]; 26 + }; 27 + }; 28 + 29 + const biomePresets: Record<string, BiomeOptions> = { 30 + test: { 31 + noise: { 32 + min: 0, 33 + max: 0.1, 34 + octaves: 4, 35 + lacunarity: 2.0, 36 + gain: { 37 + min: 0.01, 38 + max: 0.8, 39 + scale: 2 40 + }, 41 + warp: 0.2, 42 + scale: 1.5, 43 + seed: 0 44 + }, 45 + colors: [ 46 + [0.0, 0xccaa00], 47 + [0.2, 0xccaa00], 48 + [0.6, 0x007700], 49 + [1.0, 0x006622] 50 + ] 51 + } 52 + }; 53 + 54 + export class Biome { 55 + noise: UberNoise | undefined; 56 + 57 + colors: ColorGradient | undefined; 58 + 59 + constructor(opts: BiomeOptions = {}) { 60 + if (opts.preset) { 61 + const preset = biomePresets[opts.preset]; 62 + if (preset) { 63 + opts = { 64 + ...preset, 65 + ...opts 66 + }; 67 + } 68 + } 69 + 70 + if (opts.noise) this.noise = new UberNoise(opts.noise); 71 + 72 + if (opts.colors) { 73 + this.colors = new ColorGradient(opts.colors); 74 + 75 + console.log(this.colors); 76 + } 77 + } 78 + 79 + getHeight(pos: Vector3): number | undefined { 80 + if (this.noise) return this.noise.get(pos); 81 + 82 + return undefined; 83 + } 84 + 85 + getColor(pos: Vector3): Color | undefined { 86 + if (this.noise && this.colors) { 87 + const alpha = (this.noise.normalized(pos) + 1) * 0.5; 88 + return this.colors.get(alpha); 89 + } 90 + 91 + return undefined; 92 + } 93 + }
+111
src/lib/3D/planet/worlds/planet.ts
··· 1 + import { Biome, type BiomeOptions } from './biome'; 2 + import { ModifiedGeometry, type ModifiedGeometryOptions } from '../geometry/geometry-modifier'; 3 + import { Color, Mesh, IcosahedronGeometry, MeshStandardMaterial } from 'three'; 4 + import UberNoise, { type UberNoiseOptions } from '../noise/uber-noise'; 5 + import { ColorGradient, type ColorGradientOptions } from '../helper/colorgradient'; 6 + 7 + export type PlanetOptions = { 8 + scatter?: number; 9 + 10 + ground?: number; 11 + 12 + ocean?: { 13 + level: number; 14 + 15 + colors: [number, number][]; 16 + 17 + noise: UberNoiseOptions; 18 + }; 19 + }; 20 + 21 + export class Planet { 22 + baseGeometry: ModifiedGeometry; 23 + modifiedGeometry: ModifiedGeometry; 24 + oceanGeometry: ModifiedGeometry; 25 + 26 + mesh: Mesh | undefined; 27 + 28 + biome: Biome; 29 + 30 + options: PlanetOptions; 31 + 32 + ground: number; 33 + 34 + constructor( 35 + biomeOptions: BiomeOptions, 36 + planetOptions: PlanetOptions = {}, 37 + shapeOptions: ModifiedGeometryOptions = { 38 + geometry: new IcosahedronGeometry(1, 30) 39 + } 40 + ) { 41 + this.options = planetOptions; 42 + 43 + this.baseGeometry = new ModifiedGeometry(shapeOptions); 44 + this.modifiedGeometry = new ModifiedGeometry(shapeOptions); 45 + 46 + this.oceanGeometry = new ModifiedGeometry(shapeOptions); 47 + 48 + this.biome = new Biome(biomeOptions); 49 + 50 + this.ground = this.options.ground ?? 1.0; 51 + } 52 + 53 + createMesh(): Mesh { 54 + if (this.options.scatter) this.modifiedGeometry.scatter(this.options.scatter); 55 + 56 + this.modifiedGeometry.setLengthAndFaceColorFromFunction( 57 + (v) => this.ground + (this.biome.getHeight(v) ?? 0), 58 + (f) => this.biome.getColor(f.mid ?? f.a) ?? new Color(0xffffff) 59 + ); 60 + 61 + this.mesh = this.modifiedGeometry.createMesh(); 62 + 63 + const ocean = this.createOceanMesh(); 64 + if (ocean.material instanceof MeshStandardMaterial) { 65 + ocean.material.transparent = true; 66 + ocean.material.opacity = 0.8; 67 + ocean.material.metalness = 0.5; 68 + ocean.material.roughness = 0.5; 69 + } 70 + this.mesh.add(ocean); 71 + 72 + return this.mesh; 73 + } 74 + 75 + createOceanMesh(): Mesh { 76 + const ocean: { 77 + level: number; 78 + colors: ColorGradientOptions; 79 + noise: UberNoiseOptions; 80 + } = this.options.ocean ?? { 81 + level: 0.05, 82 + colors: [ 83 + [0, 0x000066], 84 + [0.35, 0x0000aa], 85 + [0.8, 0x00ccff] 86 + ], 87 + noise: { 88 + min: -0.01, 89 + max: 0.01, 90 + scale: 10 91 + } 92 + }; 93 + const oceanNoise = new UberNoise(ocean.noise); 94 + 95 + const colorGradient = new ColorGradient(ocean.colors); 96 + 97 + this.oceanGeometry.scatter(this.options.scatter); 98 + 99 + this.oceanGeometry.setLengthAndFaceColorFromFunction( 100 + (v) => this.ground + ocean.level + oceanNoise.get(v), 101 + (f) => { 102 + const waterDepth = 103 + (((this.biome.getHeight(f.mid ?? f.a) ?? 0) - ocean.level) / ocean.level + 1) / 2; 104 + 105 + return colorGradient.get(waterDepth); 106 + } 107 + ); 108 + 109 + return this.oceanGeometry.createMesh(); 110 + } 111 + }
+8
src/lib/3D/planet/worlds/vegetation.ts
··· 1 + // load all the vegetation models 2 + // models should be either 3 + 4 + // color vegetation 5 + 6 + // instanced mesh vegetation 7 + 8 + // one vegetation item can have multiple models