diff --git a/ai-design-platform/.gitignore b/ai-design-platform/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/ai-design-platform/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/ai-design-platform/COMPONENTS_SUMMARY.md b/ai-design-platform/COMPONENTS_SUMMARY.md
new file mode 100644
index 0000000..3d06538
--- /dev/null
+++ b/ai-design-platform/COMPONENTS_SUMMARY.md
@@ -0,0 +1,183 @@
+# AI Design Platform - Auth Components & Main App Summary
+
+## ✅ Components Created
+
+### Authentication Components
+
+1. **LoginForm.tsx** (196 lines)
+ - ✅ Email/password inputs with real-time validation
+ - ✅ Password visibility toggle
+ - ✅ OAuth buttons (Google, GitHub, Microsoft)
+ - ✅ Remember me checkbox
+ - ✅ Forgot password link
+ - ✅ Form submission handling with loading states
+ - ✅ Glass morphism design
+
+2. **RegisterForm.tsx** (380 lines)
+ - ✅ Name, email, password, confirm password fields
+ - ✅ Real-time password strength indicator (6-level scale)
+ - ✅ Password requirements checklist with visual feedback
+ - ✅ Terms acceptance checkbox with links
+ - ✅ OAuth sign-up options
+ - ✅ Comprehensive form validation
+ - ✅ Glass morphism design
+
+3. **UserProfile.tsx** (376 lines)
+ - ✅ Profile info display/edit with save/cancel
+ - ✅ Role badge with color coding (Admin/Developer/User)
+ - ✅ Two-factor authentication toggle switch
+ - ✅ API key management section:
+ - Create new API keys with name
+ - Show/hide API key values
+ - Copy to clipboard functionality
+ - Delete API keys
+ - Display creation date and last used
+ - ✅ Active sessions list:
+ - Device and location information
+ - Last active timestamp
+ - Current session indicator
+ - Revoke session functionality
+ - ✅ Glass morphism design
+
+### Main Application
+
+4. **App.tsx** (351 lines)
+ - ✅ Glass morphism sidebar navigation
+ - ✅ Collapsible sidebar (full ↔ icon-only)
+ - ✅ Navigation items with lucide-react icons:
+ - Dashboard
+ - Models
+ - Analytics
+ - Monitoring
+ - Data
+ - Users
+ - Security
+ - Settings
+ - ✅ Top header with:
+ - Global search bar
+ - Theme toggle (dark/light mode)
+ - Notifications with badge count
+ - User profile dropdown menu
+ - ✅ Main content area with dynamic routing
+ - ✅ Dashboard page with:
+ - 4 metric cards
+ - Recent activity feed
+ - System status indicators
+ - ✅ AI Companion floating button (bottom-right)
+ - ✅ State management for all UI interactions
+
+## Additional Files
+
+- **index.ts** - Barrel export for auth components
+- **AuthExample.tsx** (140 lines) - Complete usage examples
+- **README.md** - Comprehensive documentation
+
+## Design Features
+
+### Glass Morphism
+- ✅ Backdrop blur effects
+- ✅ Semi-transparent backgrounds (white/10)
+- ✅ Border with opacity (white/20)
+- ✅ Consistent shadow system
+
+### Icons
+- ✅ All components use lucide-react icons
+- ✅ Consistent icon sizing (w-4/w-5/w-6 h-4/h-5/h-6)
+- ✅ Icons for all navigation items and actions
+
+### Color Scheme
+- ✅ Blue-Purple gradient for primary actions
+- ✅ Semantic colors (green for success, red for errors)
+- ✅ Gray scale for text hierarchy
+- ✅ Background gradient: gray-900 → blue-900 → purple-900
+
+### Interactive Elements
+- ✅ Hover states on all interactive elements
+- ✅ Focus states with ring-2 ring-blue-500
+- ✅ Smooth transitions (transition-all)
+- ✅ Loading states for async actions
+- ✅ Disabled states for buttons
+
+### Responsive Design
+- ✅ Mobile-first approach
+- ✅ Grid layouts (grid-cols-1 md:grid-cols-2 lg:grid-cols-4)
+- ✅ Responsive text sizing
+- ✅ Hidden elements on mobile (hidden md:block)
+
+## TypeScript Features
+
+- ✅ Full TypeScript support
+- ✅ Interface definitions for all props
+- ✅ Type-safe event handlers
+- ✅ Optional props with default values
+- ✅ No TypeScript errors in auth components
+
+## Validation
+
+### LoginForm
+- ✅ Email format validation
+- ✅ Password length validation (min 6 chars)
+- ✅ Required field validation
+
+### RegisterForm
+- ✅ Name length validation (min 2 chars)
+- ✅ Email format validation
+- ✅ Password strength validation (min 8 chars)
+- ✅ Password confirmation matching
+- ✅ Terms acceptance validation
+- ✅ Visual password strength indicator
+
+## State Management
+
+- ✅ Local state with useState
+- ✅ Form state management
+- ✅ Error state management
+- ✅ UI state (modals, dropdowns, visibility)
+- ✅ Loading states
+
+## File Structure
+
+```
+ai-design-platform/src/
+├── components/
+│ └── auth/
+│ ├── LoginForm.tsx ✅ 196 lines
+│ ├── RegisterForm.tsx ✅ 380 lines
+│ ├── UserProfile.tsx ✅ 376 lines
+│ ├── index.ts ✅ 3 lines
+│ └── README.md ✅ Documentation
+├── App.tsx ✅ 351 lines
+└── AuthExample.tsx ✅ 140 lines (examples)
+
+Total: 1,443 lines of code
+```
+
+## Build Status
+
+✅ All auth components build without errors
+✅ TypeScript compilation successful for new components
+✅ No warnings related to auth components
+✅ App.tsx builds successfully
+
+## Usage
+
+All components are ready to use. See `AuthExample.tsx` for implementation examples.
+
+Import components:
+```tsx
+import { LoginForm, RegisterForm, UserProfile } from './components/auth';
+import { App } from './App';
+```
+
+## Next Steps
+
+The following sections are placeholders in App.tsx and ready for implementation:
+- Model Management
+- Analytics Dashboard
+- Monitoring Interface
+- Data Management
+- User Management
+- Security Settings
+- Settings
+
+All components follow the same glass morphism design pattern and can integrate seamlessly.
diff --git a/ai-design-platform/README.md b/ai-design-platform/README.md
new file mode 100644
index 0000000..d2e7761
--- /dev/null
+++ b/ai-design-platform/README.md
@@ -0,0 +1,73 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## React Compiler
+
+The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+
+ // Remove tseslint.configs.recommended and replace with this
+ tseslint.configs.recommendedTypeChecked,
+ // Alternatively, use this for stricter rules
+ tseslint.configs.strictTypeChecked,
+ // Optionally, add this for stylistic rules
+ tseslint.configs.stylisticTypeChecked,
+
+ // Other configs...
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
+
+You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+ // Enable lint rules for React
+ reactX.configs['recommended-typescript'],
+ // Enable lint rules for React DOM
+ reactDom.configs.recommended,
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
diff --git a/ai-design-platform/eslint.config.js b/ai-design-platform/eslint.config.js
new file mode 100644
index 0000000..5e6b472
--- /dev/null
+++ b/ai-design-platform/eslint.config.js
@@ -0,0 +1,23 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ },
+])
diff --git a/ai-design-platform/index.html b/ai-design-platform/index.html
new file mode 100644
index 0000000..9497d57
--- /dev/null
+++ b/ai-design-platform/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ ai-design-platform
+
+
+
+
+
+
diff --git a/ai-design-platform/package-lock.json b/ai-design-platform/package-lock.json
new file mode 100644
index 0000000..e8b02c4
--- /dev/null
+++ b/ai-design-platform/package-lock.json
@@ -0,0 +1,4179 @@
+{
+ "name": "ai-design-platform",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "ai-design-platform",
+ "version": "0.0.0",
+ "dependencies": {
+ "autoprefixer": "^10.4.24",
+ "axios": "^1.13.5",
+ "i18next": "^25.8.8",
+ "i18next-browser-languagedetector": "^8.2.1",
+ "lucide-react": "^0.564.0",
+ "postcss": "^8.5.6",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-i18next": "^16.5.4",
+ "react-router-dom": "^7.13.0",
+ "recharts": "^3.7.0",
+ "tailwindcss": "^4.1.18"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/node": "^24.10.1",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.48.0",
+ "vite": "^7.3.1"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.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.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@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.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@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.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+ "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.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "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/runtime": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "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.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
+ "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
+ "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
+ "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
+ "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
+ "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
+ "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
+ "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
+ "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
+ "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
+ "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
+ "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
+ "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
+ "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
+ "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
+ "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
+ "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
+ "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
+ "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
+ "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
+ "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
+ "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
+ "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
+ "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
+ "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "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/@reduxjs/toolkit": {
+ "version": "2.11.2",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
+ "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.0.0",
+ "@standard-schema/utils": "^0.3.0",
+ "immer": "^11.0.0",
+ "redux": "^5.0.1",
+ "redux-thunk": "^3.1.0",
+ "reselect": "^5.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
+ "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@reduxjs/toolkit/node_modules/immer": {
+ "version": "11.1.4",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz",
+ "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz",
+ "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz",
+ "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz",
+ "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz",
+ "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz",
+ "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz",
+ "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz",
+ "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz",
+ "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz",
+ "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz",
+ "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz",
+ "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz",
+ "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz",
+ "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz",
+ "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz",
+ "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz",
+ "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz",
+ "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz",
+ "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz",
+ "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz",
+ "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz",
+ "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz",
+ "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz",
+ "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz",
+ "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz",
+ "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT"
+ },
+ "node_modules/@standard-schema/utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
+ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
+ "license": "MIT"
+ },
+ "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/d3-array": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz",
+ "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
+ "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/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.10.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz",
+ "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
+ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz",
+ "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/type-utils": "8.55.0",
+ "@typescript-eslint/utils": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.55.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz",
+ "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz",
+ "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.55.0",
+ "@typescript-eslint/types": "^8.55.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz",
+ "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz",
+ "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz",
+ "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0",
+ "@typescript-eslint/utils": "8.55.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz",
+ "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz",
+ "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.55.0",
+ "@typescript-eslint/tsconfig-utils": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz",
+ "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz",
+ "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.55.0",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz",
+ "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==",
+ "dev": true,
+ "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"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.24",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz",
+ "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==",
+ "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.1",
+ "caniuse-lite": "^1.0.30001766",
+ "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/axios": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
+ "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.9.19",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
+ "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "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/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/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001770",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz",
+ "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==",
+ "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/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "license": "ISC",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js-light": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
+ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
+ "license": "MIT"
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "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/electron-to-chromium": {
+ "version": "1.5.286",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz",
+ "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==",
+ "license": "ISC"
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-toolkit": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz",
+ "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==",
+ "license": "MIT",
+ "workspaces": [
+ "docs",
+ "benchmarks"
+ ]
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
+ "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.3",
+ "@esbuild/android-arm": "0.27.3",
+ "@esbuild/android-arm64": "0.27.3",
+ "@esbuild/android-x64": "0.27.3",
+ "@esbuild/darwin-arm64": "0.27.3",
+ "@esbuild/darwin-x64": "0.27.3",
+ "@esbuild/freebsd-arm64": "0.27.3",
+ "@esbuild/freebsd-x64": "0.27.3",
+ "@esbuild/linux-arm": "0.27.3",
+ "@esbuild/linux-arm64": "0.27.3",
+ "@esbuild/linux-ia32": "0.27.3",
+ "@esbuild/linux-loong64": "0.27.3",
+ "@esbuild/linux-mips64el": "0.27.3",
+ "@esbuild/linux-ppc64": "0.27.3",
+ "@esbuild/linux-riscv64": "0.27.3",
+ "@esbuild/linux-s390x": "0.27.3",
+ "@esbuild/linux-x64": "0.27.3",
+ "@esbuild/netbsd-arm64": "0.27.3",
+ "@esbuild/netbsd-x64": "0.27.3",
+ "@esbuild/openbsd-arm64": "0.27.3",
+ "@esbuild/openbsd-x64": "0.27.3",
+ "@esbuild/openharmony-arm64": "0.27.3",
+ "@esbuild/sunos-x64": "0.27.3",
+ "@esbuild/win32-arm64": "0.27.3",
+ "@esbuild/win32-ia32": "0.27.3",
+ "@esbuild/win32-x64": "0.27.3"
+ }
+ },
+ "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-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz",
+ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.2",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
+ "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.26",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz",
+ "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 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==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "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/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/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/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/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.25.1"
+ }
+ },
+ "node_modules/html-parse-stringify": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "license": "MIT",
+ "dependencies": {
+ "void-elements": "3.1.0"
+ }
+ },
+ "node_modules/i18next": {
+ "version": "25.8.8",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.8.tgz",
+ "integrity": "sha512-gNTWXMBe9JBr6LAl2tqRfa6fn2EjrQJ3JBeH2jR+yIckwaJYdI7UfMQrnxzFjuFBb2FHy9Yn4gJB2BwLuC8/ZQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.28.4"
+ },
+ "peerDependencies": {
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/i18next-browser-languagedetector": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz",
+ "integrity": "sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
+ "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "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/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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.564.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.564.0.tgz",
+ "integrity": "sha512-JJ8GVTQqFwuliifD48U6+h7DXEHdkhJ/E87kksGByII3qHxtPciVb8T8woQONHBQgHVOl7rSMrrip3SeVNy7Fg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "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/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/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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==",
+ "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/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "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",
+ "peer": true,
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.4"
+ }
+ },
+ "node_modules/react-i18next": {
+ "version": "16.5.4",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.4.tgz",
+ "integrity": "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "html-parse-stringify": "^3.0.1",
+ "use-sync-external-store": "^1.6.0"
+ },
+ "peerDependencies": {
+ "i18next": ">= 25.6.2",
+ "react": ">= 16.8.0",
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-is": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz",
+ "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/react-redux": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
+ "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/use-sync-external-store": "^0.0.6",
+ "use-sync-external-store": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^18.2.25 || ^19",
+ "react": "^18.0 || ^19",
+ "redux": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz",
+ "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.0.tgz",
+ "integrity": "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.13.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/recharts": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.7.0.tgz",
+ "integrity": "sha512-l2VCsy3XXeraxIID9fx23eCb6iCBsxUQDnE8tWm6DFdszVAO7WVY/ChAD9wVit01y6B2PMupYiMmQwhgPHc9Ew==",
+ "license": "MIT",
+ "workspaces": [
+ "www"
+ ],
+ "dependencies": {
+ "@reduxjs/toolkit": "1.x.x || 2.x.x",
+ "clsx": "^2.1.1",
+ "decimal.js-light": "^2.5.1",
+ "es-toolkit": "^1.39.3",
+ "eventemitter3": "^5.0.1",
+ "immer": "^10.1.1",
+ "react-redux": "8.x.x || 9.x.x",
+ "reselect": "5.1.1",
+ "tiny-invariant": "^1.3.3",
+ "use-sync-external-store": "^1.2.2",
+ "victory-vendor": "^37.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/redux": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
+ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/redux-thunk": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
+ "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "redux": "^5.0.0"
+ }
+ },
+ "node_modules/reselect": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
+ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.57.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz",
+ "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==",
+ "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.57.1",
+ "@rollup/rollup-android-arm64": "4.57.1",
+ "@rollup/rollup-darwin-arm64": "4.57.1",
+ "@rollup/rollup-darwin-x64": "4.57.1",
+ "@rollup/rollup-freebsd-arm64": "4.57.1",
+ "@rollup/rollup-freebsd-x64": "4.57.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.57.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.57.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.57.1",
+ "@rollup/rollup-linux-arm64-musl": "4.57.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.57.1",
+ "@rollup/rollup-linux-loong64-musl": "4.57.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.57.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.57.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.57.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.57.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.57.1",
+ "@rollup/rollup-linux-x64-gnu": "4.57.1",
+ "@rollup/rollup-linux-x64-musl": "4.57.1",
+ "@rollup/rollup-openbsd-x64": "4.57.1",
+ "@rollup/rollup-openharmony-arm64": "4.57.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.57.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.57.1",
+ "@rollup/rollup-win32-x64-gnu": "4.57.1",
+ "@rollup/rollup-win32-x64-msvc": "4.57.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
+ "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
+ "license": "MIT"
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
+ "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.55.0.tgz",
+ "integrity": "sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.55.0",
+ "@typescript-eslint/parser": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0",
+ "@typescript-eslint/utils": "8.55.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/victory-vendor": {
+ "version": "37.3.6",
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
+ "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==",
+ "license": "MIT AND ISC",
+ "dependencies": {
+ "@types/d3-array": "^3.0.3",
+ "@types/d3-ease": "^3.0.0",
+ "@types/d3-interpolate": "^3.0.1",
+ "@types/d3-scale": "^4.0.2",
+ "@types/d3-shape": "^3.1.0",
+ "@types/d3-time": "^3.0.0",
+ "@types/d3-timer": "^3.0.0",
+ "d3-array": "^3.1.6",
+ "d3-ease": "^3.0.1",
+ "d3-interpolate": "^3.0.1",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.1.0",
+ "d3-time": "^3.0.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
+ "node_modules/vite": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
+ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ }
+ }
+}
diff --git a/ai-design-platform/package.json b/ai-design-platform/package.json
new file mode 100644
index 0000000..12a8ef0
--- /dev/null
+++ b/ai-design-platform/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "ai-design-platform",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "autoprefixer": "^10.4.24",
+ "axios": "^1.13.5",
+ "i18next": "^25.8.8",
+ "i18next-browser-languagedetector": "^8.2.1",
+ "lucide-react": "^0.564.0",
+ "postcss": "^8.5.6",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-i18next": "^16.5.4",
+ "react-router-dom": "^7.13.0",
+ "recharts": "^3.7.0",
+ "tailwindcss": "^4.1.18"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/node": "^24.10.1",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.48.0",
+ "vite": "^7.3.1"
+ }
+}
diff --git a/ai-design-platform/postcss.config.js b/ai-design-platform/postcss.config.js
new file mode 100644
index 0000000..2e7af2b
--- /dev/null
+++ b/ai-design-platform/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/ai-design-platform/public/vite.svg b/ai-design-platform/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/ai-design-platform/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ai-design-platform/src/App.css b/ai-design-platform/src/App.css
new file mode 100644
index 0000000..b9d355d
--- /dev/null
+++ b/ai-design-platform/src/App.css
@@ -0,0 +1,42 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ transition: filter 300ms;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/ai-design-platform/src/App.tsx b/ai-design-platform/src/App.tsx
new file mode 100644
index 0000000..4c3cf59
--- /dev/null
+++ b/ai-design-platform/src/App.tsx
@@ -0,0 +1,351 @@
+import React, { useState } from 'react';
+import {
+ LayoutDashboard,
+ Brain,
+ BarChart3,
+ Activity,
+ Settings,
+ Users,
+ Shield,
+ Database,
+ Bell,
+ Search,
+ Menu,
+ X,
+ ChevronDown,
+ LogOut,
+ User,
+ Moon,
+ Sun,
+ MessageSquare,
+} from 'lucide-react';
+
+type Section =
+ | 'dashboard'
+ | 'models'
+ | 'analytics'
+ | 'monitoring'
+ | 'settings'
+ | 'users'
+ | 'security'
+ | 'data';
+
+interface NavItem {
+ id: Section;
+ label: string;
+ icon: React.ReactNode;
+}
+
+export const App: React.FC = () => {
+ const [activeSection, setActiveSection] = useState('dashboard');
+ const [sidebarOpen, setSidebarOpen] = useState(true);
+ const [userMenuOpen, setUserMenuOpen] = useState(false);
+ const [darkMode, setDarkMode] = useState(true);
+ const [notifications] = useState(3);
+
+ const navItems: NavItem[] = [
+ { id: 'dashboard', label: 'Dashboard', icon: },
+ { id: 'models', label: 'Models', icon: },
+ { id: 'analytics', label: 'Analytics', icon: },
+ { id: 'monitoring', label: 'Monitoring', icon: },
+ { id: 'data', label: 'Data', icon: },
+ { id: 'users', label: 'Users', icon: },
+ { id: 'security', label: 'Security', icon: },
+ { id: 'settings', label: 'Settings', icon: },
+ ];
+
+ const renderContent = () => {
+ switch (activeSection) {
+ case 'dashboard':
+ return (
+
+
Dashboard
+
+ {/* Metric Cards */}
+ {[
+ { label: 'Total Models', value: '24', change: '+12%', positive: true },
+ { label: 'Active Users', value: '1,234', change: '+8%', positive: true },
+ { label: 'API Calls', value: '45.2K', change: '+23%', positive: true },
+ { label: 'Avg Response', value: '145ms', change: '-5%', positive: true },
+ ].map((metric, idx) => (
+
+
{metric.label}
+
+
{metric.value}
+
+ {metric.change}
+
+
+
+ ))}
+
+
+
+
+
Recent Activity
+
+ {[
+ { action: 'Model deployed', model: 'GPT-4 Turbo', time: '2 min ago' },
+ { action: 'User registered', model: 'john@example.com', time: '15 min ago' },
+ { action: 'API key created', model: 'Production Key', time: '1 hour ago' },
+ ].map((activity, idx) => (
+
+
+
{activity.action}
+
{activity.model}
+
+
{activity.time}
+
+ ))}
+
+
+
+
+
System Status
+
+ {[
+ { service: 'API Gateway', status: 'Operational', uptime: '99.9%' },
+ { service: 'Model Inference', status: 'Operational', uptime: '99.8%' },
+ { service: 'Database', status: 'Operational', uptime: '100%' },
+ ].map((service, idx) => (
+
+
+
+ {service.uptime}
+ {service.status}
+
+
+ ))}
+
+
+
+
+ );
+
+ case 'models':
+ return (
+
+
Model Management
+
+
Model management interface coming soon...
+
+
+ );
+
+ case 'analytics':
+ return (
+
+
Analytics
+
+
Analytics dashboard coming soon...
+
+
+ );
+
+ case 'monitoring':
+ return (
+
+
Monitoring
+
+
Monitoring interface coming soon...
+
+
+ );
+
+ case 'data':
+ return (
+
+
Data Management
+
+
Data management interface coming soon...
+
+
+ );
+
+ case 'users':
+ return (
+
+
User Management
+
+
User management interface coming soon...
+
+
+ );
+
+ case 'security':
+ return (
+
+
Security
+
+
Security settings coming soon...
+
+
+ );
+
+ case 'settings':
+ return (
+
+
Settings
+
+
Settings interface coming soon...
+
+
+ );
+
+ default:
+ return null;
+ }
+ };
+
+ return (
+
+ {/* Sidebar */}
+
+
+ {/* Logo */}
+
+ {sidebarOpen ? (
+ <>
+
+
setSidebarOpen(false)}
+ className="text-gray-400 hover:text-white transition-colors"
+ >
+
+
+ >
+ ) : (
+
setSidebarOpen(true)}
+ className="mx-auto text-gray-400 hover:text-white transition-colors"
+ >
+
+
+ )}
+
+
+ {/* Navigation */}
+
+ {navItems.map((item) => (
+ setActiveSection(item.id)}
+ className={`w-full flex items-center gap-3 px-4 py-3 rounded-lg transition-all ${
+ activeSection === item.id
+ ? 'bg-gradient-to-r from-blue-500 to-purple-500 text-white'
+ : 'text-gray-400 hover:text-white hover:bg-white/5'
+ }`}
+ title={!sidebarOpen ? item.label : undefined}
+ >
+ {item.icon}
+ {sidebarOpen && {item.label} }
+
+ ))}
+
+
+
+
+ {/* Main Content */}
+
+ {/* Top Header */}
+
+
+ {/* Main Content Area */}
+
+ {renderContent()}
+
+
+
+ {/* AI Companion - Fixed Bottom Right */}
+
+
+
+
+ );
+};
+
+export default App;
diff --git a/ai-design-platform/src/AuthExample.tsx b/ai-design-platform/src/AuthExample.tsx
new file mode 100644
index 0000000..be7016d
--- /dev/null
+++ b/ai-design-platform/src/AuthExample.tsx
@@ -0,0 +1,140 @@
+import React from 'react';
+import { LoginForm, RegisterForm, UserProfile } from './components/auth';
+
+// Example usage of Auth Components
+
+export const AuthExample: React.FC = () => {
+ // Login Form Example
+ const handleLogin = (email: string, password: string, rememberMe: boolean) => {
+ console.log('Login:', { email, password, rememberMe });
+ // Implement your login logic here
+ };
+
+ const handleOAuthLogin = (provider: 'google' | 'github' | 'microsoft') => {
+ console.log('OAuth login with:', provider);
+ // Implement OAuth login logic here
+ };
+
+ const handleForgotPassword = () => {
+ console.log('Forgot password clicked');
+ // Navigate to forgot password page
+ };
+
+ // Register Form Example
+ const handleRegister = (name: string, email: string, password: string, acceptTerms: boolean) => {
+ console.log('Register:', { name, email, password, acceptTerms });
+ // Implement registration logic here
+ };
+
+ const handleOAuthRegister = (provider: 'google' | 'github' | 'microsoft') => {
+ console.log('OAuth register with:', provider);
+ // Implement OAuth registration logic here
+ };
+
+ // User Profile Example
+ const userData = {
+ name: 'John Doe',
+ email: 'john.doe@example.com',
+ role: 'Admin',
+ twoFactorEnabled: false,
+ };
+
+ const apiKeys = [
+ {
+ id: '1',
+ name: 'Production API',
+ key: 'sk_prod_abc123xyz789def456ghi789',
+ createdAt: '2024-01-15',
+ lastUsed: '2024-01-20',
+ },
+ {
+ id: '2',
+ name: 'Development API',
+ key: 'sk_dev_xyz789abc123def456ghi789',
+ createdAt: '2024-01-10',
+ lastUsed: '2024-01-19',
+ },
+ ];
+
+ const sessions = [
+ {
+ id: '1',
+ device: 'Chrome on MacOS',
+ location: 'San Francisco, CA',
+ lastActive: '2 minutes ago',
+ current: true,
+ },
+ {
+ id: '2',
+ device: 'Firefox on Windows',
+ location: 'New York, NY',
+ lastActive: '1 day ago',
+ current: false,
+ },
+ ];
+
+ const handleUpdateProfile = (data: Partial) => {
+ console.log('Update profile:', data);
+ // Implement profile update logic here
+ };
+
+ const handleToggle2FA = (enabled: boolean) => {
+ console.log('Toggle 2FA:', enabled);
+ // Implement 2FA toggle logic here
+ };
+
+ const handleCreateApiKey = (name: string) => {
+ console.log('Create API key:', name);
+ // Implement API key creation logic here
+ };
+
+ const handleDeleteApiKey = (id: string) => {
+ console.log('Delete API key:', id);
+ // Implement API key deletion logic here
+ };
+
+ const handleRevokeSession = (id: string) => {
+ console.log('Revoke session:', id);
+ // Implement session revocation logic here
+ };
+
+ return (
+
+
+ {/* Login Form */}
+
+
+ {/* Register Form */}
+
+
+ {/* User Profile */}
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/assets/react.svg b/ai-design-platform/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/ai-design-platform/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ai-design-platform/src/components/ai/AICompanion.tsx b/ai-design-platform/src/components/ai/AICompanion.tsx
new file mode 100644
index 0000000..fffb5d2
--- /dev/null
+++ b/ai-design-platform/src/components/ai/AICompanion.tsx
@@ -0,0 +1,424 @@
+import React, { useState, useRef, useEffect } from 'react';
+import {
+ MessageCircle,
+ X,
+ Send,
+ Mic,
+ MicOff,
+ Settings,
+ Volume2,
+ VolumeX,
+ Minimize2,
+ Maximize2,
+ User,
+ Bot,
+ Languages,
+ Sparkles,
+ Activity
+} from 'lucide-react';
+import type { ConversationMessage, AIPersonality, VoiceSettings } from '../../types';
+
+export const AICompanion: React.FC = () => {
+ const [isOpen, setIsOpen] = useState(false);
+ const [isExpanded, setIsExpanded] = useState(false);
+ const [showSettings, setShowSettings] = useState(false);
+ const [messages, setMessages] = useState([
+ {
+ id: '1',
+ role: 'assistant',
+ content: 'Hello! I\'m your AI companion. How can I help you today?',
+ timestamp: new Date(),
+ emotion: 'friendly'
+ }
+ ]);
+ const [inputMessage, setInputMessage] = useState('');
+ const [isListening, setIsListening] = useState(false);
+ const [isTyping, setIsTyping] = useState(false);
+ const [transcription, setTranscription] = useState('');
+
+ const [voiceSettings, setVoiceSettings] = useState({
+ alwaysOn: false,
+ voiceResponse: true,
+ personality: 'professional',
+ language: 'en-US',
+ speechRate: 1.0,
+ pitch: 1.0
+ });
+
+ const messagesEndRef = useRef(null);
+ const inputRef = useRef(null);
+
+ const personalities: AIPersonality[] = [
+ {
+ id: 'professional',
+ name: 'Professional',
+ description: 'Formal and business-focused',
+ traits: ['Concise', 'Accurate', 'Efficient']
+ },
+ {
+ id: 'friendly',
+ name: 'Friendly',
+ description: 'Warm and conversational',
+ traits: ['Approachable', 'Supportive', 'Encouraging']
+ },
+ {
+ id: 'teacher',
+ name: 'Teacher',
+ description: 'Educational and patient',
+ traits: ['Explanatory', 'Patient', 'Detailed']
+ },
+ {
+ id: 'mentor',
+ name: 'Mentor',
+ description: 'Guiding and strategic',
+ traits: ['Strategic', 'Insightful', 'Growth-focused']
+ }
+ ];
+
+ const languages = [
+ { code: 'en-US', name: 'English (US)' },
+ { code: 'en-GB', name: 'English (UK)' },
+ { code: 'es-ES', name: 'Spanish' },
+ { code: 'fr-FR', name: 'French' },
+ { code: 'de-DE', name: 'German' },
+ { code: 'ja-JP', name: 'Japanese' },
+ { code: 'zh-CN', name: 'Chinese' }
+ ];
+
+ useEffect(() => {
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
+ }, [messages]);
+
+ useEffect(() => {
+ if (isOpen && inputRef.current) {
+ inputRef.current.focus();
+ }
+ }, [isOpen]);
+
+ const handleSendMessage = () => {
+ if (!inputMessage.trim()) return;
+
+ const newMessage: ConversationMessage = {
+ id: Date.now().toString(),
+ role: 'user',
+ content: inputMessage,
+ timestamp: new Date()
+ };
+
+ setMessages(prev => [...prev, newMessage]);
+ setInputMessage('');
+ setIsTyping(true);
+
+ // Simulate AI response
+ setTimeout(() => {
+ const aiResponse: ConversationMessage = {
+ id: (Date.now() + 1).toString(),
+ role: 'assistant',
+ content: `I understand your question about "${inputMessage}". Let me help you with that...`,
+ timestamp: new Date(),
+ emotion: voiceSettings.personality
+ };
+ setMessages(prev => [...prev, aiResponse]);
+ setIsTyping(false);
+ }, 1500);
+ };
+
+ const toggleVoice = () => {
+ setIsListening(!isListening);
+ if (!isListening) {
+ // Simulate voice recognition
+ setTranscription('Listening...');
+ setTimeout(() => {
+ setTranscription('How can I improve model accuracy?');
+ setInputMessage('How can I improve model accuracy?');
+ }, 2000);
+ } else {
+ setTranscription('');
+ }
+ };
+
+ const formatTime = (date: Date) => {
+ return date.toLocaleTimeString('en-US', {
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ };
+
+ return (
+ <>
+ {/* Floating AI Button */}
+ {!isOpen && (
+ setIsOpen(true)}
+ className="fixed bottom-6 right-6 p-4 rounded-full bg-gradient-to-r from-purple-600 to-blue-500 text-white shadow-2xl hover:scale-110 transition-all duration-300 pulse-glow z-50"
+ >
+
+
+ )}
+
+ {/* Chat Window */}
+ {isOpen && (
+
+ {/* Header */}
+
+
+
+
+
AI Companion
+
+ {personalities.find(p => p.id === voiceSettings.personality)?.name} Mode
+
+
+
+
+ setShowSettings(!showSettings)}
+ className={`p-2 rounded-lg transition-colors ${
+ showSettings
+ ? 'bg-purple-500/20 text-purple-400'
+ : 'hover:bg-white/10 text-gray-400'
+ }`}
+ >
+
+
+ setIsExpanded(!isExpanded)}
+ className="p-2 rounded-lg hover:bg-white/10 text-gray-400"
+ >
+ {isExpanded ? : }
+
+ setIsOpen(false)}
+ className="p-2 rounded-lg hover:bg-white/10 text-gray-400"
+ >
+
+
+
+
+
+ {/* Settings Panel */}
+ {showSettings && (
+
+ {/* Personality Selection */}
+
+
Personality
+
+ {personalities.map((personality) => (
+
setVoiceSettings(prev => ({ ...prev, personality: personality.id }))}
+ className={`p-3 rounded-lg text-left transition-all ${
+ voiceSettings.personality === personality.id
+ ? 'bg-purple-500/20 border border-purple-500/50'
+ : 'bg-white/5 border border-white/10 hover:bg-white/10'
+ }`}
+ >
+ {personality.name}
+ {personality.description}
+
+ ))}
+
+
+
+ {/* Language Selection */}
+
+
+
+ Language
+
+ setVoiceSettings(prev => ({ ...prev, language: e.target.value }))}
+ className="w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-sm text-white focus:outline-none focus:ring-2 focus:ring-purple-500"
+ >
+ {languages.map((lang) => (
+ {lang.name}
+ ))}
+
+
+
+ {/* Voice Controls */}
+
+
+ {/* Toggle Options */}
+
+
Voice Response
+
setVoiceSettings(prev => ({ ...prev, voiceResponse: !prev.voiceResponse }))}
+ className={`relative w-12 h-6 rounded-full transition-colors ${
+ voiceSettings.voiceResponse ? 'bg-purple-500' : 'bg-gray-700'
+ }`}
+ >
+
+
+
+
+ )}
+
+ {/* Messages */}
+
+ {messages.map((message) => (
+
+
+ {message.role === 'user' ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {formatTime(message.timestamp)}
+
+
+
+ ))}
+
+ {/* Typing Indicator */}
+ {isTyping && (
+
+ )}
+
+
+
+ {/* Voice Activity Indicator */}
+ {isListening && (
+
+
+
+
+
Listening...
+ {transcription && (
+
{transcription}
+ )}
+
+
+ {[...Array(5)].map((_, i) => (
+
+ ))}
+
+
+
+ )}
+
+ {/* Input */}
+
+
+
+ {isListening ? : }
+
+ setInputMessage(e.target.value)}
+ onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()}
+ placeholder="Type your message..."
+ className="flex-1 bg-white/10 border border-white/10 rounded-lg px-4 py-3 text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-purple-500"
+ />
+
+
+
+ setVoiceSettings(prev => ({ ...prev, voiceResponse: !prev.voiceResponse }))}
+ className={`p-3 rounded-lg transition-colors ${
+ voiceSettings.voiceResponse
+ ? 'bg-purple-500/20 text-purple-400'
+ : 'bg-white/10 text-gray-400'
+ }`}
+ >
+ {voiceSettings.voiceResponse ? : }
+
+
+
+
+ )}
+ >
+ );
+};
diff --git a/ai-design-platform/src/components/ai/AITraining.tsx b/ai-design-platform/src/components/ai/AITraining.tsx
new file mode 100644
index 0000000..ca2f462
--- /dev/null
+++ b/ai-design-platform/src/components/ai/AITraining.tsx
@@ -0,0 +1,541 @@
+import React, { useState } from 'react';
+import {
+ Upload,
+ Brain,
+ Settings,
+ Play,
+ Pause,
+ RotateCw,
+ CheckCircle,
+ FileText,
+ Database,
+ Activity,
+ Target,
+ Award,
+ AlertCircle,
+ Download,
+ Eye
+} from 'lucide-react';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer
+} from 'recharts';
+
+interface Dataset {
+ id: string;
+ name: string;
+ size: number;
+ type: string;
+ quality: number;
+ uploaded: Date;
+}
+
+interface TrainingMetrics {
+ epoch: number;
+ loss: number;
+ accuracy: number;
+ valLoss: number;
+ valAccuracy: number;
+}
+
+interface HyperParameter {
+ name: string;
+ value: number;
+ min: number;
+ max: number;
+ step: number;
+ description: string;
+}
+
+export const AITraining: React.FC = () => {
+ const [activeTab, setActiveTab] = useState<'upload' | 'training' | 'evaluation' | 'hyperparameters' | 'active-learning'>('upload');
+ const [isTraining, setIsTraining] = useState(false);
+ const [trainingProgress, setTrainingProgress] = useState(0);
+
+ const [datasets, setDatasets] = useState([
+ {
+ id: '1',
+ name: 'Customer_Data_2024.csv',
+ size: 2.4,
+ type: 'CSV',
+ quality: 92,
+ uploaded: new Date('2024-01-15')
+ },
+ {
+ id: '2',
+ name: 'Product_Images.zip',
+ size: 145.8,
+ type: 'Images',
+ quality: 88,
+ uploaded: new Date('2024-01-14')
+ },
+ {
+ id: '3',
+ name: 'Transaction_Logs.json',
+ size: 18.5,
+ type: 'JSON',
+ quality: 95,
+ uploaded: new Date('2024-01-13')
+ }
+ ]);
+
+ const [hyperparameters, setHyperparameters] = useState([
+ { name: 'Learning Rate', value: 0.001, min: 0.0001, max: 0.1, step: 0.0001, description: 'Controls how much to change the model in response to error' },
+ { name: 'Batch Size', value: 32, min: 8, max: 256, step: 8, description: 'Number of samples processed before the model is updated' },
+ { name: 'Epochs', value: 100, min: 10, max: 1000, step: 10, description: 'Number of complete passes through the training dataset' },
+ { name: 'Dropout Rate', value: 0.2, min: 0, max: 0.8, step: 0.05, description: 'Fraction of neurons to drop for regularization' },
+ { name: 'Weight Decay', value: 0.0001, min: 0, max: 0.01, step: 0.0001, description: 'L2 regularization parameter' }
+ ]);
+
+ const trainingMetrics: TrainingMetrics[] = [
+ { epoch: 1, loss: 0.89, accuracy: 65, valLoss: 0.92, valAccuracy: 63 },
+ { epoch: 2, loss: 0.75, accuracy: 72, valLoss: 0.78, valAccuracy: 70 },
+ { epoch: 3, loss: 0.63, accuracy: 78, valLoss: 0.68, valAccuracy: 76 },
+ { epoch: 4, loss: 0.54, accuracy: 82, valLoss: 0.59, valAccuracy: 80 },
+ { epoch: 5, loss: 0.47, accuracy: 86, valLoss: 0.52, valAccuracy: 84 },
+ { epoch: 6, loss: 0.41, accuracy: 89, valLoss: 0.47, valAccuracy: 87 },
+ { epoch: 7, loss: 0.36, accuracy: 91, valLoss: 0.43, valAccuracy: 89 },
+ { epoch: 8, loss: 0.32, accuracy: 93, valLoss: 0.40, valAccuracy: 91 }
+ ];
+
+ const evaluationMetrics = [
+ { name: 'Accuracy', value: 93.2, target: 90, status: 'excellent' },
+ { name: 'Precision', value: 91.8, target: 88, status: 'excellent' },
+ { name: 'Recall', value: 92.5, target: 87, status: 'excellent' },
+ { name: 'F1 Score', value: 92.1, target: 88, status: 'excellent' },
+ { name: 'AUC-ROC', value: 0.95, target: 0.90, status: 'excellent' }
+ ];
+
+ const activeLearningData = [
+ { id: '1', sample: 'Sample #1247', confidence: 45, label: 'Uncertain', priority: 'high' },
+ { id: '2', sample: 'Sample #1248', confidence: 52, label: 'Uncertain', priority: 'high' },
+ { id: '3', sample: 'Sample #1249', confidence: 61, label: 'Uncertain', priority: 'medium' },
+ { id: '4', sample: 'Sample #1250', confidence: 68, label: 'Review', priority: 'medium' },
+ { id: '5', sample: 'Sample #1251', confidence: 71, label: 'Review', priority: 'low' }
+ ];
+
+ const handleUpload = (e: React.ChangeEvent) => {
+ const files = e.target.files;
+ if (files && files.length > 0) {
+ // Simulate file upload
+ const newDataset: Dataset = {
+ id: Date.now().toString(),
+ name: files[0].name,
+ size: files[0].size / (1024 * 1024),
+ type: files[0].type.includes('image') ? 'Images' :
+ files[0].type.includes('json') ? 'JSON' : 'CSV',
+ quality: Math.floor(Math.random() * 20) + 80,
+ uploaded: new Date()
+ };
+ setDatasets(prev => [...prev, newDataset]);
+ }
+ };
+
+ const startTraining = () => {
+ setIsTraining(true);
+ setTrainingProgress(0);
+
+ const interval = setInterval(() => {
+ setTrainingProgress(prev => {
+ if (prev >= 100) {
+ clearInterval(interval);
+ setIsTraining(false);
+ return 100;
+ }
+ return prev + 2;
+ });
+ }, 100);
+ };
+
+ const updateHyperparameter = (index: number, value: number) => {
+ setHyperparameters(prev => prev.map((hp, i) =>
+ i === index ? { ...hp, value } : hp
+ ));
+ };
+
+ return (
+
+ {/* Header */}
+
+
+
AI Training Studio
+
Train and optimize custom AI models
+
+
+
+
+ Export Model
+
+
+ {isTraining ? (
+ <>
+
+ Training...
+ >
+ ) : (
+ <>
+
+ Start Training
+ >
+ )}
+
+
+
+
+ {/* Tabs */}
+
+ {[
+ { id: 'upload', label: 'Dataset Upload', icon:
},
+ { id: 'training', label: 'Training Progress', icon:
},
+ { id: 'evaluation', label: 'Model Evaluation', icon:
},
+ { id: 'hyperparameters', label: 'Hyperparameters', icon:
},
+ { id: 'active-learning', label: 'Active Learning', icon:
}
+ ].map(tab => (
+
setActiveTab(tab.id as any)}
+ className={`flex items-center gap-2 px-4 py-3 border-b-2 transition-all whitespace-nowrap ${
+ activeTab === tab.id
+ ? 'border-purple-500 text-purple-400'
+ : 'border-transparent text-gray-400 hover:text-white'
+ }`}
+ >
+ {tab.icon}
+ {tab.label}
+
+ ))}
+
+
+ {/* Dataset Upload */}
+ {activeTab === 'upload' && (
+
+ {/* Upload Area */}
+
+
+
+
+
+
+
+ Upload Training Data
+
+ Drag and drop files or click to browse
+
+
+ Supports CSV, JSON, Images (PNG, JPG), and Archive files (ZIP)
+
+
+
+
+
+ {/* Dataset List */}
+
+
Uploaded Datasets
+
+ {datasets.map(dataset => (
+
+
+
+
+ {dataset.type === 'Images' ? : }
+
+
+
{dataset.name}
+
+ {dataset.size.toFixed(1)} MB
+ •
+ {dataset.type}
+ •
+ {dataset.uploaded.toLocaleDateString()}
+
+
+
+ Data Quality
+ = 90 ? 'text-green-400' :
+ dataset.quality >= 75 ? 'text-yellow-400' : 'text-red-400'
+ }`}>
+ {dataset.quality}%
+
+
+
+
= 90 ? 'bg-green-500' :
+ dataset.quality >= 75 ? 'bg-yellow-500' : 'bg-red-500'
+ }`}
+ style={{ width: `${dataset.quality}%` }}
+ />
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Training Progress */}
+ {activeTab === 'training' && (
+
+ {/* Training Status */}
+
+
+
+
Training Status
+
+ {isTraining ? 'Model training in progress...' : 'Ready to train'}
+
+
+
+ {isTraining && (
+
+ )}
+
+ {isTraining ? 'Active' : 'Idle'}
+
+
+
+
+ {isTraining && (
+
+
+ Overall Progress
+ {trainingProgress}%
+
+
+
+
+ Epoch:
+
+ {Math.floor(trainingProgress / 12.5)} / 8
+
+
+
+ Loss:
+ 0.32
+
+
+ Accuracy:
+ 93%
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ {/* Model Evaluation */}
+ {activeTab === 'evaluation' && (
+
+
+ {evaluationMetrics.map((metric, idx) => (
+
+
+
+
{metric.name}
+
+ {metric.name === 'AUC-ROC' ? metric.value.toFixed(2) : `${metric.value}%`}
+
+
+
+
+
+ Target:
+
+ {metric.name === 'AUC-ROC' ? metric.target.toFixed(2) : `${metric.target}%`}
+
+
+
+
+ ))}
+
+
+
+
+ )}
+
+ {/* Hyperparameters */}
+ {activeTab === 'hyperparameters' && (
+
+
+
+
Hyperparameter Tuning
+
Adjust model training parameters
+
+
+
+ Reset to Default
+
+
+
+
+ {hyperparameters.map((param, idx) => (
+
+
+
+
{param.name}
+
{param.description}
+
+
+
{param.value}
+
+ {param.min} - {param.max}
+
+
+
+
updateHyperparameter(idx, parseFloat(e.target.value))}
+ className="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-purple-500"
+ />
+
+ {param.min}
+ {param.max}
+
+
+ ))}
+
+
+ )}
+
+ {/* Active Learning */}
+ {activeTab === 'active-learning' && (
+
+
+
+
+
Active Learning Queue
+
Review uncertain predictions for model improvement
+
+
+
+ Label Batch
+
+
+
+
+ {activeLearningData.map((sample) => (
+
+
+
+
+ {sample.sample}
+
+ {sample.priority.toUpperCase()}
+
+
+
+
+
+ Confidence: {sample.confidence}%
+
+
+
+
+
+ Review
+ Label
+
+
+
+ ))}
+
+
+
+ )}
+
+ );
+};
diff --git a/ai-design-platform/src/components/ai/AgentBuilder.tsx b/ai-design-platform/src/components/ai/AgentBuilder.tsx
new file mode 100644
index 0000000..3ed2505
--- /dev/null
+++ b/ai-design-platform/src/components/ai/AgentBuilder.tsx
@@ -0,0 +1,543 @@
+import React, { useState } from 'react';
+import {
+ MessageSquare,
+ Target,
+ Sparkles,
+ Play,
+ Settings,
+ Download,
+ GitBranch,
+ BarChart3,
+ Layout,
+ Layers,
+ Zap,
+ Upload,
+ Save,
+ Code,
+ Cloud
+} from 'lucide-react';
+import {
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ ResponsiveContainer,
+ AreaChart,
+ Area
+} from 'recharts';
+
+interface AgentTemplate {
+ id: string;
+ name: string;
+ description: string;
+ icon: React.ReactNode;
+ category: string;
+ complexity: 'basic' | 'intermediate' | 'advanced';
+}
+
+interface WorkflowNode {
+ id: string;
+ type: 'input' | 'process' | 'decision' | 'output';
+ label: string;
+ x: number;
+ y: number;
+}
+
+interface AgentVersion {
+ version: string;
+ date: Date;
+ accuracy: number;
+ status: 'active' | 'archived';
+}
+
+interface AnalyticsData {
+ date: string;
+ requests: number;
+ accuracy: number;
+ avgLatency: number;
+}
+
+export const AgentBuilder: React.FC = () => {
+ const [selectedTemplate, setSelectedTemplate] = useState
('chatbot');
+ const [agentName, setAgentName] = useState('My AI Agent');
+ const [isTraining, setIsTraining] = useState(false);
+ const [deploymentTarget, setDeploymentTarget] = useState('cloud');
+
+ const templates: AgentTemplate[] = [
+ {
+ id: 'chatbot',
+ name: 'Conversational Chatbot',
+ description: 'Customer service and support chatbot with natural language understanding',
+ icon: ,
+ category: 'Communication',
+ complexity: 'basic'
+ },
+ {
+ id: 'classifier',
+ name: 'Content Classifier',
+ description: 'Classify and categorize content, documents, or messages',
+ icon: ,
+ category: 'Analysis',
+ complexity: 'intermediate'
+ },
+ {
+ id: 'recommender',
+ name: 'Recommendation Engine',
+ description: 'Personalized recommendations based on user behavior and preferences',
+ icon: ,
+ category: 'Personalization',
+ complexity: 'advanced'
+ },
+ {
+ id: 'sentiment',
+ name: 'Sentiment Analyzer',
+ description: 'Analyze sentiment and emotions in text data',
+ icon: ,
+ category: 'Analysis',
+ complexity: 'basic'
+ },
+ {
+ id: 'summarizer',
+ name: 'Document Summarizer',
+ description: 'Generate concise summaries of long documents',
+ icon: ,
+ category: 'Processing',
+ complexity: 'intermediate'
+ },
+ {
+ id: 'translator',
+ name: 'Language Translator',
+ description: 'Multi-language translation with context awareness',
+ icon: ,
+ category: 'Communication',
+ complexity: 'advanced'
+ }
+ ];
+
+ const workflowNodes: WorkflowNode[] = [
+ { id: '1', type: 'input', label: 'User Input', x: 50, y: 150 },
+ { id: '2', type: 'process', label: 'Preprocessing', x: 200, y: 150 },
+ { id: '3', type: 'process', label: 'AI Model', x: 350, y: 150 },
+ { id: '4', type: 'decision', label: 'Confidence Check', x: 500, y: 150 },
+ { id: '5', type: 'output', label: 'Response', x: 650, y: 100 },
+ { id: '6', type: 'process', label: 'Human Review', x: 650, y: 200 }
+ ];
+
+ const versions: AgentVersion[] = [
+ { version: 'v2.1.0', date: new Date('2024-01-22'), accuracy: 0.94, status: 'active' },
+ { version: 'v2.0.5', date: new Date('2024-01-15'), accuracy: 0.91, status: 'archived' },
+ { version: 'v2.0.0', date: new Date('2024-01-08'), accuracy: 0.88, status: 'archived' }
+ ];
+
+ const analyticsData: AnalyticsData[] = [
+ { date: 'Jan 15', requests: 1200, accuracy: 0.89, avgLatency: 145 },
+ { date: 'Jan 16', requests: 1450, accuracy: 0.90, avgLatency: 142 },
+ { date: 'Jan 17', requests: 1350, accuracy: 0.91, avgLatency: 138 },
+ { date: 'Jan 18', requests: 1580, accuracy: 0.92, avgLatency: 135 },
+ { date: 'Jan 19', requests: 1720, accuracy: 0.93, avgLatency: 132 },
+ { date: 'Jan 20', requests: 1650, accuracy: 0.93, avgLatency: 130 },
+ { date: 'Jan 21', requests: 1890, accuracy: 0.94, avgLatency: 128 },
+ { date: 'Jan 22', requests: 2100, accuracy: 0.94, avgLatency: 125 }
+ ];
+
+ const [configuration, setConfiguration] = useState({
+ maxTokens: 2048,
+ temperature: 0.7,
+ topP: 0.9,
+ frequencyPenalty: 0.0,
+ presencePenalty: 0.0,
+ systemPrompt: 'You are a helpful AI assistant.'
+ });
+
+ const handleTrain = () => {
+ setIsTraining(true);
+ setTimeout(() => setIsTraining(false), 3000);
+ };
+
+ const getNodeColor = (type: WorkflowNode['type']) => {
+ switch (type) {
+ case 'input': return 'bg-blue-500';
+ case 'process': return 'bg-purple-500';
+ case 'decision': return 'bg-yellow-500';
+ case 'output': return 'bg-green-500';
+ }
+ };
+
+ return (
+
+
+
+
Agent Builder
+
Design and deploy custom AI agents with visual workflow editor
+
+
+
+
+ Save Draft
+
+
+
+ Deploy Agent
+
+
+
+
+
+ {/* Main Canvas */}
+
+ {/* Templates */}
+
+
+
+
Pre-built Templates
+
+
+
+ {templates.map((template) => (
+
setSelectedTemplate(template.id)}
+ className={`p-4 rounded-lg cursor-pointer transition-all ${
+ selectedTemplate === template.id
+ ? 'bg-purple-500/20 border-2 border-purple-500'
+ : 'glass hover:bg-white/10 border-2 border-transparent'
+ }`}
+ >
+
+
+ {template.icon}
+
+
+
{template.name}
+
{template.description}
+
+
+ {template.category}
+
+
+ {template.complexity}
+
+
+
+
+
+ ))}
+
+
+
+ {/* Visual Workflow Canvas */}
+
+
+
+
+
Workflow Canvas
+
+
Drag to rearrange nodes
+
+
+
+ {/* Grid Pattern */}
+
+
+ {/* Workflow Nodes */}
+ {workflowNodes.map((node) => (
+
+
+
{node.label}
+
{node.type}
+
+ ))}
+
+ {/* Connection Lines (SVG) */}
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Training Interface */}
+
+
+
+
Training
+
+
+
+
+
+
+
Training Dataset
+
10,000 examples · 5.2 MB
+
+
+
+ Upload
+
+
+
+
+
+
+
+
+ {isTraining ? (
+ <>
+
+ Training...
+ >
+ ) : (
+ <>
+
+ Start Training
+ >
+ )}
+
+
+
+
+
+
+ {isTraining && (
+
+ )}
+
+
+
+ {/* Analytics Preview */}
+
+
+
+
Analytics Preview
+
+
+
+
+
Total Requests
+
12.4K
+
+24% this week
+
+
+
Accuracy
+
94.2%
+
+2.1% improvement
+
+
+
Avg Latency
+
125ms
+
-18ms faster
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Right Sidebar - Configuration */}
+
+ {/* Agent Configuration */}
+
+
+
+
Configuration
+
+
+
+
+
+ {/* Deployment Options */}
+
+
+
+
Deployment
+
+
+
+ {[
+ { id: 'cloud', name: 'Cloud', icon:
, desc: 'Managed cloud hosting' },
+ { id: 'edge', name: 'Edge', icon:
, desc: 'Low-latency edge deployment' },
+ { id: 'onprem', name: 'On-Premise', icon:
, desc: 'Self-hosted infrastructure' }
+ ].map((option) => (
+
setDeploymentTarget(option.id)}
+ className={`p-3 rounded-lg cursor-pointer transition-all ${
+ deploymentTarget === option.id
+ ? 'bg-purple-500/20 border border-purple-500'
+ : 'glass hover:bg-white/10'
+ }`}
+ >
+
+
{option.icon}
+
{option.name}
+
+
{option.desc}
+
+ ))}
+
+
+
+ {/* Version Control */}
+
+
+
+
Version Control
+
+
+
+ {versions.map((version) => (
+
+
+ {version.version}
+ {version.status === 'active' && (
+
+ Active
+
+ )}
+
+
+
{version.date.toLocaleDateString()}
+
Accuracy: {(version.accuracy * 100).toFixed(1)}%
+
+
+ ))}
+
+
+
+
+ Export Version
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/ai/CollaborationWorkspace.tsx b/ai-design-platform/src/components/ai/CollaborationWorkspace.tsx
new file mode 100644
index 0000000..88c9c89
--- /dev/null
+++ b/ai-design-platform/src/components/ai/CollaborationWorkspace.tsx
@@ -0,0 +1,476 @@
+import React, { useState } from 'react';
+import {
+ Users,
+ MessageSquare,
+ Video,
+ Clock,
+ GitBranch,
+ Eye,
+ Lock,
+ CheckCircle,
+ Code,
+ User,
+ Send,
+ MoreVertical,
+ Edit,
+ Share2
+} from 'lucide-react';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ ResponsiveContainer
+} from 'recharts';
+
+interface TeamMember {
+ id: string;
+ name: string;
+ avatar: string;
+ status: 'online' | 'away' | 'offline';
+ role: string;
+ currentFile?: string;
+}
+
+interface Comment {
+ id: string;
+ author: string;
+ content: string;
+ timestamp: Date;
+ lineNumber?: number;
+ resolved: boolean;
+}
+
+interface Version {
+ id: string;
+ timestamp: Date;
+ author: string;
+ message: string;
+ changes: number;
+}
+
+interface ChatMessage {
+ id: string;
+ author: string;
+ message: string;
+ timestamp: Date;
+}
+
+export const CollaborationWorkspace: React.FC = () => {
+ const [code, setCode] = useState(`import React from 'react';
+
+export const AIModel = () => {
+ const [result, setResult] = useState(null);
+
+ const runInference = async (input) => {
+ const response = await fetch('/api/inference', {
+ method: 'POST',
+ body: JSON.stringify({ input })
+ });
+ const data = await response.json();
+ setResult(data);
+ };
+
+ return (
+
+
AI Model Interface
+ {/* Add your UI here */}
+
+ );
+};`);
+
+ const [chatMessages, setChatMessages] = useState([
+ { id: '1', author: 'Sarah Chen', message: 'Updated the inference endpoint', timestamp: new Date('2024-01-22T10:30:00') },
+ { id: '2', author: 'Mike Johnson', message: 'Looks good! Can you add error handling?', timestamp: new Date('2024-01-22T10:32:00') },
+ { id: '3', author: 'Sarah Chen', message: 'Will do, working on it now', timestamp: new Date('2024-01-22T10:33:00') }
+ ]);
+
+ const [newMessage, setNewMessage] = useState('');
+
+ const teamMembers: TeamMember[] = [
+ { id: '1', name: 'Sarah Chen', avatar: 'SC', status: 'online', role: 'Lead Developer', currentFile: 'AIModel.tsx' },
+ { id: '2', name: 'Mike Johnson', avatar: 'MJ', status: 'online', role: 'ML Engineer', currentFile: 'model.py' },
+ { id: '3', name: 'Emma Wilson', avatar: 'EW', status: 'away', role: 'Data Scientist' },
+ { id: '4', name: 'Alex Kumar', avatar: 'AK', status: 'online', role: 'DevOps' },
+ { id: '5', name: 'Lisa Park', avatar: 'LP', status: 'offline', role: 'Product Manager' }
+ ];
+
+ const comments: Comment[] = [
+ { id: '1', author: 'Mike Johnson', content: 'Should we add type checking here?', timestamp: new Date('2024-01-22T09:15:00'), lineNumber: 5, resolved: false },
+ { id: '2', author: 'Emma Wilson', content: 'Consider using async/await wrapper', timestamp: new Date('2024-01-22T09:45:00'), lineNumber: 8, resolved: true },
+ { id: '3', author: 'Alex Kumar', content: 'Add rate limiting to this endpoint', timestamp: new Date('2024-01-22T10:00:00'), lineNumber: 7, resolved: false }
+ ];
+
+ const versionHistory: Version[] = [
+ { id: '1', timestamp: new Date('2024-01-22T10:30:00'), author: 'Sarah Chen', message: 'Update inference endpoint', changes: 12 },
+ { id: '2', timestamp: new Date('2024-01-22T09:45:00'), author: 'Mike Johnson', message: 'Add error handling', changes: 8 },
+ { id: '3', timestamp: new Date('2024-01-22T09:00:00'), author: 'Emma Wilson', message: 'Optimize model loading', changes: 15 },
+ { id: '4', timestamp: new Date('2024-01-22T08:30:00'), author: 'Sarah Chen', message: 'Initial model implementation', changes: 45 }
+ ];
+
+ const activityData = [
+ { time: '09:00', commits: 2, reviews: 1, comments: 3 },
+ { time: '10:00', commits: 5, reviews: 3, comments: 7 },
+ { time: '11:00', commits: 3, reviews: 2, comments: 5 },
+ { time: '12:00', commits: 1, reviews: 1, comments: 2 },
+ { time: '13:00', commits: 4, reviews: 2, comments: 6 },
+ { time: '14:00', commits: 6, reviews: 4, comments: 8 }
+ ];
+
+ const getStatusColor = (status: TeamMember['status']) => {
+ switch (status) {
+ case 'online': return 'bg-green-400';
+ case 'away': return 'bg-yellow-400';
+ case 'offline': return 'bg-gray-400';
+ }
+ };
+
+ const handleSendMessage = () => {
+ if (newMessage.trim()) {
+ setChatMessages([...chatMessages, {
+ id: String(chatMessages.length + 1),
+ author: 'You',
+ message: newMessage,
+ timestamp: new Date()
+ }]);
+ setNewMessage('');
+ }
+ };
+
+ return (
+
+
+
+
Collaboration Workspace
+
Real-time team collaboration on AI projects
+
+
+
+
+ Share
+
+
+
+ Start Call
+
+
+
+
+ {/* Team Presence Bar */}
+
+
+
+
+
+ Team ({teamMembers.filter(m => m.status === 'online').length} online)
+
+
+ {teamMembers.map((member) => (
+
+
+ {member.avatar}
+
+
+
+ ))}
+
+
+
+
+ Screen sharing: Off
+
+
+
+
+
+ {/* Code Editor & Comments */}
+
+ {/* Live Code Editor */}
+
+
+
+
+
AIModel.tsx
+
+
+
+ {teamMembers.slice(0, 2).map((member) => (
+
+ {member.avatar[0]}
+
+ ))}
+
+
2 editing
+
+
+
+
+
+
+
+ Format
+
+
+
+ Preview
+
+
+
+
+
+
+
+
Last saved: 2 minutes ago
+
+
+
+ {/* Comments & Annotations */}
+
+
+
+
Comments & Annotations
+
+
+
+ {comments.map((comment) => (
+
+
+
+
+ {comment.author}
+ {comment.lineNumber && (
+
+ Line {comment.lineNumber}
+
+ )}
+
+ {comment.resolved && (
+
+ )}
+
+
{comment.content}
+
+
+ {comment.timestamp.toLocaleTimeString()}
+
+ {!comment.resolved && (
+
+ Resolve
+
+ )}
+
+
+ ))}
+
+
+
+
+
+
+
+ {/* Activity Chart */}
+
+
+
+
Team Activity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Right Sidebar */}
+
+ {/* Team Members */}
+
+
+
+
Team
+
+
+
+ {teamMembers.map((member) => (
+
+
+
+
+ {member.avatar}
+
+
+
+
+
{member.name}
+
{member.role}
+ {member.currentFile && (
+
+
+ {member.currentFile}
+
+ )}
+
+
+
+ ))}
+
+
+
+ {/* Chat */}
+
+
+
+
Team Chat
+
+
+
+ {chatMessages.map((msg) => (
+
+
+ {msg.author}
+
+ {msg.timestamp.toLocaleTimeString()}
+
+
+
+ {msg.message}
+
+
+ ))}
+
+
+
+ setNewMessage(e.target.value)}
+ onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()}
+ placeholder="Type a message..."
+ className="flex-1 bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm"
+ />
+
+
+
+
+
+
+ {/* Version History */}
+
+
+
+
Version History
+
+
+
+ {versionHistory.map((version) => (
+
+
+ {version.message}
+
+
+
+
+
+ {version.author} · {version.timestamp.toLocaleTimeString()}
+
+
+ {version.changes} changes
+
+
+ ))}
+
+
+
+ {/* Permissions */}
+
+
+
+
Permissions
+
+
+
+
+
+
View Access
+
Who can view this project
+
+
+ Team Only
+ Organization
+ Public
+
+
+
+
+
+
Edit Access
+
Who can make changes
+
+
+ Admins Only
+ Team Members
+ Everyone
+
+
+
+
+
+
Share Externally
+
Allow external sharing
+
+
+ Enabled
+
+
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/ai/DeveloperPortal.tsx b/ai-design-platform/src/components/ai/DeveloperPortal.tsx
new file mode 100644
index 0000000..ae3388f
--- /dev/null
+++ b/ai-design-platform/src/components/ai/DeveloperPortal.tsx
@@ -0,0 +1,617 @@
+import React, { useState } from 'react';
+import {
+ Code,
+ Book,
+ Play,
+ Download,
+ Key,
+ Webhook,
+ Zap,
+ Copy,
+ CheckCircle,
+ AlertCircle,
+ Globe,
+ Clock,
+ TrendingUp
+} from 'lucide-react';
+import {
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ ResponsiveContainer,
+ BarChart,
+ Bar
+} from 'recharts';
+
+interface APIEndpoint {
+ id: string;
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
+ path: string;
+ description: string;
+ category: 'REST' | 'GraphQL';
+}
+
+interface CodeExample {
+ language: string;
+ code: string;
+ icon: string;
+}
+
+interface SDK {
+ name: string;
+ language: string;
+ version: string;
+ downloads: number;
+ size: string;
+}
+
+interface RateLimit {
+ tier: string;
+ requestsPerMinute: number;
+ requestsPerDay: number;
+ burstAllowance: number;
+}
+
+export const DeveloperPortal: React.FC = () => {
+ const [selectedEndpoint, setSelectedEndpoint] = useState('inference');
+ const [selectedLanguage, setSelectedLanguage] = useState('python');
+ const [copied, setCopied] = useState(false);
+ const [testResponse, setTestResponse] = useState(null);
+
+ const apiKey = 'sk_live_abc123def456...';
+
+ const endpoints: APIEndpoint[] = [
+ { id: 'inference', method: 'POST', path: '/api/v1/inference', description: 'Run model inference', category: 'REST' },
+ { id: 'models', method: 'GET', path: '/api/v1/models', description: 'List available models', category: 'REST' },
+ { id: 'train', method: 'POST', path: '/api/v1/train', description: 'Start training job', category: 'REST' },
+ { id: 'jobs', method: 'GET', path: '/api/v1/jobs/:id', description: 'Get job status', category: 'REST' },
+ { id: 'datasets', method: 'POST', path: '/api/v1/datasets', description: 'Upload dataset', category: 'REST' },
+ { id: 'metrics', method: 'GET', path: '/api/v1/metrics', description: 'Get model metrics', category: 'REST' },
+ { id: 'graphql', method: 'POST', path: '/graphql', description: 'GraphQL endpoint', category: 'GraphQL' }
+ ];
+
+ const codeExamples: Record = {
+ inference: [
+ {
+ language: 'python',
+ icon: '🐍',
+ code: `import requests
+
+api_key = "sk_live_abc123def456..."
+url = "https://api.aiplatform.com/v1/inference"
+
+headers = {
+ "Authorization": f"Bearer {api_key}",
+ "Content-Type": "application/json"
+}
+
+payload = {
+ "model": "gpt-4",
+ "input": "What is machine learning?",
+ "max_tokens": 100
+}
+
+response = requests.post(url, json=payload, headers=headers)
+result = response.json()
+print(result)`
+ },
+ {
+ language: 'javascript',
+ icon: '📜',
+ code: `const apiKey = 'sk_live_abc123def456...';
+const url = 'https://api.aiplatform.com/v1/inference';
+
+const response = await fetch(url, {
+ method: 'POST',
+ headers: {
+ 'Authorization': \`Bearer \${apiKey}\`,
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify({
+ model: 'gpt-4',
+ input: 'What is machine learning?',
+ max_tokens: 100
+ })
+});
+
+const result = await response.json();
+console.log(result);`
+ },
+ {
+ language: 'java',
+ icon: '☕',
+ code: `import java.net.http.*;
+import java.net.URI;
+
+String apiKey = "sk_live_abc123def456...";
+String url = "https://api.aiplatform.com/v1/inference";
+
+HttpClient client = HttpClient.newHttpClient();
+HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(url))
+ .header("Authorization", "Bearer " + apiKey)
+ .header("Content-Type", "application/json")
+ .POST(HttpRequest.BodyPublishers.ofString(
+ "{\\"model\\":\\"gpt-4\\",\\"input\\":\\"What is ML?\\"}"
+ ))
+ .build();
+
+HttpResponse response = client.send(request,
+ HttpResponse.BodyHandlers.ofString());
+System.out.println(response.body());`
+ },
+ {
+ language: 'go',
+ icon: '🔷',
+ code: `package main
+
+import (
+ "bytes"
+ "encoding/json"
+ "net/http"
+)
+
+func main() {
+ apiKey := "sk_live_abc123def456..."
+ url := "https://api.aiplatform.com/v1/inference"
+
+ payload := map[string]interface{}{
+ "model": "gpt-4",
+ "input": "What is machine learning?",
+ "max_tokens": 100,
+ }
+
+ jsonData, _ := json.Marshal(payload)
+ req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
+ req.Header.Set("Authorization", "Bearer "+apiKey)
+ req.Header.Set("Content-Type", "application/json")
+
+ client := &http.Client{}
+ resp, _ := client.Do(req)
+ defer resp.Body.Close()
+}`
+ },
+ {
+ language: 'ruby',
+ icon: '💎',
+ code: `require 'net/http'
+require 'json'
+
+api_key = 'sk_live_abc123def456...'
+url = URI('https://api.aiplatform.com/v1/inference')
+
+http = Net::HTTP.new(url.host, url.port)
+http.use_ssl = true
+
+request = Net::HTTP::Post.new(url)
+request['Authorization'] = "Bearer #{api_key}"
+request['Content-Type'] = 'application/json'
+
+request.body = {
+ model: 'gpt-4',
+ input: 'What is machine learning?',
+ max_tokens: 100
+}.to_json
+
+response = http.request(request)
+puts JSON.parse(response.body)`
+ }
+ ]
+ };
+
+ const sdks: SDK[] = [
+ { name: 'Python SDK', language: 'Python', version: '2.1.0', downloads: 125000, size: '2.4 MB' },
+ { name: 'JavaScript SDK', language: 'JavaScript', version: '1.8.5', downloads: 98000, size: '1.8 MB' },
+ { name: 'Java SDK', language: 'Java', version: '1.5.2', downloads: 45000, size: '4.2 MB' },
+ { name: 'Go SDK', language: 'Go', version: '1.3.0', downloads: 32000, size: '1.2 MB' },
+ { name: 'Ruby SDK', language: 'Ruby', version: '1.2.8', downloads: 18000, size: '1.5 MB' }
+ ];
+
+ const rateLimits: RateLimit[] = [
+ { tier: 'Free', requestsPerMinute: 60, requestsPerDay: 1000, burstAllowance: 10 },
+ { tier: 'Pro', requestsPerMinute: 600, requestsPerDay: 100000, burstAllowance: 100 },
+ { tier: 'Enterprise', requestsPerMinute: 6000, requestsPerDay: 1000000, burstAllowance: 1000 }
+ ];
+
+ const usageData = [
+ { date: 'Jan 15', requests: 8500, errors: 45 },
+ { date: 'Jan 16', requests: 9200, errors: 32 },
+ { date: 'Jan 17', requests: 8900, errors: 28 },
+ { date: 'Jan 18', requests: 10500, errors: 51 },
+ { date: 'Jan 19', requests: 11200, errors: 38 },
+ { date: 'Jan 20', requests: 10800, errors: 42 },
+ { date: 'Jan 21', requests: 12400, errors: 35 }
+ ];
+
+ const handleCopyApiKey = () => {
+ navigator.clipboard.writeText(apiKey);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ };
+
+ const handleTryIt = () => {
+ setTestResponse({
+ status: 200,
+ data: {
+ model: 'gpt-4',
+ output: 'Machine learning is a subset of artificial intelligence that enables systems to learn and improve from experience without being explicitly programmed.',
+ tokens: 23,
+ latency: 145
+ }
+ });
+ };
+
+ const getMethodColor = (method: string) => {
+ switch (method) {
+ case 'GET': return 'text-green-400 bg-green-400/10';
+ case 'POST': return 'text-blue-400 bg-blue-400/10';
+ case 'PUT': return 'text-yellow-400 bg-yellow-400/10';
+ case 'DELETE': return 'text-red-400 bg-red-400/10';
+ default: return 'text-gray-400 bg-gray-400/10';
+ }
+ };
+
+ return (
+
+
+
+
Developer Portal
+
Comprehensive API documentation and developer resources
+
+
+
+
+ Docs
+
+
+
+ Generate API Key
+
+
+
+
+ {/* API Key Section */}
+
+
+
+
API Key
+
+
+
+
+ {apiKey}
+
+ {copied ? : }
+
+
+
+
+
+
+
+ Keep your API key secure. Never expose it in client-side code or public repositories.
+
+
+
+
+
+ {/* API Endpoints & Examples */}
+
+ {/* Endpoints List */}
+
+
+
+
+
API Endpoints
+
+
+ REST
+ GraphQL
+
+
+
+
+ {endpoints.map((endpoint) => (
+
setSelectedEndpoint(endpoint.id)}
+ className={`p-4 rounded-lg cursor-pointer transition-all ${
+ selectedEndpoint === endpoint.id
+ ? 'bg-purple-500/20 border border-purple-500'
+ : 'glass hover:bg-white/10'
+ }`}
+ >
+
+
+ {endpoint.method}
+
+ {endpoint.path}
+
+
{endpoint.description}
+
+ ))}
+
+
+
+ {/* Code Examples */}
+
+
+
+
+
Code Examples
+
+
+ {['python', 'javascript', 'java', 'go', 'ruby'].map((lang) => (
+ setSelectedLanguage(lang)}
+ className={`px-3 py-1 rounded-lg text-xs font-medium transition-colors ${
+ selectedLanguage === lang
+ ? 'bg-purple-500 text-white'
+ : 'bg-white/5 text-gray-400 hover:bg-white/10'
+ }`}
+ >
+ {lang.charAt(0).toUpperCase() + lang.slice(1)}
+
+ ))}
+
+
+
+ {codeExamples[selectedEndpoint]?.find(ex => ex.language === selectedLanguage) && (
+
+
{
+ const code = codeExamples[selectedEndpoint].find(ex => ex.language === selectedLanguage)?.code || '';
+ navigator.clipboard.writeText(code);
+ }}
+ className="absolute top-4 right-4 btn-secondary text-xs z-10"
+ >
+
+ Copy
+
+
+
+ {codeExamples[selectedEndpoint].find(ex => ex.language === selectedLanguage)?.code}
+
+
+
+ )}
+
+
+ {/* Try It Out */}
+
+
+
+
+
+ Request Body
+
+
+
+
+
+ Send Request
+
+
+ {testResponse && (
+
+
+
+
+ {testResponse.status} OK
+
+
+ {testResponse.data.latency}ms
+
+
+
+
+
Response
+
+
+ {JSON.stringify(testResponse.data, null, 2)}
+
+
+
+
+ )}
+
+
+
+ {/* API Usage Statistics */}
+
+
+
+
API Usage
+
+
+
+
+
Requests (7d)
+
71.5K
+
+12.3%
+
+
+
Success Rate
+
99.6%
+
+0.2%
+
+
+
Avg Latency
+
142ms
+
-8ms
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Right Sidebar */}
+
+ {/* SDK Downloads */}
+
+
+
+
SDK Downloads
+
+
+
+ {sdks.map((sdk) => (
+
+
+
{sdk.name}
+
{sdk.version}
+
+
+ {sdk.downloads.toLocaleString()} downloads
+ {sdk.size}
+
+
+
+ Download
+
+
+ ))}
+
+
+
+ {/* Webhooks */}
+
+
+
+
Webhooks
+
+
+
+
+ Configure webhooks to receive real-time notifications about events.
+
+
+
+ Webhook URL
+
+
+
+
+
Events
+
+ {['model.trained', 'job.completed', 'inference.error', 'dataset.uploaded'].map((event) => (
+
+
+ {event}
+
+ ))}
+
+
+
+
+
+ Add Webhook
+
+
+
+
+ {/* Rate Limits */}
+
+
+
+
Rate Limits
+
+
+
+ {rateLimits.map((limit) => (
+
+
{limit.tier}
+
+
+ Per Minute:
+ {limit.requestsPerMinute.toLocaleString()}
+
+
+ Per Day:
+ {limit.requestsPerDay.toLocaleString()}
+
+
+ Burst:
+ {limit.burstAllowance}
+
+
+
+ ))}
+
+
+
+
+ Current tier: Pro
+
+
+ Upgrade to Enterprise for higher limits
+
+
+
+
+ {/* Quick Links */}
+
+
+
+
Resources
+
+
+
+ {[
+ { name: 'API Reference', icon:
},
+ { name: 'Tutorials', icon:
},
+ { name: 'Community Forum', icon:
},
+ { name: 'Status Page', icon:
},
+ { name: 'Changelog', icon:
}
+ ].map((resource) => (
+
+ {resource.icon}
+ {resource.name}
+
+ ))}
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/ai/ModelComparison.tsx b/ai-design-platform/src/components/ai/ModelComparison.tsx
new file mode 100644
index 0000000..4b9a292
--- /dev/null
+++ b/ai-design-platform/src/components/ai/ModelComparison.tsx
@@ -0,0 +1,634 @@
+import React, { useState } from 'react';
+import {
+ Download,
+ CheckCircle,
+ TrendingUp,
+ DollarSign,
+ Zap,
+ Clock,
+ Target,
+ Award
+} from 'lucide-react';
+import {
+ RadarChart,
+ PolarGrid,
+ PolarAngleAxis,
+ PolarRadiusAxis,
+ Radar,
+ ResponsiveContainer,
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip
+} from 'recharts';
+
+interface Model {
+ id: string;
+ name: string;
+ version: string;
+ type: string;
+}
+
+interface ModelMetrics {
+ modelId: string;
+ accuracy: number;
+ precision: number;
+ recall: number;
+ f1Score: number;
+ latency: number;
+ throughput: number;
+ costPerRequest: number;
+ memoryUsage: number;
+}
+
+interface BenchmarkResult {
+ test: string;
+ model1: number;
+ model2: number;
+ model3: number;
+ model4: number;
+}
+
+export const ModelComparison: React.FC = () => {
+ const availableModels: Model[] = [
+ { id: 'gpt4', name: 'GPT-4', version: 'v1.0', type: 'Language Model' },
+ { id: 'gpt3.5', name: 'GPT-3.5 Turbo', version: 'v1.0', type: 'Language Model' },
+ { id: 'claude3', name: 'Claude 3 Opus', version: 'v3.0', type: 'Language Model' },
+ { id: 'claude2', name: 'Claude 2', version: 'v2.1', type: 'Language Model' },
+ { id: 'gemini', name: 'Gemini Pro', version: 'v1.0', type: 'Language Model' },
+ { id: 'llama2', name: 'Llama 2 70B', version: 'v2.0', type: 'Language Model' },
+ { id: 'mistral', name: 'Mistral 7B', version: 'v1.0', type: 'Language Model' },
+ { id: 'custom1', name: 'Custom Model A', version: 'v2.3', type: 'Fine-tuned' }
+ ];
+
+ const [selectedModels, setSelectedModels] = useState(['gpt4', 'claude3', 'gemini', 'llama2']);
+
+ const metrics: Record = {
+ gpt4: {
+ modelId: 'gpt4',
+ accuracy: 0.94,
+ precision: 0.92,
+ recall: 0.95,
+ f1Score: 0.93,
+ latency: 1200,
+ throughput: 850,
+ costPerRequest: 0.03,
+ memoryUsage: 4.5
+ },
+ 'gpt3.5': {
+ modelId: 'gpt3.5',
+ accuracy: 0.88,
+ precision: 0.86,
+ recall: 0.89,
+ f1Score: 0.87,
+ latency: 450,
+ throughput: 2200,
+ costPerRequest: 0.002,
+ memoryUsage: 2.1
+ },
+ claude3: {
+ modelId: 'claude3',
+ accuracy: 0.93,
+ precision: 0.91,
+ recall: 0.94,
+ f1Score: 0.92,
+ latency: 1100,
+ throughput: 900,
+ costPerRequest: 0.015,
+ memoryUsage: 4.2
+ },
+ claude2: {
+ modelId: 'claude2',
+ accuracy: 0.89,
+ precision: 0.87,
+ recall: 0.90,
+ f1Score: 0.88,
+ latency: 800,
+ throughput: 1250,
+ costPerRequest: 0.008,
+ memoryUsage: 3.4
+ },
+ gemini: {
+ modelId: 'gemini',
+ accuracy: 0.91,
+ precision: 0.89,
+ recall: 0.92,
+ f1Score: 0.90,
+ latency: 950,
+ throughput: 1050,
+ costPerRequest: 0.01,
+ memoryUsage: 3.8
+ },
+ llama2: {
+ modelId: 'llama2',
+ accuracy: 0.86,
+ precision: 0.84,
+ recall: 0.87,
+ f1Score: 0.85,
+ latency: 600,
+ throughput: 1650,
+ costPerRequest: 0.001,
+ memoryUsage: 2.8
+ },
+ mistral: {
+ modelId: 'mistral',
+ accuracy: 0.85,
+ precision: 0.83,
+ recall: 0.86,
+ f1Score: 0.84,
+ latency: 350,
+ throughput: 2800,
+ costPerRequest: 0.0005,
+ memoryUsage: 1.9
+ },
+ custom1: {
+ modelId: 'custom1',
+ accuracy: 0.90,
+ precision: 0.88,
+ recall: 0.91,
+ f1Score: 0.89,
+ latency: 520,
+ throughput: 1900,
+ costPerRequest: 0.005,
+ memoryUsage: 2.5
+ }
+ };
+
+ const getRadarData = () => {
+ const categories = ['Accuracy', 'Precision', 'Recall', 'F1-Score', 'Speed'];
+
+ return categories.map(category => {
+ const dataPoint: any = { category };
+
+ selectedModels.forEach((modelId, index) => {
+ const modelMetrics = metrics[modelId];
+ if (modelMetrics) {
+ let value = 0;
+ switch (category) {
+ case 'Accuracy':
+ value = modelMetrics.accuracy * 100;
+ break;
+ case 'Precision':
+ value = modelMetrics.precision * 100;
+ break;
+ case 'Recall':
+ value = modelMetrics.recall * 100;
+ break;
+ case 'F1-Score':
+ value = modelMetrics.f1Score * 100;
+ break;
+ case 'Speed':
+ value = Math.min(100, (3000 - modelMetrics.latency) / 30);
+ break;
+ }
+ dataPoint[`model${index + 1}`] = value;
+ }
+ });
+
+ return dataPoint;
+ });
+ };
+
+ const getLatencyData = () => {
+ return selectedModels.map((modelId) => ({
+ name: availableModels.find(m => m.id === modelId)?.name.split(' ')[0] || modelId,
+ latency: metrics[modelId]?.latency || 0
+ }));
+ };
+
+ const getCostData = () => {
+ return selectedModels.map((modelId) => ({
+ name: availableModels.find(m => m.id === modelId)?.name.split(' ')[0] || modelId,
+ cost: metrics[modelId]?.costPerRequest * 1000 || 0
+ }));
+ };
+
+ const benchmarkResults: BenchmarkResult[] = [
+ { test: 'Text Classification', model1: 94.2, model2: 93.1, model3: 91.5, model4: 86.8 },
+ { test: 'Sentiment Analysis', model1: 92.8, model2: 91.5, model3: 90.2, model4: 88.3 },
+ { test: 'Named Entity Recognition', model1: 93.5, model2: 92.8, model3: 91.0, model4: 87.5 },
+ { test: 'Question Answering', model1: 95.1, model2: 94.3, model3: 92.7, model4: 85.9 },
+ { test: 'Code Generation', model1: 89.5, model2: 91.2, model3: 88.8, model4: 82.4 }
+ ];
+
+ const handleModelSelect = (index: number, modelId: string) => {
+ const newSelection = [...selectedModels];
+ newSelection[index] = modelId;
+ setSelectedModels(newSelection);
+ };
+
+ const exportReport = () => {
+ const report = {
+ timestamp: new Date().toISOString(),
+ models: selectedModels.map(id => ({
+ model: availableModels.find(m => m.id === id),
+ metrics: metrics[id]
+ }))
+ };
+
+ const blob = new Blob([JSON.stringify(report, null, 2)], { type: 'application/json' });
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = `model-comparison-${Date.now()}.json`;
+ a.click();
+ };
+
+ const colors = ['#8B5CF6', '#3B82F6', '#10B981', '#F59E0B'];
+
+ return (
+
+
+
+
Model Comparison
+
Compare performance metrics across multiple models
+
+
+
+ Export Report
+
+
+
+ {/* Model Selection */}
+
+ {[0, 1, 2, 3].map((index) => (
+
+
Model {index + 1}
+
handleModelSelect(index, e.target.value)}
+ className="w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white"
+ >
+ Select Model
+ {availableModels.map((model) => (
+
+ {model.name} {model.version}
+
+ ))}
+
+ {selectedModels[index] && metrics[selectedModels[index]] && (
+
+
+
+ Type:
+
+ {availableModels.find(m => m.id === selectedModels[index])?.type}
+
+
+
+ Version:
+
+ {availableModels.find(m => m.id === selectedModels[index])?.version}
+
+
+
+
+ )}
+
+ ))}
+
+
+ {/* Performance Metrics Table */}
+
+
+
+
Performance Metrics
+
+
+
+
+
+
+ Metric
+ {selectedModels.map((modelId, index) => (
+
+ {availableModels.find(m => m.id === modelId)?.name || 'N/A'}
+
+ ))}
+
+
+
+
+ Accuracy
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? `${(metric.accuracy * 100).toFixed(1)}%` : 'N/A'}
+
+
+ );
+ })}
+
+
+ Precision
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? `${(metric.precision * 100).toFixed(1)}%` : 'N/A'}
+
+
+ );
+ })}
+
+
+ Recall
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? `${(metric.recall * 100).toFixed(1)}%` : 'N/A'}
+
+
+ );
+ })}
+
+
+ F1 Score
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? `${(metric.f1Score * 100).toFixed(1)}%` : 'N/A'}
+
+
+ );
+ })}
+
+
+ Latency (ms)
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? `${metric.latency}` : 'N/A'}
+
+
+ );
+ })}
+
+
+ Throughput (req/s)
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? metric.throughput.toLocaleString() : 'N/A'}
+
+
+ );
+ })}
+
+
+ Cost per Request ($)
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? `$${metric.costPerRequest.toFixed(4)}` : 'N/A'}
+
+
+ );
+ })}
+
+
+ Memory Usage (GB)
+ {selectedModels.map((modelId, index) => {
+ const metric = metrics[modelId];
+ return (
+
+
+ {metric ? `${metric.memoryUsage.toFixed(1)}` : 'N/A'}
+
+
+ );
+ })}
+
+
+
+
+
+
+ {/* Visual Comparison Charts */}
+
+ {/* Radar Chart */}
+
+
+
+
Overall Performance
+
+
+
+
+
+
+
+
+ {selectedModels.map((modelId, index) => (
+ m.id === modelId)?.name || `Model ${index + 1}`}
+ dataKey={`model${index + 1}`}
+ stroke={colors[index]}
+ fill={colors[index]}
+ fillOpacity={0.25}
+ strokeWidth={2}
+ />
+ ))}
+
+
+
+
+ {/* Latency Comparison */}
+
+
+
+
Latency Comparison
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Cost Analysis */}
+
+
+
+
Cost Analysis (per 1000 requests)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {selectedModels.slice(0, 4).map((modelId, index) => {
+ const metric = metrics[modelId];
+ if (!metric) return null;
+
+ const monthlyCost = metric.costPerRequest * 1000000;
+
+ return (
+
+
+ {availableModels.find(m => m.id === modelId)?.name}
+
+
+ ${monthlyCost.toFixed(2)}/month
+
+
@ 1M requests
+
+ );
+ })}
+
+
+
+ {/* Benchmark Results */}
+
+
+
+
Benchmark Results
+
+
+
+
+
+
+ Test
+ {selectedModels.slice(0, 4).map((_modelId, index) => (
+
+ M{index + 1}
+
+ ))}
+
+
+
+ {benchmarkResults.map((result, i) => (
+
+ {result.test}
+
+
+ {result.model1.toFixed(1)}%
+
+
+
+
+ {result.model2.toFixed(1)}%
+
+
+
+
+ {result.model3.toFixed(1)}%
+
+
+
+
+ {result.model4.toFixed(1)}%
+
+
+
+ ))}
+
+
+
+
+
+
+
+
Best Overall
+
+ {availableModels.find(m => m.id === selectedModels[0])?.name || 'Model 1'}
+
+
+
+
+
+
+
+
+ {/* Summary Cards */}
+
+
+
+
+ Highest Accuracy
+
+
+ {Math.max(...selectedModels.map(id => (metrics[id]?.accuracy || 0) * 100)).toFixed(1)}%
+
+
+
+
+
+
+ Lowest Latency
+
+
+ {Math.min(...selectedModels.map(id => metrics[id]?.latency || Infinity))}ms
+
+
+
+
+
+
+ Most Cost-Effective
+
+
+ ${Math.min(...selectedModels.map(id => metrics[id]?.costPerRequest || Infinity)).toFixed(4)}
+
+
+
+
+
+
+ Best F1 Score
+
+
+ {Math.max(...selectedModels.map(id => (metrics[id]?.f1Score || 0) * 100)).toFixed(1)}%
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/ai/ModelFineTuning.tsx b/ai-design-platform/src/components/ai/ModelFineTuning.tsx
new file mode 100644
index 0000000..b3877a9
--- /dev/null
+++ b/ai-design-platform/src/components/ai/ModelFineTuning.tsx
@@ -0,0 +1,545 @@
+import React, { useState } from 'react';
+import {
+ Upload,
+ Play,
+ Pause,
+ RotateCw,
+ CheckCircle,
+ FileText,
+ Activity,
+ TrendingUp,
+ AlertCircle,
+ Download,
+ Eye,
+ GitBranch,
+ Zap,
+ Database,
+ Sliders
+} from 'lucide-react';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer,
+ AreaChart,
+ Area
+} from 'recharts';
+
+interface Dataset {
+ id: string;
+ name: string;
+ size: number;
+ rows: number;
+ columns: number;
+ preview: string[][];
+}
+
+interface TrainingRun {
+ id: string;
+ name: string;
+ timestamp: Date;
+ status: 'running' | 'completed' | 'failed';
+ accuracy: number;
+ loss: number;
+ epochs: number;
+}
+
+interface ModelVersion {
+ version: string;
+ date: Date;
+ accuracy: number;
+ size: number;
+}
+
+export const ModelFineTuning: React.FC = () => {
+ const [isTraining, setIsTraining] = useState(false);
+ const [trainingProgress, setTrainingProgress] = useState(0);
+ const [currentEpoch, setCurrentEpoch] = useState(0);
+ const [autoMLEnabled, setAutoMLEnabled] = useState(false);
+ const [selectedModel, setSelectedModel] = useState('resnet50');
+
+ const [hyperparameters, setHyperparameters] = useState({
+ learningRate: 0.001,
+ batchSize: 32,
+ epochs: 100,
+ optimizer: 'adam',
+ momentum: 0.9,
+ weightDecay: 0.0001
+ });
+
+ const [dataset, setDataset] = useState({
+ id: '1',
+ name: 'training_data.csv',
+ size: 24.5,
+ rows: 10000,
+ columns: 15,
+ preview: [
+ ['ID', 'Feature1', 'Feature2', 'Feature3', 'Label'],
+ ['1', '0.234', '0.567', '0.891', 'A'],
+ ['2', '0.345', '0.678', '0.912', 'B'],
+ ['3', '0.456', '0.789', '0.123', 'A']
+ ]
+ });
+
+ const trainingData = [
+ { epoch: 0, trainLoss: 2.3, valLoss: 2.4, trainAcc: 0.25, valAcc: 0.23 },
+ { epoch: 10, trainLoss: 1.8, valLoss: 1.9, trainAcc: 0.45, valAcc: 0.42 },
+ { epoch: 20, trainLoss: 1.2, valLoss: 1.4, trainAcc: 0.65, valAcc: 0.61 },
+ { epoch: 30, trainLoss: 0.8, valLoss: 1.0, trainAcc: 0.78, valAcc: 0.74 },
+ { epoch: 40, trainLoss: 0.5, valLoss: 0.7, trainAcc: 0.86, valAcc: 0.82 },
+ { epoch: 50, trainLoss: 0.3, valLoss: 0.5, trainAcc: 0.91, valAcc: 0.88 }
+ ];
+
+ const experimentRuns: TrainingRun[] = [
+ { id: '1', name: 'Experiment_001', timestamp: new Date('2024-01-20'), status: 'completed', accuracy: 0.88, loss: 0.45, epochs: 50 },
+ { id: '2', name: 'Experiment_002', timestamp: new Date('2024-01-21'), status: 'completed', accuracy: 0.91, loss: 0.32, epochs: 75 },
+ { id: '3', name: 'Experiment_003', timestamp: new Date('2024-01-22'), status: 'running', accuracy: 0.85, loss: 0.52, epochs: 30 },
+ { id: '4', name: 'Experiment_004', timestamp: new Date('2024-01-19'), status: 'failed', accuracy: 0.72, loss: 0.89, epochs: 20 }
+ ];
+
+ const modelVersions: ModelVersion[] = [
+ { version: 'v3.2.1', date: new Date('2024-01-22'), accuracy: 0.91, size: 45.2 },
+ { version: 'v3.2.0', date: new Date('2024-01-15'), accuracy: 0.88, size: 44.8 },
+ { version: 'v3.1.5', date: new Date('2024-01-08'), accuracy: 0.85, size: 43.5 }
+ ];
+
+ const transferLearningModels = [
+ { id: 'resnet50', name: 'ResNet-50', params: '25.6M', accuracy: '76.1%' },
+ { id: 'vgg16', name: 'VGG-16', params: '138M', accuracy: '71.3%' },
+ { id: 'inception', name: 'Inception-v3', params: '23.8M', accuracy: '77.9%' },
+ { id: 'mobilenet', name: 'MobileNet-v2', params: '3.5M', accuracy: '71.8%' },
+ { id: 'efficientnet', name: 'EfficientNet-B0', params: '5.3M', accuracy: '77.1%' }
+ ];
+
+ const handleStartTraining = () => {
+ setIsTraining(true);
+ setTrainingProgress(0);
+ setCurrentEpoch(0);
+
+ const interval = setInterval(() => {
+ setTrainingProgress((prev) => {
+ if (prev >= 100) {
+ clearInterval(interval);
+ setIsTraining(false);
+ return 100;
+ }
+ return prev + 2;
+ });
+ setCurrentEpoch((prev) => Math.min(prev + 1, hyperparameters.epochs));
+ }, 200);
+ };
+
+ const handleFileUpload = (e: React.ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (file) {
+ setDataset({
+ ...dataset,
+ name: file.name,
+ size: file.size / (1024 * 1024)
+ });
+ }
+ };
+
+ return (
+
+
+
+
Model Fine-Tuning
+
Train and optimize your ML models with advanced controls
+
+
+
+
+ Export Config
+
+
+ {isTraining ? (
+ <>
+
+ Training...
+ >
+ ) : (
+ <>
+
+ Start Training
+ >
+ )}
+
+
+
+
+
+ {/* Dataset Upload & Preview */}
+
+
+
+
+
Dataset
+
+
+
+
+
+
Drop your dataset here or click to browse
+
+
+
+ Select File
+
+
+
+ {dataset && (
+
+
+
+
+
+
{dataset.name}
+
+ {dataset.size.toFixed(1)} MB · {dataset.rows.toLocaleString()} rows · {dataset.columns} columns
+
+
+
+
+
+ Preview
+
+
+
+
+
+
+
+ {dataset.preview[0].map((header, i) => (
+
+ {header}
+
+ ))}
+
+
+
+ {dataset.preview.slice(1).map((row, i) => (
+
+ {row.map((cell, j) => (
+
+ {cell}
+
+ ))}
+
+ ))}
+
+
+
+
+ )}
+
+
+
+ {/* Training Visualization */}
+
+
+
+ {isTraining && (
+
+
+ Epoch {currentEpoch} / {hyperparameters.epochs}
+ {trainingProgress}%
+
+
+
+ )}
+
+
+
+
Training Loss
+
0.32
+
+
+ -12.5%
+
+
+
+
Validation Accuracy
+
88.4%
+
+
+ +3.2%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Experiment Tracking */}
+
+
+
+
Experiment Tracking
+
+
+
+ {experimentRuns.map((run) => (
+
+
+
+
+
{run.name}
+
+ {run.timestamp.toLocaleDateString()} · {run.epochs} epochs
+
+
+
+
+
+
Accuracy
+
{(run.accuracy * 100).toFixed(1)}%
+
+
+
Loss
+
{run.loss.toFixed(2)}
+
+
+
+
+
+
+ ))}
+
+
+
+
+ {/* Right Sidebar - Controls */}
+
+ {/* Hyperparameters */}
+
+
+
+
Hyperparameters
+
+
+
+
+
+ {/* Transfer Learning */}
+
+
+
+
Transfer Learning
+
+
+
+ {transferLearningModels.map((model) => (
+
setSelectedModel(model.id)}
+ className={`p-3 rounded-lg cursor-pointer transition-all ${
+ selectedModel === model.id
+ ? 'bg-purple-500/20 border border-purple-500'
+ : 'glass hover:bg-white/10'
+ }`}
+ >
+
+ {model.name}
+ {selectedModel === model.id && }
+
+
+ {model.params} params · {model.accuracy} accuracy
+
+
+ ))}
+
+
+
+ {/* AutoML */}
+
+
+
+
+
AutoML
+
+
setAutoMLEnabled(!autoMLEnabled)}
+ className={`px-3 py-1 rounded-lg text-sm transition-colors ${
+ autoMLEnabled
+ ? 'bg-purple-500 text-white'
+ : 'bg-white/5 text-gray-400'
+ }`}
+ >
+ {autoMLEnabled ? 'Enabled' : 'Disabled'}
+
+
+
+
+ Automatically optimize hyperparameters, architecture, and training strategy
+
+
+ {autoMLEnabled && (
+
+
+
+
+ AutoML will run 20 experiments to find optimal configuration. Estimated time: 4-6 hours.
+
+
+
+ )}
+
+
+ {/* Model Versioning */}
+
+
+
+
Model Versions
+
+
+
+ {modelVersions.map((version, index) => (
+
+
+ {version.version}
+ {index === 0 && (
+ Latest
+ )}
+
+
+
Released: {version.date.toLocaleDateString()}
+
Accuracy: {(version.accuracy * 100).toFixed(1)}%
+
Size: {version.size.toFixed(1)} MB
+
+
+ ))}
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/ai/TestingSuite.tsx b/ai-design-platform/src/components/ai/TestingSuite.tsx
new file mode 100644
index 0000000..797fd81
--- /dev/null
+++ b/ai-design-platform/src/components/ai/TestingSuite.tsx
@@ -0,0 +1,469 @@
+import React, { useState } from 'react';
+import {
+ Play,
+ CheckCircle,
+ XCircle,
+ AlertCircle,
+ Clock,
+ FileCode,
+ Layers,
+ TrendingUp,
+ BarChart3,
+ Settings,
+ Plus,
+ Search
+} from 'lucide-react';
+import {
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer,
+ PieChart,
+ Pie,
+ Cell,
+ AreaChart,
+ Area
+} from 'recharts';
+
+interface TestCase {
+ id: string;
+ name: string;
+ category: 'unit' | 'integration' | 'performance' | 'regression';
+ status: 'passed' | 'failed' | 'pending' | 'running';
+ duration: number;
+ lastRun: Date;
+ coverage: number;
+}
+
+interface CoverageData {
+ module: string;
+ coverage: number;
+ lines: number;
+ coveredLines: number;
+}
+
+export const TestingSuite: React.FC = () => {
+ const [activeCategory, setActiveCategory] = useState<'all' | 'unit' | 'integration' | 'performance' | 'regression'>('all');
+ const [runningTests, setRunningTests] = useState([]);
+ const [searchQuery, setSearchQuery] = useState('');
+
+ const testCases: TestCase[] = [
+ { id: '1', name: 'User Authentication Flow', category: 'unit', status: 'passed', duration: 125, lastRun: new Date('2024-01-22'), coverage: 95 },
+ { id: '2', name: 'Database Connection Pool', category: 'unit', status: 'passed', duration: 89, lastRun: new Date('2024-01-22'), coverage: 88 },
+ { id: '3', name: 'API Rate Limiting', category: 'unit', status: 'failed', duration: 156, lastRun: new Date('2024-01-22'), coverage: 72 },
+ { id: '4', name: 'End-to-End User Journey', category: 'integration', status: 'passed', duration: 2340, lastRun: new Date('2024-01-22'), coverage: 85 },
+ { id: '5', name: 'Payment Gateway Integration', category: 'integration', status: 'passed', duration: 1890, lastRun: new Date('2024-01-22'), coverage: 91 },
+ { id: '6', name: 'Third-Party API Integration', category: 'integration', status: 'running', duration: 1200, lastRun: new Date('2024-01-22'), coverage: 78 },
+ { id: '7', name: 'Load Test - 1000 Concurrent Users', category: 'performance', status: 'passed', duration: 45000, lastRun: new Date('2024-01-21'), coverage: 0 },
+ { id: '8', name: 'Database Query Performance', category: 'performance', status: 'failed', duration: 3200, lastRun: new Date('2024-01-21'), coverage: 0 },
+ { id: '9', name: 'Memory Leak Detection', category: 'performance', status: 'passed', duration: 8900, lastRun: new Date('2024-01-21'), coverage: 0 },
+ { id: '10', name: 'Login Functionality Regression', category: 'regression', status: 'passed', duration: 234, lastRun: new Date('2024-01-22'), coverage: 92 },
+ { id: '11', name: 'Data Export Regression', category: 'regression', status: 'passed', duration: 456, lastRun: new Date('2024-01-22'), coverage: 87 },
+ { id: '12', name: 'UI Component Rendering', category: 'regression', status: 'pending', duration: 0, lastRun: new Date('2024-01-20'), coverage: 0 }
+ ];
+
+ const coverageData: CoverageData[] = [
+ { module: 'Authentication', coverage: 95, lines: 1200, coveredLines: 1140 },
+ { module: 'Database', coverage: 88, lines: 2400, coveredLines: 2112 },
+ { module: 'API Handlers', coverage: 82, lines: 1800, coveredLines: 1476 },
+ { module: 'Business Logic', coverage: 91, lines: 3200, coveredLines: 2912 },
+ { module: 'UI Components', coverage: 76, lines: 1600, coveredLines: 1216 },
+ { module: 'Utils', coverage: 93, lines: 800, coveredLines: 744 }
+ ];
+
+ const testHistoryData = [
+ { date: 'Jan 15', passed: 45, failed: 3, total: 48 },
+ { date: 'Jan 16', passed: 47, failed: 2, total: 49 },
+ { date: 'Jan 17', passed: 46, failed: 4, total: 50 },
+ { date: 'Jan 18', passed: 48, failed: 2, total: 50 },
+ { date: 'Jan 19', passed: 49, failed: 1, total: 50 },
+ { date: 'Jan 20', passed: 47, failed: 3, total: 50 },
+ { date: 'Jan 21', passed: 50, failed: 2, total: 52 },
+ { date: 'Jan 22', passed: 49, failed: 3, total: 52 }
+ ];
+
+ const filteredTests = testCases.filter(test => {
+ const matchesCategory = activeCategory === 'all' || test.category === activeCategory;
+ const matchesSearch = test.name.toLowerCase().includes(searchQuery.toLowerCase());
+ return matchesCategory && matchesSearch;
+ });
+
+ const testStats = {
+ total: testCases.length,
+ passed: testCases.filter(t => t.status === 'passed').length,
+ failed: testCases.filter(t => t.status === 'failed').length,
+ running: testCases.filter(t => t.status === 'running').length,
+ pending: testCases.filter(t => t.status === 'pending').length
+ };
+
+ const overallCoverage = coverageData.reduce((acc, curr) => acc + curr.coverage, 0) / coverageData.length;
+
+ const handleRunTest = (testId: string) => {
+ setRunningTests([...runningTests, testId]);
+ setTimeout(() => {
+ setRunningTests(runningTests.filter(id => id !== testId));
+ }, 3000);
+ };
+
+ const handleRunAll = () => {
+ const testsToRun = filteredTests.filter(t => t.status !== 'running').map(t => t.id);
+ setRunningTests(testsToRun);
+ setTimeout(() => {
+ setRunningTests([]);
+ }, 5000);
+ };
+
+ const getStatusIcon = (status: TestCase['status']) => {
+ switch (status) {
+ case 'passed':
+ return ;
+ case 'failed':
+ return ;
+ case 'running':
+ return ;
+ case 'pending':
+ return ;
+ }
+ };
+
+ const pieData = [
+ { name: 'Passed', value: testStats.passed, color: '#10B981' },
+ { name: 'Failed', value: testStats.failed, color: '#EF4444' },
+ { name: 'Running', value: testStats.running, color: '#3B82F6' },
+ { name: 'Pending', value: testStats.pending, color: '#F59E0B' }
+ ];
+
+ return (
+
+
+
+
Testing Suite
+
Automated testing dashboard with comprehensive coverage analysis
+
+
+
+
+ New Test
+
+
+
+ Run All Tests
+
+
+
+
+ {/* Test Stats Overview */}
+
+
+
Total Tests
+
{testStats.total}
+
+
+
+
+ Passed
+
+
{testStats.passed}
+
+
+
+
+ Failed
+
+
{testStats.failed}
+
+
+
+
+ Running
+
+
{testStats.running}
+
+
+
+
+ Coverage
+
+
{overallCoverage.toFixed(1)}%
+
+
+
+
+ {/* Test Cases */}
+
+
+
+
+
+
Test Cases
+
+
+
+
+ setSearchQuery(e.target.value)}
+ className="pl-10 pr-4 py-2 bg-white/5 border border-white/10 rounded-lg text-white text-sm"
+ />
+
+
+
+
+ {/* Category Filters */}
+
+ {(['all', 'unit', 'integration', 'performance', 'regression'] as const).map((category) => (
+ setActiveCategory(category)}
+ className={`px-4 py-2 rounded-lg text-sm font-medium transition-colors ${
+ activeCategory === category
+ ? 'bg-purple-500 text-white'
+ : 'bg-white/5 text-gray-400 hover:bg-white/10'
+ }`}
+ >
+ {category.charAt(0).toUpperCase() + category.slice(1)}
+
+ ))}
+
+
+ {/* Test List */}
+
+ {filteredTests.map((test) => (
+
+
+
+ {getStatusIcon(runningTests.includes(test.id) ? 'running' : test.status)}
+
+
{test.name}
+
+
+ {test.category}
+
+
+
+ {test.duration}ms
+
+ {test.coverage > 0 && (
+
+
+ {test.coverage}% coverage
+
+ )}
+
+
+
+
handleRunTest(test.id)}
+ disabled={runningTests.includes(test.id)}
+ className="btn-secondary text-sm"
+ >
+
+
+
+
+ {test.status === 'failed' && (
+
+
+ AssertionError: Expected 200, received 404 at line 45
+
+
+ )}
+
+ ))}
+
+
+
+ {/* Test History & Trends */}
+
+
+
+
Test History & Trends
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pass Rate
+
94.2%
+
+2.1% this week
+
+
+
Avg Duration
+
1.2s
+
-0.3s faster
+
+
+
Total Runs
+
1,247
+
Last 7 days
+
+
+
+
+
+ {/* Right Sidebar */}
+
+ {/* Test Distribution */}
+
+
+
+
Test Distribution
+
+
+
+
+
+ {pieData.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+
+
+ {pieData.map((item) => (
+
+ ))}
+
+
+
+ {/* Code Coverage */}
+
+
+
+
Code Coverage
+
+
+
+
+ Overall Coverage
+ {overallCoverage.toFixed(1)}%
+
+
+
+
+
+ {coverageData.map((module) => (
+
+
+ {module.module}
+ = 90 ? 'text-green-400' :
+ module.coverage >= 75 ? 'text-yellow-400' :
+ 'text-red-400'
+ }`}>
+ {module.coverage}%
+
+
+
+
= 90 ? 'bg-green-400' :
+ module.coverage >= 75 ? 'bg-yellow-400' :
+ 'bg-red-400'
+ }`}
+ style={{ width: `${module.coverage}%` }}
+ />
+
+
+ {module.coveredLines} / {module.lines} lines
+
+
+ ))}
+
+
+
+ {/* Custom Test Builder */}
+
+
+
+
Custom Test Builder
+
+
+
+
+ Test Name
+
+
+
+
+ Category
+
+ Unit Test
+ Integration Test
+ Performance Test
+ Regression Test
+
+
+
+
+ Test Script
+
+
+
+
+
+ Create Test
+
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/ai/index.ts b/ai-design-platform/src/components/ai/index.ts
new file mode 100644
index 0000000..979cd23
--- /dev/null
+++ b/ai-design-platform/src/components/ai/index.ts
@@ -0,0 +1,8 @@
+export { AICompanion } from './AICompanion';
+export { AITraining } from './AITraining';
+export { ModelFineTuning } from './ModelFineTuning';
+export { ModelComparison } from './ModelComparison';
+export { TestingSuite } from './TestingSuite';
+export { AgentBuilder } from './AgentBuilder';
+export { CollaborationWorkspace } from './CollaborationWorkspace';
+export { DeveloperPortal } from './DeveloperPortal';
diff --git a/ai-design-platform/src/components/auth/LoginForm.tsx b/ai-design-platform/src/components/auth/LoginForm.tsx
new file mode 100644
index 0000000..4b299b2
--- /dev/null
+++ b/ai-design-platform/src/components/auth/LoginForm.tsx
@@ -0,0 +1,196 @@
+import React, { useState } from 'react';
+import { Mail, Lock, Eye, EyeOff, Chrome, Github, Box } from 'lucide-react';
+
+interface LoginFormProps {
+ onLogin?: (email: string, password: string, rememberMe: boolean) => void;
+ onOAuthLogin?: (provider: 'google' | 'github' | 'microsoft') => void;
+ onForgotPassword?: () => void;
+}
+
+export const LoginForm: React.FC
= ({
+ onLogin,
+ onOAuthLogin,
+ onForgotPassword,
+}) => {
+ const [email, setEmail] = useState('');
+ const [password, setPassword] = useState('');
+ const [rememberMe, setRememberMe] = useState(false);
+ const [showPassword, setShowPassword] = useState(false);
+ const [errors, setErrors] = useState<{ email?: string; password?: string }>({});
+ const [isLoading, setIsLoading] = useState(false);
+
+ const validateEmail = (email: string): boolean => {
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ return emailRegex.test(email);
+ };
+
+ const validateForm = (): boolean => {
+ const newErrors: { email?: string; password?: string } = {};
+
+ if (!email) {
+ newErrors.email = 'Email is required';
+ } else if (!validateEmail(email)) {
+ newErrors.email = 'Invalid email format';
+ }
+
+ if (!password) {
+ newErrors.password = 'Password is required';
+ } else if (password.length < 6) {
+ newErrors.password = 'Password must be at least 6 characters';
+ }
+
+ setErrors(newErrors);
+ return Object.keys(newErrors).length === 0;
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (!validateForm()) return;
+
+ setIsLoading(true);
+ try {
+ await onLogin?.(email, password, rememberMe);
+ } catch (error) {
+ console.error('Login error:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleOAuthLogin = (provider: 'google' | 'github' | 'microsoft') => {
+ onOAuthLogin?.(provider);
+ };
+
+ return (
+
+
+
Welcome Back
+
Sign in to your account
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/auth/README.md b/ai-design-platform/src/components/auth/README.md
new file mode 100644
index 0000000..45e6729
--- /dev/null
+++ b/ai-design-platform/src/components/auth/README.md
@@ -0,0 +1,231 @@
+# Auth Components & Main Application
+
+This directory contains authentication components and the main application shell for the AI Design Platform.
+
+## Components
+
+### Auth Components (`/components/auth/`)
+
+#### 1. LoginForm.tsx
+A glass morphism login form with the following features:
+- Email/password input fields with validation
+- Password visibility toggle
+- Remember me checkbox
+- Forgot password link
+- OAuth login buttons (Google, GitHub, Microsoft)
+- Real-time validation feedback
+- Loading states
+
+**Usage:**
+```tsx
+import { LoginForm } from './components/auth';
+
+ {
+ // Handle login
+ }}
+ onOAuthLogin={(provider) => {
+ // Handle OAuth login
+ }}
+ onForgotPassword={() => {
+ // Navigate to forgot password page
+ }}
+/>
+```
+
+#### 2. RegisterForm.tsx
+A comprehensive registration form with:
+- Name, email, and password fields
+- Password confirmation
+- Real-time password strength indicator
+- Password requirements checklist:
+ - At least 8 characters
+ - One uppercase letter
+ - One lowercase letter
+ - One number
+ - One special character
+- Terms and conditions acceptance checkbox
+- OAuth registration options
+- Comprehensive validation
+
+**Usage:**
+```tsx
+import { RegisterForm } from './components/auth';
+
+ {
+ // Handle registration
+ }}
+ onOAuthRegister={(provider) => {
+ // Handle OAuth registration
+ }}
+/>
+```
+
+#### 3. UserProfile.tsx
+A user profile settings component featuring:
+- Profile information display/editing
+- Role badge with color coding (Admin, Developer, User)
+- Two-factor authentication toggle
+- API key management:
+ - Create new API keys
+ - View/hide API keys
+ - Copy to clipboard
+ - Delete API keys
+ - Last used tracking
+- Active session management:
+ - View all sessions
+ - Current session indicator
+ - Revoke sessions
+ - Device and location info
+
+**Usage:**
+```tsx
+import { UserProfile } from './components/auth';
+
+const userData = {
+ name: 'John Doe',
+ email: 'john.doe@example.com',
+ role: 'Admin',
+ twoFactorEnabled: false,
+};
+
+const apiKeys = [
+ {
+ id: '1',
+ name: 'Production API',
+ key: 'sk_prod_abc123xyz789',
+ createdAt: '2024-01-15',
+ lastUsed: '2024-01-20',
+ },
+];
+
+const sessions = [
+ {
+ id: '1',
+ device: 'Chrome on MacOS',
+ location: 'San Francisco, CA',
+ lastActive: '2 minutes ago',
+ current: true,
+ },
+];
+
+ {}}
+ onToggle2FA={(enabled) => {}}
+ onCreateApiKey={(name) => {}}
+ onDeleteApiKey={(id) => {}}
+ onRevokeSession={(id) => {}}
+/>
+```
+
+### Main Application (`App.tsx`)
+
+The main application shell featuring:
+
+#### Features:
+- **Glass morphism sidebar navigation**
+ - Collapsible sidebar (full width ↔ icon only)
+ - Navigation items with icons:
+ - Dashboard
+ - Models (AI model management)
+ - Analytics
+ - Monitoring
+ - Data
+ - Users
+ - Security
+ - Settings
+ - Active state highlighting with gradient background
+
+- **Top header bar**
+ - Global search bar
+ - Theme toggle (dark/light mode)
+ - Notification bell with badge counter
+ - User profile dropdown menu:
+ - Profile link
+ - Settings link
+ - Logout button
+
+- **Main content area**
+ - Dynamic content based on active section
+ - Placeholder pages for all sections
+ - Dashboard with:
+ - 4 metric cards (Total Models, Active Users, API Calls, Avg Response)
+ - Recent activity feed
+ - System status indicators
+
+- **AI Companion button**
+ - Fixed bottom-right position
+ - Floating action button with chat icon
+ - Hover scale animation
+
+#### Usage:
+```tsx
+import { App } from './App';
+
+// Simply render the App component
+
+```
+
+The app manages its own state for:
+- Active navigation section
+- Sidebar open/closed state
+- User menu visibility
+- Dark/light mode
+- Notification count
+
+## Design System
+
+All components follow a consistent design language:
+
+### Colors:
+- Primary gradient: Blue (500) → Purple (500)
+- Background: Glass morphism with backdrop blur
+- Text: White (primary), Gray (300-400) for secondary
+- Borders: White with 10-20% opacity
+
+### Typography:
+- Headings: Bold, White
+- Body text: Medium/Regular, Gray-300
+- Small text: Text-sm/xs, Gray-400
+
+### Interactive Elements:
+- Buttons: Gradient backgrounds with hover effects
+- Inputs: Glass morphism with focus rings
+- Icons: lucide-react icons throughout
+
+### Spacing:
+- Consistent padding/margin using Tailwind scale (2, 3, 4, 6, 8)
+- Rounded corners: lg (8px), 2xl (16px) for cards
+
+## Tech Stack
+
+- **React 18+** with TypeScript
+- **lucide-react** for icons
+- **Tailwind CSS** for styling
+- **Glass morphism** design aesthetic
+
+## File Structure
+
+```
+src/
+├── components/
+│ └── auth/
+│ ├── LoginForm.tsx
+│ ├── RegisterForm.tsx
+│ ├── UserProfile.tsx
+│ └── index.ts
+├── App.tsx
+└── AuthExample.tsx (example usage)
+```
+
+## Notes
+
+- All components use TypeScript for type safety
+- Forms include comprehensive validation
+- OAuth providers can be easily customized
+- Components are fully responsive
+- Glass morphism effects require backdrop-filter support
diff --git a/ai-design-platform/src/components/auth/RegisterForm.tsx b/ai-design-platform/src/components/auth/RegisterForm.tsx
new file mode 100644
index 0000000..42c63c3
--- /dev/null
+++ b/ai-design-platform/src/components/auth/RegisterForm.tsx
@@ -0,0 +1,380 @@
+import React, { useState, useEffect } from 'react';
+import { User, Mail, Lock, Eye, EyeOff, Chrome, Github, Box, Check, X } from 'lucide-react';
+
+interface RegisterFormProps {
+ onRegister?: (name: string, email: string, password: string, acceptTerms: boolean) => void;
+ onOAuthRegister?: (provider: 'google' | 'github' | 'microsoft') => void;
+}
+
+interface PasswordStrength {
+ score: number;
+ label: string;
+ color: string;
+}
+
+export const RegisterForm: React.FC = ({
+ onRegister,
+ onOAuthRegister,
+}) => {
+ const [name, setName] = useState('');
+ const [email, setEmail] = useState('');
+ const [password, setPassword] = useState('');
+ const [confirmPassword, setConfirmPassword] = useState('');
+ const [acceptTerms, setAcceptTerms] = useState(false);
+ const [showPassword, setShowPassword] = useState(false);
+ const [showConfirmPassword, setShowConfirmPassword] = useState(false);
+ const [errors, setErrors] = useState>({});
+ const [isLoading, setIsLoading] = useState(false);
+ const [passwordStrength, setPasswordStrength] = useState({
+ score: 0,
+ label: '',
+ color: '',
+ });
+
+ const calculatePasswordStrength = (password: string): PasswordStrength => {
+ let score = 0;
+
+ if (password.length >= 8) score++;
+ if (password.length >= 12) score++;
+ if (/[a-z]/.test(password)) score++;
+ if (/[A-Z]/.test(password)) score++;
+ if (/[0-9]/.test(password)) score++;
+ if (/[^a-zA-Z0-9]/.test(password)) score++;
+
+ const strengthMap: Record = {
+ 0: { score: 0, label: '', color: '' },
+ 1: { score: 1, label: 'Very Weak', color: 'bg-red-500' },
+ 2: { score: 2, label: 'Weak', color: 'bg-orange-500' },
+ 3: { score: 3, label: 'Fair', color: 'bg-yellow-500' },
+ 4: { score: 4, label: 'Good', color: 'bg-lime-500' },
+ 5: { score: 5, label: 'Strong', color: 'bg-green-500' },
+ 6: { score: 6, label: 'Very Strong', color: 'bg-emerald-500' },
+ };
+
+ return strengthMap[score] || strengthMap[0];
+ };
+
+ useEffect(() => {
+ if (password) {
+ setPasswordStrength(calculatePasswordStrength(password));
+ } else {
+ setPasswordStrength({ score: 0, label: '', color: '' });
+ }
+ }, [password]);
+
+ const validateEmail = (email: string): boolean => {
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ return emailRegex.test(email);
+ };
+
+ const validateForm = (): boolean => {
+ const newErrors: Record = {};
+
+ if (!name.trim()) {
+ newErrors.name = 'Name is required';
+ } else if (name.trim().length < 2) {
+ newErrors.name = 'Name must be at least 2 characters';
+ }
+
+ if (!email) {
+ newErrors.email = 'Email is required';
+ } else if (!validateEmail(email)) {
+ newErrors.email = 'Invalid email format';
+ }
+
+ if (!password) {
+ newErrors.password = 'Password is required';
+ } else if (password.length < 8) {
+ newErrors.password = 'Password must be at least 8 characters';
+ }
+
+ if (!confirmPassword) {
+ newErrors.confirmPassword = 'Please confirm your password';
+ } else if (password !== confirmPassword) {
+ newErrors.confirmPassword = 'Passwords do not match';
+ }
+
+ if (!acceptTerms) {
+ newErrors.terms = 'You must accept the terms and conditions';
+ }
+
+ setErrors(newErrors);
+ return Object.keys(newErrors).length === 0;
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (!validateForm()) return;
+
+ setIsLoading(true);
+ try {
+ await onRegister?.(name.trim(), email, password, acceptTerms);
+ } catch (error) {
+ console.error('Registration error:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleOAuthRegister = (provider: 'google' | 'github' | 'microsoft') => {
+ onOAuthRegister?.(provider);
+ };
+
+ const passwordRequirements = [
+ { met: password.length >= 8, text: 'At least 8 characters' },
+ { met: /[A-Z]/.test(password), text: 'One uppercase letter' },
+ { met: /[a-z]/.test(password), text: 'One lowercase letter' },
+ { met: /[0-9]/.test(password), text: 'One number' },
+ { met: /[^a-zA-Z0-9]/.test(password), text: 'One special character' },
+ ];
+
+ return (
+
+
+
Create Account
+
Join our AI Design Platform
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/auth/UserProfile.tsx b/ai-design-platform/src/components/auth/UserProfile.tsx
new file mode 100644
index 0000000..80ab7cb
--- /dev/null
+++ b/ai-design-platform/src/components/auth/UserProfile.tsx
@@ -0,0 +1,376 @@
+import React, { useState } from 'react';
+import {
+ User,
+ Mail,
+ Shield,
+ Key,
+ Monitor,
+ Edit2,
+ Save,
+ X,
+ Copy,
+ Eye,
+ EyeOff,
+ Trash2,
+ Plus,
+ AlertCircle,
+} from 'lucide-react';
+
+interface UserData {
+ name: string;
+ email: string;
+ role: string;
+ avatar?: string;
+ twoFactorEnabled: boolean;
+}
+
+interface ApiKey {
+ id: string;
+ name: string;
+ key: string;
+ createdAt: string;
+ lastUsed?: string;
+}
+
+interface Session {
+ id: string;
+ device: string;
+ location: string;
+ lastActive: string;
+ current: boolean;
+}
+
+interface UserProfileProps {
+ user?: UserData;
+ apiKeys?: ApiKey[];
+ sessions?: Session[];
+ onUpdateProfile?: (data: Partial) => void;
+ onToggle2FA?: (enabled: boolean) => void;
+ onCreateApiKey?: (name: string) => void;
+ onDeleteApiKey?: (id: string) => void;
+ onRevokeSession?: (id: string) => void;
+}
+
+export const UserProfile: React.FC = ({
+ user = {
+ name: 'John Doe',
+ email: 'john.doe@example.com',
+ role: 'Admin',
+ twoFactorEnabled: false,
+ },
+ apiKeys = [],
+ sessions = [],
+ onUpdateProfile,
+ onToggle2FA,
+ onCreateApiKey,
+ onDeleteApiKey,
+ onRevokeSession,
+}) => {
+ const [isEditing, setIsEditing] = useState(false);
+ const [editedName, setEditedName] = useState(user.name);
+ const [editedEmail, setEditedEmail] = useState(user.email);
+ const [showApiKeys, setShowApiKeys] = useState>({});
+ const [newKeyName, setNewKeyName] = useState('');
+ const [showNewKeyDialog, setShowNewKeyDialog] = useState(false);
+
+ const handleSaveProfile = () => {
+ onUpdateProfile?.({ name: editedName, email: editedEmail });
+ setIsEditing(false);
+ };
+
+ const handleCancelEdit = () => {
+ setEditedName(user.name);
+ setEditedEmail(user.email);
+ setIsEditing(false);
+ };
+
+ const handleToggle2FA = () => {
+ onToggle2FA?.(!user.twoFactorEnabled);
+ };
+
+ const handleCreateApiKey = () => {
+ if (newKeyName.trim()) {
+ onCreateApiKey?.(newKeyName);
+ setNewKeyName('');
+ setShowNewKeyDialog(false);
+ }
+ };
+
+ const copyToClipboard = (text: string) => {
+ navigator.clipboard.writeText(text);
+ };
+
+ const getRoleBadgeColor = (role: string) => {
+ const colors: Record = {
+ Admin: 'bg-purple-500/20 text-purple-300 border-purple-500/30',
+ Developer: 'bg-blue-500/20 text-blue-300 border-blue-500/30',
+ User: 'bg-gray-500/20 text-gray-300 border-gray-500/30',
+ };
+ return colors[role] || colors.User;
+ };
+
+ return (
+
+ {/* Profile Information */}
+
+
+
+
+ Profile Information
+
+ {!isEditing ? (
+
setIsEditing(true)}
+ className="px-4 py-2 rounded-lg bg-blue-500/20 text-blue-300 border border-blue-500/30 hover:bg-blue-500/30 transition-all flex items-center"
+ >
+
+ Edit
+
+ ) : (
+
+
+
+ Save
+
+
+
+ Cancel
+
+
+ )}
+
+
+
+
+
+ {user.name.split(' ').map(n => n[0]).join('').toUpperCase()}
+
+
+
+
+
+
Name
+ {isEditing ? (
+
setEditedName(e.target.value)}
+ className="w-full px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+ />
+ ) : (
+
{user.name}
+ )}
+
+
+
+
Email
+ {isEditing ? (
+
setEditedEmail(e.target.value)}
+ className="w-full px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+ />
+ ) : (
+
+
+ {user.email}
+
+ )}
+
+
+
+ Role
+
+
+ {user.role}
+
+
+
+
+
+
+ {/* Two-Factor Authentication */}
+
+
+
+ Two-Factor Authentication
+
+
+
+
Enhance your account security
+
+ {user.twoFactorEnabled
+ ? 'Two-factor authentication is enabled'
+ : 'Add an extra layer of security to your account'}
+
+
+
+
+
+
+
+
+ {/* API Key Management */}
+
+
+
+
+ API Keys
+
+
setShowNewKeyDialog(!showNewKeyDialog)}
+ className="px-4 py-2 rounded-lg bg-blue-500/20 text-blue-300 border border-blue-500/30 hover:bg-blue-500/30 transition-all flex items-center"
+ >
+
+ Create New Key
+
+
+
+ {showNewKeyDialog && (
+
+
+
+ setNewKeyName(e.target.value)}
+ placeholder="Key name (e.g., Production API)"
+ className="flex-1 px-3 py-2 rounded-lg bg-white/5 border border-white/10 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"
+ />
+
+ Create
+
+ {
+ setShowNewKeyDialog(false);
+ setNewKeyName('');
+ }}
+ className="px-4 py-2 rounded-lg bg-white/5 text-gray-300 hover:bg-white/10 transition-colors"
+ >
+ Cancel
+
+
+
+ )}
+
+
+ {apiKeys.length === 0 ? (
+
No API keys created yet
+ ) : (
+ apiKeys.map((apiKey) => (
+
+
+
{apiKey.name}
+ onDeleteApiKey?.(apiKey.id)}
+ className="text-red-400 hover:text-red-300 transition-colors"
+ >
+
+
+
+
+
+ {showApiKeys[apiKey.id] ? apiKey.key : '••••••••••••••••••••••••••••••••'}
+
+ setShowApiKeys({ ...showApiKeys, [apiKey.id]: !showApiKeys[apiKey.id] })}
+ className="p-2 rounded bg-white/5 text-gray-300 hover:bg-white/10 transition-colors"
+ >
+ {showApiKeys[apiKey.id] ? : }
+
+ copyToClipboard(apiKey.key)}
+ className="p-2 rounded bg-white/5 text-gray-300 hover:bg-white/10 transition-colors"
+ >
+
+
+
+
+ Created: {apiKey.createdAt}
+ {apiKey.lastUsed && (
+ <>
+ •
+ Last used: {apiKey.lastUsed}
+ >
+ )}
+
+
+ ))
+ )}
+
+
+
+ {/* Active Sessions */}
+
+
+
+ Active Sessions
+
+
+ {sessions.length === 0 ? (
+
No active sessions
+ ) : (
+ sessions.map((session) => (
+
+
+
+
+
{session.device}
+ {session.current && (
+
+ Current
+
+ )}
+
+
{session.location}
+
Last active: {session.lastActive}
+
+ {!session.current && (
+
onRevokeSession?.(session.id)}
+ className="px-3 py-1.5 rounded-lg bg-red-500/20 text-red-300 border border-red-500/30 hover:bg-red-500/30 transition-all text-sm"
+ >
+ Revoke
+
+ )}
+
+
+ ))
+ )}
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/auth/index.ts b/ai-design-platform/src/components/auth/index.ts
new file mode 100644
index 0000000..e01e067
--- /dev/null
+++ b/ai-design-platform/src/components/auth/index.ts
@@ -0,0 +1,3 @@
+export { LoginForm } from './LoginForm';
+export { RegisterForm } from './RegisterForm';
+export { UserProfile } from './UserProfile';
diff --git a/ai-design-platform/src/components/dashboard/Analytics.tsx b/ai-design-platform/src/components/dashboard/Analytics.tsx
new file mode 100644
index 0000000..9fa48c5
--- /dev/null
+++ b/ai-design-platform/src/components/dashboard/Analytics.tsx
@@ -0,0 +1,285 @@
+import React from 'react';
+import { LineChart, Line, BarChart, Bar, AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from 'recharts';
+import { TrendingUp, Activity, Zap, Clock } from 'lucide-react';
+
+export const Analytics: React.FC = () => {
+ const requestTrendData = [
+ { time: '00:00', requests: 1200, latency: 120 },
+ { time: '04:00', requests: 800, latency: 110 },
+ { time: '08:00', requests: 2400, latency: 150 },
+ { time: '12:00', requests: 3200, latency: 180 },
+ { time: '16:00', requests: 2800, latency: 160 },
+ { time: '20:00', requests: 1800, latency: 130 },
+ ];
+
+ const modelPerformanceData = [
+ { model: 'Fraud Det.', accuracy: 98.5, requests: 45000 },
+ { model: 'Sentiment', accuracy: 94.2, requests: 38000 },
+ { model: 'Recommend', accuracy: 96.7, requests: 52000 },
+ { model: 'Image Class.', accuracy: 97.3, requests: 29000 },
+ { model: 'Price Opt.', accuracy: 91.8, requests: 15000 },
+ ];
+
+ const latencyDistributionData = [
+ { range: '0-50ms', count: 45000 },
+ { range: '50-100ms', count: 82000 },
+ { range: '100-150ms', count: 124000 },
+ { range: '150-200ms', count: 68000 },
+ { range: '200-250ms', count: 32000 },
+ { range: '250+ms', count: 12000 },
+ ];
+
+ const dailyMetricsData = [
+ { date: 'Mon', requests: 125000, errors: 240, avgLatency: 145 },
+ { date: 'Tue', requests: 132000, errors: 180, avgLatency: 138 },
+ { date: 'Wed', requests: 145000, errors: 210, avgLatency: 152 },
+ { date: 'Thu', requests: 138000, errors: 165, avgLatency: 141 },
+ { date: 'Fri', requests: 156000, errors: 195, avgLatency: 148 },
+ { date: 'Sat', requests: 98000, errors: 120, avgLatency: 135 },
+ { date: 'Sun', requests: 87000, errors: 98, avgLatency: 128 },
+ ];
+
+ const MetricCard: React.FC<{ icon: React.ReactNode; title: string; value: string; change: string; trend: 'up' | 'down' }> = ({
+ icon,
+ title,
+ value,
+ change,
+ trend,
+ }) => (
+
+
+
+
+ {icon}
+ {title}
+
+
{value}
+
+
+ {change}
+
+
+
+
+ );
+
+ return (
+
+
+
+
Analytics
+
Performance metrics and insights
+
+
+ Last 7 Days
+ Export Report
+
+
+
+ {/* Key Metrics */}
+
+ }
+ title="Total Requests"
+ value="1.2M"
+ change="+15.3% vs last week"
+ trend="up"
+ />
+ }
+ title="Avg Latency"
+ value="142ms"
+ change="-8.2% improvement"
+ trend="down"
+ />
+ }
+ title="Success Rate"
+ value="99.8%"
+ change="+0.3% increase"
+ trend="up"
+ />
+ }
+ title="Throughput"
+ value="2.4K/s"
+ change="+22.1% growth"
+ trend="up"
+ />
+
+
+ {/* Request Trends */}
+
+
Request Trends (24h)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Model Performance */}
+
+
Model Performance
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Latency Distribution */}
+
+
Latency Distribution
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Daily Metrics */}
+
+
Weekly Overview
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Performance Insights */}
+
+
Performance Insights
+
+
+
+
+
Recommendation Engine Performing Well
+
+ 52K requests with 96.7% accuracy and avg latency of 95ms
+
+
+
+
+
+
+
Peak Traffic Period
+
+ Highest request volume observed between 12:00-16:00 daily
+
+
+
+
+
+
+
Latency Optimization Opportunity
+
+ 12K requests exceed 250ms - consider optimizing model inference
+
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/dashboard/Collaboration.tsx b/ai-design-platform/src/components/dashboard/Collaboration.tsx
new file mode 100644
index 0000000..af0c8aa
--- /dev/null
+++ b/ai-design-platform/src/components/dashboard/Collaboration.tsx
@@ -0,0 +1,373 @@
+import React from 'react';
+import { Users, Activity, Clock, MessageSquare, GitBranch, CheckCircle } from 'lucide-react';
+import type { TeamMember } from '../../types';
+
+interface ActiveSession {
+ id: string;
+ userId: string;
+ activity: string;
+ resource: string;
+ startedAt: Date;
+}
+
+interface ActivityItem {
+ id: string;
+ userId: string;
+ userName: string;
+ action: string;
+ target: string;
+ timestamp: Date;
+}
+
+export const Collaboration: React.FC = () => {
+ const [teamMembers] = React.useState([
+ {
+ id: '1',
+ name: 'Sarah Chen',
+ role: 'ML Engineer',
+ avatar: '👩💻',
+ status: 'online',
+ lastActive: new Date(),
+ },
+ {
+ id: '2',
+ name: 'Marcus Rodriguez',
+ role: 'Data Scientist',
+ avatar: '👨🔬',
+ status: 'online',
+ lastActive: new Date(),
+ },
+ {
+ id: '3',
+ name: 'Emily Watson',
+ role: 'DevOps Engineer',
+ avatar: '👩💼',
+ status: 'busy',
+ lastActive: new Date(Date.now() - 300000),
+ },
+ {
+ id: '4',
+ name: 'David Kim',
+ role: 'Product Manager',
+ avatar: '👨💼',
+ status: 'online',
+ lastActive: new Date(),
+ },
+ {
+ id: '5',
+ name: 'Lisa Anderson',
+ role: 'ML Engineer',
+ avatar: '👩🎓',
+ status: 'offline',
+ lastActive: new Date(Date.now() - 3600000),
+ },
+ {
+ id: '6',
+ name: 'Alex Johnson',
+ role: 'Data Engineer',
+ avatar: '👨🎨',
+ status: 'online',
+ lastActive: new Date(),
+ },
+ ]);
+
+ const [activeSessions] = React.useState([
+ {
+ id: '1',
+ userId: '1',
+ activity: 'Training Model',
+ resource: 'fraud-detection-v4',
+ startedAt: new Date(Date.now() - 1800000),
+ },
+ {
+ id: '2',
+ userId: '2',
+ activity: 'Reviewing Data',
+ resource: 'customer-dataset-2024',
+ startedAt: new Date(Date.now() - 900000),
+ },
+ {
+ id: '3',
+ userId: '3',
+ activity: 'Deploying Model',
+ resource: 'recommendation-engine-v3',
+ startedAt: new Date(Date.now() - 600000),
+ },
+ {
+ id: '4',
+ userId: '4',
+ activity: 'Monitoring Metrics',
+ resource: 'production-dashboard',
+ startedAt: new Date(Date.now() - 300000),
+ },
+ ]);
+
+ const [activityFeed] = React.useState([
+ {
+ id: '1',
+ userId: '1',
+ userName: 'Sarah Chen',
+ action: 'deployed',
+ target: 'fraud-detection-v3',
+ timestamp: new Date(Date.now() - 300000),
+ },
+ {
+ id: '2',
+ userId: '3',
+ userName: 'Emily Watson',
+ action: 'updated configuration for',
+ target: 'API Gateway',
+ timestamp: new Date(Date.now() - 600000),
+ },
+ {
+ id: '3',
+ userId: '2',
+ userName: 'Marcus Rodriguez',
+ action: 'completed training for',
+ target: 'sentiment-analysis-v2',
+ timestamp: new Date(Date.now() - 900000),
+ },
+ {
+ id: '4',
+ userId: '4',
+ userName: 'David Kim',
+ action: 'created playbook',
+ target: 'Q1 Model Deployment Plan',
+ timestamp: new Date(Date.now() - 1200000),
+ },
+ {
+ id: '5',
+ userId: '6',
+ userName: 'Alex Johnson',
+ action: 'optimized pipeline',
+ target: 'data-ingestion-pipeline',
+ timestamp: new Date(Date.now() - 1800000),
+ },
+ {
+ id: '6',
+ userId: '1',
+ userName: 'Sarah Chen',
+ action: 'reviewed pull request',
+ target: 'Feature: Add model versioning',
+ timestamp: new Date(Date.now() - 2400000),
+ },
+ ]);
+
+ const getStatusColor = (status: TeamMember['status']) => {
+ switch (status) {
+ case 'online':
+ return 'bg-green-400';
+ case 'busy':
+ return 'bg-yellow-400';
+ case 'offline':
+ return 'bg-gray-400';
+ }
+ };
+
+ const getStatusText = (status: TeamMember['status']) => {
+ switch (status) {
+ case 'online':
+ return 'Online';
+ case 'busy':
+ return 'Busy';
+ case 'offline':
+ return 'Offline';
+ }
+ };
+
+ const getRoleBadgeColor = (role: string) => {
+ if (role.includes('Engineer')) return 'bg-purple-500/10 text-purple-400 border-purple-500/20';
+ if (role.includes('Scientist')) return 'bg-blue-500/10 text-blue-400 border-blue-500/20';
+ if (role.includes('Manager')) return 'bg-green-500/10 text-green-400 border-green-500/20';
+ return 'bg-gray-500/10 text-gray-400 border-gray-500/20';
+ };
+
+ const getTimeAgo = (date: Date) => {
+ const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
+ if (seconds < 60) return `${seconds}s ago`;
+ const minutes = Math.floor(seconds / 60);
+ if (minutes < 60) return `${minutes}m ago`;
+ const hours = Math.floor(minutes / 60);
+ return `${hours}h ago`;
+ };
+
+ const onlineMembers = teamMembers.filter(m => m.status === 'online').length;
+ const busyMembers = teamMembers.filter(m => m.status === 'busy').length;
+
+ return (
+
+
+
+
Team Collaboration
+
Real-time team activity and collaboration
+
+
+ Team Settings
+ Invite Member
+
+
+
+ {/* Team Overview */}
+
+
+
+
+ Total Members
+
+
{teamMembers.length}
+
Across all teams
+
+
+
+
{onlineMembers}
+
{busyMembers} busy
+
+
+
+
{activeSessions.length}
+
In progress
+
+
+
+
+ {/* Team Members */}
+
+
Team Members
+
+ {teamMembers.map(member => (
+
+
+
+
+ {member.avatar}
+
+
+
+
+
+ {member.name}
+
+ {member.role}
+
+
+
+ {getStatusText(member.status)}
+ {member.status !== 'online' && (
+ <>
+ •
+ {getTimeAgo(member.lastActive)}
+ >
+ )}
+
+
+
+
+
+
+
+ ))}
+
+
+
+ {/* Active Sessions */}
+
+
Active Sessions
+
+ {activeSessions.map(session => {
+ const member = teamMembers.find(m => m.id === session.userId);
+ return (
+
+
+
+ {member?.avatar}
+
+
+
+
{session.activity}
+
+
+ {session.resource}
+
+
+
+
+ {getTimeAgo(session.startedAt)}
+
+
+
+ );
+ })}
+
+
+
+
+ {/* Activity Feed */}
+
+
+
Activity Feed
+ View All
+
+
+ {activityFeed.map(activity => {
+ const member = teamMembers.find(m => m.id === activity.userId);
+ return (
+
+
+ {member?.avatar}
+
+
+
+ {activity.userName}
+ {activity.action}
+ {activity.target}
+
+
+
+ {getTimeAgo(activity.timestamp)}
+
+
+
+
+ );
+ })}
+
+
+
+ {/* Collaboration Stats */}
+
+
+
Models Deployed Today
+
8
+
↑ 25% from yesterday
+
+
+
Active Pull Requests
+
12
+
4 awaiting review
+
+
+
Team Contributions
+
47
+
This week
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/dashboard/Dashboard.tsx b/ai-design-platform/src/components/dashboard/Dashboard.tsx
new file mode 100644
index 0000000..0d564ee
--- /dev/null
+++ b/ai-design-platform/src/components/dashboard/Dashboard.tsx
@@ -0,0 +1,182 @@
+import React from 'react';
+import { Activity, Cpu, HardDrive, Zap, AlertTriangle, CheckCircle } from 'lucide-react';
+import type { SystemMetrics } from '../../types';
+
+export const Dashboard: React.FC = () => {
+ const [metrics] = React.useState({
+ cpu: 45,
+ memory: 62,
+ gpu: 38,
+ activeModels: 12,
+ totalRequests: 1547890,
+ avgLatency: 145,
+ });
+
+ const MetricCard: React.FC<{ icon: React.ReactNode; title: string; value: string | number; subtitle: string; trend?: 'up' | 'down' }> = ({
+ icon,
+ title,
+ value,
+ subtitle,
+ }) => (
+
+
+
+
+ {icon}
+ {title}
+
+
{value}
+
{subtitle}
+
+
+
+ );
+
+ return (
+
+
+
+
Dashboard
+
Real-time system monitoring and insights
+
+
+ Refresh
+ Deploy Model
+
+
+
+ {/* System Status */}
+
+
+
+
+
System Healthy
+
All services operational
+
+
+
+
+
+ {/* Metrics Grid */}
+
+ }
+ title="CPU Usage"
+ value={`${metrics.cpu}%`}
+ subtitle="4 cores active"
+ />
+ }
+ title="Memory"
+ value={`${metrics.memory}%`}
+ subtitle="24.8 GB / 40 GB"
+ />
+ }
+ title="GPU Usage"
+ value={`${metrics.gpu}%`}
+ subtitle="NVIDIA A100"
+ />
+ }
+ title="Active Models"
+ value={metrics.activeModels}
+ subtitle="12 deployed, 3 training"
+ />
+
+
+ {/* Resource Usage */}
+
+
Resource Monitoring
+
+
+
+ CPU Utilization
+ {metrics.cpu}%
+
+
+
+
+
+ Memory Usage
+ {metrics.memory}%
+
+
+
+
+
+ GPU Processing
+ {metrics.gpu}%
+
+
+
+
+
+
+ {/* Quick Stats */}
+
+
+
Total Requests
+
{metrics.totalRequests.toLocaleString()}
+
↑ 12% from last week
+
+
+
Avg Latency
+
{metrics.avgLatency}ms
+
↓ 8% improvement
+
+
+
System Uptime
+
99.98%
+
Last 30 days
+
+
+
+ {/* Recent Alerts */}
+
+
Recent Alerts
+
+
+
+
+
Cache Performance Degraded
+
Redis cluster experiencing high latency
+
+
5m ago
+
+
+
+
+
Model Training Complete
+
fraud-detection-v2 ready for deployment
+
+
15m ago
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/dashboard/ModelManagement.tsx b/ai-design-platform/src/components/dashboard/ModelManagement.tsx
new file mode 100644
index 0000000..50e6067
--- /dev/null
+++ b/ai-design-platform/src/components/dashboard/ModelManagement.tsx
@@ -0,0 +1,262 @@
+import React from 'react';
+import { Search, Filter, Play, Archive, GitBranch, TrendingUp, Clock, CheckCircle, AlertCircle, Package } from 'lucide-react';
+import type { AIModel } from '../../types';
+
+export const ModelManagement: React.FC = () => {
+ const [searchQuery, setSearchQuery] = React.useState('');
+ const [statusFilter, setStatusFilter] = React.useState('all');
+
+ const [models] = React.useState([
+ {
+ id: '1',
+ name: 'fraud-detection-v3',
+ version: '3.2.1',
+ status: 'deployed',
+ accuracy: 98.5,
+ latency: 120,
+ throughput: 1500,
+ createdAt: new Date('2024-01-15'),
+ updatedAt: new Date('2024-01-20'),
+ },
+ {
+ id: '2',
+ name: 'customer-sentiment',
+ version: '2.1.0',
+ status: 'active',
+ accuracy: 94.2,
+ latency: 85,
+ throughput: 2200,
+ createdAt: new Date('2024-01-10'),
+ updatedAt: new Date('2024-01-18'),
+ },
+ {
+ id: '3',
+ name: 'price-optimization',
+ version: '1.5.3',
+ status: 'training',
+ accuracy: 91.8,
+ latency: 200,
+ throughput: 800,
+ createdAt: new Date('2024-01-12'),
+ updatedAt: new Date('2024-01-22'),
+ },
+ {
+ id: '4',
+ name: 'recommendation-engine',
+ version: '4.0.0',
+ status: 'deployed',
+ accuracy: 96.7,
+ latency: 95,
+ throughput: 3000,
+ createdAt: new Date('2024-01-08'),
+ updatedAt: new Date('2024-01-21'),
+ },
+ {
+ id: '5',
+ name: 'churn-prediction',
+ version: '2.3.1',
+ status: 'archived',
+ accuracy: 89.4,
+ latency: 150,
+ throughput: 600,
+ createdAt: new Date('2023-12-20'),
+ updatedAt: new Date('2024-01-05'),
+ },
+ {
+ id: '6',
+ name: 'image-classifier',
+ version: '3.1.0',
+ status: 'active',
+ accuracy: 97.3,
+ latency: 180,
+ throughput: 1200,
+ createdAt: new Date('2024-01-14'),
+ updatedAt: new Date('2024-01-19'),
+ },
+ ]);
+
+ const filteredModels = models.filter(model => {
+ const matchesSearch = model.name.toLowerCase().includes(searchQuery.toLowerCase());
+ const matchesStatus = statusFilter === 'all' || model.status === statusFilter;
+ return matchesSearch && matchesStatus;
+ });
+
+ const getStatusIcon = (status: AIModel['status']) => {
+ switch (status) {
+ case 'deployed':
+ return ;
+ case 'active':
+ return ;
+ case 'training':
+ return ;
+ case 'archived':
+ return ;
+ }
+ };
+
+ const getStatusColor = (status: AIModel['status']) => {
+ switch (status) {
+ case 'deployed':
+ return 'bg-green-500/10 text-green-400 border-green-500/20';
+ case 'active':
+ return 'bg-blue-500/10 text-blue-400 border-blue-500/20';
+ case 'training':
+ return 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20';
+ case 'archived':
+ return 'bg-gray-500/10 text-gray-400 border-gray-500/20';
+ }
+ };
+
+ const ModelCard: React.FC<{ model: AIModel }> = ({ model }) => (
+
+
+
+
+
+
{model.name}
+
+
+ {getStatusIcon(model.status)}
+ {model.status}
+
+ v{model.version}
+
+
+
+
+ {model.status === 'active' && (
+ Deploy
+ )}
+ {model.status === 'deployed' && (
+ Monitor
+ )}
+
+
+
+
+
+
+
+
+
Accuracy
+
{model.accuracy}%
+
+
+
Latency
+
{model.latency}ms
+
+
+
Throughput
+
{model.throughput}/s
+
+
+
+
+
+
+ Updated {model.updatedAt.toLocaleDateString()}
+
+
+
+ +12% requests
+
+
+
+ );
+
+ const statusCounts = {
+ all: models.length,
+ deployed: models.filter(m => m.status === 'deployed').length,
+ active: models.filter(m => m.status === 'active').length,
+ training: models.filter(m => m.status === 'training').length,
+ archived: models.filter(m => m.status === 'archived').length,
+ };
+
+ return (
+
+
+
+
Model Management
+
Manage AI model lifecycle and deployments
+
+
Deploy New Model
+
+
+ {/* Search and Filter */}
+
+
+
+
+ setSearchQuery(e.target.value)}
+ className="w-full pl-10 pr-4 py-2 bg-gray-900/50 border border-gray-700 rounded-lg focus:outline-none focus:border-purple-500"
+ />
+
+
+
+ setStatusFilter(e.target.value)}
+ className="px-4 py-2 bg-gray-900/50 border border-gray-700 rounded-lg focus:outline-none focus:border-purple-500"
+ >
+ All ({statusCounts.all})
+ Deployed ({statusCounts.deployed})
+ Active ({statusCounts.active})
+ Training ({statusCounts.training})
+ Archived ({statusCounts.archived})
+
+
+
+
+
+ {/* Status Overview */}
+
+
+
+
+ Deployed
+
+
{statusCounts.deployed}
+
+
+
+
{statusCounts.active}
+
+
+
+
+ Training
+
+
{statusCounts.training}
+
+
+
+
{statusCounts.archived}
+
+
+
+ {/* Model Grid */}
+
+ {filteredModels.length > 0 ? (
+ filteredModels.map(model =>
)
+ ) : (
+
+
+
No models found matching your filters
+
+ )}
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/dashboard/Monitoring.tsx b/ai-design-platform/src/components/dashboard/Monitoring.tsx
new file mode 100644
index 0000000..1ace6e1
--- /dev/null
+++ b/ai-design-platform/src/components/dashboard/Monitoring.tsx
@@ -0,0 +1,450 @@
+import React from 'react';
+import { CheckCircle, AlertCircle, XCircle, Server, Database, Cpu, Network, HardDrive, Bell, Activity, Terminal } from 'lucide-react';
+
+interface ServiceHealth {
+ id: string;
+ name: string;
+ status: 'healthy' | 'degraded' | 'down';
+ uptime: number;
+ responseTime: number;
+ lastCheck: Date;
+}
+
+interface LogEntry {
+ id: string;
+ timestamp: Date;
+ level: 'info' | 'warning' | 'error';
+ service: string;
+ message: string;
+}
+
+interface Alert {
+ id: string;
+ severity: 'critical' | 'warning' | 'info';
+ title: string;
+ message: string;
+ timestamp: Date;
+ resolved: boolean;
+}
+
+export const Monitoring: React.FC = () => {
+ const [services] = React.useState([
+ {
+ id: '1',
+ name: 'API Gateway',
+ status: 'healthy',
+ uptime: 99.98,
+ responseTime: 45,
+ lastCheck: new Date(),
+ },
+ {
+ id: '2',
+ name: 'ML Pipeline',
+ status: 'healthy',
+ uptime: 99.95,
+ responseTime: 120,
+ lastCheck: new Date(),
+ },
+ {
+ id: '3',
+ name: 'Database Cluster',
+ status: 'healthy',
+ uptime: 99.99,
+ responseTime: 12,
+ lastCheck: new Date(),
+ },
+ {
+ id: '4',
+ name: 'Cache Service',
+ status: 'degraded',
+ uptime: 98.5,
+ responseTime: 280,
+ lastCheck: new Date(),
+ },
+ {
+ id: '5',
+ name: 'Message Queue',
+ status: 'healthy',
+ uptime: 99.97,
+ responseTime: 8,
+ lastCheck: new Date(),
+ },
+ {
+ id: '6',
+ name: 'Storage Service',
+ status: 'healthy',
+ uptime: 99.96,
+ responseTime: 55,
+ lastCheck: new Date(),
+ },
+ ]);
+
+ const [logs] = React.useState([
+ {
+ id: '1',
+ timestamp: new Date(Date.now() - 30000),
+ level: 'info',
+ service: 'API Gateway',
+ message: 'Request processed successfully - /api/v1/predict',
+ },
+ {
+ id: '2',
+ timestamp: new Date(Date.now() - 45000),
+ level: 'warning',
+ service: 'Cache Service',
+ message: 'High latency detected - response time: 280ms',
+ },
+ {
+ id: '3',
+ timestamp: new Date(Date.now() - 60000),
+ level: 'info',
+ service: 'ML Pipeline',
+ message: 'Model training completed - fraud-detection-v3',
+ },
+ {
+ id: '4',
+ timestamp: new Date(Date.now() - 90000),
+ level: 'error',
+ service: 'Database Cluster',
+ message: 'Connection pool exhausted - attempting recovery',
+ },
+ {
+ id: '5',
+ timestamp: new Date(Date.now() - 120000),
+ level: 'info',
+ service: 'Message Queue',
+ message: 'Queue processed - 1247 messages handled',
+ },
+ {
+ id: '6',
+ timestamp: new Date(Date.now() - 150000),
+ level: 'warning',
+ service: 'Storage Service',
+ message: 'Disk usage at 75% - cleanup recommended',
+ },
+ ]);
+
+ const [alerts] = React.useState([
+ {
+ id: '1',
+ severity: 'warning',
+ title: 'Cache Performance Degraded',
+ message: 'Redis cluster experiencing high latency (280ms avg)',
+ timestamp: new Date(Date.now() - 300000),
+ resolved: false,
+ },
+ {
+ id: '2',
+ severity: 'info',
+ title: 'Model Training Complete',
+ message: 'fraud-detection-v3 training completed successfully',
+ timestamp: new Date(Date.now() - 600000),
+ resolved: true,
+ },
+ {
+ id: '3',
+ severity: 'critical',
+ title: 'Database Connection Pool Full',
+ message: 'All connections in use - auto-scaling initiated',
+ timestamp: new Date(Date.now() - 900000),
+ resolved: true,
+ },
+ ]);
+
+ const [resourceMetrics] = React.useState({
+ cpu: 45,
+ memory: 62,
+ disk: 75,
+ network: 38,
+ });
+
+ const getStatusIcon = (status: ServiceHealth['status']) => {
+ switch (status) {
+ case 'healthy':
+ return ;
+ case 'degraded':
+ return ;
+ case 'down':
+ return ;
+ }
+ };
+
+ const getStatusColor = (status: ServiceHealth['status']) => {
+ switch (status) {
+ case 'healthy':
+ return 'bg-green-500/10 border-green-500/20';
+ case 'degraded':
+ return 'bg-yellow-500/10 border-yellow-500/20';
+ case 'down':
+ return 'bg-red-500/10 border-red-500/20';
+ }
+ };
+
+ const getLogLevelColor = (level: LogEntry['level']) => {
+ switch (level) {
+ case 'info':
+ return 'text-blue-400';
+ case 'warning':
+ return 'text-yellow-400';
+ case 'error':
+ return 'text-red-400';
+ }
+ };
+
+ const getAlertColor = (severity: Alert['severity']) => {
+ switch (severity) {
+ case 'critical':
+ return 'bg-red-500/10 border-red-500/20';
+ case 'warning':
+ return 'bg-yellow-500/10 border-yellow-500/20';
+ case 'info':
+ return 'bg-blue-500/10 border-blue-500/20';
+ }
+ };
+
+ const healthyServices = services.filter(s => s.status === 'healthy').length;
+ const degradedServices = services.filter(s => s.status === 'degraded').length;
+ const downServices = services.filter(s => s.status === 'down').length;
+
+ return (
+
+
+
+
System Monitoring
+
Real-time service health and system metrics
+
+
+ Configure Alerts
+ View Logs
+
+
+
+ {/* Overall Status */}
+
+
+ {degradedServices === 0 && downServices === 0 ? (
+ <>
+
+
+
All Systems Operational
+
{healthyServices} services running normally
+
+ >
+ ) : (
+ <>
+
+
+
System Degraded
+
+ {healthyServices} healthy, {degradedServices} degraded, {downServices} down
+
+
+ >
+ )}
+
+
+
+
{healthyServices}
+
Healthy
+
+
+
{degradedServices}
+
Degraded
+
+
+
{downServices}
+
Down
+
+
+
+
+ {/* Service Health */}
+
+
Service Health Checks
+
+ {services.map(service => (
+
+
+
+ {getStatusIcon(service.status)}
+ {service.name}
+
+
+
+
+
+ Uptime
+ {service.uptime}%
+
+
+ Response
+ {service.responseTime}ms
+
+
+ Last check: {service.lastCheck.toLocaleTimeString()}
+
+
+
+ ))}
+
+
+
+
+ {/* Resource Usage */}
+
+
Resource Usage
+
+
+
+
+
+ CPU Utilization
+
+
{resourceMetrics.cpu}%
+
+
+
+
+
+
+
+ Memory Usage
+
+
{resourceMetrics.memory}%
+
+
+
+
+
+
+
+ Disk Usage
+
+
{resourceMetrics.disk}%
+
+
+
+
+
+
+
+ Network I/O
+
+
{resourceMetrics.network}%
+
+
+
+
+
+
+ {/* Active Alerts */}
+
+
+
Active Alerts
+
+
+
+ {alerts.map(alert => (
+
+
+ {alert.title}
+
+ {Math.floor((Date.now() - alert.timestamp.getTime()) / 60000)}m ago
+
+
+
{alert.message}
+ {alert.resolved && (
+
+
+ Resolved
+
+ )}
+
+ ))}
+
+
+
+
+ {/* Live Logs */}
+
+
+
+ {logs.map(log => (
+
+ {log.timestamp.toLocaleTimeString()}
+
+ [{log.level}]
+
+ [{log.service}]
+ {log.message}
+
+ ))}
+
+
+
+ {/* System Info */}
+
+
+
+
99.98%
+
Last 30 days
+
+
+
+
+ Total Services
+
+
{services.length}
+
Monitoring active
+
+
+
+
+ Alerts Today
+
+
{alerts.filter(a => !a.resolved).length}
+
+ {alerts.filter(a => a.resolved).length} resolved
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/enterprise/ExecutiveDashboard.tsx b/ai-design-platform/src/components/enterprise/ExecutiveDashboard.tsx
new file mode 100644
index 0000000..37f9469
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/ExecutiveDashboard.tsx
@@ -0,0 +1,352 @@
+import React, { useState } from 'react';
+import {
+ TrendingUp,
+ DollarSign,
+ Users,
+ Zap,
+ Activity,
+ BarChart3,
+ Target,
+ Award,
+ ChevronUp,
+ ChevronDown,
+ Calendar
+} from 'lucide-react';
+import {
+ BarChart,
+ Bar,
+ PieChart,
+ Pie,
+ Cell,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer
+} from 'recharts';
+
+interface KPI {
+ title: string;
+ value: string;
+ change: number;
+ trend: 'up' | 'down';
+ icon: React.ReactNode;
+ color: string;
+}
+
+interface DepartmentMetrics {
+ name: string;
+ usage: number;
+ models: number;
+ roi: number;
+}
+
+export const ExecutiveDashboard: React.FC = () => {
+ const [timeRange, setTimeRange] = useState<'week' | 'month' | 'quarter'>('month');
+
+ const kpis: KPI[] = [
+ {
+ title: 'Revenue Impact',
+ value: '$2.4M',
+ change: 23.5,
+ trend: 'up',
+ icon: ,
+ color: 'from-green-500 to-emerald-500'
+ },
+ {
+ title: 'Cost Savings',
+ value: '$840K',
+ change: 18.2,
+ trend: 'up',
+ icon: ,
+ color: 'from-blue-500 to-cyan-500'
+ },
+ {
+ title: 'Team Productivity',
+ value: '+34%',
+ change: 12.8,
+ trend: 'up',
+ icon: ,
+ color: 'from-purple-500 to-pink-500'
+ },
+ {
+ title: 'Active Users',
+ value: '1,247',
+ change: 8.4,
+ trend: 'up',
+ icon: ,
+ color: 'from-orange-500 to-red-500'
+ }
+ ];
+
+ const departmentData: DepartmentMetrics[] = [
+ { name: 'Sales', usage: 92, models: 8, roi: 340 },
+ { name: 'Marketing', usage: 87, models: 12, roi: 285 },
+ { name: 'Operations', usage: 78, models: 6, roi: 410 },
+ { name: 'Finance', usage: 95, models: 5, roi: 520 },
+ { name: 'Customer Service', usage: 88, models: 9, roi: 295 },
+ { name: 'R&D', usage: 71, models: 15, roi: 180 }
+ ];
+
+ const revenueData = [
+ { month: 'Jan', ai: 180, manual: 120 },
+ { month: 'Feb', ai: 220, manual: 125 },
+ { month: 'Mar', ai: 280, manual: 130 },
+ { month: 'Apr', ai: 340, manual: 128 },
+ { month: 'May', ai: 420, manual: 132 },
+ { month: 'Jun', ai: 510, manual: 135 }
+ ];
+
+ const modelPerformance = [
+ { name: 'Excellent', value: 45, color: '#10b981' },
+ { name: 'Good', value: 35, color: '#3b82f6' },
+ { name: 'Average', value: 15, color: '#f59e0b' },
+ { name: 'Needs Review', value: 5, color: '#ef4444' }
+ ];
+
+ const achievements = [
+ {
+ title: 'Revenue Milestone',
+ description: 'Exceeded $2M AI-driven revenue',
+ date: '2 days ago',
+ icon: ,
+ color: 'border-green-500/30 bg-green-500/10'
+ },
+ {
+ title: 'Enterprise Adoption',
+ description: '1,000+ active users achieved',
+ date: '1 week ago',
+ icon: ,
+ color: 'border-blue-500/30 bg-blue-500/10'
+ },
+ {
+ title: 'Model Excellence',
+ description: '95% model accuracy across platform',
+ date: '2 weeks ago',
+ icon: ,
+ color: 'border-purple-500/30 bg-purple-500/10'
+ }
+ ];
+
+ return (
+
+ {/* Header */}
+
+
+
Executive Dashboard
+
Strategic overview of AI platform performance
+
+
+
+ {(['week', 'month', 'quarter'] as const).map((range) => (
+ setTimeRange(range)}
+ className={`px-4 py-2 rounded-lg text-sm font-medium transition-all ${
+ timeRange === range
+ ? 'bg-gradient-to-r from-purple-600 to-blue-500 text-white'
+ : 'text-gray-400 hover:text-white'
+ }`}
+ >
+ {range.charAt(0).toUpperCase() + range.slice(1)}
+
+ ))}
+
+
+
+ Custom Range
+
+
+
+
+ {/* KPIs */}
+
+ {kpis.map((kpi, index) => (
+
+
+
+
+
+ {kpi.icon}
+
+
+ {kpi.trend === 'up' ? (
+
+ ) : (
+
+ )}
+ {kpi.change}%
+
+
+
{kpi.title}
+
{kpi.value}
+
vs. previous {timeRange}
+
+
+ ))}
+
+
+
+ {/* Revenue Comparison */}
+
+
+
+
Revenue Impact
+
AI-driven vs. Manual processes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Model Performance */}
+
+
+
Model Performance
+
Quality distribution
+
+
+
+
+ {modelPerformance.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+
+ {modelPerformance.map((item, idx) => (
+
+ ))}
+
+
+
+
+ {/* Department Analytics */}
+
+
+
+
Department Analytics
+
Usage and ROI by business unit
+
+
+
+
+
+
+
+ Department
+ Usage
+ Active Models
+ ROI
+
+
+
+ {departmentData.map((dept, idx) => (
+
+
+ {dept.name}
+
+
+
+
+
+ {dept.models}
+
+
+ 400 ? 'text-green-400' :
+ dept.roi > 250 ? 'text-blue-400' : 'text-yellow-400'
+ }`}>
+ {dept.roi}%
+
+
+
+ ))}
+
+
+
+
+
+ {/* Strategic Achievements */}
+
+
+
Strategic Achievements
+
Recent milestones and accomplishments
+
+
+ {achievements.map((achievement, idx) => (
+
+
+
+ {achievement.icon}
+
+
+
{achievement.title}
+
{achievement.description}
+
{achievement.date}
+
+
+
+ ))}
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/enterprise/ImplementationPlaybooks.tsx b/ai-design-platform/src/components/enterprise/ImplementationPlaybooks.tsx
new file mode 100644
index 0000000..21695b1
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/ImplementationPlaybooks.tsx
@@ -0,0 +1,485 @@
+import React, { useState } from 'react';
+import {
+ BookOpen,
+ Clock,
+ CheckCircle,
+ Circle,
+ Rocket,
+ Building2,
+ Cloud,
+ Database,
+ Shield,
+ Users,
+ Download,
+ Play,
+ ChevronRight,
+ Award
+} from 'lucide-react';
+import type { Playbook } from '../../types';
+
+export const ImplementationPlaybooks: React.FC = () => {
+ const [selectedPlaybook, setSelectedPlaybook] = useState('quick-start');
+
+ const playbooks: Playbook[] = [
+ {
+ id: 'quick-start',
+ title: 'Quick Start',
+ description: 'Get up and running with AI platform in 30 days',
+ timeline: '0-30 days',
+ progress: 65,
+ steps: [
+ {
+ id: '1',
+ title: 'Environment Setup',
+ description: 'Configure cloud infrastructure and development environment',
+ completed: true,
+ resources: ['AWS Setup Guide', 'Azure Quick Start', 'GCP Configuration']
+ },
+ {
+ id: '2',
+ title: 'User Onboarding',
+ description: 'Create user accounts and assign roles',
+ completed: true,
+ resources: ['User Management Guide', 'RBAC Documentation', 'SSO Integration']
+ },
+ {
+ id: '3',
+ title: 'First Model Deployment',
+ description: 'Deploy your first pre-trained AI model',
+ completed: true,
+ resources: ['Model Deployment Guide', 'API Documentation', 'Testing Checklist']
+ },
+ {
+ id: '4',
+ title: 'Integration Testing',
+ description: 'Test API endpoints and model responses',
+ completed: false,
+ resources: ['Testing Framework', 'API Examples', 'Postman Collection']
+ },
+ {
+ id: '5',
+ title: 'Production Launch',
+ description: 'Deploy to production and monitor performance',
+ completed: false,
+ resources: ['Launch Checklist', 'Monitoring Setup', 'Rollback Plan']
+ }
+ ]
+ },
+ {
+ id: 'enterprise-deployment',
+ title: 'Enterprise Deployment',
+ description: 'Full-scale enterprise rollout with governance',
+ timeline: '30-90 days',
+ progress: 40,
+ steps: [
+ {
+ id: '1',
+ title: 'Architecture Review',
+ description: 'Design scalable architecture for enterprise workloads',
+ completed: true,
+ resources: ['Architecture Blueprint', 'Scalability Guide', 'High Availability Setup']
+ },
+ {
+ id: '2',
+ title: 'Security Audit',
+ description: 'Implement security controls and compliance measures',
+ completed: true,
+ resources: ['Security Checklist', 'Compliance Framework', 'Penetration Testing']
+ },
+ {
+ id: '3',
+ title: 'Multi-Region Setup',
+ description: 'Deploy across multiple geographic regions',
+ completed: false,
+ resources: ['Global Deployment Guide', 'Data Residency', 'Latency Optimization']
+ },
+ {
+ id: '4',
+ title: 'Governance Framework',
+ description: 'Establish AI governance policies and approval workflows',
+ completed: false,
+ resources: ['Governance Guide', 'Policy Templates', 'Approval Workflows']
+ },
+ {
+ id: '5',
+ title: 'Department Rollout',
+ description: 'Progressive rollout across business units',
+ completed: false,
+ resources: ['Rollout Plan', 'Change Management', 'Training Materials']
+ }
+ ]
+ },
+ {
+ id: 'cloud-migration',
+ title: 'Cloud Migration',
+ description: 'Migrate existing AI workloads to cloud platform',
+ timeline: '60-120 days',
+ progress: 25,
+ steps: [
+ {
+ id: '1',
+ title: 'Workload Assessment',
+ description: 'Analyze existing AI models and dependencies',
+ completed: true,
+ resources: ['Assessment Template', 'Dependency Mapping', 'Cost Analysis']
+ },
+ {
+ id: '2',
+ title: 'Migration Strategy',
+ description: 'Plan migration approach and timeline',
+ completed: false,
+ resources: ['Migration Framework', 'Risk Assessment', 'Downtime Planning']
+ },
+ {
+ id: '3',
+ title: 'Data Migration',
+ description: 'Transfer training data and model artifacts',
+ completed: false,
+ resources: ['Data Transfer Tools', 'Validation Scripts', 'Backup Strategy']
+ },
+ {
+ id: '4',
+ title: 'Model Retraining',
+ description: 'Retrain models on cloud infrastructure',
+ completed: false,
+ resources: ['Training Pipeline', 'Hyperparameter Tuning', 'Performance Benchmarks']
+ },
+ {
+ id: '5',
+ title: 'Cutover & Validation',
+ description: 'Switch to cloud platform and validate performance',
+ completed: false,
+ resources: ['Cutover Checklist', 'Validation Tests', 'Rollback Procedures']
+ }
+ ]
+ },
+ {
+ id: 'data-integration',
+ title: 'Data Integration',
+ description: 'Connect enterprise data sources for AI training',
+ timeline: '45-90 days',
+ progress: 55,
+ steps: [
+ {
+ id: '1',
+ title: 'Data Discovery',
+ description: 'Identify and catalog available data sources',
+ completed: true,
+ resources: ['Data Catalog', 'Source Inventory', 'Quality Assessment']
+ },
+ {
+ id: '2',
+ title: 'ETL Pipeline Setup',
+ description: 'Build data extraction and transformation pipelines',
+ completed: true,
+ resources: ['Pipeline Templates', 'Transformation Logic', 'Scheduling Guide']
+ },
+ {
+ id: '3',
+ title: 'Data Quality Gates',
+ description: 'Implement validation and quality controls',
+ completed: true,
+ resources: ['Quality Metrics', 'Validation Rules', 'Monitoring Dashboard']
+ },
+ {
+ id: '4',
+ title: 'Real-time Streaming',
+ description: 'Enable real-time data ingestion for live models',
+ completed: false,
+ resources: ['Streaming Architecture', 'Kafka Setup', 'Stream Processing']
+ },
+ {
+ id: '5',
+ title: 'Data Governance',
+ description: 'Establish data lineage and access controls',
+ completed: false,
+ resources: ['Governance Policies', 'Access Control', 'Audit Logging']
+ }
+ ]
+ },
+ {
+ id: 'security-hardening',
+ title: 'Security Hardening',
+ description: 'Implement advanced security measures',
+ timeline: '30-60 days',
+ progress: 70,
+ steps: [
+ {
+ id: '1',
+ title: 'Access Control',
+ description: 'Configure RBAC and MFA requirements',
+ completed: true,
+ resources: ['RBAC Guide', 'MFA Setup', 'Identity Provider Integration']
+ },
+ {
+ id: '2',
+ title: 'Network Security',
+ description: 'Implement firewalls and network segmentation',
+ completed: true,
+ resources: ['Network Architecture', 'Firewall Rules', 'VPN Configuration']
+ },
+ {
+ id: '3',
+ title: 'Encryption',
+ description: 'Enable encryption at rest and in transit',
+ completed: true,
+ resources: ['Encryption Guide', 'Key Management', 'Certificate Setup']
+ },
+ {
+ id: '4',
+ title: 'Vulnerability Scanning',
+ description: 'Schedule regular security scans and penetration tests',
+ completed: false,
+ resources: ['Scanning Tools', 'Test Procedures', 'Remediation Workflow']
+ },
+ {
+ id: '5',
+ title: 'Incident Response',
+ description: 'Create security incident response plan',
+ completed: false,
+ resources: ['Response Playbook', 'Contact List', 'Communication Plan']
+ }
+ ]
+ },
+ {
+ id: 'team-onboarding',
+ title: 'Team Onboarding',
+ description: 'Train teams on AI platform usage',
+ timeline: '15-45 days',
+ progress: 80,
+ steps: [
+ {
+ id: '1',
+ title: 'Training Program',
+ description: 'Develop role-based training curriculum',
+ completed: true,
+ resources: ['Training Modules', 'Video Tutorials', 'Hands-on Labs']
+ },
+ {
+ id: '2',
+ title: 'Certification',
+ description: 'Certify users on platform competency',
+ completed: true,
+ resources: ['Certification Exam', 'Study Guide', 'Practice Tests']
+ },
+ {
+ id: '3',
+ title: 'Documentation',
+ description: 'Create internal documentation and best practices',
+ completed: true,
+ resources: ['Documentation Templates', 'Best Practices', 'FAQ Database']
+ },
+ {
+ id: '4',
+ title: 'Support Structure',
+ description: 'Establish internal support channels',
+ completed: true,
+ resources: ['Support Portal', 'Ticketing System', 'Office Hours']
+ },
+ {
+ id: '5',
+ title: 'Continuous Learning',
+ description: 'Set up ongoing training and knowledge sharing',
+ completed: false,
+ resources: ['Learning Path', 'Community Forum', 'Monthly Workshops']
+ }
+ ]
+ }
+ ];
+
+ const getIcon = (id: string) => {
+ const icons: Record = {
+ 'quick-start': ,
+ 'enterprise-deployment': ,
+ 'cloud-migration': ,
+ 'data-integration': ,
+ 'security-hardening': ,
+ 'team-onboarding':
+ };
+ return icons[id] || ;
+ };
+
+ const activePlaybook = playbooks.find(p => p.id === selectedPlaybook);
+
+ return (
+
+
+
+
Implementation Playbooks
+
Step-by-step guides for successful AI platform adoption
+
+
+
+
+ Export Plan
+
+
+
+ Track Progress
+
+
+
+
+
+ {/* Playbook List */}
+
+ {playbooks.map((playbook) => (
+
setSelectedPlaybook(playbook.id)}
+ className={`card-hover transition-all duration-300 ${
+ selectedPlaybook === playbook.id
+ ? 'ring-2 ring-purple-500 bg-white/10'
+ : ''
+ }`}
+ >
+
+
+ {getIcon(playbook.id)}
+
+
+
{playbook.title}
+
+ {playbook.description}
+
+
+
+ {playbook.timeline}
+
+
+
+ Progress
+ {playbook.progress}%
+
+
+
+
+
+
+ ))}
+
+
+ {/* Playbook Details */}
+ {activePlaybook && (
+
+
+
+
+
+ {getIcon(activePlaybook.id)}
+
+
+
+ {activePlaybook.title}
+
+
{activePlaybook.description}
+
+
+
+ Timeline: {activePlaybook.timeline}
+
+
+
+ {activePlaybook.steps.filter(s => s.completed).length} of {activePlaybook.steps.length} completed
+
+
+
+
+
+
+ Start
+
+
+
+ {/* Progress Bar */}
+
+
+ Overall Progress
+ {activePlaybook.progress}%
+
+
+
+
+ {/* Steps */}
+
+
Implementation Steps
+ {activePlaybook.steps.map((step, index) => (
+
+
+
+ {step.completed ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+ Step {index + 1}
+
+
+ {step.title}
+
+
+
{step.description}
+
+ {!step.completed && (
+
+ Mark Complete
+
+ )}
+
+
+
Resources:
+
+ {step.resources.map((resource, idx) => (
+
+
+ {resource}
+
+ ))}
+
+
+
+
+
+ ))}
+
+
+
+ )}
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/enterprise/IndustryTemplates.tsx b/ai-design-platform/src/components/enterprise/IndustryTemplates.tsx
new file mode 100644
index 0000000..ce762a9
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/IndustryTemplates.tsx
@@ -0,0 +1,244 @@
+import React from 'react';
+import {
+ Heart,
+ DollarSign,
+ ShoppingCart,
+ Factory,
+ Truck,
+ GraduationCap,
+ Clock,
+ TrendingUp,
+ Shield,
+ CheckCircle
+} from 'lucide-react';
+import type { IndustryTemplate } from '../../types';
+
+export const IndustryTemplates: React.FC = () => {
+ const templates: IndustryTemplate[] = [
+ {
+ id: '1',
+ name: 'Healthcare AI Suite',
+ industry: 'Healthcare',
+ description: 'HIPAA-compliant medical imaging analysis, patient diagnosis support, and treatment recommendation systems',
+ models: ['Medical Imaging CNN', 'Diagnosis NLP', 'Treatment Optimizer'],
+ roi: 340,
+ timeline: '8-12 weeks',
+ compliance: ['HIPAA', 'HL7', 'FHIR', 'FDA 21 CFR Part 11'],
+ icon: 'heart'
+ },
+ {
+ id: '2',
+ name: 'Financial Services Platform',
+ industry: 'Finance',
+ description: 'Real-time fraud detection, credit risk analysis, algorithmic trading, and anti-money laundering',
+ models: ['Fraud Detection ML', 'Risk Scoring', 'Transaction Anomaly Detection'],
+ roi: 420,
+ timeline: '10-14 weeks',
+ compliance: ['PCI DSS', 'SOC 2', 'GLBA', 'SOX'],
+ icon: 'dollar'
+ },
+ {
+ id: '3',
+ name: 'Retail Intelligence',
+ industry: 'Retail',
+ description: 'Customer behavior analytics, demand forecasting, dynamic pricing, and inventory optimization',
+ models: ['Customer Segmentation', 'Demand Forecasting LSTM', 'Price Optimization'],
+ roi: 285,
+ timeline: '6-10 weeks',
+ compliance: ['GDPR', 'CCPA', 'PCI DSS'],
+ icon: 'cart'
+ },
+ {
+ id: '4',
+ name: 'Manufacturing Optimizer',
+ industry: 'Manufacturing',
+ description: 'Predictive maintenance, quality control automation, production optimization, and supply chain forecasting',
+ models: ['Predictive Maintenance', 'Quality Vision AI', 'Production Scheduler'],
+ roi: 380,
+ timeline: '12-16 weeks',
+ compliance: ['ISO 9001', 'ISO 27001', 'OSHA'],
+ icon: 'factory'
+ },
+ {
+ id: '5',
+ name: 'Logistics Optimizer',
+ industry: 'Logistics',
+ description: 'Route optimization, fleet management, delivery prediction, and warehouse automation',
+ models: ['Route Optimizer', 'Demand Prediction', 'Fleet Management AI'],
+ roi: 310,
+ timeline: '8-12 weeks',
+ compliance: ['ISO 28000', 'CTPAT', 'GDPR'],
+ icon: 'truck'
+ },
+ {
+ id: '6',
+ name: 'Education Platform',
+ industry: 'Education',
+ description: 'Personalized learning paths, student performance prediction, content recommendation, and automated grading',
+ models: ['Learning Path Generator', 'Performance Predictor', 'Content Recommender'],
+ roi: 220,
+ timeline: '6-8 weeks',
+ compliance: ['FERPA', 'COPPA', 'GDPR'],
+ icon: 'graduation'
+ },
+ {
+ id: '7',
+ name: 'Energy Management',
+ industry: 'Energy',
+ description: 'Smart grid optimization, energy consumption forecasting, renewable energy prediction, and fault detection',
+ models: ['Load Forecasting', 'Grid Optimizer', 'Anomaly Detection'],
+ roi: 350,
+ timeline: '10-14 weeks',
+ compliance: ['NERC CIP', 'ISO 50001', 'IEC 62443'],
+ icon: 'zap'
+ }
+ ];
+
+ const getIcon = (iconName: string) => {
+ const icons: { [key: string]: React.ReactNode } = {
+ heart: ,
+ dollar: ,
+ cart: ,
+ factory: ,
+ truck: ,
+ graduation: ,
+ zap:
+ };
+ return icons[iconName] || ;
+ };
+
+ return (
+
+
+
+
Industry Templates
+
Pre-configured AI solutions tailored for your industry
+
+
Request Custom Template
+
+
+ {/* Stats Overview */}
+
+
+
Total Templates
+
{templates.length}
+
+
+
Avg ROI
+
+ {Math.round(templates.reduce((sum, t) => sum + t.roi, 0) / templates.length)}%
+
+
+
+
Industries Covered
+
{templates.length}
+
+
+
Compliance Standards
+
+ {new Set(templates.flatMap(t => t.compliance)).size}
+
+
+
+
+ {/* Templates Grid */}
+
+ {templates.map((template) => (
+
+ {/* Header */}
+
+
+ {getIcon(template.icon)}
+
+
+ {template.roi}% ROI
+
+
+
+ {/* Content */}
+
{template.name}
+
{template.industry}
+
{template.description}
+
+ {/* Models */}
+
+
Included Models:
+
+ {template.models.map((model, idx) => (
+
+
+ {model}
+
+ ))}
+
+
+
+ {/* Timeline & Compliance */}
+
+
+
+ Timeline:
+ {template.timeline}
+
+
+
+
+
Compliance:
+
+ {template.compliance.slice(0, 3).map((cert, idx) => (
+
+ {cert}
+
+ ))}
+ {template.compliance.length > 3 && (
+
+ +{template.compliance.length - 3}
+
+ )}
+
+
+
+
+
+ {/* Action Buttons */}
+
+ View Details
+ Deploy
+
+
+ ))}
+
+
+ {/* Use Cases Section */}
+
+
Popular Use Cases by Industry
+
+
+
Healthcare
+
+ • Radiology image analysis
+ • Patient readmission prediction
+ • Drug interaction detection
+
+
+
+
Finance
+
+ • Credit card fraud prevention
+ • Loan default prediction
+ • Market sentiment analysis
+
+
+
+
Retail
+
+ • Churn prediction & prevention
+ • Product recommendation
+ • Visual search & discovery
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/enterprise/IntegrationMarketplace.tsx b/ai-design-platform/src/components/enterprise/IntegrationMarketplace.tsx
new file mode 100644
index 0000000..824da33
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/IntegrationMarketplace.tsx
@@ -0,0 +1,459 @@
+import React, { useState, useMemo } from 'react';
+import {
+ Search,
+ Cloud,
+ Database,
+ Zap,
+ CheckCircle,
+ XCircle,
+ Settings,
+ Download,
+ Filter,
+ ExternalLink
+} from 'lucide-react';
+import type { Integration } from '../../types';
+
+export const IntegrationMarketplace: React.FC = () => {
+ const [searchQuery, setSearchQuery] = useState('');
+ const [selectedCategory, setSelectedCategory] = useState('all');
+
+ const integrations: Integration[] = [
+ {
+ id: '1',
+ name: 'AWS SageMaker',
+ category: 'ML Platform',
+ description: 'Build, train, and deploy machine learning models at scale with AWS SageMaker integration',
+ icon: '☁️',
+ installed: true,
+ status: 'active'
+ },
+ {
+ id: '2',
+ name: 'Azure ML',
+ category: 'ML Platform',
+ description: 'Enterprise-grade machine learning service to build and deploy models faster',
+ icon: '☁️',
+ installed: true,
+ status: 'active'
+ },
+ {
+ id: '3',
+ name: 'Google Cloud AI',
+ category: 'ML Platform',
+ description: 'Leverage Google Cloud AI and machine learning products for your AI workloads',
+ icon: '☁️',
+ installed: false,
+ status: 'inactive'
+ },
+ {
+ id: '4',
+ name: 'Snowflake',
+ category: 'Data Warehouse',
+ description: 'Cloud data platform for data warehousing, data lakes, and data engineering',
+ icon: '❄️',
+ installed: true,
+ status: 'active'
+ },
+ {
+ id: '5',
+ name: 'Databricks',
+ category: 'Data Platform',
+ description: 'Unified analytics platform for data engineering, ML, and analytics',
+ icon: '🔷',
+ installed: true,
+ status: 'active'
+ },
+ {
+ id: '6',
+ name: 'BigQuery',
+ category: 'Data Warehouse',
+ description: 'Serverless, highly scalable data warehouse from Google Cloud',
+ icon: '📊',
+ installed: false,
+ status: 'inactive'
+ },
+ {
+ id: '7',
+ name: 'PostgreSQL',
+ category: 'Database',
+ description: 'Advanced open-source relational database with powerful features',
+ icon: '🐘',
+ installed: true,
+ status: 'active'
+ },
+ {
+ id: '8',
+ name: 'MongoDB',
+ category: 'Database',
+ description: 'Document-oriented NoSQL database for modern application development',
+ icon: '🍃',
+ installed: true,
+ status: 'active'
+ },
+ {
+ id: '9',
+ name: 'Redis',
+ category: 'Cache',
+ description: 'In-memory data structure store for caching and real-time analytics',
+ icon: '⚡',
+ installed: true,
+ status: 'configuring'
+ },
+ {
+ id: '10',
+ name: 'Apache Kafka',
+ category: 'Streaming',
+ description: 'Distributed event streaming platform for high-performance data pipelines',
+ icon: '📨',
+ installed: false,
+ status: 'inactive'
+ },
+ {
+ id: '11',
+ name: 'Elasticsearch',
+ category: 'Search',
+ description: 'Distributed search and analytics engine for all types of data',
+ icon: '🔍',
+ installed: false,
+ status: 'inactive'
+ },
+ {
+ id: '12',
+ name: 'Apache Spark',
+ category: 'Processing',
+ description: 'Unified analytics engine for large-scale data processing',
+ icon: '⚙️',
+ installed: false,
+ status: 'inactive'
+ },
+ {
+ id: '13',
+ name: 'MLflow',
+ category: 'ML Ops',
+ description: 'Open-source platform for managing the ML lifecycle',
+ icon: '🔄',
+ installed: true,
+ status: 'active'
+ },
+ {
+ id: '14',
+ name: 'Kubeflow',
+ category: 'ML Ops',
+ description: 'Machine learning toolkit for Kubernetes deployments',
+ icon: '☸️',
+ installed: false,
+ status: 'inactive'
+ }
+ ];
+
+ const categories = useMemo(() => {
+ const cats = new Set(integrations.map(i => i.category));
+ return ['all', ...Array.from(cats)];
+ }, [integrations]);
+
+ const filteredIntegrations = useMemo(() => {
+ return integrations.filter(integration => {
+ const matchesSearch = integration.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ integration.description.toLowerCase().includes(searchQuery.toLowerCase());
+ const matchesCategory = selectedCategory === 'all' || integration.category === selectedCategory;
+ return matchesSearch && matchesCategory;
+ });
+ }, [integrations, searchQuery, selectedCategory]);
+
+ const stats = useMemo(() => {
+ const installed = integrations.filter(i => i.installed).length;
+ const active = integrations.filter(i => i.status === 'active').length;
+ return { total: integrations.length, installed, active };
+ }, [integrations]);
+
+ const getStatusBadge = (status: Integration['status']) => {
+ switch (status) {
+ case 'active':
+ return (
+
+
+ Active
+
+ );
+ case 'configuring':
+ return (
+
+
+ Configuring
+
+ );
+ case 'inactive':
+ return (
+
+
+ Not Installed
+
+ );
+ }
+ };
+
+ const getCategoryIcon = (category: string) => {
+ const icons: { [key: string]: React.ReactNode } = {
+ 'ML Platform': ,
+ 'Data Warehouse': ,
+ 'Data Platform': ,
+ 'Database': ,
+ 'Cache': ,
+ 'Streaming': ,
+ 'Search': ,
+ 'Processing': ,
+ 'ML Ops':
+ };
+ return icons[category] || ;
+ };
+
+ return (
+
+
+
+
Integration Marketplace
+
Connect your favorite tools and platforms
+
+
Request Integration
+
+
+ {/* Stats */}
+
+
+
Total Integrations
+
{stats.total}
+
+
+
Installed
+
{stats.installed}
+
+
+
Active
+
{stats.active}
+
+
+
Categories
+
{categories.length - 1}
+
+
+
+ {/* Search & Filters */}
+
+
+ {/* Search */}
+
+
+ setSearchQuery(e.target.value)}
+ className="w-full pl-10 pr-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:border-purple-500 focus:outline-none"
+ />
+
+
+ {/* Category Filter */}
+
+
+ setSelectedCategory(e.target.value)}
+ className="px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:border-purple-500 focus:outline-none min-w-[200px]"
+ >
+ {categories.map((cat) => (
+
+ {cat === 'all' ? 'All Categories' : cat}
+
+ ))}
+
+
+
+
+
+ {/* Integrations Grid */}
+
+ {filteredIntegrations.map((integration) => (
+
+ {/* Header */}
+
+
+
{integration.icon}
+
+
{integration.name}
+
+ {getCategoryIcon(integration.category)}
+ {integration.category}
+
+
+
+
+
+ {/* Description */}
+
+ {integration.description}
+
+
+ {/* Status */}
+
+ {getStatusBadge(integration.status)}
+
+
+ {/* Connection Info */}
+ {integration.installed && (
+
+
Connection Status
+
+
+ {integration.status === 'active' ? (
+ <>
+
+
Connected
+ >
+ ) : (
+ <>
+
+
Configuring
+ >
+ )}
+
+
+ Test Connection
+
+
+
+ )}
+
+ {/* Actions */}
+
+ {integration.installed ? (
+ <>
+
+
+ Configure
+
+
+
+
+ >
+ ) : (
+ <>
+
+
+ Install
+
+
+
+
+ >
+ )}
+
+
+ ))}
+
+
+ {/* Popular Integrations */}
+
+
Popular Integration Stacks
+
+
+
🚀 ML Production Stack
+
+
+
+ AWS SageMaker
+
+
+
+ MLflow
+
+
+
+ PostgreSQL
+
+
+
Install Stack
+
+
+
+
📊 Data Analytics Stack
+
+
+
+ Snowflake
+
+
+
+ Databricks
+
+
+
+ Apache Spark
+
+
+
Install Stack
+
+
+
+
⚡ Real-time Processing
+
+
+
+ Redis
+
+
+
+ Apache Kafka
+
+
+
+ MongoDB
+
+
+
Install Stack
+
+
+
+
+ {/* Integration Benefits */}
+
+
Integration Benefits
+
+
+
For Data Teams
+
+
+
+ Seamless data pipeline integration with existing infrastructure
+
+
+
+ Automated data synchronization across platforms
+
+
+
+ Support for multiple data formats and protocols
+
+
+
+
+
For ML Engineers
+
+
+
+ One-click model deployment to production environments
+
+
+
+ Centralized experiment tracking and model versioning
+
+
+
+ Automated CI/CD pipelines for ML workflows
+
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/enterprise/README.md b/ai-design-platform/src/components/enterprise/README.md
new file mode 100644
index 0000000..592b309
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/README.md
@@ -0,0 +1,130 @@
+# Enterprise Components
+
+This directory contains enterprise-grade React TypeScript components for the AI Design Platform.
+
+## Components
+
+### 1. IndustryTemplates.tsx
+Pre-configured AI solution templates for 7+ industries:
+- **Healthcare**: HIPAA-compliant medical imaging, diagnosis support
+- **Finance**: Fraud detection, risk analysis, trading algorithms
+- **Retail**: Customer behavior analytics, demand forecasting, pricing
+- **Manufacturing**: Predictive maintenance, quality control, production optimization
+- **Logistics**: Route optimization, fleet management, delivery prediction
+- **Education**: Personalized learning paths, performance prediction
+- **Energy**: Smart grid optimization, consumption forecasting
+
+Features:
+- ROI projections for each template
+- Implementation timelines
+- Compliance framework tracking
+- Use case descriptions
+- Grid layout with glass morphism cards
+
+### 2. SecurityCompliance.tsx
+Comprehensive compliance dashboard for security standards:
+- **Frameworks**: SOC 2, ISO 27001, GDPR, HIPAA, PCI DSS, FedRAMP
+- Progress bars for compliance status
+- Security controls count tracking
+- Last audit date monitoring
+- Certificate tracking and expiry
+- Status indicators (compliant/in-progress/not-compliant)
+
+Features:
+- Overall compliance percentage
+- Framework-specific progress tracking
+- Active certificates display
+- Recent audit activity log
+- Security controls summary
+
+### 3. ROICalculator.tsx
+Interactive ROI calculator with real-time projections:
+- Input fields for current costs, team size, hourly rates
+- Real-time calculation of monthly/annual savings
+- Productivity metrics and improvements
+- Break-even analysis
+- Cost comparison charts (Recharts)
+- Cumulative savings projections
+
+Features:
+- Labor cost reduction calculations
+- Error cost reduction tracking
+- Time efficiency gains
+- Monthly vs. With-AI cost comparison charts
+- 12-month cumulative savings projection
+- Key insights and recommendations
+
+### 4. IntegrationMarketplace.tsx
+Integration marketplace with 14+ platforms:
+
+**ML Platforms**:
+- AWS SageMaker
+- Azure ML
+- Google Cloud AI
+
+**Data Platforms**:
+- Snowflake
+- Databricks
+- BigQuery
+
+**Databases**:
+- PostgreSQL
+- MongoDB
+- Redis
+
+**Other Tools**:
+- Apache Kafka
+- Elasticsearch
+- Apache Spark
+- MLflow
+- Kubeflow
+
+Features:
+- Category-based filtering
+- Search functionality
+- Installation status tracking
+- Connection testing UI
+- Popular integration stacks
+- Integration benefits breakdown
+
+## Usage
+
+```tsx
+import {
+ IndustryTemplates,
+ SecurityCompliance,
+ ROICalculator,
+ IntegrationMarketplace
+} from './components/enterprise';
+
+// In your routing or tab component
+
+
+
+
+```
+
+## Design System
+
+All components follow the AI Design Platform design system:
+- **Glass morphism**: `card`, `card-hover` classes
+- **Gradients**: `gradient-text`, `btn-primary`, `btn-secondary`
+- **Icons**: lucide-react icon library
+- **Charts**: Recharts library for data visualization
+- **Animations**: `fade-in` class for smooth transitions
+
+## Type Safety
+
+All components use TypeScript types from `src/types/index.ts`:
+- `IndustryTemplate`
+- `SecurityFramework`
+- `ROICalculation`
+- `Integration`
+
+## Sample Data
+
+Each component includes comprehensive mock data for demonstration:
+- Industry templates with realistic use cases
+- Compliance frameworks with progress tracking
+- ROI calculations with multiple variables
+- Integration platforms with status indicators
diff --git a/ai-design-platform/src/components/enterprise/ROICalculator.tsx b/ai-design-platform/src/components/enterprise/ROICalculator.tsx
new file mode 100644
index 0000000..463c8f3
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/ROICalculator.tsx
@@ -0,0 +1,352 @@
+import React, { useState, useMemo } from 'react';
+import { Calculator, DollarSign, TrendingUp, Users, Clock, Zap, BarChart3 } from 'lucide-react';
+import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, LineChart, Line } from 'recharts';
+import type { ROICalculation } from '../../types';
+
+export const ROICalculator: React.FC = () => {
+ const [inputs, setInputs] = useState({
+ currentMonthlyCost: 50000,
+ teamSize: 15,
+ avgHourlyRate: 75,
+ manualHoursPerMonth: 320,
+ errorRate: 5,
+ processingTimeHours: 160
+ });
+
+ const calculation = useMemo((): ROICalculation & {
+ errorReduction: number;
+ timeReduction: number;
+ productivityGain: number;
+ monthlyErrorCost: number;
+ monthlyTimeSavings: number;
+ } => {
+ // AI platform cost (tiered pricing)
+ const aiMonthlyCost = inputs.teamSize <= 10 ? 5000 :
+ inputs.teamSize <= 25 ? 8000 :
+ inputs.teamSize <= 50 ? 12000 : 18000;
+
+ // Calculate savings
+ const manualLaborCost = inputs.manualHoursPerMonth * inputs.avgHourlyRate;
+ const errorCostReduction = (inputs.currentMonthlyCost * inputs.errorRate / 100) * 0.8; // 80% error reduction
+ const timeEfficiency = inputs.processingTimeHours * inputs.avgHourlyRate * 0.6; // 60% time savings
+
+ const monthlySavings = manualLaborCost * 0.7 + errorCostReduction + timeEfficiency - aiMonthlyCost;
+ const annualSavings = monthlySavings * 12;
+
+ // Productivity metrics
+ const productivityGain = ((manualLaborCost * 0.7 + timeEfficiency) / inputs.currentMonthlyCost) * 100;
+
+ // Break-even calculation (months)
+ const implementationCost = 25000; // One-time setup
+ const breakEven = monthlySavings > 0 ? implementationCost / monthlySavings : 0;
+
+ return {
+ currentCost: inputs.currentMonthlyCost,
+ aiCost: aiMonthlyCost,
+ monthlySavings: Math.max(0, monthlySavings),
+ annualSavings: Math.max(0, annualSavings),
+ productivity: productivityGain,
+ breakEven: breakEven,
+ errorReduction: 80,
+ timeReduction: 60,
+ productivityGain: productivityGain,
+ monthlyErrorCost: errorCostReduction,
+ monthlyTimeSavings: timeEfficiency
+ };
+ }, [inputs]);
+
+ const projectionData = Array.from({ length: 12 }, (_, i) => ({
+ month: `Month ${i + 1}`,
+ manual: inputs.currentMonthlyCost,
+ withAI: calculation.aiCost,
+ savings: calculation.monthlySavings
+ }));
+
+ const cumulativeSavings = Array.from({ length: 12 }, (_, i) => ({
+ month: `M${i + 1}`,
+ savings: calculation.monthlySavings * (i + 1) - (i === 0 ? 25000 : 0)
+ }));
+
+ const handleInputChange = (field: keyof typeof inputs, value: number) => {
+ setInputs(prev => ({ ...prev, [field]: value }));
+ };
+
+ return (
+
+
+
+
ROI Calculator
+
Calculate your return on investment with AI automation
+
+
+ Reset
+ Save Report
+
+
+
+ {/* Key Metrics */}
+
+
+
Monthly Savings
+
+ ${calculation.monthlySavings.toLocaleString()}
+
+
After AI implementation
+
+
+
Annual Savings
+
+ ${calculation.annualSavings.toLocaleString()}
+
+
First year projection
+
+
+
Break-even Point
+
+ {calculation.breakEven.toFixed(1)}
+
+
Months to ROI
+
+
+
Productivity Gain
+
+ +{calculation.productivity.toFixed(0)}%
+
+
Efficiency improvement
+
+
+
+
+ {/* Input Parameters */}
+
+
+
+
Input Parameters
+
+
+
+
+
+ {/* Savings Breakdown */}
+
+
+
+
Savings Breakdown
+
+
+
+
+
+ Labor Cost Reduction
+
+ ${(inputs.manualHoursPerMonth * inputs.avgHourlyRate * 0.7).toLocaleString()}
+
+
+
70% automation of manual tasks
+
+
+
+
+ Error Cost Reduction
+
+ ${calculation.monthlyErrorCost.toLocaleString()}
+
+
+
{calculation.errorReduction}% reduction in errors
+
+
+
+
+ Time Efficiency Gains
+
+ ${calculation.monthlyTimeSavings.toLocaleString()}
+
+
+
{calculation.timeReduction}% faster processing
+
+
+
+
+ AI Platform Cost
+
+ -${calculation.aiCost.toLocaleString()}
+
+
+
Monthly subscription
+
+
+
+
+
+ Net Monthly Savings
+
+ ${calculation.monthlySavings.toLocaleString()}
+
+
+
+
+
+
+ {/* Cost Comparison Chart */}
+
+
Monthly Cost Comparison
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Cumulative Savings */}
+
+
Cumulative Savings Over Time
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Key Insights */}
+
+
Key Insights
+
+
+
💰 First Year ROI
+
+ You'll save ${calculation.annualSavings.toLocaleString()} in the first year,
+ achieving break-even in just {calculation.breakEven.toFixed(1)} months.
+
+
+
+
⚡ Productivity Boost
+
+ Team productivity increases by {calculation.productivity.toFixed(0)}%, allowing focus on high-value strategic work.
+
+
+
+
🎯 Error Reduction
+
+ {calculation.errorReduction}% reduction in errors saves approximately ${calculation.monthlyErrorCost.toLocaleString()}/month in rework costs.
+
+
+
+
⏱️ Time Savings
+
+ {calculation.timeReduction}% faster processing frees up {(inputs.processingTimeHours * 0.6).toFixed(0)} hours per month for your team.
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/enterprise/SecurityCompliance.tsx b/ai-design-platform/src/components/enterprise/SecurityCompliance.tsx
new file mode 100644
index 0000000..7de5681
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/SecurityCompliance.tsx
@@ -0,0 +1,326 @@
+import React from 'react';
+import { Shield, CheckCircle, Clock, AlertTriangle, Award, FileText, Calendar, TrendingUp } from 'lucide-react';
+import type { SecurityFramework } from '../../types';
+
+export const SecurityCompliance: React.FC = () => {
+ const frameworks: SecurityFramework[] = [
+ {
+ id: '1',
+ name: 'SOC 2 Type II',
+ status: 'compliant',
+ progress: 100,
+ lastAudit: new Date('2024-01-15'),
+ controls: 64
+ },
+ {
+ id: '2',
+ name: 'ISO 27001',
+ status: 'compliant',
+ progress: 100,
+ lastAudit: new Date('2024-02-20'),
+ controls: 114
+ },
+ {
+ id: '3',
+ name: 'GDPR',
+ status: 'compliant',
+ progress: 100,
+ lastAudit: new Date('2024-01-10'),
+ controls: 42
+ },
+ {
+ id: '4',
+ name: 'HIPAA',
+ status: 'in-progress',
+ progress: 78,
+ lastAudit: new Date('2023-11-30'),
+ controls: 56
+ },
+ {
+ id: '5',
+ name: 'PCI DSS',
+ status: 'in-progress',
+ progress: 85,
+ lastAudit: new Date('2024-02-01'),
+ controls: 78
+ },
+ {
+ id: '6',
+ name: 'FedRAMP',
+ status: 'not-compliant',
+ progress: 45,
+ lastAudit: new Date('2023-10-15'),
+ controls: 325
+ }
+ ];
+
+ const certificates = [
+ { name: 'SOC 2 Type II', issueDate: '2024-01-15', expiryDate: '2025-01-15', status: 'active' },
+ { name: 'ISO 27001:2013', issueDate: '2024-02-20', expiryDate: '2027-02-20', status: 'active' },
+ { name: 'GDPR Compliance', issueDate: '2024-01-10', expiryDate: '2025-01-10', status: 'active' }
+ ];
+
+ const getStatusColor = (status: SecurityFramework['status']) => {
+ switch (status) {
+ case 'compliant':
+ return 'text-green-400 bg-green-500/20 border-green-500/20';
+ case 'in-progress':
+ return 'text-yellow-400 bg-yellow-500/20 border-yellow-500/20';
+ case 'not-compliant':
+ return 'text-red-400 bg-red-500/20 border-red-500/20';
+ }
+ };
+
+ const getStatusIcon = (status: SecurityFramework['status']) => {
+ switch (status) {
+ case 'compliant':
+ return ;
+ case 'in-progress':
+ return ;
+ case 'not-compliant':
+ return ;
+ }
+ };
+
+ const getStatusLabel = (status: SecurityFramework['status']) => {
+ switch (status) {
+ case 'compliant':
+ return 'Compliant';
+ case 'in-progress':
+ return 'In Progress';
+ case 'not-compliant':
+ return 'Not Compliant';
+ }
+ };
+
+ const formatDate = (date: Date) => {
+ return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
+ };
+
+ const daysSinceAudit = (date: Date) => {
+ const now = new Date();
+ const diff = now.getTime() - date.getTime();
+ return Math.floor(diff / (1000 * 60 * 60 * 24));
+ };
+
+ const overallCompliance = Math.round(
+ frameworks.reduce((sum, f) => sum + f.progress, 0) / frameworks.length
+ );
+
+ return (
+
+
+
+
Security & Compliance
+
Manage compliance frameworks and security standards
+
+
+ Download Report
+ Schedule Audit
+
+
+
+ {/* Overview Cards */}
+
+
+
Overall Compliance
+
{overallCompliance}%
+
↑ 5% from last month
+
+
+
Active Frameworks
+
{frameworks.length}
+
6 standards tracked
+
+
+
Total Controls
+
+ {frameworks.reduce((sum, f) => sum + f.controls, 0)}
+
+
Across all frameworks
+
+
+
Active Certificates
+
{certificates.length}
+
All current & valid
+
+
+
+ {/* Compliance Status */}
+
+
+
Compliance Frameworks
+
+
+
+
+ {frameworks.map((framework) => (
+
+
+
+ {getStatusIcon(framework.status)}
+
+
+
{framework.name}
+
+ {getStatusLabel(framework.status)}
+
+
+
+ {framework.controls} controls
+ •
+ Last audit: {formatDate(framework.lastAudit)}
+ •
+ 90 ? 'text-yellow-400' : ''}>
+ {daysSinceAudit(framework.lastAudit)} days ago
+
+
+
+
+
+
{framework.progress}%
+
Complete
+
+
+
+ {/* Progress Bar */}
+
+
+ ))}
+
+
+
+ {/* Certificates */}
+
+
+
+
+
Active Certificates
+
+
+ {certificates.map((cert, idx) => (
+
+
+
{cert.name}
+
+ Active
+
+
+
+
+ Issued:
+ {formatDate(new Date(cert.issueDate))}
+
+
+ Expires:
+ {formatDate(new Date(cert.expiryDate))}
+
+
+
+ ))}
+
+
+
+ {/* Recent Audits */}
+
+
+
+
Recent Audit Activity
+
+
+
+
+
+
ISO 27001 Surveillance Audit
+
+
+ Completed on {formatDate(new Date('2024-02-20'))}
+
+
✓ No findings
+
+
+
+
+
SOC 2 Type II Examination
+
+
+ Completed on {formatDate(new Date('2024-01-15'))}
+
+
✓ Clean report
+
+
+
+
+
HIPAA Gap Assessment
+
+
+ Scheduled for March 15, 2024
+
+
⚠ 3 items to address
+
+
+
+
+
+ {/* Security Controls */}
+
+
+
+
Security Controls Summary
+
+
+
+
Preventive Controls
+
342
+
+
+ 98% effective
+
+
+
+
Detective Controls
+
189
+
+
+ 96% effective
+
+
+
+
Corrective Controls
+
148
+
+
+ 94% effective
+
+
+
+
+
+ );
+};
diff --git a/ai-design-platform/src/components/enterprise/index.ts b/ai-design-platform/src/components/enterprise/index.ts
new file mode 100644
index 0000000..823c521
--- /dev/null
+++ b/ai-design-platform/src/components/enterprise/index.ts
@@ -0,0 +1,6 @@
+export { IndustryTemplates } from './IndustryTemplates';
+export { SecurityCompliance } from './SecurityCompliance';
+export { ROICalculator } from './ROICalculator';
+export { IntegrationMarketplace } from './IntegrationMarketplace';
+export { ImplementationPlaybooks } from './ImplementationPlaybooks';
+export { ExecutiveDashboard } from './ExecutiveDashboard';
diff --git a/ai-design-platform/src/i18n/README.md b/ai-design-platform/src/i18n/README.md
new file mode 100644
index 0000000..43c1d43
--- /dev/null
+++ b/ai-design-platform/src/i18n/README.md
@@ -0,0 +1,81 @@
+# Internationalization (i18n) System
+
+This directory contains the internationalization configuration for the AI Design Platform.
+
+## Structure
+
+```
+src/i18n/
+├── i18n.config.ts # Main i18n configuration with react-i18next
+└── locales/ # Translation files for supported languages
+ ├── en.json # English (default)
+ ├── es.json # Spanish
+ ├── fr.json # French
+ ├── de.json # German
+ ├── zh.json # Chinese (Simplified)
+ ├── ja.json # Japanese
+ ├── hi.json # Hindi
+ ├── ar.json # Arabic
+ ├── pt.json # Portuguese
+ └── ru.json # Russian
+```
+
+## Features
+
+- **10 Languages Supported**: English, Spanish, French, German, Chinese, Japanese, Hindi, Arabic, Portuguese, Russian
+- **61 Translation Keys** per language across 5 categories
+- **Auto Language Detection**: Browser language, localStorage, HTML tag
+- **Fallback Language**: English (en)
+- **Type-Safe**: Full TypeScript support with react-i18next
+
+## Translation Categories
+
+Each language file includes translations for:
+
+1. **common** - Dashboard, models, analytics, monitoring, settings, profile, help
+2. **actions** - Save, cancel, delete, edit, export, import, create, update, etc.
+3. **messages** - Success, error, warning, loading states, confirmations
+4. **nav** - Navigation items (overview, projects, team, reports, etc.)
+5. **auth** - Authentication (login, register, logout, username, password, etc.)
+
+## Usage
+
+Import and initialize i18n in your app entry point:
+
+```typescript
+import './i18n/i18n.config';
+```
+
+Use in React components:
+
+```typescript
+import { useTranslation } from 'react-i18next';
+
+function MyComponent() {
+ const { t, i18n } = useTranslation();
+
+ return (
+
+
{t('common.dashboard')}
+ i18n.changeLanguage('es')}>
+ {t('actions.save')}
+
+
+ );
+}
+```
+
+## Adding New Translations
+
+1. Add the key to `en.json` (reference language)
+2. Add translations to all other language files
+3. Keys must be consistent across all languages
+4. Use nested structure: `category.key`
+
+## Configuration
+
+The i18n system is configured with:
+- **Language Detection**: localStorage → browser → HTML tag
+- **Fallback**: English (en)
+- **Interpolation**: Enabled (no escaping needed)
+- **React Integration**: Full react-i18next support
diff --git a/ai-design-platform/src/i18n/i18n.config.ts b/ai-design-platform/src/i18n/i18n.config.ts
new file mode 100644
index 0000000..7217486
--- /dev/null
+++ b/ai-design-platform/src/i18n/i18n.config.ts
@@ -0,0 +1,46 @@
+import i18n from 'i18next';
+import { initReactI18next } from 'react-i18next';
+import LanguageDetector from 'i18next-browser-languagedetector';
+
+import en from './locales/en.json';
+import es from './locales/es.json';
+import fr from './locales/fr.json';
+import de from './locales/de.json';
+import zh from './locales/zh.json';
+import ja from './locales/ja.json';
+import hi from './locales/hi.json';
+import ar from './locales/ar.json';
+import pt from './locales/pt.json';
+import ru from './locales/ru.json';
+
+const resources = {
+ en: { translation: en },
+ es: { translation: es },
+ fr: { translation: fr },
+ de: { translation: de },
+ zh: { translation: zh },
+ ja: { translation: ja },
+ hi: { translation: hi },
+ ar: { translation: ar },
+ pt: { translation: pt },
+ ru: { translation: ru },
+};
+
+i18n
+ .use(LanguageDetector)
+ .use(initReactI18next)
+ .init({
+ resources,
+ fallbackLng: 'en',
+ lng: 'en',
+ debug: false,
+ interpolation: {
+ escapeValue: false,
+ },
+ detection: {
+ order: ['localStorage', 'navigator', 'htmlTag'],
+ caches: ['localStorage'],
+ },
+ });
+
+export default i18n;
diff --git a/ai-design-platform/src/i18n/locales/ar.json b/ai-design-platform/src/i18n/locales/ar.json
new file mode 100644
index 0000000..5baf71b
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/ar.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "لوحة التحكم",
+ "models": "النماذج",
+ "analytics": "التحليلات",
+ "monitoring": "المراقبة",
+ "settings": "الإعدادات",
+ "home": "الرئيسية",
+ "profile": "الملف الشخصي",
+ "help": "المساعدة",
+ "documentation": "التوثيق",
+ "notifications": "الإشعارات"
+ },
+ "actions": {
+ "save": "حفظ",
+ "cancel": "إلغاء",
+ "delete": "حذف",
+ "edit": "تعديل",
+ "export": "تصدير",
+ "import": "استيراد",
+ "create": "إنشاء",
+ "update": "تحديث",
+ "remove": "إزالة",
+ "download": "تحميل",
+ "upload": "رفع",
+ "search": "بحث",
+ "filter": "تصفية",
+ "refresh": "تحديث",
+ "back": "رجوع",
+ "next": "التالي",
+ "submit": "إرسال",
+ "reset": "إعادة تعيين",
+ "confirm": "تأكيد",
+ "close": "إغلاق"
+ },
+ "messages": {
+ "success": "تمت العملية بنجاح",
+ "error": "حدث خطأ",
+ "warning": "تحذير",
+ "loading": "جاري التحميل...",
+ "noData": "لا توجد بيانات متاحة",
+ "saved": "تم الحفظ بنجاح",
+ "deleted": "تم الحذف بنجاح",
+ "updated": "تم التحديث بنجاح",
+ "created": "تم الإنشاء بنجاح",
+ "confirmDelete": "هل أنت متأكد من حذف هذا العنصر؟",
+ "confirmAction": "هل أنت متأكد من المتابعة؟"
+ },
+ "nav": {
+ "overview": "نظرة عامة",
+ "projects": "المشاريع",
+ "team": "الفريق",
+ "reports": "التقارير",
+ "templates": "القوالب",
+ "workspace": "مساحة العمل",
+ "library": "المكتبة",
+ "resources": "الموارد"
+ },
+ "auth": {
+ "login": "تسجيل الدخول",
+ "register": "التسجيل",
+ "logout": "تسجيل الخروج",
+ "username": "اسم المستخدم",
+ "password": "كلمة المرور",
+ "email": "البريد الإلكتروني",
+ "forgotPassword": "نسيت كلمة المرور؟",
+ "rememberMe": "تذكرني",
+ "signIn": "تسجيل الدخول",
+ "signUp": "إنشاء حساب",
+ "createAccount": "إنشاء حساب",
+ "welcomeBack": "مرحباً بعودتك"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/de.json b/ai-design-platform/src/i18n/locales/de.json
new file mode 100644
index 0000000..a25f5da
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/de.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "Dashboard",
+ "models": "Modelle",
+ "analytics": "Analytik",
+ "monitoring": "Überwachung",
+ "settings": "Einstellungen",
+ "home": "Startseite",
+ "profile": "Profil",
+ "help": "Hilfe",
+ "documentation": "Dokumentation",
+ "notifications": "Benachrichtigungen"
+ },
+ "actions": {
+ "save": "Speichern",
+ "cancel": "Abbrechen",
+ "delete": "Löschen",
+ "edit": "Bearbeiten",
+ "export": "Exportieren",
+ "import": "Importieren",
+ "create": "Erstellen",
+ "update": "Aktualisieren",
+ "remove": "Entfernen",
+ "download": "Herunterladen",
+ "upload": "Hochladen",
+ "search": "Suchen",
+ "filter": "Filtern",
+ "refresh": "Aktualisieren",
+ "back": "Zurück",
+ "next": "Weiter",
+ "submit": "Absenden",
+ "reset": "Zurücksetzen",
+ "confirm": "Bestätigen",
+ "close": "Schließen"
+ },
+ "messages": {
+ "success": "Vorgang erfolgreich abgeschlossen",
+ "error": "Ein Fehler ist aufgetreten",
+ "warning": "Warnung",
+ "loading": "Wird geladen...",
+ "noData": "Keine Daten verfügbar",
+ "saved": "Erfolgreich gespeichert",
+ "deleted": "Erfolgreich gelöscht",
+ "updated": "Erfolgreich aktualisiert",
+ "created": "Erfolgreich erstellt",
+ "confirmDelete": "Sind Sie sicher, dass Sie dieses Element löschen möchten?",
+ "confirmAction": "Sind Sie sicher, dass Sie fortfahren möchten?"
+ },
+ "nav": {
+ "overview": "Übersicht",
+ "projects": "Projekte",
+ "team": "Team",
+ "reports": "Berichte",
+ "templates": "Vorlagen",
+ "workspace": "Arbeitsbereich",
+ "library": "Bibliothek",
+ "resources": "Ressourcen"
+ },
+ "auth": {
+ "login": "Anmelden",
+ "register": "Registrieren",
+ "logout": "Abmelden",
+ "username": "Benutzername",
+ "password": "Passwort",
+ "email": "E-Mail",
+ "forgotPassword": "Passwort vergessen?",
+ "rememberMe": "Angemeldet bleiben",
+ "signIn": "Einloggen",
+ "signUp": "Registrieren",
+ "createAccount": "Konto erstellen",
+ "welcomeBack": "Willkommen zurück"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/en.json b/ai-design-platform/src/i18n/locales/en.json
new file mode 100644
index 0000000..226f899
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/en.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "Dashboard",
+ "models": "Models",
+ "analytics": "Analytics",
+ "monitoring": "Monitoring",
+ "settings": "Settings",
+ "home": "Home",
+ "profile": "Profile",
+ "help": "Help",
+ "documentation": "Documentation",
+ "notifications": "Notifications"
+ },
+ "actions": {
+ "save": "Save",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "edit": "Edit",
+ "export": "Export",
+ "import": "Import",
+ "create": "Create",
+ "update": "Update",
+ "remove": "Remove",
+ "download": "Download",
+ "upload": "Upload",
+ "search": "Search",
+ "filter": "Filter",
+ "refresh": "Refresh",
+ "back": "Back",
+ "next": "Next",
+ "submit": "Submit",
+ "reset": "Reset",
+ "confirm": "Confirm",
+ "close": "Close"
+ },
+ "messages": {
+ "success": "Operation completed successfully",
+ "error": "An error occurred",
+ "warning": "Warning",
+ "loading": "Loading...",
+ "noData": "No data available",
+ "saved": "Saved successfully",
+ "deleted": "Deleted successfully",
+ "updated": "Updated successfully",
+ "created": "Created successfully",
+ "confirmDelete": "Are you sure you want to delete this item?",
+ "confirmAction": "Are you sure you want to proceed?"
+ },
+ "nav": {
+ "overview": "Overview",
+ "projects": "Projects",
+ "team": "Team",
+ "reports": "Reports",
+ "templates": "Templates",
+ "workspace": "Workspace",
+ "library": "Library",
+ "resources": "Resources"
+ },
+ "auth": {
+ "login": "Login",
+ "register": "Register",
+ "logout": "Logout",
+ "username": "Username",
+ "password": "Password",
+ "email": "Email",
+ "forgotPassword": "Forgot Password?",
+ "rememberMe": "Remember Me",
+ "signIn": "Sign In",
+ "signUp": "Sign Up",
+ "createAccount": "Create Account",
+ "welcomeBack": "Welcome Back"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/es.json b/ai-design-platform/src/i18n/locales/es.json
new file mode 100644
index 0000000..be5e130
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/es.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "Panel de Control",
+ "models": "Modelos",
+ "analytics": "Análisis",
+ "monitoring": "Monitoreo",
+ "settings": "Configuración",
+ "home": "Inicio",
+ "profile": "Perfil",
+ "help": "Ayuda",
+ "documentation": "Documentación",
+ "notifications": "Notificaciones"
+ },
+ "actions": {
+ "save": "Guardar",
+ "cancel": "Cancelar",
+ "delete": "Eliminar",
+ "edit": "Editar",
+ "export": "Exportar",
+ "import": "Importar",
+ "create": "Crear",
+ "update": "Actualizar",
+ "remove": "Quitar",
+ "download": "Descargar",
+ "upload": "Subir",
+ "search": "Buscar",
+ "filter": "Filtrar",
+ "refresh": "Actualizar",
+ "back": "Atrás",
+ "next": "Siguiente",
+ "submit": "Enviar",
+ "reset": "Restablecer",
+ "confirm": "Confirmar",
+ "close": "Cerrar"
+ },
+ "messages": {
+ "success": "Operación completada con éxito",
+ "error": "Ocurrió un error",
+ "warning": "Advertencia",
+ "loading": "Cargando...",
+ "noData": "No hay datos disponibles",
+ "saved": "Guardado exitosamente",
+ "deleted": "Eliminado exitosamente",
+ "updated": "Actualizado exitosamente",
+ "created": "Creado exitosamente",
+ "confirmDelete": "¿Está seguro de que desea eliminar este elemento?",
+ "confirmAction": "¿Está seguro de que desea continuar?"
+ },
+ "nav": {
+ "overview": "Resumen",
+ "projects": "Proyectos",
+ "team": "Equipo",
+ "reports": "Informes",
+ "templates": "Plantillas",
+ "workspace": "Espacio de Trabajo",
+ "library": "Biblioteca",
+ "resources": "Recursos"
+ },
+ "auth": {
+ "login": "Iniciar Sesión",
+ "register": "Registrarse",
+ "logout": "Cerrar Sesión",
+ "username": "Nombre de Usuario",
+ "password": "Contraseña",
+ "email": "Correo Electrónico",
+ "forgotPassword": "¿Olvidó su Contraseña?",
+ "rememberMe": "Recuérdame",
+ "signIn": "Entrar",
+ "signUp": "Registrarse",
+ "createAccount": "Crear Cuenta",
+ "welcomeBack": "Bienvenido de Nuevo"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/fr.json b/ai-design-platform/src/i18n/locales/fr.json
new file mode 100644
index 0000000..06ba716
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/fr.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "Tableau de Bord",
+ "models": "Modèles",
+ "analytics": "Analytique",
+ "monitoring": "Surveillance",
+ "settings": "Paramètres",
+ "home": "Accueil",
+ "profile": "Profil",
+ "help": "Aide",
+ "documentation": "Documentation",
+ "notifications": "Notifications"
+ },
+ "actions": {
+ "save": "Enregistrer",
+ "cancel": "Annuler",
+ "delete": "Supprimer",
+ "edit": "Modifier",
+ "export": "Exporter",
+ "import": "Importer",
+ "create": "Créer",
+ "update": "Mettre à Jour",
+ "remove": "Retirer",
+ "download": "Télécharger",
+ "upload": "Téléverser",
+ "search": "Rechercher",
+ "filter": "Filtrer",
+ "refresh": "Actualiser",
+ "back": "Retour",
+ "next": "Suivant",
+ "submit": "Soumettre",
+ "reset": "Réinitialiser",
+ "confirm": "Confirmer",
+ "close": "Fermer"
+ },
+ "messages": {
+ "success": "Opération réussie",
+ "error": "Une erreur s'est produite",
+ "warning": "Avertissement",
+ "loading": "Chargement...",
+ "noData": "Aucune donnée disponible",
+ "saved": "Enregistré avec succès",
+ "deleted": "Supprimé avec succès",
+ "updated": "Mis à jour avec succès",
+ "created": "Créé avec succès",
+ "confirmDelete": "Êtes-vous sûr de vouloir supprimer cet élément ?",
+ "confirmAction": "Êtes-vous sûr de vouloir continuer ?"
+ },
+ "nav": {
+ "overview": "Aperçu",
+ "projects": "Projets",
+ "team": "Équipe",
+ "reports": "Rapports",
+ "templates": "Modèles",
+ "workspace": "Espace de Travail",
+ "library": "Bibliothèque",
+ "resources": "Ressources"
+ },
+ "auth": {
+ "login": "Connexion",
+ "register": "S'inscrire",
+ "logout": "Déconnexion",
+ "username": "Nom d'Utilisateur",
+ "password": "Mot de Passe",
+ "email": "Email",
+ "forgotPassword": "Mot de Passe Oublié ?",
+ "rememberMe": "Se Souvenir de Moi",
+ "signIn": "Se Connecter",
+ "signUp": "S'inscrire",
+ "createAccount": "Créer un Compte",
+ "welcomeBack": "Bon Retour"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/hi.json b/ai-design-platform/src/i18n/locales/hi.json
new file mode 100644
index 0000000..28905d2
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/hi.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "डैशबोर्ड",
+ "models": "मॉडल",
+ "analytics": "विश्लेषण",
+ "monitoring": "निगरानी",
+ "settings": "सेटिंग्स",
+ "home": "होम",
+ "profile": "प्रोफ़ाइल",
+ "help": "सहायता",
+ "documentation": "प्रलेखन",
+ "notifications": "सूचनाएं"
+ },
+ "actions": {
+ "save": "सहेजें",
+ "cancel": "रद्द करें",
+ "delete": "हटाएं",
+ "edit": "संपादित करें",
+ "export": "निर्यात करें",
+ "import": "आयात करें",
+ "create": "बनाएं",
+ "update": "अपडेट करें",
+ "remove": "हटाएं",
+ "download": "डाउनलोड करें",
+ "upload": "अपलोड करें",
+ "search": "खोजें",
+ "filter": "फ़िल्टर करें",
+ "refresh": "रीफ्रेश करें",
+ "back": "वापस",
+ "next": "आगे",
+ "submit": "जमा करें",
+ "reset": "रीसेट करें",
+ "confirm": "पुष्टि करें",
+ "close": "बंद करें"
+ },
+ "messages": {
+ "success": "ऑपरेशन सफलतापूर्वक पूर्ण हुआ",
+ "error": "एक त्रुटि हुई",
+ "warning": "चेतावनी",
+ "loading": "लोड हो रहा है...",
+ "noData": "कोई डेटा उपलब्ध नहीं है",
+ "saved": "सफलतापूर्वक सहेजा गया",
+ "deleted": "सफलतापूर्वक हटाया गया",
+ "updated": "सफलतापूर्वक अपडेट किया गया",
+ "created": "सफलतापूर्वक बनाया गया",
+ "confirmDelete": "क्या आप वाकई इस आइटम को हटाना चाहते हैं?",
+ "confirmAction": "क्या आप वाकई जारी रखना चाहते हैं?"
+ },
+ "nav": {
+ "overview": "अवलोकन",
+ "projects": "परियोजनाएं",
+ "team": "टीम",
+ "reports": "रिपोर्ट",
+ "templates": "टेम्पलेट",
+ "workspace": "कार्यक्षेत्र",
+ "library": "लाइब्रेरी",
+ "resources": "संसाधन"
+ },
+ "auth": {
+ "login": "लॉगिन",
+ "register": "रजिस्टर करें",
+ "logout": "लॉगआउट",
+ "username": "उपयोगकर्ता नाम",
+ "password": "पासवर्ड",
+ "email": "ईमेल",
+ "forgotPassword": "पासवर्ड भूल गए?",
+ "rememberMe": "मुझे याद रखें",
+ "signIn": "साइन इन करें",
+ "signUp": "साइन अप करें",
+ "createAccount": "खाता बनाएं",
+ "welcomeBack": "वापसी पर स्वागत है"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/ja.json b/ai-design-platform/src/i18n/locales/ja.json
new file mode 100644
index 0000000..6ead2d3
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/ja.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "ダッシュボード",
+ "models": "モデル",
+ "analytics": "分析",
+ "monitoring": "監視",
+ "settings": "設定",
+ "home": "ホーム",
+ "profile": "プロフィール",
+ "help": "ヘルプ",
+ "documentation": "ドキュメント",
+ "notifications": "通知"
+ },
+ "actions": {
+ "save": "保存",
+ "cancel": "キャンセル",
+ "delete": "削除",
+ "edit": "編集",
+ "export": "エクスポート",
+ "import": "インポート",
+ "create": "作成",
+ "update": "更新",
+ "remove": "削除",
+ "download": "ダウンロード",
+ "upload": "アップロード",
+ "search": "検索",
+ "filter": "フィルター",
+ "refresh": "更新",
+ "back": "戻る",
+ "next": "次へ",
+ "submit": "送信",
+ "reset": "リセット",
+ "confirm": "確認",
+ "close": "閉じる"
+ },
+ "messages": {
+ "success": "操作が正常に完了しました",
+ "error": "エラーが発生しました",
+ "warning": "警告",
+ "loading": "読み込み中...",
+ "noData": "データがありません",
+ "saved": "保存されました",
+ "deleted": "削除されました",
+ "updated": "更新されました",
+ "created": "作成されました",
+ "confirmDelete": "この項目を削除してもよろしいですか?",
+ "confirmAction": "続行してもよろしいですか?"
+ },
+ "nav": {
+ "overview": "概要",
+ "projects": "プロジェクト",
+ "team": "チーム",
+ "reports": "レポート",
+ "templates": "テンプレート",
+ "workspace": "ワークスペース",
+ "library": "ライブラリ",
+ "resources": "リソース"
+ },
+ "auth": {
+ "login": "ログイン",
+ "register": "登録",
+ "logout": "ログアウト",
+ "username": "ユーザー名",
+ "password": "パスワード",
+ "email": "メールアドレス",
+ "forgotPassword": "パスワードをお忘れですか?",
+ "rememberMe": "ログイン状態を保持",
+ "signIn": "サインイン",
+ "signUp": "サインアップ",
+ "createAccount": "アカウント作成",
+ "welcomeBack": "おかえりなさい"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/pt.json b/ai-design-platform/src/i18n/locales/pt.json
new file mode 100644
index 0000000..f36e067
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/pt.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "Painel de Controle",
+ "models": "Modelos",
+ "analytics": "Análise",
+ "monitoring": "Monitoramento",
+ "settings": "Configurações",
+ "home": "Início",
+ "profile": "Perfil",
+ "help": "Ajuda",
+ "documentation": "Documentação",
+ "notifications": "Notificações"
+ },
+ "actions": {
+ "save": "Salvar",
+ "cancel": "Cancelar",
+ "delete": "Excluir",
+ "edit": "Editar",
+ "export": "Exportar",
+ "import": "Importar",
+ "create": "Criar",
+ "update": "Atualizar",
+ "remove": "Remover",
+ "download": "Baixar",
+ "upload": "Carregar",
+ "search": "Pesquisar",
+ "filter": "Filtrar",
+ "refresh": "Atualizar",
+ "back": "Voltar",
+ "next": "Próximo",
+ "submit": "Enviar",
+ "reset": "Redefinir",
+ "confirm": "Confirmar",
+ "close": "Fechar"
+ },
+ "messages": {
+ "success": "Operação concluída com sucesso",
+ "error": "Ocorreu um erro",
+ "warning": "Aviso",
+ "loading": "Carregando...",
+ "noData": "Nenhum dado disponível",
+ "saved": "Salvo com sucesso",
+ "deleted": "Excluído com sucesso",
+ "updated": "Atualizado com sucesso",
+ "created": "Criado com sucesso",
+ "confirmDelete": "Tem certeza de que deseja excluir este item?",
+ "confirmAction": "Tem certeza de que deseja continuar?"
+ },
+ "nav": {
+ "overview": "Visão Geral",
+ "projects": "Projetos",
+ "team": "Equipe",
+ "reports": "Relatórios",
+ "templates": "Modelos",
+ "workspace": "Área de Trabalho",
+ "library": "Biblioteca",
+ "resources": "Recursos"
+ },
+ "auth": {
+ "login": "Entrar",
+ "register": "Registrar",
+ "logout": "Sair",
+ "username": "Nome de Usuário",
+ "password": "Senha",
+ "email": "E-mail",
+ "forgotPassword": "Esqueceu a Senha?",
+ "rememberMe": "Lembrar-me",
+ "signIn": "Fazer Login",
+ "signUp": "Cadastrar-se",
+ "createAccount": "Criar Conta",
+ "welcomeBack": "Bem-vindo de Volta"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/ru.json b/ai-design-platform/src/i18n/locales/ru.json
new file mode 100644
index 0000000..023a250
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/ru.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "Панель управления",
+ "models": "Модели",
+ "analytics": "Аналитика",
+ "monitoring": "Мониторинг",
+ "settings": "Настройки",
+ "home": "Главная",
+ "profile": "Профиль",
+ "help": "Помощь",
+ "documentation": "Документация",
+ "notifications": "Уведомления"
+ },
+ "actions": {
+ "save": "Сохранить",
+ "cancel": "Отменить",
+ "delete": "Удалить",
+ "edit": "Редактировать",
+ "export": "Экспортировать",
+ "import": "Импортировать",
+ "create": "Создать",
+ "update": "Обновить",
+ "remove": "Убрать",
+ "download": "Скачать",
+ "upload": "Загрузить",
+ "search": "Поиск",
+ "filter": "Фильтр",
+ "refresh": "Обновить",
+ "back": "Назад",
+ "next": "Далее",
+ "submit": "Отправить",
+ "reset": "Сбросить",
+ "confirm": "Подтвердить",
+ "close": "Закрыть"
+ },
+ "messages": {
+ "success": "Операция выполнена успешно",
+ "error": "Произошла ошибка",
+ "warning": "Предупреждение",
+ "loading": "Загрузка...",
+ "noData": "Нет доступных данных",
+ "saved": "Успешно сохранено",
+ "deleted": "Успешно удалено",
+ "updated": "Успешно обновлено",
+ "created": "Успешно создано",
+ "confirmDelete": "Вы уверены, что хотите удалить этот элемент?",
+ "confirmAction": "Вы уверены, что хотите продолжить?"
+ },
+ "nav": {
+ "overview": "Обзор",
+ "projects": "Проекты",
+ "team": "Команда",
+ "reports": "Отчеты",
+ "templates": "Шаблоны",
+ "workspace": "Рабочее пространство",
+ "library": "Библиотека",
+ "resources": "Ресурсы"
+ },
+ "auth": {
+ "login": "Войти",
+ "register": "Регистрация",
+ "logout": "Выйти",
+ "username": "Имя пользователя",
+ "password": "Пароль",
+ "email": "Электронная почта",
+ "forgotPassword": "Забыли пароль?",
+ "rememberMe": "Запомнить меня",
+ "signIn": "Войти",
+ "signUp": "Зарегистрироваться",
+ "createAccount": "Создать аккаунт",
+ "welcomeBack": "С возвращением"
+ }
+}
diff --git a/ai-design-platform/src/i18n/locales/zh.json b/ai-design-platform/src/i18n/locales/zh.json
new file mode 100644
index 0000000..312ecc3
--- /dev/null
+++ b/ai-design-platform/src/i18n/locales/zh.json
@@ -0,0 +1,73 @@
+{
+ "common": {
+ "dashboard": "仪表板",
+ "models": "模型",
+ "analytics": "分析",
+ "monitoring": "监控",
+ "settings": "设置",
+ "home": "主页",
+ "profile": "个人资料",
+ "help": "帮助",
+ "documentation": "文档",
+ "notifications": "通知"
+ },
+ "actions": {
+ "save": "保存",
+ "cancel": "取消",
+ "delete": "删除",
+ "edit": "编辑",
+ "export": "导出",
+ "import": "导入",
+ "create": "创建",
+ "update": "更新",
+ "remove": "移除",
+ "download": "下载",
+ "upload": "上传",
+ "search": "搜索",
+ "filter": "筛选",
+ "refresh": "刷新",
+ "back": "返回",
+ "next": "下一步",
+ "submit": "提交",
+ "reset": "重置",
+ "confirm": "确认",
+ "close": "关闭"
+ },
+ "messages": {
+ "success": "操作成功完成",
+ "error": "发生错误",
+ "warning": "警告",
+ "loading": "加载中...",
+ "noData": "暂无数据",
+ "saved": "保存成功",
+ "deleted": "删除成功",
+ "updated": "更新成功",
+ "created": "创建成功",
+ "confirmDelete": "确定要删除此项吗?",
+ "confirmAction": "确定要继续吗?"
+ },
+ "nav": {
+ "overview": "概览",
+ "projects": "项目",
+ "team": "团队",
+ "reports": "报告",
+ "templates": "模板",
+ "workspace": "工作区",
+ "library": "资源库",
+ "resources": "资源"
+ },
+ "auth": {
+ "login": "登录",
+ "register": "注册",
+ "logout": "退出",
+ "username": "用户名",
+ "password": "密码",
+ "email": "电子邮件",
+ "forgotPassword": "忘记密码?",
+ "rememberMe": "记住我",
+ "signIn": "登录",
+ "signUp": "注册",
+ "createAccount": "创建账户",
+ "welcomeBack": "欢迎回来"
+ }
+}
diff --git a/ai-design-platform/src/index.css b/ai-design-platform/src/index.css
new file mode 100644
index 0000000..e26854a
--- /dev/null
+++ b/ai-design-platform/src/index.css
@@ -0,0 +1,84 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+ --purple-500: 262 83% 58%;
+ --purple-600: 258 90% 66%;
+ --blue-500: 217 91% 60%;
+ }
+
+ * {
+ border-color: rgba(255, 255, 255, 0.1);
+ }
+
+ body {
+ @apply bg-gray-900 text-gray-100;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
+ }
+}
+
+@layer components {
+ .glass {
+ @apply bg-white/5 backdrop-blur-xl border border-white/10;
+ }
+
+ .glass-hover {
+ @apply transition-all duration-300 hover:bg-white/10 hover:border-white/20;
+ }
+
+ .btn-primary {
+ @apply px-4 py-2 rounded-lg bg-gradient-to-r from-purple-600 to-blue-500 text-white font-medium transition-all duration-300 hover:shadow-lg hover:scale-105;
+ }
+
+ .btn-secondary {
+ @apply px-4 py-2 rounded-lg glass glass-hover text-white font-medium;
+ }
+
+ .card {
+ @apply glass rounded-xl p-6;
+ }
+
+ .card-hover {
+ @apply glass glass-hover rounded-xl p-6 cursor-pointer;
+ }
+
+ .gradient-text {
+ @apply bg-gradient-to-r from-purple-400 to-blue-400 bg-clip-text text-transparent;
+ }
+
+ .glow {
+ @apply shadow-[0_0_30px_rgba(139,92,246,0.3)];
+ }
+
+ .pulse-glow {
+ animation: pulse-glow 2s ease-in-out infinite;
+ }
+
+ @keyframes pulse-glow {
+ 0%, 100% {
+ box-shadow: 0 0 20px rgba(139, 92, 246, 0.3);
+ }
+ 50% {
+ box-shadow: 0 0 40px rgba(139, 92, 246, 0.6);
+ }
+ }
+
+ .fade-in {
+ animation: fadeIn 0.5s ease-in;
+ }
+
+ @keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+}
diff --git a/ai-design-platform/src/main.tsx b/ai-design-platform/src/main.tsx
new file mode 100644
index 0000000..bef5202
--- /dev/null
+++ b/ai-design-platform/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import './index.css'
+import App from './App.tsx'
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+)
diff --git a/ai-design-platform/src/services/aiCompanionService.ts b/ai-design-platform/src/services/aiCompanionService.ts
new file mode 100644
index 0000000..7994b25
--- /dev/null
+++ b/ai-design-platform/src/services/aiCompanionService.ts
@@ -0,0 +1,444 @@
+/**
+ * AI Companion Service - Conversational AI with multiple personalities
+ * Handles natural language conversations with context awareness
+ */
+
+import { classifyIntent, extractEntities, Intent, Entity } from './nlp/intentRecognition';
+import { analyzeSentiment, detectEmotion, SentimentAnalysis, EmotionAnalysis } from './sentiment/sentimentAnalyzer';
+import { saveMessage, getContext, clearHistory as clearMemoryHistory, getHistory, ConversationMessage } from './memory/conversationMemory';
+
+export type AIPersonality = 'professional' | 'friendly' | 'teacher' | 'mentor';
+
+export interface AIResponse {
+ message: string;
+ intent: Intent;
+ sentiment: SentimentAnalysis;
+ emotion: EmotionAnalysis;
+ suggestions?: string[];
+ actions?: AIAction[];
+}
+
+export interface AIAction {
+ type: 'navigate' | 'execute' | 'display';
+ target: string;
+ parameters?: Record;
+}
+
+interface PersonalityTrait {
+ greeting: string[];
+ responseStyle: string;
+ helpfulness: number;
+ formality: number;
+ examples: string[];
+}
+
+const PERSONALITIES: Record = {
+ professional: {
+ greeting: [
+ 'Hello. How may I assist you today?',
+ 'Good day. What can I help you with?',
+ 'Welcome. How can I be of service?'
+ ],
+ responseStyle: 'formal and concise',
+ helpfulness: 0.8,
+ formality: 0.9,
+ examples: [
+ 'I can help you navigate the platform, analyze data, or answer questions about features.',
+ 'Please let me know if you need assistance with any specific functionality.'
+ ]
+ },
+ friendly: {
+ greeting: [
+ 'Hey there! How can I help you today?',
+ 'Hi! What would you like to do?',
+ 'Hello friend! Ready to create something awesome?'
+ ],
+ responseStyle: 'casual and warm',
+ helpfulness: 0.9,
+ formality: 0.3,
+ examples: [
+ "I'm here to help! Just let me know what you need.",
+ "Let's make something great together!"
+ ]
+ },
+ teacher: {
+ greeting: [
+ 'Welcome! Ready to learn something new?',
+ 'Hello! I\'m here to guide you through the platform.',
+ 'Great to see you! What would you like to explore today?'
+ ],
+ responseStyle: 'educational and patient',
+ helpfulness: 1.0,
+ formality: 0.6,
+ examples: [
+ 'Let me explain how this works...',
+ 'Here\'s what you need to know about this feature...',
+ 'Would you like me to show you step by step?'
+ ]
+ },
+ mentor: {
+ greeting: [
+ 'Hello! I\'m here to support your creative journey.',
+ 'Welcome back! How can I help you grow today?',
+ 'Great to see you! What are you working on?'
+ ],
+ responseStyle: 'supportive and insightful',
+ helpfulness: 0.95,
+ formality: 0.5,
+ examples: [
+ 'Based on your experience, I recommend...',
+ 'Have you considered trying...',
+ 'This could be a great opportunity to...'
+ ]
+ }
+};
+
+const NAVIGATION_TARGETS: Record = {
+ dashboard: ['dashboard', 'home', 'main', 'overview'],
+ models: ['models', 'ai models', 'model library', 'generators'],
+ settings: ['settings', 'preferences', 'configuration', 'options'],
+ profile: ['profile', 'account', 'user'],
+ analytics: ['analytics', 'stats', 'statistics', 'metrics'],
+ history: ['history', 'past', 'previous', 'recent']
+};
+
+class AICompanionService {
+ private currentPersonality: AIPersonality = 'mentor';
+ private conversationContext: ConversationMessage[] = [];
+ private maxContextMessages = 10;
+
+ constructor() {
+ this.loadContext();
+ }
+
+ /**
+ * Load conversation context
+ */
+ private loadContext(): void {
+ this.conversationContext = getContext(this.maxContextMessages);
+ }
+
+ /**
+ * Generate response based on personality
+ */
+ private generatePersonalityResponse(
+ intent: Intent,
+ sentiment: SentimentAnalysis,
+ emotion: EmotionAnalysis
+ ): string {
+ const personality = PERSONALITIES[this.currentPersonality];
+
+ switch (intent.type) {
+ case 'navigate':
+ return this.generateNavigationResponse(intent, personality);
+
+ case 'query':
+ return this.generateQueryResponse(intent, personality);
+
+ case 'command':
+ return this.generateCommandResponse(intent, personality);
+
+ case 'help':
+ return this.generateHelpResponse(personality);
+
+ case 'chat':
+ return this.generateChatResponse(sentiment, emotion, personality);
+
+ default:
+ return this.generateDefaultResponse(personality);
+ }
+ }
+
+ /**
+ * Generate navigation response
+ */
+ private generateNavigationResponse(intent: Intent, personality: PersonalityTrait): string {
+ const sectionEntity = intent.entities.find(e => e.type === 'section');
+
+ if (!sectionEntity) {
+ return personality.formality > 0.7
+ ? 'I can help you navigate. Where would you like to go?'
+ : 'Sure! Where do you want to go?';
+ }
+
+ const target = this.resolveNavigationTarget(sectionEntity.value);
+
+ if (this.currentPersonality === 'teacher') {
+ return `Let me take you to the ${target} section. This is where you can ${this.getFeatureDescription(target)}.`;
+ } else if (this.currentPersonality === 'friendly') {
+ return `Taking you to ${target} right now! 🚀`;
+ } else {
+ return `Navigating to ${target}.`;
+ }
+ }
+
+ /**
+ * Generate query response
+ */
+ private generateQueryResponse(intent: Intent, personality: PersonalityTrait): string {
+ const responses: Record = {
+ professional: 'I can provide information on that topic. What specifically would you like to know?',
+ friendly: 'Great question! Let me help you with that.',
+ teacher: 'Excellent question! Let me explain this in detail.',
+ mentor: 'That\'s an important question. Here\'s what you should know...'
+ };
+
+ return responses[this.currentPersonality];
+ }
+
+ /**
+ * Generate command response
+ */
+ private generateCommandResponse(intent: Intent, personality: PersonalityTrait): string {
+ const actionEntity = intent.entities.find(e => e.type === 'action');
+
+ if (!actionEntity) {
+ return 'What would you like me to do?';
+ }
+
+ const action = actionEntity.value.toLowerCase();
+
+ if (this.currentPersonality === 'teacher') {
+ return `I'll help you ${action}. Here's how it works...`;
+ } else if (this.currentPersonality === 'friendly') {
+ return `On it! Let's ${action} together!`;
+ } else {
+ return `Processing ${action} request.`;
+ }
+ }
+
+ /**
+ * Generate help response
+ */
+ private generateHelpResponse(personality: PersonalityTrait): string {
+ const helpMessages: Record = {
+ professional: 'I can assist with navigation, feature explanations, and platform guidance. What do you need help with?',
+ friendly: 'I\'m here to help! You can ask me to navigate anywhere, explain features, or just chat. What do you need?',
+ teacher: 'I\'d be happy to teach you! I can explain features, guide you through processes, or answer questions. What would you like to learn?',
+ mentor: 'I\'m here to support you. I can help with navigation, provide insights, or discuss your creative process. How can I assist?'
+ };
+
+ return helpMessages[this.currentPersonality];
+ }
+
+ /**
+ * Generate chat response
+ */
+ private generateChatResponse(
+ sentiment: SentimentAnalysis,
+ emotion: EmotionAnalysis,
+ personality: PersonalityTrait
+ ): string {
+ if (sentiment.sentiment === 'positive' && emotion.primaryEmotion === 'joy') {
+ const positiveResponses: Record = {
+ professional: 'I\'m pleased to hear that. How else may I assist you?',
+ friendly: 'That\'s awesome! I\'m happy for you! 😊',
+ teacher: 'Wonderful! It\'s great to see your enthusiasm!',
+ mentor: 'That\'s excellent progress! Keep up the great work!'
+ };
+ return positiveResponses[this.currentPersonality];
+ }
+
+ if (sentiment.sentiment === 'negative') {
+ const supportiveResponses: Record = {
+ professional: 'I understand. How can I help address this concern?',
+ friendly: 'I hear you. Let me see how I can help make this better!',
+ teacher: 'I understand this can be challenging. Let me guide you through it.',
+ mentor: 'I appreciate you sharing that. Let\'s work through this together.'
+ };
+ return supportiveResponses[this.currentPersonality];
+ }
+
+ return personality.examples[0] || 'I\'m here to help. What would you like to do?';
+ }
+
+ /**
+ * Generate default response
+ */
+ private generateDefaultResponse(personality: PersonalityTrait): string {
+ return personality.formality > 0.7
+ ? 'How may I assist you?'
+ : 'What can I help you with?';
+ }
+
+ /**
+ * Resolve navigation target
+ */
+ private resolveNavigationTarget(input: string): string {
+ const normalizedInput = input.toLowerCase();
+
+ for (const [target, aliases] of Object.entries(NAVIGATION_TARGETS)) {
+ if (aliases.some(alias => normalizedInput.includes(alias))) {
+ return target;
+ }
+ }
+
+ return input;
+ }
+
+ /**
+ * Get feature description
+ */
+ private getFeatureDescription(section: string): string {
+ const descriptions: Record = {
+ dashboard: 'view your overview and quick access features',
+ models: 'explore and use various AI models',
+ settings: 'customize your preferences and configuration',
+ profile: 'manage your account information',
+ analytics: 'review your usage statistics and insights',
+ history: 'access your past activities and conversations'
+ };
+
+ return descriptions[section] || 'access this feature';
+ }
+
+ /**
+ * Generate suggestions based on context
+ */
+ private generateSuggestions(intent: Intent): string[] {
+ const suggestions: string[] = [];
+
+ switch (intent.type) {
+ case 'navigate':
+ suggestions.push('View analytics', 'Open settings', 'Check history');
+ break;
+ case 'query':
+ suggestions.push('Tell me more', 'Show examples', 'Explain in detail');
+ break;
+ case 'help':
+ suggestions.push('Show tutorial', 'List features', 'Quick start guide');
+ break;
+ default:
+ suggestions.push('What can you do?', 'Show help', 'Navigate to dashboard');
+ }
+
+ return suggestions;
+ }
+
+ /**
+ * Generate actions based on intent
+ */
+ private generateActions(intent: Intent): AIAction[] {
+ const actions: AIAction[] = [];
+
+ if (intent.type === 'navigate') {
+ const sectionEntity = intent.entities.find(e => e.type === 'section');
+ if (sectionEntity) {
+ const target = this.resolveNavigationTarget(sectionEntity.value);
+ actions.push({
+ type: 'navigate',
+ target,
+ parameters: { source: 'ai_companion' }
+ });
+ }
+ }
+
+ return actions;
+ }
+
+ /**
+ * Send message to AI companion
+ */
+ public sendMessage(message: string): AIResponse {
+ const intent = classifyIntent(message);
+ const sentiment = analyzeSentiment(message);
+ const emotion = detectEmotion(message);
+
+ saveMessage('user', message, {
+ intent: intent.type,
+ sentiment: sentiment.sentiment,
+ emotion: emotion.primaryEmotion
+ });
+
+ const responseMessage = this.generatePersonalityResponse(intent, sentiment, emotion);
+ const suggestions = this.generateSuggestions(intent);
+ const actions = this.generateActions(intent);
+
+ saveMessage('assistant', responseMessage, {
+ personality: this.currentPersonality,
+ intent: intent.type
+ });
+
+ this.loadContext();
+
+ return {
+ message: responseMessage,
+ intent,
+ sentiment,
+ emotion,
+ suggestions,
+ actions
+ };
+ }
+
+ /**
+ * Set AI personality
+ */
+ public setPersonality(personality: AIPersonality): void {
+ this.currentPersonality = personality;
+ }
+
+ /**
+ * Get current personality
+ */
+ public getPersonality(): AIPersonality {
+ return this.currentPersonality;
+ }
+
+ /**
+ * Get greeting message
+ */
+ public getGreeting(): string {
+ const personality = PERSONALITIES[this.currentPersonality];
+ const greetings = personality.greeting;
+ return greetings[Math.floor(Math.random() * greetings.length)];
+ }
+
+ /**
+ * Clear conversation history
+ */
+ public clearHistory(): void {
+ clearMemoryHistory();
+ this.conversationContext = [];
+ }
+
+ /**
+ * Get conversation history
+ */
+ public getHistory(limit?: number): ConversationMessage[] {
+ return getHistory(limit);
+ }
+
+ /**
+ * Get personality description
+ */
+ public getPersonalityDescription(personality?: AIPersonality): string {
+ const p = personality || this.currentPersonality;
+ return PERSONALITIES[p].responseStyle;
+ }
+}
+
+const aiCompanionService = new AICompanionService();
+
+export const sendMessage = (message: string): AIResponse =>
+ aiCompanionService.sendMessage(message);
+
+export const setPersonality = (personality: AIPersonality): void =>
+ aiCompanionService.setPersonality(personality);
+
+export const getPersonality = (): AIPersonality =>
+ aiCompanionService.getPersonality();
+
+export const getGreeting = (): string =>
+ aiCompanionService.getGreeting();
+
+export const clearHistory = (): void =>
+ aiCompanionService.clearHistory();
+
+export const getHistory = (limit?: number): ConversationMessage[] =>
+ aiCompanionService.getHistory(limit);
+
+export const getPersonalityDescription = (personality?: AIPersonality): string =>
+ aiCompanionService.getPersonalityDescription(personality);
+
+export default aiCompanionService;
diff --git a/ai-design-platform/src/services/memory/conversationMemory.ts b/ai-design-platform/src/services/memory/conversationMemory.ts
new file mode 100644
index 0000000..c1c63d3
--- /dev/null
+++ b/ai-design-platform/src/services/memory/conversationMemory.ts
@@ -0,0 +1,296 @@
+/**
+ * Conversation Memory Service - Context persistence and history management
+ * Stores conversation history in localStorage with session management
+ */
+
+export interface ConversationMessage {
+ id: string;
+ role: 'user' | 'assistant';
+ content: string;
+ timestamp: number;
+ metadata?: Record;
+}
+
+export interface ConversationContext {
+ sessionId: string;
+ startTime: number;
+ messageCount: number;
+ lastActivity: number;
+ metadata?: Record;
+}
+
+const STORAGE_KEY_MESSAGES = 'ai_design_platform_conversation_history';
+const STORAGE_KEY_CONTEXT = 'ai_design_platform_conversation_context';
+const MAX_MESSAGES = 100;
+
+class ConversationMemory {
+ private messages: ConversationMessage[] = [];
+ private context: ConversationContext;
+ private sessionId: string;
+
+ constructor() {
+ this.sessionId = this.generateSessionId();
+ this.context = this.initializeContext();
+ this.loadFromStorage();
+ }
+
+ /**
+ * Generate unique session ID
+ */
+ private generateSessionId(): string {
+ return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+ }
+
+ /**
+ * Initialize conversation context
+ */
+ private initializeContext(): ConversationContext {
+ return {
+ sessionId: this.sessionId,
+ startTime: Date.now(),
+ messageCount: 0,
+ lastActivity: Date.now()
+ };
+ }
+
+ /**
+ * Load conversation history from localStorage
+ */
+ private loadFromStorage(): void {
+ try {
+ const storedMessages = localStorage.getItem(STORAGE_KEY_MESSAGES);
+ const storedContext = localStorage.getItem(STORAGE_KEY_CONTEXT);
+
+ if (storedMessages) {
+ this.messages = JSON.parse(storedMessages);
+ }
+
+ if (storedContext) {
+ const parsedContext = JSON.parse(storedContext);
+ const timeSinceLastActivity = Date.now() - parsedContext.lastActivity;
+
+ if (timeSinceLastActivity < 24 * 60 * 60 * 1000) {
+ this.context = parsedContext;
+ this.sessionId = parsedContext.sessionId;
+ }
+ }
+ } catch (error) {
+ console.error('Error loading conversation from storage:', error);
+ this.messages = [];
+ }
+ }
+
+ /**
+ * Save conversation history to localStorage
+ */
+ private saveToStorage(): void {
+ try {
+ localStorage.setItem(STORAGE_KEY_MESSAGES, JSON.stringify(this.messages));
+ localStorage.setItem(STORAGE_KEY_CONTEXT, JSON.stringify(this.context));
+ } catch (error) {
+ console.error('Error saving conversation to storage:', error);
+ }
+ }
+
+ /**
+ * Generate unique message ID
+ */
+ private generateMessageId(): string {
+ return `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+ }
+
+ /**
+ * Trim messages to maximum limit
+ */
+ private trimMessages(): void {
+ if (this.messages.length > MAX_MESSAGES) {
+ this.messages = this.messages.slice(-MAX_MESSAGES);
+ }
+ }
+
+ /**
+ * Save a message to conversation history
+ */
+ public saveMessage(
+ role: 'user' | 'assistant',
+ content: string,
+ metadata?: Record
+ ): ConversationMessage {
+ const message: ConversationMessage = {
+ id: this.generateMessageId(),
+ role,
+ content,
+ timestamp: Date.now(),
+ metadata
+ };
+
+ this.messages.push(message);
+ this.trimMessages();
+
+ this.context.messageCount = this.messages.length;
+ this.context.lastActivity = Date.now();
+
+ this.saveToStorage();
+
+ return message;
+ }
+
+ /**
+ * Get conversation history
+ */
+ public getHistory(limit?: number): ConversationMessage[] {
+ if (limit && limit > 0) {
+ return this.messages.slice(-limit);
+ }
+ return [...this.messages];
+ }
+
+ /**
+ * Get messages by role
+ */
+ public getMessagesByRole(role: 'user' | 'assistant', limit?: number): ConversationMessage[] {
+ const filtered = this.messages.filter(msg => msg.role === role);
+ if (limit && limit > 0) {
+ return filtered.slice(-limit);
+ }
+ return filtered;
+ }
+
+ /**
+ * Get recent context (last N messages)
+ */
+ public getContext(messageCount: number = 10): ConversationMessage[] {
+ return this.messages.slice(-messageCount);
+ }
+
+ /**
+ * Get conversation summary
+ */
+ public getSummary(): {
+ totalMessages: number;
+ userMessages: number;
+ assistantMessages: number;
+ sessionDuration: number;
+ } {
+ const userMessages = this.messages.filter(msg => msg.role === 'user').length;
+ const assistantMessages = this.messages.filter(msg => msg.role === 'assistant').length;
+ const sessionDuration = Date.now() - this.context.startTime;
+
+ return {
+ totalMessages: this.messages.length,
+ userMessages,
+ assistantMessages,
+ sessionDuration
+ };
+ }
+
+ /**
+ * Clear conversation history
+ */
+ public clearHistory(): void {
+ this.messages = [];
+ this.context = this.initializeContext();
+
+ try {
+ localStorage.removeItem(STORAGE_KEY_MESSAGES);
+ localStorage.removeItem(STORAGE_KEY_CONTEXT);
+ } catch (error) {
+ console.error('Error clearing conversation storage:', error);
+ }
+ }
+
+ /**
+ * Search messages by content
+ */
+ public searchMessages(query: string): ConversationMessage[] {
+ const lowerQuery = query.toLowerCase();
+ return this.messages.filter(msg =>
+ msg.content.toLowerCase().includes(lowerQuery)
+ );
+ }
+
+ /**
+ * Get session information
+ */
+ public getSessionInfo(): ConversationContext {
+ return { ...this.context };
+ }
+
+ /**
+ * Update session metadata
+ */
+ public updateMetadata(metadata: Record): void {
+ this.context.metadata = { ...this.context.metadata, ...metadata };
+ this.saveToStorage();
+ }
+
+ /**
+ * Export conversation as JSON
+ */
+ public exportConversation(): string {
+ return JSON.stringify({
+ context: this.context,
+ messages: this.messages
+ }, null, 2);
+ }
+
+ /**
+ * Import conversation from JSON
+ */
+ public importConversation(json: string): boolean {
+ try {
+ const data = JSON.parse(json);
+ if (data.messages && Array.isArray(data.messages)) {
+ this.messages = data.messages;
+ if (data.context) {
+ this.context = data.context;
+ this.sessionId = data.context.sessionId;
+ }
+ this.saveToStorage();
+ return true;
+ }
+ return false;
+ } catch (error) {
+ console.error('Error importing conversation:', error);
+ return false;
+ }
+ }
+}
+
+const conversationMemory = new ConversationMemory();
+
+export const saveMessage = (
+ role: 'user' | 'assistant',
+ content: string,
+ metadata?: Record
+): ConversationMessage => conversationMemory.saveMessage(role, content, metadata);
+
+export const getHistory = (limit?: number): ConversationMessage[] =>
+ conversationMemory.getHistory(limit);
+
+export const clearHistory = (): void => conversationMemory.clearHistory();
+
+export const getContext = (messageCount?: number): ConversationMessage[] =>
+ conversationMemory.getContext(messageCount);
+
+export const getMessagesByRole = (role: 'user' | 'assistant', limit?: number): ConversationMessage[] =>
+ conversationMemory.getMessagesByRole(role, limit);
+
+export const getSummary = () => conversationMemory.getSummary();
+
+export const searchMessages = (query: string): ConversationMessage[] =>
+ conversationMemory.searchMessages(query);
+
+export const getSessionInfo = (): ConversationContext =>
+ conversationMemory.getSessionInfo();
+
+export const updateMetadata = (metadata: Record): void =>
+ conversationMemory.updateMetadata(metadata);
+
+export const exportConversation = (): string =>
+ conversationMemory.exportConversation();
+
+export const importConversation = (json: string): boolean =>
+ conversationMemory.importConversation(json);
+
+export default conversationMemory;
diff --git a/ai-design-platform/src/services/nlp/intentRecognition.ts b/ai-design-platform/src/services/nlp/intentRecognition.ts
new file mode 100644
index 0000000..ef4d018
--- /dev/null
+++ b/ai-design-platform/src/services/nlp/intentRecognition.ts
@@ -0,0 +1,295 @@
+/**
+ * Intent Recognition Service - Natural language understanding
+ * Classifies user intents and extracts entities from text
+ */
+
+export type IntentType = 'navigate' | 'query' | 'command' | 'chat' | 'help';
+
+export interface Intent {
+ type: IntentType;
+ confidence: number;
+ entities: Entity[];
+ originalText: string;
+}
+
+export interface Entity {
+ type: EntityType;
+ value: string;
+ confidence: number;
+ position?: {
+ start: number;
+ end: number;
+ };
+}
+
+export type EntityType =
+ | 'section'
+ | 'model'
+ | 'action'
+ | 'feature'
+ | 'setting'
+ | 'query_type'
+ | 'number'
+ | 'color';
+
+interface IntentPattern {
+ type: IntentType;
+ patterns: RegExp[];
+ keywords: string[];
+}
+
+const INTENT_PATTERNS: IntentPattern[] = [
+ {
+ type: 'navigate',
+ patterns: [
+ /\b(go to|navigate to|open|show me|take me to)\s+(\w+)/i,
+ /\b(switch to|change to|move to)\s+(\w+)/i,
+ /\b(view|display|see)\s+(the\s+)?(\w+)\s+(section|page|panel)/i
+ ],
+ keywords: ['navigate', 'go', 'open', 'show', 'switch', 'move', 'view', 'display']
+ },
+ {
+ type: 'query',
+ patterns: [
+ /\b(what|how|when|where|why|who)\b/i,
+ /\b(tell me|show me|explain|describe)\b/i,
+ /\b(can you|could you|would you)\s+(tell|show|explain)/i
+ ],
+ keywords: ['what', 'how', 'when', 'where', 'why', 'tell', 'explain', 'describe']
+ },
+ {
+ type: 'command',
+ patterns: [
+ /\b(create|generate|make|build)\s+(\w+)/i,
+ /\b(delete|remove|clear)\s+(\w+)/i,
+ /\b(save|export|download)\s+(\w+)/i,
+ /\b(start|stop|pause|resume)\s+(\w+)/i
+ ],
+ keywords: ['create', 'generate', 'make', 'delete', 'remove', 'save', 'export', 'start', 'stop']
+ },
+ {
+ type: 'help',
+ patterns: [
+ /\b(help|assist|support)\b/i,
+ /\b(how do i|how can i|what can i)\b/i,
+ /\b(tutorial|guide|documentation)\b/i
+ ],
+ keywords: ['help', 'assist', 'support', 'tutorial', 'guide', 'how']
+ }
+];
+
+const ENTITY_PATTERNS: Record = {
+ section: [
+ /\b(dashboard|home|models|generators|settings|profile|analytics|history)\b/i
+ ],
+ model: [
+ /\b(gpt|claude|llama|palm|gemini|dall-e|stable diffusion|midjourney)\b/i,
+ /\b(text|image|audio|video|3d)\s+model\b/i
+ ],
+ action: [
+ /\b(create|delete|update|edit|modify|generate|analyze|process)\b/i
+ ],
+ feature: [
+ /\b(speech|voice|chat|conversation|assistant|companion)\b/i,
+ /\b(recognition|synthesis|translation|summarization)\b/i
+ ],
+ setting: [
+ /\b(theme|language|volume|rate|pitch|personality)\b/i,
+ /\b(dark mode|light mode|auto save|notifications)\b/i
+ ],
+ query_type: [
+ /\b(status|information|details|summary|overview)\b/i
+ ],
+ number: [
+ /\b(\d+)\b/
+ ],
+ color: [
+ /\b(red|blue|green|yellow|orange|purple|pink|black|white|gray)\b/i,
+ /#[0-9a-f]{6}/i
+ ]
+};
+
+/**
+ * Calculate text similarity using Levenshtein distance
+ */
+function calculateSimilarity(str1: string, str2: string): number {
+ const longer = str1.length > str2.length ? str1 : str2;
+ const shorter = str1.length > str2.length ? str2 : str1;
+
+ if (longer.length === 0) return 1.0;
+
+ const editDistance = levenshteinDistance(longer.toLowerCase(), shorter.toLowerCase());
+ return (longer.length - editDistance) / longer.length;
+}
+
+/**
+ * Calculate Levenshtein distance between two strings
+ */
+function levenshteinDistance(str1: string, str2: string): number {
+ const matrix: number[][] = [];
+
+ for (let i = 0; i <= str2.length; i++) {
+ matrix[i] = [i];
+ }
+
+ for (let j = 0; j <= str1.length; j++) {
+ matrix[0][j] = j;
+ }
+
+ for (let i = 1; i <= str2.length; i++) {
+ for (let j = 1; j <= str1.length; j++) {
+ if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
+ matrix[i][j] = matrix[i - 1][j - 1];
+ } else {
+ matrix[i][j] = Math.min(
+ matrix[i - 1][j - 1] + 1,
+ matrix[i][j - 1] + 1,
+ matrix[i - 1][j] + 1
+ );
+ }
+ }
+ }
+
+ return matrix[str2.length][str1.length];
+}
+
+/**
+ * Classify user intent from text
+ */
+export function classifyIntent(text: string): Intent {
+ const normalizedText = text.trim().toLowerCase();
+ let maxConfidence = 0;
+ let detectedType: IntentType = 'chat';
+
+ for (const intentPattern of INTENT_PATTERNS) {
+ let confidence = 0;
+
+ for (const pattern of intentPattern.patterns) {
+ if (pattern.test(normalizedText)) {
+ confidence += 0.4;
+ }
+ }
+
+ const words = normalizedText.split(/\s+/);
+ const matchingKeywords = intentPattern.keywords.filter(keyword =>
+ words.some(word => calculateSimilarity(word, keyword) > 0.8)
+ );
+
+ confidence += (matchingKeywords.length / intentPattern.keywords.length) * 0.6;
+
+ if (confidence > maxConfidence) {
+ maxConfidence = confidence;
+ detectedType = intentPattern.type;
+ }
+ }
+
+ if (maxConfidence < 0.3) {
+ detectedType = 'chat';
+ maxConfidence = 0.5;
+ }
+
+ const entities = extractEntities(text);
+
+ return {
+ type: detectedType,
+ confidence: Math.min(maxConfidence, 1.0),
+ entities,
+ originalText: text
+ };
+}
+
+/**
+ * Extract entities from text
+ */
+export function extractEntities(text: string): Entity[] {
+ const entities: Entity[] = [];
+
+ for (const [entityType, patterns] of Object.entries(ENTITY_PATTERNS)) {
+ for (const pattern of patterns) {
+ const matches = text.matchAll(new RegExp(pattern, 'gi'));
+
+ for (const match of matches) {
+ const value = match[1] || match[0];
+ const position = {
+ start: match.index || 0,
+ end: (match.index || 0) + match[0].length
+ };
+
+ let confidence = 0.8;
+ if (match[1]) {
+ confidence = 0.9;
+ }
+
+ const existingEntity = entities.find(
+ e => e.position?.start === position.start && e.position?.end === position.end
+ );
+
+ if (!existingEntity) {
+ entities.push({
+ type: entityType as EntityType,
+ value: value.trim(),
+ confidence,
+ position
+ });
+ }
+ }
+ }
+ }
+
+ entities.sort((a, b) => (b.confidence || 0) - (a.confidence || 0));
+
+ return entities;
+}
+
+/**
+ * Extract specific entity type
+ */
+export function extractEntityType(text: string, entityType: EntityType): Entity | null {
+ const entities = extractEntities(text);
+ const filtered = entities.filter(e => e.type === entityType);
+ return filtered.length > 0 ? filtered[0] : null;
+}
+
+/**
+ * Check if text contains specific intent
+ */
+export function hasIntent(text: string, intentType: IntentType, threshold: number = 0.5): boolean {
+ const intent = classifyIntent(text);
+ return intent.type === intentType && intent.confidence >= threshold;
+}
+
+/**
+ * Get all possible intents with confidence scores
+ */
+export function getAllIntents(text: string): Array<{ type: IntentType; confidence: number }> {
+ const normalizedText = text.trim().toLowerCase();
+ const results: Array<{ type: IntentType; confidence: number }> = [];
+
+ for (const intentPattern of INTENT_PATTERNS) {
+ let confidence = 0;
+
+ for (const pattern of intentPattern.patterns) {
+ if (pattern.test(normalizedText)) {
+ confidence += 0.4;
+ }
+ }
+
+ const words = normalizedText.split(/\s+/);
+ const matchingKeywords = intentPattern.keywords.filter(keyword =>
+ words.some(word => calculateSimilarity(word, keyword) > 0.8)
+ );
+
+ confidence += (matchingKeywords.length / intentPattern.keywords.length) * 0.6;
+
+ results.push({
+ type: intentPattern.type,
+ confidence: Math.min(confidence, 1.0)
+ });
+ }
+
+ results.push({ type: 'chat', confidence: 0.5 });
+
+ results.sort((a, b) => b.confidence - a.confidence);
+
+ return results;
+}
diff --git a/ai-design-platform/src/services/sentiment/sentimentAnalyzer.ts b/ai-design-platform/src/services/sentiment/sentimentAnalyzer.ts
new file mode 100644
index 0000000..673a4f4
--- /dev/null
+++ b/ai-design-platform/src/services/sentiment/sentimentAnalyzer.ts
@@ -0,0 +1,286 @@
+/**
+ * Sentiment Analyzer Service - Emotion and sentiment detection
+ * Analyzes text for sentiment polarity and emotion classification
+ */
+
+export type SentimentType = 'positive' | 'negative' | 'neutral';
+
+export type EmotionType = 'joy' | 'sadness' | 'anger' | 'fear' | 'surprise' | 'neutral';
+
+export interface SentimentAnalysis {
+ sentiment: SentimentType;
+ score: number;
+ intensity: number;
+ confidence: number;
+}
+
+export interface EmotionAnalysis {
+ primaryEmotion: EmotionType;
+ emotions: EmotionScore[];
+ intensity: number;
+ confidence: number;
+}
+
+export interface EmotionScore {
+ emotion: EmotionType;
+ score: number;
+}
+
+interface SentimentLexicon {
+ positive: string[];
+ negative: string[];
+ intensifiers: string[];
+ negations: string[];
+}
+
+const SENTIMENT_LEXICON: SentimentLexicon = {
+ positive: [
+ 'good', 'great', 'excellent', 'amazing', 'wonderful', 'fantastic', 'love', 'like',
+ 'happy', 'joy', 'pleased', 'satisfied', 'perfect', 'awesome', 'brilliant', 'superb',
+ 'beautiful', 'delightful', 'enjoy', 'appreciate', 'thank', 'thanks', 'helpful',
+ 'useful', 'impressive', 'outstanding', 'remarkable', 'best', 'better', 'yes'
+ ],
+ negative: [
+ 'bad', 'terrible', 'awful', 'horrible', 'hate', 'dislike', 'poor', 'worst',
+ 'sad', 'angry', 'upset', 'disappointed', 'frustrated', 'annoyed', 'unhappy',
+ 'disgusted', 'useless', 'wrong', 'error', 'fail', 'failed', 'broken', 'issue',
+ 'problem', 'difficult', 'hard', 'confusing', 'complicated', 'no', 'not', 'never'
+ ],
+ intensifiers: [
+ 'very', 'extremely', 'really', 'so', 'quite', 'absolutely', 'completely',
+ 'totally', 'highly', 'incredibly', 'exceptionally', 'particularly'
+ ],
+ negations: [
+ 'not', 'no', 'never', 'neither', 'nobody', 'nothing', 'none', 'nowhere',
+ "don't", "doesn't", "didn't", "won't", "wouldn't", "can't", "couldn't"
+ ]
+};
+
+const EMOTION_KEYWORDS: Record = {
+ joy: [
+ 'happy', 'joy', 'joyful', 'delighted', 'pleased', 'cheerful', 'glad',
+ 'excited', 'thrilled', 'wonderful', 'amazing', 'fantastic', 'great',
+ 'love', 'enjoy', 'celebrate', 'fun', 'laugh', 'smile'
+ ],
+ sadness: [
+ 'sad', 'unhappy', 'depressed', 'disappointed', 'miserable', 'upset',
+ 'sorrowful', 'gloomy', 'blue', 'down', 'cry', 'crying', 'tears',
+ 'lonely', 'heartbroken', 'grieving', 'melancholy'
+ ],
+ anger: [
+ 'angry', 'mad', 'furious', 'rage', 'annoyed', 'irritated', 'frustrated',
+ 'outraged', 'hate', 'hatred', 'hostile', 'aggressive', 'resentful',
+ 'bitter', 'pissed', 'enraged', 'livid'
+ ],
+ fear: [
+ 'afraid', 'scared', 'frightened', 'terrified', 'fear', 'fearful', 'anxious',
+ 'worried', 'nervous', 'panic', 'dread', 'horror', 'alarmed', 'uneasy',
+ 'threatened', 'intimidated', 'insecure'
+ ],
+ surprise: [
+ 'surprised', 'amazed', 'astonished', 'shocked', 'stunned', 'startled',
+ 'unexpected', 'sudden', 'wow', 'incredible', 'unbelievable', 'amazing',
+ 'astounded', 'speechless'
+ ],
+ neutral: [
+ 'okay', 'ok', 'fine', 'normal', 'regular', 'standard', 'average',
+ 'moderate', 'typical', 'usual', 'ordinary'
+ ]
+};
+
+/**
+ * Normalize text for analysis
+ */
+function normalizeText(text: string): string[] {
+ return text
+ .toLowerCase()
+ .replace(/[^\w\s]/g, ' ')
+ .split(/\s+/)
+ .filter(word => word.length > 0);
+}
+
+/**
+ * Calculate sentiment score
+ */
+function calculateSentimentScore(words: string[]): { score: number; positiveCount: number; negativeCount: number } {
+ let score = 0;
+ let positiveCount = 0;
+ let negativeCount = 0;
+ let negationActive = false;
+ let intensifierMultiplier = 1;
+
+ for (let i = 0; i < words.length; i++) {
+ const word = words[i];
+
+ if (SENTIMENT_LEXICON.negations.includes(word)) {
+ negationActive = true;
+ continue;
+ }
+
+ if (SENTIMENT_LEXICON.intensifiers.includes(word)) {
+ intensifierMultiplier = 1.5;
+ continue;
+ }
+
+ let wordScore = 0;
+
+ if (SENTIMENT_LEXICON.positive.includes(word)) {
+ wordScore = 1 * intensifierMultiplier;
+ positiveCount++;
+ } else if (SENTIMENT_LEXICON.negative.includes(word)) {
+ wordScore = -1 * intensifierMultiplier;
+ negativeCount++;
+ }
+
+ if (negationActive && wordScore !== 0) {
+ wordScore *= -1;
+ negationActive = false;
+ }
+
+ score += wordScore;
+ intensifierMultiplier = 1;
+ }
+
+ return { score, positiveCount, negativeCount };
+}
+
+/**
+ * Analyze sentiment of text
+ */
+export function analyzeSentiment(text: string): SentimentAnalysis {
+ if (!text || text.trim().length === 0) {
+ return {
+ sentiment: 'neutral',
+ score: 0,
+ intensity: 0,
+ confidence: 0
+ };
+ }
+
+ const words = normalizeText(text);
+ const { score, positiveCount, negativeCount } = calculateSentimentScore(words);
+
+ const totalSentimentWords = positiveCount + negativeCount;
+ const normalizedScore = words.length > 0 ? score / words.length : 0;
+
+ let sentiment: SentimentType;
+ if (normalizedScore > 0.05) {
+ sentiment = 'positive';
+ } else if (normalizedScore < -0.05) {
+ sentiment = 'negative';
+ } else {
+ sentiment = 'neutral';
+ }
+
+ const intensity = Math.min(Math.abs(normalizedScore) * 2, 1);
+
+ const confidence = totalSentimentWords > 0
+ ? Math.min(totalSentimentWords / words.length * 2, 1)
+ : 0.5;
+
+ return {
+ sentiment,
+ score: normalizedScore,
+ intensity,
+ confidence
+ };
+}
+
+/**
+ * Detect emotions in text
+ */
+export function detectEmotion(text: string): EmotionAnalysis {
+ if (!text || text.trim().length === 0) {
+ return {
+ primaryEmotion: 'neutral',
+ emotions: [{ emotion: 'neutral', score: 1 }],
+ intensity: 0,
+ confidence: 0
+ };
+ }
+
+ const words = normalizeText(text);
+ const emotionScores: Record = {
+ joy: 0,
+ sadness: 0,
+ anger: 0,
+ fear: 0,
+ surprise: 0,
+ neutral: 0
+ };
+
+ for (const word of words) {
+ for (const [emotion, keywords] of Object.entries(EMOTION_KEYWORDS)) {
+ if (keywords.includes(word)) {
+ emotionScores[emotion as EmotionType] += 1;
+ }
+ }
+ }
+
+ const totalEmotionWords = Object.values(emotionScores).reduce((sum, count) => sum + count, 0);
+
+ if (totalEmotionWords === 0) {
+ emotionScores.neutral = 1;
+ }
+
+ const emotions: EmotionScore[] = (Object.entries(emotionScores) as [EmotionType, number][])
+ .map(([emotion, count]) => ({
+ emotion,
+ score: totalEmotionWords > 0 ? count / totalEmotionWords : (emotion === 'neutral' ? 1 : 0)
+ }))
+ .filter(e => e.score > 0)
+ .sort((a, b) => b.score - a.score);
+
+ const primaryEmotion = emotions[0].emotion;
+ const intensity = emotions[0].score;
+ const confidence = totalEmotionWords > 0
+ ? Math.min(totalEmotionWords / words.length * 2, 1)
+ : 0.5;
+
+ return {
+ primaryEmotion,
+ emotions,
+ intensity,
+ confidence
+ };
+}
+
+/**
+ * Get combined sentiment and emotion analysis
+ */
+export function analyzeText(text: string): {
+ sentiment: SentimentAnalysis;
+ emotion: EmotionAnalysis;
+} {
+ return {
+ sentiment: analyzeSentiment(text),
+ emotion: detectEmotion(text)
+ };
+}
+
+/**
+ * Check if text has specific emotion
+ */
+export function hasEmotion(text: string, emotion: EmotionType, threshold: number = 0.3): boolean {
+ const analysis = detectEmotion(text);
+ const emotionScore = analysis.emotions.find(e => e.emotion === emotion);
+ return emotionScore ? emotionScore.score >= threshold : false;
+}
+
+/**
+ * Check if text has specific sentiment
+ */
+export function hasSentiment(text: string, sentiment: SentimentType): boolean {
+ const analysis = analyzeSentiment(text);
+ return analysis.sentiment === sentiment;
+}
+
+/**
+ * Get sentiment intensity level
+ */
+export function getSentimentIntensity(text: string): 'low' | 'medium' | 'high' {
+ const analysis = analyzeSentiment(text);
+ if (analysis.intensity < 0.3) return 'low';
+ if (analysis.intensity < 0.7) return 'medium';
+ return 'high';
+}
diff --git a/ai-design-platform/src/services/speechService.ts b/ai-design-platform/src/services/speechService.ts
new file mode 100644
index 0000000..edce818
--- /dev/null
+++ b/ai-design-platform/src/services/speechService.ts
@@ -0,0 +1,351 @@
+/**
+ * Speech Service - Voice interaction system using Web Speech API
+ * Provides speech recognition and text-to-speech synthesis
+ */
+
+export type SpeechLanguage = 'en-US' | 'es-ES' | 'fr-FR' | 'de-DE' | 'zh-CN' | 'ja-JP' | 'hi-IN' | 'ar-SA' | 'pt-BR' | 'ru-RU';
+
+export interface VoiceSettings {
+ rate: number;
+ pitch: number;
+ volume: number;
+}
+
+export interface SpeechRecognitionResult {
+ transcript: string;
+ confidence: number;
+ isFinal: boolean;
+}
+
+interface SpeechRecognitionEvent extends Event {
+ results: SpeechRecognitionResultList;
+ resultIndex: number;
+}
+
+interface SpeechRecognitionResultList {
+ length: number;
+ item(index: number): SpeechRecognitionResult;
+ [index: number]: SpeechRecognitionAlternative[];
+}
+
+interface SpeechRecognitionAlternative {
+ transcript: string;
+ confidence: number;
+}
+
+interface SpeechRecognitionErrorEvent extends Event {
+ error: string;
+ message: string;
+}
+
+interface ISpeechRecognition extends EventTarget {
+ continuous: boolean;
+ interimResults: boolean;
+ lang: string;
+ maxAlternatives: number;
+ start(): void;
+ stop(): void;
+ abort(): void;
+}
+
+declare global {
+ interface Window {
+ SpeechRecognition: new () => ISpeechRecognition;
+ webkitSpeechRecognition: new () => ISpeechRecognition;
+ }
+}
+
+class SpeechService {
+ private recognition: ISpeechRecognition | null = null;
+ private synthesis: SpeechSynthesis | null = null;
+ private currentLanguage: SpeechLanguage = 'en-US';
+ private voiceSettings: VoiceSettings = {
+ rate: 1.0,
+ pitch: 1.0,
+ volume: 1.0
+ };
+ private isListening = false;
+ private silenceTimer: number | null = null;
+ private silenceTimeout = 3000;
+ private onResultCallback: ((result: SpeechRecognitionResult) => void) | null = null;
+ private onSilenceCallback: (() => void) | null = null;
+
+ constructor() {
+ this.initializeSpeechRecognition();
+ this.initializeSpeechSynthesis();
+ }
+
+ /**
+ * Initialize speech recognition
+ */
+ private initializeSpeechRecognition(): void {
+ if (!('SpeechRecognition' in window) && !('webkitSpeechRecognition' in window)) {
+ console.warn('Speech recognition not supported in this browser');
+ return;
+ }
+
+ const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
+ this.recognition = new SpeechRecognition();
+
+ if (this.recognition) {
+ this.recognition.continuous = true;
+ this.recognition.interimResults = true;
+ this.recognition.lang = this.currentLanguage;
+ this.recognition.maxAlternatives = 1;
+
+ this.recognition.addEventListener('result', this.handleSpeechResult.bind(this));
+ this.recognition.addEventListener('error', this.handleSpeechError.bind(this));
+ this.recognition.addEventListener('end', this.handleSpeechEnd.bind(this));
+ }
+ }
+
+ /**
+ * Initialize speech synthesis
+ */
+ private initializeSpeechSynthesis(): void {
+ if ('speechSynthesis' in window) {
+ this.synthesis = window.speechSynthesis;
+ } else {
+ console.warn('Speech synthesis not supported in this browser');
+ }
+ }
+
+ /**
+ * Handle speech recognition results
+ */
+ private handleSpeechResult(event: Event): void {
+ const speechEvent = event as SpeechRecognitionEvent;
+ this.resetSilenceTimer();
+
+ for (let i = speechEvent.resultIndex; i < speechEvent.results.length; i++) {
+ const result = speechEvent.results[i];
+ const transcript = result[0].transcript;
+ const confidence = result[0].confidence;
+ const isFinal = result.isFinal;
+
+ if (this.onResultCallback) {
+ this.onResultCallback({
+ transcript,
+ confidence,
+ isFinal
+ });
+ }
+ }
+ }
+
+ /**
+ * Handle speech recognition errors
+ */
+ private handleSpeechError(event: Event): void {
+ const errorEvent = event as SpeechRecognitionErrorEvent;
+ console.error('Speech recognition error:', errorEvent.error);
+
+ if (errorEvent.error === 'no-speech') {
+ this.triggerSilenceDetection();
+ }
+ }
+
+ /**
+ * Handle speech recognition end
+ */
+ private handleSpeechEnd(): void {
+ if (this.isListening && this.recognition) {
+ try {
+ this.recognition.start();
+ } catch (error) {
+ console.error('Error restarting recognition:', error);
+ this.isListening = false;
+ }
+ }
+ }
+
+ /**
+ * Reset silence detection timer
+ */
+ private resetSilenceTimer(): void {
+ if (this.silenceTimer) {
+ window.clearTimeout(this.silenceTimer);
+ }
+
+ this.silenceTimer = window.setTimeout(() => {
+ this.triggerSilenceDetection();
+ }, this.silenceTimeout);
+ }
+
+ /**
+ * Trigger silence detection callback
+ */
+ private triggerSilenceDetection(): void {
+ if (this.onSilenceCallback) {
+ this.onSilenceCallback();
+ }
+ }
+
+ /**
+ * Start listening for speech
+ */
+ public startListening(
+ onResult: (result: SpeechRecognitionResult) => void,
+ onSilence?: () => void
+ ): boolean {
+ if (!this.recognition) {
+ console.error('Speech recognition not available');
+ return false;
+ }
+
+ if (this.isListening) {
+ console.warn('Already listening');
+ return false;
+ }
+
+ this.onResultCallback = onResult;
+ this.onSilenceCallback = onSilence || null;
+
+ try {
+ this.recognition.start();
+ this.isListening = true;
+ this.resetSilenceTimer();
+ return true;
+ } catch (error) {
+ console.error('Error starting speech recognition:', error);
+ return false;
+ }
+ }
+
+ /**
+ * Stop listening for speech
+ */
+ public stopListening(): void {
+ if (!this.recognition || !this.isListening) {
+ return;
+ }
+
+ if (this.silenceTimer) {
+ window.clearTimeout(this.silenceTimer);
+ this.silenceTimer = null;
+ }
+
+ try {
+ this.recognition.stop();
+ this.isListening = false;
+ this.onResultCallback = null;
+ this.onSilenceCallback = null;
+ } catch (error) {
+ console.error('Error stopping speech recognition:', error);
+ }
+ }
+
+ /**
+ * Speak text using speech synthesis
+ */
+ public speak(text: string, options?: Partial): Promise {
+ return new Promise((resolve, reject) => {
+ if (!this.synthesis) {
+ reject(new Error('Speech synthesis not available'));
+ return;
+ }
+
+ if (!text.trim()) {
+ resolve();
+ return;
+ }
+
+ const utterance = new SpeechSynthesisUtterance(text);
+ const settings = { ...this.voiceSettings, ...options };
+
+ utterance.lang = this.currentLanguage;
+ utterance.rate = settings.rate;
+ utterance.pitch = settings.pitch;
+ utterance.volume = settings.volume;
+
+ const voices = this.synthesis.getVoices();
+ const preferredVoice = voices.find(voice => voice.lang.startsWith(this.currentLanguage.split('-')[0]));
+ if (preferredVoice) {
+ utterance.voice = preferredVoice;
+ }
+
+ utterance.onend = () => resolve();
+ utterance.onerror = (event) => reject(event);
+
+ this.synthesis.cancel();
+ this.synthesis.speak(utterance);
+ });
+ }
+
+ /**
+ * Set speech language
+ */
+ public setSpeechLanguage(language: SpeechLanguage): void {
+ this.currentLanguage = language;
+
+ if (this.recognition) {
+ const wasListening = this.isListening;
+ if (wasListening) {
+ this.stopListening();
+ }
+
+ this.recognition.lang = language;
+
+ if (wasListening && this.onResultCallback) {
+ this.startListening(this.onResultCallback, this.onSilenceCallback || undefined);
+ }
+ }
+ }
+
+ /**
+ * Set voice settings
+ */
+ public setVoiceSettings(settings: Partial): void {
+ this.voiceSettings = { ...this.voiceSettings, ...settings };
+ }
+
+ /**
+ * Get current language
+ */
+ public getCurrentLanguage(): SpeechLanguage {
+ return this.currentLanguage;
+ }
+
+ /**
+ * Get listening status
+ */
+ public getIsListening(): boolean {
+ return this.isListening;
+ }
+
+ /**
+ * Set silence timeout
+ */
+ public setSilenceTimeout(timeout: number): void {
+ this.silenceTimeout = timeout;
+ }
+}
+
+const speechService = new SpeechService();
+
+export const startListening = (
+ onResult: (result: SpeechRecognitionResult) => void,
+ onSilence?: () => void
+): boolean => speechService.startListening(onResult, onSilence);
+
+export const stopListening = (): void => speechService.stopListening();
+
+export const speak = (text: string, options?: Partial): Promise =>
+ speechService.speak(text, options);
+
+export const setSpeechLanguage = (language: SpeechLanguage): void =>
+ speechService.setSpeechLanguage(language);
+
+export const setVoiceSettings = (settings: Partial): void =>
+ speechService.setVoiceSettings(settings);
+
+export const getCurrentLanguage = (): SpeechLanguage =>
+ speechService.getCurrentLanguage();
+
+export const getIsListening = (): boolean =>
+ speechService.getIsListening();
+
+export const setSilenceTimeout = (timeout: number): void =>
+ speechService.setSilenceTimeout(timeout);
+
+export default speechService;
diff --git a/ai-design-platform/src/types/index.ts b/ai-design-platform/src/types/index.ts
new file mode 100644
index 0000000..0744f06
--- /dev/null
+++ b/ai-design-platform/src/types/index.ts
@@ -0,0 +1,129 @@
+// Core Types
+export interface User {
+ id: string;
+ email: string;
+ name: string;
+ role: 'admin' | 'manager' | 'developer' | 'viewer';
+ avatar?: string;
+ createdAt: Date;
+}
+
+export interface AIModel {
+ id: string;
+ name: string;
+ version: string;
+ status: 'active' | 'training' | 'deployed' | 'archived';
+ accuracy: number;
+ latency: number;
+ throughput: number;
+ createdAt: Date;
+ updatedAt: Date;
+}
+
+export interface SystemMetrics {
+ cpu: number;
+ memory: number;
+ gpu: number;
+ activeModels: number;
+ totalRequests: number;
+ avgLatency: number;
+}
+
+export interface AnalyticsData {
+ timestamp: Date;
+ requests: number;
+ latency: number;
+ accuracy: number;
+ throughput: number;
+}
+
+export interface TeamMember {
+ id: string;
+ name: string;
+ role: string;
+ avatar?: string;
+ status: 'online' | 'offline' | 'busy';
+ lastActive: Date;
+}
+
+export interface IndustryTemplate {
+ id: string;
+ name: string;
+ industry: string;
+ description: string;
+ models: string[];
+ roi: number;
+ timeline: string;
+ compliance: string[];
+ icon: string;
+}
+
+export interface Integration {
+ id: string;
+ name: string;
+ category: string;
+ description: string;
+ icon: string;
+ installed: boolean;
+ status: 'active' | 'inactive' | 'configuring';
+}
+
+export interface SecurityFramework {
+ id: string;
+ name: string;
+ status: 'compliant' | 'in-progress' | 'not-compliant';
+ progress: number;
+ lastAudit: Date;
+ controls: number;
+}
+
+export interface AIPersonality {
+ id: 'professional' | 'friendly' | 'teacher' | 'mentor';
+ name: string;
+ description: string;
+ traits: string[];
+}
+
+export interface ConversationMessage {
+ id: string;
+ role: 'user' | 'assistant';
+ content: string;
+ timestamp: Date;
+ emotion?: string;
+ language?: string;
+}
+
+export interface VoiceSettings {
+ alwaysOn: boolean;
+ voiceResponse: boolean;
+ personality: AIPersonality['id'];
+ language: string;
+ speechRate: number;
+ pitch: number;
+}
+
+export interface ROICalculation {
+ currentCost: number;
+ aiCost: number;
+ monthlySavings: number;
+ annualSavings: number;
+ productivity: number;
+ breakEven: number;
+}
+
+export interface Playbook {
+ id: string;
+ title: string;
+ description: string;
+ timeline: string;
+ steps: PlaybookStep[];
+ progress: number;
+}
+
+export interface PlaybookStep {
+ id: string;
+ title: string;
+ description: string;
+ completed: boolean;
+ resources: string[];
+}
diff --git a/ai-design-platform/tailwind.config.js b/ai-design-platform/tailwind.config.js
new file mode 100644
index 0000000..908d9d8
--- /dev/null
+++ b/ai-design-platform/tailwind.config.js
@@ -0,0 +1,30 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ "./index.html",
+ "./src/**/*.{js,ts,jsx,tsx}",
+ ],
+ theme: {
+ extend: {
+ colors: {
+ purple: {
+ 500: '#8B5CF6',
+ 600: '#7C3AED',
+ 700: '#6D28D9',
+ },
+ blue: {
+ 500: '#3B82F6',
+ 600: '#2563EB',
+ },
+ },
+ backgroundImage: {
+ 'gradient-purple': 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
+ 'gradient-blue': 'linear-gradient(135deg, #667eea 0%, #4299e1 100%)',
+ },
+ backdropBlur: {
+ xs: '2px',
+ },
+ },
+ },
+ plugins: [],
+}
diff --git a/ai-design-platform/tsconfig.app.json b/ai-design-platform/tsconfig.app.json
new file mode 100644
index 0000000..a0f3c3f
--- /dev/null
+++ b/ai-design-platform/tsconfig.app.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2022",
+ "useDefineForClassFields": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["vite/client"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["src"]
+}
diff --git a/ai-design-platform/tsconfig.json b/ai-design-platform/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/ai-design-platform/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/ai-design-platform/tsconfig.node.json b/ai-design-platform/tsconfig.node.json
new file mode 100644
index 0000000..8a67f62
--- /dev/null
+++ b/ai-design-platform/tsconfig.node.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2023",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/ai-design-platform/vite.config.ts b/ai-design-platform/vite.config.ts
new file mode 100644
index 0000000..8b0f57b
--- /dev/null
+++ b/ai-design-platform/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})