修复陶泥儿对话外框没把输入区包住:外框底边不再与输入区重合
- 根因:`.project-supervisor-message-list` 在文件末尾还留着一条同选择器、同权重的
`bottom: 156px`("列表在上、输入区在下"那版两盒布局的残留)。它按"后写胜出"把上一轮
bdb07c141 改的 `bottom: 0` 悄悄顶掉,外框底边落在输入区腰上、输入区下半截露在框外,
真机上看到的就是"消息区外框底边与输入区压在一起、外框没把输入区完整包住"。
- styles.css:把那条残留规则换成对话框盒子的最终几何(top/right/bottom/left 全 0,
`padding-bottom` 与 `scroll-padding-bottom` 都是 256px)。它位置在文件靠后,同权重后写
胜出,顺带把 `:has(.plan-gdd-surface, .planning-lane-runtime-strip)` 给列表留的
`padding-bottom: 12px` 压回去,滚到底时最后一条消息不会被输入区盖住。
- styles.css:输入区补上第四条边——`max-height: calc(100% - 24px)`(24px = 上下各 12px)。
左右下三边仍显式内缩 12px,上边由 max-height 兜底,于是外框完整包住输入区:四条边都不
与外框描边重合,底边留出 12px 边距(外框底边 0 / 输入区底边 12px)。
- styles.css:窄屏(≤760px)改成一个模型——外框画在列表与输入区共同的父节点
`.project-supervisor-conversation` 上,列表撤掉自己那只框(框里不套框),输入区回到
文档流,靠外框 12px 内边距四周留白、随列高增长不溢出。原来那条窄屏输入区规则权重低于
`.project-supervisor-composer.is-direct-codex` 那条,其实一直是死声明,这次才真正生效。
- tests/chatDialogFrameLayout.test.ts:新增用例,先按真实层叠(媒体查询是否命中 -> 特异性
-> 源码顺序)求生效值,再断言外框四边归 0、输入区四边内缩同一个值、底边与左右留白严格
大于 0、留白 256 = 12px 内缩 + 228px 输入区最高高度 + 16px 间距(228 由编辑器
max-height 140、输入框行距 8、操作排 28px 方钮、输入框下内边距 4、输入区上下内边距 16、
操作条 2 + 30 方钮逐项从真实声明里算出来),以及窄屏下外框/列表/输入区各自落位、输入区
仍在外框节点子树里且交互控件原位。
- tests/appSurface/project-development.suite.ts:把那条按"第一条匹配规则"取值、用 230 估
算的留白断言同步成按声明算出的 228 与实际间距 16,并注明层叠生效值的守卫在新用例里。
- 变异验证:输入区 `bottom: 12px -> 0`(还原"贴死重合")时新断言失败;外框
`bottom: 0 -> 156px`(还原上一轮残留)时"外框底边必须严格低于输入区底边"失败(-144)。
- 说明:本机无无头浏览器、vitest 未开 `css: true`,像素级观感只能真机复核;这里钉的是
层叠生效的声明级几何关系与"输入区仍在外框节点的子树里"。
This commit is contained in:
@@ -9831,9 +9831,12 @@ iframe.preview-frame {
|
||||
|
||||
/* Direct Codex composer: keep the editor and its actions in one vertical
|
||||
structure instead of positioning each control independently. */
|
||||
/* 输入区在对话框(`.project-supervisor-message-list` 那只铺满会话区的盒子)内部:
|
||||
左右下三边各内缩 12px,圆角收成与外框同一档,读起来是"框内的输入块"而不是贴在
|
||||
对话框下面、四边描边与下边竖线连成一体的第二只盒子。 */
|
||||
/* 输入区在对话框(`.project-supervisor-message-list` 那只铺满会话区的盒子)内部,
|
||||
四边各内缩 12px:左右下三边显式钉住,上边由 `max-height: calc(100% - 24px)`
|
||||
(24px = 上下各 12px)兜底,所以输入区整块落在外框之内,四条边都不与外框描边重合,
|
||||
底边还留出 12px 边距(外框底边在下面那条"最终几何"规则里钉的是 0)。
|
||||
圆角收成与外框同一档,读起来是"框内的输入块",而不是贴在对话框下面、四边描边与
|
||||
下边竖线连成一体的第二只盒子。 */
|
||||
.game-workbench-chat
|
||||
.project-supervisor-surface.is-direct-codex
|
||||
.project-supervisor-composer.is-direct-codex {
|
||||
@@ -9846,6 +9849,7 @@ iframe.preview-frame {
|
||||
right: 12px;
|
||||
bottom: 12px;
|
||||
left: 12px;
|
||||
max-height: calc(100% - 24px);
|
||||
z-index: 5;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid var(--platform-surface-border);
|
||||
@@ -10008,10 +10012,68 @@ iframe.preview-frame {
|
||||
color: var(--platform-button-primary-text);
|
||||
}
|
||||
|
||||
/* 对话框盒子的最终几何,故意放在文件靠后的位置:它与上面那条同选择器同权重
|
||||
(`.game-workbench-chat .project-supervisor-surface.is-direct-codex
|
||||
.project-supervisor-message-list`),按"后写胜出"把两处会顶掉它的规则压回去——
|
||||
一是 `:has(.plan-gdd-surface, .planning-lane-runtime-strip)` 给列表留的
|
||||
`padding-bottom: 12px`,二是下面窄屏块之前可能出现的任何底边偏移。
|
||||
这里曾经是一条 `bottom: 156px`("列表在上、输入区在下"那版两盒布局的残留:给下面那只
|
||||
浮起来的输入区预留高度),它把上面那条 `bottom: 0` 悄悄顶掉,外框底边落在输入区腰上、
|
||||
输入区下半截露在框外——用户看到的就是"外框底边与输入区压在一起、没把输入区包住"。
|
||||
所以:外框四边一律贴会话区(top/right/bottom/left 全 0),它才是把输入区包住的那只框;
|
||||
输入区靠自己的 12px 内缩与它留出边距,两条边不会再重合。
|
||||
要改列表底边只改这一段,不要再在别处写第二条同选择器规则。 */
|
||||
.game-workbench-chat
|
||||
.project-supervisor-surface.is-direct-codex
|
||||
.project-supervisor-message-list {
|
||||
bottom: 156px;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
padding-bottom: 256px;
|
||||
scroll-padding-bottom: 256px;
|
||||
}
|
||||
|
||||
/* 窄屏(≤760px)这一列是"消息列表 + 输入区"的纵向堆叠,输入区不再浮在列表里,所以外框
|
||||
改画在两者共同的父节点 `.project-supervisor-conversation` 上:它同时把列表和输入区圈进
|
||||
来。列表自己那只框在窄屏撤掉(否则框里再套一只框),输入区回到文档流,靠外框的 12px
|
||||
内边距与四条边框各留出一圈边距——任一条边都不与外框重合,内容随列高增长也不会溢出。
|
||||
宽屏那套留白算式(256 = 12px 内缩 + 228px 输入区最高高度 + 16px 间距)只服务于
|
||||
"输入区浮在列表之上"这个模型;窄屏输入区在流内,天然不会被消息盖住,所以列表底边只留
|
||||
12px 与输入区顶边分开。 */
|
||||
@media (max-width: 760px) {
|
||||
.game-workbench-chat
|
||||
.project-supervisor-surface.is-direct-codex
|
||||
.project-supervisor-conversation {
|
||||
padding: 12px;
|
||||
border: 1px solid var(--platform-subpanel-border);
|
||||
border-radius: 12px;
|
||||
background: var(--platform-input-fill);
|
||||
}
|
||||
|
||||
.game-workbench-chat
|
||||
.project-supervisor-surface.is-direct-codex
|
||||
.project-supervisor-message-list {
|
||||
padding-bottom: 12px;
|
||||
scroll-padding-bottom: 12px;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* 输入区回到文档流。这条选择器比上面那条 `.project-supervisor-composer.is-direct-codex`
|
||||
多带一层 `.project-supervisor-conversation`,权重比它高,窄屏才能把它顶回来——
|
||||
原来窄屏那条(同权重、写得更早)其实一直是被顶掉的那条。 */
|
||||
.game-workbench-chat
|
||||
.project-supervisor-surface.is-direct-codex
|
||||
.project-supervisor-conversation
|
||||
.project-supervisor-composer.is-direct-codex {
|
||||
position: relative;
|
||||
right: auto;
|
||||
bottom: auto;
|
||||
left: auto;
|
||||
max-height: none;
|
||||
}
|
||||
}
|
||||
|
||||
.resource-reference-input-editor::-webkit-scrollbar {
|
||||
|
||||
@@ -5046,7 +5046,8 @@ export function registerProjectWorkbenchFoundationTests() {
|
||||
/\.game-workbench-chat\s+\.project-supervisor-surface\.is-direct-codex\s+\.project-supervisor-composer\.is-direct-codex\s*\{([^}]*)\}/s,
|
||||
)?.[1] ?? '';
|
||||
expect(composerRule).not.toBe('');
|
||||
// 输入区四边内缩:不贴外框(左右下三边各 12px),也不与外框重叠。
|
||||
// 输入区四边内缩:左右下三边各 12px 显式钉住,上边由 `max-height: calc(100% - 24px)`
|
||||
// 兜底,四条边都不与外框描边重合,底边还留出 12px 边距。
|
||||
const inset = styleNumber(composerRule, 'right');
|
||||
expect(inset).toBeGreaterThan(0);
|
||||
expect(styleNumber(composerRule, 'left')).toBe(inset);
|
||||
@@ -5058,19 +5059,23 @@ export function registerProjectWorkbenchFoundationTests() {
|
||||
);
|
||||
expect(composerRule).toContain('background: var(--platform-input-fill);');
|
||||
|
||||
// 消息列表给输入区留出位置:底边留白必须 ≥ 输入区最高高度 + 内缩。
|
||||
// 输入区最高高度 = 编辑器 max-height(140) + 操作排(30) + 网格间隙(8) + 输入区
|
||||
// padding-bottom(4) + 自己的上下 padding(16) + 控制排(30 + 2) ≈ 230。
|
||||
// 消息列表给输入区留出位置:底边留白 = 内缩 + 输入区最高高度 + 间距。
|
||||
// 输入区最高高度 = 编辑器 max-height(140) + 输入框行距(8) + 操作排 28px 方钮(28)
|
||||
// + 输入框下内边距(4) + 输入区自己上下内边距(8 × 2) + 操作条(2 + 30 方钮) = 228;
|
||||
// 256 = 12px 内缩 + 228 + 16px 间距。这里按层叠"第一条"取值,改动后务必同时跑
|
||||
// tests/chatDialogFrameLayout.test.ts——那条用例按层叠生效值验同一组几何(含窄屏),
|
||||
// 后面再写一条同选择器的规则顶掉这里,只有那条会失败。
|
||||
const composerClearance = styleNumber(
|
||||
messageListRule,
|
||||
'scroll-padding-bottom',
|
||||
);
|
||||
expect(composerClearance).toBeGreaterThanOrEqual(inset + 230);
|
||||
expect(composerClearance).toBeGreaterThanOrEqual(inset + 228);
|
||||
expect(composerClearance).toBe(inset + 228 + 16);
|
||||
const messageListPadding =
|
||||
/padding:\s*18px 20px (\d+)px;/u.exec(messageListRule)?.[1] ?? '';
|
||||
expect(Number(messageListPadding)).toBe(composerClearance);
|
||||
|
||||
// 编辑器与操作排的高度上限就是上面那个 230 的来源;改这里就必须同步改留白。
|
||||
// 编辑器高度上限就是上面那个 228 的来源之一;改这里就必须同步改留白。
|
||||
const editorRule =
|
||||
styles.match(
|
||||
/\.game-workbench-chat\s+\.project-supervisor-surface\.is-direct-codex\s+\.project-supervisor-composer\s+\.resource-reference-input-editor\s*\{([^}]*)\}/s,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user