Remove auth page transition and add crossfade to the auth cards, change error messages, and fix auth buttons when showing reset page.

This commit is contained in:
Bradley Shellnut 2024-07-18 16:52:11 -07:00
parent ac8721d264
commit 70b4407637
11 changed files with 442 additions and 423 deletions

View file

@ -25,17 +25,17 @@
"devDependencies": { "devDependencies": {
"@melt-ui/pp": "^0.3.2", "@melt-ui/pp": "^0.3.2",
"@melt-ui/svelte": "^0.83.0", "@melt-ui/svelte": "^0.83.0",
"@playwright/test": "^1.45.1", "@playwright/test": "^1.45.2",
"@resvg/resvg-js": "^2.6.2", "@resvg/resvg-js": "^2.6.2",
"@sveltejs/adapter-auto": "^3.2.2", "@sveltejs/adapter-auto": "^3.2.2",
"@sveltejs/enhanced-img": "^0.3.0", "@sveltejs/enhanced-img": "^0.3.0",
"@sveltejs/kit": "^2.5.18", "@sveltejs/kit": "^2.5.18",
"@sveltejs/vite-plugin-svelte": "^3.1.1", "@sveltejs/vite-plugin-svelte": "^3.1.1",
"@types/cookie": "^0.6.0", "@types/cookie": "^0.6.0",
"@types/node": "^20.14.10", "@types/node": "^20.14.11",
"@types/pg": "^8.11.6", "@types/pg": "^8.11.6",
"@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/eslint-plugin": "^7.16.1",
"@typescript-eslint/parser": "^7.16.0", "@typescript-eslint/parser": "^7.16.1",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",
"drizzle-kit": "^0.23.0", "drizzle-kit": "^0.23.0",
"eslint": "^8.57.0", "eslint": "^8.57.0",
@ -48,7 +48,7 @@
"postcss-load-config": "^5.1.0", "postcss-load-config": "^5.1.0",
"postcss-preset-env": "^9.6.0", "postcss-preset-env": "^9.6.0",
"prettier": "^3.3.3", "prettier": "^3.3.3",
"prettier-plugin-svelte": "^3.2.5", "prettier-plugin-svelte": "^3.2.6",
"sass": "^1.77.8", "sass": "^1.77.8",
"satori": "^0.10.14", "satori": "^0.10.14",
"satori-html": "^0.3.2", "satori-html": "^0.3.2",
@ -60,7 +60,7 @@
"svelte-sequential-preprocessor": "^2.0.1", "svelte-sequential-preprocessor": "^2.0.1",
"sveltekit-flash-message": "^2.4.4", "sveltekit-flash-message": "^2.4.4",
"sveltekit-rate-limiter": "^0.5.2", "sveltekit-rate-limiter": "^0.5.2",
"sveltekit-superforms": "^2.16.0", "sveltekit-superforms": "^2.16.1",
"tailwindcss": "^3.4.6", "tailwindcss": "^3.4.6",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tslib": "^2.6.3", "tslib": "^2.6.3",

View file

@ -31,7 +31,7 @@ importers:
version: 2.2.2 version: 2.2.2
'@sveltejs/adapter-vercel': '@sveltejs/adapter-vercel':
specifier: ^5.4.1 specifier: ^5.4.1
version: 5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8))) version: 5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))
'@types/feather-icons': '@types/feather-icons':
specifier: ^4.29.4 specifier: ^4.29.4
version: 4.29.4 version: 4.29.4
@ -67,7 +67,7 @@ importers:
version: 4.29.2 version: 4.29.2
formsnap: formsnap:
specifier: ^1.0.1 specifier: ^1.0.1
version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)) version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175))
html-entities: html-entities:
specifier: ^2.5.2 specifier: ^2.5.2
version: 2.5.2 version: 2.5.2
@ -118,10 +118,10 @@ importers:
version: 2.4.0 version: 2.4.0
tailwind-variants: tailwind-variants:
specifier: ^0.2.1 specifier: ^0.2.1
version: 0.2.1(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))) version: 0.2.1(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)))
tailwindcss-animate: tailwindcss-animate:
specifier: ^1.0.7 specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))) version: 1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)))
zod-to-json-schema: zod-to-json-schema:
specifier: ^3.23.1 specifier: ^3.23.1
version: 3.23.1(zod@3.23.8) version: 3.23.1(zod@3.23.8)
@ -133,38 +133,38 @@ importers:
specifier: ^0.83.0 specifier: ^0.83.0
version: 0.83.0(svelte@5.0.0-next.175) version: 0.83.0(svelte@5.0.0-next.175)
'@playwright/test': '@playwright/test':
specifier: ^1.45.1 specifier: ^1.45.2
version: 1.45.1 version: 1.45.2
'@resvg/resvg-js': '@resvg/resvg-js':
specifier: ^2.6.2 specifier: ^2.6.2
version: 2.6.2 version: 2.6.2
'@sveltejs/adapter-auto': '@sveltejs/adapter-auto':
specifier: ^3.2.2 specifier: ^3.2.2
version: 3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8))) version: 3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))
'@sveltejs/enhanced-img': '@sveltejs/enhanced-img':
specifier: ^0.3.0 specifier: ^0.3.0
version: 0.3.0(rollup@4.18.1)(svelte@5.0.0-next.175) version: 0.3.0(rollup@4.18.1)(svelte@5.0.0-next.175)
'@sveltejs/kit': '@sveltejs/kit':
specifier: ^2.5.18 specifier: ^2.5.18
version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^3.1.1 specifier: ^3.1.1
version: 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) version: 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
'@types/cookie': '@types/cookie':
specifier: ^0.6.0 specifier: ^0.6.0
version: 0.6.0 version: 0.6.0
'@types/node': '@types/node':
specifier: ^20.14.10 specifier: ^20.14.11
version: 20.14.10 version: 20.14.11
'@types/pg': '@types/pg':
specifier: ^8.11.6 specifier: ^8.11.6
version: 8.11.6 version: 8.11.6
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^7.16.0 specifier: ^7.16.1
version: 7.16.0(@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^7.16.0 specifier: ^7.16.1
version: 7.16.0(eslint@8.57.0)(typescript@5.5.3) version: 7.16.1(eslint@8.57.0)(typescript@5.5.3)
autoprefixer: autoprefixer:
specifier: ^10.4.19 specifier: ^10.4.19
version: 10.4.19(postcss@8.4.39) version: 10.4.19(postcss@8.4.39)
@ -179,7 +179,7 @@ importers:
version: 9.1.0(eslint@8.57.0) version: 9.1.0(eslint@8.57.0)
eslint-plugin-svelte: eslint-plugin-svelte:
specifier: ^2.42.0 specifier: ^2.42.0
version: 2.42.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) version: 2.42.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))
just-clone: just-clone:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.0 version: 6.2.0
@ -202,8 +202,8 @@ importers:
specifier: ^3.3.3 specifier: ^3.3.3
version: 3.3.3 version: 3.3.3
prettier-plugin-svelte: prettier-plugin-svelte:
specifier: ^3.2.5 specifier: ^3.2.6
version: 3.2.5(prettier@3.3.3)(svelte@5.0.0-next.175) version: 3.2.6(prettier@3.3.3)(svelte@5.0.0-next.175)
sass: sass:
specifier: ^1.77.8 specifier: ^1.77.8
version: 1.77.8 version: 1.77.8
@ -233,19 +233,19 @@ importers:
version: 2.0.1 version: 2.0.1
sveltekit-flash-message: sveltekit-flash-message:
specifier: ^2.4.4 specifier: ^2.4.4
version: 2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175) version: 2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)
sveltekit-rate-limiter: sveltekit-rate-limiter:
specifier: ^0.5.2 specifier: ^0.5.2
version: 0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8))) version: 0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))
sveltekit-superforms: sveltekit-superforms:
specifier: ^2.16.0 specifier: ^2.16.1
version: 2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175) version: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)
tailwindcss: tailwindcss:
specifier: ^3.4.6 specifier: ^3.4.6
version: 3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) version: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))
ts-node: ts-node:
specifier: ^10.9.2 specifier: ^10.9.2
version: 10.9.2(@types/node@20.14.10)(typescript@5.5.3) version: 10.9.2(@types/node@20.14.11)(typescript@5.5.3)
tslib: tslib:
specifier: ^2.6.3 specifier: ^2.6.3
version: 2.6.3 version: 2.6.3
@ -257,10 +257,10 @@ importers:
version: 5.5.3 version: 5.5.3
vite: vite:
specifier: ^5.3.4 specifier: ^5.3.4
version: 5.3.4(@types/node@20.14.10)(sass@1.77.8) version: 5.3.4(@types/node@20.14.11)(sass@1.77.8)
vitest: vitest:
specifier: ^1.6.0 specifier: ^1.6.0
version: 1.6.0(@types/node@20.14.10)(sass@1.77.8) version: 1.6.0(@types/node@20.14.11)(sass@1.77.8)
zod: zod:
specifier: ^3.23.8 specifier: ^3.23.8
version: 3.23.8 version: 3.23.8
@ -275,11 +275,11 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
'@arktype/schema@0.1.13': '@ark/schema@0.2.0':
resolution: {integrity: sha512-qZjtCAKrnhsixDWsEGJtosWfi4bLpAg4OnnICVYTer/6v5hwlhsdYpYobTSJUc5eiBoI5Ai/kcNfYaQISshY2g==} resolution: {integrity: sha512-IkNWCSHdjaoemMXpps4uFHEAQzwJPbTAS8K2vcQpk90sa+eNBuPSVyB/81/Qyl1VYW0iX3ceGC5NL/OznQv1jg==}
'@arktype/util@0.0.48': '@ark/util@0.1.0':
resolution: {integrity: sha512-U5FO5EUAJ4LoYtLSyAMmTf6CEVgslObfSQuua2zoK5Tv2FB3aESVQ3rdLfhuz+coRhlzlynbkmimyoQWwQT+aQ==} resolution: {integrity: sha512-qCLYICQoCy3kEKDVwirQp8qvxhY7NJd8BhhoHaj1l3wCFAk9NUbcDsxAkPStZEMdPI/d7NcbGJe8SWZuRG2twQ==}
'@babel/runtime@7.24.8': '@babel/runtime@7.24.8':
resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==}
@ -1556,8 +1556,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'} engines: {node: '>=14'}
'@playwright/test@1.45.1': '@playwright/test@1.45.2':
resolution: {integrity: sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==} resolution: {integrity: sha512-JxG9eq92ET75EbVi3s+4sYbcG7q72ECeZNbdBlaMkGcNbiDQ4cAi8U2QP5oKkOx+1gpaiL1LDStmzCaEM1Z6fQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
@ -1911,8 +1911,8 @@ packages:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/node@20.14.10': '@types/node@20.14.11':
resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==}
'@types/pg@8.11.6': '@types/pg@8.11.6':
resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==}
@ -1923,8 +1923,8 @@ packages:
'@types/validator@13.12.0': '@types/validator@13.12.0':
resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==}
'@typescript-eslint/eslint-plugin@7.16.0': '@typescript-eslint/eslint-plugin@7.16.1':
resolution: {integrity: sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==} resolution: {integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^7.0.0 '@typescript-eslint/parser': ^7.0.0
@ -1934,8 +1934,8 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/parser@7.16.0': '@typescript-eslint/parser@7.16.1':
resolution: {integrity: sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==} resolution: {integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
@ -1944,12 +1944,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/scope-manager@7.16.0': '@typescript-eslint/scope-manager@7.16.1':
resolution: {integrity: sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==} resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/type-utils@7.16.0': '@typescript-eslint/type-utils@7.16.1':
resolution: {integrity: sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==} resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
@ -1958,12 +1958,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/types@7.16.0': '@typescript-eslint/types@7.16.1':
resolution: {integrity: sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==} resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/typescript-estree@7.16.0': '@typescript-eslint/typescript-estree@7.16.1':
resolution: {integrity: sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==} resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -1971,14 +1971,14 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/utils@7.16.0': '@typescript-eslint/utils@7.16.1':
resolution: {integrity: sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==} resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies: peerDependencies:
eslint: ^8.56.0 eslint: ^8.56.0
'@typescript-eslint/visitor-keys@7.16.0': '@typescript-eslint/visitor-keys@7.16.1':
resolution: {integrity: sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==} resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==}
engines: {node: ^18.18.0 || >=20.0.0} engines: {node: ^18.18.0 || >=20.0.0}
'@ungap/structured-clone@1.2.0': '@ungap/structured-clone@1.2.0':
@ -2102,8 +2102,8 @@ packages:
aria-query@5.3.0: aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
arktype@2.0.0-dev.21: arktype@2.0.0-beta.0:
resolution: {integrity: sha512-dgHCjb3FK4BGvG2LuXqgdWXstbFmiYowSy0jiKnyk4KVcMT5DyIJ9d1nbQM3ztiAL3hIPmPdkmpfxUqR+BoOBQ==} resolution: {integrity: sha512-fE3ssMiXjr/bLqFPzlDhRlXngdyHQreu7p7i8+dtcY1CA+f8WrVUcue6JxywhnqEJXPG4HOcIwQcC+q4VfeUMQ==}
array-union@2.1.0: array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
@ -3345,13 +3345,13 @@ packages:
pkg-types@1.1.0: pkg-types@1.1.0:
resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==}
playwright-core@1.45.1: playwright-core@1.45.2:
resolution: {integrity: sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==} resolution: {integrity: sha512-ha175tAWb0dTK0X4orvBIqi3jGEt701SMxMhyujxNrgd8K0Uy5wMSwwcQHtyB4om7INUkfndx02XnQ2p6dvLDw==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
playwright@1.45.1: playwright@1.45.2:
resolution: {integrity: sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==} resolution: {integrity: sha512-ReywF2t/0teRvNBpfIgh5e4wnrI/8Su8ssdo5XsQKpjxJj+jspm00jSoz9BTg91TT0c9HRjXO7LBNVrgYj9X0g==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
@ -3645,8 +3645,8 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
prettier-plugin-svelte@3.2.5: prettier-plugin-svelte@3.2.6:
resolution: {integrity: sha512-vP/M/Goc8z4iVIvrwXwbrYVjJgA0Hf8PO1G4LBh/ocSt6vUP6sLvyu9F3ABEGr+dbKyxZjEKLkeFsWy/yYl0HQ==} resolution: {integrity: sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==}
peerDependencies: peerDependencies:
prettier: ^3.0.0 prettier: ^3.0.0
svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
@ -3788,6 +3788,11 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
semver@7.6.3:
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
hasBin: true
set-blocking@2.0.0: set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
@ -4070,8 +4075,8 @@ packages:
peerDependencies: peerDependencies:
'@sveltejs/kit': 1.x || 2.x '@sveltejs/kit': 1.x || 2.x
sveltekit-superforms@2.16.0: sveltekit-superforms@2.16.1:
resolution: {integrity: sha512-t5aZyMCXyahgvn7VAJ7l9S+wAv9YyMAZHYQ6gcGVZ6ecr4/DMMD2r3ajGCj1h1dWaMQ3w5zVw+SqHSAkbHsWVQ==} resolution: {integrity: sha512-RNBdN43xge/ADmc3s7+pfdnRGuZ9gZiqpX6VKAQCnCI+ICc5rrPv5idYbx4iuY1Ia0lRMAq1hP0x2oHaPjB+Kg==}
peerDependencies: peerDependencies:
'@sveltejs/kit': 1.x || 2.x '@sveltejs/kit': 1.x || 2.x
svelte: 3.x || 4.x || >=5.0.0-next.51 svelte: 3.x || 4.x || >=5.0.0-next.51
@ -4435,12 +4440,12 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5 '@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
'@arktype/schema@0.1.13': '@ark/schema@0.2.0':
dependencies: dependencies:
'@arktype/util': 0.0.48 '@ark/util': 0.1.0
optional: true optional: true
'@arktype/util@0.0.48': '@ark/util@0.1.0':
optional: true optional: true
'@babel/runtime@7.24.8': '@babel/runtime@7.24.8':
@ -5409,9 +5414,9 @@ snapshots:
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
optional: true optional: true
'@playwright/test@1.45.1': '@playwright/test@1.45.2':
dependencies: dependencies:
playwright: 1.45.1 playwright: 1.45.2
'@polka/url@1.0.0-next.25': {} '@polka/url@1.0.0-next.25': {}
@ -5604,14 +5609,14 @@ snapshots:
'@sodaru/yup-to-json-schema@2.0.1': '@sodaru/yup-to-json-schema@2.0.1':
optional: true optional: true
'@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))': '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))':
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
import-meta-resolve: 4.1.0 import-meta-resolve: 4.1.0
'@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))': '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))':
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
'@vercel/nft': 0.27.2 '@vercel/nft': 0.27.2
esbuild: 0.21.5 esbuild: 0.21.5
transitivePeerDependencies: transitivePeerDependencies:
@ -5627,9 +5632,9 @@ snapshots:
- rollup - rollup
- svelte - svelte
'@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8))': '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
'@types/cookie': 0.6.0 '@types/cookie': 0.6.0
cookie: 0.6.0 cookie: 0.6.0
devalue: 5.0.0 devalue: 5.0.0
@ -5643,28 +5648,28 @@ snapshots:
sirv: 2.0.4 sirv: 2.0.4
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
tiny-glob: 0.2.9 tiny-glob: 0.2.9
vite: 5.3.4(@types/node@20.14.10)(sass@1.77.8) vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8)
'@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8))': '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
debug: 4.3.4 debug: 4.3.4
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
vite: 5.3.4(@types/node@20.14.10)(sass@1.77.8) vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8))': '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))':
dependencies: dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
debug: 4.3.4 debug: 4.3.4
deepmerge: 4.3.1 deepmerge: 4.3.1
kleur: 4.1.5 kleur: 4.1.5
magic-string: 0.30.10 magic-string: 0.30.10
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
svelte-hmr: 0.16.0(svelte@5.0.0-next.175) svelte-hmr: 0.16.0(svelte@5.0.0-next.175)
vite: 5.3.4(@types/node@20.14.10)(sass@1.77.8) vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8)
vitefu: 0.2.5(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) vitefu: 0.2.5(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5694,13 +5699,13 @@ snapshots:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
optional: true optional: true
'@types/node@20.14.10': '@types/node@20.14.11':
dependencies: dependencies:
undici-types: 5.26.5 undici-types: 5.26.5
'@types/pg@8.11.6': '@types/pg@8.11.6':
dependencies: dependencies:
'@types/node': 20.14.10 '@types/node': 20.14.11
pg-protocol: 1.6.1 pg-protocol: 1.6.1
pg-types: 4.0.2 pg-types: 4.0.2
@ -5709,14 +5714,14 @@ snapshots:
'@types/validator@13.12.0': '@types/validator@13.12.0':
optional: true optional: true
'@typescript-eslint/eslint-plugin@7.16.0(@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.10.0 '@eslint-community/regexpp': 4.10.0
'@typescript-eslint/parser': 7.16.0(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.3)
'@typescript-eslint/scope-manager': 7.16.0 '@typescript-eslint/scope-manager': 7.16.1
'@typescript-eslint/type-utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3)
'@typescript-eslint/utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3)
'@typescript-eslint/visitor-keys': 7.16.0 '@typescript-eslint/visitor-keys': 7.16.1
eslint: 8.57.0 eslint: 8.57.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.1 ignore: 5.3.1
@ -5727,12 +5732,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@7.16.0(eslint@8.57.0)(typescript@5.5.3)': '@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 7.16.0 '@typescript-eslint/scope-manager': 7.16.1
'@typescript-eslint/types': 7.16.0 '@typescript-eslint/types': 7.16.1
'@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3)
'@typescript-eslint/visitor-keys': 7.16.0 '@typescript-eslint/visitor-keys': 7.16.1
debug: 4.3.4 debug: 4.3.4
eslint: 8.57.0 eslint: 8.57.0
optionalDependencies: optionalDependencies:
@ -5740,15 +5745,15 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@7.16.0': '@typescript-eslint/scope-manager@7.16.1':
dependencies: dependencies:
'@typescript-eslint/types': 7.16.0 '@typescript-eslint/types': 7.16.1
'@typescript-eslint/visitor-keys': 7.16.0 '@typescript-eslint/visitor-keys': 7.16.1
'@typescript-eslint/type-utils@7.16.0(eslint@8.57.0)(typescript@5.5.3)': '@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3)
'@typescript-eslint/utils': 7.16.0(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3)
debug: 4.3.5 debug: 4.3.5
eslint: 8.57.0 eslint: 8.57.0
ts-api-utils: 1.3.0(typescript@5.5.3) ts-api-utils: 1.3.0(typescript@5.5.3)
@ -5757,37 +5762,37 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@7.16.0': {} '@typescript-eslint/types@7.16.1': {}
'@typescript-eslint/typescript-estree@7.16.0(typescript@5.5.3)': '@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.3)':
dependencies: dependencies:
'@typescript-eslint/types': 7.16.0 '@typescript-eslint/types': 7.16.1
'@typescript-eslint/visitor-keys': 7.16.0 '@typescript-eslint/visitor-keys': 7.16.1
debug: 4.3.4 debug: 4.3.4
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.6.2 semver: 7.6.3
ts-api-utils: 1.3.0(typescript@5.5.3) ts-api-utils: 1.3.0(typescript@5.5.3)
optionalDependencies: optionalDependencies:
typescript: 5.5.3 typescript: 5.5.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@7.16.0(eslint@8.57.0)(typescript@5.5.3)': '@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@typescript-eslint/scope-manager': 7.16.0 '@typescript-eslint/scope-manager': 7.16.1
'@typescript-eslint/types': 7.16.0 '@typescript-eslint/types': 7.16.1
'@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3)
eslint: 8.57.0 eslint: 8.57.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
'@typescript-eslint/visitor-keys@7.16.0': '@typescript-eslint/visitor-keys@7.16.1':
dependencies: dependencies:
'@typescript-eslint/types': 7.16.0 '@typescript-eslint/types': 7.16.1
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@ungap/structured-clone@1.2.0': {} '@ungap/structured-clone@1.2.0': {}
@ -5929,10 +5934,10 @@ snapshots:
dependencies: dependencies:
dequal: 2.0.3 dequal: 2.0.3
arktype@2.0.0-dev.21: arktype@2.0.0-beta.0:
dependencies: dependencies:
'@arktype/schema': 0.1.13 '@ark/schema': 0.2.0
'@arktype/util': 0.0.48 '@ark/util': 0.1.0
optional: true optional: true
array-union@2.1.0: {} array-union@2.1.0: {}
@ -6384,7 +6389,7 @@ snapshots:
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.0
eslint-plugin-svelte@2.42.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)): eslint-plugin-svelte@2.42.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/sourcemap-codec': 1.4.15
@ -6393,7 +6398,7 @@ snapshots:
esutils: 2.0.3 esutils: 2.0.3
known-css-properties: 0.34.0 known-css-properties: 0.34.0
postcss: 8.4.39 postcss: 8.4.39
postcss-load-config: 3.1.4(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) postcss-load-config: 3.1.4(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))
postcss-safe-parser: 6.0.0(postcss@8.4.39) postcss-safe-parser: 6.0.0(postcss@8.4.39)
postcss-selector-parser: 6.1.0 postcss-selector-parser: 6.1.0
semver: 7.6.2 semver: 7.6.2
@ -6566,11 +6571,11 @@ snapshots:
cross-spawn: 7.0.3 cross-spawn: 7.0.3
signal-exit: 4.1.0 signal-exit: 4.1.0
formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)): formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)):
dependencies: dependencies:
nanoid: 5.0.7 nanoid: 5.0.7
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
sveltekit-superforms: 2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175) sveltekit-superforms: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)
fraction.js@4.3.7: {} fraction.js@4.3.7: {}
@ -7149,11 +7154,11 @@ snapshots:
mlly: 1.7.0 mlly: 1.7.0
pathe: 1.1.2 pathe: 1.1.2
playwright-core@1.45.1: {} playwright-core@1.45.2: {}
playwright@1.45.1: playwright@1.45.2:
dependencies: dependencies:
playwright-core: 1.45.1 playwright-core: 1.45.2
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
@ -7279,21 +7284,21 @@ snapshots:
'@csstools/utilities': 1.0.0(postcss@8.4.39) '@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39 postcss: 8.4.39
postcss-load-config@3.1.4(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)): postcss-load-config@3.1.4(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)):
dependencies: dependencies:
lilconfig: 2.1.0 lilconfig: 2.1.0
yaml: 1.10.2 yaml: 1.10.2
optionalDependencies: optionalDependencies:
postcss: 8.4.39 postcss: 8.4.39
ts-node: 10.9.2(@types/node@20.14.10)(typescript@5.5.3) ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.5.3)
postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)): postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)):
dependencies: dependencies:
lilconfig: 3.1.1 lilconfig: 3.1.1
yaml: 2.4.3 yaml: 2.4.3
optionalDependencies: optionalDependencies:
postcss: 8.4.39 postcss: 8.4.39
ts-node: 10.9.2(@types/node@20.14.10)(typescript@5.5.3) ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.5.3)
postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2): postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2):
dependencies: dependencies:
@ -7470,7 +7475,7 @@ snapshots:
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
prettier-plugin-svelte@3.2.5(prettier@3.3.3)(svelte@5.0.0-next.175): prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@5.0.0-next.175):
dependencies: dependencies:
prettier: 3.3.3 prettier: 3.3.3
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
@ -7656,6 +7661,8 @@ snapshots:
semver@7.6.2: {} semver@7.6.2: {}
semver@7.6.3: {}
set-blocking@2.0.0: {} set-blocking@2.0.0: {}
set-cookie-parser@2.6.0: {} set-cookie-parser@2.6.0: {}
@ -7928,19 +7935,19 @@ snapshots:
magic-string: 0.30.10 magic-string: 0.30.10
zimmerframe: 1.1.2 zimmerframe: 1.1.2
sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175): sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175):
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
svelte: 5.0.0-next.175 svelte: 5.0.0-next.175
sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8))): sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))):
dependencies: dependencies:
'@isaacs/ttlcache': 1.4.1 '@isaacs/ttlcache': 1.4.1
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
sveltekit-superforms@2.16.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175): sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175):
dependencies: dependencies:
'@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)) '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))
devalue: 5.0.0 devalue: 5.0.0
just-clone: 6.2.0 just-clone: 6.2.0
memoize-weak: 1.0.2 memoize-weak: 1.0.2
@ -7952,7 +7959,7 @@ snapshots:
'@sinclair/typebox': 0.32.34 '@sinclair/typebox': 0.32.34
'@sodaru/yup-to-json-schema': 2.0.1 '@sodaru/yup-to-json-schema': 2.0.1
'@vinejs/vine': 1.8.0 '@vinejs/vine': 1.8.0
arktype: 2.0.0-dev.21 arktype: 2.0.0-beta.0
joi: 17.13.3 joi: 17.13.3
json-schema-to-ts: 3.1.0 json-schema-to-ts: 3.1.0
superstruct: 2.0.2 superstruct: 2.0.2
@ -7965,16 +7972,16 @@ snapshots:
tailwind-merge@2.4.0: {} tailwind-merge@2.4.0: {}
tailwind-variants@0.2.1(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))): tailwind-variants@0.2.1(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))):
dependencies: dependencies:
tailwind-merge: 2.4.0 tailwind-merge: 2.4.0
tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))
tailwindcss-animate@1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))): tailwindcss-animate@1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))):
dependencies: dependencies:
tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))
tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)): tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)):
dependencies: dependencies:
'@alloc/quick-lru': 5.2.0 '@alloc/quick-lru': 5.2.0
arg: 5.0.2 arg: 5.0.2
@ -7993,7 +8000,7 @@ snapshots:
postcss: 8.4.39 postcss: 8.4.39
postcss-import: 15.1.0(postcss@8.4.39) postcss-import: 15.1.0(postcss@8.4.39)
postcss-js: 4.0.1(postcss@8.4.39) postcss-js: 4.0.1(postcss@8.4.39)
postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))
postcss-nested: 6.0.1(postcss@8.4.39) postcss-nested: 6.0.1(postcss@8.4.39)
postcss-selector-parser: 6.1.0 postcss-selector-parser: 6.1.0
resolve: 1.22.8 resolve: 1.22.8
@ -8058,14 +8065,14 @@ snapshots:
ts-interface-checker@0.1.13: {} ts-interface-checker@0.1.13: {}
ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3): ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3):
dependencies: dependencies:
'@cspotcode/source-map-support': 0.8.1 '@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11 '@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11 '@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3 '@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4 '@tsconfig/node16': 1.0.4
'@types/node': 20.14.10 '@types/node': 20.14.11
acorn: 8.11.3 acorn: 8.11.3
acorn-walk: 8.3.2 acorn-walk: 8.3.2
arg: 4.1.3 arg: 4.1.3
@ -8150,13 +8157,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
vite-node@1.6.0(@types/node@20.14.10)(sass@1.77.8): vite-node@1.6.0(@types/node@20.14.11)(sass@1.77.8):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.3.4 debug: 4.3.4
pathe: 1.1.2 pathe: 1.1.2
picocolors: 1.0.0 picocolors: 1.0.0
vite: 5.3.4(@types/node@20.14.10)(sass@1.77.8) vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- less - less
@ -8167,21 +8174,21 @@ snapshots:
- supports-color - supports-color
- terser - terser
vite@5.3.4(@types/node@20.14.10)(sass@1.77.8): vite@5.3.4(@types/node@20.14.11)(sass@1.77.8):
dependencies: dependencies:
esbuild: 0.21.5 esbuild: 0.21.5
postcss: 8.4.39 postcss: 8.4.39
rollup: 4.17.2 rollup: 4.17.2
optionalDependencies: optionalDependencies:
'@types/node': 20.14.10 '@types/node': 20.14.11
fsevents: 2.3.3 fsevents: 2.3.3
sass: 1.77.8 sass: 1.77.8
vitefu@0.2.5(vite@5.3.4(@types/node@20.14.10)(sass@1.77.8)): vitefu@0.2.5(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)):
optionalDependencies: optionalDependencies:
vite: 5.3.4(@types/node@20.14.10)(sass@1.77.8) vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8)
vitest@1.6.0(@types/node@20.14.10)(sass@1.77.8): vitest@1.6.0(@types/node@20.14.11)(sass@1.77.8):
dependencies: dependencies:
'@vitest/expect': 1.6.0 '@vitest/expect': 1.6.0
'@vitest/runner': 1.6.0 '@vitest/runner': 1.6.0
@ -8200,11 +8207,11 @@ snapshots:
strip-literal: 2.1.0 strip-literal: 2.1.0
tinybench: 2.8.0 tinybench: 2.8.0
tinypool: 0.8.4 tinypool: 0.8.4
vite: 5.3.4(@types/node@20.14.10)(sass@1.77.8) vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8)
vite-node: 1.6.0(@types/node@20.14.10)(sass@1.77.8) vite-node: 1.6.0(@types/node@20.14.11)(sass@1.77.8)
why-is-node-running: 2.2.2 why-is-node-running: 2.2.2
optionalDependencies: optionalDependencies:
'@types/node': 20.14.10 '@types/node': 20.14.11
transitivePeerDependencies: transitivePeerDependencies:
- less - less
- lightningcss - lightningcss

View file

@ -34,7 +34,7 @@
{#if transition.type === 'stagger'} {#if transition.type === 'stagger'}
<div <div
class="stagger transition" class="stagger transition"
style:animation-duration="{transition.duration || 1 * 300}ms" style:animation-duration="{transition.duration || 300}ms"
style:animation-delay="{transition.delay}ms" style:animation-delay="{transition.delay}ms"
> >
<slot /> <slot />

View file

@ -0,0 +1,12 @@
import { crossfade } from 'svelte/transition';
import { quintOut } from 'svelte/easing';
export const [send, receive] = crossfade({
duration: d => Math.sqrt(d * 200),
easing: quintOut,
// You can customize the fallBack if the element sizes are significantly different
fallback(node, params) {
return { duration: 600, easing: x => --x * x * x + 1 }; // Ease-out cubic
}
});

View file

@ -19,8 +19,8 @@ export const signInSchema = z.object({
username: z username: z
.string() .string()
.trim() .trim()
.min(3, { message: 'Username must be at least 3 characters' }) .min(3, { message: 'Must be at least 3 characters' })
.max(50, { message: 'Username must be less than 50 characters' }), .max(50, { message: 'Must be less than 50 characters' }),
password: z.string({ required_error: 'Password is required' }).trim(), password: z.string({ required_error: 'Password is required' }).trim(),
}); });
@ -33,7 +33,7 @@ export const recoveryCodeSchema = z.object({
}); });
export const resetPasswordEmailSchema = z.object({ export const resetPasswordEmailSchema = z.object({
email: z.string().trim().max(64), email: z.string().trim().max(64, { message: 'Email must be less than 64 characters' }),
}); });
export const resetPasswordTokenSchema = z.object({ export const resetPasswordTokenSchema = z.object({

View file

@ -26,8 +26,8 @@ export const userSchema = z.object({
username: z username: z
.string() .string()
.trim() .trim()
.min(3, { message: 'Username must be at least 3 characters' }) .min(3, { message: 'Must be at least 3 characters' })
.max(50, { message: 'Username must be less than 50 characters' }), .max(50, { message: 'Must be less than 50 characters' }),
password: z.string({ required_error: 'Password is required' }).trim(), password: z.string({ required_error: 'Password is required' }).trim(),
confirm_password: z.string({ required_error: 'Confirm Password is required' }).trim(), confirm_password: z.string({ required_error: 'Confirm Password is required' }).trim(),
verified: z.boolean().default(false), verified: z.boolean().default(false),

View file

@ -14,38 +14,24 @@
</div> </div>
Bored Game Bored Game
</a> </a>
{#if $page.url.pathname === "/sign-up"} <div class="auth-buttons">
<Button {#if $page.url.pathname !== "/login"}
href="/login"
variant="ghost"
class="auth-button"
>
Login
</Button>
{:else if $page.url.pathname === "/login"}
<Button
href="/sign-up"
variant="ghost"
class="auth-button"
>
Sign up
</Button>
{:else}
<div class="auth-buttons">
<Button <Button
href="/login" href="/login"
variant="ghost" variant="ghost"
> >
Login Login
</Button> </Button>
{/if}
{#if $page.url.pathname !== "/sign-up"}
<Button <Button
href="/sign-up" href="/sign-up"
variant="ghost" variant="ghost"
> >
Sign up Sign up
</Button> </Button>
</div> {/if}
{/if} </div>
<div class="auth-marketing"> <div class="auth-marketing">
<div <div
class="image" class="image"
@ -63,9 +49,7 @@
</div> </div>
</div> </div>
<div class="auth-form"> <div class="auth-form">
<Transition url={data.url} transition={{ type: 'page' }}> {@render children()}
{@render children()}
</Transition>
</div> </div>
</div> </div>
@ -137,17 +121,6 @@
} }
} }
:global(.auth-button) {
position: absolute;
top: 1rem;
right: 1rem;
@media (min-width >= 768px) {
top: 2rem;
right: 2rem;
}
}
:global(.auth-buttons) { :global(.auth-buttons) {
position: absolute; position: absolute;
top: 1rem; top: 1rem;

View file

@ -10,6 +10,7 @@
import { Input } from '$components/ui/input'; import { Input } from '$components/ui/input';
import { Button } from '$components/ui/button'; import { Button } from '$components/ui/button';
import * as Alert from "$components/ui/alert"; import * as Alert from "$components/ui/alert";
import { send, receive } from '$lib/utils/pageCrossfade';
import { boredState } from '$lib/stores/boredState.js'; import { boredState } from '$lib/stores/boredState.js';
let { data } = $props(); let { data } = $props();
@ -41,24 +42,26 @@
<title>Bored Game | Login</title> <title>Bored Game | Login</title>
</svelte:head> </svelte:head>
<Card.Root class="mx-auto mt-24 max-w-sm"> <div in:receive={{ key: 'auth-card' }} out:send={{ key: 'auth-card' }}>
<Card.Header> <Card.Root class="mx-auto mt-24 max-w-sm">
Log into your account <Card.Header>
</Card.Header> <Card.Title class="text-2xl">Log into your account</Card.Title>
<Card.Content> </Card.Header>
{@render usernamePasswordForm()} <Card.Content>
<p class="px-8 py-4 text-center text-sm text-muted-foreground"> {@render usernamePasswordForm()}
By clicking continue, you agree to our <p class="px-8 py-4 text-center text-sm text-muted-foreground">
<a href="/terms" class="underline underline-offset-4 hover:text-primary"> By clicking continue, you agree to our
Terms of Use <a href="/terms" class="underline underline-offset-4 hover:text-primary">
</a> Terms of Use
and </a>
<a href="/privacy" class="underline underline-offset-4 hover:text-primary"> and
Privacy Policy <a href="/privacy" class="underline underline-offset-4 hover:text-primary">
</a>. Privacy Policy
</p> </a>.
</Card.Content> </p>
</Card.Root> </Card.Content>
</Card.Root>
</div>
{#snippet usernamePasswordForm()} {#snippet usernamePasswordForm()}
<form method="POST" use:enhance> <form method="POST" use:enhance>
@ -76,7 +79,7 @@
</Form.Control> </Form.Control>
<Form.FieldErrors /> <Form.FieldErrors />
</Form.Field> </Form.Field>
<div class="flex align-center justify-between"> <div class="grid grid-cols-2">
<Form.Button>Login</Form.Button> <Form.Button>Login</Form.Button>
<Button variant="link" class="text-secondary-foreground" href="/password/reset">Forgot Password?</Button> <Button variant="link" class="text-secondary-foreground" href="/password/reset">Forgot Password?</Button>
</div> </div>

View file

@ -1,41 +1,58 @@
import { fail, error, type Actions } from '@sveltejs/kit'; import { fail, error, type Actions } from '@sveltejs/kit';
import { zod } from 'sveltekit-superforms/adapters'; import { zod } from 'sveltekit-superforms/adapters';
import { setError, superValidate } from 'sveltekit-superforms/server'; import { setError, superValidate } from 'sveltekit-superforms/server';
import { redirect } from 'sveltekit-flash-message/server'; import { redirect } from 'sveltekit-flash-message/server';
import type { PageServerLoad } from './$types'; import type { PageServerLoad } from './$types';
import {resetPasswordEmailSchema, resetPasswordTokenSchema} from "$lib/validations/auth"; import {resetPasswordEmailSchema, resetPasswordTokenSchema} from "$lib/validations/auth";
import {StatusCodes} from "$lib/constants/status-codes"; import {StatusCodes} from "$lib/constants/status-codes";
import {userFullyAuthenticated} from "$lib/server/auth-utils";
export const load: PageServerLoad = async (event) => {
return { export const load: PageServerLoad = async () => {
emailForm: await superValidate(zod(resetPasswordEmailSchema)), return {
tokenForm: await superValidate(zod(resetPasswordTokenSchema)), emailForm: await superValidate(zod(resetPasswordEmailSchema)),
}; tokenForm: await superValidate(zod(resetPasswordTokenSchema)),
}; };
};
export const actions = {
passwordReset: async ({ locals, request }) => { export const actions = {
const emailForm = await superValidate(request, zod(resetPasswordEmailSchema)); passwordReset: async (event) => {
if (!emailForm.valid) { const { request, locals } = event;
return fail(StatusCodes.BAD_REQUEST, { emailForm }); const { user, session } = locals;
}
const error = {}; if (userFullyAuthenticated(user, session)) {
// const { error } = await locals.api.iam.login.request.$post({ json: emailRegisterForm.data }).then(locals.parseApiResponse); const message = { type: 'success', message: 'You are already signed in' } as const;
if (error) { throw redirect('/', message, event);
return setError(emailForm, 'email', error); }
}
return { emailForm }; const emailForm = await superValidate(request, zod(resetPasswordEmailSchema));
}, console.log('emailForm', emailForm);
verifyToken: async ({ locals, request }) => { if (!emailForm.valid) {
const tokenForm = await superValidate(request, zod(resetPasswordTokenSchema)); return fail(StatusCodes.BAD_REQUEST, { emailForm });
if (!tokenForm.valid) { }
return fail(StatusCodes.BAD_REQUEST, { tokenForm }); const error = {};
} // const { error } = await locals.api.iam.login.request.$post({ json: emailRegisterForm.data }).then(locals.parseApiResponse);
const error = {}; if (error) {
// const { error } = await locals.api.iam.login.verify.$post({ json: emailSignInForm.data }).then(locals.parseApiResponse) return setError(emailForm, 'email', error);
if (error) { }
return setError(tokenForm, 'token', error); return { emailForm };
} },
redirect(301, '/'); verifyToken: async (event) => {
} const { request, locals } = event;
}; const { user, session } = locals;
if (userFullyAuthenticated(user, session)) {
const message = { type: 'success', message: 'You are already signed in' } as const;
throw redirect('/', message, event);
}
const tokenForm = await superValidate(request, zod(resetPasswordTokenSchema));
if (!tokenForm.valid) {
return fail(StatusCodes.BAD_REQUEST, { tokenForm });
}
const error = {};
// const { error } = await locals.api.iam.login.verify.$post({ json: emailSignInForm.data }).then(locals.parseApiResponse)
if (error) {
return setError(tokenForm, 'token', error);
}
redirect(301, '/');
}
};

View file

@ -1,85 +1,89 @@
<script lang="ts"> <script lang="ts">
import { Button } from "$lib/components/ui/button/index.js"; import { superForm } from 'sveltekit-superforms';
import * as Card from "$lib/components/ui/card/index.js"; import { zodClient } from 'sveltekit-superforms/adapters';
import { Input } from "$lib/components/ui/input/index.js"; import { Button } from "$lib/components/ui/button/index.js";
import { Label } from "$lib/components/ui/label/index.js"; import * as Card from "$lib/components/ui/card/index.js";
import { superForm } from 'sveltekit-superforms'; import { Input } from "$lib/components/ui/input/index.js";
import * as Form from '$lib/components/ui/form'; import { Label } from "$lib/components/ui/label/index.js";
import { zodClient } from 'sveltekit-superforms/adapters'; import * as Form from '$lib/components/ui/form';
import { resetPasswordEmailSchema, resetPasswordTokenSchema } from "$lib/validations/auth"; import { send, receive } from '$lib/utils/pageCrossfade';
import PinInput from "$lib/components/pin-input.svelte"; import { resetPasswordEmailSchema, resetPasswordTokenSchema } from "$lib/validations/auth";
import PinInput from "$lib/components/pin-input.svelte";
const {data} = $props();
const {data} = $props();
let showTokenVerification = $state(false);
let showTokenVerification = $state(false);
const emailResetForm = superForm(data.emailForm, {
validators: zodClient(resetPasswordEmailSchema), const emailResetForm = superForm(data.emailForm, {
resetForm: false, validators: zodClient(resetPasswordEmailSchema),
onUpdated: ({ form }) => { resetForm: false,
if (form.valid) { onUpdated: ({ form }) => {
showTokenVerification = true; console.log('form', form);
$emailFormData.email = form.data.email; if (form.valid) {
} showTokenVerification = true;
} $emailFormData.email = form.data.email;
}); }
}
const tokenVerificationForm = superForm(data.tokenForm, { });
validators: zodClient(resetPasswordTokenSchema),
resetForm: false const tokenVerificationForm = superForm(data.tokenForm, {
}); validators: zodClient(resetPasswordTokenSchema),
resetForm: false
const { form: emailFormData, enhance: emailRegisterEnhance } = emailResetForm; });
const { form: tokenFormData, enhance: tokenEnhance } = tokenVerificationForm;
const { form: emailFormData, enhance: emailResetEnhance } = emailResetForm;
</script> const { form: tokenFormData, enhance: tokenEnhance } = tokenVerificationForm;
<Card.Root class="mx-auto mt-24 max-w-sm"> </script>
<Card.Header>
<Card.Title class="text-2xl">Reset Password</Card.Title> <div out:send={{ key: 'auth-card' }} in:receive={{ key: 'auth-card' }}>
<Card.Description>Enter your email to reset your password</Card.Description> <Card.Root class="mx-auto max-w-sm">
</Card.Header> <Card.Header>
<Card.Content> <Card.Title class="text-2xl">Reset Password</Card.Title>
<div class="grid gap-4"> <Card.Description>Enter your email to reset your password</Card.Description>
{#if showTokenVerification} </Card.Header>
{@render tokenForm()} <Card.Content>
{:else} <div class="grid gap-4">
{@render emailForm()} {#if showTokenVerification}
{/if} {@render tokenForm()}
</div> {:else}
</Card.Content> {@render emailForm()}
</Card.Root> {/if}
</div>
{#snippet emailForm()} </Card.Content>
<form method="POST" action="?/passwordReset" use:emailRegisterEnhance class="grid gap-4"> </Card.Root>
<Form.Field form={emailResetForm} name="email"> </div>
<Form.Control let:attrs>
<Form.Label>Email</Form.Label> {#snippet emailForm()}
<Input <form method="POST" action="?/passwordReset" use:emailResetEnhance class="grid gap-4">
{...attrs} <Form.Field form={emailResetForm} name="email">
type="email" <Form.Control let:attrs>
placeholder="you@awesome.com" <Form.Label>Email</Form.Label>
bind:value={$emailFormData.email} <Input
/> {...attrs}
</Form.Control> type="email"
<Form.Description /> placeholder="you@awesome.com"
<Form.FieldErrors /> bind:value={$emailFormData.email}
</Form.Field> />
<Button type="submit" class="w-full">Continue with Email</Button> </Form.Control>
</form> <Form.Description />
{/snippet} <Form.FieldErrors />
</Form.Field>
{#snippet tokenForm()} <Button type="submit" class="w-full">Continue with Email</Button>
<form method="POST" action="?/verifyToken" use:tokenEnhance class="space-y-4"> </form>
<input hidden value={$tokenFormData.resetToken} name="email" /> {/snippet}
<Form.Field form={tokenVerificationForm} name="resetToken">
<Form.Control let:attrs> {#snippet tokenForm()}
<Form.Label /> <form method="POST" action="?/verifyToken" use:tokenEnhance class="space-y-4">
<PinInput class="justify-evenly" {...attrs} bind:value={$tokenFormData.resetToken} /> <input hidden value={$tokenFormData.resetToken} name="email" />
</Form.Control> <Form.Field form={tokenVerificationForm} name="resetToken">
<Form.Description /> <Form.Control let:attrs>
<Form.FieldErrors /> <Form.Label>Enter the token that was sent to your email</Form.Label>
</Form.Field> <PinInput class="justify-evenly" {...attrs} bind:value={$tokenFormData.resetToken} />
<Button class="w-full" type="submit">Submit</Button> </Form.Control>
</form> <Form.Description />
<Form.FieldErrors />
</Form.Field>
<Button class="w-full" type="submit">Submit</Button>
</form>
{/snippet} {/snippet}

View file

@ -12,6 +12,7 @@
import * as Alert from '$lib/components/ui/alert'; import * as Alert from '$lib/components/ui/alert';
import * as Card from '$lib/components/ui/card'; import * as Card from '$lib/components/ui/card';
import * as Collapsible from '$lib/components/ui/collapsible'; import * as Collapsible from '$lib/components/ui/collapsible';
import { send, receive } from '$lib/utils/pageCrossfade';
import { boredState } from '$lib/stores/boredState.js'; import { boredState } from '$lib/stores/boredState.js';
export let data; export let data;
@ -38,91 +39,93 @@
<title>Bored Game | Sign Up</title> <title>Bored Game | Sign Up</title>
</svelte:head> </svelte:head>
<Card.Root class="mx-auto mt-24 max-w-sm"> <div in:receive={{ key: 'auth-card' }} out:send={{ key: 'auth-card' }}>
<Card.Header> <Card.Root class="mx-auto mt-24 max-w-sm">
Signup for an account <Card.Header>
</Card.Header> <Card.Title class="text-2xl">Signup for an account</Card.Title>
<Card.Content> </Card.Header>
<form method="POST" action="/sign-up" use:enhance> <Card.Content>
<Label for="username">Username</Label> <form method="POST" action="/sign-up" use:enhance class="grid gap-2 mt-4">
<Input type="text" id="username" class={$errors.username && "outline outline-destructive"} name="username" <Label for="username">Username <small>(required)</small></Label>
placeholder="Username" autocomplete="username" data-invalid={$errors.username} bind:value={$form.username} /> <Input type="text" id="username" class={$errors.username && "outline outline-destructive"} name="username"
{#if $errors.username} placeholder="Username" autocomplete="username" data-invalid={$errors.username} bind:value={$form.username} />
<p class="text-sm text-destructive">{$errors.username}</p> {#if $errors.username}
{/if} <p class="text-sm text-destructive">{$errors.username}</p>
<Label for="password">Password</Label> {/if}
<Input type="password" id="password" class={$errors.password && "outline outline-destructive"} name="password" <Label for="password">Password <small>(required)</small></Label>
placeholder="Password" autocomplete="new-password" data-invalid={$errors.password} <Input type="password" id="password" class={$errors.password && "outline outline-destructive"} name="password"
bind:value={$form.password} /> placeholder="Password" autocomplete="new-password" data-invalid={$errors.password}
{#if $errors.password} bind:value={$form.password} />
<p class="text-sm text-destructive">{$errors.password}</p> {#if $errors.password}
{/if} <p class="text-sm text-destructive">{$errors.password}</p>
<Label for="confirm_password">Confirm Password</Label> {/if}
<Input type="password" id="confirm_password" class={$errors.confirm_password && "outline outline-destructive"} <Label for="confirm_password">Confirm Password <small>(required)</small></Label>
name="confirm_password" placeholder="Confirm Password" autocomplete="new-password" <Input type="password" id="confirm_password" class={$errors.confirm_password && "outline outline-destructive"}
data-invalid={$errors.confirm_password} bind:value={$form.confirm_password} /> name="confirm_password" placeholder="Confirm Password" autocomplete="new-password"
{#if $errors.confirm_password} data-invalid={$errors.confirm_password} bind:value={$form.confirm_password} />
<p class="text-sm text-destructive">{$errors.confirm_password}</p> {#if $errors.confirm_password}
{/if} <p class="text-sm text-destructive">{$errors.confirm_password}</p>
<Collapsible.Root bind:open={collapsibleOpen} class="grid w-full max-w-sm items-center gap-2.5"> {/if}
<div> <Collapsible.Root bind:open={collapsibleOpen} class="grid w-full max-w-sm items-center gap-2.5">
Optional Fields: <div>
<Collapsible.Trigger asChild let:builder> Optional Fields:
<Button builders={[builder]} variant="ghost" size="sm" type="button" class="w-9 p-0"> <Collapsible.Trigger asChild let:builder>
<ChevronsUpDown class="h-4 w-4" /> <Button builders={[builder]} variant="ghost" size="sm" type="button" class="w-9 p-0">
<span class="sr-only">Toggle</span> <ChevronsUpDown class="h-4 w-4" />
</Button> <span class="sr-only">Toggle</span>
</Collapsible.Trigger> </Button>
</div> </Collapsible.Trigger>
<Collapsible.Content> </div>
<div transition:slide|global={{ delay: 10, duration: 150, easing: quintIn }}> <Collapsible.Content>
<Label for="email">Email</Label> <div transition:slide|global={{ delay: 10, duration: 150, easing: quintIn }}>
<Input type="email" id="email" class={$errors.email && "outline outline-destructive"} name="email" <Label for="email">Email</Label>
placeholder="Email" autocomplete="email" data-invalid={$errors.email} bind:value={$form.email} /> <Input type="email" id="email" class={$errors.email && "outline outline-destructive"} name="email"
{#if $errors.email} placeholder="Email" autocomplete="email" data-invalid={$errors.email} bind:value={$form.email} />
<p class="text-sm text-destructive">{$errors.email}</p> {#if $errors.email}
{/if} <p class="text-sm text-destructive">{$errors.email}</p>
{/if}
</div>
</Collapsible.Content>
<Collapsible.Content>
<div transition:slide|global={{ delay: 10, duration: 150, easing: quintIn }}>
<Label for="firstName">First Name</Label>
<Input type="text" id="firstName" class={$errors.firstName && "outline outline-destructive"} name="firstName"
placeholder="First Name" autocomplete="given-name" data-invalid={$errors.firstName}
bind:value={$form.firstName} />
{#if $errors.firstName}
<p class="text-sm text-destructive">{$errors.firstName}</p>
{/if}
</div>
</Collapsible.Content>
<Collapsible.Content>
<div transition:slide|global={{ delay: 10, duration: 150, easing: quintIn }}>
<Label for="firstName">Last Name</Label>
<Input type="text" id="lastName" class={$errors.firstName && "outline outline-destructive"} name="lastName"
placeholder="Last Name" autocomplete="family-name" data-invalid={$errors.lastName}
bind:value={$form.lastName} />
{#if $errors.lastName}
<p class="text-sm text-destructive">{$errors.lastName}</p>
{/if}
</div>
</Collapsible.Content>
</Collapsible.Root>
<div class="grid grid-cols-2">
<Button type="submit">Signup</Button>
<Button variant="link" class="text-secondary-foreground" href="/">or Cancel</Button>
</div> </div>
</Collapsible.Content> {#if !$form.email}
<Collapsible.Content> <Alert.Root>
<div transition:slide|global={{ delay: 10, duration: 150, easing: quintIn }}> <Alert.Title level="h3">Heads up!</Alert.Title>
<Label for="firstName">First Name</Label> <Alert.Description>
<Input type="text" id="firstName" class={$errors.firstName && "outline outline-destructive"} name="firstName" Without an email address, you won't be able to reset your password. Submit only if you are sure. You can
placeholder="First Name" autocomplete="given-name" data-invalid={$errors.firstName} always add this later.
bind:value={$form.firstName} /> </Alert.Description>
{#if $errors.firstName} </Alert.Root>
<p class="text-sm text-destructive">{$errors.firstName}</p> {/if}
{/if} </form>
</div> </Card.Content>
</Collapsible.Content> </Card.Root>
<Collapsible.Content> </div>
<div transition:slide|global={{ delay: 10, duration: 150, easing: quintIn }}>
<Label for="firstName">Last Name</Label>
<Input type="text" id="lastName" class={$errors.firstName && "outline outline-destructive"} name="lastName"
placeholder="Last Name" autocomplete="family-name" data-invalid={$errors.lastName}
bind:value={$form.lastName} />
{#if $errors.lastName}
<p class="text-sm text-destructive">{$errors.lastName}</p>
{/if}
</div>
</Collapsible.Content>
</Collapsible.Root>
<div class="grid grid-cols-2">
<Button type="submit">Signup</Button>
<Button variant="link" class="text-secondary-foreground" href="/">or Cancel</Button>
</div>
{#if !$form.email}
<Alert.Root>
<Alert.Title level="h3">Heads up!</Alert.Title>
<Alert.Description>
Without an email address, you won't be able to reset your password. Submit only if you are sure. You can
always add this later.
</Alert.Description>
</Alert.Root>
{/if}
</form>
</Card.Content>
</Card.Root>
<style lang="postcss"> <style lang="postcss">
.sign-up { .sign-up {