From 59f5c74269705e0b4529e74c22aff650ab64aac8 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Sun, 3 Aug 2025 19:31:02 -0500 Subject: [PATCH] Chromatic sorting (#284) * Test color palette extraction * Fix import * Add hex <> oklch conversions * Add 'hue' storage to photos * Consolidate color modules * Add chromatic config, track missing color data * Bump deps * Fix lens text test * Finalize color storage * Refactor color imports * Hide form color data when disabled * Store all average oklch color components * Finalize color-config language * Optimize photo syncing for color data * Only update color data when syncing if possible * Build out all color sorts * Debug image colors * Improve color debugging * Improve color logging * Simplify color sorting * Bump deps * Fix color sync logic * Switch to sort params: ascending, descending * Fix commandk sort menu * Update tr-tr sorting language * Add color capture to all photo extractions * Add color visualization to photo form * Standardize photo update language * Create global debug color update function * Improve color data capture logging * Update maximum function duration for admin photos * Add note to remove maxDuration * Use AI to generate sorting color * Conditionally use AI to analyze colors * Manage AI color analysis batched requests * Fix color reporting in admin photo table * Only update color where AI fields are missing * Temporarily upgrade admin/photos timeout * Fix pro-based max duration * Standardize color sorting foundations * Update color sorting language * Refactor color calculations * Restore max duration time * Update color-based sort menu labels * Finalize color documentation * Clean up color test actions * Round color sort values before submitting to db * Consolidate color server actions --- .vscode/settings.json | 4 +- README.md | 12 +- app/admin/photos/[photoId]/edit/page.tsx | 6 +- app/admin/photos/page.tsx | 8 +- app/admin/photos/updates/page.tsx | 12 +- app/admin/uploads/[uploadPath]/page.tsx | 8 +- package.json | 46 +- pnpm-lock.yaml | 3840 +++++++++-------- src/admin/AdminAppMenu.tsx | 2 +- src/admin/AdminNavClient.tsx | 6 +- src/admin/AdminPhotoMenu.tsx | 4 +- src/admin/AdminPhotosClient.tsx | 9 +- src/admin/AdminPhotosTable.tsx | 29 +- src/admin/AdminPhotosTableInfinite.tsx | 2 + ...Client.tsx => AdminPhotosUpdateClient.tsx} | 47 +- src/admin/AdminUploadsTableRow.tsx | 1 + src/admin/PhotoSyncButton.tsx | 31 +- src/admin/actions.ts | 4 +- .../config/AdminAppConfigurationClient.tsx | 107 +- src/admin/config/index.tsx | 2 +- src/admin/confirm.ts | 11 +- src/admin/insights/AdminAppInsights.tsx | 4 +- src/admin/insights/index.ts | 4 +- src/app/config.ts | 24 +- src/app/path.ts | 5 +- src/camera/CameraHeader.tsx | 4 +- src/cmdk/CommandKClient.tsx | 8 +- src/components/EnvVar.tsx | 2 +- src/components/FieldsetWithStatus.tsx | 3 + src/film/FilmHeader.tsx | 4 +- src/focal/FocalLengthHeader.tsx | 4 +- src/i18n/locales/bd-bn.ts | 4 + src/i18n/locales/en-us.ts | 4 + src/i18n/locales/id-id.ts | 4 + src/i18n/locales/pt-br.ts | 4 + src/i18n/locales/pt-pt.ts | 4 + src/i18n/locales/tr-tr.ts | 4 + src/i18n/locales/zh-cn.ts | 4 + src/lens/LensHeader.tsx | 4 +- src/lens/index.ts | 2 +- src/photo/PhotoDetailPage.tsx | 4 +- src/photo/PhotoMedium.tsx | 14 + src/photo/actions.ts | 62 +- src/photo/color/ColorDot.tsx | 49 + src/photo/color/PhotoColors.tsx | 40 + src/photo/color/SyncColorButton.tsx | 37 + src/photo/color/client.ts | 43 + src/photo/color/server.ts | 134 + src/photo/color/sort.ts | 51 + src/photo/db/index.ts | 8 + src/photo/db/migration.ts | 10 +- src/photo/db/query.ts | 108 +- src/photo/form/PhotoForm.tsx | 21 +- src/photo/form/index.ts | 16 + src/photo/index.ts | 23 +- src/photo/server.ts | 40 +- src/photo/sort/SortMenu.tsx | 61 +- src/photo/sort/index.ts | 24 +- src/photo/sort/path.ts | 54 +- src/photo/sync.ts | 87 - src/photo/update/UpdateTooltip.tsx | 21 + src/photo/update/index.ts | 142 + src/platforms/openai.ts | 4 +- src/recents/RecentsHeader.tsx | 4 +- src/recipe/RecipeHeader.tsx | 4 +- src/tag/PrivateHeader.tsx | 4 +- src/tag/TagHeader.tsx | 4 +- src/years/YearHeader.tsx | 4 +- 68 files changed, 3116 insertions(+), 2244 deletions(-) rename src/admin/{AdminPhotosSyncClient.tsx => AdminPhotosUpdateClient.tsx} (78%) create mode 100644 src/photo/color/ColorDot.tsx create mode 100644 src/photo/color/PhotoColors.tsx create mode 100644 src/photo/color/SyncColorButton.tsx create mode 100644 src/photo/color/client.ts create mode 100644 src/photo/color/server.ts create mode 100644 src/photo/color/sort.ts delete mode 100644 src/photo/sync.ts create mode 100644 src/photo/update/UpdateTooltip.tsx create mode 100644 src/photo/update/index.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 42996c0b..774e8317 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,16 +14,17 @@ "cmdk", "Consolas", "CredentialsSignin", + "culori", "datetime", "depluralize", "depluralizes", "Eterna", "exif", "exiftool", - "fieldset", "favicons", "Favoriting", "favs", + "fieldset", "ghijklmnopqrstuv", "GPSH", "Hasselblad", @@ -43,6 +44,7 @@ "nanoids", "nextjs", "nowrap", + "Oklab", "oklch", "parameterizes", "presigner", diff --git a/README.md b/README.md index ac382061..462187b9 100644 --- a/README.md +++ b/README.md @@ -152,13 +152,17 @@ Application behavior can be changed by configuring the following environment var - `taken-at-oldest-first` - `uploaded-at` - `uploaded-at-oldest-first` -- `NEXT_PUBLIC_PRIORITY_BASED_SORTING = 1` takes priority field into account when sorting photos (⚠️ enabling may have performance consequences) - `NEXT_PUBLIC_NAV_SORT_CONTROL` - Controls sort UI on grid/full homepages - Accepted values: - `none` - `toggle` (default) - `menu` +- Color-based sorting (experimental) + - `NEXT_PUBLIC_SORT_BY_COLOR = 1` enables color-based sorting (forces nav sort control to "menu," flags photos missing color data in admin dashboard)—color identification benefits greatly from AI being enabled + - `NEXT_PUBLIC_COLOR_SORT_STARTING_HUE` controls which colors start first (accepts a hue of 0 to 360, default: 80) + - `NEXT_PUBLIC_COLOR_SORT_CHROMA_CUTOFF` controls which colors are considered sufficiently vibrant (accepts a chroma of 0 to 0.37, default: 0.05): +- `NEXT_PUBLIC_PRIORITY_BASED_SORTING = 1` takes priority field into account when sorting photos (⚠️ enabling may have performance consequences) #### Display @@ -286,13 +290,13 @@ Vercel Postgres can be switched to another Postgres-compatible, pooling provider Partial internationalization (for non-admin, user-facing text) provided for a handful of languages. Configure locale by setting environment variable `NEXT_PUBLIC_LOCALE`. ### Supported Languages +- `bd-bn` - `en-us` +- `id-id` - `pt-br` - `pt-pt` -- `id-id` -- `zh-cn` -- `bd-bn` - `tr-tr` +- `zh-cn` To add support for a new language, open a PR following instructions in [/src/i18n/index.ts](https://github.com/sambecker/exif-photo-blog/blob/main/src/i18n/index.ts), using [en-us.ts](https://github.com/sambecker/exif-photo-blog/blob/main/src/i18n/locales/en-us.ts) as reference. diff --git a/app/admin/photos/[photoId]/edit/page.tsx b/app/admin/photos/[photoId]/edit/page.tsx index 75b27714..0bede7e3 100644 --- a/app/admin/photos/[photoId]/edit/page.tsx +++ b/app/admin/photos/[photoId]/edit/page.tsx @@ -8,7 +8,7 @@ import { import { PATH_ADMIN } from '@/app/path'; import PhotoEditPageClient from '@/photo/PhotoEditPageClient'; import { - AI_TEXT_GENERATION_ENABLED, + AI_CONTENT_GENERATION_ENABLED, BLUR_ENABLED, IS_PREVIEW, } from '@/app/config'; @@ -36,10 +36,10 @@ export default async function PhotoEditPage({ if (!photo) { redirect(PATH_ADMIN); } - const hasAiTextGeneration = AI_TEXT_GENERATION_ENABLED; + const hasAiTextGeneration = AI_CONTENT_GENERATION_ENABLED; // Only generate image thumbnails when AI generation is enabled - const imageThumbnailBase64 = AI_TEXT_GENERATION_ENABLED + const imageThumbnailBase64 = AI_CONTENT_GENERATION_ENABLED ? await resizeImageFromUrl( getNextImageUrlForManipulation(photo.url, IS_PREVIEW), ) diff --git a/app/admin/photos/page.tsx b/app/admin/photos/page.tsx index 9d5680bd..c8200b98 100644 --- a/app/admin/photos/page.tsx +++ b/app/admin/photos/page.tsx @@ -1,12 +1,12 @@ import { getStoragePhotoUrlsNoStore } from '@/platforms/storage/cache'; -import { getPhotos, getPhotosInNeedOfSyncCount } from '@/photo/db/query'; +import { getPhotos, getPhotosInNeedOfUpdateCount } from '@/photo/db/query'; import { getPhotosMetaCached } from '@/photo/cache'; import AdminPhotosClient from '@/admin/AdminPhotosClient'; import { revalidatePath } from 'next/cache'; import { cookies } from 'next/headers'; import { TIMEZONE_COOKIE_NAME } from '@/utility/timezone'; import { - AI_TEXT_GENERATION_ENABLED, + AI_CONTENT_GENERATION_ENABLED, PRESERVE_ORIGINAL_UPLOADS, } from '@/app/config'; @@ -34,7 +34,7 @@ export default async function AdminPhotosPage() { getPhotosMetaCached({ hidden: 'include'}) .then(({ count }) => count) .catch(() => 0), - getPhotosInNeedOfSyncCount() + getPhotosInNeedOfUpdateCount() .catch(() => 0), DEBUG_PHOTO_BLOBS ? getStoragePhotoUrlsNoStore() @@ -47,7 +47,7 @@ export default async function AdminPhotosPage() { photosCount, photosCountNeedsSync, shouldResize: !PRESERVE_ORIGINAL_UPLOADS, - hasAiTextGeneration: AI_TEXT_GENERATION_ENABLED, + hasAiTextGeneration: AI_CONTENT_GENERATION_ENABLED, onLastUpload: async () => { 'use server'; // Update upload count in admin nav diff --git a/app/admin/photos/updates/page.tsx b/app/admin/photos/updates/page.tsx index f0851e94..1a90e11c 100644 --- a/app/admin/photos/updates/page.tsx +++ b/app/admin/photos/updates/page.tsx @@ -1,17 +1,17 @@ -import AdminPhotosSyncClient from '@/admin/AdminPhotosSyncClient'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; -import { getPhotosInNeedOfSync } from '@/photo/db/query'; +import AdminPhotosUpdateClient from '@/admin/AdminPhotosUpdateClient'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; +import { getPhotosInNeedOfUpdate } from '@/photo/db/query'; export const maxDuration = 60; export default async function AdminUpdatesPage() { - const photos = await getPhotosInNeedOfSync() + const photos = await getPhotosInNeedOfUpdate() .catch(() => []); return ( - ); } diff --git a/app/admin/uploads/[uploadPath]/page.tsx b/app/admin/uploads/[uploadPath]/page.tsx index ce2d60ad..fcd532b7 100644 --- a/app/admin/uploads/[uploadPath]/page.tsx +++ b/app/admin/uploads/[uploadPath]/page.tsx @@ -9,7 +9,7 @@ import { import UploadPageClient from '@/photo/UploadPageClient'; import { AI_TEXT_AUTO_GENERATED_FIELDS, - AI_TEXT_GENERATION_ENABLED, + AI_CONTENT_GENERATION_ENABLED, BLUR_ENABLED, } from '@/app/config'; import ErrorNote from '@/components/ErrorNote'; @@ -35,12 +35,12 @@ export default async function UploadPage({ params, searchParams }: Params) { } = await extractImageDataFromBlobPath(uploadPath, { includeInitialPhotoFields: true, generateBlurData: BLUR_ENABLED, - generateResizedImage: AI_TEXT_GENERATION_ENABLED, + generateResizedImage: AI_CONTENT_GENERATION_ENABLED, }); const isDataMissing = !formDataFromExif || - (AI_TEXT_GENERATION_ENABLED && !imageThumbnailBase64); + (AI_CONTENT_GENERATION_ENABLED && !imageThumbnailBase64); if (isDataMissing && !error) { // Only redirect if there's no error to report @@ -64,7 +64,7 @@ export default async function UploadPage({ params, searchParams }: Params) { : undefined, ]); - const hasAiTextGeneration = AI_TEXT_GENERATION_ENABLED; + const hasAiTextGeneration = AI_CONTENT_GENERATION_ENABLED; let textFieldsToAutoGenerate = AI_TEXT_AUTO_GENERATED_FIELDS; if (formDataFromExif) { diff --git a/package.json b/package.json index b7c899ed..acf57719 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,14 @@ }, "dependencies": { "@ai-sdk/openai": "^1.3.23", - "@aws-sdk/client-s3": "3.848.0", - "@aws-sdk/s3-request-presigner": "3.848.0", + "@aws-sdk/client-s3": "3.857.0", + "@aws-sdk/s3-request-presigner": "3.857.0", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-tooltip": "^1.2.7", "@radix-ui/react-visually-hidden": "^1.2.3", - "@upstash/ratelimit": "^2.0.5", - "@upstash/redis": "^1.35.1", + "@upstash/ratelimit": "^2.0.6", + "@upstash/redis": "^1.35.3", "@vercel/analytics": "^1.5.0", "@vercel/blob": "^1.1.1", "@vercel/speed-insights": "^1.2.0", @@ -25,17 +25,20 @@ "camelcase-keys": "^9.1.3", "clsx": "^2.1.1", "cmdk": "^1.1.1", + "culori": "^4.0.2", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", + "extract-colors": "^4.2.0", + "fast-average-color": "^9.5.0", "fast-deep-equal": "^3.1.3", - "framer-motion": "^12.23.6", + "framer-motion": "^12.23.12", "nanoid": "^5.1.5", - "next": "15.4.2", + "next": "15.4.5", "next-auth": "5.0.0-beta.29", "next-themes": "^0.4.6", "pg": "^8.16.3", - "react": "19.1.0", - "react-dom": "19.1.0", + "react": "19.1.1", + "react-dom": "19.1.1", "react-icons": "^5.5.0", "sanitize-html": "^2.17.0", "sharp": "^0.34.3", @@ -47,26 +50,28 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@next/bundle-analyzer": "15.4.2", - "@next/eslint-plugin-next": "^15.4.2", + "@next/bundle-analyzer": "15.4.5", + "@next/eslint-plugin-next": "^15.4.5", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/postcss": "^4.1.11", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.6.3", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.6.4", "@testing-library/react": "^16.3.0", + "@types/culori": "^4.0.0", "@types/jest": "^30.0.0", - "@types/node": "^24.0.15", - "@types/pg": "^8.15.4", - "@types/react": "19.1.8", - "@types/react-dom": "19.1.6", + "@types/node": "^24.1.0", + "@types/pg": "^8.15.5", + "@types/react": "19.1.9", + "@types/react-dom": "19.1.7", "@types/sanitize-html": "^2.16.0", "cross-fetch": "^4.1.0", - "eslint": "9.31.0", - "eslint-config-next": "15.4.2", + "eslint": "9.32.0", + "eslint-config-next": "15.4.5", "eslint-plugin-react-hooks": "^5.2.0", - "jest": "^30.0.4", - "jest-environment-jsdom": "^30.0.4", + "jest": "^30.0.5", + "jest-environment-jsdom": "^30.0.5", + "knip": "^5.62.0", "postcss": "8.5.6", "tailwindcss": "4.1.11", "ts-node": "^10.9.2", @@ -76,6 +81,7 @@ "onlyBuiltDependencies": [ "@tailwindcss/oxide", "@vercel/speed-insights", + "oxc-resolver", "sharp", "unrs-resolver" ] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72e9ccad..61ec3db1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,43 +10,43 @@ importers: dependencies: '@ai-sdk/openai': specifier: ^1.3.23 - version: 1.3.23(zod@3.24.2) + version: 1.3.23(zod@3.25.76) '@aws-sdk/client-s3': - specifier: 3.848.0 - version: 3.848.0 + specifier: 3.857.0 + version: 3.857.0 '@aws-sdk/s3-request-presigner': - specifier: 3.848.0 - version: 3.848.0 + specifier: 3.857.0 + version: 3.857.0 '@radix-ui/react-dialog': specifier: ^1.1.14 - version: 1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.15 - version: 2.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-tooltip': specifier: ^1.2.7 - version: 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-visually-hidden': specifier: ^1.2.3 - version: 1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.2.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@upstash/ratelimit': - specifier: ^2.0.5 - version: 2.0.5(@upstash/redis@1.35.1) + specifier: ^2.0.6 + version: 2.0.6(@upstash/redis@1.35.3) '@upstash/redis': - specifier: ^1.35.1 - version: 1.35.1 + specifier: ^1.35.3 + version: 1.35.3 '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(next@15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 1.5.0(next@15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@vercel/blob': specifier: ^1.1.1 version: 1.1.1 '@vercel/speed-insights': specifier: ^1.2.0 - version: 1.2.0(next@15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 1.2.0(next@15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) ai: specifier: ^4.3.19 - version: 4.3.19(react@19.1.0)(zod@3.24.2) + version: 4.3.19(react@19.1.1)(zod@3.25.76) camelcase-keys: specifier: ^9.1.3 version: 9.1.3 @@ -55,43 +55,52 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 1.1.1(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + culori: + specifier: ^4.0.2 + version: 4.0.2 date-fns: specifier: ^4.1.0 version: 4.1.0 date-fns-tz: specifier: ^3.2.0 version: 3.2.0(date-fns@4.1.0) + extract-colors: + specifier: ^4.2.0 + version: 4.2.0 + fast-average-color: + specifier: ^9.5.0 + version: 9.5.0 fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 framer-motion: - specifier: ^12.23.6 - version: 12.23.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^12.23.12 + version: 12.23.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) nanoid: specifier: ^5.1.5 version: 5.1.5 next: - specifier: 15.4.2 - version: 15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 15.4.5 + version: 15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: 5.0.0-beta.29 - version: 5.0.0-beta.29(next@15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 5.0.0-beta.29(next@15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) next-themes: specifier: ^0.4.6 - version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) pg: specifier: ^8.16.3 version: 8.16.3 react: - specifier: 19.1.0 - version: 19.1.0 + specifier: 19.1.1 + version: 19.1.1 react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) + specifier: 19.1.1 + version: 19.1.1(react@19.1.1) react-icons: specifier: ^5.5.0 - version: 5.5.0(react@19.1.0) + version: 5.5.0(react@19.1.1) sanitize-html: specifier: ^2.17.0 version: 2.17.0 @@ -100,16 +109,16 @@ importers: version: 0.34.3 sonner: specifier: ^2.0.6 - version: 2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 2.0.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) swr: specifier: ^2.3.4 - version: 2.3.4(react@19.1.0) + version: 2.3.4(react@19.1.1) ts-exif-parser: specifier: ^0.2.2 version: 0.2.2 use-debounce: specifier: ^10.0.5 - version: 10.0.5(react@19.1.0) + version: 10.0.5(react@19.1.1) viewerjs: specifier: ^1.11.7 version: 1.11.7 @@ -118,11 +127,11 @@ importers: specifier: ^3.3.1 version: 3.3.1 '@next/bundle-analyzer': - specifier: 15.4.2 - version: 15.4.2 + specifier: 15.4.5 + version: 15.4.5 '@next/eslint-plugin-next': - specifier: ^15.4.2 - version: 15.4.2 + specifier: ^15.4.5 + version: 15.4.5 '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.1.11) @@ -133,29 +142,32 @@ importers: specifier: ^4.1.11 version: 4.1.11 '@testing-library/dom': - specifier: ^10.4.0 - version: 10.4.0 + specifier: ^10.4.1 + version: 10.4.1 '@testing-library/jest-dom': - specifier: ^6.6.3 - version: 6.6.3 + specifier: ^6.6.4 + version: 6.6.4 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@types/culori': + specifier: ^4.0.0 + version: 4.0.0 '@types/jest': specifier: ^30.0.0 version: 30.0.0 '@types/node': - specifier: ^24.0.15 - version: 24.0.15 + specifier: ^24.1.0 + version: 24.1.0 '@types/pg': - specifier: ^8.15.4 - version: 8.15.4 + specifier: ^8.15.5 + version: 8.15.5 '@types/react': - specifier: 19.1.8 - version: 19.1.8 + specifier: 19.1.9 + version: 19.1.9 '@types/react-dom': - specifier: 19.1.6 - version: 19.1.6(@types/react@19.1.8) + specifier: 19.1.7 + version: 19.1.7(@types/react@19.1.9) '@types/sanitize-html': specifier: ^2.16.0 version: 2.16.0 @@ -163,20 +175,23 @@ importers: specifier: ^4.1.0 version: 4.1.0 eslint: - specifier: 9.31.0 - version: 9.31.0(jiti@2.4.2) + specifier: 9.32.0 + version: 9.32.0(jiti@2.4.2) eslint-config-next: - specifier: 15.4.2 - version: 15.4.2(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + specifier: 15.4.5 + version: 15.4.5(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.31.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) jest: - specifier: ^30.0.4 - version: 30.0.4(@types/node@24.0.15)(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)) + specifier: ^30.0.5 + version: 30.0.5(@types/node@24.1.0)(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)) jest-environment-jsdom: - specifier: ^30.0.4 - version: 30.0.4 + specifier: ^30.0.5 + version: 30.0.5 + knip: + specifier: ^5.62.0 + version: 5.62.0(@types/node@24.1.0)(typescript@5.8.3) postcss: specifier: 8.5.6 version: 8.5.6 @@ -185,15 +200,15 @@ importers: version: 4.1.11 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@24.0.15)(typescript@5.8.3) + version: 10.9.2(@types/node@24.1.0)(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 packages: - '@adobe/css-tools@4.4.2': - resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==} + '@adobe/css-tools@4.4.3': + resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} '@ai-sdk/openai@1.3.23': resolution: {integrity: sha512-86U7rFp8yacUAOE/Jz8WbGcwMCqWvjK33wk5DXkfnAOEn3mx2r7tNSJdjukQFZbAK97VMXGPPHxF+aEARDXRXQ==} @@ -275,44 +290,44 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.848.0': - resolution: {integrity: sha512-6uT+THQfsB92eAH0p5zvpGiSCtO2ZhGwmuw6HWEngui53YIWz7W/GCnN0G7nrKpgD5DPrMaBwqZvKuoAh9NHAQ==} + '@aws-sdk/client-s3@3.857.0': + resolution: {integrity: sha512-kdNgv0QUIDc3nBStIXa22lX7WbfFmChTDHzONa53ZPIaP2E8CkPJJeZS55VRzHE7FytF34uP+6q1jDysdSTeYA==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.848.0': - resolution: {integrity: sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==} + '@aws-sdk/client-sso@3.857.0': + resolution: {integrity: sha512-0jXF4YJ3mGspNsxOU1rdk1uTtm/xadSWvgU+JQb2YCnallEDeT/Kahlyg4GOzPDj0UnnYWsD2s1Hx82O08SbiQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.846.0': - resolution: {integrity: sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==} + '@aws-sdk/core@3.857.0': + resolution: {integrity: sha512-mgtjKignFcCl19TS6vKbC3e9jtogg6S38a0HFFWjcqMCUAskM+ZROickVTKsYeAk7FoYa2++YkM0qz8J/yteVA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.846.0': - resolution: {integrity: sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==} + '@aws-sdk/credential-provider-env@3.857.0': + resolution: {integrity: sha512-i9NjopufQc7mrJr2lVU4DU5cLGJQ1wNEucnP6XcpCozbJfGJExU9o/VY27qU/pI8V0zK428KXuABuN70Qb+xkw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.846.0': - resolution: {integrity: sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==} + '@aws-sdk/credential-provider-http@3.857.0': + resolution: {integrity: sha512-Ig1dwbn+vO7Fo+2uznZ6Pv0xoLIWz6ndzJygn2eR2MRi6LvZSnTZqbeovjJeoEzWO2xFdK++SyjS7aEuAMAmzw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.848.0': - resolution: {integrity: sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==} + '@aws-sdk/credential-provider-ini@3.857.0': + resolution: {integrity: sha512-w24ABs913sweDFz0aX/PGEfK1jgpV21a2E8p78ueSkQ7Fb7ELVzsv1C16ESFDDF++P4KVkxNQrjRuKw/5+T7ug==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.848.0': - resolution: {integrity: sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==} + '@aws-sdk/credential-provider-node@3.857.0': + resolution: {integrity: sha512-4ulf6NmbGrE1S+8eAHZQ/krvd441KdKvpT3bFoTsg+89YlGwobW+C+vy94qQBx0iKbqkILbLeFF2F/Bf/ACnmw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.846.0': - resolution: {integrity: sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==} + '@aws-sdk/credential-provider-process@3.857.0': + resolution: {integrity: sha512-WLSLM4+vDyrjT+aeaiUHkAxUXUSQSXIQT8ZoS7RHo2BvTlpBOJY9nxvcmKWNCQ2hW2AhVjqBeMjVz3u3fFhoJQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.848.0': - resolution: {integrity: sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==} + '@aws-sdk/credential-provider-sso@3.857.0': + resolution: {integrity: sha512-OfbkZ//9+nC2HH+3cbjjQz4d4ODQsFml38mPvwq7FSiVrUR7hxgE7OQael4urqKVWLEqFt6/PCr+QZq0J4dJ1A==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.848.0': - resolution: {integrity: sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==} + '@aws-sdk/credential-provider-web-identity@3.857.0': + resolution: {integrity: sha512-aj1QbOyhu+bl+gsgIpMuvVRJa1LkgwHzyu6lzjCrPxuPO6ytHDMmii+QUyM9P5K3Xk6fT/JGposhMFB5AtI+Og==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.840.0': @@ -323,8 +338,8 @@ packages: resolution: {integrity: sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.846.0': - resolution: {integrity: sha512-CdkeVfkwt3+bDLhmOwBxvkUf6oY9iUhvosaUnqkoPsOqIiUEN54yTGOnO8A0wLz6mMsZ6aBlfFrQhFnxt3c+yw==} + '@aws-sdk/middleware-flexible-checksums@3.857.0': + resolution: {integrity: sha512-6iHar8RMW1JHYHlho3AQXEwvMmFSfxZHaj6d+TR/os0YrmQFBkLqpK8OBmJ750qa0S6QB22s+8kmbH4BCpeccg==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.840.0': @@ -343,36 +358,36 @@ packages: resolution: {integrity: sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.846.0': - resolution: {integrity: sha512-jP9x+2Q87J5l8FOP+jlAd7vGLn0cC6G9QGmf386e5OslBPqxXKcl3RjqGLIOKKos2mVItY3ApP5xdXQx7jGTVA==} + '@aws-sdk/middleware-sdk-s3@3.857.0': + resolution: {integrity: sha512-qKbr6I6+4kRvI9guR1xnTX3dS37JaIM042/uLYzb65/dUfOm7oxBTDW0+7Jdu92nj5bAChYloKQGEsr7dwKxeg==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.840.0': resolution: {integrity: sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.848.0': - resolution: {integrity: sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==} + '@aws-sdk/middleware-user-agent@3.857.0': + resolution: {integrity: sha512-JPqTxJGwc5QyxpCpDuOi64+z+9krpkv9FidnWjPqqNwLy25Da8espksTzptPivsMzUukdObFWJsDG89/8/I6TQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.848.0': - resolution: {integrity: sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==} + '@aws-sdk/nested-clients@3.857.0': + resolution: {integrity: sha512-3P1GP34hu3Yb7C8bcIqIGASMt/MT/1Lxwy37UJwCn4IrccrvYM3i8y5XX4wW8sn1J5832wB4kdb4HTYbEz6+zw==} engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.840.0': resolution: {integrity: sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==} engines: {node: '>=18.0.0'} - '@aws-sdk/s3-request-presigner@3.848.0': - resolution: {integrity: sha512-fm75L4M98UOPjFORyLdIgsPOuSXdbfpfOl3bNWcWFmeG8tDhqY+lGOyALYEZw/0O1MzEnyeK7wEGwAOf2PO5ZQ==} + '@aws-sdk/s3-request-presigner@3.857.0': + resolution: {integrity: sha512-ysBzl3mMH68XGArmfaIjx88fJRaeA1jBzzRoX/3VKh0I4a8gXtRqWgttTm9YS/tidfFN5qfHeQgc286VMOVFqg==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.846.0': - resolution: {integrity: sha512-ZMfIMxUljqZzPJGOcraC6erwq/z1puNMU35cO1a/WdhB+LdYknMn1lr7SJuH754QwNzzIlZbEgg4hoHw50+DpQ==} + '@aws-sdk/signature-v4-multi-region@3.857.0': + resolution: {integrity: sha512-KVpHAtRjv4oNydwXwAEf2ur4BOAWjjZiT/QtLtTKYbEbnXW1eOFZg4kWwJwHa/T/w2zfPMVf6LhZvyFwLU9XGg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.848.0': - resolution: {integrity: sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==} + '@aws-sdk/token-providers@3.857.0': + resolution: {integrity: sha512-4DBZw+QHpsnpYLXzQtDYCEP9KFFQlYAmNnrCK1bsWoKqnUgjKgwr9Re0yhtNiieHhEE4Lhu+E+IAiNwDx2ClVw==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.840.0': @@ -391,15 +406,15 @@ packages: resolution: {integrity: sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-locate-window@3.723.0': - resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} + '@aws-sdk/util-locate-window@3.804.0': + resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} engines: {node: '>=18.0.0'} '@aws-sdk/util-user-agent-browser@3.840.0': resolution: {integrity: sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==} - '@aws-sdk/util-user-agent-node@3.848.0': - resolution: {integrity: sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==} + '@aws-sdk/util-user-agent-node@3.857.0': + resolution: {integrity: sha512-xWNfAnD2t5yACGW1wM3iLoy2FvRM8N/XjkjgJE1O35gBHn00evtLC9q4nkR4x7+vXdZb8cVw4Y6GmcfMckgFQg==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -411,30 +426,30 @@ packages: resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} engines: {node: '>=18.0.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -453,10 +468,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} @@ -469,8 +480,8 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true @@ -495,8 +506,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -565,20 +576,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -620,20 +631,17 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/runtime@1.4.4': - resolution: {integrity: sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -650,10 +658,6 @@ packages: resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -662,36 +666,36 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + '@eslint/js@9.32.0': + resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.1': - resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} + '@eslint/plugin-kit@0.3.4': + resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + '@floating-ui/react-dom@2.1.4': + resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -709,8 +713,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@img/sharp-darwin-arm64@0.34.3': @@ -851,12 +855,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.0.4': - resolution: {integrity: sha512-tMLCDvBJBwPqMm4OAiuKm2uF5y5Qe26KgcMn+nrDSWpEW+eeFmqA0iO4zJfL16GP7gE3bUUQ3hIuUJ22AqVRnw==} + '@jest/console@30.0.5': + resolution: {integrity: sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.0.4': - resolution: {integrity: sha512-MWScSO9GuU5/HoWjpXAOBs6F/iobvK1XlioelgOM9St7S0Z5WTI9kjCQLPeo4eQRRYusyLW25/J7J5lbFkrYXw==} + '@jest/core@30.0.5': + resolution: {integrity: sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -864,16 +868,12 @@ packages: node-notifier: optional: true - '@jest/diff-sequences@30.0.0': - resolution: {integrity: sha512-xMbtoCeKJDto86GW6AiwVv7M4QAuI56R7dVBr1RNGYbOT44M2TIzOiske2RxopBqkumDY+A1H55pGvuribRY9A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/diff-sequences@30.0.1': resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/environment-jsdom-abstract@30.0.4': - resolution: {integrity: sha512-pUKfqgr5Nki9kZ/3iV+ubDsvtPq0a0oNL6zqkKLM1tPQI8FBJeuWskvW1kzc5pOvqlgpzumYZveJ4bxhANY0hg==} + '@jest/environment-jsdom-abstract@30.0.5': + resolution: {integrity: sha512-gpWwiVxZunkoglP8DCnT3As9x5O8H6gveAOpvaJd2ATAoSh7ZSSCWbr9LQtUMvr8WD3VjG9YnDhsmkCK5WN1rQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -882,48 +882,36 @@ packages: canvas: optional: true - '@jest/environment@30.0.4': - resolution: {integrity: sha512-5NT+sr7ZOb8wW7C4r7wOKnRQ8zmRWQT2gW4j73IXAKp5/PX1Z8MCStBLQDYfIG3n1Sw0NRfYGdp0iIPVooBAFQ==} + '@jest/environment@30.0.5': + resolution: {integrity: sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.0.0': - resolution: {integrity: sha512-UiWfsqNi/+d7xepfOv8KDcbbzcYtkWBe3a3kVDtg6M1kuN6CJ7b4HzIp5e1YHrSaQaVS8sdCoyCMCZClTLNKFQ==} + '@jest/expect-utils@30.0.5': + resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.0.4': - resolution: {integrity: sha512-EgXecHDNfANeqOkcak0DxsoVI4qkDUsR7n/Lr2vtmTBjwLPBnnPOF71S11Q8IObWzxm2QgQoY6f9hzrRD3gHRA==} + '@jest/expect@30.0.5': + resolution: {integrity: sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@30.0.4': - resolution: {integrity: sha512-Z/DL7t67LBHSX4UzDyeYKqOxE/n7lbrrgEwWM3dGiH5Dgn35nk+YtgzKudmfIrBI8DRRrKYY5BCo3317HZV1Fw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/fake-timers@30.0.4': - resolution: {integrity: sha512-qZ7nxOcL5+gwBO6LErvwVy5k06VsX/deqo2XnVUSTV0TNC9lrg8FC3dARbi+5lmrr5VyX5drragK+xLcOjvjYw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/get-type@30.0.0': - resolution: {integrity: sha512-VZWMjrBzqfDKngQ7sUctKeLxanAbsBFoZnPxNIG6CmxK7Gv6K44yqd0nzveNIBfuhGZMmk1n5PGbvdSTOu0yTg==} + '@jest/fake-timers@30.0.5': + resolution: {integrity: sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/get-type@30.0.1': resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@30.0.4': - resolution: {integrity: sha512-avyZuxEHF2EUhFF6NEWVdxkRRV6iXXcIES66DLhuLlU7lXhtFG/ySq/a8SRZmEJSsLkNAFX6z6mm8KWyXe9OEA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/pattern@30.0.0': - resolution: {integrity: sha512-k+TpEThzLVXMkbdxf8KHjZ83Wl+G54ytVJoDIGWwS96Ql4xyASRjc6SU1hs5jHVql+hpyK9G8N7WuFhLpGHRpQ==} + '@jest/globals@30.0.5': + resolution: {integrity: sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@30.0.4': - resolution: {integrity: sha512-6ycNmP0JSJEEys1FbIzHtjl9BP0tOZ/KN6iMeAKrdvGmUsa1qfRdlQRUDKJ4P84hJ3xHw1yTqJt4fvPNHhyE+g==} + '@jest/reporters@30.0.5': + resolution: {integrity: sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -931,119 +919,109 @@ packages: node-notifier: optional: true - '@jest/schemas@30.0.0': - resolution: {integrity: sha512-NID2VRyaEkevCRz6badhfqYwri/RvMbiHY81rk3AkK/LaiB0LSxi1RdVZ7MpZdTjNugtZeGfpL0mLs9Kp3MrQw==} + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/schemas@30.0.1': - resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/snapshot-utils@30.0.4': - resolution: {integrity: sha512-BEpX8M/Y5lG7MI3fmiO+xCnacOrVsnbqVrcDZIT8aSGkKV1w2WwvRQxSWw5SIS8ozg7+h8tSj5EO1Riqqxcdag==} + '@jest/snapshot-utils@30.0.5': + resolution: {integrity: sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@30.0.4': - resolution: {integrity: sha512-Mfpv8kjyKTHqsuu9YugB6z1gcdB3TSSOaKlehtVaiNlClMkEHY+5ZqCY2CrEE3ntpBMlstX/ShDAf84HKWsyIw==} + '@jest/test-result@30.0.5': + resolution: {integrity: sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@30.0.4': - resolution: {integrity: sha512-bj6ePmqi4uxAE8EHE0Slmk5uBYd9Vd/PcVt06CsBxzH4bbA8nGsI1YbXl/NH+eii4XRtyrRx+Cikub0x8H4vDg==} + '@jest/test-sequencer@30.0.5': + resolution: {integrity: sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@30.0.4': - resolution: {integrity: sha512-atvy4hRph/UxdCIBp+UB2jhEA/jJiUeGZ7QPgBi9jUUKNgi3WEoMXGNG7zbbELG2+88PMabUNCDchmqgJy3ELg==} + '@jest/transform@30.0.5': + resolution: {integrity: sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.0.0': - resolution: {integrity: sha512-1Nox8mAL52PKPfEnUQWBvKU/bp8FTT6AiDu76bFDEJj/qsRFSAVSldfCH3XYMqialti2zHXKvD5gN0AaHc0yKA==} + '@jest/types@30.0.5': + resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.0.1': - resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} '@jridgewell/resolve-uri@3.1.2': 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.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@napi-rs/wasm-runtime@0.2.11': - resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/bundle-analyzer@15.4.2': - resolution: {integrity: sha512-kgjecwKDgJ50DZXjVllawD6MuTyxaREB5EUBKbG9NLBHjYu10O/OPL5JqKrBrYdQ9BNVxjGEQoDGcHB76ZjViQ==} + '@napi-rs/wasm-runtime@1.0.1': + resolution: {integrity: sha512-KVlQ/jgywZpixGCKMNwxStmmbYEMyokZpCf2YuIChhfJA2uqfAKNEM8INz7zzTo55iEXfBhIIs3VqYyqzDLj8g==} - '@next/env@15.4.2': - resolution: {integrity: sha512-kd7MvW3pAP7tmk1NaiX4yG15xb2l4gNhteKQxt3f+NGR22qwPymn9RBuv26QKfIKmfo6z2NpgU8W2RT0s0jlvg==} + '@next/bundle-analyzer@15.4.5': + resolution: {integrity: sha512-S2o5Zn5u1iKdn9GrsUd86jvjXRXmKNT/JpQuovfLgUigPC+fshyKvNebvnYSshmztsZL1U7AuUPg71PzAaiHcg==} - '@next/eslint-plugin-next@15.4.2': - resolution: {integrity: sha512-k0rjdWjXBY6tAOty1ckrMETE6Mx66d85NsgcAIdDp7/cXOsTJ93ywmbg3uUcpxX5TUHFEcCWI5mb8nPhwCe9jg==} + '@next/env@15.4.5': + resolution: {integrity: sha512-ruM+q2SCOVCepUiERoxOmZY9ZVoecR3gcXNwCYZRvQQWRjhOiPJGmQ2fAiLR6YKWXcSAh7G79KEFxN3rwhs4LQ==} - '@next/swc-darwin-arm64@15.4.2': - resolution: {integrity: sha512-ovqjR8NjCBdBf1U+R/Gvn0RazTtXS9n6wqs84iFaCS1NHbw9ksVE4dfmsYcLoyUVd9BWE0bjkphOWrrz8uz/uw==} + '@next/eslint-plugin-next@15.4.5': + resolution: {integrity: sha512-YhbrlbEt0m4jJnXHMY/cCUDBAWgd5SaTa5mJjzOt82QwflAFfW/h3+COp2TfVSzhmscIZ5sg2WXt3MLziqCSCw==} + + '@next/swc-darwin-arm64@15.4.5': + resolution: {integrity: sha512-84dAN4fkfdC7nX6udDLz9GzQlMUwEMKD7zsseXrl7FTeIItF8vpk1lhLEnsotiiDt+QFu3O1FVWnqwcRD2U3KA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.4.2': - resolution: {integrity: sha512-I8d4W7tPqbdbHRI4z1iBfaoJIBrEG4fnWKIe+Rj1vIucNZ5cEinfwkBt3RcDF00bFRZRDpvKuDjgMFD3OyRBnw==} + '@next/swc-darwin-x64@15.4.5': + resolution: {integrity: sha512-CL6mfGsKuFSyQjx36p2ftwMNSb8PQog8y0HO/ONLdQqDql7x3aJb/wB+LA651r4we2pp/Ck+qoRVUeZZEvSurA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.4.2': - resolution: {integrity: sha512-lvhz02dU3Ec5thzfQ2RCUeOFADjNkS/px1W7MBt7HMhf0/amMfT8Z/aXOwEA+cVWN7HSDRSUc8hHILoHmvajsg==} + '@next/swc-linux-arm64-gnu@15.4.5': + resolution: {integrity: sha512-1hTVd9n6jpM/thnDc5kYHD1OjjWYpUJrJxY4DlEacT7L5SEOXIifIdTye6SQNNn8JDZrcN+n8AWOmeJ8u3KlvQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.4.2': - resolution: {integrity: sha512-v+5PPfL8UP+KKHS3Mox7QMoeFdMlaV0zeNMIF7eLC4qTiVSO0RPNnK0nkBZSD5BEkkf//c+vI9s/iHxddCZchA==} + '@next/swc-linux-arm64-musl@15.4.5': + resolution: {integrity: sha512-4W+D/nw3RpIwGrqpFi7greZ0hjrCaioGErI7XHgkcTeWdZd146NNu1s4HnaHonLeNTguKnL2Urqvj28UJj6Gqw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.4.2': - resolution: {integrity: sha512-PHLYOC9W2cu6I/JEKo77+LW4uPNvyEQiSkVRUQPsOIsf01PRr8PtPhwtz3XNnC9At8CrzPkzqQ9/kYDg4R4Inw==} + '@next/swc-linux-x64-gnu@15.4.5': + resolution: {integrity: sha512-N6Mgdxe/Cn2K1yMHge6pclffkxzbSGOydXVKYOjYqQXZYjLCfN/CuFkaYDeDHY2VBwSHyM2fUjYBiQCIlxIKDA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.4.2': - resolution: {integrity: sha512-lpmUF9FfLFns4JbTu+5aJGA8aR9dXaA12eoNe9CJbVkGib0FDiPa4kBGTwy0xDxKNGlv3bLDViyx1U+qafmuJQ==} + '@next/swc-linux-x64-musl@15.4.5': + resolution: {integrity: sha512-YZ3bNDrS8v5KiqgWE0xZQgtXgCTUacgFtnEgI4ccotAASwSvcMPDLua7BWLuTfucoRv6mPidXkITJLd8IdJplQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.4.2': - resolution: {integrity: sha512-aMjogoGnRepas0LQ/PBPsvvUzj+IoXw2IoDSEShEtrsu2toBiaxEWzOQuPZ8nie8+1iF7TA63S7rlp3YWAjNEg==} + '@next/swc-win32-arm64-msvc@15.4.5': + resolution: {integrity: sha512-9Wr4t9GkZmMNcTVvSloFtjzbH4vtT4a8+UHqDoVnxA5QyfWe6c5flTH1BIWPGNWSUlofc8dVJAE7j84FQgskvQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.2': - resolution: {integrity: sha512-FxwauyexSFu78wEqR/+NB9MnqXVj6SxJKwcVs2CRjeSX/jBagDCgtR2W36PZUYm0WPgY1pQ3C1+nn7zSnwROuw==} + '@next/swc-win32-x64-msvc@15.4.5': + resolution: {integrity: sha512-voWk7XtGvlsP+w8VBz7lqp8Y+dYw/MTI4KeS0gTVtfdhdJ5QwhXLmNrndFOin/MDoCvUaLWMkYKATaCoUkt2/A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1068,6 +1046,101 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} + '@oxc-resolver/binding-android-arm-eabi@11.6.0': + resolution: {integrity: sha512-UJTf5uZs919qavt9Btvbzkr3eaUu4d+FXBri8AB2BtOezriaTTUvArab2K9fdACQ4yFggTD5ews1l19V/6SW2Q==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.6.0': + resolution: {integrity: sha512-v17j1WLEAIlyc+6JOWPXcky7dkU3fN8nHTP8KSK05zkkBO0t28R3Q0udmNBiJtVSnw4EFB/fy/3Mu2ItpG6bVQ==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.6.0': + resolution: {integrity: sha512-ZrU+qd5AKe8s7PZDLCHY23UpbGn1RAkcNd4JYjOTnX22XEjSqLvyC6pCMngTyfgGVJ4zXFubBkRzt/k3xOjNlQ==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.6.0': + resolution: {integrity: sha512-qBIlX0X0RSxQHcXQnFpBGKxrDVtj7OdpWFGmrcR3NcndVjZ/wJRPST5uTTM83NfsHyuUeOi/vRZjmDrthvhnSQ==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.6.0': + resolution: {integrity: sha512-tTyMlHHNhbkq/oEP/fM8hPZ6lqntHIz6EfOt577/lslrwxC5a/ii0lOOHjPuQtkurpyUBWYPs7Z17EgrZulc4Q==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.6.0': + resolution: {integrity: sha512-tYinHy5k9/rujo21mG2jZckJJD7fsceNDl5HOl/eh5NPjSt2vXQv181PVKeITw3+3i+gI1d666w5EtgpiCegRA==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.6.0': + resolution: {integrity: sha512-aOlGlSiT9fBgSyiIWvSxbyzaBx3XrgCy6UJRrqBkIvMO9D7W90JmV0RsiLua4w43zJSSrfuQQWqmFCwgIib3Iw==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.6.0': + resolution: {integrity: sha512-EZ/OuxZA9qQoAANBDb9V4krfYXU3MC+LZ9qY+cE0yMYMIxm7NT5AdR0OaRQqfa3tWIbina1VF7FaMR6rpKvmlA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.6.0': + resolution: {integrity: sha512-NpF7sID4NnPetpqDk2eOu6TPUt381Qlpos8nGDcSkAluqSsSGFOPfETEB5VbJeqNVQbepEQX9mOxZygFpW0+nA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.6.0': + resolution: {integrity: sha512-Sqn9Ha4rxCCpjpfkFi9f9y9phsaBnseaKw+JqHgBQoNMToe+/20A1jwIu9OX+484UuLpduM+wLydgngjnoi7Dg==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.6.0': + resolution: {integrity: sha512-eFoNcPhImp1FLAQf5U3Nlph4WNWEsdWohSThSTtKPrX+jhPZiVsj3iBC9gjaRwq2Ez4QhP1x7/PSL6mtKnS6rw==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.6.0': + resolution: {integrity: sha512-WQw3CT10aJg7SIc/X1QPrh6lTx2wOLg5IaCu/+Mqlxf1nZBEW3+tV/+y3PzXG0MCRhq7FDTiHaW8MBVAwBineQ==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.6.0': + resolution: {integrity: sha512-p5qcPr/EtGJ2PpeeArL3ifZU/YljWLypeu38+e19z2dyPv8Aoby8tjM+D1VTI8+suMwTkseyove/uu6zIUiqRw==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.6.0': + resolution: {integrity: sha512-/9M/ieoY5v54k3UjtF9Vw43WQ4bBfed+qRL1uIpFbZcO2qi5aXwVMYnjSd/BoaRtDs5JFV9iOjzHwpw0zdOYZA==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.6.0': + resolution: {integrity: sha512-HMtWWHTU7zbwceTFZPAPMMhhWR1nNO2OR60r6i55VprCMvttTWPQl7uLP0AUtAPoU9B/2GqP48rzOuaaKhHnYw==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-wasm32-wasi@11.6.0': + resolution: {integrity: sha512-rDAwr2oqmnG/6LSZJwvO3Bmt/RC3/Q6myyaUmg3P7GhZDyFPrWJONB7NFhPwU2Q4JIpA73ST4LBdhzmGxMTmrw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.6.0': + resolution: {integrity: sha512-COzy8weljZo2lObWl6ZzW6ypDx1v1rtLdnt7JPjTUARikK1gMzlz9kouQhCtCegNFILx2L2oWw7714fnchqujw==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-ia32-msvc@11.6.0': + resolution: {integrity: sha512-p2tMRdi91CovjLBApDPD/uEy1/5r7U6iVkfagLYDytgvj6nJ1EAxLUdXbhoe6//50IvDC/5I51nGCdxmOUiXlQ==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.6.0': + resolution: {integrity: sha512-p6b9q5TACd/y39kDK2HENXqd4lThoVrTkxdvizqd5/VwyHcoSd0cDcIEhHpxvfjc83VsODCBgB/zcjp//TlaqA==} + cpu: [x64] + os: [win32] + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -1075,12 +1148,12 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.7': - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@polka/url@1.0.0-next.28': - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} '@radix-ui/primitive@1.1.2': resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} @@ -1111,15 +1184,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.1.1': - resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: @@ -1208,15 +1272,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: @@ -1278,19 +1333,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.0.2': - resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-primitive@2.1.3': resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: @@ -1317,15 +1359,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.1.2': - resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: @@ -1384,15 +1417,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-layout-effect@1.1.1': resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: @@ -1439,11 +1463,11 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.5': - resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + '@rushstack/eslint-patch@1.12.0': + resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} - '@sinclair/typebox@0.34.33': - resolution: {integrity: sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g==} + '@sinclair/typebox@0.34.38': + resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -1467,8 +1491,8 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.7.0': - resolution: {integrity: sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==} + '@smithy/core@3.7.2': + resolution: {integrity: sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.0.6': @@ -1531,12 +1555,12 @@ packages: resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.15': - resolution: {integrity: sha512-L2M0oz+r6Wv0KZ90MgClXmWkV7G72519Hd5/+K5i3gQMu4WNQykh7ERr58WT3q60dd9NqHSMc3/bAK0FsFg3Fw==} + '@smithy/middleware-endpoint@4.1.17': + resolution: {integrity: sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.16': - resolution: {integrity: sha512-PpPhMpC6U1fLW0evKnC8gJtmobBYn0oi4RrIKGhN1a86t6XgVEK+Vb9C8dh5PPXb3YDr8lE6aYKh1hd3OikmWw==} + '@smithy/middleware-retry@4.1.18': + resolution: {integrity: sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.0.8': @@ -1583,8 +1607,8 @@ packages: resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.4.7': - resolution: {integrity: sha512-x+MxBNOcG7rY9i5QsbdgvvRJngKKvUJrbU5R5bT66PTH3e6htSupJ4Q+kJ3E7t6q854jyl57acjpPi6qG1OY5g==} + '@smithy/smithy-client@4.4.9': + resolution: {integrity: sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==} engines: {node: '>=18.0.0'} '@smithy/types@4.3.1': @@ -1619,12 +1643,12 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.23': - resolution: {integrity: sha512-NqRi6VvEIwpJ+KSdqI85+HH46H7uVoNqVTs2QO7p1YKnS7k8VZnunJj8R5KdmmVnTojkaL1OMPyZC8uR5F7fSg==} + '@smithy/util-defaults-mode-browser@4.0.25': + resolution: {integrity: sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.23': - resolution: {integrity: sha512-NE9NtEVigFa+HHJ5bBeQT7KF3KiltW880CLN9TnWWL55akeou3ziRAHO22QSUPgPZ/nqMfPXi/LGMQ6xQvXPNQ==} + '@smithy/util-defaults-mode-node@4.0.25': + resolution: {integrity: sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.0.6': @@ -1764,12 +1788,12 @@ packages: '@tailwindcss/postcss@4.1.11': resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.6.3': - resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + '@testing-library/jest-dom@6.6.4': + resolution: {integrity: sha512-xDXgLjVunjHqczScfkCJ9iyjdNOVHvvCdqHSSxwM9L0l/wHkTRum67SDc020uAlCoqktJplgO2AAQeLP1wgqDQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@testing-library/react@16.3.0': @@ -1799,8 +1823,8 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1808,20 +1832,23 @@ packages: '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/culori@4.0.0': + resolution: {integrity: sha512-aFljQwjb++sl6TAyEXeHTiK/fk9epZOQ+nMmadjnAvzZFIvNoQ0x8XQYfcOaRTBwmDUPUlghhZCJ66MTcqQAsg==} '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -1844,19 +1871,19 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@24.0.15': - resolution: {integrity: sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==} + '@types/node@24.1.0': + resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} - '@types/pg@8.15.4': - resolution: {integrity: sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==} + '@types/pg@8.15.5': + resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} - '@types/react-dom@19.1.6': - resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} + '@types/react-dom@19.1.7': + resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.8': - resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + '@types/react@19.1.9': + resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} '@types/sanitize-html@2.16.0': resolution: {integrity: sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==} @@ -1876,148 +1903,160 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.24.1': - resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} + '@typescript-eslint/eslint-plugin@8.38.0': + resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.38.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.24.1': - resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} + '@typescript-eslint/parser@8.38.0': + resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.24.1': - resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} + '@typescript-eslint/project-service@8.38.0': + resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.38.0': + resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.24.1': - resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} + '@typescript-eslint/tsconfig-utils@8.38.0': + resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.38.0': + resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.24.1': - resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} + '@typescript-eslint/types@8.38.0': + resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.24.1': - resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} + '@typescript-eslint/typescript-estree@8.38.0': + resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.24.1': - resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} + '@typescript-eslint/utils@8.38.0': + resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.24.1': - resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} + '@typescript-eslint/visitor-keys@8.38.0': + resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-android-arm-eabi@1.9.0': - resolution: {integrity: sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.9.0': - resolution: {integrity: sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==} + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.9.0': - resolution: {integrity: sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==} + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.9.0': - resolution: {integrity: sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==} + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.9.0': - resolution: {integrity: sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==} + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': - resolution: {integrity: sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': - resolution: {integrity: sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': - resolution: {integrity: sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==} + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.9.0': - resolution: {integrity: sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==} + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': - resolution: {integrity: sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': - resolution: {integrity: sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': - resolution: {integrity: sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==} + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': - resolution: {integrity: sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==} + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.9.0': - resolution: {integrity: sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==} + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.9.0': - resolution: {integrity: sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==} + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.9.0': - resolution: {integrity: sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==} + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': - resolution: {integrity: sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==} + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': - resolution: {integrity: sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==} + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.9.0': - resolution: {integrity: sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==} + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} cpu: [x64] os: [win32] @@ -2025,13 +2064,13 @@ packages: resolution: {integrity: sha512-7qJHGxpQgQr9/vmeS1PktEwvNAF7TI4iJDi8Pu2CFZ9YUGHZH4fOP5TfYlZ4aVxfopnELiE4BS4FBjyK7V1/xQ==} engines: {node: '>=16.0.0'} - '@upstash/ratelimit@2.0.5': - resolution: {integrity: sha512-1FRv0cs3ZlBjCNOCpCmKYmt9BYGIJf0J0R3pucOPE88R21rL7jNjXG+I+rN/BVOvYJhI9niRAS/JaSNjiSICxA==} + '@upstash/ratelimit@2.0.6': + resolution: {integrity: sha512-Uak5qklMfzFN5RXltxY6IXRENu+Hgmo9iEgMPOlUs2etSQas2N+hJfbHw37OUy4vldLRXeD0OzL+YRvO2l5acg==} peerDependencies: '@upstash/redis': ^1.34.3 - '@upstash/redis@1.35.1': - resolution: {integrity: sha512-sIMuAMU9IYbE2bkgDby8KLoQKRiBMXn0moXxqLvUmQ7VUu2CvulZLtK8O0x3WQZFvvZhU5sRC2/lOVZdGfudkA==} + '@upstash/redis@1.35.3': + resolution: {integrity: sha512-hSjv66NOuahW3MisRGlSgoszU2uONAY2l5Qo3Sae8OT3/Tng9K+2/cBRuyPBX8egwEGcNNCF9+r0V6grNnhL+w==} '@vercel/analytics@1.5.0': resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==} @@ -2095,18 +2134,13 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} ai@4.3.19: @@ -2159,8 +2193,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} aria-query@5.3.0: @@ -2174,16 +2208,16 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: @@ -2216,16 +2250,16 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.10.2: - resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + axe-core@4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-jest@30.0.4: - resolution: {integrity: sha512-UjG2j7sAOqsp2Xua1mS/e+ekddkSu3wpf4nZUSvXNHuVWdaOUXQ77+uyjJLDE9i0atm5x4kds8K9yb5lRsRtcA==} + babel-jest@30.0.5: + resolution: {integrity: sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 @@ -2255,18 +2289,18 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2284,8 +2318,8 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: @@ -2308,12 +2342,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001700: - resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} - - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -2331,8 +2361,8 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - ci-info@4.2.0: - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} cjs-module-lexer@2.1.0: @@ -2399,13 +2429,17 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssstyle@4.4.0: - resolution: {integrity: sha512-W0Y2HOXlPkb2yaKrCVRjinYKciu/qSLEmK0K9mcfDei3zwlnHFEHAs/Du3cIRwPqY+J4JsiBzUjoHyc8RsJ03A==} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + culori@4.0.2: + resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -2444,8 +2478,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2453,8 +2487,8 @@ packages: supports-color: optional: true - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} dedent@1.6.0: resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} @@ -2534,8 +2568,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.102: - resolution: {integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==} + electron-to-chromium@1.5.189: + resolution: {integrity: sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2547,19 +2581,23 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} 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'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2602,8 +2640,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.4.2: - resolution: {integrity: sha512-rAeZyTWn1/36Y+S+KpJ/W+RAUmM6fpBWsON4Uci+5l9DIKrhkMK0rgAZQ45ktx+xFk5tyYwkTBGit/9jalsHrw==} + eslint-config-next@15.4.5: + resolution: {integrity: sha512-IMijiXaZ43qFB+Gcpnb374ipTKD8JIyVNR+6VsifFQ/LHyx+A9wgcgSIhCX5PYSjwOoSYD5LtNHKlM5uc23eww==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -2614,8 +2652,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.8.1: - resolution: {integrity: sha512-qw5TPA12HTmb9CkcuiNrFtwhM1ae2FWysLeRrTbQ+/JKS///gbL3fQ5LRhAZnzkcqkScOvkB5Y5o+xgyQz1VVg==} + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -2627,8 +2665,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2648,8 +2686,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2670,8 +2708,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -2684,16 +2722,12 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@4.2.1: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + eslint@9.32.0: + resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2702,10 +2736,6 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2739,13 +2769,16 @@ packages: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} - expect@30.0.0: - resolution: {integrity: sha512-xCdPp6gwiR9q9lsPCHANarIkFTN/IMZso6Kkq03sOm9IIGtzK/UJqml0dkhHibGh8HKOj8BIDIpZ0BZuU7QK6w==} + expect@30.0.5: + resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - expect@30.0.4: - resolution: {integrity: sha512-dDLGjnP2cKbEppxVICxI/Uf4YemmGMPNy0QytCbfafbpYk9AFQsxb8Uyrxii0RPK7FWgLGlSem+07WirwS3cFQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + extract-colors@4.2.0: + resolution: {integrity: sha512-+0X1EMDSea/upbny8RMEoBZdB0in6yiWFVDNZy2d/ehXINRCly+PXC8gp7enSJomeB9dhD7Sud4jzROStuHOJA==} + + fast-average-color@9.5.0: + resolution: {integrity: sha512-nC6x2YIlJ9xxgkMFMd1BNoM1ctMjNoRKfRliPmiEWW3S6rLTHiQcy9g3pt/xiKv/D0NAAkhb9VyV+WJFvTqMGg==} + engines: {node: '>= 12'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2768,14 +2801,17 @@ packages: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true - fastq@1.19.0: - resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2802,8 +2838,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} @@ -2813,8 +2849,13 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - framer-motion@12.23.6: - resolution: {integrity: sha512-dsJ389QImVE3lQvM8Mnk99/j8tiZDM/7706PCqvkQ8sSCnpmWxsgX+g0lj7r5OBVL0U36pIecCTBoIWcM2RuKw==} + formatly@0.2.4: + resolution: {integrity: sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA==} + engines: {node: '>=18.3.0'} + hasBin: true + + framer-motion@12.23.12: + resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2853,8 +2894,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-nonce@1.0.1: @@ -2877,8 +2918,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -2896,10 +2937,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2979,6 +3016,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -3033,8 +3074,8 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - is-bun-module@1.3.0: - resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -3080,6 +3121,10 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -3171,16 +3216,16 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-changed-files@30.0.2: - resolution: {integrity: sha512-Ius/iRST9FKfJI+I+kpiDh8JuUlAISnRszF9ixZDIqJF17FckH5sOzKC8a0wd0+D+8em5ADRHA5V5MnfeDk2WA==} + jest-changed-files@30.0.5: + resolution: {integrity: sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@30.0.4: - resolution: {integrity: sha512-o6UNVfbXbmzjYgmVPtSQrr5xFZCtkDZGdTlptYvGFSN80RuOOlTe73djvMrs+QAuSERZWcHBNIOMH+OEqvjWuw==} + jest-circus@30.0.5: + resolution: {integrity: sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.0.4: - resolution: {integrity: sha512-3dOrP3zqCWBkjoVG1zjYJpD9143N9GUCbwaF2pFF5brnIgRLHmKcCIw+83BvF1LxggfMWBA0gxkn6RuQVuRhIQ==} + jest-cli@30.0.5: + resolution: {integrity: sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -3189,8 +3234,8 @@ packages: node-notifier: optional: true - jest-config@30.0.4: - resolution: {integrity: sha512-3dzbO6sh34thAGEjJIW0fgT0GA0EVlkski6ZzMcbW6dzhenylXAE/Mj2MI4HonroWbkKc6wU6bLVQ8dvBSZ9lA==} + jest-config@30.0.5: + resolution: {integrity: sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' @@ -3204,24 +3249,20 @@ packages: ts-node: optional: true - jest-diff@30.0.0: - resolution: {integrity: sha512-TgT1+KipV8JTLXXeFX0qSvIJR/UXiNNojjxb/awh3vYlBZyChU/NEmyKmq+wijKjWEztyrGJFL790nqMqNjTHA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-diff@30.0.4: - resolution: {integrity: sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==} + jest-diff@30.0.5: + resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-docblock@30.0.1: resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@30.0.2: - resolution: {integrity: sha512-ZFRsTpe5FUWFQ9cWTMguCaiA6kkW5whccPy9JjD1ezxh+mJeqmz8naL8Fl/oSbNJv3rgB0x87WBIkA5CObIUZQ==} + jest-each@30.0.5: + resolution: {integrity: sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-jsdom@30.0.4: - resolution: {integrity: sha512-9WmS3oyCLFgs6DUJSoMpVb+AbH62Y2Xecw3XClbRgj6/Z+VjNeSLjrhBgVvTZ40njZTWeDHv8unp+6M/z8ADDg==} + jest-environment-jsdom@30.0.5: + resolution: {integrity: sha512-BmnDEoAH+jEjkPrvE9DTKS2r3jYSJWlN/r46h0/DBUxKrkgt2jAZ5Nj4wXLAcV1KWkRpcFqA5zri9SWzJZ1cCg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -3229,40 +3270,28 @@ packages: canvas: optional: true - jest-environment-node@30.0.4: - resolution: {integrity: sha512-p+rLEzC2eThXqiNh9GHHTC0OW5Ca4ZfcURp7scPjYBcmgpR9HG6750716GuUipYf2AcThU3k20B31USuiaaIEg==} + jest-environment-node@30.0.5: + resolution: {integrity: sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-haste-map@30.0.2: - resolution: {integrity: sha512-telJBKpNLeCb4MaX+I5k496556Y2FiKR/QLZc0+MGBYl4k3OO0472drlV2LUe7c1Glng5HuAu+5GLYp//GpdOQ==} + jest-haste-map@30.0.5: + resolution: {integrity: sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-leak-detector@30.0.2: - resolution: {integrity: sha512-U66sRrAYdALq+2qtKffBLDWsQ/XoNNs2Lcr83sc9lvE/hEpNafJlq2lXCPUBMNqamMECNxSIekLfe69qg4KMIQ==} + jest-leak-detector@30.0.5: + resolution: {integrity: sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.0.0: - resolution: {integrity: sha512-m5mrunqopkrqwG1mMdJxe1J4uGmS9AHHKYUmoxeQOxBcLjEvirIrIDwuKmUYrecPHVB/PUBpXs2gPoeA2FSSLQ==} + jest-matcher-utils@30.0.5: + resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.0.4: - resolution: {integrity: sha512-ubCewJ54YzeAZ2JeHHGVoU+eDIpQFsfPQs0xURPWoNiO42LGJ+QGgfSf+hFIRplkZDkhH5MOvuxHKXRTUU3dUQ==} + jest-message-util@30.0.5: + resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@30.0.0: - resolution: {integrity: sha512-pV3qcrb4utEsa/U7UI2VayNzSDQcmCllBZLSoIucrESRu0geKThFZOjjh0kACDJFJRAQwsK7GVsmS6SpEceD8w==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-message-util@30.0.2: - resolution: {integrity: sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-mock@30.0.0: - resolution: {integrity: sha512-W2sRA4ALXILrEetEOh2ooZG6fZ01iwVs0OWMKSSWRcUlaLr4ESHuiKXDNTg+ZVgOq8Ei5445i/Yxrv59VT+XkA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-mock@30.0.2: - resolution: {integrity: sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==} + jest-mock@30.0.5: + resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-pnp-resolver@1.2.3: @@ -3274,56 +3303,48 @@ packages: jest-resolve: optional: true - jest-regex-util@30.0.0: - resolution: {integrity: sha512-rT84010qRu/5OOU7a9TeidC2Tp3Qgt9Sty4pOZ/VSDuEmRupIjKZAb53gU3jr4ooMlhwScrgC9UixJxWzVu9oQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-regex-util@30.0.1: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@30.0.4: - resolution: {integrity: sha512-EQBYow19B/hKr4gUTn+l8Z+YLlP2X0IoPyp0UydOtrcPbIOYzJ8LKdFd+yrbwztPQvmlBFUwGPPEzHH1bAvFAw==} + jest-resolve-dependencies@30.0.5: + resolution: {integrity: sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@30.0.2: - resolution: {integrity: sha512-q/XT0XQvRemykZsvRopbG6FQUT6/ra+XV6rPijyjT6D0msOyCvR2A5PlWZLd+fH0U8XWKZfDiAgrUNDNX2BkCw==} + jest-resolve@30.0.5: + resolution: {integrity: sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@30.0.4: - resolution: {integrity: sha512-mxY0vTAEsowJwvFJo5pVivbCpuu6dgdXRmt3v3MXjBxFly7/lTk3Td0PaMyGOeNQUFmSuGEsGYqhbn7PA9OekQ==} + jest-runner@30.0.5: + resolution: {integrity: sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@30.0.4: - resolution: {integrity: sha512-tUQrZ8+IzoZYIHoPDQEB4jZoPyzBjLjq7sk0KVyd5UPRjRDOsN7o6UlvaGF8ddpGsjznl9PW+KRgWqCNO+Hn7w==} + jest-runtime@30.0.5: + resolution: {integrity: sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@30.0.4: - resolution: {integrity: sha512-S/8hmSkeUib8WRUq9pWEb5zMfsOjiYWDWzFzKnjX7eDyKKgimsu9hcmsUEg8a7dPAw8s/FacxsXquq71pDgPjQ==} + jest-snapshot@30.0.5: + resolution: {integrity: sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@30.0.0: - resolution: {integrity: sha512-fhNBBM9uSUbd4Lzsf8l/kcAdaHD/4SgoI48en3HXcBEMwKwoleKFMZ6cYEYs21SB779PRuRCyNLmymApAm8tZw==} + jest-util@30.0.5: + resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@30.0.2: - resolution: {integrity: sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==} + jest-validate@30.0.5: + resolution: {integrity: sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@30.0.2: - resolution: {integrity: sha512-noOvul+SFER4RIvNAwGn6nmV2fXqBq67j+hKGHKGFCmK4ks/Iy1FSrqQNBLGKlu4ZZIRL6Kg1U72N1nxuRCrGQ==} + jest-watcher@30.0.5: + resolution: {integrity: sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@30.0.4: - resolution: {integrity: sha512-YESbdHDs7aQOCSSKffG8jXqOKFqw4q4YqR+wHYpR5GWEQioGvL0BfbcjvKIvPEM0XGfsfJrka7jJz3Cc3gI4VQ==} + jest-worker@30.0.5: + resolution: {integrity: sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-worker@30.0.2: - resolution: {integrity: sha512-RN1eQmx7qSLFA+o9pfJKlqViwL5wt+OL3Vff/A+/cPsmuw7NPwfgl33AP+/agRmHzPOFgXviRycR9kYwlcRQXg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest@30.0.4: - resolution: {integrity: sha512-9QE0RS4WwTj/TtTC4h/eFVmFAhGNVerSB9XpJh8sqaXlP73ILcPcZ7JWjjEtJJe2m8QyBLKKfPQuK+3F+Xij/g==} + jest@30.0.5: + resolution: {integrity: sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -3336,8 +3357,8 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jose@6.0.10: - resolution: {integrity: sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw==} + jose@6.0.12: + resolution: {integrity: sha512-T8xypXs8CpmiIi78k0E+Lk7T2zlK4zDyg+o1CZ4AkOHgDg98ogdP2BeZ61lTFKFyoEwJ9RgAgN+SdM3iPgNonQ==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3400,6 +3421,14 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + knip@5.62.0: + resolution: {integrity: sha512-hfTUVzmrMNMT1khlZfAYmBABeehwWUUrizLQoLamoRhSFkygsGIXWx31kaWKBgEaIVL77T3Uz7IxGvSw+CvQ6A==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4' + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -3577,8 +3606,8 @@ packages: engines: {node: '>=10'} hasBin: true - motion-dom@12.23.6: - resolution: {integrity: sha512-G2w6Nw7ZOVSzcQmsdLc0doMe64O/Sbuc2bVAbgMz6oP/6/pRStKRiVRV4bQfHp5AHYAKEGhEdVHTM+R3FDgi5w==} + motion-dom@12.23.12: + resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} motion-utils@12.23.6: resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} @@ -3600,8 +3629,8 @@ packages: engines: {node: ^18 || >=20} hasBin: true - napi-postinstall@0.2.4: - resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + napi-postinstall@0.3.2: + resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -3630,8 +3659,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.4.2: - resolution: {integrity: sha512-oH1rmFso+84NIkocfuxaGKcXIjMUTmnzV2x0m8qsYtB4gD6iflLMESXt5XJ8cFgWMBei4v88rNr/j+peNg72XA==} + next@15.4.5: + resolution: {integrity: sha512-nJ4v+IO9CPmbmcvsPebIoX3Q+S7f6Fu08/dEWu0Ttfa+wVwQRh9epcmsyCPjmL2b8MxC+CkBR97jgDhUUztI3g==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3674,11 +3703,11 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - nwsapi@2.2.16: - resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + nwsapi@2.2.20: + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - oauth4webapi@3.5.0: - resolution: {integrity: sha512-DF3mLWNuxPkxJkHmWxbSFz4aE5CjWOsm465VBfBdWzmzX4Mg3vF8icxK+iKqfdWrIumBJ2TaoNQWx+SQc2bsPQ==} + oauth4webapi@3.6.0: + resolution: {integrity: sha512-OwXPTXjKPOldTpAa19oksrX9TYHA0rt+VcUFTkJ7QKwgmevPpNm9Cn5vFZUtIo96FiU6AfPuUUGzoXqgOzibWg==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -3696,8 +3725,8 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} object.fromentries@2.0.8: @@ -3731,6 +3760,9 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxc-resolver@11.6.0: + resolution: {integrity: sha512-Yj3Wy+zLljtFL8ByKOljaPhiXjJWVe875p5MHaT5VAHoEmzeg1BuswM8s/E7ErpJ3s0fsXJfUYJE4v1bl7N65g==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3765,8 +3797,8 @@ packages: parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} - parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -3802,9 +3834,6 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.10.0: - resolution: {integrity: sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==} - pg-protocol@1.10.3: resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} @@ -3831,8 +3860,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pirates@4.0.7: @@ -3887,12 +3916,8 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@30.0.0: - resolution: {integrity: sha512-18NAOUr4ZOQiIR+BgI5NhQE7uREdx4ZyV0dyay5izh4yfQ+1T7BSvggxvRGoXocrRyevqW5OhScUjbi9GB8R8Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - pretty-format@30.0.2: - resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} + pretty-format@30.0.5: + resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} prop-types@15.8.1: @@ -3912,10 +3937,10 @@ packages: resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} engines: {node: '>=12'} - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + react-dom@19.1.1: + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: - react: ^19.1.0 + react: ^19.1.1 react-icons@5.5.0: resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} @@ -3941,8 +3966,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.6.3: - resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} engines: {node: '>=10'} peerDependencies: '@types/react': '*' @@ -3961,8 +3986,8 @@ packages: '@types/react': optional: true - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} redent@3.0.0: @@ -3973,9 +3998,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -4012,8 +4034,8 @@ packages: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rrweb-cssom@0.8.0: @@ -4120,6 +4142,10 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + smol-toml@1.4.1: + resolution: {integrity: sha512-CxdwHXyYTONGHThDbq5XdwbFsuY4wlClRGejfE2NtwUtiHYsP1QtNsHb/hnj31jKYSchztJsaA8pSQoVzkfCFg==} + engines: {node: '>= 18'} + sonner@2.0.6: resolution: {integrity: sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q==} peerDependencies: @@ -4144,13 +4170,17 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -4214,6 +4244,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.2: + resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} + engines: {node: '>=14.16'} + strnum@2.1.1: resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} @@ -4250,15 +4284,15 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.8: - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} tailwindcss@4.1.11: resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} tar@7.4.3: @@ -4273,8 +4307,8 @@ packages: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} - tinyglobby@0.2.11: - resolution: {integrity: sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} tldts-core@6.1.86: @@ -4306,8 +4340,8 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} - ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -4347,8 +4381,8 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@4.35.0: - resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} typed-array-buffer@1.0.3: @@ -4382,15 +4416,15 @@ packages: undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - undici@5.28.5: - resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - unrs-resolver@1.9.0: - resolution: {integrity: sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - update-browserslist-db@1.1.2: - resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4424,8 +4458,8 @@ packages: '@types/react': optional: true - use-sync-external-store@1.4.0: - resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4447,6 +4481,10 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -4489,8 +4527,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4529,8 +4567,8 @@ packages: utf-8-validate: optional: true - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4579,58 +4617,64 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-to-json-schema@3.24.1: - resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} peerDependencies: zod: ^3.24.1 - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod-validation-error@3.5.3: + resolution: {integrity: sha512-OT5Y8lbUadqVZCsnyFaTQ4/O2mys4tj7PqhdbBCp7McPwvIEKfPtdA6QfPeFQK2/Rz5LgwmAXRJTugBNBi0btw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: - '@adobe/css-tools@4.4.2': {} + '@adobe/css-tools@4.4.3': {} - '@ai-sdk/openai@1.3.23(zod@3.24.2)': + '@ai-sdk/openai@1.3.23(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - zod: 3.24.2 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/provider-utils@2.2.8(zod@3.24.2)': + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 nanoid: 3.3.11 secure-json-parse: 2.7.0 - zod: 3.24.2 + zod: 3.25.76 '@ai-sdk/provider@1.1.3': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@1.2.12(react@19.1.0)(zod@3.24.2)': + '@ai-sdk/react@1.2.12(react@19.1.1)(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - '@ai-sdk/ui-utils': 1.2.11(zod@3.24.2) - react: 19.1.0 - swr: 2.3.4(react@19.1.0) + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 19.1.1 + swr: 2.3.4(react@19.1.1) throttleit: 2.1.0 optionalDependencies: - zod: 3.24.2 + zod: 3.25.76 - '@ai-sdk/ui-utils@1.2.11(zod@3.24.2)': + '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - zod: 3.24.2 - zod-to-json-schema: 3.24.1(zod@3.24.2) + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@asamuzakjp/css-color@3.2.0': dependencies: @@ -4643,8 +4687,8 @@ snapshots: '@auth/core@0.40.0': dependencies: '@panva/hkdf': 1.2.1 - jose: 6.0.10 - oauth4webapi: 3.5.0 + jose: 6.0.12 + oauth4webapi: 3.6.0 preact: 10.24.3 preact-render-to-string: 6.5.11(preact@10.24.3) @@ -4665,7 +4709,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-locate-window': 3.723.0 + '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4675,7 +4719,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.840.0 - '@aws-sdk/util-locate-window': 3.723.0 + '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4695,32 +4739,32 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.848.0': + '@aws-sdk/client-s3@3.857.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.846.0 - '@aws-sdk/credential-provider-node': 3.848.0 + '@aws-sdk/core': 3.857.0 + '@aws-sdk/credential-provider-node': 3.857.0 '@aws-sdk/middleware-bucket-endpoint': 3.840.0 '@aws-sdk/middleware-expect-continue': 3.840.0 - '@aws-sdk/middleware-flexible-checksums': 3.846.0 + '@aws-sdk/middleware-flexible-checksums': 3.857.0 '@aws-sdk/middleware-host-header': 3.840.0 '@aws-sdk/middleware-location-constraint': 3.840.0 '@aws-sdk/middleware-logger': 3.840.0 '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-sdk-s3': 3.846.0 + '@aws-sdk/middleware-sdk-s3': 3.857.0 '@aws-sdk/middleware-ssec': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.857.0 '@aws-sdk/region-config-resolver': 3.840.0 - '@aws-sdk/signature-v4-multi-region': 3.846.0 + '@aws-sdk/signature-v4-multi-region': 3.857.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.848.0 + '@aws-sdk/util-user-agent-node': 3.857.0 '@aws-sdk/xml-builder': 3.821.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 + '@smithy/core': 3.7.2 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 @@ -4731,21 +4775,21 @@ snapshots: '@smithy/invalid-dependency': 4.0.4 '@smithy/md5-js': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.15 - '@smithy/middleware-retry': 4.1.16 + '@smithy/middleware-endpoint': 4.1.17 + '@smithy/middleware-retry': 4.1.18 '@smithy/middleware-serde': 4.0.8 '@smithy/middleware-stack': 4.0.4 '@smithy/node-config-provider': 4.1.3 '@smithy/node-http-handler': 4.1.0 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.23 - '@smithy/util-defaults-mode-node': 4.0.23 + '@smithy/util-defaults-mode-browser': 4.0.25 + '@smithy/util-defaults-mode-node': 4.0.25 '@smithy/util-endpoints': 3.0.6 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -4758,41 +4802,41 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.848.0': + '@aws-sdk/client-sso@3.857.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/middleware-host-header': 3.840.0 '@aws-sdk/middleware-logger': 3.840.0 '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.857.0 '@aws-sdk/region-config-resolver': 3.840.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.848.0 + '@aws-sdk/util-user-agent-node': 3.857.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 + '@smithy/core': 3.7.2 '@smithy/fetch-http-handler': 5.1.0 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.15 - '@smithy/middleware-retry': 4.1.16 + '@smithy/middleware-endpoint': 4.1.17 + '@smithy/middleware-retry': 4.1.18 '@smithy/middleware-serde': 4.0.8 '@smithy/middleware-stack': 4.0.4 '@smithy/node-config-provider': 4.1.3 '@smithy/node-http-handler': 4.1.0 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.23 - '@smithy/util-defaults-mode-node': 4.0.23 + '@smithy/util-defaults-mode-browser': 4.0.25 + '@smithy/util-defaults-mode-node': 4.0.25 '@smithy/util-endpoints': 3.0.6 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -4801,16 +4845,16 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.846.0': + '@aws-sdk/core@3.857.0': dependencies: '@aws-sdk/types': 3.840.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.7.0 + '@smithy/core': 3.7.2 '@smithy/node-config-provider': 4.1.3 '@smithy/property-provider': 4.0.4 '@smithy/protocol-http': 5.1.2 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 @@ -4819,36 +4863,36 @@ snapshots: fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.846.0': + '@aws-sdk/credential-provider-env@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.846.0': + '@aws-sdk/credential-provider-http@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/fetch-http-handler': 5.1.0 '@smithy/node-http-handler': 4.1.0 '@smithy/property-provider': 4.0.4 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-stream': 4.2.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.848.0': + '@aws-sdk/credential-provider-ini@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 - '@aws-sdk/credential-provider-env': 3.846.0 - '@aws-sdk/credential-provider-http': 3.846.0 - '@aws-sdk/credential-provider-process': 3.846.0 - '@aws-sdk/credential-provider-sso': 3.848.0 - '@aws-sdk/credential-provider-web-identity': 3.848.0 - '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/core': 3.857.0 + '@aws-sdk/credential-provider-env': 3.857.0 + '@aws-sdk/credential-provider-http': 3.857.0 + '@aws-sdk/credential-provider-process': 3.857.0 + '@aws-sdk/credential-provider-sso': 3.857.0 + '@aws-sdk/credential-provider-web-identity': 3.857.0 + '@aws-sdk/nested-clients': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/credential-provider-imds': 4.0.6 '@smithy/property-provider': 4.0.4 @@ -4858,14 +4902,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.848.0': + '@aws-sdk/credential-provider-node@3.857.0': dependencies: - '@aws-sdk/credential-provider-env': 3.846.0 - '@aws-sdk/credential-provider-http': 3.846.0 - '@aws-sdk/credential-provider-ini': 3.848.0 - '@aws-sdk/credential-provider-process': 3.846.0 - '@aws-sdk/credential-provider-sso': 3.848.0 - '@aws-sdk/credential-provider-web-identity': 3.848.0 + '@aws-sdk/credential-provider-env': 3.857.0 + '@aws-sdk/credential-provider-http': 3.857.0 + '@aws-sdk/credential-provider-ini': 3.857.0 + '@aws-sdk/credential-provider-process': 3.857.0 + '@aws-sdk/credential-provider-sso': 3.857.0 + '@aws-sdk/credential-provider-web-identity': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/credential-provider-imds': 4.0.6 '@smithy/property-provider': 4.0.4 @@ -4875,20 +4919,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.846.0': + '@aws-sdk/credential-provider-process@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/shared-ini-file-loader': 4.0.4 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.848.0': + '@aws-sdk/credential-provider-sso@3.857.0': dependencies: - '@aws-sdk/client-sso': 3.848.0 - '@aws-sdk/core': 3.846.0 - '@aws-sdk/token-providers': 3.848.0 + '@aws-sdk/client-sso': 3.857.0 + '@aws-sdk/core': 3.857.0 + '@aws-sdk/token-providers': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/shared-ini-file-loader': 4.0.4 @@ -4897,10 +4941,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.848.0': + '@aws-sdk/credential-provider-web-identity@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 - '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/core': 3.857.0 + '@aws-sdk/nested-clients': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/types': 4.3.1 @@ -4925,12 +4969,12 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.846.0': + '@aws-sdk/middleware-flexible-checksums@3.857.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/is-array-buffer': 4.0.0 '@smithy/node-config-provider': 4.1.3 @@ -4967,16 +5011,16 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.846.0': + '@aws-sdk/middleware-sdk-s3@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.7.0 + '@smithy/core': 3.7.2 '@smithy/node-config-provider': 4.1.3 '@smithy/protocol-http': 5.1.2 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.4 @@ -4990,51 +5034,51 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.848.0': + '@aws-sdk/middleware-user-agent@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 - '@smithy/core': 3.7.0 + '@smithy/core': 3.7.2 '@smithy/protocol-http': 5.1.2 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.848.0': + '@aws-sdk/nested-clients@3.857.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.857.0 '@aws-sdk/middleware-host-header': 3.840.0 '@aws-sdk/middleware-logger': 3.840.0 '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.857.0 '@aws-sdk/region-config-resolver': 3.840.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.848.0 + '@aws-sdk/util-user-agent-node': 3.857.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 + '@smithy/core': 3.7.2 '@smithy/fetch-http-handler': 5.1.0 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.15 - '@smithy/middleware-retry': 4.1.16 + '@smithy/middleware-endpoint': 4.1.17 + '@smithy/middleware-retry': 4.1.18 '@smithy/middleware-serde': 4.0.8 '@smithy/middleware-stack': 4.0.4 '@smithy/node-config-provider': 4.1.3 '@smithy/node-http-handler': 4.1.0 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.23 - '@smithy/util-defaults-mode-node': 4.0.23 + '@smithy/util-defaults-mode-browser': 4.0.25 + '@smithy/util-defaults-mode-node': 4.0.25 '@smithy/util-endpoints': 3.0.6 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -5052,30 +5096,30 @@ snapshots: '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@aws-sdk/s3-request-presigner@3.848.0': + '@aws-sdk/s3-request-presigner@3.857.0': dependencies: - '@aws-sdk/signature-v4-multi-region': 3.846.0 + '@aws-sdk/signature-v4-multi-region': 3.857.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-format-url': 3.840.0 - '@smithy/middleware-endpoint': 4.1.15 + '@smithy/middleware-endpoint': 4.1.17 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.846.0': + '@aws-sdk/signature-v4-multi-region@3.857.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.846.0 + '@aws-sdk/middleware-sdk-s3': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/protocol-http': 5.1.2 '@smithy/signature-v4': 5.1.2 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.848.0': + '@aws-sdk/token-providers@3.857.0': dependencies: - '@aws-sdk/core': 3.846.0 - '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/core': 3.857.0 + '@aws-sdk/nested-clients': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/shared-ini-file-loader': 4.0.4 @@ -5108,7 +5152,7 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.723.0': + '@aws-sdk/util-locate-window@3.804.0': dependencies: tslib: 2.8.1 @@ -5119,9 +5163,9 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.848.0': + '@aws-sdk/util-user-agent-node@3.857.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.857.0 '@aws-sdk/types': 3.840.0 '@smithy/node-config-provider': 4.1.3 '@smithy/types': 4.3.1 @@ -5132,69 +5176,65 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.28.0': {} - '@babel/core@7.27.4': + '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.27.5': + '@babel/generator@7.28.0': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.4 + browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-globals@7.28.0': {} + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -5202,8 +5242,6 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-identifier@7.27.1': {} '@babel/helper-validator-option@7.27.1': {} @@ -5211,120 +5249,118 @@ snapshots: '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.1 - '@babel/parser@7.27.5': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.1 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.26.9': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.6': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 - '@babel/traverse@7.27.4': + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.0 - globals: 11.12.0 + '@babel/types': 7.28.1 + debug: 4.4.1 transitivePeerDependencies: - supports-color - '@babel/types@7.27.6': + '@babel/types@7.28.1': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -5357,30 +5393,25 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@emnapi/core@1.4.3': + '@emnapi/core@1.4.5': dependencies: - '@emnapi/wasi-threads': 1.0.2 + '@emnapi/wasi-threads': 1.0.4 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.4': + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.2': + '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.4.2))': dependencies: - tslib: 2.8.1 - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@9.31.0(jiti@2.4.2))': - dependencies: - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -5388,17 +5419,13 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/config-helpers@0.3.0': {} - '@eslint/core@0.14.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 @@ -5406,8 +5433,8 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.1 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -5417,33 +5444,33 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.31.0': {} + '@eslint/js@9.32.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.1': + '@eslint/plugin-kit@0.3.4': dependencies: - '@eslint/core': 0.14.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@fastify/busboy@2.1.1': {} - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.7.2': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.7.2': dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@floating-ui/dom': 1.6.13 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@floating-ui/dom': 1.7.2 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) - '@floating-ui/utils@0.2.9': {} + '@floating-ui/utils@0.2.10': {} '@humanfs/core@0.19.1': {} @@ -5456,7 +5483,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: @@ -5532,7 +5559,7 @@ snapshots: '@img/sharp-wasm32@0.34.3': dependencies: - '@emnapi/runtime': 1.4.4 + '@emnapi/runtime': 1.4.5 optional: true '@img/sharp-win32-arm64@0.34.3': @@ -5567,44 +5594,44 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.0.4': + '@jest/console@30.0.5': dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.0.15 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 chalk: 4.1.2 - jest-message-util: 30.0.2 - jest-util: 30.0.2 + jest-message-util: 30.0.5 + jest-util: 30.0.5 slash: 3.0.0 - '@jest/core@30.0.4(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3))': + '@jest/core@30.0.5(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3))': dependencies: - '@jest/console': 30.0.4 + '@jest/console': 30.0.5 '@jest/pattern': 30.0.1 - '@jest/reporters': 30.0.4 - '@jest/test-result': 30.0.4 - '@jest/transform': 30.0.4 - '@jest/types': 30.0.1 - '@types/node': 24.0.15 + '@jest/reporters': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.2.0 + ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-changed-files: 30.0.2 - jest-config: 30.0.4(@types/node@24.0.15)(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)) - jest-haste-map: 30.0.2 - jest-message-util: 30.0.2 + jest-changed-files: 30.0.5 + jest-config: 30.0.5(@types/node@24.1.0)(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)) + jest-haste-map: 30.0.5 + jest-message-util: 30.0.5 jest-regex-util: 30.0.1 - jest-resolve: 30.0.2 - jest-resolve-dependencies: 30.0.4 - jest-runner: 30.0.4 - jest-runtime: 30.0.4 - jest-snapshot: 30.0.4 - jest-util: 30.0.2 - jest-validate: 30.0.2 - jest-watcher: 30.0.4 + jest-resolve: 30.0.5 + jest-resolve-dependencies: 30.0.5 + jest-runner: 30.0.5 + jest-runtime: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + jest-watcher: 30.0.5 micromatch: 4.0.8 - pretty-format: 30.0.2 + pretty-format: 30.0.5 slash: 3.0.0 transitivePeerDependencies: - babel-plugin-macros @@ -5612,84 +5639,71 @@ snapshots: - supports-color - ts-node - '@jest/diff-sequences@30.0.0': {} - '@jest/diff-sequences@30.0.1': {} - '@jest/environment-jsdom-abstract@30.0.4(jsdom@26.1.0)': + '@jest/environment-jsdom-abstract@30.0.5(jsdom@26.1.0)': dependencies: - '@jest/environment': 30.0.4 - '@jest/fake-timers': 30.0.4 - '@jest/types': 30.0.1 + '@jest/environment': 30.0.5 + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 '@types/jsdom': 21.1.7 - '@types/node': 24.0.15 - jest-mock: 30.0.2 - jest-util: 30.0.2 + '@types/node': 24.1.0 + jest-mock: 30.0.5 + jest-util: 30.0.5 jsdom: 26.1.0 - '@jest/environment@30.0.4': + '@jest/environment@30.0.5': dependencies: - '@jest/fake-timers': 30.0.4 - '@jest/types': 30.0.1 - '@types/node': 24.0.15 - jest-mock: 30.0.2 + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 + jest-mock: 30.0.5 - '@jest/expect-utils@30.0.0': - dependencies: - '@jest/get-type': 30.0.0 - - '@jest/expect-utils@30.0.4': + '@jest/expect-utils@30.0.5': dependencies: '@jest/get-type': 30.0.1 - '@jest/expect@30.0.4': + '@jest/expect@30.0.5': dependencies: - expect: 30.0.4 - jest-snapshot: 30.0.4 + expect: 30.0.5 + jest-snapshot: 30.0.5 transitivePeerDependencies: - supports-color - '@jest/fake-timers@30.0.4': + '@jest/fake-timers@30.0.5': dependencies: - '@jest/types': 30.0.1 + '@jest/types': 30.0.5 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 24.0.15 - jest-message-util: 30.0.2 - jest-mock: 30.0.2 - jest-util: 30.0.2 - - '@jest/get-type@30.0.0': {} + '@types/node': 24.1.0 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 '@jest/get-type@30.0.1': {} - '@jest/globals@30.0.4': + '@jest/globals@30.0.5': dependencies: - '@jest/environment': 30.0.4 - '@jest/expect': 30.0.4 - '@jest/types': 30.0.1 - jest-mock: 30.0.2 + '@jest/environment': 30.0.5 + '@jest/expect': 30.0.5 + '@jest/types': 30.0.5 + jest-mock: 30.0.5 transitivePeerDependencies: - supports-color - '@jest/pattern@30.0.0': - dependencies: - '@types/node': 24.0.15 - jest-regex-util: 30.0.0 - '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.0.15 + '@types/node': 24.1.0 jest-regex-util: 30.0.1 - '@jest/reporters@30.0.4': + '@jest/reporters@30.0.5': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.0.4 - '@jest/test-result': 30.0.4 - '@jest/transform': 30.0.4 - '@jest/types': 30.0.1 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 24.0.15 + '@jest/console': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@jridgewell/trace-mapping': 0.3.29 + '@types/node': 24.1.0 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit-x: 0.2.2 @@ -5700,63 +5714,59 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - jest-message-util: 30.0.2 - jest-util: 30.0.2 - jest-worker: 30.0.2 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + jest-worker: 30.0.5 slash: 3.0.0 string-length: 4.0.2 v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color - '@jest/schemas@30.0.0': + '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.33 + '@sinclair/typebox': 0.34.38 - '@jest/schemas@30.0.1': + '@jest/snapshot-utils@30.0.5': dependencies: - '@sinclair/typebox': 0.34.33 - - '@jest/snapshot-utils@30.0.4': - dependencies: - '@jest/types': 30.0.1 + '@jest/types': 30.0.5 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 '@jest/source-map@30.0.1': dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.0.4': + '@jest/test-result@30.0.5': dependencies: - '@jest/console': 30.0.4 - '@jest/types': 30.0.1 + '@jest/console': 30.0.5 + '@jest/types': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@30.0.4': + '@jest/test-sequencer@30.0.5': dependencies: - '@jest/test-result': 30.0.4 + '@jest/test-result': 30.0.5 graceful-fs: 4.2.11 - jest-haste-map: 30.0.2 + jest-haste-map: 30.0.5 slash: 3.0.0 - '@jest/transform@30.0.4': + '@jest/transform@30.0.5': dependencies: - '@babel/core': 7.27.4 - '@jest/types': 30.0.1 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/core': 7.28.0 + '@jest/types': 30.0.5 + '@jridgewell/trace-mapping': 0.3.29 babel-plugin-istanbul: 7.0.0 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.0.2 + jest-haste-map: 30.0.5 jest-regex-util: 30.0.1 - jest-util: 30.0.2 + jest-util: 30.0.5 micromatch: 4.0.8 pirates: 4.0.7 slash: 3.0.0 @@ -5764,90 +5774,84 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/types@30.0.0': - dependencies: - '@jest/pattern': 30.0.0 - '@jest/schemas': 30.0.0 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 24.0.15 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - - '@jest/types@30.0.1': + '@jest/types@30.0.5': dependencies: '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.1 + '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.0.15 + '@types/node': 24.1.0 '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 - '@napi-rs/wasm-runtime@0.2.11': + '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 optional: true - '@next/bundle-analyzer@15.4.2': + '@napi-rs/wasm-runtime@1.0.1': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + + '@next/bundle-analyzer@15.4.5': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@15.4.2': {} + '@next/env@15.4.5': {} - '@next/eslint-plugin-next@15.4.2': + '@next/eslint-plugin-next@15.4.5': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.4.2': + '@next/swc-darwin-arm64@15.4.5': optional: true - '@next/swc-darwin-x64@15.4.2': + '@next/swc-darwin-x64@15.4.5': optional: true - '@next/swc-linux-arm64-gnu@15.4.2': + '@next/swc-linux-arm64-gnu@15.4.5': optional: true - '@next/swc-linux-arm64-musl@15.4.2': + '@next/swc-linux-arm64-musl@15.4.5': optional: true - '@next/swc-linux-x64-gnu@15.4.2': + '@next/swc-linux-x64-gnu@15.4.5': optional: true - '@next/swc-linux-x64-musl@15.4.2': + '@next/swc-linux-x64-musl@15.4.5': optional: true - '@next/swc-win32-arm64-msvc@15.4.2': + '@next/swc-win32-arm64-msvc@15.4.5': optional: true - '@next/swc-win32-x64-msvc@15.4.2': + '@next/swc-win32-x64-msvc@15.4.5': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5860,352 +5864,376 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.0 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} '@opentelemetry/api@1.9.0': {} + '@oxc-resolver/binding-android-arm-eabi@11.6.0': + optional: true + + '@oxc-resolver/binding-android-arm64@11.6.0': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.6.0': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.6.0': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.6.0': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.6.0': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.6.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.1 + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.6.0': + optional: true + + '@oxc-resolver/binding-win32-ia32-msvc@11.6.0': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.6.0': + optional: true + '@panva/hkdf@1.2.1': {} '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.7': {} + '@pkgr/core@0.2.9': {} - '@polka/url@1.0.0-next.28': {} + '@polka/url@1.0.0-next.29': {} '@radix-ui/primitive@1.1.2': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.9)(react@19.1.1)': dependencies: - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-context@1.1.2(@types/react@19.1.9)(react@19.1.1)': dependencies: - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-context@1.1.2(@types/react@19.1.8)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.1.8 - - '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) - aria-hidden: 1.2.4 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.6.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + aria-hidden: 1.2.6 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.9)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-direction@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-dropdown-menu@2.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-dropdown-menu@2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-menu': 2.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-menu': 2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.9)(react@19.1.1)': dependencies: - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-id@1.1.0(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-id@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-id@1.1.1(@types/react@19.1.8)(react@19.1.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.1.8 - - '@radix-ui/react-menu@2.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-menu@2.1.15(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) - aria-hidden: 1.2.4 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.6.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + aria-hidden: 1.2.6 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.9)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.9)(react@19.1.1) '@radix-ui/rect': 1.1.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) - - '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-slot@1.1.2(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.9)(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-slot@1.2.3(@types/react@19.1.8)(react@19.1.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.1.8 - - '@radix-ui/react-tooltip@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-tooltip@1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.9)(react@19.1.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.9)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.8)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.1.8 - - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.8)(react@19.1.0)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) - react: 19.1.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.1.1) + react: 19.1.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) '@radix-ui/rect@1.1.1': {} '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.5': {} + '@rushstack/eslint-patch@1.12.0': {} - '@sinclair/typebox@0.34.33': {} + '@sinclair/typebox@0.34.38': {} '@sinonjs/commons@3.0.1': dependencies: @@ -6237,7 +6265,7 @@ snapshots: '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/core@3.7.0': + '@smithy/core@3.7.2': dependencies: '@smithy/middleware-serde': 4.0.8 '@smithy/protocol-http': 5.1.2 @@ -6340,9 +6368,9 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.15': + '@smithy/middleware-endpoint@4.1.17': dependencies: - '@smithy/core': 3.7.0 + '@smithy/core': 3.7.2 '@smithy/middleware-serde': 4.0.8 '@smithy/node-config-provider': 4.1.3 '@smithy/shared-ini-file-loader': 4.0.4 @@ -6351,12 +6379,12 @@ snapshots: '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.16': + '@smithy/middleware-retry@4.1.18': dependencies: '@smithy/node-config-provider': 4.1.3 '@smithy/protocol-http': 5.1.2 '@smithy/service-error-classification': 4.0.6 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -6430,10 +6458,10 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.4.7': + '@smithy/smithy-client@4.4.9': dependencies: - '@smithy/core': 3.7.0 - '@smithy/middleware-endpoint': 4.1.15 + '@smithy/core': 3.7.2 + '@smithy/middleware-endpoint': 4.1.17 '@smithy/middleware-stack': 4.0.4 '@smithy/protocol-http': 5.1.2 '@smithy/types': 4.3.1 @@ -6478,21 +6506,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.23': + '@smithy/util-defaults-mode-browser@4.0.25': dependencies: '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.23': + '@smithy/util-defaults-mode-node@4.0.25': dependencies: '@smithy/config-resolver': 4.1.4 '@smithy/credential-provider-imds': 4.0.6 '@smithy/node-config-provider': 4.1.3 '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.7 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 tslib: 2.8.1 @@ -6564,7 +6592,7 @@ snapshots: '@tailwindcss/node@4.1.11': dependencies: '@ampproject/remapping': 2.3.0 - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.2 jiti: 2.4.2 lightningcss: 1.30.1 magic-string: 0.30.17 @@ -6633,36 +6661,36 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.11 - '@testing-library/dom@10.4.0': + '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.26.9 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 - chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 + picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.6.3': + '@testing-library/jest-dom@6.6.4': dependencies: - '@adobe/css-tools': 4.4.2 + '@adobe/css-tools': 4.4.3 aria-query: 5.3.2 - chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 + picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@babel/runtime': 7.26.9 - '@testing-library/dom': 10.4.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@babel/runtime': 7.27.6 + '@testing-library/dom': 10.4.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 - '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) '@tsconfig/node10@1.0.11': {} @@ -6672,7 +6700,7 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@tybys/wasm-util@0.9.0': + '@tybys/wasm-util@0.10.0': dependencies: tslib: 2.8.1 optional: true @@ -6681,28 +6709,30 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.7 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.1 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.1 + + '@types/culori@4.0.0': {} '@types/diff-match-patch@1.0.36': {} - '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -6716,34 +6746,34 @@ snapshots: '@types/jest@30.0.0': dependencies: - expect: 30.0.0 - pretty-format: 30.0.0 + expect: 30.0.5 + pretty-format: 30.0.5 '@types/jsdom@21.1.7': dependencies: - '@types/node': 24.0.15 + '@types/node': 24.1.0 '@types/tough-cookie': 4.0.5 - parse5: 7.2.1 + parse5: 7.3.0 '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/node@24.0.15': + '@types/node@24.1.0': dependencies: undici-types: 7.8.0 - '@types/pg@8.15.4': + '@types/pg@8.15.5': dependencies: - '@types/node': 24.0.15 - pg-protocol: 1.10.0 + '@types/node': 24.1.0 + pg-protocol: 1.10.3 pg-types: 2.2.0 - '@types/react-dom@19.1.6(@types/react@19.1.8)': + '@types/react-dom@19.1.7(@types/react@19.1.9)': dependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - '@types/react@19.1.8': + '@types/react@19.1.9': dependencies: csstype: 3.1.3 @@ -6763,161 +6793,177 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/type-utils': 8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.24.1 - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 + eslint: 9.32.0(jiti@2.4.2) graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.8.3) + ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.24.1 - debug: 4.4.0 - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 + debug: 4.4.1 + eslint: 9.32.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.24.1': + '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/visitor-keys': 8.24.1 - - '@typescript-eslint/type-utils@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.0 - eslint: 9.31.0(jiti@2.4.2) - ts-api-utils: 2.0.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.24.1': {} - - '@typescript-eslint/typescript-estree@8.24.1(typescript@5.8.3)': + '@typescript-eslint/scope-manager@8.38.0': dependencies: - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/visitor-keys': 8.24.1 - debug: 4.4.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.32.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.38.0': {} + + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.0.1(typescript@5.8.3) + ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.3) - eslint: 9.31.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + eslint: 9.32.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.24.1': + '@typescript-eslint/visitor-keys@8.38.0': dependencies: - '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.9.0': + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true - '@unrs/resolver-binding-android-arm64@1.9.0': + '@unrs/resolver-binding-android-arm64@1.11.1': optional: true - '@unrs/resolver-binding-darwin-arm64@1.9.0': + '@unrs/resolver-binding-darwin-arm64@1.11.1': optional: true - '@unrs/resolver-binding-darwin-x64@1.9.0': + '@unrs/resolver-binding-darwin-x64@1.11.1': optional: true - '@unrs/resolver-binding-freebsd-x64@1.9.0': + '@unrs/resolver-binding-freebsd-x64@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.9.0': + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.9.0': + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.9.0': + '@unrs/resolver-binding-linux-x64-musl@1.11.1': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.9.0': + '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.11 + '@napi-rs/wasm-runtime': 0.2.12 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.9.0': + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true '@upstash/core-analytics@0.0.10': dependencies: - '@upstash/redis': 1.35.1 + '@upstash/redis': 1.35.3 - '@upstash/ratelimit@2.0.5(@upstash/redis@1.35.1)': + '@upstash/ratelimit@2.0.6(@upstash/redis@1.35.3)': dependencies: '@upstash/core-analytics': 0.0.10 - '@upstash/redis': 1.35.1 + '@upstash/redis': 1.35.3 - '@upstash/redis@1.35.1': + '@upstash/redis@1.35.3': dependencies: uncrypto: 0.1.3 - '@vercel/analytics@1.5.0(next@15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@vercel/analytics@1.5.0(next@15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': optionalDependencies: - next: 15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 + next: 15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 '@vercel/blob@1.1.1': dependencies: @@ -6925,16 +6971,12 @@ snapshots: is-buffer: 2.0.5 is-node-process: 1.2.0 throttleit: 2.1.0 - undici: 5.28.5 + undici: 5.29.0 - '@vercel/speed-insights@1.2.0(next@15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@vercel/speed-insights@1.2.0(next@15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': optionalDependencies: - next: 15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 + next: 15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -6942,25 +6984,23 @@ snapshots: acorn-walk@8.3.4: dependencies: - acorn: 8.14.0 - - acorn@8.14.0: {} + acorn: 8.15.0 acorn@8.15.0: {} - agent-base@7.1.3: {} + agent-base@7.1.4: {} - ai@4.3.19(react@19.1.0)(zod@3.24.2): + ai@4.3.19(react@19.1.1)(zod@3.25.76): dependencies: '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - '@ai-sdk/react': 1.2.12(react@19.1.0)(zod@3.24.2) - '@ai-sdk/ui-utils': 1.2.11(zod@3.24.2) + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@19.1.1)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) '@opentelemetry/api': 1.9.0 jsondiffpatch: 0.6.0 - zod: 3.24.2 + zod: 3.25.76 optionalDependencies: - react: 19.1.0 + react: 19.1.1 ajv@6.12.6: dependencies: @@ -6998,7 +7038,7 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.4: + aria-hidden@1.2.6: dependencies: tslib: 2.8.1 @@ -7010,32 +7050,35 @@ snapshots: array-buffer-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: + array-includes@3.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 + math-intrinsics: 1.1.0 array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 - array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -7044,21 +7087,21 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -7067,9 +7110,9 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} @@ -7084,17 +7127,17 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.10.2: {} + axe-core@4.10.3: {} axobject-query@4.1.0: {} - babel-jest@30.0.4(@babel/core@7.27.4): + babel-jest@30.0.5(@babel/core@7.28.0): dependencies: - '@babel/core': 7.27.4 - '@jest/transform': 30.0.4 + '@babel/core': 7.28.0 + '@jest/transform': 30.0.5 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.0 - babel-preset-jest: 30.0.1(@babel/core@7.27.4) + babel-preset-jest: 30.0.1(@babel/core@7.28.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -7114,44 +7157,44 @@ snapshots: babel-plugin-jest-hoist@30.0.1: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.1 '@types/babel__core': 7.20.5 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): + babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.27.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - babel-preset-jest@30.0.1(@babel/core@7.27.4): + babel-preset-jest@30.0.1(@babel/core@7.28.0): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 babel-plugin-jest-hoist: 30.0.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) balanced-match@1.0.2: {} bowser@2.11.0: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -7159,12 +7202,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.4: + browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001700 - electron-to-chromium: 1.5.102 + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.189 node-releases: 2.0.19 - update-browserslist-db: 1.1.2(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.1) bser@2.1.1: dependencies: @@ -7181,13 +7224,13 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bound@1.0.3: + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 callsites@3.1.0: {} @@ -7196,7 +7239,7 @@ snapshots: camelcase: 8.0.0 map-obj: 5.0.0 quick-lru: 6.1.2 - type-fest: 4.35.0 + type-fest: 4.41.0 camelcase@5.3.1: {} @@ -7204,12 +7247,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001700: {} - - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + caniuse-lite@1.0.30001727: {} chalk@4.1.2: dependencies: @@ -7222,7 +7260,7 @@ snapshots: chownr@3.0.0: {} - ci-info@4.2.0: {} + ci-info@4.3.0: {} cjs-module-lexer@2.1.0: {} @@ -7236,14 +7274,14 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + cmdk@1.1.1(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.1.8)(react@19.1.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -7290,13 +7328,15 @@ snapshots: css.escape@1.5.1: {} - cssstyle@4.4.0: + cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 csstype@3.1.3: {} + culori@4.0.2: {} + damerau-levenshtein@1.0.8: {} data-urls@5.0.0: @@ -7306,19 +7346,19 @@ snapshots: data-view-buffer@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-offset@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -7334,11 +7374,11 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 - decimal.js@10.5.0: {} + decimal.js@10.6.0: {} dedent@1.6.0: {} @@ -7406,7 +7446,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.102: {} + electron-to-chromium@1.5.189: {} emittery@0.13.1: {} @@ -7414,24 +7454,26 @@ snapshots: emoji-regex@9.2.2: {} - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.2: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.2.2 entities@4.5.0: {} + entities@6.0.1: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -7441,7 +7483,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -7454,7 +7496,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -7469,6 +7513,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -7477,7 +7522,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.18 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} @@ -7486,13 +7531,13 @@ snapshots: es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -7509,7 +7554,7 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -7529,19 +7574,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.4.2(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): + eslint-config-next@15.4.5(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@next/eslint-plugin-next': 15.4.2 - '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.31.0(jiti@2.4.2) + '@next/eslint-plugin-next': 15.4.5 + '@rushstack/eslint-patch': 1.12.0 + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.32.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.1(eslint-plugin-import@2.31.0)(eslint@9.31.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.1)(eslint@9.31.0(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.31.0(jiti@2.4.2)) - eslint-plugin-react: 7.37.4(eslint@9.31.0(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.31.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.32.0(jiti@2.4.2)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -7557,44 +7602,44 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.1(eslint-plugin-import@2.31.0)(eslint@9.31.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 - enhanced-resolve: 5.18.1 - eslint: 9.31.0(jiti@2.4.2) - get-tsconfig: 4.10.0 - is-bun-module: 1.3.0 - stable-hash: 0.0.4 - tinyglobby: 0.2.11 + debug: 4.4.1 + eslint: 9.32.0(jiti@2.4.2) + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.14 + unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.1)(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.1)(eslint@9.31.0(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.31.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.32.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.1(eslint-plugin-import@2.31.0)(eslint@9.31.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.8.1)(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.1)(eslint@9.31.0(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -7606,23 +7651,23 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.32.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.10.2 + axe-core: 4.10.3 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -7631,24 +7676,24 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.32.0(jiti@2.4.2)): dependencies: - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.4.2) - eslint-plugin-react@7.37.4(eslint@9.31.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.32.0(jiti@2.4.2)): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.31.0(jiti@2.4.2) + eslint: 9.32.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 @@ -7664,29 +7709,27 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} - eslint-visitor-keys@4.2.1: {} - eslint@9.31.0(jiti@2.4.2): + eslint@9.32.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 '@eslint/core': 0.15.1 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.31.0 - '@eslint/plugin-kit': 0.3.1 + '@eslint/js': 9.32.0 + '@eslint/plugin-kit': 0.3.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -7710,12 +7753,6 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 - espree@10.4.0: dependencies: acorn: 8.15.0 @@ -7750,23 +7787,18 @@ snapshots: exit-x@0.2.2: {} - expect@30.0.0: + expect@30.0.5: dependencies: - '@jest/expect-utils': 30.0.0 - '@jest/get-type': 30.0.0 - jest-matcher-utils: 30.0.0 - jest-message-util: 30.0.0 - jest-mock: 30.0.0 - jest-util: 30.0.0 - - expect@30.0.4: - dependencies: - '@jest/expect-utils': 30.0.4 + '@jest/expect-utils': 30.0.5 '@jest/get-type': 30.0.1 - jest-matcher-utils: 30.0.4 - jest-message-util: 30.0.2 - jest-mock: 30.0.2 - jest-util: 30.0.2 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 + + extract-colors@4.2.0: {} + + fast-average-color@9.5.0: {} fast-deep-equal@3.1.3: {} @@ -7794,17 +7826,21 @@ snapshots: dependencies: strnum: 2.1.1 - fastq@1.19.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fb-watchman@2.0.2: dependencies: bser: 2.1.1 - fdir@6.4.3(picomatch@4.0.2): + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + + fdir@6.4.6(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 file-entry-cache@8.0.0: dependencies: @@ -7826,10 +7862,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} for-each@0.3.5: dependencies: @@ -7840,14 +7876,18 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - framer-motion@12.23.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + formatly@0.2.4: dependencies: - motion-dom: 12.23.6 + fd-package-json: 2.0.0 + + framer-motion@12.23.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + motion-dom: 12.23.12 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) fs.realpath@1.0.0: {} @@ -7859,7 +7899,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -7871,7 +7911,7 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -7897,11 +7937,11 @@ snapshots: get-symbol-description@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -7931,8 +7971,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@11.12.0: {} - globals@14.0.0: {} globalthis@1.0.4: @@ -7987,15 +8025,15 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.3 - debug: 4.4.0 + agent-base: 7.1.4 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.3 - debug: 4.4.0 + agent-base: 7.1.4 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -8007,6 +8045,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -8037,8 +8077,8 @@ snapshots: is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -8047,7 +8087,7 @@ snapshots: is-async-function@2.1.1: dependencies: async-function: 1.0.0 - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -8058,12 +8098,12 @@ snapshots: is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-buffer@2.0.5: {} - is-bun-module@1.3.0: + is-bun-module@2.0.0: dependencies: semver: 7.7.2 @@ -8075,20 +8115,20 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-fullwidth-code-point@3.0.0: {} @@ -8096,7 +8136,7 @@ snapshots: is-generator-function@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -8107,11 +8147,13 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-node-process@1.2.0: {} is-number-object@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -8122,7 +8164,7 @@ snapshots: is-regex@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -8131,35 +8173,35 @@ snapshots: is-shared-array-buffer@1.0.4: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-stream@2.0.1: {} is-string@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-symbol@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 is-weakmap@2.0.2: {} is-weakref@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-weakset@2.0.4: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 isarray@2.0.5: {} @@ -8169,8 +8211,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.27.5 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.2 @@ -8185,8 +8227,8 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 + '@jridgewell/trace-mapping': 0.3.29 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -8200,7 +8242,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -8211,31 +8253,31 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-changed-files@30.0.2: + jest-changed-files@30.0.5: dependencies: execa: 5.1.1 - jest-util: 30.0.2 + jest-util: 30.0.5 p-limit: 3.1.0 - jest-circus@30.0.4: + jest-circus@30.0.5: dependencies: - '@jest/environment': 30.0.4 - '@jest/expect': 30.0.4 - '@jest/test-result': 30.0.4 - '@jest/types': 30.0.1 - '@types/node': 24.0.15 + '@jest/environment': 30.0.5 + '@jest/expect': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 is-generator-fn: 2.1.0 - jest-each: 30.0.2 - jest-matcher-utils: 30.0.4 - jest-message-util: 30.0.2 - jest-runtime: 30.0.4 - jest-snapshot: 30.0.4 - jest-util: 30.0.2 + jest-each: 30.0.5 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-runtime: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 p-limit: 3.1.0 - pretty-format: 30.0.2 + pretty-format: 30.0.5 pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -8243,17 +8285,17 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.0.4(@types/node@24.0.15)(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)): + jest-cli@30.0.5(@types/node@24.1.0)(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)): dependencies: - '@jest/core': 30.0.4(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)) - '@jest/test-result': 30.0.4 - '@jest/types': 30.0.1 + '@jest/core': 30.0.5(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)) + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.0.4(@types/node@24.0.15)(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)) - jest-util: 30.0.2 - jest-validate: 30.0.2 + jest-config: 30.0.5(@types/node@24.1.0)(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)) + jest-util: 30.0.5 + jest-validate: 30.0.5 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -8262,315 +8304,272 @@ snapshots: - supports-color - ts-node - jest-config@30.0.4(@types/node@24.0.15)(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)): + jest-config@30.0.5(@types/node@24.1.0)(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@jest/get-type': 30.0.1 '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.0.4 - '@jest/types': 30.0.1 - babel-jest: 30.0.4(@babel/core@7.27.4) + '@jest/test-sequencer': 30.0.5 + '@jest/types': 30.0.5 + babel-jest: 30.0.5(@babel/core@7.28.0) chalk: 4.1.2 - ci-info: 4.2.0 + ci-info: 4.3.0 deepmerge: 4.3.1 glob: 10.4.5 graceful-fs: 4.2.11 - jest-circus: 30.0.4 + jest-circus: 30.0.5 jest-docblock: 30.0.1 - jest-environment-node: 30.0.4 + jest-environment-node: 30.0.5 jest-regex-util: 30.0.1 - jest-resolve: 30.0.2 - jest-runner: 30.0.4 - jest-util: 30.0.2 - jest-validate: 30.0.2 + jest-resolve: 30.0.5 + jest-runner: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 micromatch: 4.0.8 parse-json: 5.2.0 - pretty-format: 30.0.2 + pretty-format: 30.0.5 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 24.0.15 - ts-node: 10.9.2(@types/node@24.0.15)(typescript@5.8.3) + '@types/node': 24.1.0 + ts-node: 10.9.2(@types/node@24.1.0)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-diff@30.0.0: - dependencies: - '@jest/diff-sequences': 30.0.0 - '@jest/get-type': 30.0.0 - chalk: 4.1.2 - pretty-format: 30.0.0 - - jest-diff@30.0.4: + jest-diff@30.0.5: dependencies: '@jest/diff-sequences': 30.0.1 '@jest/get-type': 30.0.1 chalk: 4.1.2 - pretty-format: 30.0.2 + pretty-format: 30.0.5 jest-docblock@30.0.1: dependencies: detect-newline: 3.1.0 - jest-each@30.0.2: + jest-each@30.0.5: dependencies: '@jest/get-type': 30.0.1 - '@jest/types': 30.0.1 + '@jest/types': 30.0.5 chalk: 4.1.2 - jest-util: 30.0.2 - pretty-format: 30.0.2 + jest-util: 30.0.5 + pretty-format: 30.0.5 - jest-environment-jsdom@30.0.4: + jest-environment-jsdom@30.0.5: dependencies: - '@jest/environment': 30.0.4 - '@jest/environment-jsdom-abstract': 30.0.4(jsdom@26.1.0) + '@jest/environment': 30.0.5 + '@jest/environment-jsdom-abstract': 30.0.5(jsdom@26.1.0) '@types/jsdom': 21.1.7 - '@types/node': 24.0.15 + '@types/node': 24.1.0 jsdom: 26.1.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jest-environment-node@30.0.4: + jest-environment-node@30.0.5: dependencies: - '@jest/environment': 30.0.4 - '@jest/fake-timers': 30.0.4 - '@jest/types': 30.0.1 - '@types/node': 24.0.15 - jest-mock: 30.0.2 - jest-util: 30.0.2 - jest-validate: 30.0.2 + '@jest/environment': 30.0.5 + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 + jest-mock: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 - jest-haste-map@30.0.2: + jest-haste-map@30.0.5: dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.0.15 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 30.0.1 - jest-util: 30.0.2 - jest-worker: 30.0.2 + jest-util: 30.0.5 + jest-worker: 30.0.5 micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@30.0.2: + jest-leak-detector@30.0.5: dependencies: '@jest/get-type': 30.0.1 - pretty-format: 30.0.2 + pretty-format: 30.0.5 - jest-matcher-utils@30.0.0: - dependencies: - '@jest/get-type': 30.0.0 - chalk: 4.1.2 - jest-diff: 30.0.0 - pretty-format: 30.0.0 - - jest-matcher-utils@30.0.4: + jest-matcher-utils@30.0.5: dependencies: '@jest/get-type': 30.0.1 chalk: 4.1.2 - jest-diff: 30.0.4 - pretty-format: 30.0.2 + jest-diff: 30.0.5 + pretty-format: 30.0.5 - jest-message-util@30.0.0: + jest-message-util@30.0.5: dependencies: '@babel/code-frame': 7.27.1 - '@jest/types': 30.0.0 + '@jest/types': 30.0.5 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 30.0.0 + pretty-format: 30.0.5 slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@30.0.2: + jest-mock@30.0.5: dependencies: - '@babel/code-frame': 7.27.1 - '@jest/types': 30.0.1 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 30.0.2 - slash: 3.0.0 - stack-utils: 2.0.6 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 + jest-util: 30.0.5 - jest-mock@30.0.0: - dependencies: - '@jest/types': 30.0.0 - '@types/node': 24.0.15 - jest-util: 30.0.0 - - jest-mock@30.0.2: - dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.0.15 - jest-util: 30.0.2 - - jest-pnp-resolver@1.2.3(jest-resolve@30.0.2): + jest-pnp-resolver@1.2.3(jest-resolve@30.0.5): optionalDependencies: - jest-resolve: 30.0.2 - - jest-regex-util@30.0.0: {} + jest-resolve: 30.0.5 jest-regex-util@30.0.1: {} - jest-resolve-dependencies@30.0.4: + jest-resolve-dependencies@30.0.5: dependencies: jest-regex-util: 30.0.1 - jest-snapshot: 30.0.4 + jest-snapshot: 30.0.5 transitivePeerDependencies: - supports-color - jest-resolve@30.0.2: + jest-resolve@30.0.5: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.0.2 - jest-pnp-resolver: 1.2.3(jest-resolve@30.0.2) - jest-util: 30.0.2 - jest-validate: 30.0.2 + jest-haste-map: 30.0.5 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.5) + jest-util: 30.0.5 + jest-validate: 30.0.5 slash: 3.0.0 - unrs-resolver: 1.9.0 + unrs-resolver: 1.11.1 - jest-runner@30.0.4: + jest-runner@30.0.5: dependencies: - '@jest/console': 30.0.4 - '@jest/environment': 30.0.4 - '@jest/test-result': 30.0.4 - '@jest/transform': 30.0.4 - '@jest/types': 30.0.1 - '@types/node': 24.0.15 + '@jest/console': 30.0.5 + '@jest/environment': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-docblock: 30.0.1 - jest-environment-node: 30.0.4 - jest-haste-map: 30.0.2 - jest-leak-detector: 30.0.2 - jest-message-util: 30.0.2 - jest-resolve: 30.0.2 - jest-runtime: 30.0.4 - jest-util: 30.0.2 - jest-watcher: 30.0.4 - jest-worker: 30.0.2 + jest-environment-node: 30.0.5 + jest-haste-map: 30.0.5 + jest-leak-detector: 30.0.5 + jest-message-util: 30.0.5 + jest-resolve: 30.0.5 + jest-runtime: 30.0.5 + jest-util: 30.0.5 + jest-watcher: 30.0.5 + jest-worker: 30.0.5 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.0.4: + jest-runtime@30.0.5: dependencies: - '@jest/environment': 30.0.4 - '@jest/fake-timers': 30.0.4 - '@jest/globals': 30.0.4 + '@jest/environment': 30.0.5 + '@jest/fake-timers': 30.0.5 + '@jest/globals': 30.0.5 '@jest/source-map': 30.0.1 - '@jest/test-result': 30.0.4 - '@jest/transform': 30.0.4 - '@jest/types': 30.0.1 - '@types/node': 24.0.15 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 chalk: 4.1.2 cjs-module-lexer: 2.1.0 collect-v8-coverage: 1.0.2 glob: 10.4.5 graceful-fs: 4.2.11 - jest-haste-map: 30.0.2 - jest-message-util: 30.0.2 - jest-mock: 30.0.2 + jest-haste-map: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 jest-regex-util: 30.0.1 - jest-resolve: 30.0.2 - jest-snapshot: 30.0.4 - jest-util: 30.0.2 + jest-resolve: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.0.4: + jest-snapshot@30.0.5: dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.6 - '@jest/expect-utils': 30.0.4 + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.1 + '@jest/expect-utils': 30.0.5 '@jest/get-type': 30.0.1 - '@jest/snapshot-utils': 30.0.4 - '@jest/transform': 30.0.4 - '@jest/types': 30.0.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + '@jest/snapshot-utils': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) chalk: 4.1.2 - expect: 30.0.4 + expect: 30.0.5 graceful-fs: 4.2.11 - jest-diff: 30.0.4 - jest-matcher-utils: 30.0.4 - jest-message-util: 30.0.2 - jest-util: 30.0.2 - pretty-format: 30.0.2 + jest-diff: 30.0.5 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + pretty-format: 30.0.5 semver: 7.7.2 - synckit: 0.11.8 + synckit: 0.11.11 transitivePeerDependencies: - supports-color - jest-util@30.0.0: + jest-util@30.0.5: dependencies: - '@jest/types': 30.0.0 - '@types/node': 24.0.15 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 chalk: 4.1.2 - ci-info: 4.2.0 + ci-info: 4.3.0 graceful-fs: 4.2.11 - picomatch: 4.0.2 + picomatch: 4.0.3 - jest-util@30.0.2: - dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.0.15 - chalk: 4.1.2 - ci-info: 4.2.0 - graceful-fs: 4.2.11 - picomatch: 4.0.2 - - jest-validate@30.0.2: + jest-validate@30.0.5: dependencies: '@jest/get-type': 30.0.1 - '@jest/types': 30.0.1 + '@jest/types': 30.0.5 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 - pretty-format: 30.0.2 + pretty-format: 30.0.5 - jest-watcher@30.0.4: + jest-watcher@30.0.5: dependencies: - '@jest/test-result': 30.0.4 - '@jest/types': 30.0.1 - '@types/node': 24.0.15 + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 24.1.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.0.2 + jest-util: 30.0.5 string-length: 4.0.2 - jest-worker@30.0.2: + jest-worker@30.0.5: dependencies: - '@types/node': 24.0.15 + '@types/node': 24.1.0 '@ungap/structured-clone': 1.3.0 - jest-util: 30.0.2 + jest-util: 30.0.5 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.0.4(@types/node@24.0.15)(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)): + jest@30.0.5(@types/node@24.1.0)(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)): dependencies: - '@jest/core': 30.0.4(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)) - '@jest/types': 30.0.1 + '@jest/core': 30.0.5(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)) + '@jest/types': 30.0.5 import-local: 3.2.0 - jest-cli: 30.0.4(@types/node@24.0.15)(ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3)) + jest-cli: 30.0.5(@types/node@24.1.0)(ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8580,7 +8579,7 @@ snapshots: jiti@2.4.2: {} - jose@6.0.10: {} + jose@6.0.12: {} js-tokens@4.0.0: {} @@ -8595,15 +8594,15 @@ snapshots: jsdom@26.1.0: dependencies: - cssstyle: 4.4.0 + cssstyle: 4.6.0 data-urls: 5.0.0 - decimal.js: 10.5.0 + decimal.js: 10.6.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.16 - parse5: 7.2.1 + nwsapi: 2.2.20 + parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -8613,7 +8612,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.0 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -8646,7 +8645,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -8655,6 +8654,24 @@ snapshots: dependencies: json-buffer: 3.0.1 + knip@5.62.0(@types/node@24.1.0)(typescript@5.8.3): + dependencies: + '@nodelib/fs.walk': 1.2.8 + '@types/node': 24.1.0 + fast-glob: 3.3.3 + formatly: 0.2.4 + jiti: 2.4.2 + js-yaml: 4.1.0 + minimist: 1.2.8 + oxc-resolver: 11.6.0 + picocolors: 1.1.1 + picomatch: 4.0.3 + smol-toml: 1.4.1 + strip-json-comments: 5.0.2 + typescript: 5.8.3 + zod: 3.25.76 + zod-validation-error: 3.5.3(zod@3.25.76) + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -8741,7 +8758,7 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 make-dir@4.0.0: dependencies: @@ -8774,11 +8791,11 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -8790,7 +8807,7 @@ snapshots: mkdirp@3.0.1: {} - motion-dom@12.23.6: + motion-dom@12.23.12: dependencies: motion-utils: 12.23.6 @@ -8804,39 +8821,39 @@ snapshots: nanoid@5.1.5: {} - napi-postinstall@0.2.4: {} + napi-postinstall@0.3.2: {} natural-compare@1.4.0: {} - next-auth@5.0.0-beta.29(next@15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0): + next-auth@5.0.0-beta.29(next@15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1): dependencies: '@auth/core': 0.40.0 - next: 15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 + next: 15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 - next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) - next@15.4.2(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.4.5(@babel/core@7.28.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.4.2 + '@next/env': 15.4.5 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001700 + caniuse-lite: 1.0.30001727 postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(@babel/core@7.27.4)(react@19.1.0) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + styled-jsx: 5.1.6(@babel/core@7.28.0)(react@19.1.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.4.2 - '@next/swc-darwin-x64': 15.4.2 - '@next/swc-linux-arm64-gnu': 15.4.2 - '@next/swc-linux-arm64-musl': 15.4.2 - '@next/swc-linux-x64-gnu': 15.4.2 - '@next/swc-linux-x64-musl': 15.4.2 - '@next/swc-win32-arm64-msvc': 15.4.2 - '@next/swc-win32-x64-msvc': 15.4.2 + '@next/swc-darwin-arm64': 15.4.5 + '@next/swc-darwin-x64': 15.4.5 + '@next/swc-linux-arm64-gnu': 15.4.5 + '@next/swc-linux-arm64-musl': 15.4.5 + '@next/swc-linux-x64-gnu': 15.4.5 + '@next/swc-linux-x64-musl': 15.4.5 + '@next/swc-win32-arm64-msvc': 15.4.5 + '@next/swc-win32-x64-msvc': 15.4.5 '@opentelemetry/api': 1.9.0 sharp: 0.34.3 transitivePeerDependencies: @@ -8857,9 +8874,9 @@ snapshots: dependencies: path-key: 3.1.1 - nwsapi@2.2.16: {} + nwsapi@2.2.20: {} - oauth4webapi@3.5.0: {} + oauth4webapi@3.6.0: {} object-assign@4.1.1: {} @@ -8870,15 +8887,16 @@ snapshots: object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + 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.8: + object.entries@1.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -8886,19 +8904,19 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -8923,10 +8941,34 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-resolver@11.6.0: + dependencies: + napi-postinstall: 0.3.2 + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.6.0 + '@oxc-resolver/binding-android-arm64': 11.6.0 + '@oxc-resolver/binding-darwin-arm64': 11.6.0 + '@oxc-resolver/binding-darwin-x64': 11.6.0 + '@oxc-resolver/binding-freebsd-x64': 11.6.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.6.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.6.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.6.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.6.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.6.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.6.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.6.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.6.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.6.0 + '@oxc-resolver/binding-linux-x64-musl': 11.6.0 + '@oxc-resolver/binding-wasm32-wasi': 11.6.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.6.0 + '@oxc-resolver/binding-win32-ia32-msvc': 11.6.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.6.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -8960,9 +9002,9 @@ snapshots: parse-srcset@1.0.2: {} - parse5@7.2.1: + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 path-exists@4.0.0: {} @@ -8988,8 +9030,6 @@ snapshots: dependencies: pg: 8.16.3 - pg-protocol@1.10.0: {} - pg-protocol@1.10.3: {} pg-types@2.2.0: @@ -9018,7 +9058,7 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pirates@4.0.7: {} @@ -9064,15 +9104,9 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@30.0.0: + pretty-format@30.0.5: dependencies: - '@jest/schemas': 30.0.0 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - pretty-format@30.0.2: - dependencies: - '@jest/schemas': 30.0.1 + '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 react-is: 18.3.1 @@ -9090,14 +9124,14 @@ snapshots: quick-lru@6.1.2: {} - react-dom@19.1.0(react@19.1.0): + react-dom@19.1.1(react@19.1.1): dependencies: - react: 19.1.0 + react: 19.1.1 scheduler: 0.26.0 - react-icons@5.5.0(react@19.1.0): + react-icons@5.5.0(react@19.1.1): dependencies: - react: 19.1.0 + react: 19.1.1 react-is@16.13.1: {} @@ -9105,34 +9139,34 @@ snapshots: react-is@18.3.1: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.8)(react@19.1.0): + react-remove-scroll-bar@2.3.8(@types/react@19.1.9)(react@19.1.1): dependencies: - react: 19.1.0 - react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) + react: 19.1.1 + react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.1.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - react-remove-scroll@2.6.3(@types/react@19.1.8)(react@19.1.0): + react-remove-scroll@2.7.1(@types/react@19.1.9)(react@19.1.1): dependencies: - react: 19.1.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.8)(react@19.1.0) - react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) + react: 19.1.1 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.9)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.1.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.8)(react@19.1.0) - use-sidecar: 1.1.3(@types/react@19.1.8)(react@19.1.0) + use-callback-ref: 1.3.3(@types/react@19.1.9)(react@19.1.1) + use-sidecar: 1.1.3(@types/react@19.1.9)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - react-style-singleton@2.2.3(@types/react@19.1.8)(react@19.1.0): + react-style-singleton@2.2.3(@types/react@19.1.9)(react@19.1.1): dependencies: get-nonce: 1.0.1 - react: 19.1.0 + react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - react@19.1.0: {} + react@19.1.1: {} redent@3.0.0: dependencies: @@ -9143,15 +9177,13 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -9187,7 +9219,7 @@ snapshots: retry@0.13.1: {} - reusify@1.0.4: {} + reusify@1.1.0: {} rrweb-cssom@0.8.0: {} @@ -9198,8 +9230,8 @@ snapshots: safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -9210,7 +9242,7 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 @@ -9244,7 +9276,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9303,16 +9335,16 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -9334,16 +9366,18 @@ snapshots: sirv@2.0.4: dependencies: - '@polka/url': 1.0.0-next.28 + '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 slash@3.0.0: {} - sonner@2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + smol-toml@1.4.1: {} + + sonner@2.0.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) source-map-js@1.2.1: {} @@ -9358,12 +9392,17 @@ snapshots: sprintf-js@1.0.3: {} - stable-hash@0.0.4: {} + stable-hash@0.0.5: {} stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -9385,17 +9424,17 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -9406,22 +9445,22 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -9451,14 +9490,16 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.2: {} + strnum@2.1.1: {} - styled-jsx@5.1.6(@babel/core@7.27.4)(react@19.1.0): + styled-jsx@5.1.6(@babel/core@7.28.0)(react@19.1.1): dependencies: client-only: 0.0.1 - react: 19.1.0 + react: 19.1.1 optionalDependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 supports-color@7.2.0: dependencies: @@ -9470,21 +9511,21 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swr@2.3.4(react@19.1.0): + swr@2.3.4(react@19.1.1): dependencies: dequal: 2.0.3 - react: 19.1.0 - use-sync-external-store: 1.4.0(react@19.1.0) + react: 19.1.1 + use-sync-external-store: 1.5.0(react@19.1.1) symbol-tree@3.2.4: {} - synckit@0.11.8: + synckit@0.11.11: dependencies: - '@pkgr/core': 0.2.7 + '@pkgr/core': 0.2.9 tailwindcss@4.1.11: {} - tapable@2.2.1: {} + tapable@2.2.2: {} tar@7.4.3: dependencies: @@ -9503,10 +9544,10 @@ snapshots: throttleit@2.1.0: {} - tinyglobby@0.2.11: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 tldts-core@6.1.86: {} @@ -9532,7 +9573,7 @@ snapshots: dependencies: punycode: 2.3.1 - ts-api-utils@2.0.1(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -9540,15 +9581,15 @@ snapshots: dependencies: sax: 1.2.4 - ts-node@10.9.2(@types/node@24.0.15)(typescript@5.8.3): + ts-node@10.9.2(@types/node@24.1.0)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.0.15 - acorn: 8.14.0 + '@types/node': 24.1.0 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -9575,11 +9616,11 @@ snapshots: type-fest@0.21.3: {} - type-fest@4.35.0: {} + type-fest@4.41.0: {} typed-array-buffer@1.0.3: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 @@ -9614,7 +9655,7 @@ snapshots: unbox-primitive@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -9623,37 +9664,37 @@ snapshots: undici-types@7.8.0: {} - undici@5.28.5: + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 - unrs-resolver@1.9.0: + unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.2.4 + napi-postinstall: 0.3.2 optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.9.0 - '@unrs/resolver-binding-android-arm64': 1.9.0 - '@unrs/resolver-binding-darwin-arm64': 1.9.0 - '@unrs/resolver-binding-darwin-x64': 1.9.0 - '@unrs/resolver-binding-freebsd-x64': 1.9.0 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.0 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.0 - '@unrs/resolver-binding-linux-arm64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-arm64-musl': 1.9.0 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-riscv64-musl': 1.9.0 - '@unrs/resolver-binding-linux-s390x-gnu': 1.9.0 - '@unrs/resolver-binding-linux-x64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-x64-musl': 1.9.0 - '@unrs/resolver-binding-wasm32-wasi': 1.9.0 - '@unrs/resolver-binding-win32-arm64-msvc': 1.9.0 - '@unrs/resolver-binding-win32-ia32-msvc': 1.9.0 - '@unrs/resolver-binding-win32-x64-msvc': 1.9.0 + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.1.2(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -9661,28 +9702,28 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.1.8)(react@19.1.0): + use-callback-ref@1.3.3(@types/react@19.1.9)(react@19.1.1): dependencies: - react: 19.1.0 + react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - use-debounce@10.0.5(react@19.1.0): + use-debounce@10.0.5(react@19.1.1): dependencies: - react: 19.1.0 + react: 19.1.1 - use-sidecar@1.1.3(@types/react@19.1.8)(react@19.1.0): + use-sidecar@1.1.3(@types/react@19.1.9)(react@19.1.1): dependencies: detect-node-es: 1.1.0 - react: 19.1.0 + react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.8 + '@types/react': 19.1.9 - use-sync-external-store@1.4.0(react@19.1.0): + use-sync-external-store@1.5.0(react@19.1.1): dependencies: - react: 19.1.0 + react: 19.1.1 uuid@9.0.1: {} @@ -9690,7 +9731,7 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -9700,6 +9741,8 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + walk-up-path@4.0.0: {} + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -9753,7 +9796,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 @@ -9765,7 +9808,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -9774,12 +9817,13 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.18: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -9810,7 +9854,7 @@ snapshots: ws@7.5.10: {} - ws@8.18.0: {} + ws@8.18.3: {} xml-name-validator@5.0.0: {} @@ -9840,8 +9884,12 @@ snapshots: yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.1(zod@3.24.2): + zod-to-json-schema@3.24.6(zod@3.25.76): dependencies: - zod: 3.24.2 + zod: 3.25.76 - zod@3.24.2: {} + zod-validation-error@3.5.3(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} diff --git a/src/admin/AdminAppMenu.tsx b/src/admin/AdminAppMenu.tsx index ce73cc37..799cef2b 100644 --- a/src/admin/AdminAppMenu.tsx +++ b/src/admin/AdminAppMenu.tsx @@ -100,7 +100,7 @@ export default function AdminAppMenu({ items.push({ label: appText.admin.updatePlural, annotation: <> - + {photosCountNeedSync} clearInterval(interval); }, [updateTimes]); - const shouldShowBanner = hasRecentUpdates && isPathTopLevelAdmin(pathname); + const shouldShowBanner = + hasRecentUpdates && + isPathTopLevelAdmin(pathname) && + pathname !== PATH_ADMIN_PHOTOS_UPDATES; return ( {appText.admin.sync} - {photoNeedsToBeSynced(photo) && + {photoNeedsToBeUpdated(photo) && + {debugColorData && + } {photosCountNeedsSync > 0 && {photosCount > photos.length && } } diff --git a/src/admin/AdminPhotosTable.tsx b/src/admin/AdminPhotosTable.tsx index 2d4b264c..050922a0 100644 --- a/src/admin/AdminPhotosTable.tsx +++ b/src/admin/AdminPhotosTable.tsx @@ -14,10 +14,12 @@ import { RevalidatePhoto } from '@/photo/InfinitePhotoScroll'; import PhotoSyncButton from './PhotoSyncButton'; import DeletePhotoButton from './DeletePhotoButton'; import { Timezone } from '@/utility/timezone'; -import Tooltip from '@/components/Tooltip'; -import { photoNeedsToBeSynced, getPhotoSyncStatusText } from '@/photo/sync'; +import { photoNeedsToBeUpdated } from '@/photo/update'; import PhotoVisibilityIcon from '@/photo/visibility/PhotoVisibilityIcon'; import { doesPhotoHaveDefaultVisibility } from '@/photo/visibility'; +import UpdateTooltip from '@/photo/update/UpdateTooltip'; +import PhotoColors from '@/photo/color/PhotoColors'; +import SyncColorButton from '@/photo/color/SyncColorButton'; export default function AdminPhotosTable({ photos, @@ -30,6 +32,8 @@ export default function AdminPhotosTable({ canDelete = true, timezone, shouldScrollIntoViewOnExternalSync, + updateMode, + debugColorData, }: { photos: Photo[], onLastPhotoVisible?: () => void @@ -41,6 +45,9 @@ export default function AdminPhotosTable({ canDelete?: boolean timezone?: Timezone shouldScrollIntoViewOnExternalSync?: boolean + // Only sync color data where possible + updateMode?: boolean + debugColorData?: boolean }) { const { invalidateSwr } = useAppState(); @@ -78,6 +85,10 @@ export default function AdminPhotosTable({ > {titleForPhoto(photo, false)} + {debugColorData && photo.colorData && +
+ +
}
{!doesPhotoHaveDefaultVisibility(photo) && } - {photoNeedsToBeSynced(photo) && + {photoNeedsToBeUpdated(photo) && - + } {photo.priorityOrder !== null && + {debugColorData && + } {canDelete && } ); diff --git a/src/admin/AdminPhotosSyncClient.tsx b/src/admin/AdminPhotosUpdateClient.tsx similarity index 78% rename from src/admin/AdminPhotosSyncClient.tsx rename to src/admin/AdminPhotosUpdateClient.tsx index 248a188e..eda2184d 100644 --- a/src/admin/AdminPhotosSyncClient.tsx +++ b/src/admin/AdminPhotosUpdateClient.tsx @@ -2,22 +2,25 @@ import { Photo } from '@/photo'; import AdminPhotosTable from '@/admin/AdminPhotosTable'; -import IconGrSync from '@/components/icons/IconGrSync'; import Note from '@/components/Note'; import AdminChildPage from '@/components/AdminChildPage'; import { PATH_ADMIN_PHOTOS } from '@/app/path'; -import { useMemo, useRef, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { syncPhotosAction } from '@/photo/actions'; import { useRouter } from 'next/navigation'; import ResponsiveText from '@/components/primitives/ResponsiveText'; import { LiaBroomSolid } from 'react-icons/lia'; import ProgressButton from '@/components/primitives/ProgressButton'; import ErrorNote from '@/components/ErrorNote'; -import { getPhotosSyncStatusText } from '@/photo/sync'; +import { + getPhotosUpdateStatusText, + isPhotoOnlyMissingColorData, +} from '@/photo/update'; +import IconBroom from '@/components/icons/IconBroom'; const SYNC_BATCH_SIZE_MAX = 3; -export default function AdminPhotosSyncClient({ +export default function AdminPhotosUpdateClient({ photos, hasAiTextGeneration, }: { @@ -37,7 +40,13 @@ export default function AdminPhotosSyncClient({ const router = useRouter(); - const statusText = useMemo(() => getPhotosSyncStatusText(photos), [photos]); + const statusText = useMemo(() => getPhotosUpdateStatusText(photos), [photos]); + + useEffect(() => { + if (photos.length === 0 && !error && !errorRef.current) { + router.push(PATH_ADMIN_PHOTOS); + } + }, [photos.length, router, error]); return ( } accessory={} + icon={} hideText="never" progress={progress} tooltip={photos.length === 1 - ? 'Sync data for 1 photo' - : `Sync data for all ${photos.length} photos`} + ? 'Update 1 photo' + : `Update all ${photos.length} photos`} onClick={async () => { if (window.confirm([ 'Are you sure you want to sync', @@ -69,7 +78,12 @@ export default function AdminPhotosSyncClient({ const photoIds = photoIdsToSync.current .slice(0, SYNC_BATCH_SIZE_MAX); setPhotoIdsSyncing(photoIds); - await syncPhotosAction(photoIds) + await syncPhotosAction(photoIds.map(id => ({ + photoId: id, + onlySyncColorData: isPhotoOnlyMissingColorData( + photos.find(photo => photo.id === id), + ), + }))) .then(() => { photoIdsToSync.current = photoIdsToSync.current.filter( id => !photoIds.includes(id), @@ -86,21 +100,17 @@ export default function AdminPhotosSyncClient({ }); if (errorRef.current) { break; } } - if (!errorRef.current) { - router.push(PATH_ADMIN_PHOTOS); - } else { - setProgress(0); - setPhotoIdsSyncing([]); - router.refresh(); - } + setProgress(0); + setPhotoIdsSyncing([]); + router.refresh(); } }} isLoading={arePhotoIdsSyncing} disabled={photoIdsSyncing.length > 0} > {arePhotoIdsSyncing - ? 'Syncing ...' - : 'Sync All'} + ? 'Updating ...' + : 'Update All'} } >
@@ -133,6 +143,7 @@ export default function AdminPhotosSyncClient({ canDelete={false} dateType="updatedAt" shouldScrollIntoViewOnExternalSync + updateMode />
diff --git a/src/admin/AdminUploadsTableRow.tsx b/src/admin/AdminUploadsTableRow.tsx index 090432e8..235ea6d6 100644 --- a/src/admin/AdminUploadsTableRow.tsx +++ b/src/admin/AdminUploadsTableRow.tsx @@ -106,6 +106,7 @@ export default function AdminUploadsTableRow({
diff --git a/src/admin/PhotoSyncButton.tsx b/src/admin/PhotoSyncButton.tsx index 4f69bef3..b11d182f 100644 --- a/src/admin/PhotoSyncButton.tsx +++ b/src/admin/PhotoSyncButton.tsx @@ -1,5 +1,5 @@ import LoaderButton from '@/components/primitives/LoaderButton'; -import { syncPhotoAction } from '@/photo/actions'; +import { storeColorDataForPhotoAction, syncPhotoAction } from '@/photo/actions'; import IconGrSync from '@/components/icons/IconGrSync'; import { toastSuccess } from '@/toast'; import { ComponentProps, useRef, useState } from 'react'; @@ -8,10 +8,13 @@ import clsx from 'clsx/lite'; import useScrollIntoView from '@/utility/useScrollIntoView'; import { Photo } from '@/photo'; import { syncPhotoConfirmText } from './confirm'; +import { isPhotoOnlyMissingColorData } from '@/photo/update'; +import IconBroom from '@/components/icons/IconBroom'; export default function PhotoSyncButton({ photo, onSyncComplete, + updateMode, className, isSyncingExternal, hasAiTextGeneration, @@ -22,6 +25,7 @@ export default function PhotoSyncButton({ }: { photo: Photo onSyncComplete?: () => void + updateMode?: boolean isSyncingExternal?: boolean hasAiTextGeneration: boolean shouldConfirm?: boolean @@ -39,21 +43,34 @@ export default function PhotoSyncButton({ shouldScrollIntoViewOnExternalSync, }); + const onlySyncColorData = updateMode && + isPhotoOnlyMissingColorData(photo); + return ( - + } + icon={updateMode + ? + : } onClick={() => { if ( !shouldConfirm || - window.confirm(syncPhotoConfirmText(photo, hasAiTextGeneration)) + window.confirm(syncPhotoConfirmText( + photo, + hasAiTextGeneration, + onlySyncColorData, + )) ) { setIsSyncing(true); - syncPhotoAction(photo.id) + (onlySyncColorData + ? storeColorDataForPhotoAction + : syncPhotoAction)(photo.id) .then(() => { onSyncComplete?.(); if (shouldToast) { diff --git a/src/admin/actions.ts b/src/admin/actions.ts index c108be96..37186bda 100644 --- a/src/admin/actions.ts +++ b/src/admin/actions.ts @@ -11,7 +11,7 @@ import { getPhotosMeta, getUniqueTags, getUniqueRecipes, - getPhotosInNeedOfSyncCount, + getPhotosInNeedOfUpdateCount, } from '@/photo/db/query'; import { getGitHubMetaForCurrentApp, @@ -37,7 +37,7 @@ export const getAdminDataAction = async () => getPhotosMeta({ hidden: 'only' }) .then(({ count }) => count) .catch(() => 0), - getPhotosInNeedOfSyncCount(), + getPhotosInNeedOfUpdateCount(), getGitHubMetaForCurrentApp(), getStorageUploadUrlsNoStore() .then(urls => urls.length) diff --git a/src/admin/config/AdminAppConfigurationClient.tsx b/src/admin/config/AdminAppConfigurationClient.tsx index 942d98f5..f8255938 100644 --- a/src/admin/config/AdminAppConfigurationClient.tsx +++ b/src/admin/config/AdminAppConfigurationClient.tsx @@ -30,6 +30,8 @@ import { ConfigSectionKey, getAdminConfigSections, } from '.'; +import ColorDot from '@/photo/color/ColorDot'; +import { Oklch } from '@/photo/color/client'; export default function AdminAppConfigurationClient({ // Storage @@ -85,9 +87,13 @@ export default function AdminAppConfigurationClient({ // Sort hasDefaultSortBy, defaultSortBy, - isSortWithPriority, hasNavSortControl, navSortControl, + isColorSortEnabled, + hasColorSortConfiguration, + colorSortStartingHue, + colorSortChromaCutoff, + isSortWithPriority, // Display showKeyboardShortcutTooltips, showExifInfo, @@ -201,6 +207,13 @@ export default function AdminAppConfigurationClient({ {children || href} ; + const renderColorDot = (color: Oklch | string, includeTooltip?: boolean) => + ; + const renderGroupContent = (key: ConfigSectionKey): JSX.Element => { switch (key) { case 'Storage': @@ -406,7 +419,7 @@ export default function AdminAppConfigurationClient({ } ; - case 'AI Text Generation': + case 'AI Content Generation': return <> @@ -611,19 +624,70 @@ export default function AdminAppConfigurationClient({ optional >
- {SORT_BY_OPTIONS.map(({sortBy, string }) => - - {renderSubStatus( - sortBy === defaultSortBy ? 'checked' : 'optional', - `${string}${sortBy === APP_DEFAULT_SORT_BY - ? ' (default)' - : ''}`, - )} - )} + {SORT_BY_OPTIONS + .filter(({ canBeDefault }) => canBeDefault) + .map(({sortBy, string }) => + + {renderSubStatus( + sortBy === defaultSortBy ? 'checked' : 'optional', + `${string}${sortBy === APP_DEFAULT_SORT_BY + ? ' (default)' + : ''}`, + )} + )}
Change default sort on grid/full homepages {renderEnvVars(['NEXT_PUBLIC_DEFAULT_SORT'])}
+ + Set environment variable to {'"none"'}, {'"toggle"'} (default), + or {'"menu"'}, to control sort UI on grid/full homepages: + {renderEnvVars(['NEXT_PUBLIC_NAV_SORT_CONTROL'])} + + + Set environment variable to {'"1"'} to enable color-based sorting + (forces nav sort control to {'"menu,"'} flags photos missing + color data in admin dashboard)—color identification + benefits greatly from AI being enabled: + {renderEnvVars([ + 'NEXT_PUBLIC_COLOR_SORT', + ])} + + + Configure which colors start first + (accepts a hue of 0 to 360, default: 80) + and which are considered sufficiently vibrant + (accepts a chroma of 0 to 0.37, default: 0.05): +
+ + +
+
- - Set environment variable to {'"none"'}, {'"toggle"'} (default), - or {'"menu"'}, to control sort UI on grid/full homepages: - {renderEnvVars(['NEXT_PUBLIC_NAV_SORT_CONTROL'])} - ; case 'Display': return <> @@ -768,17 +823,11 @@ export default function AdminAppConfigurationClient({
} + accessory={matteColor && renderColorDot(matteColor)} /> } + accessory={matteColorDark && renderColorDot(matteColorDark)} />
diff --git a/src/admin/config/index.tsx b/src/admin/config/index.tsx index b98af542..7de371ce 100644 --- a/src/admin/config/index.tsx +++ b/src/admin/config/index.tsx @@ -27,7 +27,7 @@ const ADMIN_CONFIG_SECTIONS = [{ required: true, icon: , }, { - title: 'AI Text Generation', + title: 'AI Content Generation', titleShort: 'AI', required: false, icon: , diff --git a/src/admin/confirm.ts b/src/admin/confirm.ts index c5112f5e..59f6d3bc 100644 --- a/src/admin/confirm.ts +++ b/src/admin/confirm.ts @@ -3,12 +3,17 @@ import { Photo } from '@/photo'; export const syncPhotoConfirmText = ( photo: Photo, hasAiTextGeneration: boolean, + onlySyncColorData?: boolean, ) => { const confirmText = ['Sync']; if (photo.title) { confirmText.push(`"${photo.title}"`); } - confirmText.push('data from original image file?'); - if (hasAiTextGeneration) { confirmText.push( - 'AI text will be generated for undefined fields.'); } + if (onlySyncColorData) { + confirmText.push('color data?'); + } else { + confirmText.push('data from original image file?'); + if (hasAiTextGeneration) { confirmText.push( + 'AI text will be generated for undefined fields.'); } + } confirmText.push('This action cannot be undone.'); return confirmText.join(' '); }; diff --git a/src/admin/insights/AdminAppInsights.tsx b/src/admin/insights/AdminAppInsights.tsx index b88b4fb9..18ae9653 100644 --- a/src/admin/insights/AdminAppInsights.tsx +++ b/src/admin/insights/AdminAppInsights.tsx @@ -6,7 +6,7 @@ import { getUniqueLenses, getUniqueRecipes, getUniqueTags, - getPhotosInNeedOfSyncCount, + getPhotosInNeedOfUpdateCount, } from '@/photo/db/query'; import AdminAppInsightsClient from './AdminAppInsightsClient'; import { getAllInsights, getGitHubMetaForCurrentApp } from '.'; @@ -27,7 +27,7 @@ export default async function AdminAppInsights() { ] = await Promise.all([ getPhotosMeta({ hidden: 'include' }), getPhotosMeta({ hidden: 'only' }), - getPhotosInNeedOfSyncCount(), + getPhotosInNeedOfUpdateCount(), getPhotosMeta({ maximumAspectRatio: 0.9 }), getGitHubMetaForCurrentApp(), getUniqueCameras(), diff --git a/src/admin/insights/index.ts b/src/admin/insights/index.ts index 4267d40e..d4c02485 100644 --- a/src/admin/insights/index.ts +++ b/src/admin/insights/index.ts @@ -11,7 +11,7 @@ import { IS_META_TITLE_CONFIGURED, HAS_STATIC_OPTIMIZATION, GRID_HOMEPAGE_ENABLED, - AI_TEXT_GENERATION_ENABLED, + AI_CONTENT_GENERATION_ENABLED, } from '@/app/config'; import { PhotoDateRange } from '@/photo'; import { getGitHubMeta } from '@/platforms/github'; @@ -132,7 +132,7 @@ export const getAllInsights = ({ }) => ({ ...getSignificantInsights({ codeMeta, photosCountNeedSync }), noFork: !codeMeta?.isForkedFromBase && !codeMeta?.isBaseRepo, - noAi: !AI_TEXT_GENERATION_ENABLED, + noAi: !AI_CONTENT_GENERATION_ENABLED, noConfiguredMeta: !IS_META_TITLE_CONFIGURED || !IS_META_DESCRIPTION_CONFIGURED, diff --git a/src/app/config.ts b/src/app/config.ts index ec8e56aa..0126fd35 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -9,6 +9,7 @@ import { shortenUrl, } from '@/utility/url'; import { getNavSortControlFromString, getSortByFromString } from '@/photo/sort'; +import { parseChromaCutoff, parseStartingHue } from '@/photo/color/sort'; // HARD-CODED GLOBAL CONFIGURATION @@ -205,7 +206,7 @@ export const CURRENT_STORAGE: StorageType = // AI export const OPENAI_BASE_URL = process.env.OPENAI_BASE_URL; -export const AI_TEXT_GENERATION_ENABLED = +export const AI_CONTENT_GENERATION_ENABLED = Boolean(process.env.OPENAI_SECRET_KEY); export const AI_TEXT_AUTO_GENERATED_FIELDS = parseAiAutoGeneratedFieldsString( process.env.AI_TEXT_AUTO_GENERATED_FIELDS); @@ -280,8 +281,15 @@ export const USER_DEFAULT_SORT_OPTIONS = { sortBy: USER_DEFAULT_SORT_BY, sortWithPriority: USER_DEFAULT_SORT_WITH_PRIORITY, }; -export const NAV_SORT_CONTROL = - getNavSortControlFromString(process.env.NEXT_PUBLIC_NAV_SORT_CONTROL); +export const COLOR_SORT_ENABLED = + process.env.NEXT_PUBLIC_COLOR_SORT === '1'; +export const COLOR_SORT_STARTING_HUE = + parseStartingHue(process.env.NEXT_PUBLIC_COLOR_SORT_STARTING_HUE); +export const COLOR_SORT_CHROMA_CUTOFF = + parseChromaCutoff(process.env.NEXT_PUBLIC_COLOR_SORT_CHROMA_CUTOFF); +export const NAV_SORT_CONTROL = COLOR_SORT_ENABLED + ? 'menu' + : getNavSortControlFromString(process.env.NEXT_PUBLIC_NAV_SORT_CONTROL); // DISPLAY @@ -392,7 +400,7 @@ export const APP_CONFIGURATION = { hasPageAbout: Boolean(process.env.NEXT_PUBLIC_SITE_ABOUT), // AI hasOpenaiBaseUrl: Boolean(OPENAI_BASE_URL), - isAiTextGenerationEnabled: AI_TEXT_GENERATION_ENABLED, + isAiTextGenerationEnabled: AI_CONTENT_GENERATION_ENABLED, aiTextAutoGeneratedFields: process.env.AI_TEXT_AUTO_GENERATED_FIELDS ? AI_TEXT_AUTO_GENERATED_FIELDS.length === 0 ? ['none'] @@ -421,9 +429,15 @@ export const APP_CONFIGURATION = { // Sort hasDefaultSortBy: Boolean(process.env.NEXT_PUBLIC_DEFAULT_SORT), defaultSortBy: USER_DEFAULT_SORT_BY, - isSortWithPriority: USER_DEFAULT_SORT_WITH_PRIORITY, hasNavSortControl: Boolean(process.env.NEXT_PUBLIC_NAV_SORT_CONTROL), navSortControl: NAV_SORT_CONTROL, + isColorSortEnabled: COLOR_SORT_ENABLED, + hasColorSortConfiguration: + Boolean(process.env.NEXT_PUBLIC_COLOR_SORT_STARTING_HUE) || + Boolean(process.env.NEXT_PUBLIC_COLOR_SORT_CHROMA_CUTOFF), + colorSortStartingHue: COLOR_SORT_STARTING_HUE, + colorSortChromaCutoff: COLOR_SORT_CHROMA_CUTOFF, + isSortWithPriority: USER_DEFAULT_SORT_WITH_PRIORITY, // Display showKeyboardShortcutTooltips: SHOW_KEYBOARD_SHORTCUT_TOOLTIPS, showExifInfo: SHOW_EXIF_DATA, diff --git a/src/app/path.ts b/src/app/path.ts index 57c7379d..5a5b34db 100644 --- a/src/app/path.ts +++ b/src/app/path.ts @@ -26,8 +26,9 @@ export const PATH_FULL_INFERRED = GRID_HOMEPAGE_ENABLED // Sort export const PARAM_SORT_TYPE_TAKEN_AT = 'taken-at'; export const PARAM_SORT_TYPE_UPLOADED_AT = 'uploaded-at'; -export const PARAM_SORT_ORDER_NEWEST = 'newest-first'; -export const PARAM_SORT_ORDER_OLDEST = 'oldest-first'; +export const PARAM_SORT_TYPE_COLOR = 'color'; +export const PARAM_SORT_ORDER_DESCENDING = 'descending'; +export const PARAM_SORT_ORDER_ASCENDING = 'ascending'; export const doesPathOfferSort = (pathname: string) => pathname === PATH_ROOT || pathname.startsWith(PATH_GRID) || diff --git a/src/camera/CameraHeader.tsx b/src/camera/CameraHeader.tsx index 7b4d6c8c..4736b62c 100644 --- a/src/camera/CameraHeader.tsx +++ b/src/camera/CameraHeader.tsx @@ -3,7 +3,7 @@ import PhotoHeader from '@/photo/PhotoHeader'; import { Camera, cameraFromPhoto } from '.'; import PhotoCamera from './PhotoCamera'; import { descriptionForCameraPhotos } from './meta'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import { getAppText } from '@/i18n/state/server'; export default async function CameraHeader({ @@ -45,7 +45,7 @@ export default async function CameraHeader({ indexNumber={indexNumber} count={count} dateRange={dateRange} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} includeShareButton /> ); diff --git a/src/cmdk/CommandKClient.tsx b/src/cmdk/CommandKClient.tsx index 7d39f86b..c6645272 100644 --- a/src/cmdk/CommandKClient.tsx +++ b/src/cmdk/CommandKClient.tsx @@ -182,8 +182,8 @@ export default function CommandKClient({ const { doesPathOfferSort, isSortedByDefault, - pathNewest, - pathOldest, + pathDescending, + pathAscending, pathTakenAt, pathUploadedAt, pathClearSort, @@ -526,11 +526,11 @@ export default function CommandKClient({ const sortItems = [{ label: appText.sort.newestFirst, - path: pathNewest, + path: pathDescending, annotation: renderCheck(!isAscending), }, { label: appText.sort.oldestFirst, - path: pathOldest, + path: pathAscending, annotation: renderCheck(isAscending), }, { label: appText.sort.byTakenAt, diff --git a/src/components/EnvVar.tsx b/src/components/EnvVar.tsx index b4ecf96b..451bba1c 100644 --- a/src/components/EnvVar.tsx +++ b/src/components/EnvVar.tsx @@ -12,7 +12,7 @@ export default function EnvVar({ className, }: { variable: string, - value?: string, + value?: string | number, accessory?: ReactNode, includeCopyButton?: boolean, trailingContent?: ReactNode, diff --git a/src/components/FieldsetWithStatus.tsx b/src/components/FieldsetWithStatus.tsx index c9c1e811..d7fa30a2 100644 --- a/src/components/FieldsetWithStatus.tsx +++ b/src/components/FieldsetWithStatus.tsx @@ -19,6 +19,7 @@ export default function FieldsetWithStatus({ icon, note, noteShort, + noteComplex, tooltip, error, value, @@ -48,6 +49,7 @@ export default function FieldsetWithStatus({ icon?: ReactNode note?: string noteShort?: string + noteComplex?: ReactNode tooltip?: string error?: string value: string @@ -157,6 +159,7 @@ export default function FieldsetWithStatus({ > ({note}) } + {noteComplex} {isModified && !error && ); diff --git a/src/focal/FocalLengthHeader.tsx b/src/focal/FocalLengthHeader.tsx index 83736b33..1bdbcb6f 100644 --- a/src/focal/FocalLengthHeader.tsx +++ b/src/focal/FocalLengthHeader.tsx @@ -2,7 +2,7 @@ import { Photo, PhotoDateRange } from '@/photo'; import { descriptionForFocalLengthPhotos } from '.'; import PhotoHeader from '@/photo/PhotoHeader'; import PhotoFocalLength from './PhotoFocalLength'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import { getAppText } from '@/i18n/state/server'; export default async function FocalLengthHeader({ @@ -41,7 +41,7 @@ export default async function FocalLengthHeader({ indexNumber={indexNumber} count={count} dateRange={dateRange} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} includeShareButton /> ); diff --git a/src/i18n/locales/bd-bn.ts b/src/i18n/locales/bd-bn.ts index fc0c5917..d1ac2b59 100644 --- a/src/i18n/locales/bd-bn.ts +++ b/src/i18n/locales/bd-bn.ts @@ -57,6 +57,8 @@ export const TEXT: I18N = { sort: 'সাজান', newest: 'নতুনতম', oldest: 'পুরাতনতম', + descending: 'অবরোহী', + ascending: 'আরোহী', newestFirst: 'নতুনতম প্রথমে', oldestFirst: 'পুরাতনতম প্রথমে', viewNewest: 'নতুনতম দেখুন', @@ -66,6 +68,8 @@ export const TEXT: I18N = { uploadedAt: 'আপলোড হয়েছে', byUploadedAt: 'আপলোডের সময় অনুযায়ী', uploadedAtShort: 'আপলোড', + color: 'ক্রোমাটিক', + byColor: 'রঙ অনুযায়ী', clearSort: 'সাজানো মুছুন', }, cmdk: { diff --git a/src/i18n/locales/en-us.ts b/src/i18n/locales/en-us.ts index 406a7519..c92ec7be 100644 --- a/src/i18n/locales/en-us.ts +++ b/src/i18n/locales/en-us.ts @@ -56,6 +56,8 @@ export const TEXT = { sort: 'Sort', newest: 'Newest', oldest: 'Oldest', + descending: 'Descending', + ascending: 'Ascending', newestFirst: 'Newest first', oldestFirst: 'Oldest first', viewNewest: 'View newest', @@ -65,6 +67,8 @@ export const TEXT = { uploadedAt: 'Uploaded at', byUploadedAt: 'By uploaded at', uploadedAtShort: 'Uploaded', + color: 'Chromatic', + byColor: 'By color', clearSort: 'Clear sort', }, cmdk: { diff --git a/src/i18n/locales/id-id.ts b/src/i18n/locales/id-id.ts index 59cc150c..7fadeacb 100644 --- a/src/i18n/locales/id-id.ts +++ b/src/i18n/locales/id-id.ts @@ -57,6 +57,8 @@ export const TEXT: I18N = { sort: 'Urutkan', newest: 'Terbaru', oldest: 'Terlama', + descending: 'Menurun', + ascending: 'Menaik', newestFirst: 'Terbaru dulu', oldestFirst: 'Terlama dulu', viewNewest: 'Lihat terbaru', @@ -66,6 +68,8 @@ export const TEXT: I18N = { uploadedAt: 'Diunggah pada', byUploadedAt: 'Berdasarkan waktu unggahan', uploadedAtShort: 'Diunggah', + color: 'Kromatik', + byColor: 'Berdasarkan warna', clearSort: 'Hapus pengurutan', }, cmdk: { diff --git a/src/i18n/locales/pt-br.ts b/src/i18n/locales/pt-br.ts index 9b376984..0e77f221 100644 --- a/src/i18n/locales/pt-br.ts +++ b/src/i18n/locales/pt-br.ts @@ -57,6 +57,8 @@ export const TEXT: I18N = { sort: 'Ordenar', newest: 'Mais recentes', oldest: 'Mais antigas', + descending: 'Decrescente', + ascending: 'Crescente', newestFirst: 'Mais recentes primeiro', oldestFirst: 'Mais antigas primeiro', viewNewest: 'Ver mais recentes', @@ -66,6 +68,8 @@ export const TEXT: I18N = { uploadedAt: 'Enviado em', byUploadedAt: 'Por data de envio', uploadedAtShort: 'Enviado', + color: 'Cromático', + byColor: 'Por cor', clearSort: 'Limpar ordenação', }, cmdk: { diff --git a/src/i18n/locales/pt-pt.ts b/src/i18n/locales/pt-pt.ts index 11f41421..60f31dfc 100644 --- a/src/i18n/locales/pt-pt.ts +++ b/src/i18n/locales/pt-pt.ts @@ -57,6 +57,8 @@ export const TEXT: I18N = { sort: 'Ordenar', newest: 'Mais recentes', oldest: 'Mais antigas', + descending: 'Decrescente', + ascending: 'Crescente', newestFirst: 'Mais recentes primeiro', oldestFirst: 'Mais antigas primeiro', viewNewest: 'Ver mais recentes', @@ -66,6 +68,8 @@ export const TEXT: I18N = { uploadedAt: 'Enviado em', byUploadedAt: 'Por data de envio', uploadedAtShort: 'Enviado', + color: 'Cromático', + byColor: 'Por cor', clearSort: 'Limpar ordenação', }, cmdk: { diff --git a/src/i18n/locales/tr-tr.ts b/src/i18n/locales/tr-tr.ts index ba13dca0..9546cfce 100644 --- a/src/i18n/locales/tr-tr.ts +++ b/src/i18n/locales/tr-tr.ts @@ -57,6 +57,8 @@ export const TEXT: I18N = { sort: 'Sırala', newest: 'En Yeni', oldest: 'En Eski', + descending: 'Azalan', + ascending: 'Artan', newestFirst: 'En Yeniden Eskiye', oldestFirst: 'En Eskiden Yeniye', viewNewest: 'En yeniye bak', @@ -66,6 +68,8 @@ export const TEXT: I18N = { uploadedAt: 'Yüklenme Zamanı', byUploadedAt: 'Yüklenme zamanına göre', uploadedAtShort: 'Yüklenme', + color: 'Kromatik', + byColor: 'Renge göre', clearSort: 'Sıralamayı temizle', }, cmdk: { diff --git a/src/i18n/locales/zh-cn.ts b/src/i18n/locales/zh-cn.ts index ba988f9d..c6be195b 100644 --- a/src/i18n/locales/zh-cn.ts +++ b/src/i18n/locales/zh-cn.ts @@ -57,6 +57,8 @@ export const TEXT: I18N = { sort: '排序', newest: '最新', oldest: '最旧', + descending: '降序', + ascending: '升序', newestFirst: '最新优先', oldestFirst: '最旧优先', viewNewest: '查看最新', @@ -66,6 +68,8 @@ export const TEXT: I18N = { uploadedAt: '上传时间', byUploadedAt: '按上传时间', uploadedAtShort: '上传', + color: '色度', + byColor: '按颜色', clearSort: '清除排序', }, cmdk: { diff --git a/src/lens/LensHeader.tsx b/src/lens/LensHeader.tsx index 9f41cb75..b8b505f0 100644 --- a/src/lens/LensHeader.tsx +++ b/src/lens/LensHeader.tsx @@ -3,7 +3,7 @@ import PhotoHeader from '@/photo/PhotoHeader'; import { Lens, lensFromPhoto } from '.'; import PhotoLens from './PhotoLens'; import { descriptionForLensPhotos } from './meta'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import { getAppText } from '@/i18n/state/server'; export default async function LensHeader({ @@ -46,7 +46,7 @@ export default async function LensHeader({ indexNumber={indexNumber} count={count} dateRange={dateRange} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} includeShareButton /> ); diff --git a/src/lens/index.ts b/src/lens/index.ts index bc6398d8..83f43ed7 100644 --- a/src/lens/index.ts +++ b/src/lens/index.ts @@ -114,7 +114,7 @@ export const formatLensText = ( switch (length) { case 'long': - return make ? `${make} ${model}` : modelRaw; + return make ? `${make} ${modelRaw}` : modelRaw; case 'medium': case 'short': return model; diff --git a/src/photo/PhotoDetailPage.tsx b/src/photo/PhotoDetailPage.tsx index 6919cbdf..90ac54e3 100644 --- a/src/photo/PhotoDetailPage.tsx +++ b/src/photo/PhotoDetailPage.tsx @@ -14,7 +14,7 @@ import PhotoHeader from './PhotoHeader'; import RecipeHeader from '@/recipe/RecipeHeader'; import { ReactNode } from 'react'; import LensHeader from '@/lens/LensHeader'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import YearHeader from '@/years/YearHeader'; import RecentsHeader from '@/recents/RecentsHeader'; @@ -135,7 +135,7 @@ export default function PhotoDetailPage({ selectedPhoto={photo} photos={photos} recipe={recipe} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} />} /> void + debugColor?: boolean } & PhotoSetCategory) { const ref = useRef(null); @@ -40,6 +43,7 @@ export default function PhotoMedium({ ref={ref} href={pathForPhoto({ photo, ...categories })} className={clsx( + 'group', 'active:brightness-75', selected && 'brightness-50', className, @@ -57,6 +61,16 @@ export default function PhotoMedium({ )}>
} + {debugColor && photo.colorData && +
+ +
} runAuthenticatedAdminServerAction(async () => { - const PROGRESS_TASK_COUNT = AI_TEXT_GENERATION_ENABLED ? 5 : 4; + const PROGRESS_TASK_COUNT = AI_CONTENT_GENERATION_ENABLED ? 5 : 4; const addedUploadUrls: string[] = []; let currentUploadUrl = ''; @@ -401,6 +407,39 @@ export const getPhotosNeedingRecipeTitleCountAction = async ( ), ); +export const storeColorDataForPhotoAction = async (photoId: string) => + runAuthenticatedAdminServerAction(async () => { + const photo = await getPhoto(photoId, true); + if (photo) { + const colorFields = await getColorFieldsForImageUrl( + photo.url, + photo.colorData, + ); + if (colorFields) { + await updatePhoto(convertPhotoToPhotoDbInsert({ + ...photo, + ...colorFields, + })); + } + revalidatePhoto(photo.id); + } + }); + +export const recalculateColorDataForAllPhotosAction = async () => + runAuthenticatedAdminServerAction(async () => { + const photos = await getColorDataForPhotos(); + for (const { id, url, colorData: _colorData } of photos) { + const colorFields = await getColorFieldsForPhotoDbInsert(url, _colorData); + if (colorFields && colorFields.colorSort) { + await updateColorDataForPhoto( + id, + colorFields.colorData, + colorFields.colorSort, + ); + } + } + }); + export const deletePhotoRecipeGloballyAction = async (formData: FormData) => runAuthenticatedAdminServerAction(async () => { const recipe = formData.get('recipe') as string; @@ -463,7 +502,7 @@ export const syncPhotoAction = async (photoId: string, isBatch?: boolean) => } = await extractImageDataFromBlobPath(photo.url, { includeInitialPhotoFields: false, generateBlurData: BLUR_ENABLED, - generateResizedImage: AI_TEXT_GENERATION_ENABLED, + generateResizedImage: AI_CONTENT_GENERATION_ENABLED, }); let urlToDelete: string | undefined; @@ -490,7 +529,7 @@ export const syncPhotoAction = async (photoId: string, isBatch?: boolean) => semanticDescription: aiSemanticDescription, } = await generateAiImageQueries( imageResizedBase64, - photo.syncStatus.missingAiTextFields, + photo.updateStatus.isMissingAiTextFields, undefined, isBatch, ); @@ -526,10 +565,15 @@ export const syncPhotoAction = async (photoId: string, isBatch?: boolean) => } }); -export const syncPhotosAction = async (photoIds: string[]) => +export const syncPhotosAction = async (photosToSync: { + photoId: string, + onlySyncColorData?: boolean, +}[]) => runAuthenticatedAdminServerAction(async () => { - for (const photoId of photoIds) { - await syncPhotoAction(photoId, true); + for (const { photoId, onlySyncColorData } of photosToSync) { + await (onlySyncColorData + ? storeColorDataForPhotoAction(photoId) + : syncPhotoAction(photoId, true)); } revalidateAllKeysAndPaths(); }); diff --git a/src/photo/color/ColorDot.tsx b/src/photo/color/ColorDot.tsx new file mode 100644 index 00000000..466b3e18 --- /dev/null +++ b/src/photo/color/ColorDot.tsx @@ -0,0 +1,49 @@ +import clsx from 'clsx/lite'; +import { convertOklchToCss, Oklch } from './client'; +import Tooltip from '@/components/Tooltip'; + +const renderColor = (letter: string, value: number, shouldRound?: boolean) => ( +
+ {letter} + {shouldRound ? Math.round(value) : value.toFixed(2)} +
+); + +export default function ColorDot({ + color, + title, + className, + includeTooltip = true, +}: { + color: Oklch | string + title?: string + className?: string + includeTooltip?: boolean +}) { + const isColorHex = typeof color === 'string'; + return ( + + {title && +
+ {title} +
} + {isColorHex + ?
{color}
+ : <> + {renderColor('L', color.l)} + {renderColor('C', color.c)} + {renderColor('H', color.h, true)} + } + }> +
+ + ); +} diff --git a/src/photo/color/PhotoColors.tsx b/src/photo/color/PhotoColors.tsx new file mode 100644 index 00000000..b70919ec --- /dev/null +++ b/src/photo/color/PhotoColors.tsx @@ -0,0 +1,40 @@ +import clsx from 'clsx/lite'; +import ColorDot from './ColorDot'; +import { PhotoColorData } from './client'; + +export default function PhotoColors({ + className, + classNameDot, + colorData, +}: { + className?: string + classNameDot?: string + colorData?: PhotoColorData +}) { + return colorData + ?
+ {colorData.ai && + } + + {colorData.colors.map((color, index) => + , + )} +
+ : null; +} diff --git a/src/photo/color/SyncColorButton.tsx b/src/photo/color/SyncColorButton.tsx new file mode 100644 index 00000000..27bd2a02 --- /dev/null +++ b/src/photo/color/SyncColorButton.tsx @@ -0,0 +1,37 @@ +'use client'; + +import LoaderButton from '@/components/primitives/LoaderButton'; +import { IoColorFilterOutline } from 'react-icons/io5'; +import { + recalculateColorDataForAllPhotosAction, + storeColorDataForPhotoAction, +} from '../actions'; +import { useState } from 'react'; + +export default function SyncColorButton({ + photoId, +}: { + photoId?: string +}) { + const [isUpdatingColorData, setIsUpdatingColorData] = useState(false); + + return ( + } + onClick={() => { + setIsUpdatingColorData(true); + (photoId + ? storeColorDataForPhotoAction(photoId) + : recalculateColorDataForAllPhotosAction()) + .finally(() => setIsUpdatingColorData(false)); + }} + tooltip={photoId + ? 'Update color data' + : 'Update color data for all photos'} + confirmText={!photoId + ? 'Are you sure you want to update all photo color data?' + : undefined} + isLoading={isUpdatingColorData} + /> + ); +} diff --git a/src/photo/color/client.ts b/src/photo/color/client.ts new file mode 100644 index 00000000..a55d9559 --- /dev/null +++ b/src/photo/color/client.ts @@ -0,0 +1,43 @@ +export interface Oklch { + l: number + c: number + h: number +} + +export interface PhotoColorData { + ai?: Oklch + average: Oklch + colors: Oklch[] +} + +export const convertJsonStringToOklch = (jsonString = '') => { + const matches = jsonString + .match(/`*{ *l: *([0-9\.]+), *c: *([0-9\.]+), *h: *([0-9\.]+) *}`*/); + if (matches && + matches[1] && + matches[2] && + matches[3] + ) { + return { + l: parseFloat(matches[1]), + c: parseFloat(matches[2]), + h: parseInt(matches[3]), + } as Oklch; + } +}; + +export const convertOklchToCss = (oklch: Oklch) => + `oklch(${oklch.l} ${oklch.c} ${oklch.h})`; + +export const logOklch = (oklch: Oklch) => + `L:${oklch.l.toFixed(2)} C:${oklch.c.toFixed(2)} H:${oklch.h.toFixed(2)}`; + +export const generateColorDataFromString = (colorData?: string) => { + if (colorData) { + try { + return JSON.parse(colorData) as PhotoColorData; + } catch (error) { + console.log('Error parsing color data', error); + } + } +}; diff --git a/src/photo/color/server.ts b/src/photo/color/server.ts new file mode 100644 index 00000000..c35e2c15 --- /dev/null +++ b/src/photo/color/server.ts @@ -0,0 +1,134 @@ +import { convertRgbToOklab, parseHex } from 'culori'; +import { getNextImageUrlForManipulation } from '@/platforms/next-image'; +import { + AI_CONTENT_GENERATION_ENABLED, + IS_PREVIEW, +} from '@/app/config'; +import { FastAverageColor } from 'fast-average-color'; +import { Oklch, PhotoColorData } from './client'; +import sharp from 'sharp'; +import { extractColors } from 'extract-colors'; +import { getImageBase64FromUrl } from '../server'; +import { generateOpenAiImageQuery } from '@/platforms/openai'; +import { calculateColorSort } from './sort'; + +const NULL_RGB = { r: 0, g: 0, b: 0 }; + +export const convertHexToOklch = (hex: string): Oklch => { + const rgb = parseHex(hex) ?? NULL_RGB; + const { a, b, l } = convertRgbToOklab(rgb); + const c = Math.sqrt(a * a + b * b); + const _h = Math.atan2(b, a) * (180 / Math.PI); + const h = _h < 0 ? _h + 360 : _h; + return { + l: +(l.toFixed(3)), + c: +(c.toFixed(3)), + h: +(h.toFixed(3)), + }; +}; + +// Convert image url to byte array +const getImageDataFromUrl = async (_url: string) => { + const url = getNextImageUrlForManipulation(_url, IS_PREVIEW); + const imageBuffer = await fetch(decodeURIComponent(url)) + .then(res => res.arrayBuffer()); + const image = sharp(imageBuffer); + const { width, height } = await image.metadata(); + const buffer = await image.ensureAlpha().raw().toBuffer(); + return { + data: new Uint8ClampedArray(buffer.buffer), + width, + height, + }; +}; + +// algorithm library: fast-average-color +const getAverageColorFromImageUrl = async (url: string) => { + const { data } = await getImageDataFromUrl(url); + const fac = new FastAverageColor(); + const color = fac.prepareResult(fac.getColorFromArray4(data)); + return convertHexToOklch(color.hex); +}; + +// algorithm library: extract-colors +const getExtractedColorsFromImageUrl = async (url: string) => { + const data = await getImageDataFromUrl(url); + return extractColors(data).then(colors => + colors.map(({ hex }) => convertHexToOklch(hex))); +}; + +const getColorDataFromImageUrl = async ( + url: string, + isBatch?: boolean, +): Promise => { + const ai = AI_CONTENT_GENERATION_ENABLED + ? await getColorFromAI(url, isBatch) + : undefined; + const average = await getAverageColorFromImageUrl(url); + const colors = await getExtractedColorsFromImageUrl(url); + return { + ...ai && { ai }, + average, + colors, + }; +}; + +export const getColorFieldsForImageUrl = async ( + url: string, + _colorData?: PhotoColorData, + isBatch?: boolean, +) => { + try { + const colorData = _colorData ?? + await getColorDataFromImageUrl(url, isBatch); + return { + colorData, + colorSort: calculateColorSort(colorData), + }; + } catch { + console.log('Error fetching image url data', url); + } +}; + +// Used when inserting colors into database +export const getColorFieldsForPhotoDbInsert = async ( + ...args: Parameters +) => { + const { colorData, ...rest } = await getColorFieldsForImageUrl(...args) ?? {}; + if (colorData) { + return { + colorData: JSON.stringify(colorData), + ...rest, + }; + } +}; + +// Used when preparing colors for form +export const getColorFieldsForPhotoForm = async ( + ...args: Parameters +) => { + const { colorSort, ...rest } = + await getColorFieldsForPhotoDbInsert(...args) ?? {}; + return { + colorSort: `${colorSort}`, + ...rest, + }; +}; + +export const getColorFromAI = async ( + _url: string, + useBatch?: boolean, +) => { + const url = getNextImageUrlForManipulation(_url, IS_PREVIEW); + const image = await getImageBase64FromUrl(url); + const hexColor = await generateOpenAiImageQuery(image, ` + Does this image have a primary subject color? + If yes, what is the approximate hex color of the subject. + If not, what is the approximate hex color of the background? + Respond only with a hex color value: + `, useBatch); + const hex = hexColor?.match(/#*([a-f0-9]{6})/i)?.[1]; + if (hex) { + return convertHexToOklch(`#${hex}`); + } +}; diff --git a/src/photo/color/sort.ts b/src/photo/color/sort.ts new file mode 100644 index 00000000..02a6dca4 --- /dev/null +++ b/src/photo/color/sort.ts @@ -0,0 +1,51 @@ +import { + COLOR_SORT_STARTING_HUE, + COLOR_SORT_CHROMA_CUTOFF, +} from '@/app/config'; +import { PhotoColorData } from './client'; + +// Start with yellow +const DEFAULT_HUE_MAXIMA = 80; +// Only sort sufficiently vibrant colors +const DEFAULT_CHROMA_CUTOFF = 0.05; + +const SECTION_OFFSET_HUE = 200; +const SECTION_OFFSET_LOW_CHROMA = 100; +const SECTION_OFFSET_BLACK_AND_WHITE = 0; + +export const parseStartingHue = (hueMaxima = '') => { + const hueMaximaInt = parseInt(hueMaxima); + return isNaN(hueMaximaInt) ? DEFAULT_HUE_MAXIMA : hueMaximaInt; +}; + +export const parseChromaCutoff = (chromaCutoff = '') => { + const chromaCutoffFloat = parseFloat(chromaCutoff); + return isNaN(chromaCutoffFloat) ? DEFAULT_CHROMA_CUTOFF : chromaCutoffFloat; +}; + +export const calculateColorSort = (colorData: PhotoColorData) => { + // Prefer AI-generated colors when available + const colorPreferred = colorData.ai ?? colorData.average; + + // Re-center hues based on start point + const hueNormalized = colorPreferred.h >= COLOR_SORT_STARTING_HUE + ? 360 - Math.abs(colorPreferred.h - COLOR_SORT_STARTING_HUE) + : Math.abs(colorPreferred.h - COLOR_SORT_STARTING_HUE); + + // Analyze average chroma to determine if colors are sufficiently vibrant + const allColors = colorData.ai ? [colorData.ai] : []; + allColors.push(...colorData.colors, colorData.average); + const chromaAverage = allColors.reduce( + (acc, color) => acc + color.c, 0) / allColors.length; + + const colorSort = colorPreferred.c >= COLOR_SORT_CHROMA_CUTOFF + // Organize by hue + ? hueNormalized + SECTION_OFFSET_HUE + : chromaAverage > 0 + // Organize by lightness (with some chroma) + ? colorData.average.l * 100 + SECTION_OFFSET_LOW_CHROMA + // Organize by lightness (strictly black and white) + : colorData.average.l * 100 + SECTION_OFFSET_BLACK_AND_WHITE; + + return Math.round(colorSort); +}; diff --git a/src/photo/db/index.ts b/src/photo/db/index.ts index e3149217..d33ac80c 100644 --- a/src/photo/db/index.ts +++ b/src/photo/db/index.ts @@ -178,6 +178,14 @@ export const getOrderByFromOptions = (options: PhotoQueryOptions) => { return sortWithPriority ? 'ORDER BY priority_order ASC, created_at ASC' : 'ORDER BY created_at ASC'; + case 'hue': + return sortWithPriority + ? 'ORDER BY priority_order ASC, color_sort DESC' + : 'ORDER BY color_sort DESC'; + case 'hueAsc': + return sortWithPriority + ? 'ORDER BY priority_order ASC, color_sort ASC' + : 'ORDER BY color_sort ASC'; } }; diff --git a/src/photo/db/migration.ts b/src/photo/db/migration.ts index d44b2956..7a2eeb18 100644 --- a/src/photo/db/migration.ts +++ b/src/photo/db/migration.ts @@ -78,6 +78,14 @@ export const MIGRATIONS: Migration[] = [{ ALTER TABLE photos ADD COLUMN IF NOT EXISTS exclude_from_feeds BOOLEAN DEFAULT FALSE `, +}, { + label: '07: Color Data', + fields: ['color_data', 'color_sort'], + run: () => sql` + ALTER TABLE photos + ADD COLUMN IF NOT EXISTS color_data JSONB, + ADD COLUMN IF NOT EXISTS color_sort SMALLINT + `, }]; export const migrationForError = (e: any) => @@ -87,4 +95,4 @@ export const migrationForError = (e: any) => new RegExp(`column "${field}" of relation "photos" does not exist`, 'i').test(e.message) || new RegExp(`column "${field}" does not exist`, 'i').test(e.message) )), - ); \ No newline at end of file + ); diff --git a/src/photo/db/query.ts b/src/photo/db/query.ts index ec8beffa..a519eb54 100644 --- a/src/photo/db/query.ts +++ b/src/photo/db/query.ts @@ -18,7 +18,8 @@ import { Films } from '@/film'; import { ADMIN_SQL_DEBUG_ENABLED, AI_TEXT_AUTO_GENERATED_FIELDS, - AI_TEXT_GENERATION_ENABLED, + AI_CONTENT_GENERATION_ENABLED, + COLOR_SORT_ENABLED, } from '@/app/config'; import { PhotoQueryOptions, @@ -30,13 +31,14 @@ import { FocalLengths } from '@/focal'; import { Lenses, createLensKey } from '@/lens'; import { migrationForError } from './migration'; import { - SYNC_QUERY_LIMIT, + UPDATE_QUERY_LIMIT, UPDATED_BEFORE_01, UPDATED_BEFORE_02, -} from '../sync'; +} from '../update'; import { MAKE_FUJIFILM } from '@/platforms/fujifilm'; import { Recipes } from '@/recipe'; import { Years } from '@/years'; +import { PhotoColorData } from '../color/client'; const createPhotosTable = () => sql` @@ -66,6 +68,8 @@ const createPhotosTable = () => film VARCHAR(255), recipe_title VARCHAR(255), recipe_data JSONB, + color_data JSONB, + color_sort SMALLINT, priority_order REAL, taken_at TIMESTAMP WITH TIME ZONE NOT NULL, taken_at_naive VARCHAR(255) NOT NULL, @@ -193,6 +197,8 @@ export const insertPhoto = (photo: PhotoDbInsert) => film, recipe_title, recipe_data, + color_data, + color_sort, priority_order, exclude_from_feeds, hidden, @@ -225,6 +231,8 @@ export const insertPhoto = (photo: PhotoDbInsert) => ${photo.film}, ${photo.recipeTitle}, ${photo.recipeData}, + ${photo.colorData}, + ${photo.colorSort}, ${photo.priorityOrder}, ${photo.excludeFromFeeds}, ${photo.hidden}, @@ -260,6 +268,8 @@ export const updatePhoto = (photo: PhotoDbInsert) => film=${photo.film}, recipe_title=${photo.recipeTitle}, recipe_data=${photo.recipeData}, + color_data=${photo.colorData}, + color_sort=${photo.colorSort}, priority_order=${photo.priorityOrder || null}, exclude_from_feeds=${photo.excludeFromFeeds}, hidden=${photo.hidden}, @@ -616,7 +626,7 @@ export const getPhoto = async ( .then(photos => photos.length > 0 ? photos[0] : undefined); }, 'getPhoto'); -// Sync queries +// Update queries const outdatedWhereClauses = [ `updated_at < $1`, @@ -630,7 +640,7 @@ const outdatedWhereValues = [ ]; const needsAiTextWhereClauses = - AI_TEXT_GENERATION_ENABLED + AI_CONTENT_GENERATION_ENABLED ? AI_TEXT_AUTO_GENERATED_FIELDS .map(field => { switch (field) { @@ -642,29 +652,71 @@ const needsAiTextWhereClauses = }) : []; +const needsColorDataWhereClauses = COLOR_SORT_ENABLED + ? [`( + color_data IS NULL OR + color_sort IS NULL + )`] + : []; + const needsSyncWhereStatement = - `WHERE ${outdatedWhereClauses.concat(needsAiTextWhereClauses).join(' OR ')}`; + `WHERE ${[ + ...outdatedWhereClauses, + ...needsAiTextWhereClauses, + ...needsColorDataWhereClauses, + ].join(' OR ')}`; -export const getPhotosInNeedOfSync = () => safelyQueryPhotos( - () => query(` - SELECT * FROM photos - ${needsSyncWhereStatement} - ORDER BY created_at DESC - LIMIT ${SYNC_QUERY_LIMIT} - `, - outdatedWhereValues, - ) - .then(({ rows }) => rows.map(parsePhotoFromDb)), - 'getPhotosInNeedOfSync', -); +export const getPhotosInNeedOfUpdate = () => + safelyQueryPhotos( + () => query(` + SELECT * FROM photos + ${needsSyncWhereStatement} + ORDER BY created_at DESC + LIMIT ${UPDATE_QUERY_LIMIT} + `, + outdatedWhereValues, + ) + .then(({ rows }) => rows.map(parsePhotoFromDb)), + 'getPhotosInNeedOfUpdate', + ); -export const getPhotosInNeedOfSyncCount = () => safelyQueryPhotos( - () => query(` - SELECT COUNT(*) FROM photos - ${needsSyncWhereStatement} - `, - outdatedWhereValues, - ) - .then(({ rows }) => parseInt(rows[0].count, 10)), - 'getPhotosInNeedOfSyncCount', -); +export const getPhotosInNeedOfUpdateCount = () => + safelyQueryPhotos( + () => query(` + SELECT COUNT(*) FROM photos + ${needsSyncWhereStatement} + `, + outdatedWhereValues, + ) + .then(({ rows }) => parseInt(rows[0].count, 10)), + 'getPhotosInNeedOfUpdateCount', + ); + +// Backfills and experimentation + +export const getColorDataForPhotos = () => + safelyQueryPhotos(() => sql<{ + id: string, + url: string, + color_data?: PhotoColorData, + }>` + SELECT id, url, color_data FROM photos + LIMIT ${UPDATE_QUERY_LIMIT} + `.then(({ rows }) => rows.map(({ id, url, color_data }) => + ({ id, url, colorData: color_data }))) + , 'getColorDataForPhotos'); + +export const updateColorDataForPhoto = ( + photoId: string, + colorData: string, + colorSort: number, +) => + safelyQueryPhotos( + () => sql` + UPDATE photos SET + color_data=${colorData}, + color_sort=${colorSort} + WHERE id=${photoId} + `, + 'updateColorDataForPhoto', + ); diff --git a/src/photo/form/PhotoForm.tsx b/src/photo/form/PhotoForm.tsx index f7e1879e..49e8ac33 100644 --- a/src/photo/form/PhotoForm.tsx +++ b/src/photo/form/PhotoForm.tsx @@ -49,6 +49,8 @@ import { useAppText } from '@/i18n/state/client'; import IconAddUpload from '@/components/icons/IconAddUpload'; import { didVisibilityChange } from '../visibility'; import FieldsetVisibility from '../visibility/FieldsetVisibility'; +import PhotoColors from '../color/PhotoColors'; +import { generateColorDataFromString } from '../color/client'; const THUMBNAIL_SIZE = 300; @@ -117,8 +119,12 @@ export default function PhotoForm({ let a = currentForm[key]; let b = value; if (FIELDS_WITH_JSON.includes(key)) { - a = a ? JSON.parse(a) : undefined; - b = b ? JSON.parse(b) : undefined; + try { + a = a ? JSON.parse(a) : undefined; + b = b ? JSON.parse(b) : undefined; + } catch (error) { + console.log(`Error parsing JSON: ${key}`, error); + } } if (!deepEqual(a, b)) { changedKeys.push(key as keyof PhotoFormData); @@ -445,6 +451,17 @@ export default function PhotoForm({ film={formData.film} onMatchResults={onMatchResults} />; + case 'colorData': + return } + />; case 'visibility': return !COLOR_SORT_ENABLED, + }, + colorSort: { + label: 'color sort', + shouldHide: () => !COLOR_SORT_ENABLED, + }, priorityOrder: { label: 'priority order' }, excludeFromFeeds: { label: 'exclude from feeds', type: 'hidden' }, hidden: { label: 'hidden', type: 'hidden' }, @@ -257,6 +268,8 @@ export const convertPhotoToFormData = (photo: Photo): PhotoFormData => { return value ? 'true' : 'false'; case 'recipeData': return JSON.stringify(value); + case 'colorData': + return JSON.stringify(value); default: return value !== undefined && value !== null ? value.toString() @@ -343,6 +356,9 @@ export const convertFormDataToPhotoDbInsert = ( exposureCompensation: photoForm.exposureCompensation ? parseFloat(photoForm.exposureCompensation) : undefined, + colorSort: photoForm.colorSort + ? parseInt(photoForm.colorSort) + : undefined, priorityOrder: photoForm.priorityOrder ? parseFloat(photoForm.priorityOrder) : undefined, diff --git a/src/photo/index.ts b/src/photo/index.ts index 3d439019..80d8479d 100644 --- a/src/photo/index.ts +++ b/src/photo/index.ts @@ -22,8 +22,9 @@ import { isBefore } from 'date-fns'; import type { Metadata } from 'next'; import { FujifilmRecipe } from '@/platforms/fujifilm/recipe'; import { FujifilmSimulation } from '@/platforms/fujifilm/simulation'; -import { PhotoSyncStatus, generatePhotoSyncStatus } from './sync'; +import { PhotoUpdateStatus, generatePhotoUpdateStatus } from './update'; import { AppTextState } from '@/i18n/state'; +import { PhotoColorData } from './color/client'; // INFINITE SCROLL: FULL export const INFINITE_SCROLL_FULL_INITIAL = @@ -83,6 +84,8 @@ export interface PhotoDbInsert extends PhotoExif { tags?: string[] recipeTitle?: string locationName?: string + colorData?: string + colorSort?: number priorityOrder?: number excludeFromFeeds?: boolean hidden?: boolean @@ -100,7 +103,7 @@ export interface PhotoDb extends } // Parsed db response -export interface Photo extends Omit { +export interface Photo extends Omit { focalLengthFormatted?: string focalLengthIn35MmFormatFormatted?: string fNumberFormatted?: string @@ -110,7 +113,8 @@ export interface Photo extends Omit { takenAtNaiveFormatted: string tags: string[] recipeData?: FujifilmRecipe - syncStatus: PhotoSyncStatus + colorData?: PhotoColorData + updateStatus: PhotoUpdateStatus } export const parsePhotoFromDb = (photoDbRaw: PhotoDb): Photo => { @@ -144,7 +148,10 @@ export const parsePhotoFromDb = (photoDbRaw: PhotoDb): Photo => { ? JSON.parse(photoDb.recipeData) : photoDb.recipeData : undefined, - syncStatus: generatePhotoSyncStatus(photoDb), + colorData: photoDb.colorData + ? photoDb.colorData + : undefined, + updateStatus: generatePhotoUpdateStatus(photoDb), } as Photo; }; @@ -164,15 +171,9 @@ export const convertPhotoToPhotoDbInsert = ( ...photo, takenAt: photo.takenAt.toISOString(), recipeData: JSON.stringify(photo.recipeData), + colorData: JSON.stringify(photo.colorData), }); -export const photoStatsAsString = (photo: Photo) => [ - photo.model, - photo.focalLengthFormatted, - photo.fNumberFormatted, - photo.isoFormatted, -].join(' '); - export const descriptionForPhoto = ( photo: Photo, includeSemanticDescription?: boolean, diff --git a/src/photo/server.ts b/src/photo/server.ts index 086fa867..eaac7425 100644 --- a/src/photo/server.ts +++ b/src/photo/server.ts @@ -25,17 +25,18 @@ import { } from './db/query'; import { PhotoDbInsert } from '.'; import { convertExifToFormData } from './form/server'; +import { getColorFieldsForPhotoForm } from './color/server'; const IMAGE_WIDTH_RESIZE = 200; const IMAGE_WIDTH_BLUR = 200; export const extractImageDataFromBlobPath = async ( blobPath: string, - options?: { + options: { includeInitialPhotoFields?: boolean generateBlurData?: boolean generateResizedImage?: boolean - }, + } = {}, ): Promise<{ blobId?: string formDataFromExif?: Partial @@ -48,7 +49,7 @@ export const extractImageDataFromBlobPath = async ( includeInitialPhotoFields, generateBlurData, generateResizedImage, - } = options ?? {}; + } = options; const url = decodeURIComponent(blobPath); @@ -112,6 +113,8 @@ export const extractImageDataFromBlobPath = async ( if (error) { console.log(error); } + const colorFields = await getColorFieldsForPhotoForm(url); + return { blobId, ...exifData && { @@ -123,7 +126,8 @@ export const extractImageDataFromBlobPath = async ( url, }, ...generateBlurData && { blurData }, - ...convertExifToFormData (exifData, film, recipe), + ...convertExifToFormData(exifData, film, recipe), + ...colorFields, }, }, imageResizedBase64, @@ -135,17 +139,20 @@ export const extractImageDataFromBlobPath = async ( const generateBase64 = async ( image: ArrayBuffer, - middleware: (sharp: Sharp) => Sharp, + middleware?: (sharp: Sharp) => Sharp, ) => - middleware(sharp(image)) + (middleware ? middleware(sharp(image)) : sharp(image)) .withMetadata() .toFormat('jpeg', { quality: 90 }) .toBuffer() .then(data => `data:image/jpeg;base64,${data.toString('base64')}`); -const resizeImage = async (image: ArrayBuffer) => +const resizeImage = async ( + image: ArrayBuffer, + width = IMAGE_WIDTH_RESIZE, +) => generateBase64(image, sharp => sharp - .resize(IMAGE_WIDTH_RESIZE), + .resize(width), ); const blurImage = async (image: ArrayBuffer) => @@ -155,10 +162,22 @@ const blurImage = async (image: ArrayBuffer) => .blur(4), ); -export const resizeImageFromUrl = async (url: string) => +export const getImageBase64FromUrl = async (url: string) => fetch(decodeURIComponent(url)) .then(res => res.arrayBuffer()) - .then(buffer => resizeImage(buffer)) + .then(buffer => generateBase64(buffer)) + .catch(e => { + console.log(`Error getting image base64 from URL (${url})`, e); + return ''; + }); + +export const resizeImageFromUrl = async ( + url: string, + width?: number, +) => + fetch(decodeURIComponent(url)) + .then(res => res.arrayBuffer()) + .then(buffer => resizeImage(buffer, width)) .catch(e => { console.log(`Error resizing image from URL (${url})`, e); return ''; @@ -210,6 +229,7 @@ export const convertFormDataToPhotoDbInsertAndLookupRecipeTitle = photo.recipeData, photo.film, ); + // Only replace recipe title when a new one is found if (recipeTitle) { photo.recipeTitle = recipeTitle; } diff --git a/src/photo/sort/SortMenu.tsx b/src/photo/sort/SortMenu.tsx index a9706b95..a96ee385 100644 --- a/src/photo/sort/SortMenu.tsx +++ b/src/photo/sort/SortMenu.tsx @@ -4,6 +4,7 @@ import { getSortStateFromPath } from './path'; import IconCheck from '@/components/icons/IconCheck'; import { clsx } from 'clsx/lite'; import { useAppText } from '@/i18n/state/client'; +import { COLOR_SORT_ENABLED } from '@/app/config'; export default function SortMenu({ isOpen, @@ -11,10 +12,12 @@ export default function SortMenu({ isAscending, isTakenAt, isUploadedAt, - pathNewest, - pathOldest, + isColor, + pathDescending, + pathAscending, pathTakenAt, pathUploadedAt, + pathColor, }: { isOpen?: boolean setIsOpen?: (isOpen: boolean) => void @@ -32,6 +35,40 @@ export default function SortMenu({ , }); + const itemsSortOrder = [{ + ...renderLabel( + isColor ? appText.sort.descending : appText.sort.newest, + !isAscending, + ), + icon: renderIcon(!isAscending), + href: pathDescending, + }, { + ...renderLabel( + isColor ? appText.sort.ascending : appText.sort.oldest, + isAscending, + ), + icon: renderIcon(isAscending), + href: pathAscending, + }]; + + const itemsSortType = [{ + ...renderLabel(appText.sort.takenAt, isTakenAt), + icon: renderIcon(isTakenAt), + href: pathTakenAt, + }, { + ...renderLabel(appText.sort.uploadedAtShort, isUploadedAt), + icon: renderIcon(isUploadedAt), + href: pathUploadedAt, + }]; + + if (COLOR_SORT_ENABLED) { + itemsSortType.push({ + ...renderLabel(appText.sort.color, isColor), + icon: renderIcon(isColor), + href: pathColor, + }); + } + return ( } sections={[{ - items: [{ - ...renderLabel(appText.sort.newest, !isAscending), - icon: renderIcon(!isAscending), - href: pathNewest, - }, { - ...renderLabel(appText.sort.oldest, isAscending), - icon: renderIcon(isAscending), - href: pathOldest, - }], + items: itemsSortOrder, }, { - items: [{ - ...renderLabel(appText.sort.takenAt, isTakenAt), - icon: renderIcon(isTakenAt), - href: pathTakenAt, - }, { - ...renderLabel(appText.sort.uploadedAtShort, isUploadedAt), - icon: renderIcon(isUploadedAt), - href: pathUploadedAt, - }], + items: itemsSortType, }]} align="start" side="top" diff --git a/src/photo/sort/index.ts b/src/photo/sort/index.ts index 4babbf9a..c37b2ed4 100644 --- a/src/photo/sort/index.ts +++ b/src/photo/sort/index.ts @@ -16,19 +16,27 @@ export const getNavSortControlFromString = ( export const SORT_BY_OPTIONS = [{ sortBy: 'takenAt', string: 'taken-at', - label: 'Taken At (Newest First)', + canBeDefault: true, }, { sortBy: 'takenAtAsc', string: 'taken-at-oldest-first', - label: 'Taken At (Oldest First)', + canBeDefault: true, }, { sortBy: 'createdAt', string: 'uploaded-at', - label: 'Uploaded At (Newest First)', + canBeDefault: true, }, { sortBy: 'createdAtAsc', string: 'uploaded-at-oldest-first', - label: 'Uploaded At (Oldest First)', + canBeDefault: true, +}, { + sortBy: 'hue', + string: 'hue', + canBeDefault: false, +}, { + sortBy: 'hueAsc', + string: 'hue-oldest-first', + canBeDefault: false, }] as const; export type SortBy = (typeof SORT_BY_OPTIONS)[number]['sortBy']; @@ -50,9 +58,13 @@ export const getSortByFromString = (sortBy = ''): SortBy => { case 'taken-at-oldest-first': return 'takenAtAsc'; case 'uploaded-at': return 'createdAt'; case 'uploaded-at-oldest-first': return 'createdAtAsc'; - default:return 'takenAt'; + case 'hue': return 'hue'; + case 'hue-oldest-first': return 'hueAsc'; + default: return 'takenAt'; } }; export const isSortAscending = (sortBy: SortBy) => - sortBy === 'takenAtAsc' || sortBy === 'createdAtAsc'; + sortBy === 'takenAtAsc' || + sortBy === 'createdAtAsc' || + sortBy === 'hueAsc'; diff --git a/src/photo/sort/path.ts b/src/photo/sort/path.ts index e286ffd4..36f269a9 100644 --- a/src/photo/sort/path.ts +++ b/src/photo/sort/path.ts @@ -3,8 +3,9 @@ import { doesPathOfferSort as _doesPathOfferSort, - PARAM_SORT_ORDER_NEWEST, - PARAM_SORT_ORDER_OLDEST, + PARAM_SORT_ORDER_ASCENDING, + PARAM_SORT_ORDER_DESCENDING, + PARAM_SORT_TYPE_COLOR, PARAM_SORT_TYPE_TAKEN_AT, PARAM_SORT_TYPE_UPLOADED_AT, PATH_FULL_INFERRED, @@ -24,19 +25,27 @@ const getSortByComponents = (sortBy: SortBy): { switch (sortBy) { case 'takenAt': return { sortType: PARAM_SORT_TYPE_TAKEN_AT, - sortOrder: PARAM_SORT_ORDER_NEWEST, + sortOrder: PARAM_SORT_ORDER_DESCENDING, }; case 'takenAtAsc': return { sortType: PARAM_SORT_TYPE_TAKEN_AT, - sortOrder: PARAM_SORT_ORDER_OLDEST, + sortOrder: PARAM_SORT_ORDER_ASCENDING, }; case 'createdAt': return { sortType: PARAM_SORT_TYPE_UPLOADED_AT, - sortOrder: PARAM_SORT_ORDER_NEWEST, + sortOrder: PARAM_SORT_ORDER_DESCENDING, }; case 'createdAtAsc': return { sortType: PARAM_SORT_TYPE_UPLOADED_AT, - sortOrder: PARAM_SORT_ORDER_OLDEST, + sortOrder: PARAM_SORT_ORDER_ASCENDING, + }; + case 'hue': return { + sortType: PARAM_SORT_TYPE_COLOR, + sortOrder: PARAM_SORT_ORDER_DESCENDING, + }; + case 'hueAsc': return { + sortType: PARAM_SORT_TYPE_COLOR, + sortOrder: PARAM_SORT_ORDER_ASCENDING, }; } }; @@ -54,7 +63,7 @@ const _getSortOptionsFromParams = ( sortWithPriority: boolean } => { let sortBy: SortBy = 'takenAt'; - const isAscending = sortOrder === PARAM_SORT_ORDER_OLDEST; + const isAscending = sortOrder === PARAM_SORT_ORDER_ASCENDING; switch (sortType) { case PARAM_SORT_TYPE_TAKEN_AT: { sortBy = isAscending @@ -68,6 +77,12 @@ const _getSortOptionsFromParams = ( : 'createdAt'; break; } + case PARAM_SORT_TYPE_COLOR: { + sortBy = isAscending + ? 'hueAsc' + : 'hue'; + break; + } } return { sortBy, @@ -107,12 +122,13 @@ export const getSortStateFromPath = (pathname: string) => { } = getPathSortComponents(pathname); const isSortedByDefault = sortBy === USER_DEFAULT_SORT_BY; - const sortOrderReversed = sortOrder === PARAM_SORT_ORDER_OLDEST - ? PARAM_SORT_ORDER_NEWEST - : PARAM_SORT_ORDER_OLDEST; - const isAscending = sortOrder === PARAM_SORT_ORDER_OLDEST; + const sortOrderReversed = sortOrder === PARAM_SORT_ORDER_DESCENDING + ? PARAM_SORT_ORDER_ASCENDING + : PARAM_SORT_ORDER_DESCENDING; + const isAscending = sortOrder === PARAM_SORT_ORDER_ASCENDING; const isTakenAt = sortType === PARAM_SORT_TYPE_TAKEN_AT; const isUploadedAt = sortType === PARAM_SORT_TYPE_UPLOADED_AT; + const isColor = sortType === PARAM_SORT_TYPE_COLOR; const getPath = ({ gridOrFull = _gridOrFull, @@ -147,14 +163,16 @@ export const getSortStateFromPath = (pathname: string) => { getPath({ sortType, sortOrder: sortOrderReversed }); // Sort menu paths - const pathNewest = - getPath({ sortType, sortOrder: PARAM_SORT_ORDER_NEWEST }); - const pathOldest = - getPath({ sortType, sortOrder: PARAM_SORT_ORDER_OLDEST }); + const pathDescending = + getPath({ sortType, sortOrder: PARAM_SORT_ORDER_DESCENDING }); + const pathAscending = + getPath({ sortType, sortOrder: PARAM_SORT_ORDER_ASCENDING }); const pathTakenAt = getPath({ sortType: PARAM_SORT_TYPE_TAKEN_AT, sortOrder }); const pathUploadedAt = getPath({ sortType: PARAM_SORT_TYPE_UPLOADED_AT, sortOrder }); + const pathColor = + getPath({ sortType: PARAM_SORT_TYPE_COLOR, sortOrder }); // Sort clear const pathClearSort = _gridOrFull === 'grid' @@ -168,12 +186,14 @@ export const getSortStateFromPath = (pathname: string) => { isAscending, isTakenAt, isUploadedAt, + isColor, pathGrid, pathFull, - pathNewest, - pathOldest, + pathDescending, + pathAscending, pathTakenAt, pathUploadedAt, + pathColor, pathClearSort, pathSortToggle, }; diff --git a/src/photo/sync.ts b/src/photo/sync.ts deleted file mode 100644 index b5d6af04..00000000 --- a/src/photo/sync.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { MAKE_FUJIFILM } from '@/platforms/fujifilm'; -import { Photo, PhotoDb } from '.'; -import { - AI_TEXT_AUTO_GENERATED_FIELDS, - AI_TEXT_GENERATION_ENABLED, -} from '@/app/config'; -import { AiAutoGeneratedField } from './ai'; - -export interface PhotoSyncStatus { - isOutdated: boolean; - missingAiTextFields: AiAutoGeneratedField[]; -} - -export const SYNC_QUERY_LIMIT = 1000; - -export const UPDATED_BEFORE_01 = new Date('2024-06-16'); -// UTC 2025-02-24 05:30:00 -export const UPDATED_BEFORE_02 = new Date(Date.UTC(2025, 1, 24, 5, 30, 0)); - -const isPhotoOutdated = (photo: PhotoDb) => - photo.updatedAt < UPDATED_BEFORE_01 || ( - photo.updatedAt < UPDATED_BEFORE_02 && - photo.make === MAKE_FUJIFILM - ); - -const getMissingAiTextFields = ({ - title, - caption, - tags, - semanticDescription, -}: PhotoDb | Photo): AiAutoGeneratedField[] => - AI_TEXT_GENERATION_ENABLED - ? AI_TEXT_AUTO_GENERATED_FIELDS.reduce((fields, field) => { - switch (field) { - case 'title': - return !title ? [...fields, 'title'] : fields; - case 'caption': - return !caption ? [...fields, 'caption'] : fields; - case 'tags': - return (tags ?? []).length === 0 ? [...fields, 'tags'] : fields; - case 'semantic': - return !semanticDescription ? [...fields, 'semantic'] : fields; - } - }, [] as AiAutoGeneratedField[]) - : []; - -export const generatePhotoSyncStatus = (photo: PhotoDb): PhotoSyncStatus => ({ - isOutdated: isPhotoOutdated(photo), - missingAiTextFields: getMissingAiTextFields(photo), -}); - -export const photoNeedsToBeSynced = (photo: Photo) => - photo.syncStatus.isOutdated || - photo.syncStatus.missingAiTextFields.length > 0; - -export const getPhotoSyncStatusText = (photo: Photo) => { - const { isOutdated, missingAiTextFields } = photo.syncStatus; - const text: string[] = []; - if (isOutdated) { - text.push('Outdated Data'); - } else if (missingAiTextFields.length > 0) { - const missingFieldsText = missingAiTextFields - .map(field => field.toLocaleUpperCase()) - .join(', '); - text.push(`Missing AI Text (${missingFieldsText})`); - } - return text.join(' and ') + '—sync to update'; -}; - -export const getPhotosSyncStatusText = (photos: Photo[]) => { - const statusText = [] as string[]; - - const photosCountOutdated = photos.filter( - photo => photo.syncStatus.isOutdated, - ).length; - const photosCountMissingAiText = photos.filter( - photo => photo.syncStatus.missingAiTextFields.length > 0, - ).length; - - if (photosCountOutdated > 0) { - statusText.push(`${photosCountOutdated} outdated`); - } - if (photosCountMissingAiText > 0) { - statusText.push(`${photosCountMissingAiText} missing AI text`); - } - return statusText.join(', '); -}; diff --git a/src/photo/update/UpdateTooltip.tsx b/src/photo/update/UpdateTooltip.tsx new file mode 100644 index 00000000..4a09a4ee --- /dev/null +++ b/src/photo/update/UpdateTooltip.tsx @@ -0,0 +1,21 @@ +import clsx from 'clsx/lite'; +import { getPhotoUpdateStatusText } from '.'; +import Tooltip from '@/components/Tooltip'; +import { Photo } from '..'; + +export default function UpdateTooltip({ + photo, +}: { + photo: Photo +}) { + return ( + + ); +} diff --git a/src/photo/update/index.ts b/src/photo/update/index.ts new file mode 100644 index 00000000..a123875b --- /dev/null +++ b/src/photo/update/index.ts @@ -0,0 +1,142 @@ +import { MAKE_FUJIFILM } from '@/platforms/fujifilm'; +import { Photo, PhotoDb } from '..'; +import { + AI_TEXT_AUTO_GENERATED_FIELDS, + AI_CONTENT_GENERATION_ENABLED, + COLOR_SORT_ENABLED, +} from '@/app/config'; +import { AiAutoGeneratedField } from '../ai'; +import { capitalize } from '@/utility/string'; + +export interface PhotoUpdateStatus { + isOutdated: boolean + isMissingAiTextFields: AiAutoGeneratedField[] + isMissingColorData: boolean +} + +export const UPDATE_QUERY_LIMIT = 1000; + +export const UPDATED_BEFORE_01 = new Date('2024-06-16'); +// UTC 2025-02-24 05:30:00 +export const UPDATED_BEFORE_02 = new Date(Date.UTC(2025, 1, 24, 5, 30, 0)); + +const isPhotoOutdated = (photo: PhotoDb) => + photo.updatedAt < UPDATED_BEFORE_01 || ( + photo.updatedAt < UPDATED_BEFORE_02 && + photo.make === MAKE_FUJIFILM + ); + +const getMissingAiTextFields = ({ + title, + caption, + tags, + semanticDescription, +}: PhotoDb | Photo): AiAutoGeneratedField[] => + AI_CONTENT_GENERATION_ENABLED + ? AI_TEXT_AUTO_GENERATED_FIELDS.reduce((fields, field) => { + switch (field) { + case 'title': + return !title ? [...fields, 'title'] : fields; + case 'caption': + return !caption ? [...fields, 'caption'] : fields; + case 'tags': + return (tags ?? []).length === 0 ? [...fields, 'tags'] : fields; + case 'semantic': + return !semanticDescription ? [...fields, 'semantic'] : fields; + } + }, [] as AiAutoGeneratedField[]) + : []; + +export const isPhotoMissingColorData = (photo: PhotoDb) => + // "== null" intentional check for undefined or null + COLOR_SORT_ENABLED && ( + photo.colorData == null || + photo.colorSort == null + ); + +export const generatePhotoUpdateStatus = ( + photo: PhotoDb, +): PhotoUpdateStatus => ({ + isOutdated: isPhotoOutdated(photo), + isMissingAiTextFields: getMissingAiTextFields(photo), + isMissingColorData: isPhotoMissingColorData(photo), +}); + +export const photoNeedsToBeUpdated = (photo: Photo) => + photo.updateStatus.isOutdated || + photo.updateStatus.isMissingAiTextFields.length > 0 || + photo.updateStatus.isMissingColorData; + +export const isPhotoOnlyMissingColorData = (photo?: Photo) => + photo?.updateStatus.isMissingColorData && + !photo?.updateStatus.isOutdated && + (photo?.updateStatus.isMissingAiTextFields.length ?? 0) === 0; + +export const getPhotoUpdateStatusText = (photo: Photo) => { + const { + isOutdated, + isMissingAiTextFields, + isMissingColorData, + } = photo.updateStatus; + + const cta = 'sync to update'; + if (isOutdated) { + return `Outdated data—${cta}`; + } else { + const textParts: string[] = []; + if (isMissingAiTextFields.length > 0) { + const missingFields = isMissingAiTextFields + .map(field => field.toLocaleUpperCase()) + .join(', '); + textParts.push(`AI text (${missingFields})`); + } + if (isMissingColorData) { + textParts.push('color data'); + } + if (textParts.length > 0) { + return `Missing ${textParts.join(', ')}—${cta}`; + } else { + return capitalize(cta); + } + } +}; + +export const getPhotosUpdateStatusCounts = (photos: Photo[]) => { + const photosCountOutdated = photos.filter( + photo => photo.updateStatus.isOutdated, + ).length; + const photosCountMissingAiText = photos.filter( + photo => photo.updateStatus.isMissingAiTextFields.length > 0, + ).length; + const photosCountMissingColorData = photos.filter( + photo => photo.updateStatus.isMissingColorData, + ).length; + + return { + photosCountOutdated, + photosCountMissingAiText, + photosCountMissingColorData, + }; +}; + +export const getPhotosUpdateStatusText = (photos: Photo[]) => { + const statusText = [] as string[]; + + const { + photosCountOutdated, + photosCountMissingAiText, + photosCountMissingColorData, + } = getPhotosUpdateStatusCounts(photos); + + if (photosCountOutdated > 0) { + statusText.push(`${photosCountOutdated} outdated`); + } + if (photosCountMissingAiText > 0) { + statusText.push(`${photosCountMissingAiText} missing AI text`); + } + if (photosCountMissingColorData > 0) { + statusText.push(`${photosCountMissingColorData} missing color data`); + } + + return statusText.join(', '); +}; diff --git a/src/platforms/openai.ts b/src/platforms/openai.ts index 7e20caad..866b2973 100644 --- a/src/platforms/openai.ts +++ b/src/platforms/openai.ts @@ -4,7 +4,7 @@ import { createOpenAI } from '@ai-sdk/openai'; import { Redis } from '@upstash/redis'; import { Ratelimit } from '@upstash/ratelimit'; import { - AI_TEXT_GENERATION_ENABLED, + AI_CONTENT_GENERATION_ENABLED, HAS_REDIS_STORAGE, OPENAI_BASE_URL, } from '@/app/config'; @@ -16,7 +16,7 @@ const redis = HAS_REDIS_STORAGE ? Redis.fromEnv() : undefined; const RATE_LIMIT_IDENTIFIER = 'openai-image-query'; const MODEL = 'gpt-4o'; -const openai = AI_TEXT_GENERATION_ENABLED +const openai = AI_CONTENT_GENERATION_ENABLED ? createOpenAI({ apiKey: process.env.OPENAI_SECRET_KEY, ...OPENAI_BASE_URL && { baseURL: OPENAI_BASE_URL }, diff --git a/src/recents/RecentsHeader.tsx b/src/recents/RecentsHeader.tsx index dcaf78de..ef51151f 100644 --- a/src/recents/RecentsHeader.tsx +++ b/src/recents/RecentsHeader.tsx @@ -2,7 +2,7 @@ import { descriptionForPhotoSet, Photo, PhotoDateRange } from '@/photo'; import PhotoHeader from '@/photo/PhotoHeader'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import { useAppText } from '@/i18n/state/client'; import PhotoRecents from './PhotoRecents'; @@ -37,7 +37,7 @@ export default function RecentsHeader({ indexNumber={indexNumber} count={count} dateRange={dateRange} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} includeShareButton /> ); diff --git a/src/recipe/RecipeHeader.tsx b/src/recipe/RecipeHeader.tsx index 438c0c8d..9af1e3d2 100644 --- a/src/recipe/RecipeHeader.tsx +++ b/src/recipe/RecipeHeader.tsx @@ -5,7 +5,7 @@ import PhotoHeader from '@/photo/PhotoHeader'; import PhotoRecipe from './PhotoRecipe'; import { useAppState } from '@/app/AppState'; import { descriptionForRecipePhotos, getRecipePropsFromPhotos } from '.'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import { useAppText } from '@/i18n/state/client'; export default function RecipeHeader({ @@ -53,7 +53,7 @@ export default function RecipeHeader({ indexNumber={indexNumber} count={count} dateRange={dateRange} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} includeShareButton /> ); diff --git a/src/tag/PrivateHeader.tsx b/src/tag/PrivateHeader.tsx index cae38f69..4dc30e0d 100644 --- a/src/tag/PrivateHeader.tsx +++ b/src/tag/PrivateHeader.tsx @@ -1,7 +1,7 @@ import { Photo, photoQuantityText } from '@/photo'; import PhotoHeader from '@/photo/PhotoHeader'; import PhotoPrivate from './PhotoPrivate'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import { getAppText } from '@/i18n/state/server'; export default async function PrivateHeader({ @@ -25,7 +25,7 @@ export default async function PrivateHeader({ selectedPhoto={selectedPhoto} indexNumber={indexNumber} count={count} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} /> ); } diff --git a/src/tag/TagHeader.tsx b/src/tag/TagHeader.tsx index c75808d0..9382f252 100644 --- a/src/tag/TagHeader.tsx +++ b/src/tag/TagHeader.tsx @@ -3,7 +3,7 @@ import PhotoTag from './PhotoTag'; import { descriptionForTaggedPhotos, isTagFavs } from '.'; import PhotoHeader from '@/photo/PhotoHeader'; import PhotoFavs from './PhotoFavs'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import { getAppText } from '@/i18n/state/server'; export default async function TagHeader({ @@ -47,7 +47,7 @@ export default async function TagHeader({ indexNumber={indexNumber} count={count} dateRange={dateRange} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} includeShareButton /> ); diff --git a/src/years/YearHeader.tsx b/src/years/YearHeader.tsx index e2b8d52c..a6f28b82 100644 --- a/src/years/YearHeader.tsx +++ b/src/years/YearHeader.tsx @@ -2,7 +2,7 @@ import { descriptionForPhotoSet, Photo, PhotoDateRange } from '@/photo'; import PhotoHeader from '@/photo/PhotoHeader'; -import { AI_TEXT_GENERATION_ENABLED } from '@/app/config'; +import { AI_CONTENT_GENERATION_ENABLED } from '@/app/config'; import PhotoYear from './PhotoYear'; import { useAppText } from '@/i18n/state/client'; @@ -43,7 +43,7 @@ export default function YearHeader({ indexNumber={indexNumber} count={count} dateRange={dateRange} - hasAiTextGeneration={AI_TEXT_GENERATION_ENABLED} + hasAiTextGeneration={AI_CONTENT_GENERATION_ENABLED} includeShareButton /> );