Adding dialog from shadcn svelte, fixing recovery codes rendering, fixing more Svelte 5 migrations, and adding pin input onto totp.

This commit is contained in:
Bradley Shellnut 2024-07-07 17:41:08 -07:00
parent 63ac7dfd76
commit 5c3349ca42
18 changed files with 546 additions and 205 deletions

View file

@ -22,11 +22,11 @@
},
"devDependencies": {
"@melt-ui/pp": "^0.3.2",
"@melt-ui/svelte": "^0.81.0",
"@melt-ui/svelte": "^0.83.0",
"@playwright/test": "^1.45.1",
"@resvg/resvg-js": "^2.6.2",
"@sveltejs/adapter-auto": "^3.2.2",
"@sveltejs/enhanced-img": "^0.2.1",
"@sveltejs/enhanced-img": "^0.3.0",
"@sveltejs/kit": "^2.5.18",
"@sveltejs/vite-plugin-svelte": "^3.1.1",
"@types/cookie": "^0.6.0",
@ -44,7 +44,7 @@
"postcss": "^8.4.39",
"postcss-import": "^16.1.0",
"postcss-load-config": "^5.1.0",
"postcss-preset-env": "^9.5.16",
"postcss-preset-env": "^9.6.0",
"prettier": "^3.3.2",
"prettier-plugin-svelte": "^3.2.5",
"sass": "^1.77.6",
@ -54,7 +54,7 @@
"svelte-check": "^3.8.4",
"svelte-headless-table": "^0.18.2",
"svelte-meta-tags": "^3.1.2",
"svelte-preprocess": "^5.1.4",
"svelte-preprocess": "^6.0.1",
"svelte-sequential-preprocessor": "^2.0.1",
"sveltekit-flash-message": "^2.4.4",
"sveltekit-rate-limiter": "^0.5.1",
@ -84,7 +84,7 @@
"@sveltejs/adapter-vercel": "^5.4.1",
"@types/feather-icons": "^4.29.4",
"@vercel/og": "^0.5.20",
"bits-ui": "^0.21.11",
"bits-ui": "^0.21.12",
"boardgamegeekclient": "^1.9.1",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",

View file

@ -39,8 +39,8 @@ importers:
specifier: ^0.5.20
version: 0.5.20
bits-ui:
specifier: ^0.21.11
version: 0.21.11(svelte@5.0.0-next.175)
specifier: ^0.21.12
version: 0.21.12(svelte@5.0.0-next.175)
boardgamegeekclient:
specifier: ^1.9.1
version: 1.9.1
@ -128,10 +128,10 @@ importers:
devDependencies:
'@melt-ui/pp':
specifier: ^0.3.2
version: 0.3.2(@melt-ui/svelte@0.81.0(svelte@5.0.0-next.175))(svelte@5.0.0-next.175)
version: 0.3.2(@melt-ui/svelte@0.83.0(svelte@5.0.0-next.175))(svelte@5.0.0-next.175)
'@melt-ui/svelte':
specifier: ^0.81.0
version: 0.81.0(svelte@5.0.0-next.175)
specifier: ^0.83.0
version: 0.83.0(svelte@5.0.0-next.175)
'@playwright/test':
specifier: ^1.45.1
version: 1.45.1
@ -142,8 +142,8 @@ importers:
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.3(@types/node@20.14.10)(sass@1.77.6)))(svelte@5.0.0-next.175)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)))
'@sveltejs/enhanced-img':
specifier: ^0.2.1
version: 0.2.1(rollup@4.18.0)(svelte@5.0.0-next.175)
specifier: ^0.3.0
version: 0.3.0(rollup@4.18.0)(svelte@5.0.0-next.175)
'@sveltejs/kit':
specifier: ^2.5.18
version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)))(svelte@5.0.0-next.175)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6))
@ -196,8 +196,8 @@ importers:
specifier: ^5.1.0
version: 5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2)
postcss-preset-env:
specifier: ^9.5.16
version: 9.5.16(postcss@8.4.39)
specifier: ^9.6.0
version: 9.6.0(postcss@8.4.39)
prettier:
specifier: ^3.3.2
version: 3.3.2
@ -226,8 +226,8 @@ importers:
specifier: ^3.1.2
version: 3.1.2(svelte@5.0.0-next.175)(typescript@5.5.3)
svelte-preprocess:
specifier: ^5.1.4
version: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.6)(svelte@5.0.0-next.175)(typescript@5.5.3)
specifier: ^6.0.1
version: 6.0.1(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.6)(svelte@5.0.0-next.175)(typescript@5.5.3)
svelte-sequential-preprocessor:
specifier: ^2.0.1
version: 2.0.1
@ -337,14 +337,20 @@ packages:
peerDependencies:
postcss: ^8.4
'@csstools/postcss-color-function@3.0.18':
resolution: {integrity: sha512-Ry8b3HCyadiBLObsGShdoJNoZkQTHz5q5HVY/hkwwBkq8q702amvcGJs06tpzFTwHL+jPc7vULUpYtK4MIJHwA==}
'@csstools/postcss-color-function@3.0.19':
resolution: {integrity: sha512-d1OHEXyYGe21G3q88LezWWx31ImEDdmINNDy0LyLNN9ChgN2bPxoubUPiHf9KmwypBMaHmNcMuA/WZOKdZk/Lg==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
'@csstools/postcss-color-mix-function@2.0.18':
resolution: {integrity: sha512-CtklpScpGZ3ZwUQMOCYlsWw8vMu+rjvKUJsa1zpFSvesoUK89JBC6+LzEhTlb1jMcyrY2ErySEQDOt+MMRse0A==}
'@csstools/postcss-color-mix-function@2.0.19':
resolution: {integrity: sha512-mLvQlMX+keRYr16AuvuV8WYKUwF+D0DiCqlBdvhQ0KYEtcQl9/is9Ssg7RcIys8x0jIn2h1zstS4izckdZj9wg==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
'@csstools/postcss-content-alt-text@1.0.0':
resolution: {integrity: sha512-SkHdj7EMM/57GVvSxSELpUg7zb5eAndBeuvGwFzYtU06/QXJ/h9fuK7wO5suteJzGhm3GDF/EWPCdWV2h1IGHQ==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -367,20 +373,20 @@ packages:
peerDependencies:
postcss: ^8.4
'@csstools/postcss-gradients-interpolation-method@4.0.19':
resolution: {integrity: sha512-aGKMXy2EhkyidYvfuILqoO6tk8bEIVS9obc6OAc1JwRLeQBkbPtL56eKd1DnyEfgJ+6v/4zA1Ko0AqPwAjA50w==}
'@csstools/postcss-gradients-interpolation-method@4.0.20':
resolution: {integrity: sha512-ZFl2JBHano6R20KB5ZrB8KdPM2pVK0u+/3cGQ2T8VubJq982I2LSOvQ4/VtxkAXjkPkk1rXt4AD1ni7UjTZ1Og==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
'@csstools/postcss-hwb-function@3.0.17':
resolution: {integrity: sha512-Oe8WBtP29K5EBCqOKOfKAUaDFWYw+16WCDuwaYJMS0o8oZdPwmxLaBDsqXlNK03zXe9McYBli8fBHyRiVEVJGQ==}
'@csstools/postcss-hwb-function@3.0.18':
resolution: {integrity: sha512-3ifnLltR5C7zrJ+g18caxkvSRnu9jBBXCYgnBznRjxm6gQJGnnCO9H6toHfywNdNr/qkiVf2dymERPQLDnjLRQ==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
'@csstools/postcss-ic-unit@3.0.6':
resolution: {integrity: sha512-fHaU9C/sZPauXMrzPitZ/xbACbvxbkPpHoUgB9Kw5evtsBWdVkVrajOyiT9qX7/c+G1yjApoQjP1fQatldsy9w==}
'@csstools/postcss-ic-unit@3.0.7':
resolution: {integrity: sha512-YoaNHH2wNZD+c+rHV02l4xQuDpfR8MaL7hD45iJyr+USwvr0LOheeytJ6rq8FN6hXBmEeoJBeXXgGmM8fkhH4g==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -397,8 +403,8 @@ packages:
peerDependencies:
postcss: ^8.4
'@csstools/postcss-light-dark-function@1.0.7':
resolution: {integrity: sha512-49LSrZR/d2Iql7Sq4C+k5SDvn0RvqXzCt//kWihVimxCUvZHGxrHeV777Hfr0lTfPlgfPdkCVdlaLM5XZTqIng==}
'@csstools/postcss-light-dark-function@1.0.8':
resolution: {integrity: sha512-x0UtpCyVnERsplUeoaY6nEtp1HxTf4lJjoK/ULEm40DraqFfUdUSt76yoOyX5rGY6eeOUOkurHyYlFHVKv/pew==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -457,20 +463,20 @@ packages:
peerDependencies:
postcss: ^8.4
'@csstools/postcss-oklab-function@3.0.18':
resolution: {integrity: sha512-qxcctjXBgGKYl/CUSh13zaKdB57meIDvgTwF1o4EKzzuJ4RM+t79GuWWAnVKesbAwQXn6k/JQb8LfOeH8g1t2w==}
'@csstools/postcss-oklab-function@3.0.19':
resolution: {integrity: sha512-e3JxXmxjU3jpU7TzZrsNqSX4OHByRC3XjItV3Ieo/JEQmLg5rdOL4lkv/1vp27gXemzfNt44F42k/pn0FpE21Q==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
'@csstools/postcss-progressive-custom-properties@3.2.0':
resolution: {integrity: sha512-BZlirVxCRgKlE7yVme+Xvif72eTn1MYXj8oZ4Knb+jwaH4u3AN1DjbhM7j86RP5vvuAOexJ4JwfifYYKWMN/QQ==}
'@csstools/postcss-progressive-custom-properties@3.3.0':
resolution: {integrity: sha512-W2oV01phnILaRGYPmGFlL2MT/OgYjQDrL9sFlbdikMFi6oQkFki9B86XqEWR7HCsTZFVq7dbzr/o71B75TKkGg==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
'@csstools/postcss-relative-color-syntax@2.0.18':
resolution: {integrity: sha512-C39i9fId7kz7VOJps2/ZJjsbppNMy5zF6ly+7xkJBPS89XlhBzKYTBObhRXDZDKfzXPZ4fwKOfqv5z+Cr+IIKg==}
'@csstools/postcss-relative-color-syntax@2.0.19':
resolution: {integrity: sha512-MxUMSNvio1WwuS6WRLlQuv6nNPXwIWUFzBBAvL/tBdWfiKjiJnAa6eSSN5gtaacSqUkQ/Ce5Z1OzLRfeaWhADA==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -973,12 +979,21 @@ packages:
'@floating-ui/core@1.6.2':
resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==}
'@floating-ui/core@1.6.4':
resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==}
'@floating-ui/dom@1.6.5':
resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==}
'@floating-ui/dom@1.6.7':
resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==}
'@floating-ui/utils@0.2.2':
resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==}
'@floating-ui/utils@0.2.4':
resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==}
'@fontsource/fira-mono@5.0.13':
resolution: {integrity: sha512-fZDjR2BdAqmauEbTjcIT62zYzbOgDa5+IQH34D2k8Pxmy1T815mAqQkZciWZVQ9dc/BgdTtTUV9HJ2ulBNwchg==}
@ -1012,14 +1027,14 @@ packages:
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
'@img/sharp-darwin-arm64@0.33.3':
resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==}
'@img/sharp-darwin-arm64@0.33.4':
resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm64]
os: [darwin]
'@img/sharp-darwin-x64@0.33.3':
resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==}
'@img/sharp-darwin-x64@0.33.4':
resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [x64]
os: [darwin]
@ -1072,55 +1087,55 @@ packages:
cpu: [x64]
os: [linux]
'@img/sharp-linux-arm64@0.33.3':
resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==}
'@img/sharp-linux-arm64@0.33.4':
resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm64]
os: [linux]
'@img/sharp-linux-arm@0.33.3':
resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==}
'@img/sharp-linux-arm@0.33.4':
resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==}
engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm]
os: [linux]
'@img/sharp-linux-s390x@0.33.3':
resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==}
engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
'@img/sharp-linux-s390x@0.33.4':
resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==}
engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [s390x]
os: [linux]
'@img/sharp-linux-x64@0.33.3':
resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==}
'@img/sharp-linux-x64@0.33.4':
resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==}
engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [x64]
os: [linux]
'@img/sharp-linuxmusl-arm64@0.33.3':
resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==}
'@img/sharp-linuxmusl-arm64@0.33.4':
resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==}
engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [arm64]
os: [linux]
'@img/sharp-linuxmusl-x64@0.33.3':
resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==}
'@img/sharp-linuxmusl-x64@0.33.4':
resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==}
engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [x64]
os: [linux]
'@img/sharp-wasm32@0.33.3':
resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==}
'@img/sharp-wasm32@0.33.4':
resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [wasm32]
'@img/sharp-win32-ia32@0.33.3':
resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==}
'@img/sharp-win32-ia32@0.33.4':
resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [ia32]
os: [win32]
'@img/sharp-win32-x64@0.33.3':
resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==}
'@img/sharp-win32-x64@0.33.4':
resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
cpu: [x64]
os: [win32]
@ -1192,8 +1207,8 @@ packages:
peerDependencies:
svelte: '>=3 <5'
'@melt-ui/svelte@0.81.0':
resolution: {integrity: sha512-QWVy+kVp8CZ+ph4W780PI6rPBa3MJIUFH/E1EHYfI05QloOGVBXtrI9MlzQSIrGYtGgSGQoTbh8cPO+YtkNAwg==}
'@melt-ui/svelte@0.83.0':
resolution: {integrity: sha512-E7QT+8YSftz+Hdk1W0hNR3f+cnaF2COMWkStn+2u4vk0RO1I9mXRJl+bJD6uhYaH146oxEB+5elu/ABbv6rpsA==}
peerDependencies:
svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118
@ -1695,8 +1710,8 @@ packages:
peerDependencies:
'@sveltejs/kit': ^2.4.0
'@sveltejs/enhanced-img@0.2.1':
resolution: {integrity: sha512-tEJCtDDSY4Od7YosS2OAHFjGwM09AOHaL97YuqDAnnKLnTpSYJvpLl3r6bLmWDht2ZqoAXfaPsbFJaG9zbQMjw==}
'@sveltejs/enhanced-img@0.3.0':
resolution: {integrity: sha512-o8FdEUyJR/+LjUUl4sgB9QeM9rSGpOzTO6/CH0AmO/FgwWkcJdj/MwVNtr2F/AtaPgNfzvRpnExjklmuuDOtPA==}
'@sveltejs/kit@2.5.18':
resolution: {integrity: sha512-+g06hvpVAnH7b4CDjhnTDgFWBKBiQJpuSmQeGYOuzbO3SC3tdYjRNlDCrafvDtKbGiT2uxY5Dn9qdEUGVZdWOQ==}
@ -1980,8 +1995,8 @@ packages:
bindings@1.5.0:
resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
bits-ui@0.21.11:
resolution: {integrity: sha512-pFS/9z1qLaPZwb+9Tm0YS4iBp+ClsJBARMZWFOjv0lGCYpzAN7lx4eNk3SbSB5QMBUKwoVjr9Rai71ROq3RD1Q==}
bits-ui@0.21.12:
resolution: {integrity: sha512-Cf0iB+ZKwA0ZjkpixrhrZK9PC6pGPFleW/65Xc/z0lpGvWaFtdOhiYEntCHHxZ0VihP3aJaG0OBhUBIbmAePaA==}
peerDependencies:
svelte: ^4.0.0 || ^5.0.0-next.118
@ -2167,8 +2182,8 @@ packages:
resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
cssdb@8.0.0:
resolution: {integrity: sha512-hfpm8VXc7/dhcEWpLvKDLwImOSk1sa2DxL36OEiY/4h2MGfKjPYIMZo4hnEEl+TCJr2GwcX46jF5TafRASDe9w==}
cssdb@8.1.0:
resolution: {integrity: sha512-BQN57lfS4dYt2iL0LgyrlDbefZKEtUyrO8rbzrbGrqBk6OoyNTQLF+porY9DrpDBjLo4NEvj2IJttC7vf3x+Ew==}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
@ -3197,8 +3212,8 @@ packages:
peerDependencies:
postcss: ^8.4.6
postcss-color-functional-notation@6.0.13:
resolution: {integrity: sha512-c2zzoZPJG1/tH1wrFOstQ2q/bvzFXNIDPFJu+l9idwwpVXbgrD4ThiuIcQxCBhOVY+CJ/Kb7DKiRLNsjTjj/+A==}
postcss-color-functional-notation@6.0.14:
resolution: {integrity: sha512-dNUX+UH4dAozZ8uMHZ3CtCNYw8fyFAmqqdcyxMr7PEdM9jLXV19YscoYO0F25KqZYhmtWKQ+4tKrIZQrwzwg7A==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -3239,8 +3254,8 @@ packages:
peerDependencies:
postcss: ^8.4
postcss-double-position-gradients@5.0.6:
resolution: {integrity: sha512-QJ+089FKMaqDxOhhIHsJrh4IP7h4PIHNC5jZP5PMmnfUScNu8Hji2lskqpFWCvu+5sj+2EJFyzKd13sLEWOZmQ==}
postcss-double-position-gradients@5.0.7:
resolution: {integrity: sha512-1xEhjV9u1s4l3iP5lRt1zvMjI/ya8492o9l/ivcxHhkO3nOz16moC4JpMxDUGrOs4R3hX+KWT7gKoV842cwRgg==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -3292,8 +3307,8 @@ packages:
peerDependencies:
postcss: ^8.4.21
postcss-lab-function@6.0.18:
resolution: {integrity: sha512-7/V6sqQW06dVC8hhT6qe913UPhD+PSDdoMUn5jByP+FRDg4ErWXFayl2rpW398hI2QTmOeNLUsTBa0lzbsXZZg==}
postcss-lab-function@6.0.19:
resolution: {integrity: sha512-vwln/mgvFrotJuGV8GFhpAOu9iGf3pvTBr6dLPDmUcqVD5OsQpEFyQMAFTxSxWXGEzBj6ld4pZ/9GDfEpXvo0g==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -3378,8 +3393,8 @@ packages:
peerDependencies:
postcss: ^8.4
postcss-preset-env@9.5.16:
resolution: {integrity: sha512-bQhNpSW4WE4k4Tq3xWf9Al9bN4r609aXXzE4ZoPs/KPBSjhTohUMVmXvUJ2wleSbx4II8nyC9tgiPIysPAFh6A==}
postcss-preset-env@9.6.0:
resolution: {integrity: sha512-Lxfk4RYjUdwPCYkc321QMdgtdCP34AeI94z+/8kVmqnTIlD4bMRQeGcMZgwz8BxHrzQiFXYIR5d7k/9JMs2MEA==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.4
@ -3609,11 +3624,6 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
semver@7.6.1:
resolution: {integrity: sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==}
engines: {node: '>=10'}
hasBin: true
semver@7.6.2:
resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
engines: {node: '>=10'}
@ -3625,8 +3635,8 @@ packages:
set-cookie-parser@2.6.0:
resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
sharp@0.33.3:
resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==}
sharp@0.33.4:
resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==}
engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0}
shebang-command@2.0.0:
@ -3784,10 +3794,10 @@ packages:
peerDependencies:
svelte: ^3.55.0 || ^4.0.0
svelte-parse-markup@0.1.2:
resolution: {integrity: sha512-DycY7DJr7VqofiJ63ut1/NEG92HrWWL56VWITn/cJCu+LlZhMoBkBXT4opUitPEEwbq1nMQbv4vTKUfbOqIW1g==}
svelte-parse-markup@0.1.5:
resolution: {integrity: sha512-T6mqZrySltPCDwfKXWQ6zehipVLk4GWfH1zCMGgRtLlOIFPuw58ZxVYxVvotMJgJaurKi1i14viB2GIRKXeJTQ==}
peerDependencies:
svelte: ^3.0.0 || ^4.0.0
svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1
svelte-preprocess@5.1.4:
resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==}
@ -3826,6 +3836,43 @@ packages:
typescript:
optional: true
svelte-preprocess@6.0.1:
resolution: {integrity: sha512-vNgXoyqWwahdpEX9XbQHcAHt41TkXnf8bRDxT5PjISHbZD1dVH4b2OsJ2fVQTBb3qP05x0GuYE9iS5vhD+Dniw==}
engines: {node: '>= 18.0.0'}
peerDependencies:
'@babel/core': ^7.10.2
coffeescript: ^2.5.1
less: ^3.11.3 || ^4.0.0
postcss: ^7 || ^8
postcss-load-config: '>=3'
pug: ^3.0.0
sass: ^1.26.8
stylus: '>=0.55'
sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
svelte: ^4.0.0 || ^5.0.0-next.100 || ^5.0.0
typescript: ^5.0.0
peerDependenciesMeta:
'@babel/core':
optional: true
coffeescript:
optional: true
less:
optional: true
postcss:
optional: true
postcss-load-config:
optional: true
pug:
optional: true
sass:
optional: true
stylus:
optional: true
sugarss:
optional: true
typescript:
optional: true
svelte-render@2.0.1:
resolution: {integrity: sha512-RpB0SurwXm4xhjvHHtjeqMmvd645FURb79GFOotScOSqnKK5vpqBgoBPGC0pp+E/eZgDSQ9rRAdn/+N4ys1mXQ==}
peerDependencies:
@ -4281,21 +4328,29 @@ snapshots:
postcss: 8.4.39
postcss-selector-parser: 6.1.0
'@csstools/postcss-color-function@3.0.18(postcss@8.4.39)':
'@csstools/postcss-color-function@3.0.19(postcss@8.4.39)':
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
'@csstools/postcss-color-mix-function@2.0.18(postcss@8.4.39)':
'@csstools/postcss-color-mix-function@2.0.19(postcss@8.4.39)':
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
'@csstools/postcss-content-alt-text@1.0.0(postcss@8.4.39)':
dependencies:
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
@ -4319,27 +4374,27 @@ snapshots:
'@csstools/css-tokenizer': 2.4.1
postcss: 8.4.39
'@csstools/postcss-gradients-interpolation-method@4.0.19(postcss@8.4.39)':
'@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.4.39)':
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
'@csstools/postcss-hwb-function@3.0.17(postcss@8.4.39)':
'@csstools/postcss-hwb-function@3.0.18(postcss@8.4.39)':
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
'@csstools/postcss-ic-unit@3.0.6(postcss@8.4.39)':
'@csstools/postcss-ic-unit@3.0.7(postcss@8.4.39)':
dependencies:
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
postcss-value-parser: 4.2.0
@ -4354,11 +4409,11 @@ snapshots:
postcss: 8.4.39
postcss-selector-parser: 6.1.0
'@csstools/postcss-light-dark-function@1.0.7(postcss@8.4.39)':
'@csstools/postcss-light-dark-function@1.0.8(postcss@8.4.39)':
dependencies:
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
@ -4411,26 +4466,26 @@ snapshots:
postcss: 8.4.39
postcss-value-parser: 4.2.0
'@csstools/postcss-oklab-function@3.0.18(postcss@8.4.39)':
'@csstools/postcss-oklab-function@3.0.19(postcss@8.4.39)':
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
'@csstools/postcss-progressive-custom-properties@3.2.0(postcss@8.4.39)':
'@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.4.39)':
dependencies:
postcss: 8.4.39
postcss-value-parser: 4.2.0
'@csstools/postcss-relative-color-syntax@2.0.18(postcss@8.4.39)':
'@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.4.39)':
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
@ -4738,13 +4793,24 @@ snapshots:
dependencies:
'@floating-ui/utils': 0.2.2
'@floating-ui/core@1.6.4':
dependencies:
'@floating-ui/utils': 0.2.4
'@floating-ui/dom@1.6.5':
dependencies:
'@floating-ui/core': 1.6.2
'@floating-ui/utils': 0.2.2
'@floating-ui/dom@1.6.7':
dependencies:
'@floating-ui/core': 1.6.4
'@floating-ui/utils': 0.2.4
'@floating-ui/utils@0.2.2': {}
'@floating-ui/utils@0.2.4': {}
'@fontsource/fira-mono@5.0.13': {}
'@gcornut/valibot-json-schema@0.31.0':
@ -4786,12 +4852,12 @@ snapshots:
'@iconify/types@2.0.0': {}
'@img/sharp-darwin-arm64@0.33.3':
'@img/sharp-darwin-arm64@0.33.4':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.0.2
optional: true
'@img/sharp-darwin-x64@0.33.3':
'@img/sharp-darwin-x64@0.33.4':
optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.0.2
optional: true
@ -4820,45 +4886,45 @@ snapshots:
'@img/sharp-libvips-linuxmusl-x64@1.0.2':
optional: true
'@img/sharp-linux-arm64@0.33.3':
'@img/sharp-linux-arm64@0.33.4':
optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.0.2
optional: true
'@img/sharp-linux-arm@0.33.3':
'@img/sharp-linux-arm@0.33.4':
optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.0.2
optional: true
'@img/sharp-linux-s390x@0.33.3':
'@img/sharp-linux-s390x@0.33.4':
optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.0.2
optional: true
'@img/sharp-linux-x64@0.33.3':
'@img/sharp-linux-x64@0.33.4':
optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.0.2
optional: true
'@img/sharp-linuxmusl-arm64@0.33.3':
'@img/sharp-linuxmusl-arm64@0.33.4':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.0.2
optional: true
'@img/sharp-linuxmusl-x64@0.33.3':
'@img/sharp-linuxmusl-x64@0.33.4':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.0.2
optional: true
'@img/sharp-wasm32@0.33.3':
'@img/sharp-wasm32@0.33.4':
dependencies:
'@emnapi/runtime': 1.2.0
optional: true
'@img/sharp-win32-ia32@0.33.3':
'@img/sharp-win32-ia32@0.33.4':
optional: true
'@img/sharp-win32-x64@0.33.3':
'@img/sharp-win32-x64@0.33.4':
optional: true
'@internationalized/date@3.5.3':
@ -4931,9 +4997,9 @@ snapshots:
- encoding
- supports-color
'@melt-ui/pp@0.3.2(@melt-ui/svelte@0.81.0(svelte@5.0.0-next.175))(svelte@5.0.0-next.175)':
'@melt-ui/pp@0.3.2(@melt-ui/svelte@0.83.0(svelte@5.0.0-next.175))(svelte@5.0.0-next.175)':
dependencies:
'@melt-ui/svelte': 0.81.0(svelte@5.0.0-next.175)
'@melt-ui/svelte': 0.83.0(svelte@5.0.0-next.175)
estree-walker: 3.0.3
magic-string: 0.30.10
svelte: 5.0.0-next.175
@ -4948,10 +5014,10 @@ snapshots:
nanoid: 5.0.7
svelte: 5.0.0-next.175
'@melt-ui/svelte@0.81.0(svelte@5.0.0-next.175)':
'@melt-ui/svelte@0.83.0(svelte@5.0.0-next.175)':
dependencies:
'@floating-ui/core': 1.6.2
'@floating-ui/dom': 1.6.5
'@floating-ui/core': 1.6.4
'@floating-ui/dom': 1.6.7
'@internationalized/date': 3.5.4
dequal: 2.0.3
focus-trap: 7.5.4
@ -5320,10 +5386,10 @@ snapshots:
- encoding
- supports-color
'@sveltejs/enhanced-img@0.2.1(rollup@4.18.0)(svelte@5.0.0-next.175)':
'@sveltejs/enhanced-img@0.3.0(rollup@4.18.0)(svelte@5.0.0-next.175)':
dependencies:
magic-string: 0.30.10
svelte-parse-markup: 0.1.2(svelte@5.0.0-next.175)
svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175)
vite-imagetools: 7.0.2(rollup@4.18.0)
transitivePeerDependencies:
- rollup
@ -5667,7 +5733,7 @@ snapshots:
dependencies:
file-uri-to-path: 1.0.0
bits-ui@0.21.11(svelte@5.0.0-next.175):
bits-ui@0.21.12(svelte@5.0.0-next.175):
dependencies:
'@internationalized/date': 3.5.3
'@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.175)
@ -5862,7 +5928,7 @@ snapshots:
mdn-data: 2.0.30
source-map-js: 1.2.0
cssdb@8.0.0: {}
cssdb@8.1.0: {}
cssesc@3.0.0: {}
@ -6362,7 +6428,7 @@ snapshots:
imagetools-core@7.0.0:
dependencies:
sharp: 0.33.3
sharp: 0.33.4
immutable@4.3.5: {}
@ -6839,12 +6905,12 @@ snapshots:
postcss: 8.4.39
postcss-value-parser: 4.2.0
postcss-color-functional-notation@6.0.13(postcss@8.4.39):
postcss-color-functional-notation@6.0.14(postcss@8.4.39):
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
@ -6890,9 +6956,9 @@ snapshots:
postcss: 8.4.39
postcss-selector-parser: 6.0.16
postcss-double-position-gradients@5.0.6(postcss@8.4.39):
postcss-double-position-gradients@5.0.7(postcss@8.4.39):
dependencies:
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
postcss-value-parser: 4.2.0
@ -6940,12 +7006,12 @@ snapshots:
camelcase-css: 2.0.1
postcss: 8.4.39
postcss-lab-function@6.0.18(postcss@8.4.39):
postcss-lab-function@6.0.19(postcss@8.4.39):
dependencies:
'@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/utilities': 1.0.0(postcss@8.4.39)
postcss: 8.4.39
@ -7009,20 +7075,21 @@ snapshots:
postcss: 8.4.39
postcss-value-parser: 4.2.0
postcss-preset-env@9.5.16(postcss@8.4.39):
postcss-preset-env@9.6.0(postcss@8.4.39):
dependencies:
'@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.39)
'@csstools/postcss-color-function': 3.0.18(postcss@8.4.39)
'@csstools/postcss-color-mix-function': 2.0.18(postcss@8.4.39)
'@csstools/postcss-color-function': 3.0.19(postcss@8.4.39)
'@csstools/postcss-color-mix-function': 2.0.19(postcss@8.4.39)
'@csstools/postcss-content-alt-text': 1.0.0(postcss@8.4.39)
'@csstools/postcss-exponential-functions': 1.0.9(postcss@8.4.39)
'@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.39)
'@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.4.39)
'@csstools/postcss-gradients-interpolation-method': 4.0.19(postcss@8.4.39)
'@csstools/postcss-hwb-function': 3.0.17(postcss@8.4.39)
'@csstools/postcss-ic-unit': 3.0.6(postcss@8.4.39)
'@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.4.39)
'@csstools/postcss-hwb-function': 3.0.18(postcss@8.4.39)
'@csstools/postcss-ic-unit': 3.0.7(postcss@8.4.39)
'@csstools/postcss-initial': 1.0.1(postcss@8.4.39)
'@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.4.39)
'@csstools/postcss-light-dark-function': 1.0.7(postcss@8.4.39)
'@csstools/postcss-light-dark-function': 1.0.8(postcss@8.4.39)
'@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.39)
'@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.39)
'@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.39)
@ -7032,9 +7099,9 @@ snapshots:
'@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.4.39)
'@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.39)
'@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.39)
'@csstools/postcss-oklab-function': 3.0.18(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.2.0(postcss@8.4.39)
'@csstools/postcss-relative-color-syntax': 2.0.18(postcss@8.4.39)
'@csstools/postcss-oklab-function': 3.0.19(postcss@8.4.39)
'@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39)
'@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.4.39)
'@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.39)
'@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.4.39)
'@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.4.39)
@ -7045,24 +7112,24 @@ snapshots:
css-blank-pseudo: 6.0.2(postcss@8.4.39)
css-has-pseudo: 6.0.5(postcss@8.4.39)
css-prefers-color-scheme: 9.0.1(postcss@8.4.39)
cssdb: 8.0.0
cssdb: 8.1.0
postcss: 8.4.39
postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.39)
postcss-clamp: 4.1.0(postcss@8.4.39)
postcss-color-functional-notation: 6.0.13(postcss@8.4.39)
postcss-color-functional-notation: 6.0.14(postcss@8.4.39)
postcss-color-hex-alpha: 9.0.4(postcss@8.4.39)
postcss-color-rebeccapurple: 9.0.3(postcss@8.4.39)
postcss-custom-media: 10.0.8(postcss@8.4.39)
postcss-custom-properties: 13.3.12(postcss@8.4.39)
postcss-custom-selectors: 7.1.12(postcss@8.4.39)
postcss-dir-pseudo-class: 8.0.1(postcss@8.4.39)
postcss-double-position-gradients: 5.0.6(postcss@8.4.39)
postcss-double-position-gradients: 5.0.7(postcss@8.4.39)
postcss-focus-visible: 9.0.1(postcss@8.4.39)
postcss-focus-within: 8.0.1(postcss@8.4.39)
postcss-font-variant: 5.0.0(postcss@8.4.39)
postcss-gap-properties: 5.0.1(postcss@8.4.39)
postcss-image-set-function: 6.0.3(postcss@8.4.39)
postcss-lab-function: 6.0.18(postcss@8.4.39)
postcss-lab-function: 6.0.19(postcss@8.4.39)
postcss-logical: 7.0.1(postcss@8.4.39)
postcss-nesting: 12.1.5(postcss@8.4.39)
postcss-opacity-percentage: 2.0.0(postcss@8.4.39)
@ -7322,22 +7389,20 @@ snapshots:
semver@6.3.1: {}
semver@7.6.1: {}
semver@7.6.2: {}
set-blocking@2.0.0: {}
set-cookie-parser@2.6.0: {}
sharp@0.33.3:
sharp@0.33.4:
dependencies:
color: 4.2.3
detect-libc: 2.0.3
semver: 7.6.1
semver: 7.6.2
optionalDependencies:
'@img/sharp-darwin-arm64': 0.33.3
'@img/sharp-darwin-x64': 0.33.3
'@img/sharp-darwin-arm64': 0.33.4
'@img/sharp-darwin-x64': 0.33.4
'@img/sharp-libvips-darwin-arm64': 1.0.2
'@img/sharp-libvips-darwin-x64': 1.0.2
'@img/sharp-libvips-linux-arm': 1.0.2
@ -7346,15 +7411,15 @@ snapshots:
'@img/sharp-libvips-linux-x64': 1.0.2
'@img/sharp-libvips-linuxmusl-arm64': 1.0.2
'@img/sharp-libvips-linuxmusl-x64': 1.0.2
'@img/sharp-linux-arm': 0.33.3
'@img/sharp-linux-arm64': 0.33.3
'@img/sharp-linux-s390x': 0.33.3
'@img/sharp-linux-x64': 0.33.3
'@img/sharp-linuxmusl-arm64': 0.33.3
'@img/sharp-linuxmusl-x64': 0.33.3
'@img/sharp-wasm32': 0.33.3
'@img/sharp-win32-ia32': 0.33.3
'@img/sharp-win32-x64': 0.33.3
'@img/sharp-linux-arm': 0.33.4
'@img/sharp-linux-arm64': 0.33.4
'@img/sharp-linux-s390x': 0.33.4
'@img/sharp-linux-x64': 0.33.4
'@img/sharp-linuxmusl-arm64': 0.33.4
'@img/sharp-linuxmusl-x64': 0.33.4
'@img/sharp-wasm32': 0.33.4
'@img/sharp-win32-ia32': 0.33.4
'@img/sharp-win32-x64': 0.33.4
shebang-command@2.0.0:
dependencies:
@ -7520,7 +7585,7 @@ snapshots:
transitivePeerDependencies:
- typescript
svelte-parse-markup@0.1.2(svelte@5.0.0-next.175):
svelte-parse-markup@0.1.5(svelte@5.0.0-next.175):
dependencies:
svelte: 5.0.0-next.175
@ -7538,6 +7603,17 @@ snapshots:
sass: 1.77.6
typescript: 5.5.3
svelte-preprocess@6.0.1(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.6)(svelte@5.0.0-next.175)(typescript@5.5.3):
dependencies:
detect-indent: 6.1.0
strip-indent: 3.0.0
svelte: 5.0.0-next.175
optionalDependencies:
postcss: 8.4.39
postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2)
sass: 1.77.6
typescript: 5.5.3
svelte-render@2.0.1(svelte@5.0.0-next.175):
dependencies:
svelte: 5.0.0-next.175

View file

@ -26,7 +26,6 @@
<span class="logo-text">Bored Game</span>
</a>
</div>
<!-- <TextSearch /> -->
<nav>
{#if user}
<DropdownMenu.Root>
@ -39,7 +38,7 @@
</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Group>
<DropdownMenu.Label>My Account</DropdownMenu.Label>
<DropdownMenu.Label>Account</DropdownMenu.Label>
<DropdownMenu.Separator />
<a href="/profile">
<DropdownMenu.Item>
@ -59,35 +58,35 @@
<span>Wishlists</span>
</DropdownMenu.Item>
</a>
<form
use:enhance={() => {
return async ({ result }) => {
console.log(result);
if (result.type === 'success' || result.type === 'redirect') {
toast.success('Logged Out');
} else if (result.type === 'error') {
<DropdownMenu.Item>
<form
use:enhance={() => {
return async ({ result }) => {
console.log(result);
toast.error(`Error: ${result.error.message}`);
} else {
toast.error(`Something went wrong.`);
console.log(result);
}
await invalidateAll();
await applyAction(result);
};
}}
action="/logout"
method="POST"
>
<button type="submit" class="">
<DropdownMenu.Item>
if (result.type === 'success' || result.type === 'redirect') {
toast.success('Logged Out');
} else if (result.type === 'error') {
console.log(result);
toast.error(`Error: ${result.error.message}`);
} else {
toast.error(`Something went wrong.`);
console.log(result);
}
await invalidateAll();
await applyAction(result);
};
}}
action="/logout"
method="POST"
>
<button type="submit">
<div class="flex items-center gap-1">
<LogOut class="mr-2 h-4 w-4" />
<span>Sign out</span>
</div>
</DropdownMenu.Item>
</button>
</form>
</button>
</form>
</DropdownMenu.Item>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root>

View file

@ -0,0 +1,32 @@
<script lang="ts">
import { cn } from '$lib/utils/ui';
import { PinInput, type PinInputProps } from 'bits-ui';
interface Props extends Omit<PinInputProps, 'value'> {
value: string;
inputCount?: number;
}
let { value = $bindable(), inputCount = 6, ...rest }: Props = $props();
let pin = $state<string[] | undefined>(value?.split('') ?? []);
let inputs = $derived(Array(inputCount).fill(null));
$effect(() => {
value = pin?.join('') ?? '';
});
</script>
<PinInput.Root
{...rest}
bind:value={pin}
class={cn('flex items-center gap-2', rest.class)}
type="text"
placeholder=""
>
{#each inputs as _}
<PinInput.Input
class="flex h-14 w-10 rounded-md border border-input bg-background px-3 py-2 text-center text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
/>
{/each}
<PinInput.HiddenInput />
</PinInput.Root>

View file

@ -0,0 +1,36 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from "bits-ui";
import X from "lucide-svelte/icons/x";
import * as Dialog from "./index.js";
import { cn, flyAndScale } from "$lib/utils.js";
type $$Props = DialogPrimitive.ContentProps;
let className: $$Props["class"] = undefined;
export let transition: $$Props["transition"] = flyAndScale;
export let transitionConfig: $$Props["transitionConfig"] = {
duration: 200,
};
export { className as class };
</script>
<Dialog.Portal>
<Dialog.Overlay />
<DialogPrimitive.Content
{transition}
{transitionConfig}
class={cn(
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg md:w-full",
className
)}
{...$$restProps}
>
<slot />
<DialogPrimitive.Close
class="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"
>
<X class="h-4 w-4" />
<span class="sr-only">Close</span>
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</Dialog.Portal>

View file

@ -0,0 +1,16 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
type $$Props = DialogPrimitive.DescriptionProps;
let className: $$Props["class"] = undefined;
export { className as class };
</script>
<DialogPrimitive.Description
class={cn("text-sm text-muted-foreground", className)}
{...$$restProps}
>
<slot />
</DialogPrimitive.Description>

View file

@ -0,0 +1,16 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn } from "$lib/utils.js";
type $$Props = HTMLAttributes<HTMLDivElement>;
let className: $$Props["class"] = undefined;
export { className as class };
</script>
<div
class={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)}
{...$$restProps}
>
<slot />
</div>

View file

@ -0,0 +1,13 @@
<script lang="ts">
import type { HTMLAttributes } from "svelte/elements";
import { cn } from "$lib/utils.js";
type $$Props = HTMLAttributes<HTMLDivElement>;
let className: $$Props["class"] = undefined;
export { className as class };
</script>
<div class={cn("flex flex-col space-y-1.5 text-center sm:text-left", className)} {...$$restProps}>
<slot />
</div>

View file

@ -0,0 +1,21 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from "bits-ui";
import { fade } from "svelte/transition";
import { cn } from "$lib/utils.js";
type $$Props = DialogPrimitive.OverlayProps;
let className: $$Props["class"] = undefined;
export let transition: $$Props["transition"] = fade;
export let transitionConfig: $$Props["transitionConfig"] = {
duration: 150,
};
export { className as class };
</script>
<DialogPrimitive.Overlay
{transition}
{transitionConfig}
class={cn("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm", className)}
{...$$restProps}
/>

View file

@ -0,0 +1,8 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from "bits-ui";
type $$Props = DialogPrimitive.PortalProps;
</script>
<DialogPrimitive.Portal {...$$restProps}>
<slot />
</DialogPrimitive.Portal>

View file

@ -0,0 +1,16 @@
<script lang="ts">
import { Dialog as DialogPrimitive } from "bits-ui";
import { cn } from "$lib/utils.js";
type $$Props = DialogPrimitive.TitleProps;
let className: $$Props["class"] = undefined;
export { className as class };
</script>
<DialogPrimitive.Title
class={cn("text-lg font-semibold leading-none tracking-tight", className)}
{...$$restProps}
>
<slot />
</DialogPrimitive.Title>

View file

@ -1,12 +1,37 @@
import { Dialog as DialogPrimitive } from "radix-svelte";
import { Dialog as DialogPrimitive } from "bits-ui";
export const Dialog = DialogPrimitive.Root;
export const DialogTrigger = DialogPrimitive.Trigger;
import Title from "./dialog-title.svelte";
import Portal from "./dialog-portal.svelte";
import Footer from "./dialog-footer.svelte";
import Header from "./dialog-header.svelte";
import Overlay from "./dialog-overlay.svelte";
import Content from "./dialog-content.svelte";
import Description from "./dialog-description.svelte";
export { default as DialogContent } from "./DialogContent.svelte";
export { default as DialogDescription } from "./DialogDescription.svelte";
export { default as DialogFooter } from "./DialogFooter.svelte";
export { default as DialogHeader } from "./DialogHeader.svelte";
export { default as DialogOverlay } from "./DialogOverlay.svelte";
export { default as DialogPortal } from "./DialogPortal.svelte";
export { default as DialogTitle } from "./DialogTitle.svelte";
const Root = DialogPrimitive.Root;
const Trigger = DialogPrimitive.Trigger;
const Close = DialogPrimitive.Close;
export {
Root,
Title,
Portal,
Footer,
Header,
Trigger,
Overlay,
Content,
Description,
Close,
//
Root as Dialog,
Title as DialogTitle,
Portal as DialogPortal,
Footer as DialogFooter,
Header as DialogHeader,
Trigger as DialogTrigger,
Overlay as DialogOverlay,
Content as DialogContent,
Description as DialogDescription,
Close as DialogClose,
};

56
src/lib/utils/ui.ts Normal file
View file

@ -0,0 +1,56 @@
import { type ClassValue, clsx } from 'clsx';
import { twMerge } from 'tailwind-merge';
import { cubicOut } from 'svelte/easing';
import type { TransitionConfig } from 'svelte/transition';
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
type FlyAndScaleParams = {
y?: number;
x?: number;
start?: number;
duration?: number;
};
export const flyAndScale = (
node: Element,
params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 },
): TransitionConfig => {
const style = getComputedStyle(node);
const transform = style.transform === 'none' ? '' : style.transform;
const scaleConversion = (valueA: number, scaleA: [number, number], scaleB: [number, number]) => {
const [minA, maxA] = scaleA;
const [minB, maxB] = scaleB;
const percentage = (valueA - minA) / (maxA - minA);
const valueB = percentage * (maxB - minB) + minB;
return valueB;
};
const styleToString = (style: Record<string, number | string | undefined>): string => {
return Object.keys(style).reduce((str, key) => {
if (style[key] === undefined) return str;
return str + `${key}:${style[key]};`;
}, '');
};
return {
duration: params.duration ?? 200,
delay: 0,
css: (t) => {
const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]);
const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]);
const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]);
return styleToString({
transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`,
opacity: t,
});
},
easing: cubicOut,
};
};

View file

@ -10,7 +10,7 @@
import { Input } from '$components/ui/input';
import { Button } from '$components/ui/button';
export let data;
const { data } = $props();
const hasSetupTwoFactor = data.hasSetupTwoFactor;

View file

@ -16,12 +16,12 @@ export const load: PageServerLoad = async (event) => {
}
const dbUser = await db.query.users.findFirst({
where: eq(users.id, user.id),
where: eq(users.id, user!.id),
});
if (dbUser?.two_factor_enabled) {
const dbRecoveryCodes = await db.query.recoveryCodes.findMany({
where: eq(recoveryCodes.userId, user.id),
where: eq(recoveryCodes.userId, user!.id),
});
if (dbRecoveryCodes.length === 0) {
@ -33,13 +33,13 @@ export const load: PageServerLoad = async (event) => {
const hashedCode = await new Argon2id().hash(code);
console.log('Inserting recovery code', code, hashedCode);
await db.insert(recoveryCodes).values({
userId: user.id,
userId: user!.id,
code: hashedCode,
});
}
}
return {
recoveryCodes,
recoveryCodes: createdRecoveryCodes,
};
}
return {

View file

@ -1,5 +1,5 @@
<script lang="ts">
export let data;
const { data } = $props();
const { recoveryCodes } = data;
</script>

View file

@ -2,14 +2,28 @@
const { data } = $props();
const { user, wishlists = [], collections = []} = data;
const welcome = $derived(`${data?.user?.firstName} ${data?.user?.lastName}` || user?.username)
const welcomeName = $derived.by(() => {
let welcomeName = '';
if (data?.user?.firstName) {
welcomeName += data?.user?.firstName;
}
if (data?.user?.lastName) {
welcomeName += ' ' + data?.user?.lastName;
}
if (welcomeName.length === 0) {
return user?.username;
}
return welcomeName;
});
$inspect(data);
</script>
<div class="container">
{#if user}
<h1>Welcome, {welcome}!</h1>
<h1>Welcome, {welcomeName}!</h1>
<div>
<h2>You wishlists:</h2>
{#each wishlists as wishlist}

View file

@ -10,8 +10,9 @@
import { Button } from '$components/ui/button';
import * as Alert from "$components/ui/alert";
import { boredState } from '$lib/stores/boredState.js';
import PinInput from '$components/pin-input.svelte';
export let data;
const { data } = $props();
const superTotpForm = superForm(data.form, {
onSubmit: () => boredState.update((n) => ({ ...n, loading: true })),
@ -33,6 +34,8 @@
delayMs: 0,
});
let showRecoveryCode = $state(false);
const { form: totpForm, enhance } = superTotpForm;
</script>
@ -45,17 +48,27 @@
<h2
class="scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight transition-colors first:mt-0"
>
Please enter your two factor code
Please enter your {showRecoveryCode ? 'recovery code' : 'TOTP code'}
</h2>
<Form.Field form={superTotpForm} name="totpToken">
<Form.Control let:attrs>
<Form.Label for="totpToken">TOTP Code</Form.Label>
<Input {...attrs} autocomplete="totpToken" bind:value={$totpForm.totpToken} />
{#if showRecoveryCode}
<Form.Label for="totpToken">Recovery Code</Form.Label>
<Input {...attrs} autocomplete="one-time-code" bind:value={$totpForm.totpToken} />
{:else}
<Form.Label for="totpToken">TOTP Code</Form.Label>
<PinInput class="justify-evenly" {...attrs} bind:value={$totpForm.totpToken} />
{/if}
</Form.Control>
<Form.FieldErrors />
</Form.Field>
<Form.Button>Submit</Form.Button>
</form>
{#if !showRecoveryCode}
<Button variant="link" class="text-secondary-foreground" on:click={() => showRecoveryCode = true}>Show Recovery Code</Button>
{:else}
<Button variant="link" class="text-secondary-foreground" on:click={() => showRecoveryCode = false}>Show TOTP Code</Button>
{/if}
</div>
<style lang="postcss">