From 873efbe6470d27c49309f21f67c30f23baf792e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=A3?= Date: Wed, 7 Jan 2026 08:13:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E5=9E=8B=E8=AE=BE=E8=AE=A1=EF=BC=8C?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8F=90=E4=BA=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 24 + DEPLOYMENT.md | 555 ++ README.md | 185 + docs/finyx设计思路.docx | Bin 0 -> 31188 bytes ...FINYX-AI】数据资产产品规划-20260105-2.xlsx | Bin 0 -> 23069 bytes docs/界面优化方案.md | 421 ++ index.html | 13 + package-lock.json | 4534 +++++++++++++++++ package.json | 33 + postcss.config.js | 6 + src/App.tsx | 22 + src/components/ProgressBar.tsx | 20 + src/components/SidebarItem.tsx | 21 + src/components/TableCheckItem.tsx | 18 + src/data/mockData.ts | 119 + src/finyx_designV2.tsx | 1431 ++++++ src/index.css | 3 + src/layouts/MainLayout.tsx | 57 + src/layouts/Sidebar.tsx | 60 + src/main.tsx | 10 + src/pages/DashboardView.tsx | 150 + src/pages/EngagementView.tsx | 180 + src/pages/ProjectListView.tsx | 147 + src/pages/engagement/ContextStep.tsx | 133 + src/pages/engagement/DeliveryStep.tsx | 406 ++ src/pages/engagement/InventoryStep.tsx | 419 ++ src/pages/engagement/SetupStep.tsx | 162 + src/pages/engagement/ValueStep.tsx | 126 + src/types/index.ts | 55 + tailwind.config.js | 26 + tsconfig.json | 25 + tsconfig.node.json | 10 + vite.config.ts | 17 + 33 files changed, 9388 insertions(+) create mode 100644 .gitignore create mode 100644 DEPLOYMENT.md create mode 100644 README.md create mode 100644 docs/finyx设计思路.docx create mode 100644 docs/【FINYX-AI】数据资产产品规划-20260105-2.xlsx create mode 100644 docs/界面优化方案.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/App.tsx create mode 100644 src/components/ProgressBar.tsx create mode 100644 src/components/SidebarItem.tsx create mode 100644 src/components/TableCheckItem.tsx create mode 100644 src/data/mockData.ts create mode 100644 src/finyx_designV2.tsx create mode 100644 src/index.css create mode 100644 src/layouts/MainLayout.tsx create mode 100644 src/layouts/Sidebar.tsx create mode 100644 src/main.tsx create mode 100644 src/pages/DashboardView.tsx create mode 100644 src/pages/EngagementView.tsx create mode 100644 src/pages/ProjectListView.tsx create mode 100644 src/pages/engagement/ContextStep.tsx create mode 100644 src/pages/engagement/DeliveryStep.tsx create mode 100644 src/pages/engagement/InventoryStep.tsx create mode 100644 src/pages/engagement/SetupStep.tsx create mode 100644 src/pages/engagement/ValueStep.tsx create mode 100644 src/types/index.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.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/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..7dc9df4 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,555 @@ +# 部署与运行说明文档 + +本文档详细说明 Finyx AI Prototype 项目的部署和运行流程。 + +## 📋 目录 + +- [环境准备](#环境准备) +- [本地开发](#本地开发) +- [生产构建](#生产构建) +- [部署方式](#部署方式) + - [静态文件部署](#静态文件部署) + - [Docker 部署](#docker-部署) + - [Nginx 配置](#nginx-配置) +- [环境变量配置](#环境变量配置) +- [常见问题](#常见问题) + +## 🔧 环境准备 + +### 系统要求 + +- **操作系统**: Linux / macOS / Windows +- **Node.js**: >= 16.0.0 (推荐使用 LTS 版本) +- **npm**: >= 7.0.0 或 **yarn**: >= 1.22.0 +- **内存**: 至少 2GB 可用内存 +- **磁盘空间**: 至少 500MB 可用空间 + +### 检查环境 + +```bash +# 检查 Node.js 版本 +node -v +# 应显示 v16.x.x 或更高版本 + +# 检查 npm 版本 +npm -v +# 应显示 7.x.x 或更高版本 +``` + +### 安装 Node.js(如未安装) + +#### Linux (Ubuntu/Debian) +```bash +# 使用 NodeSource 仓库安装 +curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - +sudo apt-get install -y nodejs +``` + +#### macOS +```bash +# 使用 Homebrew +brew install node +``` + +#### Windows +从 [Node.js 官网](https://nodejs.org/) 下载安装包并安装 + +## 💻 本地开发 + +### 1. 克隆项目 + +```bash +git clone +cd finyx_data_frontend +``` + +### 2. 安装依赖 + +```bash +npm install +``` + +如果安装速度慢,可以使用国内镜像: + +```bash +# 使用淘宝镜像 +npm install --registry=https://registry.npmmirror.com + +# 或使用 cnpm +npm install -g cnpm --registry=https://registry.npmmirror.com +cnpm install +``` + +### 3. 启动开发服务器 + +```bash +npm run dev +``` + +启动成功后,终端会显示: + +``` + VITE v5.x.x ready in xxx ms + + ➜ Local: http://localhost:5173/ + ➜ Network: http://192.168.x.x:5173/ +``` + +可以通过以下方式访问: +- **本地访问**: `http://localhost:5173` +- **局域网访问**: 使用终端显示的 Network 地址(例如:`http://192.168.1.100:5173`) + +**注意**: 开发服务器已配置为允许外部访问,可以通过局域网 IP 地址访问,方便移动设备测试或远程调试。 + +### 4. 开发模式特性 + +- **热模块替换 (HMR)**: 代码修改后自动刷新 +- **快速构建**: Vite 提供极速的开发体验 +- **TypeScript 支持**: 实时类型检查 +- **ESLint 检查**: 代码质量检查 + +### 5. 修改端口和主机配置(如需要) + +如果 5173 端口被占用,可以通过以下方式修改: + +**方式一:命令行参数** +```bash +# 修改端口 +npm run dev -- --port 3000 + +# 指定主机(允许外部访问) +npm run dev -- --host 0.0.0.0 --port 3000 +``` + +**方式二:修改 vite.config.ts** +```typescript +export default defineConfig({ + server: { + host: '0.0.0.0', // 允许外部访问 + port: 3000, // 自定义端口 + strictPort: false, // 端口被占用时自动尝试下一个 + } +}) +``` + +**获取本机 IP 地址**: +```bash +# Linux/macOS +ip addr show | grep "inet " | grep -v 127.0.0.1 +# 或 +ifconfig | grep "inet " | grep -v 127.0.0.1 + +# Windows +ipconfig +# 查找 IPv4 地址 +``` + +## 🏗️ 生产构建 + +### 1. 构建生产版本 + +```bash +npm run build +``` + +构建完成后,会在 `dist/` 目录生成优化后的静态文件: + +``` +dist/ +├── index.html +├── assets/ +│ ├── index-[hash].js +│ ├── index-[hash].css +│ └── ... +``` + +### 2. 预览生产构建 + +在部署前,可以本地预览生产版本: + +```bash +npm run preview +``` + +访问 `http://localhost:4173` 查看预览效果。 + +### 3. 构建优化 + +生产构建已自动启用以下优化: +- 代码压缩和混淆 +- Tree-shaking(移除未使用代码) +- 资源压缩(CSS、JS) +- 代码分割(按需加载) + +## 🚀 部署方式 + +### 静态文件部署 + +#### 方式一:直接部署 dist 目录 + +1. **构建项目** + ```bash + npm run build + ``` + +2. **上传 dist 目录** + 将 `dist/` 目录下的所有文件上传到 Web 服务器 + +3. **配置 Web 服务器** + 参考下面的 [Nginx 配置](#nginx-配置) + +#### 方式二:使用 CI/CD 自动部署 + +**GitHub Actions 示例** (`.github/workflows/deploy.yml`): + +```yaml +name: Deploy + +on: + push: + branches: [ main ] + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Install dependencies + run: npm install + + - name: Build + run: npm run build + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist +``` + +### Docker 部署 + +#### 1. 创建 Dockerfile + +在项目根目录创建 `Dockerfile`: + +```dockerfile +# 构建阶段 +FROM node:18-alpine AS builder + +WORKDIR /app + +# 复制 package 文件 +COPY package*.json ./ + +# 安装依赖 +RUN npm ci + +# 复制源代码 +COPY . . + +# 构建应用 +RUN npm run build + +# 生产阶段 +FROM nginx:alpine + +# 复制构建产物到 nginx +COPY --from=builder /app/dist /usr/share/nginx/html + +# 复制 nginx 配置 +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] +``` + +#### 2. 创建 .dockerignore + +``` +node_modules +dist +.git +.env +*.log +.DS_Store +``` + +#### 3. 构建和运行 Docker 容器 + +```bash +# 构建镜像 +docker build -t finyx-frontend . + +# 运行容器 +docker run -d -p 80:80 --name finyx-app finyx-frontend +``` + +#### 4. 使用 Docker Compose + +创建 `docker-compose.yml`: + +```yaml +version: '3.8' + +services: + frontend: + build: . + ports: + - "80:80" + restart: unless-stopped + volumes: + - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro +``` + +运行: +```bash +docker-compose up -d +``` + +### Nginx 配置 + +创建 `nginx.conf` 文件: + +```nginx +server { + listen 80; + server_name your-domain.com; + root /usr/share/nginx/html; + index index.html; + + # Gzip 压缩 + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; + + # 静态资源缓存 + location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # SPA 路由支持 + location / { + try_files $uri $uri/ /index.html; + } + + # 安全头 + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # 错误页面 + error_page 404 /index.html; +} +``` + +部署到服务器: + +```bash +# 复制配置文件 +sudo cp nginx.conf /etc/nginx/sites-available/finyx-frontend + +# 创建软链接 +sudo ln -s /etc/nginx/sites-available/finyx-frontend /etc/nginx/sites-enabled/ + +# 测试配置 +sudo nginx -t + +# 重启 Nginx +sudo systemctl restart nginx +``` + +## 🔐 环境变量配置 + +### 开发环境 + +创建 `.env.development`: + +```env +VITE_API_BASE_URL=http://localhost:3000/api +VITE_APP_TITLE=Finyx AI Prototype (Dev) +``` + +### 生产环境 + +创建 `.env.production`: + +```env +VITE_API_BASE_URL=https://api.yourdomain.com +VITE_APP_TITLE=Finyx AI Prototype +``` + +### 使用环境变量 + +在代码中使用: + +```typescript +const apiUrl = import.meta.env.VITE_API_BASE_URL; +``` + +**注意**: Vite 要求环境变量必须以 `VITE_` 开头才能在客户端代码中访问。 + +## ❓ 常见问题 + +### 1. 端口被占用 + +**问题**: `Error: Port 5173 is already in use` + +**解决方案**: +```bash +# 查找占用端口的进程 +lsof -i :5173 # macOS/Linux +netstat -ano | findstr :5173 # Windows + +# 杀死进程或使用其他端口 +npm run dev -- --port 3000 +``` + +### 1.1 无法通过 IP 地址访问 + +**问题**: 只能通过 localhost 访问,无法通过局域网 IP 地址访问 + +**解决方案**: +1. **检查配置**: 确保 `vite.config.ts` 中 `server.host` 设置为 `'0.0.0.0'`(已默认配置) +2. **检查防火墙**: 确保防火墙允许端口访问 + ```bash + # Ubuntu/Debian + sudo ufw allow 5173/tcp + sudo ufw reload + + # CentOS/RHEL + sudo firewall-cmd --add-port=5173/tcp --permanent + sudo firewall-cmd --reload + + # macOS (如果启用了防火墙) + # 系统偏好设置 > 安全性与隐私 > 防火墙 > 防火墙选项 + ``` +3. **检查网络**: 确保设备在同一局域网内 +4. **获取本机 IP**: + ```bash + # Linux/macOS + ip addr show | grep "inet " | grep -v 127.0.0.1 + # 或 + hostname -I # Linux + ifconfig | grep "inet " | grep -v 127.0.0.1 # macOS + + # Windows + ipconfig + # 查找 IPv4 地址(通常是 192.168.x.x 或 10.x.x.x) + ``` +5. **使用 Network 地址**: 启动开发服务器后,终端会显示 Network 地址,使用该地址访问 + +### 2. 依赖安装失败 + +**问题**: `npm install` 失败或很慢 + +**解决方案**: +```bash +# 清除 npm 缓存 +npm cache clean --force + +# 删除 node_modules 和 package-lock.json 重新安装 +rm -rf node_modules package-lock.json +npm install + +# 或使用国内镜像 +npm install --registry=https://registry.npmmirror.com +``` + +### 3. 构建失败 + +**问题**: `npm run build` 报错 + +**解决方案**: +- 检查 Node.js 版本是否符合要求 +- 清除缓存和依赖重新安装 +- 检查 TypeScript 类型错误:`npm run lint` + +### 4. 路由刷新 404 + +**问题**: 刷新页面后出现 404 + +**解决方案**: +确保 Web 服务器配置了 SPA 路由支持(参考上面的 Nginx 配置) + +### 5. 跨域问题 + +**问题**: 开发时 API 请求跨域 + +**解决方案**: 在 `vite.config.ts` 中配置代理: + +```typescript +export default defineConfig({ + server: { + proxy: { + '/api': { + target: 'http://localhost:3000', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + } + } +}) +``` + +### 6. 内存不足 + +**问题**: 构建时内存溢出 + +**解决方案**: +```bash +# 增加 Node.js 内存限制 +NODE_OPTIONS="--max-old-space-size=4096" npm run build +``` + +## 📊 性能优化建议 + +### 1. 代码分割 +- 使用 React.lazy() 进行路由级别的代码分割 +- 按需加载大型组件库 + +### 2. 资源优化 +- 压缩图片资源 +- 使用 WebP 格式 +- 启用 CDN 加速静态资源 + +### 3. 缓存策略 +- 配置合理的 HTTP 缓存头 +- 使用 Service Worker 进行离线缓存 + +### 4. 监控和分析 +- 集成性能监控工具(如 Sentry) +- 使用 Web Vitals 监控核心指标 + +## 🔍 健康检查 + +部署后,可以通过以下方式检查应用状态: + +```bash +# 检查 HTTP 响应 +curl -I http://your-domain.com + +# 检查页面内容 +curl http://your-domain.com | head -20 +``` + +## 📞 技术支持 + +如遇到部署问题,请: +1. 查看本文档的常见问题部分 +2. 检查服务器日志 +3. 联系开发团队获取支持 + +--- + +**最后更新**: 2024年 +**文档版本**: 1.0.0 diff --git a/README.md b/README.md new file mode 100644 index 0000000..678ff1c --- /dev/null +++ b/README.md @@ -0,0 +1,185 @@ +# Finyx AI Prototype + +一个现代化的数据资产盘点与价值挖掘平台前端应用,基于 React + TypeScript + Tailwind CSS 构建。 + +## 📋 项目简介 + +Finyx AI Prototype 是一个企业级数据资产管理平台,提供以下核心功能: + +- **指挥中心 (Dashboard)**: 全局项目概览、风险监控、KPI 指标展示 +- **项目列表 (Projects)**: 项目全生命周期管理,支持搜索、筛选、状态跟踪 +- **项目作业台 (Engagement Workspace)**: 多步骤工作流,包括: + - 项目配置:行业模板选择、历史资产继承 + - 数据盘点:支持多种数据源接入方案(文档导入、SQL 脚本、业务表导入) + - 背景调研:企业数字化现状调研、存量应用场景分析 + - 价值挖掘:潜在场景挖掘、存量应用优化建议 + - 成果交付:交付物打包下载、审计锁定 + +## 🚀 技术栈 + +- **前端框架**: React 18.2.0 +- **开发语言**: TypeScript 5.2.2 +- **构建工具**: Vite 5.0.8 +- **样式方案**: Tailwind CSS 3.3.6 +- **图标库**: Lucide React 0.344.0 +- **图表库**: Recharts 2.10.3 + +## 📁 项目结构 + +``` +src/ +├── App.tsx # 主应用入口,状态管理 +├── components/ # 通用可复用组件 +│ ├── ProgressBar.tsx # 进度条组件 +│ ├── SidebarItem.tsx # 侧边栏菜单项 +│ └── TableCheckItem.tsx # 表格复选框项 +├── data/ # 模拟数据 +│ └── mockData.ts # 项目、风险、盘点等模拟数据 +├── layouts/ # 布局组件 +│ ├── MainLayout.tsx # 主布局容器 +│ └── Sidebar.tsx # 侧边栏布局 +├── pages/ # 页面组件 +│ ├── DashboardView.tsx # 指挥中心视图 +│ ├── ProjectListView.tsx # 项目列表视图 +│ ├── EngagementView.tsx # 项目作业台主视图 +│ └── engagement/ # 项目作业步骤组件 +│ ├── SetupStep.tsx # 项目配置步骤 +│ ├── InventoryStep.tsx # 数据盘点步骤 +│ ├── ContextStep.tsx # 背景调研步骤 +│ ├── ValueStep.tsx # 价值挖掘步骤 +│ └── DeliveryStep.tsx # 成果交付步骤 +└── types/ # TypeScript 类型定义 + └── index.ts # 全局类型定义 +``` + +## 🛠️ 开发指南 + +### 环境要求 + +- Node.js >= 16.0.0 +- npm >= 7.0.0 或 yarn >= 1.22.0 + +### 安装依赖 + +```bash +npm install +``` + +### 开发模式 + +```bash +npm run dev +``` + +启动后可以通过以下方式访问: +- **本地访问**: `http://localhost:5173` +- **局域网访问**: `http://<你的IP地址>:5173`(例如:`http://192.168.1.100:5173`) + +**注意**: 开发服务器已配置为允许外部访问(`0.0.0.0`),可以通过局域网 IP 地址访问,方便移动设备或远程调试。 + +### 构建生产版本 + +```bash +npm run build +``` + +构建产物将输出到 `dist/` 目录 + +### 预览生产构建 + +```bash +npm run preview +``` + +### 代码检查 + +```bash +npm run lint +``` + +## 🎨 功能特性 + +### 1. 指挥中心 +- 实时 KPI 指标展示 +- 项目作业全景视图 +- 风险雷达预警系统 + +### 2. 项目列表 +- 项目搜索与筛选 +- 进度可视化 +- 快速创建新项目 + +### 3. 项目作业台 +- **多步骤工作流**: 5 个主要步骤,支持步骤间导航 +- **数据盘点方案**: + - 方案一:已有文档导入(Excel/Word) + - 方案二:IT 脚本提取(SQL) + - 方案三:业务关键表导入(SaaS 系统) +- **AI 智能分析**: 自动识别 PII、重要数据、生成业务含义 +- **场景挖掘**: AI 推荐潜在数据应用场景 +- **优化建议**: 基于存量应用的 AI 诊断与优化建议 + +### 4. 演示模式 +- 全屏演示视图 +- 隐藏侧边栏和导航 +- 适合客户演示和汇报 + +## 📝 代码规范 + +- 使用 TypeScript 进行类型检查 +- 遵循 React Hooks 最佳实践 +- 组件采用函数式组件 + Hooks +- 使用 Tailwind CSS 进行样式管理 +- 组件职责单一,便于维护和测试 + +## 🔧 配置说明 + +### Vite 配置 +项目使用 Vite 作为构建工具,配置文件位于 `vite.config.ts` + +### Tailwind CSS 配置 +Tailwind 配置文件位于 `tailwind.config.js`,可根据需要自定义主题和样式 + +### TypeScript 配置 +TypeScript 配置位于 `tsconfig.json`,已优化用于 React 开发 + +## 📦 依赖说明 + +### 核心依赖 +- `react` / `react-dom`: React 核心库 +- `lucide-react`: 图标库 +- `recharts`: 图表库(当前未使用,但已安装) + +### 开发依赖 +- `@vitejs/plugin-react`: Vite React 插件 +- `typescript`: TypeScript 编译器 +- `tailwindcss`: Tailwind CSS 框架 +- `eslint`: 代码检查工具 + +## 🐛 已知问题 + +- 当前使用模拟数据,需要对接后端 API +- 文件上传功能为 UI 展示,需要实现实际的上传逻辑 +- 部分交互功能(如场景选择、文件删除)需要完善状态管理 + +## 🔮 后续计划 + +- [ ] 集成后端 API +- [ ] 实现文件上传功能 +- [ ] 添加路由管理(React Router) +- [ ] 实现状态管理(Redux/Zustand) +- [ ] 添加单元测试和集成测试 +- [ ] 优化移动端适配 +- [ ] 添加国际化支持 + +## 📄 许可证 + +本项目为内部项目,版权归 Finyx 所有。 + +## 👥 贡献者 + +- 开发团队:Finyx AI Team + +## 📞 联系方式 + +如有问题或建议,请联系开发团队。 diff --git a/docs/finyx设计思路.docx b/docs/finyx设计思路.docx new file mode 100644 index 0000000000000000000000000000000000000000..361ef7fb6328855d16095e2bec837c3fc8dd9e7f GIT binary patch literal 31188 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 literal 0 HcmV?d00001 diff --git a/docs/【FINYX-AI】数据资产产品规划-20260105-2.xlsx b/docs/【FINYX-AI】数据资产产品规划-20260105-2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3ff48732dad259ce1f830a66177bdf3024eff994 GIT binary patch literal 23069 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 literal 0 HcmV?d00001 diff --git a/docs/界面优化方案.md b/docs/界面优化方案.md new file mode 100644 index 0000000..9929bf7 --- /dev/null +++ b/docs/界面优化方案.md @@ -0,0 +1,421 @@ +# Finyx AI 界面优化方案 + +## 📋 文档说明 + +本文档基于 Finyx 设计思路文档和当前代码实现,提出系统性的界面优化方案,旨在提升用户体验、增强功能可用性和视觉一致性。 + +--- + +## 🎯 优化目标 + +1. **提升用户体验**:简化操作流程,减少认知负担 +2. **增强视觉一致性**:统一设计语言,优化视觉层次 +3. **改善信息架构**:优化信息展示,提升可读性 +4. **强化交互反馈**:增强操作反馈,提升响应性 +5. **优化移动端适配**:提升多设备兼容性 + +--- + +## 📊 当前界面分析 + +### 优势 +- ✅ 清晰的步骤式工作流设计 +- ✅ 良好的组件化架构 +- ✅ 统一的色彩体系(Slate/Blue) +- ✅ 响应式布局基础 + +### 待优化点 +- ⚠️ 部分页面信息密度过高 +- ⚠️ 交互反馈不够明显 +- ⚠️ 部分功能入口不够直观 +- ⚠️ 数据可视化能力有限 +- ⚠️ 移动端体验待优化 + +--- + +## 🎨 优化方案 + +### 1. 指挥中心 (Dashboard) 优化 + +#### 1.1 KPI 卡片优化 +**当前问题**: +- KPI 卡片信息展示较为静态 +- 缺少趋势指示和对比数据 + +**优化方案**: +```typescript +// 建议增强 KPI 卡片 +- 添加趋势箭头(↑↓)和百分比变化 +- 增加迷你图表(Sparkline)展示趋势 +- 添加点击展开详情功能 +- 支持自定义 KPI 卡片排序 +``` + +**视觉优化**: +- 增加卡片悬停效果(轻微阴影提升) +- 添加加载动画(骨架屏) +- 优化图标与数字的视觉平衡 + +#### 1.2 项目作业全景表优化 +**当前问题**: +- 表格信息密度高,可读性一般 +- 缺少快速筛选和排序功能 + +**优化方案**: +- 添加表格列筛选器(状态、负责人、进度范围) +- 支持列排序(点击表头) +- 增加表格视图切换(列表/卡片) +- 添加批量操作功能(如批量导出) +- 优化进度条显示(添加阶段标签) + +#### 1.3 风险雷达优化 +**当前问题**: +- 风险信息展示较为单一 +- 缺少风险等级分类和优先级排序 + +**优化方案**: +- 添加风险等级标签(高/中/低) +- 支持按风险等级筛选 +- 增加风险趋势图表 +- 添加风险详情展开面板 +- 优化风险卡片视觉层次(颜色区分等级) + +--- + +### 2. 项目列表 (Projects) 优化 + +#### 2.1 搜索与筛选优化 +**当前问题**: +- 搜索功能单一,仅支持文本搜索 +- 缺少高级筛选器 + +**优化方案**: +- 添加高级筛选面板(项目状态、类型、负责人、日期范围) +- 支持保存筛选条件(常用筛选器) +- 添加搜索建议和自动补全 +- 支持多条件组合筛选 + +#### 2.2 项目卡片/列表视图优化 +**当前问题**: +- 仅支持表格视图,信息展示单一 + +**优化方案**: +- 添加卡片视图切换(Grid/List) +- 卡片视图显示项目缩略图/图标 +- 优化项目状态标签(颜色编码) +- 添加项目快速预览(悬停显示详情) + +#### 2.3 批量操作优化 +**当前问题**: +- 缺少批量操作功能 + +**优化方案**: +- 添加全选/反选功能 +- 支持批量删除、批量导出 +- 批量修改项目状态 +- 添加操作确认对话框 + +--- + +### 3. 项目作业台 (Engagement Workspace) 优化 + +#### 3.1 步骤导航器优化 +**当前问题**: +- 步骤导航器在演示模式下隐藏,但缺少快速跳转 +- 步骤状态反馈不够明显 + +**优化方案**: +- 添加步骤进度百分比显示 +- 支持键盘快捷键导航(← →) +- 添加步骤完成时间戳 +- 优化步骤间的连接线动画 +- 添加步骤提示气泡(Tooltip) + +#### 3.2 项目配置步骤 (SetupStep) 优化 +**当前问题**: +- 行业选择界面信息密度高 +- 缺少行业模板预览 + +**优化方案**: +- 优化行业选择为标签云或卡片式布局 +- 添加行业模板预览功能 +- 支持行业搜索和筛选 +- 添加历史项目模板快速导入 +- 优化表单验证反馈(实时验证) + +#### 3.3 数据盘点步骤 (InventoryStep) 优化 +**当前问题**: +- 方案选择界面缺少方案对比 +- 处理过程缺少详细进度信息 + +**优化方案**: +- 添加方案对比表格(功能对比) +- 优化处理进度显示(百分比 + 详细步骤) +- 添加处理日志查看功能 +- 支持处理中断和恢复 +- 优化结果表格(支持列宽调整、排序、筛选) + +**方案选择优化**: +```typescript +// 建议添加方案对比卡片 +- 方案一:已有文档导入 + ✓ 支持格式:Excel, Word + ✓ 处理速度:快 + ✓ 准确度:高(需文档规范) + ⚠️ 适用场景:有完整文档的企业 + +- 方案二:IT 脚本提取 + ✓ 支持格式:SQL 脚本 + ✓ 处理速度:中等 + ✓ 准确度:高 + ⚠️ 适用场景:有 IT 支持但无文档 + +- 方案三:业务关键表导入 + ✓ 支持格式:Excel, CSV + ✓ 处理速度:快 + ✓ 准确度:中等(需人工识别) + ⚠️ 适用场景:SaaS 系统/无数据库权限 +``` + +#### 3.4 背景调研步骤 (ContextStep) 优化 +**当前问题**: +- 表单字段较多,缺少分组 +- 存量场景添加流程不够直观 + +**优化方案**: +- 添加表单分组和折叠面板 +- 优化存量场景列表(支持拖拽排序) +- 添加场景模板库(快速添加常见场景) +- 支持场景导入/导出 +- 添加表单自动保存功能 + +#### 3.5 价值挖掘步骤 (ValueStep) 优化 +**当前问题**: +- 场景卡片信息展示有限 +- 缺少场景对比功能 + +**优化方案**: +- 添加场景详情展开面板 +- 支持场景对比(并排对比) +- 添加场景筛选(按类型、影响度) +- 优化场景卡片布局(响应式网格) +- 添加场景收藏功能 + +#### 3.6 成果交付步骤 (DeliveryStep) 优化 +**当前问题**: +- 交付物列表缺少预览缩略图 +- 下载功能缺少进度提示 + +**优化方案**: +- 添加交付物预览缩略图 +- 优化下载进度显示(进度条) +- 支持批量下载(ZIP 打包) +- 添加交付物版本管理 +- 优化报告查看器(支持全屏、缩放) + +--- + +### 4. 通用组件优化 + +#### 4.1 侧边栏 (Sidebar) 优化 +**当前问题**: +- 侧边栏功能入口较少 +- 缺少快速操作入口 + +**优化方案**: +- 添加常用功能快捷入口 +- 支持侧边栏折叠/展开 +- 添加最近访问项目列表 +- 优化用户信息展示(头像、角色) + +#### 4.2 进度条组件 (ProgressBar) 优化 +**当前问题**: +- 进度条样式较为单一 +- 缺少阶段标签 + +**优化方案**: +- 添加阶段标签显示 +- 支持不同状态样式(进行中/已完成/已暂停) +- 添加动画效果(平滑过渡) +- 支持点击跳转到对应阶段 + +#### 4.3 表格组件优化 +**当前问题**: +- 表格功能较为基础 +- 缺少高级功能 + +**优化方案**: +- 添加列宽调整功能 +- 支持列显示/隐藏 +- 添加表格导出功能(Excel/CSV) +- 优化表格响应式布局 +- 添加虚拟滚动(大数据量优化) + +--- + +### 5. 视觉设计优化 + +#### 5.1 色彩系统优化 +**当前方案**: +- 主色:Slate(灰色系)+ Blue(蓝色系) +- 功能色:Green(成功)、Red(警告)、Amber(注意) + +**优化建议**: +- 建立完整的色彩语义系统 +- 添加色彩对比度检查(确保可访问性) +- 优化深色模式支持(未来考虑) + +#### 5.2 字体与排版优化 +**当前问题**: +- 字体层次不够明显 +- 部分文本可读性待提升 + +**优化方案**: +- 建立字体层级系统(标题/正文/辅助文本) +- 优化行高和字间距 +- 添加文本截断和展开功能 +- 优化代码块显示(等宽字体) + +#### 5.3 图标系统优化 +**当前方案**: +- 使用 Lucide React 图标库 + +**优化建议**: +- 统一图标尺寸规范 +- 添加图标悬停效果 +- 优化图标与文本的对齐 +- 考虑添加自定义图标(品牌标识) + +#### 5.4 动画与过渡优化 +**当前问题**: +- 动画效果较少 +- 页面切换缺少过渡 + +**优化方案**: +- 添加页面切换动画(淡入淡出) +- 优化按钮点击反馈(涟漪效果) +- 添加加载动画(骨架屏) +- 优化表单验证动画(错误提示) + +--- + +### 6. 交互体验优化 + +#### 6.1 键盘快捷键支持 +**优化方案**: +```typescript +// 建议添加快捷键 +- Cmd/Ctrl + K: 全局搜索 +- Cmd/Ctrl + N: 新建项目 +- Cmd/Ctrl + S: 保存(表单) +- Esc: 关闭弹窗/返回 +- ← →: 步骤导航 +- /: 聚焦搜索框 +``` + +#### 6.2 操作反馈优化 +**优化方案**: +- 添加 Toast 通知(成功/错误/警告) +- 优化按钮加载状态(禁用 + 加载图标) +- 添加操作确认对话框(危险操作) +- 优化表单验证反馈(实时验证 + 错误提示) + +#### 6.3 空状态优化 +**当前问题**: +- 部分页面缺少空状态提示 + +**优化方案**: +- 添加友好的空状态插画 +- 提供空状态操作建议 +- 优化加载状态(骨架屏) + +--- + +### 7. 响应式设计优化 + +#### 7.1 移动端适配 +**当前问题**: +- 移动端体验待优化 + +**优化方案**: +- 优化侧边栏(移动端改为抽屉式) +- 优化表格(移动端改为卡片式) +- 添加移动端底部导航栏 +- 优化触摸交互(增大点击区域) + +#### 7.2 平板端适配 +**优化方案**: +- 优化网格布局(自适应列数) +- 优化侧边栏宽度 +- 优化表格显示(支持横向滚动) + +--- + +### 8. 性能优化 + +#### 8.1 加载性能 +**优化方案**: +- 添加代码分割(路由级别) +- 优化图片加载(懒加载) +- 添加骨架屏(减少感知加载时间) +- 优化首屏渲染(关键 CSS 内联) + +#### 8.2 运行时性能 +**优化方案**: +- 优化大数据量渲染(虚拟滚动) +- 添加防抖/节流(搜索、滚动) +- 优化状态管理(避免不必要的重渲染) +- 添加性能监控(Web Vitals) + +--- + +## 📝 实施建议 + +### 阶段一:核心体验优化(优先级:高) +1. ✅ 优化步骤导航器(添加进度百分比) +2. ✅ 优化数据盘点结果表格(列宽调整、排序) +3. ✅ 添加操作反馈(Toast 通知) +4. ✅ 优化表单验证(实时验证) + +### 阶段二:功能增强(优先级:中) +1. ✅ 添加高级筛选功能 +2. ✅ 优化项目列表(卡片/列表视图切换) +3. ✅ 添加批量操作功能 +4. ✅ 优化交付物预览 + +### 阶段三:体验提升(优先级:中低) +1. ✅ 添加键盘快捷键 +2. ✅ 优化动画和过渡 +3. ✅ 移动端适配优化 +4. ✅ 性能优化 + +--- + +## 🎯 设计原则 + +1. **一致性**:保持设计语言和交互模式的一致性 +2. **简洁性**:减少不必要的视觉元素,突出核心功能 +3. **可访问性**:确保色彩对比度、键盘导航等可访问性要求 +4. **响应性**:优化多设备体验,确保良好的响应式布局 +5. **反馈性**:及时、清晰的用户操作反馈 + +--- + +## 📚 参考资源 + +- [Material Design Guidelines](https://material.io/design) +- [Ant Design Design Principles](https://ant.design/docs/spec/introduce) +- [Tailwind CSS Design System](https://tailwindcss.com/docs) +- [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/WAI/WCAG21/quickref/) + +--- + +## 📅 更新记录 + +- **2025-01-XX**: 初始版本创建 + +--- + +## 👥 贡献者 + +- Finyx AI Team diff --git a/index.html b/index.html new file mode 100644 index 0000000..04ed60b --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Finyx Frontend + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b3d56c6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4534 @@ +{ + "name": "finyx-frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "finyx-frontend", + "version": "0.0.0", + "dependencies": { + "lucide-react": "^0.344.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "recharts": "^2.10.3" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.4.32", + "tailwindcss": "^3.3.6", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/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/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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/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/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@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/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "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/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/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.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "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/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/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", + "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-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "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/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "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/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.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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/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/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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/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/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "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.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "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/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/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": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.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": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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/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/eslint/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/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.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": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "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-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "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/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob/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/glob/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/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "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/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/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/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "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": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.344.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.344.0.tgz", + "integrity": "sha512-6YyBnn91GB45VuVT96bYCOKElbJzUHqp65vX8cDcu55MQL9T969v4dhGClpljamuI/+KMO9P6w9Acq1CVQGvIQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "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/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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", + "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/tinyglobby/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/tinyglobby/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", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "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/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "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": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..23fc222 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "finyx-frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "lucide-react": "^0.344.0", + "recharts": "^2.10.3" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.16", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.4.32", + "tailwindcss": "^3.3.6", + "typescript": "^5.2.2", + "vite": "^5.0.8" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..e59c22f --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,22 @@ +import { useState } from 'react'; +import { ViewMode, Step } from './types'; +import { MainLayout } from './layouts/MainLayout'; + +function App() { + const [currentView, setCurrentView] = useState('projects'); + const [currentStep, setCurrentStep] = useState('setup'); + const [isPresentationMode, setIsPresentationMode] = useState(false); + + return ( + + ); +} + +export default App; diff --git a/src/components/ProgressBar.tsx b/src/components/ProgressBar.tsx new file mode 100644 index 0000000..00a4b8f --- /dev/null +++ b/src/components/ProgressBar.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +interface ProgressBarProps { + percent: number; + status: string; +} + +export const ProgressBar: React.FC = ({ percent, status }) => { + let color = 'bg-blue-500'; + if (status === 'risk') color = 'bg-red-500'; + if (status === 'warning') color = 'bg-amber-500'; + if (status === 'review') color = 'bg-purple-500'; + if (status === 'new') color = 'bg-slate-300'; + + return ( +
+
+
+ ); +}; diff --git a/src/components/SidebarItem.tsx b/src/components/SidebarItem.tsx new file mode 100644 index 0000000..509f7ba --- /dev/null +++ b/src/components/SidebarItem.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { LucideIcon } from 'lucide-react'; + +interface SidebarItemProps { + icon: LucideIcon; + text: string; + active: boolean; + onClick: () => void; +} + +export const SidebarItem: React.FC = ({ icon: Icon, text, active, onClick }) => ( +
+ + {text} +
+); diff --git a/src/components/TableCheckItem.tsx b/src/components/TableCheckItem.tsx new file mode 100644 index 0000000..7e53ab6 --- /dev/null +++ b/src/components/TableCheckItem.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +interface TableCheckItemProps { + name: string; + required?: boolean; +} + +export const TableCheckItem: React.FC = ({ name, required }) => ( +
+
+
+
+
+ {name} +
+ {required && 必选} +
+); diff --git a/src/data/mockData.ts b/src/data/mockData.ts new file mode 100644 index 0000000..e0a8907 --- /dev/null +++ b/src/data/mockData.ts @@ -0,0 +1,119 @@ +import { Project, Risk, InventoryItem, Scenario, LegacyOptimization } from '../types'; + +export const projectsList: Project[] = [ + { id: 1, name: '鲜果连锁2025资产盘点', client: '鲜果连锁', type: '资产盘点', progress: 45, status: 'processing', owner: '张三', lastUpdate: '2小时前' }, + { id: 2, name: '北方重工数据治理一期', client: '北方重工', type: '数据治理', progress: 80, status: 'processing', owner: '李四', lastUpdate: '1天前' }, + { id: 3, name: '城商行信贷数据估值', client: '城商行', type: '估值入表', progress: 20, status: 'risk', owner: '王五', lastUpdate: '30分钟前' }, + { id: 4, name: '跨境电商合规审计', client: '跨境通电商', type: '合规审计', progress: 95, status: 'review', owner: '赵六', lastUpdate: '3天前' }, + { id: 5, name: 'Future BioMed 研发数据盘点', client: 'Future BioMed', type: '资产盘点', progress: 0, status: 'new', owner: 'Sarah', lastUpdate: '刚刚' }, +]; + +export const riskData: Risk[] = [ + { id: 1, project: '城商行信贷', risk: '生物识别信息未脱敏', level: 'high' }, + { id: 2, project: '鲜果连锁', risk: '会员数据来源合同缺失', level: 'medium' }, +]; + +export const inventoryData: InventoryItem[] = [ + { + id: 1, + raw: 't_user_base_01', + aiName: '会员基础信息表', + desc: '存储C端注册用户的核心身份信息', + rows: '2,400,000', + pii: ['手机号', '身份证'], + important: false, + confidence: 98, + aiCompleted: true + }, + { + id: 2, + raw: 'ord_logs_2023', + aiName: '订单流水记录表', + desc: '全渠道销售交易明细', + rows: '15,000,000', + pii: ['收货地址'], + important: false, + confidence: 95, + aiCompleted: true + }, + { + id: 3, + raw: 'geo_survey_data', + aiName: '门店测绘地理信息', + desc: '包含高精度地理坐标数据', + rows: '4,500', + pii: [], + important: true, + confidence: 88, + aiCompleted: true + }, + { + id: 4, + raw: 'tmp_export_v2', + aiName: '临时导出文件(建议废弃)', + desc: '无明确业务含义', + rows: '100', + pii: [], + important: false, + confidence: 90, + aiCompleted: false + }, +]; + +export const scenarioData: Scenario[] = [ + { + id: 1, + name: '冷链物流路径优化', + type: '降本增效', + impact: 'High', + desc: '利用车辆轨迹与订单位置数据,优化配送路线,降低燃油成本。', + dependencies: ['订单流水记录表', '门店测绘地理信息'], + selected: true + }, + { + id: 2, + name: '精准会员营销', + type: '营销增长', + impact: 'High', + desc: '基于用户画像与历史交易行为,实现千人千面的优惠券发放。', + dependencies: ['会员基础信息表', '订单流水记录表'], + selected: true + }, + { + id: 3, + name: '供应链金融征信', + type: '金融服务', + impact: 'Medium', + desc: '将采购与库存数据作为增信依据,为上游供应商提供融资服务。', + dependencies: ['库存变动表(未识别)', '采购订单表(未识别)'], + selected: false + }, + { + id: 4, + name: '门店选址辅助模型', + type: '决策支持', + impact: 'Medium', + desc: '结合外部人口热力图与内部门店业绩,辅助新店选址决策。', + dependencies: ['门店测绘地理信息', '外部人口数据'], + selected: false + }, +]; + +export const legacyOptimizationData: LegacyOptimization[] = [ + { + id: 1, + title: '月度销售经营报表', + issue: '指标维度单一,仅统计金额', + suggestion: '增加"复购率"、"SKU动销率"深度指标', + impact: '高', + status: 'analyzed' + }, + { + id: 2, + title: '物流配送监控大屏', + issue: '缺乏实时预警机制', + suggestion: '基于历史数据增加"配送超时预测"模型', + impact: '中', + status: 'analyzed' + } +]; diff --git a/src/finyx_designV2.tsx b/src/finyx_designV2.tsx new file mode 100644 index 0000000..bf74432 --- /dev/null +++ b/src/finyx_designV2.tsx @@ -0,0 +1,1431 @@ +import React, { useState, useEffect } from 'react'; +import { + LayoutDashboard, + Users, + Briefcase, + BookOpen, + Settings, + Bell, + Search, + ChevronRight, + AlertTriangle, + CheckCircle2, + FileText, + ArrowRight, + Download, + Upload, + Sparkles, + MessageSquare, + Eye, + EyeOff, + ShoppingCart, + XCircle, + Clock, + Menu, + Database, + ShieldCheck, + Plus, + MoreHorizontal, + Phone, + Mail, + Building2, + PieChart, + FileJson, + Terminal, + Table as TableIcon, + FileSpreadsheet, + AlertOctagon, + Image as ImageIcon, + Lightbulb, + TrendingUp, + Loader2, + PackageCheck, + FileBadge, + Layers, + Copy, + ArrowLeft, + CheckSquare, + ClipboardList, + Server, + Network, + Target, + Link as LinkIcon, + Calendar +} from 'lucide-react'; +import { + BarChart, + Bar, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, + Cell +} from 'recharts'; + +// --- 类型定义 --- +// 核心变更:ViewMode 移除 clients,增加 projects +type ViewMode = 'dashboard' | 'projects' | 'engagement'; +type Step = 'setup' | 'inventory' | 'context' | 'value' | 'delivery'; +type InventoryMode = 'selection' | 'scheme1' | 'scheme2' | 'scheme3' | 'processing' | 'results'; +type ValueTab = 'new-scenarios' | 'legacy-optimization'; + +// --- 模拟数据 --- +const projectsList = [ + { id: 1, name: '鲜果连锁2025资产盘点', client: '鲜果连锁', type: '资产盘点', progress: 45, status: 'processing', owner: '张三', lastUpdate: '2小时前' }, + { id: 2, name: '北方重工数据治理一期', client: '北方重工', type: '数据治理', progress: 80, status: 'processing', owner: '李四', lastUpdate: '1天前' }, + { id: 3, name: '城商行信贷数据估值', client: '城商行', type: '估值入表', progress: 20, status: 'risk', owner: '王五', lastUpdate: '30分钟前' }, + { id: 4, name: '跨境电商合规审计', client: '跨境通电商', type: '合规审计', progress: 95, status: 'review', owner: '赵六', lastUpdate: '3天前' }, + { id: 5, name: 'Future BioMed 研发数据盘点', client: 'Future BioMed', type: '资产盘点', progress: 0, status: 'new', owner: 'Sarah', lastUpdate: '刚刚' }, +]; + +const riskData = [ + { id: 1, project: '城商行信贷', risk: '生物识别信息未脱敏', level: 'high' }, + { id: 2, project: '鲜果连锁', risk: '会员数据来源合同缺失', level: 'medium' }, +]; + +const inventoryData = [ + { + id: 1, + raw: 't_user_base_01', + aiName: '会员基础信息表', + desc: '存储C端注册用户的核心身份信息', + rows: '2,400,000', + pii: ['手机号', '身份证'], + important: false, + confidence: 98, + aiCompleted: true + }, + { + id: 2, + raw: 'ord_logs_2023', + aiName: '订单流水记录表', + desc: '全渠道销售交易明细', + rows: '15,000,000', + pii: ['收货地址'], + important: false, + confidence: 95, + aiCompleted: true + }, + { + id: 3, + raw: 'geo_survey_data', + aiName: '门店测绘地理信息', + desc: '包含高精度地理坐标数据', + rows: '4,500', + pii: [], + important: true, + confidence: 88, + aiCompleted: true + }, + { + id: 4, + raw: 'tmp_export_v2', + aiName: '临时导出文件(建议废弃)', + desc: '无明确业务含义', + rows: '100', + pii: [], + important: false, + confidence: 90, + aiCompleted: false + }, +]; + +const scenarioData = [ + { + id: 1, + name: '冷链物流路径优化', + type: '降本增效', + impact: 'High', + desc: '利用车辆轨迹与订单位置数据,优化配送路线,降低燃油成本。', + dependencies: ['订单流水记录表', '门店测绘地理信息'], + selected: true + }, + { + id: 2, + name: '精准会员营销', + type: '营销增长', + impact: 'High', + desc: '基于用户画像与历史交易行为,实现千人千面的优惠券发放。', + dependencies: ['会员基础信息表', '订单流水记录表'], + selected: true + }, + { + id: 3, + name: '供应链金融征信', + type: '金融服务', + impact: 'Medium', + desc: '将采购与库存数据作为增信依据,为上游供应商提供融资服务。', + dependencies: ['库存变动表(未识别)', '采购订单表(未识别)'], + selected: false + }, + { + id: 4, + name: '门店选址辅助模型', + type: '决策支持', + impact: 'Medium', + desc: '结合外部人口热力图与内部门店业绩,辅助新店选址决策。', + dependencies: ['门店测绘地理信息', '外部人口数据'], + selected: false + }, +]; + +const legacyOptimizationData = [ + { + id: 1, + title: '月度销售经营报表', + issue: '指标维度单一,仅统计金额', + suggestion: '增加“复购率”、“SKU动销率”深度指标', + impact: '高', + status: 'analyzed' + }, + { + id: 2, + title: '物流配送监控大屏', + issue: '缺乏实时预警机制', + suggestion: '基于历史数据增加“配送超时预测”模型', + impact: '中', + status: 'analyzed' + } +]; + +// --- 组件部分 --- + +const SidebarItem = ({ icon: Icon, text, active, onClick }: any) => ( +
+ + {text} +
+); + +const ProgressBar = ({ percent, status }: { percent: number, status: string }) => { + let color = 'bg-blue-500'; + if (status === 'risk') color = 'bg-red-500'; + if (status === 'warning') color = 'bg-amber-500'; + if (status === 'review') color = 'bg-purple-500'; + if (status === 'new') color = 'bg-slate-300'; + + return ( +
+
+
+ ); +}; + +export default function FinyxAI() { + const [currentView, setCurrentView] = useState('projects'); // Default view is now Projects List + const [currentStep, setCurrentStep] = useState('setup'); + const [inventoryMode, setInventoryMode] = useState('selection'); + const [valueTab, setValueTab] = useState('new-scenarios'); + const [isPresentationMode, setIsPresentationMode] = useState(false); + const [cartCount, setCartCount] = useState(2); + const [processingStage, setProcessingStage] = useState(0); + // Project setup form state + const [projectName, setProjectName] = useState(''); + const [companyDescription, setCompanyDescription] = useState(''); + const [selectedIndustries, setSelectedIndustries] = useState([]); + + // 模拟盘点处理动画 + useEffect(() => { + if (inventoryMode === 'processing') { + const t1 = setTimeout(() => setProcessingStage(1), 500); + const t2 = setTimeout(() => setProcessingStage(2), 2000); + const t3 = setTimeout(() => { + setProcessingStage(3); + setInventoryMode('results'); + }, 3500); + return () => { clearTimeout(t1); clearTimeout(t2); clearTimeout(t3); }; + } + }, [inventoryMode]); + + // --- 视图 1: 指挥中心 (Dashboard) --- + const DashboardView = () => ( +
+
+
+

指挥中心 (Command Center)

+

下午好, Sarah (合伙人) | 全局概览

+
+
+ +
+
+ +
+ {[ + { title: '进行中项目', value: '12', sub: '+2 本周新增', icon: Briefcase, color: 'text-blue-600' }, + { title: '本周待交付', value: '3', sub: '需重点关注', icon: Clock, color: 'text-amber-600' }, + { title: '高风险合规预警', value: '2', sub: '阻断级风险', icon: AlertTriangle, color: 'text-red-600' }, + { title: '待复核节点', value: '5', sub: '专家审核队列', icon: FileText, color: 'text-purple-600' }, + ].map((kpi, idx) => ( +
+
+
+

{kpi.title}

+

{kpi.value}

+

{kpi.sub}

+
+
+ +
+
+
+ ))} +
+ +
+
+
+

项目作业全景

+ +
+
+ + + + + + + + + + + {projectsList.slice(0, 4).map((project, idx) => ( + setCurrentView('engagement')}> + + + + + + ))} + +
项目名称负责人当前阶段 & 进度操作
{project.name} +
+ {project.owner[0]} +
+ {project.owner} +
+
+ 进行中 + {project.progress}% +
+ +
+ +
+
+
+ +
+
+ +

风险雷达 (Risk Radar)

+
+
+ {riskData.map((risk) => ( +
+
+
+

{risk.risk}

+

项目: {risk.project}

+ +
+
+ ))} +
+
+
+
+ ); + + // --- 视图 2: 项目列表 (Project List - NEW DEFAULT) --- + const ProjectListView = () => ( +
+ {/* Header */} +
+
+

项目列表 (Projects)

+

管理所有正在进行和已交付的咨询项目

+
+
+
+ + +
+ {/* New Project Button -> Goes to Engagement Setup */} + +
+
+ + {/* Projects Table */} +
+
+
+ 全部项目 (12) + 进行中 + 已完成 +
+ +
+ + + + + + + + + + + + + + + {projectsList.map((project) => ( + setCurrentView('engagement')}> + + + + + + + + + ))} + +
项目名称客户名称项目类型项目进度负责人最近更新操作
+
+
+ +
+
{project.name}
+
+
+ {project.client} + + + {project.type} + + +
+ {project.progress}% +
+ +
+
+
{project.owner[0]}
+ {project.owner} +
+
+ {project.lastUpdate} + + + +
+ + {/* Pagination Mockup */} +
+ 显示 1-5 共 12 条记录 +
+ + +
+
+
+
+ ); + + // --- 视图 3: 项目作业台 (Engagement Workspace) --- + const EngagementView = () => { + // Stepper Configuration + const steps = [ + { id: 'setup', label: '1. 项目配置' }, + { id: 'inventory', label: '2. 数据盘点' }, + { id: 'context', label: '3. 背景调研' }, + { id: 'value', label: '4. 价值挖掘' }, + { id: 'delivery', label: '5. 成果交付' }, + ]; + + const currentStepIndex = steps.findIndex(s => s.id === currentStep); + + // Helper for scheme 3 + const TableCheckItem = ({ name, required }: { name: string, required?: boolean }) => ( +
+
+
+
+
+ {name} +
+ {required && 必选} +
+ ); + + return ( +
+ + {/* Project Header */} + {!isPresentationMode && ( +
+
+ {/* Back to Project List Navigation */} +
setCurrentView('projects')}> + + 返回项目列表 +
+
+
+
+
PM
+
DA
+
+2
+
+
+ +
+
+ )} + + {/* Stepper */} +
+
+ {steps.map((step, idx) => { + const isActive = step.id === currentStep; + const isCompleted = idx < currentStepIndex; + + return ( +
+
{ + setCurrentStep(step.id as Step); + // Reset inventory mode if returning to that step + if (step.id === 'inventory' && inventoryMode === 'results') { + // keep results + } else if (step.id === 'inventory') { + setInventoryMode('selection'); + } + }} + className={`flex items-center cursor-pointer group ${idx === steps.length - 1 ? 'flex-none' : 'w-full'}`} + > +
+ {isCompleted ? : idx + 1} +
+ + {step.label} + + {idx !== steps.length - 1 && ( +
+ )} +
+
+ ); + })} +
+
+ + {/* 演示模式退出按钮 */} + {isPresentationMode && ( + + )} + + {/* Main Workspace Area */} +
+ + {/* --- Step 1: Setup Content --- */} + {currentStep === 'setup' && ( +
+
+

项目初始化配置

+

请填写项目基本信息,系统将为您配置数据资产盘点环境

+
+ +
+ {/* Project Name */} +
+ + setProjectName(e.target.value)} + placeholder="例如:2025 年度数据资产盘点项目" + className="w-full p-3 border border-slate-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none" + /> +
+ + {/* Company Description */} +
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ +
+

数字化底座状况

+
+
+ +
+ {['内部业务系统 (ERP/CRM/POS)', '外部采购/合作', '网络爬虫/公开数据', 'IoT 设备采集'].map(opt => ( + + ))} +
+
+
+
+ + +
+
+ +
+ {['公有云', '私有云/本地', '混合部署'].map(opt => ( + + ))} +
+
+
+
+
+ +
+
+

+ + 当前数据应用场景 (存量) +

+ +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+ +
+

+ 上传现有报表/大屏截图 (辅助 AI 诊断) +

+
+
+
+
+ +
+ +
+
+
+ )} + + {/* --- Step 4: Value Content --- */} + {currentStep === 'value' && ( +
+ {/* Tabs */} +
+
+ + +
+
+ +
+ {/* Tab Content: New Scenarios */} + {valueTab === 'new-scenarios' && ( +
+
+
+

+ AI 推荐潜在场景清单 + {cartCount} 已选 +

+ +
+ +
+ {scenarioData.map((scen) => ( +
+ {scen.selected && ( +
+ )} + +
+
+ {scen.type} + + {scen.impact} Impact + +
+

{scen.name}

+
+ +

{scen.desc}

+ +
+

核心数据支撑

+
+ {scen.dependencies.map((dep, i) => ( + + + {dep} + + ))} +
+
+ +
+ +
+
+ ))} + +
+
+ +
+ 自定义挖掘场景 +

手动添加未被 AI 识别的创新业务场景

+
+
+
+
+ )} + + {/* Tab Content: Legacy Optimization */} + {valueTab === 'legacy-optimization' && ( +
+
+
+
+

存量应用优化建议

+

基于 Step 3 填写的存量场景及截图,AI 识别出以下改进点

+
+ +
+ +
+ {legacyOptimizationData.map((item) => ( +
+
+ +
+ 查看原图 +
+
+ +
+
+

{item.title}

+ + {item.impact} 价值潜力 + +
+ +
+
+

现有问题诊断

+

{item.issue}

+
+
+

AI 优化建议

+

{item.suggestion}

+
+
+ +
+ +
+
+
+ ))} +
+
+
+ )} +
+
+ )} + + {/* --- Step 5: Delivery --- */} + {currentStep === 'delivery' && ( +
+
+
+ +
+

项目交付与结算

+

2025 年度盘点项目已完成,请确认并下载最终交付包。

+
+ +
+
+

+ 核心资产盘点底稿 +

+
+
+
+
+ +
+
+

《数据资产目录底稿》

+

Excel • 4.2 MB

+
+
+ +
+
+
+ + 包含 PII / 重要数据标识列 +
+
+ + 包含 AI 自动补全元数据 (标蓝) +
+
+
+
+
+
+
+ +
+
+

《数据合规风险诊断报告》

+

PDF • 3.8 MB

+
+
+ +
+

+ * 系统后台自动生成的合规性评估结果,包含 PII 敏感度分级与跨境传输风险提示。 +

+
+
+ +
+

+ 咨询价值产物 +

+
+
推荐
+
+
+
+ +
+
+

《存量应用场景优化建议书》

+

PDF • 8.1 MB

+
+
+ +
+

+ 基于 Step 3 填写的业务现状,AI 诊断出 2 项 存量报表关键指标缺失,并提供了改进方案。 +

+
+
+
+
+
+ +
+
+

《数据资产盘点分析主报告》

+

PDF • 12.5 MB

+
+
+ +
+
+ 资产总览 + 价值评估 +
+
+
+
+ +
+ +

+ 操作提示: 确认下载后,系统将自动锁定本项目的所有编辑权限 (Audit Lock)。如需修改,请联系总监申请解锁。 +

+
+
+ )} + + + ); + }; + + return ( +
+ {/* Sidebar */} +
+
+
+ F +
+ FINYX AI +
+ +
+
Main
+ setCurrentView('dashboard')} /> + setCurrentView('projects')} /> + +
Assets
+ {}} /> +
+ +
+ {}} /> +
+
+
+

Sarah Jenkins

+

Partner

+
+
+
+
+ + {/* Main Area */} +
+ {currentView === 'dashboard' ? + : currentView === 'projects' ? + : + } +
+
+ ); +} \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/layouts/MainLayout.tsx b/src/layouts/MainLayout.tsx new file mode 100644 index 0000000..daa8a95 --- /dev/null +++ b/src/layouts/MainLayout.tsx @@ -0,0 +1,57 @@ +import React from 'react'; +import { ViewMode } from '../types'; +import { Sidebar } from './Sidebar'; +import { DashboardView } from '../pages/DashboardView'; +import { ProjectListView } from '../pages/ProjectListView'; +import { EngagementView } from '../pages/EngagementView'; + +interface MainLayoutProps { + currentView: ViewMode; + setCurrentView: (view: ViewMode) => void; + currentStep: any; + setCurrentStep: (step: any) => void; + isPresentationMode: boolean; + setIsPresentationMode: (mode: boolean) => void; +} + +export const MainLayout: React.FC = ({ + currentView, + setCurrentView, + currentStep, + setCurrentStep, + isPresentationMode, + setIsPresentationMode, +}) => ( +
+ + + {/* Main Area */} +
+ {currentView === 'dashboard' && ( + + )} + {currentView === 'projects' && ( + + )} + {currentView === 'engagement' && ( + + )} +
+
+); diff --git a/src/layouts/Sidebar.tsx b/src/layouts/Sidebar.tsx new file mode 100644 index 0000000..464ea92 --- /dev/null +++ b/src/layouts/Sidebar.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { + LayoutDashboard, + Briefcase, + BookOpen, + Settings +} from 'lucide-react'; +import { ViewMode } from '../types'; +import { SidebarItem } from '../components/SidebarItem'; + +interface SidebarProps { + currentView: ViewMode; + setCurrentView: (view: ViewMode) => void; + isPresentationMode: boolean; +} + +export const Sidebar: React.FC = ({ + currentView, + setCurrentView, + isPresentationMode +}) => ( +
+
+
+ F +
+ FINYX AI +
+ +
+
Main
+ setCurrentView('dashboard')} + /> + setCurrentView('projects')} + /> + +
Assets
+ {}} /> +
+ +
+ {}} /> +
+
+
+

Sarah Jenkins

+

Partner

+
+
+
+
+); diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/pages/DashboardView.tsx b/src/pages/DashboardView.tsx new file mode 100644 index 0000000..155602e --- /dev/null +++ b/src/pages/DashboardView.tsx @@ -0,0 +1,150 @@ +import React from 'react'; +import { + Briefcase, + Clock, + AlertTriangle, + FileText, + ArrowRight, + Download +} from 'lucide-react'; +import { ViewMode, Project, Step } from '../types'; +import { projectsList, riskData } from '../data/mockData'; +import { ProgressBar } from '../components/ProgressBar'; + +interface DashboardViewProps { + setCurrentView: (view: ViewMode) => void; + setCurrentStep?: (step: Step) => void; +} + +export const DashboardView: React.FC = ({ setCurrentView, setCurrentStep }) => ( +
+
+
+

指挥中心 (Command Center)

+

下午好, Sarah (合伙人) | 全局概览

+
+
+ +
+
+ +
+ {[ + { title: '进行中项目', value: '12', sub: '+2 本周新增', icon: Briefcase, color: 'text-blue-600' }, + { title: '本周待交付', value: '3', sub: '需重点关注', icon: Clock, color: 'text-amber-600' }, + { title: '高风险合规预警', value: '2', sub: '阻断级风险', icon: AlertTriangle, color: 'text-red-600' }, + { title: '待复核节点', value: '5', sub: '专家审核队列', icon: FileText, color: 'text-purple-600' }, + ].map((kpi, idx) => ( +
+
+
+

{kpi.title}

+

{kpi.value}

+

{kpi.sub}

+
+
+ +
+
+
+ ))} +
+ +
+
+
+

项目作业全景

+ +
+
+ + + + + + + + + + + {projectsList.slice(0, 4).map((project, idx) => ( + { + setCurrentView('engagement'); + // Set step based on project progress (simplified logic) + if (setCurrentStep) { + if (project.progress === 0) setCurrentStep('setup'); + else if (project.progress < 25) setCurrentStep('inventory'); + else if (project.progress < 50) setCurrentStep('context'); + else if (project.progress < 75) setCurrentStep('value'); + else setCurrentStep('delivery'); + } + }} + > + + + + + + ))} + +
项目名称负责人当前阶段 & 进度操作
{project.name} +
+ {project.owner[0]} +
+ {project.owner} +
+
+ 进行中 + {project.progress}% +
+ +
e.stopPropagation()}> + +
+
+
+ +
+
+ +

风险雷达 (Risk Radar)

+
+
+ {riskData.map((risk) => ( +
+
+
+

{risk.risk}

+

项目: {risk.project}

+ +
+
+ ))} +
+
+
+
+); diff --git a/src/pages/EngagementView.tsx b/src/pages/EngagementView.tsx new file mode 100644 index 0000000..95a1fd5 --- /dev/null +++ b/src/pages/EngagementView.tsx @@ -0,0 +1,180 @@ +import React, { useState } from 'react'; +import { + ArrowLeft, + ChevronRight, + Sparkles, + EyeOff, + CheckCircle2 +} from 'lucide-react'; +import { ViewMode, Step, InventoryMode, Scenario } from '../types'; +import { SetupStep } from './engagement/SetupStep'; +import { InventoryStep } from './engagement/InventoryStep'; +import { ContextStep } from './engagement/ContextStep'; +import { ValueStep } from './engagement/ValueStep'; +import { DeliveryStep } from './engagement/DeliveryStep'; +import { scenarioData as initialScenarioData } from '../data/mockData'; + +interface EngagementViewProps { + currentStep: Step; + setCurrentStep: (step: Step) => void; + setCurrentView: (view: ViewMode) => void; + isPresentationMode: boolean; + setIsPresentationMode: (mode: boolean) => void; +} + +export const EngagementView: React.FC = ({ + currentStep, + setCurrentStep, + setCurrentView, + isPresentationMode, + setIsPresentationMode, +}) => { + const [inventoryMode, setInventoryMode] = useState('selection'); + // Initialize with scenarios that are marked as selected in mock data + const [selectedScenarios, setSelectedScenarios] = useState( + initialScenarioData.filter(s => s.selected).map(s => ({ ...s })) + ); + + // Toggle scenario selection + const toggleScenarioSelection = (scenarioId: number) => { + setSelectedScenarios(prev => { + const isSelected = prev.some(s => s.id === scenarioId); + if (isSelected) { + // Remove from selection + return prev.filter(s => s.id !== scenarioId); + } else { + // Add to selection - get full scenario data from initial data + const scenario = initialScenarioData.find(s => s.id === scenarioId); + if (!scenario) return prev; + return [...prev, { ...scenario, selected: true }]; + } + }); + }; + + // Stepper Configuration + const steps = [ + { id: 'setup', label: '1. 项目配置' }, + { id: 'inventory', label: '2. 数据盘点' }, + { id: 'context', label: '3. 背景调研' }, + { id: 'value', label: '4. 价值挖掘' }, + { id: 'delivery', label: '5. 成果交付' }, + ]; + + const currentStepIndex = steps.findIndex(s => s.id === currentStep); + + return ( +
+ {/* Project Header */} + {!isPresentationMode && ( +
+
+ {/* Back to Project List Navigation */} +
setCurrentView('projects')}> + + 返回项目列表 +
+
+
+
+
PM
+
DA
+
+2
+
+
+ +
+
+ )} + + {/* Stepper */} +
+
+ {steps.map((step, idx) => { + const isActive = step.id === currentStep; + const isCompleted = idx < currentStepIndex; + + return ( +
+
{ + setCurrentStep(step.id as Step); + // Reset inventory mode if returning to that step + if (step.id === 'inventory' && inventoryMode === 'results') { + // keep results + } else if (step.id === 'inventory') { + setInventoryMode('selection'); + } + }} + className={`flex items-center cursor-pointer group ${idx === steps.length - 1 ? 'flex-none' : 'w-full'}`} + > +
+ {isCompleted ? : idx + 1} +
+ + {step.label} + + {idx !== steps.length - 1 && ( +
+ )} +
+
+ ); + })} +
+
+ + {/* 演示模式退出按钮 */} + {isPresentationMode && ( + + )} + + {/* Main Workspace Area */} +
+ {currentStep === 'setup' && ( + + )} + + {currentStep === 'inventory' && ( + + )} + + {currentStep === 'context' && ( + + )} + + {currentStep === 'value' && ( + + )} + + {currentStep === 'delivery' && ( + + )} +
+
+ ); +}; diff --git a/src/pages/ProjectListView.tsx b/src/pages/ProjectListView.tsx new file mode 100644 index 0000000..5efbf37 --- /dev/null +++ b/src/pages/ProjectListView.tsx @@ -0,0 +1,147 @@ +import React from 'react'; +import { + Search, + Plus, + Settings, + MoreHorizontal, + Layers +} from 'lucide-react'; +import { ViewMode, Step } from '../types'; +import { projectsList } from '../data/mockData'; +import { ProgressBar } from '../components/ProgressBar'; + +interface ProjectListViewProps { + setCurrentView: (view: ViewMode) => void; + setCurrentStep: (step: Step) => void; +} + +export const ProjectListView: React.FC = ({ setCurrentView, setCurrentStep }) => ( +
+ {/* Header */} +
+
+

项目列表 (Projects)

+

管理所有正在进行和已交付的咨询项目

+
+
+
+ + +
+ {/* New Project Button -> Goes to Engagement Setup */} + +
+
+ + {/* Projects Table */} +
+
+
+ 全部项目 (12) + 进行中 + 已完成 +
+ +
+ + + + + + + + + + + + + + + {projectsList.map((project) => ( + { + // Don't trigger if clicking on action buttons + if ((e.target as HTMLElement).closest('button')) return; + setCurrentView('engagement'); + // Set step based on project progress (simplified logic) + if (project.progress === 0) setCurrentStep('setup'); + else if (project.progress < 25) setCurrentStep('inventory'); + else if (project.progress < 50) setCurrentStep('context'); + else if (project.progress < 75) setCurrentStep('value'); + else setCurrentStep('delivery'); + }} + > + + + + + + + + + ))} + +
项目名称客户名称项目类型项目进度负责人最近更新操作
+
+
+ +
+
{project.name}
+
+
+ {project.client} + + + {project.type} + + +
+ {project.progress}% +
+ +
+
+
{project.owner[0]}
+ {project.owner} +
+
+ {project.lastUpdate} + e.stopPropagation()}> + + +
+ + {/* Pagination Mockup */} +
+ 显示 1-5 共 12 条记录 +
+ + +
+
+
+
+); diff --git a/src/pages/engagement/ContextStep.tsx b/src/pages/engagement/ContextStep.tsx new file mode 100644 index 0000000..4febfe0 --- /dev/null +++ b/src/pages/engagement/ContextStep.tsx @@ -0,0 +1,133 @@ +import React from 'react'; +import { + Server, + ClipboardList, + Plus, + XCircle, + Image as ImageIcon, + Sparkles +} from 'lucide-react'; +import { Step } from '../../types'; + +interface ContextStepProps { + setCurrentStep: (step: Step) => void; +} + +export const ContextStep: React.FC = ({ setCurrentStep }) => ( +
+
+
+

业务背景调研 (Business Context)

+

请补充企业的数字化现状与存量应用场景,AI 将基于此生成定制化的优化建议。

+
+ +
+
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ +
+

+ 数字化底座状况 +

+
+
+ +
+ {['内部业务系统 (ERP/CRM/POS)', '外部采购/合作', '网络爬虫/公开数据', 'IoT 设备采集'].map(opt => ( + + ))} +
+
+
+
+ + +
+
+ +
+ {['公有云', '私有云/本地', '混合部署'].map(opt => ( + + ))} +
+
+
+
+
+ +
+
+

+ + 当前数据应用场景 (存量) +

+ +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+ +
+

+ 上传现有报表/大屏截图 (辅助 AI 诊断) +

+
+
+
+
+ +
+ +
+
+
+); diff --git a/src/pages/engagement/DeliveryStep.tsx b/src/pages/engagement/DeliveryStep.tsx new file mode 100644 index 0000000..4dd40c4 --- /dev/null +++ b/src/pages/engagement/DeliveryStep.tsx @@ -0,0 +1,406 @@ +import React, { useState } from 'react'; +import { + PackageCheck, + FileText, + Database, + FileSpreadsheet, + TrendingUp, + Download, + Eye, + ArrowLeft +} from 'lucide-react'; +import { Scenario } from '../../types'; +import { legacyOptimizationData } from '../../data/mockData'; + +type ReportType = 'summary' | 'inventory' | 'legacy-optimization' | 'potential-scenarios' | null; + +interface DeliveryStepProps { + selectedScenarios: Scenario[]; +} + +export const DeliveryStep: React.FC = ({ selectedScenarios }) => { + const [viewingReport, setViewingReport] = useState(null); + const [viewingInventoryId, setViewingInventoryId] = useState(null); + + // Report Detail View + if (viewingReport) { + return ( +
+
+
+ +

+ {viewingReport === 'summary' && '整体数据资产盘点工作总结'} + {viewingReport === 'inventory' && viewingInventoryId && `数据资产目录 - ${selectedScenarios.find(s => s.id === viewingInventoryId)?.name}`} + {viewingReport === 'legacy-optimization' && '存量数据应用场景优化建议'} + {viewingReport === 'potential-scenarios' && '潜在数据应用场景评估'} +

+
+ +
+
+
+ {viewingReport === 'summary' && ( +
+
+

项目概述

+

+ 本次数据资产盘点项目已完成对企业数据资产的全面梳理和评估。通过 AI 智能识别技术, + 系统自动识别了核心数据表结构、PII 敏感信息标识、重要数据特征等关键信息。 +

+
+
+

盘点成果

+
    +
  • + + 识别核心数据表 4 张,包含 2,400 万+ 条记录 +
  • +
  • + + 识别 PII 敏感信息 3 类:手机号、身份证、收货地址 +
  • +
  • + + 识别重要数据 1 项:门店测绘地理信息 +
  • +
  • + + 生成潜在数据应用场景 {selectedScenarios.length} 个 +
  • +
+
+
+

下一步建议

+

+ 建议企业基于本次盘点结果,优先推进高价值潜力的数据应用场景,同时加强数据合规管理, + 建立完善的数据资产管理制度。 +

+
+
+ )} + + {viewingReport === 'inventory' && viewingInventoryId && (() => { + const scenario = selectedScenarios.find(s => s.id === viewingInventoryId); + if (!scenario) return null; + return ( +
+
+

数据资产目录

+

以下为该场景相关的数据资产清单

+
+
+
+

{scenario.name}

+ + {scenario.type} + +
+

{scenario.desc}

+
+

核心数据支撑:

+
+ {scenario.dependencies.map((dep, i) => ( + + {dep} + + ))} +
+
+
+
+ ); + })()} + + {viewingReport === 'legacy-optimization' && ( +
+
+

存量数据应用场景优化建议

+

+ 基于 Step 3 填写的存量场景及截图,AI 识别出以下改进点 +

+
+
+ {legacyOptimizationData.map((item) => ( +
+
+

{item.title}

+ + {item.impact} 价值潜力 + +
+
+
+

现有问题诊断

+

{item.issue}

+
+
+

AI 优化建议

+

{item.suggestion}

+
+
+
+ ))} +
+
+ )} + + {viewingReport === 'potential-scenarios' && ( +
+
+

潜在数据应用场景评估

+

+ 基于数据资产盘点结果,AI 推荐以下潜在数据应用场景 +

+
+
+ {selectedScenarios.map((scenario) => ( +
+
+

{scenario.name}

+
+ + {scenario.type} + + + {scenario.impact} Impact + +
+
+

{scenario.desc}

+
+

核心数据支撑:

+
+ {scenario.dependencies.map((dep, i) => ( + + {dep} + + ))} +
+
+
+ ))} +
+
+ )} +
+
+
+ ); + } + + // Main Delivery View + return ( +
+
+
+ +
+

项目交付与结算

+

数据资产盘点项目已完成,请查看并下载最终交付物。

+
+ +
+ {/* 整体数据资产盘点工作总结 */} +
+
+
+
+ +
+
+

整体数据资产盘点工作总结

+

项目整体概述、盘点成果汇总及下一步建议

+
+
+
+ + +
+
+
+ + {/* 数据资产目录 - 多个 */} +
+

+ 数据资产目录 +

+ {selectedScenarios.length === 0 ? ( +
+

暂无可用的数据资产目录,请返回价值挖掘步骤选择场景

+
+ ) : ( +
+ {selectedScenarios.map((scenario, idx) => ( +
+
+
+
+ +
+
+

数据资产目录 - {scenario.name}

+

包含该场景相关的数据表结构、字段定义及元数据信息

+
+
+
+ + +
+
+
+ ))} +
+
+ + {/* 存量数据应用场景优化建议 */} +
+
+
+
+ +
+
+

存量数据应用场景优化建议

+

基于现有应用场景的 AI 诊断与优化建议

+
+
+
+ + +
+
+
+ + {/* 潜在数据应用场景评估 */} + {selectedScenarios.length > 0 && ( +
+
+
+
+ +
+
+

潜在数据应用场景评估

+

AI 推荐的潜在数据应用场景详细评估报告

+
+
+
+ + +
+
+
+ )} +
+ +
+ +

+ 操作提示: 确认下载后,系统将自动锁定本项目的所有编辑权限 (Audit Lock)。如需修改,请联系总监申请解锁。 +

+
+
+ ); +}; diff --git a/src/pages/engagement/InventoryStep.tsx b/src/pages/engagement/InventoryStep.tsx new file mode 100644 index 0000000..3f3e79e --- /dev/null +++ b/src/pages/engagement/InventoryStep.tsx @@ -0,0 +1,419 @@ +import React, { useState, useEffect } from 'react'; +import { + FileJson, + Terminal, + Table as TableIcon, + CheckCircle2, + ArrowLeft, + ArrowRight, + Upload, + Copy, + FileSpreadsheet, + CheckSquare, + Sparkles, + Loader2, + AlertOctagon +} from 'lucide-react'; +import { InventoryMode, Step } from '../../types'; +import { inventoryData } from '../../data/mockData'; + +interface InventoryStepProps { + inventoryMode: InventoryMode; + setInventoryMode: (mode: InventoryMode) => void; + setCurrentStep: (step: Step) => void; +} + +export const InventoryStep: React.FC = ({ + inventoryMode, + setInventoryMode, + setCurrentStep +}) => { + const [processingStage, setProcessingStage] = useState(0); + + // Simulate processing animation + useEffect(() => { + if (inventoryMode === 'processing') { + const t1 = setTimeout(() => setProcessingStage(1), 500); + const t2 = setTimeout(() => setProcessingStage(2), 2000); + const t3 = setTimeout(() => { + setProcessingStage(3); + setInventoryMode('results'); + }, 3500); + return () => { + clearTimeout(t1); + clearTimeout(t2); + clearTimeout(t3); + }; + } + }, [inventoryMode, setInventoryMode]); + + return ( +
+ {/* MODE 1: SELECTION */} + {inventoryMode === 'selection' && ( +
+
+

选择数据盘点接入方式

+

系统支持多种数据源接入方案,请根据客户企业数字化现状选择最适合的模式。

+
+ +
+ {/* Scheme 1 */} +
setInventoryMode('scheme1')} + className="bg-white p-8 rounded-xl border border-slate-200 shadow-sm hover:shadow-xl hover:border-blue-500 cursor-pointer transition-all group relative" + > +
+ +
+
方案一
+

已有文档导入

+

上传现有的《数据字典》或数据库设计说明书 (Excel/Word)。

+
+ 适用:规范的大型企业 +
+
+ + {/* Scheme 2 */} +
setInventoryMode('scheme2')} + className="bg-white p-8 rounded-xl border border-slate-200 shadow-sm hover:shadow-xl hover:border-purple-500 cursor-pointer transition-all group relative" + > +
+ +
+
方案二
+

IT 脚本提取

+

企业 IT 协助运行标准 SQL 脚本,一键导出 Schema 结构。

+
+ 适用:有 IT 但无文档 +
+
+ + {/* Scheme 3 */} +
setInventoryMode('scheme3')} + className="bg-white p-8 rounded-xl border border-slate-200 shadow-sm hover:shadow-xl hover:border-amber-500 cursor-pointer transition-all group relative" + > +
+ +
+
方案三
+

业务关键表导入

+

业务人员手动导出核心资产表(如订单、会员、商品)。

+
+ 适用:SaaS/无数据库权限 +
+
+
+
+ )} + + {/* MODE 2.1: SCHEME 1 INTERACTION (Document Upload) */} + {inventoryMode === 'scheme1' && ( +
+
+
+ +
+

方案一:已有文档导入

+

上传企业现有的数据资产描述文件

+
+
+
+
+
+ +
+

点击或拖拽上传文件

+

支持 .xlsx, .doc, .docx (Max 50MB)

+
+
+ +
+
+
+
+ )} + + {/* MODE 2.2: SCHEME 2 INTERACTION (SQL Script) */} + {inventoryMode === 'scheme2' && ( +
+
+
+ +
+

方案二:IT 脚本提取

+

复制 SQL 脚本给 IT 部门,并将执行结果上传

+
+
+ +
+
+
+ + 1 复制提取脚本 + + +
+
+ SELECT
+   TABLE_NAME AS '表英文名',
+   TABLE_COMMENT AS '表中文名/描述',
+   COLUMN_NAME AS '字段英文名',
+   COLUMN_COMMENT AS '字段中文名',
+   COLUMN_TYPE AS '字段类型'
+ FROM information_schema.COLUMNS
+ WHERE TABLE_SCHEMA = '您的数据库名'; +
+
+ +
+ + 2 上传执行结果 + +
+ +

拖拽 Excel / CSV 结果文件至此

+
+
+
+ +
+ +
+
+
+ )} + + {/* MODE 2.3: SCHEME 3 INTERACTION (Manual Export Checklist) */} + {inventoryMode === 'scheme3' && ( +
+
+
+ +
+

方案三:业务关键表导入

+

适用于无法直接连接数据库的 SaaS 系统(如 Salesforce, 金蝶, 有赞)

+
+
+ +
+ {/* Left: Core Report Suggestions */} +
+

+ 通用核心报表清单 +

+

以下为建议导出的核心报表,仅供参考。您可以根据实际情况选择需要上传的报表文件。

+ +
+
+
交易与订单
+
+
+
订单流水明细表 (Orders)
+

包含订单号、下单时间、商品信息、金额等交易明细数据

+
+
+
退换货记录表 (Returns)
+

记录退货、换货的详细信息和处理状态

+
+
+
+ +
+
用户与会员
+
+
+
会员基础信息表 (Members)
+

存储会员的基本资料,如姓名、联系方式、注册时间等

+
+
+
积分变动记录表 (Points)
+

记录会员积分的获得、消费和过期等变动情况

+
+
+
+ +
+
商品与库存
+
+
+
商品SKU档案 (Products)
+

商品基本信息,包括SKU编码、名称、规格、价格等

+
+
+
实时库存快照 (Inventory)
+

当前时点的库存数量,可按仓库、SKU等维度统计

+
+
+
+
+
+ + {/* Right: File Upload */} +
+

+ 批量上传文件 +

+
+
+ +
+

点击或拖拽文件至此上传

+

支持批量上传 Excel / CSV 文件

+

AI 将自动识别表结构

+
+
+
+ +
+ 已上传 0 个文件 + +
+
+
+ )} + + {/* MODE 3: PROCESSING (Animation) */} + {inventoryMode === 'processing' && ( +
+
+
+
+ +
+
+ +
+
+ +

AI 资产盘点中...

+ +
+
+
= 1 ? 'bg-green-100 text-green-600' : 'bg-slate-100 text-slate-300'}`}> + {processingStage >= 1 ? : 1} +
+ = 1 ? 'text-slate-800 font-medium' : 'text-slate-400'}`}>解析数据源 / SQL 脚本 +
+
+
= 2 ? 'bg-green-100 text-green-600' : 'bg-slate-100 text-slate-300'}`}> + {processingStage >= 2 ? : 2} +
+ = 2 ? 'text-slate-800 font-medium' : 'text-slate-400'}`}>识别 PII 敏感信息 & 重要数据特征 +
+
+
= 3 ? 'bg-green-100 text-green-600' : 'bg-slate-100 text-slate-300'}`}> + {processingStage >= 3 ? : 3} +
+ = 3 ? 'text-slate-800 font-medium' : 'text-slate-400'}`}>生成《数据资产目录》预览 +
+
+
+
+ )} + + {/* MODE 4: RESULTS (Final List) */} + {inventoryMode === 'results' && ( + <> +
+
+
+

数据资产盘点目录

+ AI Completed +
+

已扫描 4 张核心表 | 蓝色高亮 为 AI 智能补全内容

+
+
+ + +
+
+ +
+
+ + + + + + + + + + + + + {inventoryData.map((row) => ( + + + + + + + + + ))} + +
原始表名 (Raw)资产中文名 (AI)业务含义描述个人信息标识 (PII)重要数据标识置信度
{row.raw} +
+ {row.aiName} + {row.aiCompleted && } +
+
+
+ {row.desc} +
+
+ {row.pii.length > 0 ? ( +
+ {row.pii.map(tag => ( + + {tag} + + ))} +
+ ) : ( + - + )} +
+ {row.important ? ( + + 涉及 + + ) : ( + - + )} + + {row.confidence}% +
+
+
+ + )} +
+ ); +}; diff --git a/src/pages/engagement/SetupStep.tsx b/src/pages/engagement/SetupStep.tsx new file mode 100644 index 0000000..da90716 --- /dev/null +++ b/src/pages/engagement/SetupStep.tsx @@ -0,0 +1,162 @@ +import React, { useState } from 'react'; +import { + Sparkles, + ArrowRight +} from 'lucide-react'; +import { Step, InventoryMode } from '../../types'; + +interface SetupStepProps { + setCurrentStep: (step: Step) => void; + setInventoryMode?: (mode: InventoryMode) => void; +} + +export const SetupStep: React.FC = ({ setCurrentStep, setInventoryMode }) => { + const [projectName, setProjectName] = useState(''); + const [companyDescription, setCompanyDescription] = useState(''); + const [selectedIndustries, setSelectedIndustries] = useState([]); + const [errors, setErrors] = useState<{ projectName?: string; companyDescription?: string; industries?: string }>({}); + + const industries = [ + '零售 - 生鲜连锁', + '零售 - 快消品', + '金融 - 商业银行', + '金融 - 保险', + '制造 - 汽车供应链', + '制造 - 电子制造', + '医疗 - 医院', + '医疗 - 制药', + '教育 - 高等院校', + '教育 - 培训机构', + '物流 - 快递', + '物流 - 仓储', + '互联网 - 电商', + '互联网 - 社交', + '房地产 - 开发', + '房地产 - 物业管理' + ]; + + return ( +
+
+

项目初始化配置

+

请填写项目基本信息,系统将为您配置数据资产盘点环境

+
+ +
+ {/* Project Name */} +
+ + { + setProjectName(e.target.value); + if (errors.projectName) setErrors(prev => ({ ...prev, projectName: undefined })); + }} + placeholder="例如:2025 年度数据资产盘点项目" + className={`w-full p-3 border rounded-lg text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none ${ + errors.projectName ? 'border-red-300 bg-red-50' : 'border-slate-300' + }`} + /> + {errors.projectName && ( +

{errors.projectName}

+ )} +
+ + {/* Company Description */} +
+ +