diff --git a/Foxnouns.Backend/Controllers/Authentication/EmailAuthController.cs b/Foxnouns.Backend/Controllers/Authentication/EmailAuthController.cs index bdf4b9a..bbf41f5 100644 --- a/Foxnouns.Backend/Controllers/Authentication/EmailAuthController.cs +++ b/Foxnouns.Backend/Controllers/Authentication/EmailAuthController.cs @@ -183,63 +183,6 @@ public class EmailAuthController( return NoContent(); } - [HttpPost("forgot-password")] - public async Task ForgotPasswordAsync([FromBody] EmailForgotPasswordRequest req) - { - CheckRequirements(); - - if (!req.Email.Contains('@')) - throw new ApiError.BadRequest("Email is invalid", "email", req.Email); - - AuthMethod? authMethod = await db - .AuthMethods.Where(m => m.AuthType == AuthType.Email && m.RemoteId == req.Email) - .FirstOrDefaultAsync(); - if (authMethod == null) - return NoContent(); - - string state = await keyCacheService.GenerateForgotPasswordStateAsync( - req.Email, - authMethod.UserId - ); - - if (IsRateLimited()) - return NoContent(); - - mailService.QueueResetPasswordEmail(req.Email, state); - return NoContent(); - } - - [HttpPost("reset-password")] - public async Task ResetPasswordAsync([FromBody] EmailResetPasswordRequest req) - { - ForgotPasswordState? state = await keyCacheService.GetForgotPasswordStateAsync(req.State); - if (state == null) - throw new ApiError.BadRequest("Unknown state", "state", req.State); - - if ( - !await db - .AuthMethods.Where(m => - m.AuthType == AuthType.Email - && m.RemoteId == state.Email - && m.UserId == state.UserId - ) - .AnyAsync() - ) - { - throw new ApiError.BadRequest("Invalid state"); - } - - ValidationUtils.Validate([("password", ValidationUtils.ValidatePassword(req.Password))]); - - User user = await db.Users.FirstAsync(u => u.Id == state.UserId); - await authService.SetUserPasswordAsync(user, req.Password); - await db.SaveChangesAsync(); - - mailService.QueuePasswordChangedEmail(state.Email); - - return NoContent(); - } - [HttpPost("add-account")] [Authorize("*")] public async Task AddEmailAddressAsync([FromBody] AddEmailAddressRequest req) diff --git a/Foxnouns.Backend/Dto/Auth.cs b/Foxnouns.Backend/Dto/Auth.cs index fbf5951..ea9e67d 100644 --- a/Foxnouns.Backend/Dto/Auth.cs +++ b/Foxnouns.Backend/Dto/Auth.cs @@ -59,8 +59,4 @@ public record EmailCallbackRequest(string State); public record EmailChangePasswordRequest(string Current, string New); -public record EmailForgotPasswordRequest(string Email); - -public record EmailResetPasswordRequest(string State, string Password); - public record FediverseCallbackRequest(string Instance, string Code, string? State = null); diff --git a/Foxnouns.Backend/Extensions/KeyCacheExtensions.cs b/Foxnouns.Backend/Extensions/KeyCacheExtensions.cs index 615cc3d..d7e8784 100644 --- a/Foxnouns.Backend/Extensions/KeyCacheExtensions.cs +++ b/Foxnouns.Backend/Extensions/KeyCacheExtensions.cs @@ -28,7 +28,7 @@ public static class KeyCacheExtensions CancellationToken ct = default ) { - string state = AuthUtils.RandomToken(); + string state = AuthUtils.RandomToken().Replace('+', '-').Replace('/', '_'); await keyCacheService.SetKeyAsync($"oauth_state:{state}", "", Duration.FromMinutes(10), ct); return state; } @@ -51,7 +51,8 @@ public static class KeyCacheExtensions CancellationToken ct = default ) { - string state = AuthUtils.RandomToken(); + // This state is used in links, not just as JSON values, so make it URL-safe + string state = AuthUtils.RandomToken().Replace('+', '-').Replace('/', '_'); await keyCacheService.SetKeyAsync( $"email_state:{state}", new RegisterEmailState(email, userId), @@ -111,12 +112,11 @@ public static class KeyCacheExtensions public static async Task GetForgotPasswordStateAsync( this KeyCacheService keyCacheService, string state, - bool delete = true, CancellationToken ct = default ) => await keyCacheService.GetKeyAsync( $"forgot_password:{state}", - delete, + true, ct ); } diff --git a/Foxnouns.Backend/Jobs/CreateDataExportInvocable.cs b/Foxnouns.Backend/Jobs/CreateDataExportInvocable.cs index 4d9e1b0..cd5c97f 100644 --- a/Foxnouns.Backend/Jobs/CreateDataExportInvocable.cs +++ b/Foxnouns.Backend/Jobs/CreateDataExportInvocable.cs @@ -102,7 +102,7 @@ public class CreateDataExportInvocable( stream.Seek(0, SeekOrigin.Begin); // Upload the file! - string filename = AuthUtils.RandomToken(); + string filename = AuthUtils.RandomToken().Replace('+', '-').Replace('/', '_'); await objectStorageService.PutObjectAsync( ExportPath(user.Id, filename), stream, diff --git a/Foxnouns.Backend/Mailables/PasswordChangedMailable.cs b/Foxnouns.Backend/Mailables/PasswordChangedMailable.cs deleted file mode 100644 index 79d86e3..0000000 --- a/Foxnouns.Backend/Mailables/PasswordChangedMailable.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Coravel.Mailer.Mail; - -namespace Foxnouns.Backend.Mailables; - -public class PasswordChangedMailable(Config config, PasswordChangedMailableView view) - : Mailable -{ - private string PlainText() => - $""" - Your password has been changed using a "forgot password" link. - If this wasn't you, request a password reset immediately: - {view.BaseUrl}/auth/forgot-password - """; - - public override void Build() - { - To(view.To) - .From(config.EmailAuth.From!) - .Subject("Your password has been changed") - .View("~/Views/Mail/PasswordChanged.cshtml", view) - .Text(PlainText()); - } -} - -public class PasswordChangedMailableView : BaseView; diff --git a/Foxnouns.Backend/Mailables/ResetPasswordMailable.cs b/Foxnouns.Backend/Mailables/ResetPasswordMailable.cs deleted file mode 100644 index 0f89b90..0000000 --- a/Foxnouns.Backend/Mailables/ResetPasswordMailable.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Coravel.Mailer.Mail; - -namespace Foxnouns.Backend.Mailables; - -public class ResetPasswordMailable(Config config, ResetPasswordMailableView view) - : Mailable -{ - private string PlainText() => - $""" - Somebody (hopefully you!) has requested a password reset. - You can use the following link to do this: - {view.BaseUrl}/auth/forgot-password/{view.Code} - Note that this link will expire in one hour. - - If you weren't expecting this email, you don't have to do anything. - Your password can't be changed without the above link. - """; - - public override void Build() - { - To(view.To) - .From(config.EmailAuth.From!) - .Subject("Reset your account's password") - .View("~/Views/Mail/ResetPassword.cshtml", view) - .Text(PlainText()); - } -} - -public class ResetPasswordMailableView : BaseView -{ - public required string Code { get; init; } -} diff --git a/Foxnouns.Backend/Services/MailService.cs b/Foxnouns.Backend/Services/MailService.cs index 83458d6..a1444d9 100644 --- a/Foxnouns.Backend/Services/MailService.cs +++ b/Foxnouns.Backend/Services/MailService.cs @@ -63,41 +63,6 @@ public class MailService(ILogger logger, IMailer mailer, IQueue queue, Config co }); } - public void QueueResetPasswordEmail(string to, string code) - { - _logger.Debug("Sending add email address email to {ToEmail}", to); - queue.QueueAsyncTask(async () => - { - await SendEmailAsync( - to, - new ResetPasswordMailable( - config, - new ResetPasswordMailableView - { - BaseUrl = config.BaseUrl, - To = to, - Code = code, - } - ) - ); - }); - } - - public void QueuePasswordChangedEmail(string to) - { - _logger.Debug("Sending add email address email to {ToEmail}", to); - queue.QueueAsyncTask(async () => - { - await SendEmailAsync( - to, - new PasswordChangedMailable( - config, - new PasswordChangedMailableView { BaseUrl = config.BaseUrl, To = to } - ) - ); - }); - } - private async Task SendEmailAsync(string to, Mailable mailable) { try diff --git a/Foxnouns.Backend/Utils/AuthUtils.cs b/Foxnouns.Backend/Utils/AuthUtils.cs index 8a35cdc..491694a 100644 --- a/Foxnouns.Backend/Utils/AuthUtils.cs +++ b/Foxnouns.Backend/Utils/AuthUtils.cs @@ -131,12 +131,7 @@ public static class AuthUtils } public static string RandomToken(int bytes = 48) => - Convert - .ToBase64String(RandomNumberGenerator.GetBytes(bytes)) - .Trim('=') - // Make the token URL-safe - .Replace('+', '-') - .Replace('/', '_'); + Convert.ToBase64String(RandomNumberGenerator.GetBytes(bytes)).Trim('='); public const int MaxAuthMethodsPerType = 3; // Maximum of 3 Discord accounts, 3 emails, etc } diff --git a/Foxnouns.Backend/Views/Mail/PasswordChanged.cshtml b/Foxnouns.Backend/Views/Mail/PasswordChanged.cshtml deleted file mode 100644 index 458dcdf..0000000 --- a/Foxnouns.Backend/Views/Mail/PasswordChanged.cshtml +++ /dev/null @@ -1,8 +0,0 @@ -@model Foxnouns.Backend.Mailables.PasswordChangedMailableView - -

- Your password has been changed using a "forgot password" link. - If this wasn't you, please a password reset immediately: -
- @Model.BaseUrl/auth/forgot-password -

\ No newline at end of file diff --git a/Foxnouns.Backend/Views/Mail/ResetPassword.cshtml b/Foxnouns.Backend/Views/Mail/ResetPassword.cshtml deleted file mode 100644 index f141d8b..0000000 --- a/Foxnouns.Backend/Views/Mail/ResetPassword.cshtml +++ /dev/null @@ -1,14 +0,0 @@ -@model Foxnouns.Backend.Mailables.ResetPasswordMailableView - -

- Somebody (hopefully you!) has requested a password reset. - You can use the following link to do this: -
- @Model.BaseUrl/auth/forgot-password/@Model.Code -
- Note that this link will expire in one hour. -

-

- If you weren't expecting this email, you don't have to do anything. - Your password can't be changed without the above link. -

\ No newline at end of file diff --git a/Foxnouns.Frontend/eslint.config.js b/Foxnouns.Frontend/eslint.config.js index c1d1e14..d676276 100644 --- a/Foxnouns.Frontend/eslint.config.js +++ b/Foxnouns.Frontend/eslint.config.js @@ -30,16 +30,4 @@ export default ts.config( { ignores: ["build/", ".svelte-kit/", "dist/"], }, - { - rules: { - "@typescript-eslint/no-unused-vars": [ - "error", - { - argsIgnorePattern: "^_", - varsIgnorePattern: "^_", - caughtErrorsIgnorePattern: "^_", - }, - ], - }, - }, ); diff --git a/Foxnouns.Frontend/package.json b/Foxnouns.Frontend/package.json index a3783fe..bd5ed64 100644 --- a/Foxnouns.Frontend/package.json +++ b/Foxnouns.Frontend/package.json @@ -12,29 +12,29 @@ "lint": "prettier --check . && eslint ." }, "devDependencies": { - "@sveltejs/adapter-node": "^5.2.10", - "@sveltejs/kit": "^2.11.1", - "@sveltejs/vite-plugin-svelte": "^4.0.3", + "@sveltejs/adapter-node": "^5.2.9", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0", "@sveltestrap/sveltestrap": "^6.2.7", - "@types/eslint": "^9.6.1", + "@types/eslint": "^9.6.0", "@types/luxon": "^3.4.2", "@types/markdown-it": "^14.1.2", "@types/sanitize-html": "^2.13.0", "bootstrap": "^5.3.3", - "eslint": "^9.17.0", + "eslint": "^9.7.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.46.1", - "globals": "^15.13.0", - "prettier": "^3.4.2", - "prettier-plugin-svelte": "^3.3.2", - "sass": "^1.83.0", - "svelte": "^5.12.0", + "eslint-plugin-svelte": "^2.36.0", + "globals": "^15.0.0", + "prettier": "^3.3.2", + "prettier-plugin-svelte": "^3.2.6", + "sass": "^1.81.0", + "svelte": "^5.0.0", "svelte-bootstrap-icons": "^3.1.1", - "svelte-check": "^4.1.1", + "svelte-check": "^4.0.0", "sveltekit-i18n": "^2.4.2", - "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", - "vite": "^5.4.11" + "typescript": "^5.0.0", + "typescript-eslint": "^8.0.0", + "vite": "^5.0.3" }, "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee", "dependencies": { diff --git a/Foxnouns.Frontend/pnpm-lock.yaml b/Foxnouns.Frontend/pnpm-lock.yaml index 45d0d8c..d2289ec 100644 --- a/Foxnouns.Frontend/pnpm-lock.yaml +++ b/Foxnouns.Frontend/pnpm-lock.yaml @@ -43,19 +43,19 @@ importers: version: 4.9.3 devDependencies: '@sveltejs/adapter-node': - specifier: ^5.2.10 - version: 5.2.10(@sveltejs/kit@2.11.1(@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))(svelte@5.12.0)(vite@5.4.11(sass@1.83.0))) + specifier: ^5.2.9 + version: 5.2.9(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))(svelte@5.2.2)(vite@5.4.11(sass@1.81.0))) '@sveltejs/kit': - specifier: ^2.11.1 - version: 2.11.1(@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)) + specifier: ^2.0.0 + version: 2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)) '@sveltejs/vite-plugin-svelte': - specifier: ^4.0.3 - version: 4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)) + specifier: ^4.0.0 + version: 4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)) '@sveltestrap/sveltestrap': specifier: ^6.2.7 - version: 6.2.7(svelte@5.12.0) + version: 6.2.7(svelte@5.2.2) '@types/eslint': - specifier: ^9.6.1 + specifier: ^9.6.0 version: 9.6.1 '@types/luxon': specifier: ^3.4.2 @@ -70,47 +70,47 @@ importers: specifier: ^5.3.3 version: 5.3.3(@popperjs/core@2.11.8) eslint: - specifier: ^9.17.0 - version: 9.17.0 + specifier: ^9.7.0 + version: 9.15.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.17.0) + version: 9.1.0(eslint@9.15.0) eslint-plugin-svelte: - specifier: ^2.46.1 - version: 2.46.1(eslint@9.17.0)(svelte@5.12.0) + specifier: ^2.36.0 + version: 2.46.0(eslint@9.15.0)(svelte@5.2.2) globals: - specifier: ^15.13.0 - version: 15.13.0 + specifier: ^15.0.0 + version: 15.12.0 prettier: - specifier: ^3.4.2 - version: 3.4.2 - prettier-plugin-svelte: specifier: ^3.3.2 - version: 3.3.2(prettier@3.4.2)(svelte@5.12.0) + version: 3.3.3 + prettier-plugin-svelte: + specifier: ^3.2.6 + version: 3.2.8(prettier@3.3.3)(svelte@5.2.2) sass: - specifier: ^1.83.0 - version: 1.83.0 + specifier: ^1.81.0 + version: 1.81.0 svelte: - specifier: ^5.12.0 - version: 5.12.0 + specifier: ^5.0.0 + version: 5.2.2 svelte-bootstrap-icons: specifier: ^3.1.1 version: 3.1.1 svelte-check: - specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.12.0)(typescript@5.7.2) + specifier: ^4.0.0 + version: 4.0.9(picomatch@4.0.2)(svelte@5.2.2)(typescript@5.6.3) sveltekit-i18n: specifier: ^2.4.2 - version: 2.4.2(svelte@5.12.0) + version: 2.4.2(svelte@5.2.2) typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.0.0 + version: 5.6.3 typescript-eslint: - specifier: ^8.18.0 - version: 8.18.0(eslint@9.17.0)(typescript@5.7.2) + specifier: ^8.0.0 + version: 8.14.0(eslint@9.15.0)(typescript@5.6.3) vite: - specifier: ^5.4.11 - version: 5.4.11(sass@1.83.0) + specifier: ^5.0.3 + version: 5.4.11(sass@1.81.0) packages: @@ -266,28 +266,28 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.19.0': + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + '@eslint/core@0.9.0': + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.15.0': + resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.4': - resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + '@eslint/plugin-kit@0.2.3': + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fontsource/firago@5.1.0': @@ -313,8 +313,8 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -467,114 +467,109 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.28.1': - resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + '@rollup/rollup-android-arm-eabi@4.27.2': + resolution: {integrity: sha512-Tj+j7Pyzd15wAdSJswvs5CJzJNV+qqSUcr/aCD+jpQSBtXvGnV0pnrjoc8zFTe9fcKCatkpFpOO7yAzpO998HA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.28.1': - resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + '@rollup/rollup-android-arm64@4.27.2': + resolution: {integrity: sha512-xsPeJgh2ThBpUqlLgRfiVYBEf/P1nWlWvReG+aBWfNv3XEBpa6ZCmxSVnxJgLgkNz4IbxpLy64h2gCmAAQLneQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.28.1': - resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + '@rollup/rollup-darwin-arm64@4.27.2': + resolution: {integrity: sha512-KnXU4m9MywuZFedL35Z3PuwiTSn/yqRIhrEA9j+7OSkji39NzVkgxuxTYg5F8ryGysq4iFADaU5osSizMXhU2A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.1': - resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + '@rollup/rollup-darwin-x64@4.27.2': + resolution: {integrity: sha512-Hj77A3yTvUeCIx/Vi+4d4IbYhyTwtHj07lVzUgpUq9YpJSEiGJj4vXMKwzJ3w5zp5v3PFvpJNgc/J31smZey6g==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.1': - resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + '@rollup/rollup-freebsd-arm64@4.27.2': + resolution: {integrity: sha512-RjgKf5C3xbn8gxvCm5VgKZ4nn0pRAIe90J0/fdHUsgztd3+Zesb2lm2+r6uX4prV2eUByuxJNdt647/1KPRq5g==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.1': - resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + '@rollup/rollup-freebsd-x64@4.27.2': + resolution: {integrity: sha512-duq21FoXwQtuws+V9H6UZ+eCBc7fxSpMK1GQINKn3fAyd9DFYKPJNcUhdIKOrMFjLEJgQskoMoiuizMt+dl20g==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': - resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + '@rollup/rollup-linux-arm-gnueabihf@4.27.2': + resolution: {integrity: sha512-6npqOKEPRZkLrMcvyC/32OzJ2srdPzCylJjiTJT2c0bwwSGm7nz2F9mNQ1WrAqCBZROcQn91Fno+khFhVijmFA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.1': - resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + '@rollup/rollup-linux-arm-musleabihf@4.27.2': + resolution: {integrity: sha512-V9Xg6eXtgBtHq2jnuQwM/jr2mwe2EycnopO8cbOvpzFuySCGtKlPCI3Hj9xup/pJK5Q0388qfZZy2DqV2J8ftw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.1': - resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + '@rollup/rollup-linux-arm64-gnu@4.27.2': + resolution: {integrity: sha512-uCFX9gtZJoQl2xDTpRdseYuNqyKkuMDtH6zSrBTA28yTfKyjN9hQ2B04N5ynR8ILCoSDOrG/Eg+J2TtJ1e/CSA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.1': - resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + '@rollup/rollup-linux-arm64-musl@4.27.2': + resolution: {integrity: sha512-/PU9P+7Rkz8JFYDHIi+xzHabOu9qEWR07L5nWLIUsvserrxegZExKCi2jhMZRd0ATdboKylu/K5yAXbp7fYFvA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': - resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': - resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.27.2': + resolution: {integrity: sha512-eCHmol/dT5odMYi/N0R0HC8V8QE40rEpkyje/ZAXJYNNoSfrObOvG/Mn+s1F/FJyB7co7UQZZf6FuWnN6a7f4g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.1': - resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + '@rollup/rollup-linux-riscv64-gnu@4.27.2': + resolution: {integrity: sha512-DEP3Njr9/ADDln3kNi76PXonLMSSMiCir0VHXxmGSHxCxDfQ70oWjHcJGfiBugzaqmYdTC7Y+8Int6qbnxPBIQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.1': - resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + '@rollup/rollup-linux-s390x-gnu@4.27.2': + resolution: {integrity: sha512-NHGo5i6IE/PtEPh5m0yw5OmPMpesFnzMIS/lzvN5vknnC1sXM5Z/id5VgcNPgpD+wHmIcuYYgW+Q53v+9s96lQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.1': - resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + '@rollup/rollup-linux-x64-gnu@4.27.2': + resolution: {integrity: sha512-PaW2DY5Tan+IFvNJGHDmUrORadbe/Ceh8tQxi8cmdQVCCYsLoQo2cuaSj+AU+YRX8M4ivS2vJ9UGaxfuNN7gmg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.1': - resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + '@rollup/rollup-linux-x64-musl@4.27.2': + resolution: {integrity: sha512-dOlWEMg2gI91Qx5I/HYqOD6iqlJspxLcS4Zlg3vjk1srE67z5T2Uz91yg/qA8sY0XcwQrFzWWiZhMNERylLrpQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.28.1': - resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + '@rollup/rollup-win32-arm64-msvc@4.27.2': + resolution: {integrity: sha512-euMIv/4x5Y2/ImlbGl88mwKNXDsvzbWUlT7DFky76z2keajCtcbAsN9LUdmk31hAoVmJJYSThgdA0EsPeTr1+w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.1': - resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + '@rollup/rollup-win32-ia32-msvc@4.27.2': + resolution: {integrity: sha512-RsnE6LQkUHlkC10RKngtHNLxb7scFykEbEwOFDjr3CeCMG+Rr+cKqlkKc2/wJ1u4u990urRHCbjz31x84PBrSQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.1': - resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + '@rollup/rollup-win32-x64-msvc@4.27.2': + resolution: {integrity: sha512-foJM5vv+z2KQmn7emYdDLyTbkoO5bkHZE1oth2tWbQNGW7mX32d46Hz6T0MqXdWS2vBZhaEtHqdy9WYwGfiliA==} cpu: [x64] os: [win32] - '@sveltejs/adapter-node@5.2.10': - resolution: {integrity: sha512-U0SCdULhHbSYCDgvvrHRtKUykl9GZkM/b3NyeIUtaxM39upQFd5059pWmXgTNaNTU1HMdj4xx0xvNAvQcIzmXQ==} + '@sveltejs/adapter-node@5.2.9': + resolution: {integrity: sha512-51euNrx0AcaTu8//wDfVh7xmqQSVgU52rfinE/MwvGkJa4nHPJMHmzv6+OIpmxg7gZaF6+5NVlxnieCzxLD59g==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/kit@2.11.1': - resolution: {integrity: sha512-dAiHDEd+AOm20eYdMPV1a2eKBOc0s/7XsSs7PCoNv2kKS7BAoVRC9uzR+FQmxLtp8xuEo9z8CtrMQoszkThltQ==} + '@sveltejs/kit@2.8.1': + resolution: {integrity: sha512-uuOfFwZ4xvnfPsiTB6a4H1ljjTUksGhWnYq5X/Y9z4x5+3uM2Md8q/YVeHL+7w+mygAwoEFdgKZ8YkUuk+VKww==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 || ^6.0.0 + vite: ^5.0.3 '@sveltejs/vite-plugin-svelte-inspector@3.0.1': resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} @@ -584,8 +579,8 @@ packages: svelte: ^5.0.0-next.96 || ^5.0.0 vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@4.0.3': - resolution: {integrity: sha512-J7nC5gT5qpmvyD2pmzPUntLUgoinyEaNy9sTpGGE6N7pblggO0A1NyneJJvR2ELlzK6ti28aF2SLXG1yJdnJeA==} + '@sveltejs/vite-plugin-svelte@4.0.1': + resolution: {integrity: sha512-prXoAE/GleD2C4pKgHa9vkdjpzdYwCSw/kmjw6adIyu0vk5YKCfqIztkLg10m+kOYnzZu3bb0NaPTxlWre2a9Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: svelte: ^5.0.0-next.96 || ^5.0.0 @@ -634,51 +629,61 @@ packages: '@types/sanitize-html@2.13.0': resolution: {integrity: sha512-X31WxbvW9TjIhZZNyNBZ/p5ax4ti7qsNDBDEnH4zAgmEh35YnFD1UiS6z9Cd34kKm0LslFW0KPmTQzu/oGtsqQ==} - '@typescript-eslint/eslint-plugin@8.18.0': - resolution: {integrity: sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==} + '@typescript-eslint/eslint-plugin@8.14.0': + resolution: {integrity: sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/parser@8.18.0': - resolution: {integrity: sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==} + '@typescript-eslint/parser@8.14.0': + resolution: {integrity: sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/scope-manager@8.18.0': - resolution: {integrity: sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==} + '@typescript-eslint/scope-manager@8.14.0': + resolution: {integrity: sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.18.0': - resolution: {integrity: sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==} + '@typescript-eslint/type-utils@8.14.0': + resolution: {integrity: sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.14.0': + resolution: {integrity: sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.14.0': + resolution: {integrity: sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.14.0': + resolution: {integrity: sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.18.0': - resolution: {integrity: sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.18.0': - resolution: {integrity: sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/utils@8.18.0': - resolution: {integrity: sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/visitor-keys@8.18.0': - resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==} + '@typescript-eslint/visitor-keys@8.14.0': + resolution: {integrity: sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -768,8 +773,8 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + cross-spawn@7.0.5: + resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} engines: {node: '>= 8'} cssesc@3.0.0: @@ -777,8 +782,8 @@ packages: engines: {node: '>=4'} hasBin: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -839,8 +844,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-svelte@2.46.1: - resolution: {integrity: sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==} + eslint-plugin-svelte@2.46.0: + resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 @@ -865,8 +870,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint@9.15.0: + resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -875,8 +880,8 @@ packages: jiti: optional: true - esm-env@1.2.1: - resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} + esm-env@1.1.4: + resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} @@ -890,8 +895,8 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@1.2.3: - resolution: {integrity: sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==} + esrap@1.2.2: + resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -948,8 +953,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -971,8 +976,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.13.0: - resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -999,8 +1004,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - immutable@5.0.3: - resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} + immutable@5.0.2: + resolution: {integrity: sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -1013,8 +1018,8 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -1093,8 +1098,8 @@ packages: resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} - magic-string@0.30.15: - resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==} + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} @@ -1133,8 +1138,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1221,14 +1226,14 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-svelte@3.3.2: - resolution: {integrity: sha512-kRPjH8wSj2iu+dO+XaUv4vD8qr5mdDmlak3IT/7AOgGIMRG86z/EHOLauFcClKEnOUf4A4nOA7sre5KrJD4Raw==} + prettier-plugin-svelte@3.2.8: + resolution: {integrity: sha512-PAHmmU5cGZdnhW4mWhmvxuG2PVbbHIxUuPOdUKvfE+d4Qt2d29iU5VWrPdsaW5YqVEE0nqhlvN4eoKmVMpIF3Q==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true @@ -1255,16 +1260,16 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.9: - resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.28.1: - resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + rollup@4.27.2: + resolution: {integrity: sha512-KreA+PzWmk2yaFmZVwe6GB2uBD86nXl86OsDkt1bJS9p3vqWuEQ6HnJJ+j/mZi/q0920P99/MVRlB4L3crpF5w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1278,8 +1283,8 @@ packages: sanitize-html@2.13.1: resolution: {integrity: sha512-ZXtKq89oue4RP7abL9wp/9URJcqQNABB5GGJ2acW1sdO8JTVl92f4ygD7Yc9Ze09VAZhnt2zegeU0tbNsdcLYg==} - sass@1.83.0: - resolution: {integrity: sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==} + sass@1.81.0: + resolution: {integrity: sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==} engines: {node: '>=14.0.0'} hasBin: true @@ -1322,8 +1327,8 @@ packages: svelte-bootstrap-icons@3.1.1: resolution: {integrity: sha512-ghJlt6TX3IX35M7wSvGyrmVgXeT5GMRF+7+q6L4OUT2RJWF09mQIvZTZ04Ii3FBfg10KdzFdvVuoB8M0cVHfzw==} - svelte-check@4.1.1: - resolution: {integrity: sha512-NfaX+6Qtc8W/CyVGS/F7/XdiSSyXz+WGYA9ZWV3z8tso14V2vzjfXviKaTFEzB7g8TqfgO2FOzP6XT4ApSTUTw==} + svelte-check@4.0.9: + resolution: {integrity: sha512-SVNCz2L+9ZELGli7G0n3B3QE5kdf0u27RtKr2ZivWQhcWIXatZxwM4VrQ6AiA2k9zKp2mk5AxkEhdjbpjv7rEw==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -1342,8 +1347,8 @@ packages: svelte-tippy@1.3.2: resolution: {integrity: sha512-41f+85hwhKBRqX0UNYrgFsi34Kk/KDvUkIZXYANxkWoA2NTVTCZbUC2J8hRNZ4TRVxObTshoZRjK2co5+i6LMw==} - svelte@5.12.0: - resolution: {integrity: sha512-nOd7uj0D/4A3IrHnltaFYndVPGViYSs0s+Zi3N4uQg3owJt9RoiUdwxYx8qjorj5CtaGsx8dNYsFVbH6czrGNg==} + svelte@5.2.2: + resolution: {integrity: sha512-eHIJRcvA6iuXdRGMESTmBtWTQCcCiol4gyH9DA60ybS35W1x27cvtbndNvWDqX72blyf+AYeQ4gzZ0XGg3L8sw==} engines: {node: '>=18'} sveltekit-i18n@2.4.2: @@ -1365,8 +1370,8 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -1379,15 +1384,17 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.18.0: - resolution: {integrity: sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ==} + typescript-eslint@8.14.0: + resolution: {integrity: sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true @@ -1431,10 +1438,10 @@ packages: terser: optional: true - vitefu@1.0.4: - resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} + vitefu@1.0.3: + resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 peerDependenciesMeta: vite: optional: true @@ -1463,7 +1470,7 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 '@esbuild/aix-ppc64@0.21.5': @@ -1535,29 +1542,27 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0)': dependencies: - eslint: 9.17.0 + eslint: 9.15.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.0': dependencies: - '@eslint/object-schema': 2.1.5 - debug: 4.4.0 + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.9.1': - dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core@0.9.0': {} '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.3.7 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -1568,11 +1573,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.15.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.2.3': dependencies: levn: 0.4.1 @@ -1591,7 +1596,7 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -1685,157 +1690,154 @@ snapshots: '@popperjs/core@2.11.8': {} - '@rollup/plugin-commonjs@28.0.1(rollup@4.28.1)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.27.2)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.3(rollup@4.27.2) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.2(picomatch@4.0.2) is-reference: 1.2.1 - magic-string: 0.30.15 + magic-string: 0.30.12 picomatch: 4.0.2 optionalDependencies: - rollup: 4.28.1 + rollup: 4.27.2 - '@rollup/plugin-json@6.1.0(rollup@4.28.1)': + '@rollup/plugin-json@6.1.0(rollup@4.27.2)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.3(rollup@4.27.2) optionalDependencies: - rollup: 4.28.1 + rollup: 4.27.2 - '@rollup/plugin-node-resolve@15.3.0(rollup@4.28.1)': + '@rollup/plugin-node-resolve@15.3.0(rollup@4.27.2)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.3(rollup@4.27.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.9 + resolve: 1.22.8 optionalDependencies: - rollup: 4.28.1 + rollup: 4.27.2 - '@rollup/pluginutils@5.1.3(rollup@4.28.1)': + '@rollup/pluginutils@5.1.3(rollup@4.27.2)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.28.1 + rollup: 4.27.2 - '@rollup/rollup-android-arm-eabi@4.28.1': + '@rollup/rollup-android-arm-eabi@4.27.2': optional: true - '@rollup/rollup-android-arm64@4.28.1': + '@rollup/rollup-android-arm64@4.27.2': optional: true - '@rollup/rollup-darwin-arm64@4.28.1': + '@rollup/rollup-darwin-arm64@4.27.2': optional: true - '@rollup/rollup-darwin-x64@4.28.1': + '@rollup/rollup-darwin-x64@4.27.2': optional: true - '@rollup/rollup-freebsd-arm64@4.28.1': + '@rollup/rollup-freebsd-arm64@4.27.2': optional: true - '@rollup/rollup-freebsd-x64@4.28.1': + '@rollup/rollup-freebsd-x64@4.27.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + '@rollup/rollup-linux-arm-gnueabihf@4.27.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.1': + '@rollup/rollup-linux-arm-musleabihf@4.27.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.1': + '@rollup/rollup-linux-arm64-gnu@4.27.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.1': + '@rollup/rollup-linux-arm64-musl@4.27.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.27.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + '@rollup/rollup-linux-riscv64-gnu@4.27.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.1': + '@rollup/rollup-linux-s390x-gnu@4.27.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.1': + '@rollup/rollup-linux-x64-gnu@4.27.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.1': + '@rollup/rollup-linux-x64-musl@4.27.2': optional: true - '@rollup/rollup-linux-x64-musl@4.28.1': + '@rollup/rollup-win32-arm64-msvc@4.27.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.1': + '@rollup/rollup-win32-ia32-msvc@4.27.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.1': + '@rollup/rollup-win32-x64-msvc@4.27.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.1': - optional: true - - '@sveltejs/adapter-node@5.2.10(@sveltejs/kit@2.11.1(@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))': + '@sveltejs/adapter-node@5.2.9(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))': dependencies: - '@rollup/plugin-commonjs': 28.0.1(rollup@4.28.1) - '@rollup/plugin-json': 6.1.0(rollup@4.28.1) - '@rollup/plugin-node-resolve': 15.3.0(rollup@4.28.1) - '@sveltejs/kit': 2.11.1(@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)) - rollup: 4.28.1 + '@rollup/plugin-commonjs': 28.0.1(rollup@4.27.2) + '@rollup/plugin-json': 6.1.0(rollup@4.27.2) + '@rollup/plugin-node-resolve': 15.3.0(rollup@4.27.2) + '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)) + rollup: 4.27.2 - '@sveltejs/kit@2.11.1(@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))(svelte@5.12.0)(vite@5.4.11(sass@1.83.0))': + '@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))(svelte@5.2.2)(vite@5.4.11(sass@1.81.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)) + '@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 - esm-env: 1.2.1 + esm-env: 1.1.4 import-meta-resolve: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.15 + magic-string: 0.30.12 mrmime: 2.0.0 sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.0 - svelte: 5.12.0 + svelte: 5.2.2 tiny-glob: 0.2.9 - vite: 5.4.11(sass@1.83.0) + vite: 5.4.11(sass@1.81.0) - '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))(svelte@5.12.0)(vite@5.4.11(sass@1.83.0))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))(svelte@5.2.2)(vite@5.4.11(sass@1.81.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)) - debug: 4.4.0 - svelte: 5.12.0 - vite: 5.4.11(sass@1.83.0) + '@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)) + debug: 4.3.7 + svelte: 5.2.2 + vite: 5.4.11(sass@1.81.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0))': + '@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.3(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)))(svelte@5.12.0)(vite@5.4.11(sass@1.83.0)) - debug: 4.4.0 + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)))(svelte@5.2.2)(vite@5.4.11(sass@1.81.0)) + debug: 4.3.7 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.15 - svelte: 5.12.0 - vite: 5.4.11(sass@1.83.0) - vitefu: 1.0.4(vite@5.4.11(sass@1.83.0)) + magic-string: 0.30.12 + svelte: 5.2.2 + vite: 5.4.11(sass@1.81.0) + vitefu: 1.0.3(vite@5.4.11(sass@1.81.0)) transitivePeerDependencies: - supports-color - '@sveltekit-i18n/base@1.3.7(svelte@5.12.0)': + '@sveltekit-i18n/base@1.3.7(svelte@5.2.2)': dependencies: - svelte: 5.12.0 + svelte: 5.2.2 '@sveltekit-i18n/parser-default@1.1.1': {} - '@sveltestrap/sveltestrap@6.2.7(svelte@5.12.0)': + '@sveltestrap/sveltestrap@6.2.7(svelte@5.2.2)': dependencies: '@popperjs/core': 2.11.8 - svelte: 5.12.0 + svelte: 5.2.2 '@types/cookie@0.6.0': {} @@ -1865,82 +1867,86 @@ snapshots: dependencies: htmlparser2: 8.0.2 - '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/type-utils': 8.18.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.0 - eslint: 9.17.0 + '@typescript-eslint/parser': 8.14.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/type-utils': 8.14.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.14.0 + eslint: 9.15.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/parser@8.14.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.0 - debug: 4.4.0 - eslint: 9.17.0 - typescript: 5.7.2 + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.14.0 + debug: 4.3.7 + eslint: 9.15.0 + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.18.0': + '@typescript-eslint/scope-manager@8.14.0': dependencies: - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/visitor-keys': 8.18.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/visitor-keys': 8.14.0 - '@typescript-eslint/type-utils@8.18.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.14.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.0(eslint@9.17.0)(typescript@5.7.2) - debug: 4.4.0 - eslint: 9.17.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.15.0)(typescript@5.6.3) + debug: 4.3.7 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@8.18.0': {} + '@typescript-eslint/types@8.14.0': {} - '@typescript-eslint/typescript-estree@8.18.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.14.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/visitor-keys': 8.18.0 - debug: 4.4.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/visitor-keys': 8.14.0 + debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.0(eslint@9.17.0)(typescript@5.7.2)': + '@typescript-eslint/utils@8.14.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) - '@typescript-eslint/scope-manager': 8.18.0 - '@typescript-eslint/types': 8.18.0 - '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.2) - eslint: 9.17.0 - typescript: 5.7.2 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) + '@typescript-eslint/scope-manager': 8.14.0 + '@typescript-eslint/types': 8.14.0 + '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) + eslint: 9.15.0 transitivePeerDependencies: - supports-color + - typescript - '@typescript-eslint/visitor-keys@8.18.0': + '@typescript-eslint/visitor-keys@8.14.0': dependencies: - '@typescript-eslint/types': 8.18.0 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.14.0 + eslint-visitor-keys: 3.4.3 acorn-jsx@5.3.2(acorn@8.14.0): dependencies: @@ -2015,7 +2021,7 @@ snapshots: cookie@0.6.0: {} - cross-spawn@7.0.6: + cross-spawn@7.0.5: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -2023,7 +2029,7 @@ snapshots: cssesc@3.0.0: {} - debug@4.4.0: + debug@4.3.7: dependencies: ms: 2.1.3 @@ -2084,21 +2090,21 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.17.0): + eslint-compat-utils@0.5.1(eslint@9.15.0): dependencies: - eslint: 9.17.0 + eslint: 9.15.0 semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@9.17.0): + eslint-config-prettier@9.1.0(eslint@9.15.0): dependencies: - eslint: 9.17.0 + eslint: 9.15.0 - eslint-plugin-svelte@2.46.1(eslint@9.17.0)(svelte@5.12.0): + eslint-plugin-svelte@2.46.0(eslint@9.15.0)(svelte@5.2.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.17.0 - eslint-compat-utils: 0.5.1(eslint@9.17.0) + eslint: 9.15.0 + eslint-compat-utils: 0.5.1(eslint@9.15.0) esutils: 2.0.3 known-css-properties: 0.35.0 postcss: 8.4.49 @@ -2106,9 +2112,9 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 semver: 7.6.3 - svelte-eslint-parser: 0.43.0(svelte@5.12.0) + svelte-eslint-parser: 0.43.0(svelte@5.2.2) optionalDependencies: - svelte: 5.12.0 + svelte: 5.2.2 transitivePeerDependencies: - ts-node @@ -2126,15 +2132,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0: + eslint@9.15.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.9.1 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.9.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.4 + '@eslint/js': 9.15.0 + '@eslint/plugin-kit': 0.2.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -2142,8 +2148,8 @@ snapshots: '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0 + cross-spawn: 7.0.5 + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -2165,7 +2171,7 @@ snapshots: transitivePeerDependencies: - supports-color - esm-env@1.2.1: {} + esm-env@1.1.4: {} espree@10.3.0: dependencies: @@ -2183,7 +2189,7 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@1.2.3: + esrap@1.2.2: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 @@ -2235,10 +2241,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.1 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.1: {} fsevents@2.3.3: optional: true @@ -2255,7 +2261,7 @@ snapshots: globals@14.0.0: {} - globals@15.13.0: {} + globals@15.12.0: {} globalyzer@0.1.0: {} @@ -2278,7 +2284,7 @@ snapshots: ignore@5.3.2: {} - immutable@5.0.3: {} + immutable@5.0.2: {} import-fresh@3.3.0: dependencies: @@ -2289,7 +2295,7 @@ snapshots: imurmurhash@0.1.4: {} - is-core-module@2.16.0: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -2354,7 +2360,7 @@ snapshots: luxon@3.5.0: {} - magic-string@0.30.15: + magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -2392,7 +2398,7 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.8: {} + nanoid@3.3.7: {} natural-compare@1.4.0: {} @@ -2456,18 +2462,18 @@ snapshots: postcss@8.4.49: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.7 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.12.0): + prettier-plugin-svelte@3.2.8(prettier@3.3.3)(svelte@5.2.2): dependencies: - prettier: 3.4.2 - svelte: 5.12.0 + prettier: 3.3.3 + svelte: 5.2.2 - prettier@3.4.2: {} + prettier@3.3.3: {} pretty-bytes@6.1.1: {} @@ -2481,37 +2487,36 @@ snapshots: resolve-from@4.0.0: {} - resolve@1.22.9: + resolve@1.22.8: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 reusify@1.0.4: {} - rollup@4.28.1: + rollup@4.27.2: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.1 - '@rollup/rollup-android-arm64': 4.28.1 - '@rollup/rollup-darwin-arm64': 4.28.1 - '@rollup/rollup-darwin-x64': 4.28.1 - '@rollup/rollup-freebsd-arm64': 4.28.1 - '@rollup/rollup-freebsd-x64': 4.28.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 - '@rollup/rollup-linux-arm-musleabihf': 4.28.1 - '@rollup/rollup-linux-arm64-gnu': 4.28.1 - '@rollup/rollup-linux-arm64-musl': 4.28.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 - '@rollup/rollup-linux-riscv64-gnu': 4.28.1 - '@rollup/rollup-linux-s390x-gnu': 4.28.1 - '@rollup/rollup-linux-x64-gnu': 4.28.1 - '@rollup/rollup-linux-x64-musl': 4.28.1 - '@rollup/rollup-win32-arm64-msvc': 4.28.1 - '@rollup/rollup-win32-ia32-msvc': 4.28.1 - '@rollup/rollup-win32-x64-msvc': 4.28.1 + '@rollup/rollup-android-arm-eabi': 4.27.2 + '@rollup/rollup-android-arm64': 4.27.2 + '@rollup/rollup-darwin-arm64': 4.27.2 + '@rollup/rollup-darwin-x64': 4.27.2 + '@rollup/rollup-freebsd-arm64': 4.27.2 + '@rollup/rollup-freebsd-x64': 4.27.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.2 + '@rollup/rollup-linux-arm-musleabihf': 4.27.2 + '@rollup/rollup-linux-arm64-gnu': 4.27.2 + '@rollup/rollup-linux-arm64-musl': 4.27.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.2 + '@rollup/rollup-linux-riscv64-gnu': 4.27.2 + '@rollup/rollup-linux-s390x-gnu': 4.27.2 + '@rollup/rollup-linux-x64-gnu': 4.27.2 + '@rollup/rollup-linux-x64-musl': 4.27.2 + '@rollup/rollup-win32-arm64-msvc': 4.27.2 + '@rollup/rollup-win32-ia32-msvc': 4.27.2 + '@rollup/rollup-win32-x64-msvc': 4.27.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -2531,10 +2536,10 @@ snapshots: parse-srcset: 1.0.2 postcss: 8.4.49 - sass@1.83.0: + sass@1.81.0: dependencies: chokidar: 4.0.1 - immutable: 5.0.3 + immutable: 5.0.2 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.0 @@ -2567,19 +2572,19 @@ snapshots: svelte-bootstrap-icons@3.1.1: {} - svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.12.0)(typescript@5.7.2): + svelte-check@4.0.9(picomatch@4.0.2)(svelte@5.2.2)(typescript@5.6.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.1 fdir: 6.4.2(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.12.0 - typescript: 5.7.2 + svelte: 5.2.2 + typescript: 5.6.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.43.0(svelte@5.12.0): + svelte-eslint-parser@0.43.0(svelte@5.2.2): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -2587,13 +2592,13 @@ snapshots: postcss: 8.4.49 postcss-scss: 4.0.9(postcss@8.4.49) optionalDependencies: - svelte: 5.12.0 + svelte: 5.2.2 svelte-tippy@1.3.2: dependencies: tippy.js: 6.3.7 - svelte@5.12.0: + svelte@5.2.2: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -2602,18 +2607,18 @@ snapshots: acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - esm-env: 1.2.1 - esrap: 1.2.3 + esm-env: 1.1.4 + esrap: 1.2.2 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.15 + magic-string: 0.30.12 zimmerframe: 1.1.2 - sveltekit-i18n@2.4.2(svelte@5.12.0): + sveltekit-i18n@2.4.2(svelte@5.2.2): dependencies: - '@sveltekit-i18n/base': 1.3.7(svelte@5.12.0) + '@sveltekit-i18n/base': 1.3.7(svelte@5.2.2) '@sveltekit-i18n/parser-default': 1.1.1 - svelte: 5.12.0 + svelte: 5.2.2 tiny-glob@0.2.9: dependencies: @@ -2630,9 +2635,9 @@ snapshots: totalist@3.0.1: {} - ts-api-utils@1.4.3(typescript@5.7.2): + ts-api-utils@1.4.0(typescript@5.6.3): dependencies: - typescript: 5.7.2 + typescript: 5.6.3 tslog@4.9.3: {} @@ -2640,17 +2645,18 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.18.0(eslint@9.17.0)(typescript@5.7.2): + typescript-eslint@8.14.0(eslint@9.15.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/parser': 8.18.0(eslint@9.17.0)(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.0(eslint@9.17.0)(typescript@5.7.2) - eslint: 9.17.0 - typescript: 5.7.2 + '@typescript-eslint/eslint-plugin': 8.14.0(@typescript-eslint/parser@8.14.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.14.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.14.0(eslint@9.15.0)(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color - typescript@5.7.2: {} + typescript@5.6.3: {} uc.micro@2.1.0: {} @@ -2660,18 +2666,18 @@ snapshots: util-deprecate@1.0.2: {} - vite@5.4.11(sass@1.83.0): + vite@5.4.11(sass@1.81.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.28.1 + rollup: 4.27.2 optionalDependencies: fsevents: 2.3.3 - sass: 1.83.0 + sass: 1.81.0 - vitefu@1.0.4(vite@5.4.11(sass@1.83.0)): + vitefu@1.0.3(vite@5.4.11(sass@1.81.0)): optionalDependencies: - vite: 5.4.11(sass@1.83.0) + vite: 5.4.11(sass@1.81.0) which@2.0.2: dependencies: diff --git a/Foxnouns.Frontend/src/app.scss b/Foxnouns.Frontend/src/app.scss index e1d59ab..f250ce6 100644 --- a/Foxnouns.Frontend/src/app.scss +++ b/Foxnouns.Frontend/src/app.scss @@ -49,18 +49,3 @@ } } } - -// Give identicons a background distinguishable from the page -.identicon { - @media (prefers-color-scheme: dark) { - background-color: var(--bs-secondary-border-subtle); - } - - background-color: var(--bs-light-border-subtle); -} - -.profile-flag { - height: 1.5rem; - max-width: 200px; - border-radius: 3px; -} diff --git a/Foxnouns.Frontend/src/lib/actions/callback.ts b/Foxnouns.Frontend/src/lib/actions/callback.ts index 3df1070..865e106 100644 --- a/Foxnouns.Frontend/src/lib/actions/callback.ts +++ b/Foxnouns.Frontend/src/lib/actions/callback.ts @@ -10,7 +10,7 @@ export default function createCallbackLoader( bodyFn?: (event: ServerLoadEvent) => Promise, ) { return async (event: ServerLoadEvent) => { - const { parent, fetch, cookies } = event; + const { url, parent, fetch, cookies } = event; bodyFn ??= async ({ url }) => { const code = url.searchParams.get("code") as string | null; diff --git a/Foxnouns.Frontend/src/lib/api/error.ts b/Foxnouns.Frontend/src/lib/api/error.ts index 1fd2041..eb93884 100644 --- a/Foxnouns.Frontend/src/lib/api/error.ts +++ b/Foxnouns.Frontend/src/lib/api/error.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ export default class ApiError { raw?: RawApiError; code: ErrorCode; diff --git a/Foxnouns.Frontend/src/lib/api/index.ts b/Foxnouns.Frontend/src/lib/api/index.ts index 0a4047d..f7a517d 100644 --- a/Foxnouns.Frontend/src/lib/api/index.ts +++ b/Foxnouns.Frontend/src/lib/api/index.ts @@ -23,7 +23,7 @@ export type RequestArgs = { /** * The body for this request, which will be serialized to JSON. Should be a plain JS object. */ - body?: unknown; + body?: any; /** * The fetch function to use. Should be passed in loader and action functions, but can be safely ignored for client-side requests. */ diff --git a/Foxnouns.Frontend/src/lib/components/Avatar.svelte b/Foxnouns.Frontend/src/lib/components/Avatar.svelte index eff2c7b..d9f4eec 100644 --- a/Foxnouns.Frontend/src/lib/components/Avatar.svelte +++ b/Foxnouns.Frontend/src/lib/components/Avatar.svelte @@ -26,4 +26,12 @@ img { object-fit: cover; } + + .identicon { + @media (prefers-color-scheme: dark) { + background-color: var(--bs-secondary-border-subtle); + } + + background-color: var(--bs-light-border-subtle); + } diff --git a/Foxnouns.Frontend/src/lib/components/editor/BioEditor.svelte b/Foxnouns.Frontend/src/lib/components/editor/BioEditor.svelte index e0091ff..8c7e744 100644 --- a/Foxnouns.Frontend/src/lib/components/editor/BioEditor.svelte +++ b/Foxnouns.Frontend/src/lib/components/editor/BioEditor.svelte @@ -21,8 +21,6 @@ {#if value !== ""}
{$t("edit-profile.preview")}
- -
{@html renderMarkdown(value)}
{/if} diff --git a/Foxnouns.Frontend/src/lib/components/profile/ProfileFlag.svelte b/Foxnouns.Frontend/src/lib/components/profile/ProfileFlag.svelte index ab098db..b3d1611 100644 --- a/Foxnouns.Frontend/src/lib/components/profile/ProfileFlag.svelte +++ b/Foxnouns.Frontend/src/lib/components/profile/ProfileFlag.svelte @@ -10,9 +10,17 @@ {flag.description {flag.name} + + diff --git a/Foxnouns.Frontend/src/lib/components/profile/ProfileHeader.svelte b/Foxnouns.Frontend/src/lib/components/profile/ProfileHeader.svelte index 9a0ebff..0fd1960 100644 --- a/Foxnouns.Frontend/src/lib/components/profile/ProfileHeader.svelte +++ b/Foxnouns.Frontend/src/lib/components/profile/ProfileHeader.svelte @@ -5,16 +5,14 @@ import ProfileLink from "./ProfileLink.svelte"; import ProfileFlag from "./ProfileFlag.svelte"; import Avatar from "$components/Avatar.svelte"; - import TimeOffset from "./TimeOffset.svelte"; type Props = { name: string; profile: User | Member; lazyLoadAvatar?: boolean; - offset?: number | null; }; - let { name, profile, lazyLoadAvatar, offset }: Props = $props(); + let { name, profile, lazyLoadAvatar }: Props = $props(); // renderMarkdown sanitizes the output HTML for us let bio = $derived(renderMarkdown(profile.bio)); @@ -47,11 +45,8 @@ {:else}

{name}

{/if} - {#if offset}{/if} {#if bio}
- -

{@html bio}

{/if} diff --git a/Foxnouns.Frontend/src/lib/components/profile/TimeOffset.svelte b/Foxnouns.Frontend/src/lib/components/profile/TimeOffset.svelte deleted file mode 100644 index f6d2de4..0000000 --- a/Foxnouns.Frontend/src/lib/components/profile/TimeOffset.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - -{currentTime} (UTC{timezone}) diff --git a/Foxnouns.Frontend/src/lib/components/settings/EmailSettings.svelte b/Foxnouns.Frontend/src/lib/components/settings/EmailSettings.svelte index 4bd3318..29a1197 100644 --- a/Foxnouns.Frontend/src/lib/components/settings/EmailSettings.svelte +++ b/Foxnouns.Frontend/src/lib/components/settings/EmailSettings.svelte @@ -35,7 +35,7 @@
- +

Change password

diff --git a/Foxnouns.Frontend/src/lib/errorCodes.ts b/Foxnouns.Frontend/src/lib/errorCodes.ts index b97b71b..b9c3d9a 100644 --- a/Foxnouns.Frontend/src/lib/errorCodes.ts +++ b/Foxnouns.Frontend/src/lib/errorCodes.ts @@ -1,7 +1,6 @@ import { ErrorCode } from "$api/error"; import type { Modifier } from "sveltekit-i18n"; -// eslint-disable-next-line type TranslateFn = (key: string, payload?: any, props?: Modifier.Props<{}> | undefined) => any; export default function errorDescription(t: TranslateFn, code: ErrorCode): string { diff --git a/Foxnouns.Frontend/src/lib/i18n/index.ts b/Foxnouns.Frontend/src/lib/i18n/index.ts index 27a9603..858f2bd 100644 --- a/Foxnouns.Frontend/src/lib/i18n/index.ts +++ b/Foxnouns.Frontend/src/lib/i18n/index.ts @@ -1,7 +1,6 @@ import { PUBLIC_LANGUAGE } from "$env/static/public"; import i18n, { type Config } from "sveltekit-i18n"; -// eslint-disable-next-line @typescript-eslint/no-explicit-any const config: Config = { initLocale: PUBLIC_LANGUAGE, fallbackLocale: "en", diff --git a/Foxnouns.Frontend/src/lib/i18n/locales/en.json b/Foxnouns.Frontend/src/lib/i18n/locales/en.json index f9de99f..cd45d49 100644 --- a/Foxnouns.Frontend/src/lib/i18n/locales/en.json +++ b/Foxnouns.Frontend/src/lib/i18n/locales/en.json @@ -61,13 +61,7 @@ "add-email-address": "Add email address", "no-email-addresses": "You haven't linked any email addresses yet.", "check-inbox-for-link-hint": "Check your inbox for a link!", - "successful-link-email": "Your account has successfully been linked to the following email address:", - "reset-password-button": "Reset password", - "log-in-forgot-password-link": "Forgot your password?", - "log-in-sign-up-link": "Sign up with email", - "forgot-password-title": "Forgot password", - "reset-password-title": "Reset password", - "password-changed-hint": "Your password has been changed!" + "successful-link-email": "Your account has successfully been linked to the following email address:" }, "error": { "bad-request-header": "Something was wrong with your input", diff --git a/Foxnouns.Frontend/src/routes/@[username]/+page.svelte b/Foxnouns.Frontend/src/routes/@[username]/+page.svelte index cefd8bc..903312d 100644 --- a/Foxnouns.Frontend/src/routes/@[username]/+page.svelte +++ b/Foxnouns.Frontend/src/routes/@[username]/+page.svelte @@ -25,7 +25,7 @@ {/if} - + {#if data.members.length > 0} diff --git a/Foxnouns.Frontend/src/routes/auth/forgot-password/+page.server.ts b/Foxnouns.Frontend/src/routes/auth/forgot-password/+page.server.ts deleted file mode 100644 index f7195a0..0000000 --- a/Foxnouns.Frontend/src/routes/auth/forgot-password/+page.server.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { apiRequest, fastRequest } from "$api"; -import ApiError from "$api/error.js"; -import type { AuthUrls } from "$api/models/auth"; -import log from "$lib/log.js"; -import { redirect } from "@sveltejs/kit"; - -export const load = async ({ parent, fetch }) => { - const { meUser } = await parent(); - if (meUser) redirect(303, `/@${meUser.username}`); - - const urls = await apiRequest("POST", "/auth/urls", { fetch, isInternal: true }); - if (!urls.email_enabled) redirect(303, "/"); -}; - -export const actions = { - default: async ({ request, fetch }) => { - const data = await request.formData(); - const email = data.get("email") as string; - - try { - await fastRequest("POST", "/auth/email/forgot-password", { - body: { email }, - isInternal: true, - fetch, - }); - - return { ok: true, error: null }; - } catch (e) { - if (e instanceof ApiError) return { ok: false, error: e.obj }; - log.error("error sending forget password email:", e); - throw e; - } - }, -}; diff --git a/Foxnouns.Frontend/src/routes/auth/forgot-password/+page.svelte b/Foxnouns.Frontend/src/routes/auth/forgot-password/+page.svelte deleted file mode 100644 index 97d902a..0000000 --- a/Foxnouns.Frontend/src/routes/auth/forgot-password/+page.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - {$t("auth.forgot-password-title")} • pronouns.cc - - -
-
-

{$t("auth.forgot-password-title")}

- - - - - - -
- -
- -
-
diff --git a/Foxnouns.Frontend/src/routes/auth/forgot-password/[code]/+page.server.ts b/Foxnouns.Frontend/src/routes/auth/forgot-password/[code]/+page.server.ts deleted file mode 100644 index 896504e..0000000 --- a/Foxnouns.Frontend/src/routes/auth/forgot-password/[code]/+page.server.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { apiRequest, fastRequest } from "$api"; -import ApiError, { ErrorCode, type RawApiError } from "$api/error"; -import type { AuthUrls } from "$api/models"; -import log from "$lib/log"; -import { redirect } from "@sveltejs/kit"; - -export const load = async ({ params, parent, fetch }) => { - const { meUser } = await parent(); - if (meUser) redirect(303, `/@${meUser.username}`); - - const urls = await apiRequest("POST", "/auth/urls", { fetch, isInternal: true }); - if (!urls.email_enabled) redirect(303, "/"); - - return { state: params.code }; -}; - -export const actions = { - default: async ({ request, fetch }) => { - const data = await request.formData(); - const state = data.get("state") as string; - const password = data.get("password") as string; - const password2 = data.get("confirm-password") as string; - if (password !== password2) { - return { - ok: false, - error: { - status: 400, - message: "Passwords don't match", - code: ErrorCode.BadRequest, - } as RawApiError, - }; - } - - try { - await fastRequest("POST", "/auth/email/reset-password", { - body: { state, password }, - isInternal: true, - fetch, - }); - - return { ok: true, error: null }; - } catch (e) { - if (e instanceof ApiError) return { ok: false, error: e.obj }; - log.error("error resetting password:", e); - throw e; - } - }, -}; diff --git a/Foxnouns.Frontend/src/routes/auth/forgot-password/[code]/+page.svelte b/Foxnouns.Frontend/src/routes/auth/forgot-password/[code]/+page.svelte deleted file mode 100644 index fa01587..0000000 --- a/Foxnouns.Frontend/src/routes/auth/forgot-password/[code]/+page.svelte +++ /dev/null @@ -1,41 +0,0 @@ - - - - {$t("auth.reset-password-title")} • pronouns.cc - - -
-
-

{$t("auth.reset-password-title")}

- - - -
- -
- - -
-
- - -
-
- -
-
-
-
diff --git a/Foxnouns.Frontend/src/routes/auth/log-in/+page.svelte b/Foxnouns.Frontend/src/routes/auth/log-in/+page.svelte index c6c47a9..33d3e31 100644 --- a/Foxnouns.Frontend/src/routes/auth/log-in/+page.svelte +++ b/Foxnouns.Frontend/src/routes/auth/log-in/+page.svelte @@ -2,6 +2,7 @@ import type { ActionData, PageData } from "./$types"; import { t } from "$lib/i18n"; import { enhance } from "$app/forms"; + import { Button, ButtonGroup, Input, InputGroup } from "@sveltestrap/sveltestrap"; import ErrorAlert from "$components/ErrorAlert.svelte"; type Props = { data: PageData; form: ActionData }; @@ -20,34 +21,29 @@
{#if data.urls.email_enabled} -
+

{$t("auth.log-in-form-title")}

- +
- +
- + + + + {$t("auth.register-with-email-button")} + +
-

- {$t("auth.log-in-sign-up-link")} • - {$t("auth.log-in-forgot-password-link")} -

{:else}
{/if} -
+

{$t("auth.log-in-3rd-party-header")}

{$t("auth.log-in-3rd-party-desc")}

@@ -75,20 +71,19 @@ {#if form?.showFediBox}

{$t("auth.log-in-with-the-fediverse")}

-
- + - -
+ +

{$t("auth.log-in-with-fediverse-error-blurb")} - +

{/if} diff --git a/Foxnouns.Frontend/src/routes/auth/register/+page.svelte b/Foxnouns.Frontend/src/routes/auth/register/+page.svelte index 59c6181..b43b789 100644 --- a/Foxnouns.Frontend/src/routes/auth/register/+page.svelte +++ b/Foxnouns.Frontend/src/routes/auth/register/+page.svelte @@ -1,12 +1,12 @@ diff --git a/Foxnouns.Frontend/src/routes/settings/+page.svelte b/Foxnouns.Frontend/src/routes/settings/+page.svelte index 74b4a49..f43c8a5 100644 --- a/Foxnouns.Frontend/src/routes/settings/+page.svelte +++ b/Foxnouns.Frontend/src/routes/settings/+page.svelte @@ -1,7 +1,7 @@