From 7e036a7199fd9028e872b19a56f5cd7e78f7e267 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Tue, 6 Oct 2026 10:57:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=A6=E8=89=B2=E9=92=AE=E6=8C=AA=E5=88=B0?= =?UTF-8?q?=E5=8F=91=E9=80=81=E9=92=AE=E5=B7=A6=E8=BE=B9=EF=BC=88=E5=8F=B3?= =?UTF-8?q?=E7=BB=84=E7=9B=B8=E9=82=BB=E6=88=90=E7=BB=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 口径:AI 润色 / 恢复原文与发送钮同为圆角矩形按钮,放一起更协调 → 从「左组 `@` `+` 之后」挪到**右组最末、发送钮左侧**,最终顺序 `@` `+` | 模型 麦克风 润色 发送(`space-between` 左右分组不变) - 实现:portal 挂点搬进右组(`DirectProjectComposer` 里把 `.project-chat-composer-controls-actions` 移到 `-controls-right` 内、发送钮之前),`actionsPortalTarget` 的「可选 prop、不传则行为不变」契约保持;用显式槽位而不是 CSS `order`,因为 DOM 顺序即 Tab 与读屏顺序(现在就是 模型 → 麦克风 → 润色 → 发送,与视觉一致) - 注释/文档同步:composer 与 styles.css 里「与 `@` / `+` 同组、排在左组最后一个」那类旧口径全部改成新口径(「与发送同为圆角矩形按钮、相邻成组」),pitfalls 同段一并更新;全仓 grep `输入类动作` / `生成类动作` / `排在左组` / `左组最后一个` 命中 0 - 测试:`chat-composer.suite.ts` 的 DOM 断言改成新挂点——润色钮必须在 `.project-chat-composer-controls` 内、父链是 `-controls-right`、**`slot.nextElementSibling` 就是发送钮**、且 `compareDocumentPosition` 证明润色在发送之前;`chatDialogFrameLayout.test.ts` 的源码顺序断言改成「挂点在 `-controls-right` 之后、`{canStopTurn` 之前」;空态「工具条之外无第二个按钮」计数仍为 6;七宽度单行/不相交用例不变(含新位置) - min-width 复核(无头 Chromium 夹具,240/280/296/320/360/438/900 七档):控件排仍 **252px** 所需、外壳仍 **278px**;自然宽度 290.4(438/900 档)→ 算式不变;七档 `topSpread ≤ 1px`、控件两两相交 **0** 处、`outsideControlsRow` 空、润色钮与发送钮间距固定 **8px**(同一行、同一组) - 截图:240px 改前→改后 + 438px 改后 + 438px toast 已换新(正文引用与附件 1:1:12 = 12,未引用的旧图已删) Refs #600, PR #607 --- apps/ai-game-creator-shell/src/styles.css | 3 ++- .../DirectProjectComposer.tsx | 17 +++++++------- .../tests/appSurface/chat-composer.suite.ts | 23 +++++++++++++++---- .../tests/chatDialogFrameLayout.test.ts | 11 +++++---- docs/project-memory/shared-memory/pitfalls.md | 2 +- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/apps/ai-game-creator-shell/src/styles.css b/apps/ai-game-creator-shell/src/styles.css index eb03ad61e..cfeefa4ef 100644 --- a/apps/ai-game-creator-shell/src/styles.css +++ b/apps/ai-game-creator-shell/src/styles.css @@ -13717,7 +13717,8 @@ details.design-agent-reasoning[open] 嵌在菜单顶部,与模型列表共用同一张卡(`.conversation-model-menu-shell`)。 */ /* 工具条里的「AI 润色 / 恢复原文」挂点(`ResourceReferenceInput` 用 portal 渲染进来): - 与 `@` / `+` 同组,排在左组最后一个;空输入态只是不显示按钮,不占额外行。 */ + 位于**右组发送钮之前**——润色钮与发送钮同为圆角矩形按钮,相邻成组;空输入态只是不显示 + 按钮,不占额外行。DOM 顺序即 `模型 → 麦克风 → 润色 → 发送`(Tab / 读屏顺序同视觉)。 */ .game-workbench-chat .project-chat-surface.is-direct-codex .project-chat-composer.is-direct-codex diff --git a/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectComposer/DirectProjectComposer.tsx b/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectComposer/DirectProjectComposer.tsx index 7e5e1278e..01b519ba6 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectComposer/DirectProjectComposer.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectComposer/DirectProjectComposer.tsx @@ -266,8 +266,8 @@ export function DirectProjectComposer({ placeholder="描述你的想法,或 @ 引用素材" submitSuppressed={pickerOpen} containerRef={composerRootRef} - /* 「AI 润色 / 恢复原文」排进下方工具条:与 `@` / `+` / 模型 / 语音 / 发送 同一行, - 空输入态也不再自带一行(窄面板下那一行看起来像"堆叠")。 */ + /* 「AI 润色 / 恢复原文」排进下方工具条**发送钮左边**:与发送钮同为圆角矩形按钮、 + 相邻成组;空输入态也不再自带一行(窄面板下那一行看起来像"堆叠")。 */ actionsPortalTarget={controlsActionsSlot} />
@@ -287,12 +287,6 @@ export function DirectProjectComposer({ onPickFiles={(files) => void uploadFiles(files)} onOpenReferencePicker={openPicker} /> - {/* 润色 / 恢复原文的挂点(portal 目标):紧跟在 `+` 之后,与输入类动作同组, - 右侧留给"生成类"控件(模型 / 语音 / 发送)。 */} -
+ {/* 润色 / 恢复原文的挂点(portal 目标):放在**发送钮左边**——它与发送钮同为 + 圆角矩形按钮,相邻成组更协调;DOM 顺序即 `模型 → 麦克风 → 润色 → 发送`, + 所以 Tab 序与读屏顺序与视觉一致。 */} + {canStopTurn ? (