diff --git a/SKILL-template.md b/SKILL-template.md index ffafc9e5..4c65a7d7 100644 --- a/SKILL-template.md +++ b/SKILL-template.md @@ -3,13 +3,15 @@ name: org.goteo.www description: Provides a web GUI to interact with the Goteo v4 API and adds tools for implementing the crowdfunding platform Goteo as an open-core application. Use it when writing or reviewing source code for the Goteo v4 web. --- +# Goteo v4 Web Codebase Reference + ## Stack Astro 5 + Svelte 5 + TailwindCSS 4 + TypeScript 5, deployed on Cloudflare Workers (also supports Node adapter). ## Folder structure -``` +```bash src/ ├── actions/ # Astro server actions (form mutations) ├── auth/ # JWT sessions, OAuth2 tokens, refresh logic @@ -491,7 +493,7 @@ Two packages: `@hey-api/openapi-ts` (codegen, dev dependency) and `@hey-api/clie SDK functions follow the pattern `api{Resource}{Operation}`: -``` +```bash apiProjectsGetCollection() → GET /v4/projects apiProjectsIdOrSlugGet() → GET /v4/projects/{idOrSlug} apiUsersPost() → POST /v4/users @@ -500,7 +502,7 @@ apiUsersIdpersonPatch() → PATCH /v4/users/{id}/person Path constants (from `paths.gen.ts`) follow the same pattern with `Url` suffix: -``` +```bash apiProjectsIdOrSlugGetUrl → '/v4/projects/{idOrSlug}' apiAccountingsIdGetUrl → '/v4/accountings/{id}' ``` diff --git a/crowdin-test.yml b/crowdin-test.yml new file mode 100644 index 00000000..12b5d3d8 --- /dev/null +++ b/crowdin-test.yml @@ -0,0 +1,3 @@ +files: + - source: /src/i18n/locales/es.json + translation: /src/i18n/locales/%two_letters_code%.json diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000..12b5d3d8 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,3 @@ +files: + - source: /src/i18n/locales/es.json + translation: /src/i18n/locales/%two_letters_code%.json diff --git a/package.json b/package.json index 0642a482..1b29da8d 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "bits-ui": "^2.18.1", "chart.js": "^4.5.1", "csrf": "^3.1.0", + "dexie": "^4.4.2", "dotenv": "^16.6.1", "file-type": "^22.0.1", "flickity": "^3.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7929c1c1..da34ef03 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: version: 0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.5.3)(typescript@5.9.3) '@astrojs/cloudflare': specifier: ^12.6.13 - version: 12.6.13(@types/node@24.12.2)(astro@5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4))(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + version: 12.6.13(@types/node@24.12.3)(astro@5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) '@astrojs/node': specifier: ^9.5.5 - version: 9.5.5(astro@5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4)) + version: 9.5.5(astro@5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0)) '@astrojs/svelte': specifier: ^7.2.5 - version: 7.2.5(@types/node@24.12.2)(astro@5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4))(jiti@2.6.1)(lightningcss@1.32.0)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3)(yaml@2.8.4) + version: 7.2.5(@types/node@24.12.3)(astro@5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.6.1)(lightningcss@1.32.0)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3)(yaml@2.9.0) '@aws-sdk/client-s3': specifier: ^3.1041.0 version: 3.1045.0 @@ -34,34 +34,34 @@ importers: version: 0.11.0(@hey-api/openapi-ts@0.69.2(magicast@0.3.5)(typescript@5.9.3)) '@tailwindcss/vite': specifier: ^4.2.4 - version: 4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + version: 4.3.0(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) '@tiptap/core': specifier: ^3.22.5 - version: 3.22.5(@tiptap/pm@3.22.5) + version: 3.23.1(@tiptap/pm@3.23.1) '@tiptap/extension-font-family': specifier: ^3.22.5 - version: 3.22.5(@tiptap/extension-text-style@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))) + version: 3.23.1(@tiptap/extension-text-style@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))) '@tiptap/extension-placeholder': specifier: ^3.22.5 - version: 3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) + version: 3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) '@tiptap/extension-text-align': specifier: ^3.22.5 - version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + version: 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) '@tiptap/extension-text-style': specifier: ^3.22.5 - version: 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + version: 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) '@tiptap/pm': specifier: ^3.22.5 - version: 3.22.5 + version: 3.23.1 '@tiptap/starter-kit': specifier: ^3.22.5 - version: 3.22.5 + version: 3.23.1 '@types/iso-3166-2': specifier: ^1.0.4 version: 1.0.4 astro: specifier: ^5.18.1 - version: 5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4) + version: 5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0) bits-ui: specifier: ^2.18.1 version: 2.18.1(@internationalized/date@3.7.0)(svelte@5.55.5(@typescript-eslint/types@8.59.2)) @@ -71,6 +71,9 @@ importers: csrf: specifier: ^3.1.0 version: 3.1.0 + dexie: + specifier: ^4.4.2 + version: 4.4.2 dotenv: specifier: ^16.6.1 version: 16.6.1 @@ -97,10 +100,10 @@ importers: version: 5.55.5(@typescript-eslint/types@8.59.2) tailwind-merge: specifier: ^3.5.0 - version: 3.5.0 + version: 3.6.0 tailwindcss: specifier: ^4.2.4 - version: 4.2.4 + version: 4.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -116,28 +119,28 @@ importers: version: 0.69.2(magicast@0.3.5)(typescript@5.9.3) '@storybook/addon-a11y': specifier: ^10.4.1 - version: 10.4.1(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) + version: 10.4.1(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) '@storybook/addon-docs': specifier: ^10.4.1 - version: 10.4.1(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + version: 10.4.1(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) '@storybook/addon-svelte-csf': specifier: ^5.1.2 - version: 5.1.2(@storybook/svelte@10.4.1(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2)))(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)))(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + version: 5.1.2(@storybook/svelte@10.4.1(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2)))(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)))(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) '@storybook/addon-vitest': specifier: ^10.4.1 - version: 10.4.1(@vitest/browser-playwright@4.1.5)(@vitest/browser@4.1.5)(@vitest/runner@4.1.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.5) + version: 10.4.1(@vitest/browser-playwright@4.1.5)(@vitest/browser@4.1.5)(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5) '@storybook/svelte-vite': specifier: ^10.4.1 - version: 10.4.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)))(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + version: 10.4.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)))(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + version: 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) '@types/murmurhash-js': specifier: ^1.0.7 version: 1.0.7 '@types/node': specifier: ^24.12.2 - version: 24.12.2 + version: 24.12.3 '@typescript-eslint/eslint-plugin': specifier: ^8.59.2 version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) @@ -146,7 +149,7 @@ importers: version: 8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser-playwright': specifier: ^4.1.5 - version: 4.1.5(playwright@1.59.1)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5) + version: 4.1.5(playwright@1.59.1)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5) '@vitest/coverage-v8': specifier: ^4.1.5 version: 4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5) @@ -164,7 +167,7 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)) eslint-plugin-storybook: specifier: ^10.4.1 - version: 10.4.1(eslint@9.39.4(jiti@2.6.1))(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3) + version: 10.4.1(eslint@9.39.4(jiti@2.6.1))(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3) eslint-plugin-svelte: specifier: ^3.17.1 version: 3.17.1(eslint@9.39.4(jiti@2.6.1))(svelte@5.55.5(@typescript-eslint/types@8.59.2)) @@ -173,10 +176,10 @@ importers: version: 4.4.1(@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)) flowbite: specifier: ^3.1.2 - version: 3.1.2(rollup@4.60.3) + version: 3.1.2(rollup@4.52.2) flowbite-svelte: specifier: 1.5.2 - version: 1.5.2(rollup@4.60.3)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(tailwindcss@4.2.4) + version: 1.5.2(rollup@4.52.2)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(tailwindcss@4.3.0) flowbite-svelte-icons: specifier: ^2.3.0 version: 2.3.0(svelte@5.55.5(@typescript-eslint/types@8.59.2)) @@ -203,7 +206,7 @@ importers: version: 2.1.5 storybook: specifier: ^10.4.1 - version: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) svelte-eslint-parser: specifier: ^1.6.1 version: 1.6.1(svelte@5.55.5(@typescript-eslint/types@8.59.2)) @@ -215,13 +218,13 @@ importers: version: 8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^4.1.5 - version: 4.1.5(@types/node@24.12.2)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + version: 4.1.5(@types/node@24.12.3)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) wait-on: specifier: ^9.0.5 - version: 9.0.5 + version: 9.0.8 wrangler: specifier: ^4.87.0 - version: 4.87.0(@cloudflare/workers-types@4.20260505.1) + version: 4.90.0(@cloudflare/workers-types@4.20260214.0) packages: @@ -245,8 +248,8 @@ packages: '@astrojs/internal-helpers@0.7.6': resolution: {integrity: sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==} - '@astrojs/language-server@2.16.7': - resolution: {integrity: sha512-b64bWT74Vq/ORcSqW7TdIjjpB6hcl+Ei/lMANIUaAGlLPiYNtPTRI/j2tzvugT+LoVwfJtE2Ukq/t2OGCyEtfQ==} + '@astrojs/language-server@2.16.8': + resolution: {integrity: sha512-yg1pZF6hs9FaKr2fgXMOGbW7pDLgFexFjuhWilPAc8VybTU+WSnbfbhYaUL1exm6dAK4sM3aKXGcfVwss+HXbg==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -466,8 +469,8 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true @@ -525,8 +528,8 @@ packages: cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-64@1.20260430.1': - resolution: {integrity: sha512-ADohZUHf7NBvPp2PdZig2Opxx+hDkk3ve7jrTne3JRx9kDSB73zc4LzcEeEN8LKkbAcqZmvfRJfpChSlusu0lA==} + '@cloudflare/workerd-darwin-64@1.20260507.1': + resolution: {integrity: sha512-S85aMwcaPJUjKWDiG6iMMnioKWtPLACa6m0j/EhHR1GYfVpnxb974cBc6d25L+sf7jHWHJI2u5hGp0UTJ7MtXQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -537,8 +540,8 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260430.1': - resolution: {integrity: sha512-/DoYC/1wHs+YRZzzqSQg1/EHB4hiv1yV5U8FnmapRRIzVaPtnt+ApeOXeMrIdKidgKOI8TqQzgBU8xbIM7Cl4Q==} + '@cloudflare/workerd-darwin-arm64@1.20260507.1': + resolution: {integrity: sha512-GMEBu8Zp9Q97HLnf7bWJN4KjWpN5MxpeqdvHjBGWNl8UYprJI0k+Jkp89+Wh5S8vIon+HoVbDfOzPa7VwgL6Eg==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -549,8 +552,8 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-64@1.20260430.1': - resolution: {integrity: sha512-koJhBWvEVZPKCVFtMLp2iMHlYr+lFCF47wGbnlKdHVlemV0zTxJEyHI8aLlrhPLhBmOmYLp46rXw09/qJkRIhQ==} + '@cloudflare/workerd-linux-64@1.20260507.1': + resolution: {integrity: sha512-QlrKEBdgA3uVc0Ok0Q3+0/CW0CTjgj5ySir1i1YY5FXVv0X6GpwtnB5umjunjF2MFprss+L+iFGZzxcSvMC1nA==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -561,8 +564,8 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260430.1': - resolution: {integrity: sha512-hMdapNAzNQZDXGGkg4Slydc3fRJP5FUZLJVVcZCW/+imhhJro9Z1rv5n/wfR+txKoSWhTYR8eOp8Pyi2bzLzlw==} + '@cloudflare/workerd-linux-arm64@1.20260507.1': + resolution: {integrity: sha512-eGbbupEtK2nh9V9Dhcx3vv3GTKeXqSVNgAEYVCCN0NGS9tl9HbMoHRX/4JL181FKXROMigWBCQVL//qPhsAzBQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -573,14 +576,14 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workerd-windows-64@1.20260430.1': - resolution: {integrity: sha512-jS3ffixjb5USOwz4frw4WzCz0HrjVxkgyU3WiYb06N7hBAfN6eOrveAJ4QRef0+suK4V1vQFoB1oKdRBsXe9Dw==} + '@cloudflare/workerd-windows-64@1.20260507.1': + resolution: {integrity: sha512-dmClJ/E0BAcuDetQIZFqbeAXejWrG5pysGRMQ6T83Y0IW/7IAamY2zFEkAJ10I5xwZsdHuYsZtzlOxpEXpJs7A==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20260505.1': - resolution: {integrity: sha512-Uz9D2hcwB4/pdnmCU7RsgknY8TQ5st0cQMMN6h/hvWt1TCt99GUkbi6dMgWdP7jXfIfh+S/EI5zQugI9RZn4Bw==} + '@cloudflare/workers-types@4.20260214.0': + resolution: {integrity: sha512-qb8rgbAdJR4BAPXolXhFL/wuGtecHLh1veOyZ1mK6QqWuCdI3vK1biKC0i3lzmzdLR/DZvsN3mNtpUE8zpWGEg==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -614,20 +617,26 @@ packages: '@emmetio/stream-reader@2.2.0': resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -644,14 +653,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -668,14 +671,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -692,14 +689,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -716,14 +707,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -740,14 +725,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -764,14 +743,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -788,14 +761,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -812,14 +779,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -836,14 +797,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -860,14 +815,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -884,14 +833,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -908,14 +851,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -932,14 +869,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -956,14 +887,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -980,14 +905,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1004,14 +923,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -1028,14 +941,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -1052,14 +959,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -1076,14 +977,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1100,14 +995,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1124,14 +1013,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -1148,14 +1031,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1172,14 +1049,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1196,14 +1067,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1220,14 +1085,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1244,12 +1103,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1288,14 +1141,14 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.7.1': + resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + '@floating-ui/dom@1.7.1': + resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} '@fontsource/karla@5.2.8': resolution: {integrity: sha512-uZMA4ugNcHFYMpjr/9FIHQC3ldtILlqPdK3f4P9XInDgRL0NxdIyRwH9MuGZUT7sdup0kshk9zsGXitq1xpFAw==} @@ -1313,8 +1166,8 @@ packages: '@hapi/pinpoint@2.0.1': resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} - '@hapi/tlds@1.1.6': - resolution: {integrity: sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==} + '@hapi/tlds@1.1.3': + resolution: {integrity: sha512-QIvUMB5VZ8HMLZF9A2oWr3AFM430QC8oGd0L35y2jHpuW6bIIca6x/xL7zUf4J7L9WJ3qjz+iJII8ncaeMbpSg==} engines: {node: '>=14.0.0'} '@hapi/topo@6.0.2': @@ -1337,28 +1190,28 @@ packages: peerDependencies: typescript: ^5.5.3 - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} - - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.34.5': @@ -1387,105 +1240,89 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1513,8 +1350,9 @@ packages: '@internationalized/date@3.7.0': resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==} - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -1523,9 +1361,16 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -1603,56 +1448,48 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.127.0': resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.127.0': resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.127.0': resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.127.0': resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.127.0': resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.127.0': resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} @@ -1686,111 +1523,98 @@ packages: '@oxc-project/types@0.127.0': resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} - '@oxc-resolver/binding-android-arm-eabi@11.19.1': - resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} + '@oxc-resolver/binding-android-arm-eabi@11.20.0': + resolution: {integrity: sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.19.1': - resolution: {integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==} + '@oxc-resolver/binding-android-arm64@11.20.0': + resolution: {integrity: sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.19.1': - resolution: {integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==} + '@oxc-resolver/binding-darwin-arm64@11.20.0': + resolution: {integrity: sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.19.1': - resolution: {integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==} + '@oxc-resolver/binding-darwin-x64@11.20.0': + resolution: {integrity: sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.19.1': - resolution: {integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==} + '@oxc-resolver/binding-freebsd-x64@11.20.0': + resolution: {integrity: sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': - resolution: {integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': + resolution: {integrity: sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': - resolution: {integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': + resolution: {integrity: sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': - resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} + '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': + resolution: {integrity: sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg==} cpu: [arm64] os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-arm64-musl@11.19.1': - resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} + '@oxc-resolver/binding-linux-arm64-musl@11.20.0': + resolution: {integrity: sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw==} cpu: [arm64] os: [linux] - libc: [musl] - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': - resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': + resolution: {integrity: sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ==} cpu: [ppc64] os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': - resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': + resolution: {integrity: sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw==} cpu: [riscv64] os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': - resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} + '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': + resolution: {integrity: sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg==} cpu: [riscv64] os: [linux] - libc: [musl] - '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': - resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} + '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': + resolution: {integrity: sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g==} cpu: [s390x] os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-x64-gnu@11.19.1': - resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} + '@oxc-resolver/binding-linux-x64-gnu@11.20.0': + resolution: {integrity: sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g==} cpu: [x64] os: [linux] - libc: [glibc] - '@oxc-resolver/binding-linux-x64-musl@11.19.1': - resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} + '@oxc-resolver/binding-linux-x64-musl@11.20.0': + resolution: {integrity: sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ==} cpu: [x64] os: [linux] - libc: [musl] - '@oxc-resolver/binding-openharmony-arm64@11.19.1': - resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} + '@oxc-resolver/binding-openharmony-arm64@11.20.0': + resolution: {integrity: sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ==} cpu: [arm64] os: [openharmony] - '@oxc-resolver/binding-wasm32-wasi@11.19.1': - resolution: {integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==} + '@oxc-resolver/binding-wasm32-wasi@11.20.0': + resolution: {integrity: sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': - resolution: {integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==} + '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': + resolution: {integrity: sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': - resolution: {integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==} - cpu: [ia32] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.19.1': - resolution: {integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==} + '@oxc-resolver/binding-win32-x64-msvc@11.20.0': + resolution: {integrity: sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw==} cpu: [x64] os: [win32] @@ -1800,14 +1624,14 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@poppinss/colors@4.1.6': - resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} - '@poppinss/dumper@0.6.5': - resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} - '@poppinss/exception@1.2.3': - resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} '@rollup/plugin-node-resolve@15.3.1': resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} @@ -1827,170 +1651,142 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.3': - resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} + '@rollup/rollup-android-arm-eabi@4.52.2': + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.3': - resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} + '@rollup/rollup-android-arm64@4.52.2': + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.3': - resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + '@rollup/rollup-darwin-arm64@4.52.2': + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.3': - resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + '@rollup/rollup-darwin-x64@4.52.2': + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.3': - resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + '@rollup/rollup-freebsd-arm64@4.52.2': + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.3': - resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + '@rollup/rollup-freebsd-x64@4.52.2': + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': - resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} cpu: [arm] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.3': - resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} cpu: [arm] os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.3': - resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} + '@rollup/rollup-linux-arm64-gnu@4.52.2': + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} cpu: [arm64] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.3': - resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} + '@rollup/rollup-linux-arm64-musl@4.52.2': + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} cpu: [arm64] os: [linux] - libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.3': - resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} + '@rollup/rollup-linux-loong64-gnu@4.52.2': + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} cpu: [loong64] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.3': - resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.60.3': - resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} cpu: [ppc64] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.3': - resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.60.3': - resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} cpu: [riscv64] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.3': - resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} + '@rollup/rollup-linux-riscv64-musl@4.52.2': + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} cpu: [riscv64] os: [linux] - libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.3': - resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} + '@rollup/rollup-linux-s390x-gnu@4.52.2': + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} cpu: [s390x] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.3': - resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} + '@rollup/rollup-linux-x64-gnu@4.52.2': + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} cpu: [x64] os: [linux] - libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.3': - resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} + '@rollup/rollup-linux-x64-musl@4.52.2': + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} cpu: [x64] os: [linux] - libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.3': - resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.60.3': - resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} + '@rollup/rollup-openharmony-arm64@4.52.2': + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.3': - resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} + '@rollup/rollup-win32-arm64-msvc@4.52.2': + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.3': - resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} + '@rollup/rollup-win32-ia32-msvc@4.52.2': + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.3': - resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} + '@rollup/rollup-win32-x64-gnu@4.52.2': + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.3': - resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} + '@rollup/rollup-win32-x64-msvc@4.52.2': + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@shikijs/core@3.23.0': - resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} - '@shikijs/engine-javascript@3.23.0': - resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} - '@shikijs/engine-oniguruma@3.23.0': - resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} - '@shikijs/langs@3.23.0': - resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} - '@shikijs/themes@3.23.0': - resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} - '@shikijs/types@3.23.0': - resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sindresorhus/is@7.2.0': - resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + '@sindresorhus/is@7.1.0': + resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} engines: {node: '>=18'} '@smithy/chunked-blob-reader-native@4.2.3': @@ -2205,8 +2001,11 @@ packages: resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} - '@speed-highlight/core@1.2.15': - resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -2316,8 +2115,8 @@ packages: storybook: ^10.4.1 svelte: ^5.0.0 - '@sveltejs/acorn-typescript@1.0.9': - resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==} + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} peerDependencies: acorn: ^8.9.0 @@ -2345,8 +2144,8 @@ packages: resolution: {integrity: sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==} engines: {node: '>= 0.8.0'} - '@svgdotjs/svg.js@3.2.5': - resolution: {integrity: sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==} + '@svgdotjs/svg.js@3.2.4': + resolution: {integrity: sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==} '@svgdotjs/svg.resize.js@2.0.5': resolution: {integrity: sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==} @@ -2361,72 +2160,68 @@ packages: peerDependencies: '@svgdotjs/svg.js': ^3.2.4 - '@swc/helpers@0.5.21': - resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@tailwindcss/node@4.2.4': - resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} - '@tailwindcss/oxide-android-arm64@4.2.4': - resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.4': - resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.4': - resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.4': - resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': - resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': - resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': - resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': - resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.4': - resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.4': - resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -2437,24 +2232,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': - resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': - resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.4': - resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.2.4': - resolution: {integrity: sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==} + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 @@ -2472,151 +2267,151 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tiptap/core@3.22.5': - resolution: {integrity: sha512-L1lhWz6ujGny8LduTJ7MBWYhzigwOvfUJUrJ7IzOJSuy3+OAzisdGDD1GV7LEO/hU0Hr2Mkm1wajRIHExvS9HQ==} + '@tiptap/core@3.23.1': + resolution: {integrity: sha512-8YvSGiJTeU5wPuGiYIIYgyiyaaT1CAx+kJL0bju0w871OvbJJj0T/ywhcmxGXW6pOal2T8X2xt9ZqE+vib0VJw==} peerDependencies: - '@tiptap/pm': 3.22.5 + '@tiptap/pm': 3.23.1 - '@tiptap/extension-blockquote@3.22.5': - resolution: {integrity: sha512-ajyP5W8fG5Hrru47T/eF3xMKOpNvWofgNJqBTeNuGl02sYxsy9a4EunyFxudsaZP9WW3VOD4SaIWr5+MqpbnOQ==} + '@tiptap/extension-blockquote@3.23.1': + resolution: {integrity: sha512-FdVZLZOkL06j3WLXOC2UeX7++Cj3qI2vfohruMJiz4vk1Q5UUH7G4+AykFzjzBJHrdEpkiRUkRpU1KZIWdbluw==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-bold@3.22.5': - resolution: {integrity: sha512-l/uDtpJISiFFyfctvnODNWBN/XPZI1jVZRacTRDDnSn8+x6KQ7G2qgFYueU7KvVJGDFVT39Iio56mcFRG/Pozg==} + '@tiptap/extension-bold@3.23.1': + resolution: {integrity: sha512-EAYdNzyOjlQh2VBY1EhdxtiTjVMaOAD6P0ezms60dKRjd4oj/8grfXfUqwgo4NVdFb11Ks85vXoHuXJSylfR4A==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-bullet-list@3.22.5': - resolution: {integrity: sha512-cf54fG9AybU8NgPMv1TOcoqAkELeRc/VpnSCt/rIJZphWQx9nsFmrtkrlCatrIcCaGtNZYwlHlMnC5LVVMu0uA==} + '@tiptap/extension-bullet-list@3.23.1': + resolution: {integrity: sha512-owWnBBI4t+jqVDY0naDjhsAmrNGldh4czouef2K+mEf032B7uGsDVCwKp1qaX1JZesyYDfvXOaIwT22hNID2mw==} peerDependencies: - '@tiptap/extension-list': 3.22.5 + '@tiptap/extension-list': 3.23.1 - '@tiptap/extension-code-block@3.22.5': - resolution: {integrity: sha512-d123kCfLdJTi4fue1m0+TNFztDkmIRSZGZmGu6H9KqwG5Q7IzjT9o8lzRsz+pXxYqHvqgYmXoEpM6srbzXx/Ag==} + '@tiptap/extension-code-block@3.23.1': + resolution: {integrity: sha512-BdJGqM57CsKgYrQUZz78vIG8Yn7EpsE2pA7iKn5tYoSXpYtt0IaU4qB1heH7lwWD/vVCAm0YQVD7/0F+0++yhA==} peerDependencies: - '@tiptap/core': 3.22.5 - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1 + '@tiptap/pm': 3.23.1 - '@tiptap/extension-code@3.22.5': - resolution: {integrity: sha512-mwDNOJC9rYbDu/JcqrN4dbUQRklJU8Fuk2raxD/IvFw9qUIcPCmxQ2XT9UTKmZz/Ju7Kdy72fss6XpgWv6gLAQ==} + '@tiptap/extension-code@3.23.1': + resolution: {integrity: sha512-nGuhb4YghgTfkejwWHrD9GSpwcC5kkVmm2sN/UY4yceDw+PkyysYKJWZehRLTOC8GNgSAhq/EeQeq14Xwk6dyg==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-document@3.22.5': - resolution: {integrity: sha512-8NJERd+pCtvSuEP4C4WMGYmRRCV12ePZL7bC+QUdFlbdXg+kNZS0zZ7hh879tYA0Kidbi8rWWD1Tx+H2ezkmMw==} + '@tiptap/extension-document@3.23.1': + resolution: {integrity: sha512-NA5Rx59HRwG6Hb6LwLpC5lE7z6vCj6f90S7RNNsnE+CyiXNR/OhY2BcjuxiGnascHvsnsAbvxGU3ymKMDgvDVg==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-dropcursor@3.22.5': - resolution: {integrity: sha512-Mp40DaFrY3sEUVtFqmxrR0BmU4G3k8GCYYNGqNa9OqWv7BrcFDC03V2n3okESDKt4MKkzhQQmypq+ouLy8dLfA==} + '@tiptap/extension-dropcursor@3.23.1': + resolution: {integrity: sha512-WRN7e/h9m3uI5j9/+L6jcPhHbTL6aKxfFfQWZHNf5M8TqSL1P+/2h034td0XMj3n48i4fWyzjVUV9+sz6t2fDw==} peerDependencies: - '@tiptap/extensions': 3.22.5 + '@tiptap/extensions': 3.23.1 - '@tiptap/extension-font-family@3.22.5': - resolution: {integrity: sha512-UAFIHmj4YbqJcCkBomrhy02cxBu7D2gQzVcurpNP1NdimqbWW2k+Km4SGss7hzZQXSETHtUKDkrAYgD8/UoY1A==} + '@tiptap/extension-font-family@3.23.1': + resolution: {integrity: sha512-qRSmPgXE4gRy7oX0nFhKZmTwp1cX5Lz90AYRDLrTvSaOM4nMgF2J6PU+vMIXv8vz6g4W0XCi9HYN3EuiXpby5A==} peerDependencies: - '@tiptap/extension-text-style': 3.22.5 + '@tiptap/extension-text-style': 3.23.1 - '@tiptap/extension-gapcursor@3.22.5': - resolution: {integrity: sha512-4WkMu7qqjbsm8hCQS+8X+la1wjriN0SKoRdvpfKH33qM50MB34tYJuGLAO+y7TTh4MMMco3AZCKPBL5JVMqNIg==} + '@tiptap/extension-gapcursor@3.23.1': + resolution: {integrity: sha512-E4hB0xquUpEXy7kboLBazrFyRCsN0j0fsTFR8udgQf5xetAVPhOexSTKuzOcU/n0kxsKJin7laYYEag/Fd2KNw==} peerDependencies: - '@tiptap/extensions': 3.22.5 + '@tiptap/extensions': 3.23.1 - '@tiptap/extension-hard-break@3.22.5': - resolution: {integrity: sha512-n0R2mUVYZU2AVbJhg/WcY9+zx690wVwvsItHJf0DrYbf1tCYHx+PRHUt/AoXk6u8BSmnkb8/FDziS8m3mjfpSg==} + '@tiptap/extension-hard-break@3.23.1': + resolution: {integrity: sha512-XYkCKC5RVqMmmBk+nd22/6IDDx1OC54sdStH5VEHtfOrarriO0JztK8Mr0TijPPk9N4rKXsmndYZM2xyWZZytQ==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-heading@3.22.5': - resolution: {integrity: sha512-hjyEG4947PAhMBfP1G6B0QAh6+y9mp2C5BQmNjprA05/lQzDAT7KFZzNh8ZVp3ol6aICKq/N1gFOW9Dc/9FUOw==} + '@tiptap/extension-heading@3.23.1': + resolution: {integrity: sha512-1z9yCSp8fevgX3r/4kWXO3of0WFCQWfYjWfHANvoJ4JQTYBkARjXlj1tbk5rrAJBFDDfKRkUpZOurXKgGo+h+g==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-horizontal-rule@3.22.5': - resolution: {integrity: sha512-vUV0/ugIbXOc8SJib0h8UMhgcqZXWu/dkEhlswZN4VVven1o5enkfxEiDw+OyIJHi5rUkrdhsQ/KTxG/Xb7X8A==} + '@tiptap/extension-horizontal-rule@3.23.1': + resolution: {integrity: sha512-30XUHXdEZxcz1FCWjz9HW2EEq06NQcAye6rXGnvHo6Y60iJ6MRsrX5byvceFNF9DTVtOIcUFBQ/psIiRcoi0KA==} peerDependencies: - '@tiptap/core': 3.22.5 - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1 + '@tiptap/pm': 3.23.1 - '@tiptap/extension-italic@3.22.5': - resolution: {integrity: sha512-4T8baSiLkeIymTgEwirxDFt5YgYofkP3m1+MGYdGy2HKcOK+1vpvlPhEO1X5qtZngtJW5S4+njKjinRg52A4PA==} + '@tiptap/extension-italic@3.23.1': + resolution: {integrity: sha512-lZB9YCjoVNDoPMguya66nBvaS/2YpGN5iAcjAGx/JQkCAZeOAtl9+ALMzbWPKH6tQP6m98YtkY1T7RXr++T0bA==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-link@3.22.5': - resolution: {integrity: sha512-d671MvF3GPKoS2OVxjIlQ7hIE7MS3hREdR+d4cvnnoiLLD+ZJ6KgDnxmWqF0a1s4qxLWK2KxKRSOIfYGE31QWQ==} + '@tiptap/extension-link@3.23.1': + resolution: {integrity: sha512-uOeyLqYQI0WG62agpFG24kVHSn3Z48gD8Y0uLLJbtzh/nDFC3d9So2sQGWlSVyMzsgkJ4k/9jNnxxsVO8qgJOg==} peerDependencies: - '@tiptap/core': 3.22.5 - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1 + '@tiptap/pm': 3.23.1 - '@tiptap/extension-list-item@3.22.5': - resolution: {integrity: sha512-W7uTmyKLhlsvuTPLv+8WwnsY+mlikBFIoLSvVcBaFt4MwpsZ+DeB6KQg02Y7tbtaAnG7rXu9Fvw2QORh2P728A==} + '@tiptap/extension-list-item@3.23.1': + resolution: {integrity: sha512-Fk/884un5OSLCFxe2TbOmfp3sLMB5b76CnMjaSrvgfiaZnsV2WlJZGPXxCAPbxNIATTykNlSBsVuMBO7we64Vg==} peerDependencies: - '@tiptap/extension-list': 3.22.5 + '@tiptap/extension-list': 3.23.1 - '@tiptap/extension-list-keymap@3.22.5': - resolution: {integrity: sha512-cGUnxJ0y515e1bVHNjUmbx7oWHoEon59w6BA5N2KwV9iW2mZZchlTX4yxJSOX+ixeVRChsa7YwC3Z1jUZ6AMEg==} + '@tiptap/extension-list-keymap@3.23.1': + resolution: {integrity: sha512-sHbE5sxiJzhgGn94GUAzD4qKM9SyImBrOlAGS/EIe+pausjqQE7xi+YW0gRo2jG+gXhSYl4/oAGXQXzmSInSUQ==} peerDependencies: - '@tiptap/extension-list': 3.22.5 + '@tiptap/extension-list': 3.23.1 - '@tiptap/extension-list@3.22.5': - resolution: {integrity: sha512-cVO3ZHCgxAWZ4zrFSs81FO2nyCk1wb2EHkpLpW98FzbJLkN9rDkazhW99P3HRWy/CvUldOT+8ecI1YrQtBojMg==} + '@tiptap/extension-list@3.23.1': + resolution: {integrity: sha512-v1AeXPpagslgRZdOp7WdjCoO4TjjNP8RM2R6Gqx0/inGaNXnM8zCMshOxZlAb03Ad7kq/4RGJmkpM/Jjsi6dEQ==} peerDependencies: - '@tiptap/core': 3.22.5 - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1 + '@tiptap/pm': 3.23.1 - '@tiptap/extension-ordered-list@3.22.5': - resolution: {integrity: sha512-OXdh4k4CNrukwiSdWdEQ49uvgnqvR0Z9aNSP4HI5/kZQ/Te1NtRtYCpUrzWyO/7CtjcCisXHti0o9C/TV8YMbQ==} + '@tiptap/extension-ordered-list@3.23.1': + resolution: {integrity: sha512-3GG7YFhVJWw/HWmRxvMMUC296x7TPBQRLsH4ryEC1SMAmVJnbTIvetyvIcLqLEXGW7Rj41S7SO8qjOXVceSOTA==} peerDependencies: - '@tiptap/extension-list': 3.22.5 + '@tiptap/extension-list': 3.23.1 - '@tiptap/extension-paragraph@3.22.5': - resolution: {integrity: sha512-52KCto4+XKpnBWpIufspWLyq4UWxAWC72ANPdGuIhbi72NRTabiTbTVN40uwGSPkyakeESG0/vKdWJCVvB4f0g==} + '@tiptap/extension-paragraph@3.23.1': + resolution: {integrity: sha512-GC7b6yAjASl1q9sNkPmukZmVYMfxx03EEhpMMrLYJY9GBz82Ald927yYQsOqf2aKA/Rjo/aZMYCGtjXkGk6aBA==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-placeholder@3.22.5': - resolution: {integrity: sha512-MZAohQ3FCS763BkhGXgaWRya6WruZjwRwEAkXP8vkxbERzl2OJRjniS4uXCWzAlRb3ttE103SnY7LMdM8FvsXw==} + '@tiptap/extension-placeholder@3.23.1': + resolution: {integrity: sha512-eKmQhDt+51GIPxcFXoT8wmS+ejt6evIiHtXBgsLaABG6wg9GHnpGEndPcXsDGVR1s5ZLawVB52PFCX5GqKoWlQ==} peerDependencies: - '@tiptap/extensions': 3.22.5 + '@tiptap/extensions': 3.23.1 - '@tiptap/extension-strike@3.22.5': - resolution: {integrity: sha512-42WrrFK5gOom/0znH85x12Mw5IQ/6O6DWdyUWoRIrNA/qJpuHtU8oVU+bIgU2tuomMGHruRjIzgBQv5sBjEtww==} + '@tiptap/extension-strike@3.23.1': + resolution: {integrity: sha512-+R5LG0ZW9SDZc4weA79uq6uUduVsCEph9tRcoQCRA82IVIiPYSTxTLew9odalmk/Mc7vdZvOK5jjtO5jUVw/rg==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-text-align@3.22.5': - resolution: {integrity: sha512-LNUinhsZJC+/Vm7ugtghSjqlO64FQuww8oJkHq54Oh135fJ+kY2yBRakYFeH0P0gl4VPJH13AUetLF696CM2UQ==} + '@tiptap/extension-text-align@3.23.1': + resolution: {integrity: sha512-ap4ZN31v57mVX2P+0OoW5iO+ehsUNe0C5MgF/Ta2F/HRmTCc1M1mFqYUCk8zJYX1TFRV18vqK2j6STRBk0R8ng==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-text-style@3.22.5': - resolution: {integrity: sha512-jt63jy8YbhZJUGMxTUzeivLhowGtFp6YbCFrrmZJ7G6IHu8X8LJzO81ksz5nT5l8DKpldGwnINUfA6iE91JIAg==} + '@tiptap/extension-text-style@3.23.1': + resolution: {integrity: sha512-q3GQQo+lBhrtNkqdbhYWnv/byG/RYAxVnNhYPQMubRzavGdXBU8NhpJ/47YYjPimG1sahzcs2aqy7amVd8ri/A==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-text@3.22.5': - resolution: {integrity: sha512-bzpDOdAEo1JeoVZDIyV0oY0jGXkEG+AzF70SzHoRSjOvFDtKWunyXf9eO1OnOr2/fmMcckT2qwUBNBMQplWBzw==} + '@tiptap/extension-text@3.23.1': + resolution: {integrity: sha512-k1Ki9bBV6mLz1mFP+Laqh1YHJ2MY0P8XzaMqpkgMndEBIJQ3XcpWQc5bfAlRnYcOI9ZXDbAgQ8CwgArxHmQWCQ==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extension-underline@3.22.5': - resolution: {integrity: sha512-9ut09rJD0iEbS6sk7yd2j6IwuFDLTNmDEGTDLodvqAfi+bq7ddsTDv0YviXoZaA9sdHAdTEVr2ITy2m6WK5jpA==} + '@tiptap/extension-underline@3.23.1': + resolution: {integrity: sha512-+PvHyVozHyxJ9oWCIQx5JHBZ7LAa/sFJUOFaKyfmel4gL9AbP52MmvrciXARlZHd1WCULJtdbLan0+x5/D/9hQ==} peerDependencies: - '@tiptap/core': 3.22.5 + '@tiptap/core': 3.23.1 - '@tiptap/extensions@3.22.5': - resolution: {integrity: sha512-Ifg4MzKCj3uRqe3ieTwYnomu2y4p7EXr2avVSKZYfh12i2dyWe2Gkn1KuZDREANVE+gHqFlQjJRYzhJFwzSCrg==} + '@tiptap/extensions@3.23.1': + resolution: {integrity: sha512-7UIn+idaVTVhdlP0KmgzBh8Csmwck357Dq4te5DuAxhSkN1gsXHlq39mpx907UYKJdSOgd+GMFeyOziPwSmbOQ==} peerDependencies: - '@tiptap/core': 3.22.5 - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1 + '@tiptap/pm': 3.23.1 - '@tiptap/pm@3.22.5': - resolution: {integrity: sha512-Cr9Mv4igxvI2tKMiahw48sZxva3PfDzypErH8IB82N+9qa9n9ygVMt0BOaDg53hLKxEEVeYr2S/wCcJIVFgBTw==} + '@tiptap/pm@3.23.1': + resolution: {integrity: sha512-8G+TkNsUHHAAJYREpA6fw+Dw/m2Y3Go4/QMQM8RYepid+wTeE1wSv7sBA/CBrphhYmJSWeTyCPtgQIxnTJXMCA==} - '@tiptap/starter-kit@3.22.5': - resolution: {integrity: sha512-LZ/LYbwH6rnDi5DnRyagkuNsYAVyhM+yJvvz+ZuYA0JkPiTXJV86J5PWSKew8M0gVfMHcNVtKjfQCvViFCeIgw==} + '@tiptap/starter-kit@3.23.1': + resolution: {integrity: sha512-CURePHQagBaZIDJrHH3of4Nmi0VYGpZ6yBlkdFxFHBxY9aeG2/h5kn+oHo8GbzkSFsRV+9olzRgDTOULVgs8pQ==} '@tokenizer/inflate@0.4.1': resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} @@ -2634,8 +2429,8 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -2670,8 +2465,8 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node@24.12.2': - resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + '@types/node@24.12.3': + resolution: {integrity: sha512-8oljBDGun9cIsZRJR6fkihn0TSXJI0UDOOhncYaERq6M0JMDoPLxyscwruJcb4GKS6dvK/d8xebYBg27h/duaQ==} '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} @@ -2682,8 +2477,8 @@ packages: '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - '@types/sizzle@2.3.10': - resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==} + '@types/sizzle@2.3.9': + resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==} '@types/tmp@0.2.6': resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} @@ -2758,6 +2553,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@vitest/browser-playwright@4.1.5': resolution: {integrity: sha512-CWy0lBQJq97nionyJJdnaU4961IXTl43a7UCu5nHy51IoKxAt6PVIJLo+76rVl7KOOgcWHNkG4kbJu/pW7knvA==} @@ -2857,8 +2653,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -2873,8 +2669,8 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -2891,6 +2687,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} @@ -2903,6 +2703,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -3009,6 +2813,9 @@ packages: resolution: {integrity: sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==} engines: {node: '>=4'} + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axios@1.16.0: resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} @@ -3061,11 +2868,11 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} buffer-crc32@0.2.13: @@ -3094,8 +2901,8 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.9: - resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -3128,8 +2935,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} character-entities-html4@2.1.0: @@ -3253,8 +3060,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@1.2.3: - resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} @@ -3281,8 +3088,8 @@ packages: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.2.2: @@ -3325,8 +3132,8 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - dayjs@1.11.20: - resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -3345,8 +3152,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} @@ -3390,8 +3197,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - defu@6.1.7: - resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -3416,14 +3223,20 @@ packages: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} + devalue@5.6.2: + resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} + devalue@5.8.0: resolution: {integrity: sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@8.0.4: - resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + dexie@4.4.2: + resolution: {integrity: sha512-zMtV8q79EFE5U8FKZvt0Y/77PCU/Hr/RDxv1EDeo228L+m/HTbeN2AjoQm674rhQCX8n3ljK87lajt7UQuZfvw==} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} dlv@1.1.3: @@ -3476,8 +3289,8 @@ packages: emmet@2.4.11: resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3486,21 +3299,17 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} engines: {node: '>=10.13.0'} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -3508,8 +3317,8 @@ packages: error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - es-abstract@1.24.2: - resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -3545,8 +3354,8 @@ packages: es-toolkit@1.46.1: resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -3560,11 +3369,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3580,8 +3384,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-import-resolver-node@0.3.10: - resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} eslint-module-utils@2.12.1: resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} @@ -3682,8 +3486,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrap@1.2.2: @@ -3692,8 +3496,8 @@ packages: esrap@1.4.9: resolution: {integrity: sha512-3OMlcd0a03UGuZpPeUC1HxR3nA23l+HEyCiZw3b3FumJIN9KphoGzDJKMXI1S72jVS1dsenDyQC0kJlO1U9E1g==} - esrap@2.2.6: - resolution: {integrity: sha512-WN0clHt0a4mzC780UBVVBpsj4vSSjOFNRd2WjYtduB9HeKxm1sjHMNUwLEHVjI3FdCQD/Hurgz9ftbKEzP79Ow==} + esrap@2.2.7: + resolution: {integrity: sha512-Dl7o7btn2YXca1VXx+PVl+lKuZdHBm8oCFuckUxqchMvNMdHMJ/qF31wtPaVyWvFYLQePkbXJrirWzbAP6Yamw==} peerDependencies: '@typescript-eslint/types': ^8.2.0 peerDependenciesMeta: @@ -3731,8 +3535,8 @@ packages: eventemitter2@6.4.7: resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} execa@4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} @@ -3771,8 +3575,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-xml-builder@1.2.0: resolution: {integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==} @@ -3812,8 +3616,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} @@ -3842,6 +3646,15 @@ packages: flowbite@3.1.2: resolution: {integrity: sha512-MkwSgbbybCYgMC+go6Da5idEKUFfMqc/AmSjm/2ZbdmvoKf5frLPq/eIhXc9P+rC8t9boZtUXzHDgt5whZ6A/Q==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -3854,8 +3667,8 @@ packages: fontace@0.4.1: resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} - fontkitten@1.0.3: - resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + fontkitten@1.0.2: + resolution: {integrity: sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==} engines: {node: '>=20'} for-each@0.3.5: @@ -3904,16 +3717,16 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -3976,8 +3789,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - h3@1.15.11: - resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@1.15.5: + resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} @@ -4011,8 +3824,8 @@ packages: resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} engines: {node: '>=8'} - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} hast-util-from-html@2.0.3: @@ -4033,8 +3846,8 @@ packages: hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-parse5@8.0.1: - resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} @@ -4109,8 +3922,8 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} - inline-style-parser@0.2.7: - resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} @@ -4172,8 +3985,8 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -4262,8 +4075,8 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} isarray@2.0.5: @@ -4294,6 +4107,10 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + joi@18.0.2: + resolution: {integrity: sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==} + engines: {node: '>= 20'} + joi@18.2.1: resolution: {integrity: sha512-2/OKlogiESf2Nh3TFCrRjrr9z1DRHeW0I+KReF67+4J0Ns+8hBtHRmoWAZ2OFU6I5+TWLEe6sVlSdXPjHm5UbQ==} engines: {node: '>= 20'} @@ -4339,8 +4156,8 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} jsprim@2.0.2: resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} @@ -4403,28 +4220,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -4466,6 +4279,9 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -4483,8 +4299,8 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@11.3.6: - resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} lz-string@1.5.0: @@ -4525,8 +4341,8 @@ packages: mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - mdast-util-from-markdown@2.0.3: - resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} @@ -4549,8 +4365,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -4561,8 +4377,8 @@ packages: mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} media-icons@1.1.5: resolution: {integrity: sha512-zu3CjKRs63ybLLWPomRRgTDyYiSrk2bRRgw97ZmN3FGXuo9qUUhBSfYwnjmvSdLG2JOJfAwzDz99bPATSY81DQ==} @@ -4692,8 +4508,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - miniflare@4.20260430.0: - resolution: {integrity: sha512-MWvMm3Siho9Yj7lbJZidLs8hbrRvIcOrif2mnsHQZdvoKfedpea+GaN8XJxbpRcq0B2WzNI1BB1ihdnqes3/ZA==} + miniflare@4.20260507.1: + resolution: {integrity: sha512-PSXBiLExTdZ4UGO/raKCHQauUpYL7F880ZRB7j0+78Rv8h7TsdN2E/iEDK9sK2Y+SPQ5wJSeAa+rDeVKoZZoEw==} engines: {node: '>=22.0.0'} hasBin: true @@ -4701,6 +4517,9 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -4724,8 +4543,8 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -4740,8 +4559,8 @@ packages: murmurhash-js@1.0.0: resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -4758,10 +4577,6 @@ packages: nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} - engines: {node: '>= 0.4'} - node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -4796,10 +4611,6 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - object.fromentries@2.0.8: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} @@ -4839,11 +4650,11 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - oniguruma-parser@0.12.2: - resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - oniguruma-to-es@4.3.6: - resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} @@ -4867,8 +4678,8 @@ packages: resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-resolver@11.19.1: - resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} + oxc-resolver@11.20.0: + resolution: {integrity: sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -4900,8 +4711,8 @@ packages: parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -4952,10 +4763,14 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -5013,8 +4828,8 @@ packages: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} - postcss@8.5.14: - resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -5117,11 +4932,14 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - prosemirror-changeset@2.4.1: - resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} prosemirror-commands@1.7.1: resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} @@ -5129,11 +4947,11 @@ packages: prosemirror-dropcursor@1.8.2: resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} - prosemirror-gapcursor@1.4.1: - resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} + prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + prosemirror-history@1.4.1: + resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} @@ -5147,18 +4965,21 @@ packages: prosemirror-state@1.4.4: resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} - prosemirror-tables@1.8.5: - resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} + prosemirror-tables@1.8.1: + resolution: {integrity: sha512-DAgDoUYHCcc6tOGpLVPSU1k84kCUWTWnfWX3UDy2Delv4ryH0KqTD6RBI6k4yi9j9I8gl3j8MkPpRD/vWPZbug==} - prosemirror-transform@1.12.0: - resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} + prosemirror-transform@1.10.4: + resolution: {integrity: sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==} - prosemirror-view@1.41.8: - resolution: {integrity: sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==} + prosemirror-view@1.41.3: + resolution: {integrity: sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==} proxy-from-env@1.0.0: resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} @@ -5168,8 +4989,8 @@ packages: engines: {node: '>= 0.10'} hasBin: true - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -5193,16 +5014,16 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} peerDependencies: - react: ^19.2.5 + react: ^19.2.6 react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react@19.2.5: - resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} engines: {node: '>=0.10.0'} readdirp@4.1.2: @@ -5231,8 +5052,8 @@ packages: regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@6.1.0: - resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} @@ -5287,13 +5108,8 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} - engines: {node: '>= 0.4'} - hasBin: true - - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true @@ -5319,8 +5135,8 @@ packages: rndm@1.2.0: resolution: {integrity: sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==} - rollup@4.60.3: - resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} + rollup@4.52.2: + resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5346,8 +5162,8 @@ packages: s.color@0.0.15: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} - safe-array-concat@1.1.4: - resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.2.1: @@ -5367,8 +5183,8 @@ packages: sass-formatter@0.7.9: resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} engines: {node: '>=11.0.0'} scheduler@0.27.0: @@ -5420,11 +5236,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.23.0: - resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -5464,8 +5280,8 @@ packages: resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} engines: {node: '>=20'} - smol-toml@1.6.1: - resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} source-map-js@1.2.1: @@ -5555,6 +5371,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} @@ -5582,8 +5402,8 @@ packages: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} engines: {node: '>=18'} - style-to-object@1.0.14: - resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} @@ -5630,35 +5450,35 @@ packages: peerDependencies: svelte: ^5.30.2 - svelte2tsx@0.7.55: - resolution: {integrity: sha512-JWzgeM3lqySRNfqcsesvVEh8LhTWBxQJ9RMjzJ+VepdmXtVnNd0SbtGctG6+/fbHq0N6mhwSd823gszw9JHeGQ==} + svelte2tsx@0.7.48: + resolution: {integrity: sha512-B15C8dtOY6C9MbnQJDCkzbK3yByInzKtXrr23QCoF8APHMh6JaDhjCMcRl6ay4qaeKYqkX4X3tNaJrsZL45Zlg==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 - typescript: ^4.9.4 || ^5.0.0 || ^6.0.0 + typescript: ^4.9.4 || ^5.0.0 svelte@5.55.5: resolution: {integrity: sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw==} engines: {node: '>=18'} - svgo@4.0.1: - resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + svgo@4.0.0: + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} engines: {node: '>=16'} hasBin: true - systeminformation@5.31.5: - resolution: {integrity: sha512-5SyLdip4/3alxD4Kh+63bUQTJmu7YMfYQTC+koZy7X73HgNqZSD2P4wOZQWtUncvPvcEmnfIjCoygN4MRoEejQ==} + systeminformation@5.31.6: + resolution: {integrity: sha512-Uv2b2uGGM6ns+26czgW2cYRabYdnswM0ddSOOlryHOaelzsmDSet1iM/NT7VOYxW8x/BW+HkY+b1Ve2pLTSGSA==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} tailwind-merge@3.0.2: resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} tailwind-variants@1.0.0: resolution: {integrity: sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA==} @@ -5666,8 +5486,8 @@ packages: peerDependencies: tailwindcss: '*' - tailwindcss@4.2.4: - resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} @@ -5696,10 +5516,14 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.1.2: - resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} @@ -5804,8 +5628,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + type-fest@4.37.0: + resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==} engines: {node: '>=16'} typed-array-buffer@1.0.3: @@ -5842,8 +5666,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.4: - resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} @@ -5894,8 +5718,8 @@ packages: unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-modify-children@4.0.0: resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} @@ -5915,8 +5739,8 @@ packages: unist-util-visit-parents@6.0.2: resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -5926,8 +5750,8 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - unstorage@1.17.5: - resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + unstorage@1.17.4: + resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -6015,14 +5839,14 @@ packages: vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@6.4.2: - resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -6061,10 +5885,10 @@ packages: yaml: optional: true - vitefu@1.1.3: - resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 peerDependenciesMeta: vite: optional: true @@ -6169,8 +5993,8 @@ packages: '@volar/language-service': optional: true - vscode-css-languageservice@6.3.10: - resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + vscode-css-languageservice@6.3.8: + resolution: {integrity: sha512-dBk/9ullEjIMbfSYAohGpDOisOVU1x2MQHOeU12ohGJQI7+r0PCimBwaa/pWpxl/vH4f7ibrBfxIZY3anGmHKQ==} vscode-html-languageservice@5.6.2: resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} @@ -6210,8 +6034,8 @@ packages: engines: {node: '>=20.0.0'} hasBin: true - wait-on@9.0.5: - resolution: {integrity: sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA==} + wait-on@9.0.8: + resolution: {integrity: sha512-l2mkC3ivv2Jv6g8lKZxvBmqTL21ZnZ86YJBix1Ps7wkhakKuhN4+RQZ4JYLGhG0J5+SDzA2FHEXpppGwUvuAgw==} engines: {node: '>=20.0.0'} hasBin: true @@ -6237,8 +6061,8 @@ packages: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -6267,8 +6091,8 @@ packages: engines: {node: '>=16'} hasBin: true - workerd@1.20260430.1: - resolution: {integrity: sha512-KEgIWyiw3Jmn+DCd/L3ePo5fmiiYb/UcwKvDWPf/nLLOiwShDFzDSsegU5NY/JcwgvO/QsLHVi2FYrbkcXNY5Q==} + workerd@1.20260507.1: + resolution: {integrity: sha512-z7JhsFSe6+X1b5fUHaVpo15VM1IRMJiLofEkq8iKdCo+Veqc+FUg5lIsuz8NwePxuSKrXtO4ZQpGkQLbPVXFhg==} engines: {node: '>=16'} hasBin: true @@ -6282,12 +6106,12 @@ packages: '@cloudflare/workers-types': optional: true - wrangler@4.87.0: - resolution: {integrity: sha512-lfhfKwLfQlowwgV0xhlYgE9fU3n0I30d4ccGY/rTCEm/n42Mjvlr0Ng3ZPNqlsrsKBcDR531V7dsPkgELvrk/Q==} + wrangler@4.90.0: + resolution: {integrity: sha512-bmNIykl59TfCUn5xQgU7IWylSsPx3LQaPLMSAq2VQHt89CBrcj9qXQ0eYfjBCWA5XTBVgten391evt7xxtXwcA==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260430.1 + '@cloudflare/workers-types': ^4.20260507.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -6296,8 +6120,8 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} wrappy@1.0.2: @@ -6349,8 +6173,8 @@ packages: resolution: {integrity: sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==} hasBin: true - yaml@1.10.3: - resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} yaml@2.7.1: @@ -6358,8 +6182,8 @@ packages: engines: {node: '>= 14'} hasBin: true - yaml@2.8.4: - resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -6378,16 +6202,16 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + yocto-queue@1.2.0: + resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==} engines: {node: '>=12.20'} yocto-spinner@0.2.3: resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} engines: {node: '>=18.19'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} youch-core@0.3.3: @@ -6399,13 +6223,10 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zimmerframe@1.1.4: - resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} - - zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: - zod: ^3.25.28 || ^4 + zod: ^3.25 || ^4 zod-to-ts@1.2.0: resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} @@ -6428,7 +6249,7 @@ snapshots: '@astrojs/check@0.9.9(prettier-plugin-astro@0.14.1)(prettier@3.5.3)(typescript@5.9.3)': dependencies: - '@astrojs/language-server': 2.16.7(prettier-plugin-astro@0.14.1)(prettier@3.5.3)(typescript@5.9.3) + '@astrojs/language-server': 2.16.8(prettier-plugin-astro@0.14.1)(prettier@3.5.3)(typescript@5.9.3) chokidar: 4.0.3 kleur: 4.1.5 typescript: 5.9.3 @@ -6437,15 +6258,15 @@ snapshots: - prettier - prettier-plugin-astro - '@astrojs/cloudflare@12.6.13(@types/node@24.12.2)(astro@5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4))(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)': + '@astrojs/cloudflare@12.6.13(@types/node@24.12.3)(astro@5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)': dependencies: '@astrojs/internal-helpers': 0.7.6 '@astrojs/underscore-redirects': 1.0.0 - '@cloudflare/workers-types': 4.20260505.1 - astro: 5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4) - tinyglobby: 0.2.16 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) - wrangler: 4.59.2(@cloudflare/workers-types@4.20260505.1) + '@cloudflare/workers-types': 4.20260214.0 + astro: 5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0) + tinyglobby: 0.2.15 + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) + wrangler: 4.59.2(@cloudflare/workers-types@4.20260214.0) transitivePeerDependencies: - '@types/node' - bufferutil @@ -6465,7 +6286,7 @@ snapshots: '@astrojs/internal-helpers@0.7.6': {} - '@astrojs/language-server@2.16.7(prettier-plugin-astro@0.14.1)(prettier@3.5.3)(typescript@5.9.3)': + '@astrojs/language-server@2.16.8(prettier-plugin-astro@0.14.1)(prettier@3.5.3)(typescript@5.9.3)': dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/yaml2ts': 0.2.3 @@ -6507,20 +6328,20 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 remark-smartypants: 3.0.2 - shiki: 3.23.0 - smol-toml: 1.6.1 + shiki: 3.22.0 + smol-toml: 1.6.0 unified: 11.0.5 unist-util-remove-position: 5.0.0 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 unist-util-visit-parents: 6.0.2 vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/node@9.5.5(astro@5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4))': + '@astrojs/node@9.5.5(astro@5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0))': dependencies: '@astrojs/internal-helpers': 0.7.6 - astro: 5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4) + astro: 5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0) send: 1.2.1 server-destroy: 1.0.1 transitivePeerDependencies: @@ -6530,14 +6351,14 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/svelte@7.2.5(@types/node@24.12.2)(astro@5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4))(jiti@2.6.1)(lightningcss@1.32.0)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3)(yaml@2.8.4)': + '@astrojs/svelte@7.2.5(@types/node@24.12.3)(astro@5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0))(jiti@2.6.1)(lightningcss@1.32.0)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3)(yaml@2.9.0)': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) - astro: 5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) + astro: 5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0) svelte: 5.55.5(@typescript-eslint/types@8.59.2) - svelte2tsx: 0.7.55(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3) + svelte2tsx: 0.7.48(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3) typescript: 5.9.3 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -6559,7 +6380,7 @@ snapshots: dlv: 1.1.3 dset: 3.1.4 is-docker: 3.0.0 - is-wsl: 3.1.1 + is-wsl: 3.1.0 which-pm-runs: 1.1.0 transitivePeerDependencies: - supports-color @@ -6568,7 +6389,7 @@ snapshots: '@astrojs/yaml2ts@0.2.3': dependencies: - yaml: 2.8.4 + yaml: 2.9.0 '@aws-crypto/crc32@5.2.0': dependencies: @@ -7045,7 +6866,7 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.29.3': + '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 @@ -7064,7 +6885,7 @@ snapshots: '@capsizecss/unpack@4.0.0': dependencies: - fontkitten: 1.0.3 + fontkitten: 1.0.2 '@cloudflare/kv-asset-handler@0.4.2': {} @@ -7076,43 +6897,43 @@ snapshots: optionalDependencies: workerd: 1.20260114.0 - '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260430.1)': + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260507.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260430.1 + workerd: 1.20260507.1 '@cloudflare/workerd-darwin-64@1.20260114.0': optional: true - '@cloudflare/workerd-darwin-64@1.20260430.1': + '@cloudflare/workerd-darwin-64@1.20260507.1': optional: true '@cloudflare/workerd-darwin-arm64@1.20260114.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260430.1': + '@cloudflare/workerd-darwin-arm64@1.20260507.1': optional: true '@cloudflare/workerd-linux-64@1.20260114.0': optional: true - '@cloudflare/workerd-linux-64@1.20260430.1': + '@cloudflare/workerd-linux-64@1.20260507.1': optional: true '@cloudflare/workerd-linux-arm64@1.20260114.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20260430.1': + '@cloudflare/workerd-linux-arm64@1.20260507.1': optional: true '@cloudflare/workerd-windows-64@1.20260114.0': optional: true - '@cloudflare/workerd-windows-64@1.20260430.1': + '@cloudflare/workerd-windows-64@1.20260507.1': optional: true - '@cloudflare/workers-types@4.20260505.1': {} + '@cloudflare/workers-types@4.20260214.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -7169,6 +6990,12 @@ snapshots: '@emmetio/stream-reader@2.2.0': {} + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -7180,6 +7007,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 @@ -7190,7 +7022,7 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.25.10': optional: true '@esbuild/aix-ppc64@0.27.0': @@ -7199,10 +7031,7 @@ snapshots: '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/aix-ppc64@0.27.7': - optional: true - - '@esbuild/android-arm64@0.25.12': + '@esbuild/android-arm64@0.25.10': optional: true '@esbuild/android-arm64@0.27.0': @@ -7211,10 +7040,7 @@ snapshots: '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm64@0.27.7': - optional: true - - '@esbuild/android-arm@0.25.12': + '@esbuild/android-arm@0.25.10': optional: true '@esbuild/android-arm@0.27.0': @@ -7223,10 +7049,7 @@ snapshots: '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-arm@0.27.7': - optional: true - - '@esbuild/android-x64@0.25.12': + '@esbuild/android-x64@0.25.10': optional: true '@esbuild/android-x64@0.27.0': @@ -7235,10 +7058,7 @@ snapshots: '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/android-x64@0.27.7': - optional: true - - '@esbuild/darwin-arm64@0.25.12': + '@esbuild/darwin-arm64@0.25.10': optional: true '@esbuild/darwin-arm64@0.27.0': @@ -7247,10 +7067,7 @@ snapshots: '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.27.7': - optional: true - - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-x64@0.25.10': optional: true '@esbuild/darwin-x64@0.27.0': @@ -7259,10 +7076,7 @@ snapshots: '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.7': - optional: true - - '@esbuild/freebsd-arm64@0.25.12': + '@esbuild/freebsd-arm64@0.25.10': optional: true '@esbuild/freebsd-arm64@0.27.0': @@ -7271,10 +7085,7 @@ snapshots: '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.27.7': - optional: true - - '@esbuild/freebsd-x64@0.25.12': + '@esbuild/freebsd-x64@0.25.10': optional: true '@esbuild/freebsd-x64@0.27.0': @@ -7283,10 +7094,7 @@ snapshots: '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.27.7': - optional: true - - '@esbuild/linux-arm64@0.25.12': + '@esbuild/linux-arm64@0.25.10': optional: true '@esbuild/linux-arm64@0.27.0': @@ -7295,10 +7103,7 @@ snapshots: '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm64@0.27.7': - optional: true - - '@esbuild/linux-arm@0.25.12': + '@esbuild/linux-arm@0.25.10': optional: true '@esbuild/linux-arm@0.27.0': @@ -7307,10 +7112,7 @@ snapshots: '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-arm@0.27.7': - optional: true - - '@esbuild/linux-ia32@0.25.12': + '@esbuild/linux-ia32@0.25.10': optional: true '@esbuild/linux-ia32@0.27.0': @@ -7319,10 +7121,7 @@ snapshots: '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-ia32@0.27.7': - optional: true - - '@esbuild/linux-loong64@0.25.12': + '@esbuild/linux-loong64@0.25.10': optional: true '@esbuild/linux-loong64@0.27.0': @@ -7331,10 +7130,7 @@ snapshots: '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-loong64@0.27.7': - optional: true - - '@esbuild/linux-mips64el@0.25.12': + '@esbuild/linux-mips64el@0.25.10': optional: true '@esbuild/linux-mips64el@0.27.0': @@ -7343,10 +7139,7 @@ snapshots: '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-mips64el@0.27.7': - optional: true - - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/linux-ppc64@0.25.10': optional: true '@esbuild/linux-ppc64@0.27.0': @@ -7355,10 +7148,7 @@ snapshots: '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-ppc64@0.27.7': - optional: true - - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/linux-riscv64@0.25.10': optional: true '@esbuild/linux-riscv64@0.27.0': @@ -7367,10 +7157,7 @@ snapshots: '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.27.7': - optional: true - - '@esbuild/linux-s390x@0.25.12': + '@esbuild/linux-s390x@0.25.10': optional: true '@esbuild/linux-s390x@0.27.0': @@ -7379,10 +7166,7 @@ snapshots: '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-s390x@0.27.7': - optional: true - - '@esbuild/linux-x64@0.25.12': + '@esbuild/linux-x64@0.25.10': optional: true '@esbuild/linux-x64@0.27.0': @@ -7391,10 +7175,7 @@ snapshots: '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/linux-x64@0.27.7': - optional: true - - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/netbsd-arm64@0.25.10': optional: true '@esbuild/netbsd-arm64@0.27.0': @@ -7403,10 +7184,7 @@ snapshots: '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.27.7': - optional: true - - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/netbsd-x64@0.25.10': optional: true '@esbuild/netbsd-x64@0.27.0': @@ -7415,10 +7193,7 @@ snapshots: '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.27.7': - optional: true - - '@esbuild/openbsd-arm64@0.25.12': + '@esbuild/openbsd-arm64@0.25.10': optional: true '@esbuild/openbsd-arm64@0.27.0': @@ -7427,10 +7202,7 @@ snapshots: '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.27.7': - optional: true - - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/openbsd-x64@0.25.10': optional: true '@esbuild/openbsd-x64@0.27.0': @@ -7439,10 +7211,7 @@ snapshots: '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.27.7': - optional: true - - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/openharmony-arm64@0.25.10': optional: true '@esbuild/openharmony-arm64@0.27.0': @@ -7451,10 +7220,7 @@ snapshots: '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.27.7': - optional: true - - '@esbuild/sunos-x64@0.25.12': + '@esbuild/sunos-x64@0.25.10': optional: true '@esbuild/sunos-x64@0.27.0': @@ -7463,10 +7229,7 @@ snapshots: '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/sunos-x64@0.27.7': - optional: true - - '@esbuild/win32-arm64@0.25.12': + '@esbuild/win32-arm64@0.25.10': optional: true '@esbuild/win32-arm64@0.27.0': @@ -7475,10 +7238,7 @@ snapshots: '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-arm64@0.27.7': - optional: true - - '@esbuild/win32-ia32@0.25.12': + '@esbuild/win32-ia32@0.25.10': optional: true '@esbuild/win32-ia32@0.27.0': @@ -7487,10 +7247,7 @@ snapshots: '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-ia32@0.27.7': - optional: true - - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-x64@0.25.10': optional: true '@esbuild/win32-x64@0.27.0': @@ -7499,9 +7256,6 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@esbuild/win32-x64@0.27.7': - optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': dependencies: eslint: 9.39.4(jiti@2.6.1) @@ -7548,16 +7302,16 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@floating-ui/core@1.7.5': + '@floating-ui/core@1.7.1': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.7.6': + '@floating-ui/dom@1.7.1': dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 + '@floating-ui/core': 1.7.1 + '@floating-ui/utils': 0.2.9 - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.9': {} '@fontsource/karla@5.2.8': {} @@ -7571,7 +7325,7 @@ snapshots: '@hapi/pinpoint@2.0.1': {} - '@hapi/tlds@1.1.6': {} + '@hapi/tlds@1.1.3': {} '@hapi/topo@6.0.2': dependencies: @@ -7586,7 +7340,7 @@ snapshots: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 js-yaml: 4.1.1 - lodash: 4.18.1 + lodash: 4.17.23 '@hey-api/openapi-ts@0.69.2(magicast@0.3.5)(typescript@5.9.3)': dependencies: @@ -7600,23 +7354,20 @@ snapshots: transitivePeerDependencies: - magicast - '@humanfs/core@0.19.2': - dependencies: - '@humanfs/types': 0.15.0 + '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.8': + '@humanfs/node@0.16.6': dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 - - '@humanfs/types@0.15.0': {} + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.4.3': {} + '@humanwhocodes/retry@0.3.1': {} - '@img/colour@1.1.0': {} + '@humanwhocodes/retry@0.4.2': {} + + '@img/colour@1.0.0': {} '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: @@ -7700,7 +7451,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.8.1 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -7714,22 +7465,30 @@ snapshots: '@internationalized/date@3.7.0': dependencies: - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.17 - '@jridgewell/gen-mapping@0.3.13': + '@jridgewell/gen-mapping@0.3.8': dependencies: + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -7744,15 +7503,15 @@ snapshots: '@kurkle/color@0.3.4': {} - '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5)': + '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.6)': dependencies: '@types/mdx': 2.0.13 '@types/react': 19.2.14 - react: 19.2.5 + react: 19.2.6 - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 + '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.2 optional: true @@ -7834,216 +7593,203 @@ snapshots: '@oxc-project/types@0.127.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.19.1': + '@oxc-resolver/binding-android-arm-eabi@11.20.0': optional: true - '@oxc-resolver/binding-android-arm64@11.19.1': + '@oxc-resolver/binding-android-arm64@11.20.0': optional: true - '@oxc-resolver/binding-darwin-arm64@11.19.1': + '@oxc-resolver/binding-darwin-arm64@11.20.0': optional: true - '@oxc-resolver/binding-darwin-x64@11.19.1': + '@oxc-resolver/binding-darwin-x64@11.20.0': optional: true - '@oxc-resolver/binding-freebsd-x64@11.19.1': + '@oxc-resolver/binding-freebsd-x64@11.20.0': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': + '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': + '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.19.1': + '@oxc-resolver/binding-linux-arm64-musl@11.20.0': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': + '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': + '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': + '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': + '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.19.1': + '@oxc-resolver/binding-linux-x64-gnu@11.20.0': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.19.1': + '@oxc-resolver/binding-linux-x64-musl@11.20.0': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.19.1': + '@oxc-resolver/binding-openharmony-arm64@11.20.0': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)': + '@oxc-resolver/binding-wasm32-wasi@11.20.0': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': + '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': - optional: true - - '@oxc-resolver/binding-win32-x64-msvc@11.19.1': + '@oxc-resolver/binding-win32-x64-msvc@11.20.0': optional: true '@polka/url@1.0.0-next.29': {} '@popperjs/core@2.11.8': {} - '@poppinss/colors@4.1.6': + '@poppinss/colors@4.1.5': dependencies: kleur: 4.1.5 - '@poppinss/dumper@0.6.5': + '@poppinss/dumper@0.6.4': dependencies: - '@poppinss/colors': 4.1.6 - '@sindresorhus/is': 7.2.0 + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.1.0 supports-color: 10.2.2 - '@poppinss/exception@1.2.3': {} + '@poppinss/exception@1.2.2': {} - '@rollup/plugin-node-resolve@15.3.1(rollup@4.60.3)': + '@rollup/plugin-node-resolve@15.3.1(rollup@4.52.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.3) + '@rollup/pluginutils': 5.3.0(rollup@4.52.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.12 + resolve: 1.22.10 optionalDependencies: - rollup: 4.60.3 + rollup: 4.52.2 - '@rollup/pluginutils@5.3.0(rollup@4.60.3)': + '@rollup/pluginutils@5.3.0(rollup@4.52.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.60.3 + rollup: 4.52.2 - '@rollup/rollup-android-arm-eabi@4.60.3': + '@rollup/rollup-android-arm-eabi@4.52.2': optional: true - '@rollup/rollup-android-arm64@4.60.3': + '@rollup/rollup-android-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-arm64@4.60.3': + '@rollup/rollup-darwin-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-x64@4.60.3': + '@rollup/rollup-darwin-x64@4.52.2': optional: true - '@rollup/rollup-freebsd-arm64@4.60.3': + '@rollup/rollup-freebsd-arm64@4.52.2': optional: true - '@rollup/rollup-freebsd-x64@4.60.3': + '@rollup/rollup-freebsd-x64@4.52.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.3': + '@rollup/rollup-linux-arm-musleabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.3': + '@rollup/rollup-linux-arm64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.3': + '@rollup/rollup-linux-arm64-musl@4.52.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.3': + '@rollup/rollup-linux-loong64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.3': + '@rollup/rollup-linux-ppc64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.3': + '@rollup/rollup-linux-riscv64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.3': + '@rollup/rollup-linux-riscv64-musl@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.3': + '@rollup/rollup-linux-s390x-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.3': + '@rollup/rollup-linux-x64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.3': + '@rollup/rollup-linux-x64-musl@4.52.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.3': + '@rollup/rollup-openharmony-arm64@4.52.2': optional: true - '@rollup/rollup-linux-x64-musl@4.60.3': + '@rollup/rollup-win32-arm64-msvc@4.52.2': optional: true - '@rollup/rollup-openbsd-x64@4.60.3': + '@rollup/rollup-win32-ia32-msvc@4.52.2': optional: true - '@rollup/rollup-openharmony-arm64@4.60.3': + '@rollup/rollup-win32-x64-gnu@4.52.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.3': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.60.3': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.60.3': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.60.3': + '@rollup/rollup-win32-x64-msvc@4.52.2': optional: true '@rtsao/scc@1.1.0': {} - '@shikijs/core@3.23.0': + '@shikijs/core@3.22.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.23.0': + '@shikijs/engine-javascript@3.22.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.6 + oniguruma-to-es: 4.3.4 - '@shikijs/engine-oniguruma@3.23.0': + '@shikijs/engine-oniguruma@3.22.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.23.0': + '@shikijs/langs@3.22.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 3.22.0 - '@shikijs/themes@3.23.0': + '@shikijs/themes@3.22.0': dependencies: - '@shikijs/types': 3.23.0 + '@shikijs/types': 3.22.0 - '@shikijs/types@3.23.0': + '@shikijs/types@3.22.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@sindresorhus/is@7.2.0': {} + '@sindresorhus/is@7.1.0': {} '@smithy/chunked-blob-reader-native@4.2.3': dependencies: @@ -8378,25 +8124,27 @@ snapshots: dependencies: tslib: 2.8.1 - '@speed-highlight/core@1.2.15': {} + '@speed-highlight/core@1.2.7': {} + + '@standard-schema/spec@1.0.0': {} '@standard-schema/spec@1.1.0': {} - '@storybook/addon-a11y@10.4.1(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))': + '@storybook/addon-a11y@10.4.1(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.11.4 - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@storybook/addon-docs@10.4.1(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@storybook/addon-docs@10.4.1(@types/react@19.2.14)(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.5) - '@storybook/csf-plugin': 10.4.1(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) - '@storybook/icons': 2.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@storybook/react-dom-shim': 10.4.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.6) + '@storybook/csf-plugin': 10.4.1(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) + '@storybook/icons': 2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@storybook/react-dom-shim': 10.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) ts-dedent: 2.2.0 optionalDependencies: '@types/react': 19.2.14 @@ -8407,56 +8155,56 @@ snapshots: - vite - webpack - '@storybook/addon-svelte-csf@5.1.2(@storybook/svelte@10.4.1(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2)))(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)))(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@storybook/addon-svelte-csf@5.1.2(@storybook/svelte@10.4.1(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2)))(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)))(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@storybook/csf': 0.1.13 - '@storybook/svelte': 10.4.1(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + '@storybook/svelte': 10.4.1(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) dedent: 1.7.2 es-toolkit: 1.46.1 esrap: 1.4.9 magic-string: 0.30.21 - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) svelte: 5.55.5(@typescript-eslint/types@8.59.2) svelte-ast-print: 0.4.2(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) - zimmerframe: 1.1.4 + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) + zimmerframe: 1.1.2 transitivePeerDependencies: - babel-plugin-macros - '@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.5)(@vitest/browser@4.1.5)(@vitest/runner@4.1.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.5)': + '@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.5)(@vitest/browser@4.1.5)(@vitest/runner@4.1.5)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vitest@4.1.5)': dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@storybook/icons': 2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) optionalDependencies: - '@vitest/browser': 4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5) - '@vitest/browser-playwright': 4.1.5(playwright@1.59.1)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5) + '@vitest/browser': 4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5) + '@vitest/browser-playwright': 4.1.5(playwright@1.59.1)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5) '@vitest/runner': 4.1.5 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + vitest: 4.1.5(@types/node@24.12.3)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@10.4.1(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@storybook/builder-vite@10.4.1(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@storybook/csf-plugin': 10.4.1(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@storybook/csf-plugin': 10.4.1(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) ts-dedent: 2.2.0 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.4.1(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@storybook/csf-plugin@10.4.1(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) unplugin: 2.3.11 optionalDependencies: - esbuild: 0.27.7 - rollup: 4.60.3 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + esbuild: 0.27.3 + rollup: 4.52.2 + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) '@storybook/csf@0.1.13': dependencies: @@ -8464,158 +8212,158 @@ snapshots: '@storybook/global@5.0.0': {} - '@storybook/icons@2.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@storybook/icons@2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) - '@storybook/react-dom-shim@10.4.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))': + '@storybook/react-dom-shim@10.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))': dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) optionalDependencies: '@types/react': 19.2.14 - '@storybook/svelte-vite@10.4.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)))(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@storybook/svelte-vite@10.4.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)))(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@storybook/builder-vite': 10.4.1(esbuild@0.27.7)(rollup@4.60.3)(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) - '@storybook/svelte': 10.4.1(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + '@storybook/builder-vite': 10.4.1(esbuild@0.27.3)(rollup@4.52.2)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) + '@storybook/svelte': 10.4.1(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) magic-string: 0.30.21 - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) svelte: 5.55.5(@typescript-eslint/types@8.59.2) - svelte2tsx: 0.7.55(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3) + svelte2tsx: 0.7.48(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3) typescript: 5.9.3 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/svelte@10.4.1(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(svelte@5.55.5(@typescript-eslint/types@8.59.2))': + '@storybook/svelte@10.4.1(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(svelte@5.55.5(@typescript-eslint/types@8.59.2))': dependencies: - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) svelte: 5.55.5(@typescript-eslint/types@8.59.2) ts-dedent: 2.2.0 type-fest: 2.19.0 - '@sveltejs/acorn-typescript@1.0.9(acorn@8.16.0)': + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: - acorn: 8.16.0 + acorn: 8.15.0 - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) debug: 4.4.3(supports-color@8.1.1) svelte: 5.55.5(@typescript-eslint/types@8.59.2) - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.2))(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) debug: 4.4.3(supports-color@8.1.1) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.21 svelte: 5.55.5(@typescript-eslint/types@8.59.2) - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) - vitefu: 1.1.3(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.5)': + '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.4)': dependencies: - '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.js': 3.2.4 '@svgdotjs/svg.filter.js@3.0.9': dependencies: - '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.js': 3.2.4 - '@svgdotjs/svg.js@3.2.5': {} + '@svgdotjs/svg.js@3.2.4': {} - '@svgdotjs/svg.resize.js@2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5))': + '@svgdotjs/svg.resize.js@2.0.5(@svgdotjs/svg.js@3.2.4)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.4))': dependencies: - '@svgdotjs/svg.js': 3.2.5 - '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) + '@svgdotjs/svg.js': 3.2.4 + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.4) - '@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)': + '@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.4)': dependencies: - '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.js': 3.2.4 - '@swc/helpers@0.5.21': + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.2.4': + '@tailwindcss/node@4.3.0': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.21.0 + enhanced-resolve: 5.21.2 jiti: 2.6.1 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.4 + tailwindcss: 4.3.0 - '@tailwindcss/oxide-android-arm64@4.2.4': + '@tailwindcss/oxide-android-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.4': + '@tailwindcss/oxide-darwin-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.4': + '@tailwindcss/oxide-darwin-x64@4.3.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.4': + '@tailwindcss/oxide-freebsd-x64@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.4': + '@tailwindcss/oxide-linux-x64-musl@4.3.0': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.4': + '@tailwindcss/oxide-wasm32-wasi@4.3.0': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': optional: true - '@tailwindcss/oxide@4.2.4': + '@tailwindcss/oxide@4.3.0': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-x64': 4.2.4 - '@tailwindcss/oxide-freebsd-x64': 4.2.4 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-x64-musl': 4.2.4 - '@tailwindcss/oxide-wasm32-wasi': 4.2.4 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - '@tailwindcss/vite@4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@tailwindcss/vite@4.3.0(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@tailwindcss/node': 4.2.4 - '@tailwindcss/oxide': 4.2.4 - tailwindcss: 4.2.4 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) '@testing-library/dom@10.4.1': dependencies: @@ -8641,161 +8389,161 @@ snapshots: dependencies: '@testing-library/dom': 10.4.1 - '@tiptap/core@3.22.5(@tiptap/pm@3.22.5)': + '@tiptap/core@3.23.1(@tiptap/pm@3.23.1)': dependencies: - '@tiptap/pm': 3.22.5 + '@tiptap/pm': 3.23.1 - '@tiptap/extension-blockquote@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-blockquote@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-bold@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-bold@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-bullet-list@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': + '@tiptap/extension-bullet-list@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-code-block@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': + '@tiptap/extension-code-block@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) + '@tiptap/pm': 3.23.1 - '@tiptap/extension-code@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-code@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-document@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-document@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-dropcursor@3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': + '@tiptap/extension-dropcursor@3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extensions': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-font-family@3.22.5(@tiptap/extension-text-style@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)))': + '@tiptap/extension-font-family@3.23.1(@tiptap/extension-text-style@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)))': dependencies: - '@tiptap/extension-text-style': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) + '@tiptap/extension-text-style': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) - '@tiptap/extension-gapcursor@3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': + '@tiptap/extension-gapcursor@3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extensions': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-hard-break@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-hard-break@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-heading@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-heading@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-horizontal-rule@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': + '@tiptap/extension-horizontal-rule@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) + '@tiptap/pm': 3.23.1 - '@tiptap/extension-italic@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-italic@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-link@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': + '@tiptap/extension-link@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) + '@tiptap/pm': 3.23.1 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': + '@tiptap/extension-list-item@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-list-keymap@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': + '@tiptap/extension-list-keymap@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': + '@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) + '@tiptap/pm': 3.23.1 - '@tiptap/extension-ordered-list@3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': + '@tiptap/extension-ordered-list@3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-paragraph@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-paragraph@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-placeholder@3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5))': + '@tiptap/extension-placeholder@3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) + '@tiptap/extensions': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) - '@tiptap/extension-strike@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-strike@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-text-align@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-text-align@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-text-style@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-text-style@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-text@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-text@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extension-underline@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))': + '@tiptap/extension-underline@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) - '@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)': + '@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) + '@tiptap/pm': 3.23.1 - '@tiptap/pm@3.22.5': + '@tiptap/pm@3.23.1': dependencies: - prosemirror-changeset: 2.4.1 + prosemirror-changeset: 2.3.1 prosemirror-commands: 1.7.1 prosemirror-dropcursor: 1.8.2 - prosemirror-gapcursor: 1.4.1 - prosemirror-history: 1.5.0 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.4.1 prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 - prosemirror-tables: 1.8.5 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-tables: 1.8.1 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 - '@tiptap/starter-kit@3.22.5': + '@tiptap/starter-kit@3.23.1': dependencies: - '@tiptap/core': 3.22.5(@tiptap/pm@3.22.5) - '@tiptap/extension-blockquote': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-bold': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-bullet-list': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) - '@tiptap/extension-code': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-code-block': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-document': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-dropcursor': 3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) - '@tiptap/extension-gapcursor': 3.22.5(@tiptap/extensions@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) - '@tiptap/extension-hard-break': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-heading': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-horizontal-rule': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-italic': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-link': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-list': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/extension-list-item': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) - '@tiptap/extension-list-keymap': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) - '@tiptap/extension-ordered-list': 3.22.5(@tiptap/extension-list@3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)) - '@tiptap/extension-paragraph': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-strike': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-text': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extension-underline': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5)) - '@tiptap/extensions': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) - '@tiptap/pm': 3.22.5 + '@tiptap/core': 3.23.1(@tiptap/pm@3.23.1) + '@tiptap/extension-blockquote': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-bold': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-bullet-list': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) + '@tiptap/extension-code': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-code-block': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) + '@tiptap/extension-document': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-dropcursor': 3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) + '@tiptap/extension-gapcursor': 3.23.1(@tiptap/extensions@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) + '@tiptap/extension-hard-break': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-heading': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-horizontal-rule': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) + '@tiptap/extension-italic': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-link': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) + '@tiptap/extension-list': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) + '@tiptap/extension-list-item': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) + '@tiptap/extension-list-keymap': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) + '@tiptap/extension-ordered-list': 3.23.1(@tiptap/extension-list@3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1)) + '@tiptap/extension-paragraph': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-strike': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-text': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extension-underline': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1)) + '@tiptap/extensions': 3.23.1(@tiptap/core@3.23.1(@tiptap/pm@3.23.1))(@tiptap/pm@3.23.1) + '@tiptap/pm': 3.23.1 '@tokenizer/inflate@0.4.1': dependencies: @@ -8818,7 +8566,7 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/debug@4.1.13': + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -8850,7 +8598,7 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/node@24.12.2': + '@types/node@24.12.3': dependencies: undici-types: 7.16.0 @@ -8862,7 +8610,7 @@ snapshots: '@types/sinonjs__fake-timers@8.1.1': {} - '@types/sizzle@2.3.10': {} + '@types/sizzle@2.3.9': {} '@types/tmp@0.2.6': {} @@ -8872,7 +8620,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.12.2 + '@types/node': 24.12.3 optional: true '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': @@ -8944,7 +8692,7 @@ snapshots: debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.7.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -8968,29 +8716,29 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/browser-playwright@4.1.5(playwright@1.59.1)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5)': + '@vitest/browser-playwright@4.1.5(playwright@1.59.1)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5)': dependencies: - '@vitest/browser': 4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5) - '@vitest/mocker': 4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + '@vitest/browser': 4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5) + '@vitest/mocker': 4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) playwright: 1.59.1 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + vitest: 4.1.5(@types/node@24.12.3)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5)': + '@vitest/browser@4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + '@vitest/mocker': 4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) '@vitest/utils': 4.1.5 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + vitest: 4.1.5(@types/node@24.12.3)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) ws: 8.20.0 transitivePeerDependencies: - bufferutil @@ -9010,9 +8758,9 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@24.12.2)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + vitest: 4.1.5(@types/node@24.12.3)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) optionalDependencies: - '@vitest/browser': 4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5) + '@vitest/browser': 4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5) '@vitest/expect@3.2.4': dependencies: @@ -9031,13 +8779,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))': + '@vitest/mocker@4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -9131,15 +8879,15 @@ snapshots: '@yr/monotone-cubic-spline@1.0.3': {} - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.16.0 + acorn: 8.15.0 - acorn@8.16.0: {} + acorn@8.15.0: {} - ajv-draft-04@1.0.0(ajv@8.20.0): + ajv-draft-04@1.0.0(ajv@8.17.1): optionalDependencies: - ajv: 8.20.0 + ajv: 8.17.1 ajv@6.15.0: dependencies: @@ -9148,10 +8896,10 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.20.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -9167,6 +8915,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@4.3.0: @@ -9175,20 +8925,22 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.2 + picomatch: 2.3.1 apexcharts@4.7.0: dependencies: - '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.5) + '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.4) '@svgdotjs/svg.filter.js': 3.0.9 - '@svgdotjs/svg.js': 3.2.5 - '@svgdotjs/svg.resize.js': 2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)) - '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) + '@svgdotjs/svg.js': 3.2.4 + '@svgdotjs/svg.resize.js': 2.0.5(@svgdotjs/svg.js@3.2.4)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.4)) + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.4) '@yr/monotone-cubic-spline': 1.0.3 arch@2.2.0: {} @@ -9212,10 +8964,10 @@ snapshots: array-includes@3.1.9: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -9225,34 +8977,34 @@ snapshots: array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -9275,7 +9027,7 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 - astro@5.18.1(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4): + astro@5.18.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.52.2)(typescript@5.9.3)(yaml@2.9.0): dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/internal-helpers': 0.7.6 @@ -9283,8 +9035,8 @@ snapshots: '@astrojs/telemetry': 3.3.0 '@capsizecss/unpack': 4.0.0 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.3.0(rollup@4.60.3) - acorn: 8.16.0 + '@rollup/pluginutils': 5.3.0(rollup@4.52.2) + acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 boxen: 8.0.1 @@ -9295,12 +9047,12 @@ snapshots: cssesc: 3.0.0 debug: 4.4.3(supports-color@8.1.1) deterministic-object-hash: 2.0.2 - devalue: 5.8.0 - diff: 8.0.4 + devalue: 5.6.2 + diff: 8.0.3 dlv: 1.1.3 dset: 3.1.4 es-module-lexer: 1.7.0 - esbuild: 0.27.7 + esbuild: 0.27.3 estree-walker: 3.0.3 flattie: 1.1.1 fontace: 0.4.1 @@ -9317,28 +9069,28 @@ snapshots: p-queue: 8.1.1 package-manager-detector: 1.6.0 piccolore: 0.1.3 - picomatch: 4.0.4 + picomatch: 4.0.3 prompts: 2.4.2 rehype: 13.0.2 semver: 7.7.4 - shiki: 3.23.0 - smol-toml: 1.6.1 - svgo: 4.0.1 - tinyexec: 1.1.2 - tinyglobby: 0.2.16 + shiki: 3.22.0 + smol-toml: 1.6.0 + svgo: 4.0.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 tsconfck: 3.1.6(typescript@5.9.3) ultrahtml: 1.6.0 unifont: 0.7.4 - unist-util-visit: 5.1.0 - unstorage: 1.17.5 + unist-util-visit: 5.0.0 + unstorage: 1.17.4 vfile: 6.0.3 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) - vitefu: 1.1.3(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 zod: 3.25.76 - zod-to-json-schema: 3.25.2(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) optionalDependencies: sharp: 0.34.5 @@ -9393,9 +9145,17 @@ snapshots: axe-core@4.11.4: {} - axios@1.16.0(debug@4.4.3): + axios@1.13.5(debug@4.4.3): dependencies: - follow-redirects: 1.16.0(debug@4.4.3) + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axios@1.16.0: + dependencies: + follow-redirects: 1.16.0 form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -9419,14 +9179,14 @@ snapshots: bits-ui@2.18.1(@internationalized/date@3.7.0)(svelte@5.55.5(@typescript-eslint/types@8.59.2)): dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/dom': 1.7.6 + '@floating-ui/core': 1.7.1 + '@floating-ui/dom': 1.7.1 '@internationalized/date': 3.7.0 esm-env: 1.2.2 runed: 0.35.1(svelte@5.55.5(@typescript-eslint/types@8.59.2)) svelte: 5.55.5(@typescript-eslint/types@8.59.2) svelte-toolbelt: 0.10.6(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - tabbable: 6.4.0 + tabbable: 6.2.0 transitivePeerDependencies: - '@sveltejs/kit' @@ -9444,19 +9204,19 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.6.2 + chalk: 5.4.1 cli-boxes: 3.0.0 string-width: 7.2.0 - type-fest: 4.41.0 + type-fest: 4.37.0 widest-line: 5.0.0 - wrap-ansi: 9.0.2 + wrap-ansi: 9.0.0 - brace-expansion@1.1.14: + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -9475,11 +9235,11 @@ snapshots: dependencies: chokidar: 4.0.3 confbox: 0.1.8 - defu: 6.1.7 + defu: 6.1.4 dotenv: 16.6.1 giget: 1.2.5 jiti: 2.6.1 - mlly: 1.8.2 + mlly: 1.7.4 ohash: 1.1.6 pathe: 1.1.2 perfect-debounce: 1.0.0 @@ -9495,7 +9255,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.9: + call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -9530,7 +9290,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} + chalk@5.4.1: {} character-entities-html4@2.1.0: {} @@ -9624,7 +9384,7 @@ snapshots: convert-source-map@2.0.0: {} - cookie-es@1.2.3: {} + cookie-es@1.2.2: {} cookie@1.1.1: {} @@ -9659,9 +9419,9 @@ snapshots: mdn-data: 2.0.28 source-map-js: 1.2.1 - css-tree@3.2.1: + css-tree@3.1.0: dependencies: - mdn-data: 2.27.1 + mdn-data: 2.12.2 source-map-js: 1.2.1 css-what@6.2.2: {} @@ -9681,7 +9441,7 @@ snapshots: '@cypress/request': 3.0.10 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.10 + '@types/sizzle': 2.3.9 '@types/tmp': 0.2.6 arch: 2.2.0 blob-util: 2.0.2 @@ -9693,7 +9453,7 @@ snapshots: cli-table3: 0.6.1 commander: 6.2.1 common-tags: 1.8.2 - dayjs: 1.11.20 + dayjs: 1.11.13 debug: 4.4.3(supports-color@8.1.1) eventemitter2: 6.4.7 execa: 4.1.0 @@ -9703,7 +9463,7 @@ snapshots: hasha: 5.2.2 is-installed-globally: 0.4.0 listr2: 9.0.5 - lodash: 4.18.1 + lodash: 4.17.23 log-symbols: 4.1.0 minimist: 1.2.8 ospath: 1.2.2 @@ -9712,7 +9472,7 @@ snapshots: proxy-from-env: 1.0.0 request-progress: 3.0.0 supports-color: 8.1.1 - systeminformation: 5.31.5 + systeminformation: 5.31.6 tmp: 0.2.5 tree-kill: 1.2.2 tslib: 1.14.1 @@ -9741,7 +9501,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - dayjs@1.11.20: {} + dayjs@1.11.13: {} debug@3.2.7(supports-color@8.1.1): dependencies: @@ -9755,7 +9515,7 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - decode-named-character-reference@1.3.0: + decode-named-character-reference@1.1.0: dependencies: character-entities: 2.0.2 @@ -9790,7 +9550,7 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - defu@6.1.7: {} + defu@6.1.4: {} delayed-stream@1.0.0: {} @@ -9806,13 +9566,17 @@ snapshots: dependencies: base-64: 1.0.0 + devalue@5.6.2: {} + devalue@5.8.0: {} devlop@1.1.0: dependencies: dequal: 2.0.3 - diff@8.0.4: {} + dexie@4.4.2: {} + + diff@8.0.3: {} dlv@1.1.3: {} @@ -9866,35 +9630,33 @@ snapshots: '@emmetio/abbreviation': 2.3.3 '@emmetio/css-abbreviation': 2.1.8 - emoji-regex@10.6.0: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} encodeurl@2.0.0: {} - end-of-stream@1.4.5: + end-of-stream@1.4.4: dependencies: once: 1.4.0 - enhanced-resolve@5.21.0: + enhanced-resolve@5.21.2: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 entities@4.5.0: {} - entities@6.0.1: {} - environment@1.1.0: {} error-stack-parser-es@1.0.5: {} - es-abstract@1.24.2: + es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 @@ -9913,7 +9675,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.2 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -9931,7 +9693,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.4 + safe-array-concat: 1.1.3 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -9944,7 +9706,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} @@ -9963,11 +9725,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.2 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.2 es-to-primitive@1.3.0: dependencies: @@ -9977,34 +9739,34 @@ snapshots: es-toolkit@1.46.1: {} - esbuild@0.25.12: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 esbuild@0.27.0: optionalDependencies: @@ -10064,35 +9826,6 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 - esbuild@0.27.7: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -10101,21 +9834,21 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-import-resolver-node@0.3.10: + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7(supports-color@8.1.1) is-core-module: 2.16.1 - resolve: 2.0.0-next.6 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@2.6.1)): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: '@typescript-eslint/parser': 8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.4(jiti@2.6.1) - eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color @@ -10134,12 +9867,12 @@ snapshots: debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 eslint: 9.39.4(jiti@2.6.1) - eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.6.1)) - hasown: 2.0.3 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.4(jiti@2.6.1)) + hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 - minimatch: 3.1.5 + minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 @@ -10153,11 +9886,11 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-storybook@10.4.1(eslint@9.39.4(jiti@2.6.1))(storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3): + eslint-plugin-storybook@10.4.1(eslint@9.39.4(jiti@2.6.1))(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.59.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.4(jiti@2.6.1) - storybook: 10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) transitivePeerDependencies: - supports-color - typescript @@ -10170,9 +9903,9 @@ snapshots: esutils: 2.0.3 globals: 16.5.0 known-css-properties: 0.37.0 - postcss: 8.5.14 - postcss-load-config: 3.1.4(postcss@8.5.14) - postcss-safe-parser: 7.0.1(postcss@8.5.14) + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) semver: 7.7.4 svelte-eslint-parser: 1.6.1(svelte@5.55.5(@typescript-eslint/types@8.59.2)) optionalDependencies: @@ -10207,9 +9940,9 @@ snapshots: '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.8 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.8 ajv: 6.15.0 chalk: 4.1.2 @@ -10219,7 +9952,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.7.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -10242,13 +9975,13 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} - esquery@1.7.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -10261,7 +9994,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - esrap@2.2.6(@typescript-eslint/types@8.59.2): + esrap@2.2.7(@typescript-eslint/types@8.59.2): dependencies: '@jridgewell/sourcemap-codec': 1.5.5 optionalDependencies: @@ -10297,7 +10030,7 @@ snapshots: eventemitter2@6.4.7: {} - eventemitter3@5.0.4: {} + eventemitter3@5.0.1: {} execa@4.1.0: dependencies: @@ -10349,7 +10082,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.1.2: {} + fast-uri@3.1.0: {} fast-xml-builder@1.2.0: dependencies: @@ -10367,6 +10100,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -10393,10 +10130,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.4.2: {} + flatted@3.3.3: {} flattie@1.1.1: {} @@ -10408,10 +10145,10 @@ snapshots: imagesloaded: 5.0.0 unidragger: 3.0.1 - flowbite-datepicker@1.3.2(rollup@4.60.3): + flowbite-datepicker@1.3.2(rollup@4.52.2): dependencies: - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.60.3) - flowbite: 2.5.2(rollup@4.60.3) + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.52.2) + flowbite: 2.5.2(rollup@4.52.2) transitivePeerDependencies: - rollup @@ -10419,48 +10156,50 @@ snapshots: dependencies: clsx: 2.1.1 svelte: 5.55.5(@typescript-eslint/types@8.59.2) - tailwind-merge: 3.5.0 + tailwind-merge: 3.6.0 - flowbite-svelte@1.5.2(rollup@4.60.3)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(tailwindcss@4.2.4): + flowbite-svelte@1.5.2(rollup@4.52.2)(svelte@5.55.5(@typescript-eslint/types@8.59.2))(tailwindcss@4.3.0): dependencies: - '@floating-ui/dom': 1.7.6 - '@floating-ui/utils': 0.2.11 + '@floating-ui/dom': 1.7.1 + '@floating-ui/utils': 0.2.9 apexcharts: 4.7.0 clsx: 2.1.1 - flowbite: 3.1.2(rollup@4.60.3) + flowbite: 3.1.2(rollup@4.52.2) svelte: 5.55.5(@typescript-eslint/types@8.59.2) - tailwind-merge: 3.5.0 - tailwind-variants: 1.0.0(tailwindcss@4.2.4) - tailwindcss: 4.2.4 + tailwind-merge: 3.6.0 + tailwind-variants: 1.0.0(tailwindcss@4.3.0) + tailwindcss: 4.3.0 transitivePeerDependencies: - rollup - flowbite@2.5.2(rollup@4.60.3): + flowbite@2.5.2(rollup@4.52.2): dependencies: '@popperjs/core': 2.11.8 - flowbite-datepicker: 1.3.2(rollup@4.60.3) + flowbite-datepicker: 1.3.2(rollup@4.52.2) mini-svg-data-uri: 1.4.4 transitivePeerDependencies: - rollup - flowbite@3.1.2(rollup@4.60.3): + flowbite@3.1.2(rollup@4.52.2): dependencies: '@popperjs/core': 2.11.8 - flowbite-datepicker: 1.3.2(rollup@4.60.3) + flowbite-datepicker: 1.3.2(rollup@4.52.2) mini-svg-data-uri: 1.4.4 - postcss: 8.5.14 + postcss: 8.5.6 transitivePeerDependencies: - rollup - follow-redirects@1.16.0(debug@4.4.3): + follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: debug: 4.4.3(supports-color@8.1.1) + follow-redirects@1.16.0: {} + fontace@0.4.1: dependencies: - fontkitten: 1.0.3 + fontkitten: 1.0.2 - fontkitten@1.0.3: + fontkitten@1.0.2: dependencies: tiny-inflate: 1.0.3 @@ -10475,7 +10214,7 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.3 + hasown: 2.0.2 mime-types: 2.1.35 fresh@2.0.0: {} @@ -10486,7 +10225,7 @@ snapshots: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 - jsonfile: 6.2.1 + jsonfile: 6.1.0 universalify: 2.0.1 fs-minipass@2.1.0: @@ -10503,20 +10242,20 @@ snapshots: function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.3 + hasown: 2.0.2 is-callable: 1.2.7 functions-have-names@1.2.3: {} - generator-function@2.0.1: {} - get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} + get-east-asian-width@1.3.0: {} + + get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: dependencies: @@ -10528,7 +10267,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.2 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -10540,7 +10279,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.4 + pump: 3.0.2 get-stream@6.0.1: {} @@ -10558,7 +10297,7 @@ snapshots: dependencies: citty: 0.1.6 consola: 3.4.2 - defu: 6.1.7 + defu: 6.1.4 node-fetch-native: 1.6.7 nypm: 0.5.4 pathe: 2.0.3 @@ -10587,16 +10326,16 @@ snapshots: graceful-fs@4.2.11: {} - h3@1.15.11: + h3@1.15.5: dependencies: - cookie-es: 1.2.3 + cookie-es: 1.2.2 crossws: 0.3.5 - defu: 6.1.7 + defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 node-mock-http: 1.0.4 radix3: 1.1.2 - ufo: 1.6.4 + ufo: 1.6.3 uncrypto: 0.1.3 handlebars@4.7.8: @@ -10631,7 +10370,7 @@ snapshots: is-stream: 2.0.1 type-fest: 0.8.1 - hasown@2.0.3: + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -10640,9 +10379,9 @@ snapshots: '@types/hast': 3.0.4 devlop: 1.1.0 hast-util-from-parse5: 8.0.3 - parse5: 7.3.0 + parse5: 7.2.1 vfile: 6.0.3 - vfile-message: 4.0.3 + vfile-message: 4.0.2 hast-util-from-parse5@8.0.3: dependencies: @@ -10650,7 +10389,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.1.0 + property-information: 7.0.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -10669,12 +10408,12 @@ snapshots: '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.0 hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - parse5: 7.3.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -10687,18 +10426,18 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-parse5@8.0.1: + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 7.1.0 + property-information: 6.5.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -10719,7 +10458,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 + property-information: 7.0.0 space-separated-tokens: 2.0.2 html-escaper@2.0.2: {} @@ -10773,19 +10512,19 @@ snapshots: ini@2.0.0: {} - inline-style-parser@0.2.7: {} + inline-style-parser@0.2.4: {} internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 + hasown: 2.0.2 side-channel: 1.1.0 iron-webcrypto@1.2.1: {} is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 @@ -10810,7 +10549,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.3 + hasown: 2.0.2 is-data-view@1.0.2: dependencies: @@ -10835,12 +10574,11 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 - is-generator-function@1.1.2: + is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 - generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -10882,7 +10620,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.2 is-set@2.0.3: {} @@ -10905,7 +10643,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 is-typedarray@1.0.0: {} @@ -10922,7 +10660,7 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-wsl@3.1.1: + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -10949,13 +10687,23 @@ snapshots: jiti@2.6.1: {} + joi@18.0.2: + dependencies: + '@hapi/address': 5.1.1 + '@hapi/formula': 3.0.2 + '@hapi/hoek': 11.0.7 + '@hapi/pinpoint': 2.0.1 + '@hapi/tlds': 1.1.3 + '@hapi/topo': 6.0.2 + '@standard-schema/spec': 1.0.0 + joi@18.2.1: dependencies: '@hapi/address': 5.1.1 '@hapi/formula': 3.0.2 '@hapi/hoek': 11.0.7 '@hapi/pinpoint': 2.0.1 - '@hapi/tlds': 1.1.6 + '@hapi/tlds': 1.1.3 '@hapi/topo': 6.0.2 '@standard-schema/spec': 1.1.0 @@ -10989,7 +10737,7 @@ snapshots: jsonc-parser@3.3.1: {} - jsonfile@6.2.1: + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -11076,10 +10824,10 @@ snapshots: dependencies: cli-truncate: 5.2.0 colorette: 2.0.20 - eventemitter3: 5.0.4 + eventemitter3: 5.0.1 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 9.0.2 + wrap-ansi: 9.0.0 locate-character@3.0.0: {} @@ -11091,6 +10839,8 @@ snapshots: lodash.once@4.1.1: {} + lodash@4.17.23: {} + lodash@4.18.1: {} log-symbols@4.1.0: @@ -11103,14 +10853,14 @@ snapshots: ansi-escapes: 7.3.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 longest-streak@3.1.0: {} loupe@3.2.1: {} - lru-cache@11.3.6: {} + lru-cache@11.2.6: {} lz-string@1.5.0: {} @@ -11120,14 +10870,14 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.29.3 + '@babel/parser': 7.29.0 '@babel/types': 7.29.0 source-map-js: 1.2.1 optional: true magicast@0.5.2: dependencies: - '@babel/parser': 7.29.3 + '@babel/parser': 7.29.0 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -11147,20 +10897,20 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.2 - mdast-util-from-markdown@2.0.3: + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -11185,7 +10935,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: @@ -11194,7 +10944,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -11204,7 +10954,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -11213,14 +10963,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 mdast-util-gfm-autolink-literal: 2.0.1 mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -11233,9 +10983,9 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 - mdast-util-to-hast@13.2.1: + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -11244,7 +10994,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 vfile: 6.0.3 mdast-util-to-markdown@2.1.2: @@ -11256,7 +11006,7 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: @@ -11265,7 +11015,7 @@ snapshots: mdn-data@2.0.28: {} - mdn-data@2.27.1: {} + mdn-data@2.12.2: {} media-icons@1.1.5: {} @@ -11273,7 +11023,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -11406,7 +11156,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.1.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -11442,9 +11192,9 @@ snapshots: micromark@4.0.2: dependencies: - '@types/debug': 4.1.13 + '@types/debug': 4.1.12 debug: 4.4.3(supports-color@8.1.1) - decode-named-character-reference: 1.3.0 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -11495,12 +11245,12 @@ snapshots: - bufferutil - utf-8-validate - miniflare@4.20260430.0: + miniflare@4.20260507.1: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.34.5 undici: 7.24.8 - workerd: 1.20260430.1 + workerd: 1.20260507.1 ws: 8.18.0 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -11509,11 +11259,15 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.11 minimist@1.2.8: {} @@ -11530,12 +11284,12 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.8.2: + mlly@1.7.4: dependencies: - acorn: 8.16.0 + acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.4 + ufo: 1.6.3 mrmime@2.0.1: {} @@ -11545,7 +11299,7 @@ snapshots: murmurhash-js@1.0.0: {} - nanoid@3.3.12: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -11557,13 +11311,6 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 - node-exports-info@1.6.0: - dependencies: - array.prototype.flatmap: 1.3.3 - es-errors: 1.3.0 - object.entries: 1.1.9 - semver: 6.3.1 - node-fetch-native@1.6.7: {} node-mock-http@1.0.4: {} @@ -11585,7 +11332,7 @@ snapshots: pathe: 2.0.3 pkg-types: 1.3.1 tinyexec: 0.3.2 - ufo: 1.6.4 + ufo: 1.6.3 object-inspect@1.13.4: {} @@ -11593,36 +11340,29 @@ snapshots: object.assign@4.1.7: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.9: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - object.fromentries@2.0.8: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 object.values@1.2.1: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -11633,7 +11373,7 @@ snapshots: dependencies: destr: 2.0.5 node-fetch-native: 1.6.7 - ufo: 1.6.4 + ufo: 1.6.3 ohash@1.1.6: {} @@ -11655,12 +11395,12 @@ snapshots: dependencies: mimic-function: 5.0.1 - oniguruma-parser@0.12.2: {} + oniguruma-parser@0.12.1: {} - oniguruma-to-es@4.3.6: + oniguruma-to-es@4.3.4: dependencies: - oniguruma-parser: 0.12.2 - regex: 6.1.0 + oniguruma-parser: 0.12.1 + regex: 6.0.1 regex-recursion: 6.0.2 open@10.2.0: @@ -11714,31 +11454,27 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 '@oxc-parser/binding-win32-x64-msvc': 0.127.0 - oxc-resolver@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0): + oxc-resolver@11.20.0: optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.19.1 - '@oxc-resolver/binding-android-arm64': 11.19.1 - '@oxc-resolver/binding-darwin-arm64': 11.19.1 - '@oxc-resolver/binding-darwin-x64': 11.19.1 - '@oxc-resolver/binding-freebsd-x64': 11.19.1 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.19.1 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.19.1 - '@oxc-resolver/binding-linux-arm64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-arm64-musl': 11.19.1 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-riscv64-musl': 11.19.1 - '@oxc-resolver/binding-linux-s390x-gnu': 11.19.1 - '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 - '@oxc-resolver/binding-linux-x64-musl': 11.19.1 - '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) - '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 - '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 - '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@oxc-resolver/binding-android-arm-eabi': 11.20.0 + '@oxc-resolver/binding-android-arm64': 11.20.0 + '@oxc-resolver/binding-darwin-arm64': 11.20.0 + '@oxc-resolver/binding-darwin-x64': 11.20.0 + '@oxc-resolver/binding-freebsd-x64': 11.20.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.20.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.20.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.20.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.20.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.20.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-x64-musl': 11.20.0 + '@oxc-resolver/binding-openharmony-arm64': 11.20.0 + '@oxc-resolver/binding-wasm32-wasi': 11.20.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.20.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.20.0 p-limit@3.1.0: dependencies: @@ -11746,7 +11482,7 @@ snapshots: p-limit@6.2.0: dependencies: - yocto-queue: 1.2.2 + yocto-queue: 1.2.0 p-locate@5.0.0: dependencies: @@ -11754,7 +11490,7 @@ snapshots: p-queue@8.1.1: dependencies: - eventemitter3: 5.0.4 + eventemitter3: 5.0.1 p-timeout: 6.1.4 p-timeout@6.1.4: {} @@ -11774,9 +11510,9 @@ snapshots: unist-util-visit-children: 3.0.0 vfile: 6.0.3 - parse5@7.3.0: + parse5@7.2.1: dependencies: - entities: 6.0.1 + entities: 4.5.0 path-browserify@1.0.1: {} @@ -11810,7 +11546,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.1: {} + + picomatch@4.0.3: {} picomatch@4.0.4: {} @@ -11819,7 +11557,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.2 + mlly: 1.7.4 pathe: 2.0.3 playwright-core@1.59.1: {} @@ -11834,29 +11572,29 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-load-config@3.1.4(postcss@8.5.14): + postcss-load-config@3.1.4(postcss@8.5.6): dependencies: lilconfig: 2.1.0 - yaml: 1.10.3 + yaml: 1.10.2 optionalDependencies: - postcss: 8.5.14 + postcss: 8.5.6 - postcss-safe-parser@7.0.1(postcss@8.5.14): + postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.14 + postcss: 8.5.6 - postcss-scss@4.0.9(postcss@8.5.14): + postcss-scss@4.0.9(postcss@8.5.6): dependencies: - postcss: 8.5.14 + postcss: 8.5.6 postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.14: + postcss@8.5.6: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -11899,36 +11637,38 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - property-information@7.1.0: {} + property-information@6.5.0: {} - prosemirror-changeset@2.4.1: + property-information@7.0.0: {} + + prosemirror-changeset@2.3.1: dependencies: - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.10.4 prosemirror-commands@1.7.1: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.10.4 prosemirror-dropcursor@1.8.2: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 - prosemirror-gapcursor@1.4.1: + prosemirror-gapcursor@1.4.0: dependencies: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.8 + prosemirror-view: 1.41.3 - prosemirror-history@1.5.0: + prosemirror-history@1.4.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 rope-sequence: 1.3.4 prosemirror-keymap@1.2.3: @@ -11944,43 +11684,45 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.10.4 prosemirror-state@1.4.4: dependencies: prosemirror-model: 1.25.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 - prosemirror-tables@1.8.5: + prosemirror-tables@1.8.1: dependencies: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.8 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 - prosemirror-transform@1.12.0: + prosemirror-transform@1.10.4: dependencies: prosemirror-model: 1.25.4 - prosemirror-view@1.41.8: + prosemirror-view@1.41.3: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.10.4 proxy-from-env@1.0.0: {} + proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} ps-tree@1.2.0: dependencies: event-stream: 3.3.4 - pump@3.0.4: + pump@3.0.2: dependencies: - end-of-stream: 1.4.5 + end-of-stream: 1.4.4 once: 1.4.0 punycode@2.3.1: {} @@ -11997,17 +11739,17 @@ snapshots: rc9@2.1.2: dependencies: - defu: 6.1.7 + defu: 6.1.4 destr: 2.0.5 - react-dom@19.2.5(react@19.2.5): + react-dom@19.2.6(react@19.2.6): dependencies: - react: 19.2.5 + react: 19.2.6 scheduler: 0.27.0 react-is@17.0.2: {} - react@19.2.5: {} + react@19.2.6: {} readdirp@4.1.2: {} @@ -12028,9 +11770,9 @@ snapshots: reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -12043,13 +11785,13 @@ snapshots: regex-utilities@2.3.0: {} - regex@6.1.0: + regex@6.0.1: dependencies: regex-utilities: 2.3.0 regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 get-proto: 1.0.1 @@ -12095,7 +11837,7 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.2 micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: @@ -12105,7 +11847,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.1 + mdast-util-to-hast: 13.2.0 unified: 11.0.5 vfile: 6.0.3 @@ -12114,7 +11856,7 @@ snapshots: retext: 9.0.0 retext-smartypants: 6.2.0 unified: 11.0.5 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 remark-stringify@11.0.0: dependencies: @@ -12136,22 +11878,12 @@ snapshots: resolve-from@4.0.0: {} - resolve@1.22.12: + resolve@1.22.10: dependencies: - es-errors: 1.3.0 is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.6: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.1 - node-exports-info: 1.6.0 - object-keys: 1.1.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -12167,7 +11899,7 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 retext-stringify@4.0.0: dependencies: @@ -12186,35 +11918,32 @@ snapshots: rndm@1.2.0: {} - rollup@4.60.3: + rollup@4.52.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.3 - '@rollup/rollup-android-arm64': 4.60.3 - '@rollup/rollup-darwin-arm64': 4.60.3 - '@rollup/rollup-darwin-x64': 4.60.3 - '@rollup/rollup-freebsd-arm64': 4.60.3 - '@rollup/rollup-freebsd-x64': 4.60.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 - '@rollup/rollup-linux-arm-musleabihf': 4.60.3 - '@rollup/rollup-linux-arm64-gnu': 4.60.3 - '@rollup/rollup-linux-arm64-musl': 4.60.3 - '@rollup/rollup-linux-loong64-gnu': 4.60.3 - '@rollup/rollup-linux-loong64-musl': 4.60.3 - '@rollup/rollup-linux-ppc64-gnu': 4.60.3 - '@rollup/rollup-linux-ppc64-musl': 4.60.3 - '@rollup/rollup-linux-riscv64-gnu': 4.60.3 - '@rollup/rollup-linux-riscv64-musl': 4.60.3 - '@rollup/rollup-linux-s390x-gnu': 4.60.3 - '@rollup/rollup-linux-x64-gnu': 4.60.3 - '@rollup/rollup-linux-x64-musl': 4.60.3 - '@rollup/rollup-openbsd-x64': 4.60.3 - '@rollup/rollup-openharmony-arm64': 4.60.3 - '@rollup/rollup-win32-arm64-msvc': 4.60.3 - '@rollup/rollup-win32-ia32-msvc': 4.60.3 - '@rollup/rollup-win32-x64-gnu': 4.60.3 - '@rollup/rollup-win32-x64-msvc': 4.60.3 + '@rollup/rollup-android-arm-eabi': 4.52.2 + '@rollup/rollup-android-arm64': 4.52.2 + '@rollup/rollup-darwin-arm64': 4.52.2 + '@rollup/rollup-darwin-x64': 4.52.2 + '@rollup/rollup-freebsd-arm64': 4.52.2 + '@rollup/rollup-freebsd-x64': 4.52.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 + '@rollup/rollup-linux-arm-musleabihf': 4.52.2 + '@rollup/rollup-linux-arm64-gnu': 4.52.2 + '@rollup/rollup-linux-arm64-musl': 4.52.2 + '@rollup/rollup-linux-loong64-gnu': 4.52.2 + '@rollup/rollup-linux-ppc64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-musl': 4.52.2 + '@rollup/rollup-linux-s390x-gnu': 4.52.2 + '@rollup/rollup-linux-x64-gnu': 4.52.2 + '@rollup/rollup-linux-x64-musl': 4.52.2 + '@rollup/rollup-openharmony-arm64': 4.52.2 + '@rollup/rollup-win32-arm64-msvc': 4.52.2 + '@rollup/rollup-win32-ia32-msvc': 4.52.2 + '@rollup/rollup-win32-x64-gnu': 4.52.2 + '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -12234,9 +11963,9 @@ snapshots: s.color@0.0.15: {} - safe-array-concat@1.1.4: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 @@ -12261,7 +11990,7 @@ snapshots: dependencies: suf-log: 2.5.3 - sax@1.6.0: {} + sax@1.4.4: {} scheduler@0.27.0: {} @@ -12315,7 +12044,7 @@ snapshots: sharp@0.34.5: dependencies: - '@img/colour': 1.1.0 + '@img/colour': 1.0.0 detect-libc: 2.1.2 semver: 7.7.4 optionalDependencies: @@ -12350,18 +12079,18 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.23.0: + shiki@3.22.0: dependencies: - '@shikijs/core': 3.23.0 - '@shikijs/engine-javascript': 3.23.0 - '@shikijs/engine-oniguruma': 3.23.0 - '@shikijs/langs': 3.23.0 - '@shikijs/themes': 3.23.0 - '@shikijs/types': 3.23.0 + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - side-channel-list@1.0.1: + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -12385,7 +12114,7 @@ snapshots: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.1 + side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -12405,7 +12134,7 @@ snapshots: slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 is-fullwidth-code-point: 5.1.0 slice-ansi@8.0.0: @@ -12413,7 +12142,7 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - smol-toml@1.6.1: {} + smol-toml@1.6.0: {} source-map-js@1.2.1: {} @@ -12461,29 +12190,27 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@10.4.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.2.14)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@storybook/icons': 2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 '@webcontainer/env': 1.1.1 - esbuild: 0.27.7 + esbuild: 0.27.3 open: 10.2.0 oxc-parser: 0.127.0 - oxc-resolver: 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.10.0) + oxc-resolver: 11.20.0 recast: 0.23.11 semver: 7.7.4 - use-sync-external-store: 1.6.0(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.6) ws: 8.20.0 optionalDependencies: '@types/react': 19.2.14 prettier: 3.5.3 transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - '@testing-library/dom' - bufferutil - react @@ -12502,35 +12229,35 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 - strip-ansi: 7.2.0 + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 string-width@8.2.1: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.2 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -12543,6 +12270,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -12563,9 +12294,9 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 - style-to-object@1.0.14: + style-to-object@1.0.8: dependencies: - inline-style-parser: 0.2.7 + inline-style-parser: 0.2.4 suf-log@2.5.3: dependencies: @@ -12594,8 +12325,8 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - postcss: 8.5.14 - postcss-scss: 4.0.9(postcss@8.5.14) + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) postcss-selector-parser: 7.1.1 semver: 7.7.4 optionalDependencies: @@ -12609,12 +12340,12 @@ snapshots: dependencies: clsx: 2.1.1 runed: 0.35.1(svelte@5.55.5(@typescript-eslint/types@8.59.2)) - style-to-object: 1.0.14 + style-to-object: 1.0.8 svelte: 5.55.5(@typescript-eslint/types@8.59.2) transitivePeerDependencies: - '@sveltejs/kit' - svelte2tsx@0.7.55(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3): + svelte2tsx@0.7.48(svelte@5.55.5(@typescript-eslint/types@8.59.2))(typescript@5.9.3): dependencies: dedent-js: 1.0.1 scule: 1.3.0 @@ -12625,47 +12356,47 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 - '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) '@types/estree': 1.0.8 '@types/trusted-types': 2.0.7 - acorn: 8.16.0 + acorn: 8.15.0 aria-query: 5.3.1 axobject-query: 4.1.0 clsx: 2.1.1 devalue: 5.8.0 esm-env: 1.2.2 - esrap: 2.2.6(@typescript-eslint/types@8.59.2) + esrap: 2.2.7(@typescript-eslint/types@8.59.2) is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.21 - zimmerframe: 1.1.4 + zimmerframe: 1.1.2 transitivePeerDependencies: - '@typescript-eslint/types' - svgo@4.0.1: + svgo@4.0.0: dependencies: commander: 11.1.0 css-select: 5.2.2 - css-tree: 3.2.1 + css-tree: 3.1.0 css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 - sax: 1.6.0 + sax: 1.4.4 - systeminformation@5.31.5: {} + systeminformation@5.31.6: {} - tabbable@6.4.0: {} + tabbable@6.2.0: {} tailwind-merge@3.0.2: {} - tailwind-merge@3.5.0: {} + tailwind-merge@3.6.0: {} - tailwind-variants@1.0.0(tailwindcss@4.2.4): + tailwind-variants@1.0.0(tailwindcss@4.3.0): dependencies: tailwind-merge: 3.0.2 - tailwindcss: 4.2.4 + tailwindcss: 4.3.0 - tailwindcss@4.2.4: {} + tailwindcss@4.3.0: {} tapable@2.3.3: {} @@ -12690,7 +12421,12 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.1.2: {} + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinyglobby@0.2.16: dependencies: @@ -12768,7 +12504,7 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.41.0: {} + type-fest@4.37.0: {} typed-array-buffer@1.0.3: dependencies: @@ -12778,7 +12514,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -12787,7 +12523,7 @@ snapshots: typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.9 + call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -12796,7 +12532,7 @@ snapshots: typed-array-length@1.0.7: dependencies: - call-bind: 1.0.9 + call-bind: 1.0.8 for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 @@ -12822,7 +12558,7 @@ snapshots: typescript@5.9.3: {} - ufo@1.6.4: {} + ufo@1.6.3: {} uglify-js@3.19.3: optional: true @@ -12870,16 +12606,16 @@ snapshots: unifont@0.7.4: dependencies: - css-tree: 3.2.1 + css-tree: 3.1.0 ofetch: 1.5.1 ohash: 2.0.11 unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 - unist-util-is@6.0.1: + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -12895,7 +12631,7 @@ snapshots: unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 + unist-util-visit: 5.0.0 unist-util-stringify-position@4.0.0: dependencies: @@ -12908,12 +12644,12 @@ snapshots: unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 - unist-util-visit@5.1.0: + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.2 universalify@2.0.1: {} @@ -12921,20 +12657,20 @@ snapshots: unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.16.0 + acorn: 8.15.0 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unstorage@1.17.5: + unstorage@1.17.4: dependencies: anymatch: 3.1.3 chokidar: 5.0.0 destr: 2.0.5 - h3: 1.15.11 - lru-cache: 11.3.6 + h3: 1.15.5 + lru-cache: 11.2.6 node-fetch-native: 1.6.7 ofetch: 1.5.1 - ufo: 1.6.4 + ufo: 1.6.3 untildify@4.0.0: {} @@ -12942,9 +12678,9 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@19.2.5): + use-sync-external-store@1.6.0(react@19.2.6): dependencies: - react: 19.2.5 + react: 19.2.6 util-deprecate@1.0.2: {} @@ -12961,7 +12697,7 @@ snapshots: '@types/unist': 3.0.3 vfile: 6.0.3 - vfile-message@4.0.3: + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -12969,31 +12705,31 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.3 + vfile-message: 4.0.2 - vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4): + vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0): dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.14 - rollup: 4.60.3 - tinyglobby: 0.2.16 + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.2 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.12.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 - yaml: 2.8.4 + yaml: 2.9.0 - vitefu@1.1.3(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)): + vitefu@1.1.1(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)): optionalDependencies: - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) - vitest@4.1.5(@types/node@24.12.2)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)): + vitest@4.1.5(@types/node@24.12.3)(@vitest/browser-playwright@4.1.5)(@vitest/coverage-v8@4.1.5)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4)) + '@vitest/mocker': 4.1.5(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -13004,24 +12740,24 @@ snapshots: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.3 std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.1.2 - tinyglobby: 0.2.16 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4) + vite: 6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.12.2 - '@vitest/browser-playwright': 4.1.5(playwright@1.59.1)(vite@6.4.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.8.4))(vitest@4.1.5) + '@types/node': 24.12.3 + '@vitest/browser-playwright': 4.1.5(playwright@1.59.1)(vite@6.4.1(@types/node@24.12.3)(jiti@2.6.1)(lightningcss@1.32.0)(yaml@2.9.0))(vitest@4.1.5) '@vitest/coverage-v8': 4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5) transitivePeerDependencies: - msw volar-service-css@0.0.70(@volar/language-service@2.4.28): dependencies: - vscode-css-languageservice: 6.3.10 + vscode-css-languageservice: 6.3.8 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 optionalDependencies: @@ -13075,7 +12811,7 @@ snapshots: optionalDependencies: '@volar/language-service': 2.4.28 - vscode-css-languageservice@6.3.10: + vscode-css-languageservice@6.3.8: dependencies: '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.12 @@ -13120,17 +12856,17 @@ snapshots: wait-on@9.0.4(debug@4.4.3): dependencies: - axios: 1.16.0(debug@4.4.3) - joi: 18.2.1 - lodash: 4.18.1 + axios: 1.13.5(debug@4.4.3) + joi: 18.0.2 + lodash: 4.17.23 minimist: 1.2.8 rxjs: 7.8.2 transitivePeerDependencies: - debug - wait-on@9.0.5: + wait-on@9.0.8: dependencies: - axios: 1.16.0(debug@4.4.3) + axios: 1.16.0 joi: 18.2.1 lodash: 4.18.1 minimist: 1.2.8 @@ -13158,13 +12894,13 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 + is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -13175,10 +12911,10 @@ snapshots: which-pm-runs@1.1.0: {} - which-typed-array@1.1.20: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.9 + call-bind: 1.0.8 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 @@ -13210,15 +12946,15 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260114.0 '@cloudflare/workerd-windows-64': 1.20260114.0 - workerd@1.20260430.1: + workerd@1.20260507.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260430.1 - '@cloudflare/workerd-darwin-arm64': 1.20260430.1 - '@cloudflare/workerd-linux-64': 1.20260430.1 - '@cloudflare/workerd-linux-arm64': 1.20260430.1 - '@cloudflare/workerd-windows-64': 1.20260430.1 + '@cloudflare/workerd-darwin-64': 1.20260507.1 + '@cloudflare/workerd-darwin-arm64': 1.20260507.1 + '@cloudflare/workerd-linux-64': 1.20260507.1 + '@cloudflare/workerd-linux-arm64': 1.20260507.1 + '@cloudflare/workerd-windows-64': 1.20260507.1 - wrangler@4.59.2(@cloudflare/workers-types@4.20260505.1): + wrangler@4.59.2(@cloudflare/workers-types@4.20260214.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@cloudflare/unenv-preset': 2.10.0(unenv@2.0.0-rc.24)(workerd@1.20260114.0) @@ -13229,24 +12965,24 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20260114.0 optionalDependencies: - '@cloudflare/workers-types': 4.20260505.1 + '@cloudflare/workers-types': 4.20260214.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil - utf-8-validate - wrangler@4.87.0(@cloudflare/workers-types@4.20260505.1): + wrangler@4.90.0(@cloudflare/workers-types@4.20260214.0): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260430.1) + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260507.1) blake3-wasm: 2.1.5 esbuild: 0.27.3 - miniflare: 4.20260430.0 + miniflare: 4.20260507.1 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260430.1 + workerd: 1.20260507.1 optionalDependencies: - '@cloudflare/workers-types': 4.20260505.1 + '@cloudflare/workers-types': 4.20260214.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil @@ -13258,11 +12994,11 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@9.0.2: + wrap-ansi@9.0.0: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 string-width: 7.2.0 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 wrappy@1.0.2: {} @@ -13272,7 +13008,7 @@ snapshots: wsl-utils@0.1.0: dependencies: - is-wsl: 3.1.1 + is-wsl: 3.1.0 xml-naming@0.1.0: {} @@ -13285,8 +13021,8 @@ snapshots: yaml-language-server@1.20.0: dependencies: '@vscode/l10n': 0.0.18 - ajv: 8.20.0 - ajv-draft-04: 1.0.0(ajv@8.20.0) + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) prettier: 3.5.3 request-light: 0.5.8 vscode-json-languageservice: 4.1.8 @@ -13296,11 +13032,11 @@ snapshots: vscode-uri: 3.1.0 yaml: 2.7.1 - yaml@1.10.3: {} + yaml@1.10.2: {} yaml@2.7.1: {} - yaml@2.8.4: {} + yaml@2.9.0: {} yargs-parser@21.1.1: {} @@ -13321,32 +13057,30 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.2: {} + yocto-queue@1.2.0: {} yocto-spinner@0.2.3: dependencies: - yoctocolors: 2.1.2 + yoctocolors: 2.1.1 - yoctocolors@2.1.2: {} + yoctocolors@2.1.1: {} youch-core@0.3.3: dependencies: - '@poppinss/exception': 1.2.3 + '@poppinss/exception': 1.2.2 error-stack-parser-es: 1.0.5 youch@4.1.0-beta.10: dependencies: - '@poppinss/colors': 4.1.6 - '@poppinss/dumper': 0.6.5 - '@speed-highlight/core': 1.2.15 + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 cookie: 1.1.1 youch-core: 0.3.3 zimmerframe@1.1.2: {} - zimmerframe@1.1.4: {} - - zod-to-json-schema@3.25.2(zod@3.25.76): + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 diff --git a/src/components/Admin/ActionsBtn.svelte b/src/components/Admin/ActionsBtn.svelte index e5932187..897969b8 100644 --- a/src/components/Admin/ActionsBtn.svelte +++ b/src/components/Admin/ActionsBtn.svelte @@ -1,26 +1,35 @@ -
-
- - - + - +
diff --git a/src/components/Admin/ContentFooter.svelte b/src/components/Admin/ContentFooter.svelte index 1bbcec75..6ee54af0 100644 --- a/src/components/Admin/ContentFooter.svelte +++ b/src/components/Admin/ContentFooter.svelte @@ -28,12 +28,14 @@ }); -
-
+
+
{#if date && time}

{@html $t( - "contributions.grid.content-footer.lastEdited", + "pages.admin.charges.lastEdited", { date: `${date}`, time: `${time}`, @@ -43,17 +45,20 @@

{/if}
-
-

- {$t("contributions.grid.content-footer.downloadDetails")} -

- + + +
diff --git a/src/components/Admin/Contributions.svelte b/src/components/Admin/Contributions.svelte index 8d16e286..461244ee 100644 --- a/src/components/Admin/Contributions.svelte +++ b/src/components/Admin/Contributions.svelte @@ -7,10 +7,16 @@ import FiltersTags from "./FiltersTags.svelte"; import Slider from "./Slider.svelte"; import Table, { type ExtendedCharge } from "./Table.svelte"; + import { session } from "../../auth/store"; import { t } from "../../i18n/store"; - import { client } from "../../openapi/client/client.gen"; import { + apiAccountingsIdGet, + apiGatewayChargesGetCollection, + apiGatewayCheckoutsIdGet, apiGatewaysGetCollection, + apiProjectsIdOrSlugGet, + apiTipjarsIdGet, + apiUsersIdOrHandleGet, type Accounting, type ApiGatewayChargesGetCollectionData, type GatewayCharge, @@ -20,7 +26,6 @@ type User, } from "../../openapi/client/index.ts"; import { - apiGatewayChargesGetCollectionUrl, apiProjectsGetCollectionUrl, apiTipjarsGetCollectionUrl, apiUsersGetCollectionUrl, @@ -32,22 +37,8 @@ currentPage, sortOptions, } from "../../stores/chargesPaginationAndSort.ts"; - import { - fetchAccounting, - fetchCheckout, - fetchProject, - fetchTipjar, - fetchUser, - fetchWithPersistentCache, - } from "../../utils/cachedFetch"; import { extractId } from "../../utils/extractId"; - - type GatewayChargesCollection = { - member: T[]; - totalItems: number; - }; - - const API_CACHE_NAME = "charges-cache"; + import { toCollectionItems } from "../../utils/hydra"; let filters: ApiGatewayChargesGetCollectionData["query"] = $state({}); @@ -61,19 +52,6 @@ let isFirstLoad = $state(true); let selectedSort = $state("date-desc"); - function getAccessToken(): string | null { - const match = document.cookie.match(/(?:^|;\s*)access-token=([^;]*)/); - if (!match) return null; - - try { - const decoded = decodeURIComponent(match[1]); - const parsed = JSON.parse(decoded); - return parsed?.token ?? null; - } catch { - return null; - } - } - function buildChargesQuery( filters: ApiGatewayChargesGetCollectionData["query"], page: number, @@ -94,6 +72,103 @@ return query; } + function getCollectionTotalItems(collection: unknown): number { + if (Array.isArray(collection)) return collection.length; + if (!collection || typeof collection !== "object") return 0; + + const record = collection as Record; + const totalItems = record.totalItems ?? record["hydra:totalItems"]; + + return typeof totalItems === "number" + ? totalItems + : toCollectionItems(collection).length; + } + + async function fetchCheckout(iri: string | undefined, headers: HeadersInit | undefined) { + const id = extractId(iri); + if (!id) return; + + const { data, error } = await apiGatewayCheckoutsIdGet({ + path: { id }, + headers, + }); + + if (error) { + console.error(`Failed to fetch checkout ${iri}:`, error); + return; + } + + return data; + } + + async function fetchAccounting(iri: string | undefined, headers: HeadersInit | undefined) { + const id = extractId(iri); + if (!id) return; + + const { data, error } = await apiAccountingsIdGet({ + path: { id }, + headers, + }); + + if (error) { + console.error(`Failed to fetch accounting ${iri}:`, error); + return; + } + + return data; + } + + async function fetchUser(iri: string | undefined, headers: HeadersInit | undefined) { + const idOrHandle = extractId(iri); + if (!idOrHandle) return; + + const { data, error } = await apiUsersIdOrHandleGet({ + path: { idOrHandle }, + headers, + }); + + if (error) { + console.error(`Failed to fetch user ${iri}:`, error); + return; + } + + return data; + } + + async function fetchProject(iri: string | undefined, headers: HeadersInit | undefined) { + const idOrSlug = extractId(iri); + if (!idOrSlug) return; + + const { data, error } = await apiProjectsIdOrSlugGet({ + path: { idOrSlug }, + headers, + }); + + if (error) { + console.error(`Failed to fetch project ${iri}:`, error); + return; + } + + return data; + } + + async function fetchTipjar(iri: string | undefined, headers: HeadersInit | undefined) { + const id = extractId(iri); + if (!id) return; + + const { data, error } = await apiTipjarsIdGet({ + path: { id }, + headers, + }); + + if (error) { + console.error(`Failed to fetch tipjar ${iri}:`, error); + return; + } + + return data; + } + async function loadCharges( filters: ApiGatewayChargesGetCollectionData["query"], ): Promise< @@ -108,44 +183,38 @@ const owners: Map = new Map(); try { - const token = getAccessToken(); - if (!token) return; - let page = $currentPage; let items = Number($itemsPerPage); const query = buildChargesQuery(filters, page, items); + const headers = $session?.token.asHttpHeaders as HeadersInit | undefined; - const collection = await fetchWithPersistentCache< - GatewayChargesCollection - >( - client.buildUrl({ - url: apiGatewayChargesGetCollectionUrl, - query, - }), - token, - API_CACHE_NAME, - ); + const { data: collection, error } = await apiGatewayChargesGetCollection({ + query, + headers, + }); - const loadedCharges = collection.member ?? []; - $totalItems = collection.totalItems ?? 0; + if (error) { + console.error("Failed to fetch gateway charges:", error); + return; + } + + const loadedCharges = toCollectionItems(collection); + $totalItems = getCollectionTotalItems(collection); for (const charge of loadedCharges) { const checkoutIri = charge.checkout; const targetAccountingIri = charge.target; if (checkoutIri && !checkouts.has(checkoutIri)) { - checkouts.set( - checkoutIri, - await Promise.resolve(fetchCheckout(checkoutIri, token, API_CACHE_NAME)), - ); + checkouts.set(checkoutIri, await fetchCheckout(checkoutIri, headers)); const originAccountingIri = checkouts.get(checkoutIri)?.origin; if (originAccountingIri && !accountings.has(originAccountingIri)) { await preloadAccountingData( originAccountingIri, - token, + headers, accountings, owners, ); @@ -153,7 +222,7 @@ } if (targetAccountingIri && !accountings.has(targetAccountingIri)) { - await preloadAccountingData(targetAccountingIri, token, accountings, owners); + await preloadAccountingData(targetAccountingIri, headers, accountings, owners); } } @@ -165,7 +234,7 @@ checkoutOrigin: checkout?.origin ?? "—", paymentMethod: extractId(checkout?.gateway) ?? "—", refundToWallet: checkout?.refund - ? $t(`contributions.table.rows.refund.${checkout.refund}`) + ? $t(`domain.charges.refund.${checkout.refund}`) : "—", platformLinks: checkout?.links ?? [], trackingCodes: checkout?.trackings ?? [], @@ -195,7 +264,7 @@ async function resolveOwner( ownerIri: string, - token: string, + headers: HeadersInit | undefined, owners: Map, ) { if (owners.has(ownerIri)) return; @@ -204,19 +273,19 @@ if (!handler) return; - const entity = await handler.fetcher(ownerIri, token, API_CACHE_NAME); + const entity = await handler.fetcher(ownerIri, headers); if (entity) owners.set(ownerIri, entity); } async function preloadAccountingData( accountingIri: string | null, - token: string, + headers: HeadersInit | undefined, accountings: Map, owners: Map, ) { if (!accountingIri || accountings.has(accountingIri)) return; - const accounting = await fetchAccounting(accountingIri, token, API_CACHE_NAME); + const accounting = await fetchAccounting(accountingIri, headers); if (!accounting) return; accountings.set(accountingIri, accounting); @@ -224,7 +293,7 @@ const ownerIri = accounting.owner; if (!ownerIri) return; - await resolveOwner(ownerIri, token, owners); + await resolveOwner(ownerIri, headers, owners); } function handleApplyFilters(newFilters: ApiGatewayChargesGetCollectionData["query"]) { @@ -249,15 +318,15 @@ const { data: paymentGateways } = await apiGatewaysGetCollection(); paymentMethodOptions = [ - ["all", $t("contributions.filters.paymentMethod.options.all")], + ["all", $t("pages.admin.charges.filters.paymentMethod.options.all")], ...(paymentGateways ?? []).map((g): [string, string] => [ g.name!, - $t(`contributions.filters.paymentMethod.options.${g.name}`), + $t(`pages.admin.charges.filters.paymentMethod.options.${g.name}`), ]), ]; - chargeStatusOptions = Object.entries($t("contributions.filters.chargeStatus.options")); - rangeAmountOptions = Object.entries($t("contributions.filters.rangeAmount.options")).sort( + chargeStatusOptions = Object.entries($t("pages.admin.charges.filters.chargeStatus.options")); + rangeAmountOptions = Object.entries($t("pages.admin.charges.filters.rangeAmount.options")).sort( ([a], [b]) => { const parseMin = (val: string) => val.includes("..") ? parseInt(val.split("..")[0]) : parseInt(val); @@ -281,7 +350,7 @@
diff --git a/src/components/Admin/DetailsRow.svelte b/src/components/Admin/DetailsRow.svelte index b5062bd6..b346d059 100644 --- a/src/components/Admin/DetailsRow.svelte +++ b/src/components/Admin/DetailsRow.svelte @@ -14,34 +14,46 @@ import Tooltip from "./Tooltip.svelte"; import { t } from "../../i18n/store"; import Copy from "../icons/Copy.svelte"; - import Grid from "../library/Grid.svelte"; import type { Tracking, Link } from "../../../src/openapi/client/index.ts"; + import type { Snippet } from "svelte"; + + const fallbackDate = { + date: "—", + time: "—", + fulltime: "—", + }; const { - id, - trackingCodes, - dataTimeCreated, - dataTimeUpdated, - platformLinks, - refundToWallet, - concept, + id = "-", + trackingCodes = [], + dataTimeCreated = fallbackDate, + dataTimeUpdated = fallbackDate, + platformLinks = [], + refundToWallet = "—", + concept = "", + details, + actions, + footer, } = $props<{ - id: string; - trackingCodes: Tracking[]; - dataTimeCreated: { + id?: string; + trackingCodes?: Tracking[]; + dataTimeCreated?: { date: string; time: string; fulltime: string; }; - dataTimeUpdated: { + dataTimeUpdated?: { date: string; time: string; fulltime: string; }; - platformLinks: Link[]; - refundToWallet: string; - concept: string; + platformLinks?: Link[]; + refundToWallet?: string; + concept?: string; + details?: Snippet; + actions?: Snippet; + footer?: Snippet; }>(); let trackingModal = $state(false); @@ -67,195 +79,208 @@ }); -
- -
-

{$t("contributions.grid.details.operationTime")}

- {dataTimeCreated.time} -
-
-

{$t("contributions.grid.details.trackingCodes.title")}

- +
+ {#if details} + {@render details()} + {:else} +
+
+

{$t("pages.admin.charges.details.operationTime")}

+ {dataTimeCreated.time} +
+
+

{$t("pages.admin.charges.details.trackingCodes.title")}

+ - - - - - {$t("contributions.grid.details.trackingCodes.headers.title")} - - - {$t("contributions.grid.details.trackingCodes.headers.trackingCode")} - - - - {#each trackingCodes as item} - - {item.title} - -
-
- {item.value} -
- -
+ + + {$t("pages.admin.charges.details.trackingCodes.headers.title")} + + + {$t( + "pages.admin.charges.details.trackingCodes.headers.trackingCode", + )} + + + + {#each trackingCodes as item} + + {item.title} + +
+
- - - -
- - - {/each} - -
-
-
-
-

{$t("contributions.grid.details.toWallet")}

-

{refundToWallet}

-
-
-

-

-
- -
-

{$t("contributions.grid.details.platformLinks.title")}

- - - - - - - - {$t("contributions.grid.details.platformLinks.headers.type")} - - - {$t("contributions.grid.details.platformLinks.headers.rel")} - - - {$t("contributions.grid.details.platformLinks.headers.href")} - - - - {#each platformLinks as item} - - - {item.type} - - - {item.rel} - - -
- - -
+ - - - - -
-
- {/each} -
-
-
-
+ + +
+ + + {/each} + + + +
+
+

{$t("pages.admin.charges.details.toWallet")}

+

{refundToWallet}

+
+ -
-

{$t("contributions.grid.details.estimatedFee")}

-

—

+
+

{$t("pages.admin.charges.details.platformLinks.title")}

+ + + + + + + + {$t("pages.admin.charges.details.platformLinks.headers.type")} + + + {$t("pages.admin.charges.details.platformLinks.headers.rel")} + + + {$t("pages.admin.charges.details.platformLinks.headers.href")} + + + + {#each platformLinks as item} + + + {item.type} + + + {item.rel} + + +
+ + + + +
+
+
+ {/each} +
+
+
+
+ +
+

{$t("pages.admin.charges.details.estimatedFee")}

+

—

+
+
+

{$t("pages.admin.charges.details.concept")}

+

{concept !== "" ? concept : "—"}

+
-
-

{$t("contributions.grid.details.concept")}

-

{concept !== "" ? concept : "—"}

-
-
- - + {/if} + + {#if actions} + {@render actions()} + {:else} + + {/if} + + {#if footer} + {@render footer()} + {:else} + + {/if}
diff --git a/src/components/Admin/ExportCsv.svelte b/src/components/Admin/ExportCsv.svelte index 078b2695..37f9b520 100644 --- a/src/components/Admin/ExportCsv.svelte +++ b/src/components/Admin/ExportCsv.svelte @@ -4,6 +4,8 @@ apiGatewayChargesGetCollection, type ApiGatewayChargesGetCollectionData, } from "../../openapi/client"; + import Download from "../icons/Download.svelte"; + import Spinner from "../icons/Spinner.svelte"; import Button from "../library/Button.svelte"; let { filters } = $props<{ @@ -12,7 +14,7 @@ let isExporting = $state(false); - let currentTarget = filters?.target || ""; + let currentTarget = $derived(filters?.target || ""); let selectedChargeStatus = ""; let selectedRangeAmount = ""; let selectedPaymentMethod = ""; @@ -107,7 +109,7 @@ } if (allData.length === 0) { - alert($t("contributions.export.noData") || "No se encontraron datos para exportar"); + alert($t("pages.admin.charges.export.noData") || "No se encontraron datos para exportar"); return; } @@ -116,8 +118,8 @@ .map(([key, value]) => `${key}-${value}`) .join("_"); - const baseFilename = $t("contributions.export.filename") || "gateway-charges"; - const itemsText = $t("contributions.export.itemsText") || "items"; + const baseFilename = $t("pages.admin.charges.export.filename") || "gateway-charges"; + const itemsText = $t("pages.admin.charges.export.itemsText") || "items"; const filename = `${baseFilename}_${timestamp}${filterParts ? "_" + filterParts : ""}_${totalItems}${itemsText}.csv`; const headers = Object.keys(allData[0]); @@ -157,7 +159,7 @@ window.URL.revokeObjectURL(url); } catch (error) { console.error("Error exporting CSV:", error); - alert($t("contributions.export.error")); + alert($t("pages.admin.charges.export.error")); } finally { isExporting = false; } @@ -169,40 +171,17 @@ kind="secondary" onclick={handleExportCSV} disabled={isExporting} - aria-label={$t("contributions.export.csv")} + aria-label={$t("pages.admin.charges.export.csv")} > {#if isExporting} - - - - + - {$t("contributions.export.exporting")} + {$t("pages.admin.charges.export.exporting")} {:else} - - - + - {$t("contributions.export.csv")} + {$t("pages.admin.charges.export.csv")} {/if} diff --git a/src/components/Admin/Filters.svelte b/src/components/Admin/Filters.svelte index d17d90ea..2b261f9b 100644 --- a/src/components/Admin/Filters.svelte +++ b/src/components/Admin/Filters.svelte @@ -1,9 +1,10 @@ @@ -85,12 +104,12 @@ diff --git a/src/components/App.svelte b/src/components/App.svelte index 2b69430e..4100212f 100644 --- a/src/components/App.svelte +++ b/src/components/App.svelte @@ -40,7 +40,7 @@
diff --git a/src/components/BaseCard.svelte b/src/components/BaseCard.svelte index 47018a6a..b6c4f03d 100644 --- a/src/components/BaseCard.svelte +++ b/src/components/BaseCard.svelte @@ -1,14 +1,22 @@
{@render children()}
diff --git a/src/components/Carousel.svelte b/src/components/Carousel.svelte index a58a169c..92d5b0e4 100644 --- a/src/components/Carousel.svelte +++ b/src/components/Carousel.svelte @@ -12,9 +12,14 @@ itemsPerGroup = 1, gap = 24, showDots = true, - class: className = "", + class: classes = "", mobileItemsToShow = 1, desktopItemsToShow = 3, + dotsPerItem = false, + lockItemWidth = true, + disableDrag = false, + navButtonTop = "50%", + centerNavButtons = true, children = null, onSelect = null, activeCard = $bindable(0), @@ -26,17 +31,27 @@ class?: ClassNameValue; mobileItemsToShow?: number; desktopItemsToShow?: number; + dotsPerItem?: boolean; + lockItemWidth?: boolean; + disableDrag?: boolean; + navButtonTop?: string; + centerNavButtons?: boolean; children?: any; onSelect?: ((card: ProjectUpdate) => void) | null; activeCard?: number; active?: Snippet; } = $props(); - const wrapperClasses = twMerge("relative w-full", className); + const wrapperClasses = twMerge("relative w-full", classes); + const navButtonClasses: ClassNameValue = twMerge( + "bg-variant1 absolute z-10 hidden h-10 w-10 rounded-full p-2 shadow-md disabled:opacity-50 lg:block", + centerNavButtons ? "-translate-y-1/2" : "", + ); let container: HTMLDivElement; let totalGroups = $state(0); + let totalItems = $state(0); let activeGroup = $state(0); let isAtStart = $state(true); let isAtEnd = $state(false); @@ -48,6 +63,23 @@ const observerMap = new Map(); + function getActualChildren() { + if (!container) return []; + + let actualChildren: HTMLElement[] = []; + const directChildren = Array.from(container.children) as HTMLElement[]; + + for (const child of directChildren) { + if (child.tagName.toLowerCase() === "astro-slot") { + actualChildren.push(...(Array.from(child.children) as HTMLElement[])); + } else { + actualChildren.push(child); + } + } + + return actualChildren; + } + function getCurrentItemsToShow(): number { if (!browser) return desktopItemsToShow; return window.innerWidth >= 1024 ? desktopItemsToShow : mobileItemsToShow; @@ -57,44 +89,48 @@ if (!browser || !container || !mounted) return; try { - const containerWidth = container.offsetWidth; + const actualChildren = getActualChildren(); - if (containerWidth === 0) { - setTimeout(updateItemWidths, 50); - return; + if (lockItemWidth) { + const containerWidth = container.offsetWidth; + + if (containerWidth === 0) { + setTimeout(updateItemWidths, 50); + return; + } + + const styles = getComputedStyle(container); + const paddingLeft = parseFloat(styles.paddingLeft); + const paddingRight = parseFloat(styles.paddingRight); + const available = containerWidth - paddingLeft - paddingRight; + + const visibleItems = getCurrentItemsToShow(); + const childWidth = (available - gap * (visibleItems - 1)) / visibleItems; + + actualChildren.forEach((child) => { + child.style.minWidth = `${childWidth}px`; + child.style.maxWidth = `${childWidth}px`; + child.style.width = `${childWidth}px`; + child.style.flex = "0 0 auto"; + child.style.overflow = "hidden"; + }); + } else { + actualChildren.forEach((child) => { + child.style.removeProperty("min-width"); + child.style.removeProperty("max-width"); + child.style.removeProperty("width"); + child.style.flex = "0 0 auto"; + child.style.overflow = "hidden"; + }); } - const styles = getComputedStyle(container); - const paddingLeft = parseFloat(styles.paddingLeft); - const paddingRight = parseFloat(styles.paddingRight); - const available = containerWidth - paddingLeft - paddingRight; - - const visibleItems = getCurrentItemsToShow(); - const childWidth = (available - gap * (visibleItems - 1)) / visibleItems; - - const directChildren = Array.from(container.children) as HTMLElement[]; - - for (const el of directChildren) { + for (const el of Array.from(container.children) as HTMLElement[]) { if (el.tagName.toLowerCase() === "astro-slot") { - const slotChildren = Array.from(el.children) as HTMLElement[]; - slotChildren.forEach((child) => { - child.style.minWidth = `${childWidth}px`; - child.style.maxWidth = `${childWidth}px`; - child.style.width = `${childWidth}px`; - child.style.flex = "0 0 auto"; - child.style.overflow = "hidden"; - }); el.style.minWidth = ""; el.style.maxWidth = ""; el.style.width = ""; el.style.flex = ""; el.style.display = "contents"; - } else { - el.style.minWidth = `${childWidth}px`; - el.style.maxWidth = `${childWidth}px`; - el.style.width = `${childWidth}px`; - el.style.flex = "0 0 auto"; - el.style.overflow = "hidden"; } } updateNavForShort(); @@ -107,16 +143,7 @@ if (!browser || !container || !intersectionObs || !mounted) return; try { - let actualChildren: HTMLElement[] = []; - const directChildren = Array.from(container.children) as HTMLElement[]; - - for (const child of directChildren) { - if (child.tagName.toLowerCase() === "astro-slot") { - actualChildren.push(...(Array.from(child.children) as HTMLElement[])); - } else { - actualChildren.push(child); - } - } + const actualChildren = getActualChildren(); intersectionObs.disconnect(); observerMap.clear(); @@ -127,16 +154,30 @@ }); totalGroups = Math.ceil(actualChildren.length / itemsPerGroup); + totalItems = actualChildren.length; updateNavForShort(); } catch (error) { console.warn("Carousel: Error observing visibility:", error); } } - function updateNavState(group: number) { - activeCard = group; - isAtStart = group === 0; - isAtEnd = group === totalGroups - 1; + function getPositionCount() { + return dotsPerItem ? totalItems : totalGroups; + } + + function getPositionFromItemIndex(index: number) { + return dotsPerItem ? index : Math.floor(index / itemsPerGroup); + } + + function getTargetItemIndex(position: number) { + return dotsPerItem ? position : position * itemsPerGroup; + } + + function updateNavState(position: number) { + activeCard = position; + activeGroup = position; + isAtStart = position === 0; + isAtEnd = position === getPositionCount() - 1; } function updateNavForShort() { @@ -144,51 +185,58 @@ try { isScrollable = container.scrollWidth > container.clientWidth; - isAtStart = true; - isAtEnd = !isScrollable; + isAtStart = activeCard === 0; + isAtEnd = !isScrollable || activeCard === getPositionCount() - 1; } catch (error) { console.warn("Carousel: Error updating navigation state:", error); } } - function scrollToGroup(i: number) { + async function scrollToGroup(i: number) { if (!browser || !container || !mounted) return; try { - let actualChildren: HTMLElement[] = []; - const directChildren = Array.from(container.children) as HTMLElement[]; - - for (const child of directChildren) { - if (child.tagName.toLowerCase() === "astro-slot") { - actualChildren.push(...(Array.from(child.children) as HTMLElement[])); - } else { - actualChildren.push(child); - } - } - programmaticScroll = true; updateNavState(i); - const target = actualChildren[i * itemsPerGroup]; - target?.scrollIntoView({ behavior: "smooth", inline: "start", block: "nearest" }); - setTimeout(() => { + await tick(); + updateItemWidths(); + const targetItemIndex = getTargetItemIndex(i); + const actualChildren = getActualChildren(); + const target = actualChildren[targetItemIndex]; + scrollToTarget(target, "smooth"); + + if (programmaticScrollTimeout) clearTimeout(programmaticScrollTimeout); + programmaticScrollTimeout = setTimeout(() => { + const settledTarget = getActualChildren()[targetItemIndex]; + scrollToTarget(settledTarget, "auto"); + updateNavForShort(); programmaticScroll = false; - }, 600); + }, 360); } catch (error) { console.warn("Carousel: Error scrolling to group:", error); programmaticScroll = false; } } + function scrollToTarget(target: HTMLElement | undefined, behavior: ScrollBehavior) { + if (!container || !target) return; + + const containerRect = container.getBoundingClientRect(); + const targetRect = target.getBoundingClientRect(); + const left = targetRect.left - containerRect.left + container.scrollLeft; + + container.scrollTo({ left, behavior }); + } + function scroll(dir: "left" | "right") { + const lastPosition = getPositionCount() - 1; const next = - dir === "right" - ? Math.min(activeCard + 1, totalGroups - 1) - : Math.max(activeCard - 1, 0); + dir === "right" ? Math.min(activeCard + 1, lastPosition) : Math.max(activeCard - 1, 0); scrollToGroup(next); } function handleStart(x: number) { - if (!browser || !container || !mounted) return; + if (disableDrag || !browser || !container || !mounted) return; isDragging = true; startX = x - container.offsetLeft; @@ -196,7 +244,7 @@ } function handleMove(x: number, ev: Event) { - if (!browser || !container || !mounted || !isDragging) return; + if (disableDrag || !browser || !container || !mounted || !isDragging) return; ev.preventDefault(); const walk = (x - container.offsetLeft - startX) * 1.5; @@ -204,6 +252,8 @@ } function endDrag() { + if (disableDrag) return; + isDragging = false; } @@ -212,6 +262,7 @@ let mutationObs: MutationObserver | undefined; let mounted = false; let programmaticScroll = false; + let programmaticScrollTimeout: ReturnType | undefined; onMount(() => { // Ensure we're in the browser and DOM is ready @@ -235,7 +286,7 @@ if (element === e.target) { minGroup = Math.min( minGroup, - Math.floor(index / itemsPerGroup), + getPositionFromItemIndex(index), ); break; } @@ -264,7 +315,7 @@ observeVisibility(); } }); - mutationObs.observe(container, { childList: true }); + mutationObs.observe(container, { childList: true, subtree: true }); window.addEventListener("resize", updateItemWidths); } catch (error) { @@ -279,6 +330,7 @@ if (intersectionObs) intersectionObs.disconnect(); if (resizeObs) resizeObs.disconnect(); if (mutationObs) mutationObs.disconnect(); + if (programmaticScrollTimeout) clearTimeout(programmaticScrollTimeout); if (browser) { window.removeEventListener("resize", updateItemWidths); } @@ -289,7 +341,8 @@
- {#if showDots && totalGroups > 1} + {#if showDots && getPositionCount() > 1}
- {#each Array(totalGroups) as _, i} + {#each Array(getPositionCount()) as _, i} + {#if value && onclear} + + {:else} + + {/if}
diff --git a/src/components/library/Share/CopyUrl.svelte b/src/components/library/Share/CopyUrl.svelte index c2a66425..0778704d 100644 --- a/src/components/library/Share/CopyUrl.svelte +++ b/src/components/library/Share/CopyUrl.svelte @@ -11,7 +11,7 @@ diff --git a/src/components/library/Share/ShareButton.svelte b/src/components/library/Share/ShareButton.svelte index 44fc0849..5f112448 100644 --- a/src/components/library/Share/ShareButton.svelte +++ b/src/components/library/Share/ShareButton.svelte @@ -1,5 +1,6 @@ -
+
+ + {$t("pages.project.view.tabs.updates.by")} + {author?.displayName} + +
-{/if} +
diff --git a/src/components/project/edit/AdminBudgetCard.svelte b/src/components/project/edit/AdminBudgetCard.svelte index 022428db..b6c8bea4 100644 --- a/src/components/project/edit/AdminBudgetCard.svelte +++ b/src/components/project/edit/AdminBudgetCard.svelte @@ -2,24 +2,27 @@ import BudgetModal from "./BudgetModal.svelte"; import CreateCard from "./CreateCard.svelte"; import { t } from "../../../i18n/store"; + import { apiProjectsGetCollectionUrl } from "../../../openapi/client/paths.gen"; import { addBudgetItem, deleteBudgetItem, updateBudgetItem, validationErrors, - } from "../../../stores/wizard-state"; + } from "../../../stores/drafts/projectDraft"; import { budgetTypeClasses } from "../../../utils/budgetColors"; import { formatCurrency } from "../../../utils/currencies"; import Button from "../../library/Button.svelte"; - import type { ProjectBudgetItem } from "../../../openapi/client"; + import type { Project, ProjectBudgetItem } from "../../../openapi/client"; let { + project, item, index, loading = $bindable(false), isCreateCard = false, }: { + project: Project; item: ProjectBudgetItem | null; index?: number; loading: boolean; @@ -31,12 +34,17 @@ function handleSaveBudgetItem(data: ProjectBudgetItem | null) { if (!data) return; + const projectIri = apiProjectsGetCollectionUrl + "/" + (project.slug ?? project.id); + const budgetItem = { + ...data, + project: item?.project ?? projectIri, + }; let errors; if (index !== undefined) { - errors = updateBudgetItem(index, data); + errors = updateBudgetItem(index, budgetItem, item?.deadline); } else { - errors = addBudgetItem(data); + errors = addBudgetItem(budgetItem); } if (errors === undefined) { @@ -67,6 +75,7 @@ title={$t("pages.project.edit.budget.add.title")} description={$t("pages.project.edit.budget.add.description")} variant="budget" + {project} onSave={handleSaveBudgetItem} onclick={() => (openModal = true)} bind:open={openModal} diff --git a/src/components/project/edit/BudgetModal.svelte b/src/components/project/edit/BudgetModal.svelte index e802f278..44bce08a 100644 --- a/src/components/project/edit/BudgetModal.svelte +++ b/src/components/project/edit/BudgetModal.svelte @@ -3,7 +3,7 @@ import DeleteModal from "./DeleteModal.svelte"; import { t } from "../../../i18n/store"; - import { validationErrors } from "../../../stores/wizard-state"; + import { validationErrors } from "../../../stores/drafts/projectDraft"; import { defaultCurrency } from "../../../utils/currencies"; import Button from "../../library/Button.svelte"; import Toast from "../../library/Toast.svelte"; diff --git a/src/components/project/edit/BudgetStep.svelte b/src/components/project/edit/BudgetStep.svelte index c86b6114..b44e4e18 100644 --- a/src/components/project/edit/BudgetStep.svelte +++ b/src/components/project/edit/BudgetStep.svelte @@ -2,12 +2,12 @@ import AdminBudgetCard from "./AdminBudgetCard.svelte"; import { t } from "../../../i18n/store"; import { type Project, type ProjectBudgetItem } from "../../../openapi/client"; + import { validateBudgetAmount } from "../../../stores/drafts/draftValidation"; import { + currentDraft, navigateToStep, - validateBudgetAmount, validationErrors, - wizardState, - } from "../../../stores/wizard-state"; + } from "../../../stores/drafts/projectDraft"; import { formatCurrency } from "../../../utils/currencies"; import Button from "../../library/Button.svelte"; import Grid from "../../library/Grid.svelte"; @@ -20,8 +20,12 @@ project: Project; } = $props(); - let minBudgetItems: ProjectBudgetItem[] = $state($wizardState.budgetItems.minimum); - let optBudgetItems: ProjectBudgetItem[] = $state($wizardState.budgetItems.optimum); + let minBudgetItems: ProjectBudgetItem[] = $state( + $currentDraft?.wizardForm.budgetItems.minimum || [], + ); + let optBudgetItems: ProjectBudgetItem[] = $state( + $currentDraft?.wizardForm.budgetItems.optimum || [], + ); let loading = $state(false); let showErrorToast = $state(false); @@ -30,7 +34,9 @@ * Simple navigation to next step (6) - validation happens on save/submit */ function handleContinue() { - const errors = validateBudgetAmount(); + if (!$currentDraft) return; + + const errors = validateBudgetAmount($currentDraft); if (Object.keys(errors).length > 0) { validationErrors.set(errors); @@ -43,8 +49,8 @@ async function loadBudgetItems() { loading = true; - minBudgetItems = $wizardState.budgetItems.minimum; - optBudgetItems = $wizardState.budgetItems.optimum; + minBudgetItems = $currentDraft?.wizardForm.budgetItems.minimum || []; + optBudgetItems = $currentDraft?.wizardForm.budgetItems.optimum || []; loading = false; } @@ -52,7 +58,7 @@ $effect(() => { if (Object.keys($validationErrors).length > 0) console.log("Errores de validación:", $validationErrors); - if ($wizardState) { + if ($currentDraft) { loadBudgetItems(); } }); @@ -91,10 +97,10 @@ {:else} {#each minBudgetItems as item, index} - + {/each} - + {/if} @@ -111,10 +117,10 @@ {:else} {#each optBudgetItems as item, i} - + {/each} - + {/if} diff --git a/src/components/project/edit/CampaignInfoStep.svelte b/src/components/project/edit/CampaignInfoStep.svelte index 1c60b632..d9e3364d 100644 --- a/src/components/project/edit/CampaignInfoStep.svelte +++ b/src/components/project/edit/CampaignInfoStep.svelte @@ -18,14 +18,13 @@ import RichTextEditor from "./RichTextEditor.svelte"; import VideoUrlInput from "./VideoUrlInput.svelte"; import { t } from "../../../i18n/store"; + import { validateCampaignInfo } from "../../../stores/drafts/draftValidation"; import { - wizardState, - updateCampaignInfo, + currentDraft, navigateToStep, - validateCampaignInfo, + updateCampaignInfo, type MediaImage, - type VideoEmbed, - } from "../../../stores/wizard-state"; + } from "../../../stores/drafts/projectDraft"; import Button from "../../library/Button.svelte"; import Grid from "../../library/Grid.svelte"; @@ -36,14 +35,24 @@ let { onContinue }: CampaignInfoStepProps = $props(); // Reactive values from store - const campaignInfo = $derived($wizardState.campaignInfo); + const campaignInfo = $derived( + $currentDraft?.wizardForm.campaignInfo ?? { + images: [], + video: undefined, + objectives: "", + legacy: "", + targetAudience: "", + team: "", + }, + ); /** * Handle Continue button * Simple navigation to next step - validation happens on save/submit */ function handleContinue() { - const errors = validateCampaignInfo(); + if (!$currentDraft) return; + const errors = validateCampaignInfo($currentDraft.wizardForm); if (Object.keys(errors).length === 0) { navigateToStep(3); @@ -63,6 +72,7 @@ * Handle image upload */ function handleImageUpload(image: MediaImage) { + if (!campaignInfo) return; updateCampaignInfo({ images: [...campaignInfo.images, image], }); @@ -80,29 +90,37 @@ /** * Handle video change */ - function handleVideoChange(video: VideoEmbed | null) { - updateCampaignInfo({ video }); + function handleVideoChange(video: string | null) { + updateCampaignInfo({ + video: video ?? "", + }); } /** * Handle objectives change */ function handleObjectivesChange(html: string) { - updateCampaignInfo({ objectives: html }); + updateCampaignInfo({ + objectives: html, + }); } /** * Handle legacy change */ function handleLegacyChange(html: string) { - updateCampaignInfo({ legacy: html }); + updateCampaignInfo({ + legacy: html, + }); } /** * Handle target audience change */ function handleTargetAudienceChange(html: string) { - updateCampaignInfo({ targetAudience: html }); + updateCampaignInfo({ + targetAudience: html, + }); } /** diff --git a/src/components/project/edit/CollaborationsStep.svelte b/src/components/project/edit/CollaborationsStep.svelte index 97435d78..aecfc2b8 100644 --- a/src/components/project/edit/CollaborationsStep.svelte +++ b/src/components/project/edit/CollaborationsStep.svelte @@ -1,16 +1,16 @@ @@ -49,10 +49,10 @@ {:else} {#each collabs as collab, index} - + {/each} - + {/if} diff --git a/src/components/project/edit/CollabsCard.svelte b/src/components/project/edit/CollabsCard.svelte index f6591ecf..2f4edcf5 100644 --- a/src/components/project/edit/CollabsCard.svelte +++ b/src/components/project/edit/CollabsCard.svelte @@ -7,18 +7,21 @@ deleteCollaboration, updateCollaboration, validationErrors, - type WizardCollaboration, - } from "../../../stores/wizard-state"; + } from "../../../stores/drafts/projectDraft"; import { renderMarkdown } from "../../../utils/renderMarkdown"; import Button from "../../library/Button.svelte"; + import type { Project, ProjectCollaboration } from "../../../openapi/client"; + let { + project, collab, index, loading = $bindable(false), isCreateCard = false, }: { - collab: WizardCollaboration | null; + project: Project; + collab: ProjectCollaboration | null; index?: number; loading: boolean; isCreateCard?: boolean; @@ -27,7 +30,7 @@ let openModal = $state(false); let showModalErrorToast = $state(false); - function handleSaveCollab(data: WizardCollaboration | null) { + function handleSaveCollab(data: ProjectCollaboration | null) { if (!data) return; let errors; @@ -62,6 +65,7 @@ {#if isCreateCard} void; + project: Project; + collab: ProjectCollaboration | null; + onSave: (data: ProjectCollaboration | null) => void; onDelete?: () => void; } = $props(); @@ -31,7 +35,9 @@ "border-secondary text-content items-center rounded-lg border bg-white p-4 text-base font-normal placeholder:opacity-48 focus:ring-0"; function handleSaveOrCreate() { - onSave({ title, description }); + const projectIri = apiProjectsGetCollectionUrl + "/" + (project.slug ?? project.id); + + onSave({ project: projectIri, title, description, isFulfilled: false }); } function handleDeleteClick() { diff --git a/src/components/project/edit/ConfigurationStep.svelte b/src/components/project/edit/ConfigurationStep.svelte index faa89629..6502f56e 100644 --- a/src/components/project/edit/ConfigurationStep.svelte +++ b/src/components/project/edit/ConfigurationStep.svelte @@ -11,7 +11,11 @@

@@ -51,26 +45,22 @@

{description}

-

+
{#if variant === "reward"} - + {:else if variant === "collab"} - + {:else if variant === "budget"} - + {/if} diff --git a/src/components/project/edit/GeoSelector.svelte b/src/components/project/edit/GeoSelector.svelte index 9a518dd4..f3a2371e 100644 --- a/src/components/project/edit/GeoSelector.svelte +++ b/src/components/project/edit/GeoSelector.svelte @@ -15,10 +15,10 @@
@@ -56,12 +105,13 @@

{$t("pages.project.edit.aboutYou.subtitle")}

- +
@@ -89,11 +139,14 @@ {$t("pages.project.edit.aboutYou.name")}

{$t("pages.project.edit.aboutYou.nameHelper")}

- +
touch("name")}> + +
@@ -102,14 +155,17 @@ {$t("pages.project.edit.aboutYou.taxId")}

{$t("pages.project.edit.aboutYou.taxIdHelper")}

- +
touch("taxId")}> + +
- + - +
@@ -160,14 +218,23 @@
{#each privateContacts as contact, i}
-
+
touch(`contact-${i}`)}>
setPreferred(i)} /> + {#if contact.type !== "email"} + + {/if}
{/each} +
- + + + +
+
+

+ {$t("pages.project.edit.aboutYou.paymentData.title")} +

+

+ {$t("pages.project.edit.aboutYou.paymentData.subtitle")} +

+
+
+
touch("iban")}> + +
+
+

+ {$t("pages.project.edit.aboutYou.paymentData.bankCertificate")} +

+

+ {$t("pages.project.edit.aboutYou.paymentData.bankCertificateHelper")} +

+ +
+
+
diff --git a/src/components/project/edit/RewardsCard.svelte b/src/components/project/edit/RewardsCard.svelte index 41a5a039..e471f61b 100644 --- a/src/components/project/edit/RewardsCard.svelte +++ b/src/components/project/edit/RewardsCard.svelte @@ -7,20 +7,23 @@ deleteReward, updateReward, validationErrors, - type WizardReward, - } from "../../../stores/wizard-state"; + } from "../../../stores/drafts/projectDraft"; import UnitIcon from "../../../svgs/UnitIcon.svelte"; import { formatCurrency } from "../../../utils/currencies"; import { renderMarkdown } from "../../../utils/renderMarkdown"; import Button from "../../library/Button.svelte"; + import type { Project, ProjectReward } from "../../../openapi/client"; + let { + project, reward, index, loading = $bindable(false), isCreateCard = false, }: { - reward: WizardReward | null; + project: Project; + reward: ProjectReward | null; index?: number; loading: boolean; isCreateCard?: boolean; @@ -29,7 +32,7 @@ let openModal = $state(false); let showModalErrorToast = $state(false); - function handleSaveReward(data: WizardReward | null) { + function handleSaveReward(data: ProjectReward | null) { if (!data) return; let errors; @@ -64,6 +67,7 @@ {#if isCreateCard} void; + project: Project; + reward: ProjectReward | null; + onSave: (data: ProjectReward | null) => void; onDelete?: () => void; } = $props(); @@ -40,7 +44,10 @@ "border-secondary text-content items-center rounded-lg border bg-white p-4 text-base font-normal placeholder:opacity-48 focus:ring-0"; function handleSaveOrCreate() { + const projectIri = apiProjectsGetCollectionUrl + "/" + (project.slug ?? project.id); + onSave({ + project: projectIri, title, description, money: { diff --git a/src/components/project/edit/RewardsStep.svelte b/src/components/project/edit/RewardsStep.svelte index e9bdd9d9..20a41a3e 100644 --- a/src/components/project/edit/RewardsStep.svelte +++ b/src/components/project/edit/RewardsStep.svelte @@ -1,12 +1,16 @@ @@ -42,10 +46,10 @@ {:else} {#each rewards as reward, index} - + {/each} - + {/if} diff --git a/src/components/project/edit/VideoUrlInput.svelte b/src/components/project/edit/VideoUrlInput.svelte index d3ab055c..a829d8a8 100644 --- a/src/components/project/edit/VideoUrlInput.svelte +++ b/src/components/project/edit/VideoUrlInput.svelte @@ -1,54 +1,3 @@ -
{#if !video}
-
- {:else if embedPreview} + {:else}
- -
- +
+ {video}
- diff --git a/src/components/search/SearchButton.svelte b/src/components/search/SearchButton.svelte index 5c00ebfd..cbfb9c16 100644 --- a/src/components/search/SearchButton.svelte +++ b/src/components/search/SearchButton.svelte @@ -26,7 +26,7 @@ Supports: primary (Aplicar filtros), secondary (Buscar), ghost (Cerrar filtros) // Base button classes - matching Figma design exactly const baseClasses = - "inline-flex items-center justify-center font-body font-bold transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed gap-2"; + "inline-flex items-center justify-center font-body font-bold transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed gap-2"; // Size classes - matching Figma specifications exactly const sizeClasses = { diff --git a/src/components/search/SearchFilters.svelte b/src/components/search/SearchFilters.svelte index 4e3409f0..2b950046 100644 --- a/src/components/search/SearchFilters.svelte +++ b/src/components/search/SearchFilters.svelte @@ -18,9 +18,9 @@ Integrated with searchStore for state management and URL synchronization interface Props { locale?: string; initialFilters?: { - query?: string; - statusFilter?: string; - categories?: string[]; + title?: string; + status?: string; + "categories[]"?: string[]; }; } @@ -36,9 +36,9 @@ Integrated with searchStore for state management and URL synchronization // Initialize with server-provided filters if available (without triggering search) if (initialFilters) { searchStore.initializeFilters({ - query: initialFilters.query || "", - statusFilter: initialFilters.statusFilter || "", - categories: initialFilters.categories || [], + title: initialFilters.title || "", + status: initialFilters.status || "", + "categories[]": initialFilters["categories[]"] || [], }); } }); @@ -72,19 +72,19 @@ Integrated with searchStore for state management and URL synchronization
updateFilters({ query })} + value={$searchFilters.title} + onSearch={(title) => updateFilters({ title })} onEnter={handleSearch} onClear={handleSearch} placeholder={$t("pages.search.input.placeholder")} @@ -104,18 +104,16 @@ Integrated with searchStore for state management and URL synchronization
- {#if !filtersOpen} - - - {$t("pages.search.filters.show")} - - {/if} + + + {filtersOpen ? $t("pages.search.filters.close") : $t("pages.search.filters.show")} +
@@ -125,8 +123,8 @@ Integrated with searchStore for state management and URL synchronization updateFilters({ statusFilter: value })} + selectedValue={$searchFilters.status} + onSelect={(value) => updateFilters({ status: value })} data-testid="status-filter" />
@@ -134,8 +132,8 @@ Integrated with searchStore for state management and URL synchronization
updateFilters({ categories })} + selectedCategories={$searchFilters["categories[]"] || []} + onCategoryChange={(categories) => updateFilters({ "categories[]": categories })} data-testid="category-filter" />
@@ -153,17 +151,6 @@ Integrated with searchStore for state management and URL synchronization > {$t("pages.search.filters.apply")} - - - - - {$t("pages.search.filters.close")} -
{/if}
diff --git a/src/components/search/SearchInput.svelte b/src/components/search/SearchInput.svelte index 58069e30..08bcda0c 100644 --- a/src/components/search/SearchInput.svelte +++ b/src/components/search/SearchInput.svelte @@ -1,33 +1,29 @@ - - -
- - - - - {#if searchQuery} - - {/if} - - -
-
- {$t("pages.search.input.label")} -
-
-
- - + onEnter?.() || onSearch?.(searchQuery)} + onclear={clearSearch} + data-testid={dataTestId} + class="transition-colors focus-within:border-[#855a96] {className}" +/> diff --git a/src/components/search/SearchResultsClient.svelte b/src/components/search/SearchResultsClient.svelte index 581db254..5d4fba70 100644 --- a/src/components/search/SearchResultsClient.svelte +++ b/src/components/search/SearchResultsClient.svelte @@ -32,9 +32,9 @@ Manages real-time filtering of campaigns without page reloads initialProjects: Project[]; ariaLiveRegion?: "polite" | "assertive" | "off"; initialFilters?: { - query?: string; - statusFilter?: string; - categories?: string[]; + title?: string; + status?: string; + "categories[]"?: string[]; }; hasInitialSearch?: boolean; } @@ -93,10 +93,14 @@ Manages real-time filtering of campaigns without page reloads const filters = $searchFilters; - // Add search parameters to URL - if (filters.query) params.set("q", filters.query); - if (filters.statusFilter) params.set("status", filters.statusFilter); - if (filters.categories.length > 0) params.set("categories", filters.categories.join(",")); + // Add search parameters to URL using API field names + if (filters.title) params.set("title", filters.title); + if (filters.status) params.set("status", filters.status); + if ((filters["categories[]"]?.length ?? 0) > 0) { + (filters["categories[]"] as string[]).forEach((cat) => { + params.append("categories[]", cat); + }); + } // Update URL using History API to avoid navigation const newUrl = `${url.pathname}${params.toString() ? "?" + params.toString() : ""}`; @@ -129,9 +133,9 @@ Manages real-time filtering of campaigns without page reloads if (initialFilters && hasInitialSearch) { // Initialize store with server-side filters first searchStore.initializeFilters({ - query: initialFilters.query || "", - statusFilter: initialFilters.statusFilter || "", - categories: initialFilters.categories || [], + title: initialFilters.title || "", + status: initialFilters.status || "", + "categories[]": initialFilters["categories[]"] || [], }); // Trigger API search with the URL parameters diff --git a/src/firewall/access-control.ts b/src/firewall/access-control.ts index 77d6ad60..f4bd6f6d 100644 --- a/src/firewall/access-control.ts +++ b/src/firewall/access-control.ts @@ -3,4 +3,13 @@ export type ControlItem = { roles: string[]; }; -export const ACL: ControlItem[] = [{ path: "/admin", roles: ["ROLE_ADMIN"] }]; +export const ACL: ControlItem[] = [ + { + path: "/project/.*/edit", + roles: ["ROLE_USER"], + }, + { + path: "/admin", + roles: ["ROLE_ADMIN"], + }, +]; diff --git a/src/firewall/index.ts b/src/firewall/index.ts index 4bea9c05..23d7b9dd 100644 --- a/src/firewall/index.ts +++ b/src/firewall/index.ts @@ -1,6 +1,8 @@ import { ACL, type ControlItem } from "./access-control"; import { isSupportedLocale } from "../i18n/locales"; +const regexCache = new Map(); + function normalizePath(pathname: string): string { const path = pathname.replace(/\/+$/, ""); @@ -13,8 +15,42 @@ function normalizePath(pathname: string): string { return "/" + segments.join("/"); } -function matchesPath(pathname: string, basePath: string): boolean { - return pathname === basePath || pathname.startsWith(basePath + "/"); +function isValidRegex(pattern: string): boolean { + try { + new RegExp(pattern); + return true; + } catch { + return false; + } +} + +function getRegex(path: string): RegExp { + if (!regexCache.has(path)) { + regexCache.set(path, new RegExp(`^${path}$`)); + } + + return regexCache.get(path)!; +} + +/** + * Checks if a pathname matches a given path. + * @param pathname The pathname to check, e.g. "/admin/dashboard" + * @param path The path to match against, which can be an exact path (e.g. "/admin") or a regex pattern (e.g. "/admin/.*") + * @returns True if the pathname matches the path, false otherwise + */ +function matchesPath(pathname: string, path: string): boolean { + // Exact match + if (pathname === path) { + return true; + } + + // Dynamic regex route + if (isValidRegex(path)) { + return getRegex(path).test(pathname); + } + + // Nested routes + return pathname.startsWith(path + "/"); } export function getMatchingACL(pathname: string): ControlItem | null { @@ -29,6 +65,16 @@ export function getMatchingACL(pathname: string): ControlItem | null { return null; } +/** + * Checks if a user is authorized to access a control item. + * @param control The control item (ACL) to check authorization for + * @param roles The roles of the current user + * @returns True if the user is authorized, false otherwise + */ export function isAuthorized(control: ControlItem, roles: string[]): boolean { + if (control.roles.length === 0) { + return true; + } + return control.roles.some((role) => roles.includes(role)); } diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json index 0a06ef1f..421688da 100644 --- a/src/i18n/locales/ca.json +++ b/src/i18n/locales/ca.json @@ -843,6 +843,8 @@ "content-footer": { "lastEdited": "Última modificació: {{date}} {{time}}", "downloadDetails": "Descarrega el detall", + "downloadCertificates": "Descarrega certificats", + "downloadPdf": "Descarrega PDF", "annotations": "{{annotations}} Anotacions" } }, diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 1c6a93be..dea1f438 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -843,6 +843,8 @@ "content-footer": { "lastEdited": "Last modification: {{date}} {{time}}", "downloadDetails": "Download details", + "downloadCertificates": "Download certificates", + "downloadPdf": "Download PDF", "annotations": "{{annotations}} annotations" } }, diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 95723ef8..cda73b20 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -1,6 +1,6 @@ { "common": { - "_": "Global UI translations (buttons, labels, etc.)", + "_": "Traducciones globales de la interfaz (botones, etiquetas, etc.)", "greeting": "Hola", "farewell": "Adiós", "donate": "Donar", @@ -17,16 +17,22 @@ "remove": "Eliminar", "textPlaceholder": "Escribe aquí", "remember": "Recordar", + "search": "Buscar", + "searchEtc": "Buscar...", "countdown": { "remaining": "Quedan", "expired": "Campaña finalizada" }, "login": "Iniciar Sesión", "goHome": "Volver a inicio", - "viewAll": "Ver todo" + "viewAll": "Ver todo", + "noData": "No hay datos disponibles", + "tooltip": { + "copied": "¡Copiado!" + } }, "domain": { - "_": "Business concepts (project, reward, contribution, etc.)", + "_": "Conceptos de negocio (proyecto, recompensa, contribución, etc.)", "header": { "categories": "Proyectos" }, @@ -62,6 +68,41 @@ "completed": "Completadas" } }, + "gatewayCheckout": { + "paymentMethod": "Método", + "payments": { + "tpv": "Tarjeta", + "paypal": "Paypal", + "stripe": "Stripe", + "wallet": "Monedero" + } + }, + "charges": { + "status": { + "to_charge": "Por cobrar", + "in_charge": "Cobrado", + "to_refund": "Por reembolsar", + "refunded": "Reembolsado", + "to_wallet": "Por reembolsar a monedero", + "walleted": "Reembolsado a monedero" + }, + "refund": { + "to_wallet": "Sí", + "to_gateway": "No" + }, + "entityLabels": { + "projects": "Proyectos", + "users": "Usuarios", + "tipjars": "Botes de propina", + "tipjar-id": "ID del bote de propina" + }, + "lastContributions": "Últimos aportes:", + "totalizers": { + "totalCharges": "Total aportes:", + "totalTips": "Total propinas:", + "totalFees": "Comisiones totales:" + } + }, "review": { "risks": { "low": "Riesgo bajo", @@ -71,7 +112,7 @@ } }, "pages": { - "_": "Page-specific content (/home, /search, /project/[id], etc.)", + "_": "Contenido específico de páginas (/home, /search, /project/[id], etc.)", "home": { "banner": { "title": "¡Renovamos Goteo!", @@ -531,6 +572,17 @@ "twitter": "Inserta tu cuenta de X/Twitter", "linkedin": "Inserta tu cuenta de LinkedIn" }, + "paymentData": { + "title": "Datos de pago", + "subtitle": "Indica los datos bancarios necesarios para gestionar los pagos de la campaña.", + "iban": "IBAN", + "ibanHelper": "Introduce el IBAN de la cuenta bancaria donde recibirás los fondos recaudados.", + "ibanPlaceholder": "ES00 0000 0000 0000 0000 0000", + "bankCertificate": "Certificado de titularidad de cuenta", + "bankCertificateHelper": "Adjunta el documento que acredita la titularidad de la cuenta bancaria.", + "bankCertificateAriaLabel": "Subir certificado de titularidad", + "ibanInvalid": "El formato del IBAN no es válido" + }, "continue": "Siguiente paso" } }, @@ -613,7 +665,8 @@ "length": "aportes", "title": "Donaciones anónimas", "description": "No todas las personas heróicas llevan capa ni tampoco sienten la necesidad de mostrar su identidad." - } + }, + "loadMore": "Ver más" } }, "rewards": { @@ -848,7 +901,151 @@ }, "admin": { "charges": { - "title": "Cargos" + "title": "Aportes", + "description": "Aquí tienes las últimas contribuciones a campañas, puedes ordenarlas y filtrarlas como quieras.", + "headers": { + "target": "Destino", + "amount": "Importe", + "origin": "Origen", + "paymentMethod": "Método", + "date": "Fecha", + "chargeStatus": "Estado de la operación", + "refundToWallet": "A Monedero" + }, + "noData": "No hay datos disponibles", + "details": { + "operationTime": "Hora de la operación", + "trackingCodes": { + "title": "Códigos de seguimiento", + "headers": { + "title": "Título", + "trackingCode": "Código de seguimiento" + } + }, + "toWallet": "A monedero", + "platformLinks": { + "title": "Enlace a la plataforma", + "headers": { + "type": "Tipo de Enlace", + "rel": "Relación", + "href": "Url" + } + }, + "estimatedFee": "Comisión estimada", + "concept": "Concepto" + }, + "actions": { + "refundToWallet": "Devolución a monedero", + "refundToUser": "Devolución a usuario", + "changeUser": "Cambiar de usuario", + "manageReward": "Gestionar recompensa" + }, + "filters": { + "order": { + "title": "Ordenar por:", + "options": { + "date-desc": "Fecha (más reciente primero)", + "date-asc": "Fecha (más antigua primero)", + "amount-desc": "Importe (mayor a menor)", + "amount-asc": "Importe (menor a mayor)", + "status-desc": "Estado (Z-A)", + "status-asc": "Estado (A-Z)" + } + }, + "itemsPerPage": { + "title": "Líneas por página:", + "options": { + "10": "10", + "20": "20", + "30": "30", + "50": "50" + } + }, + "search": { + "placeholder": "Buscar...", + "btnLabel": "Buscar", + "resultsFound": "{{totalItems}} resultados para \"{{query}}\"", + "noResults": "No se han encontrado resultados" + }, + "paymentMethod": { + "title": "Método de pago", + "options": { + "all": "Todos", + "paypal": "Paypal", + "stripe": "Stripe", + "wallet": "Monedero" + } + }, + "rangeAmount": { + "title": "Selecciona importe", + "options": { + "500000": "+ 5.000€", + "all": "Todos", + "000..10000": "0€ - 100€", + "10000..50000": "100€ - 500€", + "50000..100000": "500€ - 1.000€", + "100000..500000": "1.000€ - 5.000€" + } + }, + "dateRange": { + "initDate": "Fecha Inicio", + "endDate": "Fecha Fin", + "from": "Desde", + "to": "Hasta", + "errors": { + "invalidDate": "Fecha no válida", + "invalidRange": "La fecha de inicio no puede ser mayor que la fecha fin." + } + }, + "chargeStatus": { + "title": "Estado de Aporte", + "options": { + "all": "Todos", + "to_charge": "Por cobrar", + "in_charge": "Cobrado", + "to_refund": "Por reembolsar", + "refunded": "Reembolsado", + "to_wallet": "Por reembolsar a monedero", + "walleted": "Reembolsado a monedero" + } + }, + "projectStatus": { + "title": "Estado de la campaña", + "options": { + "all": "Todas", + "active": "Activas", + "finished": "Finalizadas", + "cancelled": "Canceladas" + } + }, + "btns": { + "openFilters": "Filtros", + "closeFilters": "Cerrar filtros", + "reset": "Reiniciar filtros", + "apply": "Aplicar filtros" + } + }, + "pagination": { + "showing": "Mostrando {{items}} de {{total}}", + "unloaded": "Mostrando...", + "noResults": "No hay resultados" + }, + "export": { + "csv": "Exportar CSV", + "exporting": "Exportando...", + "error": "Error al exportar el archivo CSV. Por favor, inténtalo de nuevo.", + "errorAuth": "Error de autenticación. Por favor, inicia sesión de nuevo.", + "filename": "gateway-charges", + "itemsText": "items", + "noData": "No se encontraron datos para exportar" + }, + "downloadButtons": { + "details": "Descarga detalle", + "certificates": "Descarga certificados", + "pdf": "Descarga PDF" + }, + "lastEdited": "Última modificación: {{date}} {{time}}", + "annotations": "{{annotations}} Anotaciones" } }, "static": { @@ -859,7 +1056,7 @@ } }, "system": { - "_": "System messages (errors, notifications, validation, etc.)", + "_": "Mensajes del sistema (errores, notificaciones, validación, etc.)", "loading": "Cargando...", "notImplemented": "Esta funcionalidad aún no está implementada. Estamos trabajando en ello, ¡gracias por tu paciencia!", "error": { @@ -878,7 +1075,7 @@ "constraint": { "file": { "maxAllowedSize": "Tamaño máximo permitido 10MB", - "supportedTypes": "Archivos compatibles: .png, .jpg" + "supportedTypes": "Archivos compatibles: {{ types }}" } }, "validation": { @@ -1105,184 +1302,6 @@ "createProject": "Crea tu proyecto", "goToProfile": "Ir a Perfil" }, - "contributions": { - "title": "Aportes", - "description": "Aquí tienes las últimas contribuciones a campañas, puedes ordenarlas y filtrarlas como quieras.", - "table": { - "headers": { - "target": "Destino", - "amount": "Importe", - "origin": "Origen", - "paymentMethod": "Método", - "date": "Fecha", - "chargeStatus": "Estado de la operación", - "refundToWallet": "A Monedero" - }, - "rows": { - "payments": { - "tpv": "Tarjeta", - "paypal": "Paypal", - "stripe": "Stripe", - "wallet": "Monedero" - }, - "status": { - "to_charge": "Por cobrar", - "in_charge": "Cobrado", - "to_refund": "Por reembolsar", - "refunded": "Reembolsado", - "to_wallet": "Por reembolsar a monedero", - "walleted": "Reembolsado a monedero" - }, - "refund": { - "to_wallet": "Sí", - "to_gateway": "No" - }, - "noData": "No hay datos disponibles" - } - }, - "grid": { - "details": { - "operationTime": "Hora de la operación", - "trackingCodes": { - "title": "Códigos de seguimiento", - "headers": { - "title": "Título", - "trackingCode": "Código de seguimiento" - } - }, - "toWallet": "A monedero", - "platformLinks": { - "title": "Enlace a la plataforma", - "headers": { - "type": "Tipo de Enlace", - "rel": "Relación", - "href": "Url" - } - }, - "estimatedFee": "Comisión estimada", - "concept": "Concepto" - }, - "actions": { - "refundToWallet": "Devolución a monedero", - "refundToUser": "Devolución a usuario", - "changeUser": "Cambiar de usuario", - "manageReward": "Gestionar recompensa" - }, - "content-footer": { - "lastEdited": "Última modificación: {{date}} {{time}}", - "downloadDetails": "Descarga detalle", - "annotations": "{{annotations}} Anotaciones" - } - }, - "filters": { - "order": { - "title": "Ordenar por:", - "options": { - "date-desc": "Fecha (más reciente primero)", - "date-asc": "Fecha (más antigua primero)", - "amount-desc": "Importe (mayor a menor)", - "amount-asc": "Importe (menor a mayor)", - "status-desc": "Estado (Z-A)", - "status-asc": "Estado (A-Z)" - } - }, - "itemsPerPage": { - "title": "Líneas por página:", - "options": { - "10": "10", - "20": "20", - "30": "30", - "50": "50" - } - }, - "search": { - "placeholder": "Buscar...", - "btnLabel": "Buscar", - "resultsFound": "{{totalItems}} resultados para \"{{query}}\"", - "noResults": "No se han encontrado resultados", - "labels": { - "projects": "Proyectos", - "users": "Usuarios", - "tipjars": "Botes de propina", - "tipjar-id": "ID del bote de propina" - } - }, - "paymentMethod": { - "title": "Método de pago", - "options": { - "all": "Todos", - "paypal": "Paypal", - "stripe": "Stripe", - "wallet": "Monedero" - } - }, - "rangeAmount": { - "title": "Selecciona importe", - "options": { - "500000": "+ 5.000€", - "all": "Todos", - "000..10000": "0€ - 100€", - "10000..50000": "100€ - 500€", - "50000..100000": "500€ - 1.000€", - "100000..500000": "1.000€ - 5.000€" - } - }, - "dateRange": { - "initDate": "Fecha Inicio", - "endDate": "Fecha Fin", - "from": "Desde", - "to": "Hasta", - "errors": { - "invalidDate": "Fecha no válida", - "invalidRange": "La fecha de inicio no puede ser mayor que la fecha fin." - } - }, - "chargeStatus": { - "title": "Estado de Aporte", - "options": { - "all": "Todos", - "to_charge": "Por cobrar", - "in_charge": "Cobrado", - "to_refund": "Por reembolsar", - "refunded": "Reembolsado", - "to_wallet": "Por reembolsar a monedero", - "walleted": "Reembolsado a monedero" - } - }, - "projectStatus": { - "title": "Estado de la campaña", - "options": { - "all": "Todas", - "active": "Activas", - "finished": "Finalizadas", - "cancelled": "Canceladas" - } - }, - "btns": { - "openFilters": "Filtros", - "closeFilters": "Cerrar filtros", - "reset": "Reiniciar filtros", - "apply": "Aplicar filtros" - } - }, - "pagination": { - "showing": "Mostrando {{items}} de {{total}}", - "unloaded": "Mostrando...", - "noResults": "No hay resultados" - }, - "tootip": { - "copied": "¡Copiado!" - }, - "export": { - "csv": "Exportar CSV", - "exporting": "Exportando...", - "error": "Error al exportar el archivo CSV. Por favor, inténtalo de nuevo.", - "errorAuth": "Error de autenticación. Por favor, inicia sesión de nuevo.", - "filename": "gateway-charges", - "itemsText": "items", - "noData": "No se encontraron datos para exportar" - } - }, "admin": { "projects": { "totalizers": { @@ -1291,14 +1310,6 @@ "totalPaid": "Total pagado:", "totalUnpaid": "Falta por pagar:" } - }, - "charges": { - "lastContributions": "Últimos aportes:", - "totalizers": { - "totalCharges": "Total aportes:", - "totalTips": "Total propinas:", - "totalFees": "Comisiones totales:" - } } }, "footer": { @@ -1347,6 +1358,10 @@ }, "profile": { "share": "Compartir", + "shareModal": { + "title": "Comparte este perfil", + "description": "Puedes copiar el enlace para enviarlo y también compartirlo en Facebook o X." + }, "subscribe": "Subscríbete", "tabs": { "about": "Sobre el perfil", @@ -1359,6 +1374,7 @@ "organizationIntro": "Organización comprometida con el cambio social", "bioSample": "Con una trayectoria dedicada al ecosistema de crowdfunding y financiación colectiva, {{name}} se ha consolidado como un referente en la creación de proyectos colaborativos y la movilización de recursos. Su visión se centra en potenciar iniciativas que transforman realidades locales, combinando estrategias innovadoras con un profundo compromiso por la participación ciudadana y la equidad social.", "noProjects": "No hay proyectos impulsados aún.", + "noBio": "Todavía no hay información sobre este perfil.", "donorType": { "fan": { "title": "Fan", @@ -1464,4 +1480,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/pages/[...locale]/admin/charges.astro b/src/pages/[...locale]/admin/charges.astro index d22e2622..284132a2 100644 --- a/src/pages/[...locale]/admin/charges.astro +++ b/src/pages/[...locale]/admin/charges.astro @@ -11,9 +11,9 @@ import Contributions from "../../../components/Admin/Contributions.svelte";

- {t("contributions.title")} + {t("pages.admin.charges.title")}

-

{t("contributions.description")}

+

{t("pages.admin.charges.description")}

diff --git a/src/pages/[...locale]/checkout/post-payment.astro b/src/pages/[...locale]/checkout/post-payment.astro index f977e074..e62e9c7b 100644 --- a/src/pages/[...locale]/checkout/post-payment.astro +++ b/src/pages/[...locale]/checkout/post-payment.astro @@ -15,18 +15,20 @@ import type { Campaign } from "../../../types/campaign"; const { t, lang, session } = Astro.locals; -const mapProjectToCard = (project: Project): Campaign => ({ - slug: project.slug || "", - title: project.title || "", - subtitle: project.subtitle || "", - description: project.description || "", - image: project.video?.thumbnail || "/images/placeholder-project.jpg", - obtained: project.budget?.minimum?.money || { amount: 0, currency: "EUR" }, - minimum: project.budget?.minimum?.money || { amount: 0, currency: "EUR" }, - categories: project.categories || [], - territory: project.territory || "", - size: "small", -}); +const mapProjectToCard = (project: Project) => + ({ + id: project.slug || "", + slug: project.slug || "", + title: project.title || "", + subtitle: project.subtitle || "", + description: project.description || "", + image: project.video?.thumbnail || "/images/placeholder-project.jpg", + obtained: project.budget?.minimum?.money || { amount: 0, currency: "EUR" }, + minimum: project.budget?.minimum?.money || { amount: 0, currency: "EUR" }, + categories: project.categories || [], + territory: project.territory || "", + size: "small", + }) as unknown as Campaign; let donatedProjects: Campaign[] = []; let suggestedProjects: Campaign[] = []; diff --git a/src/pages/[...locale]/create/CreateProjectForm.svelte b/src/pages/[...locale]/create/CreateProjectForm.svelte index b7228f8a..24d58f98 100644 --- a/src/pages/[...locale]/create/CreateProjectForm.svelte +++ b/src/pages/[...locale]/create/CreateProjectForm.svelte @@ -1,15 +1,6 @@
-
+

{$t("pages.project.create.title")} @@ -227,8 +298,10 @@ handleFieldBlur("title")} + onInput={(e) => handleFieldChange("title", (e.target as HTMLInputElement).value)} />
@@ -275,7 +350,7 @@

handleFieldBlur("release")} @@ -290,38 +365,50 @@ {#if submitSuccess}

- Project draft created successfully! (Dev mode simulation) + {$t("pages.project.create.submitSuccess")}

{/if}
- handleFieldChange("termsAccepted", $draft.termsAccepted)} - > + toggleTermsAcceptance}> {$t("pages.project.create.terms.label")}

-

- -

- {$draft.title || $t("pages.project.create.description.titlePlaceholder")} + +

+ {$currentDraft?.createProject.title || + $t("pages.project.create.description.titlePlaceholder")}

-

- {$draft.subtitle || $t("pages.project.create.description.subtitlePlaceholder")} +

+ {$currentDraft?.createProject.subtitle || + $t("pages.project.create.description.subtitlePlaceholder")}

{$t("pages.project.create.budgetPreview")}

- {formatCurrency($draft.budget)} + {formatCurrency( + $currentDraft?.wizardForm.budget?.minimum?.money?.amount || 0, + "EUR", + )}

diff --git a/src/pages/[...locale]/create/project-draft.ts b/src/pages/[...locale]/create/project-draft.ts deleted file mode 100644 index 3c1f2dff..00000000 --- a/src/pages/[...locale]/create/project-draft.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { derived, writable, get } from "svelte/store"; -import { z } from "zod"; - -import { projectCreationSchema } from "./validation"; - -export interface ProjectDraft { - title: string; - subtitle: string; - categories: string[]; - budget: number; - release: Date; - termsAccepted: boolean; -} - -// Default release date: 28 days from now -const getDefaultReleaseDate = () => { - const date = new Date(); - date.setDate(date.getDate() + 28); - return date; -}; - -export const draft = writable({ - title: "", - subtitle: "", - categories: [], - budget: 0, // Budget is displayed but not validated - release: getDefaultReleaseDate(), - termsAccepted: false, -}); - -/** - * Validation errors store. - * Maps field names to their error messages (translation keys). - */ -export const validationErrors = writable>({}); - -/** - * Tracks which fields have been touched (blurred). - * Only touched fields will show validation errors. - */ -export const touchedFields = writable>(new Set()); - -/** - * Derived store that indicates if the form is valid. - * Returns true only when: - * 1. All required fields have values - * 2. There are no validation errors - */ -export const isFormValid = derived([draft, validationErrors], ([$draft, $errors]) => { - // Check if there are any validation errors - if (Object.keys($errors).length > 0) { - return false; - } - - // Check that required fields have values - const hasTitle = $draft.title.trim().length > 0; - const hasSubtitle = $draft.subtitle.trim().length > 0; - const hasCategories = $draft.categories.length > 0; - const hasTerms = $draft.termsAccepted === true; - - return hasTitle && hasSubtitle && hasCategories && hasTerms; -}); - -/** - * Validates a single field and updates the validation errors store. - * Uses Zod's type system with proper type guards to avoid unsafe type assertions. - * @param fieldName - The name of the field to validate - * @param value - The current value of the field - */ -export function validateField(fieldName: keyof ProjectDraft, value: unknown) { - // Type guard to check if field exists in schema - type SchemaFields = keyof typeof projectCreationSchema.shape; - - if (!(fieldName in projectCreationSchema.shape)) { - // Field not in schema, skip validation - return; - } - - // Now we know fieldName exists in the schema - const fieldSchema = projectCreationSchema.shape[fieldName as SchemaFields]; - - // Use Zod's ZodTypeAny for proper type handling - const result = (fieldSchema as z.ZodTypeAny).safeParse(value); - - validationErrors.update((errors) => { - if (!result.success) { - // Extract the first error message - const errorMessage = result.error.issues[0]?.message || ""; - return { ...errors, [fieldName]: errorMessage }; - } else { - // Remove error if validation passes - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { [fieldName]: _, ...rest } = errors; - return rest; - } - }); -} - -/** - * Validates the entire form and updates the validation errors store. - * Uses get() helper to avoid manual subscription management. - * Returns true if the form is valid, false otherwise. - */ -export function validateForm(): boolean { - const currentDraft = get(draft); - const result = projectCreationSchema.safeParse(currentDraft); - - if (!result.success) { - const errors: Record = {}; - result.error.issues.forEach((issue) => { - const fieldName = issue.path[0] as string; - if (!errors[fieldName]) { - errors[fieldName] = issue.message; - } - }); - validationErrors.set(errors); - return false; - } else { - validationErrors.set({}); - return true; - } -} - -/** - * Marks a field as touched. - * @param fieldName - The name of the field that was touched - */ -export function markFieldAsTouched(fieldName: string) { - touchedFields.update((fields) => { - const newFields = new Set(fields); - newFields.add(fieldName); - return newFields; - }); -} - -/** - * Resets the form to its initial state. - */ -export function resetForm() { - draft.set({ - title: "", - subtitle: "", - categories: [], - budget: 0, - release: getDefaultReleaseDate(), - termsAccepted: false, - }); - validationErrors.set({}); - touchedFields.set(new Set()); -} diff --git a/src/pages/[...locale]/create/validation.ts b/src/pages/[...locale]/create/validation.ts index 4984d15a..aca5fc32 100644 --- a/src/pages/[...locale]/create/validation.ts +++ b/src/pages/[...locale]/create/validation.ts @@ -69,10 +69,6 @@ export const projectCreationSchema = z.object({ * Not required for form submission but included for type consistency. */ budget: z.number().nonnegative().optional().default(0), - - termsAccepted: z.boolean().refine((val) => val === true, { - message: "validation.project.terms.required", - }), }); /** diff --git a/src/pages/[...locale]/profile/[idOrHandle].astro b/src/pages/[...locale]/profile/[idOrHandle].astro deleted file mode 100644 index a9b9be3e..00000000 --- a/src/pages/[...locale]/profile/[idOrHandle].astro +++ /dev/null @@ -1,232 +0,0 @@ ---- -import Layout from "../../../layouts/Layout.astro"; -import App from "../../../components/App.svelte"; -import ProfileHero from "../../../components/profile/ProfileHero.astro"; -import ProfileInfo from "../../../components/profile/ProfileInfo.svelte"; -import Tabs from "../../../components/Tabs.svelte"; -import ProfileProjectsList from "../../../components/profile/ProfileProjectsList.astro"; -import ProfileDonorType from "../../../components/profile/ProfileDonorType.svelte"; -import { renderMarkdown } from "../../../utils/renderMarkdown"; -import { - apiUsersIdOrHandleGet, - apiProjectSupportsGetCollection, - apiProjectSupportsmoneyTotalGetCollection, - type Accounting, - type Money, - type ProjectSupport, -} from "../../../openapi/client"; -import type { User } from "../../../openapi/client/types.gen"; -import type { Campaign } from "../../../types/campaign"; -import { getLanguage } from "../../../middleware/utils"; -import { client } from "../../../openapi/client/client.gen"; - -const { idOrHandle } = Astro.params; -const { t, lang, session } = Astro.locals; - -if (!idOrHandle) { - return Astro.redirect("/404"); -} - -// Fetch user data -let user: User | undefined; -let errorMessage: string | undefined; - -try { - const userResponse = await apiUsersIdOrHandleGet({ - path: { idOrHandle: idOrHandle }, - }); - - if (userResponse.error) { - throw new Error("User not found"); - } - - user = userResponse.data; -} catch (error) { - console.error("Error fetching user:", error); - errorMessage = t("profile.notFound"); -} - -// Prepare profile data with proper fallbacks -const displayName = user?.displayName || user?.handle || "User"; - -// Location - API doesn't have location field yet -// TODO: Add location field to Person/Organization in API -const location = undefined; - -// Bio - API doesn't have bio/description field yet -// TODO: Add bio/description field to User in API -const bio = undefined; - -const tabs = [ - { id: "about", label: t("profile.tabs.about") }, - { id: "projects", label: t("profile.tabs.projects") }, - { id: "donorType", label: t("profile.tabs.donorType") }, -]; - -// Fetch user's backed/supported projects from API -let userSupports: ProjectSupport[] = []; -let totalDonated: { amount: number; currency: string } = { amount: 0, currency: "EUR" }; -let projectsDonatedCount = 0; - -// Users are guaranteed to have an accounting resource -if (user) { - try { - // Get all project supports for this user - const { data: supports } = await apiProjectSupportsGetCollection({ - query: { - origin: user.accounting!, - }, - }); - - if (supports) { - userSupports = supports; - projectsDonatedCount = supports.length; - - // Get total money donated - const { data: moneyTotal } = await apiProjectSupportsmoneyTotalGetCollection({ - query: { - origin: user.accounting!, - }, - }); - - if (moneyTotal?.amount && moneyTotal?.currency) { - totalDonated = { - amount: Number(moneyTotal.amount), - currency: moneyTotal.currency, - }; - } - } - } catch (error) { - console.error("Error fetching user supports:", error); - } -} - -// Fetch actual projects from the supports -const projectIRIs = userSupports - .slice(0, 10) - .map((support) => support.project) - .filter(Boolean); -let campaigns: Campaign[] = []; - -if (projectIRIs.length > 0) { - campaigns = await Promise.all( - projectIRIs.map(async (projectIRI) => { - try { - // Fetch project data directly using IRI - const { data: project } = (await client.get({ - url: client.buildUrl({ url: projectIRI! }), - headers: { - "Accept-Language": getLanguage(Astro), - }, - })) as { data: any }; - - // Fetch accounting data - const { data: accounting } = (await client.get({ - url: client.buildUrl({ url: project.accounting! }), - })) as { data: Accounting }; - - return { - size: "small", - id: project.slug!, - title: project.title!, - image: project.video?.thumbnail!, - minimum: project.budget?.minimum?.money!, - obtained: accounting!.balance as Money, - optimum: project.budget?.optimum?.money, - }; - } catch (error) { - console.error(`Error fetching project ${projectIRI}:`, error); - return null; - } - }), - ).then((results) => results.filter(Boolean) as Campaign[]); -} - -// Social links - would come from user.socialMedia or similar field -// API doesn't have social media fields yet -// TODO: Add social media fields to User in API -const socialLinks = user - ? { - twitter: undefined, - instagram: undefined, - facebook: undefined, - linkedin: undefined, - email: user.email ? `mailto:${user.email}` : undefined, - medium: undefined, - } - : {}; - -// Images with fallbacks -const coverImage = undefined; // API doesn't provide cover image, use default -const avatarImage = user?.avatar || undefined; // Use user avatar or default placeholder ---- - - - - { - errorMessage ? ( -
-

{errorMessage}

-
- ) : ( -
- {/* Hero Section with Cover and Avatar */} - - - {/* User Info Section */} - - - {/* Tabs Navigation */} -
- -
- - {/* Tab Content - About */} -
- {bio && ( -
-
-
- )} -
- - {/* Tab Content - Projects */} -
- {campaigns.length > 0 ? ( -
- -
- ) : ( -
-

{t("profile.noProjects")}

-
- )} -
- - {/* Tab Content - Donor Type */} - -
- ) - } - - diff --git a/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditor.svelte b/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditor.svelte index e3bad112..4c702108 100644 --- a/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditor.svelte +++ b/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditor.svelte @@ -8,38 +8,43 @@ - URL query parameter sync --> - - {@const StepComponent = getStepComponent(currentStep)} - - +{#if isInitialized && resolvedProject} + + {@const StepComponent = getStepComponent(currentStep)} + + +{/if} diff --git a/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditorShell.svelte b/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditorShell.svelte index 971fda17..1c54e0af 100644 --- a/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditorShell.svelte +++ b/src/pages/[...locale]/project/[idOrSlug]/edit/ProjectEditorShell.svelte @@ -17,17 +17,22 @@ --> + +
+ +
+
+ + +
+ + +
+
+ {#if user.avatar} + {displayName} + {:else} + + {/if} +
+ +
+
+
+
+ + + + + +
+ +
+ + +
+ {#if user.description} + {#await renderMarkdown(user.description) then html} +
+ {@html html} +
+ {/await} + {:else} +

+ {$t("profile.noBio")} +

+ {/if} +
+ + + + + + +
diff --git a/src/pages/[...locale]/user/[idOrHandle]/index.astro b/src/pages/[...locale]/user/[idOrHandle]/index.astro new file mode 100644 index 00000000..cf7f23d2 --- /dev/null +++ b/src/pages/[...locale]/user/[idOrHandle]/index.astro @@ -0,0 +1,116 @@ +--- +import User from "./User.svelte"; +import Layout from "../../../../layouts/Layout.astro"; +import App from "../../../../components/App.svelte"; +import { + apiUsersIdOrHandleGet, + apiProjectSupportsGetCollection, + apiProjectSupportsmoneyTotalGetCollection, + apiProjectsGetCollection, +} from "../../../../openapi/client"; +import type { Money, ProjectSupport } from "../../../../openapi/client"; +import { apiProjectSupportsGetCollectionUrl } from "../../../../openapi/client/paths.gen"; +import type { Campaign } from "../../../../types/campaign"; +import { client } from "../../../../openapi/client/client.gen"; + +const { idOrHandle } = Astro.params; +const { lang, session } = Astro.locals; + +if (!idOrHandle) { + return Astro.redirect("/404"); +} + +const { data: user, error } = await apiUsersIdOrHandleGet({ + path: { idOrHandle }, +}); + +if (error || !user) { + return Astro.redirect("/404"); +} + +if (!user.accounting) { + throw new Error(`User ${idOrHandle} has no Accounting`); +} + +type ProjectSupportsCollection = { member: ProjectSupport[]; totalItems: number }; + +let userSupports: ProjectSupport[] = []; +let totalDonated = { amount: 0, currency: import.meta.env.PUBLIC_DEFAULT_CURRENCY as string }; +let projectsDonatedCount = 0; + +try { + const [supportsResponse, supportsTotal] = await Promise.all([ + apiProjectSupportsGetCollection({ query: { origin: user.accounting } }), + client.get({ + url: client.buildUrl({ + url: apiProjectSupportsGetCollectionUrl, + query: { origin: user.accounting, itemsPerPage: 1 }, + }), + headers: { Accept: "application/ld+json" }, + }) as unknown as Promise<{ data: ProjectSupportsCollection }>, + ]); + + userSupports = supportsResponse.data ?? []; + projectsDonatedCount = supportsTotal.data?.totalItems ?? userSupports.length; + + if (userSupports.length > 0) { + const { data: moneyTotal } = await apiProjectSupportsmoneyTotalGetCollection({ + query: { origin: user.accounting }, + }); + + if (moneyTotal?.amount && moneyTotal?.currency) { + totalDonated = { + amount: Number(moneyTotal.amount), + currency: moneyTotal.currency, + }; + } + } +} catch (e) { + console.error("Error fetching user supports:", e); +} + +const slugs = userSupports + .slice(0, 10) + .map((s) => s.project?.split("/").at(-1)) + .filter(Boolean) as string[]; + +let campaigns: Campaign[] = []; + +if (slugs.length > 0) { + try { + const { data: projects } = await apiProjectsGetCollection({ + query: { "slug[]": slugs }, + headers: { "Accept-Language": lang }, + }); + + if (projects) { + campaigns = projects + .map((project) => ({ + ...project, + slug: project.slug!, + title: project.title!, + image: project.video?.thumbnail ?? "", + minimum: project.budget?.minimum?.money as Money, + optimum: project.budget?.optimum?.money as Money | undefined, + size: "small", + })) + .filter((c) => c.slug && c.title) as Campaign[]; + } + } catch (e) { + console.error("Error fetching projects:", e); + } +} +--- + + + + + + diff --git a/src/pages/api/relay/[...path].ts b/src/pages/api/relay/[...path].ts index a5bd59ca..eeed2123 100644 --- a/src/pages/api/relay/[...path].ts +++ b/src/pages/api/relay/[...path].ts @@ -1,7 +1,19 @@ -import { getBaseUrl } from "../../../utils/consts"; +import { getSession } from "../../../auth/session"; import type { APIRoute } from "astro"; +// Whitelist of safe response headers to forward to the client +const SAFE_RESPONSE_HEADERS = [ + "content-type", + "content-language", + "content-length", + "cache-control", + "etag", + "last-modified", + "expires", + "vary", +]; + /** * API Relay Endpoint * @@ -14,94 +26,53 @@ import type { APIRoute } from "astro"; * * Usage from client: * ```ts - * const response = await fetch('/api/relay/v4/users/123', { - * method: 'GET', - * headers: { 'Accept-Language': 'en' } - * }); + * const { data, err } = await apiProjectsPost({ baseUrl: '/api/relay', ... }); + * const response = await fetch('/api/relay/v4/users/123', ...; * ``` */ export const ALL: APIRoute = async ({ request, cookies, params }) => { - // Extract the API path from the catch-all parameter - const apiPath = params.path || ""; - - // Get the access token from cookies - const accessToken = cookies.get("access-token")?.value; - - if (!accessToken) { - return new Response( - JSON.stringify({ error: "Unauthorized", message: "No access token found" }), - { - status: 401, - headers: { "Content-Type": "application/json" }, - }, - ); - } - try { - // Parse the token to get the actual bearer token - const tokenData = JSON.parse(accessToken); - const bearerToken = tokenData.token || accessToken; + const query = new URL(request.url).search; + const url = `${import.meta.env.PUBLIC_API_URL}/${params.path}${query}`; - // Build the target URL - const url = new URL(request.url); - const targetUrl = `${getBaseUrl()}/${apiPath}${url.search}`; + const reqHeaders = new Headers(request.headers); + reqHeaders.delete("host"); - // Prepare headers - const headers = new Headers(request.headers); - headers.set("Authorization", `Bearer ${bearerToken}`); - - // Remove host header to avoid conflicts - headers.delete("host"); - - // Prepare request body for methods that support it - let body: string | null = null; - if (request.method === "POST" || request.method === "PUT" || request.method === "PATCH") { - body = await request.text(); + const session = await getSession(cookies); + if (session && session.token.asHttpHeaders) { + for (const [key, value] of Object.entries(session.token.asHttpHeaders)) { + reqHeaders.set(key, value); + } } - // Forward the request to the actual API - const response = await fetch(targetUrl, { + let reqBody: string | null = null; + if (request.method === "POST" || request.method === "PUT" || request.method === "PATCH") { + reqBody = await request.text(); + } + + const response = await fetch(url, { method: request.method, - headers, - body, + headers: reqHeaders, + body: reqBody, }); - // Get the response body - const responseText = await response.text(); + const resBody = await response.text(); - // Whitelist of safe response headers to forward to the client - // These headers are important for caching, content negotiation, and proper HTTP semantics - const SAFE_RESPONSE_HEADERS = [ - "content-type", - "content-language", - "content-length", - "cache-control", - "etag", - "last-modified", - "expires", - "vary", - "link", // For pagination - "x-total-count", // Common in REST APIs for total item count - ]; - - // Build response headers by copying whitelisted headers from the API response - const responseHeaders = new Headers(); + const resHeaders = new Headers(); response.headers.forEach((value, key) => { if (SAFE_RESPONSE_HEADERS.includes(key.toLowerCase())) { - responseHeaders.set(key, value); + resHeaders.set(key, value); } }); - // Ensure Content-Type is always set (fallback to application/json) - if (!responseHeaders.has("content-type")) { - responseHeaders.set("content-type", "application/json"); + if (!resHeaders.has("content-type")) { + resHeaders.set("content-type", "application/json"); } - // Return the response back to the client - return new Response(responseText, { + return new Response(resBody, { status: response.status, statusText: response.statusText, - headers: responseHeaders, + headers: resHeaders, }); } catch (error) { console.error("API Relay Error:", error); diff --git a/src/services/projectsService.ts b/src/services/projectsService.ts index 37e4cea3..07d8d51d 100644 --- a/src/services/projectsService.ts +++ b/src/services/projectsService.ts @@ -28,14 +28,7 @@ export class ProjectsService { try { const response = await apiProjectsGetCollection({ query: { - // Text search - ...(filters.query?.trim() && { title: filters.query.trim() }), - // Categories (array filter for OR logic) - Fixed: use "categories[]" not "category[]" - ...(filters.categories?.length && { "categories[]": filters.categories }), - // Status filter - ...(filters.statusFilter && - filters.statusFilter !== "all" && { status: filters.statusFilter }), - // Pagination + ...filters, page: options?.page || 1, itemsPerPage: options?.limit || 20, }, diff --git a/src/stores/chargesPaginationAndSort.ts b/src/stores/chargesPaginationAndSort.ts index 9af2af64..13fe2b4f 100644 --- a/src/stores/chargesPaginationAndSort.ts +++ b/src/stores/chargesPaginationAndSort.ts @@ -17,24 +17,24 @@ export const sortOptions: SortOption[] = [ key: "date-desc", field: "dateCreated", direction: "desc", - label: "contributions.filters.order.options.date-desc", + label: "pages.admin.charges.filters.order.options.date-desc", }, { key: "date-asc", field: "dateCreated", direction: "asc", - label: "contributions.filters.order.options.date-asc", + label: "pages.admin.charges.filters.order.options.date-asc", }, { key: "amount-desc", field: "money.amount", direction: "desc", - label: "contributions.filters.order.options.amount-desc", + label: "pages.admin.charges.filters.order.options.amount-desc", }, { key: "amount-asc", field: "money.amount", direction: "asc", - label: "contributions.filters.order.options.amount-asc", + label: "pages.admin.charges.filters.order.options.amount-asc", }, ]; diff --git a/src/stores/drafts/draftValidation.ts b/src/stores/drafts/draftValidation.ts new file mode 100644 index 00000000..7fc551df --- /dev/null +++ b/src/stores/drafts/draftValidation.ts @@ -0,0 +1,301 @@ +import murmur from "murmurhash-js"; +import z from "zod"; + +import { type Draft, type Wizard } from "./projectDraft"; +import { projectCreationSchema } from "../../pages/[...locale]/create/validation"; + +import type { + ProjectBudgetItem, + ProjectCollaboration, + ProjectProjectCreationDto, + ProjectReward, +} from "../../openapi/client"; + +export type ValidationErrors = Record; + +/** + * Validates the entire create project form and updates the validation errors store. + * Returns true if the form is valid, false otherwise. + */ +export function validateCreateForm(createProject: ProjectProjectCreationDto): ValidationErrors { + const result = projectCreationSchema.safeParse(createProject); + + if (!result.success) { + const errors: ValidationErrors = {}; + + result.error.issues.forEach((issue) => { + const fieldName = issue.path[0] as string; + + if (!errors[fieldName]) { + errors[fieldName] = issue.message; + } + }); + + return errors; + } + + return {}; +} + +export function validateDraftToPublish(draft: Draft): ValidationErrors { + const wizard = draft.wizardForm; + + const errors: ValidationErrors = {}; + + Object.assign(errors, validateCreateForm(draft.createProject)); + + Object.assign(errors, validateConfiguration(wizard)); + + Object.assign(errors, validateCampaignInfo(wizard)); + + for (const reward of wizard.rewards) { + Object.assign(errors, validateReward(reward)); + } + + for (const collab of wizard.collaborations) { + Object.assign(errors, validateCollaboration(collab)); + } + + for (const minimumItem of wizard.budgetItems.minimum) { + Object.assign(errors, validateBudgetItem(minimumItem)); + } + + for (const optimumItem of wizard.budgetItems.optimum) { + Object.assign(errors, validateBudgetItem(optimumItem)); + } + + Object.assign(errors, validateBudgetAmount(draft)); + + return errors; +} + +export function stripHtml(html: string): string { + if (typeof document === "undefined") { + return html.replace(/<[^>]*>/g, "").trim(); + } + const div = document.createElement("div"); + div.innerHTML = html; + return div.textContent || div.innerText || ""; +} + +/** + * Validation schema for Configuration step + */ +export const configurationSchema = z.object({ + projectDeadline: z.enum(["minimum", "optimum"]), +}); + +/** + * Validate Configuration step (Step 1) + * + * Validates against the configurationSchema using Zod. + * Updates validationErrors store with any validation failures. + * + * @returns Record of field errors (empty if valid) + */ +export function validateConfiguration(wizard: Wizard): ValidationErrors { + const result = configurationSchema.safeParse(wizard.configuration); + + if (!result.success) { + const errors: ValidationErrors = {}; + + result.error.issues.forEach((issue) => { + const fieldName = issue.path[0] as string; + + if (!errors[fieldName]) { + errors[fieldName] = issue.message; + } + }); + + return errors; + } + + return {}; +} + +/** + * Validate Campaign Info step (Step 2) + * + * Validates all campaign info fields according to requirements: + * - At least 1 image OR 1 video required + * - Objectives: min 50, max 5000 characters (plain text) + * - Legacy: min 50, max 5000 characters + * - Target audience: min 30, max 5000 characters + * - Team: min 50, max 5000 characters + * + * @returns Record of field errors (empty if valid) + * + * @example + * // Validate before completing step + * function handleContinue() { + * const errors = validateCampaignInfo(); + * if (Object.keys(errors).length === 0) { + * completeCurrentStep(); + * } + * } + */ +export function validateCampaignInfo(wizard: Wizard): ValidationErrors { + const data = wizard.campaignInfo; + const errors: ValidationErrors = {}; + + // Media validation + if (data.images.length === 0 && !data.video) { + errors.media = "pages.project.edit.rewards.validation_info.reward.media.required"; + } + + // Objectives validation + const objectivesPlainText = stripHtml(data.objectives).trim(); + if (objectivesPlainText.length === 0) { + errors.objectives = "pages.project.edit.rewards.validation_info.reward.objectives.required"; + } else if (objectivesPlainText.length < 50) { + errors.objectives = + "pages.project.edit.rewards.validation_info.reward.objectives.min_length"; + } else if (objectivesPlainText.length > 5000) { + errors.objectives = + "pages.project.edit.rewards.validation_info.reward.objectives.max_length"; + } + + // Legacy validation + const legacyPlainText = stripHtml(data.legacy).trim(); + if (legacyPlainText.length === 0) { + errors.legacy = "pages.project.edit.rewards.validation_info.reward.legacy.required"; + } else if (legacyPlainText.length < 50) { + errors.legacy = "pages.project.edit.rewards.validation_info.reward.legacy.min_length"; + } else if (legacyPlainText.length > 5000) { + errors.legacy = "pages.project.edit.rewards.validation_info.reward.legacy.max_length"; + } + + // Target audience validation + const targetPlainText = stripHtml(data.targetAudience).trim(); + if (targetPlainText.length === 0) { + errors.targetAudience = "pages.project.edit.rewards.validation_info.reward.target.required"; + } else if (targetPlainText.length < 30) { + errors.targetAudience = + "pages.project.edit.rewards.validation_info.reward.target.min_length"; + } else if (targetPlainText.length > 5000) { + errors.targetAudience = + "pages.project.edit.rewards.validation_info.reward.target.max_length"; + } + + // Team validation + const teamPlainText = stripHtml(data.team).trim(); + if (teamPlainText.length === 0) { + errors.team = "pages.project.edit.rewards.validation_info.reward.team.required"; + } else if (teamPlainText.length < 50) { + errors.team = "pages.project.edit.rewards.validation_info.reward.team.min_length"; + } else if (teamPlainText.length > 5000) { + errors.team = "pages.project.edit.rewards.validation_info.reward.team.max_length"; + } + + return errors; +} + +export function validateReward(reward: ProjectReward): ValidationErrors { + const errors: ValidationErrors = {}; + const hash = murmur.murmur3(JSON.stringify(reward)); + + if (!reward.title.trim()) { + errors[`reward_error_title_${hash}`] = "pages.project.edit.rewards.validation.title"; + } + + if (!reward.money.amount || reward.money.amount <= 0) { + errors[`reward_error_amount_${hash}`] = "pages.project.edit.rewards.validation.amount"; + } + + if (reward.isFinite && (!reward.unitsTotal || reward.unitsTotal <= 0)) { + errors[`reward_error_units_${hash}`] = "pages.project.edit.rewards.validation.units"; + } + + return errors; +} + +export function validateCollaboration(collab: ProjectCollaboration): ValidationErrors { + const errors: ValidationErrors = {}; + const hash = murmur.murmur3(JSON.stringify(collab)); + + if (!collab.title.trim()) { + errors[`collab_error_title_${hash}`] = "pages.project.edit.collaborations.validation.title"; + } + + if (collab.description && collab.description.length > 1000) { + errors[`collab_error_description_too_long_${hash}`] = + "pages.project.edit.collaborations.validation.descriptionTooLong"; + } + + if (!collab.description.trim()) { + errors[`collab_error_description_${hash}`] = + "pages.project.edit.collaborations.validation.description"; + } + + return errors; +} + +export function validateBudgetItem(item: ProjectBudgetItem): ValidationErrors { + const errors: ValidationErrors = {}; + const hash = murmur.murmur3(JSON.stringify(item)); + + if (!item.title.trim()) { + errors[`budget_error_title_${hash}`] = "pages.project.edit.budget.validation.title."; + } + + if (!item.description.trim()) { + errors[`budget_error_description_${hash}`] = + "pages.project.edit.budget.validation.description"; + } + + if (!item.money.amount || item.money.amount <= 0) { + errors[`budget_error_amount_${hash}`] = "pages.project.edit.budget.validation.amount"; + } + + if (!item.money.currency) { + errors[`budget_error_currency_${hash}`] = "pages.project.edit.budget.validation.currency"; + } + + if (!item.type) { + errors[`budget_error_type_${hash}`] = "pages.project.edit.budget.validation.type"; + } + + if (!item.deadline || (item.deadline !== "minimum" && item.deadline !== "optimum")) { + errors[`budget_error_deadline_${hash}`] = "pages.project.edit.budget.validation.class"; + } + + return errors; +} + +export function validateBudgetAmount(draft: Draft) { + const budgetItems = draft.wizardForm.budgetItems; + const errors: ValidationErrors = {}; + + if (budgetItems.minimum.length <= 0) { + errors.minimum_length = "pages.project.edit.budget.validation.minimumItemsLength"; + } + + return errors; +} + +/** + * Validates a single field and updates the validation errors store. + * Uses Zod's type system with proper type guards to avoid unsafe type assertions. + * @param fieldName - The name of the field to validate + * @param value - The current value of the field + */ +export function validateField( + fieldName: keyof ProjectProjectCreationDto, + value: unknown, +): string | null { + type SchemaFields = keyof typeof projectCreationSchema.shape; + + if (!(fieldName in projectCreationSchema.shape)) { + return null; + } + + const fieldSchema = projectCreationSchema.shape[fieldName as SchemaFields]; + + const result = (fieldSchema as z.ZodTypeAny).safeParse(value); + + if (!result.success) { + return result.error.issues[0]?.message || ""; + } + + return null; +} diff --git a/src/stores/drafts/projectDraft.ts b/src/stores/drafts/projectDraft.ts new file mode 100644 index 00000000..1191511e --- /dev/null +++ b/src/stores/drafts/projectDraft.ts @@ -0,0 +1,776 @@ +import { liveQuery } from "dexie"; +import { writable, readable, get, derived } from "svelte/store"; + +import { + validateBudgetItem, + validateCollaboration, + validateDraftToPublish, + validateReward, + type ValidationErrors, +} from "./draftValidation"; +import { session } from "../../auth/store"; +import { db } from "../../utils/drafts/db"; +import { draftRepo } from "../../utils/drafts/repository"; + +import type { + Budget, + ProjectBudgetItem, + ProjectCollaboration, + ProjectProjectCreationDto, + ProjectReward, +} from "../../openapi/client"; + +/** + * Media image data + */ +export interface MediaImage { + id: string; + url: string; // Base64 data URL or API URL + file?: File; // Original file reference + size: number; // File size in bytes + name: string; // Original filename +} + +export interface WizardConfiguration { + projectDeadline: "minimum" | "optimum"; // Default: minimum +} + +export interface WizardCampaignInfo { + // Media/** + images: MediaImage[]; + video: string | undefined; + + // Rich text content (stored as HTML) + objectives: string; + legacy: string; + targetAudience: string; + team: string; +} + +export type Wizard = { + // Step navigation + currentStep: number; + + // Total budget amount + budget?: Budget; + + // Step 1: Configuration + configuration: WizardConfiguration; + + // Step 2: Campaign Information + campaignInfo: WizardCampaignInfo; + + // Step 3: Rewards + rewards: ProjectReward[]; + + // Step 4: Collaborations + collaborations: ProjectCollaboration[]; + + // Step 5: Budget + budgetItems: { + minimum: ProjectBudgetItem[]; + optimum: ProjectBudgetItem[]; + }; + + // Pending future step (Phase 6) - placeholders + // aboutYou: WizardAboutYou; +}; + +export interface CreateProjectForm extends ProjectProjectCreationDto { + budget?: Budget; +} + +export interface ProjectDraftResources { + rewards: ProjectReward[]; + collaborations: ProjectCollaboration[]; + budgetItems: { + minimum: ProjectBudgetItem[]; + optimum: ProjectBudgetItem[]; + }; +} + +export interface Draft { + draftId: string; + userId: number; + isDirty?: boolean; + apiSnapshot?: ProjectDraftResources; + + createProject: CreateProjectForm; + wizardForm: Wizard; + + updatedAt: Date; +} + +export const drafts = derived(session, ($session, set) => { + if (!$session?.user?.id) { + set([]); + return; + } + + const store = setDraftsStore($session.user.id); + + const unsubscribe = store.subscribe(set); + + return unsubscribe; +}); + +export const currentDraft = writable(null); + +export const wizard = derived( + currentDraft, + ($d) => + $d?.wizardForm ?? + ({ + currentStep: 1, + configuration: { + projectDeadline: "minimum", + }, + campaignInfo: { + images: [], + video: "", + objectives: "", + legacy: "", + targetAudience: "", + team: "", + }, + rewards: [], + collaborations: [], + budgetItems: { + minimum: [], + optimum: [], + }, + } as Wizard), +); +export const project = derived( + currentDraft, + ($d) => + $d?.createProject ?? { + title: "", + subtitle: "", + categories: [], + release: undefined, + }, +); + +/** + * Touched fields tracker + */ +export const touchedFields = writable>(new Set()); + +/** + * Store to track if there are unsaved changes in the current draft to send it to API + * Used to enable/disable the Save button in wizard form + */ +export const hasUnsavedChanges = writable(false); + +/** + * Store to track if the draft is currently being saved to IndexedDB (persistence in progress) + */ +export const isSavingDraft = writable(false); + +/** + * Persistence error state + * Tracks localStorage save failures (quota exceeded, general errors) + */ +export const persistenceError = writable(null); + +/** + * Validation errors store + * Stores field-specific validation error messages for the current step + * Updated on each field change and used to provide real-time validation feedback in the UI + */ +export const validationErrors = writable({}); + +/** + * Derived store that validates the draft for publishing. + * Returns an object with validation errors for each field, or an empty object if valid. + */ +export const publishErrors = derived(currentDraft, ($draft) => { + if (!$draft) { + return {}; + } + + const errors = validateDraftToPublish(get(currentDraft) as Draft); + return errors; +}); + +/** + * Define whether the project is ready to publish (all steps completed and valid). + * Used to enable/disable the Publish button in the wizard UI + */ +export const isReadyToPublish = derived([publishErrors, currentDraft], ([$errors, $draft]) => { + if (!$draft) return false; + + return Object.keys($errors).length === 0; +}); + +/** + * Derived store that indicates if the form is valid. + * Returns true only when: + * 1. All required fields have values + * 2. There are no validation errors + */ +export const isCreateFormValid = derived([currentDraft, validationErrors], ([$draft, $errors]) => { + if (Object.keys($errors).length > 0) { + return false; + } + + const hasTitle = ($draft?.createProject?.title?.trim().length ?? 0) > 0; + + const hasSubtitle = ($draft?.createProject?.subtitle?.trim().length ?? 0) > 0; + + const hasCategories = ($draft?.createProject?.categories?.length ?? 0) > 0; + + return hasTitle && hasSubtitle && hasCategories; +}); + +export function createDraftId(): string { + return crypto.randomUUID(); +} + +function getUserId(): number { + const s = get(session); + + if (!s?.user?.id) { + throw new Error("User not authenticated"); + } + + return s.user.id; +} + +export function setDraftsStore(userId: number) { + return readable([], (set) => { + const subscription = liveQuery(() => + db.drafts.where("userId").equals(userId).reverse().sortBy("updatedAt"), + ).subscribe({ + next: set, + error: console.error, + }); + + return () => subscription.unsubscribe(); + }); +} + +export async function createDraft( + project?: ProjectProjectCreationDto, + draftId = createDraftId(), + isDirty = true, + resources?: ProjectDraftResources, +) { + const userId = getUserId(); + + const draft: Draft = { + draftId, + userId, + isDirty, + apiSnapshot: resources, + createProject: project ?? ({} as Partial as CreateProjectForm), + wizardForm: { + currentStep: 1, + configuration: { + projectDeadline: "minimum", + }, + campaignInfo: { + images: [], + video: "", + objectives: "", + legacy: "", + targetAudience: "", + team: "", + }, + rewards: resources?.rewards ?? [], + collaborations: resources?.collaborations ?? [], + budgetItems: resources?.budgetItems ?? { + minimum: [], + optimum: [], + }, + }, + updatedAt: new Date(), + }; + + draft.createProject.categories = Object.values(project?.categories || []); + + await draftRepo.create(draft); + currentDraft.set(draft); + + return draftId; +} + +export async function loadDraft(draftId: string) { + const draft = await draftRepo.get(draftId); + + if (!draft) return false; + + currentDraft.set(draft); + hasUnsavedChanges.set(draft.isDirty ?? true); + return true; +} + +export async function initializeProjectDraft( + project: ProjectProjectCreationDto, + draftId: string, + resources?: ProjectDraftResources, +) { + const loadedDraft = await draftRepo.get(draftId); + + if (loadedDraft) { + const isDirty = loadedDraft.isDirty ?? true; + const nextDraft: Draft = { + ...loadedDraft, + apiSnapshot: resources ?? loadedDraft.apiSnapshot, + createProject: isDirty ? loadedDraft.createProject : project, + wizardForm: + !isDirty && resources + ? { + ...loadedDraft.wizardForm, + rewards: resources.rewards, + collaborations: resources.collaborations, + budgetItems: resources.budgetItems, + } + : loadedDraft.wizardForm, + updatedAt: new Date(), + }; + + currentDraft.set(nextDraft); + hasUnsavedChanges.set(isDirty); + + return true; + } + + await createDraft(project, draftId, false, resources); + hasUnsavedChanges.set(false); + return false; +} + +/** + * Mark a field as touched (for validation UX) + * + * Used to track which fields the user has interacted with, + * so validation errors only show after user touches the field. + * + * @param fieldName - The field identifier to mark as touched + * + * @example + * // Mark field as touched on blur + * markFieldAsTouched('languages')} /> + */ +export function markFieldAsTouched(fieldName: string) { + touchedFields.update((fields) => { + const newFields = new Set(fields); + newFields.add(fieldName); + return newFields; + }); +} + +let saveTimer: ReturnType | null = null; + +export function persistDraft() { + if (saveTimer) clearTimeout(saveTimer); + + isSavingDraft.set(true); + saveTimer = setTimeout(() => { + const draft = get(currentDraft); + if (!draft) return; + + try { + const updatedDraft = { + ...draft, + updatedAt: new Date(), + }; + + currentDraft.set(updatedDraft); + + draftRepo.update(draft.draftId, draft.userId, updatedDraft); + + isSavingDraft.set(false); + persistenceError.set(null); + } catch (error) { + console.error("Failed to persist draft:", error); + + // Handle QuotaExceededError specifically + if (error instanceof DOMException && error.name === "QuotaExceededError") { + persistenceError.set("storage_quota_exceeded"); + } else { + persistenceError.set("storage_general_error"); + } + + // Keep isSavingDraft as true when persistence fails + isSavingDraft.set(true); + } + }, 1000); +} + +/** + * Update Wizard Form data + * + * Merges new wizard updates with already existing wizard data. + * + * @param data - Partial object with wizard data that has been modified + */ +export function updateWizard(data: Partial, options: { markUnsaved?: boolean } = {}) { + const markUnsaved = options.markUnsaved ?? true; + + currentDraft.update((draft) => { + if (!draft) return draft; + + const updated = { + ...draft, + isDirty: markUnsaved ? true : draft.isDirty, + wizardForm: { + ...draft.wizardForm, + + ...data, + + configuration: { + ...draft.wizardForm.configuration, + ...data.configuration, + }, + + campaignInfo: { + ...draft.wizardForm.campaignInfo, + ...data.campaignInfo, + }, + + budgetItems: { + ...draft.wizardForm.budgetItems, + ...data.budgetItems, + }, + }, + }; + + return updated; + }); + + persistDraft(); + if (markUnsaved) { + hasUnsavedChanges.set(true); + } +} + +export function updateConfiguration(data: Partial) { + const draft = get(currentDraft); + if (!draft) return; + + updateWizard({ + configuration: { + ...draft.wizardForm.configuration, + ...data, + }, + }); +} + +export function updateCampaignInfo(data: Partial) { + const draft = get(currentDraft); + if (!draft) return; + + updateWizard({ + campaignInfo: { + ...draft.wizardForm.campaignInfo, + ...data, + }, + }); +} + +export function addReward(reward: ProjectReward) { + const errors = validateReward(reward); + + if (Object.keys(errors).length > 0) { + return errors; + } + + const draft = get(currentDraft); + if (!draft) return; + + updateWizard({ + rewards: [ + ...draft.wizardForm.rewards, + { + ...reward, + project: reward.project, + }, + ], + }); + + return {}; +} + +export function updateReward(index: number, reward: ProjectReward) { + const errors = validateReward(reward); + + if (Object.keys(errors).length > 0) { + return errors; + } + + const draft = get(currentDraft); + if (!draft) return; + + const rewards = [...draft.wizardForm.rewards]; + + rewards[index] = { + ...rewards[index], + ...reward, + }; + + updateWizard({ + rewards, + }); + + return {}; +} + +export function deleteReward(index: number) { + const draft = get(currentDraft); + if (!draft) return; + + updateWizard({ + rewards: draft.wizardForm.rewards.filter((_, i) => i !== index), + }); +} + +export function addCollaboration(collab: ProjectCollaboration): Record { + const errors = validateCollaboration(collab); + + if (Object.keys(errors).length > 0) { + return errors; + } + + const draft = get(currentDraft); + if (!draft) return {}; + + updateWizard({ + collaborations: [...draft.wizardForm.collaborations, { ...collab }], + }); + + return {}; +} + +export function updateCollaboration( + index: number, + collab: ProjectCollaboration, +): Record { + const errors = validateCollaboration(collab); + + if (Object.keys(errors).length > 0) { + return errors; + } + + const draft = get(currentDraft); + if (!draft) return {}; + + const collaborations = [...draft.wizardForm.collaborations]; + + collaborations[index] = { + ...collaborations[index], + ...collab, + }; + + updateWizard({ + collaborations, + }); + + return {}; +} + +export function deleteCollaboration(index: number) { + const draft = get(currentDraft); + if (!draft) return; + + updateWizard({ + collaborations: draft.wizardForm.collaborations.filter((_, i) => i !== index), + }); +} + +export function addBudgetItem(item: ProjectBudgetItem) { + const errors = validateBudgetItem(item); + + if (Object.keys(errors).length > 0) { + return errors; + } + + const draft = get(currentDraft); + if (!draft) return {}; + + updateWizard({ + budgetItems: { + ...draft.wizardForm.budgetItems, + + [item.deadline]: [...draft.wizardForm.budgetItems[item.deadline], item], + }, + }); + + return {}; +} + +export function updateBudgetItem( + index: number, + item: ProjectBudgetItem, + previousDeadline: "minimum" | "optimum" = item.deadline, +) { + const errors = validateBudgetItem(item); + + if (Object.keys(errors).length > 0) { + return errors; + } + + const draft = get(currentDraft); + if (!draft) return {}; + + const budgetItems = { ...draft.wizardForm.budgetItems }; + const previousItems = [...budgetItems[previousDeadline]]; + const existing = previousItems[index]; + const updatedItem = { + ...existing, + ...item, + }; + + if (previousDeadline === item.deadline) { + previousItems[index] = updatedItem; + budgetItems[item.deadline] = previousItems; + } else { + budgetItems[previousDeadline] = previousItems.filter((_, i) => i !== index); + budgetItems[item.deadline] = [...budgetItems[item.deadline], updatedItem]; + } + + updateWizard({ + budgetItems, + }); + + return {}; +} + +export function deleteBudgetItem(index: number, deadline: "minimum" | "optimum") { + const draft = get(currentDraft); + if (!draft) return; + + updateWizard({ + budgetItems: { + ...draft.wizardForm.budgetItems, + + [deadline]: draft.wizardForm.budgetItems[deadline].filter((_, i) => i !== index), + }, + }); + + hasUnsavedChanges.set(true); +} + +/** + * Update create Project form data + * + * Merges new create project form updates with already existing project data. + * + * @param data - Partial object with Project API Type data that has been modified + */ +export function updateProject(data: Partial) { + currentDraft.update((draft) => { + if (!draft) return draft; + + const updated = { + ...draft, + isDirty: true, + createProject: { + ...draft.createProject, + ...data, + }, + }; + + return updated; + }); + + persistDraft(); + hasUnsavedChanges.set(true); +} + +export function markCurrentDraftClean(resources?: ProjectDraftResources) { + const draft = get(currentDraft); + if (!draft) return; + + const nextResources = resources ?? { + rewards: draft.wizardForm.rewards, + collaborations: draft.wizardForm.collaborations, + budgetItems: draft.wizardForm.budgetItems, + }; + + const cleanDraft = { + ...draft, + isDirty: false, + apiSnapshot: nextResources, + wizardForm: { + ...draft.wizardForm, + rewards: nextResources.rewards, + collaborations: nextResources.collaborations, + budgetItems: nextResources.budgetItems, + }, + updatedAt: new Date(), + }; + + currentDraft.set(cleanDraft); + draftRepo.update(cleanDraft.draftId, cleanDraft.userId, cleanDraft); + hasUnsavedChanges.set(false); +} + +export function deleteCurrentDraft(draftId: string, userId: number) { + const current = get(currentDraft); + + if (current?.draftId === draftId) { + currentDraft.set(null); + } + + draftRepo.delete(draftId, userId); + touchedFields.set(new Set()); + isSavingDraft.set(false); + persistenceError.set(null); +} + +/** + * Navigate to a specific wizard step + * + * Navigation rules: + * - Can navigate to current step (no-op, returns true) + * - Can navigate backward to any previous step + * - Can navigate forward only if ALL previous steps are completed + * - Updates URL with browser history for back/forward button support + * + * @param targetStep - The step number to navigate to (1-indexed) + * @returns true if navigation was successful, false if blocked + * + * @example + * // Navigate to step 2 (allowed if step 1 is completed) + * navigateToStep(2); + * + * // Navigate back to step 1 (always allowed) + * navigateToStep(1); + */ +export function navigateToStep(targetStep: number): boolean { + const state = get(currentDraft); + const currentStep = state?.wizardForm.currentStep; + + // No validation - free navigation + if (targetStep === currentStep) { + console.log(`[wizard-state] Already on step ${targetStep}`); + return true; + } + + console.log(`[wizard-state] Navigating: ${currentStep} → ${targetStep}`); + updateWizard({ currentStep: targetStep }); + updateUrl(targetStep); + return true; +} + +/** + * Update browser URL with current step (for browser back/forward support) + * @param step - Current step number + */ +export function updateUrl(step: number) { + // SSR safety check + if (typeof window === "undefined") { + return; + } + + try { + const url = new URL(window.location.href); + url.searchParams.set("step", step.toString()); + window.history.pushState({ step }, "", url.toString()); + } catch (error) { + console.error("[wizard-state] Failed to update URL:", error); + } +} diff --git a/src/stores/searchStore.ts b/src/stores/searchStore.ts index c5148919..237cf651 100644 --- a/src/stores/searchStore.ts +++ b/src/stores/searchStore.ts @@ -2,13 +2,9 @@ import { writable, derived, get } from "svelte/store"; import { projectsService } from "../services/projectsService"; -import type { Project } from "../openapi/client/types.gen"; +import type { ApiProjectsGetCollectionData, Project } from "../openapi/client/types.gen"; -export interface SearchFilters { - query: string; - statusFilter: string; - categories: string[]; -} +export type SearchFilters = ApiProjectsGetCollectionData["query"]; export interface SearchState { filters: SearchFilters; @@ -34,9 +30,10 @@ const isBrowser = typeof window !== "undefined"; function getInitialState(): SearchState { return { filters: { - query: "", - statusFilter: "", - categories: [], + page: 1, + itemsPerPage: 20, + title: "", + status: "", }, results: [], isLoading: false, @@ -61,23 +58,26 @@ function loadInitialState(): SearchState { const state = getInitialState(); const urlParams = new URLSearchParams(window.location.search); - // Initialize filters from URL parameters - state.filters.query = urlParams.get("q") || ""; - state.filters.statusFilter = urlParams.get("status") || ""; + // Initialize filters from URL parameters using API field names + if (state.filters) { + state.filters.title = urlParams.get("title") || ""; + state.filters.status = urlParams.get("status") || ""; - const categories = urlParams.get("categories"); - if (categories) { - state.filters.categories = categories.split(",").filter(Boolean); + // Handle categories[] array parameters + const categoriesArray = urlParams.getAll("categories[]"); + if (categoriesArray.length > 0) { + state.filters["categories[]"] = categoriesArray; + } + // If we have URL parameters, mark as having searched + const hasUrlFilters = + state.filters.title || + state.filters.status || + (state.filters["categories[]"]?.length ?? 0) > 0; + + if (hasUrlFilters) { + state.hasSearched = true; + } } - - // If we have URL parameters, mark as having searched - const hasUrlFilters = - state.filters.query || state.filters.statusFilter || state.filters.categories.length > 0; - - if (hasUrlFilters) { - state.hasSearched = true; - } - return state; } @@ -221,9 +221,10 @@ function createSearchStore() { update((state) => ({ ...state, filters: { - query: "", - statusFilter: "", - categories: [], + page: 1, + itemsPerPage: 20, + title: "", + status: "", }, })), @@ -236,22 +237,26 @@ function createSearchStore() { const state = get(searchStore); const urlParams = new URLSearchParams(); + const filters = state.filters ?? {}; - if (state.filters.query) { - urlParams.set("q", state.filters.query); - } - if (state.filters.statusFilter) { - urlParams.set("status", state.filters.statusFilter); - } - if (state.filters.categories.length > 0) { - urlParams.set("categories", state.filters.categories.join(",")); - } + Object.entries(filters).forEach(([key, value]) => { + if (value === undefined || value === null || value === "") return; + + if (Array.isArray(value)) { + value.forEach((item) => { + urlParams.append(key, String(item)); + }); + } else { + if (key !== "page" && key !== "itemsPerPage") { + urlParams.set(key, String(value)); + } + } + }); const newUrl = urlParams.toString() ? `${window.location.pathname}?${urlParams.toString()}` : window.location.pathname; - // Use replaceState to avoid adding to browser history on every filter change window.history.replaceState({}, "", newUrl); }, @@ -276,7 +281,11 @@ function createSearchStore() { hasPrevPage: pagination?.hasPrev || false, hasSearched: totalCount > 0 || - !!(filters.query || filters.statusFilter || filters.categories.length > 0), + !!( + filters?.title || + filters?.status || + (filters?.["categories[]"]?.length ?? 0) > 0 + ), isLoading: false, hasError: false, errorMessage: "", @@ -469,7 +478,7 @@ export const resultCount = derived(searchStore, ($searchStore) => $searchStore.t // Derived store to check if any filters are active export const hasActiveFilters = derived(searchStore, ($searchStore) => { const { filters } = $searchStore; - return !!(filters.query || filters.statusFilter || filters.categories.length > 0); + return !!(filters?.title || filters?.status || (filters?.["categories[]"]?.length ?? 0) > 0); }); // Pagination derived stores diff --git a/src/stores/wizard-state.ts b/src/stores/wizard-state.ts deleted file mode 100644 index 43e474e9..00000000 --- a/src/stores/wizard-state.ts +++ /dev/null @@ -1,1001 +0,0 @@ -/** - * Wizard State Management Store - * - * Manages state for the multi-step project setup wizard. - * Separate from project-draft.ts as they serve different purposes: - * - project-draft.ts: Stage 1 (proposal submission) - * - wizard-state.ts: Stage 2 (detailed setup after approval) - * - * Features: - * - Step navigation with validation - * - LocalStorage persistence (auto-save every 1 second) - * - Pre-population from approved proposal - * - Per-step validation tracking - */ - -import { z } from "astro/zod"; -import murmur from "murmurhash-js"; -import { writable, derived, get } from "svelte/store"; - -import type { MoneyWithConversion, Project, ProjectBudgetItem } from "../openapi/client"; - -/** - * Wizard configuration data (Step 1: Configuration) - */ -export interface WizardConfiguration { - projectDeadline: "minimum" | "optimum"; // Default: minimum -} - -/** - * Media image data - */ -export interface MediaImage { - id: string; - url: string; // Base64 data URL or API URL - file?: File; // Original file reference - size: number; // File size in bytes - name: string; // Original filename -} - -/** - * Campaign Information data (Step 2) - */ -export interface WizardCampaignInfo { - // Media - images: MediaImage[]; - video: string | undefined; - - // Rich text content (stored as HTML) - objectives: string; - legacy: string; - targetAudience: string; - team: string; - - // Validation tracking - touched: Set; - errors: Record; -} - -/** - * Wizard Rewards data (Step 3: Rewards) - */ -export interface WizardReward { - id?: string | number; - title: string; // Title displayed in reward card - description: string | null; // Description displayed in reward card - - // The minimal monetary sum to be able to claim this reward - money: { - amount: number; - currency: string; - }; - - // isFinite sets if the reward has a limit of exchanges, and if not, unitsTotal sets the limit - isFinite: boolean; - unitsTotal: number | null; -} - -/** - * Wizard Collaborations data (Step 4: Collaborations) - */ -export interface WizardCollaboration { - title: string; - description: string; -} - -/** - * Wizard Budget data (Step 5: Budget) - */ -export interface WizardBudgetItems { - minimum: ProjectBudgetItem[]; - optimum: ProjectBudgetItem[]; -} - -/** - * Complete wizard state - */ -export interface WizardState { - // Project identification - projectId?: string; - - // Pre-filled from proposal (Stage 1) - title: string; - subtitle: string; - budget: MoneyWithConversion; - - // Step navigation - currentStep: number; - - // Step 1: Configuration - configuration: WizardConfiguration; - - // Step 2: Campaign Information - campaignInfo: WizardCampaignInfo; - - // Step 3: Rewards - rewards: WizardReward[]; - - // Step 4: Collaborations - collaborations: WizardCollaboration[]; - - // Step 5: Budget - budgetItems: WizardBudgetItems; - - // Pending future step (Phase 6) - placeholders - // aboutYou: WizardAboutYou; -} - -/** - * Default wizard state - */ -const getDefaultState = (): WizardState => ({ - projectId: undefined, - title: "", - subtitle: "", - budget: { - amount: 0, - currency: "EUR", - }, - currentStep: 1, - configuration: { - projectDeadline: "minimum", // Default to minimum deadline (1 round) - }, - campaignInfo: { - images: [], - video: "", - objectives: "", - legacy: "", - targetAudience: "", - team: "", - touched: new Set(), - errors: {}, - }, - rewards: [ - { - title: "", - description: null, - money: { amount: 0, currency: "EUR" }, - isFinite: false, - unitsTotal: null, - }, - ], - collaborations: [], - budgetItems: { minimum: [], optimum: [] }, -}); - -/** - * Main wizard state store - */ -export const wizardState = writable(getDefaultState()); - -/** - * Validation errors for current step - */ -export const validationErrors = writable>({}); - -/** - * Touched fields tracker - */ -export const touchedFields = writable>(new Set()); - -/** - * Unsaved changes flag (for beforeunload warning) - */ -export const hasUnsavedChanges = writable(false); - -/** - * Persistence error state - * Tracks localStorage save failures (quota exceeded, general errors) - */ -export const persistenceError = writable(null); - -/** - * Define whether the project is ready to publish (all steps completed and valid). - * Used to enable/disable the Publish button in the UI - */ -export const isReadyToPublish = writable(false); - -/** - * LocalStorage key for wizard state persistence - */ -const STORAGE_KEY = "goteo-project-wizard"; - -/** - * Save throttle timer - */ -let saveTimer: ReturnType | null = null; - -/** - * Initialize wizard state from an approved project - * - * Pre-populates wizard with data from the approved proposal (Stage 1). - * Attempts to restore additional wizard-specific data from localStorage. - * - * @param project - The approved project data from the API - * - * @example - * // Initialize wizard when user enters setup flow - * const project = await getProject(projectId); - * initializeFromProject(project); - */ -export function initializeFromProject(project: Project) { - wizardState.set({ - projectId: project.id ? String(project.id) : undefined, - title: project.title || "", - subtitle: project.subtitle || "", - budget: { - amount: project.budget?.minimum?.money?.amount || 0, - currency: project.budget?.minimum?.money?.currency || "EUR", - }, - currentStep: 1, - configuration: { - projectDeadline: "minimum", - }, - campaignInfo: { - images: [], - video: "", - objectives: "", - legacy: "", - targetAudience: "", - team: "", - touched: new Set(), - errors: {}, - }, - rewards: [], - collaborations: [], - budgetItems: { minimum: [], optimum: [] }, - }); - - // Try to restore additional wizard data from localStorage - restoreFromLocalStorage(); -} - -/** - * Save wizard state to localStorage (throttled) - * - * Automatically throttled to max 1 save per second to prevent excessive writes. - * Handles quota exceeded errors and general storage failures gracefully. - * Updates persistenceError store on failure, keeps hasUnsavedChanges true on error. - * - * @example - * // Called automatically by updateConfiguration, completeCurrentStep, etc. - * // Can also be called manually if needed - * saveToLocalStorage(); - */ -export function saveToLocalStorage() { - // Clear existing timer - if (saveTimer) { - clearTimeout(saveTimer); - } - - // Set new timer (throttle to max 1 save per second) - saveTimer = setTimeout(() => { - const state = get(wizardState); - - // Convert Set to Array for JSON serialization - const serializable = { - ...state, - campaignInfo: { - ...state.campaignInfo, - touched: Array.from(state.campaignInfo.touched), - }, - }; - - try { - localStorage.setItem(STORAGE_KEY, JSON.stringify(serializable)); - hasUnsavedChanges.set(false); - persistenceError.set(null); - } catch (error) { - console.error("Failed to save wizard state to localStorage:", error); - - // Handle QuotaExceededError specifically - if (error instanceof DOMException && error.name === "QuotaExceededError") { - persistenceError.set("storage_quota_exceeded"); - } else { - persistenceError.set("storage_general_error"); - } - - // Keep hasUnsavedChanges as true when persistence fails - hasUnsavedChanges.set(true); - } - }, 1000); -} - -/** - * Restore wizard state from localStorage - * - * Only restores wizard-specific fields (currentStep, completedSteps, configuration, campaignInfo). - * Does not overwrite pre-filled proposal data (title, subtitle, etc.). - * - * @returns true if restoration was successful, false otherwise - * - * @example - * // Restore wizard progress after page reload - * if (restoreFromLocalStorage()) { - * console.log('Wizard state restored'); - * } - */ -export function restoreFromLocalStorage(): boolean { - try { - const stored = localStorage.getItem(STORAGE_KEY); - if (!stored) { - return false; - } - - const parsed = JSON.parse(stored); - - // Convert Arrays back to Sets - if (parsed.campaignInfo?.touched) { - parsed.campaignInfo.touched = new Set(parsed.campaignInfo.touched); - } - - // Only restore wizard-specific fields (not pre-filled proposal data) - wizardState.update((state) => ({ - ...state, - currentStep: parsed.currentStep || 1, - configuration: parsed.configuration || getDefaultState().configuration, - campaignInfo: parsed.campaignInfo || getDefaultState().campaignInfo, - rewards: parsed.rewards || getDefaultState().rewards, - collaborations: parsed.collaborations || getDefaultState().collaborations, - budgetItems: parsed.budgetItems || getDefaultState().budgetItems, - })); - - return true; - } catch (error) { - console.error("Failed to restore wizard state from localStorage:", error); - return false; - } -} - -/** - * Clear wizard state from localStorage - * - * Should be called after successful project publish to clean up stored data. - * - * @example - * // After successful project submission - * await publishProject(projectData); - * clearLocalStorage(); - */ -export function clearLocalStorage() { - try { - localStorage.removeItem(STORAGE_KEY); - hasUnsavedChanges.set(false); - persistenceError.set(null); - } catch (error) { - console.error("Failed to clear wizard state from localStorage:", error); - } -} - -/** - * Navigate to a specific wizard step - * - * Navigation rules: - * - Can navigate to current step (no-op, returns true) - * - Can navigate backward to any previous step - * - Can navigate forward only if ALL previous steps are completed - * - Updates URL with browser history for back/forward button support - * - * @param targetStep - The step number to navigate to (1-indexed) - * @returns true if navigation was successful, false if blocked - * - * @example - * // Navigate to step 2 (allowed if step 1 is completed) - * navigateToStep(2); - * - * // Navigate back to step 1 (always allowed) - * navigateToStep(1); - */ -export function navigateToStep(targetStep: number): boolean { - const state = get(wizardState); - const currentStep = state.currentStep; - - // No validation - free navigation - if (targetStep === currentStep) { - console.log(`[wizard-state] Already on step ${targetStep}`); - return true; - } - - console.log(`[wizard-state] Navigating: ${currentStep} → ${targetStep}`); - wizardState.update((s) => ({ ...s, currentStep: targetStep })); - hasUnsavedChanges.set(true); - saveToLocalStorage(); - updateUrl(targetStep); - return true; -} - -/** - * Update browser URL with current step (for browser back/forward support) - * @param step - Current step number - */ -function updateUrl(step: number) { - // SSR safety check - if (typeof window === "undefined") { - return; - } - - try { - const url = new URL(window.location.href); - url.searchParams.set("step", step.toString()); - window.history.pushState({ step }, "", url.toString()); - } catch (error) { - console.error("[wizard-state] Failed to update URL:", error); - } -} - -/** - * Mark a field as touched (for validation UX) - * - * Used to track which fields the user has interacted with, - * so validation errors only show after user touches the field. - * - * @param fieldName - The field identifier to mark as touched - * - * @example - * // Mark field as touched on blur - * markFieldAsTouched('languages')} /> - */ -export function markFieldAsTouched(fieldName: string) { - touchedFields.update((fields) => { - const newFields = new Set(fields); - newFields.add(fieldName); - return newFields; - }); -} - -/** - * Reset wizard to initial state - * - * Clears all wizard data including localStorage. - * Should be used when user cancels or starts a new wizard session. - * - * @example - * // Reset wizard on cancel - * function handleCancel() { - * if (confirm('Discard all changes?')) { - * resetWizard(); - * navigate('/dashboard'); - * } - * } - */ -export function resetWizard() { - wizardState.set(getDefaultState()); - validationErrors.set({}); - touchedFields.set(new Set()); - hasUnsavedChanges.set(false); - persistenceError.set(null); - clearLocalStorage(); -} - -/** - * Validation schema for Configuration step - */ -export const configurationSchema = z.object({ - projectDeadline: z.union([z.literal(1), z.literal(2)]), -}); - -/** - * Update configuration data (Step 1) - * - * Merges partial configuration updates with existing data. - * Triggers auto-save to localStorage. - * - * @param config - Partial configuration object to merge - * - * @example - * // Update languages - * updateConfiguration({ languages: ['es', 'en'] }); - */ -export function updateConfiguration(config: Partial) { - wizardState.update((state) => ({ - ...state, - configuration: { - ...state.configuration, - ...config, - }, - })); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -/** - * Validate Configuration step (Step 1) - * - * Validates against the configurationSchema using Zod. - * Updates validationErrors store with any validation failures. - * - * @returns true if configuration is valid, false otherwise - * - * @example - * // Validate before completing step - * function handleContinue() { - * if (validateConfiguration()) { - * completeCurrentStep(); - * } - * } - */ -export function validateConfiguration(): boolean { - const state = get(wizardState); - const result = configurationSchema.safeParse(state.configuration); - - if (!result.success) { - const errors: Record = {}; - result.error.issues.forEach((issue) => { - const fieldName = issue.path[0] as string; - if (!errors[fieldName]) { - errors[fieldName] = issue.message; - } - }); - validationErrors.set(errors); - return false; - } - - validationErrors.set({}); - return true; -} - -/** - * Derived store: is Configuration step valid? - */ -export const isConfigurationValid = derived( - [wizardState, validationErrors], - ([$state, $errors]) => { - // Check for validation errors - if (Object.keys($errors).length > 0) { - return false; - } - - // Check required fields - const config = $state.configuration; - const deadlineSelected = config.projectDeadline; - - return deadlineSelected; - }, -); - -// ============================================ -// Campaign Info State Management (Step 2) -// ============================================ - -/** - * Update campaign info data (Step 2) - * - * Merges partial campaign info updates with existing data. - * Triggers auto-save to localStorage. - * - * @param info - Partial campaign info object to merge - * - * @example - * // Update objectives - * updateCampaignInfo({ objectives: '

My objectives...

' ); - * - * // Add an image - * updateCampaignInfo({ - * images: [...currentImages, newImage] - * ); - */ -export function updateCampaignInfo(info: Partial) { - wizardState.update((state) => ({ - ...state, - campaignInfo: { - ...state.campaignInfo, - ...info, - }, - })); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -/** - * Strip HTML tags from a string to get plain text - * Used for validating rich text field lengths - * - * @param html - HTML string to strip - * @returns Plain text without HTML tags - */ -export function stripHtml(html: string): string { - if (typeof document === "undefined") { - // SSR fallback: simple regex-based stripping - return html.replace(/<[^>]*>/g, "").trim(); - } - const div = document.createElement("div"); - div.innerHTML = html; - return div.textContent || div.innerText || ""; -} - -/** - * Validate Campaign Info step (Step 2) - * - * Validates all campaign info fields according to requirements: - * - At least 1 image OR 1 video required - * - Objectives: min 50, max 5000 characters (plain text) - * - Legacy: min 50, max 5000 characters - * - Target audience: min 30, max 5000 characters - * - Team: min 50, max 5000 characters - * - * @returns Record of field errors (empty if valid) - * - * @example - * // Validate before completing step - * function handleContinue() { - * const errors = validateCampaignInfo(); - * if (Object.keys(errors).length === 0) { - * completeCurrentStep(); - * } - * } - */ -export function validateCampaignInfo(): Record { - const state = get(wizardState); - const data = state.campaignInfo; - const errors: Record = {}; - - // Media validation - if (data.images.length === 0 && !data.video) { - errors.media = "pages.project.edit.rewards.validationn_info.reward.media.required"; - } - - // Objectives validation - const objectivesPlainText = stripHtml(data.objectives).trim(); - if (objectivesPlainText.length === 0) { - errors.objectives = - "pages.project.edit.rewards.validationn_info.reward.objectives.required"; - } else if (objectivesPlainText.length < 50) { - errors.objectives = - "pages.project.edit.rewards.validationn_info.reward.objectives.min_length"; - } else if (objectivesPlainText.length > 5000) { - errors.objectives = - "pages.project.edit.rewards.validationn_info.reward.objectives.max_length"; - } - - // Legacy validation - const legacyPlainText = stripHtml(data.legacy).trim(); - if (legacyPlainText.length === 0) { - errors.legacy = "pages.project.edit.rewards.validationn_info.reward.legacy.required"; - } else if (legacyPlainText.length < 50) { - errors.legacy = "pages.project.edit.rewards.validationn_info.reward.legacy.min_length"; - } else if (legacyPlainText.length > 5000) { - errors.legacy = "pages.project.edit.rewards.validationn_info.reward.legacy.max_length"; - } - - // Target audience validation - const targetPlainText = stripHtml(data.targetAudience).trim(); - if (targetPlainText.length === 0) { - errors.targetAudience = - "pages.project.edit.rewards.validationn_info.reward.target.required"; - } else if (targetPlainText.length < 30) { - errors.targetAudience = - "pages.project.edit.rewards.validationn_info.reward.target.min_length"; - } else if (targetPlainText.length > 5000) { - errors.targetAudience = - "pages.project.edit.rewards.validationn_info.reward.target.max_length"; - } - - // Team validation - const teamPlainText = stripHtml(data.team).trim(); - if (teamPlainText.length === 0) { - errors.team = "pages.project.edit.rewards.validationn_info.reward.team.required"; - } else if (teamPlainText.length < 50) { - errors.team = "pages.project.edit.rewards.validationn_info.reward.team.min_length"; - } else if (teamPlainText.length > 5000) { - errors.team = "pages.project.edit.rewards.validationn_info.reward.team.max_length"; - } - - return errors; -} - -/** - * Check if Campaign Info step is valid - * - * @returns true if campaign info is valid, false otherwise - */ -export function isCampaignInfoValid(): boolean { - const errors = validateCampaignInfo(); - return Object.keys(errors).length === 0; -} - -/** - * Derived store: is Campaign Info step valid? - */ -export const isCampaignInfoValidStore = derived(wizardState, () => { - const errors = validateCampaignInfo(); - return Object.keys(errors).length === 0; -}); - -// ============================================ -// Rewards State Management (Step 3) -// ============================================ - -/** - * Update rewards data (Step 3) - * - * Merges rewards updates with existing data. - * Triggers auto-save to localStorage. - * - * @param index - Index of current reward - * @param reward - Reward object to merge - * - * @example - * // Update reward - * updateReward(index: currentIndex, reward: updatedReward); - */ -export function updateReward(index: number, reward: WizardReward) { - const errors = validateReward(reward); - - if (Object.keys(errors).length > 0) { - return errors; - } - - wizardState.update((state) => { - const updated = [...state.rewards]; - updated[index] = reward; - return { ...state, rewards: updated }; - }); - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -export function addReward(reward: WizardReward) { - const errors = validateReward(reward); - - if (Object.keys(errors).length > 0) { - return errors; - } - - const id = murmur.murmur3(JSON.stringify(reward) + Date.now()); - - wizardState.update((state) => ({ - ...state, - rewards: [...state.rewards, { ...reward, id }], - })); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -export function deleteReward(index: number) { - wizardState.update((state) => ({ - ...state, - rewards: state.rewards.filter((_, i) => i !== index), - })); - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -export function validateReward(reward: WizardReward): Record { - const errors: Record = {}; - const hash = murmur.murmur3(JSON.stringify(reward)); - - if (!reward.title.trim()) { - errors[`reward_error_title_${hash}`] = "pages.project.edit.rewards.validation.title"; - } - - if (!reward.money.amount || reward.money.amount <= 0) { - errors[`reward_error_amount_${hash}`] = "pages.project.edit.rewards.validation.amount"; - } - - if (reward.isFinite && (!reward.unitsTotal || reward.unitsTotal <= 0)) { - errors[`reward_error_units_${hash}`] = "pages.project.edit.rewards.validation.units"; - } - - return errors; -} - -// ============================================ -// Collaborations State Management (Step 4) -// ============================================ - -/** - * Update Collaborations data (Step 4) - * - * Merges collaborations updates with existing data. - * Triggers auto-save to localStorage. - * - * @param index - Current collaboration's index - * @param collab - Collaboration object to merge - * - * @example - * // Update collaboration - * updateCollaboration(index: currentIndex, collab: updatedCollab); - */ -export function updateCollaboration( - index: number, - collab: WizardCollaboration, -): Record { - const errors = validateCollaboration(collab); - - if (Object.keys(errors).length > 0) { - return errors; - } - - wizardState.update((state) => { - const updated = [...state.collaborations]; - updated[index] = collab; - - return { ...state, collaborations: updated }; - }); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); - - return {}; -} - -export function addCollaboration(collab: WizardCollaboration): Record { - const errors = validateCollaboration(collab); - - if (Object.keys(errors).length > 0) { - return errors; - } - - wizardState.update((state) => ({ - ...state, - collaborations: [...state.collaborations, collab], - })); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); - - return {}; -} - -export function deleteCollaboration(index: number) { - wizardState.update((state) => { - const collaborations = state.collaborations.splice(index, 1); // Remove the collaboration from the array - - return { - ...state, - collaborations: { ...collaborations }, - }; - }); - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -export function validateCollaboration(collab: WizardCollaboration): Record { - const errors: Record = {}; - const hash = murmur.murmur3(JSON.stringify(collab)); - - if (!collab.title.trim()) { - errors[`collab_error_title_${hash}`] = "pages.project.edit.collaborations.validation.title"; - } - - if (collab.description && collab.description.length > 1000) { - errors[`collab_error_description_too_long_${hash}`] = - "pages.project.edit.collaborations.validation.descriptionTooLong"; - } - - if (!collab.description.trim()) { - errors[`collab_error_description_${hash}`] = - "pages.project.edit.collaborations.validation.description"; - } - - return errors; -} - -// ============================================ -// BudgetItems State Management (Step 5) -// ============================================ - -/** - * Update budgetItems data (Step 5) - * - * Merges budget items updates with existing data. - * Triggers auto-save to localStorage. - * - * @param index - Current budget item index - * @param item - Budget item object to merge - * - * @example - * // Update unitsTotal - * updateRewards({ unitsTotal: newCount }); - */ -export function updateBudgetItem(index: number, item: ProjectBudgetItem) { - const errors = validateBudgetItem(item); - - if (Object.keys(errors).length > 0) { - return errors; - } - - wizardState.update((state) => { - const updated = [...state.budgetItems[item.deadline]]; - updated[index] = item; - - return { - ...state, - budgetItems: { - ...state.budgetItems, - [item.deadline]: updated, - }, - }; - }); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -export function addBudgetItem(item: ProjectBudgetItem) { - const errors = validateBudgetItem(item); - - if (Object.keys(errors).length > 0) { - return errors; - } - - wizardState.update((state) => ({ - ...state, - budgetItems: { - ...state.budgetItems, - [item.deadline]: [...state.budgetItems[item.deadline], item], - }, - })); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -export function deleteBudgetItem(index: number, deadline: "minimum" | "optimum") { - wizardState.update((state) => ({ - ...state, - budgetItems: { - ...state.budgetItems, - [deadline]: state.budgetItems[deadline].filter((_, i) => i !== index), - }, - })); - - hasUnsavedChanges.set(true); - saveToLocalStorage(); -} - -export function validateBudgetItem(item: ProjectBudgetItem): Record { - const errors: Record = {}; - const hash = murmur.murmur3(JSON.stringify(item)); - - if (!item.title.trim()) { - errors[`budget_error_title_${hash}`] = "pages.project.edit.budget.validation.title."; - } - - if (!item.description.trim()) { - errors[`budget_error_description_${hash}`] = - "pages.project.edit.budget.validation.description"; - } - - if (!item.money.amount || item.money.amount <= 0) { - errors[`budget_error_amount_${hash}`] = "pages.project.edit.budget.validation.amount"; - } - - if (!item.money.currency) { - errors[`budget_error_currency_${hash}`] = "pages.project.edit.budget.validation.currency"; - } - - if (!item.type) { - errors[`budget_error_type_${hash}`] = "pages.project.edit.budget.validation.type"; - } - - if (!item.deadline || (item.deadline !== "minimum" && item.deadline !== "optimum")) { - errors[`budget_error_deadline_${hash}`] = "pages.project.edit.budget.validation.class"; - } - - return errors; -} - -export function validateBudgetAmount() { - const { budgetItems, budget } = get(wizardState); - const errors: Record = {}; - - if (budgetItems.minimum.length <= 0) { - errors.minimum_length = "pages.project.edit.budget.validation.minimumItemsLength"; - } - - let minimumItemsTotalAmount: number = 0; - - for (let i = 0; i < budgetItems.minimum.length - 1; i++) { - minimumItemsTotalAmount += budgetItems.minimum[i].money.amount; - } - - if (minimumItemsTotalAmount !== budget.amount) { - errors.minimum_length = "pages.project.edit.budget.validation.amountMinimum"; - } - - return errors; -} diff --git a/src/types/campaign.ts b/src/types/campaign.ts index 7503e311..6d15f3e7 100644 --- a/src/types/campaign.ts +++ b/src/types/campaign.ts @@ -30,8 +30,8 @@ export interface Campaign extends Project { title: string; /** Campaign image URL path */ image: string; - /** Current funding amount */ - obtained: Money; + /** Current funding amount — optional when fetched client-side per card */ + obtained?: Money; /** Minimum funding goal */ minimum: Money; /** Optional optimum funding goal */ diff --git a/src/utils/cachedFetch.ts b/src/utils/cachedFetch.ts deleted file mode 100644 index 94b39c53..00000000 --- a/src/utils/cachedFetch.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { getBaseUrl } from "./consts"; -import { extractId } from "./extractId"; -import { client } from "../openapi/client/client.gen"; -import { - apiAccountingsIdGetUrl, - apiGatewayCheckoutsIdGetUrl, - apiProjectsIdOrSlugGetUrl, - apiTipjarsIdGetUrl, - apiUsersIdOrHandleGetUrl, -} from "../openapi/client/paths.gen"; - -import type { Accounting, GatewayCheckout, Project, Tipjar, User } from "../openapi/client"; - -export async function fetchWithPersistentCache( - iri: string, - token: string, - API_CACHE_NAME: string, -): Promise { - const cache = await caches.open(API_CACHE_NAME); - - const cached = await cache.match(iri); - if (cached) return cached.json(); - - const baseUrl = getBaseUrl(); - const fullUrl = joinUrl(baseUrl, iri); - - const response = await fetch(fullUrl, { - headers: { - Authorization: `Bearer ${token}`, - Accept: "application/ld+json", - }, - }); - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - await cache.put(fullUrl, response.clone()); - return response.json(); -} - -export async function fetchAccounting(iri: string | null, token: string, API_CACHE_NAME: string) { - if (!iri) return; - - const url = client.buildUrl({ url: apiAccountingsIdGetUrl, path: { id: extractId(iri) } }); - return fetchWithPersistentCache(url, token, API_CACHE_NAME); -} - -export async function fetchUser(iri: string | null, token: string, API_CACHE_NAME: string) { - if (!iri) return; - - const url = client.buildUrl({ url: apiUsersIdOrHandleGetUrl, path: { id: extractId(iri) } }); - return fetchWithPersistentCache(url, token, API_CACHE_NAME); -} - -export async function fetchProject(iri: string | null, token: string, API_CACHE_NAME: string) { - if (!iri) return; - - const url = client.buildUrl({ - url: apiProjectsIdOrSlugGetUrl, - path: { idOrSlug: extractId(iri) }, - }); - return fetchWithPersistentCache(url, token, API_CACHE_NAME); -} - -export async function fetchCheckout(iri: string | null, token: string, API_CACHE_NAME: string) { - if (!iri) return; - - const url = client.buildUrl({ - url: apiGatewayCheckoutsIdGetUrl, - path: { id: extractId(iri) }, - }); - return fetchWithPersistentCache(url, token, API_CACHE_NAME); -} - -export async function fetchTipjar(iri: string | null, token: string, API_CACHE_NAME: string) { - if (!iri) return; - - const url = client.buildUrl({ - url: apiTipjarsIdGetUrl, - path: { id: extractId(iri) }, - }); - return fetchWithPersistentCache(url, token, API_CACHE_NAME); -} - -function joinUrl(base: string, path: string) { - return `${base.replace(/\/+$/, "")}/${path.replace(/^\/+/, "")}`; -} diff --git a/src/utils/drafts/db.ts b/src/utils/drafts/db.ts new file mode 100644 index 00000000..d57d2643 --- /dev/null +++ b/src/utils/drafts/db.ts @@ -0,0 +1,11 @@ +import { Dexie, type EntityTable } from "dexie"; + +import type { Draft } from "../../stores/drafts/projectDraft"; + +export const db = new Dexie("goteo-project-drafts") as Dexie & { + drafts: EntityTable; +}; + +db.version(2).stores({ + drafts: "draftId, userId, [userId+updatedAt]", +}); diff --git a/src/utils/drafts/repository.ts b/src/utils/drafts/repository.ts new file mode 100644 index 00000000..49c93f68 --- /dev/null +++ b/src/utils/drafts/repository.ts @@ -0,0 +1,48 @@ +import Dexie from "dexie"; + +import { db } from "./db"; + +import type { Draft } from "../../stores/drafts/projectDraft"; + +export const draftRepo = { + async create(draft: Draft) { + await db.drafts.put(draft); + return draft; + }, + + async update(draftId: string, userId: number, data: Partial) { + const existing = await db.drafts.get(draftId); + + if (!existing || existing.userId !== userId) return; + + await db.drafts.put({ + ...existing, + ...data, + updatedAt: new Date(), + }); + }, + + async get(draftId: string) { + const draft = await db.drafts.get(draftId); + + if (!draft) return undefined; + + return draft; + }, + + async getAllByUser(userId: number) { + return db.drafts + .where("[userId+updatedAt]") + .between([userId, Dexie.minKey], [userId, Dexie.maxKey]) + .reverse() + .toArray(); + }, + + async delete(draftId: string, userId: number) { + const draft = await db.drafts.get(draftId); + + if (!draft || draft.userId !== userId) return; + + await db.drafts.delete(draftId); + }, +}; diff --git a/src/utils/hydra.ts b/src/utils/hydra.ts index a660fc09..65288cf9 100644 --- a/src/utils/hydra.ts +++ b/src/utils/hydra.ts @@ -4,11 +4,17 @@ export function toCollectionItems(collection: unknown): T[] { } if (collection && typeof collection === "object") { - const hydraMembers = (collection as Record)["hydra:member"]; + const record = collection as Record; + const hydraMembers = record["hydra:member"]; + const members = record.member; if (Array.isArray(hydraMembers)) { return hydraMembers as T[]; } + + if (Array.isArray(members)) { + return members as T[]; + } } return []; diff --git a/src/utils/objectStorage.ts b/src/utils/objectStorage.ts index 17d55cc3..f0f8cfe4 100644 --- a/src/utils/objectStorage.ts +++ b/src/utils/objectStorage.ts @@ -19,7 +19,19 @@ export const STORAGE_MAXSIZE = 8388608; /** * Allowed MIME types of single objects. */ -export const STORAGE_ALLOWEDTYPES = ["image/jpeg", "image/webp", "image/png", "image/gif"]; +export const STORAGE_ALLOWEDTYPES = [ + "image/jpeg", + "image/webp", + "image/png", + "image/gif", + "application/pdf", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "video/mp4", + "video/webm", +]; export const client = new S3Client({ region: import.meta.env.OBJECT_STORAGE_REGION, diff --git a/src/utils/projectPublisher.ts b/src/utils/projectPublisher.ts new file mode 100644 index 00000000..b45ea634 --- /dev/null +++ b/src/utils/projectPublisher.ts @@ -0,0 +1,182 @@ +import { + createBudgetItem, + createCollaboration, + createReward, + deleteBudgetItem, + deleteCollaboration, + deleteReward, + patchProject, + updateBudgetItem, + updateCollaboration, + updateReward, +} from "./projectSubmissionApi"; +import { validateDraftToPublish } from "../stores/drafts/draftValidation"; + +import type { Session } from "../auth/types"; +import type { ProjectBudgetItem, ProjectCollaboration, ProjectReward } from "../openapi/client"; +import type { Draft, ProjectDraftResources } from "../stores/drafts/projectDraft"; + +export class PublishValidationError extends Error { + constructor(public errors: Record) { + super("Draft validation failed"); + } +} + +function getIds(items: T[]) { + return new Set(items.flatMap((item) => (item.id ? [item.id] : []))); +} + +function flattenBudgetItems(resources: ProjectDraftResources["budgetItems"]) { + return [...resources.minimum, ...resources.optimum]; +} + +async function assertResult(result: { data?: T; error?: unknown }) { + if (result.error) throw result.error; + return result.data; +} + +async function syncRewards(current: ProjectReward[], snapshot: ProjectReward[], session: Session) { + const currentIds = getIds(current); + const deleted = snapshot.filter((reward) => reward.id && !currentIds.has(reward.id)); + + await Promise.all( + deleted.map(async (reward) => { + const result = await deleteReward(reward.id!, session); + await assertResult(result); + }), + ); + + const synced = await Promise.all( + current.map(async (reward) => { + const result = reward.id + ? await updateReward(reward, session) + : await createReward(reward, session); + + return assertResult(result); + }), + ); + + return synced.filter(Boolean) as ProjectReward[]; +} + +async function syncCollaborations( + current: ProjectCollaboration[], + snapshot: ProjectCollaboration[], + session: Session, +) { + const currentIds = getIds(current); + const deleted = snapshot.filter((collab) => collab.id && !currentIds.has(collab.id)); + + await Promise.all( + deleted.map(async (collab) => { + const result = await deleteCollaboration(collab.id!, session); + await assertResult(result); + }), + ); + + const synced = await Promise.all( + current.map(async (collab) => { + const result = collab.id + ? await updateCollaboration(collab, session) + : await createCollaboration(collab, session); + + return assertResult(result); + }), + ); + + return synced.filter(Boolean) as ProjectCollaboration[]; +} + +async function syncBudgetItems( + current: ProjectDraftResources["budgetItems"], + snapshot: ProjectDraftResources["budgetItems"], + session: Session, +) { + const currentItems = flattenBudgetItems(current); + const snapshotItems = flattenBudgetItems(snapshot); + const currentIds = getIds(currentItems); + const deleted = snapshotItems.filter((item) => item.id && !currentIds.has(item.id)); + + await Promise.all( + deleted.map(async (item) => { + const result = await deleteBudgetItem(item.id!, session); + await assertResult(result); + }), + ); + + const synced = await Promise.all( + currentItems.map(async (item) => { + const result = item.id + ? await updateBudgetItem(item, session) + : await createBudgetItem(item, session); + + return assertResult(result); + }), + ); + + const syncedItems = synced.filter(Boolean) as ProjectBudgetItem[]; + + return { + minimum: syncedItems.filter((item) => item.deadline === "minimum"), + optimum: syncedItems.filter((item) => item.deadline === "optimum"), + }; +} + +export async function publishDraft(draft: Draft, session: Session, projectId: string) { + const validationErrors = validateDraftToPublish(draft); + + if (Object.keys(validationErrors).length > 0) { + throw new PublishValidationError(validationErrors); + } + + const wizard = draft.wizardForm; + const apiSnapshot = draft.apiSnapshot ?? { + rewards: [], + collaborations: [], + budgetItems: { + minimum: [], + optimum: [], + }, + }; + + const description = [ + wizard.campaignInfo.objectives, + wizard.campaignInfo.legacy, + wizard.campaignInfo.targetAudience, + wizard.campaignInfo.team, + ] + .filter(Boolean) + .join("\n\n"); + + const result = await patchProject( + projectId, + { + title: draft.createProject.title, + subtitle: draft.createProject.subtitle, + categories: draft.createProject.categories, + video: wizard.campaignInfo.video, + description, + deadline: wizard.configuration.projectDeadline, + }, + session, + ); + + if (result.error) { + throw result.error; + } + + const [rewards, collaborations, budgetItems] = await Promise.all([ + syncRewards(wizard.rewards, apiSnapshot.rewards, session), + syncCollaborations(wizard.collaborations, apiSnapshot.collaborations, session), + syncBudgetItems(wizard.budgetItems, apiSnapshot.budgetItems, session), + ]); + + return { + project: result.data, + resources: { + rewards, + collaborations, + budgetItems, + }, + }; +} diff --git a/src/utils/projectSubmissionApi.ts b/src/utils/projectSubmissionApi.ts new file mode 100644 index 00000000..57efeb88 --- /dev/null +++ b/src/utils/projectSubmissionApi.ts @@ -0,0 +1,152 @@ +import { + apiProjectBudgetItemsGetCollection, + apiProjectBudgetItemsIdDelete, + apiProjectBudgetItemsIdPatch, + apiProjectBudgetItemsPost, + apiProjectCollaborationsGetCollection, + apiProjectCollaborationsIdDelete, + apiProjectCollaborationsIdPatch, + apiProjectCollaborationsPost, + apiProjectRewardsGetCollection, + apiProjectRewardsIdDelete, + apiProjectRewardsIdPatch, + apiProjectRewardsPost, + apiProjectsIdPatch, +} from "../openapi/client"; + +import type { Session } from "../auth/types"; +import type { + ProjectReward, + ProjectCollaboration, + ProjectBudgetItem, + ProjectProjectUpdationDto, +} from "../openapi/client"; +import type { ProjectDraftResources } from "../stores/drafts/projectDraft"; + +export async function patchProject( + projectId: string, + body: ProjectProjectUpdationDto, + session: Session, +) { + return apiProjectsIdPatch({ + path: { id: projectId }, + body, + headers: session.token.asHttpHeaders, + }); +} + +export async function createReward(reward: ProjectReward, session: Session) { + return apiProjectRewardsPost({ + body: reward, + headers: session.token.asHttpHeaders, + }); +} + +export async function updateReward(reward: ProjectReward, session: Session) { + if (!reward.id) { + throw new Error("Cannot update reward without id"); + } + + return apiProjectRewardsIdPatch({ + path: { id: String(reward.id) }, + body: reward, + headers: session.token.asHttpHeaders, + }); +} + +export async function deleteReward(rewardId: number, session: Session) { + return apiProjectRewardsIdDelete({ + path: { id: String(rewardId) }, + headers: session.token.asHttpHeaders, + }); +} + +export async function createCollaboration(collab: ProjectCollaboration, session: Session) { + return apiProjectCollaborationsPost({ + body: { + ...collab, + isFulfilled: false, + }, + headers: session.token.asHttpHeaders, + }); +} + +export async function updateCollaboration(collab: ProjectCollaboration, session: Session) { + if (!collab.id) { + throw new Error("Cannot update collaboration without id"); + } + + return apiProjectCollaborationsIdPatch({ + path: { id: String(collab.id) }, + body: collab, + headers: session.token.asHttpHeaders, + }); +} + +export async function deleteCollaboration(collabId: number, session: Session) { + return apiProjectCollaborationsIdDelete({ + path: { id: String(collabId) }, + headers: session.token.asHttpHeaders, + }); +} + +export async function createBudgetItem(item: ProjectBudgetItem, session: Session) { + return apiProjectBudgetItemsPost({ + body: item, + headers: session.token.asHttpHeaders, + }); +} + +export async function updateBudgetItem(item: ProjectBudgetItem, session: Session) { + if (!item.id) { + throw new Error("Cannot update budget item without id"); + } + + return apiProjectBudgetItemsIdPatch({ + path: { id: String(item.id) }, + body: item, + headers: session.token.asHttpHeaders, + }); +} + +export async function deleteBudgetItem(itemId: number, session: Session) { + return apiProjectBudgetItemsIdDelete({ + path: { id: String(itemId) }, + headers: session.token.asHttpHeaders, + }); +} + +export async function getProjectDraftResources( + projectIri: string, + session: Session, +): Promise { + const [rewardsResult, collaborationsResult, budgetItemsResult] = await Promise.all([ + apiProjectRewardsGetCollection({ + query: { project: projectIri, itemsPerPage: 100 }, + headers: session.token.asHttpHeaders, + }), + apiProjectCollaborationsGetCollection({ + query: { project: projectIri, itemsPerPage: 100 }, + headers: session.token.asHttpHeaders, + }), + apiProjectBudgetItemsGetCollection({ + query: { project: projectIri, itemsPerPage: 100 }, + headers: session.token.asHttpHeaders, + }), + ]); + + if (rewardsResult.error) throw rewardsResult.error; + if (collaborationsResult.error) throw collaborationsResult.error; + if (budgetItemsResult.error) throw budgetItemsResult.error; + + const budgetItems = budgetItemsResult.data ?? []; + + return { + rewards: rewardsResult.data ?? [], + collaborations: collaborationsResult.data ?? [], + budgetItems: { + minimum: budgetItems.filter((item) => item.deadline === "minimum"), + optimum: budgetItems.filter((item) => item.deadline === "optimum"), + }, + }; +}