commit 8e76dd7a7bef91161fb33c1098262d70624f38b3 Author: folinhilo Date: Sun Mar 22 04:39:45 2026 +0800 Initial commit: Re-connected to Gitea diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad7f4b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# 基础忽略规则 +.DS_Store +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +*.swp +*.swo + +# 根目录依赖/构建产物 +node_modules/ +dist/ +build/ +coverage/ + +# Monorepo 子包专属忽略(核心) +packages/**/dist/ +packages/**/node_modules/ +packages/**/build/ +packages/**/coverage/ +packages/**/.env* +packages/**/npm-debug.log* +packages/**/yarn-debug.log* +packages/**/yarn-error.log* +packages/**/pnpm-debug.log* \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..8b02f75 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry = https://registry.npmmirror.com/ \ No newline at end of file diff --git a/.pnpmrc b/.pnpmrc new file mode 100644 index 0000000..e69de29 diff --git a/.turbo/cookies/1.cookie b/.turbo/cookies/1.cookie new file mode 100644 index 0000000..e69de29 diff --git a/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-24 b/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-24 new file mode 100644 index 0000000..5e927ce --- /dev/null +++ b/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-24 @@ -0,0 +1,2 @@ +2026-02-24T21:27:52.486904Z WARN daemon_server: turborepo_lib::commands::daemon: daemon already running +2026-02-24T21:36:52.418729Z WARN daemon_server: turborepo_lib::commands::daemon: daemon already running diff --git a/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-25 b/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-25 new file mode 100644 index 0000000..e69de29 diff --git a/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-26 b/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-26 new file mode 100644 index 0000000..07d6a78 --- /dev/null +++ b/.turbo/daemon/934a1a5ec62dbadc-turbo.log.2026-02-26 @@ -0,0 +1 @@ +2026-02-26T00:32:05.147541Z WARN daemon_server: turborepo_lib::commands::daemon: daemon already running diff --git a/apps/ui-site/.gitignore b/apps/ui-site/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/apps/ui-site/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/ui-site/README.md b/apps/ui-site/README.md new file mode 100644 index 0000000..d2e7761 --- /dev/null +++ b/apps/ui-site/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/apps/ui-site/eslint.config.js b/apps/ui-site/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/apps/ui-site/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/apps/ui-site/index.html b/apps/ui-site/index.html new file mode 100644 index 0000000..f985453 --- /dev/null +++ b/apps/ui-site/index.html @@ -0,0 +1,13 @@ + + + + + + + ui-site + + +
+ + + diff --git a/apps/ui-site/package.json b/apps/ui-site/package.json new file mode 100644 index 0000000..bd6b25e --- /dev/null +++ b/apps/ui-site/package.json @@ -0,0 +1,31 @@ +{ + "name": "ui-site", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.0", + "react-dom": "^19.2.0", + "@defgov/ui-headless": "workspace:*" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } +} diff --git a/apps/ui-site/public/vite.svg b/apps/ui-site/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/ui-site/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/ui-site/src/App.tsx b/apps/ui-site/src/App.tsx new file mode 100644 index 0000000..5f9a8df --- /dev/null +++ b/apps/ui-site/src/App.tsx @@ -0,0 +1,18 @@ +import { ThemeProvider } from "@defgov/ui"; +import { ButtonGallery } from "./gallery/ButtonGallery"; +import { CheckboxGallery } from "./gallery/CheckboxGallery"; +import { RadioGallery } from "./gallery/RadioGallery"; +import { TooltipGallery } from "./gallery/TootipGallery"; + +const App = () => { + return ( + + + + + + + ); +}; + +export default App; diff --git a/apps/ui-site/src/assets/react.svg b/apps/ui-site/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/apps/ui-site/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/ui-site/src/common/InnerWrap.tsx b/apps/ui-site/src/common/InnerWrap.tsx new file mode 100644 index 0000000..585795d --- /dev/null +++ b/apps/ui-site/src/common/InnerWrap.tsx @@ -0,0 +1,21 @@ +import { type ReactNode } from "react"; + +interface WrapProps { + children: ReactNode; +} + +export function InnerWrap({ children }: WrapProps) { + return ( +
+ {children} +
+ ); +} diff --git a/apps/ui-site/src/common/OuterWrap.tsx b/apps/ui-site/src/common/OuterWrap.tsx new file mode 100644 index 0000000..4a7c1c2 --- /dev/null +++ b/apps/ui-site/src/common/OuterWrap.tsx @@ -0,0 +1,20 @@ +import { type ReactNode } from "react"; + +interface WrapProps { + children: ReactNode; +} + +export function OuterWrap({ children }: WrapProps) { + return ( +
+ {children} +
+ ); +} diff --git a/apps/ui-site/src/gallery/ButtonGallery.tsx b/apps/ui-site/src/gallery/ButtonGallery.tsx new file mode 100644 index 0000000..26b2d52 --- /dev/null +++ b/apps/ui-site/src/gallery/ButtonGallery.tsx @@ -0,0 +1,52 @@ +import { Button, DownloadSvg } from "@defgov/ui"; +import { OuterWrap } from "../common/OuterWrap"; +import { useState } from "react"; +import { InnerWrap } from "../common/InnerWrap"; + +export const ButtonGallery = () => { + const [loading, setLoading] = useState(false); + return ( + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/apps/ui-site/src/gallery/CheckboxGallery.tsx b/apps/ui-site/src/gallery/CheckboxGallery.tsx new file mode 100644 index 0000000..cff234d --- /dev/null +++ b/apps/ui-site/src/gallery/CheckboxGallery.tsx @@ -0,0 +1,14 @@ +import { Checkbox } from "@defgov/ui"; +import { InnerWrap } from "../common/InnerWrap"; +import { OuterWrap } from "../common/OuterWrap"; + +export const CheckboxGallery = () => { + return ( + + + Apple + Apple + + + ); +}; diff --git a/apps/ui-site/src/gallery/RadioGallery.tsx b/apps/ui-site/src/gallery/RadioGallery.tsx new file mode 100644 index 0000000..c299c50 --- /dev/null +++ b/apps/ui-site/src/gallery/RadioGallery.tsx @@ -0,0 +1,22 @@ +import { Radio, RadioGroup } from "@defgov/ui"; +import { InnerWrap } from "../common/InnerWrap"; +import { OuterWrap } from "../common/OuterWrap"; + +export const RadioGallery = () => { + return ( + + + + Apple + Orange + + + + + Apple + Orange + + + + ); +}; diff --git a/apps/ui-site/src/gallery/TootipGallery.tsx b/apps/ui-site/src/gallery/TootipGallery.tsx new file mode 100644 index 0000000..ca5ce66 --- /dev/null +++ b/apps/ui-site/src/gallery/TootipGallery.tsx @@ -0,0 +1,15 @@ +import { Button, CutSvg, Tooltip } from "@defgov/ui"; +import { OuterWrap } from "../common/OuterWrap"; +import { InnerWrap } from "../common/InnerWrap"; + +export const TooltipGallery = () => { + return ( + + + + + + + + ); +}; diff --git a/apps/ui-site/src/main.tsx b/apps/ui-site/src/main.tsx new file mode 100644 index 0000000..7fdeda1 --- /dev/null +++ b/apps/ui-site/src/main.tsx @@ -0,0 +1,10 @@ +import "@defgov/ui/index.css"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/apps/ui-site/tsconfig.app.json b/apps/ui-site/tsconfig.app.json new file mode 100644 index 0000000..a9b5a59 --- /dev/null +++ b/apps/ui-site/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/apps/ui-site/tsconfig.json b/apps/ui-site/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/apps/ui-site/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/apps/ui-site/tsconfig.node.json b/apps/ui-site/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/apps/ui-site/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/apps/ui-site/vite.config.ts b/apps/ui-site/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/apps/ui-site/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/package.json b/package.json new file mode 100644 index 0000000..cfd4d8d --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "defgov", + "private": true, + "type": "module", + "scripts": { + "build": "turbo run build", + "dev": "turbo run dev" + }, + "devDependencies": { + "turbo": "^2.8.0" + }, + "packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017", + "engines": { + "node": ">=20" + } +} diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000..d3a76ee --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,51 @@ +{ + "name": "@defgov/ui", + "version": "0.0.0", + "private": true, + "type": "module", + "sideEffects": [ + "*.css" + ], + "main": "./dist/index.es.js", + "module": "./dist/index.es.js", + "types": "./dist/index.d.ts", + "style": "./dist/index.css", + "exports": { + ".": { + "import": "./dist/index.es.js", + "types": "./dist/index.d.ts" + }, + "./index.css": "./dist/index.css" + }, + "files": [ + "dist" + ], + "scripts": { + "dev": "pnpm gen-index && tsc && vite build -w", + "build": "pnpm gen-index && tsc && vite build", + "gen-index": "ts-node scripts/generate-index.ts && ts-node scripts/generate-index-css.ts" + }, + "devDependencies": { + "@tsconfig/vite-react": "^7.0.2", + "@types/node": "^25.1.0", + "@types/react": "^19.2.10", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.2", + "autoprefixer": "^10.4.24", + "glob": "^13.0.3", + "prettier": "^3.8.1", + "ts-node": "^10.9.2", + "typescript": "^5.9.3", + "vite": "^7.3.1", + "vite-plugin-dts": "^4.5.4" + }, + "dependencies": { + "@floating-ui/react": "^0.27.18", + "@tailwindcss/vite": "^4.2.1", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.2.1" + } +} diff --git a/packages/ui/scripts/generate-index-css.ts b/packages/ui/scripts/generate-index-css.ts new file mode 100644 index 0000000..f9aff2c --- /dev/null +++ b/packages/ui/scripts/generate-index-css.ts @@ -0,0 +1,157 @@ +// scripts/generate-index-use.ts +import { writeFileSync, readFileSync } from "fs"; +import { extname, relative, resolve, basename } from "path"; +import { globSync } from "glob"; + +interface Config { + targetDirs: string[]; + includeExtensions: string[]; + importSyntax: "@import"; + importSyntaxTail?: string; + excludeFilePattern: RegExp[]; + excludeDirs: string[]; + warnDuplicateTailwindImport: boolean; + indexFileName: string; +} + +// 配置项 +const srcDirConfig: Config = { + targetDirs: ["src"], // 包含的文件夹 + includeExtensions: [".css"], // 目标文件后缀 + importSyntax: "@import", // 导入时使用的语法 + excludeFilePattern: [/index\.css/, /index\.scss/, /\.(test|spec)\./], // 正则若匹配则排除 + // 排除的文件夹 + excludeDirs: [ + "__tests__", + "tests", + "story", + "stories", + "types", + "node_modules", + "dist", + "build", + ], + warnDuplicateTailwindImport: true, + indexFileName: "index.css", // 生成的入口文件名称 +}; + +// ====================================================================== + +/** + * 判断是否是有效 CSS 文件 + * @param filePath 文件绝对路径 + * @returns 是否为有效文件 + */ +function isValidFile(filePath: string, config: Config): boolean { + // 过滤排除的文件 + const filenameWithExt = filePath.split(/[\\/]/).pop()!; // “\\” 匹配反斜杠 “\”,“/” 匹配正斜杠 “/”,pop 返回最后一个 “/” 后面的内容 + const shouldExcludeFile = config.excludeFilePattern.some((pattern) => + pattern.test(filenameWithExt), + ); + if (shouldExcludeFile) { + return false; // 如果匹配到排除规则,跳过当前文件 + } + + // 过滤排除的文件夹 + const normalizedFilePath = filePath.replace(/\\/g, "/"); // “\\” 匹配反斜杠 “\”,“/” 匹配正斜杠 “/” + const shouldExcludeDir = config.excludeDirs.some( + (dir) => normalizedFilePath.includes(`/${dir}/`), // 前后都有“/” 是为了避免误匹配到文件名(如 test.js 不会被排除) + ); + if (shouldExcludeDir) return false; // 如果匹配到排除规则,跳过当前文件 + + // 过滤非目标扩展名,只有指定的才通过 + const ext = extname(filePath); + const isValidExt = config.includeExtensions.includes(ext); + + if (!isValidExt) { + return false; // 如果不是指定扩展名,跳过当前文件 + } + + // @import "tailwindcss" 重复警告,生成的入口文件会自动加一条,其他文件无需重复导入 + if (config.warnDuplicateTailwindImport) { + try { + const fileContent = readFileSync(filePath, "utf-8"); + if ( + fileContent.includes('@import "tailwindcss"') || + fileContent.includes("@import 'tailwindcss'") + ) { + console.warn( + `${filePath} 中含有重复的 @import "tailwindcss" 导入,应手动删除`, + ); + } + } catch (e) { + const errorMsg = e instanceof Error ? e.message : String(e); + console.warn(`⚠️ 读取文件内容失败(跳过过滤): ${filePath}`, errorMsg); + } + } + + return true; +} + +// ====================================================================== + +/** + * 生成 “@import” 导入语句 + */ +function generateIndexFile(config: Config) { + const [targetDir] = config.targetDirs; + const dirPath = resolve(process.cwd(), targetDir); //目标文件夹绝对路径, 通常是 /project/src + + const searchPattern = resolve(dirPath, "**", "*.*"); // 搜索路径 “dirPath/**/*” + + const allFiles = globSync(searchPattern, { + nodir: true, // 不匹配文件夹,只匹配文件 + absolute: true, // 返回从根目录开始的绝对路径 + windowsPathsNoEscape: true, // 禁用 Windows 路径的反斜杠转义 + dot: false, // 不配隐藏文件或目录(以 . 开头的文件) + follow: true, // 跟踪符号链接(symlinks),继续解析并返回链接的目标文件或目录 + }); + + const validFiles = allFiles.filter((value) => isValidFile(value, config)); // 过滤出要导入的有效 CSS 文件 + console.log(`✅ 有效 CSS 文件数量: ${validFiles.length}`); + validFiles.sort(); // 排序 + + const importStatements = validFiles.map((file) => { + const relPath = relative(dirPath, file); // 算出 src 与 css文件 的相对路径 + let importPath = "./" + relPath.replace(/\\/g, "/"); // 给相对路径前面加上 “./”,并将 “\\” 替换成 “/” + // 拼接 @import 语句 + if (config.importSyntaxTail !== undefined) { + return `${config.importSyntax} '${importPath}' ${config.importSyntaxTail};`; + } else { + return `${config.importSyntax} '${importPath}';`; + } + }); + + // index.css 文件的顶部内容 + const indexContent = ` +@import "tailwindcss"; +${importStatements.join("\n")} + +`.trim(); // 使用 trim 移除开头多余的换行 + + const indexFilePath = resolve(dirPath, config.indexFileName); + + // 创建和写入 index.css 文件 + writeFileSync(indexFilePath, indexContent, "utf-8"); + console.log(`✅ 成功生成 ${config.indexFileName}: ${indexFilePath}`); +} + +// ====================================================================== + +/** + * 主函数 + */ +function main() { + try { + generateIndexFile(srcDirConfig); + } catch (e) { + const errorMsg = e instanceof Error ? e.message : String(e); + console.error( + `❌ 文件夹 ${srcDirConfig.targetDirs} 扫描和生成 ${srcDirConfig.indexFileName} 失败:`, + errorMsg, + ); + process.exit(1); + } +} + +main(); diff --git a/packages/ui/scripts/generate-index.ts b/packages/ui/scripts/generate-index.ts new file mode 100644 index 0000000..213efff --- /dev/null +++ b/packages/ui/scripts/generate-index.ts @@ -0,0 +1,148 @@ +// scripts/generate-index.ts +import { writeFileSync } from "fs"; +import { extname, relative, resolve } from "path"; +import { globSync } from "glob"; + +interface Config { + targetDirs: string[]; + includeExtensions: string[]; + excludeKeywords: { + dirs: string[]; + fileSuffixes: string[]; + filePatterns: RegExp[]; + }; +} + +const CONFIG: Config = { + targetDirs: ["src"], + includeExtensions: [".ts", ".tsx", ".vue"], + excludeKeywords: { + dirs: ["__tests__", "tests", "story", "stories", "types"], + fileSuffixes: [".d.ts"], + filePatterns: [ + /^index\.(ts|tsx|js|jsx)$/, // index文件 + /\.(test|spec)\./, // 测试文件 .test.xxx / .spec.xxx + /\.(story|stories)\./, // Storybook文件 .story.xxx / .stories.xxx + ], + }, +}; + +/** + * 统一路径分隔符(兼容 Windows/Linux) + * @param path 原始路径 + * @returns 标准化路径(全部转为 /) + */ +const normalizePath = (path: string): string => path.replace(/\\/g, "/"); + +/** + * 检查文件是否在排除目录中 + * @param filePath 文件路径 + * @returns 是否在排除目录 + */ +const isInExcludeDir = (filePath: string): boolean => { + const normalizedPath = normalizePath(filePath); + return CONFIG.excludeKeywords.dirs.some((dir) => + normalizedPath.includes(`/${dir}/`), + ); +}; + +/** + * 检查文件是否匹配排除正则 + * @param fileName 文件名 + * @returns 是否匹配排除规则 + */ +const isMatchExcludePattern = (fileName: string): boolean => { + return CONFIG.excludeKeywords.filePatterns.some((pattern) => + pattern.test(fileName), + ); +}; + +/** + * 检查文件是否为排除后缀(如 .d.ts) + * @param filePath 文件路径 + * @returns 是否为排除后缀 + */ +const isExcludeSuffix = (filePath: string): boolean => { + return CONFIG.excludeKeywords.fileSuffixes.some((suffix) => + filePath.endsWith(suffix), + ); +}; + +function isValidFile(filePath: string): boolean { + const fileName = filePath.split(/[\\/]/).pop()!; + + // 按优先级过滤:目录 > 后缀 > 文件名规则 > 扩展名 + if (isInExcludeDir(filePath)) return false; + if (isExcludeSuffix(filePath)) return false; + if (isMatchExcludePattern(fileName)) return false; + + const ext = extname(filePath); + const isValidExt = CONFIG.includeExtensions.includes(ext); + + return isValidExt; +} + +// ========== 5. 生成索引文件(错误处理 + 语法规范) ========== +function generateIndexFile(dirPath: string): void { + const searchPattern = resolve(dirPath, "**", "*.*"); + + const allFiles = globSync(searchPattern, { + nodir: true, + absolute: true, + windowsPathsNoEscape: true, + dot: false, + follow: true, + }); + + if (allFiles.length === 0) { + return; + } + + const validFiles = allFiles.filter(isValidFile); + if (validFiles.length === 0) { + return; + } + + validFiles.sort(); + + // 生成导出语句 + const exportStatements = validFiles.map((file) => { + const relPath = relative(dirPath, file); + const importPath = `./${relPath.replace(/\.[^.]+$/, "").replace(/\\/g, "/")}`; + return `export * from '${importPath}';`; + }); + + // 生成索引文件内容(模板字符串格式化) + const indexContent = ` + +import './index.scss'; + +${exportStatements.join("\n")} +`; + + const indexFilePath = resolve(dirPath, "index.ts"); + writeFileSync(indexFilePath, indexContent, "utf-8"); +} + +// ========== 6. 主函数(完善错误处理 + 类型安全) ========== +function main(): void { + const [targetDir] = CONFIG.targetDirs; + if (!targetDir) { + console.error(`❌ 未配置目标扫描目录,请检查 CONFIG.targetDirs`); + process.exit(1); + } + + const absTargetDir = resolve(process.cwd(), targetDir); + + try { + generateIndexFile(absTargetDir); + } catch (error) { + // 处理 unknown 类型错误(TypeScript 最佳实践) + const errorMsg = error instanceof Error ? error.message : String(error); + console.error(`❌ 生成 index.ts 失败: ${errorMsg}`); + process.exit(1); + } +} + +// 执行主函数 +main(); diff --git a/packages/ui/src/assets/svg/CheckIndicatorOutlineSvg.tsx b/packages/ui/src/assets/svg/CheckIndicatorOutlineSvg.tsx new file mode 100644 index 0000000..00e2189 --- /dev/null +++ b/packages/ui/src/assets/svg/CheckIndicatorOutlineSvg.tsx @@ -0,0 +1,16 @@ +export const CheckIndicatorOutlineSvg = ( + props: React.SVGProps, +) => ( + + + +); diff --git a/packages/ui/src/assets/svg/CheckIndicatorSvg.tsx b/packages/ui/src/assets/svg/CheckIndicatorSvg.tsx new file mode 100644 index 0000000..8929efe --- /dev/null +++ b/packages/ui/src/assets/svg/CheckIndicatorSvg.tsx @@ -0,0 +1,14 @@ +export const CheckIndicatorSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/ChevronRightSvg.tsx b/packages/ui/src/assets/svg/ChevronRightSvg.tsx new file mode 100644 index 0000000..c03592d --- /dev/null +++ b/packages/ui/src/assets/svg/ChevronRightSvg.tsx @@ -0,0 +1,19 @@ + +export const ChevronRightSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/CutSvg.tsx b/packages/ui/src/assets/svg/CutSvg.tsx new file mode 100644 index 0000000..eb21988 --- /dev/null +++ b/packages/ui/src/assets/svg/CutSvg.tsx @@ -0,0 +1,14 @@ +export const CutSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/DownloadSvg.tsx b/packages/ui/src/assets/svg/DownloadSvg.tsx new file mode 100644 index 0000000..b313a3b --- /dev/null +++ b/packages/ui/src/assets/svg/DownloadSvg.tsx @@ -0,0 +1,14 @@ +export const DownloadSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/FileSvg.tsx b/packages/ui/src/assets/svg/FileSvg.tsx new file mode 100644 index 0000000..09eedd7 --- /dev/null +++ b/packages/ui/src/assets/svg/FileSvg.tsx @@ -0,0 +1,20 @@ +export const FileSvg = (props: React.SVGProps) => ( + + + + + + +); diff --git a/packages/ui/src/assets/svg/KeySvg.tsx b/packages/ui/src/assets/svg/KeySvg.tsx new file mode 100644 index 0000000..c4a7ba1 --- /dev/null +++ b/packages/ui/src/assets/svg/KeySvg.tsx @@ -0,0 +1,14 @@ +export const KeySvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/MoonSvg.tsx b/packages/ui/src/assets/svg/MoonSvg.tsx new file mode 100644 index 0000000..a3c660a --- /dev/null +++ b/packages/ui/src/assets/svg/MoonSvg.tsx @@ -0,0 +1,18 @@ +export const MoonSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/PasteSvg.tsx b/packages/ui/src/assets/svg/PasteSvg.tsx new file mode 100644 index 0000000..e1ead6c --- /dev/null +++ b/packages/ui/src/assets/svg/PasteSvg.tsx @@ -0,0 +1,14 @@ +export const PasteSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/RadioIndicatorOutlineSvg.tsx b/packages/ui/src/assets/svg/RadioIndicatorOutlineSvg.tsx new file mode 100644 index 0000000..5192efa --- /dev/null +++ b/packages/ui/src/assets/svg/RadioIndicatorOutlineSvg.tsx @@ -0,0 +1,16 @@ +export const RadioIndicatorOutlineSvg = ( + props: React.SVGProps, +) => ( + + + +); diff --git a/packages/ui/src/assets/svg/RadioIndicatorSvg.tsx b/packages/ui/src/assets/svg/RadioIndicatorSvg.tsx new file mode 100644 index 0000000..bfb5844 --- /dev/null +++ b/packages/ui/src/assets/svg/RadioIndicatorSvg.tsx @@ -0,0 +1,15 @@ +export const RadioIndicatorSvg = (props: React.SVGProps) => ( + + + + +); diff --git a/packages/ui/src/assets/svg/SearchSvg.tsx b/packages/ui/src/assets/svg/SearchSvg.tsx new file mode 100644 index 0000000..9b9feb7 --- /dev/null +++ b/packages/ui/src/assets/svg/SearchSvg.tsx @@ -0,0 +1,14 @@ +export const SearchSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/SettingSvg.tsx b/packages/ui/src/assets/svg/SettingSvg.tsx new file mode 100644 index 0000000..6b12453 --- /dev/null +++ b/packages/ui/src/assets/svg/SettingSvg.tsx @@ -0,0 +1,15 @@ +export const SettingSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/SpinnerSvg.tsx b/packages/ui/src/assets/svg/SpinnerSvg.tsx new file mode 100644 index 0000000..88b6050 --- /dev/null +++ b/packages/ui/src/assets/svg/SpinnerSvg.tsx @@ -0,0 +1,29 @@ +export const SpinnerSvg = (props: React.SVGProps) => { + return ( + + + + + + + ); +}; diff --git a/packages/ui/src/assets/svg/SunSvg.tsx b/packages/ui/src/assets/svg/SunSvg.tsx new file mode 100644 index 0000000..45a5b15 --- /dev/null +++ b/packages/ui/src/assets/svg/SunSvg.tsx @@ -0,0 +1,18 @@ +export const SunSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/UserSvg.tsx b/packages/ui/src/assets/svg/UserSvg.tsx new file mode 100644 index 0000000..2aa8d96 --- /dev/null +++ b/packages/ui/src/assets/svg/UserSvg.tsx @@ -0,0 +1,20 @@ +export const UserSvg = (props: React.SVGProps) => { + return ( + + + + ); +}; diff --git a/packages/ui/src/assets/svg/VolumeHighSvg.tsx b/packages/ui/src/assets/svg/VolumeHighSvg.tsx new file mode 100644 index 0000000..542edd0 --- /dev/null +++ b/packages/ui/src/assets/svg/VolumeHighSvg.tsx @@ -0,0 +1,19 @@ +export const VolumeHighSvg = (props: React.SVGProps) => ( + + + +); diff --git a/packages/ui/src/assets/svg/VolumeLowSvg.tsx b/packages/ui/src/assets/svg/VolumeLowSvg.tsx new file mode 100644 index 0000000..ba72ffb --- /dev/null +++ b/packages/ui/src/assets/svg/VolumeLowSvg.tsx @@ -0,0 +1,45 @@ +export const VolumeLowSvg = (props: React.SVGProps) => ( + + + + + + +); diff --git a/packages/ui/src/assets/svg/VolumeMediumSvg.tsx b/packages/ui/src/assets/svg/VolumeMediumSvg.tsx new file mode 100644 index 0000000..9f7c70d --- /dev/null +++ b/packages/ui/src/assets/svg/VolumeMediumSvg.tsx @@ -0,0 +1,44 @@ +export const VolumeMediumSvg = (props: React.SVGProps) => ( + + + + + + +); diff --git a/packages/ui/src/assets/svg/VolumeMuteSvg.tsx b/packages/ui/src/assets/svg/VolumeMuteSvg.tsx new file mode 100644 index 0000000..76923cf --- /dev/null +++ b/packages/ui/src/assets/svg/VolumeMuteSvg.tsx @@ -0,0 +1,41 @@ +export const VolumeMuteSvg = (props: React.SVGProps) => ( + + + + + +); diff --git a/packages/ui/src/common/CommonProps.ts b/packages/ui/src/common/CommonProps.ts new file mode 100644 index 0000000..d0a6562 --- /dev/null +++ b/packages/ui/src/common/CommonProps.ts @@ -0,0 +1,9 @@ +import type { CSSProperties } from "react"; + +export type CommonProps = { + className?: string; + style?: CSSProperties; + children?: React.ReactNode; + key?: string | number; + disabled?: boolean; +}; diff --git a/packages/ui/src/index.css b/packages/ui/src/index.css new file mode 100644 index 0000000..e0a9849 --- /dev/null +++ b/packages/ui/src/index.css @@ -0,0 +1,14 @@ +@import "tailwindcss"; +@import './styles/theme/theme-base.css'; +@import './styles/theme/theme-variant.css'; +@import './styles/utility/brand.css'; +@import './styles/utility/gap.css'; +@import './styles/utility/height-inline.css'; +@import './styles/utility/height.css'; +@import './styles/utility/loading.css'; +@import './styles/utility/margin-right.css'; +@import './styles/utility/padding.css'; +@import './styles/utility/skin.css'; +@import './styles/utility/variant.css'; +@import './styles/utility/width-inline.css'; +@import './styles/utility/width.css'; \ No newline at end of file diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts new file mode 100644 index 0000000..2323754 --- /dev/null +++ b/packages/ui/src/index.ts @@ -0,0 +1,52 @@ + + +import './index.scss'; + +export * from './assets/svg/CheckIndicatorOutlineSvg.tsx'; +export * from './assets/svg/CheckIndicatorSvg.tsx'; +export * from './assets/svg/ChevronRightSvg.tsx'; +export * from './assets/svg/CutSvg.tsx'; +export * from './assets/svg/DownloadSvg.tsx'; +export * from './assets/svg/FileSvg.tsx'; +export * from './assets/svg/KeySvg.tsx'; +export * from './assets/svg/MoonSvg.tsx'; +export * from './assets/svg/PasteSvg.tsx'; +export * from './assets/svg/RadioIndicatorOutlineSvg.tsx'; +export * from './assets/svg/RadioIndicatorSvg.tsx'; +export * from './assets/svg/SearchSvg.tsx'; +export * from './assets/svg/SettingSvg.tsx'; +export * from './assets/svg/SpinnerSvg.tsx'; +export * from './assets/svg/SunSvg.tsx'; +export * from './assets/svg/UserSvg.tsx'; +export * from './assets/svg/VolumeHighSvg.tsx'; +export * from './assets/svg/VolumeLowSvg.tsx'; +export * from './assets/svg/VolumeMediumSvg.tsx'; +export * from './assets/svg/VolumeMuteSvg.tsx'; +export * from './common/CommonProps.ts'; +export * from './lv1-fundamental/Box/Box.tsx'; +export * from './lv1-fundamental/Slot/Slot.tsx'; +export * from './lv1-fundamental/ThemeProvider/ThemeContext.ts'; +export * from './lv1-fundamental/ThemeProvider/ThemeProvider.tsx'; +export * from './lv1-fundamental/ThemeProvider/useThemeContext.ts'; +export * from './lv2-sized/Root/RootInline.recipe'; +export * from './lv2-sized/Root/RootInline.ts'; +export * from './lv2-sized/ItemRoot/ItemRoot.recipe.ts'; +export * from './lv2-sized/ItemRoot/ItemRoot.tsx'; +export * from './lv2-sized/Section/Section.recipe.ts'; +export * from './lv2-sized/Section/Section.tsx'; +export * from './lv3-partial/Icon/Icon.recipe.ts'; +export * from './lv3-partial/Icon/Icon.tsx'; +export * from './lv3-partial/Indicator/Indicator.recipe.ts'; +export * from './lv3-partial/Indicator/Indicator.tsx'; +export * from './lv3-partial/Label/Label.style.ts'; +export * from './lv3-partial/Label/Label.tsx'; +export * from './lv3-partial/Tooltip/Tooltip.tsx'; +export * from './lv4-normal/Button/Button.recipe.ts'; +export * from './lv4-normal/Button/Button.tsx'; +export * from './lv4-normal/Checkbox/Checkbox.recipe.ts'; +export * from './lv4-normal/Checkbox/Checkbox.tsx'; +export * from './lv4-normal/Radio/Radio.recipe.ts'; +export * from './lv4-normal/Radio/Radio.tsx'; +export * from './lv4-normal/Radio/RadioGroup.recipe.ts'; +export * from './lv4-normal/Radio/RadioGroup.tsx'; +export * from './lv4-normal/Radio/RadioGroupContext.ts'; diff --git a/packages/ui/src/lv1-fundamental/Box/Box.recipe.ts b/packages/ui/src/lv1-fundamental/Box/Box.recipe.ts new file mode 100644 index 0000000..3e04f10 --- /dev/null +++ b/packages/ui/src/lv1-fundamental/Box/Box.recipe.ts @@ -0,0 +1,5 @@ +import { tv } from "tailwind-variants"; + +export const boxRoot = tv({ + base: "flex justify-center items-center", +}); diff --git a/packages/ui/src/lv1-fundamental/Box/Box.tsx b/packages/ui/src/lv1-fundamental/Box/Box.tsx new file mode 100644 index 0000000..421ea5f --- /dev/null +++ b/packages/ui/src/lv1-fundamental/Box/Box.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import { useThemeContext } from "../ThemeProvider/useThemeContext"; +import { cn } from "tailwind-variants"; +import type { CommonProps } from "@/common/CommonProps"; +import { boxRoot } from "./Box.recipe"; + +// 别名<约束>=值 +// 千万不要 C = As extend React.ElementType,这样子连等号,会切断推导 +type AsProp = { as?: C }; + +type PropsToOmit = keyof (AsProp & P); + +export type PolymorphicProps = (P & + AsProp) & + Omit, PropsToOmit>; + +interface BoxProps extends CommonProps { + as?: C; +} + +const Box = ( + props: PolymorphicProps>, + ref?: React.ComponentPropsWithRef["ref"], +) => { + const { as: Component = "div", children, className, ...rest } = props; + + const { themeClass } = useThemeContext(); + if (!themeClass) { + throw new Error("Box must be used within a ThemeProvider"); + } + + const boxRootClass = cn(themeClass, boxRoot(), className); + + return ( + + {children} + + ); +}; + +export type BoxComponent = ( + props: PolymorphicProps> & { + ref?: React.ComponentPropsWithRef["ref"]; + }, +) => React.ReactElement | null; + +export default Box as BoxComponent; diff --git a/packages/ui/src/lv1-fundamental/Slot/Slot.tsx b/packages/ui/src/lv1-fundamental/Slot/Slot.tsx new file mode 100644 index 0000000..a3aaf67 --- /dev/null +++ b/packages/ui/src/lv1-fundamental/Slot/Slot.tsx @@ -0,0 +1,50 @@ +import * as React from "react"; +import { cn } from "tailwind-variants"; + +export interface SlotProps extends React.HTMLAttributes { + children: React.ReactNode; +} + +export const Slot = React.forwardRef( + ( + { + children, + onClick: externalOnClick, + style: styleProp, + className: classNameProp, + ...props + }, + ref, + ) => { + if (!React.isValidElement(children)) return null; + + const child = children as React.ReactElement>; + + const mergedClassName = cn(child.props.className as string, classNameProp); + + const mergedStyle = { + ...(child.props.style ?? {}), + ...(styleProp ?? {}), + } as React.CSSProperties; + + const childOnClick = child.props.onClick as + | ((e: React.MouseEvent) => void) + | undefined; + + const mergedOnClick = (e: React.MouseEvent) => { + childOnClick?.(e); + externalOnClick?.(e); + }; + + return React.cloneElement(child, { + ...child.props, + ...props, + ref, + style: mergedStyle, + className: mergedClassName, + onClick: mergedOnClick, + }); + }, +); + +Slot.displayName = "Slot"; diff --git a/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeContext.ts b/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeContext.ts new file mode 100644 index 0000000..580007c --- /dev/null +++ b/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeContext.ts @@ -0,0 +1,9 @@ +import { createContext } from "react"; + +export type Theme = "light" | "dark"; + +export const ThemeContext = createContext<{ + theme?: Theme; + toggleTheme?: () => void; + themeClass?: string; +} | null>(null); diff --git a/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeProvider.tsx b/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeProvider.tsx new file mode 100644 index 0000000..e3ceb29 --- /dev/null +++ b/packages/ui/src/lv1-fundamental/ThemeProvider/ThemeProvider.tsx @@ -0,0 +1,32 @@ +import { useState, type ReactNode } from "react"; +import { type Theme, ThemeContext } from "./ThemeContext"; +import { cn } from "tailwind-variants"; + +type ThemeProviderProps = { + children?: ReactNode; + defaultTheme?: Theme; +}; + +export const ThemeProvider = ({ + children, + defaultTheme, +}: ThemeProviderProps) => { + const [theme, setTheme] = useState(defaultTheme || "light"); + const toggleTheme = () => setTheme(theme === "light" ? "dark" : "light"); + + const frameworkClass = "dg"; + const themeClass = cn(frameworkClass, theme); + + return ( + +
+ {children} +
+
+ ); +}; diff --git a/packages/ui/src/lv1-fundamental/ThemeProvider/useThemeContext.ts b/packages/ui/src/lv1-fundamental/ThemeProvider/useThemeContext.ts new file mode 100644 index 0000000..a3b65ab --- /dev/null +++ b/packages/ui/src/lv1-fundamental/ThemeProvider/useThemeContext.ts @@ -0,0 +1,8 @@ +import { useContext } from "react"; +import { ThemeContext } from "./ThemeContext"; + +export function useThemeContext() { + const context = useContext(ThemeContext); + if (!context) throw new Error("useTheme must be used within ThemeProvider"); + return context; +} diff --git a/packages/ui/src/lv2-sized/InlineRoot/IinlineRoot.recipe.ts b/packages/ui/src/lv2-sized/InlineRoot/IinlineRoot.recipe.ts new file mode 100644 index 0000000..24372e9 --- /dev/null +++ b/packages/ui/src/lv2-sized/InlineRoot/IinlineRoot.recipe.ts @@ -0,0 +1,119 @@ +import { tv } from "tailwind-variants"; + +export const inlineRootRecipe = tv({ + base: "relative overflow-hidden flex flex-nowrap", + variants: { + size: { + xs: "text-xs h-inline-xs", + sm: "text-sm h-inline-sm", + md: "text-md h-inline-md", + lg: "text-lg h-inline-lg", + xl: "text-xl h-inline-xl", + "2xl": "text-2xl h-inline-2xl", + }, + shape: { + square: "rounded-none", + rounded: "", + circle: "rounded-full", + }, + variant: { + filled: "variant-filled", + outline: "variant-outline", + subtle: "variant-subtle", + }, + brand: { + success: "brand-success", + danger: "brand-danger", + info: "brand-info", + warning: "brand-warning", + emphasis: "brand-emphasis", + }, + iconOnly: { + true: "", + false: "", + }, + disabled: { + true: "", + false: "", + }, + }, + compoundVariants: [ + { + shape: "rounded", + size: "xs", + class: "rounded-xs", + }, + { + shape: "rounded", + size: "sm", + class: "rounded-sm", + }, + { + shape: "rounded", + size: "md", + class: "rounded-md", + }, + { + shape: "rounded", + size: "lg", + class: "rounded-lg", + }, + { + shape: "rounded", + size: "xl", + class: "rounded-xl", + }, + { + shape: "rounded", + size: "2xl", + class: "rounded-2xl", + }, + // -------------------------------------------------- + { + iconOnly: true, + size: "xs", + class: "w-inline-xs", + }, + { + iconOnly: true, + size: "sm", + class: "w-inline-sm", + }, + { + iconOnly: true, + size: "md", + class: "w-inline-md", + }, + { + iconOnly: true, + size: "lg", + class: "w-inline-lg", + }, + { + iconOnly: true, + size: "xl", + class: "w-inline-xl", + }, + { + iconOnly: true, + size: "2xl", + class: "w-inline-2xl", + }, + // -------------------------------------------------- + { + disabled: true, + variant: "filled", + class: "variant-filled-disabled", + }, + { + disabled: true, + variant: "outline", + class: "variant-outline-disabled", + }, + { + disabled: true, + variant: "subtle", + class: "variant-subtle-disabled", + }, + ], +}); diff --git a/packages/ui/src/lv2-sized/InlineRoot/InlineRoot.tsx b/packages/ui/src/lv2-sized/InlineRoot/InlineRoot.tsx new file mode 100644 index 0000000..6cb5340 --- /dev/null +++ b/packages/ui/src/lv2-sized/InlineRoot/InlineRoot.tsx @@ -0,0 +1,75 @@ +import type { CommonProps } from "@/common/CommonProps"; +import { cn } from "tailwind-variants"; +import Box, { type PolymorphicProps } from "@/lv1-fundamental/Box/Box"; +import { inlineRootRecipe } from "./IinlineRoot.recipe"; + +interface ItemInlineRootProps extends CommonProps { + as?: C; + size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl"; + shape?: "square" | "rounded" | "circle"; + variant?: "filled" | "outline" | "subtle"; + brand?: "success" | "danger" | "info" | "warning" | "emphasis"; + iconOnly?: boolean; +} + +const ItemInlineRoot = ( + props: PolymorphicProps>, + ref?: React.ComponentPropsWithRef["ref"], +) => { + const { + as = "span", + size = "sm", + shape = "square", + brand, + iconOnly = false, + variant, + onClick, + disabled = false, + className, + children, + ...rest + } = props; + + const handleClick = (e: React.MouseEvent) => { + if (disabled) { + e.preventDefault(); + return; + } + onClick?.(e); + }; + + const itemInlineRootClass = cn( + inlineRootRecipe({ + variant, + size, + shape, + iconOnly, + disabled, + brand, + }), + className, + ); + + return ( + + {children} + + ); +}; + +ItemInlineRoot.displayName = "ItemInlineRoot"; + +export type ItemInlineRootComponent = ( + props: PolymorphicProps> & { + ref?: React.ComponentPropsWithRef["ref"]; + }, +) => React.ReactElement | null; + +export default ItemInlineRoot as ItemInlineRootComponent; diff --git a/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.recipe.ts b/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.recipe.ts new file mode 100644 index 0000000..f602c78 --- /dev/null +++ b/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.recipe.ts @@ -0,0 +1,123 @@ +import { tv } from "tailwind-variants"; + +export const itemRootRecipe = tv({ + base: "relative select-none overflow-hidden flex flex-nowrap", + variants: { + size: { + xs: "text-xs h-xs px-xs gap-xs", + sm: "text-sm h-sm px-sm gap-sm", + md: "text-md h-md px-md gap-md", + lg: "text-lg h-lg px-lg gap-lg", + xl: "text-xl h-xl px-xl gap-xl", + "2xl": "text-2xl h-2xl px-2xl gap-2xl", + }, + shape: { + square: "rounded-none", + rounded: "", + circle: "rounded-full", + }, + variant: { + filled: "variant-filled", + outline: "variant-outline", + subtle: "variant-subtle", + }, + brand: { + success: "brand-success", + danger: "brand-danger", + info: "brand-info", + warning: "brand-warning", + emphasis: "brand-emphasis", + }, + iconOnly: { + true: "", + false: "", + }, + hasShadow: { + true: "shadow-xl", + false: "", + }, + disabled: { + true: "", + false: "", + }, + }, + compoundVariants: [ + { + shape: "rounded", + size: "xs", + class: "rounded-xs", + }, + { + shape: "rounded", + size: "sm", + class: "rounded-sm", + }, + { + shape: "rounded", + size: "md", + class: "rounded-md", + }, + { + shape: "rounded", + size: "lg", + class: "rounded-lg", + }, + { + shape: "rounded", + size: "xl", + class: "rounded-xl", + }, + { + shape: "rounded", + size: "2xl", + class: "rounded-2xl", + }, + // -------------------------------------------------- + { + iconOnly: true, + size: "xs", + class: "w-xs", + }, + { + iconOnly: true, + size: "sm", + class: "w-sm", + }, + { + iconOnly: true, + size: "md", + class: "w-md", + }, + { + iconOnly: true, + size: "lg", + class: "w-lg", + }, + { + iconOnly: true, + size: "xl", + class: "w-xl", + }, + { + iconOnly: true, + size: "2xl", + class: "w-2xl", + }, + // -------------------------------------------------- + { + disabled: true, + variant: "filled", + class: "variant-filled-disabled", + }, + { + disabled: true, + variant: "outline", + class: "variant-outline-disabled", + }, + { + disabled: true, + variant: "subtle", + class: "variant-subtle-disabled", + }, + ], +}); diff --git a/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.tsx b/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.tsx new file mode 100644 index 0000000..38a64c5 --- /dev/null +++ b/packages/ui/src/lv2-sized/ItemRoot/ItemRoot.tsx @@ -0,0 +1,81 @@ +import type { CommonProps } from "@/common/CommonProps"; +import { itemRootRecipe } from "./ItemRoot.recipe"; +import { cn } from "tailwind-variants"; +import Box, { type PolymorphicProps } from "@/lv1-fundamental/Box/Box"; + +interface ItemRootProps extends CommonProps { + as?: C; + size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl"; + shape?: "square" | "rounded" | "circle"; + variant?: "filled" | "outline" | "subtle"; + brand?: "success" | "danger" | "info" | "warning" | "emphasis"; + hasShadow?: boolean; + iconOnly?: boolean; +} + +const ItemRoot = ( + props: PolymorphicProps>, + ref?: React.ComponentPropsWithRef["ref"], +) => { + const { + as = "div", + size = "sm", + shape = "rounded", + brand: propBrand, + iconOnly = false, + variant, + hasShadow = false, + onClick, + disabled = false, + className, + children, + ...rest + } = props; + + const brand = + variant == "filled" && propBrand == undefined ? "info" : propBrand; + + const handleClick = (e: React.MouseEvent) => { + if (disabled) { + e.preventDefault(); + return; + } + onClick?.(e); + }; + + const itemRootClass = cn( + itemRootRecipe({ + variant, + size, + shape, + iconOnly, + disabled, + hasShadow, + brand, + }), + className, + ); + + return ( + + {children} + + ); +}; + +ItemRoot.displayName = "ItemRoot"; + +export type ItemRootComponent = ( + props: PolymorphicProps> & { + ref?: React.ComponentPropsWithRef["ref"]; + }, +) => React.ReactElement | null; + +export default ItemRoot as ItemRootComponent; diff --git a/packages/ui/src/lv2-sized/Section/Section.recipe.ts b/packages/ui/src/lv2-sized/Section/Section.recipe.ts new file mode 100644 index 0000000..d9583fe --- /dev/null +++ b/packages/ui/src/lv2-sized/Section/Section.recipe.ts @@ -0,0 +1,12 @@ +import { tv } from "tailwind-variants"; + +export const sectionRoot = tv({ + base: "", + variants: { + align: { + start: "justify-start", + center: "justify-center", + end: "justify-end", + }, + }, +}); diff --git a/packages/ui/src/lv2-sized/Section/Section.tsx b/packages/ui/src/lv2-sized/Section/Section.tsx new file mode 100644 index 0000000..45b12d9 --- /dev/null +++ b/packages/ui/src/lv2-sized/Section/Section.tsx @@ -0,0 +1,23 @@ +import type { CommonProps } from "@/common/CommonProps"; +import { forwardRef } from "react"; +import { sectionRoot } from "./Section.recipe"; +import Box from "@/lv1-fundamental/Box/Box"; +import { cn } from "tailwind-variants"; + +type SectionProps = CommonProps & { + align?: "start" | "center" | "end"; +}; + +export const Section = forwardRef( + (props, ref) => { + const { className, align, children, ...rest } = props; + + const sectionRootClass = cn(sectionRoot({ align }), className); + + return ( + + {children} + + ); + }, +); diff --git a/packages/ui/src/lv3-partial/Icon/Icon.recipe.ts b/packages/ui/src/lv3-partial/Icon/Icon.recipe.ts new file mode 100644 index 0000000..b9a54fb --- /dev/null +++ b/packages/ui/src/lv3-partial/Icon/Icon.recipe.ts @@ -0,0 +1,19 @@ +import { tv } from "tailwind-variants"; + +export const iconRoot = tv({ + base: "dg-icon", +}); + +export const iconSvg = tv({ + base: "dg-icon-svg", + variants: { + size: { + xs: "dg-icon-svg_size--xs", + sm: "dg-icon-svg_size--sm", + md: "dg-icon-svg_size--md", + lg: "dg-icon-svg_size--lg", + xl: "dg-icon-svg_size--xl", + "2xl": "dg-icon-svg_size--2xl", + }, + }, +}); diff --git a/packages/ui/src/lv3-partial/Icon/Icon.tsx b/packages/ui/src/lv3-partial/Icon/Icon.tsx new file mode 100644 index 0000000..a359775 --- /dev/null +++ b/packages/ui/src/lv3-partial/Icon/Icon.tsx @@ -0,0 +1,25 @@ +import type { CommonProps } from "@/common/CommonProps"; +import { forwardRef } from "react"; +import { iconRoot, iconSvg } from "./Icon.recipe.ts"; +import { Slot } from "@/lv1-fundamental/Slot/Slot"; +import { cn } from "tailwind-variants"; +import InlineRoot from "@/lv2-sized/InlineRoot/InlineRoot.tsx"; + +type IconProps = CommonProps & { + size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl"; +}; + +export const Icon = forwardRef((props, ref) => { + const { size, children, className, ...rest } = props; + + const iconRootClass = cn(iconRoot(), className); + const iconSvgClass = iconSvg({ size }); + + return ( + + {children} + + ); +}); + +Icon.displayName = "Icon"; diff --git a/packages/ui/src/lv3-partial/Indicator/Indicator.recipe.ts b/packages/ui/src/lv3-partial/Indicator/Indicator.recipe.ts new file mode 100644 index 0000000..a0d2835 --- /dev/null +++ b/packages/ui/src/lv3-partial/Indicator/Indicator.recipe.ts @@ -0,0 +1,5 @@ +import { tv } from "tailwind-variants"; + +export const indicatorInput = tv({ base: "pointer-none" }); +export const indicatorBoxSvg = tv({ base: "absolute z-10" }); +export const indicatorCheckSvg = tv({ base: "absolute z-20" }); diff --git a/packages/ui/src/lv3-partial/Indicator/Indicator.tsx b/packages/ui/src/lv3-partial/Indicator/Indicator.tsx new file mode 100644 index 0000000..459ea9d --- /dev/null +++ b/packages/ui/src/lv3-partial/Indicator/Indicator.tsx @@ -0,0 +1,92 @@ +import { forwardRef, type ReactNode } from "react"; +import { + // indicatorBoxSvg, + // indicatorCheckSvg, + indicatorInput, +} from "./Indicator.recipe"; +import type { CommonProps } from "@/common/CommonProps"; +import InlineRoot from "@/lv2-sized/InlineRoot/InlineRoot"; +// import { CheckIndicatorOutlineSvg } from "@/assets/svg/CheckIndicatorOutlineSvg"; +// import { RadioIndicatorOutlineSvg } from "@/assets/svg/RadioIndicatorOutlineSvg"; +// import { RadioIndicatorSvg } from "@/assets/svg/RadioIndicatorSvg"; +// import { CheckIndicatorSvg } from "@/assets/svg/CheckIndicatorSvg"; + +type IndicatorProps = CommonProps & { + size?: "xs" | "sm"; + type?: "checkbox" | "radio"; + boxSvg?: ReactNode; + checkSvg?: ReactNode; + checked?: boolean; + id?: string; +}; + +export const Indicator = forwardRef( + (props, ref) => { + const { + size = "sm", + type = "checkbox", + // boxSvg, + // checkSvg, + checked, + id, + disabled, + } = props; + + // const currentBoxSvg = boxSvg ? ( + // boxSvg + // ) : type == "checkbox" ? ( + // + // ) : ( + // + // ); + + // const currentCheckSvg = checkSvg ? ( + // checkSvg + // ) : type == "checkbox" ? ( + // + // ) : ( + // + // ); + + const indicatorInputClass = indicatorInput(); + // const indicatorBoxSvgClass = indicatorBoxSvg(); + // const indicatorCheckSvgClass = indicatorCheckSvg(); + + return ( + + ) => { + e.preventDefault(); // 阻止默认行为,防止闪烁 + return false; + }} + // 此处仅用于阻止默认行为,不要处理 keydown 逻辑 + onKeyDown={(e: React.KeyboardEvent) => { + e.preventDefault(); // 阻止默认行为,防止闪烁 + return false; + }} + disabled={disabled} // 交互类 disabled 需要手动传入,而不是依靠父元素灰色滤镜 + className={indicatorInputClass} + /> + + {/* + {currentBoxSvg} + + + {checked && ( + + {currentCheckSvg} + + )} */} + + ); + }, +); +Indicator.displayName = "Indicator"; diff --git a/packages/ui/src/lv3-partial/Label/Label.scss b/packages/ui/src/lv3-partial/Label/Label.scss new file mode 100644 index 0000000..7f54a6e --- /dev/null +++ b/packages/ui/src/lv3-partial/Label/Label.scss @@ -0,0 +1,30 @@ +@use "../../styles/index.scss" as *; + +.dg-label { + @include add-specificity(3) { + } +} +.dg-label_align--start { + @include add-specificity(3) { + @include justify-start; + } +} +.dg-label_align--center { + @include add-specificity(3) { + @include justify-center; + } +} +.dg-label_align--end { + @include add-specificity(3) { + @include justify-end; + } +} +.dg-label_is-subtext--true { + @include add-specificity(3) { + @include color-subtext; + } +} +.dg-label_is-subtext--false { + @include add-specificity(3) { + } +} diff --git a/packages/ui/src/lv3-partial/Label/Label.style.ts b/packages/ui/src/lv3-partial/Label/Label.style.ts new file mode 100644 index 0000000..00c8d84 --- /dev/null +++ b/packages/ui/src/lv3-partial/Label/Label.style.ts @@ -0,0 +1,16 @@ +import { tv } from "tailwind-variants"; + +export const labelRoot = tv({ + base: "dg-label", + variants: { + align: { + start: "dg-label_align--start", + center: "dg-label_align--center", + end: "dg-label_align--end", + }, + isSubText: { + true: "dg-label_is-subtext--true", + false: "dg-label_is-subtext--false", + }, + }, +}); diff --git a/packages/ui/src/lv3-partial/Label/Label.tsx b/packages/ui/src/lv3-partial/Label/Label.tsx new file mode 100644 index 0000000..0de8adc --- /dev/null +++ b/packages/ui/src/lv3-partial/Label/Label.tsx @@ -0,0 +1,39 @@ +import type { CommonProps } from "@/common/CommonProps"; +import { forwardRef } from "react"; +import { cn } from "tailwind-variants"; +import { labelRoot } from "./Label.style"; +import { RootInline } from "@/lv2-sized/Root/RootInline"; + +type LabelProps = CommonProps & { + size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl"; + align?: "start" | "center" | "end"; + isSubText?: boolean; + for?: string; +}; + +export const Label = forwardRef((props, ref) => { + const { + size, + isSubText = false, + align, + children, + className, + ...rest + } = props; + + const labelRootClass = cn(labelRoot({ align, isSubText }), className); + + return ( + + {children} + + ); +}); + +Label.displayName = "Label"; diff --git a/packages/ui/src/lv3-partial/Tooltip/Tooltip.scss b/packages/ui/src/lv3-partial/Tooltip/Tooltip.scss new file mode 100644 index 0000000..3cd256a --- /dev/null +++ b/packages/ui/src/lv3-partial/Tooltip/Tooltip.scss @@ -0,0 +1,7 @@ +@use "../../styles/index.scss" as *; + +.dg-tooltip-dropdown { + @include add-specificity(3) { + border: 1px solid; + } +} diff --git a/packages/ui/src/lv3-partial/Tooltip/Tooltip.tsx b/packages/ui/src/lv3-partial/Tooltip/Tooltip.tsx new file mode 100644 index 0000000..0d06e25 --- /dev/null +++ b/packages/ui/src/lv3-partial/Tooltip/Tooltip.tsx @@ -0,0 +1,70 @@ +import { Slot } from "@/lv1-fundamental/Slot/Slot"; +import Root from "@/lv2-sized/ItemRoot/ItemRoot"; +import type { CommonProps } from "@/common/CommonProps"; +import { + autoUpdate, + flip, + FloatingPortal, + offset, + shift, + useDismiss, + useFloating, + useFocus, + useHover, + useInteractions, + useRole, + type Placement, +} from "@floating-ui/react"; +import { useState, type ReactNode } from "react"; + +type TooltipProps = CommonProps & { + title?: ReactNode; + placement?: Placement; +}; + +export const Tooltip = (props: TooltipProps) => { + const { children, placement = "top", title } = props; + const [open, setOpen] = useState(false); + + const { refs, floatingStyles, context } = useFloating({ + open: open, + onOpenChange: setOpen, + placement: placement, + middleware: [offset(4), flip(), shift()], + whileElementsMounted: autoUpdate, + }); + + const hover = useHover(context, { + delay: { open: 0, close: 0 }, + }); + const focus = useFocus(context); + const dismiss = useDismiss(context); + const role = useRole(context, { role: "tooltip" }); + const { getReferenceProps, getFloatingProps } = useInteractions([ + hover, + focus, + dismiss, + role, + ]); + + return ( + <> + + {children} + + {open && ( + + + {title} + + + )} + + ); +}; diff --git a/packages/ui/src/lv4-normal/Button/Button.recipe.ts b/packages/ui/src/lv4-normal/Button/Button.recipe.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/ui/src/lv4-normal/Button/Button.scss b/packages/ui/src/lv4-normal/Button/Button.scss new file mode 100644 index 0000000..7b3049a --- /dev/null +++ b/packages/ui/src/lv4-normal/Button/Button.scss @@ -0,0 +1,31 @@ +@use "../../styles/index.scss" as *; + +.dg-button { + @include add-specificity(4) { + padding-block: 0; + } +} +.dg-button-content { + @include add-specificity(4) { + } +} + +.dg-button_isloading--true { + @include add-specificity(4) { + @include loading-true; + } +} +.dg-button_isloading--false { + @include add-specificity(4) { + @include loading-false; + } +} +.dg-button-loading-icon { + @include add-specificity(4) { + @include absolute; + } +} +.dg-button-icon { + @include add-specificity(4) { + } +} diff --git a/packages/ui/src/lv4-normal/Button/Button.tsx b/packages/ui/src/lv4-normal/Button/Button.tsx new file mode 100644 index 0000000..3e63857 --- /dev/null +++ b/packages/ui/src/lv4-normal/Button/Button.tsx @@ -0,0 +1,93 @@ +import Box from "@/lv1-fundamental/Box/Box"; +import Root from "@/lv2-sized/ItemRoot/ItemRoot"; +import { Icon } from "@/lv3-partial/Icon/Icon"; +import { Label } from "@/lv3-partial/Label/Label"; + +import type { CommonProps } from "@/common/CommonProps"; +import { forwardRef } from "react"; +import { + buttonContent, + buttonIcon, + buttonLoadingIcon, + buttonRoot, +} from "./Button.recipe"; +import { cn } from "tailwind-variants"; +import { SpinnerSvg } from "@/assets/svg/SpinnerSvg"; + +type ButtonProps = CommonProps & { + size?: "xs" | "sm" | "md" | "lg"; + shape?: "circle" | "rounded" | "square"; + variant?: "filled" | "outline" | "subtle"; + isLoading?: boolean; + loadingIcon?: React.ReactNode; + iconSvg?: React.ReactNode; + iconOnly?: boolean; + hideIcon?: boolean; // not a state just a attribute + onClick?: () => void; +}; + +export const Button = forwardRef( + (props, ref) => { + const { + size = "md", + shape = "rounded", + variant = "filled", + iconOnly = false, + iconSvg, + hideIcon = false, + isLoading, + loadingIcon, + children, + className, + disabled, + ...rest + } = props; + + const buttonRootClass = cn(buttonRoot({ iconOnly }), className); + const buttonIconClass = buttonIcon(); + const buttonContentClass = + (isLoading != undefined && buttonContent({ isLoading })) || ""; + const buttonLoadingIconClass = buttonLoadingIcon({ + isLoading, + }); + + return ( + + + {iconOnly && ( + // if iconOnly + + {iconSvg && !hideIcon ? iconSvg : null} + + )} + + {!iconOnly && + // if not iconOnly + iconSvg && + !hideIcon ? ( + {iconSvg} + ) : null} + + {!iconOnly ? : null} + + + {isLoading != undefined && ( + + + + )} + + ); + }, +); + +Button.displayName = "Button"; diff --git a/packages/ui/src/lv4-normal/Checkbox/Checkbox.recipe.ts b/packages/ui/src/lv4-normal/Checkbox/Checkbox.recipe.ts new file mode 100644 index 0000000..979e4fe --- /dev/null +++ b/packages/ui/src/lv4-normal/Checkbox/Checkbox.recipe.ts @@ -0,0 +1,8 @@ +import { tv } from "tailwind-variants"; + +export const checkboxRoot = tv({ + base: "dg-checkbox", +}); +export const checkboxLabel = tv({ + base: "dg-checkbox-label", +}); \ No newline at end of file diff --git a/packages/ui/src/lv4-normal/Checkbox/Checkbox.scss b/packages/ui/src/lv4-normal/Checkbox/Checkbox.scss new file mode 100644 index 0000000..1151d3b --- /dev/null +++ b/packages/ui/src/lv4-normal/Checkbox/Checkbox.scss @@ -0,0 +1,13 @@ +@use "../../styles/index.scss" as *; + +.dg-checkbox { + @include add-specificity(4) { + cursor: pointer; + padding-block: 0; + } +} +.dg-checkbox-label { + @include add-specificity(4) { + cursor: pointer; + } +} diff --git a/packages/ui/src/lv4-normal/Checkbox/Checkbox.tsx b/packages/ui/src/lv4-normal/Checkbox/Checkbox.tsx new file mode 100644 index 0000000..0be442f --- /dev/null +++ b/packages/ui/src/lv4-normal/Checkbox/Checkbox.tsx @@ -0,0 +1,103 @@ +import { RootInline } from "@/lv2-sized/Root/RootInline"; +import { Icon } from "@/lv3-partial/Icon/Icon"; +import { Label } from "@/lv3-partial/Label/Label"; +import type { CommonProps } from "@/common/CommonProps"; +import { forwardRef, useState, type ReactNode } from "react"; +import { cn } from "tailwind-variants"; +import { checkboxLabel, checkboxRoot } from "./Checkbox.recipe"; +import Root from "@/lv2-sized/ItemRoot/ItemRoot"; +import { Indicator } from "@/lv3-partial/Indicator/Indicator"; + +type CheckboxProps = CommonProps & { + id?: string; + checked?: boolean; + defaultChecked?: boolean; + onChange?: (v: boolean) => void; + size?: "xs" | "sm"; + isPlaceholder?: boolean; + indicatorBoxSvg?: ReactNode; + indicatorCheckSvg?: ReactNode; + iconSvg?: ReactNode; +}; + +export const Checkbox = forwardRef( + (props, ref) => { + const { + id, + checked: controllerChecked, + defaultChecked = false, + onChange, + size = "sm", + isPlaceholder = false, + indicatorBoxSvg, + indicatorCheckSvg, + iconSvg, + className, + children, + disabled = false, + ...rest + } = props; + + const isControlled = controllerChecked !== undefined; + const [innerChecked, setInnerChecked] = useState(defaultChecked ?? false); + const currentChecked = isControlled ? controllerChecked : innerChecked; + + const handleClick = (_e: React.MouseEvent) => { + // 若受控,点击不变 + if (isControlled) { + return false; + } + // 若不受控,点击变更 + const next = !currentChecked; + setInnerChecked(next); + onChange?.(next); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + // 若受控,点击不变 + if (isControlled) { + return false; + } + // 若不受控,点击变更 + const next = !currentChecked; + if (e.key === " " || e.key === "Enter") { + setInnerChecked(next); + } + onChange?.(next); + }; + + const checkboxRootClass = cn(checkboxRoot(), className); + const checkboxLabelClass = checkboxLabel(); + + return ( + + {isPlaceholder ? ( + + ) : ( + + )} + + {iconSvg ? {iconSvg} : null} + + + + ); + }, +); + +Checkbox.displayName = "Checkbox"; diff --git a/packages/ui/src/lv4-normal/Radio/Radio.recipe.ts b/packages/ui/src/lv4-normal/Radio/Radio.recipe.ts new file mode 100644 index 0000000..500dc17 --- /dev/null +++ b/packages/ui/src/lv4-normal/Radio/Radio.recipe.ts @@ -0,0 +1,9 @@ +import { tv } from "tailwind-variants"; + +export const radioRoot = tv({ + base: "dg-radio", +}); + +export const radioLabel = tv({ + base: "dg-radio-label", +}); diff --git a/packages/ui/src/lv4-normal/Radio/Radio.scss b/packages/ui/src/lv4-normal/Radio/Radio.scss new file mode 100644 index 0000000..97b7b8f --- /dev/null +++ b/packages/ui/src/lv4-normal/Radio/Radio.scss @@ -0,0 +1,13 @@ +@use "../../styles/index.scss" as *; + +.dg-radio { + @include add-specificity(4) { + cursor: pointer; + padding-block: 0; + } +} +.dg-radio-label { + @include add-specificity(4) { + cursor: pointer; + } +} diff --git a/packages/ui/src/lv4-normal/Radio/Radio.tsx b/packages/ui/src/lv4-normal/Radio/Radio.tsx new file mode 100644 index 0000000..1ea5172 --- /dev/null +++ b/packages/ui/src/lv4-normal/Radio/Radio.tsx @@ -0,0 +1,114 @@ +import { RootInline } from "@/lv2-sized/Root/RootInline"; +import { Icon } from "@/lv3-partial/Icon/Icon"; +import { Label } from "@/lv3-partial/Label/Label"; +import type { CommonProps } from "@/common/CommonProps"; +import { forwardRef, useContext, useState, type ReactNode } from "react"; +import { cn } from "tailwind-variants"; +import { radioLabel, radioRoot } from "./Radio.recipe"; +import { RadioGroupContext } from "./RadioGroupContext"; +import { Indicator } from "@/lv3-partial/Indicator/Indicator"; +import Root from "@/lv2-sized/ItemRoot/ItemRoot"; + +type RadioProps = CommonProps & { + id?: string; + name?: string; + value: string; + checked?: boolean; + defaultChecked?: boolean; + onChange?: (name: string, value: boolean) => void; + size?: "xs" | "sm"; + isPlaceholder?: boolean; + indicatorBoxSvg?: ReactNode; + indicatorCheckSvg?: ReactNode; + iconSvg?: ReactNode; +}; + +export const Radio = forwardRef((props, ref) => { + const { + checked: controllerChecked, + defaultChecked = false, + onChange, + size = "sm", + isPlaceholder = false, + indicatorBoxSvg, + indicatorCheckSvg, + iconSvg, + className, + children, + disabled = false, + id, + name, + value, + ...rest + } = props; + + const ctx = useContext(RadioGroupContext); + if (!ctx) { + throw new Error("Radio must be used within a RadioGroup"); + } + + const isControlled = controllerChecked !== undefined; + const [innerChecked, setInnerChecked] = useState(defaultChecked ?? false); + const currentChecked = isControlled ? controllerChecked : innerChecked; + + const currentSize = ctx.size ?? size; + const currentName = ctx.name ?? name; + + const handleClick = (_e: React.MouseEvent) => { + // 若受控,点击不变 + if (isControlled) { + return false; + } + // 若不受控,点击变更 + const next = !currentChecked; + setInnerChecked(next); + onChange?.(currentName, next); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + // 若受控,点击不变 + if (isControlled) { + return false; + } + // 若不受控,点击变更 + const next = !currentChecked; + if (e.key === " " || e.key === "Enter") { + setInnerChecked(next); + } + onChange?.(currentName, next); + }; + + const radioRootClass = cn(radioRoot(), className); + const radioLabelClass = radioLabel(); + + return ( + + {isPlaceholder ? ( + + ) : ( + + )} + + {iconSvg ? {iconSvg} : null} + + + + ); +}); + +Radio.displayName = "Radio"; diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroup.recipe.ts b/packages/ui/src/lv4-normal/Radio/RadioGroup.recipe.ts new file mode 100644 index 0000000..4957c3a --- /dev/null +++ b/packages/ui/src/lv4-normal/Radio/RadioGroup.recipe.ts @@ -0,0 +1,15 @@ +import { tv } from "tailwind-variants"; + +export const radioGroupRoot = tv({ + base: "dg-radio-group", + variants: { + direction: { + horizontal: "dg-radio-group_direction--horizontal", + vertical: "dg-radio-group_direction--vertical", + }, + }, +}); + +export const radioGroupList = tv({ + base: "dg-radio-group-list", +}); diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroup.scss b/packages/ui/src/lv4-normal/Radio/RadioGroup.scss new file mode 100644 index 0000000..0c9912e --- /dev/null +++ b/packages/ui/src/lv4-normal/Radio/RadioGroup.scss @@ -0,0 +1,24 @@ +@use "../../styles/index.scss" as *; + +.dg-radio-group { + @include add-specificity(4) { + @include flex-col; + } +} +.dg-radio-group_direction--horizontal { + @include add-specificity(4) { + @include flex-row; + } +} +.dg-radio-group_direction--vertical { + @include add-specificity(4) { + @include flex-col; + } +} +.dg-radio-group-list { + @include add-specificity(4) { + @include flex-col; + @include justify-start; + @include items-start; + } +} diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroup.tsx b/packages/ui/src/lv4-normal/Radio/RadioGroup.tsx new file mode 100644 index 0000000..6414965 --- /dev/null +++ b/packages/ui/src/lv4-normal/Radio/RadioGroup.tsx @@ -0,0 +1,59 @@ +import type { CommonProps } from "@/common/CommonProps"; +import { RadioGroupContext } from "./RadioGroupContext"; +import { useState } from "react"; +import { Label } from "@/lv3-partial/Label/Label"; +import Root from "@/lv2-sized/ItemRoot/ItemRoot"; +import { radioGroupList, radioGroupRoot } from "./RadioGroup.recipe"; +import Box from "@/lv1-fundamental/Box/Box"; + +type RadioGroupProps = CommonProps & { + name: string; + label?: string; + defaultValue?: string; + onChange?: (value: string) => void; + size?: "xs" | "sm"; + direction?: "vertical" | "horizontal"; +}; + +export const RadioGroup = (props: RadioGroupProps) => { + const { + name, + defaultValue, + onChange, + label, + size = "sm", + direction = "horizontal", + className, + children, + ...rest + } = props; + + const [value, setValue] = useState(defaultValue ?? ""); + + const handleChange = (v: string) => { + setValue(v); + onChange?.(v); + }; + + const radioGroupRootClass = radioGroupRoot({ direction }); + const radioGroupListClass = radioGroupList(); + + return ( + + + + {label && ( + + + + )} + {children} + + + + ); +}; diff --git a/packages/ui/src/lv4-normal/Radio/RadioGroupContext.ts b/packages/ui/src/lv4-normal/Radio/RadioGroupContext.ts new file mode 100644 index 0000000..22e4cc9 --- /dev/null +++ b/packages/ui/src/lv4-normal/Radio/RadioGroupContext.ts @@ -0,0 +1,12 @@ +import { createContext } from "react"; + +export type RadioGroupContextType = { + name: string; + onChange: (v: string) => void; + value: string; + size: "xs" | "sm"; +}; + +export const RadioGroupContext = createContext( + null, +); diff --git a/packages/ui/src/styles/theme/theme-base.css b/packages/ui/src/styles/theme/theme-base.css new file mode 100644 index 0000000..13a3995 --- /dev/null +++ b/packages/ui/src/styles/theme/theme-base.css @@ -0,0 +1,36 @@ +@theme { + --danger-fg: var(--base-fg); + --danger-bg-low-hover: var(--color-red-100); + --danger-bg-low-active: var(--color-red-200); + --danger-bg: var(--color-red-600); + --danger-bg-high-hover: var(--color-red-700); + --danger-bg-high-active: var(--color-red-800); + --danger-border-color: var(--color-transparent); + --success-fg: var(--base-fg); + --success-bg-low-hover: var(--color-green-100); + --success-bg-low-active: var(--color-green-200); + --success-bg: var(--color-green-600); + --success-bg-high-hover: var(--color-green-700); + --success-bg-high-active: var(--color-green-800); + --info-fg: var(--base-fg); + --info-bg-low-hover: var(--color-sky-100); + --info-bg-low-active: var(--color-sky-200); + --info-bg: var(--color-sky-600); + --info-bg-high-hover: var(--color-sky-700); + --info-bg-high-active: var(--color-sky-800); + --info-border-color: var(--color-transparent); + --warning-fg: var(--base-fg); + --warning-bg-low-hover: var(--color-amber-100); + --warning-bg-low-active: var(--color-amber-200); + --warning-bg: var(--color-amber-600); + --warning-bg-high-hover: var(--color-amber-700); + --warning-bg-high-active: var(--color-amber-800); + --warning-border-color: var(--color-transparent); + --emphasis-fg: var(--base-fg); + --emphasis-bg-low-hover: var(--color-gray-100); + --emphasis-bg-low-active: var(--color-gray-200); + --emphasis-bg: var(--color-gray-600); + --emphasis-bgr-high-hover: var(--color-gray-700); + --emphasis-bg-high-active: var(--color-gray-800); + --emphasis-border-color: var(--color-transparent); +} diff --git a/packages/ui/src/styles/theme/theme-variant.css b/packages/ui/src/styles/theme/theme-variant.css new file mode 100644 index 0000000..d9f2f42 --- /dev/null +++ b/packages/ui/src/styles/theme/theme-variant.css @@ -0,0 +1,25 @@ +@theme { + --filled-fg: var(--color-white); + --filled-fg-hover: var(--brand-fg); + --filled-fg-active: var(--brand-fg); + --filled-bg: var(--brand-bg); + --filled-bg-hover: var(--brand-bg-high-hover); + --filled-bg-active: var(--brand-bg-high-active); + --filled-border-color: var(--brand-border-color); + + --outline-fg: var(--brand-bg); + --outline-fg-hover: var(--brand-bg); + --outline-fg-active: var(--brand-bg); + --outline-bg: var(--brand-border-color); + --outline-bg-hover: var(--brand-bg-low-hover); + --outline-bg-active: var(--brand-bg-low-active); + --outline-border-color: var(--brand-bg); + + --subtle-fg: var(--brand-bg); + --subtle-fg-hover: var(--brand-bg); + --subtle-fg-active: var(--brand-bg); + --subtle-bg: var(--brand-border-color); + --subtle-bg-hover: var(--brand-bg-low-hover); + --subtle-bg-active: var(--brand-bg-low-active); + --subtle-border-color: var(--brand-border-color); +} diff --git a/packages/ui/src/styles/utility/brand.css b/packages/ui/src/styles/utility/brand.css new file mode 100644 index 0000000..d25926c --- /dev/null +++ b/packages/ui/src/styles/utility/brand.css @@ -0,0 +1,45 @@ +@utility brand-info { + --brand-fg: var(--info-fg); + --brand-bg-low-hover: var(--info-bg-low-hover); + --brand-bg-low-active: var(--info-bg-low-active); + --brand-bg: var(--info-bg); + --brand-bg-high-hover: var(--info-bg-high-hover); + --brand-bg-high-active: var(--info-bg-high-active); + --brand-border-color: var(--info-border-color); +} +@utility brand-danger { + --brand-fg: var(--danger-fg); + --brand-bg-low-hover: var(--danger-bg-low-hover); + --brand-bg-low-active: var(--danger-bg-low-active); + --brand-bg: var(--danger-bg); + --brand-bg-high-hover: var(--danger-bg-high-hover); + --brand-bg-high-active: var(--danger-bg-high-active); + --brand-border-color: var(--danger-border-color); +} +@utility brand-success { + --brand-fg: var(--success-fg); + --brand-bg-low-hover: var(--success-bg-low-hover); + --brand-bg-low-active: var(--success-bg-low-active); + --brand-bg: var(--success-bg); + --brand-bg-high-hover: var(--success-bg-high-hover); + --brand-bg-high-active: var(--success-bg-high-active); + --brand-border-color: var(--success-border-color); +} +@utility brand-warning { + --brand-fg: var(--warning-fg); + --brand-bg-low-hover: var(--warning-bg-low-hover); + --brand-bg-low-active: var(--warning-bg-low-active); + --brand-bg: var(--warning-bg); + --brand-bg-high-hover: var(--warning-bg-high-hover); + --brand-bg-high-active: var(--warning-bg-high-active); + --brand-border-color: var(--warning-border-color); +} +@utility brand-emphasis { + --brand-fg: var(--emphasis-fg); + --brand-bg-low-hover: var(--emphasis-bg-low-hover); + --brand-bg-low-active: var(--emphasis-bg-low-active); + --brand-bg: var(--emphasis-bg); + --brand-bg-high-hover: var(--emphasis-bg-high-hover); + --brand-bg-high-active: var(--emphasis-bg-high-active); + --brand-border-color: var(--emphasis-border-color); +} diff --git a/packages/ui/src/styles/utility/gap.css b/packages/ui/src/styles/utility/gap.css new file mode 100644 index 0000000..817efa1 --- /dev/null +++ b/packages/ui/src/styles/utility/gap.css @@ -0,0 +1,18 @@ +@utility gap-xs { + gap: calc(var(--spacing) * 0.5); +} +@utility gap-sm { + gap: calc(var(--spacing) * 2); +} +@utility gap-md { + gap: calc(var(--spacing) * 3); +} +@utility gap-lg { + gap: calc(var(--spacing) * 4); +} +@utility gap-xl { + gap: calc(var(--spacing) * 5); +} +@utility gap-2xl { + gap: calc(var(--spacing) * 6); +} diff --git a/packages/ui/src/styles/utility/height.css b/packages/ui/src/styles/utility/height.css new file mode 100644 index 0000000..563518f --- /dev/null +++ b/packages/ui/src/styles/utility/height.css @@ -0,0 +1,36 @@ +@utility h-xs { + height: calc(var(--spacing) * 5); +} +@utility h-sm { + height: calc(var(--spacing) * 6); +} +@utility h-md { + height: calc(var(--spacing) * 8); +} +@utility h-lg { + height: calc(var(--spacing) * 9); +} +@utility h-xl { + height: calc(var(--spacing) * 11); +} +@utility h-2xl { + height: calc(var(--spacing) * 16); +} +@utility h-inline-xs { + height: var(--text-xs--line-height); +} +@utility h-inline-sm { + height: var(--text-sm--line-height); +} +@utility h-inline-md { + height: var(--text-base--line-height); +} +@utility h-inline-lg { + height: var(--text-lg--line-height); +} +@utility h-inline-xl { + height: var(--text-xl--line-height); +} +@utility h-inline-2xl { + height: var(--text-2xl--line-height); +} diff --git a/packages/ui/src/styles/utility/loading.css b/packages/ui/src/styles/utility/loading.css new file mode 100644 index 0000000..a046d34 --- /dev/null +++ b/packages/ui/src/styles/utility/loading.css @@ -0,0 +1,16 @@ +@utility loading-true { + position: "absolute"; + top: "50%"; + left: "50%"; + transform: "translate(-50%, -50%)"; + opacity: 1; + transition: "top 0.15s ease-in, opacity 0.1s ease-in"; +} +@utility loading-false { + position: "absolute"; + top: "-50%"; + left: "50%"; + transform: "translate(-50%, -50%)"; + opacity: 0; + transition: "top 0.15s ease-out, opacity 0.1s ease-out"; +} diff --git a/packages/ui/src/styles/utility/margin.css b/packages/ui/src/styles/utility/margin.css new file mode 100644 index 0000000..69d1f89 --- /dev/null +++ b/packages/ui/src/styles/utility/margin.css @@ -0,0 +1,21 @@ +@utility mr-none { + margin-right: 0; +} +@utility mr-xs { + margin-right: calc(var(--spacing) * 1); +} +@utility mr-sm { + margin-right: calc(var(--spacing) * 2); +} +@utility mr-md { + margin-right: calc(var(--spacing) * 3); +} +@utility mr-lg { + margin-right: calc(var(--spacing) * 4); +} +@utility mr-xl { + margin-right: calc(var(--spacing) * 2); +} +@utility mr-2xl { + margin-right: calc(var(--spacing) * 2); +} diff --git a/packages/ui/src/styles/utility/padding.css b/packages/ui/src/styles/utility/padding.css new file mode 100644 index 0000000..296675c --- /dev/null +++ b/packages/ui/src/styles/utility/padding.css @@ -0,0 +1,36 @@ +@utility px-xs { + padding-inline: calc(var(--spacing) * 2); +} +@utility px-sm { + padding-inline: calc(var(--spacing) * 3); +} +@utility px-md { + padding-inline: calc(var(--spacing) * 4); +} +@utility px-lg { + padding-inline: calc(var(--spacing) * 5); +} +@utility px-xl { + padding-inline: calc(var(--spacing) * 6); +} +@utility px-2xl { + padding-inline: calc(var(--spacing) * 8); +} +@utility py-xs { + padding-block: calc(var(--spacing) * 1); +} +@utility py-sm { + padding-block: calc(var(--spacing) * 2); +} +@utility py-md { + padding-block: calc(var(--spacing) * 3); +} +@utility py-lg { + padding-block: calc(var(--spacing) * 4); +} +@utility py-xl { + padding-block: calc(var(--spacing) * 5); +} +@utility py-2xl { + padding-block: calc(var(--spacing) * 6); +} diff --git a/packages/ui/src/styles/utility/skin.css b/packages/ui/src/styles/utility/skin.css new file mode 100644 index 0000000..0ed68ed --- /dev/null +++ b/packages/ui/src/styles/utility/skin.css @@ -0,0 +1,13 @@ +@utility light { + --base-fg: var(--color-gray-950); + --base-bg: var(--color-white); + --base-fg-subtext: var(--color-gray-500); + --base-bg-subtext: var(--color-gray-200); +} + +@utility dark { + --base-fg: var(--color-gray-50); + --base-bg: var(--color-black); + --base-fg-subtext: var(--color-gray-400); + --base-bg-subtext: var(--color-gray-600); +} diff --git a/packages/ui/src/styles/utility/variant.css b/packages/ui/src/styles/utility/variant.css new file mode 100644 index 0000000..a39107d --- /dev/null +++ b/packages/ui/src/styles/utility/variant.css @@ -0,0 +1,137 @@ +@utility variant-filled { + color: var(--filled-fg); + background-color: var(--filled-bg); + border-color: var(--filled-border-color); + + &:hover { + background-color: var(--filled-bg-hover); + } + + &:active { + background-color: var(--filled-bg-active); + } + + &:focus-visible { + background-color: var(--filled-bg-hover); + } +} + +@utility variant-outline { + color: var(--outline-fg); + background-color: var(--outline-bg); + border-color: var(--outline-border-color); + + &:hover { + background-color: var(--outline-bg-hover); + } + + &:active { + background-color: var(--outline-bg-active); + } + + &:focus-visible { + background-color: var(--outline-bg-hover); + } +} + +@utility variant-subtle { + color: var(--subtle-fg); + background-color: var(--subtle-bg); + border-color: var(--subtle-border-color); + + &:hover { + background-color: var(--subtle-bg-hover); + } + + &:active { + background-color: var(--subtle-bg-active); + } + + &:focus-visible { + background-color: var(--subtle-bg-hover); + } +} + +@utility variant-filled-disabled { + color: var(--filled-fg); + background-color: var(--filled-bg); + border-color: var(--filled-border-color); + filter: grayscale(50%); + + &:hover { + color: var(--filled-fg); + background-color: var(--filled-bg); + border-color: var(--filled-border-color); + filter: grayscale(50%); + } + + &:active { + color: var(--filled-fg); + background-color: var(--filled-bg); + border-color: var(--filled-border-color); + filter: grayscale(50%); + } + + &:focus-visible { + color: var(--filled-fg); + background-color: var(--filled-bg); + border-color: var(--filled-border-color); + filter: grayscale(50%); + } +} + +@utility variant-outline-disabled { + color: var(--outline-fg); + background-color: var(--outline-bg); + border-color: var(--outline-border-color); + filter: grayscale(50%); + + &:hover { + color: var(--outline-fg); + background-color: var(--outline-bg); + border-color: var(--outline-border-color); + filter: grayscale(50%); + } + + &:active { + color: var(--outline-fg); + background-color: var(--outline-bg); + border-color: var(--outline-border-color); + filter: grayscale(50%); + } + + &:focus-visible { + color: var(--outline-fg); + background-color: var(--outline-bg); + border-color: var(--outline-border-color); + filter: grayscale(50%); + } +} + +@utility variant-subtle-disabled { + color: var(--subtle-fg); + background-color: var(--subtle-bg); + border-color: var(--subtle-border-color); + filter: grayscale(50%); + + &:hover { + color: var(--subtle-fg); + background-color: var(--subtle-bg); + border-color: var(--subtle-border-color); + filter: grayscale(50%); + } + + &:active { + color: var(--subtle-fg); + background-color: var(--subtle-bg); + border-color: var(--subtle-border-color); + filter: grayscale(50%); + } + + &:focus-visible { + color: var(--subtle-fg); + background-color: var(--subtle-bg); + border-color: var(--subtle-border-color); + filter: grayscale(50%); + } +} diff --git a/packages/ui/src/styles/utility/width.css b/packages/ui/src/styles/utility/width.css new file mode 100644 index 0000000..de8d87d --- /dev/null +++ b/packages/ui/src/styles/utility/width.css @@ -0,0 +1,36 @@ +@utility w-xs { + width: calc(var(--spacing) * 5); +} +@utility w-sm { + width: calc(var(--spacing) * 6); +} +@utility w-md { + width: calc(var(--spacing) * 8); +} +@utility w-lg { + width: calc(var(--spacing) * 9); +} +@utility w-xl { + width: calc(var(--spacing) * 11); +} +@utility w-2xl { + width: calc(var(--spacing) * 16); +} +@utility w-inline-xs { + width: var(--text-xs--line-height); +} +@utility w-inline-sm { + width: var(--text-sm--line-height); +} +@utility w-inline-md { + width: var(--text-base--line-height); +} +@utility w-inline-lg { + width: var(--text-lg--line-height); +} +@utility w-inline-xl { + width: var(--text-xl--line-height); +} +@utility w-inline-2xl { + width: var(--text-2xl--line-height); +} diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json new file mode 100644 index 0000000..1bca00d --- /dev/null +++ b/packages/ui/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "@tsconfig/vite-react/tsconfig.json", + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + "outDir": "./dist", + "rootDir": "./src", + "declaration": true, // 补充:生成类型声明文件,供其他子包引用 + "skipLibCheck": true, // 补充:跳过第三方库类型校验,避免冲突、提升速度 + "types": ["vite/client"] + }, + "include": ["src"], + "exclude": [ + "node_modules", + "dist", + "vite.config.ts", + "example/**/*", + "scripts/**/*", + ".storybook/**/*", + "stories/**/*" + ] +} diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts new file mode 100644 index 0000000..4a05454 --- /dev/null +++ b/packages/ui/vite.config.ts @@ -0,0 +1,78 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import dts from "vite-plugin-dts"; +import { resolve } from "node:path"; +import tailwindcss from "@tailwindcss/vite"; + +export default defineConfig(({ mode }) => { + const isProduction = mode === "production"; + + return { + // React 核心插件 + plugins: [ + tailwindcss(), + react(), + dts({ + include: ["src/**/*"], + exclude: ["src/**/*.test.ts", "src/**/*.stories.tsx"], + outDir: "./dist", + rollupTypes: true, // 合并类型声明文件 + }), + ], + + // 路径别名与后缀配置 + resolve: { + alias: { + "@": resolve(__dirname, "./src"), + }, + extensions: [".ts", ".tsx", ".js", ".jsx", ".json"], + }, + + // 纯 ES 模式打包配置(移除 UMD 相关) + build: { + lib: { + entry: resolve(__dirname, "./src/index.ts"), + formats: ["es"], // 仅保留 ES 模块格式 + fileName: () => "index.es.js", // 固定 ES 模式文件名 + }, + rollupOptions: { + // 排除 React 相关依赖(用户项目自行引入) + external: ["react", "react-dom"], + output: { + compact: isProduction, // 生产环境压缩代码格式 + globals: { + react: "React", + "react-dom": "ReactDOM", + }, + assetFileNames: (assetInfo) => { + if (assetInfo.name && assetInfo.name.endsWith(".css")) { + return "index.css"; + } + return assetInfo.name || "[name].[ext]"; + }, + }, + // 移除:rollupOptions 下无效的 exclude 配置 + // exclude: ["example/**/*", "scripts/**/*"], + }, + outDir: "./dist", + cssCodeSplit: false, + sourcemap: true, + minify: isProduction ? "esbuild" : false, + emptyOutDir: true, + }, + + // TS 兼容配置 + esbuild: { + ignoreAnnotations: true, + // 移除:esbuild 下无效的 exclude 配置 + // exclude: ["example/**/*", "scripts/**/*"], + }, + + // 新增:使用 Vite 官方支持的方式排除文件 + // 通过 optimizeDeps.exclude 排除依赖,通过 build.assetsInclude 反向控制, + // 同时结合 tsconfig.json 的 exclude 确保 TS 编译也排除目标文件 + optimizeDeps: { + exclude: ["example", "scripts"], + }, + }; +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..5ca1193 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3905 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + turbo: + specifier: ^2.8.0 + version: 2.8.3 + + apps/ui-site: + dependencies: + '@defgov/ui-headless': + specifier: workspace:* + version: link:../../packages/ui-headless + react: + specifier: ^19.2.0 + version: 19.2.4 + react-dom: + specifier: ^19.2.0 + version: 19.2.4(react@19.2.4) + devDependencies: + '@eslint/js': + specifier: ^9.39.1 + version: 9.39.3 + '@types/node': + specifier: ^24.10.1 + version: 24.10.13 + '@types/react': + specifier: ^19.2.7 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^5.1.1 + version: 5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + eslint: + specifier: ^9.39.1 + version: 9.39.3(jiti@2.6.1) + eslint-plugin-react-hooks: + specifier: ^7.0.1 + version: 7.0.1(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-react-refresh: + specifier: ^0.4.24 + version: 0.4.26(eslint@9.39.3(jiti@2.6.1)) + globals: + specifier: ^16.5.0 + version: 16.5.0 + typescript: + specifier: ~5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.48.0 + version: 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + + packages/headless-ui: + dependencies: + '@floating-ui/react-dom': + specifier: ^2.1.7 + version: 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': + specifier: ^0.2.10 + version: 0.2.10 + devDependencies: + '@tailwindcss/vite': + specifier: ^4.2.1 + version: 4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + '@tsconfig/vite-react': + specifier: ^7.0.2 + version: 7.0.2 + '@types/node': + specifier: ^25.3.3 + version: 25.3.3 + '@types/react': + specifier: ^19.2.10 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^5.1.4 + version: 5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + glob: + specifier: ^13.0.3 + version: 13.0.3 + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + tailwindcss: + specifier: ^4.2.1 + version: 4.2.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@25.3.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + + packages/ui: + dependencies: + '@floating-ui/react': + specifier: ^0.27.18 + version: 0.27.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tailwindcss/vite': + specifier: ^4.2.1 + version: 4.2.1(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 + tailwind-variants: + specifier: ^3.2.2 + version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) + tailwindcss: + specifier: ^4.2.1 + version: 4.2.1 + devDependencies: + '@tsconfig/vite-react': + specifier: ^7.0.2 + version: 7.0.2 + '@types/node': + specifier: ^25.1.0 + version: 25.2.0 + '@types/react': + specifier: ^19.2.10 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^5.1.2 + version: 5.1.4(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + autoprefixer: + specifier: ^10.4.24 + version: 10.4.24(postcss@8.5.6) + glob: + specifier: ^13.0.3 + version: 13.0.3 + prettier: + specifier: ^3.8.1 + version: 3.8.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.2.0)(typescript@5.9.3) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@25.2.0)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + + packages/ui-headless: + dependencies: + '@floating-ui/react': + specifier: ^0.27.18 + version: 0.27.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tailwindcss/vite': + specifier: ^4.2.1 + version: 4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 + tailwind-variants: + specifier: ^3.2.2 + version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) + tailwindcss: + specifier: ^4.2.1 + version: 4.2.1 + devDependencies: + '@tsconfig/vite-react': + specifier: ^7.0.2 + version: 7.0.2 + '@types/node': + specifier: ^25.1.0 + version: 25.3.3 + '@types/react': + specifier: ^19.2.10 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^5.1.2 + version: 5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + autoprefixer: + specifier: ^10.4.24 + version: 10.4.24(postcss@8.5.6) + glob: + specifier: ^13.0.3 + version: 13.0.3 + prettier: + specifier: ^3.8.1 + version: 3.8.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@25.3.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)) + + packages/ui-headless-style: + dependencies: + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 + tailwind-variants: + specifier: ^3.2.2 + version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) + + packages/ui-headless-tailwind-style: + dependencies: + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 + tailwind-variants: + specifier: ^3.2.2 + version: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) + tailwindcss: + specifier: '>=4.2.1 <5.0.0' + version: 4.2.1 + devDependencies: + '@types/node': + specifier: ^25.3.3 + version: 25.3.3 + glob: + specifier: ^13.0.3 + version: 13.0.3 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + +packages: + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.3': + resolution: {integrity: sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + + '@floating-ui/react-dom@2.1.7': + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.18': + resolution: {integrity: sha512-xJWJxvmy3a05j643gQt+pRbht5XnTlGpsEsAPnMi5F5YTOEEJymA90uZKBD8OvIv5XvZ1qi4GcccSlqT3Bq44Q==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@microsoft/api-extractor-model@7.33.1': + resolution: {integrity: sha512-KX0LI6xzI0gcBOXXmr5mnnbdhsK2W93pqvJo8OgJgWvRRh+wMEp0Ccj38h1XKeJ29E1tuAZKSUOfHUQ1WA8fZg==} + + '@microsoft/api-extractor@7.57.3': + resolution: {integrity: sha512-2+k2FNp+6zug/VmpK0wZFPQu7cKMihjHBP1iUuZs6Ep5P9uR1hD4dR5Ss7z/MiBkwVmKnUm6Pojhkz/c431SMw==} + hasBin: true + + '@microsoft/tsdoc-config@0.18.0': + resolution: {integrity: sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.20.1': + resolution: {integrity: sha512-QvxZyh+RsTJ77JpQkS9K9lJujh6lj5WyMxieT0bdACtwqxEkGB9zCuSMX5UlXRweaIgSpu1ztdHmhV07fKUpMg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.2.1': + resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.7.1': + resolution: {integrity: sha512-hLwDnp4yMcAd/gcUol8NPWNctpIXzVOgMyhZ8DagnEJls9TOZd0xF//5hS+YTiX7/+4rLfBra+NoB3rtFxjDdA==} + + '@rushstack/terminal@0.22.1': + resolution: {integrity: sha512-Mdtu0VN7v31O5Zcno8ZZH5kQHF13Ez7WN9Aio7nFJVcR36i4bkERionYrWgBDQJ0JdVPLKGecZER/xRU5IvGLw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.3.1': + resolution: {integrity: sha512-mid/JIZSJafwy3x9e4v0wVLuAqSSYYErEHV0HXPALYLSBN13YNkR5caOk0hf97lSRKrxhtvQjGaDKSEelR3sMg==} + + '@tailwindcss/node@4.2.1': + resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} + + '@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.1': + resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@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.1': + resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@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.1': + resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@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.1': + resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@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.1': + resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@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.1': + resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.1': + resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.2.1': + resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tsconfig/vite-react@7.0.2': + resolution: {integrity: sha512-lEj4y5SPRcH+bjw0tyuxrEnPqQUwfQzBKgd1YamD9xyet9zLwh2gwy5F8w/Nxg5DjdgYVjjKo5aLJUf0BTDz4w==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@24.10.13': + resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==} + + '@types/node@25.2.0': + resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==} + + '@types/node@25.3.3': + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@typescript-eslint/eslint-plugin@8.56.1': + resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.56.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.56.1': + resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.56.1': + resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.56.1': + resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.56.1': + resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.56.1': + resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.56.1': + resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.56.1': + resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.56.1': + resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.56.1': + resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@5.1.4': + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vue/compiler-core@3.5.28': + resolution: {integrity: sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==} + + '@vue/compiler-dom@3.5.28': + resolution: {integrity: sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.28': + resolution: {integrity: sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + autoprefixer@10.4.24: + resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001767: + resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + + electron-to-chromium@1.5.286: + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.26: + resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.3: + resolution: {integrity: sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@13.0.3: + resolution: {integrity: sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==} + engines: {node: 20 || >=22} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + engines: {node: '>= 12.0.0'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + minimatch@10.2.1: + resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} + engines: {node: 20 || >=22} + + minimatch@10.2.2: + resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.3: + resolution: {integrity: sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==} + + minimatch@9.0.6: + resolution: {integrity: sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sass@1.97.3: + resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + + tailwind-variants@3.2.2: + resolution: {integrity: sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwind-merge: '>=3.0.0' + tailwindcss: '*' + peerDependenciesMeta: + tailwind-merge: + optional: true + + tailwindcss@4.2.1: + resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + turbo-darwin-64@2.8.3: + resolution: {integrity: sha512-4kXRLfcygLOeNcP6JquqRLmGB/ATjjfehiojL2dJkL7GFm3SPSXbq7oNj8UbD8XriYQ5hPaSuz59iF1ijPHkTw==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.8.3: + resolution: {integrity: sha512-xF7uCeC0UY0Hrv/tqax0BMbFlVP1J/aRyeGQPZT4NjvIPj8gSPDgFhfkfz06DhUwDg5NgMo04uiSkAWE8WB/QQ==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@2.8.3: + resolution: {integrity: sha512-vxMDXwaOjweW/4etY7BxrXCSkvtwh0PbwVafyfT1Ww659SedUxd5rM3V2ZCmbwG8NiCfY7d6VtxyHx3Wh1GoZA==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.8.3: + resolution: {integrity: sha512-mQX7uYBZFkuPLLlKaNe9IjR1JIef4YvY8f21xFocvttXvdPebnq3PK1Zjzl9A1zun2BEuWNUwQIL8lgvN9Pm3Q==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.8.3: + resolution: {integrity: sha512-YLGEfppGxZj3VWcNOVa08h6ISsVKiG85aCAWosOKNUjb6yErWEuydv6/qImRJUI+tDLvDvW7BxopAkujRnWCrw==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.8.3: + resolution: {integrity: sha512-afTUGKBRmOJU1smQSBnFGcbq0iabAPwh1uXu2BVk7BREg30/1gMnJh9DFEQTah+UD3n3ru8V55J83RQNFfqoyw==} + cpu: [arm64] + os: [win32] + + turbo@2.8.3: + resolution: {integrity: sha512-8Osxz5Tu/Dw2kb31EAY+nhq/YZ3wzmQSmYa1nIArqxgCAldxv9TPlrAiaBUDVnKA4aiPn0OFBD1ACcpc5VFOAQ==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.56.1: + resolution: {integrity: sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.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 + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + +snapshots: + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.3(jiti@2.6.1))': + dependencies: + eslint: 9.39.3(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.3 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.14.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.3 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.3': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@floating-ui/core@1.7.4': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.5': + dependencies: + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.5 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@floating-ui/react@0.27.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.10 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + tabbable: 6.4.0 + + '@floating-ui/utils@0.2.10': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/cliui@9.0.0': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@microsoft/api-extractor-model@7.33.1(@types/node@25.2.0)': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.0 + '@rushstack/node-core-library': 5.20.1(@types/node@25.2.0) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor-model@7.33.1(@types/node@25.3.3)': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.0 + '@rushstack/node-core-library': 5.20.1(@types/node@25.3.3) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.57.3(@types/node@25.2.0)': + dependencies: + '@microsoft/api-extractor-model': 7.33.1(@types/node@25.2.0) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.0 + '@rushstack/node-core-library': 5.20.1(@types/node@25.2.0) + '@rushstack/rig-package': 0.7.1 + '@rushstack/terminal': 0.22.1(@types/node@25.2.0) + '@rushstack/ts-command-line': 5.3.1(@types/node@25.2.0) + diff: 8.0.3 + lodash: 4.17.23 + minimatch: 10.2.1 + resolve: 1.22.11 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.57.3(@types/node@25.3.3)': + dependencies: + '@microsoft/api-extractor-model': 7.33.1(@types/node@25.3.3) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.0 + '@rushstack/node-core-library': 5.20.1(@types/node@25.3.3) + '@rushstack/rig-package': 0.7.1 + '@rushstack/terminal': 0.22.1(@types/node@25.3.3) + '@rushstack/ts-command-line': 5.3.1(@types/node@25.3.3) + diff: 8.0.3 + lodash: 4.17.23 + minimatch: 10.2.1 + resolve: 1.22.11 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.18.0': + dependencies: + '@microsoft/tsdoc': 0.16.0 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.11 + + '@microsoft/tsdoc@0.16.0': {} + + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.3 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + + '@rolldown/pluginutils@1.0.0-rc.3': {} + + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.57.1 + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + + '@rushstack/node-core-library@5.20.1(@types/node@25.2.0)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.3 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.11 + semver: 7.5.4 + optionalDependencies: + '@types/node': 25.2.0 + + '@rushstack/node-core-library@5.20.1(@types/node@25.3.3)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.3 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.11 + semver: 7.5.4 + optionalDependencies: + '@types/node': 25.3.3 + + '@rushstack/problem-matcher@0.2.1(@types/node@25.2.0)': + optionalDependencies: + '@types/node': 25.2.0 + + '@rushstack/problem-matcher@0.2.1(@types/node@25.3.3)': + optionalDependencies: + '@types/node': 25.3.3 + + '@rushstack/rig-package@0.7.1': + dependencies: + resolve: 1.22.11 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.22.1(@types/node@25.2.0)': + dependencies: + '@rushstack/node-core-library': 5.20.1(@types/node@25.2.0) + '@rushstack/problem-matcher': 0.2.1(@types/node@25.2.0) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 25.2.0 + + '@rushstack/terminal@0.22.1(@types/node@25.3.3)': + dependencies: + '@rushstack/node-core-library': 5.20.1(@types/node@25.3.3) + '@rushstack/problem-matcher': 0.2.1(@types/node@25.3.3) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 25.3.3 + + '@rushstack/ts-command-line@5.3.1(@types/node@25.2.0)': + dependencies: + '@rushstack/terminal': 0.22.1(@types/node@25.2.0) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@rushstack/ts-command-line@5.3.1(@types/node@25.3.3)': + dependencies: + '@rushstack/terminal': 0.22.1(@types/node@25.3.3) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@tailwindcss/node@4.2.1': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.19.0 + jiti: 2.6.1 + lightningcss: 1.31.1 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.1 + + '@tailwindcss/oxide-android-arm64@4.2.1': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.1': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.1': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.1': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.1': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + optional: true + + '@tailwindcss/oxide@4.2.1': + optionalDependencies: + '@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/vite@4.2.1(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))': + dependencies: + '@tailwindcss/node': 4.2.1 + '@tailwindcss/oxide': 4.2.1 + tailwindcss: 4.2.1 + vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + + '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))': + dependencies: + '@tailwindcss/node': 4.2.1 + '@tailwindcss/oxide': 4.2.1 + tailwindcss: 4.2.1 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tsconfig/vite-react@7.0.2': {} + + '@types/argparse@1.0.38': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@24.10.13': + dependencies: + undici-types: 7.16.0 + + '@types/node@25.2.0': + dependencies: + undici-types: 7.16.0 + + '@types/node@25.3.3': + dependencies: + undici-types: 7.18.2 + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.1 + eslint: 9.39.3(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.56.1 + debug: 4.4.3 + eslint: 9.39.3(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.56.1': + dependencies: + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 + + '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.3(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.56.1': {} + + '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 + debug: 4.4.3 + minimatch: 10.2.2 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + eslint: 9.39.3(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.56.1': + dependencies: + '@typescript-eslint/types': 8.56.1 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + transitivePeerDependencies: + - supports-color + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.28': + dependencies: + '@babel/parser': 7.29.0 + '@vue/shared': 3.5.28 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.28': + dependencies: + '@vue/compiler-core': 3.5.28 + '@vue/shared': 3.5.28 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.28 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.28 + alien-signals: 0.4.14 + minimatch: 9.0.6 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + + '@vue/shared@3.5.28': {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv@6.14.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + alien-signals@0.4.14: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + autoprefixer@10.4.24(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001767 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + balanced-match@1.0.2: {} + + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + + baseline-browser-mapping@2.9.19: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001767 + electron-to-chromium: 1.5.286 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001767: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + optional: true + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.4: {} + + convert-source-map@2.0.0: {} + + create-require@1.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + de-indent@1.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + detect-libc@2.1.2: {} + + diff@4.0.4: {} + + diff@8.0.3: {} + + electron-to-chromium@1.5.286: {} + + enhanced-resolve@5.19.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@7.0.1: {} + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@7.0.1(eslint@9.39.3(jiti@2.6.1)): + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 + eslint: 9.39.3(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.3.6 + zod-validation-error: 4.0.2(zod@4.3.6) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.4.26(eslint@9.39.3(jiti@2.6.1)): + dependencies: + eslint: 9.39.3(jiti@2.6.1) + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@9.39.3(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.3 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.3 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + exsolve@1.0.8: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + fraction.js@5.3.4: {} + + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@13.0.3: + dependencies: + minimatch: 10.2.2 + minipass: 7.1.2 + path-scurry: 2.0.1 + + globals@14.0.0: {} + + globals@16.5.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + immutable@5.1.4: + optional: true + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + isexe@2.0.0: {} + + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + jiti@2.6.1: {} + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kolorist@1.8.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.31.1: + optional: true + + lightningcss-darwin-arm64@1.31.1: + optional: true + + lightningcss-darwin-x64@1.31.1: + optional: true + + lightningcss-freebsd-x64@1.31.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.31.1: + optional: true + + lightningcss-linux-arm64-gnu@1.31.1: + optional: true + + lightningcss-linux-arm64-musl@1.31.1: + optional: true + + lightningcss-linux-x64-gnu@1.31.1: + optional: true + + lightningcss-linux-x64-musl@1.31.1: + optional: true + + lightningcss-win32-arm64-msvc@1.31.1: + optional: true + + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.23: {} + + lru-cache@11.2.6: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + minimatch@10.2.1: + dependencies: + brace-expansion: 5.0.2 + + minimatch@10.2.2: + dependencies: + brace-expansion: 5.0.2 + + minimatch@3.1.3: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.6: + dependencies: + brace-expansion: 5.0.2 + + minipass@7.1.2: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + node-addon-api@7.1.1: + optional: true + + node-releases@2.0.27: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.2 + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.8.1: {} + + punycode@2.3.1: {} + + quansync@0.2.11: {} + + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react-refresh@0.18.0: {} + + react@19.2.4: {} + + readdirp@4.1.2: + optional: true + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + + sass@1.97.3: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + optional: true + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.4: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + string-argv@0.3.2: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tabbable@6.4.0: {} + + tailwind-merge@3.5.0: {} + + tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1): + dependencies: + tailwindcss: 4.2.1 + optionalDependencies: + tailwind-merge: 3.5.0 + + tailwindcss@4.2.1: {} + + tapable@2.3.0: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-node@10.9.2(@types/node@25.2.0)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 25.2.0 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@25.3.3)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 25.3.3 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + turbo-darwin-64@2.8.3: + optional: true + + turbo-darwin-arm64@2.8.3: + optional: true + + turbo-linux-64@2.8.3: + optional: true + + turbo-linux-arm64@2.8.3: + optional: true + + turbo-windows-64@2.8.3: + optional: true + + turbo-windows-arm64@2.8.3: + optional: true + + turbo@2.8.3: + optionalDependencies: + turbo-darwin-64: 2.8.3 + turbo-darwin-arm64: 2.8.3 + turbo-linux-64: 2.8.3 + turbo-linux-arm64: 2.8.3 + turbo-windows-64: 2.8.3 + turbo-windows-arm64: 2.8.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.3(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.8.2: {} + + typescript@5.9.3: {} + + ufo@1.6.3: {} + + undici-types@7.16.0: {} + + undici-types@7.18.2: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + v8-compile-cache-lib@3.0.1: {} + + vite-plugin-dts@4.5.4(@types/node@25.2.0)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)): + dependencies: + '@microsoft/api-extractor': 7.57.3(@types/node@25.2.0) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + '@volar/typescript': 2.4.28 + '@vue/language-core': 2.2.0(typescript@5.9.3) + compare-versions: 6.1.1 + debug: 4.4.3 + kolorist: 1.8.0 + local-pkg: 1.1.2 + magic-string: 0.30.21 + typescript: 5.9.3 + optionalDependencies: + vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-dts@4.5.4(@types/node@25.3.3)(rollup@4.57.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3)): + dependencies: + '@microsoft/api-extractor': 7.57.3(@types/node@25.3.3) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + '@volar/typescript': 2.4.28 + '@vue/language-core': 2.2.0(typescript@5.9.3) + compare-versions: 6.1.1 + debug: 4.4.3 + kolorist: 1.8.0 + local-pkg: 1.1.2 + magic-string: 0.30.21 + typescript: 5.9.3 + optionalDependencies: + vite: 7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.13 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + sass: 1.97.3 + + vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.2.0 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + sass: 1.97.3 + + vite@7.3.1(@types/node@25.3.3)(jiti@2.6.1)(lightningcss@1.31.1)(sass@1.97.3): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.3 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + sass: 1.97.3 + + vscode-uri@3.1.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.3.6): + dependencies: + zod: 4.3.6 + + zod@4.3.6: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..3ff5faa --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - "apps/*" + - "packages/*" diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..f6f4952 --- /dev/null +++ b/turbo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://turborepo.dev/schema.json", + "ui": "tui", + "tasks": { + "build": { + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "outputs": [".next/**", "!.next/cache/**"] + }, + "dev": { + "cache": false, + "persistent": true + } + } +}