diff --git a/apps/ui-site/package.json b/apps/ui-site/package.json index 26806c8..87fe009 100644 --- a/apps/ui-site/package.json +++ b/apps/ui-site/package.json @@ -40,7 +40,7 @@ "vite-plugin-dts": "^4.5.4" }, "dependencies": { - "@defgov/ui-web": "workspace:*", + "@defgov/ui-web-tw": "workspace:*", "react": "^19.2.5", "react-dom": "^19.2.5" } diff --git a/apps/ui-site/src/App.tsx b/apps/ui-site/src/App.tsx index 1e21c79..0ce0eac 100644 --- a/apps/ui-site/src/App.tsx +++ b/apps/ui-site/src/App.tsx @@ -1,4 +1,4 @@ -import { clsm } from "@defgov/ui-web"; +import { clsm } from "@defgov/ui-web-tw"; import { ButtonGallery } from "./gallery/ButtonGallery"; import { cn } from "tailwind-variants"; diff --git a/apps/ui-site/src/gallery/ButtonGallery.tsx b/apps/ui-site/src/gallery/ButtonGallery.tsx index d47117f..c71d01e 100644 --- a/apps/ui-site/src/gallery/ButtonGallery.tsx +++ b/apps/ui-site/src/gallery/ButtonGallery.tsx @@ -1,4 +1,4 @@ -import { Button, DownloadSvg } from "@defgov/ui-web"; +import { Button, DownloadSvg } from "@defgov/ui-web-tw"; import { InnerWrapper } from "../common/InnerWrapper"; import { OuterWrapper } from "../common/OuterWrapper"; diff --git a/apps/vite-project/.gitignore b/apps/vite-project/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/apps/vite-project/.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/vite-project/README.md b/apps/vite-project/README.md new file mode 100644 index 0000000..7dbf7eb --- /dev/null +++ b/apps/vite-project/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 [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## 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/vite-project/eslint.config.js b/apps/vite-project/eslint.config.js new file mode 100644 index 0000000..ef614d2 --- /dev/null +++ b/apps/vite-project/eslint.config.js @@ -0,0 +1,22 @@ +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: { + globals: globals.browser, + }, + }, +]) diff --git a/apps/vite-project/index.html b/apps/vite-project/index.html new file mode 100644 index 0000000..1a2df5a --- /dev/null +++ b/apps/vite-project/index.html @@ -0,0 +1,13 @@ + + + + + + + vite-project + + +
+ + + diff --git a/apps/vite-project/package.json b/apps/vite-project/package.json new file mode 100644 index 0000000..d525600 --- /dev/null +++ b/apps/vite-project/package.json @@ -0,0 +1,30 @@ +{ + "name": "vite-project", + "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.5", + "react-dom": "^19.2.5" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.5.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.2", + "vite": "^8.0.10" + } +} diff --git a/apps/vite-project/public/favicon.svg b/apps/vite-project/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/apps/vite-project/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/vite-project/public/icons.svg b/apps/vite-project/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/apps/vite-project/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/vite-project/src/App.css b/apps/vite-project/src/App.css new file mode 100644 index 0000000..f90339d --- /dev/null +++ b/apps/vite-project/src/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/apps/vite-project/src/App.tsx b/apps/vite-project/src/App.tsx new file mode 100644 index 0000000..a66b5ef --- /dev/null +++ b/apps/vite-project/src/App.tsx @@ -0,0 +1,122 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from './assets/vite.svg' +import heroImg from './assets/hero.png' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
+
+ + React logo + Vite logo +
+
+

Get started

+

+ Edit src/App.tsx and save to test HMR +

+
+ +
+ +
+ +
+
+ +

Documentation

+

Your questions, answered

+ +
+
+ +

Connect with us

+

Join the Vite community

+ +
+
+ +
+
+ + ) +} + +export default App diff --git a/apps/vite-project/src/assets/hero.png b/apps/vite-project/src/assets/hero.png new file mode 100644 index 0000000..02251f4 Binary files /dev/null and b/apps/vite-project/src/assets/hero.png differ diff --git a/apps/vite-project/src/assets/react.svg b/apps/vite-project/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/apps/vite-project/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/vite-project/src/assets/vite.svg b/apps/vite-project/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/apps/vite-project/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/apps/vite-project/src/index.css b/apps/vite-project/src/index.css new file mode 100644 index 0000000..5fb3313 --- /dev/null +++ b/apps/vite-project/src/index.css @@ -0,0 +1,111 @@ +:root { + --text: #6b6375; + --text-h: #08060d; + --bg: #fff; + --border: #e5e4e7; + --code-bg: #f4f3ec; + --accent: #aa3bff; + --accent-bg: rgba(170, 59, 255, 0.1); + --accent-border: rgba(170, 59, 255, 0.5); + --social-bg: rgba(244, 243, 236, 0.5); + --shadow: + rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; + + --sans: system-ui, 'Segoe UI', Roboto, sans-serif; + --heading: system-ui, 'Segoe UI', Roboto, sans-serif; + --mono: ui-monospace, Consolas, monospace; + + font: 18px/145% var(--sans); + letter-spacing: 0.18px; + color-scheme: light dark; + color: var(--text); + background: var(--bg); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + @media (max-width: 1024px) { + font-size: 16px; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --text: #9ca3af; + --text-h: #f3f4f6; + --bg: #16171d; + --border: #2e303a; + --code-bg: #1f2028; + --accent: #c084fc; + --accent-bg: rgba(192, 132, 252, 0.15); + --accent-border: rgba(192, 132, 252, 0.5); + --social-bg: rgba(47, 48, 58, 0.5); + --shadow: + rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; + } + + #social .button-icon { + filter: invert(1) brightness(2); + } +} + +#root { + width: 1126px; + max-width: 100%; + margin: 0 auto; + text-align: center; + border-inline: 1px solid var(--border); + min-height: 100svh; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +body { + margin: 0; +} + +h1, +h2 { + font-family: var(--heading); + font-weight: 500; + color: var(--text-h); +} + +h1 { + font-size: 56px; + letter-spacing: -1.68px; + margin: 32px 0; + @media (max-width: 1024px) { + font-size: 36px; + margin: 20px 0; + } +} +h2 { + font-size: 24px; + line-height: 118%; + letter-spacing: -0.24px; + margin: 0 0 8px; + @media (max-width: 1024px) { + font-size: 20px; + } +} +p { + margin: 0; +} + +code, +.counter { + font-family: var(--mono); + display: inline-flex; + border-radius: 4px; + color: var(--text-h); +} + +code { + font-size: 15px; + line-height: 135%; + padding: 4px 8px; + background: var(--code-bg); +} diff --git a/apps/vite-project/src/main.tsx b/apps/vite-project/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/apps/vite-project/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/apps/vite-project/tsconfig.app.json b/apps/vite-project/tsconfig.app.json new file mode 100644 index 0000000..7f42e5f --- /dev/null +++ b/apps/vite-project/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/apps/vite-project/tsconfig.json b/apps/vite-project/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/apps/vite-project/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/apps/vite-project/tsconfig.node.json b/apps/vite-project/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/apps/vite-project/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "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 */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/apps/vite-project/vite.config.ts b/apps/vite-project/vite.config.ts new file mode 100644 index 0000000..174c135 --- /dev/null +++ b/apps/vite-project/vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + + build: { + rolldownOptions: { }, + }, +}); diff --git a/packages/css/package.json b/packages/css/package.json new file mode 100644 index 0000000..30134c3 --- /dev/null +++ b/packages/css/package.json @@ -0,0 +1,42 @@ +{ + "name": "@defgov/css", + "version": "0.0.0", + "private": true, + "type": "module", + "sideEffects": [ + "*.css" + ], + "module": "./dist/index.es.js", + "main": "./dist/index.cjs.js", + "types": "./dist/index.d.ts", + "style": "./dist/index.css", + "exports": { + ".": { + "import": "./dist/index.es.js", + "require": "./dist/index.cjs.js", + "types": "./dist/index.d.ts" + }, + "./index.css": "./dist/index.css" + }, + "files": [ + "dist" + ], + "scripts": { + "gen-index": "ts-node scripts/gen-index.ts", + "gen-dts": "tsc -p tsconfig.build.json", + "dev": "pnpm gen-index && vite build --watch", + "build": "pnpm gen-index && vite build && pnpm gen-dts" + }, + "devDependencies": { + "@types/node": "^25.6.0", + "@vitejs/plugin-react": "^6.0.1", + "glob": "^13.0.6", + "ts-node": "^10.9.2", + "typescript": "^6.0.3", + "vite": "^8.0.10" + }, + "peerDependencies": { + "react": "^19", + "react-dom": "^19" + } +} diff --git a/packages/css/scripts/gen-index.ts b/packages/css/scripts/gen-index.ts new file mode 100644 index 0000000..e03849c --- /dev/null +++ b/packages/css/scripts/gen-index.ts @@ -0,0 +1,147 @@ +import fs from "fs"; +import path from "path"; +import { globSync } from "glob"; + +interface Config { + outputDir: string; + outputFilenameWithExt: string; + scanDirs: string[]; + importPrefix: string; + predefineStatements: string[]; + includeExtensions: string[]; + excludeDirs: string[]; + excludeFileExtensions: string[]; + excludePatterns: RegExp[]; +} + +const cssConfig: Config = { + outputDir: "src", + outputFilenameWithExt: "index.css", + scanDirs: ["src"], + importPrefix: "@import", + predefineStatements: [], + includeExtensions: [".css"], + excludeDirs: ["__tests__", "tests", "story", "stories", "types"], + excludeFileExtensions: [], + excludePatterns: [/^index\.(css)$/, /\.(test|spec)\./, /\.(story|stories)\./], +}; + +const tsConfig: Config = { + outputDir: "src", + outputFilenameWithExt: "index.ts", + scanDirs: ["src"], + importPrefix: "export * from", + predefineStatements: ["import './index.css'"], + includeExtensions: [".ts", "tsx", "js", "jsx"], + excludeDirs: ["__tests__", "tests", "story", "stories", "types"], + excludeFileExtensions: [".d.ts"], + excludePatterns: [ + /^index\.(ts|tsx|js|jsx)$/, + /\.(test|spec)\./, + /\.(story|stories)\./, + ], +}; + +const normalizePath = (p: string) => p.replace(/\\/g, "/"); + +const isExcludeDir = (filePath: string, excludeDirs: string[]) => { + const normalized = normalizePath(filePath); + return excludeDirs.some((dir) => normalized.includes(`/${dir}/`)); +}; + +const isExcludeFileExtensions = ( + filePath: string, + excludeFileExtensions: string[], +) => excludeFileExtensions.some((ext) => filePath.endsWith(ext)); + +const isExcludePattern = (fileName: string, excludePatterns: RegExp[]) => + excludePatterns.some((pattern) => pattern.test(fileName)); + +// ---------------------------------------- +function isValidFile(filePath: string, config: Config): boolean { + const fileName = filePath.split(/[\\/]/).pop()!; + + if (isExcludeDir(filePath, config.excludeDirs)) return false; + if (isExcludeFileExtensions(filePath, config.excludeFileExtensions)) + return false; + if (isExcludePattern(fileName, config.excludePatterns)) return false; + + const ext = path.extname(filePath); + return config.includeExtensions.includes(ext); +} +// ----------------------------------------- +function generateIndexFile(config: Config) { + const currentPath = process.cwd(); + const outputPath = path.resolve(currentPath, config.outputDir); + let exportStatements: string[] = []; + + // ------ scanDirs forEach start ------------------------ + config.scanDirs.forEach((dir) => { + const scanPattern = path.resolve(currentPath, dir, "**", "*.*"); + + const allFilePath = globSync(scanPattern, { + absolute: true, + windowsPathsNoEscape: true, + dot: false, + follow: true, + }); + + const validFiles = allFilePath.filter((filePath) => { + return isValidFile(filePath, config); + }); + + if (validFiles.length === 0) { + console.log( + `⚠️ 未找到符合条件的文件,跳过生成 ${config.outputFilenameWithExt}`, + ); + return; + } + + validFiles.sort(); + + validFiles.forEach((file) => { + const relativePath = path.relative(outputPath, file); + const importPath = `./${relativePath.replace(/\\/g, "/")}`; + exportStatements.push(`${config.importPrefix} '${importPath}';`); + }); + }); + + // --------- scanDirs forEach end ---------------- + + const indexFileContent = ` +${config.predefineStatements.join("\n")} +${exportStatements.join("\n")} +`.trim(); + + const indexFilePath = path.resolve( + currentPath, + config.outputDir, + config.outputFilenameWithExt, + ); + + // ✅ 内容比对,避免重复写入 + if (fs.existsSync(indexFilePath)) { + const old = fs.readFileSync(indexFilePath, "utf8"); + if (old === indexFileContent) { + console.log( + `✅ ${config.outputFilenameWithExt} 内容无变化,无需重新生成`, + ); + return; + } + } + + fs.writeFileSync(indexFilePath, indexFileContent, "utf8"); + console.log(`✅ 成功生成 ${config.outputFilenameWithExt}: ${indexFilePath}`); +} + +// -------------------------------------------------- + +try { + console.log(`🚀 [gen-index] 开始扫描`); + generateIndexFile(cssConfig); + generateIndexFile(tsConfig); +} catch (err) { + const msg = err instanceof Error ? err.message : String(err); + console.error(`❌ [gen-index] 执行失败: ${msg}`); + process.exit(1); +} diff --git a/packages/css/base/root.css b/packages/css/src/base/root.css similarity index 98% rename from packages/css/base/root.css rename to packages/css/src/base/root.css index 46b596e..36feec1 100644 --- a/packages/css/base/root.css +++ b/packages/css/src/base/root.css @@ -365,6 +365,7 @@ --radius-md: 0.375rem; --radius-lg: 0.5rem; --radius-xl: 0.75rem; + --radius-2xl: 1rem; --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", @@ -379,16 +380,22 @@ --margin-md: calc(var(--spacing) * 2); --margin-lg: calc(var(--spacing) * 2); --margin-xl: calc(var(--spacing) * 2); + --margin-2xl: calc(var(--spacing) * 2); --padding-long-xs: calc(var(--spacing) * 3); --padding-long-sm: calc(var(--spacing) * 4); --padding-long-md: calc(var(--spacing) * 5); --padding-long-lg: calc(var(--spacing) * 8); --padding-long-xl: calc(var(--spacing) * 2); + --padding-long-2xl: calc(var(--spacing) * 2); --padding-xs: calc(var(--spacing) * 2); --padding-sm: calc(var(--spacing) * 4); --padding-md: calc(var(--spacing) * 2); --padding-lg: calc(var(--spacing) * 2); --padding-xl: calc(var(--spacing) * 2); + --padding-2xl: calc(var(--spacing) * 2); + + --drop-shadow: drop-shadow(0 0 4px rgba(0, 0, 0, 0.12)) + drop-shadow(0 8px 16px rgba(0, 0, 0, 0.14)); } diff --git a/packages/css/src/index.css b/packages/css/src/index.css new file mode 100644 index 0000000..b3733dd --- /dev/null +++ b/packages/css/src/index.css @@ -0,0 +1,37 @@ +@import './base/root.css'; +@import './utility/size-insensitive/align-content.css'; +@import './utility/size-insensitive/align-items.css'; +@import './utility/size-insensitive/align-self.css'; +@import './utility/size-insensitive/animation.css'; +@import './utility/size-insensitive/box-decoration.css'; +@import './utility/size-insensitive/box-inside.css'; +@import './utility/size-insensitive/box-sizing.css'; +@import './utility/size-insensitive/brand.css'; +@import './utility/size-insensitive/break-after.css'; +@import './utility/size-insensitive/break-before.css'; +@import './utility/size-insensitive/cursor.css'; +@import './utility/size-insensitive/display.css'; +@import './utility/size-insensitive/drop-shadow.css'; +@import './utility/size-insensitive/flex-direction.css'; +@import './utility/size-insensitive/flex-wrap.css'; +@import './utility/size-insensitive/font-family.css'; +@import './utility/size-insensitive/justify-content.css'; +@import './utility/size-insensitive/justify-items.css'; +@import './utility/size-insensitive/justify-self.css'; +@import './utility/size-insensitive/overflow.css'; +@import './utility/size-insensitive/overscroll-behavior.css'; +@import './utility/size-insensitive/position.css'; +@import './utility/size-insensitive/screen-reader.css'; +@import './utility/size-insensitive/theme.css'; +@import './utility/size-insensitive/user-select.css'; +@import './utility/size-insensitive/z-index.css'; +@import './utility/size-sensitive/border-radius.css'; +@import './utility/size-sensitive/font-size.css'; +@import './utility/size-sensitive/font-weight.css'; +@import './utility/size-sensitive/gap.css'; +@import './utility/size-sensitive/height.css'; +@import './utility/size-sensitive/margin-block.css'; +@import './utility/size-sensitive/margin-inline.css'; +@import './utility/size-sensitive/padding-long.css'; +@import './utility/size-sensitive/padding-short.css'; +@import './utility/size-sensitive/width.css'; \ No newline at end of file diff --git a/packages/css/src/index.ts b/packages/css/src/index.ts new file mode 100644 index 0000000..1bdf840 --- /dev/null +++ b/packages/css/src/index.ts @@ -0,0 +1,4 @@ +import './index.css' +export * from './utils/cpm.ts'; +export * from './utils/cvr.ts'; +export * from './utils/prefix-list.ts'; \ No newline at end of file diff --git a/packages/css/src/types/env.d.ts b/packages/css/src/types/env.d.ts new file mode 100644 index 0000000..31058d4 --- /dev/null +++ b/packages/css/src/types/env.d.ts @@ -0,0 +1,4 @@ +declare module "*.css" { + const content: string; + export default content; +} diff --git a/packages/css/utility/align-content.css b/packages/css/src/utility/size-insensitive/align-content.css similarity index 100% rename from packages/css/utility/align-content.css rename to packages/css/src/utility/size-insensitive/align-content.css diff --git a/packages/css/utility/align-items.css b/packages/css/src/utility/size-insensitive/align-items.css similarity index 100% rename from packages/css/utility/align-items.css rename to packages/css/src/utility/size-insensitive/align-items.css diff --git a/packages/css/utility/align-self.css b/packages/css/src/utility/size-insensitive/align-self.css similarity index 100% rename from packages/css/utility/align-self.css rename to packages/css/src/utility/size-insensitive/align-self.css diff --git a/packages/css/utility/animate.css b/packages/css/src/utility/size-insensitive/animation.css similarity index 100% rename from packages/css/utility/animate.css rename to packages/css/src/utility/size-insensitive/animation.css diff --git a/packages/css/utility/box-decoration.css b/packages/css/src/utility/size-insensitive/box-decoration.css similarity index 100% rename from packages/css/utility/box-decoration.css rename to packages/css/src/utility/size-insensitive/box-decoration.css diff --git a/packages/css/utility/box-inside.css b/packages/css/src/utility/size-insensitive/box-inside.css similarity index 100% rename from packages/css/utility/box-inside.css rename to packages/css/src/utility/size-insensitive/box-inside.css diff --git a/packages/css/utility/box-sizing.css b/packages/css/src/utility/size-insensitive/box-sizing.css similarity index 100% rename from packages/css/utility/box-sizing.css rename to packages/css/src/utility/size-insensitive/box-sizing.css diff --git a/packages/css/utility/brand.css b/packages/css/src/utility/size-insensitive/brand.css similarity index 100% rename from packages/css/utility/brand.css rename to packages/css/src/utility/size-insensitive/brand.css diff --git a/packages/css/utility/break-after.css b/packages/css/src/utility/size-insensitive/break-after.css similarity index 100% rename from packages/css/utility/break-after.css rename to packages/css/src/utility/size-insensitive/break-after.css diff --git a/packages/css/utility/break-before.css b/packages/css/src/utility/size-insensitive/break-before.css similarity index 100% rename from packages/css/utility/break-before.css rename to packages/css/src/utility/size-insensitive/break-before.css diff --git a/packages/css/utility/cursor.css b/packages/css/src/utility/size-insensitive/cursor.css similarity index 100% rename from packages/css/utility/cursor.css rename to packages/css/src/utility/size-insensitive/cursor.css diff --git a/packages/css/utility/display.css b/packages/css/src/utility/size-insensitive/display.css similarity index 100% rename from packages/css/utility/display.css rename to packages/css/src/utility/size-insensitive/display.css diff --git a/packages/css/src/utility/size-insensitive/drop-shadow.css b/packages/css/src/utility/size-insensitive/drop-shadow.css new file mode 100644 index 0000000..d100e0f --- /dev/null +++ b/packages/css/src/utility/size-insensitive/drop-shadow.css @@ -0,0 +1,5 @@ +@layer utility { + .drop-shadow { + filter: var(--drop-shadow); + } +} diff --git a/packages/css/utility/flex-direction.css b/packages/css/src/utility/size-insensitive/flex-direction.css similarity index 100% rename from packages/css/utility/flex-direction.css rename to packages/css/src/utility/size-insensitive/flex-direction.css diff --git a/packages/css/utility/flex-wrap.css b/packages/css/src/utility/size-insensitive/flex-wrap.css similarity index 100% rename from packages/css/utility/flex-wrap.css rename to packages/css/src/utility/size-insensitive/flex-wrap.css diff --git a/packages/css/utility/font-family.css b/packages/css/src/utility/size-insensitive/font-family.css similarity index 100% rename from packages/css/utility/font-family.css rename to packages/css/src/utility/size-insensitive/font-family.css diff --git a/packages/css/utility/justify-content.css b/packages/css/src/utility/size-insensitive/justify-content.css similarity index 100% rename from packages/css/utility/justify-content.css rename to packages/css/src/utility/size-insensitive/justify-content.css diff --git a/packages/css/utility/justify-items.css b/packages/css/src/utility/size-insensitive/justify-items.css similarity index 100% rename from packages/css/utility/justify-items.css rename to packages/css/src/utility/size-insensitive/justify-items.css diff --git a/packages/css/utility/justify-self.css b/packages/css/src/utility/size-insensitive/justify-self.css similarity index 100% rename from packages/css/utility/justify-self.css rename to packages/css/src/utility/size-insensitive/justify-self.css diff --git a/packages/css/utility/overflow.css b/packages/css/src/utility/size-insensitive/overflow.css similarity index 100% rename from packages/css/utility/overflow.css rename to packages/css/src/utility/size-insensitive/overflow.css diff --git a/packages/css/utility/overscroll-behavior.css b/packages/css/src/utility/size-insensitive/overscroll-behavior.css similarity index 100% rename from packages/css/utility/overscroll-behavior.css rename to packages/css/src/utility/size-insensitive/overscroll-behavior.css diff --git a/packages/css/utility/position.css b/packages/css/src/utility/size-insensitive/position.css similarity index 100% rename from packages/css/utility/position.css rename to packages/css/src/utility/size-insensitive/position.css diff --git a/packages/css/utility/screen-reader.css b/packages/css/src/utility/size-insensitive/screen-reader.css similarity index 100% rename from packages/css/utility/screen-reader.css rename to packages/css/src/utility/size-insensitive/screen-reader.css diff --git a/packages/css/utility/theme.css b/packages/css/src/utility/size-insensitive/theme.css similarity index 100% rename from packages/css/utility/theme.css rename to packages/css/src/utility/size-insensitive/theme.css diff --git a/packages/css/src/utility/size-insensitive/user-select.css b/packages/css/src/utility/size-insensitive/user-select.css new file mode 100644 index 0000000..a2deadf --- /dev/null +++ b/packages/css/src/utility/size-insensitive/user-select.css @@ -0,0 +1,14 @@ +@layer utility { + .select-none { + user-select: none; + } + .select-text { + user-select: text; + } + .select-all { + user-select: all; + } + .select-auto { + user-select: auto; + } +} diff --git a/packages/css/utility/z-index.css b/packages/css/src/utility/size-insensitive/z-index.css similarity index 100% rename from packages/css/utility/z-index.css rename to packages/css/src/utility/size-insensitive/z-index.css diff --git a/packages/css/utility/border-radius.css b/packages/css/src/utility/size-sensitive/border-radius.css similarity index 87% rename from packages/css/utility/border-radius.css rename to packages/css/src/utility/size-sensitive/border-radius.css index 51ff578..47a04ce 100644 --- a/packages/css/utility/border-radius.css +++ b/packages/css/src/utility/size-sensitive/border-radius.css @@ -20,4 +20,7 @@ .rounded-xl { border-radius: var(--radius-xl); } + .rounded-2xl { + border-radius: var(--radius-2xl); + } } diff --git a/packages/css/utility/font-size.css b/packages/css/src/utility/size-sensitive/font-size.css similarity index 100% rename from packages/css/utility/font-size.css rename to packages/css/src/utility/size-sensitive/font-size.css diff --git a/packages/css/utility/font-weight.css b/packages/css/src/utility/size-sensitive/font-weight.css similarity index 100% rename from packages/css/utility/font-weight.css rename to packages/css/src/utility/size-sensitive/font-weight.css diff --git a/packages/css/utility/gap.css b/packages/css/src/utility/size-sensitive/gap.css similarity index 85% rename from packages/css/utility/gap.css rename to packages/css/src/utility/size-sensitive/gap.css index 9af7a48..618b984 100644 --- a/packages/css/utility/gap.css +++ b/packages/css/src/utility/size-sensitive/gap.css @@ -17,4 +17,7 @@ .gap-xl { gap: calc(var(--spacing) * 2.5); } + .gap-2xl { + gap: calc(var(--spacing) * 2.5); + } } diff --git a/packages/css/utility/height.css b/packages/css/src/utility/size-sensitive/height.css similarity index 96% rename from packages/css/utility/height.css rename to packages/css/src/utility/size-sensitive/height.css index 52c87ba..406a828 100644 --- a/packages/css/utility/height.css +++ b/packages/css/src/utility/size-sensitive/height.css @@ -16,7 +16,7 @@ height: var(--height-item-lg); } .h-item-xl { - /* 64px navigation bar */ + /* 56px section-header bar */ height: var(--height-item-xl); } .h-item-2xl { diff --git a/packages/css/utility/margin-block.css b/packages/css/src/utility/size-sensitive/margin-block.css similarity index 85% rename from packages/css/utility/margin-block.css rename to packages/css/src/utility/size-sensitive/margin-block.css index 865122e..1221094 100644 --- a/packages/css/utility/margin-block.css +++ b/packages/css/src/utility/size-sensitive/margin-block.css @@ -17,6 +17,9 @@ .my-e-xl { margin-block-end: var(--margin-xl); } + .my-e-2xl { + margin-block-end: var(--margin-2xl); + } /* ------------------ */ .my-s-none { margin-block-start: 0; @@ -36,6 +39,9 @@ .my-s-xl { margin-block-start: var(--margin-xl); } + .my-s-2xl { + margin-block-start: var(--margin-2xl); + } /* --------------------- */ .my-none { margin-block: 0; @@ -55,4 +61,7 @@ .my-xl { margin-block: var(--margin-xl); } + .my-2xl { + margin-block: var(--margin-2xl); + } } diff --git a/packages/css/utility/margin-inline.css b/packages/css/src/utility/size-sensitive/margin-inline.css similarity index 85% rename from packages/css/utility/margin-inline.css rename to packages/css/src/utility/size-sensitive/margin-inline.css index 0fea3b7..40e1e9c 100644 --- a/packages/css/utility/margin-inline.css +++ b/packages/css/src/utility/size-sensitive/margin-inline.css @@ -17,6 +17,9 @@ .mx-e-xl { margin-inline-end: var(--margin-xl); } + .mx-e-2xl { + margin-inline-end: var(--margin-2xl); + } /* ------------------ */ .mx-s-none { margin-inline-start: 0; @@ -36,6 +39,9 @@ .mx-s-xl { margin-inline-start: var(--margin-xl); } + .mx-s-2xl { + margin-inline-start: var(--margin-2xl); + } /* --------------------- */ .mx-none { margin-inline: 0; @@ -55,4 +61,7 @@ .mx-xl { margin-inline: var(--margin-xl); } + .mx-2xl { + margin-inline: var(--margin-2xl); + } } diff --git a/packages/css/utility/padding-long.css b/packages/css/src/utility/size-sensitive/padding-long.css similarity index 85% rename from packages/css/utility/padding-long.css rename to packages/css/src/utility/size-sensitive/padding-long.css index fd28735..235fff5 100644 --- a/packages/css/utility/padding-long.css +++ b/packages/css/src/utility/size-sensitive/padding-long.css @@ -18,4 +18,7 @@ .px-long-xl { padding-inline: var(--padding-long-xl); } + .px-long-2xl { + padding-inline: var(--padding-long-2xl); + } } diff --git a/packages/css/utility/padding-short.css b/packages/css/src/utility/size-sensitive/padding-short.css similarity index 86% rename from packages/css/utility/padding-short.css rename to packages/css/src/utility/size-sensitive/padding-short.css index a2b0a6e..5d3ba50 100644 --- a/packages/css/utility/padding-short.css +++ b/packages/css/src/utility/size-sensitive/padding-short.css @@ -21,6 +21,9 @@ .px-xl { padding-inline: var(--padding-xl); } + .px-2xl { + padding-inline: var(--padding-2xl); + } /* ------------------------ */ .py-none { padding-block: 0px; @@ -40,4 +43,7 @@ .py-xl { padding-block: var(--padding-xl); } + .py-2xl { + padding-block: var(--padding-2xl); + } } diff --git a/packages/css/utility/width.css b/packages/css/src/utility/size-sensitive/width.css similarity index 84% rename from packages/css/utility/width.css rename to packages/css/src/utility/size-sensitive/width.css index 13ecf5b..7384f89 100644 --- a/packages/css/utility/width.css +++ b/packages/css/src/utility/size-sensitive/width.css @@ -16,6 +16,10 @@ width: var(--height-item-lg); } .w-item-xl { + /* 56px section-header bar */ + width: var(--height-item-xl); + } + .w-item-2xl { /* 64px navigation bar */ width: var(--height-item-xl); } @@ -35,4 +39,7 @@ .w-inline-xl { width: calc(var(--font-size-xl) * var(--line-height-xl)); } + .w-inline-xl { + width: calc(var(--font-size-2xl) * var(--line-height-2xl)); + } } diff --git a/packages/css/utils/cpm.ts b/packages/css/src/utils/cpm.ts similarity index 100% rename from packages/css/utils/cpm.ts rename to packages/css/src/utils/cpm.ts diff --git a/packages/css/utils/cvr.ts b/packages/css/src/utils/cvr.ts similarity index 100% rename from packages/css/utils/cvr.ts rename to packages/css/src/utils/cvr.ts diff --git a/packages/css/utils/prefix-list.ts b/packages/css/src/utils/prefix-list.ts similarity index 97% rename from packages/css/utils/prefix-list.ts rename to packages/css/src/utils/prefix-list.ts index c1d237f..8efb393 100644 --- a/packages/css/utils/prefix-list.ts +++ b/packages/css/src/utils/prefix-list.ts @@ -33,6 +33,8 @@ export const defaultPrefixList = [ "theme", "w", "z", + "drop-shadow", + "select", ]; // map 里面 key 是 prefix,value 是完整 class。 diff --git a/templates/vite-react-app/tsconfig.build.json b/packages/css/tsconfig.build.json similarity index 61% rename from templates/vite-react-app/tsconfig.build.json rename to packages/css/tsconfig.build.json index 60d26ca..a5bcc27 100644 --- a/templates/vite-react-app/tsconfig.build.json +++ b/packages/css/tsconfig.build.json @@ -1,28 +1,24 @@ { - "extends": "./tsconfig.base.json", + "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "./dist", + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, "rootDir": "./src", - "jsx": "react-jsx", - "declaration": true + "outDir": "./dist", + "declarationDir": "./dist" }, "include": ["src"], "exclude": [ "node_modules", "dist", - - // ---------- build / cache ---------- ".turbo/**/*", ".cache/**/*", ".vite/**/*", - - // ---------- 配置文件 ---------- "vite.config.ts", "*.config.ts", "*.config.js", "tsconfig.*.json", - - // ---------- 测试相关 ---------- "__tests__/**/*", "test/**/*", "tests/**/*", @@ -30,22 +26,14 @@ "**/*.test.tsx", "**/*.spec.ts", "**/*.spec.tsx", - - // ---------- Storybook ---------- ".storybook/**/*", "stories/**/*", - - // ---------- 示例 / 脚本 ---------- "example/**/*", "examples/**/*", "scripts/**/*", - - // ---------- 环境与静态资源 ---------- ".env", ".env.*", "public/**/*", - - // ---------- 文档 ---------- "docs/**/*", "README.md", "LICENSE" diff --git a/packages/css/tsconfig.json b/packages/css/tsconfig.json new file mode 100644 index 0000000..eb90b48 --- /dev/null +++ b/packages/css/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "es2025", + "lib": ["ES2025", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["node", "vite/client"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "scripts", "vite.config.ts"] +} diff --git a/packages/css/vite.config.ts b/packages/css/vite.config.ts new file mode 100644 index 0000000..c632b6e --- /dev/null +++ b/packages/css/vite.config.ts @@ -0,0 +1,39 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import path from "path"; + +export default defineConfig({ + // d.ts 由 tsc 完成,使用专门配置 tsconfig.build.json + // 转换由 oxc 完成 + // 打包由 rolldown 完成 + plugins: [react()], + + build: { + cssMinify: false, + lib: { + entry: path.resolve(import.meta.dirname, "src/index.ts"), + // 不写 vite 默认是 index.mjs 和 index.js,不方便识别 + formats: ["es", "cjs"], + // package.json 管别人怎么使用, + // build.lib 管怎么打包,生成什么 + // 如果不一致,就会报错,指向文件不存在 + fileName: (format) => `index.${format}.js`, + }, + rolldownOptions: { + // 避免这些被打包,peerDependencies 对 rolldown 是无效的,不会自动 external + external: ["react", "react-dom", "react/jsx-runtime"], + // 专门给 UMD / IIFE​ 的映射表 + output: { + globals: { + react: "React", + "react-dom": "ReactDOM", + }, + }, + }, + + emptyOutDir: true, // 防止旧产物残留 + sourcemap: true, // 方便调试 + cssCodeSplit: false, // 合并成一个css文件 + outDir: "dist", // 专管打包输出目录,tsconfig.build.json 中的 outDir 管的是 d.ts 输出目录 + }, +}); diff --git a/packages/ui-web-tw/tsconfig.base.json b/packages/ui-web-tw/tsconfig.base.json deleted file mode 100644 index a7f1b39..0000000 --- a/packages/ui-web-tw/tsconfig.base.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "es2022", - "moduleResolution": "bundler", - "lib": ["ES2025", "DOM", "DOM.Iterable"], - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "isolatedModules": true, - "verbatimModuleSyntax": true - } -} diff --git a/packages/ui-web-tw/tsconfig.build.json b/packages/ui-web-tw/tsconfig.build.json index 30b6e0a..76f11c4 100644 --- a/packages/ui-web-tw/tsconfig.build.json +++ b/packages/ui-web-tw/tsconfig.build.json @@ -1,10 +1,11 @@ { - "extends": "./tsconfig.base.json", + "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src", - "jsx": "react-jsx", - "declaration": true + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "dist", + "declarationDir": "dist/types" }, "include": ["src"], "exclude": [ diff --git a/packages/ui-web-tw/tsconfig.json b/packages/ui-web-tw/tsconfig.json index b77a367..9869c7d 100644 --- a/packages/ui-web-tw/tsconfig.json +++ b/packages/ui-web-tw/tsconfig.json @@ -1,8 +1,26 @@ { - "extends": "./tsconfig.base.json", "compilerOptions": { + "target": "es2025", + "lib": ["ES2025", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["node", "vite/client"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, "jsx": "react-jsx", - "noEmit": true + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true }, - "include": [".", "../css/utils/clspm.ts"] + "include": ["."] } diff --git a/packages/ui-web-tw/vite.config.ts b/packages/ui-web-tw/vite.config.ts index 0132902..b89f0bb 100644 --- a/packages/ui-web-tw/vite.config.ts +++ b/packages/ui-web-tw/vite.config.ts @@ -3,7 +3,6 @@ import react from "@vitejs/plugin-react"; import dts from "vite-plugin-dts"; import path from "path"; import tailwindcss from "@tailwindcss/vite"; -import typescript from "@rollup/plugin-typescript"; export default defineConfig({ plugins: [ @@ -24,17 +23,6 @@ export default defineConfig({ fileName: (format) => `index.${format}.js`, }, - rollupOptions: { - plugins: [typescript({ tsconfig: "./tsconfig.build.json" })], - external: ["react", "react-dom", "react/jsx-runtime"], - output: { - globals: { - react: "React", - "react-dom": "ReactDOM", - }, - }, - }, - sourcemap: true, cssCodeSplit: true, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1713038..4e92330 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,9 @@ importers: apps/ui-site: dependencies: - '@defgov/ui-web': + '@defgov/ui-web-tw': specifier: workspace:* - version: link:../../packages/ui-web + version: link:../../packages/ui-web-tw react: specifier: ^19.2.5 version: 19.2.5 @@ -26,7 +26,7 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^12.3.0 - version: 12.3.0(rollup@4.60.2)(typescript@6.0.3) + version: 12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@6.0.3) '@types/node': specifier: ^25.6.0 version: 25.6.0 @@ -61,6 +61,52 @@ importers: specifier: ^4.5.4 version: 4.5.4(@types/node@25.6.0)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)) + apps/vite-project: + dependencies: + react: + specifier: ^19.2.5 + version: 19.2.5 + react-dom: + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) + devDependencies: + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.3.0(jiti@2.6.1)) + '@types/node': + specifier: ^24.12.2 + version: 24.12.2 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)) + eslint: + specifier: ^10.2.1 + version: 10.3.0(jiti@2.6.1) + eslint-plugin-react-hooks: + specifier: ^7.1.1 + version: 7.1.1(eslint@10.3.0(jiti@2.6.1)) + eslint-plugin-react-refresh: + specifier: ^0.5.2 + version: 0.5.2(eslint@10.3.0(jiti@2.6.1)) + globals: + specifier: ^17.5.0 + version: 17.6.0 + typescript: + specifier: ~6.0.2 + version: 6.0.3 + typescript-eslint: + specifier: ^8.58.2 + version: 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + vite: + specifier: ^8.0.10 + version: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1) + packages/bookmark-sync: dependencies: typescript: @@ -83,7 +129,35 @@ importers: specifier: ^0.12.0 version: 0.12.0 - packages/ui-web: + packages/css: + dependencies: + react: + specifier: ^19 + version: 19.2.5 + react-dom: + specifier: ^19 + version: 19.2.5(react@19.2.5) + devDependencies: + '@types/node': + specifier: ^25.6.0 + version: 25.6.0 + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)) + glob: + specifier: ^13.0.6 + version: 13.0.6 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@25.6.0)(typescript@6.0.3) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vite: + specifier: ^8.0.10 + version: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1) + + packages/ui-web-tw: dependencies: '@base-ui/react': specifier: ^1.4.1 @@ -106,7 +180,7 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^12.3.0 - version: 12.3.0(rollup@4.60.2)(typescript@6.0.3) + version: 12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@6.0.3) '@tailwindcss/vite': specifier: ^4.2.4 version: 4.2.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)) @@ -138,86 +212,6 @@ importers: specifier: ^5.0.0 version: 5.0.0(@microsoft/api-extractor@7.58.7(@types/node@25.6.0))(esbuild@0.27.7)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)) - templates/vite-react-app: - dependencies: - react: - specifier: ^19.2.5 - version: 19.2.5 - react-dom: - specifier: ^19.2.5 - version: 19.2.5(react@19.2.5) - devDependencies: - '@rollup/plugin-typescript': - specifier: ^12.3.0 - version: 12.3.0(rollup@4.60.2)(typescript@6.0.3) - '@types/node': - specifier: ^25.6.0 - version: 25.6.0 - '@types/react': - specifier: ^19.2.14 - 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.2.0 - version: 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)) - glob: - specifier: ^13.0.6 - version: 13.0.6 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@25.6.0)(typescript@6.0.3) - typescript: - specifier: ~6.0.3 - version: 6.0.3 - vite: - specifier: ~7.3.2 - version: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0) - vite-plugin-dts: - specifier: ^4.5.4 - version: 4.5.4(@types/node@25.6.0)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)) - - templates/vite-react-lib: - dependencies: - react: - specifier: ^19 - version: 19.2.5 - react-dom: - specifier: ^19 - version: 19.2.5(react@19.2.5) - devDependencies: - '@rollup/plugin-typescript': - specifier: ^12.3.0 - version: 12.3.0(rollup@4.60.2)(typescript@6.0.3) - '@types/node': - specifier: ^25.6.0 - version: 25.6.0 - '@types/react': - specifier: ^19.2.14 - 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.2.0 - version: 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)) - glob: - specifier: ^13.0.6 - version: 13.0.6 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@25.6.0)(typescript@6.0.3) - typescript: - specifier: ~6.0.3 - version: 6.0.3 - vite: - specifier: ~7.3.2 - version: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0) - vite-plugin-dts: - specifier: ^4.5.4 - version: 4.5.4(@types/node@25.6.0)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)) - packages: '@babel/code-frame@7.29.0': @@ -338,6 +332,15 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} @@ -494,6 +497,45 @@ packages: 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.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -509,6 +551,30 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + 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@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -541,9 +607,123 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + '@rollup/plugin-typescript@12.3.0': resolution: {integrity: sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==} engines: {node: '>=14.0.0'} @@ -870,6 +1050,9 @@ packages: cpu: [arm64] os: [win32] + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -888,6 +1071,9 @@ packages: '@types/chrome@0.1.40': resolution: {integrity: sha512-UnfyRAe8ORu9HSuTH0EqyOEUin3JrWW9Nl/gDXezNfTUrfIoxw+WRZgKOxGz0t5BnjbfXBnS2eCYfW2PxH1wcA==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -903,6 +1089,12 @@ packages: '@types/har-format@1.2.16': resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + '@types/node@25.6.0': resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} @@ -917,12 +1109,84 @@ packages: '@types/webextension-polyfill@0.12.5': resolution: {integrity: sha512-uKSAv6LgcVdINmxXMKBuVIcg/2m5JZugoZO8x20g7j2bXJkPIl/lVGQcDlbV+aXAiTyXT2RA5U5mI4IGCDMQeg==} + '@typescript-eslint/eslint-plugin@8.59.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.59.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} + 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.1.0' + + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.59.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.59.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} + 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.1.0' + + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} + 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.1.0' + + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitejs/plugin-react@5.2.0': resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + '@volar/language-core@2.4.28': resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} @@ -952,6 +1216,11 @@ packages: '@vue/shared@3.5.33': resolution: {integrity: sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==} + 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.5: resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} @@ -977,12 +1246,31 @@ packages: ajv: optional: true + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} alien-signals@0.4.9: resolution: {integrity: sha512-piRGlMgQ65uRiY06mGU7I432AwPwAGf64TK1RXtM1Px4pPfLMTGI9TmsHTfioW1GukZRsNzkVQ/uHjhhd231Ow==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -1016,6 +1304,13 @@ packages: caniuse-lite@1.0.30001791: resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} + 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==} @@ -1031,6 +1326,10 @@ packages: 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==} @@ -1046,6 +1345,9 @@ packages: 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'} @@ -1058,9 +1360,18 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + electron-to-chromium@1.5.349: resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enhanced-resolve@5.21.0: resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} engines: {node: '>=10.13.0'} @@ -1082,15 +1393,78 @@ packages: 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.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + 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 || ^10.0.0 + + eslint-plugin-react-refresh@0.5.2: + resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==} + peerDependencies: + eslint: ^9 || ^10 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + 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@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + 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==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} @@ -1103,6 +1477,25 @@ packages: 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.0: + resolution: {integrity: sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + foreground-child@3.1.0: + resolution: {integrity: sha512-lXeSPRCndWPaipZbtI4CkvTZpF6OPsy19dkvf7+5AHeJD+w+iAKPc9Q78xWBmX4SdR+8xrtY9jTXs/YDv8q+Ug==} + engines: {node: '>=14'} + fs-extra@11.3.4: resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} engines: {node: '>=14.14'} @@ -1119,10 +1512,23 @@ packages: 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@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + engines: {node: '>=18'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1138,14 +1544,51 @@ packages: 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'} + 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-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + 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@3.1.2: + resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} + engines: {node: '>=14'} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -1161,9 +1604,18 @@ packages: 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'} @@ -1172,9 +1624,16 @@ packages: jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + 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.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -1253,6 +1712,14 @@ packages: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + lru-cache@11.3.5: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} @@ -1296,15 +1763,49 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-releases@2.0.38: resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.0.2: + resolution: {integrity: sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + 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@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -1329,6 +1830,18 @@ packages: resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + 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==} @@ -1357,6 +1870,16 @@ packages: engines: {node: '>= 0.4'} hasBin: true + rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.60.2: resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1374,6 +1897,18 @@ packages: 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1389,6 +1924,22 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-width@4.2.0: + resolution: {integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -1421,6 +1972,12 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -1435,10 +1992,24 @@ packages: '@swc/wasm': optional: true + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + turbo@2.9.7: resolution: {integrity: sha512-epxzqVO2s0IxcSWcgb+qKrtco8isfe7g3VtiS6hkYnEK4A9XQDZbrtavQ6MtWR1KoQn+1fUomaQth2rfRHlUlg==} hasBin: true + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.59.2: + resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} + 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.1.0' + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -1452,6 +2023,9 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.19.2: resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} @@ -1499,6 +2073,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -1570,6 +2147,49 @@ packages: yaml: optional: true + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} @@ -1579,6 +2199,23 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + which@2.0.1: + resolution: {integrity: sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -1586,6 +2223,15 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} + 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.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + snapshots: '@babel/code-frame@7.29.0': @@ -1729,6 +2375,22 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.27.7': optional: true @@ -1807,6 +2469,40 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.6.1))': + dependencies: + eslint: 10.3.0(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.5.5': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.6.1))': + optionalDependencies: + eslint: 10.3.0(jiti@2.6.1) + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -1824,6 +2520,31 @@ snapshots: '@floating-ui/utils@0.2.11': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.0 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -1883,15 +2604,81 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@oxc-project/types@0.127.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rolldown/binding-android-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.17': {} + '@rolldown/pluginutils@1.0.0-rc.3': {} - '@rollup/plugin-typescript@12.3.0(rollup@4.60.2)(typescript@6.0.3)': + '@rolldown/pluginutils@1.0.0-rc.7': {} + + '@rollup/plugin-typescript@12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@6.0.3)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.2) resolve: 1.22.12 typescript: 6.0.3 optionalDependencies: rollup: 4.60.2 + tslib: 2.8.1 '@rollup/pluginutils@5.3.0(rollup@4.60.2)': dependencies: @@ -2109,6 +2896,11 @@ snapshots: '@turbo/windows-arm64@2.9.7': optional: true + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + '@types/argparse@1.0.38': {} '@types/babel__core@7.20.5': @@ -2137,6 +2929,8 @@ snapshots: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.8': {} '@types/filesystem@0.0.36': @@ -2149,6 +2943,12 @@ snapshots: '@types/har-format@1.2.16': {} + '@types/json-schema@7.0.15': {} + + '@types/node@24.12.2': + dependencies: + undici-types: 7.16.0 + '@types/node@25.6.0': dependencies: undici-types: 7.19.2 @@ -2163,6 +2963,97 @@ snapshots: '@types/webextension-polyfill@0.12.5': {} + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + eslint: 10.3.0(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + debug: 4.4.3 + eslint: 10.3.0(jiti@2.6.1) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.59.2': + dependencies: + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 + + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.3.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.59.2': {} + + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.59.2': + dependencies: + '@typescript-eslint/types': 8.59.2 + eslint-visitor-keys: 5.0.1 + '@vitejs/plugin-react@5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))': dependencies: '@babel/core': 7.29.0 @@ -2175,6 +3066,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1) + + '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1) + '@volar/language-core@2.4.28': dependencies: '@volar/source-map': 2.4.28 @@ -2220,6 +3121,10 @@ snapshots: '@vue/shared@3.5.33': {} + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-walk@8.3.5: dependencies: acorn: 8.16.0 @@ -2234,6 +3139,13 @@ snapshots: optionalDependencies: ajv: 8.18.0 + ajv@6.15.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.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -2243,6 +3155,16 @@ snapshots: alien-signals@0.4.9: {} + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + arg@4.1.3: {} argparse@1.0.10: @@ -2273,6 +3195,12 @@ snapshots: caniuse-lite@1.0.30001791: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + compare-versions@6.1.1: {} confbox@0.1.8: {} @@ -2283,6 +3211,12 @@ snapshots: create-require@1.1.1: {} + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.1 + csstype@3.2.3: {} de-indent@1.0.2: {} @@ -2291,14 +3225,22 @@ snapshots: dependencies: ms: 2.1.3 + deep-is@0.1.4: {} + detect-libc@2.1.2: {} diff@4.0.4: {} diff@8.0.4: {} + eastasianwidth@0.2.0: {} + electron-to-chromium@1.5.349: {} + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + enhanced-resolve@5.21.0: dependencies: graceful-fs: 4.2.11 @@ -2339,18 +3281,127 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@7.1.1(eslint@10.3.0(jiti@2.6.1)): + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.3 + eslint: 10.3.0(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.5.2(eslint@10.3.0(jiti@2.6.1)): + dependencies: + eslint: 10.3.0(jiti@2.6.1) + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.3.0(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.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 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.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: {} + fast-uri@3.1.0: {} fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.0: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + rimraf: 5.0.5 + + flatted@3.4.2: {} + + foreground-child@3.1.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 @@ -2364,12 +3415,27 @@ snapshots: gensync@1.0.0-beta.2: {} + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.1.0 + jackspeak: 3.1.2 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@13.0.6: dependencies: minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 + globals@17.6.0: {} + graceful-fs@4.2.11: {} has-flag@4.0.0: {} @@ -2380,12 +3446,40 @@ snapshots: 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: {} + import-lazy@4.0.0: {} + imurmurhash@0.1.4: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.3 + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + isexe@2.0.0: {} + + jackspeak@3.1.2: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jiti@2.6.1: {} jju@1.4.0: {} @@ -2394,8 +3488,14 @@ snapshots: 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.1: @@ -2404,8 +3504,17 @@ snapshots: 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.32.0: optional: true @@ -2461,6 +3570,12 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lru-cache@10.2.0: {} + lru-cache@11.3.5: {} lru-cache@5.1.1: @@ -2500,12 +3615,44 @@ snapshots: nanoid@3.3.12: {} + natural-compare@1.4.0: {} + node-releases@2.0.38: {} + 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.0.2: + dependencies: + p-try: 2.2.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.0.2 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + path-browserify@1.0.1: {} + path-exists@4.0.0: {} + + path-key@3.1.1: {} + path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.2.0 + minipass: 7.1.3 + path-scurry@2.0.2: dependencies: lru-cache: 11.3.5 @@ -2535,6 +3682,16 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + punycode@2.3.1: {} + quansync@0.2.11: {} react-dom@19.2.5(react@19.2.5): @@ -2557,6 +3714,31 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + rimraf@5.0.5: + dependencies: + glob: 10.5.0 + + rolldown@1.0.0-rc.17: + dependencies: + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 + rollup@4.60.2: dependencies: '@types/estree': 1.0.8 @@ -2594,6 +3776,14 @@ snapshots: semver@7.7.4: {} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + source-map-js@1.2.1: {} source-map@0.6.1: {} @@ -2602,6 +3792,26 @@ snapshots: string-argv@0.3.2: {} + string-width@4.2.0: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + supports-color@8.1.1: dependencies: has-flag: 4.0.0 @@ -2625,6 +3835,10 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + ts-node@10.9.2(@types/node@25.6.0)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -2643,6 +3857,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + tslib@2.8.1: + optional: true + turbo@2.9.7: optionalDependencies: '@turbo/darwin-64': 2.9.7 @@ -2652,12 +3869,29 @@ snapshots: '@turbo/windows-64': 2.9.7 '@turbo/windows-arm64': 2.9.7 + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + typescript@5.9.3: {} typescript@6.0.3: {} ufo@1.6.4: {} + undici-types@7.16.0: {} + undici-types@7.19.2: {} universalify@2.0.1: {} @@ -2693,6 +3927,10 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + use-sync-external-store@1.6.0(react@19.2.5): dependencies: react: 19.2.5 @@ -2748,12 +3986,62 @@ snapshots: jiti: 2.6.1 lightningcss: 1.32.0 + vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.14 + rolldown: 1.0.0-rc.17 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.12.2 + esbuild: 0.27.7 + fsevents: 2.3.3 + jiti: 2.6.1 + + vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.14 + rolldown: 1.0.0-rc.17 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 25.6.0 + esbuild: 0.27.7 + fsevents: 2.3.3 + jiti: 2.6.1 + vscode-uri@3.1.0: {} webextension-polyfill@0.12.0: {} webpack-virtual-modules@0.6.2: {} + which@2.0.1: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.0 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + yallist@3.1.1: {} yn@3.1.1: {} + + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} diff --git a/templates/vite-react-app/.npmrc b/templates/vite-react-app/.npmrc deleted file mode 100644 index 8b02f75..0000000 --- a/templates/vite-react-app/.npmrc +++ /dev/null @@ -1 +0,0 @@ -registry = https://registry.npmmirror.com/ \ No newline at end of file diff --git a/templates/vite-react-app/.vscode/settings.json b/templates/vite-react-app/.vscode/settings.json deleted file mode 100644 index 772343c..0000000 --- a/templates/vite-react-app/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "json.schemas": [ - { - "fileMatch": ["/tsconfig.build.json", "/tsconfig.base.json"], - "schema": {} - } - ] -} diff --git a/templates/vite-react-app/index.html b/templates/vite-react-app/index.html deleted file mode 100644 index cffe571..0000000 --- a/templates/vite-react-app/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - DefGov UI Web - - -
- - - diff --git a/templates/vite-react-app/package.json b/templates/vite-react-app/package.json deleted file mode 100644 index 73c668c..0000000 --- a/templates/vite-react-app/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "vite-react-app", - "version": "0.0.0", - "private": true, - "type": "module", - "sideEffects": [ - "*.css" - ], - "module": "./dist/index.es.js", - "main": "./dist/index.cjs.js", - "types": "./dist/index.d.ts", - "style": "./dist/index.css", - "exports": { - ".": { - "import": "./dist/index.es.js", - "require": "./dist/index.cjs.js", - "types": "./dist/index.d.ts" - }, - "./index.css": "./dist/index.css" - }, - "files": [ - "dist" - ], - "scripts": { - "gen-css": "ts-node scripts/gen-index-css.ts", - "gen-ts": "ts-node scripts/gen-index-ts.ts", - "gen-index": "pnpm run gen-css && pnpm run gen-ts", - "dev": "pnpm run gen-index && vite build --watch", - "build": "pnpm run gen-index && tsc -p tsconfig.build.json && vite build" - }, - "devDependencies": { - "@rollup/plugin-typescript": "^12.3.0", - "@types/node": "^25.6.0", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "~5.2.0", - "glob": "^13.0.6", - "typescript": "~6.0.3", - "vite": "~7.3.2", - "vite-plugin-dts": "^4.5.4", - "ts-node": "^10.9.2" - }, - "dependencies": { - "react": "^19.2.5", - "react-dom": "^19.2.5" - } -} diff --git a/templates/vite-react-app/scripts/gen-index-css.ts b/templates/vite-react-app/scripts/gen-index-css.ts deleted file mode 100644 index fdddef4..0000000 --- a/templates/vite-react-app/scripts/gen-index-css.ts +++ /dev/null @@ -1,121 +0,0 @@ -import fs from "fs"; -import path 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)$/, - /\.(test|spec)\./, - /\.(story|stories)\./, - ], - }, -}; - -const normalizePath = (p: string) => p.replace(/\\/g, "/"); - -const isInExcludeDir = (filePath: string) => { - const normalized = normalizePath(filePath); - return CONFIG.excludeKeywords.dirs.some((dir) => - normalized.includes(`/${dir}/`), - ); -}; - -const isExcludeSuffix = (filePath: string) => - CONFIG.excludeKeywords.fileSuffixes.some((suffix) => - filePath.endsWith(suffix), - ); - -const isMatchExcludePattern = (fileName: string) => - CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName)); - -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 = path.extname(filePath); - return CONFIG.includeExtensions.includes(ext); -} - -function generateIndexFile(dirPath: string) { - const searchPattern = path.resolve(dirPath, "**", "*.*"); - - const allFiles = globSync(searchPattern, { - nodir: true, - absolute: true, - windowsPathsNoEscape: true, - dot: false, - follow: true, - }); - - const validFiles = allFiles.filter(isValidFile); - if (validFiles.length === 0) { - console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts"); - return; - } - - validFiles.sort(); - - const exportStatements = validFiles.map((file) => { - const relPath = path.relative(dirPath, file); - const importPath = `./${relPath - .replace(/\.[^.]+$/, "") - .replace(/\\/g, "/")}`; - return `export * from '${importPath}';`; - }); - - const indexContent = ` -import './index.css'; - -${exportStatements.join("\n")} -`.trim(); - - const indexFilePath = path.resolve(dirPath, "index.ts"); - - // ✅ 内容比对,避免重复写入 - if (fs.existsSync(indexFilePath)) { - const old = fs.readFileSync(indexFilePath, "utf8"); - if (old === indexContent) { - console.log("✅ index.ts 内容无变化,无需重新生成"); - return; - } - } - - fs.writeFileSync(indexFilePath, indexContent, "utf8"); - console.log(`✅ 成功生成 index.ts: ${indexFilePath}`); -} - -// 脚本入口 -const [targetDir] = CONFIG.targetDirs; -if (!targetDir) { - console.error("❌ CONFIG.targetDirs 不能为空"); - process.exit(1); -} - -const absTargetDir = path.resolve(process.cwd(), targetDir); - -try { - console.log(`🚀 开始扫描目录: ${absTargetDir}`); - generateIndexFile(absTargetDir); -} catch (err) { - const msg = err instanceof Error ? err.message : String(err); - console.error(`❌ [gen-index-ts] 执行失败: ${msg}`); - process.exit(1); -} diff --git a/templates/vite-react-app/scripts/gen-index-ts.ts b/templates/vite-react-app/scripts/gen-index-ts.ts deleted file mode 100644 index fdddef4..0000000 --- a/templates/vite-react-app/scripts/gen-index-ts.ts +++ /dev/null @@ -1,121 +0,0 @@ -import fs from "fs"; -import path 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)$/, - /\.(test|spec)\./, - /\.(story|stories)\./, - ], - }, -}; - -const normalizePath = (p: string) => p.replace(/\\/g, "/"); - -const isInExcludeDir = (filePath: string) => { - const normalized = normalizePath(filePath); - return CONFIG.excludeKeywords.dirs.some((dir) => - normalized.includes(`/${dir}/`), - ); -}; - -const isExcludeSuffix = (filePath: string) => - CONFIG.excludeKeywords.fileSuffixes.some((suffix) => - filePath.endsWith(suffix), - ); - -const isMatchExcludePattern = (fileName: string) => - CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName)); - -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 = path.extname(filePath); - return CONFIG.includeExtensions.includes(ext); -} - -function generateIndexFile(dirPath: string) { - const searchPattern = path.resolve(dirPath, "**", "*.*"); - - const allFiles = globSync(searchPattern, { - nodir: true, - absolute: true, - windowsPathsNoEscape: true, - dot: false, - follow: true, - }); - - const validFiles = allFiles.filter(isValidFile); - if (validFiles.length === 0) { - console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts"); - return; - } - - validFiles.sort(); - - const exportStatements = validFiles.map((file) => { - const relPath = path.relative(dirPath, file); - const importPath = `./${relPath - .replace(/\.[^.]+$/, "") - .replace(/\\/g, "/")}`; - return `export * from '${importPath}';`; - }); - - const indexContent = ` -import './index.css'; - -${exportStatements.join("\n")} -`.trim(); - - const indexFilePath = path.resolve(dirPath, "index.ts"); - - // ✅ 内容比对,避免重复写入 - if (fs.existsSync(indexFilePath)) { - const old = fs.readFileSync(indexFilePath, "utf8"); - if (old === indexContent) { - console.log("✅ index.ts 内容无变化,无需重新生成"); - return; - } - } - - fs.writeFileSync(indexFilePath, indexContent, "utf8"); - console.log(`✅ 成功生成 index.ts: ${indexFilePath}`); -} - -// 脚本入口 -const [targetDir] = CONFIG.targetDirs; -if (!targetDir) { - console.error("❌ CONFIG.targetDirs 不能为空"); - process.exit(1); -} - -const absTargetDir = path.resolve(process.cwd(), targetDir); - -try { - console.log(`🚀 开始扫描目录: ${absTargetDir}`); - generateIndexFile(absTargetDir); -} catch (err) { - const msg = err instanceof Error ? err.message : String(err); - console.error(`❌ [gen-index-ts] 执行失败: ${msg}`); - process.exit(1); -} diff --git a/templates/vite-react-app/src/App.tsx b/templates/vite-react-app/src/App.tsx deleted file mode 100644 index 97e63ad..0000000 --- a/templates/vite-react-app/src/App.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function App() { - return <>; -} diff --git a/templates/vite-react-app/src/main.tsx b/templates/vite-react-app/src/main.tsx deleted file mode 100644 index 4930e42..0000000 --- a/templates/vite-react-app/src/main.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { createRoot } from "react-dom/client"; -import App from "./App"; - -const container = document.getElementById("root")!; -const root = createRoot(container); - -root.render(); diff --git a/templates/vite-react-app/src/types/css.d.ts b/templates/vite-react-app/src/types/css.d.ts deleted file mode 100644 index d535de2..0000000 --- a/templates/vite-react-app/src/types/css.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.css' { - const content: { [className: string]: string }; - export default content; -} \ No newline at end of file diff --git a/templates/vite-react-app/src/types/env.d.ts b/templates/vite-react-app/src/types/env.d.ts deleted file mode 100644 index 7ba6254..0000000 --- a/templates/vite-react-app/src/types/env.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/// - -declare module "*.svg" { - import * as React from "react"; - export const ReactComponent: React.FC>; - const src: string; - export default src; -} - -declare module "*.png" { - const src: string; - export default src; -} - -declare module "*.jpg" { - const src: string; - export default src; -} - -declare module "*.jpeg" { - const src: string; - export default src; -} - -declare module "*.gif" { - const src: string; - export default src; -} - -declare module "*.webp" { - const src: string; - export default src; -} - -interface ImportMetaEnv { - readonly MODE: "development" | "production" | "test"; - readonly BASE_URL: string; - readonly PROD: boolean; - readonly DEV: boolean; - readonly SSR: boolean; - - // ===== 业务环境变量 ===== - readonly VITE_API_BASE: string; - readonly VITE_UPLOAD_URL?: string; - readonly VITE_ENABLE_MOCK?: "true" | "false"; - readonly VITE_SENTRY_DSN?: string; -} - -interface ImportMeta { - readonly env: ImportMetaEnv; -} diff --git a/templates/vite-react-app/tsconfig.base.json b/templates/vite-react-app/tsconfig.base.json deleted file mode 100644 index a7f1b39..0000000 --- a/templates/vite-react-app/tsconfig.base.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "es2022", - "moduleResolution": "bundler", - "lib": ["ES2025", "DOM", "DOM.Iterable"], - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "isolatedModules": true, - "verbatimModuleSyntax": true - } -} diff --git a/templates/vite-react-app/tsconfig.json b/templates/vite-react-app/tsconfig.json deleted file mode 100644 index 1f65a23..0000000 --- a/templates/vite-react-app/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "jsx": "react-jsx", - "noEmit": true - }, - "include": ["."] -} diff --git a/templates/vite-react-app/vite.config.ts b/templates/vite-react-app/vite.config.ts deleted file mode 100644 index 969388a..0000000 --- a/templates/vite-react-app/vite.config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; -import dts from "vite-plugin-dts"; -import typescript from "@rollup/plugin-typescript"; - -export default defineConfig({ - plugins: [ - react(), - dts({ - insertTypesEntry: true, - }), - ], - - esbuild: false, - - build: { - rollupOptions: { - plugins: [typescript({ tsconfig: "./tsconfig.build.json" })], - external: ["react", "react-dom", "react/jsx-runtime"], - output: { - globals: { - react: "React", - "react-dom": "ReactDOM", - }, - }, - }, - - sourcemap: true, - cssCodeSplit: true, - }, -}); diff --git a/templates/vite-react-lib/.npmrc b/templates/vite-react-lib/.npmrc deleted file mode 100644 index 8b02f75..0000000 --- a/templates/vite-react-lib/.npmrc +++ /dev/null @@ -1 +0,0 @@ -registry = https://registry.npmmirror.com/ \ No newline at end of file diff --git a/templates/vite-react-lib/.vscode/settings.json b/templates/vite-react-lib/.vscode/settings.json deleted file mode 100644 index 772343c..0000000 --- a/templates/vite-react-lib/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "json.schemas": [ - { - "fileMatch": ["/tsconfig.build.json", "/tsconfig.base.json"], - "schema": {} - } - ] -} diff --git a/templates/vite-react-lib/package.json b/templates/vite-react-lib/package.json index c55b94d..5c912a2 100644 --- a/templates/vite-react-lib/package.json +++ b/templates/vite-react-lib/package.json @@ -1,5 +1,5 @@ { - "name": "vite-react-lib", + "name": "@defgov/vite-react-lib", "version": "0.0.0", "private": true, "type": "module", @@ -22,23 +22,18 @@ "dist" ], "scripts": { - "gen-css": "ts-node scripts/gen-index-css.ts", - "gen-ts": "ts-node scripts/gen-index-ts.ts", - "gen-index": "pnpm run gen-css && pnpm run gen-ts", - "dev": "pnpm run gen-index && vite build --watch", - "build": "pnpm run gen-index && tsc -p tsconfig.build.json && vite build" + "gen-index": "ts-node scripts/gen-index.ts", + "gen-dts": "tsc -p tsconfig.build.json", + "dev": "pnpm gen-index && vite build --watch", + "build": "pnpm gen-index && vite build && pnpm gen-dts" }, "devDependencies": { - "@rollup/plugin-typescript": "^12.3.0", "@types/node": "^25.6.0", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "~5.2.0", + "@vitejs/plugin-react": "^6.0.1", "glob": "^13.0.6", - "typescript": "~6.0.3", - "vite": "~7.3.2", - "vite-plugin-dts": "^4.5.4", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "typescript": "^6.0.3", + "vite": "^8.0.10" }, "peerDependencies": { "react": "^19", diff --git a/templates/vite-react-lib/scripts/gen-index-css.ts b/templates/vite-react-lib/scripts/gen-index-css.ts deleted file mode 100644 index fdddef4..0000000 --- a/templates/vite-react-lib/scripts/gen-index-css.ts +++ /dev/null @@ -1,121 +0,0 @@ -import fs from "fs"; -import path 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)$/, - /\.(test|spec)\./, - /\.(story|stories)\./, - ], - }, -}; - -const normalizePath = (p: string) => p.replace(/\\/g, "/"); - -const isInExcludeDir = (filePath: string) => { - const normalized = normalizePath(filePath); - return CONFIG.excludeKeywords.dirs.some((dir) => - normalized.includes(`/${dir}/`), - ); -}; - -const isExcludeSuffix = (filePath: string) => - CONFIG.excludeKeywords.fileSuffixes.some((suffix) => - filePath.endsWith(suffix), - ); - -const isMatchExcludePattern = (fileName: string) => - CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName)); - -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 = path.extname(filePath); - return CONFIG.includeExtensions.includes(ext); -} - -function generateIndexFile(dirPath: string) { - const searchPattern = path.resolve(dirPath, "**", "*.*"); - - const allFiles = globSync(searchPattern, { - nodir: true, - absolute: true, - windowsPathsNoEscape: true, - dot: false, - follow: true, - }); - - const validFiles = allFiles.filter(isValidFile); - if (validFiles.length === 0) { - console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts"); - return; - } - - validFiles.sort(); - - const exportStatements = validFiles.map((file) => { - const relPath = path.relative(dirPath, file); - const importPath = `./${relPath - .replace(/\.[^.]+$/, "") - .replace(/\\/g, "/")}`; - return `export * from '${importPath}';`; - }); - - const indexContent = ` -import './index.css'; - -${exportStatements.join("\n")} -`.trim(); - - const indexFilePath = path.resolve(dirPath, "index.ts"); - - // ✅ 内容比对,避免重复写入 - if (fs.existsSync(indexFilePath)) { - const old = fs.readFileSync(indexFilePath, "utf8"); - if (old === indexContent) { - console.log("✅ index.ts 内容无变化,无需重新生成"); - return; - } - } - - fs.writeFileSync(indexFilePath, indexContent, "utf8"); - console.log(`✅ 成功生成 index.ts: ${indexFilePath}`); -} - -// 脚本入口 -const [targetDir] = CONFIG.targetDirs; -if (!targetDir) { - console.error("❌ CONFIG.targetDirs 不能为空"); - process.exit(1); -} - -const absTargetDir = path.resolve(process.cwd(), targetDir); - -try { - console.log(`🚀 开始扫描目录: ${absTargetDir}`); - generateIndexFile(absTargetDir); -} catch (err) { - const msg = err instanceof Error ? err.message : String(err); - console.error(`❌ [gen-index-ts] 执行失败: ${msg}`); - process.exit(1); -} diff --git a/templates/vite-react-lib/scripts/gen-index-ts.ts b/templates/vite-react-lib/scripts/gen-index-ts.ts deleted file mode 100644 index fdddef4..0000000 --- a/templates/vite-react-lib/scripts/gen-index-ts.ts +++ /dev/null @@ -1,121 +0,0 @@ -import fs from "fs"; -import path 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)$/, - /\.(test|spec)\./, - /\.(story|stories)\./, - ], - }, -}; - -const normalizePath = (p: string) => p.replace(/\\/g, "/"); - -const isInExcludeDir = (filePath: string) => { - const normalized = normalizePath(filePath); - return CONFIG.excludeKeywords.dirs.some((dir) => - normalized.includes(`/${dir}/`), - ); -}; - -const isExcludeSuffix = (filePath: string) => - CONFIG.excludeKeywords.fileSuffixes.some((suffix) => - filePath.endsWith(suffix), - ); - -const isMatchExcludePattern = (fileName: string) => - CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName)); - -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 = path.extname(filePath); - return CONFIG.includeExtensions.includes(ext); -} - -function generateIndexFile(dirPath: string) { - const searchPattern = path.resolve(dirPath, "**", "*.*"); - - const allFiles = globSync(searchPattern, { - nodir: true, - absolute: true, - windowsPathsNoEscape: true, - dot: false, - follow: true, - }); - - const validFiles = allFiles.filter(isValidFile); - if (validFiles.length === 0) { - console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts"); - return; - } - - validFiles.sort(); - - const exportStatements = validFiles.map((file) => { - const relPath = path.relative(dirPath, file); - const importPath = `./${relPath - .replace(/\.[^.]+$/, "") - .replace(/\\/g, "/")}`; - return `export * from '${importPath}';`; - }); - - const indexContent = ` -import './index.css'; - -${exportStatements.join("\n")} -`.trim(); - - const indexFilePath = path.resolve(dirPath, "index.ts"); - - // ✅ 内容比对,避免重复写入 - if (fs.existsSync(indexFilePath)) { - const old = fs.readFileSync(indexFilePath, "utf8"); - if (old === indexContent) { - console.log("✅ index.ts 内容无变化,无需重新生成"); - return; - } - } - - fs.writeFileSync(indexFilePath, indexContent, "utf8"); - console.log(`✅ 成功生成 index.ts: ${indexFilePath}`); -} - -// 脚本入口 -const [targetDir] = CONFIG.targetDirs; -if (!targetDir) { - console.error("❌ CONFIG.targetDirs 不能为空"); - process.exit(1); -} - -const absTargetDir = path.resolve(process.cwd(), targetDir); - -try { - console.log(`🚀 开始扫描目录: ${absTargetDir}`); - generateIndexFile(absTargetDir); -} catch (err) { - const msg = err instanceof Error ? err.message : String(err); - console.error(`❌ [gen-index-ts] 执行失败: ${msg}`); - process.exit(1); -} diff --git a/templates/vite-react-lib/scripts/gen-index.ts b/templates/vite-react-lib/scripts/gen-index.ts new file mode 100644 index 0000000..e03849c --- /dev/null +++ b/templates/vite-react-lib/scripts/gen-index.ts @@ -0,0 +1,147 @@ +import fs from "fs"; +import path from "path"; +import { globSync } from "glob"; + +interface Config { + outputDir: string; + outputFilenameWithExt: string; + scanDirs: string[]; + importPrefix: string; + predefineStatements: string[]; + includeExtensions: string[]; + excludeDirs: string[]; + excludeFileExtensions: string[]; + excludePatterns: RegExp[]; +} + +const cssConfig: Config = { + outputDir: "src", + outputFilenameWithExt: "index.css", + scanDirs: ["src"], + importPrefix: "@import", + predefineStatements: [], + includeExtensions: [".css"], + excludeDirs: ["__tests__", "tests", "story", "stories", "types"], + excludeFileExtensions: [], + excludePatterns: [/^index\.(css)$/, /\.(test|spec)\./, /\.(story|stories)\./], +}; + +const tsConfig: Config = { + outputDir: "src", + outputFilenameWithExt: "index.ts", + scanDirs: ["src"], + importPrefix: "export * from", + predefineStatements: ["import './index.css'"], + includeExtensions: [".ts", "tsx", "js", "jsx"], + excludeDirs: ["__tests__", "tests", "story", "stories", "types"], + excludeFileExtensions: [".d.ts"], + excludePatterns: [ + /^index\.(ts|tsx|js|jsx)$/, + /\.(test|spec)\./, + /\.(story|stories)\./, + ], +}; + +const normalizePath = (p: string) => p.replace(/\\/g, "/"); + +const isExcludeDir = (filePath: string, excludeDirs: string[]) => { + const normalized = normalizePath(filePath); + return excludeDirs.some((dir) => normalized.includes(`/${dir}/`)); +}; + +const isExcludeFileExtensions = ( + filePath: string, + excludeFileExtensions: string[], +) => excludeFileExtensions.some((ext) => filePath.endsWith(ext)); + +const isExcludePattern = (fileName: string, excludePatterns: RegExp[]) => + excludePatterns.some((pattern) => pattern.test(fileName)); + +// ---------------------------------------- +function isValidFile(filePath: string, config: Config): boolean { + const fileName = filePath.split(/[\\/]/).pop()!; + + if (isExcludeDir(filePath, config.excludeDirs)) return false; + if (isExcludeFileExtensions(filePath, config.excludeFileExtensions)) + return false; + if (isExcludePattern(fileName, config.excludePatterns)) return false; + + const ext = path.extname(filePath); + return config.includeExtensions.includes(ext); +} +// ----------------------------------------- +function generateIndexFile(config: Config) { + const currentPath = process.cwd(); + const outputPath = path.resolve(currentPath, config.outputDir); + let exportStatements: string[] = []; + + // ------ scanDirs forEach start ------------------------ + config.scanDirs.forEach((dir) => { + const scanPattern = path.resolve(currentPath, dir, "**", "*.*"); + + const allFilePath = globSync(scanPattern, { + absolute: true, + windowsPathsNoEscape: true, + dot: false, + follow: true, + }); + + const validFiles = allFilePath.filter((filePath) => { + return isValidFile(filePath, config); + }); + + if (validFiles.length === 0) { + console.log( + `⚠️ 未找到符合条件的文件,跳过生成 ${config.outputFilenameWithExt}`, + ); + return; + } + + validFiles.sort(); + + validFiles.forEach((file) => { + const relativePath = path.relative(outputPath, file); + const importPath = `./${relativePath.replace(/\\/g, "/")}`; + exportStatements.push(`${config.importPrefix} '${importPath}';`); + }); + }); + + // --------- scanDirs forEach end ---------------- + + const indexFileContent = ` +${config.predefineStatements.join("\n")} +${exportStatements.join("\n")} +`.trim(); + + const indexFilePath = path.resolve( + currentPath, + config.outputDir, + config.outputFilenameWithExt, + ); + + // ✅ 内容比对,避免重复写入 + if (fs.existsSync(indexFilePath)) { + const old = fs.readFileSync(indexFilePath, "utf8"); + if (old === indexFileContent) { + console.log( + `✅ ${config.outputFilenameWithExt} 内容无变化,无需重新生成`, + ); + return; + } + } + + fs.writeFileSync(indexFilePath, indexFileContent, "utf8"); + console.log(`✅ 成功生成 ${config.outputFilenameWithExt}: ${indexFilePath}`); +} + +// -------------------------------------------------- + +try { + console.log(`🚀 [gen-index] 开始扫描`); + generateIndexFile(cssConfig); + generateIndexFile(tsConfig); +} catch (err) { + const msg = err instanceof Error ? err.message : String(err); + console.error(`❌ [gen-index] 执行失败: ${msg}`); + process.exit(1); +} diff --git a/templates/vite-react-lib/src/types/css.d.ts b/templates/vite-react-lib/src/types/css.d.ts deleted file mode 100644 index d535de2..0000000 --- a/templates/vite-react-lib/src/types/css.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.css' { - const content: { [className: string]: string }; - export default content; -} \ No newline at end of file diff --git a/templates/vite-react-lib/src/types/env.d.ts b/templates/vite-react-lib/src/types/env.d.ts index 7ba6254..31058d4 100644 --- a/templates/vite-react-lib/src/types/env.d.ts +++ b/templates/vite-react-lib/src/types/env.d.ts @@ -1,51 +1,4 @@ -/// - -declare module "*.svg" { - import * as React from "react"; - export const ReactComponent: React.FC>; - const src: string; - export default src; -} - -declare module "*.png" { - const src: string; - export default src; -} - -declare module "*.jpg" { - const src: string; - export default src; -} - -declare module "*.jpeg" { - const src: string; - export default src; -} - -declare module "*.gif" { - const src: string; - export default src; -} - -declare module "*.webp" { - const src: string; - export default src; -} - -interface ImportMetaEnv { - readonly MODE: "development" | "production" | "test"; - readonly BASE_URL: string; - readonly PROD: boolean; - readonly DEV: boolean; - readonly SSR: boolean; - - // ===== 业务环境变量 ===== - readonly VITE_API_BASE: string; - readonly VITE_UPLOAD_URL?: string; - readonly VITE_ENABLE_MOCK?: "true" | "false"; - readonly VITE_SENTRY_DSN?: string; -} - -interface ImportMeta { - readonly env: ImportMetaEnv; +declare module "*.css" { + const content: string; + export default content; } diff --git a/templates/vite-react-lib/tsconfig.base.json b/templates/vite-react-lib/tsconfig.base.json deleted file mode 100644 index a7f1b39..0000000 --- a/templates/vite-react-lib/tsconfig.base.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "es2022", - "moduleResolution": "bundler", - "lib": ["ES2025", "DOM", "DOM.Iterable"], - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "isolatedModules": true, - "verbatimModuleSyntax": true - } -} diff --git a/templates/vite-react-lib/tsconfig.build.json b/templates/vite-react-lib/tsconfig.build.json index 60d26ca..a5bcc27 100644 --- a/templates/vite-react-lib/tsconfig.build.json +++ b/templates/vite-react-lib/tsconfig.build.json @@ -1,28 +1,24 @@ { - "extends": "./tsconfig.base.json", + "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "./dist", + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, "rootDir": "./src", - "jsx": "react-jsx", - "declaration": true + "outDir": "./dist", + "declarationDir": "./dist" }, "include": ["src"], "exclude": [ "node_modules", "dist", - - // ---------- build / cache ---------- ".turbo/**/*", ".cache/**/*", ".vite/**/*", - - // ---------- 配置文件 ---------- "vite.config.ts", "*.config.ts", "*.config.js", "tsconfig.*.json", - - // ---------- 测试相关 ---------- "__tests__/**/*", "test/**/*", "tests/**/*", @@ -30,22 +26,14 @@ "**/*.test.tsx", "**/*.spec.ts", "**/*.spec.tsx", - - // ---------- Storybook ---------- ".storybook/**/*", "stories/**/*", - - // ---------- 示例 / 脚本 ---------- "example/**/*", "examples/**/*", "scripts/**/*", - - // ---------- 环境与静态资源 ---------- ".env", ".env.*", "public/**/*", - - // ---------- 文档 ---------- "docs/**/*", "README.md", "LICENSE" diff --git a/templates/vite-react-lib/tsconfig.json b/templates/vite-react-lib/tsconfig.json index 1f65a23..eb90b48 100644 --- a/templates/vite-react-lib/tsconfig.json +++ b/templates/vite-react-lib/tsconfig.json @@ -1,8 +1,26 @@ { - "extends": "./tsconfig.base.json", "compilerOptions": { + "target": "es2025", + "lib": ["ES2025", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["node", "vite/client"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, "jsx": "react-jsx", - "noEmit": true + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true }, - "include": ["."] + "include": ["src", "scripts", "vite.config.ts"] } diff --git a/templates/vite-react-lib/vite.config.ts b/templates/vite-react-lib/vite.config.ts index 626fb35..c632b6e 100644 --- a/templates/vite-react-lib/vite.config.ts +++ b/templates/vite-react-lib/vite.config.ts @@ -1,30 +1,28 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; -import dts from "vite-plugin-dts"; import path from "path"; -import typescript from "@rollup/plugin-typescript"; export default defineConfig({ - plugins: [ - react(), - dts({ - insertTypesEntry: true, - }), - ], - - esbuild: false, + // d.ts 由 tsc 完成,使用专门配置 tsconfig.build.json + // 转换由 oxc 完成 + // 打包由 rolldown 完成 + plugins: [react()], build: { + cssMinify: false, lib: { - entry: path.resolve(__dirname, "src/index.ts"), - name: "DefgovUIWeb", + entry: path.resolve(import.meta.dirname, "src/index.ts"), + // 不写 vite 默认是 index.mjs 和 index.js,不方便识别 formats: ["es", "cjs"], + // package.json 管别人怎么使用, + // build.lib 管怎么打包,生成什么 + // 如果不一致,就会报错,指向文件不存在 fileName: (format) => `index.${format}.js`, }, - - rollupOptions: { - plugins: [typescript({ tsconfig: "./tsconfig.build.json" })], + rolldownOptions: { + // 避免这些被打包,peerDependencies 对 rolldown 是无效的,不会自动 external external: ["react", "react-dom", "react/jsx-runtime"], + // 专门给 UMD / IIFE​ 的映射表 output: { globals: { react: "React", @@ -33,7 +31,9 @@ export default defineConfig({ }, }, - sourcemap: true, - cssCodeSplit: true, + emptyOutDir: true, // 防止旧产物残留 + sourcemap: true, // 方便调试 + cssCodeSplit: false, // 合并成一个css文件 + outDir: "dist", // 专管打包输出目录,tsconfig.build.json 中的 outDir 管的是 d.ts 输出目录 }, });