diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx
index 14fa858a9..1b03734ec 100644
--- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx
+++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx
@@ -7198,22 +7198,27 @@ export default function ProjectDevelopmentView({
类型
- {/*
- 画布不再自动重排,整张整理只由这一次显式动作发起:丢掉全部自动坐标、
- 按当前资源与拓扑重算(手动拖过的卡原地不动)。进行中的保存/重算仍然由
- 既有的「保存中 / 布局已保存」状态位反馈。
- */}
-
+ {/*
+ 「整理画布」是本行的动作按钮,不是第三种排列方式:它留在
+ `game-workbench-view-actions` 这个动作区里、紧跟模式切换之后,外观直接复用
+ 该容器既有的动作按钮样式(有边圆角 + secondary 填充),与分段的 pill 模式
+ 切换一眼可分;因此不新增任何 CSS。
+
+ 画布不再自动重排,整张整理只由这一次显式动作发起:丢掉全部自动坐标、按当前
+ 资源与拓扑重算(手动拖过的卡原地不动)。进行中的保存/重算仍然由既有的
+ 「保存中 / 布局已保存」状态位反馈。
+ */}
+
>
) : null}
diff --git a/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx b/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx
index 0d9f4ca4c..28132ffc7 100644
--- a/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx
+++ b/apps/ai-game-creator-shell/tests/resourceCanvasManualLayout.test.tsx
@@ -23,6 +23,7 @@ import {
React,
render,
screen,
+ within,
} from './appSurface/harness';
/**
@@ -752,6 +753,53 @@ describe('资源画布手动重排口径', () => {
expect(typeWrites(tauri)).toHaveLength(1);
});
+ it('「整理画布」不属于「资源排列方式」这组模式切换,而是一枚独立动作按钮', async () => {
+ const projectPath = '/tmp/manual-layout-surface-project';
+ const tauri = installLayoutTauri({
+ projectIdsByPath: { [projectPath]: 'manual-layout-surface-project' },
+ });
+ render(
+ ,
+ );
+
+ const sortGroup = await screen.findByRole('group', {
+ name: '资源排列方式',
+ });
+ // 这组里只有两种排列方式:用户不该把「整理画布」读成第三种排列方式。
+ expect(
+ within(sortGroup)
+ .getAllByRole('button')
+ .map((button) => button.getAttribute('aria-label')),
+ ).toEqual(['按依赖', '按类型']);
+ expect(
+ within(sortGroup).queryByRole('button', { name: '整理画布' }),
+ ).toBeNull();
+
+ // 它仍在同一行、仍是同一枚动作按钮,只是搬出了那个 group。
+ const rederiveButton = screen.getByRole('button', { name: '整理画布' });
+ expect(sortGroup.contains(rederiveButton)).toBe(false);
+ expect(rederiveButton.closest('.game-resource-sort-tabs')).toBeNull();
+ expect(
+ rederiveButton.closest('.game-workbench-view-actions'),
+ ).not.toBeNull();
+ // 语义没变:可点性只跟布局就绪绑定,布局读完后它就是可点的。
+ await waitFor(() =>
+ expect(
+ screen
+ .getByRole('button', { name: '整理画布' })
+ .hasAttribute('disabled'),
+ ).toBe(false),
+ );
+ });
+
it('首次打开项目与切项目都不触发新素材聚焦跳转', async () => {
const tauri = installLayoutTauri({
projectIdsByPath: {