运行页签补齐全屏预览与可收起的信息栏 #497

Merged
suzmii merged 6 commits from feat/run-view-chrome-cleanup into master 2026-09-23 20:50:43 +08:00
Member

背景

运行页右下角没有把游戏画面放大到整屏的入口;运行视窗下方常驻「信息展示 / 数值微调」两张卡片,没选中资源时就是两块空白(验收现场那半条「空信息栏白占一块高度」)。

落地方式

  1. 全屏预览:新增 apps/ai-game-creator-shell/src/features/project-workspace/useElementFullscreen.ts,走标准元素级 Fullscreen API,全屏对象是画面那一格 .game-run-preview——不接 Tauri 窗口级全屏(那是把整块工作台连对话栏一起放大的「全屏应用」,不是「全屏预览画面」)。按钮贴在画面右下角(深色半透明圆钮,压在任何游戏配色上都看得清),全屏后仍在原位,点它或按 Esc 都能退出;按钮态只认 fullscreenchange,不靠点击那一帧的乐观值。宿主没有 requestFullscreen、或被 fullscreenEnabled === false 关掉时整枚入口不渲染,不留点了没反应的按钮。
  2. 底部信息栏可收起 + 没有内容自动收起.game-run-panels 改成「有内容才存在」。判据只有「有没有内容」(当前 = 存在资源选中态:在资源画布或浮层资源面板里选中一张资源后切到运行页签仍保留,信息展示渲染它的只读字段;运行画面上的「点选素材」只往对话插入引用,不改选中):内容从无到有自动展开、从有到无自动收起。手动态按资源 id 在渲染期派生(不挂 effect 回写):只对做出动作时的那张资源有效,换到别的资源回到默认,同一张资源清空后选回仍记得上次状态,且「刚有内容」那一帧就已经是展开态。收起态只剩一行 26px 的开合按钮,条目卡片的 156px 最小高度不再变成空白色块;只有一栏内容时卡片铺满整行。
  3. 「数值微调」暂时隐藏:登记表还没接(前端没有数据源),按「没有功能就暂时隐藏」不渲染它的区域标题与卡片,对应 label / input 样式声明一并删除;登记表接进来时与内容一起回归。这一条覆盖 PRD §3.4 原先「保留两个面板标题、不得因空内容压缩」的口径。

全屏回归修复(同日收口,16361bfbe

验收时发现「退出全屏后画布仍保持全屏比例」。用一次性页面挂真组件 + 客户端真实注入的尺寸桥src-tauri/src/preview.rsPREVIEW_FIT_BRIDGE_SCRIPT)在 Chromium 复现:

窗口态 1015×660 → 全屏 1416×808 → 退出后 iframe 仍是 1416×808、scale 0.717   ← 永久,不自愈

根因不在全屏,而在尺寸上报回灌:自适应游戏页把「内容尺寸 = 视口」原样报回来,宿主把它当「内容高水位」,resolveLocalGamePreviewFitLayoutmax(容器, 内容) 就把画布钉在全屏那一帧;退出后 iframe 视口不再变化 ⇒ 桥不再上报 ⇒ 永远回不去。

修法:内容尺寸与它被接受时的容器尺寸在两条轴上相等(<1px)时不算高水位,直接按容器取画布;真比容器高的页面(内容 ≠ 视口,桥注入的原始动机)仍按原生尺寸等比缩小。回归用例 tests/localGamePreviewFrame.test.tsreturns the fitted iframe to the container after the host viewport shrinks(改前必红:1416px vs 1015px)。

残余边界(明确不修):某个固定尺寸页面恰好等于它被接受时的容器尺寸、且缩小容器后上报的内容尺寸再不变,会一直按容器取画布(页面自身溢出被裁)。评审建议的「内容尺寸没变也把记录改认新容器」实现后实测回退——退出全屏那一帧的过渡上报(内容=放大前旧值、视口=缩小后容器)会被误认成固有尺寸,主 bug 原样复现且同样永久。两者在宿主数据上不可区分,按 AGC 常态选自适应优先。根治在桥/协议侧(尺寸消息多带「本页是否视口耦合」信号),属独立变更。

前后对照

  • 前:画面右下角没有任何入口;没选中资源时底部是两张空卡片,占约 190px;退出全屏后画布被钉在全屏尺寸。
  • 后:右下角一枚全屏钮;没有内容时整栏不渲染、画面多出约 190px 高度;有内容时自动展开且可一键收起到 26px;退出全屏立刻回到容器尺寸(实测 1015.17×660、scale 1)。

验证

  • 真实 Chromium(挂同一份组件 + 真实尺寸桥,fullbleedfixed 两种游戏页):全屏往返后画布回到容器尺寸;信息栏四态 190px → 26px → 190px → 无栏。
  • npm run ai-game-creator-shell:check:webtsc + 1813 项 / 182 文件通过(合并上游斜杠命令退役提交后的口径,合并前该套件为 1924 项)。
  • 新增 tests/runPreviewFullscreen.test.tsx(2 例,补出 jsdom 缺失的 Fullscreen API);tests/localGamePreviewFrame.test.ts 抽出 renderFittedFrame 夹具并补 2 条全屏/回灌用例(均验过改前必红);AGC 子集补「信息栏有内容自动展开 / 手动收起 / 再展开」,并把「没有内容时运行页仍渲染两张卡片」的旧断言改成整栏不渲染。
  • eslint 与 prettier 干净、npm run check:encodingnpm run check:doc-indexgit diff --check 全部通过。

评审

三个只读 reviewer 并行评审,问题全部闭环:P0(信息栏按钮字段名与派生不一致导致收起失效,已修 + 三重复验)、P2(回声回退的固定尺寸残余,已按实测裁掉更差方案并记录)、P3×2(补 scale 与固定尺寸用例;删掉恒真的「数值微调面板不存在」断言;修正三份文档里「判据 = 资源选中态」的口径)。全屏链路其余结论保持无问题。

文档

PRD §3.4、docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md 运行表现层条目、docs/project-memory/shared-memory/decision-log.md(2026-09-23 条目四条决策 + 2026-08-23 适配条目补一条收口说明)已同步。

不在本次范围

  • 运行页的「生成任务」入口:HEAD 已由 8e6ee50ad 运行页收口 收口(运行页不挂该侧栏),本次未再改动。
  • 预览桥协议加「是否视口耦合」信号(根治上面那条残余),属桥/协议独立变更。
## 背景 运行页右下角没有把游戏画面放大到整屏的入口;运行视窗下方常驻「信息展示 / 数值微调」两张卡片,没选中资源时就是两块空白(验收现场那半条「空信息栏白占一块高度」)。 ## 落地方式 1. **全屏预览**:新增 `apps/ai-game-creator-shell/src/features/project-workspace/useElementFullscreen.ts`,走标准元素级 Fullscreen API,全屏对象是画面那一格 `.game-run-preview`——**不接 Tauri 窗口级全屏**(那是把整块工作台连对话栏一起放大的「全屏应用」,不是「全屏预览画面」)。按钮贴在画面右下角(深色半透明圆钮,压在任何游戏配色上都看得清),全屏后仍在原位,点它或按 `Esc` 都能退出;按钮态只认 `fullscreenchange`,不靠点击那一帧的乐观值。宿主没有 `requestFullscreen`、或被 `fullscreenEnabled === false` 关掉时**整枚入口不渲染**,不留点了没反应的按钮。 2. **底部信息栏可收起 + 没有内容自动收起**:`.game-run-panels` 改成「有内容才存在」。判据只有「有没有内容」(当前 = 存在资源选中态:在资源画布或浮层资源面板里选中一张资源后切到运行页签仍保留,信息展示渲染它的只读字段;运行画面上的「点选素材」只往对话插入引用,不改选中):内容从无到有自动展开、从有到无自动收起。手动态按资源 id 在渲染期派生(不挂 effect 回写):只对做出动作时的那张资源有效,换到别的资源回到默认,同一张资源清空后选回仍记得上次状态,且「刚有内容」那一帧就已经是展开态。收起态只剩一行 26px 的开合按钮,条目卡片的 `156px` 最小高度不再变成空白色块;只有一栏内容时卡片铺满整行。 3. **「数值微调」暂时隐藏**:登记表还没接(前端没有数据源),按「没有功能就暂时隐藏」不渲染它的区域标题与卡片,对应 `label / input` 样式声明一并删除;登记表接进来时与内容一起回归。这一条覆盖 PRD §3.4 原先「保留两个面板标题、不得因空内容压缩」的口径。 ## 全屏回归修复(同日收口,`16361bfbe`) 验收时发现「退出全屏后画布仍保持全屏比例」。用一次性页面挂真组件 + 客户端**真实注入的尺寸桥**(`src-tauri/src/preview.rs` 的 `PREVIEW_FIT_BRIDGE_SCRIPT`)在 Chromium 复现: ``` 窗口态 1015×660 → 全屏 1416×808 → 退出后 iframe 仍是 1416×808、scale 0.717 ← 永久,不自愈 ``` **根因**不在全屏,而在尺寸上报回灌:自适应游戏页把「内容尺寸 = 视口」原样报回来,宿主把它当「内容高水位」,`resolveLocalGamePreviewFitLayout` 的 `max(容器, 内容)` 就把画布钉在全屏那一帧;退出后 iframe 视口不再变化 ⇒ 桥不再上报 ⇒ 永远回不去。 **修法**:内容尺寸与它被接受时的容器尺寸在两条轴上相等(<1px)时不算高水位,直接按容器取画布;真比容器高的页面(内容 ≠ 视口,桥注入的原始动机)仍按原生尺寸等比缩小。回归用例 `tests/localGamePreviewFrame.test.ts` → `returns the fitted iframe to the container after the host viewport shrinks`(改前必红:1416px vs 1015px)。 **残余边界(明确不修)**:某个固定尺寸页面恰好等于它被接受时的容器尺寸、且缩小容器后上报的内容尺寸再不变,会一直按容器取画布(页面自身溢出被裁)。评审建议的「内容尺寸没变也把记录改认新容器」实现后**实测回退**——退出全屏那一帧的过渡上报(内容=放大前旧值、视口=缩小后容器)会被误认成固有尺寸,主 bug 原样复现且同样永久。两者在宿主数据上不可区分,按 AGC 常态选自适应优先。根治在桥/协议侧(尺寸消息多带「本页是否视口耦合」信号),属独立变更。 ## 前后对照 - 前:画面右下角没有任何入口;没选中资源时底部是两张空卡片,占约 190px;退出全屏后画布被钉在全屏尺寸。 - 后:右下角一枚全屏钮;没有内容时整栏不渲染、画面多出约 190px 高度;有内容时自动展开且可一键收起到 26px;退出全屏立刻回到容器尺寸(实测 1015.17×660、scale 1)。 ## 验证 - 真实 Chromium(挂同一份组件 + 真实尺寸桥,`fullbleed` 与 `fixed` 两种游戏页):全屏往返后画布回到容器尺寸;信息栏四态 190px → 26px → 190px → 无栏。 - `npm run ai-game-creator-shell:check:web`:`tsc` + **1813 项 / 182 文件**通过(合并上游斜杠命令退役提交后的口径,合并前该套件为 1924 项)。 - 新增 `tests/runPreviewFullscreen.test.tsx`(2 例,补出 jsdom 缺失的 Fullscreen API);`tests/localGamePreviewFrame.test.ts` 抽出 `renderFittedFrame` 夹具并补 2 条全屏/回灌用例(均验过改前必红);AGC 子集补「信息栏有内容自动展开 / 手动收起 / 再展开」,并把「没有内容时运行页仍渲染两张卡片」的旧断言改成整栏不渲染。 - eslint 与 prettier 干净、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check` 全部通过。 ## 评审 三个只读 reviewer 并行评审,问题全部闭环:P0(信息栏按钮字段名与派生不一致导致收起失效,已修 + 三重复验)、P2(回声回退的固定尺寸残余,已按实测裁掉更差方案并记录)、P3×2(补 scale 与固定尺寸用例;删掉恒真的「数值微调面板不存在」断言;修正三份文档里「判据 = 资源选中态」的口径)。全屏链路其余结论保持无问题。 ## 文档 PRD §3.4、`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` 运行表现层条目、`docs/project-memory/shared-memory/decision-log.md`(2026-09-23 条目四条决策 + 2026-08-23 适配条目补一条收口说明)已同步。 ## 不在本次范围 - 运行页的「生成任务」入口:HEAD 已由 `8e6ee50ad 运行页收口` 收口(运行页不挂该侧栏),本次未再改动。 - 预览桥协议加「是否视口耦合」信号(根治上面那条残余),属桥/协议独立变更。
suzmii added 1 commit 2026-09-23 17:31:23 +08:00
运行页签补齐全屏预览与可收起的信息栏
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m52s
Project CI / Backend tests (pull_request) Failing after 13s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m5s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
09fb8bc076
- 运行画面右下角新增「全屏预览」:新增 `useElementFullscreen`,只把画面那一格(`.game-run-preview`)送进全屏,按钮态只认 `fullscreenchange`,宿主没有 Fullscreen API 时整枚入口不渲染。
- 底部信息栏改为「有内容才存在」:运行页选中资源时自动展开,可手动收起到只剩一行开合按钮,清空选中后整栏不渲染;只有一栏内容时卡片铺满整行。
- 「数值微调」在没有登记表前不渲染区域标题与卡片,随这一栏删除其 label / input 样式声明。
- 新增 `tests/runPreviewFullscreen.test.tsx`;AGC 子集补信息栏开合用例,并把「没有内容仍渲染两张空卡片」的旧断言改成整栏不渲染。
- 同步 PRD §3.4、技术方案运行表现层条目与 project-memory 决策记录。
suzmii added 1 commit 2026-09-23 17:42:23 +08:00
合并 master:上游 18 个提交并保留运行页签 chrome 改动
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
8d487685f3
- 合并 origin/master(斜杠命令退役、筛选控件选中态、埋点后台排序、发版脚本等)到本分支,解决 PR #497 的冲突。
- 冲突只在 `docs/project-memory/shared-memory/decision-log.md`:双方都在文件顶部新增条目,按「新条目在上」保留双方内容,本分支的 2026-09-23 条目在前。
- `apps/ai-game-creator-shell/src/styles.css`、`tests/appSurface/project-development.suite.ts` 与实施计划技术方案为自动合并,逐块核对本分支的运行页改动(全屏钮、信息栏开合、数值微调隐藏)仍完整保留。
suzmii added 1 commit 2026-09-23 17:50:10 +08:00
合并 master:最近项目重试与发布资料交互等 12 个提交
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m1s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m20s
Project CI / Backend tests (pull_request) Successful in 4m38s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 8m17s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m24s
Project CI / Native shell tests (pull_request) Successful in 5m38s
Project CI / Frontend tests (pull_request) Successful in 1m59s
Project CI / Repository checks (pull_request) Successful in 1m55s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m22s
d7440473af
- 合并 origin/master(`297d7bf1e` 及之前 12 个提交:最近项目检查失败重试、AGC 发布资料与截图交互、模板库筛选表现等)到本分支,保持 PR #497 可合并。
- 冲突仍只在 `docs/project-memory/shared-memory/decision-log.md`:双方都在顶部新增 2026-09-23 条目,按「新条目在上」保留双方内容,本分支条目在前。
- `apps/ai-game-creator-shell/src/styles.css` 为自动合并;逐条核对本分支运行页改动(全屏钮、信息栏开合、数值微调隐藏)的五处选择器仍在,其余为上游更新弹窗与主题调整。
suzmii added 1 commit 2026-09-23 18:39:14 +08:00
修复退出全屏后运行画面不回缩,并收口信息栏开合与文档口径
Project CI / AI game creator shell Rust crates (pull_request) Successful in 59s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m26s
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / Frontend tests (pull_request) Successful in 2m5s
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / AI game creator shell web tests (pull_request) Successful in 1m31s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 8m40s
Project CI / Native shell tests (pull_request) Successful in 5m55s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 8m24s
16361bfbe1
- `resolveLocalGamePreviewFitLayout` 增加回退:上报的内容尺寸等于它被接受时的容器尺寸(自适应页面把视口原样报回)时不算内容高水位,直接按容器取画布——修复「全屏预览退出后画布仍保持全屏比例、永久带黑边」;真比容器高的页面(内容 ≠ 视口)仍按原生尺寸缩放显示。
- 该回退的已知残余(固定尺寸页面恰好等于接受时的容器且之后不上报新尺寸会被裁)与「内容尺寸没变就改认新容器」这条更差尝试一起写进代码注释与 decision-log;根治方向记在桥/协议侧。
- `tests/localGamePreviewFrame.test.ts` 抽出 `renderFittedFrame` 夹具,补「退出全屏回到容器尺寸」(改前必红)与「容器缩小后按新内容尺寸重新适配」两条用例。
- 信息栏手动态改为按资源 id 在渲染期派生(去掉 effect 回写),修掉「刚有内容那一帧先画收起态」的抖动,并让 `onClick` 写入的字段与派生读的字段一致。
- AGC 子集删掉恒真的「数值微调面板不存在」断言,保留「卡片不渲染」与「开合行不渲染」两条独立事实。
- 文档同步:PRD §3.4、技术方案与 decision-log 的信息栏判据口径改为「资源选中态」,并记录全屏回归的根因、修法、残余边界与桥协议根治方向;2026-08-23 适配条目补一条指向本次收口。
suzmii added 1 commit 2026-09-23 19:22:56 +08:00
合并 master:引用粘贴解析与渠道产品名等上游变更
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m21s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 45s
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / Frontend tests (pull_request) Successful in 1m58s
Project CI / Repository checks (pull_request) Failing after 14s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
5e5407e4cf
- 合并 origin/master(引用名归一化与粘贴解析 #473 系列、客户端渠道产品名统一 ebb288a6a、#500 等)到本分支,保持 PR #497 可合并。
- 冲突仍只在 `docs/project-memory/shared-memory/decision-log.md` 顶部新增条目:按「新条目在上」保留双方内容,本分支的运行视窗条目在前。
- 上游改动落在 `features/project-workspace` 的引用链路与渠道命名脚本上,未触及本分支的运行页 chrome 与预览适配文件。
- 合并后 `apps/ai-game-creator-shell:check:web` 有 1 条红:`tests/WindowChrome.test.tsx` 仍断言标题栏品牌名为 `陶泥儿 GameAgent`,而 ebb288a6a 把该处改成读取 `APP_NAME`(未注入 `VITE_AGC_PRODUCT_NAME` 时回退 `陶泥儿开发版`),测试未同步。已验证与本分支无关:把这两个文件的合并前版本换回来 5/5 通过,换回合入版本即 1 条红。等上游修,本分支不动。
suzmii added 1 commit 2026-09-23 19:38:08 +08:00
合并 master:标题栏弹层契约、发行包上限与策划回复修复等上游变更
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m12s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m51s
Project CI / Backend tests (pull_request) Successful in 4m57s
Project CI / Native shell tests (pull_request) Successful in 6m8s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 8m12s
Project CI / Frontend tests (pull_request) Successful in 2m3s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 9m14s
Project CI / AI game creator shell web tests (pull_request) Successful in 1m21s
Project CI / Repository checks (pull_request) Successful in 1m45s
c723e0b1bf
- 合并 origin/master(自绘标题栏作为窗口边框的弹层契约、游戏发行包上限提升到 200 MiB、策划回复重复播放修复 #501、标题栏品牌标签用例修正 f0ef06891 等)到本分支,保持 PR #497 可合并。
- 冲突仍只在 `docs/project-memory/shared-memory/decision-log.md` 顶部新增条目:按「新条目在上」保留双方内容,本分支的运行视窗条目在前。
- 上一轮合并记录的「`WindowChrome` 用例断言渠道产品名 stale」已由上游 f0ef06891 自行修复,本轮合并后该用例恢复通过。
- 上游改动未触及本分支的运行页 chrome 与预览适配文件;合并后重跑 `ai-game-creator-shell:check:web`、编码检查与 `git diff --check`。
suzmii merged commit 5b1fc59d63 into master 2026-09-23 20:50:43 +08:00
suzmii deleted branch feat/run-view-chrome-cleanup 2026-09-23 20:50:43 +08:00
Sign in to join this conversation.