From 143ba5ca58ef14904076fe5eb83b7df3099ad30b Mon Sep 17 00:00:00 2001 From: VietC Date: Sat, 4 Jul 2026 17:18:22 +0700 Subject: [PATCH] feat: add website as web/ subfolder --- web/.env.example | 9 + web/.gitignore | 8 + ...7588542340832646_2624568238884019344_n.jpg | Bin 0 -> 99123 bytes web/README.md | 20 + web/index.html | 14 + web/metadata.json | 6 + web/package-lock.json | 4278 +++++++++++++++++ web/package.json | 35 + web/public/vietc-favicon.svg | 62 + web/src/App.tsx | 63 + web/src/components/DragonMascot.tsx | 180 + web/src/components/Features.tsx | 188 + web/src/components/Footer.tsx | 66 + web/src/components/Hero.tsx | 156 + web/src/components/KeycapGallery.tsx | 475 ++ web/src/components/Navbar.tsx | 122 + web/src/components/SetupGuide.tsx | 379 ++ web/src/components/TerminalSimulator.tsx | 347 ++ web/src/index.css | 26 + web/src/main.tsx | 10 + web/src/types.ts | 35 + web/src/utils/vniParser.ts | 233 + web/tsconfig.json | 26 + web/vite.config.ts | 22 + 24 files changed, 6760 insertions(+) create mode 100644 web/.env.example create mode 100644 web/.gitignore create mode 100644 web/737046771_27588542340832646_2624568238884019344_n.jpg create mode 100644 web/README.md create mode 100644 web/index.html create mode 100644 web/metadata.json create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/public/vietc-favicon.svg create mode 100644 web/src/App.tsx create mode 100644 web/src/components/DragonMascot.tsx create mode 100644 web/src/components/Features.tsx create mode 100644 web/src/components/Footer.tsx create mode 100644 web/src/components/Hero.tsx create mode 100644 web/src/components/KeycapGallery.tsx create mode 100644 web/src/components/Navbar.tsx create mode 100644 web/src/components/SetupGuide.tsx create mode 100644 web/src/components/TerminalSimulator.tsx create mode 100644 web/src/index.css create mode 100644 web/src/main.tsx create mode 100644 web/src/types.ts create mode 100644 web/src/utils/vniParser.ts create mode 100644 web/tsconfig.json create mode 100644 web/vite.config.ts diff --git a/web/.env.example b/web/.env.example new file mode 100644 index 0000000..7a550fe --- /dev/null +++ b/web/.env.example @@ -0,0 +1,9 @@ +# GEMINI_API_KEY: Required for Gemini AI API calls. +# AI Studio automatically injects this at runtime from user secrets. +# Users configure this via the Secrets panel in the AI Studio UI. +GEMINI_API_KEY="MY_GEMINI_API_KEY" + +# APP_URL: The URL where this applet is hosted. +# AI Studio automatically injects this at runtime with the Cloud Run service URL. +# Used for self-referential links, OAuth callbacks, and API endpoints. +APP_URL="MY_APP_URL" diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..5a86d2a --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +build/ +dist/ +coverage/ +.DS_Store +*.log +.env* +!.env.example diff --git a/web/737046771_27588542340832646_2624568238884019344_n.jpg b/web/737046771_27588542340832646_2624568238884019344_n.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79b70f6dabf6a7b9a29e504fbccc1d74efcc9c81 GIT binary patch literal 99123 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 literal 0 HcmV?d00001 diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..2af2984 --- /dev/null +++ b/web/README.md @@ -0,0 +1,20 @@ +

+GHBanner +
+ +# Run and deploy your AI Studio app + +This contains everything you need to run your app locally. + +View your app in AI Studio: https://ai.studio/apps/aa240f3c-abe9-494f-8e47-678406f50ae1 + +## Run Locally + +**Prerequisites:** Node.js + + +1. Install dependencies: + `npm install` +2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key +3. Run the app: + `npm run dev` diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..601ab9e --- /dev/null +++ b/web/index.html @@ -0,0 +1,14 @@ + + + + + + + VietC - Bộ gõ tiếng Việt Native cho Linux Terminal + + +
+ + + + diff --git a/web/metadata.json b/web/metadata.json new file mode 100644 index 0000000..4438b68 --- /dev/null +++ b/web/metadata.json @@ -0,0 +1,6 @@ +{ + "name": "VietC - Native Linux VNI Terminal IME", + "description": "Website giới thiệu bộ gõ tiếng Việt VietC siêu nhẹ, siêu mượt cho Linux Terminal, kèm theo hướng dẫn cài đặt và trang tùy biến bộ Keycap 3D Resin Rồng Con dễ thương.", + "requestFramePermissions": [], + "majorCapabilities": ["MAJOR_CAPABILITY_SERVER_SIDE_GEMINI_API"] +} diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..a6c6cea --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,4278 @@ +{ + "name": "react-example", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-example", + "version": "0.0.0", + "dependencies": { + "@google/genai": "^2.4.0", + "@tailwindcss/vite": "^4.1.14", + "@vitejs/plugin-react": "^5.0.4", + "dotenv": "^17.2.3", + "express": "^4.21.2", + "lucide-react": "^0.546.0", + "motion": "^12.23.24", + "react": "^19.0.1", + "react-dom": "^19.0.1", + "vite": "^6.2.3" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/node": "^22.14.0", + "autoprefixer": "^10.4.21", + "esbuild": "^0.25.0", + "tailwindcss": "^4.1.14", + "tsx": "^4.21.0", + "typescript": "~5.8.2", + "vite": "^6.2.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/genai": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-2.10.0.tgz", + "integrity": "sha512-e4cFxj3tiuMtsgOT4G9c1hXyGJhg7/Buj7VVeBacRY3fRtkRZZ59Q3nuVp2xbq8BGQXLXCDB253qMhklMOeUDg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^10.3.0", + "p-retry": "^4.6.2", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "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" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.2.tgz", + "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.4", + "caniuse-lite": "^1.0.30001799", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.41", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.41.tgz", + "integrity": "sha512-WwS7MHhqGHHlaVsqRZnhvCEMS0owDX+SxRlve7JkuH7My1Ara3ZriTmCQupPfYjxMZ8I/tgxtJYr2t7taHaH4A==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001800", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", + "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.387", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.387.tgz", + "integrity": "sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==", + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.2.tgz", + "integrity": "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.42.2", + "motion-utils": "^12.39.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.5.tgz", + "integrity": "sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/google-auth-library": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.9.0.tgz", + "integrity": "sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.1.4", + "gcp-metadata": "8.1.2", + "google-logging-utils": "1.1.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.546.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.546.0.tgz", + "integrity": "sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/motion": { + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.42.2.tgz", + "integrity": "sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.42.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.42.2", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.2.tgz", + "integrity": "sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", + "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.0.tgz", + "integrity": "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..44745ed --- /dev/null +++ b/web/package.json @@ -0,0 +1,35 @@ +{ + "name": "react-example", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port=3000 --host=0.0.0.0", + "build": "vite build", + "preview": "vite preview", + "clean": "rm -rf dist server.js", + "lint": "tsc --noEmit" + }, + "dependencies": { + "@google/genai": "^2.4.0", + "@tailwindcss/vite": "^4.1.14", + "@vitejs/plugin-react": "^5.0.4", + "lucide-react": "^0.546.0", + "react": "^19.0.1", + "react-dom": "^19.0.1", + "vite": "^6.2.3", + "express": "^4.21.2", + "dotenv": "^17.2.3", + "motion": "^12.23.24" + }, + "devDependencies": { + "@types/node": "^22.14.0", + "autoprefixer": "^10.4.21", + "esbuild": "^0.25.0", + "tailwindcss": "^4.1.14", + "tsx": "^4.21.0", + "typescript": "~5.8.2", + "vite": "^6.2.3", + "@types/express": "^4.17.21" + } +} diff --git a/web/public/vietc-favicon.svg b/web/public/vietc-favicon.svg new file mode 100644 index 0000000..f858904 --- /dev/null +++ b/web/public/vietc-favicon.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/App.tsx b/web/src/App.tsx new file mode 100644 index 0000000..d6604bb --- /dev/null +++ b/web/src/App.tsx @@ -0,0 +1,63 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import Navbar from './components/Navbar'; +import Hero from './components/Hero'; +import Features from './components/Features'; +import TerminalSimulator from './components/TerminalSimulator'; +import SetupGuide from './components/SetupGuide'; +import KeycapGallery from './components/KeycapGallery'; +import Footer from './components/Footer'; + +export default function App() { + const [activeView, setActiveView] = useState<'home' | 'keycaps'>('home'); + + return ( +
+ + {/* Dynamic Navigation bar */} + + + {/* Main page content layout with view switcher transitions */} +
+ + {activeView === 'home' ? ( + + {/* Hero & Official Announcement Card */} + + + {/* Core technical pillars section */} + + + {/* Live Interactive Terminal Simulator VNI Engine */} + + + {/* Step-by-step Linux System-Level Setup Guide */} + + + ) : ( + + {/* Trang phụ: 3D Transparent Resin Keycap Customizer & Gallery */} + + + )} + +
+ + {/* Footer component with social repository links & author credits */} +
+ +
+ ); +} diff --git a/web/src/components/DragonMascot.tsx b/web/src/components/DragonMascot.tsx new file mode 100644 index 0000000..7e42a53 --- /dev/null +++ b/web/src/components/DragonMascot.tsx @@ -0,0 +1,180 @@ +import React, { useState } from 'react'; +import { motion } from 'motion/react'; + +interface DragonMascotProps { + className?: string; + size?: number; + interactive?: boolean; +} + +export default function DragonMascot({ className = '', size = 150, interactive = true }: DragonMascotProps) { + const [isClicked, setIsClicked] = useState(false); + const [isHovered, setIsHovered] = useState(false); + + const handleClick = () => { + if (!interactive) return; + setIsClicked(true); + setTimeout(() => setIsClicked(false), 800); + }; + + return ( +
interactive && setIsHovered(true)} + onMouseLeave={() => interactive && setIsHovered(false)} + > + + {/* Left ear */} + + + + {/* Right ear */} + + + + {/* Main head - bigger, fills more of the viewbox */} + + + {/* Head highlight */} + + + {/* Cheeks */} + + + + {/* Horns */} + + + + + + + {/* Forehead ridges */} + + + + {/* Snout */} + + + + {/* Nostrils */} + + + + {/* Blush */} + + + + {/* Eyes */} + + + + + + + + + + + + + + + + + + + + {/* Smile */} + {isHovered || isClicked ? ( + + + + + + + ) : ( + + + + + + )} + + + {interactive && ( + + {isClicked ? "Rawrr! ^_^" : "Click me!"} + + )} +
+ ); +} diff --git a/web/src/components/Features.tsx b/web/src/components/Features.tsx new file mode 100644 index 0000000..f1719f5 --- /dev/null +++ b/web/src/components/Features.tsx @@ -0,0 +1,188 @@ +import React, { useState } from 'react'; +import { motion } from 'motion/react'; +import { ShieldCheck, Cpu, GitCompare, HelpCircle, Layers, ArrowRight } from 'lucide-react'; + +export default function Features() { + const [hoveredState, setHoveredState] = useState(null); + + const stateDetails = [ + { + id: 0, + name: "S0 - Idle (Chờ phím)", + desc: "Trạng thái nghỉ ngơi ban đầu. VietC lắng nghe thụ động thiết bị đầu vào evdev mà không can thiệp, đảm bảo CPU tiêu thụ ~0%." + }, + { + id: 1, + name: "S1 - Vowel Buffer (Thu nhận nguyên âm)", + desc: "Kích hoạt khi phát hiện nguyên âm gốc (a, e, o, u, y, i). VietC tạo bộ đệm từ cục bộ để chuẩn bị ghép dấu thanh." + }, + { + id: 2, + name: "S2 - Accent Applied (Tạo dấu thanh)", + desc: "Nạp các phím gõ dấu thanh VNI (1-5). Thuật toán tối ưu hóa vị trí đặt dấu theo đúng ngữ pháp Việt ngữ chuẩn." + }, + { + id: 3, + name: "S3 - Modifiers (Ký tự đặc biệt)", + desc: "Áp dụng mũ/râu (6-9) để biến đổi thành ă, â, đ, ê, ô, ơ, ư. Kết thúc chu kỳ xử lý và sẵn sàng phát phím uinput mới." + } + ]; + + return ( +
+
+ + {/* Section Title */} +
+ + + HOW IT WORKS + + + Sự Khác Biệt Làm Nên Sức Mạnh VietC + +

+ VietC được phát triển dựa trên 3 trụ cột kỹ thuật cốt lõi giúp tối đa hóa tốc độ, độ ổn định tuyệt đối và khả năng tương thích 100% với môi trường giả lập Linux Terminal. +

+
+ + {/* 3 Pillars Grid */} +
+ + {/* Pillar 1: State Machine */} +
+
+
+ +
+

+ 1. State Machine Deterministic +

+

+ Sử dụng mô hình toán học Finite State Machine (FSM) tất định để phân tích tổ hợp phím gõ tiếng Việt. Mọi ký tự được tính toán rõ ràng giúp tránh tình trạng xung đột, mất từ hoặc sai vị trí đặt dấu khi gõ nhanh. +

+
+
+ S0 (Chờ) → S1 (Gõ) → S2 (Dấu) → S3 (Chữ mũ) +
+
+ + {/* Pillar 2: Token-Level Diffing */} +
+
+
+ +
+

+ 2. Token-Level Diffing +

+

+ Thay vì xóa trắng toàn bộ từ hoặc phát lại một loạt phím Backspace dồn dập gây giật màn hình trong Terminal, VietC tính toán sự khác biệt nhỏ nhất giữa từ đã gõ và từ mong muốn để thay thế cục bộ tức thì. +

+
+
+ trang thái + + trạng thái [1ms] +
+
+ + {/* Pillar 3: Privacy-First Event Sourcing */} +
+
+
+ +
+

+ 3. Privacy-First Event Sourcing +

+

+ Xử lý sự kiện bàn phím theo luồng độc lập dưới quyền user thông qua uinput cục bộ. VietC nói KHÔNG với kết nối Internet, đảm bảo toàn bộ mật khẩu, lệnh Terminal nhạy cảm luôn được bảo vệ an toàn tuyệt đối. +

+
+
+ Kiểm soát cục bộ 100% • Không thu thập dữ liệu +
+
+ +
+ + {/* Detalized State Machine Explanation Block */} +
+ + {/* Diagrams Left */} +
+

+ Tìm Hiểu Trạng Thái Finite State Machine +

+

+ Khi bạn gõ phím, VietC không lưu trữ ký tự dưới dạng văn bản tĩnh thô sơ. Hệ thống sẽ thay đổi các nút liên kết (S0, S1, S2, S3) dựa trên loại phím nhận được để tính toán cách phản hồi phím nhanh nhất. Di chuột vào các nút dưới đây để xem mô tả: +

+ +
+ {stateDetails.map((det) => ( +
setHoveredState(det.id)} + onMouseLeave={() => setHoveredState(null)} + className={`p-3 rounded-xl border transition-all cursor-pointer ${ + hoveredState === det.id + ? 'bg-emerald-500/10 border-emerald-500 text-emerald-300' + : 'bg-[#0a0b0d] border-white/5 text-slate-400 hover:border-emerald-500/30' + }`} + > +
+ Trạng thái S{det.id} +
+
+ {det.name.split(' - ')[1]} +
+
+ ))} +
+
+ + {/* Interactive State explanation box Right */} +
+ {hoveredState !== null ? ( + +
+ SỰ KIỆN ĐANG HOẠT ĐỘNG: S{hoveredState} +
+

+ {stateDetails[hoveredState].name} +

+

+ {stateDetails[hoveredState].desc} +

+
+ ) : ( +
+ + Hãy di chuột qua các nút trạng thái bên cạnh để khám phá cách thiết lập hệ thống logic gõ phím tất định của VietC! +
+ )} +
+ +
+ +
+
+ ); +} diff --git a/web/src/components/Footer.tsx b/web/src/components/Footer.tsx new file mode 100644 index 0000000..c86f4d7 --- /dev/null +++ b/web/src/components/Footer.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { Github, Heart, MessageSquare } from 'lucide-react'; +import DragonMascot from './DragonMascot'; + +export default function Footer() { + return ( +
+
+ + {/* Left branding */} +
+
+ +
+
+ + VietC Project + + + Bàn phím cơ & Bộ gõ tiếng Việt mức thấp cho Linux Terminal + +
+
+ + {/* Center Credits */} +
+
+ Phát triển bởi vndangkhoa +
+
+ Made with + + for Vietnamese Linux Community +
+
+ + {/* Right External Links */} + + +
+ +
+ © {new Date().getFullYear()} VietC. Phát hành theo Giấy phép Apache-2.0 / MIT. +
+
+ ); +} diff --git a/web/src/components/Hero.tsx b/web/src/components/Hero.tsx new file mode 100644 index 0000000..a27dd96 --- /dev/null +++ b/web/src/components/Hero.tsx @@ -0,0 +1,156 @@ +import React from 'react'; +import { motion } from 'motion/react'; +import { Terminal, ArrowRight, Sparkles, Shield, Cpu, Zap, Download } from 'lucide-react'; +import DragonMascot from './DragonMascot'; + +interface HeroProps { + setActiveView: (view: 'home' | 'keycaps') => void; +} + +export default function Hero({ setActiveView }: HeroProps) { + const scrollToDemo = () => { + document.getElementById('demo')?.scrollIntoView({ behavior: 'smooth' }); + }; + + const scrollToSetup = () => { + document.getElementById('setup-guide')?.scrollIntoView({ behavior: 'smooth' }); + }; + + return ( +
+ + {/* Background ambient lighting */} +
+
+ +
+ + {/* LEFT COLUMN: Main Presentation & CTAs */} +
+ + {/* Version badge */} + + + VietC v1.2.0 - Native Linux Input Mode + + + + Gõ Tiếng Việt
+ + "Như Bay" +
+ Mượt Mà Trên Linux! +
+ +

+ VietC là giải pháp nhập liệu mã nguồn mở hiện đại cho môi trường Linux, tối ưu hóa tốc độ và sự đơn giản với linh vật chú rồng con Long-kun. Không qua IBus/Fcitx5 phức tạp, giải quyết triệt để lỗi nuốt phím và lag chữ. +

+ + {/* Quick Metrics */} +
+
+ Keystroke + 0ms +
+
+ IBus/Fcitx5 + Bypass +
+
+ Trễ Phím + Giảm 20x +
+
+ + {/* Action buttons */} +
+ + + +
+ +
+ + {/* RIGHT COLUMN: Official Announcement Card */} +
+ + + {/* Soft inner corner borders */} +
+
+
+
+ + {/* Mascot on top of announcement */} +
+ +

+ VIETC. +

+
+ + {/* Official Announcement body */} +
+ +
+ + TUYÊN BỐ CHÍNH THỨC + +
+ +

+ Để đơn giản hóa tối đa việc gõ VNI trên Terminal bấy lâu nay vô cùng ‘gian khổ’ cho dân Linux, VIETC tự hào công bố đã support native gõ VNI trên Terminal. +

+ +

+ Quý khách có thể tải toàn bộ các bản thiết kế 3D phím Numlock và Keycap trên website VIETC xuống. Sau đấy, tận dụng trí tưởng tượng phong phú để lắp ghép và trải nghiệm cảm giác ‘gõ như bay’ ngay trên Terminal ảo của bạn mà không cần bất kỳ phần cứng vật lý nào. +

+ +
+ + {/* Try online indicator */} +
+ +
+ + + +
+ +
+ +
+ ); +} diff --git a/web/src/components/KeycapGallery.tsx b/web/src/components/KeycapGallery.tsx new file mode 100644 index 0000000..a6a9b89 --- /dev/null +++ b/web/src/components/KeycapGallery.tsx @@ -0,0 +1,475 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { Download, Sliders, Palette, Lightbulb, Type, Layers, CheckCircle2, Star, Sparkles, AlertCircle } from 'lucide-react'; +import { KeycapCustomization, KeycapModel } from '../types'; +import DragonMascot from './DragonMascot'; + +export default function KeycapGallery() { + const [custom, setCustom] = useState({ + baseColor: '#0E7490', // Cyan 700 + stemColor: '#10B981', // Emerald 500 + dragonColor: '#3B82F6', // Blue 500 + material: 'resin_clear', + ledColor: '#06B6D4', // Cyan 500 + ledIntensity: 75, + selectedLetter: 'đ', + showStem: true + }); + + const [downloadingId, setDownloadingId] = useState(null); + const [downloadProgress, setDownloadProgress] = useState(0); + const [showSuccessToast, setShowSuccessToast] = useState(false); + const [toastMessage, setToastMessage] = useState(''); + + const lettersList = ['ă', 'â', 'đ', 'ê', 'ô', 'ơ', 'ư', 's (́)', 'f (̀)', 'r (̉)', 'x (̃)', 'j (̣)']; + + const colorPresets = [ + { name: 'Rồng Biển Trầm', value: '#0E7490', text: 'text-cyan-400' }, + { name: 'Ngọc Lục Bảo', value: '#047857', text: 'text-emerald-400' }, + { name: 'Hồng Anh Đào', value: '#BE185D', text: 'text-pink-400' }, + { name: 'Hổ Phách Sáng', value: '#B45309', text: 'text-amber-400' }, + { name: 'Thạch Anh Tím', value: '#6D28D9', text: 'text-violet-400' }, + { name: 'Khói Obsidian', value: '#374151', text: 'text-slate-400' } + ]; + + const ledPresets = [ + { name: 'Cyan Neon', value: '#06B6D4' }, + { name: 'Toxic Green', value: '#10B981' }, + { name: 'Sunset Orange', value: '#F97316' }, + { name: 'Sakura Pink', value: '#EC4899' }, + { name: 'Chroma RGB', value: '#8B5CF6' } + ]; + + const keycapModels: KeycapModel[] = [ + { + id: 'dragon_keycap_oem', + name: 'Rồng Con OEM Esc Keycap', + letter: 'ESC', + desc: 'Mẫu phím cơ Esc chứa rồng con dễ thương ở trung tâm, đúc khuôn resin thủ công siêu chi tiết.', + rarity: 'Legendary', + stlUrl: 'vietc_dragon_esc_oem.stl' + }, + { + id: 'vietnamese_diacritic_caps', + name: 'Bộ Ký Tự Nguyên Âm Tiếng Việt', + letter: 'ă/â/đ/ê/ô/ơ/ư', + desc: 'Trọn bộ keycap các chữ cái đặc trưng và bộ thanh dấu trong tiếng Việt dành cho hàng phím Alpha.', + rarity: 'Epic', + stlUrl: 'vietc_vietnamese_alphas.zip' + }, + { + id: 'numlock_dragon_plate', + name: 'Tấm Ốp Phím Numlock 3D', + letter: 'NUM', + desc: 'Bản thiết kế ốp bàn phím số cơ phong cách Rồng Con đan xen các vảy rồng bảo vệ cực chất.', + rarity: 'Rare', + stlUrl: 'vietc_numlock_plate.stl' + }, + { + id: 'dragon_spacebar_625u', + name: 'Thanh Spacebar Thủy Cung Rồng Con 6.25u', + letter: 'SPACE', + desc: 'Thanh phím dài uốn lượn phong cách rồng con bay lượn dưới đáy đại dương resin trong suốt.', + rarity: 'Legendary', + stlUrl: 'vietc_spacebar_dragon.stl' + } + ]; + + const startDownload = (model: KeycapModel) => { + if (downloadingId) return; + setDownloadingId(model.id); + setDownloadProgress(0); + + const interval = setInterval(() => { + setDownloadProgress(p => { + if (p >= 100) { + clearInterval(interval); + setTimeout(() => { + setDownloadingId(null); + setToastMessage(`Đã tải về thành công tệp thiết kế 3D: ${model.stlUrl}! Sẵn sàng để in 3D FDM/SLA.`); + setShowSuccessToast(true); + setTimeout(() => setShowSuccessToast(false), 4500); + }, 400); + return 100; + } + return p + 5 + Math.floor(Math.random() * 8); + }); + }, 120); + }; + + // Compute CSS styles based on material + const getMaterialStyles = () => { + switch (custom.material) { + case 'resin_frosted': + return { + backdropFilter: 'blur(8px)', + background: `rgba(${hexToRgb(custom.baseColor)}, 0.45)`, + border: '1px solid rgba(255, 255, 255, 0.25)', + boxShadow: `inset 0 0 15px rgba(255, 255, 255, 0.3), 0 0 25px ${custom.ledColor}${Math.floor(custom.ledIntensity / 100 * 255).toString(16)}` + }; + case 'glass': + return { + backdropFilter: 'blur(3px)', + background: `rgba(${hexToRgb(custom.baseColor)}, 0.25)`, + border: '1px solid rgba(255, 255, 255, 0.4)', + boxShadow: `inset 0 0 20px rgba(255, 255, 255, 0.4), 0 0 35px ${custom.ledColor}${Math.floor(custom.ledIntensity / 100 * 255).toString(16)}` + }; + case 'matte': + return { + background: custom.baseColor, + border: '1px solid rgba(0, 0, 0, 0.3)', + boxShadow: 'inset 0 4px 6px rgba(255, 255, 255, 0.1), inset 0 -4px 6px rgba(0, 0, 0, 0.2)' + }; + default: // resin_clear + return { + backdropFilter: 'blur(1px)', + background: `rgba(${hexToRgb(custom.baseColor)}, 0.65)`, + border: '1px solid rgba(255, 255, 255, 0.35)', + boxShadow: `inset 0 0 10px rgba(255, 255, 255, 0.4), 0 0 25px ${custom.ledColor}${Math.floor(custom.ledIntensity / 100 * 255).toString(16)}` + }; + } + }; + + // Helper to convert hex to rgb + function hexToRgb(hex: string): string { + const bigint = parseInt(hex.replace('#', ''), 16); + const r = (bigint >> 16) & 255; + const g = (bigint >> 8) & 255; + const b = bigint & 255; + return `${r}, ${g}, ${b}`; + } + + return ( +
+
+ + {/* Section Header */} +
+ + + ARTISAN 3D KEYCAPS + + +

+ Trang Trí Phím Cơ VietC Resin 3D +

+

+ Như công bố chính thức, VietC không chỉ là phần mềm gõ phím, chúng tôi chia sẻ bản vẽ thiết kế 3D hoàn toàn miễn phí của Mascot Rồng Con Resin trong suốt và bộ ký tự dấu mũ tiếng Việt để bạn tự in 3D cá nhân hóa bàn phím cơ của mình! +

+
+ + {/* WORKSPACE: Customizer on the left, interactive keycap on the right */} +
+ + {/* Controls Panel (6 cols) */} +
+
+ +

Bảng Điều Khiển Tùy Biến 3D

+
+ + {/* Vải Màu Resin */} +
+ +
+ {colorPresets.map((preset) => ( + + ))} +
+
+ + {/* Chất liệu Resin */} +
+ +
+ {[ + { id: 'resin_clear', name: 'Trong Suốt' }, + { id: 'resin_frosted', name: 'Nhám Mờ' }, + { id: 'glass', name: 'Thạch Anh' }, + { id: 'matte', name: 'Nhựa Đục' } + ].map((mat) => ( + + ))} +
+
+ + {/* Ký Tự Tiếng Việt */} +
+ +
+ {lettersList.map((letItem) => ( + + ))} +
+
+ + {/* Đèn LED gầm (Underglow) */} +
+
+ + {custom.ledIntensity}% Độ sáng +
+ +
+ {ledPresets.map((preset) => ( +
+ + setCustom(prev => ({ ...prev, ledIntensity: parseInt(e.target.value) }))} + className="w-full h-1 bg-[#0d0e12] rounded-lg appearance-none cursor-pointer accent-emerald-500" + /> +
+ +
+ + {/* Interactive 3D Render Viewer (6 cols) */} +
+ + {/* Grid background effect */} +
+ + {/* Floating glowing indicator */} +
+ + 3D RENDER PREVIEW +
+ + {/* Rotating 3D Keycap Stage Container */} +
+ + {/* LED Underglow radial halo */} +
+ + {/* The Keycap Body Wrapper (3D effect) */} + + + {/* 1. KEYCAP BASE / STEM (Inner structure visible through clear resin) */} + {custom.material !== 'matte' && ( +
+ {/* The mechanical switch cross stem (+) inside */} +
+
+
+
+
+ )} + + {/* 2. CUTE MASCOT DRAGON RESTING INSIDE */} +
+ +
+ + {/* 3. TRANSPARENT RESIN OUTER SHELL (Styled with standard custom glassmorphism) */} +
+ {/* Vietnamese Letter Engraving on top facet */} +
+ + {custom.selectedLetter.split(' ')[0]} + +
+ + {/* Aesthetic detail: micro-bubbles or text inside */} +
+ VIETC 3D + OEM-R1 +
+
+ + {/* Bottom Base rim */} +
+ + + +
+ + {/* Customizer Instructions */} +
+ + Góc xoay 3D giả lập trực quan 360° +
+ +
+ +
+ + {/* 3D PRINTING FILES DOWNLOAD SECTION */} +
+

+ + Tải Về File Thiết Kế 3D Miễn Phí (STL/OBJ) +

+ +
+ {keycapModels.map((model) => ( +
+
+ {/* Rarity and Rating info */} +
+ + {model.rarity} Design + +
+ + + + + +
+
+ +

+ {model.name} +

+

+ {model.desc} +

+
+ +
+
+ Định dạng: STL / STEP + FREE +
+ + {downloadingId === model.id ? ( +
+
+ Đang tải... + {downloadProgress}% +
+
+
+
+
+ ) : ( + + )} +
+
+ ))} +
+
+ + {/* Global Action Toast Notification */} + + {showSuccessToast && ( + + +
+

Bắt đầu tải file 3D

+

+ {toastMessage} +

+
+
+ )} +
+ +
+
+ ); +} diff --git a/web/src/components/Navbar.tsx b/web/src/components/Navbar.tsx new file mode 100644 index 0000000..30578f7 --- /dev/null +++ b/web/src/components/Navbar.tsx @@ -0,0 +1,122 @@ +import React from 'react'; +import { motion } from 'motion/react'; +import { Github, Key, Terminal, Code, Home, Sparkles } from 'lucide-react'; +import DragonMascot from './DragonMascot'; + +interface NavbarProps { + activeView: 'home' | 'keycaps'; + setActiveView: (view: 'home' | 'keycaps') => void; +} + +export default function Navbar({ activeView, setActiveView }: NavbarProps) { + const scrollToId = (id: string) => { + // Switch to home first if on keycaps and clicking scroll targets + if (activeView !== 'home') { + setActiveView('home'); + setTimeout(() => { + document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' }); + }, 150); + } else { + document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' }); + } + }; + + return ( + + ); +} diff --git a/web/src/components/SetupGuide.tsx b/web/src/components/SetupGuide.tsx new file mode 100644 index 0000000..0d27c78 --- /dev/null +++ b/web/src/components/SetupGuide.tsx @@ -0,0 +1,379 @@ +import React, { useState } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { Copy, Check, Terminal, Shield, Cpu, RefreshCw, Layers, GitBranch, Hammer } from 'lucide-react'; +import { SetupStep } from '../types'; + +type TabId = 'mint_ubuntu' | 'arch' | 'fedora' | 'dev'; + +export default function SetupGuide() { + const [activeTab, setActiveTab] = useState('mint_ubuntu'); + const [copiedText, setCopiedText] = useState(null); + + const handleCopy = (text: string, id: string) => { + navigator.clipboard.writeText(text); + setCopiedText(id); + setTimeout(() => setCopiedText(null), 2000); + }; + + const installSteps: Record, SetupStep[]> = { + mint_ubuntu: [ + { + id: 1, + title: "Cài đặt VietC (Pre-built)", + description: "Chạy lệnh dưới đây để tự động tải về, cài đặt phụ thuộc và biên dịch VietC trên hệ thống của bạn.", + command: `git clone https://github.com/vndangkhoa/vietc.git /tmp/vietc \\ + && cd /tmp/vietc && sudo ./install.sh`, + notes: "Script tự động phát hiện distro, cài đặt dependencies, build và cấu hình udev rules cho uinput." + }, + { + id: 2, + title: "Gỡ cài đặt (Uninstall)", + description: "Xoá hoàn toàn VietC khỏi hệ thống, bao gồm binary, service và udev rules.", + command: `curl -sSL https://raw.githubusercontent.com/vndangkhoa/vietc/main/uninstall.sh | sudo bash`, + notes: "Lệnh này sẽ xoá /usr/local/bin/vietc, systemd service và các file cấu hình." + } + ], + arch: [ + { + id: 1, + title: "Cài đặt VietC (Pre-built)", + description: "Tự động clone, build và cài đặt VietC trên Arch Linux.", + command: `git clone https://github.com/vndangkhoa/vietc.git /tmp/vietc \\ + && cd /tmp/vietc && sudo ./install.sh`, + notes: "Script hỗ trợ pacman, tự động cài đặt base-devel và các thư viện cần thiết." + }, + { + id: 2, + title: "Gỡ cài đặt (Uninstall)", + description: "Xoá VietC hoàn toàn khỏi hệ thống Arch.", + command: `curl -sSL https://raw.githubusercontent.com/vndangkhoa/vietc/main/uninstall.sh | sudo bash`, + } + ], + fedora: [ + { + id: 1, + title: "Cài đặt VietC (Pre-built)", + description: "Tự động clone, build và cài đặt VietC trên Fedora.", + command: `git clone https://github.com/vndangkhoa/vietc.git /tmp/vietc \\ + && cd /tmp/vietc && sudo ./install.sh`, + notes: "Script hỗ trợ dnf, tự động cài đặt Development Tools và thư viện X11." + }, + { + id: 2, + title: "Gỡ cài đặt (Uninstall)", + description: "Xoá VietC hoàn toàn khỏi hệ thống Fedora.", + command: `curl -sSL https://raw.githubusercontent.com/vndangkhoa/vietc/main/uninstall.sh | sudo bash`, + } + ] + }; + + const devSteps: SetupStep[] = [ + { + id: 1, + title: "Clone mã nguồn", + description: "Nhánh main chứa code mới nhất.", + command: `git clone https://github.com/vndangkhoa/vietc.git +cd vietc`, + }, + { + id: 2, + title: "Cài đặt Rust (nếu chưa có)", + description: "Dùng rustup để cài Rust toolchain mới nhất.", + command: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +source "$HOME/.cargo/env"`, + notes: "Kiểm tra với 'rustc --version' và 'cargo --version'." + }, + { + id: 3, + title: "Cài đặt hệ thống phụ thuộc", + description: "Thư viện dev cho X11, evdev và dbus.", + command: `sudo apt install build-essential pkg-config libx11-dev libxtst-dev \\ + libevdev-dev libdbus-1-dev libwayland-dev wl-clipboard`, + notes: "Trên Fedora: dnf install; trên Arch: pacman -S. Xem install.sh để biết chi tiết." + }, + { + id: 4, + title: "Biên dịch (debug)", + description: "Build nhanh không tối ưu, phù hợp khi phát triển.", + command: `cargo build`, + notes: "Binary ở target/debug/vietc. Chạy thử: ./target/debug/vietc" + }, + { + id: 5, + title: "Biên dịch (release - tối ưu)", + description: "Build với tối ưu hóa cho hiệu năng cao nhất.", + command: `cargo build --release`, + notes: "Binary ở target/release/vietc. Chạy thử: ./target/release/vietc" + }, + { + id: 6, + title: "Cấp quyền uinput", + description: "VietC cần quyền ghi /dev/uinput. Thêm user vào group input và uinput.", + command: `sudo gpasswd -a $USER input +sudo groupadd -f uinput +sudo gpasswd -a $USER uinput +echo 'KERNEL=="uinput", GROUP="uinput", MODE="0660", OPTIONS+="static_node=uinput"' | sudo tee /etc/udev/rules.d/99-vietc.rules +sudo udevadm control --reload-rules && sudo udevadm trigger`, + notes: "Đăng xuất và đăng nhập lại (hoặc reboot) để group có hiệu lực." + }, + { + id: 7, + title: "Chạy thử (không cần cài đặt)", + description: "Chạy trực tiếp từ thư mục build, không cần systemd service.", + command: `./target/release/vietc`, + notes: "Tắt bằng Ctrl+C. Có thể chạy ở chế độ nền với '&' và dùng 'fg' để đưa lên foreground." + } + ]; + + const tabs: { id: TabId; label: string; icon?: React.ReactNode }[] = [ + { id: 'mint_ubuntu', label: 'Mint / Ubuntu' }, + { id: 'arch', label: 'Arch Linux' }, + { id: 'fedora', label: 'Fedora' }, + { id: 'dev', label: 'Dev Build', icon: }, + ]; + + return ( +
+
+ + {/* Section Header */} +
+ + + NATIVE LINUX INTEGRATION + + + Hướng Dẫn Cài Đặt VietC + +

+ Vì VietC là bộ gõ mức thấp (System & Application level) không phụ thuộc IBus hay Fcitx5, việc cài đặt sẽ tác động trực tiếp lên driver uinput hệ thống để đạt tốc độ gõ tuyệt đối. +

+
+ + {/* Tabs */} +
+
+ {tabs.map((tab) => ( + + ))} +
+
+ + {/* Content */} + {activeTab === 'dev' ? ( +
+
+ +

Build từ mã nguồn (dành cho Developer)

+
+

+ Các bước dưới đây hướng dẫn bạn tự biên dịch VietC từ source, chạy thử mà không cần cài đặt + system-wide. Phù hợp cho developer muốn đóng góp hoặc tùy chỉnh. +

+ +
+ {devSteps.map((step, idx) => ( + + {idx !== devSteps.length - 1 && ( +
+ )} + +
+
+ 0{step.id} +
+ +
+

+ {step.title} +

+

+ {step.description} +

+ + {step.command && ( +
+
+
+
+
+
+ BASH TERMINAL +
+ +
+
+ {step.command} +
+
+ )} + + {step.notes && ( +
+ +
+ Lưu ý: {step.notes} +
+
+ )} +
+
+ + ))} +
+
+ ) : ( +
+ {installSteps[activeTab].map((step, idx) => ( + + {idx !== installSteps[activeTab].length - 1 && ( +
+ )} + +
+
+ 0{step.id} +
+ +
+
+

+ {step.title} +

+
+ +

+ {step.description} +

+ + {step.command && ( +
+
+
+
+
+
+ BASH TERMINAL +
+ +
+
+ {step.command} +
+
+ )} + + {step.notes && ( +
+ +
+ Lưu ý: {step.notes} +
+
+ )} +
+
+ + ))} +
+ )} + + {/* Architecture graphic */} +
+

+ + Mô Hình Hoạt Động Khác Biệt của VietC +

+
+
+
+ OLD +
+

IBus / Fcitx5

+

+ Hoạt động ở Application Layer qua cơ chế giao tiếp DBus phức tạp. Khi gõ trong Terminal ảo, các lệnh Backspace/Delete giả lập thường bị trễ hoặc nuốt ký tự gây lỗi nhân đôi hoặc mất chữ. +

+
+ +
+
+ NEW +
+

VietC (uinput + evdev)

+

+ Chặn (grab) sự kiện gốc từ bàn phím vật lý thông qua driver evdev, sau đó tự tính toán bằng State Machine và xuất ra bàn phím ảo mới thông qua uinput. +

+
+ +
+
+ WIN +
+

Trải Nghiệm "Như Bay"

+

+ Độ trễ phản hồi phím Keystroke: 0ms và giải phóng nút <1ms. Gõ tiếng Việt gốc 100% không bị lag, không kén Terminal nào (Alacritty, Kitty, GNOME Terminal, v.v.). +

+
+
+
+ +
+
+ ); +} diff --git a/web/src/components/TerminalSimulator.tsx b/web/src/components/TerminalSimulator.tsx new file mode 100644 index 0000000..ce860a8 --- /dev/null +++ b/web/src/components/TerminalSimulator.tsx @@ -0,0 +1,347 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { motion, AnimatePresence } from 'motion/react'; +import { Terminal, Send, Play, RefreshCw, Zap, Cpu, Lock, HelpCircle } from 'lucide-react'; +import { parseVni } from '../utils/vniParser'; +import { TerminalLog } from '../types'; + +export default function TerminalSimulator() { + const [inputText, setInputText] = useState(''); + const [typedOutput, setTypedOutput] = useState(''); + const [imeState, setImeState] = useState('S0'); + const [terminalLogs, setTerminalLogs] = useState([]); + const [isTypingDemo, setIsTypingDemo] = useState(false); + const logEndRef = useRef(null); + const logContainerRef = useRef(null); + + // Suggested pre-recorded typing strings (VNI sequence) + const presets = [ + { label: "Gõ 'Việt Nam'", code: "Vie6t5 Nam" }, + { label: "Gõ 'tiếng việt'", code: "tie61ng vie6t5" }, + { label: "Gõ 'đường sá'", code: "d9uo7ng2 sa1" }, + { label: "Gõ 'rồng con'", code: "ro6ng2 con" }, + ]; + + // Process live input + useEffect(() => { + const result = parseVni(inputText); + setTypedOutput(result.text); + setImeState(result.state); + + // Convert string logs into TerminalLog structures + const parsedLogs: TerminalLog[] = result.logs.map((logStr, idx) => ({ + id: `log-${idx}-${Date.now()}`, + type: logStr.includes('Diffing') ? 'diff' : logStr.includes('uinput') ? 'ime_state' : 'system', + text: logStr, + timestamp: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }) + })); + setTerminalLogs(parsedLogs); + }, [inputText]); + + // Auto-scroll the log container to the bottom when new events arrive. + // Uses scrollTop on the container (never scrollIntoView, which scrolls the page). + useEffect(() => { + if (logContainerRef.current) { + logContainerRef.current.scrollTop = logContainerRef.current.scrollHeight; + } + }, [terminalLogs]); + + // Simulate automated character-by-character typing demo + const startDemo = async (vniString: string) => { + if (isTypingDemo) return; + setIsTypingDemo(true); + setInputText(''); + + let current = ''; + for (let i = 0; i < vniString.length; i++) { + await new Promise(resolve => setTimeout(resolve, 200 + Math.random() * 150)); + current += vniString[i]; + setInputText(current); + } + setIsTypingDemo(false); + }; + + const handleClear = () => { + setInputText(''); + setTypedOutput(''); + setImeState('S0'); + setTerminalLogs([]); + }; + + return ( +
+
+ + {/* Section Header */} +
+ + + INTERACTIVE EXPERIMENT + + +

+ Trải Nghiệm VietC Simulator +

+

+ Hãy tự tay gõ chuỗi phím VNI hoặc chọn các mẫu gõ nhanh dưới đây để xem cách State Machine của VietC biên dịch và gửi tín hiệu trực tiếp lên Linux Terminal ảo cực mượt. +

+
+ + {/* Interactive Workspace Grid */} +
+ + {/* LEFT: The Linux Terminal Emulator (7 cols) */} +
+ + {/* Terminal Window Chrome Title bar */} +
+
+
+
+
+ + + vietc@linuxmint-terminal: ~ + +
+
+ + VIETC: ON (Double Shift) + +
+
+ + {/* Terminal Screen Body */} +
+
+
VietC uinput Emulator Engine v1.2.0 (x86_64-linux-mint)
+
Trạng thái: Hoạt động trực tiếp ở driver nhân (kernel space)...
+
Gõ phím số 1-9 để gõ dấu VNI (vd: 'ro6ngs2' hoặc 'ro6ng2' → rồng).
+
+ + {/* History Console Feed */} +
+
# Gõ tiếng Việt cực nhanh không cần DBus/IBus
+
+ user@mint:~$ + cat vietc_stats.txt +
+
+
+ Keystroke Latency: 0ms (Mức phần cứng)
+
+ Press-Release Latency: <1ms (Driver-level)
+
+ Event Type: evdev grab / virtual uinput raw keypress
+
+ Memory footprint: ~1.2 MB
+
+
+ + {/* Interactive Terminal Line */} +
+
+ + vietc@linuxmint-terminal:~$ + + setInputText(e.target.value)} + disabled={isTypingDemo} + placeholder="Gõ VNI tại đây (vd: Vie6t1 Nam)..." + className="flex-1 bg-transparent border-none text-slate-100 placeholder-slate-600 focus:outline-none font-mono text-sm" + autoFocus + /> + {inputText && ( + + )} +
+
+ + {/* Converted Output */} +
+ + > + + + {typedOutput || Kết quả tiếng Việt sẽ hiện ở đây...} + + {typedOutput && ( + + )} +
+ +
+ + {/* Quick Demo bar */} +
+ Gợi ý gõ nhanh: + {presets.map((preset, idx) => ( + + ))} +
+
+ + {/* RIGHT: Real-time Monitor & Event Logs (5 cols) */} +
+ + {/* Header */} +
+
+ + Màn Hình Kiểm Soát VietC +
+
+ + Live Monitor +
+
+ + {/* State Machine Visualization */} +
+
+ Deterministic State Machine + Sự thay đổi trạng thái gốc +
+ +
+ {/* Horizontal progress background bar */} +
+ + {/* S0 */} +
+
+ S0 +
+ Chờ phím +
+ + {/* S1 */} +
+
+ S1 +
+ Nguyên âm +
+ + {/* S2 */} +
+
+ S2 +
+ Dấu thanh +
+ + {/* S3 */} +
+
+ S3 +
+ Ký tự phụ +
+
+
+ + {/* Core Specs metrics */} +
+
+
Keystroke
+
0 ms
+
+
+
Press-Release
+
<1 ms
+
+
+
Clipboard
+
1 ms
+
+
+ + {/* Event Log Stream */} +
+ Sự Kiện Thiết Bị Thấp (uinput Event Logs) + Thời gian thực +
+ +
+ + {terminalLogs.map((log) => ( + +
+ + + {log.type.toUpperCase()} + + {log.timestamp} +
+
+ {log.text} +
+
+ ))} +
+ + {terminalLogs.length === 0 && ( +
+ Gõ phím hoặc chọn mẫu để hiển thị logs sự kiện nhân (kernel event logs) +
+ )} +
+
+ + {/* Privacy note */} +
+ + An toàn & Bảo mật: VietC thu thập sự kiện phím tại local và không bao giờ gửi bất kỳ dữ liệu nào qua mạng Internet. +
+ +
+ +
+ +
+
+ ); +} diff --git a/web/src/index.css b/web/src/index.css new file mode 100644 index 0000000..d447756 --- /dev/null +++ b/web/src/index.css @@ -0,0 +1,26 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;950&family=JetBrains+Mono:wght@400;500;700&family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap'); +@import "tailwindcss"; + +@theme { + --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif; + --font-serif: "Playfair Display", Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; +} + +/* Hide all scrollbars */ +*::-webkit-scrollbar { + display: none; +} +* { + scrollbar-width: none; + -ms-overflow-style: none; +} + +/* Custom 3D Perspective Utility class */ +.perspective-1000 { + perspective: 1000px; +} + +.transform-style-3d { + transform-style: preserve-3d; +} diff --git a/web/src/main.tsx b/web/src/main.tsx new file mode 100644 index 0000000..080dac3 --- /dev/null +++ b/web/src/main.tsx @@ -0,0 +1,10 @@ +import {StrictMode} from 'react'; +import {createRoot} from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; + +createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/web/src/types.ts b/web/src/types.ts new file mode 100644 index 0000000..1976fc5 --- /dev/null +++ b/web/src/types.ts @@ -0,0 +1,35 @@ +export interface KeycapCustomization { + baseColor: string; + stemColor: string; + dragonColor: string; + material: 'resin_clear' | 'resin_frosted' | 'matte' | 'glass'; + ledColor: string; + ledIntensity: number; // 0 to 100 + selectedLetter: string; // e.g. "ă", "â", "đ", "ê", "ô", "ơ", "ư", "Sắc (s)", "Huyền (f)"... + showStem: boolean; +} + +export interface TerminalLog { + id: string; + type: 'input' | 'system' | 'ime_state' | 'diff'; + text: string; + timestamp: string; +} + +export interface SetupStep { + id: number; + title: string; + description: string; + command?: string; + notes?: string; +} + +export interface KeycapModel { + id: string; + name: string; + letter: string; + desc: string; + rarity: 'Common' | 'Rare' | 'Epic' | 'Legendary'; + price?: string; + stlUrl: string; +} diff --git a/web/src/utils/vniParser.ts b/web/src/utils/vniParser.ts new file mode 100644 index 0000000..66274b3 --- /dev/null +++ b/web/src/utils/vniParser.ts @@ -0,0 +1,233 @@ +// Simple VNI Vietnamese Parser & State Machine for the VietC Terminal simulator +// It processes VNI input (numbers 1-9 for diacritics) and returns the converted string +// and logs detailing the State Machine transitions and Token-Level Diffing. + +interface VniStateResult { + text: string; + logs: string[]; + state: string; // S0, S1, S2, S3 +} + +// Maps for tone accents on vowels +const ACUTE = '\u0301'; // Sắc (1) +const GRAVE = '\u0300'; // Huyền (2) +const HOOK = '\u0309'; // Hỏi (3) +const TILDE = '\u0303'; // Ngã (4) +const DOT = '\u0323'; // Nặng (5) + +const TONES_MAP: Record = { + '1': ACUTE, + '2': GRAVE, + '3': HOOK, + '4': TILDE, + '5': DOT, +}; + +// Maps for letter modifiers +// 6 -> â, ê, ô +// 7 -> ơ, ư +// 8 -> ă +// 9 -> đ +const MOD_6: Record = { + 'a': 'â', 'A': 'Â', + 'e': 'ê', 'E': 'Ê', + 'o': 'ô', 'O': 'Ô', +}; + +const MOD_7: Record = { + 'o': 'ơ', 'O': 'Ơ', + 'u': 'ư', 'U': 'Ư', +}; + +const MOD_8: Record = { + 'a': 'ă', 'A': 'Ă', +}; + +/** + * Normalizes combining diacritics to standard precomposed Vietnamese characters. + */ +function normalizeVietnamese(text: string): string { + return text.normalize('NFC'); +} + +/** + * Parse a full sentence/text typed in VNI. + * E.g., "tieengs vieetj" -> "tiếng việt" + * VNI: "vietetj" or "viet1" -> "viết" + * Let's process word by word. + */ +export function parseVni(inputText: string): VniStateResult { + const words = inputText.split(' '); + const processedWords: string[] = []; + const logs: string[] = []; + let currentState = 'S0'; + + for (let w = 0; w < words.length; w++) { + const word = words[w]; + if (!word) { + processedWords.push(''); + continue; + } + + let resultWord = ''; + let tone: string | null = null; + let dStroke = false; + + // We will build the word character-by-character + for (let i = 0; i < word.length; i++) { + const char = word[i]; + + // Check for Đ (9) + if (char === '9') { + const lastChar = resultWord[resultWord.length - 1]; + if (lastChar === 'd' || lastChar === 'D') { + resultWord = resultWord.slice(0, -1) + (lastChar === 'd' ? 'đ' : 'Đ'); + dStroke = true; + currentState = 'S3'; + logs.push(`[uinput / S3] Nhận phím '9': Chuyển đổi phụ âm '${lastChar}' -> 'đ' (Độ trễ: 0ms)`); + } else { + resultWord += '9'; + logs.push(`[uinput / S0] Nhận phím '9': Không khớp phụ âm d/D, giữ nguyên chữ '9'`); + } + continue; + } + + // Check for circumflex â, ê, ô (6) + if (char === '6') { + // Find last matching vowel in resultWord to apply modifier + let applied = false; + for (let j = resultWord.length - 1; j >= 0; j--) { + const c = resultWord[j]; + if (MOD_6[c]) { + resultWord = resultWord.substring(0, j) + MOD_6[c] + resultWord.substring(j + 1); + applied = true; + currentState = 'S3'; + logs.push(`[uinput / S3] Nhận phím '6': Thêm mũ ô/ê/â cho '${c}' -> '${MOD_6[c]}' (Độ trễ: 0ms)`); + break; + } + } + if (!applied) { + resultWord += '6'; + logs.push(`[uinput / S0] Nhận phím '6': Không tìm thấy nguyên âm thích hợp để đội mũ (giữ nguyên '6')`); + } + continue; + } + + // Check for horn ơ, ư (7) + if (char === '7') { + let applied = false; + for (let j = resultWord.length - 1; j >= 0; j--) { + const c = resultWord[j]; + if (MOD_7[c]) { + resultWord = resultWord.substring(0, j) + MOD_7[c] + resultWord.substring(j + 1); + // If 'o'->'ơ' preceded by 'u', merge to 'ươ' (standard VNI digraph) + if (MOD_7[c] === 'ơ' && j > 0 && (resultWord[j-1] === 'u' || resultWord[j-1] === 'U')) { + const prefix = resultWord.substring(0, j - 1); + const suffix = resultWord.substring(j + 1); + resultWord = prefix + (resultWord[j-1] === 'U' ? 'Ươ' : 'ươ') + suffix; + } + applied = true; + currentState = 'S3'; + logs.push(`[uinput / S3] Nhận phím '7': Thêm râu ơ/ư cho '${c}' -> '${MOD_7[c]}' (Độ trễ: 0ms)`); + break; + } + } + if (!applied) { + resultWord += '7'; + logs.push(`[uinput / S0] Nhận phím '7': Không tìm thấy nguyên âm o/u để thêm râu`); + } + continue; + } + + // Check for breve ă (8) + if (char === '8') { + let applied = false; + for (let j = resultWord.length - 1; j >= 0; j--) { + const c = resultWord[j]; + if (MOD_8[c]) { + resultWord = resultWord.substring(0, j) + MOD_8[c] + resultWord.substring(j + 1); + applied = true; + currentState = 'S3'; + logs.push(`[uinput / S3] Nhận phím '8': Thêm á cho '${c}' -> '${MOD_8[c]}' (Độ trễ: 0ms)`); + break; + } + } + if (!applied) { + resultWord += '8'; + logs.push(`[uinput / S0] Nhận phím '8': Không tìm thấy nguyên âm a để chuyển thành ă`); + } + continue; + } + + // Check for tones (1, 2, 3, 4, 5) + if (TONES_MAP[char]) { + tone = TONES_MAP[char]; + currentState = 'S2'; + const toneNames: Record = { '1': 'Sắc', '2': 'Huyền', '3': 'Hỏi', '4': 'Ngã', '5': 'Nặng' }; + logs.push(`[uinput / S2] Nhận phím '${char}': Áp dụng dấu thanh [${toneNames[char]}] lên từ đang gõ`); + continue; + } + + // Cancel tone (0) + if (char === '0') { + tone = null; + currentState = 'S1'; + logs.push(`[uinput / S1] Nhận phím '0': Xóa toàn bộ dấu thanh đang áp dụng`); + continue; + } + + // Standard alphabetical letters + resultWord += char; + currentState = 'S1'; + } + + // Apply the tone accent if any + if (tone) { + // Find the correct vowel to put the tone on (Vietnamese grammar rule) + // Standard rules: usually the last vowel if double vowel, or the middle one. + // E.g., "hoàng" -> tone on "à", "tiếng" -> tone on "ế" + // Let's implement a simple heuristic: + const vowels = ['a', 'e', 'i', 'o', 'u', 'y', 'â', 'ê', 'ô', 'ơ', 'ư', 'ă', 'Ă', 'Â', 'Ê', 'Ô', 'Ơ', 'Ư']; + let vowelPositions: number[] = []; + for (let i = 0; i < resultWord.length; i++) { + if (vowels.includes(resultWord[i].toLowerCase())) { + vowelPositions.push(i); + } + } + + if (vowelPositions.length > 0) { + // Decide which vowel receives the tone + let targetIndex = vowelPositions[0]; + if (vowelPositions.length === 2) { + // If there is "uy", tone is on "y", else "oa", "oe", "ue", "uy", etc. + const pair = (resultWord[vowelPositions[0]] + resultWord[vowelPositions[1]]).toLowerCase(); + if (pair === 'oa' || pair === 'oe' || pair === 'uâ' || pair === 'uy' || pair === 'iê' || pair === 'yê' || pair === 'uô' || pair === 'ươ') { + targetIndex = vowelPositions[1]; + } else { + targetIndex = vowelPositions[0]; + } + } else if (vowelPositions.length === 3) { + // Three vowels (e.g. "oai", "uay", "ươu"), tone usually on the middle one + targetIndex = vowelPositions[1]; + } + + const targetChar = resultWord[targetIndex]; + resultWord = resultWord.substring(0, targetIndex) + targetChar + tone + resultWord.substring(targetIndex + 1); + } + } + + processedWords.push(normalizeVietnamese(resultWord)); + } + + // Generate a final state change summary for the diff system + const finalOutput = processedWords.join(' '); + if (inputText !== finalOutput && finalOutput !== '') { + logs.push(`[Token-Level Diffing] Đã đồng bộ sự kiện phím ảo: Thay thế chuỗi "${inputText}" thành "${finalOutput}" trong 1ms`); + } + + return { + text: finalOutput, + logs: logs.length > 0 ? logs : ["Chờ phím gõ từ terminal..."], + state: currentState, + }; +} diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000..d88f175 --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2022", + "experimentalDecorators": true, + "useDefineForClassFields": false, + "module": "ESNext", + "lib": [ + "ES2022", + "DOM", + "DOM.Iterable" + ], + "skipLibCheck": true, + "moduleResolution": "bundler", + "isolatedModules": true, + "moduleDetection": "force", + "allowJs": true, + "jsx": "react-jsx", + "paths": { + "@/*": [ + "./*" + ] + }, + "allowImportingTsExtensions": true, + "noEmit": true + } +} diff --git a/web/vite.config.ts b/web/vite.config.ts new file mode 100644 index 0000000..fc23e76 --- /dev/null +++ b/web/vite.config.ts @@ -0,0 +1,22 @@ +import tailwindcss from '@tailwindcss/vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; +import {defineConfig} from 'vite'; + +export default defineConfig(() => { + return { + plugins: [react(), tailwindcss()], + resolve: { + alias: { + '@': path.resolve(__dirname, '.'), + }, + }, + server: { + // HMR is disabled in AI Studio via DISABLE_HMR env var. + // Do not modify—file watching is disabled to prevent flickering during agent edits. + hmr: process.env.DISABLE_HMR !== 'true', + // Disable file watching when DISABLE_HMR is true to save CPU during agent edits. + watch: process.env.DISABLE_HMR === 'true' ? null : {}, + }, + }; +});