修 #600 评审 P2:行高算式取真实决定值、推理档 flex 写回所有者、删死重
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m20s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m2s
Project CI / Backend tests (pull_request) Failing after 3m52s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m40s
Project CI / Frontend tests (pull_request) Successful in 3m27s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m16s
Project CI / Repository checks (pull_request) Failing after 3m56s
Project CI / Native shell tests (pull_request) Successful in 6m56s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m20s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m2s
Project CI / Backend tests (pull_request) Failing after 3m52s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 6m40s
Project CI / Frontend tests (pull_request) Successful in 3m27s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m16s
Project CI / Repository checks (pull_request) Failing after 3m56s
Project CI / Native shell tests (pull_request) Successful in 6m56s
- 测试:`composerMaxHeight()` 的工具栏行高改取该排最高控件的 `Math.max`(模型触发钮 30px > 发送钮 28px),输入盒最高高度 254 → 256,并新增「触发钮高度 = 30」断言,不再写死发送钮
- `appSurface` 的编辑器高度断言改钉生效规则(六类选择器那条 72 / 160),原五类规则的 96 / 140 已随死重删除
- Direct 推理档的 `flex: 0 0 auto` 写回其所有者规则(原 `flex: 0 1 auto` 那条),末尾区块不再重复声明同属性;区块头注明本区块不依赖源码顺序
- 删死重(均恒被更高特异性规则覆盖):≤1000px 媒体块里五类的 `.resource-reference-input { padding: 10px 12px 6px }`;五类输入规则的 `display` / `width` / `padding` / `border-color` / `border-radius` / `background`(保留仍生效的 `color` 与 `pointer-events`);五类 `:focus-within` 整条(被六类 `border: 0; outline: none; box-shadow: none` 恒覆盖);五类编辑器规则的 `min-height` / `max-height`
- 校验:`chatDialogFrameLayout.test.ts` 12/12、`appSurface.test.ts` 196 passed / 9 skipped、`npm run agc:typecheck` 通过、prettier 通过
This commit is contained in:
@@ -10287,14 +10287,9 @@ iframe.preview-frame {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
/* 窄屏:输入框左右留白收紧,操作排(`@` / AI 润色 / 恢复原文)保持单行不换行,
|
||||
编辑器靠 `minmax(0, 1fr)` 吸收宽度,不会挤出横向滚动条。 */
|
||||
.game-workbench-chat
|
||||
.project-chat-surface.is-direct-codex
|
||||
.project-chat-composer
|
||||
.resource-reference-input {
|
||||
padding: 10px 12px 6px;
|
||||
}
|
||||
/* 窄屏输入框的内边距由六类选择器的
|
||||
`.… .project-chat-composer.is-direct-codex .resource-reference-input` 统一给(`padding: 0`),
|
||||
这里原有一条五类的 `padding: 10px 12px 6px` 恒不生效,已按「删死重」删除。 */
|
||||
|
||||
.game-workbench-chat .project-chat-surface,
|
||||
.game-workbench-chat .project-chat-conversation {
|
||||
@@ -11703,7 +11698,9 @@ button.design-workspace-tree__entry:hover,
|
||||
.project-chat-reasoning-effort {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
flex: 0 1 auto;
|
||||
/* 档位文案很短(默认 / 高 / 中 / 低),不参与收缩——收缩会把它截成半个字;
|
||||
要让位时由模型钮(名字走省略号)承担。 */
|
||||
flex: 0 0 auto;
|
||||
min-width: 0;
|
||||
gap: 6px;
|
||||
}
|
||||
@@ -11905,29 +11902,19 @@ button.design-workspace-tree__entry:hover,
|
||||
max-height: 24px;
|
||||
}
|
||||
|
||||
/* 输入区仍然生效的两条声明:文字色与可交互性。几何(`display` / `width` / `padding`)、
|
||||
描边与底色全部由更高特异性的
|
||||
`.game-workbench-chat .project-chat-surface.is-direct-codex .project-chat-composer.is-direct-codex
|
||||
.resource-reference-input` 那两条规则决定(六类 > 五类),这里的同属性声明恒不生效,
|
||||
已按「删死重」删除。 */
|
||||
.game-workbench-chat
|
||||
.project-chat-surface.is-direct-codex
|
||||
.project-chat-composer
|
||||
.resource-reference-input {
|
||||
display: grid;
|
||||
width: 100%;
|
||||
padding: 12px 15px 6px;
|
||||
border-color: var(--platform-surface-border);
|
||||
border-radius: 14px;
|
||||
background: var(--platform-input-fill);
|
||||
color: var(--platform-text-base);
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.game-workbench-chat
|
||||
.project-chat-surface.is-direct-codex
|
||||
.project-chat-composer
|
||||
.resource-reference-input:focus-within {
|
||||
border-color: var(--platform-surface-hover-border);
|
||||
outline: none;
|
||||
box-shadow: 0 0 0 3px var(--platform-input-focus-ring);
|
||||
}
|
||||
|
||||
.game-workbench-chat
|
||||
.project-chat-surface.is-direct-codex
|
||||
.project-chat-composer
|
||||
@@ -11940,12 +11927,13 @@ button.design-workspace-tree__entry:hover,
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* 编辑器的行高与滚动:`min-height` / `max-height` 由更高特异性的
|
||||
`.… .project-chat-composer.is-direct-codex .resource-reference-input .resource-reference-input-editor`
|
||||
那条决定(六类 + 额外一层 `.resource-reference-input`),这里的旧值恒不生效,已删。 */
|
||||
.game-workbench-chat
|
||||
.project-chat-surface.is-direct-codex
|
||||
.project-chat-composer
|
||||
.resource-reference-input-editor {
|
||||
min-height: 96px;
|
||||
max-height: 140px;
|
||||
overflow-y: auto;
|
||||
padding: 0;
|
||||
font-size: 13px;
|
||||
@@ -13155,8 +13143,10 @@ details.design-agent-reasoning[open]
|
||||
.is-direct-codex .project-chat-composer.is-direct-codex`)。策划输入区
|
||||
(`PlanningChatView` / `.game-workbench-layout--design`)不在本 issue 范围内,
|
||||
本次一行都不动:它的控件排几何、下拉宽度、提示段落 margin 全部保持改动前的值。
|
||||
这一组只补前文没有的属性;模型钮的 160px 上限 / 64px 下限、提示段落 margin 均
|
||||
写在前文各自那条规则里(Direct 侧用多一层真实祖先提高特异性,不依赖源码顺序)。
|
||||
这一组只补前文没有的属性;模型钮的 160px 上限 / 64px 下限、推理档的
|
||||
`flex: 0 0 auto`、提示段落 margin 均写在前文各自那条规则里(Direct 侧用多一层
|
||||
真实祖先提高特异性)。**本区块不依赖源码顺序**:这里要么是前文从未声明过的属性,
|
||||
要么用更长的选择器链严格盖过前文,把整块挪到文件中间结果也不变。
|
||||
① 工具栏里的下拉控件(推理档 / 模型)要能收缩、模型名要能省略,宽度不够时靠换行
|
||||
让位,而不是把整组推到输入盒外面去和左边的 `@` `+` 重叠;
|
||||
② 模型控件自己的状态提示(`ConversationModelSelect` 的 `[role='alert']` /
|
||||
@@ -13186,14 +13176,12 @@ details.design-agent-reasoning[open]
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
/* 推理档:档位文案很短(默认 / 高 / 中 / 低),不参与收缩——收缩会把它截成半个字,
|
||||
要让位时由模型钮(名字走省略号)承担;读写失败提示整行右对齐。 */
|
||||
/* 推理档的读写失败提示整行右对齐(`flex: 0 0 auto` 已写回上面那条推理档规则)。 */
|
||||
.game-workbench-chat
|
||||
.project-chat-surface.is-direct-codex
|
||||
.project-chat-composer.is-direct-codex
|
||||
.project-chat-composer-controls
|
||||
.project-chat-reasoning-effort {
|
||||
flex: 0 0 auto;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
@@ -6369,13 +6369,16 @@ export function registerProjectWorkbenchFoundationTests() {
|
||||
expect(messageListRule).toContain('padding-bottom: 0;');
|
||||
expect(messageListRule).toContain('flex: 1 1 auto;');
|
||||
|
||||
// 编辑器高度上限仍是输入盒高度的来源之一。
|
||||
// 编辑器的 min/max 高度是输入盒高度的来源之一。生效声明在六类选择器那条
|
||||
// (比旧五类规则多一层 `.resource-reference-input`,严格更高),旧规则的 96 / 140
|
||||
// 恒不生效、已按「删死重」删除;层叠生效值与输入盒最高高度算式由
|
||||
// tests/chatDialogFrameLayout.test.ts 验证。
|
||||
const editorRule =
|
||||
styles.match(
|
||||
/\.game-workbench-chat\s+\.project-chat-surface\.is-direct-codex\s+\.project-chat-composer\s+\.resource-reference-input-editor\s*\{([^}]*)\}/s,
|
||||
/\.game-workbench-chat\s+\.project-chat-surface\.is-direct-codex\s+\.project-chat-composer\.is-direct-codex\s+\.resource-reference-input\s+\.resource-reference-input-editor\s*\{([^}]*)\}/s,
|
||||
)?.[1] ?? '';
|
||||
expect(styleNumber(editorRule, 'max-height')).toBe(140);
|
||||
expect(styleNumber(editorRule, 'min-height')).toBe(96);
|
||||
expect(styleNumber(editorRule, 'max-height')).toBe(160);
|
||||
expect(styleNumber(editorRule, 'min-height')).toBe(72);
|
||||
});
|
||||
|
||||
it('keeps workbench chat bubbles aligned and the process card inset with them', () => {
|
||||
|
||||
@@ -152,6 +152,11 @@ const COMPOSER_EDITOR = `${COMPOSER_INPUT} .resource-reference-input-editor`;
|
||||
const COMPOSER_EDITOR_PLAIN = `${COMPOSER_PLAIN} .resource-reference-input-editor`;
|
||||
const COMPOSER_CONTROLS = `${COMPOSER} .project-chat-composer-controls`;
|
||||
const COMPOSER_SUBMIT = `${COMPOSER_CONTROLS} .project-chat-submit-button`;
|
||||
/** 模型触发钮:工具栏那一排里最高的一颗(30px),行高由它决定而不是发送钮(28px)。 */
|
||||
const COMPOSER_TRIGGER = `${COMPOSER_CONTROLS} .conversation-model-trigger`;
|
||||
/** 触发钮的基础几何规则挂在 `.project-chat-composer`(不带 `.is-direct-codex`)上,同样命中。 */
|
||||
const COMPOSER_TRIGGER_BASE =
|
||||
'.project-chat-surface.is-direct-codex .project-chat-composer .conversation-model-trigger';
|
||||
const INPUT_ACTIONS = `${COMPOSER_INPUT} .resource-reference-input-actions`;
|
||||
const INPUT_ACTIONS_PLAIN = `${COMPOSER} .resource-reference-input-actions`;
|
||||
const TOPBAR = `${CHAT} .project-chat-topbar`;
|
||||
@@ -197,6 +202,7 @@ function composerMaxHeight() {
|
||||
);
|
||||
const controls = desktopDeclarations(COMPOSER_CONTROLS);
|
||||
const submit = desktopDeclarations(COMPOSER_SUBMIT);
|
||||
const trigger = desktopDeclarations(COMPOSER_TRIGGER, COMPOSER_TRIGGER_BASE);
|
||||
|
||||
const editorMaxHeight = pixelValue(editor, 'max-height');
|
||||
const actionsRowHeight = pixelValue(polishButton, 'height');
|
||||
@@ -207,13 +213,21 @@ function composerMaxHeight() {
|
||||
const inputPaddingBottom = paddingBox(input).bottom;
|
||||
const composerPaddingTop = paddingBox(composer).top;
|
||||
const composerPaddingBottom = paddingBox(composer).bottom;
|
||||
// 工具栏自己的高度就是那颗 28px 方钮:与输入区之间的间距归输入盒的 row-gap,
|
||||
// 工具栏不再自带 padding-top(否则就是同一段间距写两遍)。
|
||||
// 工具栏行高由这一排里**最高的一颗控件**决定:模型触发钮 30px 高于发送 / 语音的
|
||||
// 28px(`align-items: center` 只做居中,不会把行高压回 28)。所以这里取两者最大值,
|
||||
// 而不是写死某一颗钮的高度——改任一颗的尺寸都会自动反映到算式里。
|
||||
expect(
|
||||
controls.has('padding-top'),
|
||||
'工具栏与输入区之间的间距由输入盒的 row-gap 提供,不再用 padding-top',
|
||||
).toBe(false);
|
||||
const controlsRowHeight = pixelValue(submit, 'height');
|
||||
expect(
|
||||
pixelValue(trigger, 'height'),
|
||||
'工具栏行高由模型触发钮决定,改了要重新核对这条算式',
|
||||
).toBe(30);
|
||||
const controlsRowHeight = Math.max(
|
||||
pixelValue(submit, 'height'),
|
||||
pixelValue(trigger, 'height'),
|
||||
);
|
||||
|
||||
expect(
|
||||
pixelValue(editor, 'min-height'),
|
||||
@@ -301,10 +315,10 @@ describe('陶泥儿对话区:Codex 三段式(顶栏 / 唯一滚动区 / 文
|
||||
|
||||
// 输入盒最高高度由真实声明算出来(三层布局,自上而下):
|
||||
// 盒内上内边距 12 + 编辑器 160 + 输入区行距 6 + 操作排 28 + 输入区下内边距 0
|
||||
// + 输入盒与工具栏的行距 8 + 工具栏 28 + 盒内下内边距 12 = 254。
|
||||
// + 输入盒与工具栏的行距 8 + 工具栏 30(模型触发钮撑起来的行高)+ 盒内下内边距 12 = 256。
|
||||
expect(actionsRowHeight, '操作排按钮高度变了就要重算下面的算式').toBe(28);
|
||||
expect(pixelValue(desktopDeclarations(COMPOSER_SUBMIT), 'height')).toBe(28);
|
||||
expect(total).toBe(254);
|
||||
expect(total).toBe(256);
|
||||
|
||||
const paddingBottom = paddingBox(list).bottom;
|
||||
// 新契约:留白归 0。旧版这里是一条 `inset + 输入区最高高度 + 间距` 的算式,
|
||||
|
||||
Reference in New Issue
Block a user