From 3b6001602aa1ef4d65bef44f7afbf3c4d5855e9e Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Thu, 2 Oct 2025 21:46:58 -0500 Subject: [PATCH] Mobile Sidebar (#330) * Show top entities on mobile * Add config * Localize 'more'/'less' text --- README.md | 3 +- package.json | 18 +- pnpm-lock.yaml | 1422 +++++++++-------- src/admin/SignInOrUploadClient.tsx | 2 +- .../config/AdminAppConfigurationClient.tsx | 14 + src/app/config.ts | 3 + src/category/mobile.ts | 49 + src/category/useCategoryCounts.ts | 2 +- src/cmdk/CommandKClient.tsx | 16 +- src/components/Badge.tsx | 16 +- src/components/CopyButton.tsx | 2 +- src/components/HeaderList.tsx | 9 +- src/components/RepoLink.tsx | 5 +- src/components/entity/EntityLink.tsx | 33 +- src/components/useMaskedScroll.ts | 2 +- .../useNavigateOrRunActionWithToast.tsx | 2 +- src/i18n/locales/bd-bn.ts | 12 +- src/i18n/locales/en-gb.ts | 12 +- src/i18n/locales/en-us.ts | 12 +- src/i18n/locales/hi-in.ts | 12 +- src/i18n/locales/id-id.ts | 12 +- src/i18n/locales/pt-br.ts | 12 +- src/i18n/locales/pt-pt.ts | 12 +- src/i18n/locales/tr-tr.ts | 12 +- src/i18n/locales/zh-cn.ts | 12 +- src/i18n/state/index.ts | 7 +- src/photo/InfinitePhotoScroll.tsx | 7 +- src/photo/PhotoGridContainer.tsx | 3 + src/photo/PhotoGridPageClient.tsx | 82 +- src/photo/PhotoGridSidebar.tsx | 4 +- src/photo/PhotoLightbox.tsx | 5 +- src/photo/PhotoUploadWithStatus.tsx | 6 +- src/photo/TopPhotoEntities.tsx | 136 ++ src/tag/PhotoFavs.tsx | 7 +- src/tag/index.ts | 7 + tailwind.css | 4 + 36 files changed, 1197 insertions(+), 777 deletions(-) create mode 100644 src/category/mobile.ts create mode 100644 src/photo/TopPhotoEntities.tsx diff --git a/README.md b/README.md index 2bb52863..4efaa010 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,8 @@ Application behavior can be changed by configuring the following environment var - `recipes` (default) - `films` (default) - `focal-lengths` -- `NEXT_PUBLIC_HIDE_CATEGORY_IMAGE_HOVERS = 1` prevents images displaying when hovering over category links: +- `NEXT_PUBLIC_HIDE_CATEGORIES_ON_MOBILE = 1` prevents categories displaying on mobile grid view +- `NEXT_PUBLIC_HIDE_CATEGORY_IMAGE_HOVERS = 1` prevents images displaying when hovering over category links - `NEXT_PUBLIC_EXHAUSTIVE_SIDEBAR_CATEGORIES = 1` always shows expanded sidebar content - `NEXT_PUBLIC_HIDE_TAGS_WITH_ONE_PHOTO = 1` to only show tags with 2 or more photos diff --git a/package.json b/package.json index e57d7d27..6718978b 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ }, "packageManager": "pnpm@10.17.1", "dependencies": { - "@ai-sdk/openai": "^2.0.38", - "@ai-sdk/rsc": "^1.0.56", - "@aws-sdk/client-s3": "3.896.0", - "@aws-sdk/s3-request-presigner": "3.896.0", + "@ai-sdk/openai": "^2.0.40", + "@ai-sdk/rsc": "^1.0.59", + "@aws-sdk/client-s3": "3.899.0", + "@aws-sdk/s3-request-presigner": "3.899.0", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-tooltip": "^1.2.8", @@ -24,7 +24,7 @@ "@vercel/analytics": "^1.5.0", "@vercel/blob": "^2.0.0", "@vercel/speed-insights": "^1.2.0", - "ai": "^5.0.56", + "ai": "^5.0.59", "camelcase-keys": "^10.0.0", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -65,17 +65,17 @@ "@testing-library/react": "^16.3.0", "@types/culori": "^4.0.1", "@types/jest": "^30.0.0", - "@types/node": "^24.5.2", + "@types/node": "^24.6.0", "@types/pg": "^8.15.5", - "@types/react": "19.1.14", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "@types/sanitize-html": "^2.16.0", "cross-fetch": "^4.1.0", "eslint": "9.36.0", "eslint-config-next": "15.5.4", "eslint-plugin-react-hooks": "^5.2.0", - "jest": "^30.1.3", - "jest-environment-jsdom": "^30.1.2", + "jest": "^30.2.0", + "jest-environment-jsdom": "^30.2.0", "postcss": "8.5.6", "tailwindcss": "4.1.13", "ts-node": "^10.9.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23ee601c..94af60dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,29 +9,29 @@ importers: .: dependencies: '@ai-sdk/openai': - specifier: ^2.0.38 - version: 2.0.38(zod@4.1.11) + specifier: ^2.0.40 + version: 2.0.40(zod@4.1.11) '@ai-sdk/rsc': - specifier: ^1.0.56 - version: 1.0.56(react@19.1.1)(zod@4.1.11) + specifier: ^1.0.59 + version: 1.0.59(react@19.1.1)(zod@4.1.11) '@aws-sdk/client-s3': - specifier: 3.896.0 - version: 3.896.0 + specifier: 3.899.0 + version: 3.899.0 '@aws-sdk/s3-request-presigner': - specifier: 3.896.0 - version: 3.896.0 + specifier: 3.899.0 + version: 3.899.0 '@radix-ui/react-dialog': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.16 - version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-tooltip': specifier: ^1.2.8 - version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/piexifjs': specifier: ^1.0.0 version: 1.0.0 @@ -51,8 +51,8 @@ importers: specifier: ^1.2.0 version: 1.2.0(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) ai: - specifier: ^5.0.56 - version: 5.0.56(zod@4.1.11) + specifier: ^5.0.59 + version: 5.0.59(zod@4.1.11) camelcase-keys: specifier: ^10.0.0 version: 10.0.0 @@ -61,7 +61,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.1(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) culori: specifier: ^4.0.2 version: 4.0.2 @@ -161,7 +161,7 @@ importers: version: 6.8.0 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/culori': specifier: ^4.0.1 version: 4.0.1 @@ -169,17 +169,17 @@ importers: specifier: ^30.0.0 version: 30.0.0 '@types/node': - specifier: ^24.5.2 - version: 24.5.2 + specifier: ^24.6.0 + version: 24.6.0 '@types/pg': specifier: ^8.15.5 version: 8.15.5 '@types/react': - specifier: 19.1.14 - version: 19.1.14 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.14) + version: 19.1.9(@types/react@19.1.15) '@types/sanitize-html': specifier: ^2.16.0 version: 2.16.0 @@ -196,11 +196,11 @@ importers: specifier: ^5.2.0 version: 5.2.0(eslint@9.36.0(jiti@2.5.1)) jest: - specifier: ^30.1.3 - version: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) + specifier: ^30.2.0 + version: 30.2.0(@types/node@24.6.0)(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)) jest-environment-jsdom: - specifier: ^30.1.2 - version: 30.1.2 + specifier: ^30.2.0 + version: 30.2.0 postcss: specifier: 8.5.6 version: 8.5.6 @@ -209,7 +209,7 @@ importers: version: 4.1.13 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@24.5.2)(typescript@5.9.2) + version: 10.9.2(@types/node@24.6.0)(typescript@5.9.2) typescript: specifier: 5.9.2 version: 5.9.2 @@ -219,14 +219,14 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/gateway@1.0.30': - resolution: {integrity: sha512-QdrSUryr/CLcsCISokLHOImcHj1adGXk1yy4B3qipqLhcNc33Kj/O/3crI790Qp85oDx7sc4vm7R4raf9RA/kg==} + '@ai-sdk/gateway@1.0.32': + resolution: {integrity: sha512-TQRIM63EI/ccJBc7RxeB8nq/CnGNnyl7eu5stWdLwL41stkV5skVeZJe0QRvFbaOrwCkgUVE0yrUqJi4tgDC1A==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.38': - resolution: {integrity: sha512-aPK5jSz5/UkbYnh59/Yy5ic3JsOrz7Gt6TJdB8ggYDYEUHJ9FHEKoRKz8DEHh3Zaf3yngxZLkdP4JSbroK3jsQ==} + '@ai-sdk/openai@2.0.40': + resolution: {integrity: sha512-VFPS6zuDkMTXuZCR7QvYdcrilk1xTa+vfQedK2IBOLDU52GgdC7ywPqR5NScb7vHuxCwm/CKfk6X4WZ08kCr9Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -241,8 +241,8 @@ packages: resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/rsc@1.0.56': - resolution: {integrity: sha512-RUkDVohaV40pR2PsA1kKoe/AVDyZrTtEV5YR5c1TZbHLOJyKsXqoje4jLqBDamZPq44cSdcc2Gwnh2CpJAIaYA==} + '@ai-sdk/rsc@1.0.59': + resolution: {integrity: sha512-ENIhKFGPzjbpZgjJXRzfRTHge67+FIcGeSkJCf3t/F99NKs9yoxlRPnFhrRqW0kuCiASPJS/UM3xKtVta0ypZA==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -295,44 +295,44 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.896.0': - resolution: {integrity: sha512-UETVuMLQRqgrWxTnavotY0TlB/jaR9sL3hkIFPx4KtjmigNBdwRaiVfOuTnIXKd+w9RPINYG//nnrK+5gIyZkA==} + '@aws-sdk/client-s3@3.899.0': + resolution: {integrity: sha512-m/XQT0Rew4ff1Xmug+8n7f3uwom2DhbPwKWjUpluKo8JNCJJTIlfFSe1tnSimeE7RdLcIigK0YpvE50OjZZHGw==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.896.0': - resolution: {integrity: sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg==} + '@aws-sdk/client-sso@3.899.0': + resolution: {integrity: sha512-EKz/iiVDv2OC8/3ONcXG3+rhphx9Heh7KXQdsZzsAXGVn6mWtrHQLrWjgONckmK4LrD07y4+5WlJlGkMxSMA5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.896.0': - resolution: {integrity: sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA==} + '@aws-sdk/core@3.899.0': + resolution: {integrity: sha512-Enp5Zw37xaRlnscyaelaUZNxVqyE3CTS8gjahFbW2bbzVtRD2itHBVgq8A3lvKiFb7Feoxa71aTe0fQ1I6AhQQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.896.0': - resolution: {integrity: sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg==} + '@aws-sdk/credential-provider-env@3.899.0': + resolution: {integrity: sha512-wXQ//KQ751EFhUbdfoL/e2ZDaM8l2Cff+hVwFcj32yiZyeCMhnoLRMQk2euAaUOugqPY5V5qesFbHhISbIedtw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.896.0': - resolution: {integrity: sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA==} + '@aws-sdk/credential-provider-http@3.899.0': + resolution: {integrity: sha512-/rRHyJFdnPrupjt/1q/PxaO6O26HFsguVUJSUeMeGUWLy0W8OC3slLFDNh89CgTqnplCyt1aLFMCagRM20HjNQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.896.0': - resolution: {integrity: sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA==} + '@aws-sdk/credential-provider-ini@3.899.0': + resolution: {integrity: sha512-B8oFNFTDV0j1yiJiqzkC2ybml+theNnmsLrTLBhJbnBLWkxEcmVGKVIMnATW9BUCBhHmEtDiogdNIzSwP8tbMw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.896.0': - resolution: {integrity: sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw==} + '@aws-sdk/credential-provider-node@3.899.0': + resolution: {integrity: sha512-nHBnZ2ZCOqTGJ2A9xpVj8iK6+WV+j0JNv3XGEkIuL4mqtGEPJlEex/0mD/hqc1VF8wZzojji2OQ3892m1mUOSA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.896.0': - resolution: {integrity: sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ==} + '@aws-sdk/credential-provider-process@3.899.0': + resolution: {integrity: sha512-1PWSejKcJQUKBNPIqSHlEW4w8vSjmb+3kNJqCinJybjp5uP5BJgBp6QNcb8Nv30VBM0bn3ajVd76LCq4ZshQAw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.896.0': - resolution: {integrity: sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA==} + '@aws-sdk/credential-provider-sso@3.899.0': + resolution: {integrity: sha512-URlMbo74CAhIGrhzEP2fw5F5Tt6MRUctA8aa88MomlEHCEbJDsMD3nh6qoXxwR3LyvEBFmCWOZ/1TWmAjMsSdA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.896.0': - resolution: {integrity: sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g==} + '@aws-sdk/credential-provider-web-identity@3.899.0': + resolution: {integrity: sha512-UEn5o5FMcbeFPRRkJI6VCrgdyR9qsLlGA7+AKCYuYADsKbvJGIIQk6A2oD82vIVvLYD3TtbTLDLsF7haF9mpbw==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.893.0': @@ -343,8 +343,8 @@ packages: resolution: {integrity: sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.896.0': - resolution: {integrity: sha512-bB3W/IFG7HNNziACOp1aZVGGnrIahXc0PxZoU055JirEGQtDFIU1ZD7S9zLKmy9FFUvQsAeRL9nDFHbx8cwx/w==} + '@aws-sdk/middleware-flexible-checksums@3.899.0': + resolution: {integrity: sha512-Hn2nyE+08/z+etssu++1W/kN9lCMAsLeg505mMcyrPs9Ex2XMl8ho/nYKBp5EjjfU8quqfP8O4NYt4KRy9OEaA==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.893.0': @@ -363,36 +363,36 @@ packages: resolution: {integrity: sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.896.0': - resolution: {integrity: sha512-hlPu/AZ5Afa4ZafP+aXIjRtKm7BX57lurA+TJ+7nXm1Az8Du3Sg2tZXP2/GfqTztLIFQYj/Jy5smkJ0+1HNAPQ==} + '@aws-sdk/middleware-sdk-s3@3.899.0': + resolution: {integrity: sha512-/3/EIRSwQ5CNOSTHx96gVGzzmTe46OxcPG5FTgM6i9ZD+K/Q3J/UPGFL5DPzct5fXiSLvD1cGQitWHStVDjOVQ==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.893.0': resolution: {integrity: sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.896.0': - resolution: {integrity: sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ==} + '@aws-sdk/middleware-user-agent@3.899.0': + resolution: {integrity: sha512-6EsVCC9j1VIyVyLOg+HyO3z9L+c0PEwMiHe3kuocoMf8nkfjSzJfIl6zAtgAXWgP5MKvusTP2SUbS9ezEEHZ+A==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.896.0': - resolution: {integrity: sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw==} + '@aws-sdk/nested-clients@3.899.0': + resolution: {integrity: sha512-ySXXsFO0RH28VISEqvCuPZ78VAkK45/+OCIJgPvYpcCX9CVs70XSvMPXDI46I49mudJ1s4H3IUKccYSEtA+jaw==} engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.893.0': resolution: {integrity: sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/s3-request-presigner@3.896.0': - resolution: {integrity: sha512-pAlxvB1UmbgyfW8JyJy30FXfsfcWAbtR5gCO25mR5PPwuBQgzQR6lf/L4zbp+ZsSNhlKsvroe537oW5EXYk6Dw==} + '@aws-sdk/s3-request-presigner@3.899.0': + resolution: {integrity: sha512-DxaUhy9IZLo99C5hPCNU9h9Md11Je8snzq9fwCCiNviPmp9CiBJ8c9rPqjYoWNbi7LVDjhqO17ebKBpNthBkzA==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.896.0': - resolution: {integrity: sha512-txiQDEZXL9tlNP8mbnNaDtuHBYc/FCqaZ8Y76qnfM3o6CTIn0t0tTAlnx1CyFe4EaikVBgQuZvj5KfNA8PmlzA==} + '@aws-sdk/signature-v4-multi-region@3.899.0': + resolution: {integrity: sha512-wV51Jogxhd7dI4Q2Y1ASbkwTsRT3G8uwWFDCwl+WaErOQAzofKlV6nFJQlfgjMk4iEn2gFOIWqJ8fMTGShRK/A==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.896.0': - resolution: {integrity: sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw==} + '@aws-sdk/token-providers@3.899.0': + resolution: {integrity: sha512-Ovu1nWr8HafYa/7DaUvvPnzM/yDUGDBqaiS7rRzv++F5VwyFY37+z/mHhvRnr+PbNWo8uf22a121SNue5uwP2w==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.893.0': @@ -418,8 +418,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.893.0': resolution: {integrity: sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==} - '@aws-sdk/util-user-agent-node@3.896.0': - resolution: {integrity: sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w==} + '@aws-sdk/util-user-agent-node@3.899.0': + resolution: {integrity: sha512-CiP0UAVQWLg2+8yciUBzVLaK5Fr7jBQ7wVu+p/O2+nlCOD3E3vtL1KZ1qX/d3OVpVSVaMAdZ9nbyewGV9hvjjg==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -864,12 +864,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.1.2': - resolution: {integrity: sha512-BGMAxj8VRmoD0MoA/jo9alMXSRoqW8KPeqOfEo1ncxnRLatTBCpRoOwlwlEMdudp68Q6WSGwYrrLtTGOh8fLzw==} + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.1.3': - resolution: {integrity: sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==} + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} 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 @@ -881,8 +881,8 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/environment-jsdom-abstract@30.1.2': - resolution: {integrity: sha512-u8kTh/ZBl97GOmnGJLYK/1GuwAruMC4hoP6xuk/kwltmVWsA9u/6fH1/CsPVGt2O+Wn2yEjs8n1B1zZJ62Cx0w==} + '@jest/environment-jsdom-abstract@30.2.0': + resolution: {integrity: sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -891,36 +891,40 @@ packages: canvas: optional: true - '@jest/environment@30.1.2': - resolution: {integrity: sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==} + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/expect-utils@30.1.2': resolution: {integrity: sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@30.1.2': - resolution: {integrity: sha512-tyaIExOwQRCxPCGNC05lIjWJztDwk2gPDNSDGg1zitXJJ8dC3++G/CRjE5mb2wQsf89+lsgAgqxxNpDLiCViTA==} + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/fake-timers@30.1.2': - resolution: {integrity: sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==} + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/get-type@30.1.0': resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@30.1.2': - resolution: {integrity: sha512-teNTPZ8yZe3ahbYnvnVRDeOjr+3pu2uiAtNtrEsiMjVPPj+cXd5E/fr8BL7v/T7F31vYdEHrI5cC/2OoO/vM9A==} + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} 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.1.3': - resolution: {integrity: sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==} + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} 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 @@ -932,30 +936,34 @@ packages: resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/snapshot-utils@30.1.2': - resolution: {integrity: sha512-vHoMTpimcPSR7OxS2S0V1Cpg8eKDRxucHjoWl5u4RQcnxqQrV3avETiFpl8etn4dqxEGarBeHbIBety/f8mLXw==} + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} 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.1.3': - resolution: {integrity: sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==} + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@30.1.3': - resolution: {integrity: sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==} + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@30.1.2': - resolution: {integrity: sha512-UYYFGifSgfjujf1Cbd3iU/IQoSd6uwsj8XHj5DSDf5ERDcWMdJOPTkHWXj4U+Z/uMagyOQZ6Vne8C4nRIrCxqA==} + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@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.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1405,8 +1413,8 @@ packages: resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.12.0': - resolution: {integrity: sha512-zJeAgogZfbwlPGL93y4Z/XNeIN37YCreRUd6YMIRvaq+6RnBK8PPYYIQ85Is/GglPh3kNImD5riDCXbVSDpCiQ==} + '@smithy/core@3.13.0': + resolution: {integrity: sha512-BI6ALLPOKnPOU1Cjkc+1TPhOlP3JXSR/UH14JmnaLq41t3ma+IjuXrKfhycVjr5IQ0XxRh2NnQo3olp+eCVrGg==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.1.2': @@ -1469,12 +1477,12 @@ packages: resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.2.4': - resolution: {integrity: sha512-FZ4hzupOmthm8Q8ujYrd0I+/MHwVMuSTdkDtIQE0xVuvJt9pLT6Q+b0p4/t+slDyrpcf+Wj7SN+ZqT5OryaaZg==} + '@smithy/middleware-endpoint@4.2.5': + resolution: {integrity: sha512-DdOIpssQ5LFev7hV6GX9TMBW5ChTsQBxqgNW1ZGtJNSAi5ksd5klwPwwMY0ejejfEzwXXGqxgVO3cpaod4veiA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.3.0': - resolution: {integrity: sha512-qhEX9745fAxZvtLM4bQJAVC98elWjiMO2OiHl1s6p7hUzS4QfZO1gXUYNwEK8m0J6NoCD5W52ggWxbIDHI0XSg==} + '@smithy/middleware-retry@4.3.1': + resolution: {integrity: sha512-aH2bD1bzb6FB04XBhXA5mgedEZPKx3tD/qBuYCAKt5iieWvWO1Y2j++J9uLqOndXb9Pf/83Xka/YjSnMbcPchA==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.1.1': @@ -1521,8 +1529,8 @@ packages: resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.6.4': - resolution: {integrity: sha512-qL7O3VDyfzCSN9r+sdbQXGhaHtrfSJL30En6Jboj0I3bobf2g1/T0eP2L4qxqrEW26gWhJ4THI4ElVVLjYyBHg==} + '@smithy/smithy-client@4.6.5': + resolution: {integrity: sha512-6J2hhuWu7EjnvLBIGltPCqzNswL1cW/AkaZx6i56qLsQ0ix17IAhmDD9aMmL+6CN9nCJODOXpBTCQS6iKAA7/g==} engines: {node: '>=18.0.0'} '@smithy/types@4.5.0': @@ -1557,12 +1565,12 @@ packages: resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.1.4': - resolution: {integrity: sha512-mLDJ1s4eA3vwOGaQOEPlg5LB4LdZUUMpB5UMOMofeGhWqiS7WR7dTpLiNi9zVn+YziKUd3Af5NLfxDs7NJqmIw==} + '@smithy/util-defaults-mode-browser@4.1.5': + resolution: {integrity: sha512-FGBhlmFZVSRto816l6IwrmDcQ9pUYX6ikdR1mmAhdtSS1m77FgADukbQg7F7gurXfAvloxE/pgsrb7SGja6FQA==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.1.4': - resolution: {integrity: sha512-pjX2iMTcOASaSanAd7bu6i3fcMMezr3NTr8Rh64etB0uHRZi+Aw86DoCxPESjY4UTIuA06hhqtTtw95o//imYA==} + '@smithy/util-defaults-mode-node@4.1.5': + resolution: {integrity: sha512-Gwj8KLgJ/+MHYjVubJF0EELEh9/Ir7z7DFqyYlwgmp4J37KE+5vz6b3pWUnSt53tIe5FjDfVjDmHGYKjwIvW0Q==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.1.2': @@ -1788,8 +1796,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@24.5.2': - resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} + '@types/node@24.6.0': + resolution: {integrity: sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==} '@types/pg@8.15.5': resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} @@ -1802,8 +1810,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.14': - resolution: {integrity: sha512-ukd93VGzaNPMAUPy0gRDSC57UuQbnH9Kussp7HBjM06YFi9uZTFhOvMSO2OKqXm1rSgzOE+pVx1k1PYHGwlc8Q==} + '@types/react@19.1.15': + resolution: {integrity: sha512-+kLxJpaJzXybyDyFXYADyP1cznTO8HSuBpenGlnKOAkH4hyNINiywvXS/tGJhsrGGP/gM185RA3xpjY0Yg4erA==} '@types/sanitize-html@2.16.0': resolution: {integrity: sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==} @@ -2064,8 +2072,8 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@5.0.56: - resolution: {integrity: sha512-Rl++Ogg6DxzFkVHAOJZzhqcqvqtBLGOP9mMxJOGr2EJWj5HH5zjqDcnRh6x5vBoca5kj/Gd0rvUZFMnyI+sRiw==} + ai@5.0.59: + resolution: {integrity: sha512-SuAFxKXt2Ha9FiXB3gaOITkOg9ek/3QNVatGVExvTT4gNXc+hJpuNe1dmuwf6Z5Op4fzc8wdbsrYP27ZCXBzlw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2175,18 +2183,18 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-jest@30.1.2: - resolution: {integrity: sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g==} + babel-jest@30.2.0: + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.11.0 + '@babel/core': ^7.11.0 || ^8.0.0-0 babel-plugin-istanbul@7.0.1: resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} - babel-plugin-jest-hoist@30.0.1: - resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} + babel-plugin-jest-hoist@30.2.0: + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-preset-current-node-syntax@1.2.0: @@ -2194,11 +2202,11 @@ packages: peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@30.0.1: - resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} + babel-preset-jest@30.2.0: + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.11.0 + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2698,6 +2706,10 @@ packages: resolution: {integrity: sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + extract-colors@4.2.1: resolution: {integrity: sha512-QAWcuwxnL9pisK7YfuG8qab6IF7UD6bbKTjiM+QTJ9Xvfi7fBymQd/xTFaPhkzkB5kyq+wla3AHanM7LInFLaQ==} @@ -3131,16 +3143,16 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-changed-files@30.0.5: - resolution: {integrity: sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==} + jest-changed-files@30.2.0: + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@30.1.3: - resolution: {integrity: sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==} + jest-circus@30.2.0: + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.1.3: - resolution: {integrity: sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==} + jest-cli@30.2.0: + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -3149,8 +3161,8 @@ packages: node-notifier: optional: true - jest-config@30.1.3: - resolution: {integrity: sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==} + jest-config@30.2.0: + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' @@ -3168,16 +3180,20 @@ packages: resolution: {integrity: sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==} 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==} + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@30.1.0: - resolution: {integrity: sha512-A+9FKzxPluqogNahpCv04UJvcZ9B3HamqpDNWNKDjtxVRYB8xbZLFuCr8JAJFpNp83CA0anGQFlpQna9Me+/tQ==} + jest-docblock@30.2.0: + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-jsdom@30.1.2: - resolution: {integrity: sha512-LXsfAh5+mDTuXDONGl1ZLYxtJEaS06GOoxJb2arcJTjIfh1adYg8zLD8f6P0df8VmjvCaMrLmc1PgHUI/YUTbg==} + jest-each@30.2.0: + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-jsdom@30.2.0: + resolution: {integrity: sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -3185,30 +3201,42 @@ packages: canvas: optional: true - jest-environment-node@30.1.2: - resolution: {integrity: sha512-w8qBiXtqGWJ9xpJIA98M0EIoq079GOQRQUyse5qg1plShUCQ0Ek1VTTcczqKrn3f24TFAgFtT+4q3aOXvjbsuA==} + jest-environment-node@30.2.0: + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-haste-map@30.1.0: - resolution: {integrity: sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg==} + jest-haste-map@30.2.0: + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-leak-detector@30.1.0: - resolution: {integrity: sha512-AoFvJzwxK+4KohH60vRuHaqXfWmeBATFZpzpmzNmYTtmRMiyGPVhkXpBqxUQunw+dQB48bDf4NpUs6ivVbRv1g==} + jest-leak-detector@30.2.0: + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@30.1.2: resolution: {integrity: sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.1.0: resolution: {integrity: sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + 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-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -3222,44 +3250,48 @@ packages: 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.1.3: - resolution: {integrity: sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==} + jest-resolve-dependencies@30.2.0: + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@30.1.3: - resolution: {integrity: sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==} + jest-resolve@30.2.0: + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@30.1.3: - resolution: {integrity: sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==} + jest-runner@30.2.0: + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@30.1.3: - resolution: {integrity: sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==} + jest-runtime@30.2.0: + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@30.1.2: - resolution: {integrity: sha512-4q4+6+1c8B6Cy5pGgFvjDy/Pa6VYRiGu0yQafKkJ9u6wQx4G5PqI2QR6nxTl43yy7IWsINwz6oT4o6tD12a8Dg==} + jest-snapshot@30.2.0: + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} 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-validate@30.1.0: - resolution: {integrity: sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA==} + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@30.1.3: - resolution: {integrity: sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==} + jest-validate@30.2.0: + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-worker@30.1.0: - resolution: {integrity: sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA==} + jest-watcher@30.2.0: + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@30.1.3: - resolution: {integrity: sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==} + jest-worker@30.2.0: + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.2.0: + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -3820,6 +3852,10 @@ packages: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4299,8 +4335,8 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@7.12.0: - resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + undici-types@7.13.0: + resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} @@ -4502,13 +4538,13 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/gateway@1.0.30(zod@4.1.11)': + '@ai-sdk/gateway@1.0.32(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/openai@2.0.38(zod@4.1.11)': + '@ai-sdk/openai@2.0.40(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) @@ -4525,11 +4561,11 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/rsc@1.0.56(react@19.1.1)(zod@4.1.11)': + '@ai-sdk/rsc@1.0.59(react@19.1.1)(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) - ai: 5.0.56(zod@4.1.11) + ai: 5.0.59(zod@4.1.11) jsondiffpatch: 0.6.0 react: 19.1.1 optionalDependencies: @@ -4600,32 +4636,32 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.896.0': + '@aws-sdk/client-s3@3.899.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.896.0 - '@aws-sdk/credential-provider-node': 3.896.0 + '@aws-sdk/core': 3.899.0 + '@aws-sdk/credential-provider-node': 3.899.0 '@aws-sdk/middleware-bucket-endpoint': 3.893.0 '@aws-sdk/middleware-expect-continue': 3.893.0 - '@aws-sdk/middleware-flexible-checksums': 3.896.0 + '@aws-sdk/middleware-flexible-checksums': 3.899.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-location-constraint': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-sdk-s3': 3.896.0 + '@aws-sdk/middleware-sdk-s3': 3.899.0 '@aws-sdk/middleware-ssec': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.896.0 + '@aws-sdk/middleware-user-agent': 3.899.0 '@aws-sdk/region-config-resolver': 3.893.0 - '@aws-sdk/signature-v4-multi-region': 3.896.0 + '@aws-sdk/signature-v4-multi-region': 3.899.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.896.0 + '@aws-sdk/util-user-agent-node': 3.899.0 '@aws-sdk/xml-builder': 3.894.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.12.0 + '@smithy/core': 3.13.0 '@smithy/eventstream-serde-browser': 4.1.1 '@smithy/eventstream-serde-config-resolver': 4.2.1 '@smithy/eventstream-serde-node': 4.1.1 @@ -4636,21 +4672,21 @@ snapshots: '@smithy/invalid-dependency': 4.1.1 '@smithy/md5-js': 4.1.1 '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.4 - '@smithy/middleware-retry': 4.3.0 + '@smithy/middleware-endpoint': 4.2.5 + '@smithy/middleware-retry': 4.3.1 '@smithy/middleware-serde': 4.1.1 '@smithy/middleware-stack': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/node-http-handler': 4.2.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.4 - '@smithy/util-defaults-mode-node': 4.1.4 + '@smithy/util-defaults-mode-browser': 4.1.5 + '@smithy/util-defaults-mode-node': 4.1.5 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -4662,41 +4698,41 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.896.0': + '@aws-sdk/client-sso@3.899.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.896.0 + '@aws-sdk/middleware-user-agent': 3.899.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.896.0 + '@aws-sdk/util-user-agent-node': 3.899.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.12.0 + '@smithy/core': 3.13.0 '@smithy/fetch-http-handler': 5.2.1 '@smithy/hash-node': 4.1.1 '@smithy/invalid-dependency': 4.1.1 '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.4 - '@smithy/middleware-retry': 4.3.0 + '@smithy/middleware-endpoint': 4.2.5 + '@smithy/middleware-retry': 4.3.1 '@smithy/middleware-serde': 4.1.1 '@smithy/middleware-stack': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/node-http-handler': 4.2.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.4 - '@smithy/util-defaults-mode-node': 4.1.4 + '@smithy/util-defaults-mode-browser': 4.1.5 + '@smithy/util-defaults-mode-node': 4.1.5 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -4705,52 +4741,52 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.896.0': + '@aws-sdk/core@3.899.0': dependencies: '@aws-sdk/types': 3.893.0 '@aws-sdk/xml-builder': 3.894.0 - '@smithy/core': 3.12.0 + '@smithy/core': 3.13.0 '@smithy/node-config-provider': 4.2.2 '@smithy/property-provider': 4.1.1 '@smithy/protocol-http': 5.2.1 '@smithy/signature-v4': 5.2.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 '@smithy/util-base64': 4.1.0 '@smithy/util-middleware': 4.1.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.896.0': + '@aws-sdk/credential-provider-env@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.896.0': + '@aws-sdk/credential-provider-http@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/fetch-http-handler': 5.2.1 '@smithy/node-http-handler': 4.2.1 '@smithy/property-provider': 4.1.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 '@smithy/util-stream': 4.3.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.896.0': + '@aws-sdk/credential-provider-ini@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 - '@aws-sdk/credential-provider-env': 3.896.0 - '@aws-sdk/credential-provider-http': 3.896.0 - '@aws-sdk/credential-provider-process': 3.896.0 - '@aws-sdk/credential-provider-sso': 3.896.0 - '@aws-sdk/credential-provider-web-identity': 3.896.0 - '@aws-sdk/nested-clients': 3.896.0 + '@aws-sdk/core': 3.899.0 + '@aws-sdk/credential-provider-env': 3.899.0 + '@aws-sdk/credential-provider-http': 3.899.0 + '@aws-sdk/credential-provider-process': 3.899.0 + '@aws-sdk/credential-provider-sso': 3.899.0 + '@aws-sdk/credential-provider-web-identity': 3.899.0 + '@aws-sdk/nested-clients': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/credential-provider-imds': 4.1.2 '@smithy/property-provider': 4.1.1 @@ -4760,14 +4796,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.896.0': + '@aws-sdk/credential-provider-node@3.899.0': dependencies: - '@aws-sdk/credential-provider-env': 3.896.0 - '@aws-sdk/credential-provider-http': 3.896.0 - '@aws-sdk/credential-provider-ini': 3.896.0 - '@aws-sdk/credential-provider-process': 3.896.0 - '@aws-sdk/credential-provider-sso': 3.896.0 - '@aws-sdk/credential-provider-web-identity': 3.896.0 + '@aws-sdk/credential-provider-env': 3.899.0 + '@aws-sdk/credential-provider-http': 3.899.0 + '@aws-sdk/credential-provider-ini': 3.899.0 + '@aws-sdk/credential-provider-process': 3.899.0 + '@aws-sdk/credential-provider-sso': 3.899.0 + '@aws-sdk/credential-provider-web-identity': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/credential-provider-imds': 4.1.2 '@smithy/property-provider': 4.1.1 @@ -4777,20 +4813,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.896.0': + '@aws-sdk/credential-provider-process@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.896.0': + '@aws-sdk/credential-provider-sso@3.899.0': dependencies: - '@aws-sdk/client-sso': 3.896.0 - '@aws-sdk/core': 3.896.0 - '@aws-sdk/token-providers': 3.896.0 + '@aws-sdk/client-sso': 3.899.0 + '@aws-sdk/core': 3.899.0 + '@aws-sdk/token-providers': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -4799,10 +4835,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.896.0': + '@aws-sdk/credential-provider-web-identity@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 - '@aws-sdk/nested-clients': 3.896.0 + '@aws-sdk/core': 3.899.0 + '@aws-sdk/nested-clients': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -4828,12 +4864,12 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.896.0': + '@aws-sdk/middleware-flexible-checksums@3.899.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/is-array-buffer': 4.1.0 '@smithy/node-config-provider': 4.2.2 @@ -4871,16 +4907,16 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.896.0': + '@aws-sdk/middleware-sdk-s3@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/core': 3.12.0 + '@smithy/core': 3.13.0 '@smithy/node-config-provider': 4.2.2 '@smithy/protocol-http': 5.2.1 '@smithy/signature-v4': 5.2.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 '@smithy/util-config-provider': 4.1.0 '@smithy/util-middleware': 4.1.1 @@ -4894,51 +4930,51 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.896.0': + '@aws-sdk/middleware-user-agent@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 - '@smithy/core': 3.12.0 + '@smithy/core': 3.13.0 '@smithy/protocol-http': 5.2.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.896.0': + '@aws-sdk/nested-clients@3.899.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.896.0 + '@aws-sdk/core': 3.899.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.896.0 + '@aws-sdk/middleware-user-agent': 3.899.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.896.0 + '@aws-sdk/util-user-agent-node': 3.899.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.12.0 + '@smithy/core': 3.13.0 '@smithy/fetch-http-handler': 5.2.1 '@smithy/hash-node': 4.1.1 '@smithy/invalid-dependency': 4.1.1 '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.4 - '@smithy/middleware-retry': 4.3.0 + '@smithy/middleware-endpoint': 4.2.5 + '@smithy/middleware-retry': 4.3.1 '@smithy/middleware-serde': 4.1.1 '@smithy/middleware-stack': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/node-http-handler': 4.2.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.4 - '@smithy/util-defaults-mode-node': 4.1.4 + '@smithy/util-defaults-mode-browser': 4.1.5 + '@smithy/util-defaults-mode-node': 4.1.5 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -4956,30 +4992,30 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@aws-sdk/s3-request-presigner@3.896.0': + '@aws-sdk/s3-request-presigner@3.899.0': dependencies: - '@aws-sdk/signature-v4-multi-region': 3.896.0 + '@aws-sdk/signature-v4-multi-region': 3.899.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-format-url': 3.893.0 - '@smithy/middleware-endpoint': 4.2.4 + '@smithy/middleware-endpoint': 4.2.5 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.896.0': + '@aws-sdk/signature-v4-multi-region@3.899.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.896.0 + '@aws-sdk/middleware-sdk-s3': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/protocol-http': 5.2.1 '@smithy/signature-v4': 5.2.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.896.0': + '@aws-sdk/token-providers@3.899.0': dependencies: - '@aws-sdk/core': 3.896.0 - '@aws-sdk/nested-clients': 3.896.0 + '@aws-sdk/core': 3.899.0 + '@aws-sdk/nested-clients': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -5023,9 +5059,9 @@ snapshots: bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.896.0': + '@aws-sdk/util-user-agent-node@3.899.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.896.0 + '@aws-sdk/middleware-user-agent': 3.899.0 '@aws-sdk/types': 3.893.0 '@smithy/node-config-provider': 4.2.2 '@smithy/types': 4.5.0 @@ -5457,44 +5493,44 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.1.2': + '@jest/console@30.2.0': dependencies: - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/types': 30.2.0 + '@types/node': 24.6.0 chalk: 4.1.2 - jest-message-util: 30.1.0 - jest-util: 30.0.5 + jest-message-util: 30.2.0 + jest-util: 30.2.0 slash: 3.0.0 - '@jest/core@30.1.3(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2))': + '@jest/core@30.2.0(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2))': dependencies: - '@jest/console': 30.1.2 + '@jest/console': 30.2.0 '@jest/pattern': 30.0.1 - '@jest/reporters': 30.1.3 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.6.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-changed-files: 30.0.5 - jest-config: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) - jest-haste-map: 30.1.0 - jest-message-util: 30.1.0 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@24.6.0)(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 jest-regex-util: 30.0.1 - jest-resolve: 30.1.3 - jest-resolve-dependencies: 30.1.3 - jest-runner: 30.1.3 - jest-runtime: 30.1.3 - jest-snapshot: 30.1.2 - jest-util: 30.0.5 - jest-validate: 30.1.0 - jest-watcher: 30.1.3 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 micromatch: 4.0.8 - pretty-format: 30.0.5 + pretty-format: 30.2.0 slash: 3.0.0 transitivePeerDependencies: - babel-plugin-macros @@ -5504,69 +5540,73 @@ snapshots: '@jest/diff-sequences@30.0.1': {} - '@jest/environment-jsdom-abstract@30.1.2(jsdom@26.1.0)': + '@jest/environment-jsdom-abstract@30.2.0(jsdom@26.1.0)': dependencies: - '@jest/environment': 30.1.2 - '@jest/fake-timers': 30.1.2 - '@jest/types': 30.0.5 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 '@types/jsdom': 21.1.7 - '@types/node': 24.5.2 - jest-mock: 30.0.5 - jest-util: 30.0.5 + '@types/node': 24.6.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 jsdom: 26.1.0 - '@jest/environment@30.1.2': + '@jest/environment@30.2.0': dependencies: - '@jest/fake-timers': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 - jest-mock: 30.0.5 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.6.0 + jest-mock: 30.2.0 '@jest/expect-utils@30.1.2': dependencies: '@jest/get-type': 30.1.0 - '@jest/expect@30.1.2': + '@jest/expect-utils@30.2.0': dependencies: - expect: 30.1.2 - jest-snapshot: 30.1.2 + '@jest/get-type': 30.1.0 + + '@jest/expect@30.2.0': + dependencies: + expect: 30.2.0 + jest-snapshot: 30.2.0 transitivePeerDependencies: - supports-color - '@jest/fake-timers@30.1.2': + '@jest/fake-timers@30.2.0': dependencies: - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 24.5.2 - jest-message-util: 30.1.0 - jest-mock: 30.0.5 - jest-util: 30.0.5 + '@types/node': 24.6.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 '@jest/get-type@30.1.0': {} - '@jest/globals@30.1.2': + '@jest/globals@30.2.0': dependencies: - '@jest/environment': 30.1.2 - '@jest/expect': 30.1.2 - '@jest/types': 30.0.5 - jest-mock: 30.0.5 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 + jest-mock: 30.2.0 transitivePeerDependencies: - supports-color '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.6.0 jest-regex-util: 30.0.1 - '@jest/reporters@30.1.3': + '@jest/reporters@30.2.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.1.2 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 24.5.2 + '@types/node': 24.6.0 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit-x: 0.2.2 @@ -5577,9 +5617,9 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - jest-message-util: 30.1.0 - jest-util: 30.0.5 - jest-worker: 30.1.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 slash: 3.0.0 string-length: 4.0.2 v8-to-istanbul: 9.3.0 @@ -5590,9 +5630,9 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.41 - '@jest/snapshot-utils@30.1.2': + '@jest/snapshot-utils@30.2.0': dependencies: - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 @@ -5603,33 +5643,33 @@ snapshots: callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.1.3': + '@jest/test-result@30.2.0': dependencies: - '@jest/console': 30.1.2 - '@jest/types': 30.0.5 + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@30.1.3': + '@jest/test-sequencer@30.2.0': dependencies: - '@jest/test-result': 30.1.3 + '@jest/test-result': 30.2.0 graceful-fs: 4.2.11 - jest-haste-map: 30.1.0 + jest-haste-map: 30.2.0 slash: 3.0.0 - '@jest/transform@30.1.2': + '@jest/transform@30.2.0': dependencies: '@babel/core': 7.28.4 - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 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.1.0 + jest-haste-map: 30.2.0 jest-regex-util: 30.0.1 - jest-util: 30.0.5 + jest-util: 30.2.0 micromatch: 4.0.8 pirates: 4.0.7 slash: 3.0.0 @@ -5643,7 +5683,17 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.5.2 + '@types/node': 24.6.0 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.6.0 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -5742,292 +5792,292 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(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.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.14)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-context@1.1.2(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(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.14)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.15)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-direction@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.14)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-id@1.1.1(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.15)(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.14)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.15)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@floating-ui/react-dom': 2.1.6(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.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.15)(react@19.1.1) '@radix-ui/rect': 1.1.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.14)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.14)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-slot@1.2.3(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.15)(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.15)(react@19.1.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.15)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.14)(react@19.1.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.9(@types/react@19.1.14))(@types/react@19.1.14)(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.9(@types/react@19.1.15))(@types/react@19.1.15)(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.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) '@radix-ui/rect@1.1.1': {} @@ -6067,7 +6117,7 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/core@3.12.0': + '@smithy/core@3.13.0': dependencies: '@smithy/middleware-serde': 4.1.1 '@smithy/protocol-http': 5.2.1 @@ -6171,9 +6221,9 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.2.4': + '@smithy/middleware-endpoint@4.2.5': dependencies: - '@smithy/core': 3.12.0 + '@smithy/core': 3.13.0 '@smithy/middleware-serde': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/shared-ini-file-loader': 4.2.0 @@ -6182,12 +6232,12 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.3.0': + '@smithy/middleware-retry@4.3.1': dependencies: '@smithy/node-config-provider': 4.2.2 '@smithy/protocol-http': 5.2.1 '@smithy/service-error-classification': 4.1.2 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -6261,10 +6311,10 @@ snapshots: '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/smithy-client@4.6.4': + '@smithy/smithy-client@4.6.5': dependencies: - '@smithy/core': 3.12.0 - '@smithy/middleware-endpoint': 4.2.4 + '@smithy/core': 3.13.0 + '@smithy/middleware-endpoint': 4.2.5 '@smithy/middleware-stack': 4.1.1 '@smithy/protocol-http': 5.2.1 '@smithy/types': 4.5.0 @@ -6309,21 +6359,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.1.4': + '@smithy/util-defaults-mode-browser@4.1.5': dependencies: '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.1.4': + '@smithy/util-defaults-mode-node@4.1.5': dependencies: '@smithy/config-resolver': 4.2.2 '@smithy/credential-provider-imds': 4.1.2 '@smithy/node-config-provider': 4.2.2 '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.4 + '@smithy/smithy-client': 4.6.5 '@smithy/types': 4.5.0 tslib: 2.8.1 @@ -6491,15 +6541,15 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 - '@types/react-dom': 19.1.9(@types/react@19.1.14) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) '@tsconfig/node10@1.0.11': {} @@ -6560,7 +6610,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.6.0 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -6568,23 +6618,23 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@24.5.2': + '@types/node@24.6.0': dependencies: - undici-types: 7.12.0 + undici-types: 7.13.0 '@types/pg@8.15.5': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.6.0 pg-protocol: 1.10.3 pg-types: 2.2.0 '@types/piexifjs@1.0.0': {} - '@types/react-dom@19.1.9(@types/react@19.1.14)': + '@types/react-dom@19.1.9(@types/react@19.1.15)': dependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - '@types/react@19.1.14': + '@types/react@19.1.15': dependencies: csstype: 3.1.3 @@ -6801,9 +6851,9 @@ snapshots: agent-base@7.1.4: {} - ai@5.0.56(zod@4.1.11): + ai@5.0.59(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 1.0.30(zod@4.1.11) + '@ai-sdk/gateway': 1.0.32(zod@4.1.11) '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) '@opentelemetry/api': 1.9.0 @@ -6938,13 +6988,13 @@ snapshots: axobject-query@4.1.0: {} - babel-jest@30.1.2(@babel/core@7.28.4): + babel-jest@30.2.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 - '@jest/transform': 30.1.2 + '@jest/transform': 30.2.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.0.1(@babel/core@7.28.4) + babel-preset-jest: 30.2.0(@babel/core@7.28.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -6961,10 +7011,8 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@30.0.1: + babel-plugin-jest-hoist@30.2.0: dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): @@ -6986,10 +7034,10 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) - babel-preset-jest@30.0.1(@babel/core@7.28.4): + babel-preset-jest@30.2.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 - babel-plugin-jest-hoist: 30.0.1 + babel-plugin-jest-hoist: 30.2.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) balanced-match@1.0.2: {} @@ -7084,12 +7132,12 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + cmdk@1.1.1(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.14)(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(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.15)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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: @@ -7602,6 +7650,15 @@ snapshots: jest-mock: 30.0.5 jest-util: 30.0.5 + expect@30.2.0: + dependencies: + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + extract-colors@4.2.1: {} fast-average-color@9.5.0: {} @@ -8049,31 +8106,31 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-changed-files@30.0.5: + jest-changed-files@30.2.0: dependencies: execa: 5.1.1 - jest-util: 30.0.5 + jest-util: 30.2.0 p-limit: 3.1.0 - jest-circus@30.1.3: + jest-circus@30.2.0: dependencies: - '@jest/environment': 30.1.2 - '@jest/expect': 30.1.2 - '@jest/test-result': 30.1.3 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.6.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.0 is-generator-fn: 2.1.0 - jest-each: 30.1.0 - jest-matcher-utils: 30.1.2 - jest-message-util: 30.1.0 - jest-runtime: 30.1.3 - jest-snapshot: 30.1.2 - jest-util: 30.0.5 + jest-each: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 p-limit: 3.1.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -8081,17 +8138,17 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)): + jest-cli@30.2.0(@types/node@24.6.0)(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)): dependencies: - '@jest/core': 30.1.3(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) - '@jest/test-result': 30.1.3 - '@jest/types': 30.0.5 + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)) + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) - jest-util: 30.0.5 - jest-validate: 30.1.0 + jest-config: 30.2.0(@types/node@24.6.0)(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)) + jest-util: 30.2.0 + jest-validate: 30.2.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -8100,35 +8157,35 @@ snapshots: - supports-color - ts-node - jest-config@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)): + jest-config@30.2.0(@types/node@24.6.0)(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)): dependencies: '@babel/core': 7.28.4 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.1.3 - '@jest/types': 30.0.5 - babel-jest: 30.1.2(@babel/core@7.28.4) + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.4) chalk: 4.1.2 ci-info: 4.3.0 deepmerge: 4.3.1 glob: 10.4.5 graceful-fs: 4.2.11 - jest-circus: 30.1.3 - jest-docblock: 30.0.1 - jest-environment-node: 30.1.2 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 jest-regex-util: 30.0.1 - jest-resolve: 30.1.3 - jest-runner: 30.1.3 - jest-util: 30.0.5 - jest-validate: 30.1.0 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 micromatch: 4.0.8 parse-json: 5.2.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 24.5.2 - ts-node: 10.9.2(@types/node@24.5.2)(typescript@5.9.2) + '@types/node': 24.6.0 + ts-node: 10.9.2(@types/node@24.6.0)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -8140,59 +8197,66 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.5 - jest-docblock@30.0.1: + jest-diff@30.2.0: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.2.0 + + jest-docblock@30.2.0: dependencies: detect-newline: 3.1.0 - jest-each@30.1.0: + jest-each@30.2.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 chalk: 4.1.2 - jest-util: 30.0.5 - pretty-format: 30.0.5 + jest-util: 30.2.0 + pretty-format: 30.2.0 - jest-environment-jsdom@30.1.2: + jest-environment-jsdom@30.2.0: dependencies: - '@jest/environment': 30.1.2 - '@jest/environment-jsdom-abstract': 30.1.2(jsdom@26.1.0) + '@jest/environment': 30.2.0 + '@jest/environment-jsdom-abstract': 30.2.0(jsdom@26.1.0) '@types/jsdom': 21.1.7 - '@types/node': 24.5.2 + '@types/node': 24.6.0 jsdom: 26.1.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - jest-environment-node@30.1.2: + jest-environment-node@30.2.0: dependencies: - '@jest/environment': 30.1.2 - '@jest/fake-timers': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 - jest-mock: 30.0.5 - jest-util: 30.0.5 - jest-validate: 30.1.0 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.6.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 - jest-haste-map@30.1.0: + jest-haste-map@30.2.0: dependencies: - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/types': 30.2.0 + '@types/node': 24.6.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.5 - jest-worker: 30.1.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@30.1.0: + jest-leak-detector@30.2.0: dependencies: '@jest/get-type': 30.1.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 jest-matcher-utils@30.1.2: dependencies: @@ -8201,6 +8265,13 @@ snapshots: jest-diff: 30.1.2 pretty-format: 30.0.5 + jest-matcher-utils@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 + jest-message-util@30.1.0: dependencies: '@babel/code-frame': 7.27.1 @@ -8213,111 +8284,129 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@30.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.2.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@types/node': 24.6.0 jest-util: 30.0.5 - jest-pnp-resolver@1.2.3(jest-resolve@30.1.3): + jest-mock@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.6.0 + jest-util: 30.2.0 + + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): optionalDependencies: - jest-resolve: 30.1.3 + jest-resolve: 30.2.0 jest-regex-util@30.0.1: {} - jest-resolve-dependencies@30.1.3: + jest-resolve-dependencies@30.2.0: dependencies: jest-regex-util: 30.0.1 - jest-snapshot: 30.1.2 + jest-snapshot: 30.2.0 transitivePeerDependencies: - supports-color - jest-resolve@30.1.3: + jest-resolve@30.2.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.1.0 - jest-pnp-resolver: 1.2.3(jest-resolve@30.1.3) - jest-util: 30.0.5 - jest-validate: 30.1.0 + jest-haste-map: 30.2.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) + jest-util: 30.2.0 + jest-validate: 30.2.0 slash: 3.0.0 unrs-resolver: 1.11.1 - jest-runner@30.1.3: + jest-runner@30.2.0: dependencies: - '@jest/console': 30.1.2 - '@jest/environment': 30.1.2 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.6.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.1.2 - jest-haste-map: 30.1.0 - jest-leak-detector: 30.1.0 - jest-message-util: 30.1.0 - jest-resolve: 30.1.3 - jest-runtime: 30.1.3 - jest-util: 30.0.5 - jest-watcher: 30.1.3 - jest-worker: 30.1.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-haste-map: 30.2.0 + jest-leak-detector: 30.2.0 + jest-message-util: 30.2.0 + jest-resolve: 30.2.0 + jest-runtime: 30.2.0 + jest-util: 30.2.0 + jest-watcher: 30.2.0 + jest-worker: 30.2.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.1.3: + jest-runtime@30.2.0: dependencies: - '@jest/environment': 30.1.2 - '@jest/fake-timers': 30.1.2 - '@jest/globals': 30.1.2 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 '@jest/source-map': 30.0.1 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.6.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.1.0 - jest-message-util: 30.1.0 - jest-mock: 30.0.5 + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 jest-regex-util: 30.0.1 - jest-resolve: 30.1.3 - jest-snapshot: 30.1.2 - jest-util: 30.0.5 + jest-resolve: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.1.2: + jest-snapshot@30.2.0: dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) '@babel/types': 7.28.4 - '@jest/expect-utils': 30.1.2 + '@jest/expect-utils': 30.2.0 '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.1.2 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) chalk: 4.1.2 - expect: 30.1.2 + expect: 30.2.0 graceful-fs: 4.2.11 - jest-diff: 30.1.2 - jest-matcher-utils: 30.1.2 - jest-message-util: 30.1.0 - jest-util: 30.0.5 - pretty-format: 30.0.5 + jest-diff: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 semver: 7.7.2 synckit: 0.11.11 transitivePeerDependencies: @@ -8326,46 +8415,55 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@types/node': 24.6.0 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 picomatch: 4.0.3 - jest-validate@30.1.0: + jest-util@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.6.0 + chalk: 4.1.2 + ci-info: 4.3.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jest-validate@30.2.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 - jest-watcher@30.1.3: + jest-watcher@30.2.0: dependencies: - '@jest/test-result': 30.1.3 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.6.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.0.5 + jest-util: 30.2.0 string-length: 4.0.2 - jest-worker@30.1.0: + jest-worker@30.2.0: dependencies: - '@types/node': 24.5.2 + '@types/node': 24.6.0 '@ungap/structured-clone': 1.3.0 - jest-util: 30.0.5 + jest-util: 30.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)): + jest@30.2.0(@types/node@24.6.0)(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)): dependencies: - '@jest/core': 30.1.3(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) - '@jest/types': 30.0.5 + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)) + '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2)) + jest-cli: 30.2.0(@types/node@24.6.0)(ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8862,6 +8960,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -8891,32 +8995,32 @@ snapshots: react-is@18.3.1: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.14)(react@19.1.1): + react-remove-scroll-bar@2.3.8(@types/react@19.1.15)(react@19.1.1): dependencies: react: 19.1.1 - react-style-singleton: 2.2.3(@types/react@19.1.14)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.15)(react@19.1.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - react-remove-scroll@2.7.1(@types/react@19.1.14)(react@19.1.1): + react-remove-scroll@2.7.1(@types/react@19.1.15)(react@19.1.1): dependencies: react: 19.1.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.14)(react@19.1.1) - react-style-singleton: 2.2.3(@types/react@19.1.14)(react@19.1.1) + react-remove-scroll-bar: 2.3.8(@types/react@19.1.15)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.15)(react@19.1.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.14)(react@19.1.1) - use-sidecar: 1.1.3(@types/react@19.1.14)(react@19.1.1) + use-callback-ref: 1.3.3(@types/react@19.1.15)(react@19.1.1) + use-sidecar: 1.1.3(@types/react@19.1.15)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 - react-style-singleton@2.2.3(@types/react@19.1.14)(react@19.1.1): + react-style-singleton@2.2.3(@types/react@19.1.15)(react@19.1.1): dependencies: get-nonce: 1.0.1 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 react@19.1.1: {} @@ -9323,14 +9427,14 @@ snapshots: dependencies: sax: 1.2.4 - ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2): + ts-node@10.9.2(@types/node@24.6.0)(typescript@5.9.2): 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.5.2 + '@types/node': 24.6.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -9404,7 +9508,7 @@ snapshots: uncrypto@0.1.3: {} - undici-types@7.12.0: {} + undici-types@7.13.0: {} undici@5.29.0: dependencies: @@ -9444,24 +9548,24 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.1.14)(react@19.1.1): + use-callback-ref@1.3.3(@types/react@19.1.15)(react@19.1.1): dependencies: react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 use-debounce@10.0.6(react@19.1.1): dependencies: react: 19.1.1 - use-sidecar@1.1.3(@types/react@19.1.14)(react@19.1.1): + use-sidecar@1.1.3(@types/react@19.1.15)(react@19.1.1): dependencies: detect-node-es: 1.1.0 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.14 + '@types/react': 19.1.15 use-sync-external-store@1.5.0(react@19.1.1): dependencies: diff --git a/src/admin/SignInOrUploadClient.tsx b/src/admin/SignInOrUploadClient.tsx index 2ff05ebf..a407f661 100644 --- a/src/admin/SignInOrUploadClient.tsx +++ b/src/admin/SignInOrUploadClient.tsx @@ -24,7 +24,7 @@ export default function SignInOrUploadClient({ )}>
{isCheckingAuth - ? appText.misc.loading + ? appText.utility.loading : isUserSignedIn ? appText.onboarding.setupFirstPhoto : appText.onboarding.setupSignIn} diff --git a/src/admin/config/AdminAppConfigurationClient.tsx b/src/admin/config/AdminAppConfigurationClient.tsx index 4cbfd9c4..a5230a28 100644 --- a/src/admin/config/AdminAppConfigurationClient.tsx +++ b/src/admin/config/AdminAppConfigurationClient.tsx @@ -88,6 +88,7 @@ export default function AdminAppConfigurationClient({ // Categories hasCategoryVisibility, categoryVisibility, + showCategoriesOnMobile, showCategoryImageHover, collapseSidebarCategories, hideTagsWithOnePhoto, @@ -613,6 +614,19 @@ export default function AdminAppConfigurationClient({
{renderEnvVars(['NEXT_PUBLIC_CATEGORY_VISIBILITY'])} + +
+
+ Set environment variable to {'"1"'} to prevent categories + displaying on mobile grid view: + {renderEnvVars(['NEXT_PUBLIC_HIDE_CATEGORIES_ON_MOBILE'])} +
+
+
({ + hasFavs: tagsHaveFavs(tags), + hasRecents: SHOW_RECENTS && recents.length > 0, + albums: SHOW_ALBUMS ? albums.slice(0, MAX_ALBUM_TAG_COUNT) : [], + tags: SHOW_TAGS ? getTopNonFavTags(tags).slice(0, MAX_ALBUM_TAG_COUNT) : [], + recipe: SHOW_RECIPES ? recipes[0]?.recipe : undefined, + film: SHOW_FILMS ? films[0]?.film : undefined, + focal: SHOW_FOCAL_LENGTHS ? focalLengths[0]?.focal : undefined, + camera: SHOW_CAMERAS ? cameras[0]?.camera : undefined, + lens: SHOW_LENSES ? lenses[0]?.lens : undefined, +}); + +export const hasEnoughTopEntities = (categories: PhotoSetCategories) => { + const entityCount = Object.values(getTopEntities(categories)) + .reduce((acc, entity) => { + if (Array.isArray(entity)) { + return acc + entity.length; + } else { + return Boolean(entity) ? acc + 1 : acc; + } + }, 0); + + return entityCount > MINIMUM_TOP_ENTITIES; +}; diff --git a/src/category/useCategoryCounts.ts b/src/category/useCategoryCounts.ts index d6f65ee9..8c92b0b8 100644 --- a/src/category/useCategoryCounts.ts +++ b/src/category/useCategoryCounts.ts @@ -7,7 +7,7 @@ import { Album } from '@/album'; export default function useCategoryCounts() { const { categoriesWithCounts } = useAppState(); - const recentsCount = categoriesWithCounts?.recents[0] ?? 0; + const recentsCount = categoriesWithCounts?.recents?.count ?? 0; const getYearsCount = useCallback((year: string) => { const yearCounts = categoriesWithCounts?.years ?? {}; diff --git a/src/cmdk/CommandKClient.tsx b/src/cmdk/CommandKClient.tsx index 75b80ad6..09ffbc83 100644 --- a/src/cmdk/CommandKClient.tsx +++ b/src/cmdk/CommandKClient.tsx @@ -764,12 +764,11 @@ export default function CommandKClient({ ? - : + : {queryLiveRaw ? - : 'ESC'} + : <> + + + + + ESC + + } } diff --git a/src/components/Badge.tsx b/src/components/Badge.tsx index 12ad3882..6439e650 100644 --- a/src/components/Badge.tsx +++ b/src/components/Badge.tsx @@ -11,7 +11,7 @@ export default function Badge({ }: { children: React.ReactNode className?: string - type?: 'large' | 'small' | 'text-only' + type?: 'large' | 'medium' | 'small' |'text-only' dimContent?: boolean contrast?: 'low' | 'medium' | 'high' | 'frosted' uppercase?: boolean @@ -27,14 +27,19 @@ export default function Badge({ 'border border-medium', ); case 'small': + case 'medium': return clsx( - 'px-[5px] h-[17px] md:h-[18px]', - 'text-[0.7rem] font-medium rounded-md', + type === 'small' + ? 'px-[5px] h-[17px] md:h-[18px]' + : 'px-2 h-6.5', + type === 'small' + ? 'text-[0.7rem] font-medium rounded-md' + : 'text-[0.9rem] rounded-lg', contrast === 'high' ? 'text-invert bg-invert' : contrast === 'frosted' ? 'text-black bg-neutral-100/30 border border-neutral-200/40' - : 'text-medium bg-gray-300/30 dark:bg-gray-700/50', + : 'text-medium-dark bg-gray-300/30 dark:bg-gray-700/50', interactive && (contrast === 'high' ? 'hover:opacity-70' : contrast === 'frosted' @@ -53,7 +58,8 @@ export default function Badge({ 'max-w-full', 'inline-flex items-center', stylesForType(), - uppercase && 'uppercase tracking-wider', + uppercase && 'uppercase', + uppercase && type !== 'medium' && 'tracking-wider', className, )}> { navigator.clipboard.writeText(text); - toastSuccess(appText.misc.copyPhrase(label)); + toastSuccess(appText.utility.copyPhrase(label)); } : undefined} styleAs="link" diff --git a/src/components/HeaderList.tsx b/src/components/HeaderList.tsx index 61723dba..e80e69a5 100644 --- a/src/components/HeaderList.tsx +++ b/src/components/HeaderList.tsx @@ -6,6 +6,7 @@ import { ReactNode, useState } from 'react'; import LoaderButton from './primitives/LoaderButton'; import { IoChevronDownOutline, IoChevronUpOutline } from 'react-icons/io5'; import { COLLAPSE_SIDEBAR_CATEGORIES } from '@/app/config'; +import { useAppText } from '@/i18n/state/client'; export default function HeaderList({ title, @@ -20,6 +21,8 @@ export default function HeaderList({ items: ReactNode[], maxItems?: number, }) { + const { utility } = useAppText(); + const [isExpanded, setIsExpanded] = useState(false); const hasItemsToExpand = @@ -70,11 +73,11 @@ export default function HeaderList({ 'group', )} > - { + { {isExpanded - ? 'LESS' + ? utility.less : <> - MORE + {utility.more} {' '} {items.length - maxItems} diff --git a/src/components/RepoLink.tsx b/src/components/RepoLink.tsx index 4c758901..fe1337d6 100644 --- a/src/components/RepoLink.tsx +++ b/src/components/RepoLink.tsx @@ -5,11 +5,12 @@ import Link from 'next/link'; import { BiLogoGithub } from 'react-icons/bi'; export default function RepoLink() { - const appText = useAppText(); + const { footer } = useAppText(); + return ( - {appText.misc.repo} + {footer.madeWith} type?: LabeledIconType badged?: boolean + badgeType?: ComponentProps['type'] contrast?: ComponentProps['contrast'] uppercase?: boolean prefetch?: boolean @@ -38,6 +39,7 @@ export default function EntityLink({ iconWide, type, badged, + badgeType = 'small', contrast = 'medium', path = '', // Make link optional for debugging purposes hoverCount = 0, @@ -70,7 +72,11 @@ export default function EntityLink({ } & EntityLinkExternalProps) { const [isLoading, setIsLoading] = useState(false); - const hasBadgeIcon = Boolean(iconBadgeStart || iconBadgeEnd); + const hasBadgeIcon = Boolean( + iconBadgeStart || + iconBadgeEnd || + badgeType === 'medium', + ); const classForContrast = () => { switch (contrast) { @@ -121,10 +127,12 @@ export default function EntityLink({ setIsLoading={setIsLoading} > {badged && !useForHover ? - {iconBadgeStart} + {badgeType === 'medium' && + {icon}} + {badgeType !== 'medium' && iconBadgeStart} {renderLabel} - {iconBadgeEnd} + {badgeType !== 'medium' && iconBadgeEnd} : diff --git a/src/components/useMaskedScroll.ts b/src/components/useMaskedScroll.ts index dfabf940..7c68ef64 100644 --- a/src/components/useMaskedScroll.ts +++ b/src/components/useMaskedScroll.ts @@ -15,7 +15,7 @@ export default function useMaskedScroll({ ref: containerRef, direction = 'vertical', fadeSize = 24, - animationDuration = 0.3, + animationDuration = 0.2, setMaxSize = true, hideScrollbar = true, // Disable when calling 'updateMask' explicitly diff --git a/src/components/useNavigateOrRunActionWithToast.tsx b/src/components/useNavigateOrRunActionWithToast.tsx index bed227d4..560f69cb 100644 --- a/src/components/useNavigateOrRunActionWithToast.tsx +++ b/src/components/useNavigateOrRunActionWithToast.tsx @@ -18,7 +18,7 @@ export default function useNavigateOrRunActionWithToast({ const appText = useAppText(); - const toastMessage = _toastMessage ?? appText.misc.loading; + const toastMessage = _toastMessage ?? appText.utility.loading; const toastId = useRef(undefined); diff --git a/src/i18n/locales/bd-bn.ts b/src/i18n/locales/bd-bn.ts index 91cec452..033b9749 100644 --- a/src/i18n/locales/bd-bn.ts +++ b/src/i18n/locales/bd-bn.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: 'পরবর্তী', nextShort: 'পরবর্তী', }, + footer: { + madeWith: 'তৈরি হয়েছে', + }, sort: { sort: 'সাজান', newest: 'নতুনতম', @@ -142,14 +145,15 @@ export const TEXT: I18N = { // eslint-disable-next-line max-len setupConfig: 'পরিবেশ ভেরিয়েবল সম্পাদনা করে সাইটের নাম এবং অন্যান্য কনফিগারেশন পরিবর্তন করুন', }, - misc: { + utility: { + more: 'আরো', + less: 'কম', + loadMore: 'আরো লোড করুন', loading: 'লোড হচ্ছে ...', + tryAgain: 'আবার চেষ্টা করুন', finishing: 'সম্পন্ন হচ্ছে ...', uploading: 'আপলোড হচ্ছে', - repo: 'তৈরি হয়েছে', copyPhrase: '{{label}} কপি হয়েছে', - }, - utility: { paginate: '{{index}} / {{count}}', paginateAction: '{{action}} - {{index}} / {{count}}', }, diff --git a/src/i18n/locales/en-gb.ts b/src/i18n/locales/en-gb.ts index 147f2d81..83e43b40 100644 --- a/src/i18n/locales/en-gb.ts +++ b/src/i18n/locales/en-gb.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: 'Next', nextShort: 'Next', }, + footer: { + madeWith: 'Made with', + }, sort: { sort: 'Sort', newest: 'Newest', @@ -142,14 +145,15 @@ export const TEXT: I18N = { // eslint-disable-next-line max-len setupConfig: 'Change the site name and other configuration by editing environment variables referenced in', }, - misc: { + utility: { + more: 'More', + less: 'Less', + loadMore: 'Load More', loading: 'Loading ...', + tryAgain: 'Try Again', finishing: 'Finishing ...', uploading: 'Uploading', - repo: 'Made with', copyPhrase: '{{label}} copied', - }, - utility: { paginate: '{{index}} of {{count}}', paginateAction: '{{action}} {{index}} of {{count}}', }, diff --git a/src/i18n/locales/en-us.ts b/src/i18n/locales/en-us.ts index 52205688..b204d945 100644 --- a/src/i18n/locales/en-us.ts +++ b/src/i18n/locales/en-us.ts @@ -54,6 +54,9 @@ export const TEXT = { next: 'Next', nextShort: 'Next', }, + footer: { + madeWith: 'Made with', + }, sort: { sort: 'Sort', newest: 'Newest', @@ -141,14 +144,15 @@ export const TEXT = { // eslint-disable-next-line max-len setupConfig: 'Change the site name and other configuration by editing environment variables referenced in', }, - misc: { + utility: { + more: 'More', + less: 'Less', + loadMore: 'Load More', loading: 'Loading ...', + tryAgain: 'Try Again', finishing: 'Finishing ...', uploading: 'Uploading', - repo: 'Made with', copyPhrase: '{{label}} copied', - }, - utility: { paginate: '{{index}} of {{count}}', paginateAction: '{{action}} {{index}} of {{count}}', }, diff --git a/src/i18n/locales/hi-in.ts b/src/i18n/locales/hi-in.ts index 1f890ff8..8d0b670b 100644 --- a/src/i18n/locales/hi-in.ts +++ b/src/i18n/locales/hi-in.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: 'अगला', nextShort: 'अगला', }, + footer: { + madeWith: 'निर्मित', + }, sort: { sort: 'क्रमबद्ध करें', newest: 'नवीनतम', @@ -143,14 +146,15 @@ export const TEXT: I18N = { // eslint-disable-next-line max-len setupConfig: 'साइट का नाम और अन्य कॉन्फ़िगरेशन बदलने के लिए पर्यावरण चर संपादित करें', }, - misc: { + utility: { + more: 'और', + less: 'कम', + loadMore: 'और लोड करें', loading: 'लोड हो रहा है...', + tryAgain: 'फिर से कोशिश करें', finishing: 'समाप्त कर रहे हैं...', uploading: 'अपलोड हो रहा है', - repo: 'निर्मित', copyPhrase: '{{label}} कॉपी किया गया', - }, - utility: { paginate: '{{index}} / {{count}}', paginateAction: '{{action}} - {{index}} / {{count}}', }, diff --git a/src/i18n/locales/id-id.ts b/src/i18n/locales/id-id.ts index fdbf880c..ca6284fa 100644 --- a/src/i18n/locales/id-id.ts +++ b/src/i18n/locales/id-id.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: 'Berikutnya', nextShort: 'Brkt', }, + footer: { + madeWith: 'Dibuat dengan', + }, sort: { sort: 'Urutkan', newest: 'Terbaru', @@ -141,14 +144,15 @@ export const TEXT: I18N = { setupFirstPhoto: 'Tambahkan foto pertama Anda', setupConfig: 'Ubah nama situs dan pengaturan lewat file environment', }, - misc: { + utility: { + more: 'Lebih banyak', + less: 'Lebih sedikit', + loadMore: 'Muat Lebih Banyak', loading: 'Memuat ...', + tryAgain: 'Coba Lagi', finishing: 'Menyelesaikan ...', uploading: 'Mengunggah', - repo: 'Dibuat dengan', copyPhrase: '{{label}} disalin', - }, - utility: { paginate: '{{index}} dari {{count}}', paginateAction: '{{action}} {{index}} dari {{count}}', }, diff --git a/src/i18n/locales/pt-br.ts b/src/i18n/locales/pt-br.ts index 215bd95d..35e1156e 100644 --- a/src/i18n/locales/pt-br.ts +++ b/src/i18n/locales/pt-br.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: 'Próximo', nextShort: 'Próx', }, + footer: { + madeWith: 'Feito com', + }, sort: { sort: 'Ordenar', newest: 'Mais recentes', @@ -142,14 +145,15 @@ export const TEXT: I18N = { // eslint-disable-next-line max-len setupConfig: 'Altere o nome do site e outras configurações editando as variáveis de ambiente referenciadas em', }, - misc: { + utility: { + more: 'Mais', + less: 'Menos', + loadMore: 'Carregar Mais', loading: 'Carregando ...', + tryAgain: 'Tentar Novamente', finishing: 'Finalizando ...', uploading: 'Enviando', - repo: 'Feito com', copyPhrase: '{{label}} copiado', - }, - utility: { paginate: '{{index}} de {{count}}', paginateAction: '{{action}} {{index}} de {{count}}', }, diff --git a/src/i18n/locales/pt-pt.ts b/src/i18n/locales/pt-pt.ts index 9f3c514b..7b7da319 100644 --- a/src/i18n/locales/pt-pt.ts +++ b/src/i18n/locales/pt-pt.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: 'Próximo', nextShort: 'Próx', }, + footer: { + madeWith: 'Feito com', + }, sort: { sort: 'Ordenar', newest: 'Mais recentes', @@ -142,14 +145,15 @@ export const TEXT: I18N = { // eslint-disable-next-line max-len setupConfig: 'Altere o nome do sítio e outras configurações ao editar as variáveis de ambiente referenciadas em', }, - misc: { + utility: { + more: 'Mais', + less: 'Menos', + loadMore: 'Carregar Mais', loading: 'A carregar ...', + tryAgain: 'Tentar Novamente', finishing: 'A finalizar ...', uploading: 'A enviar', - repo: 'Feito com', copyPhrase: '{{label}} copiado', - }, - utility: { paginate: '{{index}} de {{count}}', paginateAction: '{{action}} {{index}} de {{count}}', }, diff --git a/src/i18n/locales/tr-tr.ts b/src/i18n/locales/tr-tr.ts index b27a8ba0..5d6d84a8 100644 --- a/src/i18n/locales/tr-tr.ts +++ b/src/i18n/locales/tr-tr.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: 'Sonraki', nextShort: 'Sonraki', }, + footer: { + madeWith: 'Hazırlayan:', + }, sort: { sort: 'Sırala', newest: 'En Yeni', @@ -143,14 +146,15 @@ export const TEXT: I18N = { // eslint-disable-next-line max-len setupConfig: 'Site adını ve diğer ayarları değiştirmek için şu ortam değişkenlerini düzenleyin:', }, - misc: { + utility: { + more: 'Daha fazla', + less: 'Daha az', + loadMore: 'Daha Fazla Yükle', loading: 'Yükleniyor ...', + tryAgain: 'Tekrar Dene', finishing: 'Tamamlanıyor ...', uploading: 'Yükleniyor', - repo: 'Hazırlayan:', copyPhrase: '{{label}} kopyalandı', - }, - utility: { paginate: '{{count}} fotoğrafın {{index}}.si', paginateAction: '{{action}} - {{count}} fotoğrafın {{index}}.si', }, diff --git a/src/i18n/locales/zh-cn.ts b/src/i18n/locales/zh-cn.ts index 17a4e501..b3bf488d 100644 --- a/src/i18n/locales/zh-cn.ts +++ b/src/i18n/locales/zh-cn.ts @@ -55,6 +55,9 @@ export const TEXT: I18N = { next: '下一页', nextShort: '下一页', }, + footer: { + madeWith: '基于', + }, sort: { sort: '排序', newest: '最新', @@ -141,14 +144,15 @@ export const TEXT: I18N = { setupFirstPhoto: '添加您的第一张照片', setupConfig: '通过编辑环境变量来更改站点名称和其他配置', }, - misc: { + utility: { + more: '更多', + less: '更少', + loadMore: '加载更多', loading: '加载中...', + tryAgain: '重试', finishing: '完成中...', uploading: '上传中', - repo: '基于', copyPhrase: '{{label}} 已复制', - }, - utility: { paginate: '第 {{index}} 页,共 {{count}} 页', paginateAction: '{{action}} 第 {{index}} 页,共 {{count}} 页', }, diff --git a/src/i18n/state/index.ts b/src/i18n/state/index.ts index 2663ee7b..2bb2000e 100644 --- a/src/i18n/state/index.ts +++ b/src/i18n/state/index.ts @@ -33,13 +33,10 @@ export const generateAppTextState = (i18n: I18N) => { deleteConfirm: (photoTitle: string) => i18n.admin.deleteConfirm.replace('{{photoTitle}}', photoTitle), }, - misc: { - ...i18n.misc, - copyPhrase: (label: string) => - i18n.misc.copyPhrase.replace('{{label}}', label), - }, utility: { ...i18n.utility, + copyPhrase: (label: string) => + i18n.utility.copyPhrase.replace('{{label}}', label), paginate: (index: number, count: number) => i18n.utility.paginate .replace('{{index}}', index.toString()) diff --git a/src/photo/InfinitePhotoScroll.tsx b/src/photo/InfinitePhotoScroll.tsx index a7fbf5de..fa8678dc 100644 --- a/src/photo/InfinitePhotoScroll.tsx +++ b/src/photo/InfinitePhotoScroll.tsx @@ -19,6 +19,7 @@ import useVisibility from '@/utility/useVisibility'; import { ADMIN_DB_OPTIMIZE_ENABLED } from '@/app/config'; import { SortBy } from './sort'; import { SWR_KEYS } from '@/swr'; +import { useAppText } from '@/i18n/state/client'; const SIZE_KEY_SEPARATOR = '__'; const getSizeFromKey = (key: string) => @@ -63,6 +64,8 @@ export default function InfinitePhotoScroll({ }) => ReactNode } & PhotoSetCategory) { const { isUserSignedIn } = useAppState(); + + const { utility } = useAppText(); const keyGenerator = useCallback( (size: number, prev: Photo[]) => prev && prev.length === 0 @@ -168,10 +171,10 @@ export default function InfinitePhotoScroll({ )} > {error - ? 'Try Again' + ? utility.tryAgain : isLoadingOrValidating ? - : 'Load More'} + : utility.loadMore} ; diff --git a/src/photo/PhotoGridContainer.tsx b/src/photo/PhotoGridContainer.tsx index 831d613d..ce3be8c5 100644 --- a/src/photo/PhotoGridContainer.tsx +++ b/src/photo/PhotoGridContainer.tsx @@ -19,6 +19,7 @@ export default function PhotoGridContainer({ animateOnFirstLoadOnly, header, sidebar, + className, ...categories }: { cacheKey: string @@ -28,6 +29,7 @@ export default function PhotoGridContainer({ excludeFromFeeds?: boolean header?: ReactNode sidebar?: ReactNode + className?: string } & ComponentProps) { const [ shouldAnimateDynamicItems, @@ -40,6 +42,7 @@ export default function PhotoGridContainer({ {header && + SHOW_CATEGORIES_ON_MOBILE && hasEnoughTopEntities(categories), + [categories]); + return ( - - - - } - /> +
+ {shouldShowTopEntities && + + +
, + ]} />} + + + + } + /> + ); } diff --git a/src/photo/PhotoGridSidebar.tsx b/src/photo/PhotoGridSidebar.tsx index e096ea0f..db2200a3 100644 --- a/src/photo/PhotoGridSidebar.tsx +++ b/src/photo/PhotoGridSidebar.tsx @@ -50,12 +50,14 @@ export default function PhotoGridSidebar({ containerHeight, aboutTextSafelyParsedHtml, aboutTextHasBrParagraphBreaks, + className, ..._categories }: PhotoSetCategories & { photosCount: number containerHeight?: number aboutTextSafelyParsedHtml?: string aboutTextHasBrParagraphBreaks?: boolean + className?: string }) { const categories = useMemo(() => HIDE_TAGS_WITH_ONE_PHOTO ? { @@ -327,7 +329,7 @@ export default function PhotoGridSidebar({ : null; return ( -
+
{aboutTextSafelyParsedHtml && +{countNotShown}
-
More
+
{utility.more}
: undefined} small diff --git a/src/photo/PhotoUploadWithStatus.tsx b/src/photo/PhotoUploadWithStatus.tsx index 4003ee2a..e4d88550 100644 --- a/src/photo/PhotoUploadWithStatus.tsx +++ b/src/photo/PhotoUploadWithStatus.tsx @@ -167,19 +167,19 @@ export default function PhotoUploadWithStatus({ {isUploading ? isFinishing ? <> - {appText.misc.finishing} + {appText.utility.finishing} : <> {!showButton && uploadStatusText ? <> - {appText.misc.uploading} {uploadStatusText} + {appText.utility.uploading} {uploadStatusText} {': '} {fileUploadName} : - {appText.misc.uploading} {fileUploadName} + {appText.utility.uploading} {fileUploadName} } : !showButton && <>Initializing} diff --git a/src/photo/TopPhotoEntities.tsx b/src/photo/TopPhotoEntities.tsx new file mode 100644 index 00000000..1723bb8c --- /dev/null +++ b/src/photo/TopPhotoEntities.tsx @@ -0,0 +1,136 @@ +import PhotoCamera from '@/camera/PhotoCamera'; +import { PhotoSetCategories } from '@/category'; +import MaskedScroll from '@/components/MaskedScroll'; +import PhotoAlbum from '@/album/PhotoAlbum'; +import PhotoTag from '@/tag/PhotoTag'; +import PhotoFavs from '@/tag/PhotoFavs'; +import clsx from 'clsx'; +import { CATEGORY_VISIBILITY } from '@/app/config'; +import PhotoRecents from '@/recents/PhotoRecents'; +import PhotoFilm from '@/film/PhotoFilm'; +import PhotoFocalLength from '@/focal/PhotoFocalLength'; +import PhotoLens from '@/lens/PhotoLens'; +import PhotoRecipe from '@/recipe/PhotoRecipe'; +import LoaderButton from '@/components/primitives/LoaderButton'; +import { useAppState } from '@/app/AppState'; +import { ComponentProps, useMemo } from 'react'; +import EntityLink from '@/components/entity/EntityLink'; +import { useAppText } from '@/i18n/state/client'; +import { getTopEntities } from '@/category/mobile'; +import { BiExpandVertical } from 'react-icons/bi'; + +const ENTITY_LINK_PROPS: Partial> = { + badged: true, + badgeType: 'medium', + truncate: false, + suppressSpinner: true, +}; + +export default function TopPhotoEntities({ + className, + ...categories +}: PhotoSetCategories & { + className?: string +}) { + const { setIsCommandKOpen } = useAppState(); + + const { utility } = useAppText(); + + const { + hasFavs, + hasRecents, + albums, + tags, + camera, + lens, + recipe, + film, + focal, + } = useMemo(() => getTopEntities(categories), [categories]); + + return ( + + {hasFavs && + } + {hasRecents && + } + {albums.map(({ album }) => + , + )} + {tags.map(({ tag }) => + , + )} + {CATEGORY_VISIBILITY + .map(category => { + switch (category) { + case 'cameras': return camera && + ; + case 'lenses': return lens && + ; + case 'recipes': return recipe && + ; + case 'films': return film && + ; + case 'focal-lengths': return focal && + ; + } + })} + } + onClick={() => setIsCommandKOpen?.(true)} + hideText="never" + className={clsx( + 'h-auto pt-[5px] pb-1.5 pl-1 pr-2.5', + 'gap-x-[3px] uppercase tracking-wide', + )} + > + {utility.more} + + + ); +} diff --git a/src/tag/PhotoFavs.tsx b/src/tag/PhotoFavs.tsx index 0bc4bbba..1f5faead 100644 --- a/src/tag/PhotoFavs.tsx +++ b/src/tag/PhotoFavs.tsx @@ -8,7 +8,10 @@ import EntityLink, { } from '@/components/entity/EntityLink'; import IconFavs from '@/components/icons/IconFavs'; -export default function PhotoFavs(props: EntityLinkExternalProps) { +export default function PhotoFavs({ + badgeIconFirst, + ...props +}: EntityLinkExternalProps & { badgeIconFirst?: boolean }) { const { getTagCount } = useCategoryCounts(); return ( } - iconBadgeEnd={ export const sortTagsObjectWithoutFavs = (tags: Tags) => sortTags(tags, TAG_FAVS); +export const getTopNonFavTags = (tags: Tags) => tags + .filter(({ tag }) => tag !== TAG_FAVS) + .slice(0, 3); + export const descriptionForTaggedPhotos = ( photos: Photo[] = [], appText: AppTextState, @@ -189,3 +193,6 @@ export const limitTagsByCount = ( .toLocaleLowerCase() .includes(queryToInclude.toLocaleLowerCase())) )); + +export const tagsHaveFavs = (tags: Tags) => + tags.some(({ tag }) => isTagFavs(tag)); diff --git a/tailwind.css b/tailwind.css index 9c79e89f..20830ca6 100644 --- a/tailwind.css +++ b/tailwind.css @@ -114,6 +114,10 @@ html { @apply text-light dark:text-dark } +@utility text-medium-dark { + @apply + text-gray-600 dark:text-gray-300 +} @utility text-medium { @apply text-gray-500 dark:text-gray-400