From 7e6f65bc826e3fc323a54e6490adf67f6132120e Mon Sep 17 00:00:00 2001 From: Yashwin Date: Sat, 17 Jan 2026 11:04:25 +0530 Subject: [PATCH] feat: add voice recognition, logo positioning, and UI improvements --- .gitignore | 25 + index.html | 17 + package-lock.json | 1726 ++++++++++++++++++++++++++++++ package.json | 23 + public/0x0.png | Bin 0 -> 12095 bytes src/App.jsx | 8 + src/components/ChatInterface.css | 488 +++++++++ src/components/ChatInterface.jsx | 363 +++++++ src/index.css | 17 + src/main.jsx | 11 + src/services/api.js | 26 + src/utils/formatMessage.js | 130 +++ vite.config.js | 7 + 13 files changed, 2841 insertions(+) create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/0x0.png create mode 100644 src/App.jsx create mode 100644 src/components/ChatInterface.css create mode 100644 src/components/ChatInterface.jsx create mode 100644 src/index.css create mode 100644 src/main.jsx create mode 100644 src/services/api.js create mode 100644 src/utils/formatMessage.js create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d600b6c --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + diff --git a/index.html b/index.html new file mode 100644 index 0000000..7a3dedd --- /dev/null +++ b/index.html @@ -0,0 +1,17 @@ + + + + + + + + + + AI Chat Interface + + +
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a365bbc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1726 @@ +{ + "name": "chatbot-ui", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chatbot-ui", + "version": "1.0.0", + "dependencies": { + "lucide-react": "^0.294.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@vitejs/plugin-react": "^4.2.1", + "vite": "^5.0.8" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@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.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@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.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "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.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.13.tgz", + "integrity": "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "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", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", + "dev": true, + "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/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=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==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.294.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.294.0.tgz", + "integrity": "sha512-V7o0/VECSGbLHn3/1O67FUgBwWB+hmzshrgDVRJQhMh8uj5D3HBuIvhuAmQTtlupILSplwIZg5FTc4tTKMA2SA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.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", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..30e82bb --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "chatbot-ui", + "version": "1.0.0", + "description": "AI Chat Interface with Modern Design", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "lucide-react": "^0.294.0" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@vitejs/plugin-react": "^4.2.1", + "vite": "^5.0.8" + } +} + diff --git a/public/0x0.png b/public/0x0.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5861f32b3ba5ab542d3278df9dfdde939a49c8 GIT binary patch literal 12095 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 X)04BN*VnLr3DE%?JS@3y8}@$yjOKmy literal 0 HcmV?d00001 diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 0000000..c5bc0e3 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,8 @@ +import ChatInterface from './components/ChatInterface' + +function App() { + return +} + +export default App + diff --git a/src/components/ChatInterface.css b/src/components/ChatInterface.css new file mode 100644 index 0000000..d51e4f9 --- /dev/null +++ b/src/components/ChatInterface.css @@ -0,0 +1,488 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.chat-container { + width: 100%; + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + padding: 0; + margin: 0; + background: radial-gradient( + circle at center center, + #ffffff 0%, + #fdf2f8 50%, + #eef2ff 100% + ); +} + +.chat-content { + width: 100%; + max-width: 800px; + display: flex; + flex-direction: column; + align-items: center; + padding: 80px 20px 40px; + margin: 0 auto; +} + +/* Header Logo */ +.header-logo { + position: fixed; + top: 20px; + left: 20px; + display: flex; + justify-content: flex-start; + align-items: center; + z-index: 1000; + margin-bottom: 0px; + width: auto; + padding-left: 0; +} + +.logo-image { + max-width: 120px; + height: auto; + object-fit: contain; + display: block; +} + +/* Greeting Container */ +.greeting-container { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 20px; +} + +.greeting-text { + font-family: 'Inter', sans-serif; + font-size: 24px; + font-weight: 700; + text-align: center; + margin: 0; + padding: 0; + background: linear-gradient(to right, #8B5CF6, #EC4899); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +/* Main Heading */ +.main-heading { + font-family: 'Inter', sans-serif; + font-size: 32px; + font-weight: 400; + color: #111827; + letter-spacing: -0.02em; + margin: 0 0 48px 0; + text-align: center; + line-height: 1.2; + width: 100%; +} + +/* Messages Container */ +.messages-container { + width: 100%; + display: flex; + flex-direction: column; + gap: 24px; + margin-bottom: 40px; + align-items: flex-start; + flex: 1; + min-height: 0; +} + +/* Message Wrapper */ +.message-wrapper { + display: flex; + flex-direction: column; + width: 100%; + align-items: flex-start; +} + +.message-wrapper.user { + align-items: flex-end; +} + +/* Message Label */ +.message-label { + font-family: 'Inter', sans-serif; + font-size: 10px; + font-weight: 500; + color: #9ca3af; + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: 8px; + padding: 4px 8px; + line-height: 1; + border-radius: 4px; + display: inline-block; +} + +/* User Message Label (ME) */ +.message-wrapper.user .message-label { + background-color: #4da6ff; + color: #ffffff; + align-self: flex-end; +} + +/* AI Message Label (Chatbot) */ +.message-wrapper.ai .message-label { + color: #9ca3af; + background-color: transparent; +} + +/* Message Bubble */ +.message-bubble { + width: fit-content; + max-width: 85%; + border-radius: 12px; + border: 1px solid rgba(0, 0, 0, 0.05); + background: #ffffff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + word-wrap: break-word; + overflow-wrap: break-word; +} + +.message-bubble.user { + padding: 12px 16px; + background-color: #4da6ff; + border: none; +} + +.message-bubble.user .message-text { + color: #ffffff; +} + +.message-bubble.ai { + padding: 16px 20px; + max-width: 90%; + display: flex; + flex-direction: column; +} + +/* Message Image Container */ +.message-image-container { + width: 100%; + margin-bottom: 12px; + border-radius: 8px; + overflow: hidden; + max-width: 100%; +} + +.message-image { + width: 100%; + max-width: 500px; + max-height: 400px; + height: auto; + display: block; + border-radius: 8px; + object-fit: contain; + cursor: pointer; + transition: transform 0.2s ease; +} + +.message-image:hover { + transform: scale(1.02); +} + +.message-bubble.ai .message-image-container { + margin-bottom: 12px; +} + +.message-bubble.ai .message-image-container:last-child { + margin-bottom: 0; +} + +/* Message Text */ +.message-text { + font-family: 'Inter', sans-serif; + font-size: 14px; + font-weight: 400; + line-height: 1.5; + white-space: pre-line; + margin: 0; + padding: 0; + word-break: break-word; +} + +.message-bubble.ai .message-text { + color: #374151; +} + +.message-bubble.ai .message-text:not(:first-child) { + margin-top: 12px; +} + +/* Structured Message Content */ +.message-content { + width: 100%; +} + +.message-section { + margin-top: 20px; +} + +.message-section:first-of-type { + margin-top: 0; +} + +.message-section-title { + font-family: 'Inter', sans-serif; + font-size: 15px; + font-weight: 600; + color: #111827; + margin: 0 0 10px 0; + padding: 0; + line-height: 1.4; +} + +.message-section-list { + margin: 0; + padding-left: 20px; + list-style-type: disc; +} + +.message-section-item { + font-family: 'Inter', sans-serif; + font-size: 14px; + font-weight: 400; + color: #374151; + line-height: 1.6; + margin-bottom: 8px; + padding-left: 4px; +} + +.message-section-item:last-child { + margin-bottom: 0; +} + +/* Input Container */ +.input-container { + width: 100%; + position: relative; + display: flex; + align-items: center; +} + +.chat-input { + width: 100%; + height: 56px; + padding: 0 100px 0 20px; + background: #ffffff; + border: 1px solid #d1d5db; + border-radius: 12px; + font-family: 'Inter', sans-serif; + font-size: 14px; + font-weight: 400; + color: #111827; + outline: none; + transition: border-color 0.2s ease, box-shadow 0.2s ease; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); +} + +.chat-input::placeholder { + color: #9ca3af; +} + +.chat-input:focus { + border-color: #94a3b8; + box-shadow: 0 0 0 3px rgba(148, 163, 184, 0.1); +} + +.send-button { + position: absolute; + right: 12px; + top: 50%; + transform: translateY(-50%); + width: 32px; + height: 32px; + display: flex; + justify-content: center; + align-items: center; + background: transparent; + border: none; + border-radius: 6px; + color: #94a3b8; + cursor: pointer; + transition: all 0.2s ease; + outline: none; + padding: 0; +} + +.send-button:hover { + background: rgba(148, 163, 184, 0.1); + color: #64748b; +} + +.send-button:active { + transform: translateY(-50%) scale(0.95); +} + +.send-button:focus { + outline: 2px solid rgba(148, 163, 184, 0.3); + outline-offset: 2px; +} + +.send-button svg { + stroke-width: 1.5; + width: 20px; + height: 20px; +} + +.send-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.send-button:disabled:hover { + background: transparent; + color: #94a3b8; +} + +.voice-button { + position: absolute; + right: 52px; + top: 50%; + transform: translateY(-50%); + width: 32px; + height: 32px; + display: flex; + justify-content: center; + align-items: center; + background: transparent; + border: none; + border-radius: 6px; + color: #94a3b8; + cursor: pointer; + transition: all 0.2s ease; + outline: none; + padding: 0; +} + +.voice-button:hover { + background: rgba(148, 163, 184, 0.1); + color: #64748b; +} + +.voice-button:active { + transform: translateY(-50%) scale(0.95); +} + +.voice-button:focus { + outline: 2px solid rgba(148, 163, 184, 0.3); + outline-offset: 2px; +} + +.voice-button svg { + stroke-width: 1.5; + width: 20px; + height: 20px; + transition: all 0.2s ease; +} + +.voice-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.voice-button:disabled:hover { + background: transparent; + color: #94a3b8; +} + +.voice-button .listening { + color: #ef4444; + animation: pulse 1.5s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + transform: scale(1); + } + 50% { + opacity: 0.7; + transform: scale(1.1); + } +} + +/* Loading Indicator */ +.loading-indicator { + display: flex; + align-items: center; + gap: 8px; + font-family: 'Inter', sans-serif; + font-size: 14px; + color: #9ca3af; +} + +.spinner { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* Responsive Design */ +@media (max-width: 768px) { + .chat-content { + padding: 60px 16px 32px; + } + + .header-logo { + top: 16px; + left: 16px; + } + + .logo-image { + max-width: 100px; + } + + .main-heading { + font-size: 28px; + margin-bottom: 40px; + } + + .messages-container { + gap: 20px; + margin-bottom: 32px; + } + + .message-bubble { + max-width: 90%; + } + + .message-bubble.ai { + max-width: 95%; + } + + .chat-input { + height: 52px; + padding: 0 96px 0 16px; + } + + .voice-button { + right: 50px; + width: 32px; + height: 32px; + } + + .send-button { + right: 10px; + width: 32px; + height: 32px; + } +} diff --git a/src/components/ChatInterface.jsx b/src/components/ChatInterface.jsx new file mode 100644 index 0000000..9ccfe0c --- /dev/null +++ b/src/components/ChatInterface.jsx @@ -0,0 +1,363 @@ +import { useState, useEffect, useRef } from 'react' +import { Send, Loader2, Mic } from 'lucide-react' +import { sendQuery } from '../services/api' +import { formatStructuredMessage } from '../utils/formatMessage' +import './ChatInterface.css' + +const ChatInterface = () => { + const [messages, setMessages] = useState([]) + const [inputValue, setInputValue] = useState('') + const [isLoading, setIsLoading] = useState(false) + const [isListening, setIsListening] = useState(false) + const messagesEndRef = useRef(null) + const recognitionRef = useRef(null) + const baseInputValueRef = useRef('') + + const getTimeBasedGreeting = () => { + const hour = new Date().getHours() + if (hour >= 5 && hour < 12) { + return 'Hi, Good Morning!' + } else if (hour >= 12 && hour < 17) { + return 'Hi, Good Afternoon!' + } else if (hour >= 17 && hour < 21) { + return 'Hi, Good Evening!' + } else { + return 'Hi, Good Night!' + } + } + + const scrollToBottom = () => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }) + } + + useEffect(() => { + if (messages.length > 0) { + scrollToBottom() + } + }, [messages]) + + // Initialize Speech Recognition + useEffect(() => { + const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition + + if (!SpeechRecognition) { + console.warn('Speech recognition not supported in this browser') + return + } + + const recognition = new SpeechRecognition() + recognition.continuous = false + recognition.interimResults = true + recognition.lang = 'en-US' + + recognition.onstart = () => { + setIsListening(true) + console.log('Speech recognition started') + } + + recognition.onresult = (event) => { + let interimTranscript = '' + let finalTranscript = '' + + for (let i = event.resultIndex; i < event.results.length; i++) { + const transcript = event.results[i][0].transcript + if (event.results[i].isFinal) { + finalTranscript += transcript + ' ' + } else { + interimTranscript += transcript + } + } + + console.log('Speech recognition result:', { finalTranscript, interimTranscript }) + + // Combine base value with final and interim transcripts + const baseText = baseInputValueRef.current + let newValue = baseText + + if (finalTranscript) { + newValue = (baseText ? baseText + ' ' : '') + finalTranscript.trim() + baseInputValueRef.current = newValue // Update base for next recognition + console.log('Final transcript added, new value:', newValue) + } else if (interimTranscript) { + newValue = (baseText ? baseText + ' ' : '') + interimTranscript + console.log('Interim transcript added, new value:', newValue) + } + + setInputValue(newValue) + } + + recognition.onerror = (event) => { + console.error('Speech recognition error:', event.error) + setIsListening(false) + + if (event.error === 'no-speech') { + console.log('No speech detected') + // Don't show alert for no-speech, just stop + } else if (event.error === 'not-allowed') { + alert('Microphone permission denied. Please enable microphone access in your browser settings.') + } else if (event.error === 'aborted') { + console.log('Speech recognition aborted') + } else { + console.error('Speech recognition error:', event.error) + } + } + + recognition.onend = () => { + setIsListening(false) + console.log('Speech recognition ended') + } + + recognitionRef.current = recognition + + return () => { + if (recognitionRef.current) { + try { + recognitionRef.current.stop() + } catch (e) { + // Ignore errors when stopping + } + } + } + }, []) + + const handleSend = async () => { + const query = inputValue.trim() + if (!query || isLoading) return + + // Add user message to chat + const userMessage = { + type: 'user', + text: query + } + + setMessages(prev => [...prev, userMessage]) + setInputValue('') + setIsLoading(true) + + // Add loading message + const loadingMessage = { + type: 'ai', + text: '', + isLoading: true + } + setMessages(prev => [...prev, loadingMessage]) + + try { + // Call API + const response = await sendQuery(query) + + // Replace loading message with actual response + const answerText = response.answer || response.message || 'Sorry, I could not process your query.' + const structuredMessage = formatStructuredMessage(answerText) + + setMessages(prev => { + const newMessages = [...prev] + const loadingIndex = newMessages.findIndex(msg => msg.isLoading === true) + if (loadingIndex !== -1) { + newMessages[loadingIndex] = { + type: 'ai', + text: answerText, + structuredMessage: structuredMessage, + imageUrl: response.source?.property_image_url || null, + isLoading: false + } + } + return newMessages + }) + } catch (error) { + // Replace loading message with error message + setMessages(prev => { + const newMessages = [...prev] + const loadingIndex = newMessages.findIndex(msg => msg.isLoading === true) + if (loadingIndex !== -1) { + newMessages[loadingIndex] = { + type: 'ai', + text: 'Sorry, there was an error processing your query. Please try again.', + isLoading: false + } + } + return newMessages + }) + } finally { + setIsLoading(false) + } + } + + const handleKeyPress = (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault() + handleSend() + } + } + + const handleVoiceToggle = () => { + if (!recognitionRef.current) { + alert('Speech recognition is not supported in your browser. Please use Chrome, Edge, or Safari.') + return + } + + if (isListening) { + try { + recognitionRef.current.stop() + setIsListening(false) + } catch (error) { + console.error('Error stopping speech recognition:', error) + setIsListening(false) + } + } else { + // Store current input value as base before starting + baseInputValueRef.current = inputValue.trim() + console.log('Starting voice recognition, base text:', baseInputValueRef.current) + + try { + recognitionRef.current.start() + } catch (error) { + console.error('Error starting speech recognition:', error) + // If recognition is already running, try to stop and restart + if (error.message && error.message.includes('already started')) { + try { + recognitionRef.current.stop() + setTimeout(() => { + recognitionRef.current.start() + }, 100) + } catch (retryError) { + console.error('Error retrying speech recognition:', retryError) + setIsListening(false) + } + } else { + setIsListening(false) + alert('Could not start voice recognition. Please check your microphone permissions.') + } + } + } + } + + return ( +
+
+ {/* Header Logo */} +
+ ONE BROKER GROUP +
+ + {/* Show greeting and heading only when no messages */} + {messages.length === 0 && ( + <> + {/* Greeting Message - Above heading */} +
+

{getTimeBasedGreeting()}

+
+ + {/* Main Heading - Below greeting */} +

+ Exploring Dubai real estate?
+ Ask our smart chatbot +

+ + )} + + {/* Messages Container - Show when there are messages */} + {messages.length > 0 && ( +
+ {messages.map((message, index) => ( +
+
+ {message.type === 'user' ? 'ME' : 'Chatbot'} +
+
+ {message.isLoading ? ( +
+ + Thinking... +
+ ) : ( + <> + {message.imageUrl && ( +
+ Property { + e.target.style.display = 'none' + }} + /> +
+ )} + {message.structuredMessage && message.structuredMessage.sections.length > 0 ? ( +
+ {message.structuredMessage.intro && ( +

{message.structuredMessage.intro}

+ )} + {message.structuredMessage.sections.map((section, idx) => ( +
+

{section.title}:

+
    + {section.content.map((item, itemIdx) => ( +
  • {item}
  • + ))} +
+
+ ))} +
+ ) : message.text && ( +

{message.text}

+ )} + + )} +
+
+ ))} +
+
+ )} + + {/* Input Field */} +
+ setInputValue(e.target.value)} + onKeyPress={handleKeyPress} + /> + + +
+
+
+ ) +} + +export default ChatInterface + diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..2f41b31 --- /dev/null +++ b/src/index.css @@ -0,0 +1,17 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Inter', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#root { + width: 100%; + min-height: 100vh; +} + diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..46457ed --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,11 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) + diff --git a/src/services/api.js b/src/services/api.js new file mode 100644 index 0000000..1ce2883 --- /dev/null +++ b/src/services/api.js @@ -0,0 +1,26 @@ +const API_BASE_URL = 'https://property-bot.tech4bizsolutions.com/api/v1/property/query' + +export const sendQuery = async (query) => { + try { + const response = await fetch(API_BASE_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: query, + }), + }) + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + + const data = await response.json() + return data + } catch (error) { + console.error('Error sending query:', error) + throw error + } +} + diff --git a/src/utils/formatMessage.js b/src/utils/formatMessage.js new file mode 100644 index 0000000..bcd1446 --- /dev/null +++ b/src/utils/formatMessage.js @@ -0,0 +1,130 @@ +export const formatStructuredMessage = (text) => { + if (!text) return null + + // Enhanced section patterns - look for headers with word boundaries to avoid partial matches + const sectionPatterns = [ + { + patterns: [/\bproject specifications?:?\b/i], + title: 'Project Specifications' + }, + { + patterns: [/\bdesign\s*&\s*layouts?:?\b/i, /\bdesign:\s*/i], + title: 'Design & Layouts' + }, + { + patterns: [/\bunit types?:?\b/i, /\bunits?:\s*/i], + title: 'Unit Types' + }, + { + patterns: [/\bamenities?:?\b/i, /\bfacilities?:\s*/i], + title: 'Amenities' + }, + { + patterns: [/\bconnectivity?:?\b/i, /\blocation:\s*/i], + title: 'Connectivity' + }, + { + patterns: [/\bpayment plan?:?\b/i, /\bpayment:\s*/i], + title: 'Payment Plan' + }, + { + patterns: [/\bpricing:\s*/i], + title: 'Pricing' + }, + { + patterns: [/\boverview?:?\b/i], + title: 'Overview' + }, + { + patterns: [/\bdeveloper?:?\b/i], + title: 'Developer' + }, + ] + + // Find all section matches + const matches = [] + + sectionPatterns.forEach(({ patterns, title, keywords }) => { + patterns.forEach(pattern => { + const match = pattern.exec(text) + if (match) { + matches.push({ index: match.index, title, match: match[0], keywords }) + } + }) + }) + + // If no explicit section headers found, don't try keyword matching + // as it can cause incorrect matches and text corruption + + // Remove duplicates and sort by index + const uniqueMatches = [] + const seenTitles = new Set() + matches.sort((a, b) => a.index - b.index).forEach(match => { + if (!seenTitles.has(match.title)) { + seenTitles.add(match.title) + uniqueMatches.push(match) + } + }) + + if (uniqueMatches.length === 0) { + // If still no matches, check if text contains numbered lists or bullet points + // and try to extract structured content + const lines = text.split(/\n+/).filter(line => line.trim()) + const hasListFormat = lines.some(line => /^\d+\.|^[-*•]/.test(line.trim())) + + if (hasListFormat) { + // Try to group by topic based on content + return null // Let it fall through to plain text for now + } + + return { intro: text, sections: [] } + } + + // Extract intro text (before first section) + const introText = uniqueMatches.length > 0 + ? text.substring(0, uniqueMatches[0].index).trim() + : text.trim() + + // Extract each section + const sections = [] + uniqueMatches.forEach((match, index) => { + // Find the actual end of the matched pattern (including colon if present) + let startIndex = match.index + match.match.length + + // Skip any whitespace or colons after the match + while (startIndex < text.length && /[\s:]/.test(text[startIndex])) { + startIndex++ + } + + const endIndex = index < uniqueMatches.length - 1 + ? uniqueMatches[index + 1].index + : text.length + let content = text.substring(startIndex, endIndex).trim() + + // Clean up content - only remove leading colons/dashes if they're at the very start + content = content.replace(/^[:\-–—]\s+/, '').trim() + + // Split into lines and format + const lines = content.split(/\n+/).filter(line => line.trim()) + const formattedContent = lines.map(line => { + const originalLine = line + // Only remove list markers if they're actually at the start + line = line.replace(/^\d+\.\s+/, '') // Numbered lists (1. ) + .replace(/^[-*•]\s+/, '') // Bullet points + .replace(/^[:\-–—]\s+/, '') // Colons/dashes + // If we removed something, trim, otherwise use original + line = line !== originalLine ? line.trim() : line.trim() + return line + }).filter(line => line.length > 0) + + if (formattedContent.length > 0) { + sections.push({ + title: match.title, + content: formattedContent + }) + } + }) + + return { intro: introText, sections } +} + diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..54164ce --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], +}) +