diff --git a/docs/【编辑器】画布Agent对话面板-2026-07-03.md b/docs/【编辑器】画布Agent对话面板-2026-07-03.md index 2b32dd5e1..8a2c4a2b0 100644 --- a/docs/【编辑器】画布Agent对话面板-2026-07-03.md +++ b/docs/【编辑器】画布Agent对话面板-2026-07-03.md @@ -61,6 +61,7 @@ - 桌面端对话框固定宽约 360–400px;移动端抽屉式全宽覆盖;收起态为胶囊/圆形入口按钮。 - 底部消息输入框随输入内容从单行高度自动增长,最大高度为 128px;输入框及其 Enter 提交、原生自适应和兼容降级统一封装在独立 `EditorAgentDraftTextarea` 组件中。支持 `field-sizing: content` 的浏览器使用原生内容尺寸自适应,不支持该属性的旧 Safari / iOS WebView 使用前端测量降级,并在宽度变化时重新计算换行高度。内容超过最大高度后停止增长并启用内部纵向滚动,内容缩短或清空后同步收缩。内部滚动条使用浅灰窄滑块和透明轨道,上下留白不得溢出输入框圆角边界;输入框在窄屏下允许收缩且不产生横向滚动。 +- Enter 发送必须同时排除 `isComposing` 和旧 Safari / WebKit 候选词确认事件的 `keyCode === 229`,避免输入法选词时误发送。 - 会话管理入口在对话框头部:当前会话标题 + 历史会话下拉(按更新时间倒序)+ 新建对话按钮,全部包在对话框内。 - 当前会话没有任何已发送消息时,新建对话按钮置灰且不可点击;输入框草稿和未发送附件不算会话内容。当前会话已有消息时可新建,新建成功后只切换到返回的空白会话,输入文字、附件及附件选择状态与切换历史会话时一样原样保留,旧会话继续保留在历史会话下拉中;创建失败同样不修改草稿。 - 新会话创建请求 pending 时禁用历史会话下拉和发送动作,但输入框与附件仍可编辑;会话列表或历史消息加载期间同样禁用发送。表单提交处理器必须复用相同门禁,不能先清空草稿再由 hook 静默跳过发送。 diff --git a/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.test.tsx b/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.test.tsx index dc2a572c2..717718fc5 100644 --- a/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.test.tsx +++ b/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.test.tsx @@ -105,7 +105,7 @@ describe('EditorAgentDraftTextarea', () => { expect(disconnect).toHaveBeenCalledTimes(1); }); - it('submits on Enter and keeps Shift+Enter for line breaks', () => { + it('submits on Enter and keeps line breaks or IME confirmation from submitting', () => { const onSubmit = vi.fn((event: FormEvent) => { event.preventDefault(); }); @@ -119,6 +119,13 @@ describe('EditorAgentDraftTextarea', () => { fireEvent.keyDown(input, { key: 'Enter', shiftKey: true }); expect(onSubmit).not.toHaveBeenCalled(); + fireEvent.keyDown(input, { + key: 'Enter', + isComposing: false, + keyCode: 229, + }); + expect(onSubmit).not.toHaveBeenCalled(); + fireEvent.keyDown(input, { key: 'Enter' }); expect(onSubmit).toHaveBeenCalledTimes(1); }); diff --git a/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.tsx b/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.tsx index ff043f4dd..74d57d75c 100644 --- a/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.tsx +++ b/src/components/image-editor/EditorAgentConversation/EditorAgentDraftTextarea.tsx @@ -87,9 +87,11 @@ export function EditorAgentDraftTextarea({ }, []); const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === 'Enter' - && !event.shiftKey - && !event.nativeEvent.isComposing + if ( + event.key === 'Enter' && + !event.shiftKey && + !event.nativeEvent.isComposing && + event.nativeEvent.keyCode !== 229 ) { event.preventDefault(); event.currentTarget.form?.requestSubmit();