From 5970bfb850410c6b7252186a3c31ca24ffff0df3 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Thu, 26 Feb 2026 09:32:17 -0600 Subject: [PATCH] About Page (#378) * Highlight /about in nav * Refine full frame icon * Add timestamp to /about * Add /about to cmdk menu * Enrich /about content * Make /about categories responsive * Enlarge app nav buttons * Add /about richer categories * Widen main nav buttons * Add more /about category content * Catch db errors in /about * Update key /about image * Add /about avatar * Add jest TextEncoder polyfill * Refactor sidebar text configuration * Show /about hero photo meta * Hoist about content to server page * Hide admin email on small screens * Add basic about page form * Finalize basic /about upsert functionality * Make /about/edit safe for blank templates * Add configuration to hide /about page * Add default /about title text * Add interactive photos to /about edit form * Apply final /about i18n * Ensure /about static optimization * Add CTA for admins to add /about descriptions * Add convenience for accepting full photo urls * Add photo placeholder icon * Show /about empty state when there are no photos * Hide sort control when in app empty state --- README.md | 3 +- __tests__/path.test.ts | 6 +- app/about/edit/page.tsx | 27 + app/about/page.tsx | 106 ++ app/sitemap.ts | 58 +- jest.config.ts | 7 +- jest.setup.ts | 5 +- package.json | 18 +- pnpm-lock.yaml | 1543 ++++++++--------- proxy.ts | 3 +- src/about/AboutPageClient.tsx | 213 +++ src/about/AdminAboutEditPage.tsx | 126 ++ src/about/AdminAboutMenu.tsx | 18 + src/about/actions.ts | 18 + src/about/cache.ts | 9 + src/about/form.ts | 13 + src/about/index.ts | 13 + src/about/query.ts | 63 + src/admin/AdminAppMenu.tsx | 19 +- src/admin/AdminEmptyState.tsx | 5 +- src/admin/AdminUploadsTableRow.tsx | 2 +- .../config/AdminAppConfigurationClient.tsx | 125 +- src/album/AlbumHeader.tsx | 1 + src/app/AppViewSwitcher.tsx | 37 +- src/app/Footer.tsx | 2 +- src/app/Nav.tsx | 2 +- src/app/NavClient.tsx | 12 +- src/app/TemplateImageResponse.tsx | 4 +- src/app/config.ts | 17 +- src/app/path.ts | 21 +- src/cache/index.ts | 36 +- src/category/data.ts | 30 +- src/cmdk/CommandKClient.tsx | 9 + src/components/Container.tsx | 2 +- src/components/HeaderList.tsx | 4 +- src/components/ImageInput.tsx | 9 +- src/components/icons/IconAbout.tsx | 28 + src/components/icons/IconFull.tsx | 9 +- src/components/icons/IconGrid.tsx | 5 +- src/components/icons/IconSearch.tsx | 3 - src/components/og/OGTile.tsx | 2 +- .../shared-hover/SharedHoverProvider.tsx | 4 +- src/components/switcher/Switcher.tsx | 2 +- src/components/switcher/SwitcherItem.tsx | 9 +- src/db/query.ts | 7 + src/i18n/locales/bd-bn.ts | 13 + src/i18n/locales/en-gb.ts | 13 + src/i18n/locales/en-us.ts | 13 + src/i18n/locales/hi-in.ts | 13 + src/i18n/locales/id-id.ts | 13 + src/i18n/locales/pt-br.ts | 13 + src/i18n/locales/pt-pt.ts | 13 + src/i18n/locales/tr-tr.ts | 13 + src/i18n/locales/vi-vn.ts | 13 + src/i18n/locales/zh-cn.ts | 13 + src/i18n/state/index.ts | 5 + src/photo/PhotoAvatar.tsx | 38 + src/photo/PhotoGridPage.tsx | 10 +- src/photo/actions.ts | 5 + src/photo/key-commands.ts | 2 +- src/photo/useDynamicPhoto.ts | 34 + src/share/ShareModal.tsx | 2 +- tailwind.css | 2 +- 63 files changed, 1886 insertions(+), 997 deletions(-) create mode 100644 app/about/edit/page.tsx create mode 100644 app/about/page.tsx create mode 100644 src/about/AboutPageClient.tsx create mode 100644 src/about/AdminAboutEditPage.tsx create mode 100644 src/about/AdminAboutMenu.tsx create mode 100644 src/about/actions.ts create mode 100644 src/about/cache.ts create mode 100644 src/about/form.ts create mode 100644 src/about/index.ts create mode 100644 src/about/query.ts create mode 100644 src/components/icons/IconAbout.tsx create mode 100644 src/photo/PhotoAvatar.tsx create mode 100644 src/photo/useDynamicPhoto.ts diff --git a/README.md b/README.md index 937ff5d6..ef944838 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ See FAQ for [limitations of local development](#can-i-work-locally-without-acces - `NEXT_PUBLIC_META_DESCRIPTION` (seen in search results) - `NEXT_PUBLIC_NAV_TITLE` (seen in top-right navigation, defaults to domain when not configured) - `NEXT_PUBLIC_NAV_CAPTION` (seen in top-right navigation, beneath title) -- `NEXT_PUBLIC_PAGE_ABOUT` (seen in grid sidebar—accepts rich formatting tags: ``, ``, ``, ``, ``, `
`) +- `NEXT_PUBLIC_SIDEBAR_TEXT` (seen in grid sidebar—accepts rich formatting tags: ``, ``, ``, ``, ``, `
`) - `NEXT_PUBLIC_DOMAIN_SHARE` (seen in share modals where a shorter url may be desirable) ### Performance @@ -160,6 +160,7 @@ Create Upstash Redis store from storage tab of Vercel dashboard and link to your ### Display +- `NEXT_PUBLIC_HIDE_ABOUT_PAGE = 1` hides `/about` page - `NEXT_PUBLIC_HIDE_KEYBOARD_SHORTCUT_TOOLTIPS = 1` hides keyboard shortcut hints in areas like the main nav, and previous/next photo links - `NEXT_PUBLIC_HIDE_EXIF_DATA = 1` hides EXIF data in photo details and OG images (potentially useful for portfolios, which don't focus on photography) - `NEXT_PUBLIC_HIDE_ZOOM_CONTROLS = 1` hides fullscreen photo zoom controls diff --git a/__tests__/path.test.ts b/__tests__/path.test.ts index cc13e7a4..fa25188f 100644 --- a/__tests__/path.test.ts +++ b/__tests__/path.test.ts @@ -13,6 +13,7 @@ import { isPathTag, isPathTagPhoto, PATH_ADMIN, + PATH_ADMIN_ABOUT_EDIT, PATH_ADMIN_PHOTOS, PATH_FULL, PATH_GRID, @@ -91,11 +92,12 @@ describe('Paths', () => { // Private expect(isPathProtected(PATH_ADMIN)).toBe(true); expect(isPathProtected(PATH_ADMIN_PHOTOS)).toBe(true); + expect(isPathProtected(PATH_TAG_PRIVATE)).toBe(true); + expect(isPathProtected(PATH_TAG_PRIVATE_PHOTO)).toBe(true); + expect(isPathProtected(PATH_ADMIN_ABOUT_EDIT)).toBe(true); expect(isPathProtected(PATH_OG)).toBe(true); expect(isPathProtected(PATH_OG_ALL)).toBe(true); expect(isPathProtected(PATH_OG_SAMPLE)).toBe(true); - expect(isPathProtected(PATH_TAG_PRIVATE)).toBe(true); - expect(isPathProtected(PATH_TAG_PRIVATE_PHOTO)).toBe(true); }); it('can be classified', () => { // Positive diff --git a/app/about/edit/page.tsx b/app/about/edit/page.tsx new file mode 100644 index 00000000..62475055 --- /dev/null +++ b/app/about/edit/page.tsx @@ -0,0 +1,27 @@ +import AdminAboutEditPage from '@/about/AdminAboutEditPage'; +import { getAbout } from '@/about/query'; +import { PRESERVE_ORIGINAL_UPLOADS } from '@/app/config'; +import { getPhotoNoStore } from '@/photo/cache'; + +export default async function AboutEditPage() { + const about = await getAbout().catch(() => undefined); + + const photoAvatar = about?.photoIdAvatar + ? await getPhotoNoStore(about?.photoIdAvatar ?? '', true) + .catch(() => undefined) + : undefined; + + const photoHero = about?.photoIdHero + ? await getPhotoNoStore(about?.photoIdHero ?? '', true) + .catch(() => undefined) + : undefined; + + return ( + + ); +} diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 00000000..6d6706dc --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,106 @@ +import AboutPageClient from '@/about/AboutPageClient'; +import { getAboutCached } from '@/about/cache'; +import { SHOW_ABOUT_PAGE } from '@/app/config'; +import { PATH_ROOT } from '@/app/path'; +import { getDataForCategoriesCached } from '@/category/cache'; +import { + getLastModifiedForCategories, + NULL_CATEGORY_DATA, +} from '@/category/data'; +import { + getPhotoCached, + getPhotosCached, + getPhotosMetaCached, +} from '@/photo/cache'; +import PhotosEmptyState from '@/photo/PhotosEmptyState'; +import { getAllPhotoIdsWithUpdatedAt } from '@/photo/query'; +import { TAG_FAVS } from '@/tag'; +import { safelyParseFormattedHtml } from '@/utility/html'; +import { max } from 'date-fns'; +import { redirect } from 'next/navigation'; + +export const dynamic = 'force-static'; + +export default async function AboutPage() { + if (!SHOW_ABOUT_PAGE) { redirect(PATH_ROOT); } + + const [ + { + about, + photoAvatar, + photoHero, + }, + photosMeta, + photos, + categories, + ] = await Promise.all([ + getAboutCached() + .then(async about => { + const photoAvatar = await (about?.photoIdAvatar + ? getPhotoCached(about?.photoIdAvatar ?? '', true) + : undefined); + const photoHero = await (about?.photoIdHero + ? getPhotoCached(about?.photoIdHero ?? '', true) + // Fall back to favorite photos if no hero photo is set + : getPhotosCached({ tag: TAG_FAVS, limit: 1 }) + .then(photos => photos.length > 0 + ? photos[0] + // Fall back to oldest photo if no favorite photos exist + : getPhotosCached({ limit: 1, sortBy: 'takenAtAsc' }) + .then(photos => photos[0]))); + return { + about, + photoAvatar, + photoHero, + }; + }).catch(() => ({ + about: undefined, + photoAvatar: undefined, + photoHero: undefined, + })), + getPhotosMetaCached().catch(() => {}), + getAllPhotoIdsWithUpdatedAt().catch(() => []), + getDataForCategoriesCached().catch(() => (NULL_CATEGORY_DATA)), + ]); + + const description = about?.description + ?
+ : undefined; + + const { + cameras, + lenses, + albums, + tags, + recipes, + films, + } = categories; + + const lastModifiedSite = max([ + getLastModifiedForCategories(categories, photos), + about?.updatedAt, + ].filter(date => date instanceof Date)); + + return ( + (photosMeta?.count ?? 0) > 0 + ? tag !== TAG_FAVS)[0]?.tag} + lastUpdated={lastModifiedSite} + /> + : + ); +} diff --git a/app/sitemap.ts b/app/sitemap.ts index ef0a45c2..94e9ec44 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -17,6 +17,10 @@ import { import { isTagFavs } from '@/tag'; import { BASE_URL, GRID_HOMEPAGE_ENABLED } from '@/app/config'; import { getAllPhotoIdsWithUpdatedAt } from '@/photo/query'; +import { + getLastModifiedForCategories, + NULL_CATEGORY_DATA, +} from '@/category/data'; // Cache for 24 hours export const revalidate = 86_400; @@ -29,47 +33,29 @@ const PRIORITY_PHOTO = 0.5; export default async function sitemap(): Promise { const [ - { - recents, - years, - cameras, - lenses, - albums, - tags, - recipes, - films, - focalLengths, - }, + categories, photos, ] = await Promise.all([ - getDataForCategoriesCached().catch(() => ({ - recents: [], - years: [], - cameras: [], - lenses: [], - albums: [], - tags: [], - recipes: [], - films: [], - focalLengths: [], - })), + getDataForCategoriesCached().catch(() => NULL_CATEGORY_DATA), getAllPhotoIdsWithUpdatedAt().catch(() => []), ]); - const lastModifiedSite = [ - ...recents.map(({ lastModified }) => lastModified), - ...years.map(({ lastModified }) => lastModified), - ...cameras.map(({ lastModified }) => lastModified), - ...lenses.map(({ lastModified }) => lastModified), - ...albums.map(({ lastModified }) => lastModified), - ...tags.map(({ lastModified }) => lastModified), - ...recipes.map(({ lastModified }) => lastModified), - ...films.map(({ lastModified }) => lastModified), - ...focalLengths.map(({ lastModified }) => lastModified), - ...photos.map(({ updatedAt }) => updatedAt), - ] - .filter(date => date instanceof Date) - .sort((a, b) => b.getTime() - a.getTime())[0]; + const { + recents, + years, + cameras, + lenses, + albums, + tags, + recipes, + films, + focalLengths, + } = categories; + + const lastModifiedSite = getLastModifiedForCategories( + categories, + photos, + ); return [ // Homepage diff --git a/jest.config.ts b/jest.config.ts index eb690b56..51a3b38c 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,9 +1,9 @@ -/* eslint-disable max-len */ import type { Config } from 'jest'; import nextJest from 'next/jest.js'; const createJestConfig = nextJest({ - // Provide the path to your Next.js app to load next.config.js and .env files in your test environment + // Provide the path to your Next.js app to load next.config.js and + // .env files in your test environment dir: './', }); @@ -14,5 +14,6 @@ const config: Config = { setupFilesAfterEnv: ['/jest.setup.ts'], }; -// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async +// createJestConfig is exported this way to ensure that +// next/jest can load the Next.js config which is async export default createJestConfig(config); diff --git a/jest.setup.ts b/jest.setup.ts index 3673ac04..eff40d61 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -1 +1,4 @@ -import 'cross-fetch/polyfill'; \ No newline at end of file +import 'cross-fetch/polyfill'; +import { TextEncoder, TextDecoder } from 'util'; + +Object.assign(global, { TextDecoder, TextEncoder }); diff --git a/package.json b/package.json index 9487c83c..8039128e 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,12 @@ "test": "jest --watch --transformIgnorePatterns 'node_modules/(?!my-library-dir)/'", "analyze": "ANALYZE=true next build --webpack" }, - "packageManager": "pnpm@10.30.1", + "packageManager": "pnpm@10.30.2", "dependencies": { - "@ai-sdk/openai": "^3.0.30", - "@ai-sdk/rsc": "^2.0.97", - "@aws-sdk/client-s3": "3.995.0", - "@aws-sdk/s3-request-presigner": "3.995.0", + "@ai-sdk/openai": "^3.0.34", + "@ai-sdk/rsc": "^2.0.100", + "@aws-sdk/client-s3": "3.998.0", + "@aws-sdk/s3-request-presigner": "3.998.0", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-tooltip": "^1.2.8", @@ -23,7 +23,7 @@ "@vercel/analytics": "^1.6.1", "@vercel/blob": "^2.3.0", "@vercel/speed-insights": "^1.3.1", - "ai": "^6.0.97", + "ai": "^6.0.100", "camelcase-keys": "^10.0.2", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -40,7 +40,7 @@ "next-auth": "5.0.0-beta.30", "next-themes": "^0.4.6", "ol": "^10.8.0", - "pg": "^8.18.0", + "pg": "^8.19.0", "piexifjs": "^1.0.6", "react": "19.2.4", "react-dom": "19.2.4", @@ -59,7 +59,7 @@ "@next/bundle-analyzer": "16.1.6", "@next/eslint-plugin-next": "16.1.6", "@stylistic/eslint-plugin": "^5.9.0", - "@tailwindcss/postcss": "^4.2.0", + "@tailwindcss/postcss": "^4.2.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -78,7 +78,7 @@ "jest": "^30.2.0", "jest-environment-jsdom": "^30.2.0", "postcss": "8.5.6", - "tailwindcss": "4.2.0", + "tailwindcss": "4.2.1", "ts-node": "^10.9.2", "typescript": "5.9.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3e3a3fb..aa7785e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@ai-sdk/openai': - specifier: ^3.0.30 - version: 3.0.30(zod@4.3.6) + specifier: ^3.0.34 + version: 3.0.34(zod@4.3.6) '@ai-sdk/rsc': - specifier: ^2.0.97 - version: 2.0.97(react@19.2.4)(zod@4.3.6) + specifier: ^2.0.100 + version: 2.0.100(react@19.2.4)(zod@4.3.6) '@aws-sdk/client-s3': - specifier: 3.995.0 - version: 3.995.0 + specifier: 3.998.0 + version: 3.998.0 '@aws-sdk/s3-request-presigner': - specifier: 3.995.0 - version: 3.995.0 + specifier: 3.998.0 + version: 3.998.0 '@radix-ui/react-dialog': specifier: ^1.1.15 version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -48,8 +48,8 @@ importers: specifier: ^1.3.1 version: 1.3.1(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) ai: - specifier: ^6.0.97 - version: 6.0.97(zod@4.3.6) + specifier: ^6.0.100 + version: 6.0.100(zod@4.3.6) camelcase-keys: specifier: ^10.0.2 version: 10.0.2 @@ -99,8 +99,8 @@ importers: specifier: ^10.8.0 version: 10.8.0 pg: - specifier: ^8.18.0 - version: 8.18.0 + specifier: ^8.19.0 + version: 8.19.0 piexifjs: specifier: ^1.0.6 version: 1.0.6 @@ -151,8 +151,8 @@ importers: specifier: ^5.9.0 version: 5.9.0(eslint@9.39.2(jiti@2.6.1)) '@tailwindcss/postcss': - specifier: ^4.2.0 - version: 4.2.0 + specifier: ^4.2.1 + version: 4.2.1 '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -208,8 +208,8 @@ importers: specifier: 8.5.6 version: 8.5.6 tailwindcss: - specifier: 4.2.0 - version: 4.2.0 + specifier: 4.2.1 + version: 4.2.1 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@25.3.0)(typescript@5.9.3) @@ -222,14 +222,14 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/gateway@3.0.53': - resolution: {integrity: sha512-QT3FEoNARMRlk8JJVR7L98exiK9C8AGfrEJVbRxBT1yIXKs/N19o/+PsjTRVsARgDJNcy9JbJp1FspKucEat0Q==} + '@ai-sdk/gateway@3.0.55': + resolution: {integrity: sha512-7xMeTJnCjwRwXKVCiv4Ly4qzWvDuW3+W1WIV0X1EFu6W83d4mEhV9bFArto10MeTw40ewuDjrbrZd21mXKohkw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@3.0.30': - resolution: {integrity: sha512-YDht3t7TDyWKP+JYZp20VuYqSjyF2brHYh47GGFDUPf2wZiqNQ263ecL+quar2bP3GZ3BeQA8f0m2B7UwLPR+g==} + '@ai-sdk/openai@3.0.34': + resolution: {integrity: sha512-rnSsjV7cqIUcYdHgTcXRvN+xn0+wv/DB/U1SCxCVOKDsD9xaNgDjQTuMeJ+dUTzpH4Gn+XS0dJQELCWVIFYQVg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -244,8 +244,8 @@ packages: resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} engines: {node: '>=18'} - '@ai-sdk/rsc@2.0.97': - resolution: {integrity: sha512-fCGUuJhVcuFXiET3DcG5PENShPVjLbLV67iJSFURePNlF4+m/U1azUs+Pgyh98/XXWzFAYrK5ZuxkloH/W6cYA==} + '@ai-sdk/rsc@2.0.100': + resolution: {integrity: sha512-24qhKLH7GfSW7hoSbHSQATDWgi9VbP4UJLKXJLhi3m8qBfy+vpPFWJmXX4UCiZ9IR3FW7lVH5+lGAHkIrIWa7A==} engines: {node: '>=18'} peerDependencies: react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 @@ -298,143 +298,135 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.995.0': - resolution: {integrity: sha512-r+t8qrQ0m9zoovYOH+wilp/glFRB/E+blsDyWzq2C+9qmyhCAQwaxjLaHM8T/uluAmhtZQIYqOH9ILRnvWtRNw==} + '@aws-sdk/client-s3@3.998.0': + resolution: {integrity: sha512-XkJ6GN+egutEHSa9+t4OngCRyyP6Zl+4FX+hN7rDqlLjPuK++NHdMVrRSaVq1/H1m0+Nif0Rtz1BiTYP/htmvg==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.993.0': - resolution: {integrity: sha512-VLUN+wIeNX24fg12SCbzTUBnBENlL014yMKZvRhPkcn4wHR6LKgNrjsG3fZ03Xs0XoKaGtNFi1VVrq666sGBoQ==} + '@aws-sdk/core@3.973.14': + resolution: {integrity: sha512-iAQ1jIGESTVjoqNNY9VlsE9FnCz+Hc8s+dgurF6WrgFyVIw+uggH+V102RFhwjRv4dLSSLfzjDwvQnLszov7TQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.11': - resolution: {integrity: sha512-wdQ8vrvHkKIV7yNUKXyjPWKCdYEUrZTHJ8Ojd5uJxXp9vqPCkUR1dpi1NtOLcrDgueJH7MUH5lQZxshjFPSbDA==} + '@aws-sdk/crc64-nvme@3.972.2': + resolution: {integrity: sha512-mhTYqkvoC9pm8Lm7KWmH/BDXylzwOTnqqbix4mUG/AODazcigIKRYkzPc2bld6q4h9q1asQCiPC2S1Q6rvSjIQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/crc64-nvme@3.972.0': - resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} + '@aws-sdk/credential-provider-env@3.972.12': + resolution: {integrity: sha512-WPtj/iAYHHd+NDM6AZoilZwUz0nMaPxbTPGLA7nhyIYRZN2L8trqfbNvm7g/Jr3gzfKp1LpO6AtBTnrhz9WW2g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.9': - resolution: {integrity: sha512-ZptrOwQynfupubvcngLkbdIq/aXvl/czdpEG8XJ8mN8Nb19BR0jaK0bR+tfuMU36Ez9q4xv7GGkHFqEEP2hUUQ==} + '@aws-sdk/credential-provider-http@3.972.14': + resolution: {integrity: sha512-umtjCicH2o/Fcc8Fu1562UkDyt6gql4czTYVlUfHfAM8S4QEKggzmtHYYYpPfQcjFj1ajyy68ahYSuF67x4ptQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.11': - resolution: {integrity: sha512-hECWoOoH386bGr89NQc9vA/abkGf5TJrMREt+lhNcnSNmoBS04fK7vc3LrJBSQAUGGVj0Tz3f4dHB3w5veovig==} + '@aws-sdk/credential-provider-ini@3.972.12': + resolution: {integrity: sha512-qjzgnMl6GIBbVeK74jBqSF07+s6kyeZl5R88qjMs302JlqkxE57jkvflDmZ9I017ffEWqIUa9/M4Hfp28qyu1g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.9': - resolution: {integrity: sha512-zr1csEu9n4eDiHMTYJabX1mDGuGLgjgUnNckIivvk43DocJC9/f6DefFrnUPZXE+GHtbW50YuXb+JIxKykU74A==} + '@aws-sdk/credential-provider-login@3.972.12': + resolution: {integrity: sha512-AO57y46PzG24bJzxWLk+FYJG6MzxvXoFXnOKnmKUGV43ub4/FS/4Rz7zCC6ThqUotgqEFd30l5LTAd65RP65pg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.9': - resolution: {integrity: sha512-m4RIpVgZChv0vWS/HKChg1xLgZPpx8Z+ly9Fv7FwA8SOfuC6I3htcSaBz2Ch4bneRIiBUhwP4ziUo0UZgtJStQ==} + '@aws-sdk/credential-provider-node@3.972.13': + resolution: {integrity: sha512-ME2sgus+gFRtiudy5Xqj9iT/tj8lHOIGrFgktuO5skJU4EngOvTZ1Hpj8mknrW4FgWXmpWhc88NtEscUuuDpKw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.10': - resolution: {integrity: sha512-70nCESlvnzjo4LjJ8By8MYIiBogkYPSXl3WmMZfH9RZcB/Nt9qVWbFpYj6Fk1vLa4Vk8qagFVeXgxdieMxG1QA==} + '@aws-sdk/credential-provider-process@3.972.12': + resolution: {integrity: sha512-msxrHBpVP5AOIDohNPCINUtL47f7XI1TEru3N13uM3nWUMvIRA1vFa8Tlxbxm1EntPPvLAxRmvE5EbjDjOZkbw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.9': - resolution: {integrity: sha512-gOWl0Fe2gETj5Bk151+LYKpeGi2lBDLNu+NMNpHRlIrKHdBmVun8/AalwMK8ci4uRfG5a3/+zvZBMpuen1SZ0A==} + '@aws-sdk/credential-provider-sso@3.972.12': + resolution: {integrity: sha512-D5iC5546hJyhobJN0szOT4KVeJQ8z/meZq2B3lEDZFcvHONKw+tzq36DAJUy3qLTueeB2geSxiHXngQlA11eoA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.9': - resolution: {integrity: sha512-ey7S686foGTArvFhi3ifQXmgptKYvLSGE2250BAQceMSXZddz7sUSNERGJT2S7u5KIe/kgugxrt01hntXVln6w==} + '@aws-sdk/credential-provider-web-identity@3.972.12': + resolution: {integrity: sha512-yluBahBVsduoA/zgV0NAXtwwXvQ6tNn95dNA3Hg+vISdiPWA46QY0d9PLO2KpNbjtm+1oGcWxemS4fYTwJ0W1w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.9': - resolution: {integrity: sha512-8LnfS76nHXoEc9aRRiMMpxZxJeDG0yusdyo3NvPhCgESmBUgpMa4luhGbClW5NoX/qRcGxxM6Z/esqANSNMTow==} + '@aws-sdk/middleware-bucket-endpoint@3.972.5': + resolution: {integrity: sha512-4+PMX1vuPoALVhuyW7M2GkV9XrkUeuqhuXPs1IkGo2/5dFM8TxM7gnB/evSNVF/o6NXwnO4Sc+6UtGCDhI6RLg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.972.3': - resolution: {integrity: sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==} + '@aws-sdk/middleware-expect-continue@3.972.5': + resolution: {integrity: sha512-8dM11mmRZ8ZrDdkBL5q7Rslhua/nASrUhis2BJuwz2hJ+QsyyuOtr2vvc83fM91YXq18oe26bZI9tboroSo4NA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.972.3': - resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} + '@aws-sdk/middleware-flexible-checksums@3.973.0': + resolution: {integrity: sha512-RAYonYq4Tk93fB+QlLlCEaB1nHSM4lTWq4KBJ7s5bh6y30uGaVTmFELSeWlfLVJipyJ/T1FBWmrYETMcNsESoQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.972.9': - resolution: {integrity: sha512-E663+r/UQpvF3aJkD40p5ZANVQFsUcbE39jifMtN7wc0t1M0+2gJJp3i75R49aY9OiSX5lfVyPUNjN/BNRCCZA==} + '@aws-sdk/middleware-host-header@3.972.5': + resolution: {integrity: sha512-dVA0m1cEQ2iA6yB19aHvWNeUVTuvTt3AXzT0aiIu2uxk0S7AcmwDCDaRgYa/v+eFHcJVxEnpYTozqA7X62xinw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.3': - resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} + '@aws-sdk/middleware-location-constraint@3.972.5': + resolution: {integrity: sha512-BC8MQUaG78oEGOjDdyGBLQCbio/KNeeMcbN8GZumW6yowe5MHyt//FJr8sipA1/hLOZ++lfpGk9bdaSo7LUpOw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.972.3': - resolution: {integrity: sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==} + '@aws-sdk/middleware-logger@3.972.5': + resolution: {integrity: sha512-03RqplLZjUTkYi0dDPR/bbOLnDLFNdaVvNENgA3XK7Ph1MhEBhUYlgoGfOyRAKApDZ+WG4ykOoA8jI8J04jmFA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.3': - resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} + '@aws-sdk/middleware-recursion-detection@3.972.5': + resolution: {integrity: sha512-2QSuuVkpHTe84+mDdnFjHX8rAP3g0yYwLVAhS3lQN1rW5Z/zNsf8/pYQrLjLO4n4sPCsUAkTa0Vrod0lk+o1Tg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.3': - resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} + '@aws-sdk/middleware-sdk-s3@3.972.14': + resolution: {integrity: sha512-qnNWgL2WLZbWQmrr+yB23ivo/L7POJxxFlQxhfDGM/NQ4OfG7YORtqwLps0mOMI8pH22kVeoNu+PB8cgRXLoqQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.11': - resolution: {integrity: sha512-Qr0T7ZQTRMOuR6ahxEoJR1thPVovfWrKB2a6KBGR+a8/ELrFodrgHwhq50n+5VMaGuLtGhHiISU3XGsZmtmVXQ==} + '@aws-sdk/middleware-ssec@3.972.5': + resolution: {integrity: sha512-AfQgwVjK071d1F75jX49CE5KJTlAWwMKqHJoGzf8nUD04iSHw+93rzKSGAFHu3v06k32algI6pF+ctqV/Fjc1A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.972.3': - resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} + '@aws-sdk/middleware-user-agent@3.972.14': + resolution: {integrity: sha512-PzDz+yRAQuIzd+4ZY3s6/TYRzlNKAn4Gae3E5uLV7NnYHqrZHFoAfKE4beXcu3C51pA2/FQ3X2qOGSYqUoN1WQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.11': - resolution: {integrity: sha512-R8CvPsPHXwzIHCAza+bllY6PrctEk4lYq/SkHJz9NLoBHCcKQrbOcsfXxO6xmipSbUNIbNIUhH0lBsJGgsRdiw==} + '@aws-sdk/nested-clients@3.996.2': + resolution: {integrity: sha512-W+u6EM8WRxOIhAhR2mXMHSaUygqItpTehkgxLwJngXqr9RlAR4t6CtECH7o7QK0ct3oyi5Z8ViDHtPbel+D2Rg==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.993.0': - resolution: {integrity: sha512-iOq86f2H67924kQUIPOAvlmMaOAvOLoDOIb66I2YqSUpMYB6ufiuJW3RlREgskxv86S5qKzMnfy/X6CqMjK6XQ==} + '@aws-sdk/region-config-resolver@3.972.5': + resolution: {integrity: sha512-AOitrygDwfTNCLCW7L+GScDy1p49FZ6WutTUFWROouoPetfVNmpL4q8TWD3MhfY/ynhoGhleUQENrBH374EU8w==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.3': - resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} + '@aws-sdk/s3-request-presigner@3.998.0': + resolution: {integrity: sha512-Kx9uIEO1iY+zlO7SXQR2LwH2MmtDcHGJJPLT6C+0C8DM16kNei0pXC5y3OyHp3x63YMpKpkRNjphCdi5/wy0Ug==} engines: {node: '>=20.0.0'} - '@aws-sdk/s3-request-presigner@3.995.0': - resolution: {integrity: sha512-+eJYJcB6XkViGbSAoWl7sQx3izt2y64Oy6SWec/HY2a6ibd5RtUJbEIkvoS2RUu7drm4yu2WyLgSNMQg/7nt0g==} + '@aws-sdk/signature-v4-multi-region@3.996.2': + resolution: {integrity: sha512-fUWHKtgeTfTEML5gi3yugy7caaoe7/8YdM/H0gQXuSDYNL3hORyGST5RyLnhfVDeNgypANLpIP6wzzIq74kEwQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.995.0': - resolution: {integrity: sha512-9Qx5JcAucnxnomREPb2D6L8K8GLG0rknt3+VK/BU3qTUynAcV4W21DQ04Z2RKDw+DYpW88lsZpXbVetWST2WUg==} + '@aws-sdk/token-providers@3.998.0': + resolution: {integrity: sha512-JFzi44tQnENZQ+1DYcHfoa/wTRKkccz0VsNMow0rvsxZtqUEkeV2pYFbir35mHTyUKju9995ay1MAGxLt1dpRA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.993.0': - resolution: {integrity: sha512-+35g4c+8r7sB9Sjp1KPdM8qxGn6B/shBjJtEUN4e+Edw9UEQlZKIzioOGu3UAbyE0a/s450LdLZr4wbJChtmww==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.973.1': - resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} + '@aws-sdk/types@3.973.3': + resolution: {integrity: sha512-tma6D8/xHZHJEUqmr6ksZjZ0onyIUqKDQLyp50ttZJmS0IwFYzxBgp5CxFvpYAnah52V3UtgrqGA6E83gtT7NQ==} engines: {node: '>=20.0.0'} '@aws-sdk/util-arn-parser@3.972.2': resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.993.0': - resolution: {integrity: sha512-j6vioBeRZ4eHX4SWGvGPpwGg/xSOcK7f1GL0VM+rdf3ZFTIsUEhCFmD78B+5r2PgztcECSzEfvHQX01k8dPQPw==} + '@aws-sdk/util-endpoints@3.996.2': + resolution: {integrity: sha512-83E6T1CKi0/IozPzqRBKqduW0mS4UQdI3soBH6CG7UgupTADWunqEMOTuPWCs9XGjpJJ4ujj+yu7pn8svhp5yg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.995.0': - resolution: {integrity: sha512-aym/pjB8SLbo9w2nmkrDdAAVKVlf7CM71B9mKhjDbJTzwpSFBPHqJIMdDyj0mLumKC0aIVDr1H6U+59m9GvMFw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-format-url@3.972.3': - resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==} + '@aws-sdk/util-format-url@3.972.5': + resolution: {integrity: sha512-PccfrPQVOEQSL8xaSvu988ESMlqdH1Qfk3AWPZksCOYPHyzYeUV988E+DBachXNV7tBVTUvK85cZYEZu7JtPxQ==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.893.0': resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.3': - resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} + '@aws-sdk/util-user-agent-browser@3.972.5': + resolution: {integrity: sha512-2ja1WqtuBaEAMgVoHYuWx393DF6ULqdt3OozeO7BosqouYaoU47Adtp9vEF+GImSG/Q8A+dqfwDULTTdMkHGUQ==} - '@aws-sdk/util-user-agent-node@3.972.10': - resolution: {integrity: sha512-LVXzICPlsheET+sE6tkcS47Q5HkSTrANIlqL1iFxGAY/wRQ236DX/PCAK56qMh9QJoXAfXfoRW0B0Og4R+X7Nw==} + '@aws-sdk/util-user-agent-node@3.972.13': + resolution: {integrity: sha512-PHErmuu+v6iAST48zcsB2cYwDKW45gk6qCp49t1p0NGZ4EaFPr/tA5jl0X/ekDwvWbuT0LTj++fjjdVQAbuh0Q==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -442,8 +434,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.5': - resolution: {integrity: sha512-mCae5Ys6Qm1LDu0qdGwx2UQ63ONUe+FHw908fJzLDqFKTDBK4LDZUqKWm4OkTCNFq19bftjsBSESIGLD/s3/rA==} + '@aws-sdk/xml-builder@3.972.7': + resolution: {integrity: sha512-9GF86s6mHuc1TYCbuKatMDWl2PyK3KIkpRaI7ul2/gYZPfaLzKZ+ISHhxzVb9KVeakf75tUQe6CXW2gugSCXNw==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.2': @@ -1465,220 +1457,220 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@smithy/abort-controller@4.2.8': - resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} + '@smithy/abort-controller@4.2.10': + resolution: {integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.2.1': - resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + '@smithy/chunked-blob-reader-native@4.2.2': + resolution: {integrity: sha512-QzzYIlf4yg0w5TQaC9VId3B3ugSk1MI/wb7tgcHtd7CBV9gNRKZrhc2EPSxSZuDy10zUZ0lomNMgkc6/VVe8xg==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.2.0': - resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + '@smithy/chunked-blob-reader@5.2.1': + resolution: {integrity: sha512-y5d4xRiD6TzeP5BWlb+Ig/VFqF+t9oANNhGeMqyzU7obw7FYgTgVi50i5JqBTeKp+TABeDIeeXFZdz65RipNtA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.6': - resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} + '@smithy/config-resolver@4.4.9': + resolution: {integrity: sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q==} engines: {node: '>=18.0.0'} - '@smithy/core@3.23.2': - resolution: {integrity: sha512-HaaH4VbGie4t0+9nY3tNBRSxVTr96wzIqexUa6C2qx3MPePAuz7lIxPxYtt1Wc//SPfJLNoZJzfdt0B6ksj2jA==} + '@smithy/core@3.23.6': + resolution: {integrity: sha512-4xE+0L2NrsFKpEVFlFELkIHQddBvMbQ41LRIP74dGCXnY1zQ9DgksrBcRBDJT+iOzGy4VEJIeU3hkUK5mn06kg==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.8': - resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} + '@smithy/credential-provider-imds@4.2.10': + resolution: {integrity: sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.8': - resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} + '@smithy/eventstream-codec@4.2.10': + resolution: {integrity: sha512-A4ynrsFFfSXUHicfTcRehytppFBcY3HQxEGYiyGktPIOye3Ot7fxpiy4VR42WmtGI4Wfo6OXt/c1Ky1nUFxYYQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.8': - resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} + '@smithy/eventstream-serde-browser@4.2.10': + resolution: {integrity: sha512-0xupsu9yj9oDVuQ50YCTS9nuSYhGlrwqdaKQel9y2Fz7LU9fNErVlw9N0o4pm4qqvWEGbSTI4HKc6XJfB30MVw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.8': - resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} + '@smithy/eventstream-serde-config-resolver@4.3.10': + resolution: {integrity: sha512-8kn6sinrduk0yaYHMJDsNuiFpXwQwibR7n/4CDUqn4UgaG+SeBHu5jHGFdU9BLFAM7Q4/gvr9RYxBHz9/jKrhA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.8': - resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} + '@smithy/eventstream-serde-node@4.2.10': + resolution: {integrity: sha512-uUrxPGgIffnYfvIOUmBM5i+USdEBRTdh7mLPttjphgtooxQ8CtdO1p6K5+Q4BBAZvKlvtJ9jWyrWpBJYzBKsyQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.8': - resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} + '@smithy/eventstream-serde-universal@4.2.10': + resolution: {integrity: sha512-aArqzOEvcs2dK+xQVCgLbpJQGfZihw8SD4ymhkwNTtwKbnrzdhJsFDKuMQnam2kF69WzgJYOU5eJlCx+CA32bw==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.9': - resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} + '@smithy/fetch-http-handler@5.3.11': + resolution: {integrity: sha512-wbTRjOxdFuyEg0CpumjZO0hkUl+fetJFqxNROepuLIoijQh51aMBmzFLfoQdwRjxsuuS2jizzIUTjPWgd8pd7g==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.9': - resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} + '@smithy/hash-blob-browser@4.2.11': + resolution: {integrity: sha512-DrcAx3PM6AEbWZxsKl6CWAGnVwiz28Wp1ZhNu+Hi4uI/6C1PIZBIaPM2VoqBDAsOWbM6ZVzOEQMxFLLdmb4eBQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.8': - resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} + '@smithy/hash-node@4.2.10': + resolution: {integrity: sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.2.8': - resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} + '@smithy/hash-stream-node@4.2.10': + resolution: {integrity: sha512-w78xsYrOlwXKwN5tv1GnKIRbHb1HygSpeZMP6xDxCPGf1U/xDHjCpJu64c5T35UKyEPwa0bPeIcvU69VY3khUA==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.8': - resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + '@smithy/invalid-dependency@4.2.10': + resolution: {integrity: sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + '@smithy/is-array-buffer@4.2.1': + resolution: {integrity: sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.8': - resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} + '@smithy/md5-js@4.2.10': + resolution: {integrity: sha512-Op+Dh6dPLWTjWITChFayDllIaCXRofOed8ecpggTC5fkh8yXes0vAEX7gRUfjGK+TlyxoCAA05gHbZW/zB9JwQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.8': - resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} + '@smithy/middleware-content-length@4.2.10': + resolution: {integrity: sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.16': - resolution: {integrity: sha512-L5GICFCSsNhbJ5JSKeWFGFy16Q2OhoBizb3X2DrxaJwXSEujVvjG9Jt386dpQn2t7jINglQl0b4K/Su69BdbMA==} + '@smithy/middleware-endpoint@4.4.20': + resolution: {integrity: sha512-9W6Np4ceBP3XCYAGLoMCmn8t2RRVzuD1ndWPLBbv7H9CrwM9Bprf6Up6BM9ZA/3alodg0b7Kf6ftBK9R1N04vw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.33': - resolution: {integrity: sha512-jLqZOdJhtIL4lnA9hXnAG6GgnJlo1sD3FqsTxm9wSfjviqgWesY/TMBVnT84yr4O0Vfe0jWoXlfFbzsBVph3WA==} + '@smithy/middleware-retry@4.4.37': + resolution: {integrity: sha512-/1psZZllBBSQ7+qo5+hhLz7AEPGLx3Z0+e3ramMBEuPK2PfvLK4SrncDB9VegX5mBn+oP/UTDrM6IHrFjvX1ZA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.9': - resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} + '@smithy/middleware-serde@4.2.11': + resolution: {integrity: sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.8': - resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} + '@smithy/middleware-stack@4.2.10': + resolution: {integrity: sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.8': - resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + '@smithy/node-config-provider@4.3.10': + resolution: {integrity: sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.10': - resolution: {integrity: sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==} + '@smithy/node-http-handler@4.4.12': + resolution: {integrity: sha512-zo1+WKJkR9x7ZtMeMDAAsq2PufwiLDmkhcjpWPRRkmeIuOm6nq1qjFICSZbnjBvD09ei8KMo26BWxsu2BUU+5w==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.8': - resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + '@smithy/property-provider@4.2.10': + resolution: {integrity: sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.8': - resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + '@smithy/protocol-http@5.3.10': + resolution: {integrity: sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.8': - resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + '@smithy/querystring-builder@4.2.10': + resolution: {integrity: sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.8': - resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} + '@smithy/querystring-parser@4.2.10': + resolution: {integrity: sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.8': - resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} + '@smithy/service-error-classification@4.2.10': + resolution: {integrity: sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.4.3': - resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} + '@smithy/shared-ini-file-loader@4.4.5': + resolution: {integrity: sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.8': - resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} + '@smithy/signature-v4@5.3.10': + resolution: {integrity: sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.11.5': - resolution: {integrity: sha512-xixwBRqoeP2IUgcAl3U9dvJXc+qJum4lzo3maaJxifsZxKUYLfVfCXvhT4/jD01sRrHg5zjd1cw2Zmjr4/SuKQ==} + '@smithy/smithy-client@4.12.0': + resolution: {integrity: sha512-R8bQ9K3lCcXyZmBnQqUZJF4ChZmtWT5NLi6x5kgWx5D+/j0KorXcA0YcFg/X5TOgnTCy1tbKc6z2g2y4amFupQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.12.0': - resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} + '@smithy/types@4.13.0': + resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.8': - resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} + '@smithy/url-parser@4.2.10': + resolution: {integrity: sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.3.0': - resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + '@smithy/util-base64@4.3.1': + resolution: {integrity: sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.2.0': - resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + '@smithy/util-body-length-browser@4.2.1': + resolution: {integrity: sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.2.1': - resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + '@smithy/util-body-length-node@4.2.2': + resolution: {integrity: sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + '@smithy/util-buffer-from@4.2.1': + resolution: {integrity: sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.2.0': - resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + '@smithy/util-config-provider@4.2.1': + resolution: {integrity: sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.32': - resolution: {integrity: sha512-092sjYfFMQ/iaPH798LY/OJFBcYu0sSK34Oy9vdixhsU36zlZu8OcYjF3TD4e2ARupyK7xaxPXl+T0VIJTEkkg==} + '@smithy/util-defaults-mode-browser@4.3.36': + resolution: {integrity: sha512-R0smq7EHQXRVMxkAxtH5akJ/FvgAmNF6bUy/GwY/N20T4GrwjT633NFm0VuRpC+8Bbv8R9A0DoJ9OiZL/M3xew==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.35': - resolution: {integrity: sha512-miz/ggz87M8VuM29y7jJZMYkn7+IErM5p5UgKIf8OtqVs/h2bXr1Bt3uTsREsI/4nK8a0PQERbAPsVPVNIsG7Q==} + '@smithy/util-defaults-mode-node@4.2.39': + resolution: {integrity: sha512-otWuoDm35btJV1L8MyHrPl462B07QCdMTktKc7/yM+Psv6KbED/ziXiHnmr7yPHUjfIwE9S8Max0LO24Mo3ZVg==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.2.8': - resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} + '@smithy/util-endpoints@3.3.1': + resolution: {integrity: sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + '@smithy/util-hex-encoding@4.2.1': + resolution: {integrity: sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.8': - resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} + '@smithy/util-middleware@4.2.10': + resolution: {integrity: sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.8': - resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} + '@smithy/util-retry@4.2.10': + resolution: {integrity: sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.12': - resolution: {integrity: sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==} + '@smithy/util-stream@4.5.15': + resolution: {integrity: sha512-OlOKnaqnkU9X+6wEkd7mN+WB7orPbCVDauXOj22Q7VtiTkvy7ZdSsOg4QiNAZMgI4OkvNf+/VLUC3VXkxuWJZw==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.2.0': - resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + '@smithy/util-uri-escape@4.2.1': + resolution: {integrity: sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + '@smithy/util-utf8@4.2.1': + resolution: {integrity: sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.8': - resolution: {integrity: sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==} + '@smithy/util-waiter@4.2.10': + resolution: {integrity: sha512-4eTWph/Lkg1wZEDAyObwme0kmhEb7J/JjibY2znJdrYRgKbKqB7YoEhhJVJ4R1g/SYih4zuwX7LpJaM8RsnTVg==} engines: {node: '>=18.0.0'} - '@smithy/uuid@1.1.0': - resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + '@smithy/uuid@1.1.1': + resolution: {integrity: sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==} engines: {node: '>=18.0.0'} '@standard-schema/spec@1.1.0': @@ -1693,69 +1685,69 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/node@4.2.0': - resolution: {integrity: sha512-Yv+fn/o2OmL5fh/Ir62VXItdShnUxfpkMA4Y7jdeC8O81WPB8Kf6TT6GSHvnqgSwDzlB5iT7kDpeXxLsUS0T6Q==} + '@tailwindcss/node@4.2.1': + resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} - '@tailwindcss/oxide-android-arm64@4.2.0': - resolution: {integrity: sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw==} + '@tailwindcss/oxide-android-arm64@4.2.1': + resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.0': - resolution: {integrity: sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA==} + '@tailwindcss/oxide-darwin-arm64@4.2.1': + resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.0': - resolution: {integrity: sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg==} + '@tailwindcss/oxide-darwin-x64@4.2.1': + resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.0': - resolution: {integrity: sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw==} + '@tailwindcss/oxide-freebsd-x64@4.2.1': + resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.0': - resolution: {integrity: sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.0': - resolution: {integrity: sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA==} + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.0': - resolution: {integrity: sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A==} + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.0': - resolution: {integrity: sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA==} + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.0': - resolution: {integrity: sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw==} + '@tailwindcss/oxide-linux-x64-musl@4.2.1': + resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.0': - resolution: {integrity: sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw==} + '@tailwindcss/oxide-wasm32-wasi@4.2.1': + resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1766,24 +1758,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.0': - resolution: {integrity: sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA==} + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': + resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.0': - resolution: {integrity: sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ==} + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.0': - resolution: {integrity: sha512-AZqQzADaj742oqn2xjl5JbIOzZB/DGCYF/7bpvhA8KvjUj9HJkag6bBuwZvH1ps6dfgxNHyuJVlzSr2VpMgdTQ==} + '@tailwindcss/oxide@4.2.1': + resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} engines: {node: '>= 20'} - '@tailwindcss/postcss@4.2.0': - resolution: {integrity: sha512-u6YBacGpOm/ixPfKqfgrJEjMfrYmPD7gEFRoygS/hnQaRtV0VCBdpkx5Ouw9pnaLRwwlgGCuJw8xLpaR0hOrQg==} + '@tailwindcss/postcss@4.2.1': + resolution: {integrity: sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==} '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -2163,8 +2155,8 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@6.0.97: - resolution: {integrity: sha512-eZIAcBymwGhBwncRH/v9pillZNMeRCDkc4BwcvwXerXd7sxjVxRis3ZNCNCpP02pVH4NLs81ljm4cElC4vbNcQ==} + ai@6.0.100: + resolution: {integrity: sha512-BIxhG7M7wvcWCF+IEnZi7WpkRLOM3jR2vJ0mMuohl2UB2i1R/ZUa1cHFel1xI8nWvyUpOoQXKqsM0BAH50EYSQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -3855,23 +3847,23 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.11.0: - resolution: {integrity: sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==} + pg-pool@3.12.0: + resolution: {integrity: sha512-eIJ0DES8BLaziFHW7VgJEBPi5hg3Nyng5iKpYtj3wbcAUV9A1wLgWiY7ajf/f/oO1wfxt83phXPY8Emztg7ITg==} peerDependencies: pg: '>=8.0' pg-protocol@1.10.3: resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} - pg-protocol@1.11.0: - resolution: {integrity: sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==} + pg-protocol@1.12.0: + resolution: {integrity: sha512-uOANXNRACNdElMXJ0tPz6RBM0XQ61nONGAwlt8da5zs/iUOOCLBQOHSXnrC6fMsvtjxbOJrZZl5IScGv+7mpbg==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.18.0: - resolution: {integrity: sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==} + pg@8.19.0: + resolution: {integrity: sha512-QIcLGi508BAHkQ3pJNptsFz5WQMlpGbuBGBaIaXsWK8mel2kQ/rThYI+DbgjUvZrIr7MiuEuc9LcChJoEZK1xQ==} engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -4336,8 +4328,8 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwindcss@4.2.0: - resolution: {integrity: sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q==} + tailwindcss@4.2.1: + resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} @@ -4688,14 +4680,14 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/gateway@3.0.53(zod@4.3.6)': + '@ai-sdk/gateway@3.0.55(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) '@vercel/oidc': 3.1.0 zod: 4.3.6 - '@ai-sdk/openai@3.0.30(zod@4.3.6)': + '@ai-sdk/openai@3.0.34(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) @@ -4712,11 +4704,11 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/rsc@2.0.97(react@19.2.4)(zod@4.3.6)': + '@ai-sdk/rsc@2.0.100(react@19.2.4)(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) - ai: 6.0.97(zod@4.3.6) + ai: 6.0.100(zod@4.3.6) jsondiffpatch: 0.7.3 react: 19.2.4 optionalDependencies: @@ -4743,20 +4735,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4766,7 +4758,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4774,7 +4766,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -4783,469 +4775,418 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.995.0': + '@aws-sdk/client-s3@3.998.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.973.11 - '@aws-sdk/credential-provider-node': 3.972.10 - '@aws-sdk/middleware-bucket-endpoint': 3.972.3 - '@aws-sdk/middleware-expect-continue': 3.972.3 - '@aws-sdk/middleware-flexible-checksums': 3.972.9 - '@aws-sdk/middleware-host-header': 3.972.3 - '@aws-sdk/middleware-location-constraint': 3.972.3 - '@aws-sdk/middleware-logger': 3.972.3 - '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-sdk-s3': 3.972.11 - '@aws-sdk/middleware-ssec': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.11 - '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/signature-v4-multi-region': 3.995.0 - '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.995.0 - '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.10 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.23.2 - '@smithy/eventstream-serde-browser': 4.2.8 - '@smithy/eventstream-serde-config-resolver': 4.3.8 - '@smithy/eventstream-serde-node': 4.2.8 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-blob-browser': 4.2.9 - '@smithy/hash-node': 4.2.8 - '@smithy/hash-stream-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/md5-js': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.16 - '@smithy/middleware-retry': 4.4.33 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.10 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.32 - '@smithy/util-defaults-mode-node': 4.2.35 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-stream': 4.5.12 - '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.8 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/credential-provider-node': 3.972.13 + '@aws-sdk/middleware-bucket-endpoint': 3.972.5 + '@aws-sdk/middleware-expect-continue': 3.972.5 + '@aws-sdk/middleware-flexible-checksums': 3.973.0 + '@aws-sdk/middleware-host-header': 3.972.5 + '@aws-sdk/middleware-location-constraint': 3.972.5 + '@aws-sdk/middleware-logger': 3.972.5 + '@aws-sdk/middleware-recursion-detection': 3.972.5 + '@aws-sdk/middleware-sdk-s3': 3.972.14 + '@aws-sdk/middleware-ssec': 3.972.5 + '@aws-sdk/middleware-user-agent': 3.972.14 + '@aws-sdk/region-config-resolver': 3.972.5 + '@aws-sdk/signature-v4-multi-region': 3.996.2 + '@aws-sdk/types': 3.973.3 + '@aws-sdk/util-endpoints': 3.996.2 + '@aws-sdk/util-user-agent-browser': 3.972.5 + '@aws-sdk/util-user-agent-node': 3.972.13 + '@smithy/config-resolver': 4.4.9 + '@smithy/core': 3.23.6 + '@smithy/eventstream-serde-browser': 4.2.10 + '@smithy/eventstream-serde-config-resolver': 4.3.10 + '@smithy/eventstream-serde-node': 4.2.10 + '@smithy/fetch-http-handler': 5.3.11 + '@smithy/hash-blob-browser': 4.2.11 + '@smithy/hash-node': 4.2.10 + '@smithy/hash-stream-node': 4.2.10 + '@smithy/invalid-dependency': 4.2.10 + '@smithy/md5-js': 4.2.10 + '@smithy/middleware-content-length': 4.2.10 + '@smithy/middleware-endpoint': 4.4.20 + '@smithy/middleware-retry': 4.4.37 + '@smithy/middleware-serde': 4.2.11 + '@smithy/middleware-stack': 4.2.10 + '@smithy/node-config-provider': 4.3.10 + '@smithy/node-http-handler': 4.4.12 + '@smithy/protocol-http': 5.3.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.10 + '@smithy/util-base64': 4.3.1 + '@smithy/util-body-length-browser': 4.2.1 + '@smithy/util-body-length-node': 4.2.2 + '@smithy/util-defaults-mode-browser': 4.3.36 + '@smithy/util-defaults-mode-node': 4.2.39 + '@smithy/util-endpoints': 3.3.1 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-retry': 4.2.10 + '@smithy/util-stream': 4.5.15 + '@smithy/util-utf8': 4.2.1 + '@smithy/util-waiter': 4.2.10 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.993.0': + '@aws-sdk/core@3.973.14': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.11 - '@aws-sdk/middleware-host-header': 3.972.3 - '@aws-sdk/middleware-logger': 3.972.3 - '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.11 - '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.993.0 - '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.10 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.23.2 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.16 - '@smithy/middleware-retry': 4.4.33 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.10 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.32 - '@smithy/util-defaults-mode-node': 4.2.35 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/types': 3.973.3 + '@aws-sdk/xml-builder': 3.972.7 + '@smithy/core': 3.23.6 + '@smithy/node-config-provider': 4.3.10 + '@smithy/property-provider': 4.2.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/signature-v4': 5.3.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.1 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-utf8': 4.2.1 + tslib: 2.8.1 + + '@aws-sdk/crc64-nvme@3.972.2': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.12': + dependencies: + '@aws-sdk/core': 3.973.14 + '@aws-sdk/types': 3.973.3 + '@smithy/property-provider': 4.2.10 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.14': + dependencies: + '@aws-sdk/core': 3.973.14 + '@aws-sdk/types': 3.973.3 + '@smithy/fetch-http-handler': 5.3.11 + '@smithy/node-http-handler': 4.4.12 + '@smithy/property-provider': 4.2.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 + '@smithy/util-stream': 4.5.15 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.12': + dependencies: + '@aws-sdk/core': 3.973.14 + '@aws-sdk/credential-provider-env': 3.972.12 + '@aws-sdk/credential-provider-http': 3.972.14 + '@aws-sdk/credential-provider-login': 3.972.12 + '@aws-sdk/credential-provider-process': 3.972.12 + '@aws-sdk/credential-provider-sso': 3.972.12 + '@aws-sdk/credential-provider-web-identity': 3.972.12 + '@aws-sdk/nested-clients': 3.996.2 + '@aws-sdk/types': 3.973.3 + '@smithy/credential-provider-imds': 4.2.10 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.11': + '@aws-sdk/credential-provider-login@3.972.12': dependencies: - '@aws-sdk/types': 3.973.1 - '@aws-sdk/xml-builder': 3.972.5 - '@smithy/core': 3.23.2 - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/crc64-nvme@3.972.0': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.972.9': - dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.972.11': - dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/types': 3.973.1 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.10 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.12 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.972.9': - dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/credential-provider-env': 3.972.9 - '@aws-sdk/credential-provider-http': 3.972.11 - '@aws-sdk/credential-provider-login': 3.972.9 - '@aws-sdk/credential-provider-process': 3.972.9 - '@aws-sdk/credential-provider-sso': 3.972.9 - '@aws-sdk/credential-provider-web-identity': 3.972.9 - '@aws-sdk/nested-clients': 3.993.0 - '@aws-sdk/types': 3.973.1 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/nested-clients': 3.996.2 + '@aws-sdk/types': 3.973.3 + '@smithy/property-provider': 4.2.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.9': + '@aws-sdk/credential-provider-node@3.972.13': dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/nested-clients': 3.993.0 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/credential-provider-env': 3.972.12 + '@aws-sdk/credential-provider-http': 3.972.14 + '@aws-sdk/credential-provider-ini': 3.972.12 + '@aws-sdk/credential-provider-process': 3.972.12 + '@aws-sdk/credential-provider-sso': 3.972.12 + '@aws-sdk/credential-provider-web-identity': 3.972.12 + '@aws-sdk/types': 3.973.3 + '@smithy/credential-provider-imds': 4.2.10 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.10': + '@aws-sdk/credential-provider-process@3.972.12': dependencies: - '@aws-sdk/credential-provider-env': 3.972.9 - '@aws-sdk/credential-provider-http': 3.972.11 - '@aws-sdk/credential-provider-ini': 3.972.9 - '@aws-sdk/credential-provider-process': 3.972.9 - '@aws-sdk/credential-provider-sso': 3.972.9 - '@aws-sdk/credential-provider-web-identity': 3.972.9 - '@aws-sdk/types': 3.973.1 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/types': 3.973.3 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.12': + dependencies: + '@aws-sdk/core': 3.973.14 + '@aws-sdk/nested-clients': 3.996.2 + '@aws-sdk/token-providers': 3.998.0 + '@aws-sdk/types': 3.973.3 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.9': + '@aws-sdk/credential-provider-web-identity@3.972.12': dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.972.9': - dependencies: - '@aws-sdk/client-sso': 3.993.0 - '@aws-sdk/core': 3.973.11 - '@aws-sdk/token-providers': 3.993.0 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/nested-clients': 3.996.2 + '@aws-sdk/types': 3.973.3 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.9': + '@aws-sdk/middleware-bucket-endpoint@3.972.5': dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/nested-clients': 3.993.0 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/middleware-bucket-endpoint@3.972.3': - dependencies: - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 + '@smithy/node-config-provider': 4.3.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 + '@smithy/util-config-provider': 4.2.1 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.972.3': + '@aws-sdk/middleware-expect-continue@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.972.9': + '@aws-sdk/middleware-flexible-checksums@3.973.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.11 - '@aws-sdk/crc64-nvme': 3.972.0 - '@aws-sdk/types': 3.973.1 - '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.12 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/crc64-nvme': 3.972.2 + '@aws-sdk/types': 3.973.3 + '@smithy/is-array-buffer': 4.2.1 + '@smithy/node-config-provider': 4.3.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-stream': 4.5.15 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.972.3': + '@aws-sdk/middleware-host-header@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.972.3': + '@aws-sdk/middleware-location-constraint@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.3': + '@aws-sdk/middleware-logger@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.3': + '@aws-sdk/middleware-recursion-detection@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 + '@aws-sdk/types': 3.973.3 '@aws/lambda-invoke-store': 0.2.2 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.11': + '@aws-sdk/middleware-sdk-s3@3.972.14': dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/types': 3.973.1 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/types': 3.973.3 '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/core': 3.23.2 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.12 - '@smithy/util-utf8': 4.2.0 + '@smithy/core': 3.23.6 + '@smithy/node-config-provider': 4.3.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/signature-v4': 5.3.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 + '@smithy/util-config-provider': 4.2.1 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-stream': 4.5.15 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.972.3': + '@aws-sdk/middleware-ssec@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.11': + '@aws-sdk/middleware-user-agent@3.972.14': dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.993.0 - '@smithy/core': 3.23.2 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/types': 3.973.3 + '@aws-sdk/util-endpoints': 3.996.2 + '@smithy/core': 3.23.6 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.993.0': + '@aws-sdk/nested-clients@3.996.2': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.11 - '@aws-sdk/middleware-host-header': 3.972.3 - '@aws-sdk/middleware-logger': 3.972.3 - '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.11 - '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.993.0 - '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.10 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.23.2 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.16 - '@smithy/middleware-retry': 4.4.33 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.10 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.32 - '@smithy/util-defaults-mode-node': 4.2.35 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/middleware-host-header': 3.972.5 + '@aws-sdk/middleware-logger': 3.972.5 + '@aws-sdk/middleware-recursion-detection': 3.972.5 + '@aws-sdk/middleware-user-agent': 3.972.14 + '@aws-sdk/region-config-resolver': 3.972.5 + '@aws-sdk/types': 3.973.3 + '@aws-sdk/util-endpoints': 3.996.2 + '@aws-sdk/util-user-agent-browser': 3.972.5 + '@aws-sdk/util-user-agent-node': 3.972.13 + '@smithy/config-resolver': 4.4.9 + '@smithy/core': 3.23.6 + '@smithy/fetch-http-handler': 5.3.11 + '@smithy/hash-node': 4.2.10 + '@smithy/invalid-dependency': 4.2.10 + '@smithy/middleware-content-length': 4.2.10 + '@smithy/middleware-endpoint': 4.4.20 + '@smithy/middleware-retry': 4.4.37 + '@smithy/middleware-serde': 4.2.11 + '@smithy/middleware-stack': 4.2.10 + '@smithy/node-config-provider': 4.3.10 + '@smithy/node-http-handler': 4.4.12 + '@smithy/protocol-http': 5.3.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.10 + '@smithy/util-base64': 4.3.1 + '@smithy/util-body-length-browser': 4.2.1 + '@smithy/util-body-length-node': 4.2.2 + '@smithy/util-defaults-mode-browser': 4.3.36 + '@smithy/util-defaults-mode-node': 4.2.39 + '@smithy/util-endpoints': 3.3.1 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-retry': 4.2.10 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.972.3': + '@aws-sdk/region-config-resolver@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/config-resolver': 4.4.6 - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/config-resolver': 4.4.9 + '@smithy/node-config-provider': 4.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/s3-request-presigner@3.995.0': + '@aws-sdk/s3-request-presigner@3.998.0': dependencies: - '@aws-sdk/signature-v4-multi-region': 3.995.0 - '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-format-url': 3.972.3 - '@smithy/middleware-endpoint': 4.4.16 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 + '@aws-sdk/signature-v4-multi-region': 3.996.2 + '@aws-sdk/types': 3.973.3 + '@aws-sdk/util-format-url': 3.972.5 + '@smithy/middleware-endpoint': 4.4.20 + '@smithy/protocol-http': 5.3.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.995.0': + '@aws-sdk/signature-v4-multi-region@3.996.2': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.11 - '@aws-sdk/types': 3.973.1 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/middleware-sdk-s3': 3.972.14 + '@aws-sdk/types': 3.973.3 + '@smithy/protocol-http': 5.3.10 + '@smithy/signature-v4': 5.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.993.0': + '@aws-sdk/token-providers@3.998.0': dependencies: - '@aws-sdk/core': 3.973.11 - '@aws-sdk/nested-clients': 3.993.0 - '@aws-sdk/types': 3.973.1 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.14 + '@aws-sdk/nested-clients': 3.996.2 + '@aws-sdk/types': 3.973.3 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.973.1': + '@aws-sdk/types@3.973.3': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.972.2': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.993.0': + '@aws-sdk/util-endpoints@3.996.2': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-endpoints': 3.2.8 + '@aws-sdk/types': 3.973.3 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.10 + '@smithy/util-endpoints': 3.3.1 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.995.0': + '@aws-sdk/util-format-url@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-endpoints': 3.2.8 - tslib: 2.8.1 - - '@aws-sdk/util-format-url@3.972.3': - dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/querystring-builder': 4.2.8 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/querystring-builder': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.3': + '@aws-sdk/util-user-agent-browser@3.972.5': dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.3 + '@smithy/types': 4.13.0 bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.972.10': + '@aws-sdk/util-user-agent-node@3.972.13': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.11 - '@aws-sdk/types': 3.973.1 - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/middleware-user-agent': 3.972.14 + '@aws-sdk/types': 3.973.3 + '@smithy/node-config-provider': 4.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.5': + '@aws-sdk/xml-builder@3.972.7': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 fast-xml-parser: 5.3.6 tslib: 2.8.1 @@ -6288,254 +6229,254 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.2.8': + '@smithy/abort-controller@4.2.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@4.2.1': + '@smithy/chunked-blob-reader-native@4.2.2': dependencies: - '@smithy/util-base64': 4.3.0 + '@smithy/util-base64': 4.3.1 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.2.0': + '@smithy/chunked-blob-reader@5.2.1': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.4.6': + '@smithy/config-resolver@4.4.9': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 + '@smithy/node-config-provider': 4.3.10 + '@smithy/types': 4.13.0 + '@smithy/util-config-provider': 4.2.1 + '@smithy/util-endpoints': 3.3.1 + '@smithy/util-middleware': 4.2.10 tslib: 2.8.1 - '@smithy/core@3.23.2': + '@smithy/core@3.23.6': dependencies: - '@smithy/middleware-serde': 4.2.9 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.12 - '@smithy/util-utf8': 4.2.0 - '@smithy/uuid': 1.1.0 + '@smithy/middleware-serde': 4.2.11 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.1 + '@smithy/util-body-length-browser': 4.2.1 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-stream': 4.5.15 + '@smithy/util-utf8': 4.2.1 + '@smithy/uuid': 1.1.1 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.8': + '@smithy/credential-provider-imds@4.2.10': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 + '@smithy/node-config-provider': 4.3.10 + '@smithy/property-provider': 4.2.10 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.10 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.8': + '@smithy/eventstream-codec@4.2.10': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.12.0 - '@smithy/util-hex-encoding': 4.2.0 + '@smithy/types': 4.13.0 + '@smithy/util-hex-encoding': 4.2.1 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.8': + '@smithy/eventstream-serde-browser@4.2.10': dependencies: - '@smithy/eventstream-serde-universal': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/eventstream-serde-universal': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.8': + '@smithy/eventstream-serde-config-resolver@4.3.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.8': + '@smithy/eventstream-serde-node@4.2.10': dependencies: - '@smithy/eventstream-serde-universal': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/eventstream-serde-universal': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.8': + '@smithy/eventstream-serde-universal@4.2.10': dependencies: - '@smithy/eventstream-codec': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/eventstream-codec': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.9': + '@smithy/fetch-http-handler@5.3.11': dependencies: - '@smithy/protocol-http': 5.3.8 - '@smithy/querystring-builder': 4.2.8 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 + '@smithy/protocol-http': 5.3.10 + '@smithy/querystring-builder': 4.2.10 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.1 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.2.9': + '@smithy/hash-blob-browser@4.2.11': dependencies: - '@smithy/chunked-blob-reader': 5.2.0 - '@smithy/chunked-blob-reader-native': 4.2.1 - '@smithy/types': 4.12.0 + '@smithy/chunked-blob-reader': 5.2.1 + '@smithy/chunked-blob-reader-native': 4.2.2 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/hash-node@4.2.8': + '@smithy/hash-node@4.2.10': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/types': 4.13.0 + '@smithy/util-buffer-from': 4.2.1 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@smithy/hash-stream-node@4.2.8': + '@smithy/hash-stream-node@4.2.10': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/types': 4.13.0 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.8': + '@smithy/invalid-dependency@4.2.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.0': + '@smithy/is-array-buffer@4.2.1': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.2.8': + '@smithy/md5-js@4.2.10': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/types': 4.13.0 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.8': + '@smithy/middleware-content-length@4.2.10': dependencies: - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.16': + '@smithy/middleware-endpoint@4.4.20': dependencies: - '@smithy/core': 3.23.2 - '@smithy/middleware-serde': 4.2.9 - '@smithy/node-config-provider': 4.3.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-middleware': 4.2.8 + '@smithy/core': 3.23.6 + '@smithy/middleware-serde': 4.2.11 + '@smithy/node-config-provider': 4.3.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.10 + '@smithy/util-middleware': 4.2.10 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.33': + '@smithy/middleware-retry@4.4.37': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/uuid': 1.1.0 + '@smithy/node-config-provider': 4.3.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/service-error-classification': 4.2.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-retry': 4.2.10 + '@smithy/uuid': 1.1.1 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.9': + '@smithy/middleware-serde@4.2.11': dependencies: - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.2.8': + '@smithy/middleware-stack@4.2.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.3.8': + '@smithy/node-config-provider@4.3.10': dependencies: - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@smithy/property-provider': 4.2.10 + '@smithy/shared-ini-file-loader': 4.4.5 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.10': + '@smithy/node-http-handler@4.4.12': dependencies: - '@smithy/abort-controller': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/querystring-builder': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/abort-controller': 4.2.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/querystring-builder': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/property-provider@4.2.8': + '@smithy/property-provider@4.2.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/protocol-http@5.3.8': + '@smithy/protocol-http@5.3.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.8': + '@smithy/querystring-builder@4.2.10': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-uri-escape': 4.2.0 + '@smithy/types': 4.13.0 + '@smithy/util-uri-escape': 4.2.1 tslib: 2.8.1 - '@smithy/querystring-parser@4.2.8': + '@smithy/querystring-parser@4.2.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.2.8': + '@smithy/service-error-classification@4.2.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 - '@smithy/shared-ini-file-loader@4.4.3': + '@smithy/shared-ini-file-loader@4.4.5': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/signature-v4@5.3.8': + '@smithy/signature-v4@5.3.10': dependencies: - '@smithy/is-array-buffer': 4.2.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-uri-escape': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/is-array-buffer': 4.2.1 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 + '@smithy/util-hex-encoding': 4.2.1 + '@smithy/util-middleware': 4.2.10 + '@smithy/util-uri-escape': 4.2.1 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@smithy/smithy-client@4.11.5': + '@smithy/smithy-client@4.12.0': dependencies: - '@smithy/core': 3.23.2 - '@smithy/middleware-endpoint': 4.4.16 - '@smithy/middleware-stack': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.12 + '@smithy/core': 3.23.6 + '@smithy/middleware-endpoint': 4.4.20 + '@smithy/middleware-stack': 4.2.10 + '@smithy/protocol-http': 5.3.10 + '@smithy/types': 4.13.0 + '@smithy/util-stream': 4.5.15 tslib: 2.8.1 - '@smithy/types@4.12.0': + '@smithy/types@4.13.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.8': + '@smithy/url-parser@4.2.10': dependencies: - '@smithy/querystring-parser': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/querystring-parser': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-base64@4.3.0': + '@smithy/util-base64@4.3.1': dependencies: - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-buffer-from': 4.2.1 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.2.0': + '@smithy/util-body-length-browser@4.2.1': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.2.1': + '@smithy/util-body-length-node@4.2.2': dependencies: tslib: 2.8.1 @@ -6544,65 +6485,65 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.0': + '@smithy/util-buffer-from@4.2.1': dependencies: - '@smithy/is-array-buffer': 4.2.0 + '@smithy/is-array-buffer': 4.2.1 tslib: 2.8.1 - '@smithy/util-config-provider@4.2.0': + '@smithy/util-config-provider@4.2.1': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.32': + '@smithy/util-defaults-mode-browser@4.3.36': dependencies: - '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 + '@smithy/property-provider': 4.2.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.35': + '@smithy/util-defaults-mode-node@4.2.39': dependencies: - '@smithy/config-resolver': 4.4.6 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.5 - '@smithy/types': 4.12.0 + '@smithy/config-resolver': 4.4.9 + '@smithy/credential-provider-imds': 4.2.10 + '@smithy/node-config-provider': 4.3.10 + '@smithy/property-provider': 4.2.10 + '@smithy/smithy-client': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.2.8': + '@smithy/util-endpoints@3.3.1': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 + '@smithy/node-config-provider': 4.3.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.2.0': + '@smithy/util-hex-encoding@4.2.1': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.8': + '@smithy/util-middleware@4.2.10': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-retry@4.2.8': + '@smithy/util-retry@4.2.10': dependencies: - '@smithy/service-error-classification': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/service-error-classification': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/util-stream@4.5.12': + '@smithy/util-stream@4.5.15': dependencies: - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.10 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/fetch-http-handler': 5.3.11 + '@smithy/node-http-handler': 4.4.12 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.1 + '@smithy/util-buffer-from': 4.2.1 + '@smithy/util-hex-encoding': 4.2.1 + '@smithy/util-utf8': 4.2.1 tslib: 2.8.1 - '@smithy/util-uri-escape@4.2.0': + '@smithy/util-uri-escape@4.2.1': dependencies: tslib: 2.8.1 @@ -6611,18 +6552,18 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.2.0': + '@smithy/util-utf8@4.2.1': dependencies: - '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-buffer-from': 4.2.1 tslib: 2.8.1 - '@smithy/util-waiter@4.2.8': + '@smithy/util-waiter@4.2.10': dependencies: - '@smithy/abort-controller': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/abort-controller': 4.2.10 + '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/uuid@1.1.0': + '@smithy/uuid@1.1.1': dependencies: tslib: 2.8.1 @@ -6642,7 +6583,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.2.0': + '@tailwindcss/node@4.2.1': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.19.0 @@ -6650,66 +6591,66 @@ snapshots: lightningcss: 1.31.1 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.0 + tailwindcss: 4.2.1 - '@tailwindcss/oxide-android-arm64@4.2.0': + '@tailwindcss/oxide-android-arm64@4.2.1': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.0': + '@tailwindcss/oxide-darwin-arm64@4.2.1': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.0': + '@tailwindcss/oxide-darwin-x64@4.2.1': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.0': + '@tailwindcss/oxide-freebsd-x64@4.2.1': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.0': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.0': + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.0': + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.0': + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.0': + '@tailwindcss/oxide-linux-x64-musl@4.2.1': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.0': + '@tailwindcss/oxide-wasm32-wasi@4.2.1': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.0': + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.0': + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': optional: true - '@tailwindcss/oxide@4.2.0': + '@tailwindcss/oxide@4.2.1': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.0 - '@tailwindcss/oxide-darwin-arm64': 4.2.0 - '@tailwindcss/oxide-darwin-x64': 4.2.0 - '@tailwindcss/oxide-freebsd-x64': 4.2.0 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.0 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.0 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.0 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.0 - '@tailwindcss/oxide-linux-x64-musl': 4.2.0 - '@tailwindcss/oxide-wasm32-wasi': 4.2.0 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.0 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.0 + '@tailwindcss/oxide-android-arm64': 4.2.1 + '@tailwindcss/oxide-darwin-arm64': 4.2.1 + '@tailwindcss/oxide-darwin-x64': 4.2.1 + '@tailwindcss/oxide-freebsd-x64': 4.2.1 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 + '@tailwindcss/oxide-linux-x64-musl': 4.2.1 + '@tailwindcss/oxide-wasm32-wasi': 4.2.1 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - '@tailwindcss/postcss@4.2.0': + '@tailwindcss/postcss@4.2.1': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.2.0 - '@tailwindcss/oxide': 4.2.0 + '@tailwindcss/node': 4.2.1 + '@tailwindcss/oxide': 4.2.1 postcss: 8.5.6 - tailwindcss: 4.2.0 + tailwindcss: 4.2.1 '@testing-library/dom@10.4.1': dependencies: @@ -7050,9 +6991,9 @@ snapshots: agent-base@7.1.4: {} - ai@6.0.97(zod@4.3.6): + ai@6.0.100(zod@4.3.6): dependencies: - '@ai-sdk/gateway': 3.0.53(zod@4.3.6) + '@ai-sdk/gateway': 3.0.55(zod@4.3.6) '@ai-sdk/provider': 3.0.8 '@ai-sdk/provider-utils': 4.0.15(zod@4.3.6) '@opentelemetry/api': 1.9.0 @@ -9067,13 +9008,13 @@ snapshots: pg-int8@1.0.1: {} - pg-pool@3.11.0(pg@8.18.0): + pg-pool@3.12.0(pg@8.19.0): dependencies: - pg: 8.18.0 + pg: 8.19.0 pg-protocol@1.10.3: {} - pg-protocol@1.11.0: {} + pg-protocol@1.12.0: {} pg-types@2.2.0: dependencies: @@ -9083,11 +9024,11 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.18.0: + pg@8.19.0: dependencies: pg-connection-string: 2.11.0 - pg-pool: 3.11.0(pg@8.18.0) - pg-protocol: 1.11.0 + pg-pool: 3.12.0(pg@8.19.0) + pg-protocol: 1.12.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -9584,7 +9525,7 @@ snapshots: tagged-tag@1.0.0: {} - tailwindcss@4.2.0: {} + tailwindcss@4.2.1: {} tapable@2.3.0: {} diff --git a/proxy.ts b/proxy.ts index 337c614e..ea92250c 100644 --- a/proxy.ts +++ b/proxy.ts @@ -47,11 +47,12 @@ export const config = { // - /favicon.ico + /favicons/* // - /grid // - /full + // - /about // - / (root) // - /home-image // - /template-image // - /template-image-tight // - /template-url // eslint-disable-next-line max-len - matcher: ['/((?!api$|api/auth|_next/static|_next/image|favicon.ico$|favicons/|grid$|full$|home-image$|template-image$|template-image-tight$|template-url$|$).*)'], + matcher: ['/((?!api$|api/auth|_next/static|_next/image|favicon.ico$|favicons/|grid$|full$|about$|home-image$|template-image$|template-image-tight$|template-url$|$).*)'], }; diff --git a/src/about/AboutPageClient.tsx b/src/about/AboutPageClient.tsx new file mode 100644 index 00000000..1683cfff --- /dev/null +++ b/src/about/AboutPageClient.tsx @@ -0,0 +1,213 @@ +'use client'; + +import PhotoAlbum from '@/album/PhotoAlbum'; +import { useAppState } from '@/app/AppState'; +import PhotoCamera from '@/camera/PhotoCamera'; +import AnimateItems from '@/components/AnimateItems'; +import AppGrid from '@/components/AppGrid'; +import PhotoFilm from '@/film/PhotoFilm'; +import PhotoLens from '@/lens/PhotoLens'; +import { Photo } from '@/photo'; +import PhotoRecipe from '@/recipe/PhotoRecipe'; +import PhotoTag from '@/tag/PhotoTag'; +import clsx from 'clsx/lite'; +import { formatDistanceToNowStrict } from 'date-fns'; +import AdminAboutMenu from './AdminAboutMenu'; +import PhotoLarge from '@/photo/PhotoLarge'; +import { ReactNode, useMemo } from 'react'; +import { Camera } from '@/camera'; +import { Lens } from '@/lens'; +import { Album } from '@/album'; +import { useAppText } from '@/i18n/state/client'; +import PhotoAvatar from '@/photo/PhotoAvatar'; +import Link from 'next/link'; +import { PATH_ADMIN_ABOUT_EDIT } from '@/app/path'; +import { LuCirclePlus, LuUser } from 'react-icons/lu'; +import AdminEmptyState from '@/admin/AdminEmptyState'; + +export default function AboutPageClient({ + title, + subhead, + description, + photosCount = 0, + photosOldest, + photoAvatar, + photoHero, + camera, + lens, + recipe, + film, + album, + tag, + lastUpdated, +}: { + title?: string + subhead?: string + description?: ReactNode + photosCount?: number + photosOldest?: string + photoAvatar?: Photo + photoHero?: Photo + camera?: Camera + lens?: Lens + recipe?: string + film?: string + album?: Album + tag?: string + lastUpdated?: Date +}) { + const { + isUserSignedIn, + } = useAppState(); + + const appText = useAppText(); + + const renderItem = (label: string, content?: ReactNode) => ( +
+
+ {label} +
+
+ {content || '--'} +
+
+ ); + + const items = useMemo(() => [ + renderItem( + appText.about.photoCount, + photosCount.toString().padStart(4, '0'), + ), + renderItem( + appText.about.firstPhoto, + photosOldest?.slice(0, 10), + ), + camera && renderItem( + appText.about.topCamera, + , + ), + lens && renderItem( + appText.about.topLens, + , + ), + recipe && renderItem( + appText.about.topRecipe, + , + ), + film && renderItem( + appText.about.topFilm, + , + ), + album && renderItem( + appText.about.recentAlbum, + , + ), + tag && renderItem( + appText.about.popularTag, + , + ), + ].filter(Boolean), [ + appText.about, + photosCount, + photosOldest, + camera, + lens, + recipe, + film, + album, + tag, + ]); + + return ( + + +
+ } + /> +
+
+
+ {title || appText.about.titleDefault} +
+ {subhead && +
{subhead}
} +
+ {lastUpdated &&
+ {appText.about.updated( + formatDistanceToNowStrict(lastUpdated), + )} +
} +
+ {isUserSignedIn && } +
+ {description + ?
+ {description} +
+ : isUserSignedIn && + + } + includeContainer={false} + className="gap-3! p-6!" + > + Add optional description + + } + +
} /> + {photoHero && + } + ]} + /> + ); +} diff --git a/src/about/AdminAboutEditPage.tsx b/src/about/AdminAboutEditPage.tsx new file mode 100644 index 00000000..79ba4d56 --- /dev/null +++ b/src/about/AdminAboutEditPage.tsx @@ -0,0 +1,126 @@ +'use client'; + +import { PATH_ABOUT } from '@/app/path'; +import LinkWithStatus from '@/components/LinkWithStatus'; +import { useState } from 'react'; +import { About, AboutInsert } from '.'; +import FieldsetWithStatus from '@/components/FieldsetWithStatus'; +import AdminChildPage from '@/components/AdminChildPage'; +import { updateAboutAction } from './actions'; +import SubmitButtonWithStatus from '@/components/SubmitButtonWithStatus'; +import { Photo } from '@/photo'; +import PhotoAvatar from '@/photo/PhotoAvatar'; +import PhotoMedium from '@/photo/PhotoMedium'; +import clsx from 'clsx/lite'; +import useDynamicPhoto from '@/photo/useDynamicPhoto'; +import { useAppText } from '@/i18n/state/client'; + +export default function AdminAboutEditPage({ + about, + photoAvatar: _photoAvatar, + photoHero: _photoHero, +}: { + about?: About + photoAvatar?: Photo + photoHero?: Photo + shouldResizeImages?: boolean +}) { + const appText = useAppText(); + + const [aboutForm, setAboutForm] = useState>(about ?? {}); + + const { + photo: photoAvatar, + isLoading: isLoadingPhotoAvatar, + } = useDynamicPhoto({ + initialPhoto: _photoAvatar, + photoId: aboutForm?.photoIdAvatar, + }); + + const { + photo: photoHero, + isLoading: isLoadingPhotoHero, + } = useDynamicPhoto({ + initialPhoto: _photoHero, + photoId: aboutForm?.photoIdHero, + }); + + const convertUrlToPhotoId = (url?: string) => url?.split('/').pop(); + + return ( + +
+
+ + setAboutForm(form => + ({ ...form, photoIdAvatar: convertUrlToPhotoId(photoIdAvatar) }))} + loading={isLoadingPhotoAvatar} + /> + setAboutForm(form => + ({ ...form, title }))} + /> + setAboutForm(form => + ({ ...form, subhead }))} + /> + setAboutForm(form => + ({ ...form, description }))} + /> + setAboutForm(form => + ({ ...form, photoIdHero: convertUrlToPhotoId(photoIdHero) }))} + loading={isLoadingPhotoHero} + /> + {photoHero && +
+ +
} +
+
+ + Cancel + + + Update + +
+
+
+ ); +} diff --git a/src/about/AdminAboutMenu.tsx b/src/about/AdminAboutMenu.tsx new file mode 100644 index 00000000..45d40f7b --- /dev/null +++ b/src/about/AdminAboutMenu.tsx @@ -0,0 +1,18 @@ +import MoreMenu from '@/components/more/MoreMenu'; +import { PATH_ADMIN_ABOUT_EDIT } from '@/app/path'; +import IconEdit from '@/components/icons/IconEdit'; + +export default function AdminAlbumMenu() { + return ( + , + href: PATH_ADMIN_ABOUT_EDIT, + }], + }]} + /> + ); +} diff --git a/src/about/actions.ts b/src/about/actions.ts new file mode 100644 index 00000000..09df7669 --- /dev/null +++ b/src/about/actions.ts @@ -0,0 +1,18 @@ +'use server'; + +import { revalidateAboutKey } from '@/cache'; +import { upsertAbout } from './query'; +import { runAuthenticatedAdminServerAction } from '@/auth/server'; +import { redirect } from 'next/navigation'; +import { PATH_ABOUT } from '@/app/path'; +import { convertFormDataToAbout } from './form'; +import { revalidatePath } from 'next/cache'; + +export const updateAboutAction = async (formData: FormData) => + runAuthenticatedAdminServerAction(async () => { + const about = convertFormDataToAbout(formData); + await upsertAbout(about); + revalidateAboutKey(); + revalidatePath(PATH_ABOUT); + redirect(PATH_ABOUT); + }); diff --git a/src/about/cache.ts b/src/about/cache.ts new file mode 100644 index 00000000..b8c93257 --- /dev/null +++ b/src/about/cache.ts @@ -0,0 +1,9 @@ +import { unstable_cache } from 'next/cache'; +import { getAbout } from './query'; +import { KEY_ABOUT, KEY_PHOTOS } from '@/cache'; + +export const getAboutCached = + unstable_cache( + getAbout, + [KEY_PHOTOS, KEY_ABOUT], + ); diff --git a/src/about/form.ts b/src/about/form.ts new file mode 100644 index 00000000..28e610be --- /dev/null +++ b/src/about/form.ts @@ -0,0 +1,13 @@ +import { AboutInsert } from '.'; + +export const convertFormDataToAbout = (formData: FormData): AboutInsert => { + const id = formData.get('id'); + return { + id: id ? Number(id) : 0, + title: (formData.get('title') as string) || undefined, + subhead: (formData.get('subhead') as string) || undefined, + description: (formData.get('description') as string) || undefined, + photoIdAvatar: (formData.get('photoIdAvatar') as string) || undefined, + photoIdHero: (formData.get('photoIdHero') as string) || undefined, + }; +}; diff --git a/src/about/index.ts b/src/about/index.ts new file mode 100644 index 00000000..4d1f71bc --- /dev/null +++ b/src/about/index.ts @@ -0,0 +1,13 @@ +export interface AboutInsert { + id: number + title?: string + subhead?: string + description?: string + photoIdAvatar?: string + photoIdHero?: string +} + +export interface About extends AboutInsert { + createdAt: Date + updatedAt: Date +} diff --git a/src/about/query.ts b/src/about/query.ts new file mode 100644 index 00000000..fe497e60 --- /dev/null +++ b/src/about/query.ts @@ -0,0 +1,63 @@ +import { sql } from '@/platforms/postgres'; +import { About, AboutInsert } from '.'; +import { safelyQuery } from '@/db/query'; +import camelcaseKeys from 'camelcase-keys'; + +const ABOUT_ID = 1; + +export const createAboutTable = () => + sql` + CREATE TABLE IF NOT EXISTS about ( + id SERIAL PRIMARY KEY, + title VARCHAR(255), + subhead TEXT, + description TEXT, + photo_id_avatar VARCHAR(8) REFERENCES photos(id), + photo_id_hero VARCHAR(8) REFERENCES photos(id), + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP + ) + `; + +export const upsertAbout = (about: AboutInsert) => + safelyQuery(() => sql` + INSERT INTO about ( + id, + title, + subhead, + description, + photo_id_avatar, + photo_id_hero, + updated_at, + created_at + ) VALUES ( + ${ABOUT_ID}, + ${about.title}, + ${about.subhead}, + ${about.description}, + ${about.photoIdAvatar}, + ${about.photoIdHero}, + ${new Date().toISOString()}, + ${new Date().toISOString()} + ) + ON CONFLICT (id) DO UPDATE SET + title = EXCLUDED.title, + subhead = EXCLUDED.subhead, + description = EXCLUDED.description, + photo_id_avatar = EXCLUDED.photo_id_avatar, + photo_id_hero = EXCLUDED.photo_id_hero, + updated_at = CURRENT_TIMESTAMP + RETURNING id + `.then(({ rows }) => rows[0]?.id as number) + , 'insertAbout'); + +export const getAbout = () => + safelyQuery(() => sql` + SELECT * FROM about LIMIT 1 + `.then(({ rows }) => rows[0] + ? camelcaseKeys( + rows[0] as unknown as Record, + ) as unknown as About + : undefined, + ) + , 'getAbout'); diff --git a/src/admin/AdminAppMenu.tsx b/src/admin/AdminAppMenu.tsx index 9d7be0a6..e627b58a 100644 --- a/src/admin/AdminAppMenu.tsx +++ b/src/admin/AdminAppMenu.tsx @@ -34,6 +34,11 @@ import { MoreMenuSection } from '@/components/more/MoreMenu'; import { FiXSquare } from 'react-icons/fi'; import { useSelectPhotosState } from './select/SelectPhotosState'; import IconAlbum from '@/components/icons/IconAlbum'; +import { SHOW_ABOUT_PAGE } from '@/app/config'; +import { + HEIGHT_CLASS, + SWITCHER_ITEM_WIDTH, +} from '@/components/switcher/SwitcherItem'; export default function AdminAppMenu({ isOpen, @@ -220,23 +225,25 @@ export default function AdminAppMenu({ return ( + icon={
} align="start" - sideOffset={12} - alignOffset={-84} + sideOffset={10} + alignOffset={SHOW_ABOUT_PAGE + ? -(SWITCHER_ITEM_WIDTH * 3) + : -(SWITCHER_ITEM_WIDTH * 2)} onOpen={refreshAdminData} sections={sections} ariaLabel="Admin Menu" classNameButtonOpen={clsx( - '[&>*>*]:translate-y-[6px]', + '[&>*>*]:translate-y-[8px]', '[&>*>*]:duration-300', )} /> diff --git a/src/admin/AdminEmptyState.tsx b/src/admin/AdminEmptyState.tsx index 3eaef77f..489be3ee 100644 --- a/src/admin/AdminEmptyState.tsx +++ b/src/admin/AdminEmptyState.tsx @@ -5,16 +5,19 @@ import { IoInformationCircleOutline } from 'react-icons/io5'; export default function AdminEmptyState({ icon, children, + className, includeContainer = true, }: { icon?: ReactNode children: ReactNode + className?: string includeContainer?: boolean }) { return (
diff --git a/src/admin/config/AdminAppConfigurationClient.tsx b/src/admin/config/AdminAppConfigurationClient.tsx index afd086a3..b631e458 100644 --- a/src/admin/config/AdminAppConfigurationClient.tsx +++ b/src/admin/config/AdminAppConfigurationClient.tsx @@ -26,7 +26,7 @@ import { } from '@/photo/ai'; import clsx from 'clsx/lite'; import Link from 'next/link'; -import { PATH_FEED_JSON, PATH_RSS_XML } from '@/app/path'; +import { PATH_ABOUT, PATH_FEED_JSON, PATH_RSS_XML } from '@/app/path'; import { APP_DEFAULT_SORT_BY, DEFAULT_SORT_BY_OPTIONS } from '@/photo/sort'; import { AdminConfigSection, @@ -68,8 +68,8 @@ export default function AdminAppConfigurationClient({ hasNavTitle, navCaption, hasNavCaption, - pageAbout, - hasPageAbout, + sidebarText, + hasSidebarText, // Performance isStaticallyOptimized, arePhotosStaticallyOptimized, @@ -106,6 +106,7 @@ export default function AdminAppConfigurationClient({ colorSortChromaCutoff, isSortWithPriority, // Display + showAboutPage, showKeyboardShortcutTooltips, showExifInfo, showZoomControls, @@ -377,7 +378,7 @@ export default function AdminAppConfigurationClient({ status={hasAuthSecret} isPending={!hasAuthSecret && isAnalyzingConfiguration} > - Store auth secret in environment variable: + Store auth secret in environment variable {!hasAuthSecret &&
@@ -390,7 +391,7 @@ export default function AdminAppConfigurationClient({ > Store admin email/password {' '} - in environment variables: + in environment variables {renderEnvVars([ 'ADMIN_EMAIL', 'ADMIN_PASSWORD', @@ -405,8 +406,7 @@ export default function AdminAppConfigurationClient({ optional > {renderContent(locale)} - Store in environment variable - (check README for + Check README for {' '} supported languages - ): {renderEnvVars(['NEXT_PUBLIC_LOCALE'])} {renderContent(domain)} - Store in environment variable - (used in explicit share urls, seen in nav if no title is defined): + Used in explicit share urls (seen in nav if no title is defined) {renderEnvVars(['NEXT_PUBLIC_DOMAIN'])} {renderContent(metaTitle)} - Store in environment variable - (seen in search results and browser tab): + Seen in search results and browser tab {renderEnvVars(['NEXT_PUBLIC_META_TITLE'])} {!simplifiedView && <> @@ -443,8 +440,7 @@ export default function AdminAppConfigurationClient({ optional > {renderContent(metaDescription)} - Store in environment variable - (seen in search results): + Seen in search results {renderEnvVars(['NEXT_PUBLIC_META_DESCRIPTION'])} {renderContent(navTitle)} - Store in environment variable (replaces domain in top-right nav): + Replaces domain in top-right nav {renderEnvVars(['NEXT_PUBLIC_NAV_TITLE'])} {hasNavCaption && renderContent(navCaption)} - Store in environment variable - (seen in top-right nav, under title): + Seen in top-right nav, under title {renderEnvVars(['NEXT_PUBLIC_NAV_CAPTION'])} - {hasPageAbout && renderContent(pageAbout)} - Store in environment variable (seen in sidebar): - {renderEnvVars(['NEXT_PUBLIC_PAGE_ABOUT'])} + {hasSidebarText && renderContent(sidebarText)} + Seen in sidebar on desktop grid view + {renderEnvVars(['NEXT_PUBLIC_SIDEBAR_TEXT'])} } ; @@ -510,7 +505,7 @@ export default function AdminAppConfigurationClient({ text descriptions, including an invisible field called {' '} {'"Semantic Description"'}, which supports CMD-K search - and image accessibility: + and image accessibility {renderEnvVars(['OPENAI_SECRET_KEY'])} ; @@ -554,7 +549,7 @@ export default function AdminAppConfigurationClient({ {' '} (default: {renderCommaSeparatedList( AI_AUTO_GENERATED_FIELDS_DEFAULT, - )}): + )}) {renderEnvVars(['AI_TEXT_AUTO_GENERATED_FIELDS'])} Store base URL in environment variable to use - alternate OpenAI-compatible providers: + alternate OpenAI-compatible providers {renderEnvVars(['OPENAI_BASE_URL'])} ; @@ -587,7 +582,7 @@ export default function AdminAppConfigurationClient({ > Set environment variable to {'"1"'} to make site more responsive by enabling static optimization - (i.e., rendering pages and images at build time): + (i.e., rendering pages and images at build time)
{renderSubStatusWithEnvVar( arePhotosStaticallyOptimized ? 'checked' : 'optional', @@ -614,7 +609,7 @@ export default function AdminAppConfigurationClient({ optional > Set environment variable to {'"1"'} to prevent - image uploads being compressed before storing: + image uploads being compressed before storing {renderEnvVars(['NEXT_PUBLIC_PRESERVE_ORIGINAL_UPLOADS'])} Set environment variable to {'"1"'} to prevent - image blur data being stored and displayed: + image blur data being stored and displayed {renderEnvVars(['NEXT_PUBLIC_BLUR_DISABLED'])} ; @@ -650,7 +645,7 @@ export default function AdminAppConfigurationClient({ Configure order and visibility of categories (seen in grid sidebar and CMD-K results) by storing comma-separated values - (default: {renderCommaSeparatedList(DEFAULT_CATEGORY_KEYS)}): + (default: {renderCommaSeparatedList(DEFAULT_CATEGORY_KEYS)})
{renderEnvVars(['NEXT_PUBLIC_CATEGORY_VISIBILITY'])}
@@ -662,7 +657,7 @@ export default function AdminAppConfigurationClient({
Set environment variable to {'"1"'} to prevent categories - displaying on mobile grid view: + displaying on mobile grid view {renderEnvVars(['NEXT_PUBLIC_HIDE_CATEGORIES_ON_MOBILE'])}
@@ -675,7 +670,7 @@ export default function AdminAppConfigurationClient({
Set environment variable to {'"1"'} to prevent images - displaying when hovering over category links: + displaying when hovering over category links {renderEnvVars(['NEXT_PUBLIC_HIDE_CATEGORY_IMAGE_HOVERS'])}
@@ -727,7 +722,7 @@ export default function AdminAppConfigurationClient({ optional > Set environment variable to {'"none"'}, {'"toggle"'} (default), - or {'"menu"'}, to control sort UI on grid/full homepages: + or {'"menu"'}, to control sort UI on grid/full homepages {renderEnvVars(['NEXT_PUBLIC_NAV_SORT_CONTROL'])} Set environment variable to {'"1"'} to take priority field into account when sorting photos (enabling may have - performance consequences): + performance consequences) {renderEnvVars(['NEXT_PUBLIC_PRIORITY_BASED_SORTING'])} ; case 'Display': return <> + + Set environment variable to {'"1"'} to hide + {' '} + {renderLink(PATH_ABOUT)} page + {renderEnvVars(['NEXT_PUBLIC_HIDE_ABOUT_PAGE'])} + Set environment variable to {'"1"'} to hide keyboard shortcut - tooltips in areas like the main nav, and previous/next photo links: + tooltips in areas like the main nav, and previous/next photo links {renderEnvVars(['NEXT_PUBLIC_HIDE_KEYBOARD_SHORTCUT_TOOLTIPS'])} - Set environment variable to {'"1"'} to hide EXIF data: + Set environment variable to {'"1"'} to hide EXIF data {renderEnvVars(['NEXT_PUBLIC_HIDE_EXIF_DATA'])} Set environment variable to {'"1"'} to hide - fullscreen photo zoom controls: + fullscreen photo zoom controls {renderEnvVars(['NEXT_PUBLIC_HIDE_ZOOM_CONTROLS'])} Set environment variable to {'"1"'} to hide - taken at time from photo meta: + taken at time from photo meta {renderEnvVars(['NEXT_PUBLIC_HIDE_TAKEN_AT_TIME'])} - Set environment variable to {'"1"'} to hide footer link: + Set environment variable to {'"1"'} to hide footer link {renderEnvVars(['NEXT_PUBLIC_HIDE_REPO_LINK'])} ; @@ -835,7 +840,7 @@ export default function AdminAppConfigurationClient({ optional > Set environment variable to {'"1"'} to show grid layout - on homepage: + on homepage {renderEnvVars(['NEXT_PUBLIC_GRID_HOMEPAGE'])} Set environment variable to any number to enforce aspect ratio {' '} - (default is {'"1"'}, i.e., square)—set to {'"0"'} to disable: + (default is {'"1"'}, i.e., square)—set to {'"0"'} to disable {renderEnvVars(['NEXT_PUBLIC_GRID_ASPECT_RATIO'])} Set environment variable to {'"1"'} to ensure large thumbnails on photo grid views (if not configured, density is based on - aspect ratio): + aspect ratio) {renderEnvVars(['NEXT_PUBLIC_SHOW_LARGE_THUMBNAILS'])} ; @@ -870,7 +875,7 @@ export default function AdminAppConfigurationClient({ {' '} to configure initial theme {' '} - (defaults to {'\'system\''}): + (defaults to {'\'system\''}) {renderEnvVars(['NEXT_PUBLIC_DEFAULT_THEME'])} Set environment variable to {'"1"'} to constrain the size {' '} - of each photo, and display a surrounding border: + of each photo, and display a surrounding border
@@ -891,7 +896,7 @@ export default function AdminAppConfigurationClient({ optional > Set environment variable hex values (e.g., #cccccc) - to override matte colors: + to override matte colors
Set environment variable to {'"1"'} to disable - collection/display of location-based data: + collection/display of location-based data {renderEnvVars(['NEXT_PUBLIC_GEO_PRIVACY'])} Set environment variable to {'"1"'} to enable - public photo downloads for all visitors: + public photo downloads for all visitors {renderEnvVars(['NEXT_PUBLIC_ALLOW_PUBLIC_DOWNLOADS'])} - Set environment variable to {'"1"'} to enable feeds at + Set environment variable to {'"1"'} to enable {' '} - {renderLink(PATH_FEED_JSON)} and {renderLink(PATH_RSS_XML)}: + {renderLink(PATH_FEED_JSON)} and {renderLink(PATH_RSS_XML)} + {' '} + feeds {renderEnvVars(['NEXT_PUBLIC_SITE_FEEDS'])} Set environment variable to {'"BOTTOM"'} to - keep OG image text bottom aligned (default is {'"top"'}): + keep OG image text bottom aligned (default is {'"top"'}) {renderEnvVars(['NEXT_PUBLIC_OG_TEXT_ALIGNMENT'])} ; @@ -983,7 +990,7 @@ export default function AdminAppConfigurationClient({ )}
} Set environment variable to comma-separated list of URLs - to be added to the bottom of the body tag via {'"next/script"'}: + to be added to the bottom of the body tag via {'"next/script"'} {renderEnvVars(['PAGE_SCRIPT_URLS'])}
; @@ -995,7 +1002,7 @@ export default function AdminAppConfigurationClient({ optional > Set environment variable to {'"1"'} to disable build identifier - and admin configuration export: + and admin configuration export {renderEnvVars(['DISABLE_DEBUG_OUTPUTS'])} ; @@ -1007,7 +1014,7 @@ export default function AdminAppConfigurationClient({ optional > Set environment variable to {'"1"'} to temporarily enable - features like photo matting, baseline grid, etc.: + features like photo matting, baseline grid, etc. {renderEnvVars(['ADMIN_DEBUG_TOOLS'])} Set environment variable to {'"1"'} to enable - console output for all sql queries: + console output for all sql queries {renderEnvVars(['ADMIN_SQL_DEBUG'])} Set environment variable to {'"1"'} to enable - storage debugging: + storage debugging {renderEnvVars(['ADMIN_STORAGE_DEBUG'])} ; diff --git a/src/album/AlbumHeader.tsx b/src/album/AlbumHeader.tsx index 68062012..8de0d723 100644 --- a/src/album/AlbumHeader.tsx +++ b/src/album/AlbumHeader.tsx @@ -33,6 +33,7 @@ export default async function AlbumHeader({ showAlbumMeta?: boolean }) { const appText = await getAppText(); + return ( { @@ -82,6 +88,7 @@ export default function AppViewSwitcher({ const refHrefFull = useRef(null); const refHrefGrid = useRef(null); + const refHrefAbout = useRef(null); const [isAdminMenuOpen, setIsAdminMenuOpen] = useState(false); @@ -94,19 +101,19 @@ export default function AppViewSwitcher({ case KEY_COMMANDS.grid: if (pathname !== PATH_GRID_INFERRED) { refHrefGrid.current?.click(); } break; - case KEY_COMMANDS.admin: - if (isUserSignedIn) { setIsAdminMenuOpen(true); } + case KEY_COMMANDS.about: + if (pathname !== PATH_ABOUT) { refHrefAbout.current?.click(); } break; } } - }, [pathname, isUserSignedIn]); + }, [pathname]); useKeydownHandler({ onKeyDown }); const [isSortMenuOpen, setIsSortMenuOpen] = useState(false); const renderItemFull = } + icon={} href={pathFull} hrefRef={refHrefFull} active={currentSelection === 'full'} @@ -119,7 +126,7 @@ export default function AppViewSwitcher({ const renderItemGrid = } + icon={} href={pathGrid} hrefRef={refHrefGrid} active={currentSelection === 'grid'} @@ -141,6 +148,18 @@ export default function AppViewSwitcher({ > {GRID_HOMEPAGE_ENABLED ? renderItemGrid : renderItemFull} {GRID_HOMEPAGE_ENABLED ? renderItemFull : renderItemGrid} + {SHOW_ABOUT_PAGE && + } + href={PATH_ABOUT} + hrefRef={refHrefAbout} + active={currentSelection === 'about'} + tooltip={{...SHOW_KEYBOARD_SHORTCUT_TOOLTIPS && { + content: appText.nav.about, + keyCommand: KEY_COMMANDS.about, + }}} + noPadding + />} {/* Show spinner if admin is suspected to be logged in */} {(isUserSignedInEager && !isUserSignedIn) && } @@ -166,7 +184,6 @@ export default function AppViewSwitcher({ tooltip={{ ...!isAdminMenuOpen && SHOW_KEYBOARD_SHORTCUT_TOOLTIPS && { content: appText.nav.admin, - keyCommand: KEY_COMMANDS.admin, }, }} noPadding @@ -224,7 +241,7 @@ export default function AppViewSwitcher({ } + icon={} onClick={() => setIsCommandKOpen?.(true)} tooltip={{...SHOW_KEYBOARD_SHORTCUT_TOOLTIPS && { content: appText.nav.search, diff --git a/src/app/Footer.tsx b/src/app/Footer.tsx index 9a7b4292..ce0f499b 100644 --- a/src/app/Footer.tsx +++ b/src/app/Footer.tsx @@ -53,7 +53,7 @@ export default function Footer() { ? <> {userEmail || userEmailEager} diff --git a/src/app/Nav.tsx b/src/app/Nav.tsx index 66ef03b6..de9e68a0 100644 --- a/src/app/Nav.tsx +++ b/src/app/Nav.tsx @@ -7,6 +7,6 @@ export default async function Nav() { return 0} + isInEmptyState={photos.length === 0} />; } diff --git a/src/app/NavClient.tsx b/src/app/NavClient.tsx index 797c574c..91c31bec 100644 --- a/src/app/NavClient.tsx +++ b/src/app/NavClient.tsx @@ -7,6 +7,7 @@ import AppGrid from '../components/AppGrid'; import AppViewSwitcher, { SwitcherSelection } from '@/app/AppViewSwitcher'; import { PATH_ROOT, + isPathAbout, isPathAdmin, isPathFull, isPathGrid, @@ -29,11 +30,11 @@ const NAV_HEIGHT_CLASS = NAV_CAPTION export default function NavClient({ navTitle, navCaption, - animate, + isInEmptyState, }: { navTitle: string navCaption?: string - animate: boolean + isInEmptyState: boolean }) { const ref = useRef(null); @@ -65,6 +66,8 @@ export default function NavClient({ return 'grid'; } else if (isPathFull(pathname)) { return 'full'; + } else if (isPathAbout(pathname)) { + return 'about'; } else if (isPathProtected(pathname)) { return 'admin'; } @@ -77,14 +80,14 @@ export default function NavClient({ contentMain={
- +
- +
diff --git a/src/app/config.ts b/src/app/config.ts index d690006d..dae6b18f 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -146,9 +146,10 @@ export const NAV_TITLE = SITE_DOMAIN_SHORT || META_TITLE; -export const PAGE_ABOUT = +export const SIDEBAR_TEXT = + process.env.NEXT_PUBLIC_SIDEBAR_TEXT || + // Legacy environment variables process.env.NEXT_PUBLIC_PAGE_ABOUT || - // Legacy environment variable process.env.NEXT_PUBLIC_SITE_ABOUT; // STORAGE @@ -323,6 +324,8 @@ export const NAV_SORT_CONTROL = COLOR_SORT_ENABLED // DISPLAY +export const SHOW_ABOUT_PAGE = + process.env.NEXT_PUBLIC_HIDE_ABOUT_PAGE !== '1'; export const SHOW_KEYBOARD_SHORTCUT_TOOLTIPS = process.env.NEXT_PUBLIC_HIDE_KEYBOARD_SHORTCUT_TOOLTIPS !== '1'; export const SHOW_EXIF_DATA = @@ -442,8 +445,8 @@ export const APP_CONFIGURATION = { hasNavTitle: Boolean(CUSTOM_NAV_TITLE), navCaption: NAV_CAPTION, hasNavCaption: Boolean(NAV_CAPTION), - pageAbout: PAGE_ABOUT, - hasPageAbout: Boolean(process.env.NEXT_PUBLIC_SITE_ABOUT), + sidebarText: SIDEBAR_TEXT, + hasSidebarText: Boolean(SIDEBAR_TEXT), // Performance isStaticallyOptimized: HAS_STATIC_OPTIMIZATION, arePhotosStaticallyOptimized: STATICALLY_OPTIMIZED_PHOTOS, @@ -489,6 +492,7 @@ export const APP_CONFIGURATION = { colorSortChromaCutoff: COLOR_SORT_CHROMA_CUTOFF, isSortWithPriority: USER_DEFAULT_SORT_WITH_PRIORITY, // Display + showAboutPage: SHOW_ABOUT_PAGE, showKeyboardShortcutTooltips: SHOW_KEYBOARD_SHORTCUT_TOOLTIPS, showExifInfo: SHOW_EXIF_DATA, showZoomControls: SHOW_ZOOM_CONTROLS, @@ -552,7 +556,10 @@ const ALL_DEPRECATED_ENV_VARS = [{ replacement: 'NEXT_PUBLIC_META_TITLE', }, { old: 'NEXT_PUBLIC_SITE_ABOUT', - replacement: 'NEXT_PUBLIC_PAGE_ABOUT', + replacement: 'NEXT_PUBLIC_SIDEBAR_TEXT', +}, { + old: 'NEXT_PUBLIC_PAGE_ABOUT', + replacement: 'NEXT_PUBLIC_SIDEBAR_TEXT', }, { old: 'NEXT_PUBLIC_STATICALLY_OPTIMIZE_PAGES', replacement: 'NEXT_PUBLIC_STATICALLY_OPTIMIZE_PHOTOS', diff --git a/src/app/path.ts b/src/app/path.ts index 7573f070..d2b24ad6 100644 --- a/src/app/path.ts +++ b/src/app/path.ts @@ -11,6 +11,7 @@ import { AlbumOrAlbumSlug } from '@/album'; export const PATH_ROOT = '/'; export const PATH_GRID = '/grid'; export const PATH_FULL = '/full'; +export const PATH_ABOUT = '/about'; export const PATH_ADMIN = '/admin'; export const PATH_API = '/api'; export const PATH_SIGN_IN = '/sign-in'; @@ -24,6 +25,10 @@ export const PATH_FULL_INFERRED = GRID_HOMEPAGE_ENABLED ? PATH_FULL : PATH_ROOT; +// Modifiers +const EDIT = 'edit'; +const IMAGE = 'image'; + // Sort export const PARAM_SORT_TYPE_TAKEN_AT = 'taken-at'; export const PARAM_SORT_TYPE_UPLOADED_AT = 'uploaded-at'; @@ -73,6 +78,7 @@ export const PATH_ADMIN_TAGS = `${PATH_ADMIN}/tags`; export const PATH_ADMIN_RECIPES = `${PATH_ADMIN}/recipes`; export const PATH_ADMIN_CONFIGURATION = `${PATH_ADMIN}/configuration`; export const PATH_ADMIN_INSIGHTS = `${PATH_ADMIN}/insights`; +export const PATH_ADMIN_ABOUT_EDIT = `${PATH_ABOUT}/${EDIT}`; export const PATH_ADMIN_BASELINE = `${PATH_ADMIN}/baseline`; export const PATH_ADMIN_COMPONENTS = `${PATH_ADMIN}/components`; @@ -85,10 +91,6 @@ export const PATH_API_STORAGE = `${PATH_API}/storage`; export const PATH_API_VERCEL_BLOB_UPLOAD = `${PATH_API_STORAGE}/vercel-blob`; export const PATH_API_PRESIGNED_URL = `${PATH_API_STORAGE}/presigned-url`; -// Modifiers -const EDIT = 'edit'; -const IMAGE = 'image'; - // Parameters export const PARAM_UPLOAD_TITLE = 'title'; export const PARAM_SELECT = 'select'; @@ -107,6 +109,7 @@ export const PATHS_ADMIN = [ PATH_ADMIN_RECIPES, PATH_ADMIN_INSIGHTS, PATH_ADMIN_CONFIGURATION, + PATH_ADMIN_ABOUT_EDIT, PATH_ADMIN_BASELINE, PATH_ADMIN_COMPONENTS, ]; @@ -115,6 +118,7 @@ export const PATHS_TO_CACHE = [ PATH_ROOT, PATH_GRID, PATH_FULL, + PATH_ABOUT, PATH_OG, PATH_PHOTO_DYNAMIC, PATH_CAMERA_DYNAMIC, @@ -430,10 +434,14 @@ export const isPathGrid = (pathname?: string) => export const isPathFull = (pathname?: string) => checkPathPrefix(pathname, PATH_FULL); +export const isPathAbout = (pathname?: string) => + checkPathPrefix(pathname, PATH_ABOUT); + export const isPathTopLevel = (pathname?: string) => - isPathRoot(pathname)|| + isPathRoot(pathname) || isPathGrid(pathname) || - isPathFull(pathname); + isPathFull(pathname) || + isPathAbout(pathname); export const isPathSignIn = (pathname?: string) => checkPathPrefix(pathname, PATH_SIGN_IN); @@ -460,6 +468,7 @@ export const isPathAdminInfo = (pathname?: string) => export const isPathProtected = (pathname?: string) => checkPathPrefix(pathname, PATH_ADMIN) || checkPathPrefix(pathname, pathForTag(TAG_PRIVATE)) || + checkPathPrefix(pathname, PATH_ADMIN_ABOUT_EDIT) || checkPathPrefix(pathname, PATH_OG); export const getPathComponents = ( diff --git a/src/cache/index.ts b/src/cache/index.ts index 98e70c4e..c77445eb 100644 --- a/src/cache/index.ts +++ b/src/cache/index.ts @@ -1,25 +1,39 @@ import { PATHS_ADMIN, PATHS_TO_CACHE } from '@/app/path'; import { revalidatePath, revalidateTag } from 'next/cache'; +// Page keys +export const KEY_ABOUT = 'about'; // Table key export const KEY_PHOTOS = 'photos'; export const KEY_PHOTO = 'photo'; // Field keys +export const KEY_YEARS = 'years'; export const KEY_CAMERAS = 'cameras'; export const KEY_LENSES = 'lenses'; export const KEY_ALBUMS = 'albums'; export const KEY_TAGS = 'tags'; -export const KEY_FILMS = 'films'; export const KEY_RECIPES = 'recipes'; +export const KEY_FILMS = 'films'; export const KEY_FOCAL_LENGTHS = 'focal-lengths'; -export const KEY_YEARS = 'years'; // Type keys export const KEY_COUNT = 'count'; export const KEY_DATE_RANGE = 'date-range'; +export const revalidateAboutKey = () => + revalidateTag(KEY_ABOUT, 'max'); + export const revalidatePhotosKey = () => revalidateTag(KEY_PHOTOS, 'max'); +export const revalidateYearsKey = () => + revalidateTag(KEY_YEARS, 'max'); + +export const revalidateCamerasKey = () => + revalidateTag(KEY_CAMERAS, 'max'); + +export const revalidateLensesKey = () => + revalidateTag(KEY_LENSES, 'max'); + export const revalidateAlbumsKey = () => revalidateTag(KEY_ALBUMS, 'max'); @@ -29,31 +43,23 @@ export const revalidateTagsKey = () => export const revalidateRecipesKey = () => revalidateTag(KEY_RECIPES, 'max'); -export const revalidateCamerasKey = () => - revalidateTag(KEY_CAMERAS, 'max'); - -export const revalidateLensesKey = () => - revalidateTag(KEY_LENSES, 'max'); - export const revalidateFilmsKey = () => revalidateTag(KEY_FILMS, 'max'); export const revalidateFocalLengthsKey = () => revalidateTag(KEY_FOCAL_LENGTHS, 'max'); -export const revalidateYearsKey = () => - revalidateTag(KEY_YEARS, 'max'); - export const revalidateAllKeys = () => { + revalidateAboutKey(); revalidatePhotosKey(); - revalidateAlbumsKey(); - revalidateTagsKey(); + revalidateYearsKey(); revalidateCamerasKey(); revalidateLensesKey(); - revalidateFilmsKey(); + revalidateAlbumsKey(); + revalidateTagsKey(); revalidateRecipesKey(); + revalidateFilmsKey(); revalidateFocalLengthsKey(); - revalidateYearsKey(); }; export const revalidateAdminPaths = () => { diff --git a/src/category/data.ts b/src/category/data.ts index 84a78dab..883dade2 100644 --- a/src/category/data.ts +++ b/src/category/data.ts @@ -11,7 +11,7 @@ import { } from '@/app/config'; import { createLensKey } from '@/lens'; import { sortTagsByCount } from '@/tag'; -import { sortCategoriesByCount } from '@/category'; +import { PhotoSetCategories, sortCategoriesByCount } from '@/category'; import { sortFocalLengths } from '@/focal'; import { getPhotosMetaCached, @@ -160,3 +160,31 @@ export const getCountsForCategories = async () => { }, {} as Record), }; }; + +export const getLastModifiedForCategories = ( + { + recents, + years, + cameras, + lenses, + albums, + tags, + recipes, + films, + focalLengths, + }: PhotoSetCategories, + photos: { updatedAt: Date }[], +) => [ + ...recents.map(({ lastModified }) => lastModified), + ...years.map(({ lastModified }) => lastModified), + ...cameras.map(({ lastModified }) => lastModified), + ...lenses.map(({ lastModified }) => lastModified), + ...albums.map(({ lastModified }) => lastModified), + ...tags.map(({ lastModified }) => lastModified), + ...recipes.map(({ lastModified }) => lastModified), + ...films.map(({ lastModified }) => lastModified), + ...focalLengths.map(({ lastModified }) => lastModified), + ...photos.map(({ updatedAt }) => updatedAt), +] + .filter(date => date instanceof Date) + .sort((a, b) => b.getTime() - a.getTime())[0]; diff --git a/src/cmdk/CommandKClient.tsx b/src/cmdk/CommandKClient.tsx index 09ffbc83..1fedb886 100644 --- a/src/cmdk/CommandKClient.tsx +++ b/src/cmdk/CommandKClient.tsx @@ -12,6 +12,7 @@ import { useTransition, } from 'react'; import { + PATH_ABOUT, PATH_ADMIN_BASELINE, PATH_ADMIN_COMPONENTS, PATH_ADMIN_CONFIGURATION, @@ -63,6 +64,7 @@ import { COLOR_SORT_ENABLED, GRID_HOMEPAGE_ENABLED, HIDE_TAGS_WITH_ONE_PHOTO, + SHOW_ABOUT_PAGE, } from '@/app/config'; import { DialogDescription, DialogTitle } from '@radix-ui/react-dialog'; import * as VisuallyHidden from '@radix-ui/react-visually-hidden'; @@ -611,6 +613,13 @@ export default function CommandKClient({ ? [pageGrid, pageFull] : [pageFull, pageGrid]; + if (SHOW_ABOUT_PAGE) { + pageItems.push({ + label: appText.nav.about, + path: PATH_ABOUT, + }); + } + const sectionPages: CommandKSection = { heading: appText.cmdk.pages, accessory: , diff --git a/src/components/Container.tsx b/src/components/Container.tsx index 5d916c18..e226055a 100644 --- a/src/components/Container.tsx +++ b/src/components/Container.tsx @@ -32,7 +32,7 @@ export default function Container({ case 'gray-border': return [ 'text-medium', 'bg-extra-dim', - 'border-medium', + 'border border-medium', ]; case 'blue': return [ 'text-blue-800 dark:text-blue-400', diff --git a/src/components/HeaderList.tsx b/src/components/HeaderList.tsx index e80e69a5..211e1eac 100644 --- a/src/components/HeaderList.tsx +++ b/src/components/HeaderList.tsx @@ -44,6 +44,8 @@ export default function HeaderList({ 'dark:text-gray-100', 'flex items-center mb-1 gap-1', 'uppercase select-none', + 'text-sm tracking-wide', + 'translate-x-px', )} > {icon && @@ -67,7 +69,7 @@ export default function HeaderList({ className={clsx( 'mt-0.5', 'text-xs font-medium tracking-wider', - 'border-medium rounded-md', + 'border border-medium rounded-md', 'px-[5px] h-5!', 'hover:bg-dim hover:text-main active:bg-main', 'group', diff --git a/src/components/ImageInput.tsx b/src/components/ImageInput.tsx index ddacbadd..f74e5a97 100644 --- a/src/components/ImageInput.tsx +++ b/src/components/ImageInput.tsx @@ -13,18 +13,21 @@ import { useAppText } from '@/i18n/state/client'; export default function ImageInput({ ref: inputRefExternal, id = 'file', + className, onStart, onBlobReady, multiple = true, shouldResize, maxSize = MAX_IMAGE_SIZE, quality = 0.9, + hidden, showButton, disabled: disabledProp, debug: _debug, }: { ref?: RefObject id?: string + className?: string onStart?: () => void onBlobReady?: (args: { blob: Blob, @@ -36,6 +39,7 @@ export default function ImageInput({ shouldResize?: boolean maxSize?: number quality?: number + hidden?: boolean showButton?: boolean disabled?: boolean debug?: boolean @@ -59,7 +63,10 @@ export default function ImageInput({ const disabled = disabledProp || isUploading; return ( -
+