diff --git a/docs/plans/2026-06-13-001-refactor-gui-redesign-plan.md b/docs/plans/2026-06-13-001-refactor-gui-redesign-plan.md new file mode 100644 index 0000000..d7914ea --- /dev/null +++ b/docs/plans/2026-06-13-001-refactor-gui-redesign-plan.md @@ -0,0 +1,417 @@ +--- +title: "refactor: Agent-First GUI Redesign" +status: completed +created: 2026-06-13 +origin: docs/brainstorms/2026-06-13-gui-redesign-requirements.md +--- + +# Plan: Agent-First GUI Redesign + +## Summary + +将 Fischer AgentKit GUI 从 SideNav 多页面布局重构为 Agent-First 四象限全屏布局,建立统一 Design Token 体系,采用浅色极简视觉风格。分 3 个迭代渐进式完成,每个迭代可独立部署。 + +## Problem Frame + +当前 GUI 处于"功能可用但视觉粗糙"状态:300 处硬编码颜色、无设计系统、SideNav 多页面布局无法同时展示 Agent 活动、无响应式支持。竞品(Devin/Cursor/v0.dev)已普遍采用 Agent-First 全屏布局 + 统一设计系统。 + +## Requirements Trace + +| R-ID | Requirement | Priority | +|------|-------------|----------| +| R1 | Design Token 体系 | P0 | +| R2 | Agent-First 全屏布局 | P0 | +| R3 | 对话面板重构 | P1 | +| R4 | 代码/预览面板 | P1 | +| R5 | 终端面板重构 | P1 | +| R6 | 状态/监控面板(进化精简) | P1 | +| R7 | 工作流单页化 | P2 | +| R8 | 设置分组化 | P2 | +| R9 | 过渡动画与微交互 | P2 | +| R10 | 响应式断点 | P2 | + +## Key Technical Decisions + +### KTD1: Design Token 双轨制 — CSS 变量 + Ant Design Theme Token + +**决策:** 同时建立 CSS 自定义属性(`var(--color-primary)`)和 Ant Design Vue ConfigProvider theme token,两者通过映射表保持同步。 + +**理由:** Ant Design Vue 4.x 的 CSS-in-JS 架构通过 `theme.token` 控制组件内部样式,但自定义组件和 ECharts 无法读取 antd token。CSS 变量作为通用层,antd token 作为组件层,映射表桥接两者。 + +### KTD2: 四象限布局实现 — CSS Grid + 可拖拽分隔线 + +**决策:** 使用 CSS Grid 实现四象限基础布局,自定义 `SplitPane` 组件实现可拖拽分隔线,比例持久化到 localStorage。 + +**理由:** CSS Grid 天然支持二维布局和 `fr` 单位,比 Flexbox 更适合四象限。自定义 SplitPane 比引入第三方库(如 splitpanes)更轻量,且可精确控制样式。 + +### KTD3: 路由策略 — 保留 Vue Router,页面切换变为象限内容切换 + +**决策:** 保留 Vue Router 但重构路由结构。顶级路由改为象限内容路由(`/chat`、`/code`、`/terminal`、`/monitor`),通过路由参数控制各象限显示内容。旧路由(`/workflow`、`/knowledge`、`/skills`、`/evolution`、`/settings`)重定向到新的象限路由。 + +**理由:** 保留路由可维持 URL 可访问性、浏览器前进/后退、深层链接。象限内容切换比整页跳转更流畅。 + +### KTD4: 视觉风格 — 浅色极简 + Vercel 式紫黑渐变 + +**决策:** 主背景白色/极浅灰,强调色使用紫黑渐变(`#7c3aed` → `#1e1b4b`),代码/终端区域使用深色背景(One Dark Pro 配色)。 + +**理由:** 用户选择浅色极简风格。Vercel/v0.dev 的紫黑渐变是成熟的浅色极简强调色方案,与白色背景形成强对比。 + +## Scope Boundaries + +### In Scope +- Design Token 体系建立 +- 四象限全屏布局重构 +- 所有现有功能迁移 +- 浅色极简视觉风格 +- 过渡动画和微交互 +- 1280px+ 响应式断点 + +### Deferred to Follow-Up Work +- 暗色模式(需 Design Token 暗色变体) +- 移动端适配 +- Computer Use 功能实现 +- Cmd+K 内联编辑 +- @-mention 上下文引用 +- 代码 Diff Accept/Reject 实际回滚 + +### Outside This Product's Identity +- 多用户协作/实时协同编辑 +- 插件市场 +- 代码编辑器(只读预览) + +--- + +## Implementation Units + +### U1. Design Token 体系 + 主题配置 + +**Goal:** 建立统一的设计令牌系统,消除所有硬编码颜色/间距/圆角值。 + +**Requirements:** R1 + +**Dependencies:** 无 + +**Files:** +- Create: `src/agentkit/server/frontend/src/styles/tokens.css` +- Create: `src/agentkit/server/frontend/src/styles/theme.ts` +- Create: `src/agentkit/server/frontend/src/styles/index.ts` +- Modify: `src/agentkit/server/frontend/src/App.vue` +- Modify: `src/agentkit/server/frontend/src/main.ts` + +**Approach:** +1. 创建 `tokens.css`,定义 CSS 自定义属性:颜色(primary/secondary/success/error/warning/灰阶/背景/边框)、间距(4/8/12/16/24/32px)、圆角(4/6/8/12px)、字体(12/13/14/16/20/24px)、阴影(sm/md/lg) +2. 创建 `theme.ts`,定义 Ant Design Vue theme token 映射(将 CSS 变量值映射到 antd token) +3. 在 `App.vue` 的 ConfigProvider 中注入 theme 配置 +4. 在 `main.ts` 中引入 `tokens.css` +5. 统一主色为 `#7c3aed`(紫黑渐变起始色),消除 `#1677ff`/`#1890ff` 混用 + +**Patterns to follow:** Ant Design Vue 4.x theme customization API (ConfigProvider theme prop) + +**Test scenarios:** +- 验证 CSS 变量在浏览器中正确计算(`getComputedStyle(document.documentElement).getPropertyValue('--color-primary')` 返回 `#7c3aed`) +- 验证 Ant Design 组件使用新主题色(Button primary 颜色为 `#7c3aed`) +- 验证自定义组件可通过 `var(--color-primary)` 引用主题色 + +**Verification:** 所有 CSS 变量可计算,Ant Design 组件使用新主题色,无硬编码 `#1677ff`/`#1890ff`。 + +--- + +### U2. 四象限全屏布局 + 顶部导航 + +**Goal:** 将 SideNav 多页面布局重构为四象限全屏布局,顶部极简导航栏。 + +**Requirements:** R2 + +**Dependencies:** U1 + +**Files:** +- Create: `src/agentkit/server/frontend/src/components/layout/AgentLayout.vue` +- Create: `src/agentkit/server/frontend/src/components/layout/SplitPane.vue` +- Create: `src/agentkit/server/frontend/src/components/layout/TopNav.vue` +- Create: `src/agentkit/server/frontend/src/components/layout/QuadrantPanel.vue` +- Modify: `src/agentkit/server/frontend/src/App.vue` +- Modify: `src/agentkit/server/frontend/src/router/index.ts` +- Preserve: `src/agentkit/server/frontend/src/components/layout/AppLayout.vue`(旧布局保留,路由切换) + +**Approach:** +1. 创建 `AgentLayout.vue`:CSS Grid 四象限布局,每个象限是一个 ``,支持折叠/展开 +2. 创建 `SplitPane.vue`:可拖拽分隔线组件,支持水平/垂直方向,比例持久化到 localStorage +3. 创建 `TopNav.vue`:48px 高度顶部导航栏,包含 Logo、任务选择器、Agent 状态指示、模式切换、设置入口 +4. 创建 `QuadrantPanel.vue`:象限容器组件,支持标题栏、折叠按钮、Tab 切换 +5. 修改路由:新增 `/agent` 路由使用 AgentLayout,旧路由保留 AppLayout 作为兼容 +6. 默认路由 `/` 重定向到 `/agent` + +**Patterns to follow:** Devin 四象限布局模式,CSS Grid `grid-template-rows/columns` + `fr` 单位 + +**Test scenarios:** +- 四象限正确渲染,各象限可独立折叠/展开 +- 分隔线可拖拽调整比例,刷新后比例保持 +- 顶部导航栏正确显示 Logo、状态指示、设置入口 +- 1280px 以下右下象限自动折叠 + +**Verification:** 四象限布局可交互,分隔线可拖拽,比例持久化,响应式断点生效。 + +--- + +### U3. 对话面板重构(左上象限) + +**Goal:** 将 ChatView 重构为对话面板,支持 Markdown 渲染和工具调用指示器。 + +**Requirements:** R3 + +**Dependencies:** U1, U2 + +**Files:** +- Modify: `src/agentkit/server/frontend/src/views/ChatView.vue` +- Modify: `src/agentkit/server/frontend/src/components/chat/ChatMessage.vue` +- Modify: `src/agentkit/server/frontend/src/components/chat/ChatInput.vue` +- Modify: `src/agentkit/server/frontend/src/components/chat/ChatSidebar.vue` +- Create: `src/agentkit/server/frontend/src/components/chat/ToolCallIndicator.vue` +- Create: `src/agentkit/server/frontend/src/components/chat/ContextPill.vue` + +**Approach:** +1. ChatMessage:替换 `v-html` 为 Markdown 渲染(使用 `markdown-it` 或 `marked`),添加工具调用指示器(`[Read]`/`[Edit]`/`[Bash]` 彩色标签) +2. ChatInput:添加上下文胶囊(Context Pills),显示当前关联的文件/技能 +3. ChatSidebar:改为可折叠侧栏,默认折叠 +4. 流式输出添加打字机效果 +5. 所有硬编码颜色替换为 Design Token 引用 + +**Patterns to follow:** Claude Code 的 Tool Use Indicators,Trae 的 Context Pills + +**Test scenarios:** +- Markdown 正确渲染(标题、代码块、列表、链接) +- 工具调用指示器正确显示类型和颜色 +- 上下文胶囊显示关联文件名 +- 流式输出打字机效果平滑 + +**Verification:** 对话面板功能完整,Markdown 渲染正确,工具调用可视化,无 `v-html`。 + +--- + +### U4. 代码/预览面板(右上象限) + +**Goal:** 新增代码 Diff 查看和文件预览能力,集成工作流画布和知识库管理。 + +**Requirements:** R4, R7 + +**Dependencies:** U1, U2 + +**Files:** +- Create: `src/agentkit/server/frontend/src/components/code/CodeDiffViewer.vue` +- Create: `src/agentkit/server/frontend/src/components/code/FileTree.vue` +- Modify: `src/agentkit/server/frontend/src/views/WorkflowView.vue`(单页化) +- Modify: `src/agentkit/server/frontend/src/views/KnowledgeBaseView.vue` +- Modify: `src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue` +- Modify: `src/agentkit/server/frontend/src/components/workflow/NodePalette.vue` +- Modify: `src/agentkit/server/frontend/src/components/workflow/PropertyPanel.vue` + +**Approach:** +1. 创建 `CodeDiffViewer.vue`:只读代码 Diff 展示,支持逐行高亮(红/绿),语法高亮 +2. 创建 `FileTree.vue`:文件树浏览器,展示 Agent 修改的文件列表 +3. 工作流单页化:列表和编辑在同一象限内通过 Tab 切换 +4. 知识库管理集成为此象限的一个 Tab +5. 象限 Tab 切换:代码 / 工作流 / 知识库 +6. 所有硬编码颜色替换为 Design Token + +**Patterns to follow:** Cursor Composer 的 Diff 展示,v0.dev 的 Tab 切换 + +**Test scenarios:** +- 代码 Diff 正确高亮删除/新增行 +- 文件树正确展示文件结构 +- 工作流列表/编辑 Tab 切换流畅 +- 知识库 Tab 正常工作 +- 象限 Tab 切换无闪烁 + +**Verification:** 右上象限支持三种内容切换,代码 Diff 可视化,工作流单页化完成。 + +--- + +### U5. 终端面板重构(左下象限) + +**Goal:** 将 TerminalView 重构为终端面板,使用 Ant Design 组件替代原生 HTML。 + +**Requirements:** R5 + +**Dependencies:** U1, U2 + +**Files:** +- Modify: `src/agentkit/server/frontend/src/views/TerminalView.vue` +- Modify: `src/agentkit/server/frontend/src/components/terminal/TerminalEmulator.vue` +- Modify: `src/agentkit/server/frontend/src/components/terminal/CommandHistory.vue` + +**Approach:** +1. 终端背景改为 One Dark Pro 配色(深色背景 + 语法高亮色) +2. 命令确认弹窗从原生 HTML 改为 Ant Design Modal +3. 命令历史侧栏改为可折叠 +4. 输入框从原生 `` 改为 Ant Design Input +5. 所有硬编码颜色替换为 Design Token + +**Patterns to follow:** One Dark Pro 终端配色,Ant Design Modal 组件 + +**Test scenarios:** +- 终端输出 ANSI 颜色正确渲染 +- 命令确认弹窗使用 Ant Design Modal 样式 +- 命令历史可折叠展开 +- WebSocket 连接/断开正常 + +**Verification:** 终端面板视觉统一,无原生 HTML 弹窗,One Dark Pro 配色生效。 + +--- + +### U6. 状态/监控面板(右下象限)+ 进化精简 + +**Goal:** 将 EvolutionView 精简后集成为右下象限,集成技能和设置。 + +**Requirements:** R6, R8 + +**Dependencies:** U1, U2 + +**Files:** +- Modify: `src/agentkit/server/frontend/src/views/EvolutionView.vue` +- Modify: `src/agentkit/server/frontend/src/components/evolution/DashboardOverview.vue` +- Modify: `src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue` +- Modify: `src/agentkit/server/frontend/src/components/evolution/UsagePanel.vue` +- Modify: `src/agentkit/server/frontend/src/views/SkillsView.vue` +- Modify: `src/agentkit/server/frontend/src/views/SettingsView.vue` +- Delete: `src/agentkit/server/frontend/src/components/evolution/PitfallRoutePanel.vue` +- Delete: `src/agentkit/server/frontend/src/components/evolution/OptimizationPanel.vue` +- Delete: `src/agentkit/server/frontend/src/components/evolution/MetricsPanel.vue` +- Delete: `src/agentkit/server/frontend/src/components/evolution/ExperiencePanel.vue` + +**Approach:** +1. 进化面板精简:6 个子面板合并为 3 个 Tab — 概览+指标、经验+坑点、用量 +2. DashboardOverview:4 列统计卡片改为 2 列,增加趋势迷你图 +3. 设置分组化:4 个 Tab(LLM/技能/知识库/系统),每组独立保存 +4. 象限 Tab 切换:监控 / 技能 / 设置 +5. 删除不再需要的包装组件(PitfallRoutePanel/OptimizationPanel/MetricsPanel/ExperiencePanel) +6. 所有硬编码颜色替换为 Design Token + +**Patterns to follow:** Devin 的 Action Timeline,Ant Design Tabs 分组 + +**Test scenarios:** +- 进化概览+指标 Tab 正确展示 +- 经验+坑点 Tab 合并后功能完整 +- 设置分组 Tab 切换正常,每组独立保存 +- 技能 Tab 正常展示和安装 + +**Verification:** 右下象限支持三种内容切换,进化面板精简完成,设置分组化完成。 + +--- + +### U7. 过渡动画 + 微交互 + 响应式 + +**Goal:** 为所有交互添加过渡动画,实现 1280px+ 响应式断点。 + +**Requirements:** R9, R10 + +**Dependencies:** U1, U2, U3, U4, U5, U6 + +**Files:** +- Create: `src/agentkit/server/frontend/src/styles/transitions.css` +- Create: `src/agentkit/server/frontend/src/styles/responsive.css` +- Modify: `src/agentkit/server/frontend/src/components/layout/AgentLayout.vue` +- Modify: all view and component files (transition additions) + +**Approach:** +1. 创建 `transitions.css`:定义 Vue transition 类(fade/slide/collapse/stagger),统一时长(150ms/200ms/300ms) +2. 象限折叠/展开:平滑过渡 200ms ease +3. Tab 切换:淡入淡出 150ms +4. 列表项加载:交错渐入 stagger 50ms +5. 空状态:品牌化插图 + 引导文案(替代 ``) +6. 加载态:骨架屏替代 `` +7. 创建 `responsive.css`:定义断点(≥1440px 四象限完整,1280-1440px 右下折叠,<1280px 提示) +8. 象限比例记忆:localStorage 保存用户调整的比例 + +**Patterns to follow:** Vue `` 组件,CSS `@media` 断点 + +**Test scenarios:** +- 象限折叠/展开动画平滑无卡顿 +- Tab 切换淡入淡出效果正确 +- 列表项交错渐入效果 +- 1440px+ 四象限完整展示 +- 1280-1440px 右下象限自动折叠 +- <1280px 显示提示信息 +- 刷新后象限比例保持 + +**Verification:** 所有过渡动画生效,响应式断点正确,比例持久化。 + +--- + +## High-Level Technical Design + +### 四象限布局架构 + +``` +┌─────────────────────────────────────────────────────────┐ +│ TopNav (48px) │ +│ [Logo] [TaskSelector] [AgentStatus] [ModeToggle] [⚙] │ +├──────────────────────────┬──────────────────────────────┤ +│ │ │ +│ QuadrantPanel │ QuadrantPanel │ +│ position="top-left" │ position="top-right" │ +│ ┌─ Tabs ────────────┐ │ ┌─ Tabs ────────────────┐ │ +│ │ Chat (default) │ │ │ Code/Diff (default) │ │ +│ │ Agent Log │ │ │ Workflow │ │ +│ └────────────────────┘ │ │ Knowledge Base │ │ +│ │ └────────────────────────┘ │ +│ ← SplitPane (vertical) →│ │ +├──────────────────────────┼──────────────────────────────┤ +│ │ │ +│ QuadrantPanel │ QuadrantPanel │ +│ position="bottom-left" │ position="bottom-right" │ +│ ┌─ Tabs ────────────┐ │ ┌─ Tabs ────────────────┐ │ +│ │ Terminal (default) │ │ │ Monitor (default) │ │ +│ │ Command History │ │ │ Skills │ │ +│ └────────────────────┘ │ │ Settings │ │ +│ │ └────────────────────────┘ │ +└──────────────────────────┴──────────────────────────────┘ +``` + +### Design Token 映射架构 + +``` +tokens.css (CSS Custom Properties) + │ + ├─→ 自定义组件 (via var(--xxx)) + │ + └─→ theme.ts (Ant Design Theme Token Mapping) + │ + └─→ ConfigProvider :theme + │ + └─→ Ant Design 组件 (via CSS-in-JS) +``` + +### 路由重构 + +``` +/ → /agent (AgentLayout) + /agent/chat → 左上象限显示 Chat + /agent/code → 右上象限显示 Code/Diff + /agent/terminal → 左下象限显示 Terminal + /agent/monitor → 右下象限显示 Monitor + +旧路由兼容: + /workflow → /agent/code?tab=workflow + /knowledge → /agent/code?tab=knowledge + /skills → /agent/monitor?tab=skills + /evolution → /agent/monitor?tab=monitor + /settings → /agent/monitor?tab=settings + /terminal → /agent/terminal +``` + +--- + +## Risks & Mitigations + +| Risk | Impact | Mitigation | +|------|--------|------------| +| 300 处硬编码颜色迁移遗漏 | 视觉不一致 | U1 完成后全局搜索 `#[0-9a-fA-F]{3,6}` 验证零残留 | +| Vue Flow 在象限内 resize 问题 | 画布渲染异常 | SplitPane 拖拽结束时触发 window resize 事件 | +| ECharts 颜色需单独处理 | 图表颜色不跟随主题 | 在 ECharts 初始化时从 CSS 变量读取颜色 | +| 大型组件迁移引入回归 | 功能损坏 | 每个单元完成后运行现有测试 + 手动验证 | +| 四象限布局在小屏幕下体验差 | 不可用 | R10 响应式断点确保 1280px+ 可用 | + +## Open Questions + +- Code Diff Viewer 是否需要引入第三方库(如 diff2html)还是手写简单 diff 展示?→ 建议先用简单行级高亮,后续迭代引入 diff2html +- 骨架屏组件是自建还是使用 Ant Design Vue 的 Skeleton?→ 建议使用 antd Skeleton,减少维护成本 diff --git a/src/agentkit/server/app.py b/src/agentkit/server/app.py index eabfb14..511dd0a 100644 --- a/src/agentkit/server/app.py +++ b/src/agentkit/server/app.py @@ -680,6 +680,7 @@ def create_app( if gui_mode: from pathlib import Path as _Path from fastapi.responses import HTMLResponse, FileResponse + from fastapi.staticfiles import StaticFiles _static_dir = _Path(__file__).parent / "static" @@ -691,4 +692,29 @@ def create_app( return FileResponse(str(index_path)) return HTMLResponse("

AgentKit GUI not found

", status_code=404) + # SPA fallback: serve index.html for all non-API, non-static routes + @app.get("/{path:path}", response_class=HTMLResponse, include_in_schema=False) + async def spa_fallback(path: str): + """Serve index.html for SPA client-side routing.""" + # Don't intercept API routes or docs + if path.startswith("api/") or path.startswith("docs") or path == "openapi.json": + return HTMLResponse("

Not Found

", status_code=404) + # Try to serve a real static file first (with path traversal protection) + file_path = (_static_dir / path).resolve() + if not str(file_path).startswith(str(_static_dir.resolve())): + return HTMLResponse("

Forbidden

", status_code=403) + if file_path.is_file(): + return FileResponse(str(file_path)) + # Fallback to index.html for SPA routing + index_path = _static_dir / "index.html" + if index_path.exists(): + return FileResponse(str(index_path)) + return HTMLResponse("

Not Found

", status_code=404) + + # Mount static assets last (js, css, images, etc.) + # mount() is checked after route matching, so API routes take priority + assets_dir = _static_dir / "assets" + if assets_dir.exists(): + app.mount("/assets", StaticFiles(directory=str(assets_dir)), name="static-assets") + return app diff --git a/src/agentkit/server/frontend/package-lock.json b/src/agentkit/server/frontend/package-lock.json new file mode 100644 index 0000000..390f6f7 --- /dev/null +++ b/src/agentkit/server/frontend/package-lock.json @@ -0,0 +1,2531 @@ +{ + "name": "agentkit-portal", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "agentkit-portal", + "version": "0.1.0", + "dependencies": { + "@ant-design/icons-vue": "^7.0.0", + "@vue-flow/background": "^1.3.0", + "@vue-flow/controls": "^1.1.0", + "@vue-flow/core": "^1.41.0", + "ant-design-vue": "^4.2.0", + "dompurify": "^3.4.10", + "markdown-it": "^14.2.0", + "pinia": "^2.2.0", + "vue": "^3.5.0", + "vue-router": "^4.4.0" + }, + "devDependencies": { + "@types/dompurify": "^3.0.5", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.1.0", + "echarts": "^6.1.0", + "typescript": "^5.6.0", + "unplugin-auto-import": "^21.0.0", + "unplugin-vue-components": "^32.1.0", + "vite": "^5.4.0", + "vue-tsc": "^2.1.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@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.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@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/@rollup/rollup-android-arm-eabi": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "license": "MIT", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-flow/background": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/@vue-flow/background/-/background-1.3.2.tgz", + "integrity": "sha512-eJPhDcLj1wEo45bBoqTXw1uhl0yK2RaQGnEINqvvBsAFKh/camHJd5NPmOdS1w+M9lggc9igUewxaEd3iCQX2w==", + "license": "MIT", + "peerDependencies": { + "@vue-flow/core": "^1.23.0", + "vue": "^3.3.0" + } + }, + "node_modules/@vue-flow/controls": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@vue-flow/controls/-/controls-1.1.3.tgz", + "integrity": "sha512-XCf+G+jCvaWURdFlZmOjifZGw3XMhN5hHlfMGkWh9xot+9nH9gdTZtn+ldIJKtarg3B21iyHU8JjKDhYcB6JMw==", + "license": "MIT", + "peerDependencies": { + "@vue-flow/core": "^1.23.0", + "vue": "^3.3.0" + } + }, + "node_modules/@vue-flow/core": { + "version": "1.48.2", + "resolved": "https://registry.npmmirror.com/@vue-flow/core/-/core-1.48.2.tgz", + "integrity": "sha512-raxhgKWE+G/mcEvXJjGFUDYW9rAI3GOtiHR3ZkNpwBWuIaCC1EYiBmKGwJOoNzVFgwO7COgErnK7i08i287AFA==", + "license": "MIT", + "dependencies": { + "@vueuse/core": "^10.5.0", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.38.tgz", + "integrity": "sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.38", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz", + "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz", + "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.38", + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz", + "integrity": "sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.38.tgz", + "integrity": "sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.38.tgz", + "integrity": "sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.38.tgz", + "integrity": "sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.38", + "@vue/runtime-core": "3.5.38", + "@vue/shared": "3.5.38", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.38.tgz", + "integrity": "sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38" + }, + "peerDependencies": { + "vue": "3.5.38" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.38.tgz", + "integrity": "sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ant-design-vue": { + "version": "4.2.6", + "resolved": "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-4.2.6.tgz", + "integrity": "sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "license": "MIT" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/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-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==", + "license": "MIT" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==", + "license": "MIT" + }, + "node_modules/dompurify": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.4.10.tgz", + "integrity": "sha512-0xzNv0e7oYC6yyuOGZIABPM4qtg3QxLFniDNPP4ZP90wR8Yq3zgwpRbrNiT4N3IKqDbbYFEJLV+JWEs19aZ//w==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/echarts": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.1.0.tgz", + "integrity": "sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.1.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/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/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/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/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-5.0.1.tgz", + "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/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/loose-envify/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.1", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "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/nanopop": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==", + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz", + "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport": { + "version": "5.7.0", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-5.7.0.tgz", + "integrity": "sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "pkg-types": "^2.3.0", + "scule": "^1.3.0", + "strip-literal": "^3.1.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "21.0.0", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-21.0.0.tgz", + "integrity": "sha512-vWuC8SwqJmxZFYwPojhOhOXDb5xFhNNcEVb9K/RFkyk/3VnfaOjzitWN7v+8DEKpMjSsY2AEGXNgt6I0yQrhRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "picomatch": "^4.0.3", + "unimport": "^5.6.0", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^4.0.0", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "32.1.0", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-32.1.0.tgz", + "integrity": "sha512-YiUkSxuRjab18XFOrX5VsIxXzccrfmHVGsGeJgSgklb829DQmCy9E4vvDUE4tuvZZdxyFJZX0Oc4TPnnxiiMyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "local-pkg": "^1.2.0", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "obug": "^2.1.1", + "picomatch": "^4.0.4", + "tinyglobby": "^0.2.16", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmmirror.com/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/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.38.tgz", + "integrity": "sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-sfc": "3.5.38", + "@vue/runtime-dom": "3.5.38", + "@vue/server-renderer": "3.5.38", + "@vue/shared": "3.5.38" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "license": "MIT", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/zrender": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.1.0.tgz", + "integrity": "sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/src/agentkit/server/frontend/package.json b/src/agentkit/server/frontend/package.json index b6e7c17..e24e515 100644 --- a/src/agentkit/server/frontend/package.json +++ b/src/agentkit/server/frontend/package.json @@ -14,11 +14,15 @@ "@vue-flow/controls": "^1.1.0", "@vue-flow/core": "^1.41.0", "ant-design-vue": "^4.2.0", + "dompurify": "^3.4.10", + "markdown-it": "^14.2.0", "pinia": "^2.2.0", "vue": "^3.5.0", "vue-router": "^4.4.0" }, "devDependencies": { + "@types/dompurify": "^3.0.5", + "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.1.0", "echarts": "^6.1.0", "typescript": "^5.6.0", diff --git a/src/agentkit/server/frontend/src/App.vue b/src/agentkit/server/frontend/src/App.vue index 5ea2222..f3fd2b6 100644 --- a/src/agentkit/server/frontend/src/App.vue +++ b/src/agentkit/server/frontend/src/App.vue @@ -1,13 +1,13 @@ diff --git a/src/agentkit/server/frontend/src/components/chat/ChatSidebar.vue b/src/agentkit/server/frontend/src/components/chat/ChatSidebar.vue index 030b5ef..ce6d958 100644 --- a/src/agentkit/server/frontend/src/components/chat/ChatSidebar.vue +++ b/src/agentkit/server/frontend/src/components/chat/ChatSidebar.vue @@ -1,31 +1,38 @@ + + diff --git a/src/agentkit/server/frontend/src/components/chat/ToolCallIndicator.vue b/src/agentkit/server/frontend/src/components/chat/ToolCallIndicator.vue new file mode 100644 index 0000000..fa49469 --- /dev/null +++ b/src/agentkit/server/frontend/src/components/chat/ToolCallIndicator.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/agentkit/server/frontend/src/components/code/CodeDiffViewer.vue b/src/agentkit/server/frontend/src/components/code/CodeDiffViewer.vue new file mode 100644 index 0000000..6f8dc16 --- /dev/null +++ b/src/agentkit/server/frontend/src/components/code/CodeDiffViewer.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/agentkit/server/frontend/src/components/code/FileTree.vue b/src/agentkit/server/frontend/src/components/code/FileTree.vue new file mode 100644 index 0000000..bdc4890 --- /dev/null +++ b/src/agentkit/server/frontend/src/components/code/FileTree.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/agentkit/server/frontend/src/components/evolution/DashboardOverview.vue b/src/agentkit/server/frontend/src/components/evolution/DashboardOverview.vue index e037c2d..7150ecf 100644 --- a/src/agentkit/server/frontend/src/components/evolution/DashboardOverview.vue +++ b/src/agentkit/server/frontend/src/components/evolution/DashboardOverview.vue @@ -5,7 +5,7 @@ @@ -14,7 +14,7 @@ @@ -23,7 +23,7 @@ @@ -34,7 +34,7 @@ title="质量通过率" :value="metrics ? (metrics.success_rate * 100).toFixed(1) : '0.0'" suffix="%" - :value-style="{ color: '#52c41a' }" + :value-style="{ color: '#10b981' }" > @@ -183,7 +183,7 @@ function riskLabel(level: string): string { .overview-card__footer { font-size: 12px; - color: #8c8c8c; + color: var(--text-tertiary); } .overview-sections { @@ -195,8 +195,8 @@ function riskLabel(level: string): string { } .overview-section { - background: #fff; - border: 1px solid #f0f0f0; + background: var(--bg-primary); + border: 1px solid var(--border-color-split); border-radius: 8px; padding: 16px; display: flex; @@ -235,7 +235,7 @@ function riskLabel(level: string): string { align-items: center; gap: 8px; padding: 6px 0; - border-bottom: 1px solid #f5f5f5; + border-bottom: 1px solid var(--bg-tertiary); } .experience-item:last-child { @@ -250,11 +250,11 @@ function riskLabel(level: string): string { } .experience-item__dot--success { - background: #52c41a; + background: var(--color-success); } .experience-item__dot--failure { - background: #ff4d4f; + background: var(--color-error); } .experience-item__info { @@ -274,7 +274,7 @@ function riskLabel(level: string): string { .experience-item__meta { font-size: 12px; - color: #8c8c8c; + color: var(--text-tertiary); } .pitfall-item { @@ -282,7 +282,7 @@ function riskLabel(level: string): string { align-items: center; gap: 8px; padding: 6px 0; - border-bottom: 1px solid #f5f5f5; + border-bottom: 1px solid var(--bg-tertiary); } .pitfall-item:last-child { @@ -297,7 +297,7 @@ function riskLabel(level: string): string { .pitfall-item__rate { font-size: 12px; - color: #ff4d4f; + color: var(--color-error); font-weight: 600; } diff --git a/src/agentkit/server/frontend/src/components/evolution/ExperiencePanel.vue b/src/agentkit/server/frontend/src/components/evolution/ExperiencePanel.vue index 8e9153c..76e5f54 100644 --- a/src/agentkit/server/frontend/src/components/evolution/ExperiencePanel.vue +++ b/src/agentkit/server/frontend/src/components/evolution/ExperiencePanel.vue @@ -21,8 +21,8 @@ function onExperienceFilter(outcome: string) { diff --git a/src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue b/src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue index 63d0fe6..b0acb08 100644 --- a/src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue +++ b/src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue @@ -18,19 +18,19 @@
成功率
-
+
{{ metrics ? (metrics.success_rate * 100).toFixed(1) + '%' : '-' }}
平均耗时
-
+
{{ metrics ? formatDuration(metrics.avg_duration) : '-' }}
重试率
-
+
{{ metrics ? (metrics.retry_rate * 100).toFixed(1) + '%' : '-' }}
@@ -129,7 +129,7 @@ function updateChart() { type: 'line', data: props.trends.map(t => +(t.success_rate * 100).toFixed(1)), smooth: true, - itemStyle: { color: '#52c41a' }, + itemStyle: { color: '#10b981' }, symbol: 'circle', symbolSize: 6, }, @@ -138,7 +138,7 @@ function updateChart() { type: 'line', data: props.trends.map(t => +(t.retry_rate * 100).toFixed(1)), smooth: true, - itemStyle: { color: '#fa8c16' }, + itemStyle: { color: '#f59e0b' }, symbol: 'circle', symbolSize: 6, }, @@ -148,7 +148,7 @@ function updateChart() { yAxisIndex: 1, data: props.trends.map(t => +(t.avg_duration).toFixed(0)), smooth: true, - itemStyle: { color: '#1890ff' }, + itemStyle: { color: '#7c3aed' }, lineStyle: { type: 'dashed' }, symbol: 'circle', symbolSize: 6, @@ -220,7 +220,7 @@ watch(() => [props.trends, props.period], updateChart, { deep: true }) .summary-card { flex: 1; - background: #fafafa; + background: var(--bg-secondary); border-radius: 6px; padding: 8px 12px; text-align: center; @@ -228,7 +228,7 @@ watch(() => [props.trends, props.period], updateChart, { deep: true }) .summary-label { font-size: 12px; - color: #8c8c8c; + color: var(--text-tertiary); margin-bottom: 2px; } diff --git a/src/agentkit/server/frontend/src/components/evolution/MetricsPanel.vue b/src/agentkit/server/frontend/src/components/evolution/MetricsPanel.vue index d59243c..dd1aab7 100644 --- a/src/agentkit/server/frontend/src/components/evolution/MetricsPanel.vue +++ b/src/agentkit/server/frontend/src/components/evolution/MetricsPanel.vue @@ -23,8 +23,8 @@ function onPeriodChange(period: string) { diff --git a/src/agentkit/server/frontend/src/components/evolution/PitfallPanel.vue b/src/agentkit/server/frontend/src/components/evolution/PitfallPanel.vue index 6771edd..8194706 100644 --- a/src/agentkit/server/frontend/src/components/evolution/PitfallPanel.vue +++ b/src/agentkit/server/frontend/src/components/evolution/PitfallPanel.vue @@ -49,7 +49,7 @@ import { ref } from 'vue' import { Input as AInput, Button as AButton, Tag as ATag, Empty as AEmpty } from 'ant-design-vue' import type { PitfallWarning } from '@/api/evolution' -const props = defineProps<{ +defineProps<{ warnings: PitfallWarning[] loading?: boolean }>() @@ -124,8 +124,8 @@ function riskLabel(level: string): string { } .pitfall-item { - background: #fafafa; - border: 1px solid #f0f0f0; + background: var(--bg-secondary); + border: 1px solid var(--border-color-split); border-radius: 6px; padding: 10px 12px; margin-bottom: 8px; @@ -145,20 +145,20 @@ function riskLabel(level: string): string { .pitfall-item__rate { font-size: 12px; - color: #8c8c8c; + color: var(--text-tertiary); margin-bottom: 4px; } .pitfall-item__reason { font-size: 12px; - color: #595959; + color: var(--text-secondary); line-height: 1.5; margin-bottom: 4px; } .pitfall-item__suggestion { font-size: 12px; - color: #1890ff; + color: var(--color-primary); line-height: 1.5; } diff --git a/src/agentkit/server/frontend/src/components/evolution/PitfallRoutePanel.vue b/src/agentkit/server/frontend/src/components/evolution/PitfallRoutePanel.vue index 17863f6..7f14975 100644 --- a/src/agentkit/server/frontend/src/components/evolution/PitfallRoutePanel.vue +++ b/src/agentkit/server/frontend/src/components/evolution/PitfallRoutePanel.vue @@ -22,8 +22,8 @@ function onPitfallCheck(taskType: string) { diff --git a/src/agentkit/server/frontend/src/components/layout/AppLayout.vue b/src/agentkit/server/frontend/src/components/layout/AppLayout.vue index 1b6dbf2..28484fd 100644 --- a/src/agentkit/server/frontend/src/components/layout/AppLayout.vue +++ b/src/agentkit/server/frontend/src/components/layout/AppLayout.vue @@ -21,6 +21,6 @@ import SideNav from './SideNav.vue' .app-layout__main { flex: 1; overflow: hidden; - background: #f5f5f5; + background: var(--bg-tertiary); } diff --git a/src/agentkit/server/frontend/src/components/layout/QuadrantPanel.vue b/src/agentkit/server/frontend/src/components/layout/QuadrantPanel.vue new file mode 100644 index 0000000..d95dcd6 --- /dev/null +++ b/src/agentkit/server/frontend/src/components/layout/QuadrantPanel.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/src/agentkit/server/frontend/src/components/layout/SideNav.vue b/src/agentkit/server/frontend/src/components/layout/SideNav.vue index ffa4888..c8bd86b 100644 --- a/src/agentkit/server/frontend/src/components/layout/SideNav.vue +++ b/src/agentkit/server/frontend/src/components/layout/SideNav.vue @@ -88,8 +88,8 @@ watch( } ) -function handleMenuClick({ key }: { key: string }): void { - router.push(key) +function handleMenuClick({ key }: { key: string | number }): void { + router.push(String(key)) } diff --git a/src/agentkit/server/frontend/src/components/layout/SplitPane.vue b/src/agentkit/server/frontend/src/components/layout/SplitPane.vue new file mode 100644 index 0000000..6cdf79b --- /dev/null +++ b/src/agentkit/server/frontend/src/components/layout/SplitPane.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/src/agentkit/server/frontend/src/components/layout/TopNav.vue b/src/agentkit/server/frontend/src/components/layout/TopNav.vue new file mode 100644 index 0000000..61a5a99 --- /dev/null +++ b/src/agentkit/server/frontend/src/components/layout/TopNav.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/agentkit/server/frontend/src/components/skills/SkillCard.vue b/src/agentkit/server/frontend/src/components/skills/SkillCard.vue index 0eb4bf7..84df04b 100644 --- a/src/agentkit/server/frontend/src/components/skills/SkillCard.vue +++ b/src/agentkit/server/frontend/src/components/skills/SkillCard.vue @@ -60,12 +60,12 @@ defineEmits<{ } .skill-card__icon { - color: #1677ff; + color: var(--color-primary); } .skill-card__desc { font-size: 13px; - color: #666; + color: var(--text-secondary); margin-bottom: 8px; line-height: 1.5; display: -webkit-box; @@ -90,12 +90,12 @@ defineEmits<{ .skill-card__deps-label { font-size: 12px; - color: #999; + color: var(--text-placeholder); } .skill-card__more { font-size: 12px; - color: #999; + color: var(--text-placeholder); } .skill-card__footer { @@ -106,6 +106,6 @@ defineEmits<{ .skill-card__version { font-size: 12px; - color: #999; + color: var(--text-placeholder); } diff --git a/src/agentkit/server/frontend/src/components/skills/SkillDetail.vue b/src/agentkit/server/frontend/src/components/skills/SkillDetail.vue index 49a3f85..3cdd1be 100644 --- a/src/agentkit/server/frontend/src/components/skills/SkillDetail.vue +++ b/src/agentkit/server/frontend/src/components/skills/SkillDetail.vue @@ -103,12 +103,12 @@ async function handleHealthCheck(): Promise { } .skill-detail__empty { - color: #999; + color: var(--text-placeholder); font-size: 13px; } .skill-detail__config { - background: #f5f5f5; + background: var(--bg-tertiary); border-radius: 6px; padding: 12px; overflow-x: auto; diff --git a/src/agentkit/server/frontend/src/components/terminal/CommandHistory.vue b/src/agentkit/server/frontend/src/components/terminal/CommandHistory.vue index 4b83816..2a3ef10 100644 --- a/src/agentkit/server/frontend/src/components/terminal/CommandHistory.vue +++ b/src/agentkit/server/frontend/src/components/terminal/CommandHistory.vue @@ -15,8 +15,7 @@ >
{{ record.exit_code === 0 ? '✓' : '✗' }} @@ -37,6 +36,7 @@ @@ -95,38 +144,38 @@ function ansiToHtml(text: string): string { display: flex; flex-direction: column; height: 100%; - background: #1e1e1e; - border-radius: 6px; + background: var(--code-bg); + border-radius: var(--radius-md); overflow: hidden; - font-family: 'Menlo', 'Monaco', 'Courier New', monospace; + font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, Consolas, monospace; } .terminal-emulator__output { flex: 1; overflow-y: auto; - padding: 12px; - font-size: 13px; - line-height: 1.5; - color: #d4d4d4; + padding: var(--space-3); + font-size: var(--font-sm); + line-height: var(--leading-normal); + color: var(--code-fg); } .terminal-emulator__welcome { - color: #888; + color: var(--code-comment); font-style: italic; } .terminal-emulator__input { display: flex; align-items: center; - padding: 8px 12px; - border-top: 1px solid #333; - background: #252526; + padding: var(--space-2) var(--space-3); + border-top: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(0, 0, 0, 0.2); } .terminal-emulator__prompt { - color: #4caf50; - margin-right: 8px; - font-size: 13px; + color: var(--code-string); + margin-right: var(--space-2); + font-size: var(--font-sm); white-space: nowrap; } @@ -135,17 +184,25 @@ function ansiToHtml(text: string): string { background: transparent; border: none; outline: none; - color: #d4d4d4; + color: var(--code-fg); font-family: inherit; - font-size: 13px; + font-size: var(--font-sm); } .terminal-emulator__input-field::placeholder { - color: #555; + color: var(--code-comment); } .terminal-line { white-space: pre-wrap; word-break: break-all; } + +/* ANSI color classes using One Dark Pro palette */ +.terminal-line :deep(.ansi-green) { color: var(--code-string); } +.terminal-line :deep(.ansi-yellow) { color: var(--code-number); } +.terminal-line :deep(.ansi-red) { color: var(--code-variable); } +.terminal-line :deep(.ansi-cyan) { color: var(--code-function); } +.terminal-line :deep(.ansi-blue) { color: var(--code-function); } +.terminal-line :deep(.ansi-magenta) { color: var(--code-keyword); } diff --git a/src/agentkit/server/frontend/src/components/workflow/ApprovalNode.vue b/src/agentkit/server/frontend/src/components/workflow/ApprovalNode.vue index af6a275..8207cbe 100644 --- a/src/agentkit/server/frontend/src/components/workflow/ApprovalNode.vue +++ b/src/agentkit/server/frontend/src/components/workflow/ApprovalNode.vue @@ -43,8 +43,8 @@ const isPaused = computed(() => { diff --git a/src/agentkit/server/frontend/src/components/workflow/ConditionNode.vue b/src/agentkit/server/frontend/src/components/workflow/ConditionNode.vue index 7a29a4d..d838d37 100644 --- a/src/agentkit/server/frontend/src/components/workflow/ConditionNode.vue +++ b/src/agentkit/server/frontend/src/components/workflow/ConditionNode.vue @@ -43,46 +43,46 @@ defineProps<{ } .diamond-shape { - background: #fff; - border: 2px solid #faad14; + background: var(--bg-primary); + border: 2px solid var(--color-warning); border-radius: 8px; padding: 8px 12px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + box-shadow: var(--shadow-sm); transform: none; transition: border-color 0.3s, box-shadow 0.3s; } .condition-node:hover .diamond-shape { - box-shadow: 0 4px 12px rgba(250, 173, 20, 0.25); + box-shadow: 0 4px 12px rgba(245, 158, 11, 0.25); } .condition-node.selected .diamond-shape { - border-color: #d48806; - box-shadow: 0 0 0 3px rgba(250, 173, 20, 0.2); + border-color: var(--color-warning); + box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.2); } /* Execution status styles */ .condition-node.status-running .diamond-shape { - border-color: #1890ff; - box-shadow: 0 0 8px rgba(24, 144, 255, 0.5); + border-color: var(--color-info); + box-shadow: 0 0 8px rgba(59, 130, 246, 0.5); animation: pulse 1.5s ease-in-out infinite; } .condition-node.status-completed .diamond-shape { - border-color: #52c41a; + border-color: var(--color-success); } .condition-node.status-failed .diamond-shape { - border-color: #ff4d4f; + border-color: var(--color-error); } .condition-node.status-waiting_approval .diamond-shape { - border-color: #faad14; + border-color: var(--color-warning); } @keyframes pulse { - 0%, 100% { box-shadow: 0 0 4px rgba(24, 144, 255, 0.3); } - 50% { box-shadow: 0 0 12px rgba(24, 144, 255, 0.7); } + 0%, 100% { box-shadow: 0 0 4px rgba(59, 130, 246, 0.3); } + 50% { box-shadow: 0 0 12px rgba(59, 130, 246, 0.7); } } /* Status indicator icon */ @@ -96,7 +96,7 @@ defineProps<{ display: flex; align-items: center; justify-content: center; - background: #fff; + background: var(--bg-primary); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15); z-index: 1; } @@ -106,20 +106,20 @@ defineProps<{ } .running-icon { - color: #1890ff; + color: var(--color-info); animation: spin 1s linear infinite; } .completed-icon { - color: #52c41a; + color: var(--color-success); } .failed-icon { - color: #ff4d4f; + color: var(--color-error); } .waiting-icon { - color: #faad14; + color: var(--color-warning); } @keyframes spin { @@ -134,24 +134,24 @@ defineProps<{ } .node-icon { - color: #faad14; + color: var(--color-warning); font-size: 14px; } .node-title { font-weight: 600; - color: #333; + color: var(--text-primary); font-size: 13px; } .condition-expr { margin-top: 4px; padding: 2px 8px; - background: #fffbe6; - border: 1px solid #ffe58f; + background: var(--color-warning-light); + border: 1px solid var(--color-warning-light); border-radius: 4px; font-size: 11px; - color: #8c6900; + color: var(--color-warning); max-width: 180px; overflow: hidden; text-overflow: ellipsis; @@ -159,11 +159,11 @@ defineProps<{ } .handle-true { - background: #52c41a; + background: var(--color-success); } .handle-false { - background: #ff4d4f; + background: var(--color-error); } .label-true { @@ -171,7 +171,7 @@ defineProps<{ right: -22px; top: 50%; transform: translateY(-50%); - color: #52c41a; + color: var(--color-success); font-size: 11px; font-weight: 600; } @@ -181,7 +181,7 @@ defineProps<{ bottom: -18px; left: 50%; transform: translateX(-50%); - color: #ff4d4f; + color: var(--color-error); font-size: 11px; font-weight: 600; } diff --git a/src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue b/src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue index 5d954c9..96af376 100644 --- a/src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue +++ b/src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue @@ -21,8 +21,8 @@
() @@ -69,15 +67,13 @@ const emit = defineEmits<{ save: [] execute: [] clear: [] - 'update:nodes': [nodes: any[]] - 'update:edges': [edges: any[]] 'node-select': [nodeId: string | null] 'node-drop': [nodeType: string, position: { x: number; y: number }] }>() const canvasRef = ref() -const nodeTypes = { +const nodeTypes: Record = { skill: markRaw(SkillNode), condition: markRaw(ConditionNode), approval: markRaw(ApprovalNode), @@ -128,7 +124,7 @@ function onConnect(params: any) { sourceHandle: params.sourceHandle, targetHandle: params.targetHandle, animated: true, - style: { stroke: '#1890ff', strokeWidth: 2 }, + style: { stroke: '#7c3aed', strokeWidth: 2 }, } store.addEdge(newEdge) } @@ -164,17 +160,17 @@ onUnmounted(() => { function onValidate() { // Basic validation - if (props.nodes.length === 0) { + if (store.flowNodes.length === 0) { message.warning('工作流为空,请添加节点') return } // Check for nodes without connections (except the first) - const connectedSources = new Set(props.edges.map((e: any) => e.source)) - const connectedTargets = new Set(props.edges.map((e: any) => e.target)) + const connectedSources = new Set(store.flowEdges.map((e: any) => e.source)) + const connectedTargets = new Set(store.flowEdges.map((e: any) => e.target)) const allConnected = new Set([...connectedSources, ...connectedTargets]) - const orphanNodes = props.nodes.filter((n: any) => !allConnected.has(n.id)) - if (orphanNodes.length > 0 && props.nodes.length > 1) { + const orphanNodes = store.flowNodes.filter((n: any) => !allConnected.has(n.id)) + if (orphanNodes.length > 0 && store.flowNodes.length > 1) { message.warning(`存在未连接的节点: ${orphanNodes.map((n: any) => n.data?.label).join(', ')}`) return } @@ -194,8 +190,8 @@ function onValidate() { .canvas-toolbar { padding: 8px 12px; - background: #fff; - border-bottom: 1px solid #f0f0f0; + background: var(--bg-primary); + border-bottom: 1px solid var(--border-color-split); display: flex; align-items: center; z-index: 10; diff --git a/src/agentkit/server/frontend/src/components/workflow/NodePalette.vue b/src/agentkit/server/frontend/src/components/workflow/NodePalette.vue index 7b954ce..83f6d63 100644 --- a/src/agentkit/server/frontend/src/components/workflow/NodePalette.vue +++ b/src/agentkit/server/frontend/src/components/workflow/NodePalette.vue @@ -33,28 +33,28 @@ const nodeTypes = [ name: '技能节点', desc: '引用已注册的技能', icon: ThunderboltOutlined, - color: '#1890ff', + color: '#7c3aed', }, { type: 'condition', name: '条件节点', desc: 'If/else 条件分支', icon: BranchesOutlined, - color: '#faad14', + color: '#f59e0b', }, { type: 'approval', name: '审批节点', desc: '人工审批关卡', icon: UserOutlined, - color: '#722ed1', + color: '#7c3aed', }, { type: 'parallel', name: '并行节点', desc: '并行执行组', icon: ForkOutlined, - color: '#52c41a', + color: '#10b981', }, ] @@ -69,8 +69,8 @@ function onDragStart(event: DragEvent, nodeType: string) { diff --git a/src/agentkit/server/frontend/src/components/workflow/ParallelNode.vue b/src/agentkit/server/frontend/src/components/workflow/ParallelNode.vue index aff62af..7a900c4 100644 --- a/src/agentkit/server/frontend/src/components/workflow/ParallelNode.vue +++ b/src/agentkit/server/frontend/src/components/workflow/ParallelNode.vue @@ -33,48 +33,48 @@ defineProps<{ diff --git a/src/agentkit/server/frontend/src/components/workflow/PropertyPanel.vue b/src/agentkit/server/frontend/src/components/workflow/PropertyPanel.vue index a6b327b..e6a0ce2 100644 --- a/src/agentkit/server/frontend/src/components/workflow/PropertyPanel.vue +++ b/src/agentkit/server/frontend/src/components/workflow/PropertyPanel.vue @@ -177,8 +177,8 @@ function updateConfig(key: string, value: unknown) { diff --git a/src/agentkit/server/frontend/src/main.ts b/src/agentkit/server/frontend/src/main.ts index 273a633..09b1436 100644 --- a/src/agentkit/server/frontend/src/main.ts +++ b/src/agentkit/server/frontend/src/main.ts @@ -1,6 +1,7 @@ import { createApp } from 'vue' import { createPinia } from 'pinia' import 'ant-design-vue/dist/reset.css' +import './styles' import App from './App.vue' import router from './router' diff --git a/src/agentkit/server/frontend/src/router/index.ts b/src/agentkit/server/frontend/src/router/index.ts index 9421ffe..9ad422f 100644 --- a/src/agentkit/server/frontend/src/router/index.ts +++ b/src/agentkit/server/frontend/src/router/index.ts @@ -2,96 +2,139 @@ import { createRouter, createWebHistory } from 'vue-router' import type { RouteRecordRaw } from 'vue-router' const routes: RouteRecordRaw[] = [ + // Agent-First 四象限布局 (新) + { + path: '/agent', + name: 'agent', + component: () => import('@/components/layout/AgentLayout.vue'), + meta: { title: 'AgentKit' }, + children: [ + { + path: '', + redirect: '/agent/chat', + }, + { + path: 'chat', + name: 'agent-chat', + meta: { title: '对话', quadrant: 'tl', tab: 'chat' }, + component: () => import('@/views/ChatView.vue'), + }, + { + path: 'code', + name: 'agent-code', + meta: { title: '代码', quadrant: 'tr', tab: 'code' }, + component: () => import('@/views/WorkflowView.vue'), + }, + { + path: 'terminal', + name: 'agent-terminal', + meta: { title: '终端', quadrant: 'bl', tab: 'terminal' }, + component: () => import('@/views/TerminalView.vue'), + }, + { + path: 'monitor', + name: 'agent-monitor', + meta: { title: '监控', quadrant: 'br', tab: 'monitor' }, + component: () => import('@/views/EvolutionView.vue'), + }, + ], + }, + + // Default redirect to agent layout { path: '/', - name: 'chat', - component: () => import('@/views/ChatView.vue'), - meta: { title: '智能对话' }, + redirect: '/agent', }, + + // Legacy route redirects → agent quadrant routes { path: '/workflow', - name: 'workflow', - component: () => import('@/views/WorkflowView.vue'), - meta: { title: '工作流' }, + redirect: '/agent/code?tab=workflow', }, { path: '/knowledge', - name: 'knowledge', - component: () => import('@/views/KnowledgeBaseView.vue'), - meta: { title: '知识库' }, + redirect: '/agent/code?tab=knowledge', }, { path: '/skills', - name: 'skills', - component: () => import('@/views/SkillsView.vue'), - meta: { title: '技能' }, + redirect: '/agent/monitor?tab=skills', + }, + { + path: '/evolution', + redirect: '/agent/monitor?tab=monitor', + }, + { + path: '/settings', + redirect: '/agent/monitor?tab=settings', }, { path: '/terminal', - name: 'terminal', - component: () => import('@/views/TerminalView.vue'), - meta: { title: '终端' }, + redirect: '/agent/terminal', }, + + // Computer Use (保留独立路由,显示"即将推出") { path: '/computer-use', name: 'computer-use', component: () => import('@/views/ComputerUseView.vue'), meta: { title: 'Computer Use' }, }, + + // Legacy layout (fallback) { - path: '/evolution', - name: 'evolution', - component: () => import('@/views/EvolutionView.vue'), - meta: { title: '自进化' }, + path: '/legacy', + name: 'legacy', + component: () => import('@/components/layout/AppLayout.vue'), + meta: { title: 'Fischer AgentKit (Legacy)' }, children: [ { path: '', - redirect: '/evolution/overview', + redirect: '/legacy/chat', }, { - path: 'overview', - name: 'evolution-overview', - component: () => import('@/components/evolution/DashboardOverview.vue'), - meta: { title: '概览 - 自进化' }, + path: 'chat', + name: 'legacy-chat', + component: () => import('@/views/ChatView.vue'), + meta: { title: '智能对话' }, }, { - path: 'experiences', - name: 'evolution-experiences', - component: () => import('@/components/evolution/ExperiencePanel.vue'), - meta: { title: '经验记录 - 自进化' }, + path: 'workflow', + name: 'legacy-workflow', + component: () => import('@/views/WorkflowView.vue'), + meta: { title: '工作流' }, }, { - path: 'metrics', - name: 'evolution-metrics', - component: () => import('@/components/evolution/MetricsPanel.vue'), - meta: { title: '指标趋势 - 自进化' }, + path: 'knowledge', + name: 'legacy-knowledge', + component: () => import('@/views/KnowledgeBaseView.vue'), + meta: { title: '知识库' }, }, { - path: 'pitfalls', - name: 'evolution-pitfalls', - component: () => import('@/components/evolution/PitfallRoutePanel.vue'), - meta: { title: '避坑预警 - 自进化' }, + path: 'skills', + name: 'legacy-skills', + component: () => import('@/views/SkillsView.vue'), + meta: { title: '技能' }, }, { - path: 'optimizations', - name: 'evolution-optimizations', - component: () => import('@/components/evolution/OptimizationPanel.vue'), - meta: { title: '路径优化 - 自进化' }, + path: 'terminal', + name: 'legacy-terminal', + component: () => import('@/views/TerminalView.vue'), + meta: { title: '终端' }, }, { - path: 'usage', - name: 'evolution-usage', - component: () => import('@/components/evolution/UsagePanel.vue'), - meta: { title: '用量统计 - 自进化' }, + path: 'evolution', + name: 'legacy-evolution', + component: () => import('@/views/EvolutionView.vue'), + meta: { title: '自进化' }, + }, + { + path: 'settings', + name: 'legacy-settings', + component: () => import('@/views/SettingsView.vue'), + meta: { title: '设置' }, }, ], }, - { - path: '/settings', - name: 'settings', - component: () => import('@/views/SettingsView.vue'), - meta: { title: '设置' }, - }, ] const router = createRouter({ diff --git a/src/agentkit/server/frontend/src/stores/workflow.ts b/src/agentkit/server/frontend/src/stores/workflow.ts index 55a821a..16e5d64 100644 --- a/src/agentkit/server/frontend/src/stores/workflow.ts +++ b/src/agentkit/server/frontend/src/stores/workflow.ts @@ -30,9 +30,9 @@ export const useWorkflowStore = defineStore('workflow', () => { const isLoading = ref(false) const error = ref(null) - // Vue Flow state - const flowNodes = ref[]>([]) - const flowEdges = ref([]) + // Vue Flow state — use any[] to avoid @vue-flow/core deep type recursion with Vue 3.5+ + const flowNodes = ref([]) + const flowEdges = ref([]) const selectedNodeId = ref(null) // Undo/Redo state @@ -51,9 +51,9 @@ export const useWorkflowStore = defineStore('workflow', () => { const executionHistoryTotal = ref(0) // --- Getters --- - const selectedNode = computed | null>(() => { + const selectedNode = computed(() => { if (!selectedNodeId.value) return null - return flowNodes.value.find((n) => n.id === selectedNodeId.value) || null + return flowNodes.value.find((n: any) => n.id === selectedNodeId.value) || null }) const selectedNodeData = computed(() => { @@ -65,12 +65,12 @@ export const useWorkflowStore = defineStore('workflow', () => { // --- Internal mutation methods (no command tracking) --- - function _addNodeDirect(node: Node): void { - flowNodes.value = [...flowNodes.value, node] + function _addNodeDirect(node: any): void { + flowNodes.value.push(node) } - function _removeNodeDirect(nodeId: string): { node: Node; edges: Edge[] } | null { - const node = flowNodes.value.find((n) => n.id === nodeId) + function _removeNodeDirect(nodeId: string): { node: any; edges: any[] } | null { + const node = flowNodes.value.find((n: any) => n.id === nodeId) if (!node) return null const removedEdges = flowEdges.value.filter( (e) => e.source === nodeId || e.target === nodeId @@ -97,11 +97,12 @@ export const useWorkflowStore = defineStore('workflow', () => { } function _updateNodeDataDirect(nodeId: string, data: Partial): void { - const index = flowNodes.value.findIndex((n) => n.id === nodeId) + const index = flowNodes.value.findIndex((n: any) => n.id === nodeId) if (index !== -1) { + const existing = flowNodes.value[index] flowNodes.value[index] = { - ...flowNodes.value[index], - data: { ...flowNodes.value[index].data, ...data }, + ...existing, + data: { ...existing.data, ...data }, } } } diff --git a/src/agentkit/server/frontend/src/styles/index.ts b/src/agentkit/server/frontend/src/styles/index.ts new file mode 100644 index 0000000..ca09a45 --- /dev/null +++ b/src/agentkit/server/frontend/src/styles/index.ts @@ -0,0 +1,10 @@ +/** + * Fischer AgentKit Styles Entry + * + * Import this module to load all design tokens and theme configuration. + */ + +import './tokens.css' +import './transitions.css' +import './responsive.css' +export { themeConfig } from './theme' diff --git a/src/agentkit/server/frontend/src/styles/responsive.css b/src/agentkit/server/frontend/src/styles/responsive.css new file mode 100644 index 0000000..c8f6c54 --- /dev/null +++ b/src/agentkit/server/frontend/src/styles/responsive.css @@ -0,0 +1,89 @@ +/** + * Fischer AgentKit Responsive Breakpoints + * + * ≥1440px: Four quadrants fully visible + * 1280-1440px: Bottom-right quadrant auto-collapsed + * <1280px: Prompt to use larger screen + */ + +/* ── Full four-quadrant layout ── */ +@media (min-width: 1440px) { + .agent-layout__body { + display: flex; + } +} + +/* ── Compact: bottom-right quadrant collapsed ── */ +@media (min-width: 1280px) and (max-width: 1439px) { + .agent-layout__body { + display: flex; + } + + /* Auto-collapse bottom-right quadrant at medium widths */ + .agent-layout__body .split-pane--horizontal > .split-pane__second .split-pane--vertical > .split-pane__second .quadrant-panel { + height: auto !important; + } +} + +/* ── Too small: show prompt ── */ +@media (max-width: 1279px) { + .agent-layout__body { + display: none; + } + + .agent-layout__small-screen { + display: flex; + } +} + +/* ── Default: hide small screen prompt ── */ +.agent-layout__small-screen { + display: none; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + gap: var(--space-4); + color: var(--text-tertiary); + text-align: center; + padding: var(--space-8); +} + +.agent-layout__small-screen h2 { + font-size: var(--font-lg); + color: var(--text-primary); +} + +.agent-layout__small-screen p { + font-size: var(--font-base); + max-width: 400px; +} + +/* ── Quadrant min-size for readability ── */ +.quadrant-panel { + min-width: var(--quadrant-min-size); + min-height: var(--quadrant-min-size); +} + +/* ── TopNav responsive ── */ +@media (max-width: 768px) { + .top-nav__center { + display: none; + } +} + +/* ── Chat sidebar responsive ── */ +@media (max-width: 1024px) { + .chat-sidebar:not(.chat-sidebar--collapsed) { + width: 200px; + } +} + +/* ── Print: hide interactive elements ── */ +@media print { + .top-nav, + .split-pane__handle, + .quadrant-panel__collapse-btn { + display: none !important; + } +} diff --git a/src/agentkit/server/frontend/src/styles/theme.ts b/src/agentkit/server/frontend/src/styles/theme.ts new file mode 100644 index 0000000..5cf2f42 --- /dev/null +++ b/src/agentkit/server/frontend/src/styles/theme.ts @@ -0,0 +1,88 @@ +/** + * Ant Design Vue Theme Token Mapping + * + * Reads CSS custom properties at runtime from tokens.css to ensure + * single source of truth. Falls back to hardcoded values if CSS + * variables are not yet available (SSR / build time). + */ + +import type { ThemeConfig } from 'ant-design-vue/es/config-provider/context' + +function readToken(varName: string, fallback: string): string { + if (typeof document === 'undefined') return fallback + const val = getComputedStyle(document.documentElement).getPropertyValue(varName).trim() + return val || fallback +} + +export const themeConfig: ThemeConfig = { + token: { + // Brand — read from CSS variables + colorPrimary: readToken('--color-primary', '#7c3aed'), + colorInfo: readToken('--color-primary', '#7c3aed'), + + // Semantic + colorSuccess: readToken('--color-success', '#10b981'), + colorWarning: readToken('--color-warning', '#f59e0b'), + colorError: readToken('--color-error', '#ef4444'), + + // Text + colorText: readToken('--text-primary', '#171717'), + colorTextSecondary: readToken('--text-secondary', '#525252'), + colorTextTertiary: readToken('--text-tertiary', '#737373'), + colorTextQuaternary: readToken('--text-placeholder', '#a3a3a3'), + + // Background + colorBgContainer: readToken('--bg-primary', '#ffffff'), + colorBgLayout: readToken('--bg-secondary', '#fafafa'), + colorBgElevated: readToken('--bg-primary', '#ffffff'), + + // Border + colorBorder: readToken('--border-color', '#e5e5e5'), + colorBorderSecondary: readToken('--border-color-split', '#f0f0f0'), + + // Font + fontSize: 14, + fontSizeSM: 12, + fontSizeLG: 16, + fontSizeXL: 20, + + // Radius + borderRadius: 8, + borderRadiusSM: 6, + borderRadiusLG: 12, + + // Spacing + marginXS: 4, + marginSM: 8, + margin: 16, + marginMD: 16, + marginLG: 24, + marginXL: 32, + + // Shadow + boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)', + boxShadowSecondary: '0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05)', + + // Control + controlHeight: 32, + controlHeightSM: 24, + controlHeightLG: 40, + }, + components: { + Menu: { + itemSelectedBg: readToken('--color-primary-light', '#ede9fe'), + itemSelectedColor: readToken('--color-primary', '#7c3aed'), + itemHoverBg: '#f5f3ff', + itemHoverColor: readToken('--color-primary', '#7c3aed'), + itemColor: readToken('--text-secondary', '#525252'), + } as Record, + Tabs: { + itemSelectedColor: readToken('--color-primary', '#7c3aed'), + itemHoverColor: readToken('--color-primary-hover', '#6d28d9'), + } as Record, + Select: { + colorPrimary: readToken('--color-primary', '#7c3aed'), + colorPrimaryHover: readToken('--color-primary-hover', '#6d28d9'), + } as Record, + }, +} diff --git a/src/agentkit/server/frontend/src/styles/tokens.css b/src/agentkit/server/frontend/src/styles/tokens.css new file mode 100644 index 0000000..3325388 --- /dev/null +++ b/src/agentkit/server/frontend/src/styles/tokens.css @@ -0,0 +1,136 @@ +/** + * Fischer AgentKit Design Tokens + * + * CSS Custom Properties as the single source of truth. + * Ant Design Vue theme tokens are mapped from these values in theme.ts. + */ + +:root { + /* ── Brand Colors ── */ + --color-primary: #7c3aed; + --color-primary-hover: #6d28d9; + --color-primary-active: #5b21b6; + --color-primary-light: #ede9fe; + --color-primary-bg: #f5f3ff; + + /* ── Gradient ── */ + --gradient-brand: linear-gradient(135deg, #7c3aed 0%, #1e1b4b 100%); + + /* ── Semantic Colors ── */ + --color-success: #10b981; + --color-success-light: #d1fae5; + --color-warning: #f59e0b; + --color-warning-light: #fef3c7; + --color-error: #ef4444; + --color-error-light: #fee2e2; + --color-info: #3b82f6; + --color-info-light: #dbeafe; + + /* ── Neutral / Gray Scale ── */ + --color-gray-50: #fafafa; + --color-gray-100: #f5f5f5; + --color-gray-200: #e5e5e5; + --color-gray-300: #d4d4d4; + --color-gray-400: #a3a3a3; + --color-gray-500: #737373; + --color-gray-600: #525252; + --color-gray-700: #404040; + --color-gray-800: #262626; + --color-gray-900: #171717; + + /* ── Background ── */ + --bg-primary: #ffffff; + --bg-secondary: #fafafa; + --bg-tertiary: #f5f5f5; + --bg-elevated: #ffffff; + --bg-code: #282c34; + + /* ── Foreground / Text ── */ + --text-primary: #171717; + --text-secondary: #525252; + --text-tertiary: #737373; + --text-placeholder: #a3a3a3; + --text-inverse: #ffffff; + --text-code: #abb2bf; + + /* ── Border ── */ + --border-color: #e5e5e5; + --border-color-hover: #d4d4d4; + --border-color-active: var(--color-primary); + --border-color-split: #f0f0f0; + + /* ── Spacing ── */ + --space-1: 4px; + --space-2: 8px; + --space-3: 12px; + --space-4: 16px; + --space-5: 20px; + --space-6: 24px; + --space-8: 32px; + --space-10: 40px; + --space-12: 48px; + + /* ── Border Radius ── */ + --radius-sm: 4px; + --radius-md: 6px; + --radius-lg: 8px; + --radius-xl: 12px; + --radius-full: 9999px; + + /* ── Font Size ── */ + --font-xs: 12px; + --font-sm: 13px; + --font-base: 14px; + --font-md: 16px; + --font-lg: 20px; + --font-xl: 24px; + + /* ── Font Weight ── */ + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + + /* ── Line Height ── */ + --leading-tight: 1.25; + --leading-normal: 1.5; + --leading-relaxed: 1.75; + + /* ── Shadow ── */ + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.08), 0 8px 10px -6px rgba(0, 0, 0, 0.04); + + /* ── Transition ── */ + --transition-fast: 150ms ease; + --transition-normal: 200ms ease; + --transition-slow: 300ms ease; + + /* ── Z-Index ── */ + --z-dropdown: 1000; + --z-sticky: 1020; + --z-fixed: 1030; + --z-modal-backdrop: 1040; + --z-modal: 1050; + --z-popover: 1060; + --z-tooltip: 1070; + + /* ── Layout ── */ + --topnav-height: 48px; + --sidebar-width: 280px; + --quadrant-min-size: 320px; + + /* ── Code Theme (One Dark Pro) ── */ + --code-bg: #282c34; + --code-fg: #abb2bf; + --code-keyword: #c678dd; + --code-string: #98c379; + --code-number: #d19a66; + --code-comment: #5c6370; + --code-function: #61afef; + --code-variable: #e06c75; + --code-type: #e5c07b; + --code-added-bg: rgba(16, 185, 129, 0.15); + --code-removed-bg: rgba(239, 68, 68, 0.15); +} diff --git a/src/agentkit/server/frontend/src/styles/transitions.css b/src/agentkit/server/frontend/src/styles/transitions.css new file mode 100644 index 0000000..7d8eb20 --- /dev/null +++ b/src/agentkit/server/frontend/src/styles/transitions.css @@ -0,0 +1,132 @@ +/** + * Fischer AgentKit Transition Animations + * + * Unified transition classes for Vue components. + * All durations reference Design Token variables for consistency. + */ + +/* ── Fade ── */ +.fade-enter-active, +.fade-leave-active { + transition: opacity var(--transition-fast); +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +/* ── Slide Up ── */ +.slide-up-enter-active, +.slide-up-leave-active { + transition: transform var(--transition-normal), opacity var(--transition-fast); +} + +.slide-up-enter-from, +.slide-up-leave-to { + transform: translateY(8px); + opacity: 0; +} + +/* ── Slide Down ── */ +.slide-down-enter-active, +.slide-down-leave-active { + transition: transform var(--transition-normal), opacity var(--transition-fast); +} + +.slide-down-enter-from, +.slide-down-leave-to { + transform: translateY(-8px); + opacity: 0; +} + +/* ── Slide Right ── */ +.slide-right-enter-active, +.slide-right-leave-active { + transition: transform var(--transition-normal), opacity var(--transition-fast); +} + +.slide-right-enter-from, +.slide-right-leave-to { + transform: translateX(-8px); + opacity: 0; +} + +/* ── Collapse (height) ── */ +.collapse-enter-active, +.collapse-leave-active { + transition: max-height var(--transition-slow) ease, opacity var(--transition-fast); + overflow: hidden; +} + +.collapse-enter-from, +.collapse-leave-to { + max-height: 0; + opacity: 0; +} + +.collapse-enter-to, +.collapse-leave-from { + max-height: 500px; + opacity: 1; +} + +/* ── Scale ── */ +.scale-enter-active, +.scale-leave-active { + transition: transform var(--transition-fast), opacity var(--transition-fast); +} + +.scale-enter-from, +.scale-leave-to { + transform: scale(0.95); + opacity: 0; +} + +/* ── Stagger list items ── */ +.stagger-list-enter-active { + transition: transform var(--transition-normal), opacity var(--transition-fast); +} + +.stagger-list-leave-active { + transition: transform var(--transition-fast), opacity var(--transition-fast); +} + +.stagger-list-enter-from, +.stagger-list-leave-to { + transform: translateY(8px); + opacity: 0; +} + +.stagger-list-move { + transition: transform var(--transition-normal); +} + +/* ── Skeleton pulse ── */ +@keyframes skeleton-pulse { + 0% { opacity: 1; } + 50% { opacity: 0.4; } + 100% { opacity: 1; } +} + +.skeleton-loading { + animation: skeleton-pulse 1.5s ease-in-out infinite; + background: linear-gradient( + 90deg, + var(--bg-tertiary) 25%, + var(--border-color) 50%, + var(--bg-tertiary) 75% + ); + background-size: 200% 100%; + border-radius: var(--radius-sm); +} + +/* ── Pulse dot (running status) ── */ +@keyframes pulse-dot { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.3; } +} + +.pulse-dot { + animation: pulse-dot 1.5s ease-in-out infinite; +} diff --git a/src/agentkit/server/frontend/src/views/ChatView.vue b/src/agentkit/server/frontend/src/views/ChatView.vue index 11e34c4..3203ce7 100644 --- a/src/agentkit/server/frontend/src/views/ChatView.vue +++ b/src/agentkit/server/frontend/src/views/ChatView.vue @@ -119,7 +119,7 @@ function handleSend(message: string): void { display: flex; flex-direction: column; overflow: hidden; - background: #f5f5f5; + background: var(--bg-secondary); } .chat-view__empty { @@ -132,7 +132,7 @@ function handleSend(message: string): void { .chat-view__messages { flex: 1; overflow-y: auto; - padding: 16px 0; + padding: var(--space-4) 0; } .chat-view__welcome { @@ -141,45 +141,48 @@ function handleSend(message: string): void { align-items: center; justify-content: center; height: 100%; - color: #999999; + color: var(--text-placeholder); } .chat-view__welcome-icon { font-size: 48px; - color: #1677ff; - margin-bottom: 16px; + background: var(--gradient-brand); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin-bottom: var(--space-4); } .chat-view__welcome h2 { - color: #333333; - font-size: 24px; - margin-bottom: 8px; + color: var(--text-primary); + font-size: var(--font-xl); + margin-bottom: var(--space-2); } .chat-view__welcome p { - font-size: 14px; - color: #999999; + font-size: var(--font-base); + color: var(--text-tertiary); } .chat-view__steps { - padding: 8px 16px; - margin: 0 16px; - background: #ffffff; - border-radius: 8px; - border: 1px solid #f0f0f0; + padding: var(--space-2) var(--space-4); + margin: 0 var(--space-4); + background: var(--bg-primary); + border-radius: var(--radius-lg); + border: 1px solid var(--border-color); } .chat-view__step { display: flex; align-items: center; - gap: 6px; + gap: var(--space-1); padding: 2px 0; - font-size: 13px; - color: #666666; + font-size: var(--font-sm); + color: var(--text-secondary); } .chat-view__step-icon { font-size: 10px; - color: #1677ff; + color: var(--color-primary); } diff --git a/src/agentkit/server/frontend/src/views/EvolutionView.vue b/src/agentkit/server/frontend/src/views/EvolutionView.vue index e3d81c3..6965238 100644 --- a/src/agentkit/server/frontend/src/views/EvolutionView.vue +++ b/src/agentkit/server/frontend/src/views/EvolutionView.vue @@ -1,65 +1,32 @@ diff --git a/src/agentkit/server/frontend/src/views/TerminalView.vue b/src/agentkit/server/frontend/src/views/TerminalView.vue index fd40ff6..dcead2b 100644 --- a/src/agentkit/server/frontend/src/views/TerminalView.vue +++ b/src/agentkit/server/frontend/src/views/TerminalView.vue @@ -2,59 +2,56 @@
- -
-
-
- - 命令确认 -
-
- {{ terminalStore.pendingConfirmation.command }} -
-
- {{ terminalStore.pendingConfirmation.reason }} -
-
- -
- - -
-
-
+
+
+ +
+
-
- -
+ + +
+
+ {{ terminalStore.pendingConfirmation?.command }} +
+
+ {{ terminalStore.pendingConfirmation?.reason }} +
+ + 添加到会话白名单 + +
+
- - - -
- - - - - -
-
- - AgentKit - 未连接 - -
-
-
-
🤖
-

欢迎使用 AgentKit

-

开始一段新对话,或从侧边栏选择已有会话。

-
-
-
-
- - -
-
-
- - - -
- - - + + + + + Fischer AgentKit + + + + +
+