├── .gitignore ├── README.md ├── jsconfig.json ├── package-lock.json ├── package.json ├── render.yaml ├── src ├── app.d.ts ├── app.html ├── lib │ └── images │ │ ├── github.svg │ │ ├── svelte-logo.svg │ │ ├── svelte-welcome.png │ │ └── svelte-welcome.webp └── routes │ ├── +layout.svelte │ ├── +page.js │ ├── +page.svelte │ ├── Counter.svelte │ ├── Header.svelte │ ├── about │ ├── +page.js │ └── +page.svelte │ ├── styles.css │ └── sverdle │ ├── +page.server.js │ ├── +page.svelte │ ├── game.js │ ├── how-to-play │ ├── +page.js │ └── +page.svelte │ ├── reduced-motion.js │ └── words.server.js ├── static ├── favicon.png └── robots.txt ├── svelte.config.js └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sveltekit 2 | 3 | This repo contains code for a SvelteKit application generated using the [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte) package. 4 | 5 | To create your own SvelteKit project, you can either 6 | 7 | - [Create your own repo from this template](https://github.com/render-examples/sveltekit/generate) and modify it for your needs 8 | - Create a new SvelteKit project by following the [SvelteKit Getting Started Guide](https://kit.svelte.dev/docs) and then making a few small modifications as shown in [this commit](https://github.com/render-examples/sveltekit/commit/3ea50803f118da041745fd8cb51094972ac87f3c) to deploy it to Render as a Node.js service. 9 | 10 | ## Developing 11 | 12 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 13 | 14 | ```bash 15 | npm run dev 16 | 17 | # or start the server and open the app in a new browser tab 18 | npm run dev -- --open 19 | ``` 20 | 21 | ## Building 22 | 23 | ```bash 24 | npm run build 25 | ``` 26 | 27 | > You can preview the built app with `npm run preview`. This should _not_ be used to serve your app in production. 28 | 29 | ## Deploying to Render 30 | 31 | Follow the deploy instructions at https://render.com/docs/deploy-sveltekit or click the button below: 32 | 33 | 34 | Deploy to Render 35 | 36 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "moduleResolution": "bundler", 13 | }, 14 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias and https://kit.svelte.dev/docs/configuration#files 15 | // 16 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 17 | // from the referenced tsconfig.json - TypeScript does not merge them in 18 | } 19 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "sveltekit", 8 | "devDependencies": { 9 | "@fontsource/fira-mono": "^4.5.10", 10 | "@neoconfetti/svelte": "^1.0.0", 11 | "@sveltejs/adapter-node": "^5.2.12", 12 | "@sveltejs/kit": "^2.17.2", 13 | "@sveltejs/vite-plugin-svelte": "^4.0.4", 14 | "svelte": "^5.20.2", 15 | "svelte-check": "^4.1.4", 16 | "typescript": "^5.7.3", 17 | "vite": "^5.4.14" 18 | } 19 | }, 20 | "node_modules/@ampproject/remapping": { 21 | "version": "2.3.0", 22 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 23 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 24 | "dev": true, 25 | "license": "Apache-2.0", 26 | "dependencies": { 27 | "@jridgewell/gen-mapping": "^0.3.5", 28 | "@jridgewell/trace-mapping": "^0.3.24" 29 | }, 30 | "engines": { 31 | "node": ">=6.0.0" 32 | } 33 | }, 34 | "node_modules/@esbuild/aix-ppc64": { 35 | "version": "0.21.5", 36 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 37 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 38 | "cpu": [ 39 | "ppc64" 40 | ], 41 | "dev": true, 42 | "license": "MIT", 43 | "optional": true, 44 | "os": [ 45 | "aix" 46 | ], 47 | "engines": { 48 | "node": ">=12" 49 | } 50 | }, 51 | "node_modules/@esbuild/android-arm": { 52 | "version": "0.21.5", 53 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 54 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 55 | "cpu": [ 56 | "arm" 57 | ], 58 | "dev": true, 59 | "license": "MIT", 60 | "optional": true, 61 | "os": [ 62 | "android" 63 | ], 64 | "engines": { 65 | "node": ">=12" 66 | } 67 | }, 68 | "node_modules/@esbuild/android-arm64": { 69 | "version": "0.21.5", 70 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 71 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 72 | "cpu": [ 73 | "arm64" 74 | ], 75 | "dev": true, 76 | "license": "MIT", 77 | "optional": true, 78 | "os": [ 79 | "android" 80 | ], 81 | "engines": { 82 | "node": ">=12" 83 | } 84 | }, 85 | "node_modules/@esbuild/android-x64": { 86 | "version": "0.21.5", 87 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 88 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 89 | "cpu": [ 90 | "x64" 91 | ], 92 | "dev": true, 93 | "license": "MIT", 94 | "optional": true, 95 | "os": [ 96 | "android" 97 | ], 98 | "engines": { 99 | "node": ">=12" 100 | } 101 | }, 102 | "node_modules/@esbuild/darwin-arm64": { 103 | "version": "0.21.5", 104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 105 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 106 | "cpu": [ 107 | "arm64" 108 | ], 109 | "dev": true, 110 | "license": "MIT", 111 | "optional": true, 112 | "os": [ 113 | "darwin" 114 | ], 115 | "engines": { 116 | "node": ">=12" 117 | } 118 | }, 119 | "node_modules/@esbuild/darwin-x64": { 120 | "version": "0.21.5", 121 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 122 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 123 | "cpu": [ 124 | "x64" 125 | ], 126 | "dev": true, 127 | "license": "MIT", 128 | "optional": true, 129 | "os": [ 130 | "darwin" 131 | ], 132 | "engines": { 133 | "node": ">=12" 134 | } 135 | }, 136 | "node_modules/@esbuild/freebsd-arm64": { 137 | "version": "0.21.5", 138 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 139 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 140 | "cpu": [ 141 | "arm64" 142 | ], 143 | "dev": true, 144 | "license": "MIT", 145 | "optional": true, 146 | "os": [ 147 | "freebsd" 148 | ], 149 | "engines": { 150 | "node": ">=12" 151 | } 152 | }, 153 | "node_modules/@esbuild/freebsd-x64": { 154 | "version": "0.21.5", 155 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 156 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 157 | "cpu": [ 158 | "x64" 159 | ], 160 | "dev": true, 161 | "license": "MIT", 162 | "optional": true, 163 | "os": [ 164 | "freebsd" 165 | ], 166 | "engines": { 167 | "node": ">=12" 168 | } 169 | }, 170 | "node_modules/@esbuild/linux-arm": { 171 | "version": "0.21.5", 172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 173 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 174 | "cpu": [ 175 | "arm" 176 | ], 177 | "dev": true, 178 | "license": "MIT", 179 | "optional": true, 180 | "os": [ 181 | "linux" 182 | ], 183 | "engines": { 184 | "node": ">=12" 185 | } 186 | }, 187 | "node_modules/@esbuild/linux-arm64": { 188 | "version": "0.21.5", 189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 190 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 191 | "cpu": [ 192 | "arm64" 193 | ], 194 | "dev": true, 195 | "license": "MIT", 196 | "optional": true, 197 | "os": [ 198 | "linux" 199 | ], 200 | "engines": { 201 | "node": ">=12" 202 | } 203 | }, 204 | "node_modules/@esbuild/linux-ia32": { 205 | "version": "0.21.5", 206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 207 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 208 | "cpu": [ 209 | "ia32" 210 | ], 211 | "dev": true, 212 | "license": "MIT", 213 | "optional": true, 214 | "os": [ 215 | "linux" 216 | ], 217 | "engines": { 218 | "node": ">=12" 219 | } 220 | }, 221 | "node_modules/@esbuild/linux-loong64": { 222 | "version": "0.21.5", 223 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 224 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 225 | "cpu": [ 226 | "loong64" 227 | ], 228 | "dev": true, 229 | "license": "MIT", 230 | "optional": true, 231 | "os": [ 232 | "linux" 233 | ], 234 | "engines": { 235 | "node": ">=12" 236 | } 237 | }, 238 | "node_modules/@esbuild/linux-mips64el": { 239 | "version": "0.21.5", 240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 241 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 242 | "cpu": [ 243 | "mips64el" 244 | ], 245 | "dev": true, 246 | "license": "MIT", 247 | "optional": true, 248 | "os": [ 249 | "linux" 250 | ], 251 | "engines": { 252 | "node": ">=12" 253 | } 254 | }, 255 | "node_modules/@esbuild/linux-ppc64": { 256 | "version": "0.21.5", 257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 258 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 259 | "cpu": [ 260 | "ppc64" 261 | ], 262 | "dev": true, 263 | "license": "MIT", 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=12" 270 | } 271 | }, 272 | "node_modules/@esbuild/linux-riscv64": { 273 | "version": "0.21.5", 274 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 275 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 276 | "cpu": [ 277 | "riscv64" 278 | ], 279 | "dev": true, 280 | "license": "MIT", 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/linux-s390x": { 290 | "version": "0.21.5", 291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 292 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 293 | "cpu": [ 294 | "s390x" 295 | ], 296 | "dev": true, 297 | "license": "MIT", 298 | "optional": true, 299 | "os": [ 300 | "linux" 301 | ], 302 | "engines": { 303 | "node": ">=12" 304 | } 305 | }, 306 | "node_modules/@esbuild/linux-x64": { 307 | "version": "0.21.5", 308 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 309 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 310 | "cpu": [ 311 | "x64" 312 | ], 313 | "dev": true, 314 | "license": "MIT", 315 | "optional": true, 316 | "os": [ 317 | "linux" 318 | ], 319 | "engines": { 320 | "node": ">=12" 321 | } 322 | }, 323 | "node_modules/@esbuild/netbsd-x64": { 324 | "version": "0.21.5", 325 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 326 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 327 | "cpu": [ 328 | "x64" 329 | ], 330 | "dev": true, 331 | "license": "MIT", 332 | "optional": true, 333 | "os": [ 334 | "netbsd" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/@esbuild/openbsd-x64": { 341 | "version": "0.21.5", 342 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 343 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 344 | "cpu": [ 345 | "x64" 346 | ], 347 | "dev": true, 348 | "license": "MIT", 349 | "optional": true, 350 | "os": [ 351 | "openbsd" 352 | ], 353 | "engines": { 354 | "node": ">=12" 355 | } 356 | }, 357 | "node_modules/@esbuild/sunos-x64": { 358 | "version": "0.21.5", 359 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 360 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 361 | "cpu": [ 362 | "x64" 363 | ], 364 | "dev": true, 365 | "license": "MIT", 366 | "optional": true, 367 | "os": [ 368 | "sunos" 369 | ], 370 | "engines": { 371 | "node": ">=12" 372 | } 373 | }, 374 | "node_modules/@esbuild/win32-arm64": { 375 | "version": "0.21.5", 376 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 377 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 378 | "cpu": [ 379 | "arm64" 380 | ], 381 | "dev": true, 382 | "license": "MIT", 383 | "optional": true, 384 | "os": [ 385 | "win32" 386 | ], 387 | "engines": { 388 | "node": ">=12" 389 | } 390 | }, 391 | "node_modules/@esbuild/win32-ia32": { 392 | "version": "0.21.5", 393 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 394 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 395 | "cpu": [ 396 | "ia32" 397 | ], 398 | "dev": true, 399 | "license": "MIT", 400 | "optional": true, 401 | "os": [ 402 | "win32" 403 | ], 404 | "engines": { 405 | "node": ">=12" 406 | } 407 | }, 408 | "node_modules/@esbuild/win32-x64": { 409 | "version": "0.21.5", 410 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 411 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 412 | "cpu": [ 413 | "x64" 414 | ], 415 | "dev": true, 416 | "license": "MIT", 417 | "optional": true, 418 | "os": [ 419 | "win32" 420 | ], 421 | "engines": { 422 | "node": ">=12" 423 | } 424 | }, 425 | "node_modules/@fontsource/fira-mono": { 426 | "version": "4.5.10", 427 | "resolved": "https://registry.npmjs.org/@fontsource/fira-mono/-/fira-mono-4.5.10.tgz", 428 | "integrity": "sha512-bxUnRP8xptGRo8YXeY073DSpfK74XpSb0ZyRNpHV9WvLnJ7TwPOjZll8hTMin7zLC6iOp59pDZ8EQDj1gzgAQQ==", 429 | "dev": true, 430 | "license": "MIT" 431 | }, 432 | "node_modules/@jridgewell/gen-mapping": { 433 | "version": "0.3.8", 434 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 435 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 436 | "dev": true, 437 | "license": "MIT", 438 | "dependencies": { 439 | "@jridgewell/set-array": "^1.2.1", 440 | "@jridgewell/sourcemap-codec": "^1.4.10", 441 | "@jridgewell/trace-mapping": "^0.3.24" 442 | }, 443 | "engines": { 444 | "node": ">=6.0.0" 445 | } 446 | }, 447 | "node_modules/@jridgewell/resolve-uri": { 448 | "version": "3.1.2", 449 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 450 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 451 | "dev": true, 452 | "license": "MIT", 453 | "engines": { 454 | "node": ">=6.0.0" 455 | } 456 | }, 457 | "node_modules/@jridgewell/set-array": { 458 | "version": "1.2.1", 459 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 460 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 461 | "dev": true, 462 | "license": "MIT", 463 | "engines": { 464 | "node": ">=6.0.0" 465 | } 466 | }, 467 | "node_modules/@jridgewell/sourcemap-codec": { 468 | "version": "1.5.0", 469 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 470 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 471 | "dev": true, 472 | "license": "MIT" 473 | }, 474 | "node_modules/@jridgewell/trace-mapping": { 475 | "version": "0.3.25", 476 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 477 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 478 | "dev": true, 479 | "license": "MIT", 480 | "dependencies": { 481 | "@jridgewell/resolve-uri": "^3.1.0", 482 | "@jridgewell/sourcemap-codec": "^1.4.14" 483 | } 484 | }, 485 | "node_modules/@neoconfetti/svelte": { 486 | "version": "1.0.0", 487 | "resolved": "https://registry.npmjs.org/@neoconfetti/svelte/-/svelte-1.0.0.tgz", 488 | "integrity": "sha512-SmksyaJAdSlMa9cTidVSIqYo1qti+WTsviNDwgjNVm+KQ3DRP2Df9umDIzC4vCcpEYY+chQe0i2IKnLw03AT8Q==", 489 | "dev": true, 490 | "license": "MIT" 491 | }, 492 | "node_modules/@polka/url": { 493 | "version": "1.0.0-next.28", 494 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", 495 | "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", 496 | "dev": true, 497 | "license": "MIT" 498 | }, 499 | "node_modules/@rollup/plugin-commonjs": { 500 | "version": "28.0.2", 501 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", 502 | "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", 503 | "dev": true, 504 | "license": "MIT", 505 | "dependencies": { 506 | "@rollup/pluginutils": "^5.0.1", 507 | "commondir": "^1.0.1", 508 | "estree-walker": "^2.0.2", 509 | "fdir": "^6.2.0", 510 | "is-reference": "1.2.1", 511 | "magic-string": "^0.30.3", 512 | "picomatch": "^4.0.2" 513 | }, 514 | "engines": { 515 | "node": ">=16.0.0 || 14 >= 14.17" 516 | }, 517 | "peerDependencies": { 518 | "rollup": "^2.68.0||^3.0.0||^4.0.0" 519 | }, 520 | "peerDependenciesMeta": { 521 | "rollup": { 522 | "optional": true 523 | } 524 | } 525 | }, 526 | "node_modules/@rollup/plugin-json": { 527 | "version": "6.1.0", 528 | "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", 529 | "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", 530 | "dev": true, 531 | "license": "MIT", 532 | "dependencies": { 533 | "@rollup/pluginutils": "^5.1.0" 534 | }, 535 | "engines": { 536 | "node": ">=14.0.0" 537 | }, 538 | "peerDependencies": { 539 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 540 | }, 541 | "peerDependenciesMeta": { 542 | "rollup": { 543 | "optional": true 544 | } 545 | } 546 | }, 547 | "node_modules/@rollup/plugin-node-resolve": { 548 | "version": "16.0.0", 549 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", 550 | "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", 551 | "dev": true, 552 | "license": "MIT", 553 | "dependencies": { 554 | "@rollup/pluginutils": "^5.0.1", 555 | "@types/resolve": "1.20.2", 556 | "deepmerge": "^4.2.2", 557 | "is-module": "^1.0.0", 558 | "resolve": "^1.22.1" 559 | }, 560 | "engines": { 561 | "node": ">=14.0.0" 562 | }, 563 | "peerDependencies": { 564 | "rollup": "^2.78.0||^3.0.0||^4.0.0" 565 | }, 566 | "peerDependenciesMeta": { 567 | "rollup": { 568 | "optional": true 569 | } 570 | } 571 | }, 572 | "node_modules/@rollup/pluginutils": { 573 | "version": "5.1.4", 574 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", 575 | "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", 576 | "dev": true, 577 | "license": "MIT", 578 | "dependencies": { 579 | "@types/estree": "^1.0.0", 580 | "estree-walker": "^2.0.2", 581 | "picomatch": "^4.0.2" 582 | }, 583 | "engines": { 584 | "node": ">=14.0.0" 585 | }, 586 | "peerDependencies": { 587 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 588 | }, 589 | "peerDependenciesMeta": { 590 | "rollup": { 591 | "optional": true 592 | } 593 | } 594 | }, 595 | "node_modules/@rollup/rollup-android-arm-eabi": { 596 | "version": "4.34.8", 597 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", 598 | "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", 599 | "cpu": [ 600 | "arm" 601 | ], 602 | "dev": true, 603 | "license": "MIT", 604 | "optional": true, 605 | "os": [ 606 | "android" 607 | ] 608 | }, 609 | "node_modules/@rollup/rollup-android-arm64": { 610 | "version": "4.34.8", 611 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", 612 | "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", 613 | "cpu": [ 614 | "arm64" 615 | ], 616 | "dev": true, 617 | "license": "MIT", 618 | "optional": true, 619 | "os": [ 620 | "android" 621 | ] 622 | }, 623 | "node_modules/@rollup/rollup-darwin-arm64": { 624 | "version": "4.34.8", 625 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", 626 | "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", 627 | "cpu": [ 628 | "arm64" 629 | ], 630 | "dev": true, 631 | "license": "MIT", 632 | "optional": true, 633 | "os": [ 634 | "darwin" 635 | ] 636 | }, 637 | "node_modules/@rollup/rollup-darwin-x64": { 638 | "version": "4.34.8", 639 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", 640 | "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", 641 | "cpu": [ 642 | "x64" 643 | ], 644 | "dev": true, 645 | "license": "MIT", 646 | "optional": true, 647 | "os": [ 648 | "darwin" 649 | ] 650 | }, 651 | "node_modules/@rollup/rollup-freebsd-arm64": { 652 | "version": "4.34.8", 653 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", 654 | "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", 655 | "cpu": [ 656 | "arm64" 657 | ], 658 | "dev": true, 659 | "license": "MIT", 660 | "optional": true, 661 | "os": [ 662 | "freebsd" 663 | ] 664 | }, 665 | "node_modules/@rollup/rollup-freebsd-x64": { 666 | "version": "4.34.8", 667 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", 668 | "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", 669 | "cpu": [ 670 | "x64" 671 | ], 672 | "dev": true, 673 | "license": "MIT", 674 | "optional": true, 675 | "os": [ 676 | "freebsd" 677 | ] 678 | }, 679 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 680 | "version": "4.34.8", 681 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", 682 | "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", 683 | "cpu": [ 684 | "arm" 685 | ], 686 | "dev": true, 687 | "license": "MIT", 688 | "optional": true, 689 | "os": [ 690 | "linux" 691 | ] 692 | }, 693 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 694 | "version": "4.34.8", 695 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", 696 | "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", 697 | "cpu": [ 698 | "arm" 699 | ], 700 | "dev": true, 701 | "license": "MIT", 702 | "optional": true, 703 | "os": [ 704 | "linux" 705 | ] 706 | }, 707 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 708 | "version": "4.34.8", 709 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", 710 | "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", 711 | "cpu": [ 712 | "arm64" 713 | ], 714 | "dev": true, 715 | "license": "MIT", 716 | "optional": true, 717 | "os": [ 718 | "linux" 719 | ] 720 | }, 721 | "node_modules/@rollup/rollup-linux-arm64-musl": { 722 | "version": "4.34.8", 723 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", 724 | "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", 725 | "cpu": [ 726 | "arm64" 727 | ], 728 | "dev": true, 729 | "license": "MIT", 730 | "optional": true, 731 | "os": [ 732 | "linux" 733 | ] 734 | }, 735 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 736 | "version": "4.34.8", 737 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", 738 | "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", 739 | "cpu": [ 740 | "loong64" 741 | ], 742 | "dev": true, 743 | "license": "MIT", 744 | "optional": true, 745 | "os": [ 746 | "linux" 747 | ] 748 | }, 749 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 750 | "version": "4.34.8", 751 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", 752 | "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", 753 | "cpu": [ 754 | "ppc64" 755 | ], 756 | "dev": true, 757 | "license": "MIT", 758 | "optional": true, 759 | "os": [ 760 | "linux" 761 | ] 762 | }, 763 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 764 | "version": "4.34.8", 765 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", 766 | "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", 767 | "cpu": [ 768 | "riscv64" 769 | ], 770 | "dev": true, 771 | "license": "MIT", 772 | "optional": true, 773 | "os": [ 774 | "linux" 775 | ] 776 | }, 777 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 778 | "version": "4.34.8", 779 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", 780 | "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", 781 | "cpu": [ 782 | "s390x" 783 | ], 784 | "dev": true, 785 | "license": "MIT", 786 | "optional": true, 787 | "os": [ 788 | "linux" 789 | ] 790 | }, 791 | "node_modules/@rollup/rollup-linux-x64-gnu": { 792 | "version": "4.34.8", 793 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", 794 | "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", 795 | "cpu": [ 796 | "x64" 797 | ], 798 | "dev": true, 799 | "license": "MIT", 800 | "optional": true, 801 | "os": [ 802 | "linux" 803 | ] 804 | }, 805 | "node_modules/@rollup/rollup-linux-x64-musl": { 806 | "version": "4.34.8", 807 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", 808 | "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", 809 | "cpu": [ 810 | "x64" 811 | ], 812 | "dev": true, 813 | "license": "MIT", 814 | "optional": true, 815 | "os": [ 816 | "linux" 817 | ] 818 | }, 819 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 820 | "version": "4.34.8", 821 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", 822 | "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", 823 | "cpu": [ 824 | "arm64" 825 | ], 826 | "dev": true, 827 | "license": "MIT", 828 | "optional": true, 829 | "os": [ 830 | "win32" 831 | ] 832 | }, 833 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 834 | "version": "4.34.8", 835 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", 836 | "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", 837 | "cpu": [ 838 | "ia32" 839 | ], 840 | "dev": true, 841 | "license": "MIT", 842 | "optional": true, 843 | "os": [ 844 | "win32" 845 | ] 846 | }, 847 | "node_modules/@rollup/rollup-win32-x64-msvc": { 848 | "version": "4.34.8", 849 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", 850 | "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", 851 | "cpu": [ 852 | "x64" 853 | ], 854 | "dev": true, 855 | "license": "MIT", 856 | "optional": true, 857 | "os": [ 858 | "win32" 859 | ] 860 | }, 861 | "node_modules/@sveltejs/adapter-node": { 862 | "version": "5.2.12", 863 | "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.2.12.tgz", 864 | "integrity": "sha512-0bp4Yb3jKIEcZWVcJC/L1xXp9zzJS4hDwfb4VITAkfT4OVdkspSHsx7YhqJDbb2hgLl6R9Vs7VQR+fqIVOxPUQ==", 865 | "dev": true, 866 | "license": "MIT", 867 | "dependencies": { 868 | "@rollup/plugin-commonjs": "^28.0.1", 869 | "@rollup/plugin-json": "^6.1.0", 870 | "@rollup/plugin-node-resolve": "^16.0.0", 871 | "rollup": "^4.9.5" 872 | }, 873 | "peerDependencies": { 874 | "@sveltejs/kit": "^2.4.0" 875 | } 876 | }, 877 | "node_modules/@sveltejs/kit": { 878 | "version": "2.17.2", 879 | "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.17.2.tgz", 880 | "integrity": "sha512-Vypk02baf7qd3SOB1uUwUC/3Oka+srPo2J0a8YN3EfJypRshDkNx9HzNKjSmhOnGWwT+SSO06+N0mAb8iVTmTQ==", 881 | "dev": true, 882 | "license": "MIT", 883 | "dependencies": { 884 | "@types/cookie": "^0.6.0", 885 | "cookie": "^0.6.0", 886 | "devalue": "^5.1.0", 887 | "esm-env": "^1.2.2", 888 | "import-meta-resolve": "^4.1.0", 889 | "kleur": "^4.1.5", 890 | "magic-string": "^0.30.5", 891 | "mrmime": "^2.0.0", 892 | "sade": "^1.8.1", 893 | "set-cookie-parser": "^2.6.0", 894 | "sirv": "^3.0.0" 895 | }, 896 | "bin": { 897 | "svelte-kit": "svelte-kit.js" 898 | }, 899 | "engines": { 900 | "node": ">=18.13" 901 | }, 902 | "peerDependencies": { 903 | "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", 904 | "svelte": "^4.0.0 || ^5.0.0-next.0", 905 | "vite": "^5.0.3 || ^6.0.0" 906 | } 907 | }, 908 | "node_modules/@sveltejs/vite-plugin-svelte": { 909 | "version": "4.0.4", 910 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.4.tgz", 911 | "integrity": "sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA==", 912 | "dev": true, 913 | "license": "MIT", 914 | "dependencies": { 915 | "@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0", 916 | "debug": "^4.3.7", 917 | "deepmerge": "^4.3.1", 918 | "kleur": "^4.1.5", 919 | "magic-string": "^0.30.12", 920 | "vitefu": "^1.0.3" 921 | }, 922 | "engines": { 923 | "node": "^18.0.0 || ^20.0.0 || >=22" 924 | }, 925 | "peerDependencies": { 926 | "svelte": "^5.0.0-next.96 || ^5.0.0", 927 | "vite": "^5.0.0" 928 | } 929 | }, 930 | "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 931 | "version": "3.0.1", 932 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-3.0.1.tgz", 933 | "integrity": "sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==", 934 | "dev": true, 935 | "license": "MIT", 936 | "dependencies": { 937 | "debug": "^4.3.7" 938 | }, 939 | "engines": { 940 | "node": "^18.0.0 || ^20.0.0 || >=22" 941 | }, 942 | "peerDependencies": { 943 | "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0||^4.0.0", 944 | "svelte": "^5.0.0-next.96 || ^5.0.0", 945 | "vite": "^5.0.0" 946 | } 947 | }, 948 | "node_modules/@types/cookie": { 949 | "version": "0.6.0", 950 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", 951 | "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", 952 | "dev": true, 953 | "license": "MIT" 954 | }, 955 | "node_modules/@types/estree": { 956 | "version": "1.0.6", 957 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 958 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 959 | "dev": true, 960 | "license": "MIT" 961 | }, 962 | "node_modules/@types/resolve": { 963 | "version": "1.20.2", 964 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 965 | "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", 966 | "dev": true, 967 | "license": "MIT" 968 | }, 969 | "node_modules/acorn": { 970 | "version": "8.14.0", 971 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 972 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 973 | "dev": true, 974 | "license": "MIT", 975 | "bin": { 976 | "acorn": "bin/acorn" 977 | }, 978 | "engines": { 979 | "node": ">=0.4.0" 980 | } 981 | }, 982 | "node_modules/acorn-typescript": { 983 | "version": "1.4.13", 984 | "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", 985 | "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", 986 | "dev": true, 987 | "license": "MIT", 988 | "peerDependencies": { 989 | "acorn": ">=8.9.0" 990 | } 991 | }, 992 | "node_modules/aria-query": { 993 | "version": "5.3.2", 994 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", 995 | "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", 996 | "dev": true, 997 | "license": "Apache-2.0", 998 | "engines": { 999 | "node": ">= 0.4" 1000 | } 1001 | }, 1002 | "node_modules/axobject-query": { 1003 | "version": "4.1.0", 1004 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", 1005 | "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", 1006 | "dev": true, 1007 | "license": "Apache-2.0", 1008 | "engines": { 1009 | "node": ">= 0.4" 1010 | } 1011 | }, 1012 | "node_modules/chokidar": { 1013 | "version": "4.0.3", 1014 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 1015 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1016 | "dev": true, 1017 | "license": "MIT", 1018 | "dependencies": { 1019 | "readdirp": "^4.0.1" 1020 | }, 1021 | "engines": { 1022 | "node": ">= 14.16.0" 1023 | }, 1024 | "funding": { 1025 | "url": "https://paulmillr.com/funding/" 1026 | } 1027 | }, 1028 | "node_modules/clsx": { 1029 | "version": "2.1.1", 1030 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 1031 | "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 1032 | "dev": true, 1033 | "license": "MIT", 1034 | "engines": { 1035 | "node": ">=6" 1036 | } 1037 | }, 1038 | "node_modules/commondir": { 1039 | "version": "1.0.1", 1040 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 1041 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 1042 | "dev": true, 1043 | "license": "MIT" 1044 | }, 1045 | "node_modules/cookie": { 1046 | "version": "0.6.0", 1047 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 1048 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 1049 | "dev": true, 1050 | "license": "MIT", 1051 | "engines": { 1052 | "node": ">= 0.6" 1053 | } 1054 | }, 1055 | "node_modules/debug": { 1056 | "version": "4.4.0", 1057 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1058 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1059 | "dev": true, 1060 | "license": "MIT", 1061 | "dependencies": { 1062 | "ms": "^2.1.3" 1063 | }, 1064 | "engines": { 1065 | "node": ">=6.0" 1066 | }, 1067 | "peerDependenciesMeta": { 1068 | "supports-color": { 1069 | "optional": true 1070 | } 1071 | } 1072 | }, 1073 | "node_modules/deepmerge": { 1074 | "version": "4.3.1", 1075 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 1076 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 1077 | "dev": true, 1078 | "license": "MIT", 1079 | "engines": { 1080 | "node": ">=0.10.0" 1081 | } 1082 | }, 1083 | "node_modules/devalue": { 1084 | "version": "5.1.1", 1085 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", 1086 | "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", 1087 | "dev": true, 1088 | "license": "MIT" 1089 | }, 1090 | "node_modules/esbuild": { 1091 | "version": "0.21.5", 1092 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 1093 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 1094 | "dev": true, 1095 | "hasInstallScript": true, 1096 | "license": "MIT", 1097 | "bin": { 1098 | "esbuild": "bin/esbuild" 1099 | }, 1100 | "engines": { 1101 | "node": ">=12" 1102 | }, 1103 | "optionalDependencies": { 1104 | "@esbuild/aix-ppc64": "0.21.5", 1105 | "@esbuild/android-arm": "0.21.5", 1106 | "@esbuild/android-arm64": "0.21.5", 1107 | "@esbuild/android-x64": "0.21.5", 1108 | "@esbuild/darwin-arm64": "0.21.5", 1109 | "@esbuild/darwin-x64": "0.21.5", 1110 | "@esbuild/freebsd-arm64": "0.21.5", 1111 | "@esbuild/freebsd-x64": "0.21.5", 1112 | "@esbuild/linux-arm": "0.21.5", 1113 | "@esbuild/linux-arm64": "0.21.5", 1114 | "@esbuild/linux-ia32": "0.21.5", 1115 | "@esbuild/linux-loong64": "0.21.5", 1116 | "@esbuild/linux-mips64el": "0.21.5", 1117 | "@esbuild/linux-ppc64": "0.21.5", 1118 | "@esbuild/linux-riscv64": "0.21.5", 1119 | "@esbuild/linux-s390x": "0.21.5", 1120 | "@esbuild/linux-x64": "0.21.5", 1121 | "@esbuild/netbsd-x64": "0.21.5", 1122 | "@esbuild/openbsd-x64": "0.21.5", 1123 | "@esbuild/sunos-x64": "0.21.5", 1124 | "@esbuild/win32-arm64": "0.21.5", 1125 | "@esbuild/win32-ia32": "0.21.5", 1126 | "@esbuild/win32-x64": "0.21.5" 1127 | } 1128 | }, 1129 | "node_modules/esm-env": { 1130 | "version": "1.2.2", 1131 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", 1132 | "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", 1133 | "dev": true, 1134 | "license": "MIT" 1135 | }, 1136 | "node_modules/esrap": { 1137 | "version": "1.4.5", 1138 | "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.5.tgz", 1139 | "integrity": "sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g==", 1140 | "dev": true, 1141 | "license": "MIT", 1142 | "dependencies": { 1143 | "@jridgewell/sourcemap-codec": "^1.4.15" 1144 | } 1145 | }, 1146 | "node_modules/estree-walker": { 1147 | "version": "2.0.2", 1148 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1149 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1150 | "dev": true, 1151 | "license": "MIT" 1152 | }, 1153 | "node_modules/fdir": { 1154 | "version": "6.4.3", 1155 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", 1156 | "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", 1157 | "dev": true, 1158 | "license": "MIT", 1159 | "peerDependencies": { 1160 | "picomatch": "^3 || ^4" 1161 | }, 1162 | "peerDependenciesMeta": { 1163 | "picomatch": { 1164 | "optional": true 1165 | } 1166 | } 1167 | }, 1168 | "node_modules/fsevents": { 1169 | "version": "2.3.3", 1170 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1171 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1172 | "dev": true, 1173 | "hasInstallScript": true, 1174 | "license": "MIT", 1175 | "optional": true, 1176 | "os": [ 1177 | "darwin" 1178 | ], 1179 | "engines": { 1180 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1181 | } 1182 | }, 1183 | "node_modules/function-bind": { 1184 | "version": "1.1.2", 1185 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1186 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1187 | "dev": true, 1188 | "license": "MIT", 1189 | "funding": { 1190 | "url": "https://github.com/sponsors/ljharb" 1191 | } 1192 | }, 1193 | "node_modules/hasown": { 1194 | "version": "2.0.2", 1195 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1196 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1197 | "dev": true, 1198 | "license": "MIT", 1199 | "dependencies": { 1200 | "function-bind": "^1.1.2" 1201 | }, 1202 | "engines": { 1203 | "node": ">= 0.4" 1204 | } 1205 | }, 1206 | "node_modules/import-meta-resolve": { 1207 | "version": "4.1.0", 1208 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", 1209 | "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", 1210 | "dev": true, 1211 | "license": "MIT", 1212 | "funding": { 1213 | "type": "github", 1214 | "url": "https://github.com/sponsors/wooorm" 1215 | } 1216 | }, 1217 | "node_modules/is-core-module": { 1218 | "version": "2.16.1", 1219 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 1220 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 1221 | "dev": true, 1222 | "license": "MIT", 1223 | "dependencies": { 1224 | "hasown": "^2.0.2" 1225 | }, 1226 | "engines": { 1227 | "node": ">= 0.4" 1228 | }, 1229 | "funding": { 1230 | "url": "https://github.com/sponsors/ljharb" 1231 | } 1232 | }, 1233 | "node_modules/is-module": { 1234 | "version": "1.0.0", 1235 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1236 | "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", 1237 | "dev": true, 1238 | "license": "MIT" 1239 | }, 1240 | "node_modules/is-reference": { 1241 | "version": "1.2.1", 1242 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 1243 | "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 1244 | "dev": true, 1245 | "license": "MIT", 1246 | "dependencies": { 1247 | "@types/estree": "*" 1248 | } 1249 | }, 1250 | "node_modules/kleur": { 1251 | "version": "4.1.5", 1252 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1253 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1254 | "dev": true, 1255 | "license": "MIT", 1256 | "engines": { 1257 | "node": ">=6" 1258 | } 1259 | }, 1260 | "node_modules/locate-character": { 1261 | "version": "3.0.0", 1262 | "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 1263 | "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", 1264 | "dev": true, 1265 | "license": "MIT" 1266 | }, 1267 | "node_modules/magic-string": { 1268 | "version": "0.30.17", 1269 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1270 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1271 | "dev": true, 1272 | "license": "MIT", 1273 | "dependencies": { 1274 | "@jridgewell/sourcemap-codec": "^1.5.0" 1275 | } 1276 | }, 1277 | "node_modules/mri": { 1278 | "version": "1.2.0", 1279 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1280 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1281 | "dev": true, 1282 | "license": "MIT", 1283 | "engines": { 1284 | "node": ">=4" 1285 | } 1286 | }, 1287 | "node_modules/mrmime": { 1288 | "version": "2.0.1", 1289 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", 1290 | "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", 1291 | "dev": true, 1292 | "license": "MIT", 1293 | "engines": { 1294 | "node": ">=10" 1295 | } 1296 | }, 1297 | "node_modules/ms": { 1298 | "version": "2.1.3", 1299 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1300 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1301 | "dev": true, 1302 | "license": "MIT" 1303 | }, 1304 | "node_modules/nanoid": { 1305 | "version": "3.3.8", 1306 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 1307 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 1308 | "dev": true, 1309 | "funding": [ 1310 | { 1311 | "type": "github", 1312 | "url": "https://github.com/sponsors/ai" 1313 | } 1314 | ], 1315 | "license": "MIT", 1316 | "bin": { 1317 | "nanoid": "bin/nanoid.cjs" 1318 | }, 1319 | "engines": { 1320 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1321 | } 1322 | }, 1323 | "node_modules/path-parse": { 1324 | "version": "1.0.7", 1325 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1326 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1327 | "dev": true, 1328 | "license": "MIT" 1329 | }, 1330 | "node_modules/picocolors": { 1331 | "version": "1.1.1", 1332 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1333 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1334 | "dev": true, 1335 | "license": "ISC" 1336 | }, 1337 | "node_modules/picomatch": { 1338 | "version": "4.0.2", 1339 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1340 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1341 | "dev": true, 1342 | "license": "MIT", 1343 | "engines": { 1344 | "node": ">=12" 1345 | }, 1346 | "funding": { 1347 | "url": "https://github.com/sponsors/jonschlinkert" 1348 | } 1349 | }, 1350 | "node_modules/postcss": { 1351 | "version": "8.5.3", 1352 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1353 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1354 | "dev": true, 1355 | "funding": [ 1356 | { 1357 | "type": "opencollective", 1358 | "url": "https://opencollective.com/postcss/" 1359 | }, 1360 | { 1361 | "type": "tidelift", 1362 | "url": "https://tidelift.com/funding/github/npm/postcss" 1363 | }, 1364 | { 1365 | "type": "github", 1366 | "url": "https://github.com/sponsors/ai" 1367 | } 1368 | ], 1369 | "license": "MIT", 1370 | "dependencies": { 1371 | "nanoid": "^3.3.8", 1372 | "picocolors": "^1.1.1", 1373 | "source-map-js": "^1.2.1" 1374 | }, 1375 | "engines": { 1376 | "node": "^10 || ^12 || >=14" 1377 | } 1378 | }, 1379 | "node_modules/readdirp": { 1380 | "version": "4.1.2", 1381 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 1382 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 1383 | "dev": true, 1384 | "license": "MIT", 1385 | "engines": { 1386 | "node": ">= 14.18.0" 1387 | }, 1388 | "funding": { 1389 | "type": "individual", 1390 | "url": "https://paulmillr.com/funding/" 1391 | } 1392 | }, 1393 | "node_modules/resolve": { 1394 | "version": "1.22.10", 1395 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1396 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1397 | "dev": true, 1398 | "license": "MIT", 1399 | "dependencies": { 1400 | "is-core-module": "^2.16.0", 1401 | "path-parse": "^1.0.7", 1402 | "supports-preserve-symlinks-flag": "^1.0.0" 1403 | }, 1404 | "bin": { 1405 | "resolve": "bin/resolve" 1406 | }, 1407 | "engines": { 1408 | "node": ">= 0.4" 1409 | }, 1410 | "funding": { 1411 | "url": "https://github.com/sponsors/ljharb" 1412 | } 1413 | }, 1414 | "node_modules/rollup": { 1415 | "version": "4.34.8", 1416 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", 1417 | "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", 1418 | "dev": true, 1419 | "license": "MIT", 1420 | "dependencies": { 1421 | "@types/estree": "1.0.6" 1422 | }, 1423 | "bin": { 1424 | "rollup": "dist/bin/rollup" 1425 | }, 1426 | "engines": { 1427 | "node": ">=18.0.0", 1428 | "npm": ">=8.0.0" 1429 | }, 1430 | "optionalDependencies": { 1431 | "@rollup/rollup-android-arm-eabi": "4.34.8", 1432 | "@rollup/rollup-android-arm64": "4.34.8", 1433 | "@rollup/rollup-darwin-arm64": "4.34.8", 1434 | "@rollup/rollup-darwin-x64": "4.34.8", 1435 | "@rollup/rollup-freebsd-arm64": "4.34.8", 1436 | "@rollup/rollup-freebsd-x64": "4.34.8", 1437 | "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", 1438 | "@rollup/rollup-linux-arm-musleabihf": "4.34.8", 1439 | "@rollup/rollup-linux-arm64-gnu": "4.34.8", 1440 | "@rollup/rollup-linux-arm64-musl": "4.34.8", 1441 | "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", 1442 | "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", 1443 | "@rollup/rollup-linux-riscv64-gnu": "4.34.8", 1444 | "@rollup/rollup-linux-s390x-gnu": "4.34.8", 1445 | "@rollup/rollup-linux-x64-gnu": "4.34.8", 1446 | "@rollup/rollup-linux-x64-musl": "4.34.8", 1447 | "@rollup/rollup-win32-arm64-msvc": "4.34.8", 1448 | "@rollup/rollup-win32-ia32-msvc": "4.34.8", 1449 | "@rollup/rollup-win32-x64-msvc": "4.34.8", 1450 | "fsevents": "~2.3.2" 1451 | } 1452 | }, 1453 | "node_modules/sade": { 1454 | "version": "1.8.1", 1455 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1456 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1457 | "dev": true, 1458 | "license": "MIT", 1459 | "dependencies": { 1460 | "mri": "^1.1.0" 1461 | }, 1462 | "engines": { 1463 | "node": ">=6" 1464 | } 1465 | }, 1466 | "node_modules/set-cookie-parser": { 1467 | "version": "2.7.1", 1468 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", 1469 | "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", 1470 | "dev": true, 1471 | "license": "MIT" 1472 | }, 1473 | "node_modules/sirv": { 1474 | "version": "3.0.1", 1475 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", 1476 | "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", 1477 | "dev": true, 1478 | "license": "MIT", 1479 | "dependencies": { 1480 | "@polka/url": "^1.0.0-next.24", 1481 | "mrmime": "^2.0.0", 1482 | "totalist": "^3.0.0" 1483 | }, 1484 | "engines": { 1485 | "node": ">=18" 1486 | } 1487 | }, 1488 | "node_modules/source-map-js": { 1489 | "version": "1.2.1", 1490 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1491 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1492 | "dev": true, 1493 | "license": "BSD-3-Clause", 1494 | "engines": { 1495 | "node": ">=0.10.0" 1496 | } 1497 | }, 1498 | "node_modules/supports-preserve-symlinks-flag": { 1499 | "version": "1.0.0", 1500 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1501 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1502 | "dev": true, 1503 | "license": "MIT", 1504 | "engines": { 1505 | "node": ">= 0.4" 1506 | }, 1507 | "funding": { 1508 | "url": "https://github.com/sponsors/ljharb" 1509 | } 1510 | }, 1511 | "node_modules/svelte": { 1512 | "version": "5.20.2", 1513 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.20.2.tgz", 1514 | "integrity": "sha512-aYXJreNUiyTob0QOzRZeBXZMGeFZDch6SrSRV8QTncZb6zj0O3BEdUzPpojuHQ1pTvk+KX7I6rZCXPUf8pTPxA==", 1515 | "dev": true, 1516 | "license": "MIT", 1517 | "dependencies": { 1518 | "@ampproject/remapping": "^2.3.0", 1519 | "@jridgewell/sourcemap-codec": "^1.5.0", 1520 | "@types/estree": "^1.0.5", 1521 | "acorn": "^8.12.1", 1522 | "acorn-typescript": "^1.4.13", 1523 | "aria-query": "^5.3.1", 1524 | "axobject-query": "^4.1.0", 1525 | "clsx": "^2.1.1", 1526 | "esm-env": "^1.2.1", 1527 | "esrap": "^1.4.3", 1528 | "is-reference": "^3.0.3", 1529 | "locate-character": "^3.0.0", 1530 | "magic-string": "^0.30.11", 1531 | "zimmerframe": "^1.1.2" 1532 | }, 1533 | "engines": { 1534 | "node": ">=18" 1535 | } 1536 | }, 1537 | "node_modules/svelte-check": { 1538 | "version": "4.1.4", 1539 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.4.tgz", 1540 | "integrity": "sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==", 1541 | "dev": true, 1542 | "license": "MIT", 1543 | "dependencies": { 1544 | "@jridgewell/trace-mapping": "^0.3.25", 1545 | "chokidar": "^4.0.1", 1546 | "fdir": "^6.2.0", 1547 | "picocolors": "^1.0.0", 1548 | "sade": "^1.7.4" 1549 | }, 1550 | "bin": { 1551 | "svelte-check": "bin/svelte-check" 1552 | }, 1553 | "engines": { 1554 | "node": ">= 18.0.0" 1555 | }, 1556 | "peerDependencies": { 1557 | "svelte": "^4.0.0 || ^5.0.0-next.0", 1558 | "typescript": ">=5.0.0" 1559 | } 1560 | }, 1561 | "node_modules/svelte/node_modules/is-reference": { 1562 | "version": "3.0.3", 1563 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", 1564 | "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", 1565 | "dev": true, 1566 | "license": "MIT", 1567 | "dependencies": { 1568 | "@types/estree": "^1.0.6" 1569 | } 1570 | }, 1571 | "node_modules/totalist": { 1572 | "version": "3.0.1", 1573 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 1574 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 1575 | "dev": true, 1576 | "license": "MIT", 1577 | "engines": { 1578 | "node": ">=6" 1579 | } 1580 | }, 1581 | "node_modules/typescript": { 1582 | "version": "5.7.3", 1583 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 1584 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 1585 | "dev": true, 1586 | "license": "Apache-2.0", 1587 | "bin": { 1588 | "tsc": "bin/tsc", 1589 | "tsserver": "bin/tsserver" 1590 | }, 1591 | "engines": { 1592 | "node": ">=14.17" 1593 | } 1594 | }, 1595 | "node_modules/vite": { 1596 | "version": "5.4.14", 1597 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", 1598 | "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", 1599 | "dev": true, 1600 | "license": "MIT", 1601 | "dependencies": { 1602 | "esbuild": "^0.21.3", 1603 | "postcss": "^8.4.43", 1604 | "rollup": "^4.20.0" 1605 | }, 1606 | "bin": { 1607 | "vite": "bin/vite.js" 1608 | }, 1609 | "engines": { 1610 | "node": "^18.0.0 || >=20.0.0" 1611 | }, 1612 | "funding": { 1613 | "url": "https://github.com/vitejs/vite?sponsor=1" 1614 | }, 1615 | "optionalDependencies": { 1616 | "fsevents": "~2.3.3" 1617 | }, 1618 | "peerDependencies": { 1619 | "@types/node": "^18.0.0 || >=20.0.0", 1620 | "less": "*", 1621 | "lightningcss": "^1.21.0", 1622 | "sass": "*", 1623 | "sass-embedded": "*", 1624 | "stylus": "*", 1625 | "sugarss": "*", 1626 | "terser": "^5.4.0" 1627 | }, 1628 | "peerDependenciesMeta": { 1629 | "@types/node": { 1630 | "optional": true 1631 | }, 1632 | "less": { 1633 | "optional": true 1634 | }, 1635 | "lightningcss": { 1636 | "optional": true 1637 | }, 1638 | "sass": { 1639 | "optional": true 1640 | }, 1641 | "sass-embedded": { 1642 | "optional": true 1643 | }, 1644 | "stylus": { 1645 | "optional": true 1646 | }, 1647 | "sugarss": { 1648 | "optional": true 1649 | }, 1650 | "terser": { 1651 | "optional": true 1652 | } 1653 | } 1654 | }, 1655 | "node_modules/vitefu": { 1656 | "version": "1.0.5", 1657 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.5.tgz", 1658 | "integrity": "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==", 1659 | "dev": true, 1660 | "license": "MIT", 1661 | "workspaces": [ 1662 | "tests/deps/*", 1663 | "tests/projects/*" 1664 | ], 1665 | "peerDependencies": { 1666 | "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" 1667 | }, 1668 | "peerDependenciesMeta": { 1669 | "vite": { 1670 | "optional": true 1671 | } 1672 | } 1673 | }, 1674 | "node_modules/zimmerframe": { 1675 | "version": "1.1.2", 1676 | "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", 1677 | "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", 1678 | "dev": true, 1679 | "license": "MIT" 1680 | } 1681 | } 1682 | } 1683 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit", 3 | "scripts": { 4 | "dev": "vite dev", 5 | "build": "vite build", 6 | "preview": "vite preview", 7 | "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", 8 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" 9 | }, 10 | "devDependencies": { 11 | "@fontsource/fira-mono": "^4.5.10", 12 | "@neoconfetti/svelte": "^1.0.0", 13 | "@sveltejs/adapter-node": "^5.2.12", 14 | "@sveltejs/kit": "^2.17.2", 15 | "@sveltejs/vite-plugin-svelte": "^4.0.4", 16 | "svelte": "^5.20.2", 17 | "svelte-check": "^4.1.4", 18 | "typescript": "^5.7.3", 19 | "vite": "^5.4.14" 20 | }, 21 | "type": "module" 22 | } 23 | -------------------------------------------------------------------------------- /render.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | - type: web 3 | name: sveltekit 4 | runtime: node 5 | buildCommand: npm install && npm run build 6 | startCommand: node build/index.js 7 | autoDeploy: false 8 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface PageState {} 9 | // interface Platform {} 10 | } 11 | } 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/lib/images/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 9 | 16 | -------------------------------------------------------------------------------- /src/lib/images/svelte-logo.svg: -------------------------------------------------------------------------------- 1 | svelte-logo -------------------------------------------------------------------------------- /src/lib/images/svelte-welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/render-examples/sveltekit/d893a5fe8cf292ceb08d09d5a09ee86325030a0a/src/lib/images/svelte-welcome.png -------------------------------------------------------------------------------- /src/lib/images/svelte-welcome.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/render-examples/sveltekit/d893a5fe8cf292ceb08d09d5a09ee86325030a0a/src/lib/images/svelte-welcome.webp -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 |
8 | 9 |
10 | 11 |
12 | 13 | 18 |
19 | 20 | 56 | -------------------------------------------------------------------------------- /src/routes/+page.js: -------------------------------------------------------------------------------- 1 | // since there's no dynamic data here, we can prerender 2 | // it so that it gets served as a static asset in production 3 | export const prerender = true; 4 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | Home 9 | 10 | 11 | 12 |
13 |

14 | 15 | 16 | 17 | Welcome 18 | 19 | 20 | 21 | to your new
SvelteKit app 22 |

23 | 24 |

25 | try editing src/routes/+page.svelte 26 |

27 | 28 | 29 |
30 | 31 | 60 | -------------------------------------------------------------------------------- /src/routes/Counter.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 |
25 | 33 | 34 |
35 |
39 | 42 | {Math.floor($displayed_count)} 43 |
44 |
45 | 46 | 54 |
55 | 56 | 122 | -------------------------------------------------------------------------------- /src/routes/Header.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 |
9 | 10 | SvelteKit 11 | 12 |
13 | 14 | 37 | 38 |
39 | 40 | GitHub 41 | 42 |
43 |
44 | 45 | 134 | -------------------------------------------------------------------------------- /src/routes/about/+page.js: -------------------------------------------------------------------------------- 1 | import { dev } from "$app/environment"; 2 | 3 | // we don't need any JS on this page, though we'll load 4 | // it in dev so that we get hot module replacement 5 | export const csr = dev; 6 | 7 | // since there's no dynamic data here, we can prerender 8 | // it so that it gets served as a static asset in production 9 | export const prerender = true; 10 | -------------------------------------------------------------------------------- /src/routes/about/+page.svelte: -------------------------------------------------------------------------------- 1 | 2 | About 3 | 4 | 5 | 6 |
7 |

About this app

8 | 9 |

10 | This is a SvelteKit app. You can make your 11 | own by typing the following into your command line and following the prompts: 12 |

13 | 14 |
npm create svelte@latest
15 | 16 |

17 | The page you're looking at is purely static HTML, with no client-side 18 | interactivity needed. Because of that, we don't need to load any JavaScript. 19 | Try viewing the page's source, or opening the devtools network panel and 20 | reloading. 21 |

22 | 23 |

24 | The Sverdle page illustrates SvelteKit's data loading 25 | and form handling. Try using it with JavaScript disabled! 26 |

27 |
28 | -------------------------------------------------------------------------------- /src/routes/styles.css: -------------------------------------------------------------------------------- 1 | @import "@fontsource/fira-mono"; 2 | 3 | :root { 4 | --font-body: Arial, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, 5 | Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; 6 | --font-mono: "Fira Mono", monospace; 7 | --color-bg-0: rgb(202, 216, 228); 8 | --color-bg-1: hsl(209, 36%, 86%); 9 | --color-bg-2: hsl(224, 44%, 95%); 10 | --color-theme-1: #ff3e00; 11 | --color-theme-2: #4075a6; 12 | --color-text: rgba(0, 0, 0, 0.7); 13 | --column-width: 42rem; 14 | --column-margin-top: 4rem; 15 | font-family: var(--font-body); 16 | color: var(--color-text); 17 | } 18 | 19 | body { 20 | min-height: 100vh; 21 | margin: 0; 22 | background-attachment: fixed; 23 | background-color: var(--color-bg-1); 24 | background-size: 100vw 100vh; 25 | background-image: radial-gradient( 26 | 50% 50% at 50% 50%, 27 | rgba(255, 255, 255, 0.75) 0%, 28 | rgba(255, 255, 255, 0) 100% 29 | ), 30 | linear-gradient( 31 | 180deg, 32 | var(--color-bg-0) 0%, 33 | var(--color-bg-1) 15%, 34 | var(--color-bg-2) 50% 35 | ); 36 | } 37 | 38 | h1, 39 | h2, 40 | p { 41 | font-weight: 400; 42 | } 43 | 44 | p { 45 | line-height: 1.5; 46 | } 47 | 48 | a { 49 | color: var(--color-theme-1); 50 | text-decoration: none; 51 | } 52 | 53 | a:hover { 54 | text-decoration: underline; 55 | } 56 | 57 | h1 { 58 | font-size: 2rem; 59 | text-align: center; 60 | } 61 | 62 | h2 { 63 | font-size: 1rem; 64 | } 65 | 66 | pre { 67 | font-size: 16px; 68 | font-family: var(--font-mono); 69 | background-color: rgba(255, 255, 255, 0.45); 70 | border-radius: 3px; 71 | box-shadow: 2px 2px 6px rgb(255 255 255 / 25%); 72 | padding: 0.5em; 73 | overflow-x: auto; 74 | color: var(--color-text); 75 | } 76 | 77 | .text-column { 78 | display: flex; 79 | max-width: 48rem; 80 | flex: 0.6; 81 | flex-direction: column; 82 | justify-content: center; 83 | margin: 0 auto; 84 | } 85 | 86 | input, 87 | button { 88 | font-size: inherit; 89 | font-family: inherit; 90 | } 91 | 92 | button:focus:not(:focus-visible) { 93 | outline: none; 94 | } 95 | 96 | @media (min-width: 720px) { 97 | h1 { 98 | font-size: 2.4rem; 99 | } 100 | } 101 | 102 | .visually-hidden { 103 | border: 0; 104 | clip: rect(0 0 0 0); 105 | height: auto; 106 | margin: 0; 107 | overflow: hidden; 108 | padding: 0; 109 | position: absolute; 110 | width: 1px; 111 | white-space: nowrap; 112 | } 113 | -------------------------------------------------------------------------------- /src/routes/sverdle/+page.server.js: -------------------------------------------------------------------------------- 1 | import { fail } from "@sveltejs/kit"; 2 | import { Game } from "./game"; 3 | 4 | /** @satisfies {import('./$types').PageServerLoad} */ 5 | export const load = ({ cookies }) => { 6 | const game = new Game(cookies.get("sverdle")); 7 | 8 | return { 9 | /** 10 | * The player's guessed words so far 11 | */ 12 | guesses: game.guesses, 13 | 14 | /** 15 | * An array of strings like '__x_c' corresponding to the guesses, where 'x' means 16 | * an exact match, and 'c' means a close match (right letter, wrong place) 17 | */ 18 | answers: game.answers, 19 | 20 | /** 21 | * The correct answer, revealed if the game is over 22 | */ 23 | answer: game.answers.length >= 6 ? game.answer : null, 24 | }; 25 | }; 26 | 27 | /** @satisfies {import('./$types').Actions} */ 28 | export const actions = { 29 | /** 30 | * Modify game state in reaction to a keypress. If client-side JavaScript 31 | * is available, this will happen in the browser instead of here 32 | */ 33 | update: async ({ request, cookies }) => { 34 | const game = new Game(cookies.get("sverdle")); 35 | 36 | const data = await request.formData(); 37 | const key = data.get("key"); 38 | 39 | const i = game.answers.length; 40 | 41 | if (key === "backspace") { 42 | game.guesses[i] = game.guesses[i].slice(0, -1); 43 | } else { 44 | game.guesses[i] += key; 45 | } 46 | 47 | cookies.set("sverdle", game.toString(), { path: "/" }); 48 | }, 49 | 50 | /** 51 | * Modify game state in reaction to a guessed word. This logic always runs on 52 | * the server, so that people can't cheat by peeking at the JavaScript 53 | */ 54 | enter: async ({ request, cookies }) => { 55 | const game = new Game(cookies.get("sverdle")); 56 | 57 | const data = await request.formData(); 58 | const guess = /** @type {string[]} */ (data.getAll("guess")); 59 | 60 | if (!game.enter(guess)) { 61 | return fail(400, { badGuess: true }); 62 | } 63 | 64 | cookies.set("sverdle", game.toString(), { path: "/" }); 65 | }, 66 | 67 | restart: async ({ cookies }) => { 68 | cookies.delete("sverdle", { path: "/" }); 69 | }, 70 | }; 71 | -------------------------------------------------------------------------------- /src/routes/sverdle/+page.svelte: -------------------------------------------------------------------------------- 1 | 91 | 92 | 93 | 94 | 95 | Sverdle 96 | 97 | 98 | 99 |

Sverdle

100 | 101 |
{ 105 | // prevent default callback from resetting the form 106 | return ({ update }) => { 107 | update({ reset: false }); 108 | }; 109 | }} 110 | > 111 | How to play 112 | 113 |
114 | {#each Array.from(Array(6).keys()) as row (row)} 115 | {@const current = row === i} 116 |

Row {row + 1}

117 |
118 | {#each Array.from(Array(5).keys()) as column (column)} 119 | {@const guess = current ? currentGuess : data.guesses[row]} 120 | {@const answer = data.answers[row]?.[column]} 121 | {@const value = guess?.[column] ?? ""} 122 | {@const selected = current && column === guess.length} 123 | {@const exact = answer === "x"} 124 | {@const close = answer === "c"} 125 | {@const missing = answer === "_"} 126 |
133 | {value} 134 | 135 | {#if exact} 136 | (correct) 137 | {:else if close} 138 | (present) 139 | {:else if missing} 140 | (absent) 141 | {:else} 142 | empty 143 | {/if} 144 | 145 | 146 |
147 | {/each} 148 |
149 | {/each} 150 |
151 | 152 |
153 | {#if won || data.answers.length >= 6} 154 | {#if !won && data.answer} 155 |

the answer was "{data.answer}"

156 | {/if} 157 | 160 | {:else} 161 |
162 | 167 | 168 | 177 | 178 | {#each ["qwertyuiop", "asdfghjkl", "zxcvbnm"] as row} 179 |
180 | {#each row as letter} 181 | 193 | {/each} 194 |
195 | {/each} 196 |
197 | {/if} 198 |
199 |
200 | 201 | {#if won} 202 |
212 | {/if} 213 | 214 | 426 | -------------------------------------------------------------------------------- /src/routes/sverdle/game.js: -------------------------------------------------------------------------------- 1 | import { words, allowed } from "./words.server"; 2 | 3 | export class Game { 4 | /** 5 | * Create a game object from the player's cookie, or initialise a new game 6 | * @param {string | undefined} serialized 7 | */ 8 | constructor(serialized = undefined) { 9 | if (serialized) { 10 | const [index, guesses, answers] = serialized.split("-"); 11 | 12 | this.index = +index; 13 | this.guesses = guesses ? guesses.split(" ") : []; 14 | this.answers = answers ? answers.split(" ") : []; 15 | } else { 16 | this.index = Math.floor(Math.random() * words.length); 17 | this.guesses = ["", "", "", "", "", ""]; 18 | this.answers = /** @type {string[]} */ ([]); 19 | } 20 | 21 | this.answer = words[this.index]; 22 | } 23 | 24 | /** 25 | * Update game state based on a guess of a five-letter word. Returns 26 | * true if the guess was valid, false otherwise 27 | * @param {string[]} letters 28 | */ 29 | enter(letters) { 30 | const word = letters.join(""); 31 | const valid = allowed.has(word); 32 | 33 | if (!valid) return false; 34 | 35 | this.guesses[this.answers.length] = word; 36 | 37 | const available = Array.from(this.answer); 38 | const answer = Array(5).fill("_"); 39 | 40 | // first, find exact matches 41 | for (let i = 0; i < 5; i += 1) { 42 | if (letters[i] === available[i]) { 43 | answer[i] = "x"; 44 | available[i] = " "; 45 | } 46 | } 47 | 48 | // then find close matches (this has to happen 49 | // in a second step, otherwise an early close 50 | // match can prevent a later exact match) 51 | for (let i = 0; i < 5; i += 1) { 52 | if (answer[i] === "_") { 53 | const index = available.indexOf(letters[i]); 54 | if (index !== -1) { 55 | answer[i] = "c"; 56 | available[index] = " "; 57 | } 58 | } 59 | } 60 | 61 | this.answers.push(answer.join("")); 62 | 63 | return true; 64 | } 65 | 66 | /** 67 | * Serialize game state so it can be set as a cookie 68 | */ 69 | toString() { 70 | return `${this.index}-${this.guesses.join(" ")}-${this.answers.join(" ")}`; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/routes/sverdle/how-to-play/+page.js: -------------------------------------------------------------------------------- 1 | import { dev } from "$app/environment"; 2 | 3 | // we don't need any JS on this page, though we'll load 4 | // it in dev so that we get hot module replacement 5 | export const csr = dev; 6 | 7 | // since there's no dynamic data here, we can prerender 8 | // it so that it gets served as a static asset in production 9 | export const prerender = true; 10 | -------------------------------------------------------------------------------- /src/routes/sverdle/how-to-play/+page.svelte: -------------------------------------------------------------------------------- 1 | 2 | How to play Sverdle 3 | 4 | 5 | 6 |
7 |

How to play Sverdle

8 | 9 |

10 | Sverdle is a clone of Wordle, the word guessing game. To play, enter a five-letter English word. For 13 | example: 14 |

15 | 16 |
17 | r 18 | i 19 | t 20 | z 21 | y 22 |
23 | 24 |

25 | The y is in the right place. 26 | r 27 | and 28 | t 29 | are the right letters, but in the wrong place. The other letters are wrong, and 30 | can be discarded. Let's make another guess: 31 |

32 | 33 |
34 | p 35 | a 36 | r 37 | t 38 | y 39 |
40 | 41 |

42 | This time we guessed right! You have six guesses to get the 43 | word. 44 |

45 | 46 |

47 | Unlike the original Wordle, Sverdle runs on the server instead of in the 48 | browser, making it impossible to cheat. It uses <form> and 49 | cookies to submit data, meaning you can even play with JavaScript disabled! 50 |

51 |
52 | 53 | 103 | -------------------------------------------------------------------------------- /src/routes/sverdle/reduced-motion.js: -------------------------------------------------------------------------------- 1 | import { readable } from "svelte/store"; 2 | import { browser } from "$app/environment"; 3 | 4 | const reduced_motion_query = "(prefers-reduced-motion: reduce)"; 5 | 6 | const get_initial_motion_preference = () => { 7 | if (!browser) return false; 8 | return window.matchMedia(reduced_motion_query).matches; 9 | }; 10 | 11 | export const reduced_motion = readable( 12 | get_initial_motion_preference(), 13 | (set) => { 14 | if (browser) { 15 | /** 16 | * @param {MediaQueryListEvent} event 17 | */ 18 | const set_reduced_motion = (event) => { 19 | set(event.matches); 20 | }; 21 | const media_query_list = window.matchMedia(reduced_motion_query); 22 | media_query_list.addEventListener("change", set_reduced_motion); 23 | 24 | return () => { 25 | media_query_list.removeEventListener("change", set_reduced_motion); 26 | }; 27 | } 28 | }, 29 | ); 30 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/render-examples/sveltekit/d893a5fe8cf292ceb08d09d5a09ee86325030a0a/static/favicon.png -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from "@sveltejs/adapter-node"; 2 | 3 | /** @type {import('@sveltejs/kit').Config} */ 4 | const config = { 5 | kit: { 6 | adapter: adapter(), 7 | }, 8 | }; 9 | 10 | export default config; 11 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { sveltekit } from "@sveltejs/kit/vite"; 2 | import { defineConfig } from "vite"; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | }); 7 | --------------------------------------------------------------------------------