diff --git a/apps/ai-game-creator-shell/src/view/home/InspirationGallery.tsx b/apps/ai-game-creator-shell/src/view/home/InspirationGallery.tsx new file mode 100644 index 000000000..dc15824e9 --- /dev/null +++ b/apps/ai-game-creator-shell/src/view/home/InspirationGallery.tsx @@ -0,0 +1,81 @@ +import { useEffect, useState } from 'react'; +import { createPortal } from 'react-dom'; + +// TODO: 后续改为由服务器下发灵感资源;届时保留此组件的展示与预览交互,移除本地目录扫描。 +const INSPIRATION_IMAGES = Object.entries( + import.meta.glob('./assets/inspiration/*.{webp,png,jpg,jpeg}', { + eager: true, + import: 'default', + query: '?url', + }), +) + .sort(([left], [right]) => + left.localeCompare(right, undefined, { numeric: true }), + ) + .map(([, image]) => image as string); + +export default function InspirationGallery() { + const [selectedImage, setSelectedImage] = useState(null); + + useEffect(() => { + if (!selectedImage) { + return; + } + const previousOverflow = document.body.style.overflow; + document.body.style.overflow = 'hidden'; + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + setSelectedImage(null); + } + }; + window.addEventListener('keydown', handleKeyDown); + return () => { + document.body.style.overflow = previousOverflow; + window.removeEventListener('keydown', handleKeyDown); + }; + }, [selectedImage]); + + return ( + <> +
+ {INSPIRATION_IMAGES.map((image, index) => ( + + ))} +
+ + {selectedImage + ? createPortal( +
setSelectedImage(null)} + > + 放大的灵感图片 event.stopPropagation()} + /> +
, + document.body, + ) + : null} + + ); +} diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-01.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-01.webp new file mode 100644 index 000000000..25821e804 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-01.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-02.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-02.webp new file mode 100644 index 000000000..ce26591db Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-02.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-03.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-03.webp new file mode 100644 index 000000000..90287a674 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-03.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-04.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-04.webp new file mode 100644 index 000000000..8fa04357a Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-04.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-05.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-05.webp new file mode 100644 index 000000000..cc657f1ef Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-05.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-06.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-06.webp new file mode 100644 index 000000000..bf922e8d3 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-06.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-07.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-07.webp new file mode 100644 index 000000000..67048cfb9 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-07.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-08.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-08.webp new file mode 100644 index 000000000..13f642612 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-08.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-09.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-09.webp new file mode 100644 index 000000000..d98a01ec7 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-09.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-10.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-10.webp new file mode 100644 index 000000000..4ed427e84 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-10.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-11.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-11.webp new file mode 100644 index 000000000..b147b8ff7 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-11.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-12.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-12.webp new file mode 100644 index 000000000..084ed36bb Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-12.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-13.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-13.webp new file mode 100644 index 000000000..7da22fa4f Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-13.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-14.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-14.webp new file mode 100644 index 000000000..88dcc70cb Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-14.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-15.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-15.webp new file mode 100644 index 000000000..13315c560 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-15.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-16.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-16.webp new file mode 100644 index 000000000..4af52bbda Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-16.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-17.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-17.webp new file mode 100644 index 000000000..87c1ebe09 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-17.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-18.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-18.webp new file mode 100644 index 000000000..cc4bcb6c5 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-18.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-19.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-19.webp new file mode 100644 index 000000000..413fff72b Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-19.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-20.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-20.webp new file mode 100644 index 000000000..b55594bba Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-20.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-21.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-21.webp new file mode 100644 index 000000000..31db46017 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-21.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-22.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-22.webp new file mode 100644 index 000000000..5d2e1fa4e Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-22.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-23.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-23.webp new file mode 100644 index 000000000..f34cd2398 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-23.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-24.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-24.webp new file mode 100644 index 000000000..b23f5e8d1 Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-24.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-25.webp b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-25.webp new file mode 100644 index 000000000..e008db1fc Binary files /dev/null and b/apps/ai-game-creator-shell/src/view/home/assets/inspiration/inspiration-25.webp differ diff --git a/apps/ai-game-creator-shell/src/view/home/index.tsx b/apps/ai-game-creator-shell/src/view/home/index.tsx index 8d077a76e..b76dfec30 100644 --- a/apps/ai-game-creator-shell/src/view/home/index.tsx +++ b/apps/ai-game-creator-shell/src/view/home/index.tsx @@ -18,6 +18,7 @@ import { richTextToAttachments, richTextToPrompt, } from './components/RichInputArea/richTextToPrompt'; +import InspirationGallery from './InspirationGallery'; import { type HomeCreationType, type HomeDraft, @@ -171,7 +172,11 @@ export default function HomeView({ } return ( -
+
-
+
); diff --git a/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts index e6ccb2fd3..6be9b73a8 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/home.suite.ts @@ -28,12 +28,25 @@ import { } from './harness'; export function registerClientHomeTests() { - it('keeps the empty inspiration module without requesting the retired feed', async () => { + it('shows the built-in inspiration masonry gallery and opens a dismissible preview without requesting the retired feed', async () => { const fetchSpy = vi.spyOn(globalThis, 'fetch'); renderLauncherAt('/?launcher'); - expect(screen.getByLabelText('灵感推荐')).not.toBeNull(); + const inspiration = screen.getByLabelText('灵感推荐'); + const inspirationImages = within(inspiration).getAllByRole('button', { + name: /查看灵感图片/, + }); + expect(inspirationImages).toHaveLength(23); + expect(inspiration.closest('.overflow-y-auto')).not.toBeNull(); expect(screen.queryByText('暂无灵感')).toBeNull(); + + fireEvent.click(inspirationImages[0]!); + const preview = screen.getByRole('dialog', { name: '查看灵感图片' }); + fireEvent.click(screen.getByAltText('放大的灵感图片')); + expect(screen.getByRole('dialog', { name: '查看灵感图片' })).not.toBeNull(); + fireEvent.click(preview); + expect(screen.queryByRole('dialog', { name: '查看灵感图片' })).toBeNull(); + await act(async () => { await Promise.resolve(); }); diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index e19efaa26..da1e25334 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -683,7 +683,7 @@ game-project/ - 结构化对话记录按授权本地项目路径追加 JSONL;正式聊天读取 Supervisor active Session 与只读 legacy 项目历史,开发单 Agent 对话读取对应 Agent Session。开发入口已支持本地 Session 新建、切换、归档和分叉,但不提供云端同步。 - Agent 状态列表从 `.agent/manifest.json` 的任务 / 角色清单、`.agent/run.latest.json` / `.agent/runs/.json` 的 step、taskGraph、passPlans、lifecycleStatus,以及 `read_game_creator_agent_runtimes` 批量读取的 `.agent/runtime/agents/.json` 和最近任务派生;v1 不新增独立状态数据库,也不承诺完整后台 runner。 - 首页发送、项目组目录选择和本地文件选择必须使用 Tauri 非阻塞原生 picker,并把选择器绑定到当前 `client` 窗口;禁止在同步 command 中调用 `blocking_pick_folder` / `blocking_pick_file` 阻塞 WebView 事件循环。选择器打开期间保留首页草稿可编辑,取消后恢复“开启创作”按钮并回显“已取消”。 -- 当前尚未定义 GameAgent 独立的灵感数据源;首页保留“灵感推荐”模块及空白内容容器,但不显示无数据文案,也不得展示或请求主站 `/creation` 的陶泥儿精选 `/api/editor/showcase/resources`。后续接入前必须先明确独立数据契约和交互验收。 +- GameAgent 首页“灵感推荐”当前使用客户端随包发布的内置图片素材,不请求主站 `/creation` 的陶泥儿精选 `/api/editor/showcase/resources`,也不引入远端灵感数据源。图片按原始宽高比组成响应式瀑布流,首页内容区域允许纵向滚动;点击图片只打开全屏原图预览,点击图片外遮罩或按 Escape 关闭,不展示标题或其它业务动作。后续改接远端数据前仍须先明确独立数据契约和交互验收。 - 首页正式桌面版以约 `814px` 的居中内容栏组织品牌区、创作类型、输入框、最近项目与灵感推荐;品牌区和类型按钮在内容栏左缘对齐,输入框和下方模块仍保持整体居中。标题使用深色暖橙层级,固定副标题为“你的游戏创作管家”;选中的创作类型使用实心暖橙按钮,未选中项使用浅色描边,输入框使用更舒展的单行创作起始比例。 - 最近项目固定展示至多三个横向信息卡:左侧为本地渐变封面占位,右侧只投影项目名称、项目类型、目录真实修改时间和已有最近运行状态。目录检查通过 `modifiedAt` 提供修改时间;没有封面资产时不得假装读取了项目封面,也不新增封面持久化字段。 - debug 构建启动后在用户 `client` 窗口之外额外打开 `developer` 窗口;该窗口用于开发者单独选择 Agent、管理对应 active/archived Session 并读取历史,用户消息和真实 Agent 回复只持久化到 `.agent/conversations/agents//` 下的规范 Session。普通用户窗口不得出现 `Agent 聊天` 导航、picker 或工具台入口。