From 2ece4c6e9f2d85771bfa55b73d291f7fd0f4e705 Mon Sep 17 00:00:00 2001 From: gongchengtu <1817063960@qq.com> Date: Wed, 10 Dec 2025 22:13:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(toolbox):=20=E5=AE=9E=E7=8E=B0=E5=A4=9A?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B7=A5=E5=85=B7=E7=AE=B1=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增工具箱核心架构 - ToolboxDrawer: 工具抽屉组件,支持搜索、分类和自定义工具 - CustomToolDialog: 自定义工具添加对话框 - Tool Element: 工具嵌入系统,支持 iframe 加载和双击编辑 - Minimap: 小地图导航组件,智能显示/隐藏 - 新增工具箱服务层 - toolbox-service: 工具管理服务,支持内置和自定义工具 - tool-communication-service: 跨域通信服务,支持 postMessage API - 新增 Slate 插件 - with-tool: 工具元素基础插件 - with-tool-focus: 工具焦点管理插件 - with-tool-resize: 工具大小调整插件 - UI 优化 - 工具栏新增工具箱按钮 - 项目抽屉样式优化 - Z-index 层级管理优化 - 文档和规范 - 新增架构文档 (ARCHITECTURE.md) - 新增实现文档 (IMPLEMENTATION.md) - 新增阶段完成记录 (PHASE1-3) - 新增问题修复记录 (BUGFIX) --- apps/web/index.html | 2 +- apps/web/public/version.json | 4 +- .../custom-tool-dialog/CustomToolDialog.tsx | 272 ++++ .../custom-tool-dialog.scss | 121 ++ .../src/components/minimap/Minimap.tsx | 567 ++++++++ .../drawnix/src/components/minimap/README.md | 313 +++++ .../drawnix/src/components/minimap/index.ts | 14 + .../src/components/minimap/minimap.scss | 132 ++ .../project-drawer/project-drawer.scss | 2 +- .../tool-element/ToolErrorOverlay.tsx | 107 ++ .../tool-element/tool-error-overlay.scss | 102 ++ .../tool-element/tool.component.scss | 98 ++ .../components/tool-element/tool.component.ts | 183 +++ .../components/tool-element/tool.generator.ts | 454 +++++++ .../toolbar/bottom-actions-section.tsx | 49 + .../toolbar/popup-toolbar/popup-toolbar.tsx | 21 +- .../src/components/toolbar/toolbar.types.ts | 8 + .../src/components/toolbar/toolbox-button.tsx | 96 ++ .../components/toolbar/unified-toolbar.tsx | 8 +- .../components/toolbox-drawer/ToolItem.tsx | 37 + .../components/toolbox-drawer/ToolList.tsx | 63 + .../toolbox-drawer/ToolboxDrawer.tsx | 249 ++++ .../toolbox-drawer/toolbox-drawer.scss | 288 ++++ .../drawnix/src/constants/built-in-tools.ts | 61 + packages/drawnix/src/constants/z-index.ts | 2 + packages/drawnix/src/drawnix.tsx | 48 +- .../drawnix/src/plugins/with-tool-focus.ts | 214 +++ .../drawnix/src/plugins/with-tool-resize.ts | 269 ++++ packages/drawnix/src/plugins/with-tool.ts | 459 +++++++ .../services/tool-communication-service.ts | 313 +++++ .../drawnix/src/services/toolbox-service.ts | 276 ++++ packages/drawnix/src/styles/index.scss | 4 + .../drawnix/src/styles/toolbox-theme.scss | 51 + packages/drawnix/src/types/minimap.types.ts | 111 ++ .../src/types/tool-communication.types.ts | 155 +++ .../drawnix/src/types/tool-error.types.ts | 56 + packages/drawnix/src/types/toolbox.types.ts | 104 ++ .../drawnix/src/utils/tool-test-helper.ts | 218 +++ .../ARCHITECTURE.md | 549 ++++++++ .../BUGFIX_DELETION_SUPPORT.md | 345 +++++ .../BUGFIX_DOUBLE_CLICK_EDIT.md | 439 ++++++ .../BUGFIX_TRANSFORMS_API.md | 337 +++++ .../IMPLEMENTATION.md | 717 ++++++++++ .../PHASE1_COMPLETE.md | 224 +++ .../PHASE2_COMPLETE.md | 316 +++++ .../PHASE3_ARCHITECTURE.md | 1209 +++++++++++++++++ .../PHASE3_COMPLETE.md | 358 +++++ .../PHASE3_P0_COMPLETE.md | 363 +++++ .../PHASE3_PLAN.md | 701 ++++++++++ 49 files changed, 11074 insertions(+), 15 deletions(-) create mode 100644 packages/drawnix/src/components/custom-tool-dialog/CustomToolDialog.tsx create mode 100644 packages/drawnix/src/components/custom-tool-dialog/custom-tool-dialog.scss create mode 100644 packages/drawnix/src/components/minimap/Minimap.tsx create mode 100644 packages/drawnix/src/components/minimap/README.md create mode 100644 packages/drawnix/src/components/minimap/index.ts create mode 100644 packages/drawnix/src/components/minimap/minimap.scss create mode 100644 packages/drawnix/src/components/tool-element/ToolErrorOverlay.tsx create mode 100644 packages/drawnix/src/components/tool-element/tool-error-overlay.scss create mode 100644 packages/drawnix/src/components/tool-element/tool.component.scss create mode 100644 packages/drawnix/src/components/tool-element/tool.component.ts create mode 100644 packages/drawnix/src/components/tool-element/tool.generator.ts create mode 100644 packages/drawnix/src/components/toolbar/toolbox-button.tsx create mode 100644 packages/drawnix/src/components/toolbox-drawer/ToolItem.tsx create mode 100644 packages/drawnix/src/components/toolbox-drawer/ToolList.tsx create mode 100644 packages/drawnix/src/components/toolbox-drawer/ToolboxDrawer.tsx create mode 100644 packages/drawnix/src/components/toolbox-drawer/toolbox-drawer.scss create mode 100644 packages/drawnix/src/constants/built-in-tools.ts create mode 100644 packages/drawnix/src/plugins/with-tool-focus.ts create mode 100644 packages/drawnix/src/plugins/with-tool-resize.ts create mode 100644 packages/drawnix/src/plugins/with-tool.ts create mode 100644 packages/drawnix/src/services/tool-communication-service.ts create mode 100644 packages/drawnix/src/services/toolbox-service.ts create mode 100644 packages/drawnix/src/styles/toolbox-theme.scss create mode 100644 packages/drawnix/src/types/minimap.types.ts create mode 100644 packages/drawnix/src/types/tool-communication.types.ts create mode 100644 packages/drawnix/src/types/tool-error.types.ts create mode 100644 packages/drawnix/src/types/toolbox.types.ts create mode 100644 packages/drawnix/src/utils/tool-test-helper.ts create mode 100644 specs/008-multifunctional-toolbox/ARCHITECTURE.md create mode 100644 specs/008-multifunctional-toolbox/BUGFIX_DELETION_SUPPORT.md create mode 100644 specs/008-multifunctional-toolbox/BUGFIX_DOUBLE_CLICK_EDIT.md create mode 100644 specs/008-multifunctional-toolbox/BUGFIX_TRANSFORMS_API.md create mode 100644 specs/008-multifunctional-toolbox/IMPLEMENTATION.md create mode 100644 specs/008-multifunctional-toolbox/PHASE1_COMPLETE.md create mode 100644 specs/008-multifunctional-toolbox/PHASE2_COMPLETE.md create mode 100644 specs/008-multifunctional-toolbox/PHASE3_ARCHITECTURE.md create mode 100644 specs/008-multifunctional-toolbox/PHASE3_COMPLETE.md create mode 100644 specs/008-multifunctional-toolbox/PHASE3_P0_COMPLETE.md create mode 100644 specs/008-multifunctional-toolbox/PHASE3_PLAN.md diff --git a/apps/web/index.html b/apps/web/index.html index 51c2d772..dd9462ce 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -61,7 +61,7 @@ - + diff --git a/apps/web/public/version.json b/apps/web/public/version.json index 6ca6b9d1..fe992d4a 100644 --- a/apps/web/public/version.json +++ b/apps/web/public/version.json @@ -1,5 +1,5 @@ { "version": "0.2.13", - "buildTime": "2025-12-06T10:48:13.784Z", + "buildTime": "2025-12-09T03:35:03.461Z", "gitCommit": "unknown" -} +} \ No newline at end of file diff --git a/packages/drawnix/src/components/custom-tool-dialog/CustomToolDialog.tsx b/packages/drawnix/src/components/custom-tool-dialog/CustomToolDialog.tsx new file mode 100644 index 00000000..f604329c --- /dev/null +++ b/packages/drawnix/src/components/custom-tool-dialog/CustomToolDialog.tsx @@ -0,0 +1,272 @@ +/** + * Custom Tool Dialog + * + * 自定义工具添加对话框 + * 提供表单用于添加新的自定义工具 + */ + +import React, { useState, useCallback } from 'react'; +import { + Dialog, + Form, + Input, + Textarea, + Select, + Button, + MessagePlugin, +} from 'tdesign-react'; +import { ToolDefinition, ToolCategory } from '../../types/toolbox.types'; +import { toolboxService } from '../../services/toolbox-service'; +import './custom-tool-dialog.scss'; + +const { FormItem } = Form; +const { Option } = Select; + +export interface CustomToolDialogProps { + /** 对话框是否可见 */ + visible: boolean; + /** 关闭回调 */ + onClose: () => void; + /** 添加成功回调 */ + onSuccess?: (tool: ToolDefinition) => void; +} + +// Emoji 预设列表 +const EMOJI_PRESETS = [ + '🔧', '🛠️', '⚙️', '🔨', '🎨', '✏️', '📝', '📊', + '📈', '📉', '🎯', '🎪', '🎭', '🎬', '📷', '🖼️', + '🌟', '⭐', '✨', '💡', '🔮', '🎲', '🎮', '🕹️', +]; + +// 分类选项 +const CATEGORY_OPTIONS = [ + { value: ToolCategory.AI_TOOLS, label: 'AI 工具' }, + { value: ToolCategory.CONTENT_TOOLS, label: '内容工具' }, + { value: ToolCategory.UTILITIES, label: '实用工具' }, + { value: ToolCategory.CUSTOM, label: '自定义' }, +]; + +/** + * 自定义工具对话框组件 + */ +export const CustomToolDialog: React.FC = ({ + visible, + onClose, + onSuccess, +}) => { + // 表单状态 + const [formData, setFormData] = useState>({ + name: '', + url: '', + description: '', + icon: '🔧', + category: ToolCategory.CUSTOM, + defaultWidth: 800, + defaultHeight: 600, + }); + + const [loading, setLoading] = useState(false); + + // 更新表单字段 + const updateField = useCallback((field: keyof ToolDefinition, value: any) => { + setFormData((prev) => ({ ...prev, [field]: value })); + }, []); + + // 验证表单 + const validateForm = useCallback((): string | null => { + if (!formData.name || formData.name.trim().length === 0) { + return '请输入工具名称'; + } + + if (formData.name.length > 50) { + return '工具名称不能超过 50 个字符'; + } + + if (!formData.url || formData.url.trim().length === 0) { + return '请输入工具 URL'; + } + + // URL 格式验证 + try { + const url = new URL(formData.url); + if (!['https:', 'http:'].includes(url.protocol)) { + return '只允许使用 HTTP/HTTPS 协议'; + } + } catch (e) { + return 'URL 格式不正确'; + } + + if (formData.description && formData.description.length > 200) { + return '工具描述不能超过 200 个字符'; + } + + return null; + }, [formData]); + + // 提交表单 + const handleSubmit = useCallback(async () => { + // 验证表单 + const error = validateForm(); + if (error) { + MessagePlugin.warning(error); + return; + } + + setLoading(true); + + try { + // 添加自定义工具 + await toolboxService.addCustomTool(formData as ToolDefinition); + + MessagePlugin.success('工具添加成功!'); + + // 重置表单 + setFormData({ + name: '', + url: '', + description: '', + icon: '🔧', + category: ToolCategory.CUSTOM, + defaultWidth: 800, + defaultHeight: 600, + }); + + // 调用成功回调 + if (onSuccess) { + onSuccess(formData as ToolDefinition); + } + + // 关闭对话框 + onClose(); + } catch (error) { + console.error('Failed to add custom tool:', error); + MessagePlugin.error( + error instanceof Error ? error.message : '添加工具失败,请重试' + ); + } finally { + setLoading(false); + } + }, [formData, validateForm, onSuccess, onClose]); + + // 取消操作 + const handleCancel = useCallback(() => { + // 重置表单 + setFormData({ + name: '', + url: '', + description: '', + icon: '🔧', + category: ToolCategory.CUSTOM, + defaultWidth: 800, + defaultHeight: 600, + }); + onClose(); + }, [onClose]); + + return ( + + + + + } + > +
+ + updateField('name', value)} + placeholder="例如:香蕉提示词" + maxlength={50} + /> + + + + updateField('url', value)} + placeholder="https://example.com" + /> + + + +