chore: update package dependencies and improve documentation

- Updated `vite` to the beta version across multiple applications for enhanced features and performance.
- Removed deprecated dependencies such as `@clack/prompts`, `consola`, and `opentype.js` from `devDependencies`.
- Added new storage provider documentation in `routes.json` and updated last modified dates for existing entries.
- Refactored route imports in `routes.ts` to streamline the structure and improve readability.
- Enhanced the Table of Contents (TOC) data structure for better organization and accessibility.

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei
2025-12-05 15:59:07 +08:00
parent f1738ae749
commit 51df233429
19 changed files with 409 additions and 267 deletions

View File

@@ -65,6 +65,6 @@
"tsx": "^4.21.0", "tsx": "^4.21.0",
"typescript": "~5.9.3", "typescript": "~5.9.3",
"typescript-eslint": "^8.48.1", "typescript-eslint": "^8.48.1",
"vite": "^7.2.6" "vite": "8.0.0-beta.0"
} }
} }

View File

@@ -28,7 +28,7 @@
"title": "Quick Start", "title": "Quick Start",
"description": "Get your gallery running in about 5 minutes.", "description": "Get your gallery running in about 5 minutes.",
"createdAt": "2025-11-14T22:20:00+08:00", "createdAt": "2025-11-14T22:20:00+08:00",
"lastModified": "2025-11-23T19:40:52+08:00", "lastModified": "2025-12-05T15:28:22+08:00",
"order": "2" "order": "2"
} }
}, },
@@ -94,7 +94,7 @@
"title": "Storage Providers", "title": "Storage Providers",
"description": "Choose a storage provider for your photo collection.", "description": "Choose a storage provider for your photo collection.",
"createdAt": "2025-11-14T22:40:00+08:00", "createdAt": "2025-11-14T22:40:00+08:00",
"lastModified": "2025-11-24T10:15:00+08:00", "lastModified": "2025-12-05T15:28:22+08:00",
"order": "30" "order": "30"
} }
}, },
@@ -105,32 +105,10 @@
"title": "S3 / S3-Compatible", "title": "S3 / S3-Compatible",
"description": "Configure S3 or S3-compatible storage for your photo collection.", "description": "Configure S3 or S3-compatible storage for your photo collection.",
"createdAt": "2025-11-14T22:10:00+08:00", "createdAt": "2025-11-14T22:10:00+08:00",
"lastModified": "2025-11-23T19:40:52+08:00", "lastModified": "2025-12-05T15:28:22+08:00",
"order": "32" "order": "32"
} }
}, },
{
"path": "/storage/providers/oss",
"title": "Aliyun OSS",
"meta": {
"title": "Aliyun OSS",
"description": "Configure Aliyun Object Storage Service (OSS) for China-mainland friendly deployments.",
"createdAt": "2025-11-24T10:05:00+08:00",
"lastModified": "2025-11-24T10:05:00+08:00",
"order": "37"
}
},
{
"path": "/storage/providers/cos",
"title": "Tencent COS",
"meta": {
"title": "Tencent COS",
"description": "Configure Tencent Cloud Object Storage (COS) for deployments within the Tencent ecosystem.",
"createdAt": "2025-11-24T10:06:00+08:00",
"lastModified": "2025-11-24T10:06:00+08:00",
"order": "38"
}
},
{ {
"path": "/storage/providers/b2", "path": "/storage/providers/b2",
"title": "B2 (Backblaze B2)", "title": "B2 (Backblaze B2)",
@@ -138,7 +116,7 @@
"title": "B2 (Backblaze B2)", "title": "B2 (Backblaze B2)",
"description": "Configure Backblaze B2 storage for cost-effective cloud storage.", "description": "Configure Backblaze B2 storage for cost-effective cloud storage.",
"createdAt": "2025-11-14T22:10:00+08:00", "createdAt": "2025-11-14T22:10:00+08:00",
"lastModified": "2025-11-23T19:40:52+08:00", "lastModified": "2025-12-05T15:28:22+08:00",
"order": "33" "order": "33"
} }
}, },
@@ -149,7 +127,7 @@
"title": "GitHub Storage", "title": "GitHub Storage",
"description": "Use a GitHub repository as photo storage for simple deployments.", "description": "Use a GitHub repository as photo storage for simple deployments.",
"createdAt": "2025-11-14T22:10:00+08:00", "createdAt": "2025-11-14T22:10:00+08:00",
"lastModified": "2025-11-23T19:40:52+08:00", "lastModified": "2025-12-05T15:28:22+08:00",
"order": "34" "order": "34"
} }
}, },
@@ -160,7 +138,7 @@
"title": "Local Storage", "title": "Local Storage",
"description": "Use local file system paths for development and self-hosting.", "description": "Use local file system paths for development and self-hosting.",
"createdAt": "2025-11-14T22:10:00+08:00", "createdAt": "2025-11-14T22:10:00+08:00",
"lastModified": "2025-11-23T19:40:52+08:00", "lastModified": "2025-12-05T15:28:22+08:00",
"order": "35" "order": "35"
} }
}, },
@@ -171,7 +149,7 @@
"title": "SaaS Architecture", "title": "SaaS Architecture",
"description": "Tenant model, domain routing, OAuth flow, and data injection paths.", "description": "Tenant model, domain routing, OAuth flow, and data injection paths.",
"createdAt": "2025-11-23T20:20:00+08:00", "createdAt": "2025-11-23T20:20:00+08:00",
"lastModified": "2025-11-23T20:44:02+08:00", "lastModified": "2025-11-30T14:03:05+08:00",
"order": "36" "order": "36"
} }
}, },
@@ -182,7 +160,7 @@
"title": "Eagle Storage", "title": "Eagle Storage",
"description": "Publish directly from an Eagle 4 library with filtering support.", "description": "Publish directly from an Eagle 4 library with filtering support.",
"createdAt": "2025-11-14T22:10:00+08:00", "createdAt": "2025-11-14T22:10:00+08:00",
"lastModified": "2025-11-23T19:40:52+08:00", "lastModified": "2025-12-05T15:28:22+08:00",
"order": "36" "order": "36"
} }
}, },
@@ -197,6 +175,28 @@
"order": "37" "order": "37"
} }
}, },
{
"path": "/storage/providers/oss",
"title": "Aliyun OSS",
"meta": {
"title": "Aliyun OSS",
"description": "Configure Aliyun Object Storage Service (OSS) for China-mainland friendly deployments.",
"createdAt": "2025-11-24T10:05:00+08:00",
"lastModified": "2025-11-24T22:26:48+08:00",
"order": "37"
}
},
{
"path": "/storage/providers/cos",
"title": "Tencent COS",
"meta": {
"title": "Tencent COS",
"description": "Configure Tencent Cloud Object Storage (COS) for deployments within the Tencent ecosystem.",
"createdAt": "2025-11-24T10:06:00+08:00",
"lastModified": "2025-11-24T22:26:48+08:00",
"order": "38"
}
},
{ {
"path": "/builder", "path": "/builder",
"title": "Builder", "title": "Builder",

View File

@@ -6,28 +6,28 @@ import Route3 from '../contents/architecture.mdx'
import Route7 from '../contents/builder/built-ins.mdx' import Route7 from '../contents/builder/built-ins.mdx'
import Route1 from '../contents/builder/cli.mdx' import Route1 from '../contents/builder/cli.mdx'
import Route4 from '../contents/builder/config.mdx' import Route4 from '../contents/builder/config.mdx'
import Route16 from '../contents/builder/index.mdx' import Route18 from '../contents/builder/index.mdx'
import Route5 from '../contents/builder/pipeline.mdx' import Route5 from '../contents/builder/pipeline.mdx'
import Route6 from '../contents/builder/plugins.mdx' import Route6 from '../contents/builder/plugins.mdx'
import Route20 from '../contents/deployment/cloudflare-pages.mdx' import Route22 from '../contents/deployment/cloudflare-pages.mdx'
import Route18 from '../contents/deployment/docker.mdx' import Route20 from '../contents/deployment/docker.mdx'
import Route19 from '../contents/deployment/github-pages.mdx' import Route21 from '../contents/deployment/github-pages.mdx'
import Route17 from '../contents/deployment/index.mdx' import Route19 from '../contents/deployment/index.mdx'
import Route21 from '../contents/deployment/vercel.mdx' import Route23 from '../contents/deployment/vercel.mdx'
import Route24 from '../contents/docs-site.mdx' import Route26 from '../contents/docs-site.mdx'
import Route2 from '../contents/getting-started/quick-start.mdx' import Route2 from '../contents/getting-started/quick-start.mdx'
import Route0 from '../contents/index.mdx' import Route0 from '../contents/index.mdx'
import Route13 from '../contents/saas/architecture.mdx' import Route13 from '../contents/saas/architecture.mdx'
import Route23 from '../contents/saas/cms.mdx' import Route25 from '../contents/saas/cms.mdx'
import Route15 from '../contents/saas/deployment.mdx' import Route15 from '../contents/saas/deployment.mdx'
import Route22 from '../contents/saas/index.mdx' import Route24 from '../contents/saas/index.mdx'
import Route10 from '../contents/storage/providers/b2.mdx' import Route10 from '../contents/storage/providers/b2.mdx'
import Route26 from '../contents/storage/providers/cos.mdx' import Route17 from '../contents/storage/providers/cos.mdx'
import Route14 from '../contents/storage/providers/eagle.mdx' import Route14 from '../contents/storage/providers/eagle.mdx'
import Route11 from '../contents/storage/providers/github.mdx' import Route11 from '../contents/storage/providers/github.mdx'
import Route8 from '../contents/storage/providers/index.mdx' import Route8 from '../contents/storage/providers/index.mdx'
import Route12 from '../contents/storage/providers/local.mdx' import Route12 from '../contents/storage/providers/local.mdx'
import Route25 from '../contents/storage/providers/oss.mdx' import Route16 from '../contents/storage/providers/oss.mdx'
import Route9 from '../contents/storage/providers/s3.mdx' import Route9 from '../contents/storage/providers/s3.mdx'
export interface RouteConfig { export interface RouteConfig {
@@ -70,7 +70,7 @@ export const routes: RouteConfig[] = [
title: 'Quick Start', title: 'Quick Start',
description: 'Get your gallery running in about 5 minutes.', description: 'Get your gallery running in about 5 minutes.',
createdAt: '2025-11-14T22:20:00+08:00', createdAt: '2025-11-14T22:20:00+08:00',
lastModified: '2025-11-23T19:40:52+08:00', lastModified: '2025-12-05T15:28:22+08:00',
order: '2', order: '2',
}, },
}, },
@@ -142,7 +142,7 @@ export const routes: RouteConfig[] = [
title: 'Storage Providers', title: 'Storage Providers',
description: 'Choose a storage provider for your photo collection.', description: 'Choose a storage provider for your photo collection.',
createdAt: '2025-11-14T22:40:00+08:00', createdAt: '2025-11-14T22:40:00+08:00',
lastModified: '2025-11-24T10:15:00+08:00', lastModified: '2025-12-05T15:28:22+08:00',
order: '30', order: '30',
}, },
}, },
@@ -154,34 +154,10 @@ export const routes: RouteConfig[] = [
title: 'S3 / S3-Compatible', title: 'S3 / S3-Compatible',
description: 'Configure S3 or S3-compatible storage for your photo collection.', description: 'Configure S3 or S3-compatible storage for your photo collection.',
createdAt: '2025-11-14T22:10:00+08:00', createdAt: '2025-11-14T22:10:00+08:00',
lastModified: '2025-11-23T19:40:52+08:00', lastModified: '2025-12-05T15:28:22+08:00',
order: '32', order: '32',
}, },
}, },
{
path: '/storage/providers/oss',
component: Route25,
title: 'Aliyun OSS',
meta: {
title: 'Aliyun OSS',
description: 'Configure Aliyun Object Storage Service (OSS) for China-mainland friendly deployments.',
createdAt: '2025-11-24T10:05:00+08:00',
lastModified: '2025-11-24T10:05:00+08:00',
order: '37',
},
},
{
path: '/storage/providers/cos',
component: Route26,
title: 'Tencent COS',
meta: {
title: 'Tencent COS',
description: 'Configure Tencent Cloud Object Storage (COS) for deployments within the Tencent ecosystem.',
createdAt: '2025-11-24T10:06:00+08:00',
lastModified: '2025-11-24T10:06:00+08:00',
order: '38',
},
},
{ {
path: '/storage/providers/b2', path: '/storage/providers/b2',
component: Route10, component: Route10,
@@ -190,7 +166,7 @@ export const routes: RouteConfig[] = [
title: 'B2 (Backblaze B2)', title: 'B2 (Backblaze B2)',
description: 'Configure Backblaze B2 storage for cost-effective cloud storage.', description: 'Configure Backblaze B2 storage for cost-effective cloud storage.',
createdAt: '2025-11-14T22:10:00+08:00', createdAt: '2025-11-14T22:10:00+08:00',
lastModified: '2025-11-23T19:40:52+08:00', lastModified: '2025-12-05T15:28:22+08:00',
order: '33', order: '33',
}, },
}, },
@@ -202,7 +178,7 @@ export const routes: RouteConfig[] = [
title: 'GitHub Storage', title: 'GitHub Storage',
description: 'Use a GitHub repository as photo storage for simple deployments.', description: 'Use a GitHub repository as photo storage for simple deployments.',
createdAt: '2025-11-14T22:10:00+08:00', createdAt: '2025-11-14T22:10:00+08:00',
lastModified: '2025-11-23T19:40:52+08:00', lastModified: '2025-12-05T15:28:22+08:00',
order: '34', order: '34',
}, },
}, },
@@ -214,7 +190,7 @@ export const routes: RouteConfig[] = [
title: 'Local Storage', title: 'Local Storage',
description: 'Use local file system paths for development and self-hosting.', description: 'Use local file system paths for development and self-hosting.',
createdAt: '2025-11-14T22:10:00+08:00', createdAt: '2025-11-14T22:10:00+08:00',
lastModified: '2025-11-23T19:40:52+08:00', lastModified: '2025-12-05T15:28:22+08:00',
order: '35', order: '35',
}, },
}, },
@@ -226,7 +202,7 @@ export const routes: RouteConfig[] = [
title: 'SaaS Architecture', title: 'SaaS Architecture',
description: 'Tenant model, domain routing, OAuth flow, and data injection paths.', description: 'Tenant model, domain routing, OAuth flow, and data injection paths.',
createdAt: '2025-11-23T20:20:00+08:00', createdAt: '2025-11-23T20:20:00+08:00',
lastModified: '2025-11-23T20:44:02+08:00', lastModified: '2025-11-30T14:03:05+08:00',
order: '36', order: '36',
}, },
}, },
@@ -238,7 +214,7 @@ export const routes: RouteConfig[] = [
title: 'Eagle Storage', title: 'Eagle Storage',
description: 'Publish directly from an Eagle 4 library with filtering support.', description: 'Publish directly from an Eagle 4 library with filtering support.',
createdAt: '2025-11-14T22:10:00+08:00', createdAt: '2025-11-14T22:10:00+08:00',
lastModified: '2025-11-23T19:40:52+08:00', lastModified: '2025-12-05T15:28:22+08:00',
order: '36', order: '36',
}, },
}, },
@@ -255,8 +231,32 @@ export const routes: RouteConfig[] = [
}, },
}, },
{ {
path: '/builder', path: '/storage/providers/oss',
component: Route16, component: Route16,
title: 'Aliyun OSS',
meta: {
title: 'Aliyun OSS',
description: 'Configure Aliyun Object Storage Service (OSS) for China-mainland friendly deployments.',
createdAt: '2025-11-24T10:05:00+08:00',
lastModified: '2025-11-24T22:26:48+08:00',
order: '37',
},
},
{
path: '/storage/providers/cos',
component: Route17,
title: 'Tencent COS',
meta: {
title: 'Tencent COS',
description: 'Configure Tencent Cloud Object Storage (COS) for deployments within the Tencent ecosystem.',
createdAt: '2025-11-24T10:06:00+08:00',
lastModified: '2025-11-24T22:26:48+08:00',
order: '38',
},
},
{
path: '/builder',
component: Route18,
title: 'Builder', title: 'Builder',
meta: { meta: {
title: 'Builder', title: 'Builder',
@@ -268,7 +268,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/deployment', path: '/deployment',
component: Route17, component: Route19,
title: 'Deployment', title: 'Deployment',
meta: { meta: {
title: 'Deployment', title: 'Deployment',
@@ -280,7 +280,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/deployment/docker', path: '/deployment/docker',
component: Route18, component: Route20,
title: 'Docker', title: 'Docker',
meta: { meta: {
title: 'Docker', title: 'Docker',
@@ -292,7 +292,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/deployment/github-pages', path: '/deployment/github-pages',
component: Route19, component: Route21,
title: 'GitHub Pages', title: 'GitHub Pages',
meta: { meta: {
title: 'GitHub Pages', title: 'GitHub Pages',
@@ -304,7 +304,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/deployment/cloudflare-pages', path: '/deployment/cloudflare-pages',
component: Route20, component: Route22,
title: 'Cloudflare Pages', title: 'Cloudflare Pages',
meta: { meta: {
title: 'Cloudflare Pages', title: 'Cloudflare Pages',
@@ -316,7 +316,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/deployment/vercel', path: '/deployment/vercel',
component: Route21, component: Route23,
title: 'Vercel', title: 'Vercel',
meta: { meta: {
title: 'Vercel', title: 'Vercel',
@@ -328,7 +328,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/saas', path: '/saas',
component: Route22, component: Route24,
title: 'SaaS Mode', title: 'SaaS Mode',
meta: { meta: {
title: 'SaaS Mode', title: 'SaaS Mode',
@@ -340,7 +340,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/saas/cms', path: '/saas/cms',
component: Route23, component: Route25,
title: 'CMS & Live Updates', title: 'CMS & Live Updates',
meta: { meta: {
title: 'CMS & Live Updates', title: 'CMS & Live Updates',
@@ -352,7 +352,7 @@ export const routes: RouteConfig[] = [
}, },
{ {
path: '/docs-site', path: '/docs-site',
component: Route24, component: Route26,
title: 'Docs Site', title: 'Docs Site',
meta: { meta: {
title: 'Docs Site', title: 'Docs Site',

View File

@@ -1437,6 +1437,18 @@ export const tocData: FileToc[] = [
text: '[S3 / S3-Compatible](/storage/providers/s3)', text: '[S3 / S3-Compatible](/storage/providers/s3)',
children: [], children: [],
}, },
{
id: 'heading-aliyun-ossstorageprovidersoss',
level: 3,
text: '[Aliyun OSS](/storage/providers/oss)',
children: [],
},
{
id: 'heading-tencent-cosstorageproviderscos',
level: 3,
text: '[Tencent COS](/storage/providers/cos)',
children: [],
},
{ {
id: 'heading-b2-backblaze-b2storageprovidersb2', id: 'heading-b2-backblaze-b2storageprovidersb2',
level: 3, level: 3,
@@ -1535,6 +1547,50 @@ export const tocData: FileToc[] = [
}, },
], ],
}, },
{
file: 'storage/providers/cos.mdx',
path: '/storage/providers/cos',
title: 'Tencent COS',
toc: [
{
id: 'heading-tencent-cos-storage',
level: 1,
text: 'Tencent COS Storage',
children: [
{
id: 'heading-configuration',
level: 2,
text: 'Configuration',
children: [],
},
{
id: 'heading-environment-variables',
level: 2,
text: 'Environment Variables',
children: [],
},
{
id: 'heading-cos-specific-considerations',
level: 2,
text: 'COS-specific Considerations',
children: [],
},
{
id: 'heading-best-practices',
level: 2,
text: 'Best Practices',
children: [],
},
{
id: 'heading-troubleshooting',
level: 2,
text: 'Troubleshooting',
children: [],
},
],
},
],
},
{ {
file: 'storage/providers/eagle.mdx', file: 'storage/providers/eagle.mdx',
path: '/storage/providers/eagle', path: '/storage/providers/eagle',
@@ -1675,6 +1731,12 @@ export const tocData: FileToc[] = [
text: 'Raw URL CDN', text: 'Raw URL CDN',
children: [], children: [],
}, },
{
id: 'heading-custom-cdn-domain',
level: 2,
text: 'Custom CDN Domain',
children: [],
},
{ {
id: 'heading-private-repositories', id: 'heading-private-repositories',
level: 2, level: 2,
@@ -1772,6 +1834,50 @@ export const tocData: FileToc[] = [
}, },
], ],
}, },
{
file: 'storage/providers/oss.mdx',
path: '/storage/providers/oss',
title: 'Aliyun OSS',
toc: [
{
id: 'heading-aliyun-oss-storage',
level: 1,
text: 'Aliyun OSS Storage',
children: [
{
id: 'heading-configuration',
level: 2,
text: 'Configuration',
children: [],
},
{
id: 'heading-environment-variables',
level: 2,
text: 'Environment Variables',
children: [],
},
{
id: 'heading-notes-on-endpoints',
level: 2,
text: 'Notes on Endpoints',
children: [],
},
{
id: 'heading-best-practices',
level: 2,
text: 'Best Practices',
children: [],
},
{
id: 'heading-troubleshooting',
level: 2,
text: 'Troubleshooting',
children: [],
},
],
},
],
},
{ {
file: 'storage/providers/s3.mdx', file: 'storage/providers/s3.mdx',
path: '/storage/providers/s3', path: '/storage/providers/s3',

View File

@@ -34,6 +34,7 @@
"@types/busboy": "1.5.4", "@types/busboy": "1.5.4",
"better-auth": "1.4.5", "better-auth": "1.4.5",
"busboy": "1.6.0", "busboy": "1.6.0",
"consola": "3.4.2",
"drizzle-orm": "^0.45.0", "drizzle-orm": "^0.45.0",
"ejs": "3.1.10", "ejs": "3.1.10",
"hono": "4.10.7", "hono": "4.10.7",
@@ -54,7 +55,7 @@
"@types/pg": "8.15.6", "@types/pg": "8.15.6",
"nodemon": "3.1.11", "nodemon": "3.1.11",
"unplugin-swc": "1.5.9", "unplugin-swc": "1.5.9",
"vite": "7.2.6", "vite": "8.0.0-beta.0",
"vite-bundle-analyzer": "1.2.3", "vite-bundle-analyzer": "1.2.3",
"vite-node": "5.2.0", "vite-node": "5.2.0",
"vite-tsconfig-paths": "5.1.4", "vite-tsconfig-paths": "5.1.4",

View File

@@ -93,7 +93,7 @@
"tailwindcss-safe-area": "catalog:", "tailwindcss-safe-area": "catalog:",
"tw-animate-css": "1.4.0", "tw-animate-css": "1.4.0",
"typescript": "5.9.3", "typescript": "5.9.3",
"vite": "7.2.6", "vite": "8.0.0-beta.0",
"vite-plugin-checker": "0.11.0", "vite-plugin-checker": "0.11.0",
"vite-plugin-route-builder": "0.4.1", "vite-plugin-route-builder": "0.4.1",
"vite-tsconfig-paths": "5.1.4" "vite-tsconfig-paths": "5.1.4"

View File

@@ -1,6 +1,6 @@
import { Button, Prompt } from '@afilmory/ui' import { Button, Prompt } from '@afilmory/ui'
import { clsxm } from '@afilmory/utils' import { clsxm } from '@afilmory/utils'
import { DynamicIcon } from 'lucide-react/dynamic' import { DatabaseIcon, RadiationIcon, TriangleAlertIcon } from 'lucide-react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { toast } from 'sonner' import { toast } from 'sonner'
@@ -220,8 +220,8 @@ export function DataManagementPanel() {
<LinearBorderPanel className="bg-background-secondary/40 p-4 sm:p-6"> <LinearBorderPanel className="bg-background-secondary/40 p-4 sm:p-6">
<div className="flex flex-col gap-4 sm:gap-6 lg:flex-row lg:items-center lg:justify-between"> <div className="flex flex-col gap-4 sm:gap-6 lg:flex-row lg:items-center lg:justify-between">
<div className="space-y-3 sm:space-y-4"> <div className="space-y-3 sm:space-y-4">
<span className="shape-squircle inline-flex items-center gap-2 bg-accent/10 px-2.5 sm:px-3 py-1 text-[11px] sm:text-xs font-medium text-accent"> <span className="inline-flex items-center gap-2 text-sm sm:text-xs font-semibold text-accent">
<DynamicIcon name="database" className="h-3.5 sm:h-4 w-3.5 sm:w-4" /> <DatabaseIcon className="h-3.5 sm:h-4 w-3.5 sm:w-4" />
{t(dataManagementKeys.summary.badge)} {t(dataManagementKeys.summary.badge)}
</span> </span>
<div className="space-y-1.5 sm:space-y-2"> <div className="space-y-1.5 sm:space-y-2">
@@ -260,7 +260,7 @@ export function DataManagementPanel() {
<div className="flex flex-col gap-3 sm:gap-4 md:flex-row md:items-center md:justify-between"> <div className="flex flex-col gap-3 sm:gap-4 md:flex-row md:items-center md:justify-between">
<div className="space-y-1.5 sm:space-y-2"> <div className="space-y-1.5 sm:space-y-2">
<div className="flex items-center gap-1.5 sm:gap-2 text-red"> <div className="flex items-center gap-1.5 sm:gap-2 text-red">
<DynamicIcon name="triangle-alert" className="h-3.5 sm:h-4 w-3.5 sm:w-4" /> <TriangleAlertIcon className="h-3.5 sm:h-4 w-3.5 sm:w-4" />
<span className="text-xs sm:text-sm font-semibold">{t(dataManagementKeys.truncate.badge)}</span> <span className="text-xs sm:text-sm font-semibold">{t(dataManagementKeys.truncate.badge)}</span>
</div> </div>
<div> <div>
@@ -287,7 +287,7 @@ export function DataManagementPanel() {
<div className="flex flex-col gap-3 sm:gap-4 md:flex-row md:items-center md:justify-between"> <div className="flex flex-col gap-3 sm:gap-4 md:flex-row md:items-center md:justify-between">
<div className="space-y-1.5 sm:space-y-2"> <div className="space-y-1.5 sm:space-y-2">
<div className="flex items-center gap-1.5 sm:gap-2 text-red"> <div className="flex items-center gap-1.5 sm:gap-2 text-red">
<DynamicIcon name="radiation" className="h-3.5 sm:h-4 w-3.5 sm:w-4" /> <RadiationIcon className="h-3.5 sm:h-4 w-3.5 sm:w-4" />
<span className="text-xs sm:text-sm font-semibold">{t(dataManagementKeys.delete.badge)}</span> <span className="text-xs sm:text-sm font-semibold">{t(dataManagementKeys.delete.badge)}</span>
</div> </div>
<div className="space-y-1"> <div className="space-y-1">

View File

@@ -1,6 +1,6 @@
import { Button, Modal } from '@afilmory/ui' import { Button, Modal } from '@afilmory/ui'
import { clsxm } from '@afilmory/utils' import { clsxm } from '@afilmory/utils'
import { DynamicIcon } from 'lucide-react/dynamic' import { CheckSquare, Square, Tags, Trash2, X } from 'lucide-react'
import type { ChangeEventHandler } from 'react' import type { ChangeEventHandler } from 'react'
import { useMemo, useRef } from 'react' import { useMemo, useRef } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@@ -152,7 +152,7 @@ export function PhotoLibraryActionBar() {
onClick={handleEditSelectedTags} onClick={handleEditSelectedTags}
className="flex items-center gap-1 text-text-secondary hover:text-text" className="flex items-center gap-1 text-text-secondary hover:text-text"
> >
<DynamicIcon name="tags" className="h-3.5 w-3.5" /> <Tags className="h-3.5 w-3.5" />
{t(photoLibraryActionKeys.editTags)} {t(photoLibraryActionKeys.editTags)}
</Button> </Button>
<Button <Button
@@ -163,11 +163,11 @@ export function PhotoLibraryActionBar() {
onClick={deleteSelected} onClick={deleteSelected}
className="flex items-center gap-1 text-rose-400 hover:text-rose-300" className="flex items-center gap-1 text-rose-400 hover:text-rose-300"
> >
<DynamicIcon name="trash-2" className="h-3.5 w-3.5" /> <Trash2 className="h-3.5 w-3.5" />
{t(photoLibraryActionKeys.delete)} {t(photoLibraryActionKeys.delete)}
</Button> </Button>
<Button type="button" className="gap-1" variant="ghost" size="sm" onClick={clearSelection}> <Button type="button" className="gap-1" variant="ghost" size="sm" onClick={clearSelection}>
<DynamicIcon name="x" className="h-3.5 w-3.5" /> <X className="h-3.5 w-3.5" />
{t(photoLibraryActionKeys.clear)} {t(photoLibraryActionKeys.clear)}
</Button> </Button>
</div> </div>
@@ -179,7 +179,7 @@ export function PhotoLibraryActionBar() {
onClick={selectAll} onClick={selectAll}
className="flex items-center gap-1 text-text-secondary hover:text-text" className="flex items-center gap-1 text-text-secondary hover:text-text"
> >
<DynamicIcon name={canSelectAll ? 'square' : 'check-square'} className="size-4" /> {canSelectAll ? <Square className="size-4" /> : <CheckSquare className="size-4" />}
{selectAllLabel} {selectAllLabel}
</Button> </Button>
</div> </div>

View File

@@ -10,7 +10,22 @@ import {
} from '@afilmory/ui' } from '@afilmory/ui'
import { clsxm } from '@afilmory/utils' import { clsxm } from '@afilmory/utils'
import { useAtomValue } from 'jotai' import { useAtomValue } from 'jotai'
import { DynamicIcon } from 'lucide-react/dynamic' import {
ArrowDown,
ArrowUp,
Camera,
Check,
ChevronDown,
Clock,
ExternalLink,
HardDrive,
Info,
MoreHorizontal,
Square,
Tags,
Trash2,
Upload,
} from 'lucide-react'
import type { ReactNode } from 'react' import type { ReactNode } from 'react'
import { useCallback, useMemo, useState } from 'react' import { useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@@ -31,15 +46,15 @@ import type { DeleteAssetOptions } from './types'
type PhotoLibrarySortBy = 'uploadedAt' | 'capturedAt' type PhotoLibrarySortBy = 'uploadedAt' | 'capturedAt'
type PhotoLibrarySortOrder = 'desc' | 'asc' type PhotoLibrarySortOrder = 'desc' | 'asc'
const SORT_BY_OPTIONS: { value: PhotoLibrarySortBy; labelKey: I18nKeys; icon: string }[] = [ const SORT_BY_OPTIONS = [
{ value: 'uploadedAt', labelKey: 'photos.library.sort.by-uploaded', icon: 'upload' }, { value: 'uploadedAt', labelKey: 'photos.library.sort.by-uploaded', Icon: Upload },
{ value: 'capturedAt', labelKey: 'photos.library.sort.by-captured', icon: 'camera' }, { value: 'capturedAt', labelKey: 'photos.library.sort.by-captured', Icon: Camera },
] ] as const
const SORT_ORDER_OPTIONS: { value: PhotoLibrarySortOrder; labelKey: I18nKeys; icon: string }[] = [ const SORT_ORDER_OPTIONS = [
{ value: 'desc', labelKey: 'photos.library.sort.order-desc', icon: 'arrow-down' }, { value: 'desc', labelKey: 'photos.library.sort.order-desc', Icon: ArrowDown },
{ value: 'asc', labelKey: 'photos.library.sort.order-asc', icon: 'arrow-up' }, { value: 'asc', labelKey: 'photos.library.sort.order-asc', Icon: ArrowUp },
] ] as const
const photoLibraryGridKeys = { const photoLibraryGridKeys = {
card: { card: {
@@ -185,7 +200,7 @@ function PhotoGridItem({
isSelected ? 'bg-accent text-white' : 'hover:bg-white/10', isSelected ? 'bg-accent text-white' : 'hover:bg-white/10',
)} )}
> >
<DynamicIcon name={isSelected ? 'check' : 'square'} className="mr-1 h-3 w-3" /> {isSelected ? <Check className="mr-1 h-3 w-3" /> : <Square className="mr-1 h-3 w-3" />}
<span>{isSelected ? t(photoLibraryGridKeys.card.selected) : t(photoLibraryGridKeys.card.select)}</span> <span>{isSelected ? t(photoLibraryGridKeys.card.selected) : t(photoLibraryGridKeys.card.select)}</span>
</div> </div>
</div> </div>
@@ -193,15 +208,15 @@ function PhotoGridItem({
<div className="flex items-end justify-between gap-3 p-3"> <div className="flex items-end justify-between gap-3 p-3">
<div className="flex flex-col gap-1.5 min-w-0 flex-1"> <div className="flex flex-col gap-1.5 min-w-0 flex-1">
<div className="flex items-center gap-1.5 text-[10px] text-white/80"> <div className="flex items-center gap-1.5 text-[10px] text-white/80">
<DynamicIcon name="camera" className="h-3 w-3 shrink-0 text-white/60" /> <Camera className="h-3 w-3 shrink-0 text-white/60" />
<span className="truncate">{deviceLabel}</span> <span className="truncate">{deviceLabel}</span>
</div> </div>
<div className="flex items-center gap-1.5 text-[10px] text-white/80"> <div className="flex items-center gap-1.5 text-[10px] text-white/80">
<DynamicIcon name="clock" className="h-3 w-3 shrink-0 text-white/60" /> <Clock className="h-3 w-3 shrink-0 text-white/60" />
<span className="truncate">{updatedAtLabel}</span> <span className="truncate">{updatedAtLabel}</span>
</div> </div>
<div className="flex items-center gap-1.5 text-[10px] text-white/80"> <div className="flex items-center gap-1.5 text-[10px] text-white/80">
<DynamicIcon name="hard-drive" className="h-3 w-3 shrink-0 text-white/60" /> <HardDrive className="h-3 w-3 shrink-0 text-white/60" />
<span className="truncate">{fileSizeLabel}</span> <span className="truncate">{fileSizeLabel}</span>
</div> </div>
</div> </div>
@@ -213,7 +228,7 @@ function PhotoGridItem({
className="bg-black/40 text-white hover:bg-black/60 h-7 px-2.5" className="bg-black/40 text-white hover:bg-black/60 h-7 px-2.5"
onClick={() => onOpenAsset(asset)} onClick={() => onOpenAsset(asset)}
> >
<DynamicIcon name="external-link" className="h-3.5 w-3.5" /> <ExternalLink className="h-3.5 w-3.5" />
</Button> </Button>
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
@@ -223,26 +238,19 @@ function PhotoGridItem({
size="xs" size="xs"
className="bg-black/40 text-white hover:bg-black/60 h-7 px-2.5" className="bg-black/40 text-white hover:bg-black/60 h-7 px-2.5"
> >
<DynamicIcon name="more-horizontal" className="h-3.5 w-3.5" /> <MoreHorizontal className="h-3.5 w-3.5" />
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent align="end" className="min-w-[140px]"> <DropdownMenuContent align="end" className="min-w-[140px]">
<DropdownMenuItem <DropdownMenuItem icon={<Tags className="size-4" />} onSelect={() => onEditTags(asset)}>
icon={<DynamicIcon name="tags" className="size-4" />}
onSelect={() => onEditTags(asset)}
>
{t('photos.library.card.edit-tags')} {t('photos.library.card.edit-tags')}
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem <DropdownMenuItem icon={<Info className="size-4" />} disabled={!manifest} onSelect={handleViewExif}>
icon={<DynamicIcon name="info" className="size-4" />}
disabled={!manifest}
onSelect={handleViewExif}
>
{t('photos.library.card.view-exif')} {t('photos.library.card.view-exif')}
</DropdownMenuItem> </DropdownMenuItem>
<div className="h-[0.5px] bg-border my-1" /> <div className="h-[0.5px] bg-border my-1" />
<DropdownMenuItem <DropdownMenuItem
icon={<DynamicIcon name="trash-2" className="size-4" />} icon={<Trash2 className="size-4" />}
disabled={isDeleting} disabled={isDeleting}
onSelect={handleDelete} onSelect={handleDelete}
className="text-red focus:text-red focus:bg-red/10" className="text-red focus:text-red focus:bg-red/10"
@@ -354,9 +362,9 @@ export function PhotoLibraryGrid() {
size="sm" size="sm"
className="hover:bg-background-secondary/70 flex items-center gap-1.5 rounded-full border px-3 h-8 text-text" className="hover:bg-background-secondary/70 flex items-center gap-1.5 rounded-full border px-3 h-8 text-text"
> >
<DynamicIcon name={currentSortBy.icon as any} className="size-4" /> <currentSortBy.Icon className="size-4" />
<span className="font-medium">{t(currentSortBy.labelKey)}</span> <span className="font-medium">{t(currentSortBy.labelKey)}</span>
<DynamicIcon name="chevron-down" className="h-3 w-3 text-text-tertiary" /> <ChevronDown className="h-3 w-3 text-text-tertiary" />
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent align="end" className="min-w-[180px]"> <DropdownMenuContent align="end" className="min-w-[180px]">
@@ -364,7 +372,7 @@ export function PhotoLibraryGrid() {
<DropdownMenuItem <DropdownMenuItem
key={option.value} key={option.value}
active={option.value === sortBy} active={option.value === sortBy}
icon={<DynamicIcon name={option.icon as any} className="size-4" />} icon={<option.Icon className="size-4" />}
onSelect={() => setSortBy(option.value)} onSelect={() => setSortBy(option.value)}
> >
{t(option.labelKey)} {t(option.labelKey)}
@@ -381,9 +389,9 @@ export function PhotoLibraryGrid() {
size="sm" size="sm"
className="hover:bg-background-secondary/70 flex items-center gap-1.5 rounded-full border px-3 h-8 text-text" className="hover:bg-background-secondary/70 flex items-center gap-1.5 rounded-full border px-3 h-8 text-text"
> >
<DynamicIcon name={currentSortOrder.icon as any} className="size-4" /> <currentSortOrder.Icon className="size-4" />
<span className="font-medium">{t(currentSortOrder.labelKey)}</span> <span className="font-medium">{t(currentSortOrder.labelKey)}</span>
<DynamicIcon name="chevron-down" className="h-3 w-3 text-text-tertiary" /> <ChevronDown className="h-3 w-3 text-text-tertiary" />
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent align="end" className="min-w-[180px]"> <DropdownMenuContent align="end" className="min-w-[180px]">
@@ -391,7 +399,7 @@ export function PhotoLibraryGrid() {
<DropdownMenuItem <DropdownMenuItem
key={option.value} key={option.value}
active={option.value === sortOrder} active={option.value === sortOrder}
icon={<DynamicIcon name={option.icon as any} className="size-4" />} icon={<option.Icon className="size-4" />}
onSelect={() => setSortOrder(option.value)} onSelect={() => setSortOrder(option.value)}
> >
{t(option.labelKey)} {t(option.labelKey)}

View File

@@ -1,5 +1,5 @@
import { Button, Modal } from '@afilmory/ui' import { Button, Modal } from '@afilmory/ui'
import { DynamicIcon } from 'lucide-react/dynamic' import { HardDrive } from 'lucide-react'
import { m } from 'motion/react' import { m } from 'motion/react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@@ -61,7 +61,7 @@ export function ManagedStorageEntryCard({
<div className="relative"> <div className="relative">
<div className="bg-accent/15 inline-flex h-12 w-12 items-center justify-center rounded-lg"> <div className="bg-accent/15 inline-flex h-12 w-12 items-center justify-center rounded-lg">
<DynamicIcon name="hard-drive" className="h-6 w-6 text-accent" /> <HardDrive className="h-6 w-6 text-accent" />
</div> </div>
</div> </div>

View File

@@ -1,6 +1,20 @@
import { Button } from '@afilmory/ui' import { Button } from '@afilmory/ui'
import { clsxm } from '@afilmory/utils' import { clsxm } from '@afilmory/utils'
import { DynamicIcon } from 'lucide-react/dynamic' import type {LucideIcon} from 'lucide-react';
import {
Check,
CheckCircle,
Cloud,
CloudDrizzle,
CloudSnow,
Database,
Folder,
Github,
Image,
Pencil,
Server,
XCircle
} from 'lucide-react'
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@@ -10,48 +24,48 @@ import type { StorageProvider } from '../types'
const providerTypeConfig: Record< const providerTypeConfig: Record<
string, string,
{ {
icon: string Icon: LucideIcon
color: string color: string
bgColor: string bgColor: string
} }
> = { > = {
s3: { s3: {
icon: 'database', Icon: Database,
color: 'text-orange-500', color: 'text-orange-500',
bgColor: 'bg-orange-500/10', bgColor: 'bg-orange-500/10',
}, },
oss: { oss: {
icon: 'cloud-drizzle', Icon: CloudDrizzle,
color: 'text-emerald-500', color: 'text-emerald-500',
bgColor: 'bg-emerald-500/10', bgColor: 'bg-emerald-500/10',
}, },
cos: { cos: {
icon: 'cloud-snow', Icon: CloudSnow,
color: 'text-cyan-500', color: 'text-cyan-500',
bgColor: 'bg-cyan-500/10', bgColor: 'bg-cyan-500/10',
}, },
b2: { b2: {
icon: 'cloud', Icon: Cloud,
color: 'text-sky-500', color: 'text-sky-500',
bgColor: 'bg-sky-500/10', bgColor: 'bg-sky-500/10',
}, },
github: { github: {
icon: 'github', Icon: Github,
color: 'text-purple-500', color: 'text-purple-500',
bgColor: 'bg-purple-500/10', bgColor: 'bg-purple-500/10',
}, },
local: { local: {
icon: 'folder', Icon: Folder,
color: 'text-blue-500', color: 'text-blue-500',
bgColor: 'bg-blue-500/10', bgColor: 'bg-blue-500/10',
}, },
minio: { minio: {
icon: 'server', Icon: Server,
color: 'text-red-500', color: 'text-red-500',
bgColor: 'bg-red-500/10', bgColor: 'bg-red-500/10',
}, },
eagle: { eagle: {
icon: 'image', Icon: Image,
color: 'text-amber-500', color: 'text-amber-500',
bgColor: 'bg-amber-500/10', bgColor: 'bg-amber-500/10',
}, },
@@ -110,7 +124,7 @@ export const ProviderCard: FC<ProviderCardProps> = ({ provider, isActive, onEdit
{isActive && ( {isActive && (
<div className="absolute top-3 right-3"> <div className="absolute top-3 right-3">
<span className="bg-accent inline-flex items-center gap-1 rounded px-2 py-0.5 text-[10px] font-semibold tracking-wide text-white uppercase"> <span className="bg-accent inline-flex items-center gap-1 rounded px-2 py-0.5 text-[10px] font-semibold tracking-wide text-white uppercase">
<DynamicIcon name="check-circle" className="h-3 w-3" /> <CheckCircle className="h-3 w-3" />
{t(storageProvidersI18nKeys.card.active)} {t(storageProvidersI18nKeys.card.active)}
</span> </span>
</div> </div>
@@ -119,7 +133,7 @@ export const ProviderCard: FC<ProviderCardProps> = ({ provider, isActive, onEdit
{/* Provider Icon */} {/* Provider Icon */}
<div className="relative"> <div className="relative">
<div className={clsxm('inline-flex h-12 w-12 items-center justify-center rounded-lg', config.bgColor)}> <div className={clsxm('inline-flex h-12 w-12 items-center justify-center rounded-lg', config.bgColor)}>
<DynamicIcon name={config.icon as any} className={clsxm('h-6 w-6', config.color)} /> <config.Icon className={clsxm('h-6 w-6', config.color)} />
</div> </div>
</div> </div>
@@ -142,17 +156,17 @@ export const ProviderCard: FC<ProviderCardProps> = ({ provider, isActive, onEdit
className="text-text-secondary hover:text-text" className="text-text-secondary hover:text-text"
onClick={onToggleActive} onClick={onToggleActive}
> >
<DynamicIcon name="x-circle" className="mr-1 h-3.5 w-3.5" /> <XCircle className="mr-1 h-3.5 w-3.5" />
<span>{t(storageProvidersI18nKeys.card.makeInactive)}</span> <span>{t(storageProvidersI18nKeys.card.makeInactive)}</span>
</Button> </Button>
) : ( ) : (
<Button type="button" variant="ghost" size="sm" onClick={onToggleActive}> <Button type="button" variant="ghost" size="sm" onClick={onToggleActive}>
<DynamicIcon name="check" className="h-3.5 w-3.5 mr-1" /> <Check className="h-3.5 w-3.5 mr-1" />
<span>{t(storageProvidersI18nKeys.card.makeActive)}</span> <span>{t(storageProvidersI18nKeys.card.makeActive)}</span>
</Button> </Button>
)} )}
<Button type="button" variant="ghost" size="sm" onClick={onEdit}> <Button type="button" variant="ghost" size="sm" onClick={onEdit}>
<DynamicIcon name="pencil" className="mr-1 h-3.5 w-3.5" /> <Pencil className="mr-1 h-3.5 w-3.5" />
<span>{t(storageProvidersI18nKeys.card.edit)}</span> <span>{t(storageProvidersI18nKeys.card.edit)}</span>
</Button> </Button>
</div> </div>

View File

@@ -14,7 +14,7 @@ import {
Textarea, Textarea,
} from '@afilmory/ui' } from '@afilmory/ui'
import { clsxm, Spring } from '@afilmory/utils' import { clsxm, Spring } from '@afilmory/utils'
import { DynamicIcon } from 'lucide-react/dynamic' import { Edit, Plus, PlusCircle, Save } from 'lucide-react'
import { m } from 'motion/react' import { m } from 'motion/react'
import { nanoid } from 'nanoid' import { nanoid } from 'nanoid'
import { useEffect, useMemo, useState } from 'react' import { useEffect, useMemo, useState } from 'react'
@@ -106,7 +106,7 @@ export function ProviderEditModal({
isNewProvider ? 'bg-accent/10 text-accent' : 'bg-fill text-text', isNewProvider ? 'bg-accent/10 text-accent' : 'bg-fill text-text',
)} )}
> >
<DynamicIcon name={isNewProvider ? 'plus-circle' : 'edit'} className="size-5" /> {isNewProvider ? <PlusCircle className="size-5" /> : <Edit className="size-5" />}
</div> </div>
<div className="flex-1 space-y-1"> <div className="flex-1 space-y-1">
<h2 className="text-text text-xl font-semibold"> <h2 className="text-text text-xl font-semibold">
@@ -248,7 +248,7 @@ export function ProviderEditModal({
{t(storageProvidersI18nKeys.actions.cancel)} {t(storageProvidersI18nKeys.actions.cancel)}
</Button> </Button>
<Button type="button" onClick={handleSave} variant="primary" size="sm"> <Button type="button" onClick={handleSave} variant="primary" size="sm">
<DynamicIcon name="plus" className="mr-2 h-3.5 w-3.5" /> <Plus className="mr-2 h-3.5 w-3.5" />
<span>{t(storageProvidersI18nKeys.actions.create)}</span> <span>{t(storageProvidersI18nKeys.actions.create)}</span>
</Button> </Button>
</div> </div>
@@ -256,7 +256,7 @@ export function ProviderEditModal({
// Edit mode: Delete + cancel + set active + save // Edit mode: Delete + cancel + set active + save
<div className="flex items-center justify-end gap-3"> <div className="flex items-center justify-end gap-3">
<Button type="button" onClick={handleSave} disabled={!isDirty} variant="primary" size="sm"> <Button type="button" onClick={handleSave} disabled={!isDirty} variant="primary" size="sm">
<DynamicIcon name="save" className="mr-2 h-3.5 w-3.5" /> <Save className="mr-2 h-3.5 w-3.5" />
<span>{t(storageProvidersI18nKeys.actions.save)}</span> <span>{t(storageProvidersI18nKeys.actions.save)}</span>
</Button> </Button>
</div> </div>
@@ -273,3 +273,11 @@ ProviderEditModal.contentProps = {
maxHeight: '90vh', maxHeight: '90vh',
}, },
} }
// Configure modal content
ProviderEditModal.contentClassName = 'max-w-2xl w-[95vw] max-h-[90vh] p-0'
ProviderEditModal.contentProps = {
style: {
maxHeight: '90vh',
},
}

View File

@@ -1,6 +1,6 @@
import { Button, Modal, Prompt, Switch } from '@afilmory/ui' import { Button, Modal, Prompt, Switch } from '@afilmory/ui'
import { Spring } from '@afilmory/utils' import { Spring } from '@afilmory/utils'
import { DynamicIcon } from 'lucide-react/dynamic' import { ShieldCheck } from 'lucide-react'
import { m } from 'motion/react' import { m } from 'motion/react'
import { startTransition, useEffect, useMemo, useRef, useState } from 'react' import { startTransition, useEffect, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@@ -356,7 +356,7 @@ export function StorageProvidersManager() {
<div className="flex items-start gap-3 sm:gap-4"> <div className="flex items-start gap-3 sm:gap-4">
<div className="shrink-0"> <div className="shrink-0">
<div className="bg-accent/10 inline-flex h-8 w-8 items-center justify-center rounded-lg sm:h-10 sm:w-10"> <div className="bg-accent/10 inline-flex h-8 w-8 items-center justify-center rounded-lg sm:h-10 sm:w-10">
<DynamicIcon name="shield-check" className="h-4 w-4 text-accent sm:h-5 sm:w-5" /> <ShieldCheck className="h-4 w-4 text-accent sm:h-5 sm:w-5" />
</div> </div>
</div> </div>
<div className="flex-1 space-y-1.5 sm:space-y-2"> <div className="flex-1 space-y-1.5 sm:space-y-2">

View File

@@ -282,11 +282,7 @@ function PlanCard({
disabled={!canCheckout || checkoutLoading} disabled={!canCheckout || checkoutLoading}
onClick={handleCheckout} onClick={handleCheckout}
> >
{checkoutLoading {checkoutLoading ? t(planI18nKeys.checkoutLoading) : t(planI18nKeys.checkoutUpgrade)}
? t(planI18nKeys.checkoutLoading)
: canCheckout
? t(planI18nKeys.checkoutUpgrade)
: t(planI18nKeys.checkoutComingSoon)}
</Button> </Button>
)} )}

View File

@@ -19,7 +19,7 @@
"@types/node": "^24.10.1", "@types/node": "^24.10.1",
"nodemon": "3.1.11", "nodemon": "3.1.11",
"typescript": "catalog:", "typescript": "catalog:",
"vite": "7.2.6", "vite": "8.0.0-beta.0",
"vite-node": "5.2.0" "vite-node": "5.2.0"
} }
} }

View File

@@ -40,18 +40,15 @@
}, },
"devDependencies": { "devDependencies": {
"@afilmory/builder": "workspace:*", "@afilmory/builder": "workspace:*",
"@clack/prompts": "^0.11.0",
"@innei/prettier": "1.0.0", "@innei/prettier": "1.0.0",
"@types/node": "24.10.1", "@types/node": "24.10.1",
"ast-kit": "2.2.0", "ast-kit": "2.2.0",
"consola": "3.4.2",
"dotenv-expand": "catalog:", "dotenv-expand": "catalog:",
"eslint": "9.39.1", "eslint": "9.39.1",
"eslint-config-hyoban": "4.0.10", "eslint-config-hyoban": "4.0.10",
"fast-glob": "3.3.3", "fast-glob": "3.3.3",
"lint-staged": "16.2.7", "lint-staged": "16.2.7",
"nbump": "2.1.8", "nbump": "2.1.8",
"opentype.js": "1.3.4",
"prettier": "3.7.4", "prettier": "3.7.4",
"sharp": "0.34.5", "sharp": "0.34.5",
"simple-git-hooks": "2.13.1", "simple-git-hooks": "2.13.1",
@@ -59,7 +56,7 @@
"tsx": "4.21.0", "tsx": "4.21.0",
"typescript": "catalog:", "typescript": "catalog:",
"unplugin-ast": "0.15.4", "unplugin-ast": "0.15.4",
"vite": "7.2.6", "vite": "8.0.0-beta.0",
"vite-bundle-analyzer": "1.2.3", "vite-bundle-analyzer": "1.2.3",
"vite-plugin-babel": "1.3.2", "vite-plugin-babel": "1.3.2",
"vite-plugin-checker": "0.11.0", "vite-plugin-checker": "0.11.0",
@@ -79,4 +76,4 @@
"pnpm update:lastmodified" "pnpm update:lastmodified"
] ]
} }
} }

View File

@@ -15,6 +15,7 @@
"@vingle/bmp-js": "^0.2.5", "@vingle/bmp-js": "^0.2.5",
"blurhash": "2.0.5", "blurhash": "2.0.5",
"c12": "^3.3.2", "c12": "^3.3.2",
"consola": "3.4.2",
"dotenv-expand": "catalog:", "dotenv-expand": "catalog:",
"execa": "9.6.1", "execa": "9.6.1",
"exiftool-vendored": "33.5.0", "exiftool-vendored": "33.5.0",
@@ -42,4 +43,4 @@
} }
} }
} }
} }

View File

@@ -23,7 +23,7 @@
"react": "19.2.1", "react": "19.2.1",
"tsdown": "0.17.0", "tsdown": "0.17.0",
"unplugin-dts": "1.0.0-beta.6", "unplugin-dts": "1.0.0-beta.6",
"vite": "7.2.6" "vite": "8.0.0-beta.0"
}, },
"publishConfig": { "publishConfig": {
"access": "public", "access": "public",
@@ -35,4 +35,4 @@
} }
} }
} }
} }

217
pnpm-lock.yaml generated
View File

@@ -75,9 +75,6 @@ importers:
specifier: 'catalog:' specifier: 'catalog:'
version: 4.1.13 version: 4.1.13
devDependencies: devDependencies:
'@clack/prompts':
specifier: ^0.11.0
version: 0.11.0
'@innei/prettier': '@innei/prettier':
specifier: 1.0.0 specifier: 1.0.0
version: 1.0.0 version: 1.0.0
@@ -87,9 +84,6 @@ importers:
ast-kit: ast-kit:
specifier: 2.2.0 specifier: 2.2.0
version: 2.2.0 version: 2.2.0
consola:
specifier: 3.4.2
version: 3.4.2
dotenv-expand: dotenv-expand:
specifier: 'catalog:' specifier: 'catalog:'
version: 12.0.3 version: 12.0.3
@@ -108,9 +102,6 @@ importers:
nbump: nbump:
specifier: 2.1.8 specifier: 2.1.8
version: 2.1.8(conventional-commits-filter@5.0.0)(magicast@0.3.5) version: 2.1.8(conventional-commits-filter@5.0.0)(magicast@0.3.5)
opentype.js:
specifier: 1.3.4
version: 1.3.4
prettier: prettier:
specifier: 3.7.4 specifier: 3.7.4
version: 3.7.4 version: 3.7.4
@@ -133,20 +124,20 @@ importers:
specifier: 0.15.4 specifier: 0.15.4
version: 0.15.4 version: 0.15.4
vite: vite:
specifier: 7.2.6 specifier: 8.0.0-beta.0
version: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-bundle-analyzer: vite-bundle-analyzer:
specifier: 1.2.3 specifier: 1.2.3
version: 1.2.3 version: 1.2.3
vite-plugin-babel: vite-plugin-babel:
specifier: 1.3.2 specifier: 1.3.2
version: 1.3.2(@babel/core@7.28.5)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 1.3.2(@babel/core@7.28.5)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
vite-plugin-checker: vite-plugin-checker:
specifier: 0.11.0 specifier: 0.11.0
version: 0.11.0(eslint@9.39.1(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 0.11.0(eslint@9.39.1(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: 5.1.4 specifier: 5.1.4
version: 5.1.4(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 5.1.4(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
apps/docs: apps/docs:
dependencies: dependencies:
@@ -173,7 +164,7 @@ importers:
version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: 4.1.17 specifier: 4.1.17
version: 4.1.17(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 4.1.17(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@types/mdast': '@types/mdast':
specifier: ^4.0.4 specifier: ^4.0.4
version: 4.0.4 version: 4.0.4
@@ -252,7 +243,7 @@ importers:
version: 1.0.0 version: 1.0.0
'@vitejs/plugin-react': '@vitejs/plugin-react':
specifier: ^5.1.1 specifier: ^5.1.1
version: 5.1.1(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 5.1.1(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
code-inspector-plugin: code-inspector-plugin:
specifier: 1.3.0 specifier: 1.3.0
version: 1.3.0 version: 1.3.0
@@ -299,8 +290,8 @@ importers:
specifier: ^8.48.1 specifier: ^8.48.1
version: 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) version: 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
vite: vite:
specifier: ^7.2.6 specifier: 8.0.0-beta.0
version: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
apps/landing: apps/landing:
dependencies: dependencies:
@@ -819,7 +810,7 @@ importers:
version: 0.5.19(tailwindcss@4.1.17) version: 0.5.19(tailwindcss@4.1.17)
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: 4.1.17 specifier: 4.1.17
version: 4.1.17(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 4.1.17(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@types/node': '@types/node':
specifier: 24.10.1 specifier: 24.10.1
version: 24.10.1 version: 24.10.1
@@ -831,7 +822,7 @@ importers:
version: 19.2.3(@types/react@19.2.7) version: 19.2.3(@types/react@19.2.7)
'@vitejs/plugin-react': '@vitejs/plugin-react':
specifier: ^5.1.1 specifier: ^5.1.1
version: 5.1.1(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 5.1.1(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
ast-kit: ast-kit:
specifier: 2.2.0 specifier: 2.2.0
version: 2.2.0 version: 2.2.0
@@ -888,10 +879,10 @@ importers:
version: 0.15.4 version: 0.15.4
vite-plugin-html: vite-plugin-html:
specifier: 3.2.2 specifier: 3.2.2
version: 3.2.2(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 3.2.2(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
vite-plugin-pwa: vite-plugin-pwa:
specifier: 1.2.0 specifier: 1.2.0
version: 1.2.0(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) version: 1.2.0(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0)
be: be:
dependencies: dependencies:
@@ -974,6 +965,9 @@ importers:
busboy: busboy:
specifier: 1.6.0 specifier: 1.6.0
version: 1.6.0 version: 1.6.0
consola:
specifier: 3.4.2
version: 3.4.2
drizzle-orm: drizzle-orm:
specifier: ^0.45.0 specifier: ^0.45.0
version: 0.45.0(@types/pg@8.15.6)(@vercel/postgres@0.10.0)(kysely@0.28.8)(pg@8.16.3)(postgres@3.4.7) version: 0.45.0(@types/pg@8.15.6)(@vercel/postgres@0.10.0)(kysely@0.28.8)(pg@8.16.3)(postgres@3.4.7)
@@ -1030,8 +1024,8 @@ importers:
specifier: 1.5.9 specifier: 1.5.9
version: 1.5.9(@swc/core@1.15.3(@swc/helpers@0.5.17))(rollup@4.53.3) version: 1.5.9(@swc/core@1.15.3(@swc/helpers@0.5.17))(rollup@4.53.3)
vite: vite:
specifier: 7.2.6 specifier: 8.0.0-beta.0
version: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-bundle-analyzer: vite-bundle-analyzer:
specifier: 1.2.3 specifier: 1.2.3
version: 1.2.3 version: 1.2.3
@@ -1040,7 +1034,7 @@ importers:
version: 5.2.0(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 5.2.0(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: 5.1.4 specifier: 5.1.4
version: 5.1.4(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 5.1.4(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
vitest: vitest:
specifier: 4.0.15 specifier: 4.0.15
version: 4.0.15(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 4.0.15(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
@@ -1200,7 +1194,7 @@ importers:
version: 0.5.19(tailwindcss@4.1.17) version: 0.5.19(tailwindcss@4.1.17)
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: 4.1.17 specifier: 4.1.17
version: 4.1.17(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 4.1.17(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@types/node': '@types/node':
specifier: 24.10.1 specifier: 24.10.1
version: 24.10.1 version: 24.10.1
@@ -1212,7 +1206,7 @@ importers:
version: 19.2.3(@types/react@19.2.7) version: 19.2.3(@types/react@19.2.7)
'@vitejs/plugin-react': '@vitejs/plugin-react':
specifier: ^5.1.1 specifier: ^5.1.1
version: 5.1.1(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 5.1.1(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
autoprefixer: autoprefixer:
specifier: 10.4.22 specifier: 10.4.22
version: 10.4.22(postcss@8.5.6) version: 10.4.22(postcss@8.5.6)
@@ -1271,17 +1265,17 @@ importers:
specifier: 5.9.3 specifier: 5.9.3
version: 5.9.3 version: 5.9.3
vite: vite:
specifier: 7.2.6 specifier: 8.0.0-beta.0
version: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-plugin-checker: vite-plugin-checker:
specifier: 0.11.0 specifier: 0.11.0
version: 0.11.0(eslint@9.39.1(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 0.11.0(eslint@9.39.1(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
vite-plugin-route-builder: vite-plugin-route-builder:
specifier: 0.4.1 specifier: 0.4.1
version: 0.4.1 version: 0.4.1
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: 5.1.4 specifier: 5.1.4
version: 5.1.4(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 5.1.4(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
be/apps/oauth-gateway: be/apps/oauth-gateway:
dependencies: dependencies:
@@ -1311,8 +1305,8 @@ importers:
specifier: 'catalog:' specifier: 'catalog:'
version: 5.9.3 version: 5.9.3
vite: vite:
specifier: 7.2.6 specifier: 8.0.0-beta.0
version: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-node: vite-node:
specifier: 5.2.0 specifier: 5.2.0
version: 5.2.0(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 5.2.0(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
@@ -1434,6 +1428,9 @@ importers:
c12: c12:
specifier: ^3.3.2 specifier: ^3.3.2
version: 3.3.2(magicast@0.5.1) version: 3.3.2(magicast@0.5.1)
consola:
specifier: 3.4.2
version: 3.4.2
dotenv-expand: dotenv-expand:
specifier: 'catalog:' specifier: 'catalog:'
version: 12.0.3 version: 12.0.3
@@ -1617,10 +1614,10 @@ importers:
version: 0.17.0(synckit@0.11.11)(typescript@5.9.3) version: 0.17.0(synckit@0.11.11)(typescript@5.9.3)
unplugin-dts: unplugin-dts:
specifier: 1.0.0-beta.6 specifier: 1.0.0-beta.6
version: 1.0.0-beta.6(@microsoft/api-extractor@7.52.13(@types/node@24.10.1))(esbuild@0.27.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) version: 1.0.0-beta.6(@microsoft/api-extractor@7.52.13(@types/node@24.10.1))(esbuild@0.25.12)(rollup@4.53.3)(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
vite: vite:
specifier: 7.2.6 specifier: 8.0.0-beta.0
version: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) version: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
packages: packages:
@@ -2480,12 +2477,6 @@ packages:
'@clack/core@0.3.5': '@clack/core@0.3.5':
resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==}
'@clack/core@0.5.0':
resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==}
'@clack/prompts@0.11.0':
resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==}
'@clack/prompts@0.8.2': '@clack/prompts@0.8.2':
resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==}
@@ -2566,15 +2557,9 @@ packages:
peerDependencies: peerDependencies:
tailwindcss: '*' tailwindcss: '*'
'@emnapi/core@1.6.0':
resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==}
'@emnapi/core@1.7.1': '@emnapi/core@1.7.1':
resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==}
'@emnapi/runtime@1.7.0':
resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==}
'@emnapi/runtime@1.7.1': '@emnapi/runtime@1.7.1':
resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
@@ -9814,11 +9799,6 @@ packages:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true hasBin: true
opentype.js@1.3.4:
resolution: {integrity: sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==}
engines: {node: '>= 8.0.0'}
hasBin: true
optionator@0.9.4: optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@@ -12162,6 +12142,46 @@ packages:
yaml: yaml:
optional: true optional: true
vite@8.0.0-beta.0:
resolution: {integrity: sha512-bXHWmtg5hUxn/MB5zJ8qhBLphnsNmO1EYOFmBO/fVCBJekTdWDuqJ/GmUMLgrC0QUCCrxhw3JLgteWdiyqaVSQ==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
esbuild: ^0.25.0
jiti: '>=1.21.0'
less: ^4.0.0
sass: ^1.70.0
sass-embedded: ^1.70.0
stylus: '>=0.54.8'
sugarss: ^5.0.0
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
peerDependenciesMeta:
'@types/node':
optional: true
esbuild:
optional: true
jiti:
optional: true
less:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
tsx:
optional: true
yaml:
optional: true
vitest@4.0.15: vitest@4.0.15:
resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
@@ -13050,7 +13070,7 @@ snapshots:
'@babel/code-frame@7.27.1': '@babel/code-frame@7.27.1':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.27.1 '@babel/helper-validator-identifier': 7.28.5
js-tokens: 4.0.0 js-tokens: 4.0.0
picocolors: 1.1.1 picocolors: 1.1.1
@@ -13061,7 +13081,7 @@ snapshots:
'@babel/core@7.28.4': '@babel/core@7.28.4':
dependencies: dependencies:
'@babel/code-frame': 7.27.1 '@babel/code-frame': 7.27.1
'@babel/generator': 7.28.3 '@babel/generator': 7.28.5
'@babel/helper-compilation-targets': 7.27.2 '@babel/helper-compilation-targets': 7.27.2
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
'@babel/helpers': 7.28.4 '@babel/helpers': 7.28.4
@@ -13867,17 +13887,6 @@ snapshots:
picocolors: 1.1.1 picocolors: 1.1.1
sisteransi: 1.0.5 sisteransi: 1.0.5
'@clack/core@0.5.0':
dependencies:
picocolors: 1.1.1
sisteransi: 1.0.5
'@clack/prompts@0.11.0':
dependencies:
'@clack/core': 0.5.0
picocolors: 1.1.1
sisteransi: 1.0.5
'@clack/prompts@0.8.2': '@clack/prompts@0.8.2':
dependencies: dependencies:
'@clack/core': 0.3.5 '@clack/core': 0.3.5
@@ -13983,23 +13992,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@emnapi/core@1.6.0':
dependencies:
'@emnapi/wasi-threads': 1.1.0
tslib: 2.8.1
optional: true
'@emnapi/core@1.7.1': '@emnapi/core@1.7.1':
dependencies: dependencies:
'@emnapi/wasi-threads': 1.1.0 '@emnapi/wasi-threads': 1.1.0
tslib: 2.8.1 tslib: 2.8.1
optional: true optional: true
'@emnapi/runtime@1.7.0':
dependencies:
tslib: 2.8.1
optional: true
'@emnapi/runtime@1.7.1': '@emnapi/runtime@1.7.1':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
@@ -14815,7 +14813,7 @@ snapshots:
'@img/sharp-wasm32@0.34.5': '@img/sharp-wasm32@0.34.5':
dependencies: dependencies:
'@emnapi/runtime': 1.7.0 '@emnapi/runtime': 1.7.1
optional: true optional: true
'@img/sharp-win32-arm64@0.34.5': '@img/sharp-win32-arm64@0.34.5':
@@ -15206,8 +15204,8 @@ snapshots:
'@napi-rs/wasm-runtime@0.2.12': '@napi-rs/wasm-runtime@0.2.12':
dependencies: dependencies:
'@emnapi/core': 1.6.0 '@emnapi/core': 1.7.1
'@emnapi/runtime': 1.7.0 '@emnapi/runtime': 1.7.1
'@tybys/wasm-util': 0.10.1 '@tybys/wasm-util': 0.10.1
optional: true optional: true
@@ -17274,12 +17272,12 @@ snapshots:
postcss-selector-parser: 6.0.10 postcss-selector-parser: 6.0.10
tailwindcss: 4.1.17 tailwindcss: 4.1.17
'@tailwindcss/vite@4.1.17(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))': '@tailwindcss/vite@4.1.17(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies: dependencies:
'@tailwindcss/node': 4.1.17 '@tailwindcss/node': 4.1.17
'@tailwindcss/oxide': 4.1.17 '@tailwindcss/oxide': 4.1.17
tailwindcss: 4.1.17 tailwindcss: 4.1.17
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
'@tanstack/devtools-event-client@0.3.5': {} '@tanstack/devtools-event-client@0.3.5': {}
@@ -18047,7 +18045,7 @@ snapshots:
optionalDependencies: optionalDependencies:
maplibre-gl: 5.14.0 maplibre-gl: 5.14.0
'@vitejs/plugin-react@5.1.1(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))': '@vitejs/plugin-react@5.1.1(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5)
@@ -18055,7 +18053,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.47 '@rolldown/pluginutils': 1.0.0-beta.47
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
react-refresh: 0.18.0 react-refresh: 0.18.0
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -22288,11 +22286,6 @@ snapshots:
opener@1.5.2: {} opener@1.5.2: {}
opentype.js@1.3.4:
dependencies:
string.prototype.codepointat: 0.2.1
tiny-inflate: 1.0.3
optionator@0.9.4: optionator@0.9.4:
dependencies: dependencies:
deep-is: 0.1.4 deep-is: 0.1.4
@@ -24647,9 +24640,9 @@ snapshots:
'@babel/generator': 7.28.5 '@babel/generator': 7.28.5
ast-kit: 2.2.0 ast-kit: 2.2.0
magic-string-ast: 1.0.3 magic-string-ast: 1.0.3
unplugin: 2.3.10 unplugin: 2.3.11
unplugin-dts@1.0.0-beta.6(@microsoft/api-extractor@7.52.13(@types/node@24.10.1))(esbuild@0.27.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): unplugin-dts@1.0.0-beta.6(@microsoft/api-extractor@7.52.13(@types/node@24.10.1))(esbuild@0.25.12)(rollup@4.53.3)(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)):
dependencies: dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.53.3) '@rollup/pluginutils': 5.3.0(rollup@4.53.3)
'@volar/typescript': 2.4.23 '@volar/typescript': 2.4.23
@@ -24662,9 +24655,9 @@ snapshots:
unplugin: 2.3.10 unplugin: 2.3.10
optionalDependencies: optionalDependencies:
'@microsoft/api-extractor': 7.52.13(@types/node@24.10.1) '@microsoft/api-extractor': 7.52.13(@types/node@24.10.1)
esbuild: 0.27.1 esbuild: 0.25.12
rollup: 4.53.3 rollup: 4.53.3
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -24855,12 +24848,12 @@ snapshots:
- tsx - tsx
- yaml - yaml
vite-plugin-babel@1.3.2(@babel/core@7.28.5)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): vite-plugin-babel@1.3.2(@babel/core@7.28.5)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)):
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-plugin-checker@0.11.0(eslint@9.39.1(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): vite-plugin-checker@0.11.0(eslint@9.39.1(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)):
dependencies: dependencies:
'@babel/code-frame': 7.27.1 '@babel/code-frame': 7.27.1
chokidar: 4.0.3 chokidar: 4.0.3
@@ -24869,7 +24862,7 @@ snapshots:
picomatch: 4.0.3 picomatch: 4.0.3
tiny-invariant: 1.3.3 tiny-invariant: 1.3.3
tinyglobby: 0.2.15 tinyglobby: 0.2.15
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vscode-uri: 3.1.0 vscode-uri: 3.1.0
optionalDependencies: optionalDependencies:
eslint: 9.39.1(jiti@2.6.1) eslint: 9.39.1(jiti@2.6.1)
@@ -24877,7 +24870,7 @@ snapshots:
optionator: 0.9.4 optionator: 0.9.4
typescript: 5.9.3 typescript: 5.9.3
vite-plugin-html@3.2.2(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): vite-plugin-html@3.2.2(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)):
dependencies: dependencies:
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
colorette: 2.0.20 colorette: 2.0.20
@@ -24891,14 +24884,14 @@ snapshots:
html-minifier-terser: 6.1.0 html-minifier-terser: 6.1.0
node-html-parser: 5.4.2 node-html-parser: 5.4.2
pathe: 0.2.0 pathe: 0.2.0
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-plugin-pwa@1.2.0(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): vite-plugin-pwa@1.2.0(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0):
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@5.5.0)
pretty-bytes: 6.1.1 pretty-bytes: 6.1.1
tinyglobby: 0.2.15 tinyglobby: 0.2.15
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-build: 7.3.0(@types/babel__core@7.20.5)
workbox-window: 7.3.0 workbox-window: 7.3.0
transitivePeerDependencies: transitivePeerDependencies:
@@ -24906,13 +24899,13 @@ snapshots:
vite-plugin-route-builder@0.4.1: {} vite-plugin-route-builder@0.4.1: {}
vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)):
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@5.5.0)
globrex: 0.1.2 globrex: 0.1.2
tsconfck: 3.1.6(typescript@5.9.3) tsconfck: 3.1.6(typescript@5.9.3)
optionalDependencies: optionalDependencies:
vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vite: 8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
@@ -24934,6 +24927,24 @@ snapshots:
tsx: 4.21.0 tsx: 4.21.0
yaml: 2.8.1 yaml: 2.8.1
vite@8.0.0-beta.0(@types/node@24.10.1)(esbuild@0.25.12)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1):
dependencies:
'@oxc-project/runtime': 0.101.0
fdir: 6.5.0(picomatch@4.0.3)
lightningcss: 1.30.2
picomatch: 4.0.3
postcss: 8.5.6
rolldown: 1.0.0-beta.53
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 24.10.1
esbuild: 0.25.12
fsevents: 2.3.3
jiti: 2.6.1
terser: 5.44.1
tsx: 4.21.0
yaml: 2.8.1
vitest@4.0.15(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1): vitest@4.0.15(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1):
dependencies: dependencies:
'@vitest/expect': 4.0.15 '@vitest/expect': 4.0.15