From b8849b8c0149ab30eaddd3d7f3a80db08dd0c243 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Sun, 4 Oct 2026 13:40:25 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BC=98=E5=8C=96=20AGC=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E5=8F=B0=E9=A1=B6=E6=A0=8F=E5=B8=83=E5=B1=80=EF=BC=9A?= =?UTF-8?q?=E4=B8=80=E8=A1=8C=E5=88=B0=E5=BA=95=E3=80=81=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E9=92=89=E5=8F=B3=E5=88=86=E7=BA=A7=E3=80=81?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=B9=B6=E5=85=A5=E8=BF=90=E8=A1=8C=E9=A1=B5?= =?UTF-8?q?=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 顶栏去掉两侧 flex-wrap、工具条改 overflow: hidden,空间不足按 data-layout 三档降级而不是换行 - 新增 workbenchToolbarModel(档位顺序与 1px 判据)与 useWorkbenchToolbarLayout(ResizeObserver 管宽度、MutationObserver 管内容,实测内容宽度写档位) - 版本入口 margin-left: auto 钉在动作区最右,标识改「版本 N(原因 · 时间)」,窄档只留「版本 N」(序号复用资源画布版本卡编号口径) - 新增 WorkbenchMoreActionsMenu:「打开项目目录 / 资源面板 / 整理画布」在 collapsed-actions 档收进「更多」下拉 - 删除独立「播放」按钮,运行页签前加 ▶ 图标,点页签即切视图并载入游戏资源 - 运行画面右下角新增「刷新运行画面」,LocalGamePreviewFrame 新增 reloadNonce 换 iframe 元素身份重新载入页面 - 用例:新增 workbenchToolbarLayout / runPreviewRefresh;改写 appSurface 顶栏与播放/刷新断言、版本标识断言与顶栏样式断言 --- .../LocalGamePreviewFrame.tsx | 10 + .../resource-canvas/GameRunVersionPicker.tsx | 37 +++- .../resourceCanvasVersionBindingModel.ts | 32 +++- apps/ai-game-creator-shell/src/styles.css | 181 ++++++++++++++---- .../WorkbenchMoreActionsMenu.tsx | 111 +++++++++++ .../src/view/project-development/index.tsx | 140 +++++++++++--- .../useWorkbenchToolbarLayout.ts | 87 +++++++++ .../workbenchToolbarModel.ts | 49 +++++ .../appSurface/project-development.suite.ts | 40 ++-- .../tests/gameRunToolbarActionsStyle.test.ts | 15 +- .../resourceCanvasVersionBindingModel.test.ts | 20 +- .../tests/runPreviewRefresh.test.tsx | 112 +++++++++++ .../tests/workbenchToolbarLayout.test.ts | 83 ++++++++ 13 files changed, 819 insertions(+), 98 deletions(-) create mode 100644 apps/ai-game-creator-shell/src/view/project-development/WorkbenchMoreActionsMenu.tsx create mode 100644 apps/ai-game-creator-shell/src/view/project-development/useWorkbenchToolbarLayout.ts create mode 100644 apps/ai-game-creator-shell/src/view/project-development/workbenchToolbarModel.ts create mode 100644 apps/ai-game-creator-shell/tests/runPreviewRefresh.test.tsx create mode 100644 apps/ai-game-creator-shell/tests/workbenchToolbarLayout.test.ts diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/LocalGamePreviewFrame.tsx b/apps/ai-game-creator-shell/src/features/project-workspace/LocalGamePreviewFrame.tsx index 880adb5c3..f47951e8f 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/LocalGamePreviewFrame.tsx +++ b/apps/ai-game-creator-shell/src/features/project-workspace/LocalGamePreviewFrame.tsx @@ -272,6 +272,7 @@ export function LocalGamePreviewFrame({ title, className, inspectMode = false, + reloadNonce = 0, onInspectSelection, onInspectExit, }: { @@ -279,6 +280,14 @@ export function LocalGamePreviewFrame({ title: string; className?: string; inspectMode?: boolean; + /** + * 换一个值就把 iframe 重新挂载一次=重新载入运行页面(使用方的「刷新运行画面」)。 + * + * 游戏预览不是 vite dev 的实时刷新:改完代码要看到新一版只有重载页面这一条路。`src` 不变, + * 靠 React 的 `key` 换元素身份——跨域 iframe 里 `contentWindow.location.reload()` 会被 + * 浏览器挡掉(运行页面在另一个端口上)。 + */ + reloadNonce?: number; onInspectSelection?: (selection: LocalGamePreviewInspectSelection) => void; onInspectExit?: () => void; }) { @@ -425,6 +434,7 @@ export function LocalGamePreviewFrame({