[READ-ONLY] Mirror of https://github.com/flo-bit/atmo-tools. atmo.tools
0

Configure Feed

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

switch to cloudflare

Florian (Mar 3, 2026, 2:03 AM +0100) 745e6544 e40488dd

+5784 -5589
+6
.env.example
··· 1 + # Generate both with: pnpm env:setup-dev 2 + CLIENT_ASSERTION_KEY= 3 + COOKIE_SECRET= 4 + 5 + # Set to your tunnel URL to use a confidential client in dev 6 + # OAUTH_PUBLIC_URL=https://your-tunnel.trycloudflare.com
+2 -10
README.md
··· 1 - # search bluesky likes 1 + # atmo tools 2 2 3 - static client side app that allows you to search your bluesky likes 4 - 5 - ## how to run 6 - 7 - ```bash 8 - npm install 9 - npm run dev 10 - ``` 11 - 3 + - search your bluesky likes
-4188
package-lock.json
··· 1 - { 2 - "name": "svelte-atproto-client-oauth", 3 - "version": "0.0.1", 4 - "lockfileVersion": 3, 5 - "requires": true, 6 - "packages": { 7 - "": { 8 - "name": "svelte-atproto-client-oauth", 9 - "version": "0.0.1", 10 - "license": "MIT", 11 - "dependencies": { 12 - "@atcute/oauth-browser-client": "^1.0.13", 13 - "@fuxui/base": "^0.2.1", 14 - "@fuxui/social": "^0.2.1", 15 - "flexsearch": "^0.8.167" 16 - }, 17 - "devDependencies": { 18 - "@eslint/compat": "^1.2.5", 19 - "@eslint/js": "^9.18.0", 20 - "@sveltejs/adapter-auto": "^4.0.0", 21 - "@sveltejs/adapter-static": "^3.0.8", 22 - "@sveltejs/kit": "^2.16.0", 23 - "@sveltejs/vite-plugin-svelte": "^5.0.0", 24 - "@tailwindcss/forms": "^0.5.10", 25 - "@tailwindcss/vite": "^4.0.0", 26 - "eslint": "^9.18.0", 27 - "eslint-config-prettier": "^10.0.1", 28 - "eslint-plugin-svelte": "^2.46.1", 29 - "globals": "^15.14.0", 30 - "prettier": "^3.4.2", 31 - "prettier-plugin-svelte": "^3.3.3", 32 - "prettier-plugin-tailwindcss": "^0.6.11", 33 - "svelte": "^5.0.0", 34 - "svelte-check": "^4.0.0", 35 - "tailwindcss": "^4.0.0", 36 - "typescript": "^5.0.0", 37 - "typescript-eslint": "^8.20.0", 38 - "vite": "^6.0.0" 39 - } 40 - }, 41 - "node_modules/@ampproject/remapping": { 42 - "version": "2.3.0", 43 - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 44 - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 45 - "dependencies": { 46 - "@jridgewell/gen-mapping": "^0.3.5", 47 - "@jridgewell/trace-mapping": "^0.3.24" 48 - }, 49 - "engines": { 50 - "node": ">=6.0.0" 51 - } 52 - }, 53 - "node_modules/@atcute/client": { 54 - "version": "2.0.8", 55 - "resolved": "https://registry.npmjs.org/@atcute/client/-/client-2.0.8.tgz", 56 - "integrity": "sha512-OTfiWwjB4mOTlp2InGStvoQ+PIA5lvih9cTYU8BvOhzNcCBUpt4l860MKZExHjvQ9Tt1kjq/ED9zRiUjsAgIxw==" 57 - }, 58 - "node_modules/@atcute/oauth-browser-client": { 59 - "version": "1.0.13", 60 - "resolved": "https://registry.npmjs.org/@atcute/oauth-browser-client/-/oauth-browser-client-1.0.13.tgz", 61 - "integrity": "sha512-JxQKl9Vo1V8poxvR9uKS8bkBv8t53DIH4lCbaih6yn9u7fM62ZC/0x/9KoGWSNqpp3R3U0y/DOQQfdC9Y4GEGQ==", 62 - "dependencies": { 63 - "@atcute/client": "^2.0.7" 64 - } 65 - }, 66 - "node_modules/@atproto/api": { 67 - "version": "0.15.6", 68 - "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.15.6.tgz", 69 - "integrity": "sha512-hKwrBf60LcI4BqArWyrhWJWIpjwAWUJpW3PVvNzUB1q2W/ByC0JAuwq/F8tZpCEiiVBzHjHVRx4QNA2TA1cG3g==", 70 - "license": "MIT", 71 - "dependencies": { 72 - "@atproto/common-web": "^0.4.2", 73 - "@atproto/lexicon": "^0.4.11", 74 - "@atproto/syntax": "^0.4.0", 75 - "@atproto/xrpc": "^0.7.0", 76 - "await-lock": "^2.2.2", 77 - "multiformats": "^9.9.0", 78 - "tlds": "^1.234.0", 79 - "zod": "^3.23.8" 80 - } 81 - }, 82 - "node_modules/@atproto/common-web": { 83 - "version": "0.4.2", 84 - "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.2.tgz", 85 - "integrity": "sha512-vrXwGNoFGogodjQvJDxAeP3QbGtawgZute2ed1XdRO0wMixLk3qewtikZm06H259QDJVu6voKC5mubml+WgQUw==", 86 - "license": "MIT", 87 - "dependencies": { 88 - "graphemer": "^1.4.0", 89 - "multiformats": "^9.9.0", 90 - "uint8arrays": "3.0.0", 91 - "zod": "^3.23.8" 92 - } 93 - }, 94 - "node_modules/@atproto/lexicon": { 95 - "version": "0.4.11", 96 - "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.11.tgz", 97 - "integrity": "sha512-btefdnvNz2Ao2I+qbmj0F06HC8IlrM/IBz6qOBS50r0S6uDf5tOO+Mv2tSVdimFkdzyDdLtBI1sV36ONxz2cOw==", 98 - "license": "MIT", 99 - "dependencies": { 100 - "@atproto/common-web": "^0.4.2", 101 - "@atproto/syntax": "^0.4.0", 102 - "iso-datestring-validator": "^2.2.2", 103 - "multiformats": "^9.9.0", 104 - "zod": "^3.23.8" 105 - } 106 - }, 107 - "node_modules/@atproto/syntax": { 108 - "version": "0.4.0", 109 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.0.tgz", 110 - "integrity": "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA==", 111 - "license": "MIT" 112 - }, 113 - "node_modules/@atproto/xrpc": { 114 - "version": "0.7.0", 115 - "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.0.tgz", 116 - "integrity": "sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw==", 117 - "license": "MIT", 118 - "dependencies": { 119 - "@atproto/lexicon": "^0.4.11", 120 - "zod": "^3.23.8" 121 - } 122 - }, 123 - "node_modules/@esbuild/aix-ppc64": { 124 - "version": "0.24.2", 125 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", 126 - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", 127 - "cpu": [ 128 - "ppc64" 129 - ], 130 - "dev": true, 131 - "optional": true, 132 - "os": [ 133 - "aix" 134 - ], 135 - "engines": { 136 - "node": ">=18" 137 - } 138 - }, 139 - "node_modules/@esbuild/android-arm": { 140 - "version": "0.24.2", 141 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", 142 - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", 143 - "cpu": [ 144 - "arm" 145 - ], 146 - "dev": true, 147 - "optional": true, 148 - "os": [ 149 - "android" 150 - ], 151 - "engines": { 152 - "node": ">=18" 153 - } 154 - }, 155 - "node_modules/@esbuild/android-arm64": { 156 - "version": "0.24.2", 157 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", 158 - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", 159 - "cpu": [ 160 - "arm64" 161 - ], 162 - "dev": true, 163 - "optional": true, 164 - "os": [ 165 - "android" 166 - ], 167 - "engines": { 168 - "node": ">=18" 169 - } 170 - }, 171 - "node_modules/@esbuild/android-x64": { 172 - "version": "0.24.2", 173 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", 174 - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", 175 - "cpu": [ 176 - "x64" 177 - ], 178 - "dev": true, 179 - "optional": true, 180 - "os": [ 181 - "android" 182 - ], 183 - "engines": { 184 - "node": ">=18" 185 - } 186 - }, 187 - "node_modules/@esbuild/darwin-arm64": { 188 - "version": "0.24.2", 189 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", 190 - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", 191 - "cpu": [ 192 - "arm64" 193 - ], 194 - "dev": true, 195 - "optional": true, 196 - "os": [ 197 - "darwin" 198 - ], 199 - "engines": { 200 - "node": ">=18" 201 - } 202 - }, 203 - "node_modules/@esbuild/darwin-x64": { 204 - "version": "0.24.2", 205 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", 206 - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", 207 - "cpu": [ 208 - "x64" 209 - ], 210 - "dev": true, 211 - "optional": true, 212 - "os": [ 213 - "darwin" 214 - ], 215 - "engines": { 216 - "node": ">=18" 217 - } 218 - }, 219 - "node_modules/@esbuild/freebsd-arm64": { 220 - "version": "0.24.2", 221 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", 222 - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", 223 - "cpu": [ 224 - "arm64" 225 - ], 226 - "dev": true, 227 - "optional": true, 228 - "os": [ 229 - "freebsd" 230 - ], 231 - "engines": { 232 - "node": ">=18" 233 - } 234 - }, 235 - "node_modules/@esbuild/freebsd-x64": { 236 - "version": "0.24.2", 237 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", 238 - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", 239 - "cpu": [ 240 - "x64" 241 - ], 242 - "dev": true, 243 - "optional": true, 244 - "os": [ 245 - "freebsd" 246 - ], 247 - "engines": { 248 - "node": ">=18" 249 - } 250 - }, 251 - "node_modules/@esbuild/linux-arm": { 252 - "version": "0.24.2", 253 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", 254 - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", 255 - "cpu": [ 256 - "arm" 257 - ], 258 - "dev": true, 259 - "optional": true, 260 - "os": [ 261 - "linux" 262 - ], 263 - "engines": { 264 - "node": ">=18" 265 - } 266 - }, 267 - "node_modules/@esbuild/linux-arm64": { 268 - "version": "0.24.2", 269 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", 270 - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", 271 - "cpu": [ 272 - "arm64" 273 - ], 274 - "dev": true, 275 - "optional": true, 276 - "os": [ 277 - "linux" 278 - ], 279 - "engines": { 280 - "node": ">=18" 281 - } 282 - }, 283 - "node_modules/@esbuild/linux-ia32": { 284 - "version": "0.24.2", 285 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", 286 - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", 287 - "cpu": [ 288 - "ia32" 289 - ], 290 - "dev": true, 291 - "optional": true, 292 - "os": [ 293 - "linux" 294 - ], 295 - "engines": { 296 - "node": ">=18" 297 - } 298 - }, 299 - "node_modules/@esbuild/linux-loong64": { 300 - "version": "0.24.2", 301 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", 302 - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", 303 - "cpu": [ 304 - "loong64" 305 - ], 306 - "dev": true, 307 - "optional": true, 308 - "os": [ 309 - "linux" 310 - ], 311 - "engines": { 312 - "node": ">=18" 313 - } 314 - }, 315 - "node_modules/@esbuild/linux-mips64el": { 316 - "version": "0.24.2", 317 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", 318 - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", 319 - "cpu": [ 320 - "mips64el" 321 - ], 322 - "dev": true, 323 - "optional": true, 324 - "os": [ 325 - "linux" 326 - ], 327 - "engines": { 328 - "node": ">=18" 329 - } 330 - }, 331 - "node_modules/@esbuild/linux-ppc64": { 332 - "version": "0.24.2", 333 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", 334 - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", 335 - "cpu": [ 336 - "ppc64" 337 - ], 338 - "dev": true, 339 - "optional": true, 340 - "os": [ 341 - "linux" 342 - ], 343 - "engines": { 344 - "node": ">=18" 345 - } 346 - }, 347 - "node_modules/@esbuild/linux-riscv64": { 348 - "version": "0.24.2", 349 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", 350 - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", 351 - "cpu": [ 352 - "riscv64" 353 - ], 354 - "dev": true, 355 - "optional": true, 356 - "os": [ 357 - "linux" 358 - ], 359 - "engines": { 360 - "node": ">=18" 361 - } 362 - }, 363 - "node_modules/@esbuild/linux-s390x": { 364 - "version": "0.24.2", 365 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", 366 - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", 367 - "cpu": [ 368 - "s390x" 369 - ], 370 - "dev": true, 371 - "optional": true, 372 - "os": [ 373 - "linux" 374 - ], 375 - "engines": { 376 - "node": ">=18" 377 - } 378 - }, 379 - "node_modules/@esbuild/linux-x64": { 380 - "version": "0.24.2", 381 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", 382 - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", 383 - "cpu": [ 384 - "x64" 385 - ], 386 - "dev": true, 387 - "optional": true, 388 - "os": [ 389 - "linux" 390 - ], 391 - "engines": { 392 - "node": ">=18" 393 - } 394 - }, 395 - "node_modules/@esbuild/netbsd-arm64": { 396 - "version": "0.24.2", 397 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", 398 - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", 399 - "cpu": [ 400 - "arm64" 401 - ], 402 - "dev": true, 403 - "optional": true, 404 - "os": [ 405 - "netbsd" 406 - ], 407 - "engines": { 408 - "node": ">=18" 409 - } 410 - }, 411 - "node_modules/@esbuild/netbsd-x64": { 412 - "version": "0.24.2", 413 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", 414 - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", 415 - "cpu": [ 416 - "x64" 417 - ], 418 - "dev": true, 419 - "optional": true, 420 - "os": [ 421 - "netbsd" 422 - ], 423 - "engines": { 424 - "node": ">=18" 425 - } 426 - }, 427 - "node_modules/@esbuild/openbsd-arm64": { 428 - "version": "0.24.2", 429 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", 430 - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", 431 - "cpu": [ 432 - "arm64" 433 - ], 434 - "dev": true, 435 - "optional": true, 436 - "os": [ 437 - "openbsd" 438 - ], 439 - "engines": { 440 - "node": ">=18" 441 - } 442 - }, 443 - "node_modules/@esbuild/openbsd-x64": { 444 - "version": "0.24.2", 445 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", 446 - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", 447 - "cpu": [ 448 - "x64" 449 - ], 450 - "dev": true, 451 - "optional": true, 452 - "os": [ 453 - "openbsd" 454 - ], 455 - "engines": { 456 - "node": ">=18" 457 - } 458 - }, 459 - "node_modules/@esbuild/sunos-x64": { 460 - "version": "0.24.2", 461 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", 462 - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", 463 - "cpu": [ 464 - "x64" 465 - ], 466 - "dev": true, 467 - "optional": true, 468 - "os": [ 469 - "sunos" 470 - ], 471 - "engines": { 472 - "node": ">=18" 473 - } 474 - }, 475 - "node_modules/@esbuild/win32-arm64": { 476 - "version": "0.24.2", 477 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", 478 - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", 479 - "cpu": [ 480 - "arm64" 481 - ], 482 - "dev": true, 483 - "optional": true, 484 - "os": [ 485 - "win32" 486 - ], 487 - "engines": { 488 - "node": ">=18" 489 - } 490 - }, 491 - "node_modules/@esbuild/win32-ia32": { 492 - "version": "0.24.2", 493 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", 494 - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", 495 - "cpu": [ 496 - "ia32" 497 - ], 498 - "dev": true, 499 - "optional": true, 500 - "os": [ 501 - "win32" 502 - ], 503 - "engines": { 504 - "node": ">=18" 505 - } 506 - }, 507 - "node_modules/@esbuild/win32-x64": { 508 - "version": "0.24.2", 509 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", 510 - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", 511 - "cpu": [ 512 - "x64" 513 - ], 514 - "dev": true, 515 - "optional": true, 516 - "os": [ 517 - "win32" 518 - ], 519 - "engines": { 520 - "node": ">=18" 521 - } 522 - }, 523 - "node_modules/@eslint-community/eslint-utils": { 524 - "version": "4.4.1", 525 - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 526 - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 527 - "dev": true, 528 - "dependencies": { 529 - "eslint-visitor-keys": "^3.4.3" 530 - }, 531 - "engines": { 532 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 533 - }, 534 - "funding": { 535 - "url": "https://opencollective.com/eslint" 536 - }, 537 - "peerDependencies": { 538 - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 539 - } 540 - }, 541 - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 542 - "version": "3.4.3", 543 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 544 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 545 - "dev": true, 546 - "engines": { 547 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 548 - }, 549 - "funding": { 550 - "url": "https://opencollective.com/eslint" 551 - } 552 - }, 553 - "node_modules/@eslint-community/regexpp": { 554 - "version": "4.12.1", 555 - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 556 - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 557 - "dev": true, 558 - "engines": { 559 - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 560 - } 561 - }, 562 - "node_modules/@eslint/compat": { 563 - "version": "1.2.7", 564 - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.7.tgz", 565 - "integrity": "sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==", 566 - "dev": true, 567 - "engines": { 568 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 569 - }, 570 - "peerDependencies": { 571 - "eslint": "^9.10.0" 572 - }, 573 - "peerDependenciesMeta": { 574 - "eslint": { 575 - "optional": true 576 - } 577 - } 578 - }, 579 - "node_modules/@eslint/config-array": { 580 - "version": "0.19.2", 581 - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", 582 - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", 583 - "dev": true, 584 - "dependencies": { 585 - "@eslint/object-schema": "^2.1.6", 586 - "debug": "^4.3.1", 587 - "minimatch": "^3.1.2" 588 - }, 589 - "engines": { 590 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 591 - } 592 - }, 593 - "node_modules/@eslint/core": { 594 - "version": "0.12.0", 595 - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", 596 - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", 597 - "dev": true, 598 - "dependencies": { 599 - "@types/json-schema": "^7.0.15" 600 - }, 601 - "engines": { 602 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 603 - } 604 - }, 605 - "node_modules/@eslint/eslintrc": { 606 - "version": "3.3.0", 607 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", 608 - "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", 609 - "dev": true, 610 - "dependencies": { 611 - "ajv": "^6.12.4", 612 - "debug": "^4.3.2", 613 - "espree": "^10.0.1", 614 - "globals": "^14.0.0", 615 - "ignore": "^5.2.0", 616 - "import-fresh": "^3.2.1", 617 - "js-yaml": "^4.1.0", 618 - "minimatch": "^3.1.2", 619 - "strip-json-comments": "^3.1.1" 620 - }, 621 - "engines": { 622 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 623 - }, 624 - "funding": { 625 - "url": "https://opencollective.com/eslint" 626 - } 627 - }, 628 - "node_modules/@eslint/eslintrc/node_modules/globals": { 629 - "version": "14.0.0", 630 - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 631 - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 632 - "dev": true, 633 - "engines": { 634 - "node": ">=18" 635 - }, 636 - "funding": { 637 - "url": "https://github.com/sponsors/sindresorhus" 638 - } 639 - }, 640 - "node_modules/@eslint/js": { 641 - "version": "9.21.0", 642 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz", 643 - "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", 644 - "dev": true, 645 - "engines": { 646 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 647 - } 648 - }, 649 - "node_modules/@eslint/object-schema": { 650 - "version": "2.1.6", 651 - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 652 - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 653 - "dev": true, 654 - "engines": { 655 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 656 - } 657 - }, 658 - "node_modules/@eslint/plugin-kit": { 659 - "version": "0.2.7", 660 - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", 661 - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", 662 - "dev": true, 663 - "dependencies": { 664 - "@eslint/core": "^0.12.0", 665 - "levn": "^0.4.1" 666 - }, 667 - "engines": { 668 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 669 - } 670 - }, 671 - "node_modules/@floating-ui/core": { 672 - "version": "1.7.0", 673 - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", 674 - "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", 675 - "license": "MIT", 676 - "dependencies": { 677 - "@floating-ui/utils": "^0.2.9" 678 - } 679 - }, 680 - "node_modules/@floating-ui/dom": { 681 - "version": "1.7.0", 682 - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", 683 - "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", 684 - "license": "MIT", 685 - "dependencies": { 686 - "@floating-ui/core": "^1.7.0", 687 - "@floating-ui/utils": "^0.2.9" 688 - } 689 - }, 690 - "node_modules/@floating-ui/utils": { 691 - "version": "0.2.9", 692 - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", 693 - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", 694 - "license": "MIT" 695 - }, 696 - "node_modules/@fuxui/base": { 697 - "version": "0.2.1", 698 - "resolved": "https://registry.npmjs.org/@fuxui/base/-/base-0.2.1.tgz", 699 - "integrity": "sha512-lPHqk4yG5NG6CfZ0QvlHra5lx6CX6vVpotmEYn5bgwhbw/3lc9JAiEV1GNiL+1io521Sj5LzakV0zfvCfkpgOA==", 700 - "license": "MIT", 701 - "dependencies": { 702 - "@number-flow/svelte": "^0.3.7", 703 - "bits-ui": "^1.4.3", 704 - "clsx": "^2.1.1", 705 - "svelte-sonner": "^0.3.28", 706 - "tailwind-merge": "^3.2.0", 707 - "tailwind-variants": "^1.0.0" 708 - }, 709 - "peerDependencies": { 710 - "svelte": ">=5", 711 - "tailwindcss": ">=3" 712 - } 713 - }, 714 - "node_modules/@fuxui/social": { 715 - "version": "0.2.1", 716 - "resolved": "https://registry.npmjs.org/@fuxui/social/-/social-0.2.1.tgz", 717 - "integrity": "sha512-YAIFbMEwAbA76qdPhJqoj8a3AqPsCOjCIIFifttJ2rUpy2dOibWHYNngm+F87ma4KcfFNNhbe0RsVGoFGPdYlQ==", 718 - "license": "MIT", 719 - "dependencies": { 720 - "@atproto/api": "^0.15.5", 721 - "@fuxui/base": "0.2.1", 722 - "@use-gesture/vanilla": "^10.3.1", 723 - "bits-ui": "^1.4.3", 724 - "emoji-picker-element": "^1.26.3", 725 - "hls.js": "^1.6.2", 726 - "is-emoji-supported": "^0.0.5", 727 - "plyr": "^3.7.8" 728 - }, 729 - "peerDependencies": { 730 - "svelte": ">=5", 731 - "tailwindcss": ">=3" 732 - } 733 - }, 734 - "node_modules/@humanfs/core": { 735 - "version": "0.19.1", 736 - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 737 - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 738 - "dev": true, 739 - "engines": { 740 - "node": ">=18.18.0" 741 - } 742 - }, 743 - "node_modules/@humanfs/node": { 744 - "version": "0.16.6", 745 - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 746 - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 747 - "dev": true, 748 - "dependencies": { 749 - "@humanfs/core": "^0.19.1", 750 - "@humanwhocodes/retry": "^0.3.0" 751 - }, 752 - "engines": { 753 - "node": ">=18.18.0" 754 - } 755 - }, 756 - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 757 - "version": "0.3.1", 758 - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 759 - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 760 - "dev": true, 761 - "engines": { 762 - "node": ">=18.18" 763 - }, 764 - "funding": { 765 - "type": "github", 766 - "url": "https://github.com/sponsors/nzakas" 767 - } 768 - }, 769 - "node_modules/@humanwhocodes/module-importer": { 770 - "version": "1.0.1", 771 - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 772 - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 773 - "dev": true, 774 - "engines": { 775 - "node": ">=12.22" 776 - }, 777 - "funding": { 778 - "type": "github", 779 - "url": "https://github.com/sponsors/nzakas" 780 - } 781 - }, 782 - "node_modules/@humanwhocodes/retry": { 783 - "version": "0.4.2", 784 - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", 785 - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", 786 - "dev": true, 787 - "engines": { 788 - "node": ">=18.18" 789 - }, 790 - "funding": { 791 - "type": "github", 792 - "url": "https://github.com/sponsors/nzakas" 793 - } 794 - }, 795 - "node_modules/@internationalized/date": { 796 - "version": "3.8.0", 797 - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.0.tgz", 798 - "integrity": "sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==", 799 - "license": "Apache-2.0", 800 - "dependencies": { 801 - "@swc/helpers": "^0.5.0" 802 - } 803 - }, 804 - "node_modules/@jridgewell/gen-mapping": { 805 - "version": "0.3.8", 806 - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 807 - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 808 - "dependencies": { 809 - "@jridgewell/set-array": "^1.2.1", 810 - "@jridgewell/sourcemap-codec": "^1.4.10", 811 - "@jridgewell/trace-mapping": "^0.3.24" 812 - }, 813 - "engines": { 814 - "node": ">=6.0.0" 815 - } 816 - }, 817 - "node_modules/@jridgewell/resolve-uri": { 818 - "version": "3.1.2", 819 - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 820 - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 821 - "engines": { 822 - "node": ">=6.0.0" 823 - } 824 - }, 825 - "node_modules/@jridgewell/set-array": { 826 - "version": "1.2.1", 827 - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 828 - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 829 - "engines": { 830 - "node": ">=6.0.0" 831 - } 832 - }, 833 - "node_modules/@jridgewell/sourcemap-codec": { 834 - "version": "1.5.0", 835 - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 836 - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 837 - }, 838 - "node_modules/@jridgewell/trace-mapping": { 839 - "version": "0.3.25", 840 - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 841 - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 842 - "dependencies": { 843 - "@jridgewell/resolve-uri": "^3.1.0", 844 - "@jridgewell/sourcemap-codec": "^1.4.14" 845 - } 846 - }, 847 - "node_modules/@nodelib/fs.scandir": { 848 - "version": "2.1.5", 849 - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 850 - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 851 - "dev": true, 852 - "dependencies": { 853 - "@nodelib/fs.stat": "2.0.5", 854 - "run-parallel": "^1.1.9" 855 - }, 856 - "engines": { 857 - "node": ">= 8" 858 - } 859 - }, 860 - "node_modules/@nodelib/fs.stat": { 861 - "version": "2.0.5", 862 - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 863 - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 864 - "dev": true, 865 - "engines": { 866 - "node": ">= 8" 867 - } 868 - }, 869 - "node_modules/@nodelib/fs.walk": { 870 - "version": "1.2.8", 871 - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 872 - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 873 - "dev": true, 874 - "dependencies": { 875 - "@nodelib/fs.scandir": "2.1.5", 876 - "fastq": "^1.6.0" 877 - }, 878 - "engines": { 879 - "node": ">= 8" 880 - } 881 - }, 882 - "node_modules/@number-flow/svelte": { 883 - "version": "0.3.7", 884 - "resolved": "https://registry.npmjs.org/@number-flow/svelte/-/svelte-0.3.7.tgz", 885 - "integrity": "sha512-FusxKvImj13+15N+pQrrGsu8cNTQ0BCUWxshNUpPU4opFufVpHO+RMxsYrtZ7xloVL/TjDLpO+SWjrxxx7iPJg==", 886 - "license": "MIT", 887 - "dependencies": { 888 - "esm-env": "^1.1.4", 889 - "number-flow": "0.5.7" 890 - }, 891 - "peerDependencies": { 892 - "svelte": "^4 || ^5" 893 - } 894 - }, 895 - "node_modules/@polka/url": { 896 - "version": "1.0.0-next.28", 897 - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", 898 - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", 899 - "dev": true 900 - }, 901 - "node_modules/@rollup/rollup-android-arm-eabi": { 902 - "version": "4.34.8", 903 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", 904 - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", 905 - "cpu": [ 906 - "arm" 907 - ], 908 - "dev": true, 909 - "optional": true, 910 - "os": [ 911 - "android" 912 - ] 913 - }, 914 - "node_modules/@rollup/rollup-android-arm64": { 915 - "version": "4.34.8", 916 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", 917 - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", 918 - "cpu": [ 919 - "arm64" 920 - ], 921 - "dev": true, 922 - "optional": true, 923 - "os": [ 924 - "android" 925 - ] 926 - }, 927 - "node_modules/@rollup/rollup-darwin-arm64": { 928 - "version": "4.34.8", 929 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", 930 - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", 931 - "cpu": [ 932 - "arm64" 933 - ], 934 - "dev": true, 935 - "optional": true, 936 - "os": [ 937 - "darwin" 938 - ] 939 - }, 940 - "node_modules/@rollup/rollup-darwin-x64": { 941 - "version": "4.34.8", 942 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", 943 - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", 944 - "cpu": [ 945 - "x64" 946 - ], 947 - "dev": true, 948 - "optional": true, 949 - "os": [ 950 - "darwin" 951 - ] 952 - }, 953 - "node_modules/@rollup/rollup-freebsd-arm64": { 954 - "version": "4.34.8", 955 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", 956 - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", 957 - "cpu": [ 958 - "arm64" 959 - ], 960 - "dev": true, 961 - "optional": true, 962 - "os": [ 963 - "freebsd" 964 - ] 965 - }, 966 - "node_modules/@rollup/rollup-freebsd-x64": { 967 - "version": "4.34.8", 968 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", 969 - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", 970 - "cpu": [ 971 - "x64" 972 - ], 973 - "dev": true, 974 - "optional": true, 975 - "os": [ 976 - "freebsd" 977 - ] 978 - }, 979 - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 980 - "version": "4.34.8", 981 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", 982 - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", 983 - "cpu": [ 984 - "arm" 985 - ], 986 - "dev": true, 987 - "optional": true, 988 - "os": [ 989 - "linux" 990 - ] 991 - }, 992 - "node_modules/@rollup/rollup-linux-arm-musleabihf": { 993 - "version": "4.34.8", 994 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", 995 - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", 996 - "cpu": [ 997 - "arm" 998 - ], 999 - "dev": true, 1000 - "optional": true, 1001 - "os": [ 1002 - "linux" 1003 - ] 1004 - }, 1005 - "node_modules/@rollup/rollup-linux-arm64-gnu": { 1006 - "version": "4.34.8", 1007 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", 1008 - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", 1009 - "cpu": [ 1010 - "arm64" 1011 - ], 1012 - "dev": true, 1013 - "optional": true, 1014 - "os": [ 1015 - "linux" 1016 - ] 1017 - }, 1018 - "node_modules/@rollup/rollup-linux-arm64-musl": { 1019 - "version": "4.34.8", 1020 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", 1021 - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", 1022 - "cpu": [ 1023 - "arm64" 1024 - ], 1025 - "dev": true, 1026 - "optional": true, 1027 - "os": [ 1028 - "linux" 1029 - ] 1030 - }, 1031 - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1032 - "version": "4.34.8", 1033 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", 1034 - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", 1035 - "cpu": [ 1036 - "loong64" 1037 - ], 1038 - "dev": true, 1039 - "optional": true, 1040 - "os": [ 1041 - "linux" 1042 - ] 1043 - }, 1044 - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1045 - "version": "4.34.8", 1046 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", 1047 - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", 1048 - "cpu": [ 1049 - "ppc64" 1050 - ], 1051 - "dev": true, 1052 - "optional": true, 1053 - "os": [ 1054 - "linux" 1055 - ] 1056 - }, 1057 - "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1058 - "version": "4.34.8", 1059 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", 1060 - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", 1061 - "cpu": [ 1062 - "riscv64" 1063 - ], 1064 - "dev": true, 1065 - "optional": true, 1066 - "os": [ 1067 - "linux" 1068 - ] 1069 - }, 1070 - "node_modules/@rollup/rollup-linux-s390x-gnu": { 1071 - "version": "4.34.8", 1072 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", 1073 - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", 1074 - "cpu": [ 1075 - "s390x" 1076 - ], 1077 - "dev": true, 1078 - "optional": true, 1079 - "os": [ 1080 - "linux" 1081 - ] 1082 - }, 1083 - "node_modules/@rollup/rollup-linux-x64-gnu": { 1084 - "version": "4.34.8", 1085 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", 1086 - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", 1087 - "cpu": [ 1088 - "x64" 1089 - ], 1090 - "dev": true, 1091 - "optional": true, 1092 - "os": [ 1093 - "linux" 1094 - ] 1095 - }, 1096 - "node_modules/@rollup/rollup-linux-x64-musl": { 1097 - "version": "4.34.8", 1098 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", 1099 - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", 1100 - "cpu": [ 1101 - "x64" 1102 - ], 1103 - "dev": true, 1104 - "optional": true, 1105 - "os": [ 1106 - "linux" 1107 - ] 1108 - }, 1109 - "node_modules/@rollup/rollup-win32-arm64-msvc": { 1110 - "version": "4.34.8", 1111 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", 1112 - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", 1113 - "cpu": [ 1114 - "arm64" 1115 - ], 1116 - "dev": true, 1117 - "optional": true, 1118 - "os": [ 1119 - "win32" 1120 - ] 1121 - }, 1122 - "node_modules/@rollup/rollup-win32-ia32-msvc": { 1123 - "version": "4.34.8", 1124 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", 1125 - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", 1126 - "cpu": [ 1127 - "ia32" 1128 - ], 1129 - "dev": true, 1130 - "optional": true, 1131 - "os": [ 1132 - "win32" 1133 - ] 1134 - }, 1135 - "node_modules/@rollup/rollup-win32-x64-msvc": { 1136 - "version": "4.34.8", 1137 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", 1138 - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", 1139 - "cpu": [ 1140 - "x64" 1141 - ], 1142 - "dev": true, 1143 - "optional": true, 1144 - "os": [ 1145 - "win32" 1146 - ] 1147 - }, 1148 - "node_modules/@sveltejs/adapter-auto": { 1149 - "version": "4.0.0", 1150 - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-4.0.0.tgz", 1151 - "integrity": "sha512-kmuYSQdD2AwThymQF0haQhM8rE5rhutQXG4LNbnbShwhMO4qQGnKaaTy+88DuNSuoQDi58+thpq8XpHc1+oEKQ==", 1152 - "dev": true, 1153 - "dependencies": { 1154 - "import-meta-resolve": "^4.1.0" 1155 - }, 1156 - "peerDependencies": { 1157 - "@sveltejs/kit": "^2.0.0" 1158 - } 1159 - }, 1160 - "node_modules/@sveltejs/adapter-static": { 1161 - "version": "3.0.8", 1162 - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.8.tgz", 1163 - "integrity": "sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg==", 1164 - "dev": true, 1165 - "peerDependencies": { 1166 - "@sveltejs/kit": "^2.0.0" 1167 - } 1168 - }, 1169 - "node_modules/@sveltejs/kit": { 1170 - "version": "2.17.2", 1171 - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.17.2.tgz", 1172 - "integrity": "sha512-Vypk02baf7qd3SOB1uUwUC/3Oka+srPo2J0a8YN3EfJypRshDkNx9HzNKjSmhOnGWwT+SSO06+N0mAb8iVTmTQ==", 1173 - "dev": true, 1174 - "dependencies": { 1175 - "@types/cookie": "^0.6.0", 1176 - "cookie": "^0.6.0", 1177 - "devalue": "^5.1.0", 1178 - "esm-env": "^1.2.2", 1179 - "import-meta-resolve": "^4.1.0", 1180 - "kleur": "^4.1.5", 1181 - "magic-string": "^0.30.5", 1182 - "mrmime": "^2.0.0", 1183 - "sade": "^1.8.1", 1184 - "set-cookie-parser": "^2.6.0", 1185 - "sirv": "^3.0.0" 1186 - }, 1187 - "bin": { 1188 - "svelte-kit": "svelte-kit.js" 1189 - }, 1190 - "engines": { 1191 - "node": ">=18.13" 1192 - }, 1193 - "peerDependencies": { 1194 - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", 1195 - "svelte": "^4.0.0 || ^5.0.0-next.0", 1196 - "vite": "^5.0.3 || ^6.0.0" 1197 - } 1198 - }, 1199 - "node_modules/@sveltejs/vite-plugin-svelte": { 1200 - "version": "5.0.3", 1201 - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz", 1202 - "integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==", 1203 - "dev": true, 1204 - "dependencies": { 1205 - "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", 1206 - "debug": "^4.4.0", 1207 - "deepmerge": "^4.3.1", 1208 - "kleur": "^4.1.5", 1209 - "magic-string": "^0.30.15", 1210 - "vitefu": "^1.0.4" 1211 - }, 1212 - "engines": { 1213 - "node": "^18.0.0 || ^20.0.0 || >=22" 1214 - }, 1215 - "peerDependencies": { 1216 - "svelte": "^5.0.0", 1217 - "vite": "^6.0.0" 1218 - } 1219 - }, 1220 - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 1221 - "version": "4.0.1", 1222 - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", 1223 - "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", 1224 - "dev": true, 1225 - "dependencies": { 1226 - "debug": "^4.3.7" 1227 - }, 1228 - "engines": { 1229 - "node": "^18.0.0 || ^20.0.0 || >=22" 1230 - }, 1231 - "peerDependencies": { 1232 - "@sveltejs/vite-plugin-svelte": "^5.0.0", 1233 - "svelte": "^5.0.0", 1234 - "vite": "^6.0.0" 1235 - } 1236 - }, 1237 - "node_modules/@swc/helpers": { 1238 - "version": "0.5.17", 1239 - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", 1240 - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", 1241 - "license": "Apache-2.0", 1242 - "dependencies": { 1243 - "tslib": "^2.8.0" 1244 - } 1245 - }, 1246 - "node_modules/@tailwindcss/forms": { 1247 - "version": "0.5.10", 1248 - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", 1249 - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", 1250 - "dev": true, 1251 - "dependencies": { 1252 - "mini-svg-data-uri": "^1.2.3" 1253 - }, 1254 - "peerDependencies": { 1255 - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" 1256 - } 1257 - }, 1258 - "node_modules/@tailwindcss/node": { 1259 - "version": "4.0.8", 1260 - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.8.tgz", 1261 - "integrity": "sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==", 1262 - "dev": true, 1263 - "dependencies": { 1264 - "enhanced-resolve": "^5.18.1", 1265 - "jiti": "^2.4.2", 1266 - "tailwindcss": "4.0.8" 1267 - } 1268 - }, 1269 - "node_modules/@tailwindcss/oxide": { 1270 - "version": "4.0.8", 1271 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.8.tgz", 1272 - "integrity": "sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==", 1273 - "dev": true, 1274 - "engines": { 1275 - "node": ">= 10" 1276 - }, 1277 - "optionalDependencies": { 1278 - "@tailwindcss/oxide-android-arm64": "4.0.8", 1279 - "@tailwindcss/oxide-darwin-arm64": "4.0.8", 1280 - "@tailwindcss/oxide-darwin-x64": "4.0.8", 1281 - "@tailwindcss/oxide-freebsd-x64": "4.0.8", 1282 - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.8", 1283 - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.8", 1284 - "@tailwindcss/oxide-linux-arm64-musl": "4.0.8", 1285 - "@tailwindcss/oxide-linux-x64-gnu": "4.0.8", 1286 - "@tailwindcss/oxide-linux-x64-musl": "4.0.8", 1287 - "@tailwindcss/oxide-win32-arm64-msvc": "4.0.8", 1288 - "@tailwindcss/oxide-win32-x64-msvc": "4.0.8" 1289 - } 1290 - }, 1291 - "node_modules/@tailwindcss/oxide-android-arm64": { 1292 - "version": "4.0.8", 1293 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.8.tgz", 1294 - "integrity": "sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==", 1295 - "cpu": [ 1296 - "arm64" 1297 - ], 1298 - "dev": true, 1299 - "optional": true, 1300 - "os": [ 1301 - "android" 1302 - ], 1303 - "engines": { 1304 - "node": ">= 10" 1305 - } 1306 - }, 1307 - "node_modules/@tailwindcss/oxide-darwin-arm64": { 1308 - "version": "4.0.8", 1309 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.8.tgz", 1310 - "integrity": "sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==", 1311 - "cpu": [ 1312 - "arm64" 1313 - ], 1314 - "dev": true, 1315 - "optional": true, 1316 - "os": [ 1317 - "darwin" 1318 - ], 1319 - "engines": { 1320 - "node": ">= 10" 1321 - } 1322 - }, 1323 - "node_modules/@tailwindcss/oxide-darwin-x64": { 1324 - "version": "4.0.8", 1325 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.8.tgz", 1326 - "integrity": "sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==", 1327 - "cpu": [ 1328 - "x64" 1329 - ], 1330 - "dev": true, 1331 - "optional": true, 1332 - "os": [ 1333 - "darwin" 1334 - ], 1335 - "engines": { 1336 - "node": ">= 10" 1337 - } 1338 - }, 1339 - "node_modules/@tailwindcss/oxide-freebsd-x64": { 1340 - "version": "4.0.8", 1341 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.8.tgz", 1342 - "integrity": "sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==", 1343 - "cpu": [ 1344 - "x64" 1345 - ], 1346 - "dev": true, 1347 - "optional": true, 1348 - "os": [ 1349 - "freebsd" 1350 - ], 1351 - "engines": { 1352 - "node": ">= 10" 1353 - } 1354 - }, 1355 - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 1356 - "version": "4.0.8", 1357 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.8.tgz", 1358 - "integrity": "sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==", 1359 - "cpu": [ 1360 - "arm" 1361 - ], 1362 - "dev": true, 1363 - "optional": true, 1364 - "os": [ 1365 - "linux" 1366 - ], 1367 - "engines": { 1368 - "node": ">= 10" 1369 - } 1370 - }, 1371 - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 1372 - "version": "4.0.8", 1373 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.8.tgz", 1374 - "integrity": "sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==", 1375 - "cpu": [ 1376 - "arm64" 1377 - ], 1378 - "dev": true, 1379 - "optional": true, 1380 - "os": [ 1381 - "linux" 1382 - ], 1383 - "engines": { 1384 - "node": ">= 10" 1385 - } 1386 - }, 1387 - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 1388 - "version": "4.0.8", 1389 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.8.tgz", 1390 - "integrity": "sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==", 1391 - "cpu": [ 1392 - "arm64" 1393 - ], 1394 - "dev": true, 1395 - "optional": true, 1396 - "os": [ 1397 - "linux" 1398 - ], 1399 - "engines": { 1400 - "node": ">= 10" 1401 - } 1402 - }, 1403 - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 1404 - "version": "4.0.8", 1405 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.8.tgz", 1406 - "integrity": "sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==", 1407 - "cpu": [ 1408 - "x64" 1409 - ], 1410 - "dev": true, 1411 - "optional": true, 1412 - "os": [ 1413 - "linux" 1414 - ], 1415 - "engines": { 1416 - "node": ">= 10" 1417 - } 1418 - }, 1419 - "node_modules/@tailwindcss/oxide-linux-x64-musl": { 1420 - "version": "4.0.8", 1421 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.8.tgz", 1422 - "integrity": "sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==", 1423 - "cpu": [ 1424 - "x64" 1425 - ], 1426 - "dev": true, 1427 - "optional": true, 1428 - "os": [ 1429 - "linux" 1430 - ], 1431 - "engines": { 1432 - "node": ">= 10" 1433 - } 1434 - }, 1435 - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 1436 - "version": "4.0.8", 1437 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.8.tgz", 1438 - "integrity": "sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==", 1439 - "cpu": [ 1440 - "arm64" 1441 - ], 1442 - "dev": true, 1443 - "optional": true, 1444 - "os": [ 1445 - "win32" 1446 - ], 1447 - "engines": { 1448 - "node": ">= 10" 1449 - } 1450 - }, 1451 - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 1452 - "version": "4.0.8", 1453 - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.8.tgz", 1454 - "integrity": "sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==", 1455 - "cpu": [ 1456 - "x64" 1457 - ], 1458 - "dev": true, 1459 - "optional": true, 1460 - "os": [ 1461 - "win32" 1462 - ], 1463 - "engines": { 1464 - "node": ">= 10" 1465 - } 1466 - }, 1467 - "node_modules/@tailwindcss/vite": { 1468 - "version": "4.0.8", 1469 - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.8.tgz", 1470 - "integrity": "sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==", 1471 - "dev": true, 1472 - "dependencies": { 1473 - "@tailwindcss/node": "4.0.8", 1474 - "@tailwindcss/oxide": "4.0.8", 1475 - "lightningcss": "^1.29.1", 1476 - "tailwindcss": "4.0.8" 1477 - }, 1478 - "peerDependencies": { 1479 - "vite": "^5.2.0 || ^6" 1480 - } 1481 - }, 1482 - "node_modules/@types/cookie": { 1483 - "version": "0.6.0", 1484 - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", 1485 - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", 1486 - "dev": true 1487 - }, 1488 - "node_modules/@types/estree": { 1489 - "version": "1.0.6", 1490 - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1491 - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" 1492 - }, 1493 - "node_modules/@types/json-schema": { 1494 - "version": "7.0.15", 1495 - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1496 - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1497 - "dev": true 1498 - }, 1499 - "node_modules/@typescript-eslint/eslint-plugin": { 1500 - "version": "8.24.1", 1501 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", 1502 - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", 1503 - "dev": true, 1504 - "dependencies": { 1505 - "@eslint-community/regexpp": "^4.10.0", 1506 - "@typescript-eslint/scope-manager": "8.24.1", 1507 - "@typescript-eslint/type-utils": "8.24.1", 1508 - "@typescript-eslint/utils": "8.24.1", 1509 - "@typescript-eslint/visitor-keys": "8.24.1", 1510 - "graphemer": "^1.4.0", 1511 - "ignore": "^5.3.1", 1512 - "natural-compare": "^1.4.0", 1513 - "ts-api-utils": "^2.0.1" 1514 - }, 1515 - "engines": { 1516 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1517 - }, 1518 - "funding": { 1519 - "type": "opencollective", 1520 - "url": "https://opencollective.com/typescript-eslint" 1521 - }, 1522 - "peerDependencies": { 1523 - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 1524 - "eslint": "^8.57.0 || ^9.0.0", 1525 - "typescript": ">=4.8.4 <5.8.0" 1526 - } 1527 - }, 1528 - "node_modules/@typescript-eslint/parser": { 1529 - "version": "8.24.1", 1530 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", 1531 - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", 1532 - "dev": true, 1533 - "dependencies": { 1534 - "@typescript-eslint/scope-manager": "8.24.1", 1535 - "@typescript-eslint/types": "8.24.1", 1536 - "@typescript-eslint/typescript-estree": "8.24.1", 1537 - "@typescript-eslint/visitor-keys": "8.24.1", 1538 - "debug": "^4.3.4" 1539 - }, 1540 - "engines": { 1541 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1542 - }, 1543 - "funding": { 1544 - "type": "opencollective", 1545 - "url": "https://opencollective.com/typescript-eslint" 1546 - }, 1547 - "peerDependencies": { 1548 - "eslint": "^8.57.0 || ^9.0.0", 1549 - "typescript": ">=4.8.4 <5.8.0" 1550 - } 1551 - }, 1552 - "node_modules/@typescript-eslint/scope-manager": { 1553 - "version": "8.24.1", 1554 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", 1555 - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", 1556 - "dev": true, 1557 - "dependencies": { 1558 - "@typescript-eslint/types": "8.24.1", 1559 - "@typescript-eslint/visitor-keys": "8.24.1" 1560 - }, 1561 - "engines": { 1562 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1563 - }, 1564 - "funding": { 1565 - "type": "opencollective", 1566 - "url": "https://opencollective.com/typescript-eslint" 1567 - } 1568 - }, 1569 - "node_modules/@typescript-eslint/type-utils": { 1570 - "version": "8.24.1", 1571 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", 1572 - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", 1573 - "dev": true, 1574 - "dependencies": { 1575 - "@typescript-eslint/typescript-estree": "8.24.1", 1576 - "@typescript-eslint/utils": "8.24.1", 1577 - "debug": "^4.3.4", 1578 - "ts-api-utils": "^2.0.1" 1579 - }, 1580 - "engines": { 1581 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1582 - }, 1583 - "funding": { 1584 - "type": "opencollective", 1585 - "url": "https://opencollective.com/typescript-eslint" 1586 - }, 1587 - "peerDependencies": { 1588 - "eslint": "^8.57.0 || ^9.0.0", 1589 - "typescript": ">=4.8.4 <5.8.0" 1590 - } 1591 - }, 1592 - "node_modules/@typescript-eslint/types": { 1593 - "version": "8.24.1", 1594 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", 1595 - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", 1596 - "dev": true, 1597 - "engines": { 1598 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1599 - }, 1600 - "funding": { 1601 - "type": "opencollective", 1602 - "url": "https://opencollective.com/typescript-eslint" 1603 - } 1604 - }, 1605 - "node_modules/@typescript-eslint/typescript-estree": { 1606 - "version": "8.24.1", 1607 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", 1608 - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", 1609 - "dev": true, 1610 - "dependencies": { 1611 - "@typescript-eslint/types": "8.24.1", 1612 - "@typescript-eslint/visitor-keys": "8.24.1", 1613 - "debug": "^4.3.4", 1614 - "fast-glob": "^3.3.2", 1615 - "is-glob": "^4.0.3", 1616 - "minimatch": "^9.0.4", 1617 - "semver": "^7.6.0", 1618 - "ts-api-utils": "^2.0.1" 1619 - }, 1620 - "engines": { 1621 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1622 - }, 1623 - "funding": { 1624 - "type": "opencollective", 1625 - "url": "https://opencollective.com/typescript-eslint" 1626 - }, 1627 - "peerDependencies": { 1628 - "typescript": ">=4.8.4 <5.8.0" 1629 - } 1630 - }, 1631 - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 1632 - "version": "2.0.1", 1633 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1634 - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1635 - "dev": true, 1636 - "dependencies": { 1637 - "balanced-match": "^1.0.0" 1638 - } 1639 - }, 1640 - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1641 - "version": "9.0.5", 1642 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1643 - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1644 - "dev": true, 1645 - "dependencies": { 1646 - "brace-expansion": "^2.0.1" 1647 - }, 1648 - "engines": { 1649 - "node": ">=16 || 14 >=14.17" 1650 - }, 1651 - "funding": { 1652 - "url": "https://github.com/sponsors/isaacs" 1653 - } 1654 - }, 1655 - "node_modules/@typescript-eslint/utils": { 1656 - "version": "8.24.1", 1657 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", 1658 - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", 1659 - "dev": true, 1660 - "dependencies": { 1661 - "@eslint-community/eslint-utils": "^4.4.0", 1662 - "@typescript-eslint/scope-manager": "8.24.1", 1663 - "@typescript-eslint/types": "8.24.1", 1664 - "@typescript-eslint/typescript-estree": "8.24.1" 1665 - }, 1666 - "engines": { 1667 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1668 - }, 1669 - "funding": { 1670 - "type": "opencollective", 1671 - "url": "https://opencollective.com/typescript-eslint" 1672 - }, 1673 - "peerDependencies": { 1674 - "eslint": "^8.57.0 || ^9.0.0", 1675 - "typescript": ">=4.8.4 <5.8.0" 1676 - } 1677 - }, 1678 - "node_modules/@typescript-eslint/visitor-keys": { 1679 - "version": "8.24.1", 1680 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", 1681 - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", 1682 - "dev": true, 1683 - "dependencies": { 1684 - "@typescript-eslint/types": "8.24.1", 1685 - "eslint-visitor-keys": "^4.2.0" 1686 - }, 1687 - "engines": { 1688 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1689 - }, 1690 - "funding": { 1691 - "type": "opencollective", 1692 - "url": "https://opencollective.com/typescript-eslint" 1693 - } 1694 - }, 1695 - "node_modules/@use-gesture/core": { 1696 - "version": "10.3.1", 1697 - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", 1698 - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", 1699 - "license": "MIT" 1700 - }, 1701 - "node_modules/@use-gesture/vanilla": { 1702 - "version": "10.3.1", 1703 - "resolved": "https://registry.npmjs.org/@use-gesture/vanilla/-/vanilla-10.3.1.tgz", 1704 - "integrity": "sha512-lT4scGLu59ovA3zmtUonukAGcA0AdOOh+iwNDS05Bsu7Lq9aZToDHhI6D8Q2qvsVraovtsLLYwPrWdG/noMAKw==", 1705 - "license": "MIT", 1706 - "dependencies": { 1707 - "@use-gesture/core": "10.3.1" 1708 - } 1709 - }, 1710 - "node_modules/acorn": { 1711 - "version": "8.14.0", 1712 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1713 - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1714 - "bin": { 1715 - "acorn": "bin/acorn" 1716 - }, 1717 - "engines": { 1718 - "node": ">=0.4.0" 1719 - } 1720 - }, 1721 - "node_modules/acorn-jsx": { 1722 - "version": "5.3.2", 1723 - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1724 - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1725 - "dev": true, 1726 - "peerDependencies": { 1727 - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1728 - } 1729 - }, 1730 - "node_modules/acorn-typescript": { 1731 - "version": "1.4.13", 1732 - "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", 1733 - "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", 1734 - "peerDependencies": { 1735 - "acorn": ">=8.9.0" 1736 - } 1737 - }, 1738 - "node_modules/ajv": { 1739 - "version": "6.12.6", 1740 - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1741 - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1742 - "dev": true, 1743 - "dependencies": { 1744 - "fast-deep-equal": "^3.1.1", 1745 - "fast-json-stable-stringify": "^2.0.0", 1746 - "json-schema-traverse": "^0.4.1", 1747 - "uri-js": "^4.2.2" 1748 - }, 1749 - "funding": { 1750 - "type": "github", 1751 - "url": "https://github.com/sponsors/epoberezkin" 1752 - } 1753 - }, 1754 - "node_modules/ansi-styles": { 1755 - "version": "4.3.0", 1756 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1757 - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1758 - "dev": true, 1759 - "dependencies": { 1760 - "color-convert": "^2.0.1" 1761 - }, 1762 - "engines": { 1763 - "node": ">=8" 1764 - }, 1765 - "funding": { 1766 - "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1767 - } 1768 - }, 1769 - "node_modules/argparse": { 1770 - "version": "2.0.1", 1771 - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1772 - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1773 - "dev": true 1774 - }, 1775 - "node_modules/aria-query": { 1776 - "version": "5.3.2", 1777 - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", 1778 - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", 1779 - "engines": { 1780 - "node": ">= 0.4" 1781 - } 1782 - }, 1783 - "node_modules/await-lock": { 1784 - "version": "2.2.2", 1785 - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", 1786 - "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", 1787 - "license": "MIT" 1788 - }, 1789 - "node_modules/axobject-query": { 1790 - "version": "4.1.0", 1791 - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", 1792 - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", 1793 - "engines": { 1794 - "node": ">= 0.4" 1795 - } 1796 - }, 1797 - "node_modules/balanced-match": { 1798 - "version": "1.0.2", 1799 - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1800 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1801 - "dev": true 1802 - }, 1803 - "node_modules/bits-ui": { 1804 - "version": "1.4.8", 1805 - "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-1.4.8.tgz", 1806 - "integrity": "sha512-j34GsdSsJ+ZBl9h/70VkufvrlEgTKQSZvm80eM5VvuhLJWvpfEpn9+k0FVmtDQl9NSPgEVtI9imYhm8nW9Nj/w==", 1807 - "license": "MIT", 1808 - "dependencies": { 1809 - "@floating-ui/core": "^1.6.4", 1810 - "@floating-ui/dom": "^1.6.7", 1811 - "@internationalized/date": "^3.5.6", 1812 - "esm-env": "^1.1.2", 1813 - "runed": "^0.23.2", 1814 - "svelte-toolbelt": "^0.7.1", 1815 - "tabbable": "^6.2.0" 1816 - }, 1817 - "engines": { 1818 - "node": ">=18", 1819 - "pnpm": ">=8.7.0" 1820 - }, 1821 - "funding": { 1822 - "url": "https://github.com/sponsors/huntabyte" 1823 - }, 1824 - "peerDependencies": { 1825 - "svelte": "^5.11.0" 1826 - } 1827 - }, 1828 - "node_modules/brace-expansion": { 1829 - "version": "1.1.11", 1830 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1831 - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1832 - "dev": true, 1833 - "dependencies": { 1834 - "balanced-match": "^1.0.0", 1835 - "concat-map": "0.0.1" 1836 - } 1837 - }, 1838 - "node_modules/braces": { 1839 - "version": "3.0.3", 1840 - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1841 - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1842 - "dev": true, 1843 - "dependencies": { 1844 - "fill-range": "^7.1.1" 1845 - }, 1846 - "engines": { 1847 - "node": ">=8" 1848 - } 1849 - }, 1850 - "node_modules/callsites": { 1851 - "version": "3.1.0", 1852 - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1853 - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1854 - "dev": true, 1855 - "engines": { 1856 - "node": ">=6" 1857 - } 1858 - }, 1859 - "node_modules/chalk": { 1860 - "version": "4.1.2", 1861 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1862 - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1863 - "dev": true, 1864 - "dependencies": { 1865 - "ansi-styles": "^4.1.0", 1866 - "supports-color": "^7.1.0" 1867 - }, 1868 - "engines": { 1869 - "node": ">=10" 1870 - }, 1871 - "funding": { 1872 - "url": "https://github.com/chalk/chalk?sponsor=1" 1873 - } 1874 - }, 1875 - "node_modules/chokidar": { 1876 - "version": "4.0.3", 1877 - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 1878 - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1879 - "dev": true, 1880 - "dependencies": { 1881 - "readdirp": "^4.0.1" 1882 - }, 1883 - "engines": { 1884 - "node": ">= 14.16.0" 1885 - }, 1886 - "funding": { 1887 - "url": "https://paulmillr.com/funding/" 1888 - } 1889 - }, 1890 - "node_modules/clsx": { 1891 - "version": "2.1.1", 1892 - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 1893 - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 1894 - "engines": { 1895 - "node": ">=6" 1896 - } 1897 - }, 1898 - "node_modules/color-convert": { 1899 - "version": "2.0.1", 1900 - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1901 - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1902 - "dev": true, 1903 - "dependencies": { 1904 - "color-name": "~1.1.4" 1905 - }, 1906 - "engines": { 1907 - "node": ">=7.0.0" 1908 - } 1909 - }, 1910 - "node_modules/color-name": { 1911 - "version": "1.1.4", 1912 - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1913 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1914 - "dev": true 1915 - }, 1916 - "node_modules/concat-map": { 1917 - "version": "0.0.1", 1918 - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1919 - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1920 - "dev": true 1921 - }, 1922 - "node_modules/cookie": { 1923 - "version": "0.6.0", 1924 - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 1925 - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 1926 - "dev": true, 1927 - "engines": { 1928 - "node": ">= 0.6" 1929 - } 1930 - }, 1931 - "node_modules/core-js": { 1932 - "version": "3.42.0", 1933 - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", 1934 - "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", 1935 - "hasInstallScript": true, 1936 - "license": "MIT", 1937 - "funding": { 1938 - "type": "opencollective", 1939 - "url": "https://opencollective.com/core-js" 1940 - } 1941 - }, 1942 - "node_modules/cross-spawn": { 1943 - "version": "7.0.6", 1944 - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1945 - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1946 - "dev": true, 1947 - "dependencies": { 1948 - "path-key": "^3.1.0", 1949 - "shebang-command": "^2.0.0", 1950 - "which": "^2.0.1" 1951 - }, 1952 - "engines": { 1953 - "node": ">= 8" 1954 - } 1955 - }, 1956 - "node_modules/cssesc": { 1957 - "version": "3.0.0", 1958 - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1959 - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1960 - "dev": true, 1961 - "bin": { 1962 - "cssesc": "bin/cssesc" 1963 - }, 1964 - "engines": { 1965 - "node": ">=4" 1966 - } 1967 - }, 1968 - "node_modules/custom-event-polyfill": { 1969 - "version": "1.0.7", 1970 - "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz", 1971 - "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==", 1972 - "license": "MIT" 1973 - }, 1974 - "node_modules/debug": { 1975 - "version": "4.4.0", 1976 - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1977 - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1978 - "dev": true, 1979 - "dependencies": { 1980 - "ms": "^2.1.3" 1981 - }, 1982 - "engines": { 1983 - "node": ">=6.0" 1984 - }, 1985 - "peerDependenciesMeta": { 1986 - "supports-color": { 1987 - "optional": true 1988 - } 1989 - } 1990 - }, 1991 - "node_modules/deep-is": { 1992 - "version": "0.1.4", 1993 - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1994 - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1995 - "dev": true 1996 - }, 1997 - "node_modules/deepmerge": { 1998 - "version": "4.3.1", 1999 - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 2000 - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 2001 - "dev": true, 2002 - "engines": { 2003 - "node": ">=0.10.0" 2004 - } 2005 - }, 2006 - "node_modules/detect-libc": { 2007 - "version": "1.0.3", 2008 - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 2009 - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 2010 - "dev": true, 2011 - "bin": { 2012 - "detect-libc": "bin/detect-libc.js" 2013 - }, 2014 - "engines": { 2015 - "node": ">=0.10" 2016 - } 2017 - }, 2018 - "node_modules/devalue": { 2019 - "version": "5.1.1", 2020 - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", 2021 - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", 2022 - "dev": true 2023 - }, 2024 - "node_modules/emoji-picker-element": { 2025 - "version": "1.26.3", 2026 - "resolved": "https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.26.3.tgz", 2027 - "integrity": "sha512-fOMG44d/3OqTe1pPqlu5H4ZtWg7gK4Le6Bt24JTKtDyce5+EO3Mo8WA95cKHbPSsSsg7ehM12M1x3Y6U6fgvTQ==", 2028 - "license": "Apache-2.0" 2029 - }, 2030 - "node_modules/enhanced-resolve": { 2031 - "version": "5.18.1", 2032 - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", 2033 - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", 2034 - "dev": true, 2035 - "dependencies": { 2036 - "graceful-fs": "^4.2.4", 2037 - "tapable": "^2.2.0" 2038 - }, 2039 - "engines": { 2040 - "node": ">=10.13.0" 2041 - } 2042 - }, 2043 - "node_modules/esbuild": { 2044 - "version": "0.24.2", 2045 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", 2046 - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", 2047 - "dev": true, 2048 - "hasInstallScript": true, 2049 - "bin": { 2050 - "esbuild": "bin/esbuild" 2051 - }, 2052 - "engines": { 2053 - "node": ">=18" 2054 - }, 2055 - "optionalDependencies": { 2056 - "@esbuild/aix-ppc64": "0.24.2", 2057 - "@esbuild/android-arm": "0.24.2", 2058 - "@esbuild/android-arm64": "0.24.2", 2059 - "@esbuild/android-x64": "0.24.2", 2060 - "@esbuild/darwin-arm64": "0.24.2", 2061 - "@esbuild/darwin-x64": "0.24.2", 2062 - "@esbuild/freebsd-arm64": "0.24.2", 2063 - "@esbuild/freebsd-x64": "0.24.2", 2064 - "@esbuild/linux-arm": "0.24.2", 2065 - "@esbuild/linux-arm64": "0.24.2", 2066 - "@esbuild/linux-ia32": "0.24.2", 2067 - "@esbuild/linux-loong64": "0.24.2", 2068 - "@esbuild/linux-mips64el": "0.24.2", 2069 - "@esbuild/linux-ppc64": "0.24.2", 2070 - "@esbuild/linux-riscv64": "0.24.2", 2071 - "@esbuild/linux-s390x": "0.24.2", 2072 - "@esbuild/linux-x64": "0.24.2", 2073 - "@esbuild/netbsd-arm64": "0.24.2", 2074 - "@esbuild/netbsd-x64": "0.24.2", 2075 - "@esbuild/openbsd-arm64": "0.24.2", 2076 - "@esbuild/openbsd-x64": "0.24.2", 2077 - "@esbuild/sunos-x64": "0.24.2", 2078 - "@esbuild/win32-arm64": "0.24.2", 2079 - "@esbuild/win32-ia32": "0.24.2", 2080 - "@esbuild/win32-x64": "0.24.2" 2081 - } 2082 - }, 2083 - "node_modules/escape-string-regexp": { 2084 - "version": "4.0.0", 2085 - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2086 - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2087 - "dev": true, 2088 - "engines": { 2089 - "node": ">=10" 2090 - }, 2091 - "funding": { 2092 - "url": "https://github.com/sponsors/sindresorhus" 2093 - } 2094 - }, 2095 - "node_modules/eslint": { 2096 - "version": "9.21.0", 2097 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", 2098 - "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", 2099 - "dev": true, 2100 - "dependencies": { 2101 - "@eslint-community/eslint-utils": "^4.2.0", 2102 - "@eslint-community/regexpp": "^4.12.1", 2103 - "@eslint/config-array": "^0.19.2", 2104 - "@eslint/core": "^0.12.0", 2105 - "@eslint/eslintrc": "^3.3.0", 2106 - "@eslint/js": "9.21.0", 2107 - "@eslint/plugin-kit": "^0.2.7", 2108 - "@humanfs/node": "^0.16.6", 2109 - "@humanwhocodes/module-importer": "^1.0.1", 2110 - "@humanwhocodes/retry": "^0.4.2", 2111 - "@types/estree": "^1.0.6", 2112 - "@types/json-schema": "^7.0.15", 2113 - "ajv": "^6.12.4", 2114 - "chalk": "^4.0.0", 2115 - "cross-spawn": "^7.0.6", 2116 - "debug": "^4.3.2", 2117 - "escape-string-regexp": "^4.0.0", 2118 - "eslint-scope": "^8.2.0", 2119 - "eslint-visitor-keys": "^4.2.0", 2120 - "espree": "^10.3.0", 2121 - "esquery": "^1.5.0", 2122 - "esutils": "^2.0.2", 2123 - "fast-deep-equal": "^3.1.3", 2124 - "file-entry-cache": "^8.0.0", 2125 - "find-up": "^5.0.0", 2126 - "glob-parent": "^6.0.2", 2127 - "ignore": "^5.2.0", 2128 - "imurmurhash": "^0.1.4", 2129 - "is-glob": "^4.0.0", 2130 - "json-stable-stringify-without-jsonify": "^1.0.1", 2131 - "lodash.merge": "^4.6.2", 2132 - "minimatch": "^3.1.2", 2133 - "natural-compare": "^1.4.0", 2134 - "optionator": "^0.9.3" 2135 - }, 2136 - "bin": { 2137 - "eslint": "bin/eslint.js" 2138 - }, 2139 - "engines": { 2140 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2141 - }, 2142 - "funding": { 2143 - "url": "https://eslint.org/donate" 2144 - }, 2145 - "peerDependencies": { 2146 - "jiti": "*" 2147 - }, 2148 - "peerDependenciesMeta": { 2149 - "jiti": { 2150 - "optional": true 2151 - } 2152 - } 2153 - }, 2154 - "node_modules/eslint-compat-utils": { 2155 - "version": "0.5.1", 2156 - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", 2157 - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", 2158 - "dev": true, 2159 - "dependencies": { 2160 - "semver": "^7.5.4" 2161 - }, 2162 - "engines": { 2163 - "node": ">=12" 2164 - }, 2165 - "peerDependencies": { 2166 - "eslint": ">=6.0.0" 2167 - } 2168 - }, 2169 - "node_modules/eslint-config-prettier": { 2170 - "version": "10.0.1", 2171 - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", 2172 - "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", 2173 - "dev": true, 2174 - "bin": { 2175 - "eslint-config-prettier": "build/bin/cli.js" 2176 - }, 2177 - "peerDependencies": { 2178 - "eslint": ">=7.0.0" 2179 - } 2180 - }, 2181 - "node_modules/eslint-plugin-svelte": { 2182 - "version": "2.46.1", 2183 - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.46.1.tgz", 2184 - "integrity": "sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==", 2185 - "dev": true, 2186 - "dependencies": { 2187 - "@eslint-community/eslint-utils": "^4.4.0", 2188 - "@jridgewell/sourcemap-codec": "^1.4.15", 2189 - "eslint-compat-utils": "^0.5.1", 2190 - "esutils": "^2.0.3", 2191 - "known-css-properties": "^0.35.0", 2192 - "postcss": "^8.4.38", 2193 - "postcss-load-config": "^3.1.4", 2194 - "postcss-safe-parser": "^6.0.0", 2195 - "postcss-selector-parser": "^6.1.0", 2196 - "semver": "^7.6.2", 2197 - "svelte-eslint-parser": "^0.43.0" 2198 - }, 2199 - "engines": { 2200 - "node": "^14.17.0 || >=16.0.0" 2201 - }, 2202 - "funding": { 2203 - "url": "https://github.com/sponsors/ota-meshi" 2204 - }, 2205 - "peerDependencies": { 2206 - "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", 2207 - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" 2208 - }, 2209 - "peerDependenciesMeta": { 2210 - "svelte": { 2211 - "optional": true 2212 - } 2213 - } 2214 - }, 2215 - "node_modules/eslint-scope": { 2216 - "version": "8.2.0", 2217 - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", 2218 - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", 2219 - "dev": true, 2220 - "dependencies": { 2221 - "esrecurse": "^4.3.0", 2222 - "estraverse": "^5.2.0" 2223 - }, 2224 - "engines": { 2225 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2226 - }, 2227 - "funding": { 2228 - "url": "https://opencollective.com/eslint" 2229 - } 2230 - }, 2231 - "node_modules/eslint-visitor-keys": { 2232 - "version": "4.2.0", 2233 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 2234 - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 2235 - "dev": true, 2236 - "engines": { 2237 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2238 - }, 2239 - "funding": { 2240 - "url": "https://opencollective.com/eslint" 2241 - } 2242 - }, 2243 - "node_modules/esm-env": { 2244 - "version": "1.2.2", 2245 - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", 2246 - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" 2247 - }, 2248 - "node_modules/espree": { 2249 - "version": "10.3.0", 2250 - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 2251 - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 2252 - "dev": true, 2253 - "dependencies": { 2254 - "acorn": "^8.14.0", 2255 - "acorn-jsx": "^5.3.2", 2256 - "eslint-visitor-keys": "^4.2.0" 2257 - }, 2258 - "engines": { 2259 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2260 - }, 2261 - "funding": { 2262 - "url": "https://opencollective.com/eslint" 2263 - } 2264 - }, 2265 - "node_modules/esquery": { 2266 - "version": "1.6.0", 2267 - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 2268 - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 2269 - "dev": true, 2270 - "dependencies": { 2271 - "estraverse": "^5.1.0" 2272 - }, 2273 - "engines": { 2274 - "node": ">=0.10" 2275 - } 2276 - }, 2277 - "node_modules/esrap": { 2278 - "version": "1.4.5", 2279 - "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.5.tgz", 2280 - "integrity": "sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g==", 2281 - "dependencies": { 2282 - "@jridgewell/sourcemap-codec": "^1.4.15" 2283 - } 2284 - }, 2285 - "node_modules/esrecurse": { 2286 - "version": "4.3.0", 2287 - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2288 - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2289 - "dev": true, 2290 - "dependencies": { 2291 - "estraverse": "^5.2.0" 2292 - }, 2293 - "engines": { 2294 - "node": ">=4.0" 2295 - } 2296 - }, 2297 - "node_modules/estraverse": { 2298 - "version": "5.3.0", 2299 - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2300 - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2301 - "dev": true, 2302 - "engines": { 2303 - "node": ">=4.0" 2304 - } 2305 - }, 2306 - "node_modules/esutils": { 2307 - "version": "2.0.3", 2308 - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2309 - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2310 - "dev": true, 2311 - "engines": { 2312 - "node": ">=0.10.0" 2313 - } 2314 - }, 2315 - "node_modules/fast-deep-equal": { 2316 - "version": "3.1.3", 2317 - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2318 - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2319 - "dev": true 2320 - }, 2321 - "node_modules/fast-glob": { 2322 - "version": "3.3.3", 2323 - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 2324 - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 2325 - "dev": true, 2326 - "dependencies": { 2327 - "@nodelib/fs.stat": "^2.0.2", 2328 - "@nodelib/fs.walk": "^1.2.3", 2329 - "glob-parent": "^5.1.2", 2330 - "merge2": "^1.3.0", 2331 - "micromatch": "^4.0.8" 2332 - }, 2333 - "engines": { 2334 - "node": ">=8.6.0" 2335 - } 2336 - }, 2337 - "node_modules/fast-glob/node_modules/glob-parent": { 2338 - "version": "5.1.2", 2339 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2340 - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2341 - "dev": true, 2342 - "dependencies": { 2343 - "is-glob": "^4.0.1" 2344 - }, 2345 - "engines": { 2346 - "node": ">= 6" 2347 - } 2348 - }, 2349 - "node_modules/fast-json-stable-stringify": { 2350 - "version": "2.1.0", 2351 - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2352 - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2353 - "dev": true 2354 - }, 2355 - "node_modules/fast-levenshtein": { 2356 - "version": "2.0.6", 2357 - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2358 - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2359 - "dev": true 2360 - }, 2361 - "node_modules/fastq": { 2362 - "version": "1.19.0", 2363 - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", 2364 - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", 2365 - "dev": true, 2366 - "dependencies": { 2367 - "reusify": "^1.0.4" 2368 - } 2369 - }, 2370 - "node_modules/fdir": { 2371 - "version": "6.4.3", 2372 - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", 2373 - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", 2374 - "dev": true, 2375 - "peerDependencies": { 2376 - "picomatch": "^3 || ^4" 2377 - }, 2378 - "peerDependenciesMeta": { 2379 - "picomatch": { 2380 - "optional": true 2381 - } 2382 - } 2383 - }, 2384 - "node_modules/file-entry-cache": { 2385 - "version": "8.0.0", 2386 - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2387 - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2388 - "dev": true, 2389 - "dependencies": { 2390 - "flat-cache": "^4.0.0" 2391 - }, 2392 - "engines": { 2393 - "node": ">=16.0.0" 2394 - } 2395 - }, 2396 - "node_modules/fill-range": { 2397 - "version": "7.1.1", 2398 - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2399 - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2400 - "dev": true, 2401 - "dependencies": { 2402 - "to-regex-range": "^5.0.1" 2403 - }, 2404 - "engines": { 2405 - "node": ">=8" 2406 - } 2407 - }, 2408 - "node_modules/find-up": { 2409 - "version": "5.0.0", 2410 - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2411 - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2412 - "dev": true, 2413 - "dependencies": { 2414 - "locate-path": "^6.0.0", 2415 - "path-exists": "^4.0.0" 2416 - }, 2417 - "engines": { 2418 - "node": ">=10" 2419 - }, 2420 - "funding": { 2421 - "url": "https://github.com/sponsors/sindresorhus" 2422 - } 2423 - }, 2424 - "node_modules/flat-cache": { 2425 - "version": "4.0.1", 2426 - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 2427 - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2428 - "dev": true, 2429 - "dependencies": { 2430 - "flatted": "^3.2.9", 2431 - "keyv": "^4.5.4" 2432 - }, 2433 - "engines": { 2434 - "node": ">=16" 2435 - } 2436 - }, 2437 - "node_modules/flatted": { 2438 - "version": "3.3.3", 2439 - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 2440 - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 2441 - "dev": true 2442 - }, 2443 - "node_modules/flexsearch": { 2444 - "version": "0.8.167", 2445 - "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.8.167.tgz", 2446 - "integrity": "sha512-iCBbY9npWhNlTCiHha2pwGqtbhpSEHx8+m5FJab+DLr/IKMneLNDgWbu2+IOvsAHo/Euo2Fu/5awrAEhN4q8Jw==", 2447 - "funding": [ 2448 - { 2449 - "type": "github", 2450 - "url": "https://github.com/ts-thomas" 2451 - }, 2452 - { 2453 - "type": "opencollective", 2454 - "url": "https://opencollective.com/flexsearch" 2455 - }, 2456 - { 2457 - "type": "patreon", 2458 - "url": "https://patreon.com/user?u=96245532" 2459 - }, 2460 - { 2461 - "type": "liberapay", 2462 - "url": "https://liberapay.com/ts-thomas" 2463 - }, 2464 - { 2465 - "type": "paypal", 2466 - "url": "https://www.paypal.com/donate/?hosted_button_id=GEVR88FC9BWRW" 2467 - }, 2468 - { 2469 - "type": "bountysource", 2470 - "url": "https://salt.bountysource.com/teams/ts-thomas" 2471 - } 2472 - ], 2473 - "license": "Apache-2.0" 2474 - }, 2475 - "node_modules/fsevents": { 2476 - "version": "2.3.3", 2477 - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2478 - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2479 - "dev": true, 2480 - "hasInstallScript": true, 2481 - "optional": true, 2482 - "os": [ 2483 - "darwin" 2484 - ], 2485 - "engines": { 2486 - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2487 - } 2488 - }, 2489 - "node_modules/glob-parent": { 2490 - "version": "6.0.2", 2491 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2492 - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2493 - "dev": true, 2494 - "dependencies": { 2495 - "is-glob": "^4.0.3" 2496 - }, 2497 - "engines": { 2498 - "node": ">=10.13.0" 2499 - } 2500 - }, 2501 - "node_modules/globals": { 2502 - "version": "15.15.0", 2503 - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", 2504 - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", 2505 - "dev": true, 2506 - "engines": { 2507 - "node": ">=18" 2508 - }, 2509 - "funding": { 2510 - "url": "https://github.com/sponsors/sindresorhus" 2511 - } 2512 - }, 2513 - "node_modules/graceful-fs": { 2514 - "version": "4.2.11", 2515 - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2516 - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 2517 - "dev": true 2518 - }, 2519 - "node_modules/graphemer": { 2520 - "version": "1.4.0", 2521 - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 2522 - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" 2523 - }, 2524 - "node_modules/has-flag": { 2525 - "version": "4.0.0", 2526 - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2527 - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2528 - "dev": true, 2529 - "engines": { 2530 - "node": ">=8" 2531 - } 2532 - }, 2533 - "node_modules/hls.js": { 2534 - "version": "1.6.2", 2535 - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.2.tgz", 2536 - "integrity": "sha512-rx+pETSCJEDThm/JCm8CuadcAC410cVjb1XVXFNDKFuylaayHk1+tFxhkjvnMDAfqsJHxZXDAJ3Uc2d5xQyWlQ==", 2537 - "license": "Apache-2.0" 2538 - }, 2539 - "node_modules/ignore": { 2540 - "version": "5.3.2", 2541 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 2542 - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 2543 - "dev": true, 2544 - "engines": { 2545 - "node": ">= 4" 2546 - } 2547 - }, 2548 - "node_modules/import-fresh": { 2549 - "version": "3.3.1", 2550 - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 2551 - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 2552 - "dev": true, 2553 - "dependencies": { 2554 - "parent-module": "^1.0.0", 2555 - "resolve-from": "^4.0.0" 2556 - }, 2557 - "engines": { 2558 - "node": ">=6" 2559 - }, 2560 - "funding": { 2561 - "url": "https://github.com/sponsors/sindresorhus" 2562 - } 2563 - }, 2564 - "node_modules/import-meta-resolve": { 2565 - "version": "4.1.0", 2566 - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", 2567 - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", 2568 - "dev": true, 2569 - "funding": { 2570 - "type": "github", 2571 - "url": "https://github.com/sponsors/wooorm" 2572 - } 2573 - }, 2574 - "node_modules/imurmurhash": { 2575 - "version": "0.1.4", 2576 - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2577 - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2578 - "dev": true, 2579 - "engines": { 2580 - "node": ">=0.8.19" 2581 - } 2582 - }, 2583 - "node_modules/inline-style-parser": { 2584 - "version": "0.2.4", 2585 - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", 2586 - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", 2587 - "license": "MIT" 2588 - }, 2589 - "node_modules/is-emoji-supported": { 2590 - "version": "0.0.5", 2591 - "resolved": "https://registry.npmjs.org/is-emoji-supported/-/is-emoji-supported-0.0.5.tgz", 2592 - "integrity": "sha512-WOlXUhDDHxYqcSmFZis+xWhhqXiK2SU0iYiqmth5Ip0FHLZQAt9rKL5ahnilE8/86WH8tZ3bmNNNC+bTzamqlw==", 2593 - "license": "MIT" 2594 - }, 2595 - "node_modules/is-extglob": { 2596 - "version": "2.1.1", 2597 - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2598 - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2599 - "dev": true, 2600 - "engines": { 2601 - "node": ">=0.10.0" 2602 - } 2603 - }, 2604 - "node_modules/is-glob": { 2605 - "version": "4.0.3", 2606 - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2607 - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2608 - "dev": true, 2609 - "dependencies": { 2610 - "is-extglob": "^2.1.1" 2611 - }, 2612 - "engines": { 2613 - "node": ">=0.10.0" 2614 - } 2615 - }, 2616 - "node_modules/is-number": { 2617 - "version": "7.0.0", 2618 - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2619 - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2620 - "dev": true, 2621 - "engines": { 2622 - "node": ">=0.12.0" 2623 - } 2624 - }, 2625 - "node_modules/is-reference": { 2626 - "version": "3.0.3", 2627 - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", 2628 - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", 2629 - "dependencies": { 2630 - "@types/estree": "^1.0.6" 2631 - } 2632 - }, 2633 - "node_modules/isexe": { 2634 - "version": "2.0.0", 2635 - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2636 - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2637 - "dev": true 2638 - }, 2639 - "node_modules/iso-datestring-validator": { 2640 - "version": "2.2.2", 2641 - "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", 2642 - "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==", 2643 - "license": "MIT" 2644 - }, 2645 - "node_modules/jiti": { 2646 - "version": "2.4.2", 2647 - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", 2648 - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", 2649 - "dev": true, 2650 - "bin": { 2651 - "jiti": "lib/jiti-cli.mjs" 2652 - } 2653 - }, 2654 - "node_modules/js-yaml": { 2655 - "version": "4.1.0", 2656 - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2657 - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2658 - "dev": true, 2659 - "dependencies": { 2660 - "argparse": "^2.0.1" 2661 - }, 2662 - "bin": { 2663 - "js-yaml": "bin/js-yaml.js" 2664 - } 2665 - }, 2666 - "node_modules/json-buffer": { 2667 - "version": "3.0.1", 2668 - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 2669 - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2670 - "dev": true 2671 - }, 2672 - "node_modules/json-schema-traverse": { 2673 - "version": "0.4.1", 2674 - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2675 - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2676 - "dev": true 2677 - }, 2678 - "node_modules/json-stable-stringify-without-jsonify": { 2679 - "version": "1.0.1", 2680 - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2681 - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2682 - "dev": true 2683 - }, 2684 - "node_modules/keyv": { 2685 - "version": "4.5.4", 2686 - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 2687 - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2688 - "dev": true, 2689 - "dependencies": { 2690 - "json-buffer": "3.0.1" 2691 - } 2692 - }, 2693 - "node_modules/kleur": { 2694 - "version": "4.1.5", 2695 - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 2696 - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 2697 - "dev": true, 2698 - "engines": { 2699 - "node": ">=6" 2700 - } 2701 - }, 2702 - "node_modules/known-css-properties": { 2703 - "version": "0.35.0", 2704 - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", 2705 - "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", 2706 - "dev": true 2707 - }, 2708 - "node_modules/levn": { 2709 - "version": "0.4.1", 2710 - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2711 - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2712 - "dev": true, 2713 - "dependencies": { 2714 - "prelude-ls": "^1.2.1", 2715 - "type-check": "~0.4.0" 2716 - }, 2717 - "engines": { 2718 - "node": ">= 0.8.0" 2719 - } 2720 - }, 2721 - "node_modules/lightningcss": { 2722 - "version": "1.29.1", 2723 - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", 2724 - "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", 2725 - "dev": true, 2726 - "dependencies": { 2727 - "detect-libc": "^1.0.3" 2728 - }, 2729 - "engines": { 2730 - "node": ">= 12.0.0" 2731 - }, 2732 - "funding": { 2733 - "type": "opencollective", 2734 - "url": "https://opencollective.com/parcel" 2735 - }, 2736 - "optionalDependencies": { 2737 - "lightningcss-darwin-arm64": "1.29.1", 2738 - "lightningcss-darwin-x64": "1.29.1", 2739 - "lightningcss-freebsd-x64": "1.29.1", 2740 - "lightningcss-linux-arm-gnueabihf": "1.29.1", 2741 - "lightningcss-linux-arm64-gnu": "1.29.1", 2742 - "lightningcss-linux-arm64-musl": "1.29.1", 2743 - "lightningcss-linux-x64-gnu": "1.29.1", 2744 - "lightningcss-linux-x64-musl": "1.29.1", 2745 - "lightningcss-win32-arm64-msvc": "1.29.1", 2746 - "lightningcss-win32-x64-msvc": "1.29.1" 2747 - } 2748 - }, 2749 - "node_modules/lightningcss-darwin-arm64": { 2750 - "version": "1.29.1", 2751 - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", 2752 - "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", 2753 - "cpu": [ 2754 - "arm64" 2755 - ], 2756 - "dev": true, 2757 - "optional": true, 2758 - "os": [ 2759 - "darwin" 2760 - ], 2761 - "engines": { 2762 - "node": ">= 12.0.0" 2763 - }, 2764 - "funding": { 2765 - "type": "opencollective", 2766 - "url": "https://opencollective.com/parcel" 2767 - } 2768 - }, 2769 - "node_modules/lightningcss-darwin-x64": { 2770 - "version": "1.29.1", 2771 - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", 2772 - "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", 2773 - "cpu": [ 2774 - "x64" 2775 - ], 2776 - "dev": true, 2777 - "optional": true, 2778 - "os": [ 2779 - "darwin" 2780 - ], 2781 - "engines": { 2782 - "node": ">= 12.0.0" 2783 - }, 2784 - "funding": { 2785 - "type": "opencollective", 2786 - "url": "https://opencollective.com/parcel" 2787 - } 2788 - }, 2789 - "node_modules/lightningcss-freebsd-x64": { 2790 - "version": "1.29.1", 2791 - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", 2792 - "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", 2793 - "cpu": [ 2794 - "x64" 2795 - ], 2796 - "dev": true, 2797 - "optional": true, 2798 - "os": [ 2799 - "freebsd" 2800 - ], 2801 - "engines": { 2802 - "node": ">= 12.0.0" 2803 - }, 2804 - "funding": { 2805 - "type": "opencollective", 2806 - "url": "https://opencollective.com/parcel" 2807 - } 2808 - }, 2809 - "node_modules/lightningcss-linux-arm-gnueabihf": { 2810 - "version": "1.29.1", 2811 - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", 2812 - "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", 2813 - "cpu": [ 2814 - "arm" 2815 - ], 2816 - "dev": true, 2817 - "optional": true, 2818 - "os": [ 2819 - "linux" 2820 - ], 2821 - "engines": { 2822 - "node": ">= 12.0.0" 2823 - }, 2824 - "funding": { 2825 - "type": "opencollective", 2826 - "url": "https://opencollective.com/parcel" 2827 - } 2828 - }, 2829 - "node_modules/lightningcss-linux-arm64-gnu": { 2830 - "version": "1.29.1", 2831 - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", 2832 - "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", 2833 - "cpu": [ 2834 - "arm64" 2835 - ], 2836 - "dev": true, 2837 - "optional": true, 2838 - "os": [ 2839 - "linux" 2840 - ], 2841 - "engines": { 2842 - "node": ">= 12.0.0" 2843 - }, 2844 - "funding": { 2845 - "type": "opencollective", 2846 - "url": "https://opencollective.com/parcel" 2847 - } 2848 - }, 2849 - "node_modules/lightningcss-linux-arm64-musl": { 2850 - "version": "1.29.1", 2851 - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", 2852 - "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", 2853 - "cpu": [ 2854 - "arm64" 2855 - ], 2856 - "dev": true, 2857 - "optional": true, 2858 - "os": [ 2859 - "linux" 2860 - ], 2861 - "engines": { 2862 - "node": ">= 12.0.0" 2863 - }, 2864 - "funding": { 2865 - "type": "opencollective", 2866 - "url": "https://opencollective.com/parcel" 2867 - } 2868 - }, 2869 - "node_modules/lightningcss-linux-x64-gnu": { 2870 - "version": "1.29.1", 2871 - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", 2872 - "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", 2873 - "cpu": [ 2874 - "x64" 2875 - ], 2876 - "dev": true, 2877 - "optional": true, 2878 - "os": [ 2879 - "linux" 2880 - ], 2881 - "engines": { 2882 - "node": ">= 12.0.0" 2883 - }, 2884 - "funding": { 2885 - "type": "opencollective", 2886 - "url": "https://opencollective.com/parcel" 2887 - } 2888 - }, 2889 - "node_modules/lightningcss-linux-x64-musl": { 2890 - "version": "1.29.1", 2891 - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", 2892 - "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", 2893 - "cpu": [ 2894 - "x64" 2895 - ], 2896 - "dev": true, 2897 - "optional": true, 2898 - "os": [ 2899 - "linux" 2900 - ], 2901 - "engines": { 2902 - "node": ">= 12.0.0" 2903 - }, 2904 - "funding": { 2905 - "type": "opencollective", 2906 - "url": "https://opencollective.com/parcel" 2907 - } 2908 - }, 2909 - "node_modules/lightningcss-win32-arm64-msvc": { 2910 - "version": "1.29.1", 2911 - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", 2912 - "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", 2913 - "cpu": [ 2914 - "arm64" 2915 - ], 2916 - "dev": true, 2917 - "optional": true, 2918 - "os": [ 2919 - "win32" 2920 - ], 2921 - "engines": { 2922 - "node": ">= 12.0.0" 2923 - }, 2924 - "funding": { 2925 - "type": "opencollective", 2926 - "url": "https://opencollective.com/parcel" 2927 - } 2928 - }, 2929 - "node_modules/lightningcss-win32-x64-msvc": { 2930 - "version": "1.29.1", 2931 - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", 2932 - "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", 2933 - "cpu": [ 2934 - "x64" 2935 - ], 2936 - "dev": true, 2937 - "optional": true, 2938 - "os": [ 2939 - "win32" 2940 - ], 2941 - "engines": { 2942 - "node": ">= 12.0.0" 2943 - }, 2944 - "funding": { 2945 - "type": "opencollective", 2946 - "url": "https://opencollective.com/parcel" 2947 - } 2948 - }, 2949 - "node_modules/lilconfig": { 2950 - "version": "2.1.0", 2951 - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 2952 - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 2953 - "dev": true, 2954 - "engines": { 2955 - "node": ">=10" 2956 - } 2957 - }, 2958 - "node_modules/loadjs": { 2959 - "version": "4.3.0", 2960 - "resolved": "https://registry.npmjs.org/loadjs/-/loadjs-4.3.0.tgz", 2961 - "integrity": "sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==", 2962 - "license": "MIT" 2963 - }, 2964 - "node_modules/locate-character": { 2965 - "version": "3.0.0", 2966 - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 2967 - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" 2968 - }, 2969 - "node_modules/locate-path": { 2970 - "version": "6.0.0", 2971 - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2972 - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2973 - "dev": true, 2974 - "dependencies": { 2975 - "p-locate": "^5.0.0" 2976 - }, 2977 - "engines": { 2978 - "node": ">=10" 2979 - }, 2980 - "funding": { 2981 - "url": "https://github.com/sponsors/sindresorhus" 2982 - } 2983 - }, 2984 - "node_modules/lodash.merge": { 2985 - "version": "4.6.2", 2986 - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2987 - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2988 - "dev": true 2989 - }, 2990 - "node_modules/magic-string": { 2991 - "version": "0.30.17", 2992 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 2993 - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 2994 - "dependencies": { 2995 - "@jridgewell/sourcemap-codec": "^1.5.0" 2996 - } 2997 - }, 2998 - "node_modules/merge2": { 2999 - "version": "1.4.1", 3000 - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 3001 - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 3002 - "dev": true, 3003 - "engines": { 3004 - "node": ">= 8" 3005 - } 3006 - }, 3007 - "node_modules/micromatch": { 3008 - "version": "4.0.8", 3009 - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 3010 - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 3011 - "dev": true, 3012 - "dependencies": { 3013 - "braces": "^3.0.3", 3014 - "picomatch": "^2.3.1" 3015 - }, 3016 - "engines": { 3017 - "node": ">=8.6" 3018 - } 3019 - }, 3020 - "node_modules/micromatch/node_modules/picomatch": { 3021 - "version": "2.3.1", 3022 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3023 - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3024 - "dev": true, 3025 - "engines": { 3026 - "node": ">=8.6" 3027 - }, 3028 - "funding": { 3029 - "url": "https://github.com/sponsors/jonschlinkert" 3030 - } 3031 - }, 3032 - "node_modules/mini-svg-data-uri": { 3033 - "version": "1.4.4", 3034 - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", 3035 - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", 3036 - "dev": true, 3037 - "bin": { 3038 - "mini-svg-data-uri": "cli.js" 3039 - } 3040 - }, 3041 - "node_modules/minimatch": { 3042 - "version": "3.1.2", 3043 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3044 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3045 - "dev": true, 3046 - "dependencies": { 3047 - "brace-expansion": "^1.1.7" 3048 - }, 3049 - "engines": { 3050 - "node": "*" 3051 - } 3052 - }, 3053 - "node_modules/mri": { 3054 - "version": "1.2.0", 3055 - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 3056 - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 3057 - "dev": true, 3058 - "engines": { 3059 - "node": ">=4" 3060 - } 3061 - }, 3062 - "node_modules/mrmime": { 3063 - "version": "2.0.1", 3064 - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", 3065 - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", 3066 - "dev": true, 3067 - "engines": { 3068 - "node": ">=10" 3069 - } 3070 - }, 3071 - "node_modules/ms": { 3072 - "version": "2.1.3", 3073 - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3074 - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 3075 - "dev": true 3076 - }, 3077 - "node_modules/multiformats": { 3078 - "version": "9.9.0", 3079 - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 3080 - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", 3081 - "license": "(Apache-2.0 AND MIT)" 3082 - }, 3083 - "node_modules/nanoid": { 3084 - "version": "3.3.8", 3085 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 3086 - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 3087 - "dev": true, 3088 - "funding": [ 3089 - { 3090 - "type": "github", 3091 - "url": "https://github.com/sponsors/ai" 3092 - } 3093 - ], 3094 - "bin": { 3095 - "nanoid": "bin/nanoid.cjs" 3096 - }, 3097 - "engines": { 3098 - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 3099 - } 3100 - }, 3101 - "node_modules/natural-compare": { 3102 - "version": "1.4.0", 3103 - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3104 - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 3105 - "dev": true 3106 - }, 3107 - "node_modules/number-flow": { 3108 - "version": "0.5.7", 3109 - "resolved": "https://registry.npmjs.org/number-flow/-/number-flow-0.5.7.tgz", 3110 - "integrity": "sha512-P83Y9rBgN3Xpz5677YDNtuQHZpIldw6WXeWRg0+edrfFthhV7QqRdABas5gtu07QPLvbA8XhfO69rIvbKRzYIg==", 3111 - "license": "MIT", 3112 - "dependencies": { 3113 - "esm-env": "^1.1.4" 3114 - } 3115 - }, 3116 - "node_modules/optionator": { 3117 - "version": "0.9.4", 3118 - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 3119 - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 3120 - "dev": true, 3121 - "dependencies": { 3122 - "deep-is": "^0.1.3", 3123 - "fast-levenshtein": "^2.0.6", 3124 - "levn": "^0.4.1", 3125 - "prelude-ls": "^1.2.1", 3126 - "type-check": "^0.4.0", 3127 - "word-wrap": "^1.2.5" 3128 - }, 3129 - "engines": { 3130 - "node": ">= 0.8.0" 3131 - } 3132 - }, 3133 - "node_modules/p-limit": { 3134 - "version": "3.1.0", 3135 - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 3136 - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 3137 - "dev": true, 3138 - "dependencies": { 3139 - "yocto-queue": "^0.1.0" 3140 - }, 3141 - "engines": { 3142 - "node": ">=10" 3143 - }, 3144 - "funding": { 3145 - "url": "https://github.com/sponsors/sindresorhus" 3146 - } 3147 - }, 3148 - "node_modules/p-locate": { 3149 - "version": "5.0.0", 3150 - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 3151 - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 3152 - "dev": true, 3153 - "dependencies": { 3154 - "p-limit": "^3.0.2" 3155 - }, 3156 - "engines": { 3157 - "node": ">=10" 3158 - }, 3159 - "funding": { 3160 - "url": "https://github.com/sponsors/sindresorhus" 3161 - } 3162 - }, 3163 - "node_modules/parent-module": { 3164 - "version": "1.0.1", 3165 - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 3166 - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 3167 - "dev": true, 3168 - "dependencies": { 3169 - "callsites": "^3.0.0" 3170 - }, 3171 - "engines": { 3172 - "node": ">=6" 3173 - } 3174 - }, 3175 - "node_modules/path-exists": { 3176 - "version": "4.0.0", 3177 - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 3178 - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 3179 - "dev": true, 3180 - "engines": { 3181 - "node": ">=8" 3182 - } 3183 - }, 3184 - "node_modules/path-key": { 3185 - "version": "3.1.1", 3186 - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3187 - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3188 - "dev": true, 3189 - "engines": { 3190 - "node": ">=8" 3191 - } 3192 - }, 3193 - "node_modules/picocolors": { 3194 - "version": "1.1.1", 3195 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 3196 - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 3197 - "dev": true 3198 - }, 3199 - "node_modules/picomatch": { 3200 - "version": "4.0.2", 3201 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 3202 - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 3203 - "dev": true, 3204 - "optional": true, 3205 - "peer": true, 3206 - "engines": { 3207 - "node": ">=12" 3208 - }, 3209 - "funding": { 3210 - "url": "https://github.com/sponsors/jonschlinkert" 3211 - } 3212 - }, 3213 - "node_modules/plyr": { 3214 - "version": "3.7.8", 3215 - "resolved": "https://registry.npmjs.org/plyr/-/plyr-3.7.8.tgz", 3216 - "integrity": "sha512-yG/EHDobwbB/uP+4Bm6eUpJ93f8xxHjjk2dYcD1Oqpe1EcuQl5tzzw9Oq+uVAzd2lkM11qZfydSiyIpiB8pgdA==", 3217 - "license": "MIT", 3218 - "dependencies": { 3219 - "core-js": "^3.26.1", 3220 - "custom-event-polyfill": "^1.0.7", 3221 - "loadjs": "^4.2.0", 3222 - "rangetouch": "^2.0.1", 3223 - "url-polyfill": "^1.1.12" 3224 - } 3225 - }, 3226 - "node_modules/postcss": { 3227 - "version": "8.5.3", 3228 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 3229 - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 3230 - "dev": true, 3231 - "funding": [ 3232 - { 3233 - "type": "opencollective", 3234 - "url": "https://opencollective.com/postcss/" 3235 - }, 3236 - { 3237 - "type": "tidelift", 3238 - "url": "https://tidelift.com/funding/github/npm/postcss" 3239 - }, 3240 - { 3241 - "type": "github", 3242 - "url": "https://github.com/sponsors/ai" 3243 - } 3244 - ], 3245 - "dependencies": { 3246 - "nanoid": "^3.3.8", 3247 - "picocolors": "^1.1.1", 3248 - "source-map-js": "^1.2.1" 3249 - }, 3250 - "engines": { 3251 - "node": "^10 || ^12 || >=14" 3252 - } 3253 - }, 3254 - "node_modules/postcss-load-config": { 3255 - "version": "3.1.4", 3256 - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 3257 - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 3258 - "dev": true, 3259 - "dependencies": { 3260 - "lilconfig": "^2.0.5", 3261 - "yaml": "^1.10.2" 3262 - }, 3263 - "engines": { 3264 - "node": ">= 10" 3265 - }, 3266 - "funding": { 3267 - "type": "opencollective", 3268 - "url": "https://opencollective.com/postcss/" 3269 - }, 3270 - "peerDependencies": { 3271 - "postcss": ">=8.0.9", 3272 - "ts-node": ">=9.0.0" 3273 - }, 3274 - "peerDependenciesMeta": { 3275 - "postcss": { 3276 - "optional": true 3277 - }, 3278 - "ts-node": { 3279 - "optional": true 3280 - } 3281 - } 3282 - }, 3283 - "node_modules/postcss-load-config/node_modules/yaml": { 3284 - "version": "1.10.2", 3285 - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 3286 - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 3287 - "dev": true, 3288 - "engines": { 3289 - "node": ">= 6" 3290 - } 3291 - }, 3292 - "node_modules/postcss-safe-parser": { 3293 - "version": "6.0.0", 3294 - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", 3295 - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", 3296 - "dev": true, 3297 - "engines": { 3298 - "node": ">=12.0" 3299 - }, 3300 - "funding": { 3301 - "type": "opencollective", 3302 - "url": "https://opencollective.com/postcss/" 3303 - }, 3304 - "peerDependencies": { 3305 - "postcss": "^8.3.3" 3306 - } 3307 - }, 3308 - "node_modules/postcss-scss": { 3309 - "version": "4.0.9", 3310 - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", 3311 - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", 3312 - "dev": true, 3313 - "funding": [ 3314 - { 3315 - "type": "opencollective", 3316 - "url": "https://opencollective.com/postcss/" 3317 - }, 3318 - { 3319 - "type": "tidelift", 3320 - "url": "https://tidelift.com/funding/github/npm/postcss-scss" 3321 - }, 3322 - { 3323 - "type": "github", 3324 - "url": "https://github.com/sponsors/ai" 3325 - } 3326 - ], 3327 - "engines": { 3328 - "node": ">=12.0" 3329 - }, 3330 - "peerDependencies": { 3331 - "postcss": "^8.4.29" 3332 - } 3333 - }, 3334 - "node_modules/postcss-selector-parser": { 3335 - "version": "6.1.2", 3336 - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 3337 - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 3338 - "dev": true, 3339 - "dependencies": { 3340 - "cssesc": "^3.0.0", 3341 - "util-deprecate": "^1.0.2" 3342 - }, 3343 - "engines": { 3344 - "node": ">=4" 3345 - } 3346 - }, 3347 - "node_modules/prelude-ls": { 3348 - "version": "1.2.1", 3349 - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 3350 - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 3351 - "dev": true, 3352 - "engines": { 3353 - "node": ">= 0.8.0" 3354 - } 3355 - }, 3356 - "node_modules/prettier": { 3357 - "version": "3.5.2", 3358 - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", 3359 - "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", 3360 - "dev": true, 3361 - "bin": { 3362 - "prettier": "bin/prettier.cjs" 3363 - }, 3364 - "engines": { 3365 - "node": ">=14" 3366 - }, 3367 - "funding": { 3368 - "url": "https://github.com/prettier/prettier?sponsor=1" 3369 - } 3370 - }, 3371 - "node_modules/prettier-plugin-svelte": { 3372 - "version": "3.3.3", 3373 - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.3.tgz", 3374 - "integrity": "sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==", 3375 - "dev": true, 3376 - "peerDependencies": { 3377 - "prettier": "^3.0.0", 3378 - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" 3379 - } 3380 - }, 3381 - "node_modules/prettier-plugin-tailwindcss": { 3382 - "version": "0.6.11", 3383 - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.11.tgz", 3384 - "integrity": "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==", 3385 - "dev": true, 3386 - "engines": { 3387 - "node": ">=14.21.3" 3388 - }, 3389 - "peerDependencies": { 3390 - "@ianvs/prettier-plugin-sort-imports": "*", 3391 - "@prettier/plugin-pug": "*", 3392 - "@shopify/prettier-plugin-liquid": "*", 3393 - "@trivago/prettier-plugin-sort-imports": "*", 3394 - "@zackad/prettier-plugin-twig": "*", 3395 - "prettier": "^3.0", 3396 - "prettier-plugin-astro": "*", 3397 - "prettier-plugin-css-order": "*", 3398 - "prettier-plugin-import-sort": "*", 3399 - "prettier-plugin-jsdoc": "*", 3400 - "prettier-plugin-marko": "*", 3401 - "prettier-plugin-multiline-arrays": "*", 3402 - "prettier-plugin-organize-attributes": "*", 3403 - "prettier-plugin-organize-imports": "*", 3404 - "prettier-plugin-sort-imports": "*", 3405 - "prettier-plugin-style-order": "*", 3406 - "prettier-plugin-svelte": "*" 3407 - }, 3408 - "peerDependenciesMeta": { 3409 - "@ianvs/prettier-plugin-sort-imports": { 3410 - "optional": true 3411 - }, 3412 - "@prettier/plugin-pug": { 3413 - "optional": true 3414 - }, 3415 - "@shopify/prettier-plugin-liquid": { 3416 - "optional": true 3417 - }, 3418 - "@trivago/prettier-plugin-sort-imports": { 3419 - "optional": true 3420 - }, 3421 - "@zackad/prettier-plugin-twig": { 3422 - "optional": true 3423 - }, 3424 - "prettier-plugin-astro": { 3425 - "optional": true 3426 - }, 3427 - "prettier-plugin-css-order": { 3428 - "optional": true 3429 - }, 3430 - "prettier-plugin-import-sort": { 3431 - "optional": true 3432 - }, 3433 - "prettier-plugin-jsdoc": { 3434 - "optional": true 3435 - }, 3436 - "prettier-plugin-marko": { 3437 - "optional": true 3438 - }, 3439 - "prettier-plugin-multiline-arrays": { 3440 - "optional": true 3441 - }, 3442 - "prettier-plugin-organize-attributes": { 3443 - "optional": true 3444 - }, 3445 - "prettier-plugin-organize-imports": { 3446 - "optional": true 3447 - }, 3448 - "prettier-plugin-sort-imports": { 3449 - "optional": true 3450 - }, 3451 - "prettier-plugin-style-order": { 3452 - "optional": true 3453 - }, 3454 - "prettier-plugin-svelte": { 3455 - "optional": true 3456 - } 3457 - } 3458 - }, 3459 - "node_modules/punycode": { 3460 - "version": "2.3.1", 3461 - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 3462 - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 3463 - "dev": true, 3464 - "engines": { 3465 - "node": ">=6" 3466 - } 3467 - }, 3468 - "node_modules/queue-microtask": { 3469 - "version": "1.2.3", 3470 - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 3471 - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 3472 - "dev": true, 3473 - "funding": [ 3474 - { 3475 - "type": "github", 3476 - "url": "https://github.com/sponsors/feross" 3477 - }, 3478 - { 3479 - "type": "patreon", 3480 - "url": "https://www.patreon.com/feross" 3481 - }, 3482 - { 3483 - "type": "consulting", 3484 - "url": "https://feross.org/support" 3485 - } 3486 - ] 3487 - }, 3488 - "node_modules/rangetouch": { 3489 - "version": "2.0.1", 3490 - "resolved": "https://registry.npmjs.org/rangetouch/-/rangetouch-2.0.1.tgz", 3491 - "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==", 3492 - "license": "MIT" 3493 - }, 3494 - "node_modules/readdirp": { 3495 - "version": "4.1.2", 3496 - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 3497 - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 3498 - "dev": true, 3499 - "engines": { 3500 - "node": ">= 14.18.0" 3501 - }, 3502 - "funding": { 3503 - "type": "individual", 3504 - "url": "https://paulmillr.com/funding/" 3505 - } 3506 - }, 3507 - "node_modules/resolve-from": { 3508 - "version": "4.0.0", 3509 - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 3510 - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 3511 - "dev": true, 3512 - "engines": { 3513 - "node": ">=4" 3514 - } 3515 - }, 3516 - "node_modules/reusify": { 3517 - "version": "1.0.4", 3518 - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3519 - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3520 - "dev": true, 3521 - "engines": { 3522 - "iojs": ">=1.0.0", 3523 - "node": ">=0.10.0" 3524 - } 3525 - }, 3526 - "node_modules/rollup": { 3527 - "version": "4.34.8", 3528 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", 3529 - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", 3530 - "dev": true, 3531 - "dependencies": { 3532 - "@types/estree": "1.0.6" 3533 - }, 3534 - "bin": { 3535 - "rollup": "dist/bin/rollup" 3536 - }, 3537 - "engines": { 3538 - "node": ">=18.0.0", 3539 - "npm": ">=8.0.0" 3540 - }, 3541 - "optionalDependencies": { 3542 - "@rollup/rollup-android-arm-eabi": "4.34.8", 3543 - "@rollup/rollup-android-arm64": "4.34.8", 3544 - "@rollup/rollup-darwin-arm64": "4.34.8", 3545 - "@rollup/rollup-darwin-x64": "4.34.8", 3546 - "@rollup/rollup-freebsd-arm64": "4.34.8", 3547 - "@rollup/rollup-freebsd-x64": "4.34.8", 3548 - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", 3549 - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", 3550 - "@rollup/rollup-linux-arm64-gnu": "4.34.8", 3551 - "@rollup/rollup-linux-arm64-musl": "4.34.8", 3552 - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", 3553 - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", 3554 - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", 3555 - "@rollup/rollup-linux-s390x-gnu": "4.34.8", 3556 - "@rollup/rollup-linux-x64-gnu": "4.34.8", 3557 - "@rollup/rollup-linux-x64-musl": "4.34.8", 3558 - "@rollup/rollup-win32-arm64-msvc": "4.34.8", 3559 - "@rollup/rollup-win32-ia32-msvc": "4.34.8", 3560 - "@rollup/rollup-win32-x64-msvc": "4.34.8", 3561 - "fsevents": "~2.3.2" 3562 - } 3563 - }, 3564 - "node_modules/run-parallel": { 3565 - "version": "1.2.0", 3566 - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 3567 - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 3568 - "dev": true, 3569 - "funding": [ 3570 - { 3571 - "type": "github", 3572 - "url": "https://github.com/sponsors/feross" 3573 - }, 3574 - { 3575 - "type": "patreon", 3576 - "url": "https://www.patreon.com/feross" 3577 - }, 3578 - { 3579 - "type": "consulting", 3580 - "url": "https://feross.org/support" 3581 - } 3582 - ], 3583 - "dependencies": { 3584 - "queue-microtask": "^1.2.2" 3585 - } 3586 - }, 3587 - "node_modules/runed": { 3588 - "version": "0.23.4", 3589 - "resolved": "https://registry.npmjs.org/runed/-/runed-0.23.4.tgz", 3590 - "integrity": "sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==", 3591 - "funding": [ 3592 - "https://github.com/sponsors/huntabyte", 3593 - "https://github.com/sponsors/tglide" 3594 - ], 3595 - "dependencies": { 3596 - "esm-env": "^1.0.0" 3597 - }, 3598 - "peerDependencies": { 3599 - "svelte": "^5.7.0" 3600 - } 3601 - }, 3602 - "node_modules/sade": { 3603 - "version": "1.8.1", 3604 - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 3605 - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 3606 - "dev": true, 3607 - "dependencies": { 3608 - "mri": "^1.1.0" 3609 - }, 3610 - "engines": { 3611 - "node": ">=6" 3612 - } 3613 - }, 3614 - "node_modules/semver": { 3615 - "version": "7.7.1", 3616 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 3617 - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 3618 - "dev": true, 3619 - "bin": { 3620 - "semver": "bin/semver.js" 3621 - }, 3622 - "engines": { 3623 - "node": ">=10" 3624 - } 3625 - }, 3626 - "node_modules/set-cookie-parser": { 3627 - "version": "2.7.1", 3628 - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", 3629 - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", 3630 - "dev": true 3631 - }, 3632 - "node_modules/shebang-command": { 3633 - "version": "2.0.0", 3634 - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3635 - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3636 - "dev": true, 3637 - "dependencies": { 3638 - "shebang-regex": "^3.0.0" 3639 - }, 3640 - "engines": { 3641 - "node": ">=8" 3642 - } 3643 - }, 3644 - "node_modules/shebang-regex": { 3645 - "version": "3.0.0", 3646 - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3647 - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3648 - "dev": true, 3649 - "engines": { 3650 - "node": ">=8" 3651 - } 3652 - }, 3653 - "node_modules/sirv": { 3654 - "version": "3.0.1", 3655 - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", 3656 - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", 3657 - "dev": true, 3658 - "dependencies": { 3659 - "@polka/url": "^1.0.0-next.24", 3660 - "mrmime": "^2.0.0", 3661 - "totalist": "^3.0.0" 3662 - }, 3663 - "engines": { 3664 - "node": ">=18" 3665 - } 3666 - }, 3667 - "node_modules/source-map-js": { 3668 - "version": "1.2.1", 3669 - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 3670 - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 3671 - "dev": true, 3672 - "engines": { 3673 - "node": ">=0.10.0" 3674 - } 3675 - }, 3676 - "node_modules/strip-json-comments": { 3677 - "version": "3.1.1", 3678 - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3679 - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3680 - "dev": true, 3681 - "engines": { 3682 - "node": ">=8" 3683 - }, 3684 - "funding": { 3685 - "url": "https://github.com/sponsors/sindresorhus" 3686 - } 3687 - }, 3688 - "node_modules/style-to-object": { 3689 - "version": "1.0.8", 3690 - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", 3691 - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", 3692 - "license": "MIT", 3693 - "dependencies": { 3694 - "inline-style-parser": "0.2.4" 3695 - } 3696 - }, 3697 - "node_modules/supports-color": { 3698 - "version": "7.2.0", 3699 - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3700 - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3701 - "dev": true, 3702 - "dependencies": { 3703 - "has-flag": "^4.0.0" 3704 - }, 3705 - "engines": { 3706 - "node": ">=8" 3707 - } 3708 - }, 3709 - "node_modules/svelte": { 3710 - "version": "5.20.3", 3711 - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.20.3.tgz", 3712 - "integrity": "sha512-8eE+/KXZP5tAYEefOG4eIvElARIrnh+IXJq2e+OM7hmhuZDk9yf7esrVD1YBxUtk5eqYBDYtvu628h71iFrXiA==", 3713 - "dependencies": { 3714 - "@ampproject/remapping": "^2.3.0", 3715 - "@jridgewell/sourcemap-codec": "^1.5.0", 3716 - "@types/estree": "^1.0.5", 3717 - "acorn": "^8.12.1", 3718 - "acorn-typescript": "^1.4.13", 3719 - "aria-query": "^5.3.1", 3720 - "axobject-query": "^4.1.0", 3721 - "clsx": "^2.1.1", 3722 - "esm-env": "^1.2.1", 3723 - "esrap": "^1.4.3", 3724 - "is-reference": "^3.0.3", 3725 - "locate-character": "^3.0.0", 3726 - "magic-string": "^0.30.11", 3727 - "zimmerframe": "^1.1.2" 3728 - }, 3729 - "engines": { 3730 - "node": ">=18" 3731 - } 3732 - }, 3733 - "node_modules/svelte-check": { 3734 - "version": "4.1.4", 3735 - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.4.tgz", 3736 - "integrity": "sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==", 3737 - "dev": true, 3738 - "dependencies": { 3739 - "@jridgewell/trace-mapping": "^0.3.25", 3740 - "chokidar": "^4.0.1", 3741 - "fdir": "^6.2.0", 3742 - "picocolors": "^1.0.0", 3743 - "sade": "^1.7.4" 3744 - }, 3745 - "bin": { 3746 - "svelte-check": "bin/svelte-check" 3747 - }, 3748 - "engines": { 3749 - "node": ">= 18.0.0" 3750 - }, 3751 - "peerDependencies": { 3752 - "svelte": "^4.0.0 || ^5.0.0-next.0", 3753 - "typescript": ">=5.0.0" 3754 - } 3755 - }, 3756 - "node_modules/svelte-eslint-parser": { 3757 - "version": "0.43.0", 3758 - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.43.0.tgz", 3759 - "integrity": "sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==", 3760 - "dev": true, 3761 - "dependencies": { 3762 - "eslint-scope": "^7.2.2", 3763 - "eslint-visitor-keys": "^3.4.3", 3764 - "espree": "^9.6.1", 3765 - "postcss": "^8.4.39", 3766 - "postcss-scss": "^4.0.9" 3767 - }, 3768 - "engines": { 3769 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3770 - }, 3771 - "funding": { 3772 - "url": "https://github.com/sponsors/ota-meshi" 3773 - }, 3774 - "peerDependencies": { 3775 - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" 3776 - }, 3777 - "peerDependenciesMeta": { 3778 - "svelte": { 3779 - "optional": true 3780 - } 3781 - } 3782 - }, 3783 - "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { 3784 - "version": "7.2.2", 3785 - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 3786 - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 3787 - "dev": true, 3788 - "dependencies": { 3789 - "esrecurse": "^4.3.0", 3790 - "estraverse": "^5.2.0" 3791 - }, 3792 - "engines": { 3793 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3794 - }, 3795 - "funding": { 3796 - "url": "https://opencollective.com/eslint" 3797 - } 3798 - }, 3799 - "node_modules/svelte-eslint-parser/node_modules/eslint-visitor-keys": { 3800 - "version": "3.4.3", 3801 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 3802 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 3803 - "dev": true, 3804 - "engines": { 3805 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3806 - }, 3807 - "funding": { 3808 - "url": "https://opencollective.com/eslint" 3809 - } 3810 - }, 3811 - "node_modules/svelte-eslint-parser/node_modules/espree": { 3812 - "version": "9.6.1", 3813 - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 3814 - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 3815 - "dev": true, 3816 - "dependencies": { 3817 - "acorn": "^8.9.0", 3818 - "acorn-jsx": "^5.3.2", 3819 - "eslint-visitor-keys": "^3.4.1" 3820 - }, 3821 - "engines": { 3822 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3823 - }, 3824 - "funding": { 3825 - "url": "https://opencollective.com/eslint" 3826 - } 3827 - }, 3828 - "node_modules/svelte-sonner": { 3829 - "version": "0.3.28", 3830 - "resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-0.3.28.tgz", 3831 - "integrity": "sha512-K3AmlySeFifF/cKgsYNv5uXqMVNln0NBAacOYgmkQStLa/UoU0LhfAACU6Gr+YYC8bOCHdVmFNoKuDbMEsppJg==", 3832 - "license": "MIT", 3833 - "peerDependencies": { 3834 - "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0-next.1" 3835 - } 3836 - }, 3837 - "node_modules/svelte-toolbelt": { 3838 - "version": "0.7.1", 3839 - "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.7.1.tgz", 3840 - "integrity": "sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==", 3841 - "funding": [ 3842 - "https://github.com/sponsors/huntabyte" 3843 - ], 3844 - "dependencies": { 3845 - "clsx": "^2.1.1", 3846 - "runed": "^0.23.2", 3847 - "style-to-object": "^1.0.8" 3848 - }, 3849 - "engines": { 3850 - "node": ">=18", 3851 - "pnpm": ">=8.7.0" 3852 - }, 3853 - "peerDependencies": { 3854 - "svelte": "^5.0.0" 3855 - } 3856 - }, 3857 - "node_modules/tabbable": { 3858 - "version": "6.2.0", 3859 - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", 3860 - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", 3861 - "license": "MIT" 3862 - }, 3863 - "node_modules/tailwind-merge": { 3864 - "version": "3.3.0", 3865 - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.0.tgz", 3866 - "integrity": "sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==", 3867 - "license": "MIT", 3868 - "funding": { 3869 - "type": "github", 3870 - "url": "https://github.com/sponsors/dcastil" 3871 - } 3872 - }, 3873 - "node_modules/tailwind-variants": { 3874 - "version": "1.0.0", 3875 - "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-1.0.0.tgz", 3876 - "integrity": "sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA==", 3877 - "license": "MIT", 3878 - "dependencies": { 3879 - "tailwind-merge": "3.0.2" 3880 - }, 3881 - "engines": { 3882 - "node": ">=16.x", 3883 - "pnpm": ">=7.x" 3884 - }, 3885 - "peerDependencies": { 3886 - "tailwindcss": "*" 3887 - } 3888 - }, 3889 - "node_modules/tailwind-variants/node_modules/tailwind-merge": { 3890 - "version": "3.0.2", 3891 - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.2.tgz", 3892 - "integrity": "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==", 3893 - "license": "MIT", 3894 - "funding": { 3895 - "type": "github", 3896 - "url": "https://github.com/sponsors/dcastil" 3897 - } 3898 - }, 3899 - "node_modules/tailwindcss": { 3900 - "version": "4.0.8", 3901 - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.8.tgz", 3902 - "integrity": "sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==" 3903 - }, 3904 - "node_modules/tapable": { 3905 - "version": "2.2.1", 3906 - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 3907 - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 3908 - "dev": true, 3909 - "engines": { 3910 - "node": ">=6" 3911 - } 3912 - }, 3913 - "node_modules/tlds": { 3914 - "version": "1.258.0", 3915 - "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.258.0.tgz", 3916 - "integrity": "sha512-XGhStWuOlBA5D8QnyN2xtgB2cUOdJ3ztisne1DYVWMcVH29qh8eQIpRmP3HnuJLdgyzG0HpdGzRMu1lm/Oictw==", 3917 - "license": "MIT", 3918 - "bin": { 3919 - "tlds": "bin.js" 3920 - } 3921 - }, 3922 - "node_modules/to-regex-range": { 3923 - "version": "5.0.1", 3924 - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3925 - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3926 - "dev": true, 3927 - "dependencies": { 3928 - "is-number": "^7.0.0" 3929 - }, 3930 - "engines": { 3931 - "node": ">=8.0" 3932 - } 3933 - }, 3934 - "node_modules/totalist": { 3935 - "version": "3.0.1", 3936 - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 3937 - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 3938 - "dev": true, 3939 - "engines": { 3940 - "node": ">=6" 3941 - } 3942 - }, 3943 - "node_modules/ts-api-utils": { 3944 - "version": "2.0.1", 3945 - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", 3946 - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", 3947 - "dev": true, 3948 - "engines": { 3949 - "node": ">=18.12" 3950 - }, 3951 - "peerDependencies": { 3952 - "typescript": ">=4.8.4" 3953 - } 3954 - }, 3955 - "node_modules/tslib": { 3956 - "version": "2.8.1", 3957 - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 3958 - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 3959 - "license": "0BSD" 3960 - }, 3961 - "node_modules/type-check": { 3962 - "version": "0.4.0", 3963 - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3964 - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3965 - "dev": true, 3966 - "dependencies": { 3967 - "prelude-ls": "^1.2.1" 3968 - }, 3969 - "engines": { 3970 - "node": ">= 0.8.0" 3971 - } 3972 - }, 3973 - "node_modules/typescript": { 3974 - "version": "5.7.3", 3975 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 3976 - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 3977 - "dev": true, 3978 - "bin": { 3979 - "tsc": "bin/tsc", 3980 - "tsserver": "bin/tsserver" 3981 - }, 3982 - "engines": { 3983 - "node": ">=14.17" 3984 - } 3985 - }, 3986 - "node_modules/typescript-eslint": { 3987 - "version": "8.24.1", 3988 - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", 3989 - "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", 3990 - "dev": true, 3991 - "dependencies": { 3992 - "@typescript-eslint/eslint-plugin": "8.24.1", 3993 - "@typescript-eslint/parser": "8.24.1", 3994 - "@typescript-eslint/utils": "8.24.1" 3995 - }, 3996 - "engines": { 3997 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 3998 - }, 3999 - "funding": { 4000 - "type": "opencollective", 4001 - "url": "https://opencollective.com/typescript-eslint" 4002 - }, 4003 - "peerDependencies": { 4004 - "eslint": "^8.57.0 || ^9.0.0", 4005 - "typescript": ">=4.8.4 <5.8.0" 4006 - } 4007 - }, 4008 - "node_modules/uint8arrays": { 4009 - "version": "3.0.0", 4010 - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz", 4011 - "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 4012 - "license": "MIT", 4013 - "dependencies": { 4014 - "multiformats": "^9.4.2" 4015 - } 4016 - }, 4017 - "node_modules/uri-js": { 4018 - "version": "4.4.1", 4019 - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 4020 - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 4021 - "dev": true, 4022 - "dependencies": { 4023 - "punycode": "^2.1.0" 4024 - } 4025 - }, 4026 - "node_modules/url-polyfill": { 4027 - "version": "1.1.13", 4028 - "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.13.tgz", 4029 - "integrity": "sha512-tXzkojrv2SujumYthZ/WjF7jaSfNhSXlYMpE5AYdL2I3D7DCeo+mch8KtW2rUuKjDg+3VXODXHVgipt8yGY/eQ==", 4030 - "license": "MIT" 4031 - }, 4032 - "node_modules/util-deprecate": { 4033 - "version": "1.0.2", 4034 - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 4035 - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 4036 - "dev": true 4037 - }, 4038 - "node_modules/vite": { 4039 - "version": "6.1.1", 4040 - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", 4041 - "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", 4042 - "dev": true, 4043 - "dependencies": { 4044 - "esbuild": "^0.24.2", 4045 - "postcss": "^8.5.2", 4046 - "rollup": "^4.30.1" 4047 - }, 4048 - "bin": { 4049 - "vite": "bin/vite.js" 4050 - }, 4051 - "engines": { 4052 - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 4053 - }, 4054 - "funding": { 4055 - "url": "https://github.com/vitejs/vite?sponsor=1" 4056 - }, 4057 - "optionalDependencies": { 4058 - "fsevents": "~2.3.3" 4059 - }, 4060 - "peerDependencies": { 4061 - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 4062 - "jiti": ">=1.21.0", 4063 - "less": "*", 4064 - "lightningcss": "^1.21.0", 4065 - "sass": "*", 4066 - "sass-embedded": "*", 4067 - "stylus": "*", 4068 - "sugarss": "*", 4069 - "terser": "^5.16.0", 4070 - "tsx": "^4.8.1", 4071 - "yaml": "^2.4.2" 4072 - }, 4073 - "peerDependenciesMeta": { 4074 - "@types/node": { 4075 - "optional": true 4076 - }, 4077 - "jiti": { 4078 - "optional": true 4079 - }, 4080 - "less": { 4081 - "optional": true 4082 - }, 4083 - "lightningcss": { 4084 - "optional": true 4085 - }, 4086 - "sass": { 4087 - "optional": true 4088 - }, 4089 - "sass-embedded": { 4090 - "optional": true 4091 - }, 4092 - "stylus": { 4093 - "optional": true 4094 - }, 4095 - "sugarss": { 4096 - "optional": true 4097 - }, 4098 - "terser": { 4099 - "optional": true 4100 - }, 4101 - "tsx": { 4102 - "optional": true 4103 - }, 4104 - "yaml": { 4105 - "optional": true 4106 - } 4107 - } 4108 - }, 4109 - "node_modules/vitefu": { 4110 - "version": "1.0.6", 4111 - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.6.tgz", 4112 - "integrity": "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==", 4113 - "dev": true, 4114 - "peerDependencies": { 4115 - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" 4116 - }, 4117 - "peerDependenciesMeta": { 4118 - "vite": { 4119 - "optional": true 4120 - } 4121 - } 4122 - }, 4123 - "node_modules/which": { 4124 - "version": "2.0.2", 4125 - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 4126 - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 4127 - "dev": true, 4128 - "dependencies": { 4129 - "isexe": "^2.0.0" 4130 - }, 4131 - "bin": { 4132 - "node-which": "bin/node-which" 4133 - }, 4134 - "engines": { 4135 - "node": ">= 8" 4136 - } 4137 - }, 4138 - "node_modules/word-wrap": { 4139 - "version": "1.2.5", 4140 - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 4141 - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 4142 - "dev": true, 4143 - "engines": { 4144 - "node": ">=0.10.0" 4145 - } 4146 - }, 4147 - "node_modules/yaml": { 4148 - "version": "2.7.0", 4149 - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", 4150 - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", 4151 - "dev": true, 4152 - "optional": true, 4153 - "peer": true, 4154 - "bin": { 4155 - "yaml": "bin.mjs" 4156 - }, 4157 - "engines": { 4158 - "node": ">= 14" 4159 - } 4160 - }, 4161 - "node_modules/yocto-queue": { 4162 - "version": "0.1.0", 4163 - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 4164 - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 4165 - "dev": true, 4166 - "engines": { 4167 - "node": ">=10" 4168 - }, 4169 - "funding": { 4170 - "url": "https://github.com/sponsors/sindresorhus" 4171 - } 4172 - }, 4173 - "node_modules/zimmerframe": { 4174 - "version": "1.1.2", 4175 - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", 4176 - "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==" 4177 - }, 4178 - "node_modules/zod": { 4179 - "version": "3.24.4", 4180 - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", 4181 - "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", 4182 - "license": "MIT", 4183 - "funding": { 4184 - "url": "https://github.com/sponsors/colinhacks" 4185 - } 4186 - } 4187 - } 4188 - }
+48 -28
package.json
··· 11 11 "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 12 12 "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 13 13 "format": "prettier --write .", 14 - "lint": "prettier --check . && eslint ." 14 + "lint": "prettier --check . && eslint .", 15 + "env:generate-key": "npx tsx src/lib/atproto/scripts/generate-key.ts", 16 + "env:generate-secret": "npx tsx src/lib/atproto/scripts/generate-secret.ts", 17 + "env:setup-dev": "npx tsx src/lib/atproto/scripts/setup-dev.ts", 18 + "tunnel": "npx tsx src/lib/atproto/scripts/tunnel.ts" 15 19 }, 16 20 "devDependencies": { 17 - "@eslint/compat": "^1.2.5", 18 - "@eslint/js": "^9.18.0", 19 - "@sveltejs/adapter-auto": "^4.0.0", 20 - "@sveltejs/adapter-static": "^3.0.8", 21 - "@sveltejs/kit": "^2.16.0", 22 - "@sveltejs/vite-plugin-svelte": "^5.0.0", 23 - "@tailwindcss/forms": "^0.5.10", 24 - "@tailwindcss/vite": "^4.0.0", 25 - "eslint": "^9.18.0", 26 - "eslint-config-prettier": "^10.0.1", 27 - "eslint-plugin-svelte": "^2.46.1", 28 - "globals": "^15.14.0", 29 - "prettier": "^3.4.2", 30 - "prettier-plugin-svelte": "^3.3.3", 31 - "prettier-plugin-tailwindcss": "^0.6.11", 32 - "svelte": "^5.0.0", 33 - "svelte-check": "^4.0.0", 34 - "tailwindcss": "^4.0.0", 35 - "typescript": "^5.0.0", 36 - "typescript-eslint": "^8.20.0", 37 - "vite": "^6.0.0" 21 + "@atcute/atproto": "^3.1.10", 22 + "@atcute/bluesky": "^3.2.19", 23 + "@atcute/client": "^4.2.1", 24 + "@atcute/identity-resolver": "^1.2.2", 25 + "@atcute/lexicons": "^1.2.9", 26 + "@atcute/oauth-node-client": "^1.1.0", 27 + "@atcute/tid": "^1.1.2", 28 + "@cloudflare/workers-types": "^4.20260301.1", 29 + "@eslint/compat": "^2.0.2", 30 + "@eslint/js": "^10.0.1", 31 + "@sveltejs/adapter-cloudflare": "^7.2.8", 32 + "@sveltejs/kit": "^2.53.4", 33 + "@sveltejs/vite-plugin-svelte": "^6.2.4", 34 + "@tailwindcss/forms": "^0.5.11", 35 + "@tailwindcss/vite": "^4.2.1", 36 + "eslint": "^10.0.2", 37 + "eslint-config-prettier": "^10.1.8", 38 + "eslint-plugin-svelte": "^3.15.0", 39 + "globals": "^17.4.0", 40 + "prettier": "^3.8.1", 41 + "prettier-plugin-svelte": "^3.5.0", 42 + "prettier-plugin-tailwindcss": "^0.7.2", 43 + "svelte": "^5.53.6", 44 + "svelte-check": "^4.4.4", 45 + "tailwindcss": "^4.2.1", 46 + "tsx": "^4.21.0", 47 + "typescript": "^5.9.3", 48 + "typescript-eslint": "^8.56.1", 49 + "vite": "^7.3.1" 38 50 }, 39 51 "dependencies": { 40 - "@atcute/oauth-browser-client": "^1.0.13", 41 - "@fuxui/base": "^0.2.1", 42 - "@fuxui/social": "^0.2.1", 43 - "flexsearch": "^0.8.167" 52 + "@foxui/core": "^0.5.1", 53 + "@foxui/social": "^0.5.1", 54 + "flexsearch": "^0.8.212", 55 + "valibot": "^1.2.0" 44 56 }, 45 - "license": "MIT" 46 - } 57 + "license": "MIT", 58 + "pnpm": { 59 + "onlyBuiltDependencies": [ 60 + "esbuild", 61 + "workerd", 62 + "@atcute/time-ms", 63 + "sharp" 64 + ] 65 + } 66 + }
+3670
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@foxui/core': 12 + specifier: ^0.5.1 13 + version: 0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1) 14 + '@foxui/social': 15 + specifier: ^0.5.1 16 + version: 0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1) 17 + flexsearch: 18 + specifier: ^0.8.212 19 + version: 0.8.212 20 + valibot: 21 + specifier: ^1.2.0 22 + version: 1.2.0(typescript@5.9.3) 23 + devDependencies: 24 + '@atcute/atproto': 25 + specifier: ^3.1.10 26 + version: 3.1.10 27 + '@atcute/bluesky': 28 + specifier: ^3.2.19 29 + version: 3.2.19 30 + '@atcute/client': 31 + specifier: ^4.2.1 32 + version: 4.2.1 33 + '@atcute/identity-resolver': 34 + specifier: ^1.2.2 35 + version: 1.2.2(@atcute/identity@1.1.3) 36 + '@atcute/lexicons': 37 + specifier: ^1.2.9 38 + version: 1.2.9 39 + '@atcute/oauth-node-client': 40 + specifier: ^1.1.0 41 + version: 1.1.0 42 + '@atcute/tid': 43 + specifier: ^1.1.2 44 + version: 1.1.2 45 + '@cloudflare/workers-types': 46 + specifier: ^4.20260301.1 47 + version: 4.20260301.1 48 + '@eslint/compat': 49 + specifier: ^2.0.2 50 + version: 2.0.2(eslint@10.0.2(jiti@2.6.1)) 51 + '@eslint/js': 52 + specifier: ^10.0.1 53 + version: 10.0.1(eslint@10.0.2(jiti@2.6.1)) 54 + '@sveltejs/adapter-cloudflare': 55 + specifier: ^7.2.8 56 + version: 7.2.8(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(wrangler@4.69.0(@cloudflare/workers-types@4.20260301.1)) 57 + '@sveltejs/kit': 58 + specifier: ^2.53.4 59 + version: 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 60 + '@sveltejs/vite-plugin-svelte': 61 + specifier: ^6.2.4 62 + version: 6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 63 + '@tailwindcss/forms': 64 + specifier: ^0.5.11 65 + version: 0.5.11(tailwindcss@4.2.1) 66 + '@tailwindcss/vite': 67 + specifier: ^4.2.1 68 + version: 4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 69 + eslint: 70 + specifier: ^10.0.2 71 + version: 10.0.2(jiti@2.6.1) 72 + eslint-config-prettier: 73 + specifier: ^10.1.8 74 + version: 10.1.8(eslint@10.0.2(jiti@2.6.1)) 75 + eslint-plugin-svelte: 76 + specifier: ^3.15.0 77 + version: 3.15.0(eslint@10.0.2(jiti@2.6.1))(svelte@5.53.6) 78 + globals: 79 + specifier: ^17.4.0 80 + version: 17.4.0 81 + prettier: 82 + specifier: ^3.8.1 83 + version: 3.8.1 84 + prettier-plugin-svelte: 85 + specifier: ^3.5.0 86 + version: 3.5.0(prettier@3.8.1)(svelte@5.53.6) 87 + prettier-plugin-tailwindcss: 88 + specifier: ^0.7.2 89 + version: 0.7.2(prettier-plugin-svelte@3.5.0(prettier@3.8.1)(svelte@5.53.6))(prettier@3.8.1) 90 + svelte: 91 + specifier: ^5.53.6 92 + version: 5.53.6 93 + svelte-check: 94 + specifier: ^4.4.4 95 + version: 4.4.4(picomatch@4.0.3)(svelte@5.53.6)(typescript@5.9.3) 96 + tailwindcss: 97 + specifier: ^4.2.1 98 + version: 4.2.1 99 + tsx: 100 + specifier: ^4.21.0 101 + version: 4.21.0 102 + typescript: 103 + specifier: ^5.9.3 104 + version: 5.9.3 105 + typescript-eslint: 106 + specifier: ^8.56.1 107 + version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 108 + vite: 109 + specifier: ^7.3.1 110 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) 111 + 112 + packages: 113 + 114 + '@atcute/atproto@3.1.10': 115 + resolution: {integrity: sha512-+GKZpOc0PJcdWMQEkTfg/rSNDAAHxmAUGBl60g2az15etqJn5WaUPNGFE2sB7hKpwi5Ue2h/L0OacINcE/JDDQ==} 116 + 117 + '@atcute/bluesky@3.2.19': 118 + resolution: {integrity: sha512-W/Sy2671A5eKkdWJn6nfCGoixqMFOouEKRbqRV3630I13Er9iS+gA/rGWUXlp5xNpbfCNmsQ6C1pEidUmO+00g==} 119 + 120 + '@atcute/client@4.2.1': 121 + resolution: {integrity: sha512-ZBFM2pW075JtgGFu5g7HHZBecrClhlcNH8GVP9Zz1aViWR+cjjBsTpeE63rJs+FCOHFYlirUyo5L8SGZ4kMINw==} 122 + 123 + '@atcute/identity-resolver@1.2.2': 124 + resolution: {integrity: sha512-eUh/UH4bFvuXS0X7epYCeJC/kj4rbBXfSRumLEH4smMVwNOgTo7cL/0Srty+P/qVPoZEyXdfEbS0PHJyzoXmHw==} 125 + peerDependencies: 126 + '@atcute/identity': ^1.0.0 127 + 128 + '@atcute/identity@1.1.3': 129 + resolution: {integrity: sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng==} 130 + 131 + '@atcute/lexicons@1.2.9': 132 + resolution: {integrity: sha512-/RRHm2Cw9o8Mcsrq0eo8fjS9okKYLGfuFwrQ0YoP/6sdSDsXshaTLJsvLlcUcaDaSJ1YFOuHIo3zr2Om2F/16g==} 133 + 134 + '@atcute/multibase@1.1.8': 135 + resolution: {integrity: sha512-pJgtImMZKCjqwRbu+2GzB+4xQjKBXDwdZOzeqe0u97zYKRGftpGYGvYv3+pMe2xXe+msDyu7Nv8iJp+U14otTA==} 136 + 137 + '@atcute/oauth-crypto@0.1.0': 138 + resolution: {integrity: sha512-qZYDCNLF/4B6AndYT1rsQelN8621AC5u/sL5PHvlr/qqAbmmUwCBGjEgRSyZtHE1AqD60VNiSMlOgAuEQTSl3w==} 139 + 140 + '@atcute/oauth-keyset@0.1.0': 141 + resolution: {integrity: sha512-+wqT/+I5Lg9VzKnKY3g88+N45xbq+wsdT6bHDGqCVa2u57gRvolFF4dY+weMfc/OX641BIZO6/o+zFtKBsMQnQ==} 142 + 143 + '@atcute/oauth-node-client@1.1.0': 144 + resolution: {integrity: sha512-xCp/VfjtvTeKscKR/oI2hdMTp1/DaF/7ll8b6yZOCgbKlVDDfhCn5mmKNVARGTNaoywxrXG3XffbWCIx3/E87w==} 145 + 146 + '@atcute/oauth-types@0.1.1': 147 + resolution: {integrity: sha512-u+3KMjse3Uc/9hDyilu1QVN7IpcnjVXgRzhddzBB8Uh6wePHNVBDdi9wQvFTVVA3zmxtMJVptXRyLLg6Ou9bqg==} 148 + 149 + '@atcute/tid@1.1.2': 150 + resolution: {integrity: sha512-bmPuOX/TOfcm/vsK9vM98spjkcx2wgd9S2PeK5oLgEr8IbNRPq7iMCAPzOL1nu5XAW3LlkOYQEbYRcw5vcQ37w==} 151 + 152 + '@atcute/time-ms@1.2.3': 153 + resolution: {integrity: sha512-pRrkYSVyPDCWHKp77Ygwg3lxgvfwnh52J3kOIWI1z93kM2jWQDSezbTNDLdJFAJT9xm4rnHsA+toN9Rdhrnidw==} 154 + 155 + '@atcute/uint8array@1.1.1': 156 + resolution: {integrity: sha512-3LsC8XB8TKe9q/5hOA5sFuzGaIFdJZJNewC5OKa3o/eU6+K7JR6see9Zy2JbQERNVnRl11EzbNov1efgLMAs4g==} 157 + 158 + '@atcute/util-fetch@1.0.5': 159 + resolution: {integrity: sha512-qjHj01BGxjSjIFdPiAjSARnodJIIyKxnCMMEcXMESo9TAyND6XZQqrie5fia+LlYWVXdpsTds8uFQwc9jdKTig==} 160 + 161 + '@atcute/util-text@1.1.1': 162 + resolution: {integrity: sha512-JH0SxzUQJAmbOBTYyhxQbkkI6M33YpjlVLEcbP5GYt43xgFArzV0FJVmEpvIj0kjsmphHB45b6IitdvxPdec9w==} 163 + 164 + '@atproto/api@0.18.21': 165 + resolution: {integrity: sha512-s35MIJerGT/pKe2xJtKKswqlIr/ola2r2iURBKBL0Mk1OKe6jP4YvTMh1N2d2PEANFzNNTbKoDaLfJPo2Uvc/w==} 166 + 167 + '@atproto/common-web@0.4.17': 168 + resolution: {integrity: sha512-sfxD8NGxyoxhxmM9EUshEFbWcJ3+JHEOZF4Quk6HsCh1UxpHBmLabT/vEsAkDWl+C/8U0ine0+c/gHyE/OZiQQ==} 169 + 170 + '@atproto/lex-data@0.0.12': 171 + resolution: {integrity: sha512-aekJudcK1p6sbTqUv2bJMJBAGZaOJS0mgDclpK3U6VuBREK/au4B6ffunBFWgrDfg0Vwj2JGyEA7E51WZkJcRw==} 172 + 173 + '@atproto/lex-json@0.0.12': 174 + resolution: {integrity: sha512-XlEpnWWZdDJ5BIgG25GyH+6iBfyrFL18BI5JSE6rUfMObbFMrQRaCuRLQfryRXNysVz3L3U+Qb9y8KcXbE8AcA==} 175 + 176 + '@atproto/lexicon@0.6.1': 177 + resolution: {integrity: sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==} 178 + 179 + '@atproto/syntax@0.4.3': 180 + resolution: {integrity: sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==} 181 + 182 + '@atproto/xrpc@0.7.7': 183 + resolution: {integrity: sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==} 184 + 185 + '@badrap/valita@0.4.6': 186 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 187 + engines: {node: '>= 18'} 188 + 189 + '@cloudflare/kv-asset-handler@0.4.2': 190 + resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} 191 + engines: {node: '>=18.0.0'} 192 + 193 + '@cloudflare/unenv-preset@2.14.0': 194 + resolution: {integrity: sha512-XKAkWhi1nBdNsSEoNG9nkcbyvfUrSjSf+VYVPfOto3gLTZVc3F4g6RASCMh6IixBKCG2yDgZKQIHGKtjcnLnKg==} 195 + peerDependencies: 196 + unenv: 2.0.0-rc.24 197 + workerd: ^1.20260218.0 198 + peerDependenciesMeta: 199 + workerd: 200 + optional: true 201 + 202 + '@cloudflare/workerd-darwin-64@1.20260305.0': 203 + resolution: {integrity: sha512-chhKOpymo0Eh9J3nymrauMqKGboCc4uz/j0gA1G4gioMnKsN2ZDKJ+qjRZDnCoVGy8u2C4pxlmyIfsXCAfIzhQ==} 204 + engines: {node: '>=16'} 205 + cpu: [x64] 206 + os: [darwin] 207 + 208 + '@cloudflare/workerd-darwin-arm64@1.20260305.0': 209 + resolution: {integrity: sha512-K9aG2OQk5bBfOP+fyGPqLcqZ9OR3ra6uwnxJ8f2mveq2A2LsCI7ZeGxQiAj75Ti80ytH/gJffZIx4Np2JtU3aQ==} 210 + engines: {node: '>=16'} 211 + cpu: [arm64] 212 + os: [darwin] 213 + 214 + '@cloudflare/workerd-linux-64@1.20260305.0': 215 + resolution: {integrity: sha512-tt7XUoIw/cYFeGbkPkcZ6XX1aZm26Aju/4ih+DXxOosbBeGshFSrNJDBfAKKOvkjsAZymJ+WWVDBU+hmNaGfwA==} 216 + engines: {node: '>=16'} 217 + cpu: [x64] 218 + os: [linux] 219 + 220 + '@cloudflare/workerd-linux-arm64@1.20260305.0': 221 + resolution: {integrity: sha512-72QTkY5EzylmvCZ8ZTrnJ9DctmQsfSof1OKyOWqu/pv/B2yACfuPMikq8RpPxvVu7hhS0ztGP6ZvXz72Htq4Zg==} 222 + engines: {node: '>=16'} 223 + cpu: [arm64] 224 + os: [linux] 225 + 226 + '@cloudflare/workerd-windows-64@1.20260305.0': 227 + resolution: {integrity: sha512-BA0uaQPOaI2F6mJtBDqplGnQQhpXCzwEMI33p/TnDxtSk9u8CGIfBFuI6uqo8mJ6ijIaPjeBLGOn2CiRMET4qg==} 228 + engines: {node: '>=16'} 229 + cpu: [x64] 230 + os: [win32] 231 + 232 + '@cloudflare/workers-types@4.20260301.1': 233 + resolution: {integrity: sha512-klKnECMb5A4GtVF0P5NH6rCjtyjqIEKJaz6kEtx9YPHhfFO2HUEarO+MI4F8WPchgeZqpGlEpDhRapzrOTw51Q==} 234 + 235 + '@cspotcode/source-map-support@0.8.1': 236 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 237 + engines: {node: '>=12'} 238 + 239 + '@emnapi/runtime@1.8.1': 240 + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} 241 + 242 + '@esbuild/aix-ppc64@0.27.3': 243 + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} 244 + engines: {node: '>=18'} 245 + cpu: [ppc64] 246 + os: [aix] 247 + 248 + '@esbuild/android-arm64@0.27.3': 249 + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} 250 + engines: {node: '>=18'} 251 + cpu: [arm64] 252 + os: [android] 253 + 254 + '@esbuild/android-arm@0.27.3': 255 + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} 256 + engines: {node: '>=18'} 257 + cpu: [arm] 258 + os: [android] 259 + 260 + '@esbuild/android-x64@0.27.3': 261 + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} 262 + engines: {node: '>=18'} 263 + cpu: [x64] 264 + os: [android] 265 + 266 + '@esbuild/darwin-arm64@0.27.3': 267 + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} 268 + engines: {node: '>=18'} 269 + cpu: [arm64] 270 + os: [darwin] 271 + 272 + '@esbuild/darwin-x64@0.27.3': 273 + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} 274 + engines: {node: '>=18'} 275 + cpu: [x64] 276 + os: [darwin] 277 + 278 + '@esbuild/freebsd-arm64@0.27.3': 279 + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} 280 + engines: {node: '>=18'} 281 + cpu: [arm64] 282 + os: [freebsd] 283 + 284 + '@esbuild/freebsd-x64@0.27.3': 285 + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} 286 + engines: {node: '>=18'} 287 + cpu: [x64] 288 + os: [freebsd] 289 + 290 + '@esbuild/linux-arm64@0.27.3': 291 + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} 292 + engines: {node: '>=18'} 293 + cpu: [arm64] 294 + os: [linux] 295 + 296 + '@esbuild/linux-arm@0.27.3': 297 + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} 298 + engines: {node: '>=18'} 299 + cpu: [arm] 300 + os: [linux] 301 + 302 + '@esbuild/linux-ia32@0.27.3': 303 + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} 304 + engines: {node: '>=18'} 305 + cpu: [ia32] 306 + os: [linux] 307 + 308 + '@esbuild/linux-loong64@0.27.3': 309 + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} 310 + engines: {node: '>=18'} 311 + cpu: [loong64] 312 + os: [linux] 313 + 314 + '@esbuild/linux-mips64el@0.27.3': 315 + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} 316 + engines: {node: '>=18'} 317 + cpu: [mips64el] 318 + os: [linux] 319 + 320 + '@esbuild/linux-ppc64@0.27.3': 321 + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} 322 + engines: {node: '>=18'} 323 + cpu: [ppc64] 324 + os: [linux] 325 + 326 + '@esbuild/linux-riscv64@0.27.3': 327 + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} 328 + engines: {node: '>=18'} 329 + cpu: [riscv64] 330 + os: [linux] 331 + 332 + '@esbuild/linux-s390x@0.27.3': 333 + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} 334 + engines: {node: '>=18'} 335 + cpu: [s390x] 336 + os: [linux] 337 + 338 + '@esbuild/linux-x64@0.27.3': 339 + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} 340 + engines: {node: '>=18'} 341 + cpu: [x64] 342 + os: [linux] 343 + 344 + '@esbuild/netbsd-arm64@0.27.3': 345 + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} 346 + engines: {node: '>=18'} 347 + cpu: [arm64] 348 + os: [netbsd] 349 + 350 + '@esbuild/netbsd-x64@0.27.3': 351 + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} 352 + engines: {node: '>=18'} 353 + cpu: [x64] 354 + os: [netbsd] 355 + 356 + '@esbuild/openbsd-arm64@0.27.3': 357 + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} 358 + engines: {node: '>=18'} 359 + cpu: [arm64] 360 + os: [openbsd] 361 + 362 + '@esbuild/openbsd-x64@0.27.3': 363 + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} 364 + engines: {node: '>=18'} 365 + cpu: [x64] 366 + os: [openbsd] 367 + 368 + '@esbuild/openharmony-arm64@0.27.3': 369 + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} 370 + engines: {node: '>=18'} 371 + cpu: [arm64] 372 + os: [openharmony] 373 + 374 + '@esbuild/sunos-x64@0.27.3': 375 + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} 376 + engines: {node: '>=18'} 377 + cpu: [x64] 378 + os: [sunos] 379 + 380 + '@esbuild/win32-arm64@0.27.3': 381 + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} 382 + engines: {node: '>=18'} 383 + cpu: [arm64] 384 + os: [win32] 385 + 386 + '@esbuild/win32-ia32@0.27.3': 387 + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} 388 + engines: {node: '>=18'} 389 + cpu: [ia32] 390 + os: [win32] 391 + 392 + '@esbuild/win32-x64@0.27.3': 393 + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} 394 + engines: {node: '>=18'} 395 + cpu: [x64] 396 + os: [win32] 397 + 398 + '@eslint-community/eslint-utils@4.9.1': 399 + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} 400 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 401 + peerDependencies: 402 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 403 + 404 + '@eslint-community/regexpp@4.12.2': 405 + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 406 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 407 + 408 + '@eslint/compat@2.0.2': 409 + resolution: {integrity: sha512-pR1DoD0h3HfF675QZx0xsyrsU8q70Z/plx7880NOhS02NuWLgBCOMDL787nUeQ7EWLkxv3bPQJaarjcPQb2Dwg==} 410 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 411 + peerDependencies: 412 + eslint: ^8.40 || 9 || 10 413 + peerDependenciesMeta: 414 + eslint: 415 + optional: true 416 + 417 + '@eslint/config-array@0.23.2': 418 + resolution: {integrity: sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==} 419 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 420 + 421 + '@eslint/config-helpers@0.5.2': 422 + resolution: {integrity: sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==} 423 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 424 + 425 + '@eslint/core@1.1.0': 426 + resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==} 427 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 428 + 429 + '@eslint/js@10.0.1': 430 + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} 431 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 432 + peerDependencies: 433 + eslint: ^10.0.0 434 + peerDependenciesMeta: 435 + eslint: 436 + optional: true 437 + 438 + '@eslint/object-schema@3.0.2': 439 + resolution: {integrity: sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==} 440 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 441 + 442 + '@eslint/plugin-kit@0.6.0': 443 + resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==} 444 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 445 + 446 + '@floating-ui/core@1.7.4': 447 + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} 448 + 449 + '@floating-ui/dom@1.7.5': 450 + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} 451 + 452 + '@floating-ui/utils@0.2.10': 453 + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} 454 + 455 + '@foxui/core@0.5.1': 456 + resolution: {integrity: sha512-WhcwTYy2bipsfrBmNjHF88gfmigr10KeWqNBVrwWmkFjAeXy8J9rj9CSLpeRQCHMmrNDqjVq7VahxWRuz0NO9g==} 457 + peerDependencies: 458 + svelte: '>=5' 459 + tailwindcss: '>=3' 460 + 461 + '@foxui/social@0.5.1': 462 + resolution: {integrity: sha512-PupbByfLdykQqzxjTZkMpy43LHaLrivI0DEb9Psew0+1PCMDqFSoDk00BVl5vtaPOlBfOwdQsDICa4kR0LApHg==} 463 + peerDependencies: 464 + svelte: '>=5' 465 + tailwindcss: '>=3' 466 + 467 + '@foxui/time@0.5.1': 468 + resolution: {integrity: sha512-P7mLM0UVarRdAI0owUUVzsa+VTp+ZQWENNM9BD0H9VESG49dIwP6sbfCRFFecCLijUHP+aIcnO3bnuK9BDx3rQ==} 469 + peerDependencies: 470 + svelte: '>=5' 471 + tailwindcss: '>=3' 472 + 473 + '@humanfs/core@0.19.1': 474 + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 475 + engines: {node: '>=18.18.0'} 476 + 477 + '@humanfs/node@0.16.7': 478 + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 479 + engines: {node: '>=18.18.0'} 480 + 481 + '@humanwhocodes/module-importer@1.0.1': 482 + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 483 + engines: {node: '>=12.22'} 484 + 485 + '@humanwhocodes/retry@0.4.3': 486 + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 487 + engines: {node: '>=18.18'} 488 + 489 + '@img/colour@1.1.0': 490 + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} 491 + engines: {node: '>=18'} 492 + 493 + '@img/sharp-darwin-arm64@0.34.5': 494 + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} 495 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 496 + cpu: [arm64] 497 + os: [darwin] 498 + 499 + '@img/sharp-darwin-x64@0.34.5': 500 + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} 501 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 502 + cpu: [x64] 503 + os: [darwin] 504 + 505 + '@img/sharp-libvips-darwin-arm64@1.2.4': 506 + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} 507 + cpu: [arm64] 508 + os: [darwin] 509 + 510 + '@img/sharp-libvips-darwin-x64@1.2.4': 511 + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} 512 + cpu: [x64] 513 + os: [darwin] 514 + 515 + '@img/sharp-libvips-linux-arm64@1.2.4': 516 + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 517 + cpu: [arm64] 518 + os: [linux] 519 + libc: [glibc] 520 + 521 + '@img/sharp-libvips-linux-arm@1.2.4': 522 + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 523 + cpu: [arm] 524 + os: [linux] 525 + libc: [glibc] 526 + 527 + '@img/sharp-libvips-linux-ppc64@1.2.4': 528 + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 529 + cpu: [ppc64] 530 + os: [linux] 531 + libc: [glibc] 532 + 533 + '@img/sharp-libvips-linux-riscv64@1.2.4': 534 + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 535 + cpu: [riscv64] 536 + os: [linux] 537 + libc: [glibc] 538 + 539 + '@img/sharp-libvips-linux-s390x@1.2.4': 540 + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 541 + cpu: [s390x] 542 + os: [linux] 543 + libc: [glibc] 544 + 545 + '@img/sharp-libvips-linux-x64@1.2.4': 546 + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 547 + cpu: [x64] 548 + os: [linux] 549 + libc: [glibc] 550 + 551 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 552 + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 553 + cpu: [arm64] 554 + os: [linux] 555 + libc: [musl] 556 + 557 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 558 + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 559 + cpu: [x64] 560 + os: [linux] 561 + libc: [musl] 562 + 563 + '@img/sharp-linux-arm64@0.34.5': 564 + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 565 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 566 + cpu: [arm64] 567 + os: [linux] 568 + libc: [glibc] 569 + 570 + '@img/sharp-linux-arm@0.34.5': 571 + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 572 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 573 + cpu: [arm] 574 + os: [linux] 575 + libc: [glibc] 576 + 577 + '@img/sharp-linux-ppc64@0.34.5': 578 + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 579 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 580 + cpu: [ppc64] 581 + os: [linux] 582 + libc: [glibc] 583 + 584 + '@img/sharp-linux-riscv64@0.34.5': 585 + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 586 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 587 + cpu: [riscv64] 588 + os: [linux] 589 + libc: [glibc] 590 + 591 + '@img/sharp-linux-s390x@0.34.5': 592 + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 593 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 594 + cpu: [s390x] 595 + os: [linux] 596 + libc: [glibc] 597 + 598 + '@img/sharp-linux-x64@0.34.5': 599 + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 600 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 601 + cpu: [x64] 602 + os: [linux] 603 + libc: [glibc] 604 + 605 + '@img/sharp-linuxmusl-arm64@0.34.5': 606 + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 607 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 608 + cpu: [arm64] 609 + os: [linux] 610 + libc: [musl] 611 + 612 + '@img/sharp-linuxmusl-x64@0.34.5': 613 + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 614 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 615 + cpu: [x64] 616 + os: [linux] 617 + libc: [musl] 618 + 619 + '@img/sharp-wasm32@0.34.5': 620 + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} 621 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 622 + cpu: [wasm32] 623 + 624 + '@img/sharp-win32-arm64@0.34.5': 625 + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} 626 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 627 + cpu: [arm64] 628 + os: [win32] 629 + 630 + '@img/sharp-win32-ia32@0.34.5': 631 + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} 632 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 633 + cpu: [ia32] 634 + os: [win32] 635 + 636 + '@img/sharp-win32-x64@0.34.5': 637 + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} 638 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 639 + cpu: [x64] 640 + os: [win32] 641 + 642 + '@internationalized/date@3.11.0': 643 + resolution: {integrity: sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==} 644 + 645 + '@jridgewell/gen-mapping@0.3.13': 646 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 647 + 648 + '@jridgewell/remapping@2.3.5': 649 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 650 + 651 + '@jridgewell/resolve-uri@3.1.2': 652 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 653 + engines: {node: '>=6.0.0'} 654 + 655 + '@jridgewell/sourcemap-codec@1.5.5': 656 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 657 + 658 + '@jridgewell/trace-mapping@0.3.31': 659 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 660 + 661 + '@jridgewell/trace-mapping@0.3.9': 662 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 663 + 664 + '@number-flow/svelte@0.3.13': 665 + resolution: {integrity: sha512-mvbxDeSFa1o/E4vGhrWuawAFCgcn5qTQ/s++FIoD88es5+JQa/aMQUypTy7qXIreTtTvncpIbkKdw9DMnweaSw==} 666 + peerDependencies: 667 + svelte: ^4 || ^5 668 + 669 + '@polka/url@1.0.0-next.29': 670 + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 671 + 672 + '@poppinss/colors@4.1.6': 673 + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} 674 + 675 + '@poppinss/dumper@0.6.5': 676 + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} 677 + 678 + '@poppinss/exception@1.2.3': 679 + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} 680 + 681 + '@rollup/rollup-android-arm-eabi@4.59.0': 682 + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} 683 + cpu: [arm] 684 + os: [android] 685 + 686 + '@rollup/rollup-android-arm64@4.59.0': 687 + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} 688 + cpu: [arm64] 689 + os: [android] 690 + 691 + '@rollup/rollup-darwin-arm64@4.59.0': 692 + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} 693 + cpu: [arm64] 694 + os: [darwin] 695 + 696 + '@rollup/rollup-darwin-x64@4.59.0': 697 + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} 698 + cpu: [x64] 699 + os: [darwin] 700 + 701 + '@rollup/rollup-freebsd-arm64@4.59.0': 702 + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} 703 + cpu: [arm64] 704 + os: [freebsd] 705 + 706 + '@rollup/rollup-freebsd-x64@4.59.0': 707 + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} 708 + cpu: [x64] 709 + os: [freebsd] 710 + 711 + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': 712 + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} 713 + cpu: [arm] 714 + os: [linux] 715 + libc: [glibc] 716 + 717 + '@rollup/rollup-linux-arm-musleabihf@4.59.0': 718 + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} 719 + cpu: [arm] 720 + os: [linux] 721 + libc: [musl] 722 + 723 + '@rollup/rollup-linux-arm64-gnu@4.59.0': 724 + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} 725 + cpu: [arm64] 726 + os: [linux] 727 + libc: [glibc] 728 + 729 + '@rollup/rollup-linux-arm64-musl@4.59.0': 730 + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} 731 + cpu: [arm64] 732 + os: [linux] 733 + libc: [musl] 734 + 735 + '@rollup/rollup-linux-loong64-gnu@4.59.0': 736 + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} 737 + cpu: [loong64] 738 + os: [linux] 739 + libc: [glibc] 740 + 741 + '@rollup/rollup-linux-loong64-musl@4.59.0': 742 + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} 743 + cpu: [loong64] 744 + os: [linux] 745 + libc: [musl] 746 + 747 + '@rollup/rollup-linux-ppc64-gnu@4.59.0': 748 + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} 749 + cpu: [ppc64] 750 + os: [linux] 751 + libc: [glibc] 752 + 753 + '@rollup/rollup-linux-ppc64-musl@4.59.0': 754 + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} 755 + cpu: [ppc64] 756 + os: [linux] 757 + libc: [musl] 758 + 759 + '@rollup/rollup-linux-riscv64-gnu@4.59.0': 760 + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} 761 + cpu: [riscv64] 762 + os: [linux] 763 + libc: [glibc] 764 + 765 + '@rollup/rollup-linux-riscv64-musl@4.59.0': 766 + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} 767 + cpu: [riscv64] 768 + os: [linux] 769 + libc: [musl] 770 + 771 + '@rollup/rollup-linux-s390x-gnu@4.59.0': 772 + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} 773 + cpu: [s390x] 774 + os: [linux] 775 + libc: [glibc] 776 + 777 + '@rollup/rollup-linux-x64-gnu@4.59.0': 778 + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} 779 + cpu: [x64] 780 + os: [linux] 781 + libc: [glibc] 782 + 783 + '@rollup/rollup-linux-x64-musl@4.59.0': 784 + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} 785 + cpu: [x64] 786 + os: [linux] 787 + libc: [musl] 788 + 789 + '@rollup/rollup-openbsd-x64@4.59.0': 790 + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} 791 + cpu: [x64] 792 + os: [openbsd] 793 + 794 + '@rollup/rollup-openharmony-arm64@4.59.0': 795 + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} 796 + cpu: [arm64] 797 + os: [openharmony] 798 + 799 + '@rollup/rollup-win32-arm64-msvc@4.59.0': 800 + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} 801 + cpu: [arm64] 802 + os: [win32] 803 + 804 + '@rollup/rollup-win32-ia32-msvc@4.59.0': 805 + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} 806 + cpu: [ia32] 807 + os: [win32] 808 + 809 + '@rollup/rollup-win32-x64-gnu@4.59.0': 810 + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} 811 + cpu: [x64] 812 + os: [win32] 813 + 814 + '@rollup/rollup-win32-x64-msvc@4.59.0': 815 + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} 816 + cpu: [x64] 817 + os: [win32] 818 + 819 + '@sindresorhus/is@7.2.0': 820 + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} 821 + engines: {node: '>=18'} 822 + 823 + '@speed-highlight/core@1.2.14': 824 + resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} 825 + 826 + '@standard-schema/spec@1.1.0': 827 + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} 828 + 829 + '@sveltejs/acorn-typescript@1.0.9': 830 + resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} 831 + peerDependencies: 832 + acorn: ^8.9.0 833 + 834 + '@sveltejs/adapter-cloudflare@7.2.8': 835 + resolution: {integrity: sha512-bIdhY/Fi4AQmqiBdQVKnafH1h9Gw+xbCvHyUu4EouC8rJOU02zwhi14k/FDhQ0mJF1iblIu3m8UNQ8GpGIvIOQ==} 836 + peerDependencies: 837 + '@sveltejs/kit': ^2.0.0 838 + wrangler: ^4.0.0 839 + 840 + '@sveltejs/kit@2.53.4': 841 + resolution: {integrity: sha512-iAIPEahFgDJJyvz8g0jP08KvqnM6JvdW8YfsygZ+pMeMvyM2zssWMltcsotETvjSZ82G3VlitgDtBIvpQSZrTA==} 842 + engines: {node: '>=18.13'} 843 + hasBin: true 844 + peerDependencies: 845 + '@opentelemetry/api': ^1.0.0 846 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0 847 + svelte: ^4.0.0 || ^5.0.0-next.0 848 + typescript: ^5.3.3 849 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0 850 + peerDependenciesMeta: 851 + '@opentelemetry/api': 852 + optional: true 853 + typescript: 854 + optional: true 855 + 856 + '@sveltejs/vite-plugin-svelte-inspector@5.0.2': 857 + resolution: {integrity: sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==} 858 + engines: {node: ^20.19 || ^22.12 || >=24} 859 + peerDependencies: 860 + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 861 + svelte: ^5.0.0 862 + vite: ^6.3.0 || ^7.0.0 863 + 864 + '@sveltejs/vite-plugin-svelte@6.2.4': 865 + resolution: {integrity: sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==} 866 + engines: {node: ^20.19 || ^22.12 || >=24} 867 + peerDependencies: 868 + svelte: ^5.0.0 869 + vite: ^6.3.0 || ^7.0.0 870 + 871 + '@swc/helpers@0.5.19': 872 + resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} 873 + 874 + '@tailwindcss/forms@0.5.11': 875 + resolution: {integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==} 876 + peerDependencies: 877 + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' 878 + 879 + '@tailwindcss/node@4.2.1': 880 + resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} 881 + 882 + '@tailwindcss/oxide-android-arm64@4.2.1': 883 + resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} 884 + engines: {node: '>= 20'} 885 + cpu: [arm64] 886 + os: [android] 887 + 888 + '@tailwindcss/oxide-darwin-arm64@4.2.1': 889 + resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} 890 + engines: {node: '>= 20'} 891 + cpu: [arm64] 892 + os: [darwin] 893 + 894 + '@tailwindcss/oxide-darwin-x64@4.2.1': 895 + resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} 896 + engines: {node: '>= 20'} 897 + cpu: [x64] 898 + os: [darwin] 899 + 900 + '@tailwindcss/oxide-freebsd-x64@4.2.1': 901 + resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} 902 + engines: {node: '>= 20'} 903 + cpu: [x64] 904 + os: [freebsd] 905 + 906 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': 907 + resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} 908 + engines: {node: '>= 20'} 909 + cpu: [arm] 910 + os: [linux] 911 + 912 + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': 913 + resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} 914 + engines: {node: '>= 20'} 915 + cpu: [arm64] 916 + os: [linux] 917 + libc: [glibc] 918 + 919 + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': 920 + resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} 921 + engines: {node: '>= 20'} 922 + cpu: [arm64] 923 + os: [linux] 924 + libc: [musl] 925 + 926 + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': 927 + resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} 928 + engines: {node: '>= 20'} 929 + cpu: [x64] 930 + os: [linux] 931 + libc: [glibc] 932 + 933 + '@tailwindcss/oxide-linux-x64-musl@4.2.1': 934 + resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} 935 + engines: {node: '>= 20'} 936 + cpu: [x64] 937 + os: [linux] 938 + libc: [musl] 939 + 940 + '@tailwindcss/oxide-wasm32-wasi@4.2.1': 941 + resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} 942 + engines: {node: '>=14.0.0'} 943 + cpu: [wasm32] 944 + bundledDependencies: 945 + - '@napi-rs/wasm-runtime' 946 + - '@emnapi/core' 947 + - '@emnapi/runtime' 948 + - '@tybys/wasm-util' 949 + - '@emnapi/wasi-threads' 950 + - tslib 951 + 952 + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': 953 + resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} 954 + engines: {node: '>= 20'} 955 + cpu: [arm64] 956 + os: [win32] 957 + 958 + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': 959 + resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} 960 + engines: {node: '>= 20'} 961 + cpu: [x64] 962 + os: [win32] 963 + 964 + '@tailwindcss/oxide@4.2.1': 965 + resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} 966 + engines: {node: '>= 20'} 967 + 968 + '@tailwindcss/vite@4.2.1': 969 + resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} 970 + peerDependencies: 971 + vite: ^5.2.0 || ^6 || ^7 972 + 973 + '@types/bun@1.3.10': 974 + resolution: {integrity: sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ==} 975 + 976 + '@types/cookie@0.6.0': 977 + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 978 + 979 + '@types/esrecurse@4.3.1': 980 + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} 981 + 982 + '@types/estree@1.0.8': 983 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 984 + 985 + '@types/json-schema@7.0.15': 986 + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 987 + 988 + '@types/node@25.3.3': 989 + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} 990 + 991 + '@types/trusted-types@2.0.7': 992 + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} 993 + 994 + '@typescript-eslint/eslint-plugin@8.56.1': 995 + resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} 996 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 997 + peerDependencies: 998 + '@typescript-eslint/parser': ^8.56.1 999 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 1000 + typescript: '>=4.8.4 <6.0.0' 1001 + 1002 + '@typescript-eslint/parser@8.56.1': 1003 + resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} 1004 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1005 + peerDependencies: 1006 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 1007 + typescript: '>=4.8.4 <6.0.0' 1008 + 1009 + '@typescript-eslint/project-service@8.56.1': 1010 + resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} 1011 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1012 + peerDependencies: 1013 + typescript: '>=4.8.4 <6.0.0' 1014 + 1015 + '@typescript-eslint/scope-manager@8.56.1': 1016 + resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} 1017 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1018 + 1019 + '@typescript-eslint/tsconfig-utils@8.56.1': 1020 + resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} 1021 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1022 + peerDependencies: 1023 + typescript: '>=4.8.4 <6.0.0' 1024 + 1025 + '@typescript-eslint/type-utils@8.56.1': 1026 + resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} 1027 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1028 + peerDependencies: 1029 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 1030 + typescript: '>=4.8.4 <6.0.0' 1031 + 1032 + '@typescript-eslint/types@8.56.1': 1033 + resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} 1034 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1035 + 1036 + '@typescript-eslint/typescript-estree@8.56.1': 1037 + resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} 1038 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1039 + peerDependencies: 1040 + typescript: '>=4.8.4 <6.0.0' 1041 + 1042 + '@typescript-eslint/utils@8.56.1': 1043 + resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} 1044 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1045 + peerDependencies: 1046 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 1047 + typescript: '>=4.8.4 <6.0.0' 1048 + 1049 + '@typescript-eslint/visitor-keys@8.56.1': 1050 + resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} 1051 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1052 + 1053 + '@use-gesture/core@10.3.1': 1054 + resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} 1055 + 1056 + '@use-gesture/vanilla@10.3.1': 1057 + resolution: {integrity: sha512-lT4scGLu59ovA3zmtUonukAGcA0AdOOh+iwNDS05Bsu7Lq9aZToDHhI6D8Q2qvsVraovtsLLYwPrWdG/noMAKw==} 1058 + 1059 + acorn-jsx@5.3.2: 1060 + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 1061 + peerDependencies: 1062 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 1063 + 1064 + acorn@8.16.0: 1065 + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} 1066 + engines: {node: '>=0.4.0'} 1067 + hasBin: true 1068 + 1069 + ajv@6.14.0: 1070 + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} 1071 + 1072 + aria-query@5.3.1: 1073 + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} 1074 + engines: {node: '>= 0.4'} 1075 + 1076 + await-lock@2.2.2: 1077 + resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} 1078 + 1079 + axobject-query@4.1.0: 1080 + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 1081 + engines: {node: '>= 0.4'} 1082 + 1083 + balanced-match@4.0.4: 1084 + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 1085 + engines: {node: 18 || 20 || >=22} 1086 + 1087 + bits-ui@2.16.2: 1088 + resolution: {integrity: sha512-bgEpRRF7Ck9nRP1pbuKVxpaSMrz+8Pm0y+dmuvlkrSe+uUwIQECef29y6eslFHM6pCAubUh7STrsTLUUp8fzFQ==} 1089 + engines: {node: '>=20'} 1090 + peerDependencies: 1091 + '@internationalized/date': ^3.8.1 1092 + svelte: ^5.33.0 1093 + 1094 + blake3-wasm@2.1.5: 1095 + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 1096 + 1097 + brace-expansion@5.0.4: 1098 + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} 1099 + engines: {node: 18 || 20 || >=22} 1100 + 1101 + bun-types@1.3.10: 1102 + resolution: {integrity: sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg==} 1103 + 1104 + chokidar@4.0.3: 1105 + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 1106 + engines: {node: '>= 14.16.0'} 1107 + 1108 + clsx@2.1.1: 1109 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 1110 + engines: {node: '>=6'} 1111 + 1112 + cookie@0.6.0: 1113 + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 1114 + engines: {node: '>= 0.6'} 1115 + 1116 + cookie@1.1.1: 1117 + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 1118 + engines: {node: '>=18'} 1119 + 1120 + core-js@3.48.0: 1121 + resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} 1122 + 1123 + cross-spawn@7.0.6: 1124 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1125 + engines: {node: '>= 8'} 1126 + 1127 + cssesc@3.0.0: 1128 + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1129 + engines: {node: '>=4'} 1130 + hasBin: true 1131 + 1132 + custom-event-polyfill@1.0.7: 1133 + resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==} 1134 + 1135 + debug@4.4.3: 1136 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 1137 + engines: {node: '>=6.0'} 1138 + peerDependencies: 1139 + supports-color: '*' 1140 + peerDependenciesMeta: 1141 + supports-color: 1142 + optional: true 1143 + 1144 + deep-is@0.1.4: 1145 + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1146 + 1147 + deepmerge@4.3.1: 1148 + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1149 + engines: {node: '>=0.10.0'} 1150 + 1151 + dequal@2.0.3: 1152 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1153 + engines: {node: '>=6'} 1154 + 1155 + detect-libc@2.1.2: 1156 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 1157 + engines: {node: '>=8'} 1158 + 1159 + devalue@5.6.3: 1160 + resolution: {integrity: sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==} 1161 + 1162 + emoji-picker-element@1.29.1: 1163 + resolution: {integrity: sha512-TOiHzu9Dqib3x4MwcAi3wi3RdyT4SoeB4b15AvH1ks4SBwTl7DeebhZ0d3x6dNi4XfNU7IGRZ7NBQllj0RqwrQ==} 1164 + 1165 + enhanced-resolve@5.20.0: 1166 + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} 1167 + engines: {node: '>=10.13.0'} 1168 + 1169 + error-stack-parser-es@1.0.5: 1170 + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} 1171 + 1172 + esbuild@0.27.3: 1173 + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} 1174 + engines: {node: '>=18'} 1175 + hasBin: true 1176 + 1177 + escape-string-regexp@4.0.0: 1178 + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1179 + engines: {node: '>=10'} 1180 + 1181 + eslint-config-prettier@10.1.8: 1182 + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 1183 + hasBin: true 1184 + peerDependencies: 1185 + eslint: '>=7.0.0' 1186 + 1187 + eslint-plugin-svelte@3.15.0: 1188 + resolution: {integrity: sha512-QKB7zqfuB8aChOfBTComgDptMf2yxiJx7FE04nneCmtQzgTHvY8UJkuh8J2Rz7KB9FFV9aTHX6r7rdYGvG8T9Q==} 1189 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1190 + peerDependencies: 1191 + eslint: ^8.57.1 || ^9.0.0 || ^10.0.0 1192 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 1193 + peerDependenciesMeta: 1194 + svelte: 1195 + optional: true 1196 + 1197 + eslint-scope@8.4.0: 1198 + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 1199 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1200 + 1201 + eslint-scope@9.1.1: 1202 + resolution: {integrity: sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==} 1203 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 1204 + 1205 + eslint-visitor-keys@3.4.3: 1206 + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1207 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1208 + 1209 + eslint-visitor-keys@4.2.1: 1210 + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1211 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1212 + 1213 + eslint-visitor-keys@5.0.1: 1214 + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} 1215 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 1216 + 1217 + eslint@10.0.2: 1218 + resolution: {integrity: sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==} 1219 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 1220 + hasBin: true 1221 + peerDependencies: 1222 + jiti: '*' 1223 + peerDependenciesMeta: 1224 + jiti: 1225 + optional: true 1226 + 1227 + esm-env@1.2.2: 1228 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 1229 + 1230 + espree@10.4.0: 1231 + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 1232 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1233 + 1234 + espree@11.1.1: 1235 + resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==} 1236 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 1237 + 1238 + esquery@1.7.0: 1239 + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} 1240 + engines: {node: '>=0.10'} 1241 + 1242 + esrap@2.2.3: 1243 + resolution: {integrity: sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==} 1244 + 1245 + esrecurse@4.3.0: 1246 + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1247 + engines: {node: '>=4.0'} 1248 + 1249 + estraverse@5.3.0: 1250 + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1251 + engines: {node: '>=4.0'} 1252 + 1253 + esutils@2.0.3: 1254 + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1255 + engines: {node: '>=0.10.0'} 1256 + 1257 + fast-deep-equal@3.1.3: 1258 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1259 + 1260 + fast-json-stable-stringify@2.1.0: 1261 + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1262 + 1263 + fast-levenshtein@2.0.6: 1264 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1265 + 1266 + fdir@6.5.0: 1267 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1268 + engines: {node: '>=12.0.0'} 1269 + peerDependencies: 1270 + picomatch: ^3 || ^4 1271 + peerDependenciesMeta: 1272 + picomatch: 1273 + optional: true 1274 + 1275 + file-entry-cache@8.0.0: 1276 + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1277 + engines: {node: '>=16.0.0'} 1278 + 1279 + find-up@5.0.0: 1280 + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1281 + engines: {node: '>=10'} 1282 + 1283 + flat-cache@4.0.1: 1284 + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1285 + engines: {node: '>=16'} 1286 + 1287 + flatted@3.3.4: 1288 + resolution: {integrity: sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==} 1289 + 1290 + flexsearch@0.8.212: 1291 + resolution: {integrity: sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw==} 1292 + 1293 + fsevents@2.3.3: 1294 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1295 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1296 + os: [darwin] 1297 + 1298 + get-tsconfig@4.13.6: 1299 + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} 1300 + 1301 + glob-parent@6.0.2: 1302 + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1303 + engines: {node: '>=10.13.0'} 1304 + 1305 + globals@16.5.0: 1306 + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 1307 + engines: {node: '>=18'} 1308 + 1309 + globals@17.4.0: 1310 + resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} 1311 + engines: {node: '>=18'} 1312 + 1313 + graceful-fs@4.2.11: 1314 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1315 + 1316 + hls.js@1.6.15: 1317 + resolution: {integrity: sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==} 1318 + 1319 + ignore@5.3.2: 1320 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1321 + engines: {node: '>= 4'} 1322 + 1323 + ignore@7.0.5: 1324 + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 1325 + engines: {node: '>= 4'} 1326 + 1327 + imurmurhash@0.1.4: 1328 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1329 + engines: {node: '>=0.8.19'} 1330 + 1331 + inline-style-parser@0.2.7: 1332 + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} 1333 + 1334 + is-emoji-supported@0.0.5: 1335 + resolution: {integrity: sha512-WOlXUhDDHxYqcSmFZis+xWhhqXiK2SU0iYiqmth5Ip0FHLZQAt9rKL5ahnilE8/86WH8tZ3bmNNNC+bTzamqlw==} 1336 + 1337 + is-extglob@2.1.1: 1338 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1339 + engines: {node: '>=0.10.0'} 1340 + 1341 + is-glob@4.0.3: 1342 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1343 + engines: {node: '>=0.10.0'} 1344 + 1345 + is-reference@3.0.3: 1346 + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 1347 + 1348 + isexe@2.0.0: 1349 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1350 + 1351 + iso-datestring-validator@2.2.2: 1352 + resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 1353 + 1354 + jiti@2.6.1: 1355 + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1356 + hasBin: true 1357 + 1358 + json-buffer@3.0.1: 1359 + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1360 + 1361 + json-schema-traverse@0.4.1: 1362 + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1363 + 1364 + json-stable-stringify-without-jsonify@1.0.1: 1365 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1366 + 1367 + keyv@4.5.4: 1368 + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1369 + 1370 + kleur@4.1.5: 1371 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1372 + engines: {node: '>=6'} 1373 + 1374 + known-css-properties@0.37.0: 1375 + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} 1376 + 1377 + levn@0.4.1: 1378 + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1379 + engines: {node: '>= 0.8.0'} 1380 + 1381 + lightningcss-android-arm64@1.31.1: 1382 + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} 1383 + engines: {node: '>= 12.0.0'} 1384 + cpu: [arm64] 1385 + os: [android] 1386 + 1387 + lightningcss-darwin-arm64@1.31.1: 1388 + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} 1389 + engines: {node: '>= 12.0.0'} 1390 + cpu: [arm64] 1391 + os: [darwin] 1392 + 1393 + lightningcss-darwin-x64@1.31.1: 1394 + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} 1395 + engines: {node: '>= 12.0.0'} 1396 + cpu: [x64] 1397 + os: [darwin] 1398 + 1399 + lightningcss-freebsd-x64@1.31.1: 1400 + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} 1401 + engines: {node: '>= 12.0.0'} 1402 + cpu: [x64] 1403 + os: [freebsd] 1404 + 1405 + lightningcss-linux-arm-gnueabihf@1.31.1: 1406 + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} 1407 + engines: {node: '>= 12.0.0'} 1408 + cpu: [arm] 1409 + os: [linux] 1410 + 1411 + lightningcss-linux-arm64-gnu@1.31.1: 1412 + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} 1413 + engines: {node: '>= 12.0.0'} 1414 + cpu: [arm64] 1415 + os: [linux] 1416 + libc: [glibc] 1417 + 1418 + lightningcss-linux-arm64-musl@1.31.1: 1419 + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} 1420 + engines: {node: '>= 12.0.0'} 1421 + cpu: [arm64] 1422 + os: [linux] 1423 + libc: [musl] 1424 + 1425 + lightningcss-linux-x64-gnu@1.31.1: 1426 + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} 1427 + engines: {node: '>= 12.0.0'} 1428 + cpu: [x64] 1429 + os: [linux] 1430 + libc: [glibc] 1431 + 1432 + lightningcss-linux-x64-musl@1.31.1: 1433 + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} 1434 + engines: {node: '>= 12.0.0'} 1435 + cpu: [x64] 1436 + os: [linux] 1437 + libc: [musl] 1438 + 1439 + lightningcss-win32-arm64-msvc@1.31.1: 1440 + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} 1441 + engines: {node: '>= 12.0.0'} 1442 + cpu: [arm64] 1443 + os: [win32] 1444 + 1445 + lightningcss-win32-x64-msvc@1.31.1: 1446 + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} 1447 + engines: {node: '>= 12.0.0'} 1448 + cpu: [x64] 1449 + os: [win32] 1450 + 1451 + lightningcss@1.31.1: 1452 + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} 1453 + engines: {node: '>= 12.0.0'} 1454 + 1455 + lilconfig@2.1.0: 1456 + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1457 + engines: {node: '>=10'} 1458 + 1459 + loadjs@4.3.0: 1460 + resolution: {integrity: sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==} 1461 + 1462 + locate-character@3.0.0: 1463 + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1464 + 1465 + locate-path@6.0.0: 1466 + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1467 + engines: {node: '>=10'} 1468 + 1469 + lz-string@1.5.0: 1470 + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} 1471 + hasBin: true 1472 + 1473 + magic-string@0.30.21: 1474 + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1475 + 1476 + mini-svg-data-uri@1.4.4: 1477 + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} 1478 + hasBin: true 1479 + 1480 + miniflare@4.20260305.0: 1481 + resolution: {integrity: sha512-jVhtKJtiwaZa3rI+WgoLvSJmEazDsoUmAPYRUmEe2VO6VSbvkhbnDRm+dsPbYRatgNIExwrpqG1rv96jHiSb0w==} 1482 + engines: {node: '>=18.0.0'} 1483 + hasBin: true 1484 + 1485 + minimatch@10.2.4: 1486 + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} 1487 + engines: {node: 18 || 20 || >=22} 1488 + 1489 + mode-watcher@1.1.0: 1490 + resolution: {integrity: sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==} 1491 + peerDependencies: 1492 + svelte: ^5.27.0 1493 + 1494 + mri@1.2.0: 1495 + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1496 + engines: {node: '>=4'} 1497 + 1498 + mrmime@2.0.1: 1499 + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1500 + engines: {node: '>=10'} 1501 + 1502 + ms@2.1.3: 1503 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1504 + 1505 + multiformats@9.9.0: 1506 + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} 1507 + 1508 + nanoid@3.3.11: 1509 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1510 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1511 + hasBin: true 1512 + 1513 + nanoid@5.1.6: 1514 + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} 1515 + engines: {node: ^18 || >=20} 1516 + hasBin: true 1517 + 1518 + natural-compare@1.4.0: 1519 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1520 + 1521 + node-gyp-build@4.8.4: 1522 + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} 1523 + hasBin: true 1524 + 1525 + number-flow@0.5.12: 1526 + resolution: {integrity: sha512-CIs21h2JkfYG4rfgERaUNAk0Cz+Ef14fNJfSCbGGhgRgconQc9b7rcCQfi9SZ36kNjVXmsl2BrzDbjGtEgumAA==} 1527 + 1528 + obug@2.1.1: 1529 + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} 1530 + 1531 + optionator@0.9.4: 1532 + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1533 + engines: {node: '>= 0.8.0'} 1534 + 1535 + p-limit@3.1.0: 1536 + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1537 + engines: {node: '>=10'} 1538 + 1539 + p-locate@5.0.0: 1540 + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1541 + engines: {node: '>=10'} 1542 + 1543 + path-exists@4.0.0: 1544 + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1545 + engines: {node: '>=8'} 1546 + 1547 + path-key@3.1.1: 1548 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1549 + engines: {node: '>=8'} 1550 + 1551 + path-to-regexp@6.3.0: 1552 + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 1553 + 1554 + pathe@2.0.3: 1555 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1556 + 1557 + picocolors@1.1.1: 1558 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1559 + 1560 + picomatch@4.0.3: 1561 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1562 + engines: {node: '>=12'} 1563 + 1564 + plyr@3.8.4: 1565 + resolution: {integrity: sha512-DrzLbK9Wol3zeiuZCleD9aUOl0KAaBHR9H6WVVVYPZ4Ya+LYxUFTgSF1jooHcMQCv96Ws96wCaZzIoP3bES8pQ==} 1566 + 1567 + postcss-load-config@3.1.4: 1568 + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1569 + engines: {node: '>= 10'} 1570 + peerDependencies: 1571 + postcss: '>=8.0.9' 1572 + ts-node: '>=9.0.0' 1573 + peerDependenciesMeta: 1574 + postcss: 1575 + optional: true 1576 + ts-node: 1577 + optional: true 1578 + 1579 + postcss-safe-parser@7.0.1: 1580 + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} 1581 + engines: {node: '>=18.0'} 1582 + peerDependencies: 1583 + postcss: ^8.4.31 1584 + 1585 + postcss-scss@4.0.9: 1586 + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} 1587 + engines: {node: '>=12.0'} 1588 + peerDependencies: 1589 + postcss: ^8.4.29 1590 + 1591 + postcss-selector-parser@7.1.1: 1592 + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} 1593 + engines: {node: '>=4'} 1594 + 1595 + postcss@8.5.8: 1596 + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} 1597 + engines: {node: ^10 || ^12 || >=14} 1598 + 1599 + prelude-ls@1.2.1: 1600 + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1601 + engines: {node: '>= 0.8.0'} 1602 + 1603 + prettier-plugin-svelte@3.5.0: 1604 + resolution: {integrity: sha512-2lLO/7EupnjO/95t+XZesXs8Bf3nYLIDfCo270h5QWbj/vjLqmrQ1LiRk9LPggxSDsnVYfehamZNf+rgQYApZg==} 1605 + peerDependencies: 1606 + prettier: ^3.0.0 1607 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 1608 + 1609 + prettier-plugin-tailwindcss@0.7.2: 1610 + resolution: {integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==} 1611 + engines: {node: '>=20.19'} 1612 + peerDependencies: 1613 + '@ianvs/prettier-plugin-sort-imports': '*' 1614 + '@prettier/plugin-hermes': '*' 1615 + '@prettier/plugin-oxc': '*' 1616 + '@prettier/plugin-pug': '*' 1617 + '@shopify/prettier-plugin-liquid': '*' 1618 + '@trivago/prettier-plugin-sort-imports': '*' 1619 + '@zackad/prettier-plugin-twig': '*' 1620 + prettier: ^3.0 1621 + prettier-plugin-astro: '*' 1622 + prettier-plugin-css-order: '*' 1623 + prettier-plugin-jsdoc: '*' 1624 + prettier-plugin-marko: '*' 1625 + prettier-plugin-multiline-arrays: '*' 1626 + prettier-plugin-organize-attributes: '*' 1627 + prettier-plugin-organize-imports: '*' 1628 + prettier-plugin-sort-imports: '*' 1629 + prettier-plugin-svelte: '*' 1630 + peerDependenciesMeta: 1631 + '@ianvs/prettier-plugin-sort-imports': 1632 + optional: true 1633 + '@prettier/plugin-hermes': 1634 + optional: true 1635 + '@prettier/plugin-oxc': 1636 + optional: true 1637 + '@prettier/plugin-pug': 1638 + optional: true 1639 + '@shopify/prettier-plugin-liquid': 1640 + optional: true 1641 + '@trivago/prettier-plugin-sort-imports': 1642 + optional: true 1643 + '@zackad/prettier-plugin-twig': 1644 + optional: true 1645 + prettier-plugin-astro: 1646 + optional: true 1647 + prettier-plugin-css-order: 1648 + optional: true 1649 + prettier-plugin-jsdoc: 1650 + optional: true 1651 + prettier-plugin-marko: 1652 + optional: true 1653 + prettier-plugin-multiline-arrays: 1654 + optional: true 1655 + prettier-plugin-organize-attributes: 1656 + optional: true 1657 + prettier-plugin-organize-imports: 1658 + optional: true 1659 + prettier-plugin-sort-imports: 1660 + optional: true 1661 + prettier-plugin-svelte: 1662 + optional: true 1663 + 1664 + prettier@3.8.1: 1665 + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} 1666 + engines: {node: '>=14'} 1667 + hasBin: true 1668 + 1669 + punycode@2.3.1: 1670 + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1671 + engines: {node: '>=6'} 1672 + 1673 + rangetouch@2.0.1: 1674 + resolution: {integrity: sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==} 1675 + 1676 + readdirp@4.1.2: 1677 + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1678 + engines: {node: '>= 14.18.0'} 1679 + 1680 + regexparam@3.0.0: 1681 + resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} 1682 + engines: {node: '>=8'} 1683 + 1684 + resolve-pkg-maps@1.0.0: 1685 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1686 + 1687 + rollup@4.59.0: 1688 + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} 1689 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1690 + hasBin: true 1691 + 1692 + runed@0.23.4: 1693 + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} 1694 + peerDependencies: 1695 + svelte: ^5.7.0 1696 + 1697 + runed@0.25.0: 1698 + resolution: {integrity: sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==} 1699 + peerDependencies: 1700 + svelte: ^5.7.0 1701 + 1702 + runed@0.28.0: 1703 + resolution: {integrity: sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==} 1704 + peerDependencies: 1705 + svelte: ^5.7.0 1706 + 1707 + runed@0.35.1: 1708 + resolution: {integrity: sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==} 1709 + peerDependencies: 1710 + '@sveltejs/kit': ^2.21.0 1711 + svelte: ^5.7.0 1712 + peerDependenciesMeta: 1713 + '@sveltejs/kit': 1714 + optional: true 1715 + 1716 + sade@1.8.1: 1717 + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1718 + engines: {node: '>=6'} 1719 + 1720 + semver@7.7.4: 1721 + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} 1722 + engines: {node: '>=10'} 1723 + hasBin: true 1724 + 1725 + set-cookie-parser@3.0.1: 1726 + resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} 1727 + 1728 + sharp@0.34.5: 1729 + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} 1730 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 1731 + 1732 + shebang-command@2.0.0: 1733 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1734 + engines: {node: '>=8'} 1735 + 1736 + shebang-regex@3.0.0: 1737 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1738 + engines: {node: '>=8'} 1739 + 1740 + sirv@3.0.2: 1741 + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} 1742 + engines: {node: '>=18'} 1743 + 1744 + source-map-js@1.2.1: 1745 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1746 + engines: {node: '>=0.10.0'} 1747 + 1748 + style-to-object@1.0.14: 1749 + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} 1750 + 1751 + supports-color@10.2.2: 1752 + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} 1753 + engines: {node: '>=18'} 1754 + 1755 + svelte-check@4.4.4: 1756 + resolution: {integrity: sha512-F1pGqXc710Oi/wTI4d/x7d6lgPwwfx1U6w3Q35n4xsC2e8C/yN2sM1+mWxjlMcpAfWucjlq4vPi+P4FZ8a14sQ==} 1757 + engines: {node: '>= 18.0.0'} 1758 + hasBin: true 1759 + peerDependencies: 1760 + svelte: ^4.0.0 || ^5.0.0-next.0 1761 + typescript: '>=5.0.0' 1762 + 1763 + svelte-eslint-parser@1.5.1: 1764 + resolution: {integrity: sha512-UbY7DYoDg+x4AKLUcX5xWuEWylgmm8ZD2Z89YT/AK6Wm/ckeMTnOMwr6AVC99znXbRC26xzWEPhSgmB62E07Gg==} 1765 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.30.2} 1766 + peerDependencies: 1767 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 1768 + peerDependenciesMeta: 1769 + svelte: 1770 + optional: true 1771 + 1772 + svelte-sonner@1.0.7: 1773 + resolution: {integrity: sha512-1EUFYmd7q/xfs2qCHwJzGPh9n5VJ3X6QjBN10fof2vxgy8fYE7kVfZ7uGnd7i6fQaWIr5KvXcwYXE/cmTEjk5A==} 1774 + peerDependencies: 1775 + svelte: ^5.0.0 1776 + 1777 + svelte-toolbelt@0.10.6: 1778 + resolution: {integrity: sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==} 1779 + engines: {node: '>=18', pnpm: '>=8.7.0'} 1780 + peerDependencies: 1781 + svelte: ^5.30.2 1782 + 1783 + svelte-toolbelt@0.7.1: 1784 + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} 1785 + engines: {node: '>=18', pnpm: '>=8.7.0'} 1786 + peerDependencies: 1787 + svelte: ^5.0.0 1788 + 1789 + svelte@5.53.6: 1790 + resolution: {integrity: sha512-lP5DGF3oDDI9fhHcSpaBiJEkFLuS16h92DhM1L5K1lFm0WjOmUh1i2sNkBBk8rkxJRpob0dBE75jRfUzGZUOGA==} 1791 + engines: {node: '>=18'} 1792 + 1793 + tabbable@6.4.0: 1794 + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} 1795 + 1796 + tailwind-merge@3.5.0: 1797 + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} 1798 + 1799 + tailwind-variants@3.2.2: 1800 + resolution: {integrity: sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==} 1801 + engines: {node: '>=16.x', pnpm: '>=7.x'} 1802 + peerDependencies: 1803 + tailwind-merge: '>=3.0.0' 1804 + tailwindcss: '*' 1805 + peerDependenciesMeta: 1806 + tailwind-merge: 1807 + optional: true 1808 + 1809 + tailwindcss@4.2.1: 1810 + resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} 1811 + 1812 + tapable@2.3.0: 1813 + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} 1814 + engines: {node: '>=6'} 1815 + 1816 + tinyglobby@0.2.15: 1817 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1818 + engines: {node: '>=12.0.0'} 1819 + 1820 + tlds@1.261.0: 1821 + resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} 1822 + hasBin: true 1823 + 1824 + totalist@3.0.1: 1825 + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1826 + engines: {node: '>=6'} 1827 + 1828 + ts-api-utils@2.4.0: 1829 + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} 1830 + engines: {node: '>=18.12'} 1831 + peerDependencies: 1832 + typescript: '>=4.8.4' 1833 + 1834 + tslib@2.8.1: 1835 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1836 + 1837 + tsx@4.21.0: 1838 + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} 1839 + engines: {node: '>=18.0.0'} 1840 + hasBin: true 1841 + 1842 + type-check@0.4.0: 1843 + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1844 + engines: {node: '>= 0.8.0'} 1845 + 1846 + typescript-eslint@8.56.1: 1847 + resolution: {integrity: sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==} 1848 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1849 + peerDependencies: 1850 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 1851 + typescript: '>=4.8.4 <6.0.0' 1852 + 1853 + typescript@5.9.3: 1854 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1855 + engines: {node: '>=14.17'} 1856 + hasBin: true 1857 + 1858 + uint8arrays@3.0.0: 1859 + resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 1860 + 1861 + undici-types@7.18.2: 1862 + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} 1863 + 1864 + undici@7.18.2: 1865 + resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} 1866 + engines: {node: '>=20.18.1'} 1867 + 1868 + unenv@2.0.0-rc.24: 1869 + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} 1870 + 1871 + unicode-segmenter@0.14.5: 1872 + resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 1873 + 1874 + uri-js@4.4.1: 1875 + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1876 + 1877 + url-polyfill@1.1.14: 1878 + resolution: {integrity: sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==} 1879 + 1880 + util-deprecate@1.0.2: 1881 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1882 + 1883 + valibot@1.2.0: 1884 + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} 1885 + peerDependencies: 1886 + typescript: '>=5' 1887 + peerDependenciesMeta: 1888 + typescript: 1889 + optional: true 1890 + 1891 + vite@7.3.1: 1892 + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} 1893 + engines: {node: ^20.19.0 || >=22.12.0} 1894 + hasBin: true 1895 + peerDependencies: 1896 + '@types/node': ^20.19.0 || >=22.12.0 1897 + jiti: '>=1.21.0' 1898 + less: ^4.0.0 1899 + lightningcss: ^1.21.0 1900 + sass: ^1.70.0 1901 + sass-embedded: ^1.70.0 1902 + stylus: '>=0.54.8' 1903 + sugarss: ^5.0.0 1904 + terser: ^5.16.0 1905 + tsx: ^4.8.1 1906 + yaml: ^2.4.2 1907 + peerDependenciesMeta: 1908 + '@types/node': 1909 + optional: true 1910 + jiti: 1911 + optional: true 1912 + less: 1913 + optional: true 1914 + lightningcss: 1915 + optional: true 1916 + sass: 1917 + optional: true 1918 + sass-embedded: 1919 + optional: true 1920 + stylus: 1921 + optional: true 1922 + sugarss: 1923 + optional: true 1924 + terser: 1925 + optional: true 1926 + tsx: 1927 + optional: true 1928 + yaml: 1929 + optional: true 1930 + 1931 + vitefu@1.1.2: 1932 + resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==} 1933 + peerDependencies: 1934 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0 1935 + peerDependenciesMeta: 1936 + vite: 1937 + optional: true 1938 + 1939 + which@2.0.2: 1940 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1941 + engines: {node: '>= 8'} 1942 + hasBin: true 1943 + 1944 + word-wrap@1.2.5: 1945 + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1946 + engines: {node: '>=0.10.0'} 1947 + 1948 + workerd@1.20260305.0: 1949 + resolution: {integrity: sha512-JkhfCLU+w+KbQmZ9k49IcDYc78GBo7eG8Mir8E2+KVjR7otQAmpcLlsous09YLh8WQ3Bt3Mi6/WMStvMAPukeA==} 1950 + engines: {node: '>=16'} 1951 + hasBin: true 1952 + 1953 + worktop@0.8.0-next.18: 1954 + resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} 1955 + engines: {node: '>=12'} 1956 + 1957 + wrangler@4.69.0: 1958 + resolution: {integrity: sha512-EmVfIM65I5b4ITHe3Y9R7zQyf4NUBQ1leStakMlWiVR9n6VlDwuEltyQI2l3i0JciDnWyR3uqe+T6C08ivniTQ==} 1959 + engines: {node: '>=20.0.0'} 1960 + hasBin: true 1961 + peerDependencies: 1962 + '@cloudflare/workers-types': ^4.20260305.0 1963 + peerDependenciesMeta: 1964 + '@cloudflare/workers-types': 1965 + optional: true 1966 + 1967 + ws@8.18.0: 1968 + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 1969 + engines: {node: '>=10.0.0'} 1970 + peerDependencies: 1971 + bufferutil: ^4.0.1 1972 + utf-8-validate: '>=5.0.2' 1973 + peerDependenciesMeta: 1974 + bufferutil: 1975 + optional: true 1976 + utf-8-validate: 1977 + optional: true 1978 + 1979 + yaml@1.10.2: 1980 + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1981 + engines: {node: '>= 6'} 1982 + 1983 + yocto-queue@0.1.0: 1984 + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1985 + engines: {node: '>=10'} 1986 + 1987 + youch-core@0.3.3: 1988 + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} 1989 + 1990 + youch@4.1.0-beta.10: 1991 + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} 1992 + 1993 + zimmerframe@1.1.4: 1994 + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} 1995 + 1996 + zod@3.25.76: 1997 + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 1998 + 1999 + snapshots: 2000 + 2001 + '@atcute/atproto@3.1.10': 2002 + dependencies: 2003 + '@atcute/lexicons': 1.2.9 2004 + 2005 + '@atcute/bluesky@3.2.19': 2006 + dependencies: 2007 + '@atcute/atproto': 3.1.10 2008 + '@atcute/lexicons': 1.2.9 2009 + 2010 + '@atcute/client@4.2.1': 2011 + dependencies: 2012 + '@atcute/identity': 1.1.3 2013 + '@atcute/lexicons': 1.2.9 2014 + 2015 + '@atcute/identity-resolver@1.2.2(@atcute/identity@1.1.3)': 2016 + dependencies: 2017 + '@atcute/identity': 1.1.3 2018 + '@atcute/lexicons': 1.2.9 2019 + '@atcute/util-fetch': 1.0.5 2020 + '@badrap/valita': 0.4.6 2021 + 2022 + '@atcute/identity@1.1.3': 2023 + dependencies: 2024 + '@atcute/lexicons': 1.2.9 2025 + '@badrap/valita': 0.4.6 2026 + 2027 + '@atcute/lexicons@1.2.9': 2028 + dependencies: 2029 + '@atcute/uint8array': 1.1.1 2030 + '@atcute/util-text': 1.1.1 2031 + '@standard-schema/spec': 1.1.0 2032 + esm-env: 1.2.2 2033 + 2034 + '@atcute/multibase@1.1.8': 2035 + dependencies: 2036 + '@atcute/uint8array': 1.1.1 2037 + 2038 + '@atcute/oauth-crypto@0.1.0': 2039 + dependencies: 2040 + '@atcute/multibase': 1.1.8 2041 + '@atcute/uint8array': 1.1.1 2042 + '@badrap/valita': 0.4.6 2043 + nanoid: 5.1.6 2044 + 2045 + '@atcute/oauth-keyset@0.1.0': 2046 + dependencies: 2047 + '@atcute/oauth-crypto': 0.1.0 2048 + 2049 + '@atcute/oauth-node-client@1.1.0': 2050 + dependencies: 2051 + '@atcute/client': 4.2.1 2052 + '@atcute/identity': 1.1.3 2053 + '@atcute/identity-resolver': 1.2.2(@atcute/identity@1.1.3) 2054 + '@atcute/lexicons': 1.2.9 2055 + '@atcute/oauth-crypto': 0.1.0 2056 + '@atcute/oauth-keyset': 0.1.0 2057 + '@atcute/oauth-types': 0.1.1 2058 + '@atcute/util-fetch': 1.0.5 2059 + '@badrap/valita': 0.4.6 2060 + nanoid: 5.1.6 2061 + 2062 + '@atcute/oauth-types@0.1.1': 2063 + dependencies: 2064 + '@atcute/identity': 1.1.3 2065 + '@atcute/lexicons': 1.2.9 2066 + '@atcute/oauth-keyset': 0.1.0 2067 + '@badrap/valita': 0.4.6 2068 + 2069 + '@atcute/tid@1.1.2': 2070 + dependencies: 2071 + '@atcute/time-ms': 1.2.3 2072 + 2073 + '@atcute/time-ms@1.2.3': 2074 + dependencies: 2075 + '@types/bun': 1.3.10 2076 + node-gyp-build: 4.8.4 2077 + 2078 + '@atcute/uint8array@1.1.1': {} 2079 + 2080 + '@atcute/util-fetch@1.0.5': 2081 + dependencies: 2082 + '@badrap/valita': 0.4.6 2083 + 2084 + '@atcute/util-text@1.1.1': 2085 + dependencies: 2086 + unicode-segmenter: 0.14.5 2087 + 2088 + '@atproto/api@0.18.21': 2089 + dependencies: 2090 + '@atproto/common-web': 0.4.17 2091 + '@atproto/lexicon': 0.6.1 2092 + '@atproto/syntax': 0.4.3 2093 + '@atproto/xrpc': 0.7.7 2094 + await-lock: 2.2.2 2095 + multiformats: 9.9.0 2096 + tlds: 1.261.0 2097 + zod: 3.25.76 2098 + 2099 + '@atproto/common-web@0.4.17': 2100 + dependencies: 2101 + '@atproto/lex-data': 0.0.12 2102 + '@atproto/lex-json': 0.0.12 2103 + '@atproto/syntax': 0.4.3 2104 + zod: 3.25.76 2105 + 2106 + '@atproto/lex-data@0.0.12': 2107 + dependencies: 2108 + multiformats: 9.9.0 2109 + tslib: 2.8.1 2110 + uint8arrays: 3.0.0 2111 + unicode-segmenter: 0.14.5 2112 + 2113 + '@atproto/lex-json@0.0.12': 2114 + dependencies: 2115 + '@atproto/lex-data': 0.0.12 2116 + tslib: 2.8.1 2117 + 2118 + '@atproto/lexicon@0.6.1': 2119 + dependencies: 2120 + '@atproto/common-web': 0.4.17 2121 + '@atproto/syntax': 0.4.3 2122 + iso-datestring-validator: 2.2.2 2123 + multiformats: 9.9.0 2124 + zod: 3.25.76 2125 + 2126 + '@atproto/syntax@0.4.3': 2127 + dependencies: 2128 + tslib: 2.8.1 2129 + 2130 + '@atproto/xrpc@0.7.7': 2131 + dependencies: 2132 + '@atproto/lexicon': 0.6.1 2133 + zod: 3.25.76 2134 + 2135 + '@badrap/valita@0.4.6': {} 2136 + 2137 + '@cloudflare/kv-asset-handler@0.4.2': {} 2138 + 2139 + '@cloudflare/unenv-preset@2.14.0(unenv@2.0.0-rc.24)(workerd@1.20260305.0)': 2140 + dependencies: 2141 + unenv: 2.0.0-rc.24 2142 + optionalDependencies: 2143 + workerd: 1.20260305.0 2144 + 2145 + '@cloudflare/workerd-darwin-64@1.20260305.0': 2146 + optional: true 2147 + 2148 + '@cloudflare/workerd-darwin-arm64@1.20260305.0': 2149 + optional: true 2150 + 2151 + '@cloudflare/workerd-linux-64@1.20260305.0': 2152 + optional: true 2153 + 2154 + '@cloudflare/workerd-linux-arm64@1.20260305.0': 2155 + optional: true 2156 + 2157 + '@cloudflare/workerd-windows-64@1.20260305.0': 2158 + optional: true 2159 + 2160 + '@cloudflare/workers-types@4.20260301.1': {} 2161 + 2162 + '@cspotcode/source-map-support@0.8.1': 2163 + dependencies: 2164 + '@jridgewell/trace-mapping': 0.3.9 2165 + 2166 + '@emnapi/runtime@1.8.1': 2167 + dependencies: 2168 + tslib: 2.8.1 2169 + optional: true 2170 + 2171 + '@esbuild/aix-ppc64@0.27.3': 2172 + optional: true 2173 + 2174 + '@esbuild/android-arm64@0.27.3': 2175 + optional: true 2176 + 2177 + '@esbuild/android-arm@0.27.3': 2178 + optional: true 2179 + 2180 + '@esbuild/android-x64@0.27.3': 2181 + optional: true 2182 + 2183 + '@esbuild/darwin-arm64@0.27.3': 2184 + optional: true 2185 + 2186 + '@esbuild/darwin-x64@0.27.3': 2187 + optional: true 2188 + 2189 + '@esbuild/freebsd-arm64@0.27.3': 2190 + optional: true 2191 + 2192 + '@esbuild/freebsd-x64@0.27.3': 2193 + optional: true 2194 + 2195 + '@esbuild/linux-arm64@0.27.3': 2196 + optional: true 2197 + 2198 + '@esbuild/linux-arm@0.27.3': 2199 + optional: true 2200 + 2201 + '@esbuild/linux-ia32@0.27.3': 2202 + optional: true 2203 + 2204 + '@esbuild/linux-loong64@0.27.3': 2205 + optional: true 2206 + 2207 + '@esbuild/linux-mips64el@0.27.3': 2208 + optional: true 2209 + 2210 + '@esbuild/linux-ppc64@0.27.3': 2211 + optional: true 2212 + 2213 + '@esbuild/linux-riscv64@0.27.3': 2214 + optional: true 2215 + 2216 + '@esbuild/linux-s390x@0.27.3': 2217 + optional: true 2218 + 2219 + '@esbuild/linux-x64@0.27.3': 2220 + optional: true 2221 + 2222 + '@esbuild/netbsd-arm64@0.27.3': 2223 + optional: true 2224 + 2225 + '@esbuild/netbsd-x64@0.27.3': 2226 + optional: true 2227 + 2228 + '@esbuild/openbsd-arm64@0.27.3': 2229 + optional: true 2230 + 2231 + '@esbuild/openbsd-x64@0.27.3': 2232 + optional: true 2233 + 2234 + '@esbuild/openharmony-arm64@0.27.3': 2235 + optional: true 2236 + 2237 + '@esbuild/sunos-x64@0.27.3': 2238 + optional: true 2239 + 2240 + '@esbuild/win32-arm64@0.27.3': 2241 + optional: true 2242 + 2243 + '@esbuild/win32-ia32@0.27.3': 2244 + optional: true 2245 + 2246 + '@esbuild/win32-x64@0.27.3': 2247 + optional: true 2248 + 2249 + '@eslint-community/eslint-utils@4.9.1(eslint@10.0.2(jiti@2.6.1))': 2250 + dependencies: 2251 + eslint: 10.0.2(jiti@2.6.1) 2252 + eslint-visitor-keys: 3.4.3 2253 + 2254 + '@eslint-community/regexpp@4.12.2': {} 2255 + 2256 + '@eslint/compat@2.0.2(eslint@10.0.2(jiti@2.6.1))': 2257 + dependencies: 2258 + '@eslint/core': 1.1.0 2259 + optionalDependencies: 2260 + eslint: 10.0.2(jiti@2.6.1) 2261 + 2262 + '@eslint/config-array@0.23.2': 2263 + dependencies: 2264 + '@eslint/object-schema': 3.0.2 2265 + debug: 4.4.3 2266 + minimatch: 10.2.4 2267 + transitivePeerDependencies: 2268 + - supports-color 2269 + 2270 + '@eslint/config-helpers@0.5.2': 2271 + dependencies: 2272 + '@eslint/core': 1.1.0 2273 + 2274 + '@eslint/core@1.1.0': 2275 + dependencies: 2276 + '@types/json-schema': 7.0.15 2277 + 2278 + '@eslint/js@10.0.1(eslint@10.0.2(jiti@2.6.1))': 2279 + optionalDependencies: 2280 + eslint: 10.0.2(jiti@2.6.1) 2281 + 2282 + '@eslint/object-schema@3.0.2': {} 2283 + 2284 + '@eslint/plugin-kit@0.6.0': 2285 + dependencies: 2286 + '@eslint/core': 1.1.0 2287 + levn: 0.4.1 2288 + 2289 + '@floating-ui/core@1.7.4': 2290 + dependencies: 2291 + '@floating-ui/utils': 0.2.10 2292 + 2293 + '@floating-ui/dom@1.7.5': 2294 + dependencies: 2295 + '@floating-ui/core': 1.7.4 2296 + '@floating-ui/utils': 0.2.10 2297 + 2298 + '@floating-ui/utils@0.2.10': {} 2299 + 2300 + '@foxui/core@0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1)': 2301 + dependencies: 2302 + '@number-flow/svelte': 0.3.13(svelte@5.53.6) 2303 + bits-ui: 2.16.2(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6) 2304 + clsx: 2.1.1 2305 + mode-watcher: 1.1.0(svelte@5.53.6) 2306 + svelte: 5.53.6 2307 + svelte-sonner: 1.0.7(svelte@5.53.6) 2308 + tailwind-merge: 3.5.0 2309 + tailwind-variants: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) 2310 + tailwindcss: 4.2.1 2311 + transitivePeerDependencies: 2312 + - '@internationalized/date' 2313 + - '@sveltejs/kit' 2314 + 2315 + '@foxui/social@0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1)': 2316 + dependencies: 2317 + '@atproto/api': 0.18.21 2318 + '@foxui/core': 0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1) 2319 + '@foxui/time': 0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1) 2320 + '@use-gesture/vanilla': 10.3.1 2321 + bits-ui: 2.16.2(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6) 2322 + emoji-picker-element: 1.29.1 2323 + hls.js: 1.6.15 2324 + is-emoji-supported: 0.0.5 2325 + plyr: 3.8.4 2326 + svelte: 5.53.6 2327 + tailwindcss: 4.2.1 2328 + transitivePeerDependencies: 2329 + - '@internationalized/date' 2330 + - '@sveltejs/kit' 2331 + 2332 + '@foxui/time@0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1)': 2333 + dependencies: 2334 + '@foxui/core': 0.5.1(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(tailwindcss@4.2.1) 2335 + '@number-flow/svelte': 0.3.13(svelte@5.53.6) 2336 + bits-ui: 2.16.2(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6) 2337 + svelte: 5.53.6 2338 + tailwindcss: 4.2.1 2339 + transitivePeerDependencies: 2340 + - '@internationalized/date' 2341 + - '@sveltejs/kit' 2342 + 2343 + '@humanfs/core@0.19.1': {} 2344 + 2345 + '@humanfs/node@0.16.7': 2346 + dependencies: 2347 + '@humanfs/core': 0.19.1 2348 + '@humanwhocodes/retry': 0.4.3 2349 + 2350 + '@humanwhocodes/module-importer@1.0.1': {} 2351 + 2352 + '@humanwhocodes/retry@0.4.3': {} 2353 + 2354 + '@img/colour@1.1.0': {} 2355 + 2356 + '@img/sharp-darwin-arm64@0.34.5': 2357 + optionalDependencies: 2358 + '@img/sharp-libvips-darwin-arm64': 1.2.4 2359 + optional: true 2360 + 2361 + '@img/sharp-darwin-x64@0.34.5': 2362 + optionalDependencies: 2363 + '@img/sharp-libvips-darwin-x64': 1.2.4 2364 + optional: true 2365 + 2366 + '@img/sharp-libvips-darwin-arm64@1.2.4': 2367 + optional: true 2368 + 2369 + '@img/sharp-libvips-darwin-x64@1.2.4': 2370 + optional: true 2371 + 2372 + '@img/sharp-libvips-linux-arm64@1.2.4': 2373 + optional: true 2374 + 2375 + '@img/sharp-libvips-linux-arm@1.2.4': 2376 + optional: true 2377 + 2378 + '@img/sharp-libvips-linux-ppc64@1.2.4': 2379 + optional: true 2380 + 2381 + '@img/sharp-libvips-linux-riscv64@1.2.4': 2382 + optional: true 2383 + 2384 + '@img/sharp-libvips-linux-s390x@1.2.4': 2385 + optional: true 2386 + 2387 + '@img/sharp-libvips-linux-x64@1.2.4': 2388 + optional: true 2389 + 2390 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 2391 + optional: true 2392 + 2393 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 2394 + optional: true 2395 + 2396 + '@img/sharp-linux-arm64@0.34.5': 2397 + optionalDependencies: 2398 + '@img/sharp-libvips-linux-arm64': 1.2.4 2399 + optional: true 2400 + 2401 + '@img/sharp-linux-arm@0.34.5': 2402 + optionalDependencies: 2403 + '@img/sharp-libvips-linux-arm': 1.2.4 2404 + optional: true 2405 + 2406 + '@img/sharp-linux-ppc64@0.34.5': 2407 + optionalDependencies: 2408 + '@img/sharp-libvips-linux-ppc64': 1.2.4 2409 + optional: true 2410 + 2411 + '@img/sharp-linux-riscv64@0.34.5': 2412 + optionalDependencies: 2413 + '@img/sharp-libvips-linux-riscv64': 1.2.4 2414 + optional: true 2415 + 2416 + '@img/sharp-linux-s390x@0.34.5': 2417 + optionalDependencies: 2418 + '@img/sharp-libvips-linux-s390x': 1.2.4 2419 + optional: true 2420 + 2421 + '@img/sharp-linux-x64@0.34.5': 2422 + optionalDependencies: 2423 + '@img/sharp-libvips-linux-x64': 1.2.4 2424 + optional: true 2425 + 2426 + '@img/sharp-linuxmusl-arm64@0.34.5': 2427 + optionalDependencies: 2428 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 2429 + optional: true 2430 + 2431 + '@img/sharp-linuxmusl-x64@0.34.5': 2432 + optionalDependencies: 2433 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 2434 + optional: true 2435 + 2436 + '@img/sharp-wasm32@0.34.5': 2437 + dependencies: 2438 + '@emnapi/runtime': 1.8.1 2439 + optional: true 2440 + 2441 + '@img/sharp-win32-arm64@0.34.5': 2442 + optional: true 2443 + 2444 + '@img/sharp-win32-ia32@0.34.5': 2445 + optional: true 2446 + 2447 + '@img/sharp-win32-x64@0.34.5': 2448 + optional: true 2449 + 2450 + '@internationalized/date@3.11.0': 2451 + dependencies: 2452 + '@swc/helpers': 0.5.19 2453 + 2454 + '@jridgewell/gen-mapping@0.3.13': 2455 + dependencies: 2456 + '@jridgewell/sourcemap-codec': 1.5.5 2457 + '@jridgewell/trace-mapping': 0.3.31 2458 + 2459 + '@jridgewell/remapping@2.3.5': 2460 + dependencies: 2461 + '@jridgewell/gen-mapping': 0.3.13 2462 + '@jridgewell/trace-mapping': 0.3.31 2463 + 2464 + '@jridgewell/resolve-uri@3.1.2': {} 2465 + 2466 + '@jridgewell/sourcemap-codec@1.5.5': {} 2467 + 2468 + '@jridgewell/trace-mapping@0.3.31': 2469 + dependencies: 2470 + '@jridgewell/resolve-uri': 3.1.2 2471 + '@jridgewell/sourcemap-codec': 1.5.5 2472 + 2473 + '@jridgewell/trace-mapping@0.3.9': 2474 + dependencies: 2475 + '@jridgewell/resolve-uri': 3.1.2 2476 + '@jridgewell/sourcemap-codec': 1.5.5 2477 + 2478 + '@number-flow/svelte@0.3.13(svelte@5.53.6)': 2479 + dependencies: 2480 + esm-env: 1.2.2 2481 + number-flow: 0.5.12 2482 + svelte: 5.53.6 2483 + 2484 + '@polka/url@1.0.0-next.29': {} 2485 + 2486 + '@poppinss/colors@4.1.6': 2487 + dependencies: 2488 + kleur: 4.1.5 2489 + 2490 + '@poppinss/dumper@0.6.5': 2491 + dependencies: 2492 + '@poppinss/colors': 4.1.6 2493 + '@sindresorhus/is': 7.2.0 2494 + supports-color: 10.2.2 2495 + 2496 + '@poppinss/exception@1.2.3': {} 2497 + 2498 + '@rollup/rollup-android-arm-eabi@4.59.0': 2499 + optional: true 2500 + 2501 + '@rollup/rollup-android-arm64@4.59.0': 2502 + optional: true 2503 + 2504 + '@rollup/rollup-darwin-arm64@4.59.0': 2505 + optional: true 2506 + 2507 + '@rollup/rollup-darwin-x64@4.59.0': 2508 + optional: true 2509 + 2510 + '@rollup/rollup-freebsd-arm64@4.59.0': 2511 + optional: true 2512 + 2513 + '@rollup/rollup-freebsd-x64@4.59.0': 2514 + optional: true 2515 + 2516 + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': 2517 + optional: true 2518 + 2519 + '@rollup/rollup-linux-arm-musleabihf@4.59.0': 2520 + optional: true 2521 + 2522 + '@rollup/rollup-linux-arm64-gnu@4.59.0': 2523 + optional: true 2524 + 2525 + '@rollup/rollup-linux-arm64-musl@4.59.0': 2526 + optional: true 2527 + 2528 + '@rollup/rollup-linux-loong64-gnu@4.59.0': 2529 + optional: true 2530 + 2531 + '@rollup/rollup-linux-loong64-musl@4.59.0': 2532 + optional: true 2533 + 2534 + '@rollup/rollup-linux-ppc64-gnu@4.59.0': 2535 + optional: true 2536 + 2537 + '@rollup/rollup-linux-ppc64-musl@4.59.0': 2538 + optional: true 2539 + 2540 + '@rollup/rollup-linux-riscv64-gnu@4.59.0': 2541 + optional: true 2542 + 2543 + '@rollup/rollup-linux-riscv64-musl@4.59.0': 2544 + optional: true 2545 + 2546 + '@rollup/rollup-linux-s390x-gnu@4.59.0': 2547 + optional: true 2548 + 2549 + '@rollup/rollup-linux-x64-gnu@4.59.0': 2550 + optional: true 2551 + 2552 + '@rollup/rollup-linux-x64-musl@4.59.0': 2553 + optional: true 2554 + 2555 + '@rollup/rollup-openbsd-x64@4.59.0': 2556 + optional: true 2557 + 2558 + '@rollup/rollup-openharmony-arm64@4.59.0': 2559 + optional: true 2560 + 2561 + '@rollup/rollup-win32-arm64-msvc@4.59.0': 2562 + optional: true 2563 + 2564 + '@rollup/rollup-win32-ia32-msvc@4.59.0': 2565 + optional: true 2566 + 2567 + '@rollup/rollup-win32-x64-gnu@4.59.0': 2568 + optional: true 2569 + 2570 + '@rollup/rollup-win32-x64-msvc@4.59.0': 2571 + optional: true 2572 + 2573 + '@sindresorhus/is@7.2.0': {} 2574 + 2575 + '@speed-highlight/core@1.2.14': {} 2576 + 2577 + '@standard-schema/spec@1.1.0': {} 2578 + 2579 + '@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)': 2580 + dependencies: 2581 + acorn: 8.16.0 2582 + 2583 + '@sveltejs/adapter-cloudflare@7.2.8(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(wrangler@4.69.0(@cloudflare/workers-types@4.20260301.1))': 2584 + dependencies: 2585 + '@cloudflare/workers-types': 4.20260301.1 2586 + '@sveltejs/kit': 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 2587 + worktop: 0.8.0-next.18 2588 + wrangler: 4.69.0(@cloudflare/workers-types@4.20260301.1) 2589 + 2590 + '@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': 2591 + dependencies: 2592 + '@standard-schema/spec': 1.1.0 2593 + '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) 2594 + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 2595 + '@types/cookie': 0.6.0 2596 + acorn: 8.16.0 2597 + cookie: 0.6.0 2598 + devalue: 5.6.3 2599 + esm-env: 1.2.2 2600 + kleur: 4.1.5 2601 + magic-string: 0.30.21 2602 + mrmime: 2.0.1 2603 + set-cookie-parser: 3.0.1 2604 + sirv: 3.0.2 2605 + svelte: 5.53.6 2606 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) 2607 + optionalDependencies: 2608 + typescript: 5.9.3 2609 + 2610 + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': 2611 + dependencies: 2612 + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 2613 + obug: 2.1.1 2614 + svelte: 5.53.6 2615 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) 2616 + 2617 + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': 2618 + dependencies: 2619 + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 2620 + deepmerge: 4.3.1 2621 + magic-string: 0.30.21 2622 + obug: 2.1.1 2623 + svelte: 5.53.6 2624 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) 2625 + vitefu: 1.1.2(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 2626 + 2627 + '@swc/helpers@0.5.19': 2628 + dependencies: 2629 + tslib: 2.8.1 2630 + 2631 + '@tailwindcss/forms@0.5.11(tailwindcss@4.2.1)': 2632 + dependencies: 2633 + mini-svg-data-uri: 1.4.4 2634 + tailwindcss: 4.2.1 2635 + 2636 + '@tailwindcss/node@4.2.1': 2637 + dependencies: 2638 + '@jridgewell/remapping': 2.3.5 2639 + enhanced-resolve: 5.20.0 2640 + jiti: 2.6.1 2641 + lightningcss: 1.31.1 2642 + magic-string: 0.30.21 2643 + source-map-js: 1.2.1 2644 + tailwindcss: 4.2.1 2645 + 2646 + '@tailwindcss/oxide-android-arm64@4.2.1': 2647 + optional: true 2648 + 2649 + '@tailwindcss/oxide-darwin-arm64@4.2.1': 2650 + optional: true 2651 + 2652 + '@tailwindcss/oxide-darwin-x64@4.2.1': 2653 + optional: true 2654 + 2655 + '@tailwindcss/oxide-freebsd-x64@4.2.1': 2656 + optional: true 2657 + 2658 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': 2659 + optional: true 2660 + 2661 + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': 2662 + optional: true 2663 + 2664 + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': 2665 + optional: true 2666 + 2667 + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': 2668 + optional: true 2669 + 2670 + '@tailwindcss/oxide-linux-x64-musl@4.2.1': 2671 + optional: true 2672 + 2673 + '@tailwindcss/oxide-wasm32-wasi@4.2.1': 2674 + optional: true 2675 + 2676 + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': 2677 + optional: true 2678 + 2679 + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': 2680 + optional: true 2681 + 2682 + '@tailwindcss/oxide@4.2.1': 2683 + optionalDependencies: 2684 + '@tailwindcss/oxide-android-arm64': 4.2.1 2685 + '@tailwindcss/oxide-darwin-arm64': 4.2.1 2686 + '@tailwindcss/oxide-darwin-x64': 4.2.1 2687 + '@tailwindcss/oxide-freebsd-x64': 4.2.1 2688 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 2689 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 2690 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 2691 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 2692 + '@tailwindcss/oxide-linux-x64-musl': 4.2.1 2693 + '@tailwindcss/oxide-wasm32-wasi': 4.2.1 2694 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 2695 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 2696 + 2697 + '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0))': 2698 + dependencies: 2699 + '@tailwindcss/node': 4.2.1 2700 + '@tailwindcss/oxide': 4.2.1 2701 + tailwindcss: 4.2.1 2702 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) 2703 + 2704 + '@types/bun@1.3.10': 2705 + dependencies: 2706 + bun-types: 1.3.10 2707 + 2708 + '@types/cookie@0.6.0': {} 2709 + 2710 + '@types/esrecurse@4.3.1': {} 2711 + 2712 + '@types/estree@1.0.8': {} 2713 + 2714 + '@types/json-schema@7.0.15': {} 2715 + 2716 + '@types/node@25.3.3': 2717 + dependencies: 2718 + undici-types: 7.18.2 2719 + 2720 + '@types/trusted-types@2.0.7': {} 2721 + 2722 + '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': 2723 + dependencies: 2724 + '@eslint-community/regexpp': 4.12.2 2725 + '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 2726 + '@typescript-eslint/scope-manager': 8.56.1 2727 + '@typescript-eslint/type-utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 2728 + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 2729 + '@typescript-eslint/visitor-keys': 8.56.1 2730 + eslint: 10.0.2(jiti@2.6.1) 2731 + ignore: 7.0.5 2732 + natural-compare: 1.4.0 2733 + ts-api-utils: 2.4.0(typescript@5.9.3) 2734 + typescript: 5.9.3 2735 + transitivePeerDependencies: 2736 + - supports-color 2737 + 2738 + '@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': 2739 + dependencies: 2740 + '@typescript-eslint/scope-manager': 8.56.1 2741 + '@typescript-eslint/types': 8.56.1 2742 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) 2743 + '@typescript-eslint/visitor-keys': 8.56.1 2744 + debug: 4.4.3 2745 + eslint: 10.0.2(jiti@2.6.1) 2746 + typescript: 5.9.3 2747 + transitivePeerDependencies: 2748 + - supports-color 2749 + 2750 + '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': 2751 + dependencies: 2752 + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) 2753 + '@typescript-eslint/types': 8.56.1 2754 + debug: 4.4.3 2755 + typescript: 5.9.3 2756 + transitivePeerDependencies: 2757 + - supports-color 2758 + 2759 + '@typescript-eslint/scope-manager@8.56.1': 2760 + dependencies: 2761 + '@typescript-eslint/types': 8.56.1 2762 + '@typescript-eslint/visitor-keys': 8.56.1 2763 + 2764 + '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': 2765 + dependencies: 2766 + typescript: 5.9.3 2767 + 2768 + '@typescript-eslint/type-utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': 2769 + dependencies: 2770 + '@typescript-eslint/types': 8.56.1 2771 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) 2772 + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 2773 + debug: 4.4.3 2774 + eslint: 10.0.2(jiti@2.6.1) 2775 + ts-api-utils: 2.4.0(typescript@5.9.3) 2776 + typescript: 5.9.3 2777 + transitivePeerDependencies: 2778 + - supports-color 2779 + 2780 + '@typescript-eslint/types@8.56.1': {} 2781 + 2782 + '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': 2783 + dependencies: 2784 + '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) 2785 + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) 2786 + '@typescript-eslint/types': 8.56.1 2787 + '@typescript-eslint/visitor-keys': 8.56.1 2788 + debug: 4.4.3 2789 + minimatch: 10.2.4 2790 + semver: 7.7.4 2791 + tinyglobby: 0.2.15 2792 + ts-api-utils: 2.4.0(typescript@5.9.3) 2793 + typescript: 5.9.3 2794 + transitivePeerDependencies: 2795 + - supports-color 2796 + 2797 + '@typescript-eslint/utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': 2798 + dependencies: 2799 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) 2800 + '@typescript-eslint/scope-manager': 8.56.1 2801 + '@typescript-eslint/types': 8.56.1 2802 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) 2803 + eslint: 10.0.2(jiti@2.6.1) 2804 + typescript: 5.9.3 2805 + transitivePeerDependencies: 2806 + - supports-color 2807 + 2808 + '@typescript-eslint/visitor-keys@8.56.1': 2809 + dependencies: 2810 + '@typescript-eslint/types': 8.56.1 2811 + eslint-visitor-keys: 5.0.1 2812 + 2813 + '@use-gesture/core@10.3.1': {} 2814 + 2815 + '@use-gesture/vanilla@10.3.1': 2816 + dependencies: 2817 + '@use-gesture/core': 10.3.1 2818 + 2819 + acorn-jsx@5.3.2(acorn@8.16.0): 2820 + dependencies: 2821 + acorn: 8.16.0 2822 + 2823 + acorn@8.16.0: {} 2824 + 2825 + ajv@6.14.0: 2826 + dependencies: 2827 + fast-deep-equal: 3.1.3 2828 + fast-json-stable-stringify: 2.1.0 2829 + json-schema-traverse: 0.4.1 2830 + uri-js: 4.4.1 2831 + 2832 + aria-query@5.3.1: {} 2833 + 2834 + await-lock@2.2.2: {} 2835 + 2836 + axobject-query@4.1.0: {} 2837 + 2838 + balanced-match@4.0.4: {} 2839 + 2840 + bits-ui@2.16.2(@internationalized/date@3.11.0)(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6): 2841 + dependencies: 2842 + '@floating-ui/core': 1.7.4 2843 + '@floating-ui/dom': 1.7.5 2844 + '@internationalized/date': 3.11.0 2845 + esm-env: 1.2.2 2846 + runed: 0.35.1(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6) 2847 + svelte: 5.53.6 2848 + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6) 2849 + tabbable: 6.4.0 2850 + transitivePeerDependencies: 2851 + - '@sveltejs/kit' 2852 + 2853 + blake3-wasm@2.1.5: {} 2854 + 2855 + brace-expansion@5.0.4: 2856 + dependencies: 2857 + balanced-match: 4.0.4 2858 + 2859 + bun-types@1.3.10: 2860 + dependencies: 2861 + '@types/node': 25.3.3 2862 + 2863 + chokidar@4.0.3: 2864 + dependencies: 2865 + readdirp: 4.1.2 2866 + 2867 + clsx@2.1.1: {} 2868 + 2869 + cookie@0.6.0: {} 2870 + 2871 + cookie@1.1.1: {} 2872 + 2873 + core-js@3.48.0: {} 2874 + 2875 + cross-spawn@7.0.6: 2876 + dependencies: 2877 + path-key: 3.1.1 2878 + shebang-command: 2.0.0 2879 + which: 2.0.2 2880 + 2881 + cssesc@3.0.0: {} 2882 + 2883 + custom-event-polyfill@1.0.7: {} 2884 + 2885 + debug@4.4.3: 2886 + dependencies: 2887 + ms: 2.1.3 2888 + 2889 + deep-is@0.1.4: {} 2890 + 2891 + deepmerge@4.3.1: {} 2892 + 2893 + dequal@2.0.3: {} 2894 + 2895 + detect-libc@2.1.2: {} 2896 + 2897 + devalue@5.6.3: {} 2898 + 2899 + emoji-picker-element@1.29.1: {} 2900 + 2901 + enhanced-resolve@5.20.0: 2902 + dependencies: 2903 + graceful-fs: 4.2.11 2904 + tapable: 2.3.0 2905 + 2906 + error-stack-parser-es@1.0.5: {} 2907 + 2908 + esbuild@0.27.3: 2909 + optionalDependencies: 2910 + '@esbuild/aix-ppc64': 0.27.3 2911 + '@esbuild/android-arm': 0.27.3 2912 + '@esbuild/android-arm64': 0.27.3 2913 + '@esbuild/android-x64': 0.27.3 2914 + '@esbuild/darwin-arm64': 0.27.3 2915 + '@esbuild/darwin-x64': 0.27.3 2916 + '@esbuild/freebsd-arm64': 0.27.3 2917 + '@esbuild/freebsd-x64': 0.27.3 2918 + '@esbuild/linux-arm': 0.27.3 2919 + '@esbuild/linux-arm64': 0.27.3 2920 + '@esbuild/linux-ia32': 0.27.3 2921 + '@esbuild/linux-loong64': 0.27.3 2922 + '@esbuild/linux-mips64el': 0.27.3 2923 + '@esbuild/linux-ppc64': 0.27.3 2924 + '@esbuild/linux-riscv64': 0.27.3 2925 + '@esbuild/linux-s390x': 0.27.3 2926 + '@esbuild/linux-x64': 0.27.3 2927 + '@esbuild/netbsd-arm64': 0.27.3 2928 + '@esbuild/netbsd-x64': 0.27.3 2929 + '@esbuild/openbsd-arm64': 0.27.3 2930 + '@esbuild/openbsd-x64': 0.27.3 2931 + '@esbuild/openharmony-arm64': 0.27.3 2932 + '@esbuild/sunos-x64': 0.27.3 2933 + '@esbuild/win32-arm64': 0.27.3 2934 + '@esbuild/win32-ia32': 0.27.3 2935 + '@esbuild/win32-x64': 0.27.3 2936 + 2937 + escape-string-regexp@4.0.0: {} 2938 + 2939 + eslint-config-prettier@10.1.8(eslint@10.0.2(jiti@2.6.1)): 2940 + dependencies: 2941 + eslint: 10.0.2(jiti@2.6.1) 2942 + 2943 + eslint-plugin-svelte@3.15.0(eslint@10.0.2(jiti@2.6.1))(svelte@5.53.6): 2944 + dependencies: 2945 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) 2946 + '@jridgewell/sourcemap-codec': 1.5.5 2947 + eslint: 10.0.2(jiti@2.6.1) 2948 + esutils: 2.0.3 2949 + globals: 16.5.0 2950 + known-css-properties: 0.37.0 2951 + postcss: 8.5.8 2952 + postcss-load-config: 3.1.4(postcss@8.5.8) 2953 + postcss-safe-parser: 7.0.1(postcss@8.5.8) 2954 + semver: 7.7.4 2955 + svelte-eslint-parser: 1.5.1(svelte@5.53.6) 2956 + optionalDependencies: 2957 + svelte: 5.53.6 2958 + transitivePeerDependencies: 2959 + - ts-node 2960 + 2961 + eslint-scope@8.4.0: 2962 + dependencies: 2963 + esrecurse: 4.3.0 2964 + estraverse: 5.3.0 2965 + 2966 + eslint-scope@9.1.1: 2967 + dependencies: 2968 + '@types/esrecurse': 4.3.1 2969 + '@types/estree': 1.0.8 2970 + esrecurse: 4.3.0 2971 + estraverse: 5.3.0 2972 + 2973 + eslint-visitor-keys@3.4.3: {} 2974 + 2975 + eslint-visitor-keys@4.2.1: {} 2976 + 2977 + eslint-visitor-keys@5.0.1: {} 2978 + 2979 + eslint@10.0.2(jiti@2.6.1): 2980 + dependencies: 2981 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) 2982 + '@eslint-community/regexpp': 4.12.2 2983 + '@eslint/config-array': 0.23.2 2984 + '@eslint/config-helpers': 0.5.2 2985 + '@eslint/core': 1.1.0 2986 + '@eslint/plugin-kit': 0.6.0 2987 + '@humanfs/node': 0.16.7 2988 + '@humanwhocodes/module-importer': 1.0.1 2989 + '@humanwhocodes/retry': 0.4.3 2990 + '@types/estree': 1.0.8 2991 + ajv: 6.14.0 2992 + cross-spawn: 7.0.6 2993 + debug: 4.4.3 2994 + escape-string-regexp: 4.0.0 2995 + eslint-scope: 9.1.1 2996 + eslint-visitor-keys: 5.0.1 2997 + espree: 11.1.1 2998 + esquery: 1.7.0 2999 + esutils: 2.0.3 3000 + fast-deep-equal: 3.1.3 3001 + file-entry-cache: 8.0.0 3002 + find-up: 5.0.0 3003 + glob-parent: 6.0.2 3004 + ignore: 5.3.2 3005 + imurmurhash: 0.1.4 3006 + is-glob: 4.0.3 3007 + json-stable-stringify-without-jsonify: 1.0.1 3008 + minimatch: 10.2.4 3009 + natural-compare: 1.4.0 3010 + optionator: 0.9.4 3011 + optionalDependencies: 3012 + jiti: 2.6.1 3013 + transitivePeerDependencies: 3014 + - supports-color 3015 + 3016 + esm-env@1.2.2: {} 3017 + 3018 + espree@10.4.0: 3019 + dependencies: 3020 + acorn: 8.16.0 3021 + acorn-jsx: 5.3.2(acorn@8.16.0) 3022 + eslint-visitor-keys: 4.2.1 3023 + 3024 + espree@11.1.1: 3025 + dependencies: 3026 + acorn: 8.16.0 3027 + acorn-jsx: 5.3.2(acorn@8.16.0) 3028 + eslint-visitor-keys: 5.0.1 3029 + 3030 + esquery@1.7.0: 3031 + dependencies: 3032 + estraverse: 5.3.0 3033 + 3034 + esrap@2.2.3: 3035 + dependencies: 3036 + '@jridgewell/sourcemap-codec': 1.5.5 3037 + 3038 + esrecurse@4.3.0: 3039 + dependencies: 3040 + estraverse: 5.3.0 3041 + 3042 + estraverse@5.3.0: {} 3043 + 3044 + esutils@2.0.3: {} 3045 + 3046 + fast-deep-equal@3.1.3: {} 3047 + 3048 + fast-json-stable-stringify@2.1.0: {} 3049 + 3050 + fast-levenshtein@2.0.6: {} 3051 + 3052 + fdir@6.5.0(picomatch@4.0.3): 3053 + optionalDependencies: 3054 + picomatch: 4.0.3 3055 + 3056 + file-entry-cache@8.0.0: 3057 + dependencies: 3058 + flat-cache: 4.0.1 3059 + 3060 + find-up@5.0.0: 3061 + dependencies: 3062 + locate-path: 6.0.0 3063 + path-exists: 4.0.0 3064 + 3065 + flat-cache@4.0.1: 3066 + dependencies: 3067 + flatted: 3.3.4 3068 + keyv: 4.5.4 3069 + 3070 + flatted@3.3.4: {} 3071 + 3072 + flexsearch@0.8.212: {} 3073 + 3074 + fsevents@2.3.3: 3075 + optional: true 3076 + 3077 + get-tsconfig@4.13.6: 3078 + dependencies: 3079 + resolve-pkg-maps: 1.0.0 3080 + 3081 + glob-parent@6.0.2: 3082 + dependencies: 3083 + is-glob: 4.0.3 3084 + 3085 + globals@16.5.0: {} 3086 + 3087 + globals@17.4.0: {} 3088 + 3089 + graceful-fs@4.2.11: {} 3090 + 3091 + hls.js@1.6.15: {} 3092 + 3093 + ignore@5.3.2: {} 3094 + 3095 + ignore@7.0.5: {} 3096 + 3097 + imurmurhash@0.1.4: {} 3098 + 3099 + inline-style-parser@0.2.7: {} 3100 + 3101 + is-emoji-supported@0.0.5: {} 3102 + 3103 + is-extglob@2.1.1: {} 3104 + 3105 + is-glob@4.0.3: 3106 + dependencies: 3107 + is-extglob: 2.1.1 3108 + 3109 + is-reference@3.0.3: 3110 + dependencies: 3111 + '@types/estree': 1.0.8 3112 + 3113 + isexe@2.0.0: {} 3114 + 3115 + iso-datestring-validator@2.2.2: {} 3116 + 3117 + jiti@2.6.1: {} 3118 + 3119 + json-buffer@3.0.1: {} 3120 + 3121 + json-schema-traverse@0.4.1: {} 3122 + 3123 + json-stable-stringify-without-jsonify@1.0.1: {} 3124 + 3125 + keyv@4.5.4: 3126 + dependencies: 3127 + json-buffer: 3.0.1 3128 + 3129 + kleur@4.1.5: {} 3130 + 3131 + known-css-properties@0.37.0: {} 3132 + 3133 + levn@0.4.1: 3134 + dependencies: 3135 + prelude-ls: 1.2.1 3136 + type-check: 0.4.0 3137 + 3138 + lightningcss-android-arm64@1.31.1: 3139 + optional: true 3140 + 3141 + lightningcss-darwin-arm64@1.31.1: 3142 + optional: true 3143 + 3144 + lightningcss-darwin-x64@1.31.1: 3145 + optional: true 3146 + 3147 + lightningcss-freebsd-x64@1.31.1: 3148 + optional: true 3149 + 3150 + lightningcss-linux-arm-gnueabihf@1.31.1: 3151 + optional: true 3152 + 3153 + lightningcss-linux-arm64-gnu@1.31.1: 3154 + optional: true 3155 + 3156 + lightningcss-linux-arm64-musl@1.31.1: 3157 + optional: true 3158 + 3159 + lightningcss-linux-x64-gnu@1.31.1: 3160 + optional: true 3161 + 3162 + lightningcss-linux-x64-musl@1.31.1: 3163 + optional: true 3164 + 3165 + lightningcss-win32-arm64-msvc@1.31.1: 3166 + optional: true 3167 + 3168 + lightningcss-win32-x64-msvc@1.31.1: 3169 + optional: true 3170 + 3171 + lightningcss@1.31.1: 3172 + dependencies: 3173 + detect-libc: 2.1.2 3174 + optionalDependencies: 3175 + lightningcss-android-arm64: 1.31.1 3176 + lightningcss-darwin-arm64: 1.31.1 3177 + lightningcss-darwin-x64: 1.31.1 3178 + lightningcss-freebsd-x64: 1.31.1 3179 + lightningcss-linux-arm-gnueabihf: 1.31.1 3180 + lightningcss-linux-arm64-gnu: 1.31.1 3181 + lightningcss-linux-arm64-musl: 1.31.1 3182 + lightningcss-linux-x64-gnu: 1.31.1 3183 + lightningcss-linux-x64-musl: 1.31.1 3184 + lightningcss-win32-arm64-msvc: 1.31.1 3185 + lightningcss-win32-x64-msvc: 1.31.1 3186 + 3187 + lilconfig@2.1.0: {} 3188 + 3189 + loadjs@4.3.0: {} 3190 + 3191 + locate-character@3.0.0: {} 3192 + 3193 + locate-path@6.0.0: 3194 + dependencies: 3195 + p-locate: 5.0.0 3196 + 3197 + lz-string@1.5.0: {} 3198 + 3199 + magic-string@0.30.21: 3200 + dependencies: 3201 + '@jridgewell/sourcemap-codec': 1.5.5 3202 + 3203 + mini-svg-data-uri@1.4.4: {} 3204 + 3205 + miniflare@4.20260305.0: 3206 + dependencies: 3207 + '@cspotcode/source-map-support': 0.8.1 3208 + sharp: 0.34.5 3209 + undici: 7.18.2 3210 + workerd: 1.20260305.0 3211 + ws: 8.18.0 3212 + youch: 4.1.0-beta.10 3213 + transitivePeerDependencies: 3214 + - bufferutil 3215 + - utf-8-validate 3216 + 3217 + minimatch@10.2.4: 3218 + dependencies: 3219 + brace-expansion: 5.0.4 3220 + 3221 + mode-watcher@1.1.0(svelte@5.53.6): 3222 + dependencies: 3223 + runed: 0.25.0(svelte@5.53.6) 3224 + svelte: 5.53.6 3225 + svelte-toolbelt: 0.7.1(svelte@5.53.6) 3226 + 3227 + mri@1.2.0: {} 3228 + 3229 + mrmime@2.0.1: {} 3230 + 3231 + ms@2.1.3: {} 3232 + 3233 + multiformats@9.9.0: {} 3234 + 3235 + nanoid@3.3.11: {} 3236 + 3237 + nanoid@5.1.6: {} 3238 + 3239 + natural-compare@1.4.0: {} 3240 + 3241 + node-gyp-build@4.8.4: {} 3242 + 3243 + number-flow@0.5.12: 3244 + dependencies: 3245 + esm-env: 1.2.2 3246 + 3247 + obug@2.1.1: {} 3248 + 3249 + optionator@0.9.4: 3250 + dependencies: 3251 + deep-is: 0.1.4 3252 + fast-levenshtein: 2.0.6 3253 + levn: 0.4.1 3254 + prelude-ls: 1.2.1 3255 + type-check: 0.4.0 3256 + word-wrap: 1.2.5 3257 + 3258 + p-limit@3.1.0: 3259 + dependencies: 3260 + yocto-queue: 0.1.0 3261 + 3262 + p-locate@5.0.0: 3263 + dependencies: 3264 + p-limit: 3.1.0 3265 + 3266 + path-exists@4.0.0: {} 3267 + 3268 + path-key@3.1.1: {} 3269 + 3270 + path-to-regexp@6.3.0: {} 3271 + 3272 + pathe@2.0.3: {} 3273 + 3274 + picocolors@1.1.1: {} 3275 + 3276 + picomatch@4.0.3: {} 3277 + 3278 + plyr@3.8.4: 3279 + dependencies: 3280 + core-js: 3.48.0 3281 + custom-event-polyfill: 1.0.7 3282 + loadjs: 4.3.0 3283 + rangetouch: 2.0.1 3284 + url-polyfill: 1.1.14 3285 + 3286 + postcss-load-config@3.1.4(postcss@8.5.8): 3287 + dependencies: 3288 + lilconfig: 2.1.0 3289 + yaml: 1.10.2 3290 + optionalDependencies: 3291 + postcss: 8.5.8 3292 + 3293 + postcss-safe-parser@7.0.1(postcss@8.5.8): 3294 + dependencies: 3295 + postcss: 8.5.8 3296 + 3297 + postcss-scss@4.0.9(postcss@8.5.8): 3298 + dependencies: 3299 + postcss: 8.5.8 3300 + 3301 + postcss-selector-parser@7.1.1: 3302 + dependencies: 3303 + cssesc: 3.0.0 3304 + util-deprecate: 1.0.2 3305 + 3306 + postcss@8.5.8: 3307 + dependencies: 3308 + nanoid: 3.3.11 3309 + picocolors: 1.1.1 3310 + source-map-js: 1.2.1 3311 + 3312 + prelude-ls@1.2.1: {} 3313 + 3314 + prettier-plugin-svelte@3.5.0(prettier@3.8.1)(svelte@5.53.6): 3315 + dependencies: 3316 + prettier: 3.8.1 3317 + svelte: 5.53.6 3318 + 3319 + prettier-plugin-tailwindcss@0.7.2(prettier-plugin-svelte@3.5.0(prettier@3.8.1)(svelte@5.53.6))(prettier@3.8.1): 3320 + dependencies: 3321 + prettier: 3.8.1 3322 + optionalDependencies: 3323 + prettier-plugin-svelte: 3.5.0(prettier@3.8.1)(svelte@5.53.6) 3324 + 3325 + prettier@3.8.1: {} 3326 + 3327 + punycode@2.3.1: {} 3328 + 3329 + rangetouch@2.0.1: {} 3330 + 3331 + readdirp@4.1.2: {} 3332 + 3333 + regexparam@3.0.0: {} 3334 + 3335 + resolve-pkg-maps@1.0.0: {} 3336 + 3337 + rollup@4.59.0: 3338 + dependencies: 3339 + '@types/estree': 1.0.8 3340 + optionalDependencies: 3341 + '@rollup/rollup-android-arm-eabi': 4.59.0 3342 + '@rollup/rollup-android-arm64': 4.59.0 3343 + '@rollup/rollup-darwin-arm64': 4.59.0 3344 + '@rollup/rollup-darwin-x64': 4.59.0 3345 + '@rollup/rollup-freebsd-arm64': 4.59.0 3346 + '@rollup/rollup-freebsd-x64': 4.59.0 3347 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 3348 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 3349 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 3350 + '@rollup/rollup-linux-arm64-musl': 4.59.0 3351 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 3352 + '@rollup/rollup-linux-loong64-musl': 4.59.0 3353 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 3354 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 3355 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 3356 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 3357 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 3358 + '@rollup/rollup-linux-x64-gnu': 4.59.0 3359 + '@rollup/rollup-linux-x64-musl': 4.59.0 3360 + '@rollup/rollup-openbsd-x64': 4.59.0 3361 + '@rollup/rollup-openharmony-arm64': 4.59.0 3362 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 3363 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 3364 + '@rollup/rollup-win32-x64-gnu': 4.59.0 3365 + '@rollup/rollup-win32-x64-msvc': 4.59.0 3366 + fsevents: 2.3.3 3367 + 3368 + runed@0.23.4(svelte@5.53.6): 3369 + dependencies: 3370 + esm-env: 1.2.2 3371 + svelte: 5.53.6 3372 + 3373 + runed@0.25.0(svelte@5.53.6): 3374 + dependencies: 3375 + esm-env: 1.2.2 3376 + svelte: 5.53.6 3377 + 3378 + runed@0.28.0(svelte@5.53.6): 3379 + dependencies: 3380 + esm-env: 1.2.2 3381 + svelte: 5.53.6 3382 + 3383 + runed@0.35.1(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6): 3384 + dependencies: 3385 + dequal: 2.0.3 3386 + esm-env: 1.2.2 3387 + lz-string: 1.5.0 3388 + svelte: 5.53.6 3389 + optionalDependencies: 3390 + '@sveltejs/kit': 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)) 3391 + 3392 + sade@1.8.1: 3393 + dependencies: 3394 + mri: 1.2.0 3395 + 3396 + semver@7.7.4: {} 3397 + 3398 + set-cookie-parser@3.0.1: {} 3399 + 3400 + sharp@0.34.5: 3401 + dependencies: 3402 + '@img/colour': 1.1.0 3403 + detect-libc: 2.1.2 3404 + semver: 7.7.4 3405 + optionalDependencies: 3406 + '@img/sharp-darwin-arm64': 0.34.5 3407 + '@img/sharp-darwin-x64': 0.34.5 3408 + '@img/sharp-libvips-darwin-arm64': 1.2.4 3409 + '@img/sharp-libvips-darwin-x64': 1.2.4 3410 + '@img/sharp-libvips-linux-arm': 1.2.4 3411 + '@img/sharp-libvips-linux-arm64': 1.2.4 3412 + '@img/sharp-libvips-linux-ppc64': 1.2.4 3413 + '@img/sharp-libvips-linux-riscv64': 1.2.4 3414 + '@img/sharp-libvips-linux-s390x': 1.2.4 3415 + '@img/sharp-libvips-linux-x64': 1.2.4 3416 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 3417 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 3418 + '@img/sharp-linux-arm': 0.34.5 3419 + '@img/sharp-linux-arm64': 0.34.5 3420 + '@img/sharp-linux-ppc64': 0.34.5 3421 + '@img/sharp-linux-riscv64': 0.34.5 3422 + '@img/sharp-linux-s390x': 0.34.5 3423 + '@img/sharp-linux-x64': 0.34.5 3424 + '@img/sharp-linuxmusl-arm64': 0.34.5 3425 + '@img/sharp-linuxmusl-x64': 0.34.5 3426 + '@img/sharp-wasm32': 0.34.5 3427 + '@img/sharp-win32-arm64': 0.34.5 3428 + '@img/sharp-win32-ia32': 0.34.5 3429 + '@img/sharp-win32-x64': 0.34.5 3430 + 3431 + shebang-command@2.0.0: 3432 + dependencies: 3433 + shebang-regex: 3.0.0 3434 + 3435 + shebang-regex@3.0.0: {} 3436 + 3437 + sirv@3.0.2: 3438 + dependencies: 3439 + '@polka/url': 1.0.0-next.29 3440 + mrmime: 2.0.1 3441 + totalist: 3.0.1 3442 + 3443 + source-map-js@1.2.1: {} 3444 + 3445 + style-to-object@1.0.14: 3446 + dependencies: 3447 + inline-style-parser: 0.2.7 3448 + 3449 + supports-color@10.2.2: {} 3450 + 3451 + svelte-check@4.4.4(picomatch@4.0.3)(svelte@5.53.6)(typescript@5.9.3): 3452 + dependencies: 3453 + '@jridgewell/trace-mapping': 0.3.31 3454 + chokidar: 4.0.3 3455 + fdir: 6.5.0(picomatch@4.0.3) 3456 + picocolors: 1.1.1 3457 + sade: 1.8.1 3458 + svelte: 5.53.6 3459 + typescript: 5.9.3 3460 + transitivePeerDependencies: 3461 + - picomatch 3462 + 3463 + svelte-eslint-parser@1.5.1(svelte@5.53.6): 3464 + dependencies: 3465 + eslint-scope: 8.4.0 3466 + eslint-visitor-keys: 4.2.1 3467 + espree: 10.4.0 3468 + postcss: 8.5.8 3469 + postcss-scss: 4.0.9(postcss@8.5.8) 3470 + postcss-selector-parser: 7.1.1 3471 + semver: 7.7.4 3472 + optionalDependencies: 3473 + svelte: 5.53.6 3474 + 3475 + svelte-sonner@1.0.7(svelte@5.53.6): 3476 + dependencies: 3477 + runed: 0.28.0(svelte@5.53.6) 3478 + svelte: 5.53.6 3479 + 3480 + svelte-toolbelt@0.10.6(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6): 3481 + dependencies: 3482 + clsx: 2.1.1 3483 + runed: 0.35.1(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.6)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)))(svelte@5.53.6) 3484 + style-to-object: 1.0.14 3485 + svelte: 5.53.6 3486 + transitivePeerDependencies: 3487 + - '@sveltejs/kit' 3488 + 3489 + svelte-toolbelt@0.7.1(svelte@5.53.6): 3490 + dependencies: 3491 + clsx: 2.1.1 3492 + runed: 0.23.4(svelte@5.53.6) 3493 + style-to-object: 1.0.14 3494 + svelte: 5.53.6 3495 + 3496 + svelte@5.53.6: 3497 + dependencies: 3498 + '@jridgewell/remapping': 2.3.5 3499 + '@jridgewell/sourcemap-codec': 1.5.5 3500 + '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) 3501 + '@types/estree': 1.0.8 3502 + '@types/trusted-types': 2.0.7 3503 + acorn: 8.16.0 3504 + aria-query: 5.3.1 3505 + axobject-query: 4.1.0 3506 + clsx: 2.1.1 3507 + devalue: 5.6.3 3508 + esm-env: 1.2.2 3509 + esrap: 2.2.3 3510 + is-reference: 3.0.3 3511 + locate-character: 3.0.0 3512 + magic-string: 0.30.21 3513 + zimmerframe: 1.1.4 3514 + 3515 + tabbable@6.4.0: {} 3516 + 3517 + tailwind-merge@3.5.0: {} 3518 + 3519 + tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1): 3520 + dependencies: 3521 + tailwindcss: 4.2.1 3522 + optionalDependencies: 3523 + tailwind-merge: 3.5.0 3524 + 3525 + tailwindcss@4.2.1: {} 3526 + 3527 + tapable@2.3.0: {} 3528 + 3529 + tinyglobby@0.2.15: 3530 + dependencies: 3531 + fdir: 6.5.0(picomatch@4.0.3) 3532 + picomatch: 4.0.3 3533 + 3534 + tlds@1.261.0: {} 3535 + 3536 + totalist@3.0.1: {} 3537 + 3538 + ts-api-utils@2.4.0(typescript@5.9.3): 3539 + dependencies: 3540 + typescript: 5.9.3 3541 + 3542 + tslib@2.8.1: {} 3543 + 3544 + tsx@4.21.0: 3545 + dependencies: 3546 + esbuild: 0.27.3 3547 + get-tsconfig: 4.13.6 3548 + optionalDependencies: 3549 + fsevents: 2.3.3 3550 + 3551 + type-check@0.4.0: 3552 + dependencies: 3553 + prelude-ls: 1.2.1 3554 + 3555 + typescript-eslint@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3): 3556 + dependencies: 3557 + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 3558 + '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 3559 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) 3560 + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) 3561 + eslint: 10.0.2(jiti@2.6.1) 3562 + typescript: 5.9.3 3563 + transitivePeerDependencies: 3564 + - supports-color 3565 + 3566 + typescript@5.9.3: {} 3567 + 3568 + uint8arrays@3.0.0: 3569 + dependencies: 3570 + multiformats: 9.9.0 3571 + 3572 + undici-types@7.18.2: {} 3573 + 3574 + undici@7.18.2: {} 3575 + 3576 + unenv@2.0.0-rc.24: 3577 + dependencies: 3578 + pathe: 2.0.3 3579 + 3580 + unicode-segmenter@0.14.5: {} 3581 + 3582 + uri-js@4.4.1: 3583 + dependencies: 3584 + punycode: 2.3.1 3585 + 3586 + url-polyfill@1.1.14: {} 3587 + 3588 + util-deprecate@1.0.2: {} 3589 + 3590 + valibot@1.2.0(typescript@5.9.3): 3591 + optionalDependencies: 3592 + typescript: 5.9.3 3593 + 3594 + vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0): 3595 + dependencies: 3596 + esbuild: 0.27.3 3597 + fdir: 6.5.0(picomatch@4.0.3) 3598 + picomatch: 4.0.3 3599 + postcss: 8.5.8 3600 + rollup: 4.59.0 3601 + tinyglobby: 0.2.15 3602 + optionalDependencies: 3603 + '@types/node': 25.3.3 3604 + fsevents: 2.3.3 3605 + jiti: 2.6.1 3606 + lightningcss: 1.31.1 3607 + tsx: 4.21.0 3608 + 3609 + vitefu@1.1.2(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)): 3610 + optionalDependencies: 3611 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0) 3612 + 3613 + which@2.0.2: 3614 + dependencies: 3615 + isexe: 2.0.0 3616 + 3617 + word-wrap@1.2.5: {} 3618 + 3619 + workerd@1.20260305.0: 3620 + optionalDependencies: 3621 + '@cloudflare/workerd-darwin-64': 1.20260305.0 3622 + '@cloudflare/workerd-darwin-arm64': 1.20260305.0 3623 + '@cloudflare/workerd-linux-64': 1.20260305.0 3624 + '@cloudflare/workerd-linux-arm64': 1.20260305.0 3625 + '@cloudflare/workerd-windows-64': 1.20260305.0 3626 + 3627 + worktop@0.8.0-next.18: 3628 + dependencies: 3629 + mrmime: 2.0.1 3630 + regexparam: 3.0.0 3631 + 3632 + wrangler@4.69.0(@cloudflare/workers-types@4.20260301.1): 3633 + dependencies: 3634 + '@cloudflare/kv-asset-handler': 0.4.2 3635 + '@cloudflare/unenv-preset': 2.14.0(unenv@2.0.0-rc.24)(workerd@1.20260305.0) 3636 + blake3-wasm: 2.1.5 3637 + esbuild: 0.27.3 3638 + miniflare: 4.20260305.0 3639 + path-to-regexp: 6.3.0 3640 + unenv: 2.0.0-rc.24 3641 + workerd: 1.20260305.0 3642 + optionalDependencies: 3643 + '@cloudflare/workers-types': 4.20260301.1 3644 + fsevents: 2.3.3 3645 + transitivePeerDependencies: 3646 + - bufferutil 3647 + - utf-8-validate 3648 + 3649 + ws@8.18.0: {} 3650 + 3651 + yaml@1.10.2: {} 3652 + 3653 + yocto-queue@0.1.0: {} 3654 + 3655 + youch-core@0.3.3: 3656 + dependencies: 3657 + '@poppinss/exception': 1.2.3 3658 + error-stack-parser-es: 1.0.5 3659 + 3660 + youch@4.1.0-beta.10: 3661 + dependencies: 3662 + '@poppinss/colors': 4.1.6 3663 + '@poppinss/dumper': 0.6.5 3664 + '@speed-highlight/core': 1.2.14 3665 + cookie: 1.1.1 3666 + youch-core: 0.3.3 3667 + 3668 + zimmerframe@1.1.4: {} 3669 + 3670 + zod@3.25.76: {}
+3 -5
svelte.config.js
··· 1 - import adapter from '@sveltejs/adapter-static'; 1 + import adapter from '@sveltejs/adapter-cloudflare'; 2 2 import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 3 4 4 /** @type {import('@sveltejs/kit').Config} */ 5 5 const config = { 6 - // Consult https://svelte.dev/docs/kit/integrations 7 - // for more information about preprocessors 8 6 preprocess: vitePreprocess(), 9 7 10 8 kit: { 11 9 adapter: adapter(), 12 - paths: { 13 - base: process.env.NODE_ENV === 'development' ? '' : '/search-bluesky-likes' 10 + experimental: { 11 + remoteFunctions: true 14 12 } 15 13 } 16 14 };
+2 -6
tsconfig.json
··· 9 9 "skipLibCheck": true, 10 10 "sourceMap": true, 11 11 "strict": true, 12 - "moduleResolution": "bundler" 12 + "moduleResolution": "bundler", 13 + "types": ["@cloudflare/workers-types"] 13 14 } 14 - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias 15 - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files 16 - // 17 - // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 18 - // from the referenced tsconfig.json - TypeScript does not merge them in 19 15 }
+2 -1
vite.config.ts
··· 1 1 import tailwindcss from '@tailwindcss/vite'; 2 2 import { sveltekit } from '@sveltejs/kit/vite'; 3 3 import { defineConfig } from 'vite'; 4 + import { DEV_PORT } from './src/lib/atproto/port'; 4 5 5 6 export default defineConfig({ 6 7 plugins: [sveltekit(), tailwindcss()], 7 8 server: { 8 9 host: '127.0.0.1', 9 - port: 5179 10 + port: DEV_PORT 10 11 } 11 12 });
+14
wrangler.jsonc
··· 1 + { 2 + "name": "search-bluesky-likes", 3 + "main": ".svelte-kit/cloudflare/_worker.js", 4 + "compatibility_date": "2025-01-01", 5 + "compatibility_flags": ["nodejs_compat_v2"], 6 + "assets": { 7 + "binding": "ASSETS", 8 + "directory": ".svelte-kit/cloudflare" 9 + }, 10 + "kv_namespaces": [ 11 + { "binding": "OAUTH_SESSIONS", "id": "TODO" }, 12 + { "binding": "OAUTH_STATES", "id": "TODO" } 13 + ] 14 + }
+1 -1
src/app.css
··· 4 4 5 5 @custom-variant dark (&:where(.dark, .dark *)); 6 6 7 - @source "../node_modules/@fuxui"; 7 + @source "../node_modules/@foxui"; 8 8 9 9 @theme { 10 10 --color-base-50: var(--color-zinc-50);
+22 -4
src/app.d.ts
··· 1 - // See https://svelte.dev/docs/kit/types#app.d.ts 2 - // for information about these interfaces 1 + import type { OAuthSession } from '@atcute/oauth-node-client'; 2 + import type { Client } from '@atcute/client'; 3 + import type { Did } from '@atcute/lexicons'; 4 + 5 + import type {} from '@atcute/atproto'; 6 + import type {} from '@atcute/bluesky'; 7 + 3 8 declare global { 4 9 namespace App { 5 10 // interface Error {} 6 - // interface Locals {} 11 + interface Locals { 12 + session: OAuthSession | null; 13 + client: Client | null; 14 + did: Did | null; 15 + } 7 16 // interface PageData {} 8 17 // interface PageState {} 9 - // interface Platform {} 18 + interface Platform { 19 + env: { 20 + OAUTH_SESSIONS: KVNamespace; 21 + OAUTH_STATES: KVNamespace; 22 + CLIENT_ASSERTION_KEY: string; 23 + COOKIE_SECRET: string; 24 + OAUTH_PUBLIC_URL: string; 25 + PROFILE_CACHE?: KVNamespace; 26 + }; 27 + } 10 28 } 11 29 } 12 30
+10
src/hooks.server.ts
··· 1 + import type { Handle } from '@sveltejs/kit'; 2 + import { restoreSession } from '$lib/atproto/server/session'; 3 + 4 + export const handle: Handle = async ({ event, resolve }) => { 5 + const { session, client, did } = await restoreSession(event.cookies, event.platform?.env); 6 + event.locals.session = session; 7 + event.locals.client = client; 8 + event.locals.did = did; 9 + return resolve(event); 10 + };
+367
src/lib/search-state.svelte.ts
··· 1 + import { user } from '$lib/atproto'; 2 + import { toast } from '@foxui/core'; 3 + import { Document, Charset, IndexedDB } from 'flexsearch'; 4 + import { Client, simpleFetchHandler } from '@atcute/client'; 5 + 6 + export type SourceType = 'likes' | 'bookmarks' | 'posts'; 7 + 8 + export const SOURCE_LABELS: Record<SourceType, string> = { 9 + likes: 'Likes', 10 + bookmarks: 'Bookmarks', 11 + posts: 'Posts' 12 + }; 13 + 14 + export const PLACEHOLDERS: Record<SourceType, string> = { 15 + likes: 'Search liked posts', 16 + bookmarks: 'Search bookmarks', 17 + posts: 'Search my posts' 18 + }; 19 + 20 + export const ALL_SOURCES: SourceType[] = ['likes', 'bookmarks', 'posts']; 21 + 22 + type SourceState = { 23 + knownIds: Set<string>; 24 + index: Document | null; 25 + count: number; 26 + indexed: number; 27 + totalToIndex: number; 28 + phase: 'idle' | 'fetching' | 'hydrating' | 'done'; 29 + cursor?: string; 30 + pendingUris: string[]; 31 + pendingIndex: number; 32 + }; 33 + 34 + function createSourceState(): SourceState { 35 + return { 36 + knownIds: new Set(), 37 + index: null, 38 + count: 0, 39 + indexed: 0, 40 + totalToIndex: 0, 41 + phase: 'idle', 42 + cursor: undefined, 43 + pendingUris: [], 44 + pendingIndex: 0 45 + }; 46 + } 47 + 48 + function createIndex() { 49 + return new Document({ 50 + document: { 51 + id: 'uri', 52 + store: true, 53 + index: [ 54 + { 55 + field: 'author:handle', 56 + tokenize: 'forward', 57 + encoder: Charset.LatinBalance 58 + }, 59 + { 60 + field: 'author:displayName', 61 + tokenize: 'forward', 62 + encoder: Charset.LatinBalance 63 + }, 64 + { 65 + field: 'record:text', 66 + tokenize: 'forward', 67 + encoder: Charset.LatinBalance 68 + } 69 + ], 70 + tag: [ 71 + { field: 'likeCount' }, 72 + { field: 'replyCount' }, 73 + { field: 'author:handle' }, 74 + { field: 'author:displayName' } 75 + ] 76 + } 77 + }); 78 + } 79 + 80 + const publicClient = new Client({ 81 + handler: simpleFetchHandler({ service: 'https://public.api.bsky.app' }) 82 + }); 83 + 84 + export const searchState = $state({ 85 + sources: { 86 + likes: createSourceState(), 87 + bookmarks: createSourceState(), 88 + posts: createSourceState() 89 + } as Record<SourceType, SourceState>, 90 + activeSource: 'likes' as SourceType, 91 + loading: true 92 + }); 93 + 94 + let generation = 0; 95 + 96 + function loadKnownIds(source: SourceType) { 97 + const ids = localStorage.getItem(`${source}-ids`); 98 + if (ids) { 99 + searchState.sources[source].knownIds = new Set(ids.split(',')); 100 + } 101 + searchState.sources[source].count = searchState.sources[source].knownIds.size; 102 + } 103 + 104 + function addKnownId(source: SourceType, id: string) { 105 + searchState.sources[source].knownIds.add(id); 106 + localStorage.setItem( 107 + `${source}-ids`, 108 + Array.from(searchState.sources[source].knownIds).join(',') 109 + ); 110 + searchState.sources[source].count = searchState.sources[source].knownIds.size; 111 + } 112 + 113 + export function clearSource(source: SourceType) { 114 + searchState.sources[source].knownIds.clear(); 115 + localStorage.removeItem(`${source}-ids`); 116 + localStorage.removeItem(`${source}-cursor`); 117 + searchState.sources[source].count = 0; 118 + searchState.sources[source].indexed = 0; 119 + searchState.sources[source].totalToIndex = 0; 120 + searchState.sources[source].phase = 'idle'; 121 + searchState.sources[source].cursor = undefined; 122 + searchState.sources[source].pendingUris = []; 123 + searchState.sources[source].pendingIndex = 0; 124 + searchState.sources[source].index?.clear(); 125 + } 126 + 127 + export async function initSources() { 128 + for (const source of ALL_SOURCES) { 129 + const db = new IndexedDB(`${source}-store`); 130 + searchState.sources[source].index = createIndex(); 131 + await searchState.sources[source].index!.mount(db); 132 + loadKnownIds(source); 133 + } 134 + 135 + searchState.loading = false; 136 + startLoading('likes'); 137 + } 138 + 139 + export function switchSource(source: SourceType) { 140 + if (source === searchState.activeSource) return; 141 + searchState.activeSource = source; 142 + // Bump generation to cancel any in-flight loading 143 + generation++; 144 + if (searchState.sources[source].phase !== 'done') { 145 + startLoading(source); 146 + } else { 147 + loadNext(generation); 148 + } 149 + } 150 + 151 + export function startLoading(source: SourceType) { 152 + generation++; 153 + const myGen = generation; 154 + 155 + if (source === 'bookmarks') { 156 + loadBookmarks(source, myGen); 157 + } else { 158 + loadRecords(source, myGen); 159 + } 160 + } 161 + 162 + function loadNext(currentGen: number) { 163 + if (currentGen !== generation) return; 164 + 165 + const sorted = [ 166 + searchState.activeSource, 167 + ...ALL_SOURCES.filter((s) => s !== searchState.activeSource) 168 + ]; 169 + for (const source of sorted) { 170 + if (searchState.sources[source].phase !== 'done') { 171 + startLoading(source); 172 + return; 173 + } 174 + } 175 + } 176 + 177 + async function loadRecords(source: SourceType, myGen: number) { 178 + if (!user.did || !searchState.sources[source].index) return; 179 + 180 + const { listLikeRecords, listPostRecords } = await import( 181 + '$lib/atproto/server/search.remote' 182 + ); 183 + const fetchFn = source === 'likes' ? listLikeRecords : listPostRecords; 184 + 185 + const s = searchState.sources[source]; 186 + 187 + // Phase 1: Fetch records if not already done 188 + if (s.phase === 'idle' || s.phase === 'fetching') { 189 + s.phase = 'fetching'; 190 + 191 + let cursor = s.cursor; 192 + let found = false; 193 + let data: any; 194 + 195 + do { 196 + if (myGen !== generation) return; 197 + 198 + try { 199 + data = await fetchFn({ limit: 100, cursor }); 200 + } catch (err) { 201 + console.error(`Failed to fetch ${source}:`, err); 202 + toast.error(`Failed to fetch ${source}`); 203 + return; 204 + } 205 + 206 + cursor = data.cursor; 207 + 208 + for (const record of data.records) { 209 + const subjectUri = source === 'likes' ? record.value.subject.uri : record.uri; 210 + if (!s.knownIds.has(subjectUri)) { 211 + addKnownId(source, subjectUri); 212 + s.pendingUris.push(subjectUri); 213 + continue; 214 + } 215 + 216 + found = true; 217 + cursor = localStorage.getItem(`${source}-cursor`) ?? undefined; 218 + 219 + if (cursor) { 220 + localStorage.removeItem(`${source}-cursor`); 221 + found = false; 222 + } 223 + 224 + break; 225 + } 226 + 227 + if (cursor && data.records.length > 0) { 228 + localStorage.setItem(`${source}-cursor`, cursor); 229 + s.cursor = cursor; 230 + } else { 231 + localStorage.removeItem(`${source}-cursor`); 232 + s.cursor = undefined; 233 + } 234 + } while (cursor && data.records.length > 0 && !found); 235 + 236 + s.totalToIndex = s.pendingUris.length; 237 + s.phase = 'hydrating'; 238 + } 239 + 240 + // Phase 2: Hydrate with getPosts 241 + if (s.phase === 'hydrating') { 242 + await hydrateUris(source, myGen); 243 + } 244 + } 245 + 246 + async function hydrateUris(source: SourceType, myGen: number) { 247 + const s = searchState.sources[source]; 248 + const BATCH_SIZE = 25; 249 + const CONCURRENCY = 5; 250 + 251 + const remaining = s.pendingUris.slice(s.pendingIndex); 252 + const batches: string[][] = []; 253 + for (let i = 0; i < remaining.length; i += BATCH_SIZE) { 254 + batches.push(remaining.slice(i, i + BATCH_SIZE)); 255 + } 256 + 257 + for (let i = 0; i < batches.length; i += CONCURRENCY) { 258 + if (myGen !== generation) return; 259 + 260 + const chunk = batches.slice(i, i + CONCURRENCY); 261 + const results = await Promise.all( 262 + chunk.map((uris) => 263 + publicClient 264 + .get('app.bsky.feed.getPosts', { params: { uris: uris as any } }) 265 + .catch((e) => { 266 + console.error(`Failed to hydrate ${source} batch:`, e); 267 + return null; 268 + }) 269 + ) 270 + ); 271 + 272 + for (const result of results) { 273 + if (result?.ok) { 274 + for (const post of result.data.posts) { 275 + s.index!.add(post as any); 276 + s.indexed++; 277 + } 278 + } 279 + } 280 + 281 + s.pendingIndex += chunk.reduce((sum, b) => sum + b.length, 0); 282 + await s.index!.commit(); 283 + } 284 + 285 + s.phase = 'done'; 286 + loadNext(myGen); 287 + } 288 + 289 + async function loadBookmarks(source: SourceType, myGen: number) { 290 + if (!user.did || !searchState.sources[source].index) return; 291 + 292 + const { getBookmarks } = await import('$lib/atproto/server/search.remote'); 293 + 294 + const s = searchState.sources[source]; 295 + s.phase = 'fetching'; 296 + 297 + let cursor = s.cursor; 298 + let found = false; 299 + let data: any; 300 + 301 + do { 302 + if (myGen !== generation) return; 303 + 304 + try { 305 + data = await getBookmarks({ limit: 100, cursor }); 306 + } catch (err: any) { 307 + console.error('Failed to fetch bookmarks:', err); 308 + toast.error(`Failed to fetch bookmarks: ${err?.body?.message ?? err?.message ?? err}`); 309 + return; 310 + } 311 + 312 + cursor = data.cursor; 313 + 314 + for (const bookmark of data.bookmarks) { 315 + // item can be PostView, BlockedPost, or NotFoundPost — only index PostView 316 + if (!bookmark.item?.uri) continue; 317 + 318 + const postUri = bookmark.item.uri; 319 + if (!s.knownIds.has(postUri)) { 320 + addKnownId(source, postUri); 321 + s.index!.add(bookmark.item as any); 322 + s.indexed++; 323 + s.count = s.knownIds.size; 324 + continue; 325 + } 326 + 327 + found = true; 328 + cursor = localStorage.getItem(`${source}-cursor`) ?? undefined; 329 + 330 + if (cursor) { 331 + localStorage.removeItem(`${source}-cursor`); 332 + found = false; 333 + } 334 + 335 + break; 336 + } 337 + 338 + if (cursor && data.bookmarks.length > 0) { 339 + localStorage.setItem(`${source}-cursor`, cursor); 340 + s.cursor = cursor; 341 + } else { 342 + localStorage.removeItem(`${source}-cursor`); 343 + s.cursor = undefined; 344 + } 345 + } while (cursor && data.bookmarks.length > 0 && !found); 346 + 347 + await s.index!.commit(); 348 + s.phase = 'done'; 349 + loadNext(myGen); 350 + } 351 + 352 + export async function searchIndex(query: string): Promise<any[]> { 353 + const idx = searchState.sources[searchState.activeSource].index; 354 + if (!idx || !query) return []; 355 + 356 + return idx.search({ 357 + query, 358 + enrich: true, 359 + merge: true, 360 + limit: 20 361 + }); 362 + } 363 + 364 + export function getLink(uri: string, handle: string) { 365 + const [, , rkey] = uri.replace('at://', '').split('/'); 366 + return `https://bsky.app/profile/${handle}/post/${rkey}`; 367 + }
+8
src/routes/+layout.server.ts
··· 1 + import type { LayoutServerLoad } from './$types'; 2 + import { loadProfile } from '$lib/atproto/server/profile'; 3 + 4 + export const load: LayoutServerLoad = async ({ locals, platform }) => { 5 + if (!locals.did) return { did: null, profile: null }; 6 + const profile = await loadProfile(locals.did, platform?.env?.PROFILE_CACHE); 7 + return { did: locals.did, profile }; 8 + };
+11 -9
src/routes/+layout.svelte
··· 1 1 <script lang="ts"> 2 2 import '../app.css'; 3 3 4 - import { onMount } from 'svelte'; 5 - import { initClient } from '$lib/oauth'; 6 - import { Head, ThemeToggle, Toaster } from '@fuxui/base'; 4 + import { AtprotoLoginModal } from '@foxui/social'; 5 + import { Head, ThemeToggle, Toaster } from '@foxui/core'; 6 + import { login } from '$lib/atproto'; 7 7 8 8 let { children } = $props(); 9 - 10 - onMount(() => { 11 - initClient(); 12 - }); 13 9 </script> 14 10 15 11 {@render children()} 16 12 13 + <AtprotoLoginModal 14 + login={async (handle) => { 15 + await login(handle); 16 + return true; 17 + }} 18 + /> 17 19 18 20 <Toaster /> 19 21 20 - <Head title="Search Bluesky Likes" emojiFavicon="🦋" /> 22 + <Head title="Search Bluesky" emojiFavicon="🦋" /> 21 23 22 - <ThemeToggle class="fixed top-4 right-4" /> 24 + <ThemeToggle class="fixed top-4 right-4" />
-3
src/routes/+layout.ts
··· 1 - export const prerender = true; 2 - 3 - export const ssr = false;
+31 -21
src/routes/+page.svelte
··· 1 1 <script lang="ts"> 2 - import { client, login } from '$lib/oauth'; 3 - import { BlueskyLogin } from '$lib/bluesky-login'; 2 + import { user } from '$lib/atproto'; 3 + import { atProtoLoginModalState } from '@foxui/social'; 4 4 import Search from './Search.svelte'; 5 - import { Heading } from '@fuxui/base'; 5 + import { Button, Heading } from '@foxui/core'; 6 6 </script> 7 7 8 8 <div class="mx-auto my-18 max-w-xl px-4 md:my-28"> 9 - {#if client.isInitializing} 10 - <Heading>Loading...</Heading> 11 - {/if} 9 + {#if !user.isLoggedIn} 10 + <Heading class="mb-8">Search your bluesky</Heading> 11 + <Button onclick={() => atProtoLoginModalState.show()}> 12 + <svg 13 + fill="currentColor" 14 + xmlns="http://www.w3.org/2000/svg" 15 + viewBox="-40 -40 680 620" 16 + version="1.1" 17 + class="size-5" 18 + aria-hidden="true" 19 + > 20 + <path 21 + d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" 22 + /> 23 + </svg> 24 + Login 25 + </Button> 12 26 13 - {#if !client.isInitializing && !client.agent} 14 - <Heading class="mb-8">Search your bluesky likes</Heading> 15 - <BlueskyLogin 16 - login={async (handle: string) => { 17 - await login(handle); 18 - return true; 19 - }} 20 - /> 21 - 22 - <div class="text-base-700 dark:text-base-300 mt-36 flex text-sm flex-col gap-4"> 27 + <div class="text-base-700 dark:text-base-300 mt-36 flex flex-col gap-4 text-sm"> 23 28 <div class="flex gap-2"> 24 29 Made by 25 30 <div class="flex items-center gap-2"> 26 - <a target="_blank" href="https://flo-bit.dev" class="text-accent-600 dark:text-accent-400 hover:text-accent-500 dark:hover:text-accent-500 font-semibold" 31 + <a 32 + target="_blank" 33 + href="https://flo-bit.dev" 34 + class="text-accent-600 dark:text-accent-400 hover:text-accent-500 dark:hover:text-accent-500 font-semibold" 27 35 >flo-bit</a 28 36 > 29 37 ··· 49 57 </div> 50 58 </div> 51 59 52 - <a href="https://github.com/flo-bit/search-bluesky-likes" target="_blank" 53 - class="text-accent-600 font-semibold hover:text-accent-500 dark:text-base-300 dark:hover:text-accent-400 transition-colors" 54 - > 60 + <a 61 + href="https://github.com/flo-bit/search-bluesky-likes" 62 + target="_blank" 63 + class="text-accent-600 hover:text-accent-500 dark:text-base-300 dark:hover:text-accent-400 font-semibold transition-colors" 64 + > 55 65 Source code 56 66 </a> 57 67 </div> 58 68 {/if} 59 69 60 - {#if client.isLoggedIn} 70 + {#if user.isLoggedIn} 61 71 <Search /> 62 72 {/if} 63 73 </div>
+78 -190
src/routes/Search.svelte
··· 1 1 <script lang="ts"> 2 - import { client, logout } from '$lib/oauth'; 3 - import { Avatar, Button, Heading, Input, Modal, Navbar, Popover, ThemeToggle, toast } from '@fuxui/base'; 4 - import { blueskyPostToPostData, Post } from '$lib/post'; 5 - import { Document, Charset, IndexedDB } from 'flexsearch'; 2 + import { user, logout } from '$lib/atproto'; 3 + import { Avatar, Button, Heading, Input, Modal, Navbar, Popover, ThemeToggle } from '@foxui/core'; 4 + import { blueskyPostToPostData, Post } from '@foxui/social'; 6 5 import { onMount } from 'svelte'; 7 - 8 - let index: Document; 9 - let likesIds = $state(new Set<string>()); 10 - 11 - let loading = $state(true); 12 - 13 - let count = $state(0); 14 - 15 - function addLikeId(id: string) { 16 - likesIds.add(id); 17 - // save in local storage 18 - localStorage.setItem('likes-ids', Array.from(likesIds).join(',')); 19 - 20 - count = likesIds.size; 21 - } 22 - 23 - function getLikesIds() { 24 - const ids = localStorage.getItem('likes-ids'); 25 - if (ids) { 26 - likesIds = new Set(ids.split(',')); 27 - } 28 - 29 - count = likesIds.size; 30 - } 31 - 32 - function clearLikesIds() { 33 - likesIds.clear(); 34 - localStorage.removeItem('likes-ids'); 35 - 36 - count = 0; 37 - } 38 - 39 - async function clearIndex() { 40 - if (!index) return; 41 - 42 - clearLikesIds(); 43 - index.clear(); 44 - 45 - await index.commit(); 46 - } 47 - 48 - onMount(async () => { 49 - const db = new IndexedDB('likes-store'); 50 - 51 - index = new Document({ 52 - document: { 53 - id: 'uri', 54 - store: true, 55 - index: [ 56 - { 57 - field: 'author:handle', 58 - tokenize: 'forward', 59 - encoder: Charset.LatinBalance 60 - }, 61 - { 62 - field: 'author:displayName', 63 - tokenize: 'forward', 64 - encoder: Charset.LatinBalance 65 - }, 66 - { 67 - field: 'record:text', 68 - tokenize: 'forward', 69 - encoder: Charset.LatinBalance 70 - } 71 - ], 72 - tag: [ 73 - { 74 - field: 'likeCount' 75 - }, 76 - { 77 - field: 'replyCount' 78 - }, 79 - { 80 - field: 'author:handle' 81 - }, 82 - { 83 - field: 'author:displayName' 84 - } 85 - ] 86 - } 87 - }); 88 - 89 - await index.mount(db); 90 - 91 - getLikesIds(); 92 - getLikes(); 93 - }); 94 - 95 - async function getLikes() { 96 - if (!client.profile?.did || !client.rpc || !index) return; 97 - 98 - let all = []; 99 - 100 - let cursor = undefined; 101 - let response = undefined; 102 - let found = false; 103 - let limit = 100; 104 - do { 105 - try { 106 - response = await client.rpc.request({ 107 - type: 'get', 108 - nsid: 'app.bsky.feed.getActorLikes', 109 - params: { 110 - actor: client.profile.did, 111 - limit, 112 - cursor 113 - } 114 - }); 115 - } catch (error) { 116 - // logout 117 - await logout(); 118 - toast.error('Failed to get likes, please login again'); 119 - break; 120 - } 121 - all.push(...response?.data.feed); 122 - 123 - cursor = response?.data.cursor; 124 - 125 - for (let like of response?.data.feed) { 126 - if (!likesIds.has(like.post.uri)) { 127 - addLikeId(like.post.uri); 128 - continue; 129 - } 130 - 131 - found = true; 132 - cursor = localStorage.getItem('cursor'); 133 - 134 - if (cursor) { 135 - localStorage.removeItem('cursor'); 136 - found = false; 137 - } 138 - 139 - break; 140 - } 141 - 142 - if (cursor && response?.data.feed.length > 0) { 143 - localStorage.setItem('cursor', cursor); 144 - } else { 145 - localStorage.removeItem('cursor'); 146 - } 147 - } while (cursor && response?.data.feed.length > 0 && !found); 148 - 149 - for (let like of all) { 150 - index.add(like.post); 151 - } 152 - 153 - await index.commit(); 154 - 155 - loading = false; 156 - } 6 + import { 7 + searchState, 8 + initSources, 9 + switchSource, 10 + clearSource, 11 + startLoading, 12 + searchIndex, 13 + SOURCE_LABELS, 14 + PLACEHOLDERS, 15 + ALL_SOURCES, 16 + type SourceType 17 + } from '$lib/search-state.svelte'; 157 18 158 19 let input: HTMLInputElement | null = $state(null); 159 - 160 20 let search = $state(''); 161 - let results = $state([]); 21 + let results: any[] = $state([]); 22 + let infoModalOpen = $state(false); 162 23 163 - $effect(() => { 164 - if (!search) return; 165 - 166 - index 167 - .search({ 168 - query: search, 169 - enrich: true, 170 - merge: true, 171 - limit: 20 172 - }) 173 - .then((res) => { 174 - results = res; 175 - }); 24 + onMount(() => { 25 + initSources(); 176 26 }); 177 27 178 - function getLink(uri: string, handle: string) { 179 - const [did, collection, rkey] = uri.replace('at://', '').split('/'); 180 - 181 - return `https://bsky.app/profile/${handle}/post/${rkey}`; 28 + function handleSwitchSource(source: SourceType) { 29 + switchSource(source); 30 + search = ''; 31 + results = []; 182 32 } 183 33 184 - let infoModalOpen = $state(false); 34 + $effect(() => { 35 + if (!search) { 36 + results = []; 37 + return; 38 + } 39 + 40 + searchIndex(search).then((res) => { 41 + results = res; 42 + }); 43 + }); 185 44 </script> 186 45 187 46 <svelte:window ··· 190 49 }} 191 50 /> 192 51 193 - {#if loading} 194 - <Heading>Loading your likes... ({count})</Heading> 52 + {#if searchState.loading} 53 + <Heading>Loading...</Heading> 195 54 {:else} 196 - <Navbar class="mx-2 max-w-xl sm:mx-auto md:top-10"> 55 + <Navbar class="mx-2 h-auto max-w-xl flex-col items-start sm:mx-auto md:top-10"> 56 + <div class="mb-4 mx-2 flex items-baseline gap-2"> 57 + <span class="text-base-600 dark:text-base-400 text-sm font-medium">Search my</span> 58 + <div class="flex gap-1"> 59 + {#each ALL_SOURCES as source} 60 + <button 61 + class="cursor-pointer rounded-full px-3 py-1 text-sm font-medium transition-colors {searchState.activeSource === 62 + source 63 + ? 'bg-accent-600 text-white' 64 + : 'text-base-600 dark:text-base-400 hover:bg-base-200 dark:hover:bg-base-800'}" 65 + onclick={() => handleSwitchSource(source)} 66 + > 67 + {SOURCE_LABELS[source]} 68 + </button> 69 + {/each} 70 + </div> 71 + </div> 72 + 197 73 <Input 198 74 bind:ref={input} 199 75 bind:value={search} 200 76 class="w-full" 201 77 sizeVariant="lg" 202 - placeholder="Search liked posts" 78 + placeholder={PLACEHOLDERS[searchState.activeSource]} 203 79 /> 80 + 81 + <span class="text-base-600 dark:text-base-400 mt-2 w-full text-center text-xs"> 82 + {#if searchState.sources[searchState.activeSource].phase === 'fetching'} 83 + loading {SOURCE_LABELS[searchState.activeSource].toLowerCase()}... ({searchState.sources[ 84 + searchState.activeSource 85 + ].count}) 86 + {:else if searchState.sources[searchState.activeSource].phase === 'hydrating'} 87 + indexed {searchState.sources[searchState.activeSource].indexed} out of {searchState.sources[ 88 + searchState.activeSource 89 + ].totalToIndex} 90 + {SOURCE_LABELS[searchState.activeSource].toLowerCase()} 91 + {:else} 92 + results: {search ? results.length : 0}, {SOURCE_LABELS[ 93 + searchState.activeSource 94 + ].toLowerCase()} loaded: {searchState.sources[searchState.activeSource].count} 95 + {/if} 96 + </span> 204 97 </Navbar> 205 - <span class="text-base-600 dark:text-base-400 text-xs" 206 - >results: {search ? results.length : 0}, likes loaded: {likesIds.size}</span 207 - > 208 98 {/if} 209 99 210 100 {#if results.length > 0 && search} 211 - <ul class=" mt-4 flex flex-col divide-y text-sm"> 101 + <ul class="pt-20 flex flex-col divide-y text-sm"> 212 102 {#each results as result (result.doc.uri)} 213 103 <div class="border-base-200 dark:border-base-900 relative border-b py-2"> 214 104 <Post 215 - href={getLink(result.doc.uri, result.doc.author.handle)} 216 - liked 105 + liked={searchState.activeSource === 'likes'} 217 106 data={blueskyPostToPostData(result.doc)} 218 107 class="pb-2" 219 108 /> ··· 228 117 <Popover class="flex flex-col items-start gap-2 p-2"> 229 118 {#snippet child({ props })} 230 119 <button {...props} class="cursor-pointer hover:opacity-90"> 231 - <Avatar src={client.profile?.avatar} /> 120 + <Avatar src={user.profile?.avatar} /> 232 121 </button> 233 122 {/snippet} 234 - <ThemeToggle class="backdrop-blur-none absolute top-1 right-1" /> 123 + <ThemeToggle class="absolute top-1 right-1 backdrop-blur-none" /> 235 124 <Button class="backdrop-blur-none" variant="ghost" onclick={() => (infoModalOpen = true)} 236 125 >Info</Button 237 126 > ··· 239 128 class="backdrop-blur-none" 240 129 variant="ghost" 241 130 onclick={() => { 242 - clearIndex(); 243 - loading = true; 244 - getLikes(); 245 - }}>Refresh all</Button 131 + clearSource(searchState.activeSource); 132 + startLoading(searchState.activeSource); 133 + }}>Refresh {SOURCE_LABELS[searchState.activeSource].toLowerCase()}</Button 246 134 > 247 135 <Button class="backdrop-blur-none" variant="ghost" onclick={logout}>Logout</Button> 248 136 </Popover>
+75
src/lib/atproto/auth.svelte.ts
··· 1 + import { AppBskyActorDefs } from '@atcute/bluesky'; 2 + import type { ActorIdentifier, Did } from '@atcute/lexicons'; 3 + import { page } from '$app/state'; 4 + import { ALLOW_SIGNUP, REDIRECT_TO_LAST_PAGE_ON_LOGIN } from './settings'; 5 + 6 + export const user = { 7 + get profile() { 8 + return (page.data?.profile as AppBskyActorDefs.ProfileViewDetailed | null) ?? null; 9 + }, 10 + get isLoggedIn() { 11 + return !!page.data?.did; 12 + }, 13 + get did() { 14 + return (page.data?.did as Did | null) ?? null; 15 + } 16 + }; 17 + 18 + function saveReturnTo() { 19 + if (REDIRECT_TO_LAST_PAGE_ON_LOGIN) { 20 + document.cookie = `oauth_return_to=${encodeURIComponent(window.location.pathname + window.location.search)};path=/;max-age=600;samesite=lax`; 21 + } 22 + } 23 + 24 + export async function login(handle: string) { 25 + if (handle.startsWith('did:')) { 26 + if (handle.length < 6) throw new Error('DID must be at least 6 characters'); 27 + } else if (handle.includes('.') && handle.length > 3) { 28 + handle = (handle.startsWith('@') ? handle.slice(1) : handle) as ActorIdentifier; 29 + if (handle.length < 4) throw new Error('Handle must be at least 4 characters'); 30 + } else if (handle.length > 3) { 31 + handle = ((handle.startsWith('@') ? handle.slice(1) : handle) + 32 + '.bsky.social') as ActorIdentifier; 33 + } else { 34 + throw new Error('Please provide a valid handle or DID.'); 35 + } 36 + 37 + const { oauthLogin } = await import('./server/oauth.remote'); 38 + const { url } = await oauthLogin({ handle }); 39 + saveReturnTo(); 40 + window.location.assign(url); 41 + 42 + // Wait for navigation (prevents UI flash) 43 + await new Promise((_resolve, reject) => { 44 + window.addEventListener('pageshow', () => reject(new Error('user aborted the login request')), { 45 + once: true 46 + }); 47 + }); 48 + } 49 + 50 + export async function signup() { 51 + if (!ALLOW_SIGNUP) throw new Error('Signup is not enabled'); 52 + 53 + const { oauthLogin } = await import('./server/oauth.remote'); 54 + const { url } = await oauthLogin({ signup: true }); 55 + saveReturnTo(); 56 + window.location.assign(url); 57 + 58 + await new Promise((_resolve, reject) => { 59 + window.addEventListener('pageshow', () => reject(new Error('user aborted the signup request')), { 60 + once: true 61 + }); 62 + }); 63 + } 64 + 65 + export async function logout() { 66 + try { 67 + const { oauthLogout } = await import('./server/oauth.remote'); 68 + await oauthLogout(); 69 + } catch (e) { 70 + console.error('Error logging out:', e); 71 + } 72 + 73 + // Full reload to clear server session state 74 + window.location.href = '/'; 75 + }
+152
src/lib/atproto/image-helper.ts
··· 1 + import { getCDNImageBlobUrl, uploadBlob } from './methods'; 2 + 3 + export function compressImage( 4 + file: File | Blob, 5 + maxSize: number = 900 * 1024, 6 + maxDimension: number = 2048 7 + ): Promise<{ 8 + blob: Blob; 9 + aspectRatio: { 10 + width: number; 11 + height: number; 12 + }; 13 + }> { 14 + return new Promise((resolve, reject) => { 15 + const img = new Image(); 16 + const reader = new FileReader(); 17 + 18 + reader.onload = (e) => { 19 + if (!e.target?.result) { 20 + return reject(new Error('Failed to read file.')); 21 + } 22 + img.src = e.target.result as string; 23 + }; 24 + 25 + reader.onerror = (err) => reject(err); 26 + reader.readAsDataURL(file); 27 + 28 + img.onload = () => { 29 + let width = img.width; 30 + let height = img.height; 31 + 32 + // If image is already small enough, return original 33 + if (file.size <= maxSize) { 34 + console.log('skipping compression+resizing, already small enough'); 35 + return resolve({ 36 + blob: file, 37 + aspectRatio: { 38 + width, 39 + height 40 + } 41 + }); 42 + } 43 + 44 + if (width > maxDimension || height > maxDimension) { 45 + if (width > height) { 46 + height = Math.round((maxDimension / width) * height); 47 + width = maxDimension; 48 + } else { 49 + width = Math.round((maxDimension / height) * width); 50 + height = maxDimension; 51 + } 52 + } 53 + 54 + // Create a canvas to draw the image 55 + const canvas = document.createElement('canvas'); 56 + canvas.width = width; 57 + canvas.height = height; 58 + const ctx = canvas.getContext('2d'); 59 + if (!ctx) return reject(new Error('Failed to get canvas context.')); 60 + ctx.drawImage(img, 0, 0, width, height); 61 + 62 + // Use WebP for both compression and transparency support 63 + let quality = 0.9; 64 + 65 + function attemptCompression() { 66 + canvas.toBlob( 67 + (blob) => { 68 + if (!blob) { 69 + return reject(new Error('Compression failed.')); 70 + } 71 + if (blob.size <= maxSize || quality < 0.3) { 72 + resolve({ 73 + blob, 74 + aspectRatio: { 75 + width, 76 + height 77 + } 78 + }); 79 + } else { 80 + quality -= 0.1; 81 + attemptCompression(); 82 + } 83 + }, 84 + 'image/webp', 85 + quality 86 + ); 87 + } 88 + 89 + attemptCompression(); 90 + }; 91 + 92 + img.onerror = (err) => reject(err); 93 + }); 94 + } 95 + 96 + export async function checkAndUploadImage( 97 + recordWithImage: Record<string, any>, 98 + key: string = 'image', 99 + // e.g. /api/image-proxy?url= 100 + imageProxy?: string 101 + ) { 102 + if (!recordWithImage[key]) return; 103 + 104 + // Already uploaded as blob 105 + if (typeof recordWithImage[key] === 'object' && recordWithImage[key].$type === 'blob') { 106 + return; 107 + } 108 + 109 + if (typeof recordWithImage[key] === 'string' && imageProxy) { 110 + const proxyUrl = imageProxy + encodeURIComponent(recordWithImage[key]); 111 + const response = await fetch(proxyUrl); 112 + if (!response.ok) { 113 + throw Error('failed to get image from image proxy'); 114 + } 115 + 116 + const blob = await response.blob(); 117 + const { blob: compressed, aspectRatio } = await compressImage(blob); 118 + 119 + recordWithImage[key] = await uploadBlob({ blob: compressed, aspectRatio }); 120 + 121 + return; 122 + } 123 + 124 + if (recordWithImage[key]?.blob) { 125 + if (recordWithImage[key].objectUrl) { 126 + URL.revokeObjectURL(recordWithImage[key].objectUrl); 127 + } 128 + const { blob: compressed, aspectRatio } = await compressImage(recordWithImage[key].blob); 129 + recordWithImage[key] = await uploadBlob({ blob: compressed, aspectRatio }); 130 + } 131 + } 132 + 133 + export function getImageFromRecord( 134 + recordWithImage: Record<string, any> | undefined, 135 + did: string, 136 + key: string = 'image' 137 + ): string | undefined { 138 + if (!recordWithImage?.[key]) return; 139 + 140 + if (typeof recordWithImage[key] === 'object' && recordWithImage[key].$type === 'blob') { 141 + return getCDNImageBlobUrl({ did, blob: recordWithImage[key] }); 142 + } 143 + 144 + if (recordWithImage[key].objectUrl) return recordWithImage[key].objectUrl; 145 + 146 + if (recordWithImage[key].blob) { 147 + recordWithImage[key].objectUrl = URL.createObjectURL(recordWithImage[key].blob); 148 + return recordWithImage[key].objectUrl; 149 + } 150 + 151 + return recordWithImage[key]; 152 + }
+20
src/lib/atproto/index.ts
··· 1 + export { user, login, signup, logout } from './auth.svelte'; 2 + 3 + export { 4 + parseUri, 5 + resolveHandle, 6 + actorToDid, 7 + getPDS, 8 + getDetailedProfile, 9 + getClient, 10 + listRecords, 11 + getRecord, 12 + putRecord, 13 + deleteRecord, 14 + uploadBlob, 15 + describeRepo, 16 + getBlobURL, 17 + getCDNImageBlobUrl, 18 + searchActorsTypeahead, 19 + createTID 20 + } from './methods';
+373
src/lib/atproto/methods.ts
··· 1 + import { parseResourceUri, type Did, type Handle } from '@atcute/lexicons'; 2 + import { isDid } from '@atcute/lexicons/syntax'; 3 + import { user } from './auth.svelte'; 4 + import { DOH_RESOLVER, type AllowedCollection } from './settings'; 5 + import { 6 + CompositeDidDocumentResolver, 7 + CompositeHandleResolver, 8 + DohJsonHandleResolver, 9 + PlcDidDocumentResolver, 10 + WebDidDocumentResolver, 11 + WellKnownHandleResolver 12 + } from '@atcute/identity-resolver'; 13 + import { Client, simpleFetchHandler } from '@atcute/client'; 14 + import { type AppBskyActorDefs } from '@atcute/bluesky'; 15 + 16 + export type Collection = `${string}.${string}.${string}`; 17 + import * as TID from '@atcute/tid'; 18 + 19 + /** 20 + * Parses an AT Protocol URI into its components. 21 + */ 22 + export function parseUri(uri: string) { 23 + const parts = parseResourceUri(uri); 24 + if (!parts.ok) return; 25 + return parts.value; 26 + } 27 + 28 + /** 29 + * Resolves a handle to a DID using DNS and HTTP methods. 30 + */ 31 + export async function resolveHandle({ handle }: { handle: Handle }) { 32 + const handleResolver = new CompositeHandleResolver({ 33 + methods: { 34 + dns: new DohJsonHandleResolver({ dohUrl: DOH_RESOLVER }), 35 + http: new WellKnownHandleResolver() 36 + } 37 + }); 38 + 39 + const data = await handleResolver.resolve(handle); 40 + return data; 41 + } 42 + 43 + /** 44 + * Returns a DID given a handle or DID string. 45 + */ 46 + export async function actorToDid(actor: string): Promise<Did> { 47 + if (isDid(actor)) return actor; 48 + return await resolveHandle({ handle: actor as Handle }); 49 + } 50 + 51 + const didResolver = new CompositeDidDocumentResolver({ 52 + methods: { 53 + plc: new PlcDidDocumentResolver(), 54 + web: new WebDidDocumentResolver() 55 + } 56 + }); 57 + 58 + /** 59 + * Gets the PDS (Personal Data Server) URL for a given DID. 60 + */ 61 + export async function getPDS(did: Did) { 62 + const doc = await didResolver.resolve(did as Did<'plc'> | Did<'web'>); 63 + if (!doc.service) throw new Error('No PDS found'); 64 + for (const service of doc.service) { 65 + if (service.id === '#atproto_pds') { 66 + return service.serviceEndpoint.toString(); 67 + } 68 + } 69 + } 70 + 71 + /** 72 + * Fetches a detailed Bluesky profile for a user. 73 + */ 74 + export async function getDetailedProfile(data?: { did?: Did; client?: Client }) { 75 + data ??= {}; 76 + data.did ??= user.did ?? undefined; 77 + 78 + if (!data.did) throw new Error('Error getting detailed profile: no did'); 79 + 80 + data.client ??= new Client({ 81 + handler: simpleFetchHandler({ service: 'https://public.api.bsky.app' }) 82 + }); 83 + 84 + const response = await data.client.get('app.bsky.actor.getProfile', { 85 + params: { actor: data.did } 86 + }); 87 + 88 + if (!response.ok) return; 89 + 90 + return response.data; 91 + } 92 + 93 + /** 94 + * Creates an AT Protocol client for a user's PDS. 95 + */ 96 + export async function getClient({ did }: { did: Did }) { 97 + const pds = await getPDS(did); 98 + if (!pds) throw new Error('PDS not found'); 99 + 100 + const client = new Client({ 101 + handler: simpleFetchHandler({ service: pds }) 102 + }); 103 + 104 + return client; 105 + } 106 + 107 + /** 108 + * Lists records from a repository collection with pagination support. 109 + */ 110 + export async function listRecords({ 111 + did, 112 + collection, 113 + cursor, 114 + limit = 100, 115 + client 116 + }: { 117 + did?: Did; 118 + collection: `${string}.${string}.${string}`; 119 + cursor?: string; 120 + limit?: number; 121 + client?: Client; 122 + }) { 123 + did ??= user.did ?? undefined; 124 + if (!collection) { 125 + throw new Error('Missing parameters for listRecords'); 126 + } 127 + if (!did) { 128 + throw new Error('Missing did for listRecords'); 129 + } 130 + 131 + client ??= await getClient({ did }); 132 + 133 + const allRecords = []; 134 + 135 + let currentCursor = cursor; 136 + do { 137 + const response = await client.get('com.atproto.repo.listRecords', { 138 + params: { 139 + repo: did, 140 + collection, 141 + limit: !limit || limit > 100 ? 100 : limit, 142 + cursor: currentCursor 143 + } 144 + }); 145 + 146 + if (!response.ok) { 147 + return allRecords; 148 + } 149 + 150 + allRecords.push(...response.data.records); 151 + currentCursor = response.data.cursor; 152 + } while (currentCursor && (!limit || allRecords.length < limit)); 153 + 154 + return allRecords; 155 + } 156 + 157 + /** 158 + * Fetches a single record from a repository. 159 + */ 160 + export async function getRecord({ 161 + did, 162 + collection, 163 + rkey = 'self', 164 + client 165 + }: { 166 + did?: Did; 167 + collection: Collection; 168 + rkey?: string; 169 + client?: Client; 170 + }) { 171 + did ??= user.did ?? undefined; 172 + 173 + if (!collection) { 174 + throw new Error('Missing parameters for getRecord'); 175 + } 176 + if (!did) { 177 + throw new Error('Missing did for getRecord'); 178 + } 179 + 180 + client ??= await getClient({ did }); 181 + 182 + const record = await client.get('com.atproto.repo.getRecord', { 183 + params: { 184 + repo: did, 185 + collection, 186 + rkey 187 + } 188 + }); 189 + 190 + return JSON.parse(JSON.stringify(record.data)); 191 + } 192 + 193 + /** 194 + * Creates or updates a record via remote function. 195 + */ 196 + export async function putRecord({ 197 + collection, 198 + rkey = 'self', 199 + record 200 + }: { 201 + collection: AllowedCollection; 202 + rkey?: string; 203 + record: Record<string, unknown>; 204 + }) { 205 + if (!user.did) throw new Error('Not logged in'); 206 + 207 + const { putRecord: putRecordRemote } = await import('./server/repo.remote'); 208 + const data = await putRecordRemote({ collection, rkey, record }); 209 + return { ok: true, data }; 210 + } 211 + 212 + /** 213 + * Deletes a record via remote function. 214 + */ 215 + export async function deleteRecord({ 216 + collection, 217 + rkey = 'self' 218 + }: { 219 + collection: AllowedCollection; 220 + rkey: string; 221 + }) { 222 + if (!user.did) throw new Error('Not logged in'); 223 + 224 + const { deleteRecord: deleteRecordRemote } = await import('./server/repo.remote'); 225 + const data = await deleteRecordRemote({ collection, rkey }); 226 + return data.ok; 227 + } 228 + 229 + /** 230 + * Gets the dimensions of an image blob. 231 + */ 232 + function getImageDimensions(blob: Blob): Promise<{ width: number; height: number }> { 233 + return new Promise((resolve, reject) => { 234 + const img = new Image(); 235 + const url = URL.createObjectURL(blob); 236 + img.onload = () => { 237 + URL.revokeObjectURL(url); 238 + resolve({ width: img.naturalWidth, height: img.naturalHeight }); 239 + }; 240 + img.onerror = () => { 241 + URL.revokeObjectURL(url); 242 + reject(new Error('Failed to load image for dimensions')); 243 + }; 244 + img.src = url; 245 + }); 246 + } 247 + 248 + /** 249 + * Uploads a blob via remote function. 250 + * Converts the Blob to a byte array for serialization across the remote boundary. 251 + * For image blobs, automatically includes aspectRatio with width and height. 252 + */ 253 + export async function uploadBlob({ 254 + blob, 255 + aspectRatio 256 + }: { 257 + blob: Blob; 258 + aspectRatio?: { width: number; height: number }; 259 + }) { 260 + if (!user.did) throw new Error("Can't upload blob: Not logged in"); 261 + 262 + // Auto-detect dimensions for image blobs if not provided 263 + if (!aspectRatio && blob.type.startsWith('image/')) { 264 + try { 265 + aspectRatio = await getImageDimensions(blob); 266 + } catch { 267 + // Non-critical — proceed without aspectRatio 268 + } 269 + } 270 + 271 + const arrayBuffer = await blob.arrayBuffer(); 272 + const bytes = Array.from(new Uint8Array(arrayBuffer)); 273 + 274 + const { uploadBlob: uploadBlobRemote } = await import('./server/repo.remote'); 275 + const result = await uploadBlobRemote({ bytes, mimeType: blob.type || 'application/octet-stream' }); 276 + 277 + if (aspectRatio) { 278 + return { ...result, aspectRatio }; 279 + } 280 + return result; 281 + } 282 + 283 + /** 284 + * Gets metadata about a repository. 285 + */ 286 + export async function describeRepo({ client, did }: { client?: Client; did?: Did }) { 287 + did ??= user.did ?? undefined; 288 + if (!did) { 289 + throw new Error('Error describeRepo: No did'); 290 + } 291 + client ??= await getClient({ did }); 292 + 293 + const repo = await client.get('com.atproto.repo.describeRepo', { 294 + params: { 295 + repo: did 296 + } 297 + }); 298 + if (!repo.ok) return; 299 + 300 + return repo.data; 301 + } 302 + 303 + /** 304 + * Constructs a URL to fetch a blob directly from a user's PDS. 305 + */ 306 + export async function getBlobURL({ 307 + did, 308 + blob 309 + }: { 310 + did: Did; 311 + blob: { 312 + $type: 'blob'; 313 + ref: { 314 + $link: string; 315 + }; 316 + }; 317 + }) { 318 + const pds = await getPDS(did); 319 + return `${pds}/xrpc/com.atproto.sync.getBlob?did=${did}&cid=${blob.ref.$link}`; 320 + } 321 + 322 + /** 323 + * Constructs a Bluesky CDN URL for an image blob. 324 + */ 325 + export function getCDNImageBlobUrl({ 326 + did, 327 + blob 328 + }: { 329 + did?: string; 330 + blob: { 331 + $type: 'blob'; 332 + ref: { 333 + $link: string; 334 + }; 335 + }; 336 + }) { 337 + did ??= user.did ?? undefined; 338 + 339 + return `https://cdn.bsky.app/img/feed_thumbnail/plain/${did}/${blob.ref.$link}@webp`; 340 + } 341 + 342 + /** 343 + * Searches for actors with typeahead/autocomplete functionality. 344 + */ 345 + export async function searchActorsTypeahead( 346 + q: string, 347 + limit: number = 10, 348 + host?: string 349 + ): Promise<{ actors: AppBskyActorDefs.ProfileViewBasic[]; q: string }> { 350 + host ??= 'https://public.api.bsky.app'; 351 + 352 + const client = new Client({ 353 + handler: simpleFetchHandler({ service: host }) 354 + }); 355 + 356 + const response = await client.get('app.bsky.actor.searchActorsTypeahead', { 357 + params: { 358 + q, 359 + limit 360 + } 361 + }); 362 + 363 + if (!response.ok) return { actors: [], q }; 364 + 365 + return { actors: response.data.actors, q }; 366 + } 367 + 368 + /** 369 + * Return a TID based on current time 370 + */ 371 + export function createTID() { 372 + return TID.now(); 373 + }
+3
src/lib/atproto/port.ts
··· 1 + // Dev server port — generated by setup-dev, shared by vite, oauth, and tunnel. 2 + // Each project gets a unique random port (5200–7200) so multiple projects can run simultaneously. 3 + export const DEV_PORT = 5816;
+30
src/lib/atproto/settings.ts
··· 1 + import { dev } from '$app/environment'; 2 + import { scope } from '@atcute/oauth-node-client'; 3 + 4 + // No writable collections — this app is read-only 5 + export const collections = [] as const; 6 + 7 + export type AllowedCollection = (typeof collections)[number]; 8 + 9 + // atproto for PDS listRecords (likes, posts), rpc for bookmarks via AppView 10 + export const scopes = [ 11 + 'atproto', 12 + scope.rpc({ 13 + lxm: ['app.bsky.bookmark.getBookmarks'], 14 + aud: '*' 15 + }) 16 + ]; 17 + 18 + // Login only, no signup 19 + export const ALLOW_SIGNUP = false; 20 + 21 + // Not used since ALLOW_SIGNUP is false, but required by the framework 22 + const devPDS = 'https://bsky.social/'; 23 + const prodPDS = 'https://bsky.social/'; 24 + export const signUpPDS = dev ? devPDS : prodPDS; 25 + 26 + export const REDIRECT_PATH = '/oauth/callback'; 27 + 28 + export const REDIRECT_TO_LAST_PAGE_ON_LOGIN = true; 29 + 30 + export const DOH_RESOLVER = 'https://mozilla.cloudflare-dns.com/dns-query';
-23
src/lib/bluesky-login/BlueskyLogin.svelte
··· 1 - <script lang="ts"> 2 - import { Button } from '@fuxui/base'; 3 - import { BlueskyLoginModal, blueskyLoginModalState, type BlueskyLoginProps } from '.'; 4 - 5 - let { login, formAction, formMethod }: BlueskyLoginProps = $props(); 6 - </script> 7 - 8 - <Button onclick={() => blueskyLoginModalState.show()}> 9 - <svg 10 - fill="currentColor" 11 - xmlns="http://www.w3.org/2000/svg" 12 - viewBox="-40 -40 680 620" 13 - version="1.1" 14 - aria-hidden="true" 15 - > 16 - <path 17 - d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" 18 - /> 19 - </svg> 20 - Login 21 - </Button> 22 - 23 - <BlueskyLoginModal {login} {formAction} {formMethod} />
-143
src/lib/bluesky-login/BlueskyLoginModal.svelte
··· 1 - <script lang="ts" module> 2 - export const blueskyLoginModalState = $state({ 3 - open: false, 4 - show: () => (blueskyLoginModalState.open = true), 5 - hide: () => (blueskyLoginModalState.open = false) 6 - }); 7 - </script> 8 - 9 - <script lang="ts"> 10 - import { Button, Modal, Subheading, Label, Input, Avatar } from '@fuxui/base'; 11 - import type { BlueskyLoginProps } from '.'; 12 - 13 - let value = $state(''); 14 - let error: string | null = $state(null); 15 - let loading = $state(false); 16 - 17 - let { login, formAction, formMethod = 'get' }: BlueskyLoginProps = $props(); 18 - 19 - async function onLogin(handle: string) { 20 - if (loading || !login) return; 21 - 22 - loading = true; 23 - error = null; 24 - 25 - try { 26 - const hide = await login(handle); 27 - 28 - if (hide) { 29 - blueskyLoginModalState.hide(); 30 - value = ''; 31 - } 32 - } catch (err) { 33 - error = err instanceof Error ? err.message : String(err); 34 - } finally { 35 - loading = false; 36 - } 37 - } 38 - 39 - async function onSubmit(evt: Event) { 40 - if (formAction || !login) return; 41 - evt.preventDefault(); 42 - 43 - await onLogin(value); 44 - } 45 - 46 - let input: HTMLInputElement | null = $state(null); 47 - 48 - let lastLogin: { handle: string; avatar: string } | null = $state(null); 49 - 50 - $effect(() => { 51 - let lastLoginDid = localStorage.getItem('last-login'); 52 - 53 - if (lastLoginDid) { 54 - let profile = localStorage.getItem(`profile-${lastLoginDid}`); 55 - 56 - if (profile) { 57 - lastLogin = JSON.parse(profile) 58 - } 59 - } 60 - }); 61 - 62 - $inspect(lastLogin); 63 - </script> 64 - 65 - <Modal 66 - bind:open={blueskyLoginModalState.open} 67 - class="max-w-sm gap-2 p-4 sm:p-6" 68 - onOpenAutoFocus={(e: Event) => { 69 - e.preventDefault(); 70 - input?.focus(); 71 - }} 72 - > 73 - <form onsubmit={onSubmit} action={formAction} method={formMethod} class="flex flex-col gap-2"> 74 - <Subheading class="mb-1 inline-flex items-center gap-2 text-xl font-bold"> 75 - <svg 76 - fill="currentColor" 77 - xmlns="http://www.w3.org/2000/svg" 78 - viewBox="-40 -40 680 620" 79 - version="1.1" 80 - class={['text-accent-600 dark:text-accent-400 size-6']} 81 - aria-hidden="true" 82 - > 83 - <path 84 - d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" 85 - /> 86 - </svg> 87 - Login with Bluesky</Subheading 88 - > 89 - 90 - <div class="text-base-600 dark:text-base-400 text-xs leading-5"> 91 - Don't have an account? 92 - <br /> 93 - <a 94 - href="https://bsky.app" 95 - target="_blank" 96 - class="text-accent-600 dark:text-accent-400 dark:hover:text-accent-500 hover:text-accent-500 font-medium transition-colors" 97 - > 98 - Sign up on bluesky 99 - </a>, then come back here. 100 - </div> 101 - 102 - {#if lastLogin} 103 - <Label for="bluesky-handle" class="mt-4 text-sm">Recent login:</Label> 104 - <Button 105 - class="max-w-xs overflow-x-hidden justify-start truncate" 106 - variant="primary" 107 - onclick={() => onLogin(lastLogin?.handle ?? '')} 108 - disabled={loading} 109 - > 110 - <Avatar src={lastLogin.avatar} class="size-6" /> 111 - 112 - <div 113 - class="text-accent-600 dark:text-accent-400 text-md max-w-full truncate overflow-x-hidden font-semibold" 114 - > 115 - <p>{loading ? 'Loading...' : lastLogin.handle}</p> 116 - </div> 117 - </Button> 118 - {/if} 119 - 120 - <div class="mt-4 w-full"> 121 - <Label for="bluesky-handle" class="text-sm">Your handle</Label> 122 - <div class="mt-2"> 123 - <Input 124 - bind:ref={input} 125 - type="text" 126 - name="bluesky-handle" 127 - id="bluesky-handle" 128 - placeholder="yourname.bsky.social" 129 - class="w-full" 130 - bind:value 131 - /> 132 - </div> 133 - </div> 134 - 135 - {#if error} 136 - <p class="text-accent-500 mt-2 text-sm font-medium">{error}</p> 137 - {/if} 138 - 139 - <Button type="submit" class="mt-2 ml-auto w-full md:w-auto" disabled={loading} 140 - >{loading ? 'Loading...' : 'Login'}</Button 141 - > 142 - </form> 143 - </Modal>
-9
src/lib/bluesky-login/index.ts
··· 1 - export { default as BlueskyLoginModal } from './BlueskyLoginModal.svelte'; 2 - export { blueskyLoginModalState } from './BlueskyLoginModal.svelte'; 3 - export { default as BlueskyLogin } from './BlueskyLogin.svelte'; 4 - 5 - export type BlueskyLoginProps = { 6 - login?: (handle: string) => Promise<boolean | undefined>; 7 - formAction?: string; 8 - formMethod?: 'dialog' | 'get' | 'post' | 'DIALOG' | 'GET' | 'POST' | null; 9 - };
-182
src/lib/oauth/auth.svelte.ts
··· 1 - import { 2 - configureOAuth, 3 - createAuthorizationUrl, 4 - finalizeAuthorization, 5 - resolveFromIdentity, 6 - type Session, 7 - OAuthUserAgent, 8 - getSession 9 - } from '@atcute/oauth-browser-client'; 10 - import { dev } from '$app/environment'; 11 - import { XRPC } from '@atcute/client'; 12 - import { metadata } from './const'; 13 - 14 - export const client = $state({ 15 - agent: null as OAuthUserAgent | null, 16 - session: null as Session | null, 17 - rpc: null as XRPC | null, 18 - profile: null as { 19 - handle: string; 20 - did: string; 21 - createdAt: string; 22 - description?: string; 23 - displayName?: string; 24 - banner?: string; 25 - avatar?: string; 26 - followersCount?: number; 27 - followsCount?: number; 28 - postsCount?: number; 29 - } | null, 30 - isInitializing: true, 31 - isLoggedIn: false 32 - }); 33 - 34 - export async function initClient() { 35 - client.isInitializing = true; 36 - 37 - const clientId = dev 38 - ? `http://localhost` + 39 - `?redirect_uri=${encodeURIComponent('http://127.0.0.1:5179')}` + 40 - `&scope=${encodeURIComponent(metadata.scope)}` 41 - : metadata.client_id; 42 - 43 - configureOAuth({ 44 - metadata: { 45 - client_id: clientId, 46 - redirect_uri: `${dev ? 'http://127.0.0.1:5179' : metadata.redirect_uris[0]}` 47 - } 48 - }); 49 - 50 - const params = new URLSearchParams(location.hash.slice(1)); 51 - 52 - const did = localStorage.getItem('last-login') ?? undefined; 53 - 54 - if (params.size > 0) { 55 - await finalizeLogin(params, did); 56 - } else if (did) { 57 - await resumeSession(did); 58 - } 59 - 60 - client.isInitializing = false; 61 - } 62 - 63 - export async function login(handle: string) { 64 - if (handle.startsWith('did:')) { 65 - if (handle.length > 5) await authorizationFlow(handle); 66 - else throw new Error('DID must be at least 6 characters'); 67 - } else if (handle.includes('.') && handle.length > 3) { 68 - const processed = handle.startsWith('@') ? handle.slice(1) : handle; 69 - if (processed.length > 3) await authorizationFlow(processed); 70 - else throw new Error('Handle must be at least 4 characters'); 71 - } else if (handle.length > 3) { 72 - const processed = (handle.startsWith('@') ? handle.slice(1) : handle) + '.bsky.social'; 73 - await authorizationFlow(processed); 74 - } else { 75 - throw new Error('Please provide a valid handle, DID, or PDS URL'); 76 - } 77 - } 78 - 79 - export async function logout() { 80 - const currentAgent = client.agent; 81 - if (currentAgent) { 82 - //const did = currentAgent.session.info.sub; 83 - 84 - //localStorage.removeItem('last-login'); 85 - //localStorage.removeItem(`profile-${did}`); 86 - 87 - await currentAgent.signOut(); 88 - client.session = null; 89 - client.agent = null; 90 - client.profile = null; 91 - 92 - client.isLoggedIn = false; 93 - } else { 94 - throw new Error('Not signed in'); 95 - } 96 - } 97 - 98 - async function finalizeLogin(params: URLSearchParams, did?: string) { 99 - try { 100 - history.replaceState(null, '', location.pathname + location.search); 101 - 102 - const session = await finalizeAuthorization(params); 103 - client.session = session; 104 - 105 - setAgentAndXRPC(session); 106 - localStorage.setItem('last-login', session.info.sub); 107 - 108 - await loadProfile(session.info.sub); 109 - 110 - client.isLoggedIn = true; 111 - } catch (error) { 112 - console.error('error finalizing login', error); 113 - if (did) { 114 - await resumeSession(did); 115 - } 116 - } 117 - } 118 - 119 - async function resumeSession(did: string) { 120 - try { 121 - const session = await getSession(did as `did:${string}`, { allowStale: true }); 122 - client.session = session; 123 - 124 - setAgentAndXRPC(session); 125 - 126 - await loadProfile(session.info.sub); 127 - 128 - client.isLoggedIn = true; 129 - } catch (error) { 130 - console.error('error resuming session', error); 131 - } 132 - } 133 - 134 - function setAgentAndXRPC(session: Session) { 135 - client.agent = new OAuthUserAgent(session); 136 - 137 - client.rpc = new XRPC({ handler: client.agent }); 138 - } 139 - 140 - async function loadProfile(actor: string) { 141 - // check if profile is already loaded in local storage 142 - const profile = localStorage.getItem(`profile-${actor}`); 143 - if (profile) { 144 - console.log('loading profile from local storage'); 145 - client.profile = JSON.parse(profile); 146 - return; 147 - } 148 - 149 - console.log('loading profile from server'); 150 - const response = await client.rpc?.request({ 151 - type: 'get', 152 - nsid: 'app.bsky.actor.getProfile', 153 - params: { actor } 154 - }); 155 - 156 - if (response) { 157 - client.profile = response.data; 158 - localStorage.setItem(`profile-${actor}`, JSON.stringify(response.data)); 159 - } 160 - } 161 - 162 - async function authorizationFlow(input: string) { 163 - const { identity, metadata: meta } = await resolveFromIdentity(input); 164 - 165 - const authUrl = await createAuthorizationUrl({ 166 - metadata: meta, 167 - identity: identity, 168 - scope: metadata.scope 169 - }); 170 - 171 - await new Promise((resolve) => setTimeout(resolve, 200)); 172 - 173 - window.location.assign(authUrl); 174 - 175 - await new Promise((_resolve, reject) => { 176 - const listener = () => { 177 - reject(new Error(`user aborted the login request`)); 178 - }; 179 - 180 - window.addEventListener('pageshow', listener, { once: true }); 181 - }); 182 - }
-16
src/lib/oauth/const.ts
··· 1 - import { base } from '$app/paths'; 2 - 3 - export const SITE_URL = 'https://flo-bit.dev'; 4 - 5 - export const metadata = { 6 - client_id: `${SITE_URL}${base}/client-metadata.json`, 7 - 8 - redirect_uris: [SITE_URL + base], 9 - 10 - scope: 'atproto transition:generic', 11 - grant_types: ['authorization_code', 'refresh_token'], 12 - response_types: ['code'], 13 - token_endpoint_auth_method: 'none', 14 - application_type: 'web', 15 - dpop_bound_access_tokens: true 16 - };
-4
src/lib/oauth/index.ts
··· 1 - import { client, login, logout, initClient } from './auth.svelte'; 2 - import { metadata } from './const'; 3 - 4 - export { metadata, client, login, logout, initClient };
-224
src/lib/post/Post.svelte
··· 1 - <script lang="ts"> 2 - import RelativeTime from './relative-time'; 3 - import Embed from './embeds/Embed.svelte'; 4 - import { cn, Avatar } from '@fuxui/base'; 5 - import type { WithChildren, WithElementRef } from 'bits-ui'; 6 - import type { HTMLAttributes } from 'svelte/elements'; 7 - import type { PostData } from '.'; 8 - 9 - let { 10 - ref, 11 - data, 12 - href, 13 - class: className, 14 - bookmarked = $bindable(false), 15 - liked = $bindable(false), 16 - children 17 - }: WithElementRef<WithChildren<HTMLAttributes<HTMLDivElement>>> & { 18 - data: PostData; 19 - class?: string; 20 - href: string; 21 - intersect?: () => void; 22 - bookmarked?: boolean; 23 - liked?: boolean; 24 - } = $props(); 25 - 26 - export function numberToHumanReadable(number: number) { 27 - if (number < 1000) { 28 - return number; 29 - } 30 - if (number < 1000000) { 31 - return `${Math.floor(number / 1000)}k`; 32 - } 33 - return `${Math.floor(number / 1000000)}m`; 34 - } 35 - </script> 36 - 37 - <div 38 - bind:this={ref} 39 - class={cn( 40 - 'text-base-950 dark:text-base-50 group relative transition-colors duration-200', 41 - className 42 - )} 43 - > 44 - {#if data.reposted} 45 - <div class="mb-3 inline-flex items-center gap-2 pl-4 text-xs font-medium"> 46 - <svg 47 - xmlns="http://www.w3.org/2000/svg" 48 - viewBox="0 0 24 24" 49 - fill="currentColor" 50 - class="size-3" 51 - > 52 - <path 53 - fill-rule="evenodd" 54 - d="M4.755 10.059a7.5 7.5 0 0 1 12.548-3.364l1.903 1.903h-3.183a.75.75 0 1 0 0 1.5h4.992a.75.75 0 0 0 .75-.75V4.356a.75.75 0 0 0-1.5 0v3.18l-1.9-1.9A9 9 0 0 0 3.306 9.67a.75.75 0 1 0 1.45.388Zm15.408 3.352a.75.75 0 0 0-.919.53 7.5 7.5 0 0 1-12.548 3.364l-1.902-1.903h3.183a.75.75 0 0 0 0-1.5H2.984a.75.75 0 0 0-.75.75v4.992a.75.75 0 0 0 1.5 0v-3.18l1.9 1.9a9 9 0 0 0 15.059-4.035.75.75 0 0 0-.53-.918Z" 55 - clip-rule="evenodd" 56 - /> 57 - </svg> 58 - 59 - <div class="inline-flex gap-1"> 60 - reposted by 61 - <a href={data.reposted.href} class="hover:text-accent-400 font-bold"> 62 - @{data.reposted.handle} 63 - </a> 64 - </div> 65 - </div> 66 - {/if} 67 - 68 - <a {href} target="_blank" class="absolute inset-0 h-full w-full"> 69 - <span class="sr-only">Open post</span> 70 - 71 - <div 72 - class="bg-base-400 dark:bg-base-600 absolute -inset-1 -z-10 rounded-2xl opacity-0 transition-colors group-hover:opacity-5" 73 - ></div> 74 - </a> 75 - 76 - <div class="pointer-events-none z-10 flex gap-4"> 77 - <Avatar src={data.author.avatar} /> 78 - 79 - <div class="w-full"> 80 - <div class="mb-1 flex items-start justify-between gap-2"> 81 - <a 82 - class="group hover:bg-accent-900/5 pointer-events-auto z-10 -mx-2 -my-0.5 flex flex-col items-baseline gap-x-2 gap-y-0.5 rounded-xl px-2 py-0.5 sm:flex-row" 83 - href={`https://bsky.app/profile/${data.author.handle}`} 84 - target="_blank" 85 - > 86 - <div 87 - class="text-base-900 group-hover:text-accent-600 dark:text-base-50 dark:group-hover:text-accent-300 text-sm leading-tight font-semibold" 88 - > 89 - {data.author.displayName} 90 - </div> 91 - <div 92 - class="text-base-600 group-hover:text-accent-600 dark:text-base-400 dark:group-hover:text-accent-400 text-sm" 93 - > 94 - @{data.author.handle} 95 - </div> 96 - </a> 97 - 98 - {#if data.createdAt} 99 - <a 100 - href={'#'} 101 - class="text-base-600 hover:text-accent-700 dark:text-base-400 dark:hover:text-accent-300 block text-sm no-underline" 102 - > 103 - <RelativeTime date={new Date(data.createdAt)} locale="en" /> 104 - </a> 105 - {/if} 106 - </div> 107 - 108 - <div class="prose-base"> 109 - <div 110 - class="prose dark:prose-invert prose-sm prose-a:no-underline prose-a:text-accent-600 dark:prose-a:text-accent-500" 111 - > 112 - {#if data.htmlContent} 113 - {@html data.htmlContent} 114 - {:else} 115 - {@render children?.()} 116 - {/if} 117 - </div> 118 - </div> 119 - 120 - <Embed {data} /> 121 - 122 - <div class="text-base-500 dark:text-base-400 mt-4 flex justify-between pr-4"> 123 - <div class="group inline-flex items-center gap-2 text-sm"> 124 - <svg 125 - xmlns="http://www.w3.org/2000/svg" 126 - fill="none" 127 - viewBox="0 0 24 24" 128 - stroke-width="1.5" 129 - stroke="currentColor" 130 - class="-m-1.5 size-7 rounded-full p-1.5 transition-all duration-100" 131 - > 132 - <path 133 - stroke-linecap="round" 134 - stroke-linejoin="round" 135 - d="M12 20.25c4.97 0 9-3.694 9-8.25s-4.03-8.25-9-8.25S3 7.444 3 12c0 2.104.859 4.023 2.273 5.48.432.447.74 1.04.586 1.641a4.483 4.483 0 0 1-.923 1.785A5.969 5.969 0 0 0 6 21c1.282 0 2.47-.402 3.445-1.087.81.22 1.668.337 2.555.337Z" 136 - /> 137 - </svg> 138 - {#if data.replyCount} 139 - {numberToHumanReadable(data.replyCount)} 140 - {/if} 141 - </div> 142 - 143 - <div class="group inline-flex items-center gap-2 text-sm"> 144 - <svg 145 - xmlns="http://www.w3.org/2000/svg" 146 - fill="none" 147 - viewBox="0 0 24 24" 148 - stroke-width="1.5" 149 - stroke="currentColor" 150 - class="-m-1.5 size-7 rounded-full p-1.5 transition-all duration-100" 151 - > 152 - <path 153 - stroke-linecap="round" 154 - stroke-linejoin="round" 155 - d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99" 156 - /> 157 - </svg> 158 - {#if data.repostCount} 159 - {numberToHumanReadable(data.repostCount)} 160 - {/if} 161 - </div> 162 - 163 - <div class="group inline-flex items-center gap-2 text-sm text-accent-600 dark:text-accent-400"> 164 - <svg 165 - xmlns="http://www.w3.org/2000/svg" 166 - viewBox="0 0 24 24" 167 - fill="currentColor" 168 - class="-m-1.5 size-7 rounded-full p-1.5 transition-all duration-100" 169 - > 170 - <path 171 - d="m11.645 20.91-.007-.003-.022-.012a15.247 15.247 0 0 1-.383-.218 25.18 25.18 0 0 1-4.244-3.17C4.688 15.36 2.25 12.174 2.25 8.25 2.25 5.322 4.714 3 7.688 3A5.5 5.5 0 0 1 12 5.052 5.5 5.5 0 0 1 16.313 3c2.973 0 5.437 2.322 5.437 5.25 0 3.925-2.438 7.111-4.739 9.256a25.175 25.175 0 0 1-4.244 3.17 15.247 15.247 0 0 1-.383.219l-.022.012-.007.004-.003.001a.752.752 0 0 1-.704 0l-.003-.001Z" 172 - /> 173 - </svg> 174 - 175 - {#if data.likeCount} 176 - {numberToHumanReadable(data.likeCount)} 177 - {/if} 178 - </div> 179 - </div> 180 - </div> 181 - </div> 182 - </div> 183 - 184 - <style> 185 - .prose-base { 186 - --tw-prose-body: var(--color-base-700); 187 - --tw-prose-headings: var(--color-base-900); 188 - --tw-prose-lead: var(--color-base-600); 189 - --tw-prose-links: var(--color-base-900); 190 - --tw-prose-bold: var(--color-base-900); 191 - --tw-prose-counters: var(--color-base-500); 192 - --tw-prose-bullets: var(--color-base-300); 193 - --tw-prose-hr: var(--color-base-200); 194 - --tw-prose-quotes: var(--color-base-900); 195 - --tw-prose-quote-borders: var(--color-base-200); 196 - --tw-prose-captions: var(--color-base-500); 197 - --tw-prose-kbd: var(--color-base-900); 198 - --tw-prose-kbd-shadows: var(--color-base-900); 199 - --tw-prose-code: var(--color-base-900); 200 - --tw-prose-pre-code: var(--color-base-200); 201 - --tw-prose-pre-bg: var(--color-base-800); 202 - --tw-prose-th-borders: var(--color-base-300); 203 - --tw-prose-td-borders: var(--color-base-200); 204 - 205 - --tw-prose-invert-body: var(--color-base-300); 206 - --tw-prose-invert-headings: var(--color-white); 207 - --tw-prose-invert-lead: var(--color-base-400); 208 - --tw-prose-invert-links: var(--color-white); 209 - --tw-prose-invert-bold: var(--color-white); 210 - --tw-prose-invert-counters: var(--color-base-400); 211 - --tw-prose-invert-bullets: var(--color-base-600); 212 - --tw-prose-invert-hr: var(--color-base-700); 213 - --tw-prose-invert-quotes: var(--color-base-100); 214 - --tw-prose-invert-quote-borders: var(--color-base-700); 215 - --tw-prose-invert-captions: var(--color-base-400); 216 - --tw-prose-invert-kbd: var(--color-white); 217 - --tw-prose-invert-kbd-shadows: var(--color-white); 218 - --tw-prose-invert-code: var(--color-white); 219 - --tw-prose-invert-pre-code: var(--color-base-300); 220 - --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); 221 - --tw-prose-invert-th-borders: var(--color-base-600); 222 - --tw-prose-invert-td-borders: var(--color-base-700); 223 - } 224 - </style>
-160
src/lib/post/index.ts
··· 1 - import { RichText } from '@atproto/api'; 2 - 3 - export type PostEmbedImage = { 4 - type: 'images'; 5 - 6 - images: { 7 - alt: string; 8 - thumb: string; 9 - fullsize: string; 10 - aspectRatio?: { 11 - width: number; 12 - height: number; 13 - }; 14 - }[]; 15 - }; 16 - 17 - export type PostEmbedExternal = { 18 - type: 'external'; 19 - 20 - external: { 21 - href: string; 22 - thumb: string; 23 - title: string; 24 - description: string; 25 - }; 26 - }; 27 - 28 - export type PostEmbedVideo = { 29 - type: 'video'; 30 - 31 - video: { 32 - playlist: string; 33 - 34 - thumb: string; 35 - alt: string; 36 - 37 - aspectRatio?: { 38 - width: number; 39 - height: number; 40 - }; 41 - }; 42 - }; 43 - 44 - export type UnknownEmbed = { 45 - type: 'unknown'; 46 - } & Record<string, unknown>; 47 - 48 - function blueskyEmbedTypeToEmbedType(type: string) { 49 - switch (type) { 50 - case 'app.bsky.embed.external#view': 51 - case 'app.bsky.embed.external': 52 - return 'external'; 53 - case 'app.bsky.embed.images#view': 54 - case 'app.bsky.embed.images': 55 - return 'images'; 56 - case 'app.bsky.embed.video#view': 57 - case 'app.bsky.embed.video': 58 - return 'video'; 59 - default: 60 - return 'unknown'; 61 - } 62 - } 63 - 64 - export type PostData = { 65 - reposted?: { handle: string; href: string }; 66 - 67 - author: { 68 - displayName: string; 69 - handle: string; 70 - avatar: string; 71 - href: string; 72 - }; 73 - 74 - replyCount: number; 75 - repostCount: number; 76 - likeCount: number; 77 - 78 - createdAt: string; 79 - 80 - embed?: PostEmbedImage | PostEmbedExternal | PostEmbedVideo | UnknownEmbed; 81 - 82 - htmlContent?: string; 83 - }; 84 - 85 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 86 - export function blueskyPostToPostData(post: any): PostData { 87 - return { 88 - author: { 89 - displayName: post.author.displayName, 90 - handle: post.author.handle, 91 - avatar: post.author.avatar, 92 - href: '#' 93 - }, 94 - replyCount: post.replyCount, 95 - repostCount: post.repostCount, 96 - likeCount: post.likeCount, 97 - createdAt: post.createdAt, 98 - 99 - embed: post.embed 100 - ? ({ 101 - type: blueskyEmbedTypeToEmbedType(post.embed?.$type), 102 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 103 - images: post.embed?.images?.map((image: any) => ({ 104 - alt: image.alt, 105 - thumb: image.thumb, 106 - aspectRatio: image.aspectRatio, 107 - fullsize: image.fullsize 108 - })), 109 - external: post.embed?.external 110 - ? { 111 - href: post.embed.external.uri, 112 - title: post.embed.external.title, 113 - description: post.embed.external.description, 114 - thumb: post.embed.external.thumb 115 - } 116 - : undefined, 117 - video: post.embed 118 - ? { 119 - playlist: post.embed.playlist, 120 - thumb: post.embed.thumbnail, 121 - alt: post.embed.alt, 122 - aspectRatio: post.embed.aspectRatio 123 - } 124 - : undefined 125 - } as PostEmbedExternal | PostEmbedVideo | PostEmbedImage | UnknownEmbed) 126 - : undefined, 127 - 128 - htmlContent: blueskyPostToHTML(post) 129 - }; 130 - } 131 - 132 - // eslint-disable-next-line @typescript-eslint/no-explicit-any 133 - export function blueskyPostToHTML(post: any, baseBskyUrl: string = 'https://bsky.app') { 134 - if (!post?.record) { 135 - return ''; 136 - } 137 - const rt = new RichText(post.record); 138 - let html = ''; 139 - 140 - const createLink = (href: string, text: string) => { 141 - return `<a target="_blank" rel="noopener noreferrer nofollow" href="${encodeURI(href)}">${encodeURI(text)}</a>`; 142 - }; 143 - 144 - for (const segment of rt.segments()) { 145 - if (!segment) continue; 146 - if (segment.isLink() && segment.link?.uri) { 147 - html += createLink(segment.link?.uri, segment.text); 148 - } else if (segment.isMention() && segment.mention?.did) { 149 - html += createLink(`${baseBskyUrl}/profile/${segment.mention?.did}`, segment.text); 150 - } else if (segment.isTag() && segment.tag?.tag) { 151 - html += createLink(`${baseBskyUrl}/hashtag/${segment.tag?.tag}`, segment.text); 152 - } else { 153 - html += segment.text; 154 - } 155 - } 156 - 157 - return html.replace(/\n/g, '<br>'); 158 - } 159 - 160 - export { default as Post } from './Post.svelte';
-8
src/routes/client-metadata.json/+server.ts
··· 1 - import { metadata } from '$lib/oauth'; 2 - import { json } from '@sveltejs/kit'; 3 - 4 - export const prerender = true; 5 - 6 - export async function GET() { 7 - return json(metadata); 8 - }
+4
src/lib/atproto/scripts/generate-key.ts
··· 1 + import { generateClientAssertionKey } from '@atcute/oauth-node-client'; 2 + 3 + const key = await generateClientAssertionKey('main-key'); 4 + console.log(JSON.stringify(key));
+3
src/lib/atproto/scripts/generate-secret.ts
··· 1 + import { randomBytes } from 'node:crypto'; 2 + 3 + console.log(randomBytes(32).toString('base64url'));
+60
src/lib/atproto/scripts/setup-dev.ts
··· 1 + import { existsSync } from 'node:fs'; 2 + import { copyFile, readFile, writeFile } from 'node:fs/promises'; 3 + import { resolve } from 'node:path'; 4 + import { randomBytes, randomInt } from 'node:crypto'; 5 + 6 + import { generateClientAssertionKey } from '@atcute/oauth-node-client'; 7 + 8 + const cwd = process.cwd(); 9 + const examplePath = resolve(cwd, '.env.example'); 10 + const envPath = resolve(cwd, '.env'); 11 + 12 + if (!existsSync(envPath)) { 13 + if (!existsSync(examplePath)) { 14 + throw new Error(`missing .env.example (expected at ${examplePath})`); 15 + } 16 + await copyFile(examplePath, envPath); 17 + console.log(`created ${envPath}`); 18 + } 19 + 20 + const upsertVar = (input: string, key: string, value: string): string => { 21 + const line = `${key}=${value}`; 22 + const re = new RegExp(`^${key}=.*$`, 'm'); 23 + 24 + if (re.test(input)) { 25 + const match = input.match(re); 26 + const current = match ? match[0].slice(key.length + 1).trim() : ''; 27 + // Only overwrite if empty/placeholder 28 + if (current === '' || current === "''" || current === '""' || current.includes('...')) { 29 + return input.replace(re, line); 30 + } 31 + return input; 32 + } 33 + 34 + const suffix = input.endsWith('\n') || input.length === 0 ? '' : '\n'; 35 + return `${input}${suffix}${line}\n`; 36 + }; 37 + 38 + let vars = await readFile(envPath, 'utf8'); 39 + 40 + const secret = randomBytes(32).toString('base64url'); 41 + vars = upsertVar(vars, 'COOKIE_SECRET', secret); 42 + 43 + const jwk = await generateClientAssertionKey('main-key'); 44 + vars = upsertVar(vars, 'CLIENT_ASSERTION_KEY', JSON.stringify(jwk)); 45 + 46 + await writeFile(envPath, vars); 47 + console.log(`updated ${envPath}`); 48 + 49 + // Generate a random dev port (5200–7200) so multiple projects can run simultaneously 50 + const portPath = resolve(cwd, 'src/lib/atproto/port.ts'); 51 + const portFile = await readFile(portPath, 'utf8'); 52 + const currentPort = portFile.match(/DEV_PORT\s*=\s*(\d+)/); 53 + if (currentPort && parseInt(currentPort[1]) === 5183) { 54 + const port = randomInt(5200, 7201); 55 + const updated = portFile.replace(/DEV_PORT\s*=\s*\d+/, `DEV_PORT = ${port}`); 56 + await writeFile(portPath, updated); 57 + console.log(`set DEV_PORT to ${port} in port.ts`); 58 + } else { 59 + console.log(`DEV_PORT already customized (${currentPort?.[1]}), skipping`); 60 + }
+195
src/lib/atproto/scripts/tunnel.ts
··· 1 + import { readFileSync, writeFileSync } from 'node:fs'; 2 + import { resolve } from 'node:path'; 3 + import { spawn } from 'node:child_process'; 4 + import { DEV_PORT } from '../port'; 5 + 6 + const cwd = process.cwd(); 7 + const envPath = resolve(cwd, '.env'); 8 + const vitePath = resolve(cwd, 'vite.config.ts'); 9 + 10 + let tunnelUrl: string | null = null; 11 + let statusBarActive = false; 12 + 13 + // ── ANSI status bar ────────────────────────────────────────────── 14 + // Reserves the bottom row of the terminal for a persistent status line. 15 + // Logs scroll in the region above it. 16 + 17 + function getColumns(): number { 18 + return process.stdout.columns || 80; 19 + } 20 + 21 + function getRows(): number { 22 + return process.stdout.rows || 24; 23 + } 24 + 25 + function setupScrollRegion(): void { 26 + if (!process.stdout.isTTY) return; 27 + statusBarActive = true; 28 + const rows = getRows(); 29 + // Set scroll region to all rows except the last 30 + process.stdout.write(`\x1b[1;${rows - 1}r`); 31 + // Move cursor into scroll region 32 + process.stdout.write(`\x1b[${rows - 1};1H`); 33 + } 34 + 35 + function drawStatusBar(text: string): void { 36 + if (!process.stdout.isTTY) { 37 + process.stdout.write(text + '\n'); 38 + return; 39 + } 40 + const rows = getRows(); 41 + const cols = getColumns(); 42 + // Save cursor, move to bottom row, clear it, write status, restore cursor 43 + process.stdout.write('\x1b7'); 44 + process.stdout.write(`\x1b[${rows};1H`); 45 + process.stdout.write('\x1b[2K'); 46 + // Inverse video for the bar 47 + process.stdout.write(`\x1b[7m ${text.padEnd(cols - 1)}\x1b[0m`); 48 + process.stdout.write('\x1b8'); 49 + } 50 + 51 + function clearStatusBar(): void { 52 + if (!process.stdout.isTTY || !statusBarActive) return; 53 + const rows = getRows(); 54 + // Reset scroll region to full terminal 55 + process.stdout.write(`\x1b[1;${rows}r`); 56 + // Clear the bottom row 57 + process.stdout.write(`\x1b[${rows};1H\x1b[2K`); 58 + // Move cursor up 59 + process.stdout.write(`\x1b[${rows - 1};1H`); 60 + statusBarActive = false; 61 + } 62 + 63 + function writeLog(text: string): void { 64 + if (statusBarActive && process.stdout.isTTY) { 65 + // Write inside the scroll region, which auto-scrolls above the bar 66 + process.stdout.write(text); 67 + } else { 68 + process.stdout.write(text); 69 + } 70 + } 71 + 72 + // Redraw on terminal resize 73 + process.stdout.on('resize', () => { 74 + if (!statusBarActive || !tunnelUrl) return; 75 + setupScrollRegion(); 76 + drawStatusBar(`Tunnel: ${tunnelUrl} | Ctrl+C to stop`); 77 + }); 78 + 79 + // ── .env helpers ───────────────────────────────────────────────── 80 + 81 + function readEnv(): string { 82 + return readFileSync(envPath, 'utf8'); 83 + } 84 + 85 + function writeEnv(content: string): void { 86 + writeFileSync(envPath, content); 87 + } 88 + 89 + function setEnvVar(key: string, value: string): void { 90 + let env = readEnv(); 91 + const re = new RegExp(`^(#\\s*)?${key}=.*$`, 'm'); 92 + const line = `${key}=${value}`; 93 + 94 + if (re.test(env)) { 95 + env = env.replace(re, line); 96 + } else { 97 + env = env.trimEnd() + '\n' + line + '\n'; 98 + } 99 + writeEnv(env); 100 + } 101 + 102 + function clearEnvVar(key: string): void { 103 + let env = readEnv(); 104 + const re = new RegExp(`^${key}=.*$`, 'm'); 105 + 106 + if (re.test(env)) { 107 + env = env.replace(re, `# ${key}=`); 108 + writeEnv(env); 109 + } 110 + } 111 + 112 + // ── vite config helpers ────────────────────────────────────────── 113 + 114 + function setViteAllowedHosts(hostname: string): void { 115 + let vite = readFileSync(vitePath, 'utf8'); 116 + 117 + if (/allowedHosts\s*:/.test(vite)) { 118 + vite = vite.replace(/allowedHosts\s*:\s*\[.*?\]/s, `allowedHosts: ['${hostname}']`); 119 + } else if (/server\s*:\s*\{/.test(vite)) { 120 + vite = vite.replace(/server\s*:\s*\{/, `server: {\n\t\tallowedHosts: ['${hostname}'],`); 121 + } 122 + 123 + writeFileSync(vitePath, vite); 124 + } 125 + 126 + function clearViteAllowedHosts(): void { 127 + let vite = readFileSync(vitePath, 'utf8'); 128 + 129 + if (/allowedHosts\s*:/.test(vite)) { 130 + vite = vite.replace(/allowedHosts\s*:\s*\[.*?\]/s, 'allowedHosts: []'); 131 + } 132 + 133 + writeFileSync(vitePath, vite); 134 + } 135 + 136 + // ── cleanup ────────────────────────────────────────────────────── 137 + 138 + function cleanup(): void { 139 + clearStatusBar(); 140 + console.log('\nCleaning up...'); 141 + if (tunnelUrl) { 142 + clearEnvVar('OAUTH_PUBLIC_URL'); 143 + console.log(' Cleared OAUTH_PUBLIC_URL from .env'); 144 + clearViteAllowedHosts(); 145 + console.log(' Cleared allowedHosts from vite.config.ts'); 146 + } 147 + } 148 + 149 + // ── main ───────────────────────────────────────────────────────── 150 + 151 + const child = spawn('cloudflared', ['tunnel', '--url', `http://localhost:${DEV_PORT}`], { 152 + stdio: ['ignore', 'pipe', 'pipe'] 153 + }); 154 + 155 + child.stderr.on('data', (data: Buffer) => { 156 + const output = data.toString(); 157 + 158 + if (!tunnelUrl) { 159 + const match = output.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/); 160 + if (match) { 161 + tunnelUrl = match[0]; 162 + const hostname = new URL(tunnelUrl).hostname; 163 + 164 + setEnvVar('OAUTH_PUBLIC_URL', tunnelUrl); 165 + setViteAllowedHosts(hostname); 166 + 167 + writeLog(`\n Set OAUTH_PUBLIC_URL=${tunnelUrl}\n`); 168 + writeLog(` Set vite allowedHosts to [${hostname}]\n`); 169 + writeLog(` Tunnel is ready! Restart your dev server to pick up the new URL.\n\n`); 170 + 171 + setupScrollRegion(); 172 + drawStatusBar(`Tunnel: ${tunnelUrl} | Ctrl+C to stop`); 173 + return; 174 + } 175 + } 176 + 177 + writeLog(output); 178 + }); 179 + 180 + child.stdout.on('data', (data: Buffer) => { 181 + writeLog(data.toString()); 182 + }); 183 + 184 + child.on('close', (code) => { 185 + cleanup(); 186 + process.exit(code ?? 0); 187 + }); 188 + 189 + process.on('SIGINT', () => { 190 + child.kill('SIGINT'); 191 + }); 192 + 193 + process.on('SIGTERM', () => { 194 + child.kill('SIGTERM'); 195 + });
+38
src/lib/atproto/server/kv-store.ts
··· 1 + import type { Store } from '@atcute/oauth-node-client'; 2 + 3 + export class KVStore<K extends string, V> implements Store<K, V> { 4 + private kv: KVNamespace; 5 + private expirationTtl?: number; 6 + 7 + constructor(kv: KVNamespace, options?: { expirationTtl?: number }) { 8 + this.kv = kv; 9 + this.expirationTtl = options?.expirationTtl; 10 + } 11 + 12 + async get(key: K): Promise<V | undefined> { 13 + const value = await this.kv.get(key, 'text'); 14 + if (value === null) return undefined; 15 + return JSON.parse(value) as V; 16 + } 17 + 18 + async set(key: K, value: V): Promise<void> { 19 + await this.kv.put(key, JSON.stringify(value), { 20 + expirationTtl: this.expirationTtl 21 + }); 22 + } 23 + 24 + async delete(key: K): Promise<void> { 25 + await this.kv.delete(key); 26 + } 27 + 28 + async clear(): Promise<void> { 29 + let cursor: string | undefined; 30 + do { 31 + const result = await this.kv.list({ cursor }); 32 + for (const key of result.keys) { 33 + await this.kv.delete(key.name); 34 + } 35 + cursor = result.list_complete ? undefined : result.cursor; 36 + } while (cursor); 37 + } 38 + }
+60
src/lib/atproto/server/oauth.remote.ts
··· 1 + import * as v from 'valibot'; 2 + import { error } from '@sveltejs/kit'; 3 + import { command, getRequestEvent } from '$app/server'; 4 + import { createOAuthClient } from './oauth'; 5 + import { getSignedCookie } from './signed-cookie'; 6 + import { scopes, signUpPDS } from '../settings'; 7 + import type { ActorIdentifier, Did } from '@atcute/lexicons'; 8 + 9 + export const oauthLogin = command( 10 + v.object({ 11 + handle: v.optional(v.pipe(v.string(), v.minLength(3))), 12 + signup: v.optional(v.boolean()) 13 + }), 14 + async (input) => { 15 + const { platform } = getRequestEvent(); 16 + 17 + try { 18 + const oauth = createOAuthClient(platform?.env); 19 + 20 + const target = input.signup 21 + ? ({ type: 'pds', serviceUrl: signUpPDS } as const) 22 + : ({ type: 'account', identifier: input.handle as ActorIdentifier } as const); 23 + 24 + const scopeStr = scopes.join(' '); 25 + console.log('OAuth authorize scope:', scopeStr); 26 + 27 + const { url } = await oauth.authorize({ 28 + target, 29 + scope: scopeStr, 30 + prompt: input.signup ? 'create' : undefined 31 + }); 32 + 33 + console.log('OAuth authorize URL:', url.toString()); 34 + return { url: url.toString() }; 35 + } catch (e) { 36 + if (e && typeof e === 'object' && 'status' in e) throw e; // re-throw SvelteKit errors 37 + const message = e instanceof Error ? e.message : 'Login failed'; 38 + error(400, message); 39 + } 40 + } 41 + ); 42 + 43 + export const oauthLogout = command(async () => { 44 + const { cookies, platform } = getRequestEvent(); 45 + const did = getSignedCookie(cookies, 'did') as Did | null; 46 + 47 + if (did) { 48 + try { 49 + const oauth = createOAuthClient(platform?.env); 50 + await oauth.revoke(did); 51 + } catch (e) { 52 + console.error('Error revoking session:', e); 53 + } 54 + } 55 + 56 + cookies.delete('did', { path: '/' }); 57 + cookies.delete('scope', { path: '/' }); 58 + 59 + return { ok: true }; 60 + });
+97
src/lib/atproto/server/oauth.ts
··· 1 + import { 2 + OAuthClient, 3 + MemoryStore, 4 + type ClientAssertionPrivateJwk, 5 + type OAuthClientStores, 6 + type OAuthSession, 7 + type StoredSession, 8 + type StoredState 9 + } from '@atcute/oauth-node-client'; 10 + import type { Did } from '@atcute/lexicons'; 11 + import { 12 + CompositeDidDocumentResolver, 13 + CompositeHandleResolver, 14 + DohJsonHandleResolver, 15 + LocalActorResolver, 16 + PlcDidDocumentResolver, 17 + WebDidDocumentResolver, 18 + WellKnownHandleResolver 19 + } from '@atcute/identity-resolver'; 20 + import { KVStore } from './kv-store'; 21 + import { DOH_RESOLVER, REDIRECT_PATH, scopes } from '../settings'; 22 + import { DEV_PORT } from '../port'; 23 + import { dev } from '$app/environment'; 24 + 25 + function createActorResolver() { 26 + return new LocalActorResolver({ 27 + handleResolver: new CompositeHandleResolver({ 28 + methods: { 29 + dns: new DohJsonHandleResolver({ dohUrl: DOH_RESOLVER }), 30 + http: new WellKnownHandleResolver() 31 + } 32 + }), 33 + didDocumentResolver: new CompositeDidDocumentResolver({ 34 + methods: { 35 + plc: new PlcDidDocumentResolver(), 36 + web: new WebDidDocumentResolver() 37 + } 38 + }) 39 + }); 40 + } 41 + 42 + function createStores(env?: App.Platform['env']): OAuthClientStores { 43 + if (env?.OAUTH_SESSIONS && env?.OAUTH_STATES) { 44 + return { 45 + sessions: new KVStore<Did, StoredSession>(env.OAUTH_SESSIONS), 46 + states: new KVStore<string, StoredState>(env.OAUTH_STATES, { expirationTtl: 600 }) 47 + }; 48 + } 49 + // Fallback to in-memory stores (dev without wrangler) 50 + return { 51 + sessions: new MemoryStore<Did, StoredSession>(), 52 + states: new MemoryStore<string, StoredState>({ ttl: 600_000 }) 53 + }; 54 + } 55 + 56 + export function createOAuthClient(env?: App.Platform['env']): OAuthClient { 57 + const actorResolver = createActorResolver(); 58 + const stores = createStores(env); 59 + 60 + if (dev && !env?.OAUTH_PUBLIC_URL) { 61 + // Dev without tunnel: loopback public client (no keyset). 62 + // Omit client_id — the library builds it automatically from redirect_uris + scope. 63 + // redirect_uris must use 127.0.0.1 (not localhost). 64 + return new OAuthClient({ 65 + metadata: { 66 + redirect_uris: [`http://127.0.0.1:${DEV_PORT}${REDIRECT_PATH}`], 67 + scope: scopes.join(' ') 68 + }, 69 + actorResolver, 70 + stores 71 + }); 72 + } 73 + 74 + // Confidential client (production, or dev with tunnel via OAUTH_PUBLIC_URL) 75 + if (!env?.OAUTH_PUBLIC_URL) { 76 + throw new Error('OAUTH_PUBLIC_URL is not set'); 77 + } 78 + if (!env.CLIENT_ASSERTION_KEY) { 79 + throw new Error('CLIENT_ASSERTION_KEY secret is not set. Run: pnpm env:generate-key'); 80 + } 81 + const site = env.OAUTH_PUBLIC_URL; 82 + const key: ClientAssertionPrivateJwk = JSON.parse(env.CLIENT_ASSERTION_KEY); 83 + 84 + return new OAuthClient({ 85 + metadata: { 86 + client_id: site + '/oauth-client-metadata.json', 87 + redirect_uris: [site + REDIRECT_PATH], 88 + scope: scopes.join(' '), 89 + jwks_uri: site + '/oauth/jwks.json' 90 + }, 91 + keyset: [key], 92 + actorResolver, 93 + stores 94 + }); 95 + } 96 + 97 + export type { OAuthSession };
+51
src/lib/atproto/server/profile.ts
··· 1 + import type { Did } from '@atcute/lexicons'; 2 + import { getDetailedProfile, describeRepo } from '../methods'; 3 + 4 + const PROFILE_CACHE_TTL = 60 * 60; // 1 hour 5 + 6 + /** 7 + * Loads a user's profile, with optional KV caching. 8 + * Falls back to a fresh fetch if the cache KV doesn't exist or on cache miss. 9 + * Returns undefined if the profile can't be loaded. 10 + */ 11 + export async function loadProfile(did: Did, profileCache?: KVNamespace) { 12 + // Try cache first 13 + if (profileCache) { 14 + try { 15 + const cached = await profileCache.get(did, 'json'); 16 + if (cached) return cached as Record<string, unknown>; 17 + } catch { 18 + // Cache read failed, continue to fresh fetch 19 + } 20 + } 21 + 22 + const profile = await fetchProfile(did); 23 + 24 + // Write to cache (fire-and-forget) 25 + if (profileCache && profile) { 26 + profileCache 27 + .put(did, JSON.stringify(profile), { expirationTtl: PROFILE_CACHE_TTL }) 28 + .catch(() => {}); 29 + } 30 + 31 + return profile; 32 + } 33 + 34 + async function fetchProfile(did: Did) { 35 + try { 36 + let profile = await getDetailedProfile({ did }); 37 + 38 + if (!profile || profile.handle === 'handle.invalid') { 39 + const repo = await describeRepo({ did }); 40 + profile = { 41 + did, 42 + handle: repo?.handle || 'handle.invalid' 43 + } as typeof profile; 44 + } 45 + 46 + return profile; 47 + } catch (e) { 48 + console.error('Failed to load profile:', e); 49 + return undefined; 50 + } 51 + }
+85
src/lib/atproto/server/repo.remote.ts
··· 1 + import { error } from '@sveltejs/kit'; 2 + import { command, getRequestEvent } from '$app/server'; 3 + import * as v from 'valibot'; 4 + import { collections } from '../settings'; 5 + 6 + // Validate collection format and check against allowed list from settings 7 + const collectionSchema = v.pipe( 8 + v.string(), 9 + v.regex(/^[a-zA-Z][a-zA-Z0-9-]*(\.[a-zA-Z][a-zA-Z0-9-]*){2,}$/), 10 + v.check((c) => collections.includes(c as (typeof collections)[number]), 'Collection not in allowed list') 11 + ); 12 + 13 + // AT Protocol rkey: TID, 'self', or other valid record keys (alphanumeric, dash, underscore, dot) 14 + const rkeySchema = v.optional(v.pipe(v.string(), v.regex(/^[a-zA-Z0-9._:~-]{1,512}$/))); 15 + 16 + export const putRecord = command( 17 + v.object({ 18 + collection: collectionSchema, 19 + rkey: rkeySchema, 20 + record: v.record(v.string(), v.unknown()) 21 + }), 22 + async (input) => { 23 + const { locals } = getRequestEvent(); 24 + if (!locals.client || !locals.did) error(401, 'Not authenticated'); 25 + 26 + const response = await locals.client.post('com.atproto.repo.putRecord', { 27 + input: { 28 + collection: input.collection as `${string}.${string}.${string}`, 29 + repo: locals.did, 30 + rkey: input.rkey || 'self', 31 + record: input.record 32 + } 33 + }); 34 + 35 + return response.data; 36 + } 37 + ); 38 + 39 + export const deleteRecord = command( 40 + v.object({ 41 + collection: collectionSchema, 42 + rkey: rkeySchema 43 + }), 44 + async (input) => { 45 + const { locals } = getRequestEvent(); 46 + if (!locals.client || !locals.did) error(401, 'Not authenticated'); 47 + 48 + const response = await locals.client.post('com.atproto.repo.deleteRecord', { 49 + input: { 50 + collection: input.collection as `${string}.${string}.${string}`, 51 + repo: locals.did, 52 + rkey: input.rkey || 'self' 53 + } 54 + }); 55 + 56 + return { ok: response.ok }; 57 + } 58 + ); 59 + 60 + export const uploadBlob = command( 61 + v.object({ 62 + bytes: v.array(v.number()), 63 + mimeType: v.string() 64 + }), 65 + async (input) => { 66 + const { locals } = getRequestEvent(); 67 + if (!locals.client || !locals.did) error(401, 'Not authenticated'); 68 + 69 + const blob = new Blob([new Uint8Array(input.bytes)], { type: input.mimeType }); 70 + 71 + const response = await locals.client.post('com.atproto.repo.uploadBlob', { 72 + params: { repo: locals.did }, 73 + input: blob 74 + }); 75 + 76 + if (!response.ok) error(500, 'Upload failed'); 77 + 78 + return response.data.blob as { 79 + $type: 'blob'; 80 + ref: { $link: string }; 81 + mimeType: string; 82 + size: number; 83 + }; 84 + } 85 + );
+84
src/lib/atproto/server/search.remote.ts
··· 1 + import { error } from '@sveltejs/kit'; 2 + import { command, getRequestEvent } from '$app/server'; 3 + import * as v from 'valibot'; 4 + 5 + export const listLikeRecords = command( 6 + v.object({ 7 + limit: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(100))), 8 + cursor: v.optional(v.string()) 9 + }), 10 + async (input) => { 11 + const { locals } = getRequestEvent(); 12 + if (!locals.client || !locals.did) error(401, 'Not authenticated'); 13 + 14 + const response = await locals.client.get('com.atproto.repo.listRecords', { 15 + params: { 16 + repo: locals.did, 17 + collection: 'app.bsky.feed.like', 18 + limit: input.limit ?? 100, 19 + cursor: input.cursor, 20 + reverse: false 21 + } 22 + }); 23 + 24 + if (!response.ok) error(500, 'Failed to fetch like records'); 25 + 26 + return response.data; 27 + } 28 + ); 29 + 30 + export const listPostRecords = command( 31 + v.object({ 32 + limit: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(100))), 33 + cursor: v.optional(v.string()) 34 + }), 35 + async (input) => { 36 + const { locals } = getRequestEvent(); 37 + if (!locals.client || !locals.did) error(401, 'Not authenticated'); 38 + 39 + const response = await locals.client.get('com.atproto.repo.listRecords', { 40 + params: { 41 + repo: locals.did, 42 + collection: 'app.bsky.feed.post', 43 + limit: input.limit ?? 100, 44 + cursor: input.cursor, 45 + reverse: false 46 + } 47 + }); 48 + 49 + if (!response.ok) error(500, 'Failed to fetch post records'); 50 + 51 + return response.data; 52 + } 53 + ); 54 + 55 + export const getBookmarks = command( 56 + v.object({ 57 + limit: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(100))), 58 + cursor: v.optional(v.string()) 59 + }), 60 + async (input) => { 61 + const { locals } = getRequestEvent(); 62 + if (!locals.client || !locals.did) error(401, 'Not authenticated'); 63 + 64 + let response; 65 + try { 66 + response = await locals.client.get('app.bsky.bookmark.getBookmarks', { 67 + params: { 68 + limit: input.limit ?? 100, 69 + cursor: input.cursor 70 + } 71 + }); 72 + } catch (err) { 73 + console.error('Bookmarks server error:', err); 74 + error(500, `Bookmarks request failed: ${err}`); 75 + } 76 + 77 + if (!response.ok) { 78 + console.error('Bookmarks response not ok:', response.status, response.data); 79 + error(500, `Bookmarks failed: ${response.status} ${JSON.stringify(response.data)}`); 80 + } 81 + 82 + return response.data; 83 + } 84 + );
+53
src/lib/atproto/server/session.ts
··· 1 + import type { Cookies } from '@sveltejs/kit'; 2 + import { Client } from '@atcute/client'; 3 + import type { Did } from '@atcute/lexicons'; 4 + import type { OAuthSession } from '@atcute/oauth-node-client'; 5 + import { createOAuthClient } from './oauth'; 6 + import { getSignedCookie } from './signed-cookie'; 7 + import { scopes } from '../settings'; 8 + 9 + export type SessionLocals = { 10 + session: OAuthSession | null; 11 + client: Client | null; 12 + did: Did | null; 13 + }; 14 + 15 + /** 16 + * Restores an OAuth session from the signed `did` cookie. 17 + * Returns session locals to be assigned to `event.locals`. 18 + * Deletes the cookie if the session can't be restored. 19 + */ 20 + export async function restoreSession( 21 + cookies: Cookies, 22 + env?: App.Platform['env'] 23 + ): Promise<SessionLocals> { 24 + const did = getSignedCookie(cookies, 'did') as Did | null; 25 + 26 + if (!did) { 27 + return { session: null, client: null, did: null }; 28 + } 29 + 30 + // If permissions changed since login, invalidate the session 31 + const savedScope = getSignedCookie(cookies, 'scope'); 32 + if (savedScope !== scopes.join(' ')) { 33 + cookies.delete('did', { path: '/' }); 34 + cookies.delete('scope', { path: '/' }); 35 + return { session: null, client: null, did: null }; 36 + } 37 + 38 + try { 39 + const oauth = createOAuthClient(env); 40 + const session = await oauth.restore(did); 41 + 42 + return { 43 + session, 44 + client: new Client({ handler: session }), 45 + did 46 + }; 47 + } catch (e) { 48 + console.error('Failed to restore session:', e); 49 + cookies.delete('did', { path: '/' }); 50 + cookies.delete('scope', { path: '/' }); 51 + return { session: null, client: null, did: null }; 52 + } 53 + }
+69
src/lib/atproto/server/signed-cookie.ts
··· 1 + import { createHmac, timingSafeEqual } from 'node:crypto'; 2 + 3 + import type { Cookies } from '@sveltejs/kit'; 4 + 5 + import { env } from '$env/dynamic/private'; 6 + import { dev } from '$app/environment'; 7 + 8 + const SEPARATOR = '.'; 9 + 10 + function getSecret(): string { 11 + const secret = env.COOKIE_SECRET; 12 + if (secret) return secret; 13 + if (dev) return 'dev-cookie-secret-not-for-production'; 14 + throw new Error('COOKIE_SECRET is not set'); 15 + } 16 + 17 + function toBase64Url(bytes: Uint8Array): string { 18 + let binary = ''; 19 + for (const byte of bytes) binary += String.fromCharCode(byte); 20 + return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); 21 + } 22 + 23 + function fromBase64Url(str: string): Uint8Array { 24 + const padded = str + '='.repeat((4 - (str.length % 4)) % 4); 25 + const base64 = padded.replace(/-/g, '+').replace(/_/g, '/'); 26 + const binary = atob(base64); 27 + const bytes = new Uint8Array(binary.length); 28 + for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i); 29 + return bytes; 30 + } 31 + 32 + function hmacSha256(data: string): Uint8Array { 33 + return createHmac('sha256', getSecret()).update(data).digest(); 34 + } 35 + 36 + export function getSignedCookie(cookies: Cookies, name: string): string | null { 37 + const signed = cookies.get(name); 38 + if (!signed) return null; 39 + 40 + const idx = signed.lastIndexOf(SEPARATOR); 41 + if (idx === -1) return null; 42 + 43 + const value = signed.slice(0, idx); 44 + const sig = signed.slice(idx + 1); 45 + 46 + let expected: Uint8Array; 47 + let got: Uint8Array; 48 + try { 49 + expected = hmacSha256(value); 50 + got = fromBase64Url(sig); 51 + } catch { 52 + return null; 53 + } 54 + 55 + if (got.length !== expected.length || !timingSafeEqual(got, expected)) return null; 56 + 57 + return value; 58 + } 59 + 60 + export function setSignedCookie( 61 + cookies: Cookies, 62 + name: string, 63 + value: string, 64 + options: Parameters<Cookies['set']>[2] 65 + ): void { 66 + const sig = toBase64Url(hmacSha256(value)); 67 + const signed = `${value}${SEPARATOR}${sig}`; 68 + cookies.set(name, signed, options); 69 + }
-26
src/lib/post/embeds/Embed.svelte
··· 1 - <script lang="ts"> 2 - import type { PostData } from '../'; 3 - import External from './External.svelte'; 4 - import Images from './Images.svelte'; 5 - import Video from './Video.svelte'; 6 - 7 - const { data }: { data: PostData } = $props(); 8 - </script> 9 - 10 - {#if data.embed} 11 - <div class="flex flex-col gap-2 pt-3 text-sm"> 12 - {#if data.embed.type === 'images'} 13 - <Images data={data.embed} /> 14 - {:else if data.embed.type === 'external' && data.embed.external} 15 - <External data={data.embed} /> 16 - {:else if data.embed.type === 'video' && data.embed.video} 17 - <Video data={data.embed} /> 18 - {:else if data.embed.type === 'unknown'} 19 - <div 20 - class="text-base-700 dark:text-base-300 bg-base-200/50 dark:bg-base-900/50 border-base-300 dark:border-base-600/30 rounded-2xl border p-4 text-sm" 21 - > 22 - Unknown embed type 23 - </div> 24 - {/if} 25 - </div> 26 - {/if}
-39
src/lib/post/embeds/External.svelte
··· 1 - <script lang="ts"> 2 - import type { PostEmbedExternal } from '..'; 3 - 4 - const { data }: { data: PostEmbedExternal } = $props(); 5 - 6 - const domain = new URL(data.external.href).hostname.replace('www.', ''); 7 - </script> 8 - 9 - <article 10 - class={[ 11 - 'group dark:bg-base-900 bg-base-200 border-base-300 dark:border-base-600/30 relative isolate flex flex-col justify-end overflow-hidden rounded-2xl border p-4', 12 - data.external.thumb ? 'aspect-[16/9]' : '' 13 - ]} 14 - > 15 - {#if data.external.thumb} 16 - <img 17 - src={data.external.thumb} 18 - alt={data.external.description} 19 - class="absolute inset-0 -z-10 size-full object-cover transition-transform duration-500 ease-in-out group-hover:scale-105" 20 - /> 21 - {/if} 22 - <div 23 - class="dark:from-base-950/90 dark:via-base-950/40 from-base-50/90 via-base-50/40 absolute inset-0 -z-10 bg-gradient-to-t" 24 - ></div> 25 - 26 - <div 27 - class="text-base-700 dark:text-base-300 flex flex-wrap items-center gap-y-1 overflow-hidden text-sm" 28 - > 29 - <div>{domain}</div> 30 - </div> 31 - <h3 32 - class="dark:text-base-50 text-base-900 group-hover:text-accent-600 dark:group-hover:text-accent-400 mt-1 text-lg/6 font-semibold transition-colors duration-200" 33 - > 34 - <a href={data.external.href} target="_blank" rel="noopener noreferrer nofollow"> 35 - <span class="absolute inset-0"></span> 36 - {data.external.title} 37 - </a> 38 - </h3> 39 - </article>
-38
src/lib/post/embeds/Images.svelte
··· 1 - <script lang="ts"> 2 - import type { PostEmbedImage } from '..'; 3 - 4 - const { data }: { data: PostEmbedImage } = $props(); 5 - </script> 6 - 7 - {#snippet imageSnippet( 8 - image: { 9 - alt: string; 10 - thumb: string; 11 - fullsize: string; 12 - aspectRatio?: { width: number; height: number }; 13 - }, 14 - className?: string 15 - )} 16 - <img 17 - loading="lazy" 18 - src={image.thumb} 19 - alt={image.alt} 20 - style={image.aspectRatio 21 - ? `aspect-ratio: ${image.aspectRatio.width} / ${image.aspectRatio.height}` 22 - : 'aspect-ratio: 1 / 1'} 23 - class={[ 24 - 'border-base-500/20 dark:border-base-400/20 w-fit max-w-full rounded-2xl border max-h-[40rem] object-contain', 25 - className 26 - ]} 27 - /> 28 - {/snippet} 29 - 30 - {#if data.images.length === 1} 31 - {@render imageSnippet(data.images[0])} 32 - {:else} 33 - <div class="columns-2 gap-4"> 34 - {#each data.images as image} 35 - {@render imageSnippet(image, 'mb-4')} 36 - {/each} 37 - </div> 38 - {/if}
-45
src/lib/post/embeds/Video.svelte
··· 1 - <script lang="ts"> 2 - import { onMount } from 'svelte'; 3 - import Hls from 'hls.js'; 4 - import type { PostEmbedVideo } from '..'; 5 - 6 - const { data }: { data: PostEmbedVideo } = $props(); 7 - 8 - onMount(async () => { 9 - const Plyr = (await import('plyr')).default; 10 - if (Hls.isSupported()) { 11 - var hls = new Hls(); 12 - hls.loadSource(data.video.playlist); 13 - hls.attachMedia(element); 14 - } 15 - 16 - new Plyr(element, { 17 - controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'fullscreen'], 18 - ratio: data.video.aspectRatio 19 - ? `${data.video.aspectRatio.width}:${data.video.aspectRatio.height}` 20 - : '16:9' 21 - }); 22 - }); 23 - 24 - let element: HTMLMediaElement; 25 - </script> 26 - 27 - <svelte:head> 28 - <link rel="stylesheet" href="https://cdn.plyr.io/3.7.8/plyr.css" /> 29 - </svelte:head> 30 - 31 - <div 32 - style={data.video.aspectRatio 33 - ? `aspect-ratio: ${data.video.aspectRatio.width} / ${data.video.aspectRatio.height}` 34 - : 'aspect-ratio: 16 / 9'} 35 - class="border-base-300 dark:border-base-400/40 w-full max-w-full overflow-hidden rounded-2xl border" 36 - > 37 - <!-- svelte-ignore a11y_media_has_caption --> 38 - <video bind:this={element} class="h-full w-full" aria-label={data.video.alt}></video> 39 - </div> 40 - 41 - <style> 42 - * { 43 - --plyr-color-main: var(--color-accent-500); 44 - } 45 - </style>
-17
src/lib/post/relative-time/RelativeTime.svelte
··· 1 - <script lang="ts"> 2 - import { onDestroy } from 'svelte'; 3 - import { register, unregister } from './state'; 4 - 5 - export let date: Date | number; 6 - export let locale: string; 7 - export let live = true; 8 - 9 - let instance = new Object(); 10 - let text = ''; 11 - 12 - register(instance, date, locale, live, (value) => ({ text } = value)); 13 - 14 - onDestroy(() => unregister(instance)); 15 - </script> 16 - 17 - <span class={$$props.class}>{text}</span>
-31
src/lib/post/relative-time/action.ts
··· 1 - import type { Callback } from './render'; 2 - import { register, unregister } from './state'; 3 - 4 - export interface Options { 5 - date: Date | number; 6 - locale?: string; 7 - live?: boolean; 8 - } 9 - 10 - export function relativeTime(node: HTMLElement, options: Options) { 11 - const callback: Callback = ({ text }) => (node.textContent = text); 12 - 13 - function init(options: Options) { 14 - const date = options.date; 15 - const locale = options.locale ?? navigator.language; 16 - const live = (options.live = true); 17 - 18 - register(node, date, locale, live, callback); 19 - } 20 - 21 - init(options); 22 - 23 - return { 24 - update(options: Options) { 25 - init(options); 26 - }, 27 - destroy() { 28 - unregister(node); 29 - } 30 - }; 31 - }
-12
src/lib/post/relative-time/formatter.ts
··· 1 - // keep a cache of formatter per locale, to avoid re-creating them (GC) 2 - const formatters = new Map<string, Intl.RelativeTimeFormat>(); 3 - 4 - // get the Intl.RelativeTimeFormat formatter for the given locale 5 - export function getFormatter(locale: string) { 6 - if (formatters.has(locale)) { 7 - return formatters.get(locale)!; 8 - } 9 - const formatter = new Intl.RelativeTimeFormat(locale, { numeric: 'always', style: 'narrow' }); 10 - formatters.set(locale, formatter); 11 - return formatter; 12 - }
-6
src/lib/post/relative-time/index.ts
··· 1 - // adapted from https://github.com/CaptainCodeman/svelte-relative-time 2 - 3 - export * from './action'; 4 - export type { Callback } from './render'; 5 - export { register, unregister } from './state'; 6 - export { default } from './RelativeTime.svelte';
-80
src/lib/post/relative-time/render.ts
··· 1 - export type Callback = (result: { 2 - seconds: number; 3 - count: number; 4 - units: Intl.RelativeTimeFormatUnit; 5 - text: string; 6 - }) => void; 7 - 8 - export interface RenderState { 9 - date: Date | number; 10 - callback: Callback; 11 - formatter: Intl.RelativeTimeFormat; 12 - } 13 - 14 - // Array reprsenting one minute, hour, day, week, month, etc in seconds 15 - const cutoffs = [60, 3600, 86400, 86400 * 7, 86400 * 30, 86400 * 365, Infinity]; 16 - 17 - // Array equivalent to the above but in the string representation of the units 18 - const formatUnits: Intl.RelativeTimeFormatUnit[] = [ 19 - 'seconds', 20 - 'minutes', 21 - 'hours', 22 - 'days', 23 - 'weeks', 24 - 'months', 25 - 'years' 26 - ]; 27 - 28 - // function to render relative time into 29 - export function render(state: RenderState, now: number) { 30 - const { date, callback, formatter } = state; 31 - 32 - // Allow dates or times to be passed 33 - const timeMs = typeof date === 'number' ? date : date.getTime(); 34 - 35 - // Get the amount of seconds between the given date and now 36 - const delta = timeMs - now; 37 - const seconds = Math.round(delta / 1000); 38 - 39 - // Grab the ideal cutoff unit 40 - const unitIndex = cutoffs.findIndex((cutoff) => cutoff > Math.abs(seconds)); 41 - 42 - // units 43 - const units = formatUnits[unitIndex]; 44 - 45 - // Get the divisor to divide from the seconds. E.g. if our unit is 'day' our divisor 46 - // is one day in seconds, so we can divide our seconds by this to get the # of days 47 - const divisor = unitIndex ? cutoffs[unitIndex - 1] : 1; 48 - 49 - // count of units 50 - const count = Math.round(seconds / divisor); 51 - 52 - // Intl.RelativeTimeFormat do its magic 53 - callback({ 54 - seconds: seconds, 55 - count, 56 - units, 57 - text: formatter.format(count, units).replace('ago', '') 58 - }); 59 - 60 - // calculate time to next update, taking account rounding (e.g. it goes from 2 minutes to 1 minute at 90 seconds) 61 - // and also the changeover from units (59 seconds shouldn't show as 1 minute, so at 61 seconds we schedule the next 62 - // update for 1 second time) 63 - 64 - const divisorMs = divisor * 1000; 65 - 66 - let updateIn; 67 - 68 - if (unitIndex) { 69 - updateIn = divisorMs / 2 - (Math.abs(delta) % divisorMs); 70 - if (updateIn < 0) { 71 - updateIn += divisorMs; 72 - } 73 - } else { 74 - updateIn = divisorMs - (Math.abs(delta) % divisorMs); 75 - } 76 - 77 - const updateAt = now + updateIn; 78 - 79 - return updateAt; 80 - }
-60
src/lib/post/relative-time/state.ts
··· 1 - import { getFormatter } from './formatter'; 2 - import { render } from './render'; 3 - import type { Callback, RenderState } from './render'; 4 - 5 - interface UpdateState extends RenderState { 6 - update: number; 7 - } 8 - 9 - // keep track of each instance 10 - const instances = new Map<Object, UpdateState>(); 11 - 12 - // we use a single timer for efficiency and to keep updates in sync 13 - let updateInterval: number | NodeJS.Timeout; 14 - 15 - // register or update instance 16 - export function register( 17 - instance: Object, 18 - date: Date | number, 19 - locale: string, 20 - live: boolean, 21 - callback: Callback 22 - ) { 23 - // get the formatter for the given locale, we do this here so we don't keep having to look it up on each tick 24 - const formatter = getFormatter(locale); 25 - 26 - // create state to render 27 - const state = { date, callback, formatter }; 28 - 29 - // initial render is immediate, so works for SSR 30 - const update = render(state, Date.now()); 31 - 32 - // if it's to update live, we keep a track and schedule the next update 33 - if (live) { 34 - instances.set(instance, { ...state, update }); 35 - } else { 36 - instances.delete(instance); 37 - } 38 - 39 - // start the clock ticking if there are any live instances 40 - if (instances.size) { 41 - updateInterval = 42 - updateInterval || 43 - setInterval(() => { 44 - const now = Date.now(); 45 - for (const state of instances.values()) { 46 - if (state.update <= now) { 47 - state.update = render(state, now); 48 - } 49 - } 50 - }, 1000); 51 - } 52 - } 53 - 54 - export function unregister(instance: Object) { 55 - instances.delete(instance); 56 - if (instances.size === 0) { 57 - clearInterval(updateInterval); 58 - updateInterval = 0; 59 - } 60 - }
+8
src/routes/(oauth)/oauth-client-metadata.json/+server.ts
··· 1 + import { json } from '@sveltejs/kit'; 2 + import { createOAuthClient } from '$lib/atproto/server/oauth'; 3 + import type { RequestHandler } from './$types'; 4 + 5 + export const GET: RequestHandler = async ({ platform }) => { 6 + const oauth = createOAuthClient(platform?.env); 7 + return json(oauth.metadata); 8 + };
+41
src/routes/(oauth)/oauth/callback/+server.ts
··· 1 + import { redirect } from '@sveltejs/kit'; 2 + import { createOAuthClient } from '$lib/atproto/server/oauth'; 3 + import { setSignedCookie } from '$lib/atproto/server/signed-cookie'; 4 + import { scopes } from '$lib/atproto/settings'; 5 + import { dev } from '$app/environment'; 6 + import type { RequestHandler } from './$types'; 7 + 8 + export const GET: RequestHandler = async ({ url, platform, cookies }) => { 9 + const oauth = createOAuthClient(platform?.env); 10 + 11 + // oauth.callback() validates the state parameter (CSRF protection) and 12 + // exchanges the authorization code for tokens via the token endpoint. 13 + try { 14 + const { session } = await oauth.callback(url.searchParams); 15 + 16 + const cookieOpts = { 17 + path: '/', 18 + httpOnly: true, 19 + secure: !dev, 20 + sameSite: 'lax' as const, 21 + maxAge: 60 * 60 * 24 * 180 // 180 days 22 + }; 23 + 24 + setSignedCookie(cookies, 'did', session.did, cookieOpts); 25 + setSignedCookie(cookies, 'scope', scopes.join(' '), cookieOpts); 26 + } catch (e) { 27 + console.error('OAuth callback failed:', e); 28 + redirect(303, '/?error=auth_failed'); 29 + } 30 + 31 + const returnTo = cookies.get('oauth_return_to'); 32 + if (returnTo) { 33 + cookies.delete('oauth_return_to', { path: '/' }); 34 + const decoded = decodeURIComponent(returnTo); 35 + if (decoded.startsWith('/') && !decoded.startsWith('//')) { 36 + redirect(303, decoded); 37 + } 38 + } 39 + 40 + redirect(303, '/'); 41 + };
+8
src/routes/(oauth)/oauth/jwks.json/+server.ts
··· 1 + import { json } from '@sveltejs/kit'; 2 + import { createOAuthClient } from '$lib/atproto/server/oauth'; 3 + import type { RequestHandler } from './$types'; 4 + 5 + export const GET: RequestHandler = async ({ platform }) => { 6 + const oauth = createOAuthClient(platform?.env); 7 + return json(oauth.jwks ?? { keys: [] }); 8 + };