优化 AGC 工作台顶栏布局:一行到底、版本入口钉右分级、播放并入运行页签(Issue #613) #615
Reference in New Issue
Block a user
Delete Branch "fix/agc-toolbar-layout"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #613
落地做法
1. 顶栏一行到底,空间不足按三档降级(不再换行)
styles.css:工具条flex-wrap: nowrap+overflow: hidden;两处≤1000px/≤760px把工具条改成flex-direction: column的媒体查询删除(那是「第二行」的另一个来源),≤1000px里给动作区的justify-content: flex-end一并删除(溢出会甩到左边,scrollWidth看不见)。view/project-development/workbenchToolbarModel.ts:档位顺序full → compact-version → collapsed-actions,每档 1px 判定余量。view/project-development/useWorkbenchToolbarLayout.ts:ResizeObserver(可用宽度)×MutationObserver(切运行页、出现「恢复草稿」这类不改宽度的内容变化),每次把候选档位写到 DOM 再读scrollWidth,结果写在工具条data-layout上。档位不参与 React 状态(React 不声明该属性,不会被覆盖)。overflow: hidden的 flex 子项能用省略号 / 缩到 0 吸收溢出,档位判定就量不到真实溢出——版本入口默认min-width: max-content(只在最后一档放开为0),「依赖 / 类型」分段补flex: 0 0 auto(此前窄宽度下被压成 0 宽)。最后一档确实放不下时改右对齐:宁可裁左边,也不把钉右的版本入口裁没。full版本 N(原因 · 时间)compact-versioncollapsed-actions2. 版本入口钉最右 + 分级显示
.game-run-version-picker { margin-left: auto }→ 始终贴动作区右缘(实测toolbar.right - 12 - chip.right === 0)。版本 N(原因 · 时间):版本 N复用资源画布版本卡编号口径(manifest.versions落盘顺序 +1);括号那截独立成.game-run-version-trigger-detail,窄档位只display: none这一层——可访问名、菜单项、排障文案一律保留完整标识。3. 「更多」下拉(
WorkbenchMoreActionsMenu.tsx)「打开项目目录 / 资源面板 / 整理画布」在行内与菜单里是同一批动作(同一个
onSelect、同一份禁用判据);菜单 portal 到body,复用既有浮层「点外部关闭」hook。4. 「播放」并入「运行」页签
删掉独立播放按钮,页签前加 ▶ 图标;点页签=
showRunView() + onPlay?.()(与旧播放按钮逐字等价,含「再点一次=重跑」)。不可运行时页签不置灰:点了既不切视图也不发播放请求,只出既有提示(showRunView的门槛与自动切运行的两条路径不变,不会多发播放请求)。5. 运行画面「刷新运行画面」
浮在画面右下角、全屏那一枚左侧:点击=
onPlay?.()(命中活体预览只切视图、不重启服务)+reloadNonce + 1;LocalGamePreviewFrame用key={reloadNonce}换 iframe 元素身份重新载入页面(跨域 iframe 不能location.reload())。前后对照
改动前(用户现场):顶栏换行成两行;版本入口悬在中间;「播放」「运行」并列;运行画面无刷新入口。
改动后(真实 Chromium 实测截图,见
docs/technical/assets/agc-toolbar-layout-after-20261004/):01-toolbar-resources-full-1412.jpg版本 1(智能体修订 · 2026/10/3 14:21:05)02-toolbar-resources-compact-1240.jpg版本 1,动作一枚不动03-toolbar-more-menu-800.jpg04-toolbar-run-tab-and-preview-refresh-1412.jpg验证
npx vitest run apps/ai-game-creator-shell/tests→ 199 passed / 1 skipped 文件,1925 passed / 17 skipped 用例(末次全量,含新增workbenchToolbarLayout、runPreviewRefresh)。appSurface/project-development.suite.ts(播放按钮 → 运行页签的播放语义、CSS 声明断言改为档位/钉右)、gameRunToolbarActionsStyle.test.ts、resourceCanvasVersionBindingModel.test.ts(标识加序号)。tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit、eslint--max-warnings 0、prettier --check、npm run check:encoding、npm run check:doc-index、git diff --check全绿。.codex/skills/agc-workbench-browser-smoke)在真实 Chromium 里逐档量了 13 个视口宽度,确认「始终单行、版本入口贴右、档位按预期切换、『更多』里三条动作可点、点『刷新』iframe 换新节点而 src 不变」。decision-log.md、docs/README.md索引、改动后对照图 README。未做 / 边界
迭代记录(按现场反馈补的两笔,已推到本 PR)
1.
9eb537c6f运行视图没有画面时自动补一次载入mode会跟着走(从别的项目切过来,运行视图原样留下),而画面已经没了,只剩一句「点击顶部「运行」页签」。onPlay;showRunView先记账再发播放,所以点页签不会被重复触发;同一个项目只补一次,失败不打转,手动重跑仍走页签或画面上的刷新按钮。tests/runAutoLoadOnEnter.test.tsx(切项目自动补发一次 / 同项目不重复 / 点页签只发一次 / 已有画面时不补发)。2.
206c625a5顶栏两端留给两枚大分组依赖 / 类型分段从动作区中部挪到动作行最后一个子元素(右端),版本入口紧邻它左侧(不再是最右那一枚);左端仍是「资源管理 / 运行」。降级顺序不变,行尾始终由「依赖 / 类型」收住。tests/resourceVersionSwitch.test.tsx新增顶栏顺序断言(版本入口在排序分段之前、排序分段是动作行行尾),tests/resourceCanvasGenerationTasksSidebarDismiss.test.tsx改判排序分段为行列尾。工具栏右缘 - padding - 排序分段右缘 = 0、版本入口始终在排序分段左侧、1240 / 1100 走compact-version、≤1024 走collapsed-actions;对照图与docs/technical/assets/agc-toolbar-layout-after-20261004/README.md已重拍。验证(末次全量)
npx vitest run apps/ai-game-creator-shell/tests→ 200 passed / 1 skipped 文件,1929 passed / 17 skipped 用例;npm run typecheck(含check:tests:types)、eslint--max-warnings 0、prettier --check、check:encoding、check:doc-index、git diff --check全绿。