diff --git a/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md b/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md index 75445fab8..0258d46cd 100644 --- a/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md +++ b/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md @@ -133,6 +133,8 @@ Tab: - 实现首屏主视觉、九大功能区、最近项目区和陶泥儿精选素材瀑布流。 - 桌面端复用现有平台壳层,保留上方栏和左侧导航栏。 - 主页整体采用浅色布局,避免外站品牌文案。 +- 视觉排版参考陶土质感创作工具工作台:首屏标题居中、主按钮与社区按钮使用大号圆角胶囊尺寸,九大创作工具以 3 列大卡片展示,卡片左侧保留大号陶土感图标区域,右侧展示原有标题与描述;`/creation` 场景下的平台顶部栏和左侧导航压平成单层工作台 chrome,避免外框套内框;桌面端顶部栏按“左侧品牌区 / 中部搜索框 / 右侧钱包与账号区”固定分区,左侧栏保持接近参考图的宽侧栏、横向图标按钮和单层导航胶囊,不回退为窄图标栏;只调整样式与布局,不改文案、搜索、登录、导航、项目创建、社区弹层、最近项目、精选素材 Tab 或数据读取逻辑。 +- 背景、顶部品牌小陶偶、左侧导航、按钮和九大创作工具图标使用 `gpt-image-2` / image2 生成资源,统一保存在 `public/creation-home/`;资源只作为装饰图标或背景纹理接入,不包含图内文字,不替换或隐藏现有 UI 文案和交互。 - 社群入口复用现有玩家社区弹层,点击后必须停留在 `/creation`。 - 不在 UI 中放规则说明、实现说明或“暂不实装”提示。 - 未登录时不渲染最近项目区;需要创建项目时走登录弹窗和登录后重试。 diff --git a/public/creation-home/asset-manifest.json b/public/creation-home/asset-manifest.json new file mode 100644 index 000000000..566b5fb3d --- /dev/null +++ b/public/creation-home/asset-manifest.json @@ -0,0 +1,117 @@ +{ + "generatedBy": "VectorEngine gpt-image-2", + "generatedFor": "/creation 创作工具主页 image2 风格资源", + "styleReference": "用户提供参考图 codex-clipboard-5ee77a57-5ceb-46c7-a309-f6c8e374d989.png", + "constraints": [ + "无图内文字", + "不替换现有 UI 文案", + "只作为视觉资源接入" + ], + "assets": [ + { + "file": "/creation-home/background-clay-workspace.png", + "subject": "暖白陶泥纸感工作台背景纹理", + "bytes": 1253141 + }, + { + "file": "/creation-home/brand-mascot.png", + "subject": "陶泥儿品牌小陶偶头像", + "bytes": 265352 + }, + { + "file": "/creation-home/feature-character.png", + "subject": "游戏角色", + "bytes": 257922 + }, + { + "file": "/creation-home/feature-coding.png", + "subject": "游戏功能编码", + "bytes": 280325 + }, + { + "file": "/creation-home/feature-effects.png", + "subject": "游戏特效", + "bytes": 246466 + }, + { + "file": "/creation-home/feature-export.png", + "subject": "一键导出", + "bytes": 230725 + }, + { + "file": "/creation-home/feature-marketing.png", + "subject": "游戏美宣", + "bytes": 272968 + }, + { + "file": "/creation-home/feature-music.png", + "subject": "游戏音乐", + "bytes": 258027 + }, + { + "file": "/creation-home/feature-scene.png", + "subject": "游戏场景", + "bytes": 284949 + }, + { + "file": "/creation-home/feature-ui.png", + "subject": "游戏 UI", + "bytes": 280537 + }, + { + "file": "/creation-home/feature-visual-spec.png", + "subject": "游戏视觉规范", + "bytes": 297305 + }, + { + "file": "/creation-home/hero-community.png", + "subject": "玩家社区按钮图标", + "bytes": 250131 + }, + { + "file": "/creation-home/hero-create.png", + "subject": "开始创作按钮图标", + "bytes": 242745 + }, + { + "file": "/creation-home/nav-create.png", + "subject": "左侧导航创作", + "bytes": 278377 + }, + { + "file": "/creation-home/nav-discover.png", + "subject": "左侧导航发现", + "bytes": 261177 + }, + { + "file": "/creation-home/nav-profile.png", + "subject": "左侧导航我的", + "bytes": 288027 + }, + { + "file": "/creation-home/nav-projects.png", + "subject": "左侧导航项目 / 草稿兜底", + "bytes": 247891 + }, + { + "file": "/creation-home/nav-recommend.png", + "subject": "左侧导航推荐", + "bytes": 284543 + }, + { + "file": "/creation-home/project-new.png", + "subject": "新建项目", + "bytes": 260908 + }, + { + "file": "/creation-home/topbar-search.png", + "subject": "顶部搜索", + "bytes": 241211 + }, + { + "file": "/creation-home/topbar-wallet.png", + "subject": "顶部泥点余额", + "bytes": 280555 + } + ] +} \ No newline at end of file diff --git a/public/creation-home/background-clay-workspace.png b/public/creation-home/background-clay-workspace.png new file mode 100644 index 000000000..c32e5c1fc Binary files /dev/null and b/public/creation-home/background-clay-workspace.png differ diff --git a/public/creation-home/brand-mascot.png b/public/creation-home/brand-mascot.png new file mode 100644 index 000000000..8574c8c19 Binary files /dev/null and b/public/creation-home/brand-mascot.png differ diff --git a/public/creation-home/feature-character.png b/public/creation-home/feature-character.png new file mode 100644 index 000000000..24e1c25d6 Binary files /dev/null and b/public/creation-home/feature-character.png differ diff --git a/public/creation-home/feature-coding.png b/public/creation-home/feature-coding.png new file mode 100644 index 000000000..5ea677d09 Binary files /dev/null and b/public/creation-home/feature-coding.png differ diff --git a/public/creation-home/feature-effects.png b/public/creation-home/feature-effects.png new file mode 100644 index 000000000..113f5155c Binary files /dev/null and b/public/creation-home/feature-effects.png differ diff --git a/public/creation-home/feature-export.png b/public/creation-home/feature-export.png new file mode 100644 index 000000000..34714030e Binary files /dev/null and b/public/creation-home/feature-export.png differ diff --git a/public/creation-home/feature-marketing.png b/public/creation-home/feature-marketing.png new file mode 100644 index 000000000..81bd39d88 Binary files /dev/null and b/public/creation-home/feature-marketing.png differ diff --git a/public/creation-home/feature-music.png b/public/creation-home/feature-music.png new file mode 100644 index 000000000..8d47e6e2e Binary files /dev/null and b/public/creation-home/feature-music.png differ diff --git a/public/creation-home/feature-scene.png b/public/creation-home/feature-scene.png new file mode 100644 index 000000000..d86023c32 Binary files /dev/null and b/public/creation-home/feature-scene.png differ diff --git a/public/creation-home/feature-ui.png b/public/creation-home/feature-ui.png new file mode 100644 index 000000000..84c726478 Binary files /dev/null and b/public/creation-home/feature-ui.png differ diff --git a/public/creation-home/feature-visual-spec.png b/public/creation-home/feature-visual-spec.png new file mode 100644 index 000000000..a71881f54 Binary files /dev/null and b/public/creation-home/feature-visual-spec.png differ diff --git a/public/creation-home/hero-community.png b/public/creation-home/hero-community.png new file mode 100644 index 000000000..85abf0b1a Binary files /dev/null and b/public/creation-home/hero-community.png differ diff --git a/public/creation-home/hero-create.png b/public/creation-home/hero-create.png new file mode 100644 index 000000000..1da8dc65e Binary files /dev/null and b/public/creation-home/hero-create.png differ diff --git a/public/creation-home/nav-create.png b/public/creation-home/nav-create.png new file mode 100644 index 000000000..b3efa6fd9 Binary files /dev/null and b/public/creation-home/nav-create.png differ diff --git a/public/creation-home/nav-discover.png b/public/creation-home/nav-discover.png new file mode 100644 index 000000000..82a6cdf6f Binary files /dev/null and b/public/creation-home/nav-discover.png differ diff --git a/public/creation-home/nav-profile.png b/public/creation-home/nav-profile.png new file mode 100644 index 000000000..298247085 Binary files /dev/null and b/public/creation-home/nav-profile.png differ diff --git a/public/creation-home/nav-projects.png b/public/creation-home/nav-projects.png new file mode 100644 index 000000000..d822aece6 Binary files /dev/null and b/public/creation-home/nav-projects.png differ diff --git a/public/creation-home/nav-recommend.png b/public/creation-home/nav-recommend.png new file mode 100644 index 000000000..4e97197bf Binary files /dev/null and b/public/creation-home/nav-recommend.png differ diff --git a/public/creation-home/project-new.png b/public/creation-home/project-new.png new file mode 100644 index 000000000..14d2172d8 Binary files /dev/null and b/public/creation-home/project-new.png differ diff --git a/public/creation-home/topbar-search.png b/public/creation-home/topbar-search.png new file mode 100644 index 000000000..e871fe965 Binary files /dev/null and b/public/creation-home/topbar-search.png differ diff --git a/public/creation-home/topbar-wallet.png b/public/creation-home/topbar-wallet.png new file mode 100644 index 000000000..5a9177010 Binary files /dev/null and b/public/creation-home/topbar-wallet.png differ diff --git a/src/components/creation-home/CreationLandingView.tsx b/src/components/creation-home/CreationLandingView.tsx index 7c8eb9991..6641d01f9 100644 --- a/src/components/creation-home/CreationLandingView.tsx +++ b/src/components/creation-home/CreationLandingView.tsx @@ -1,16 +1,3 @@ -import { - Box, - Code2, - Gamepad2, - Image as ImageIcon, - Layers3, - Megaphone, - Music, - Palette, - Plus, - Sparkles, - Wand2, -} from 'lucide-react'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { @@ -56,7 +43,7 @@ type ShowcaseTabId = type CreationFeatureItem = { title: string; description: string; - icon: typeof Palette; + iconSrc: string; }; type ShowcaseAssetItem = { @@ -70,51 +57,57 @@ type ShowcaseAssetItem = { cost: string; }; +const CREATION_HOME_ASSETS = { + heroCreate: '/creation-home/hero-create.png', + heroCommunity: '/creation-home/hero-community.png', + projectNew: '/creation-home/project-new.png', +} as const; + const CREATION_FEATURES: CreationFeatureItem[] = [ { title: '游戏视觉规范', description: '轻松约束多类素材视觉一致性', - icon: Palette, + iconSrc: '/creation-home/feature-visual-spec.png', }, { title: '游戏角色', description: '整套高完成度2D/3D角色素材及动画', - icon: Box, + iconSrc: '/creation-home/feature-character.png', }, { title: '游戏UI', description: '轻松生成高一致性的UI素材', - icon: Layers3, + iconSrc: '/creation-home/feature-ui.png', }, { title: '游戏音乐', description: '轻松制作游戏背景音乐、音效', - icon: Music, + iconSrc: '/creation-home/feature-music.png', }, { title: '游戏特效', description: '低成本生成精品游戏特效', - icon: Sparkles, + iconSrc: '/creation-home/feature-effects.png', }, { title: '游戏场景', description: '轻松生成各类游戏场景素材', - icon: ImageIcon, + iconSrc: '/creation-home/feature-scene.png', }, { title: '游戏美宣', description: '轻松生成游戏上架所需图片和视频', - icon: Megaphone, + iconSrc: '/creation-home/feature-marketing.png', }, { title: '游戏功能编码', description: '自然语言驱动游戏生成', - icon: Code2, + iconSrc: '/creation-home/feature-coding.png', }, { title: '一键导出', description: '支持导出为微抖小游戏、Godot、Unity、UE工程', - icon: Gamepad2, + iconSrc: '/creation-home/feature-export.png', }, ]; @@ -479,18 +472,35 @@ export function CreationLandingView({
- + 开始创作 {onOpenCommunity ? ( + 玩家社区 ) : null} @@ -510,18 +520,26 @@ export function CreationLandingView({
- {CREATION_FEATURES.map((feature) => { - const Icon = feature.icon; - return ( -
+ {CREATION_FEATURES.map((feature) => ( +
+ - + + +

{feature.title}

{feature.description}

-
- ); - })} + +
+ ))}
@@ -552,7 +570,13 @@ export function CreationLandingView({ disabled={isCreatingProject} > - + 新建项目 diff --git a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx index bf9f58e5e..965ae2e13 100644 --- a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx +++ b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx @@ -15268,6 +15268,7 @@ export function PlatformEntryFlowShellImpl({ ? 'create' : platformBootstrap.platformTab } + allowHiddenActiveTab={selectionStage === 'creation-home'} onTabChange={handlePlatformHomeTabChange} hasSavedGame={hasSavedGame} savedSnapshot={savedSnapshot} @@ -15428,7 +15429,7 @@ export function PlatformEntryFlowShellImpl({ initial={{ opacity: 0, y: 12 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -12 }} - className="flex h-full min-h-0 min-w-0 flex-col overflow-hidden" + className="creation-home-stage flex h-full min-h-0 min-w-0 flex-col overflow-hidden" > {platformHomeView} diff --git a/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx b/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx index 2947a75bd..d5aaba11e 100644 --- a/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx +++ b/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx @@ -9169,6 +9169,23 @@ test('creation home desktop rail can return to platform tabs', async () => { expect(window.location.pathname).toBe('/'); }); +test('direct mobile creation home keeps landing content without mobile nav entry', async () => { + window.history.replaceState(null, '', '/creation'); + const { container } = render(); + + expect( + await screen.findByRole('main', { name: '陶泥儿创作主页' }), + ).toBeTruthy(); + const bottomNav = container.querySelector('.platform-bottom-nav'); + expect(bottomNav).toBeTruthy(); + expect( + within(bottomNav as HTMLElement).queryByRole('button', { name: '创作' }), + ).toBeNull(); + expect( + within(bottomNav as HTMLElement).queryByRole('button', { name: '项目' }), + ).toBeNull(); +}); + test('embedded puzzle form timeout exits busy state and shows a readable error', async () => { const user = userEvent.setup(); diff --git a/src/components/rpg-entry/RpgEntryHomeView.tsx b/src/components/rpg-entry/RpgEntryHomeView.tsx index 5a42448ac..c435f80c8 100644 --- a/src/components/rpg-entry/RpgEntryHomeView.tsx +++ b/src/components/rpg-entry/RpgEntryHomeView.tsx @@ -288,6 +288,7 @@ export interface RpgEntryHomeViewProps { createTabContent?: ReactNode; draftTabContent?: ReactNode; hasUnreadDraftUpdate?: boolean; + allowHiddenActiveTab?: boolean; } const PANEL_SURFACE_CLASS = 'platform-surface platform-surface--soft'; @@ -319,6 +320,19 @@ const PLATFORM_DESKTOP_NAV_TABS: PlatformNavTab[] = [ 'projects', 'profile', ]; +const CREATION_HOME_NAV_ICON_SRC: Record = { + home: '/creation-home/nav-recommend.png', + category: '/creation-home/nav-discover.png', + create: '/creation-home/nav-create.png', + projects: '/creation-home/nav-projects.png', + saves: '/creation-home/nav-projects.png', + profile: '/creation-home/nav-profile.png', +}; +const CREATION_HOME_TOPBAR_ASSETS = { + brandMascot: '/creation-home/brand-mascot.png', + search: '/creation-home/topbar-search.png', + wallet: '/creation-home/topbar-wallet.png', +} as const; const AVATAR_MAX_FILE_SIZE = 5 * 1024 * 1024; const AVATAR_OUTPUT_SIZE = 256; const AVATAR_ALLOWED_TYPES = new Set(['image/jpeg', 'image/png', 'image/webp']); @@ -1011,6 +1025,13 @@ function PublicCodeSearchBar({
+ + } size="xs" @@ -1868,6 +1896,7 @@ function DesktopTabButton({ emphasized = false, showDot = false, disabled = false, + creationHomeIconSrc, }: { active: boolean; label: string; @@ -1876,6 +1905,7 @@ function DesktopTabButton({ emphasized?: boolean; showDot?: boolean; disabled?: boolean; + creationHomeIconSrc?: string; }) { const ariaLabel = showDot ? `${label},有新草稿` : label; @@ -1888,6 +1918,15 @@ function DesktopTabButton({ className={`platform-desktop-rail__button ${emphasized ? 'platform-desktop-rail__button--primary' : ''} ${active ? 'platform-desktop-rail__button--active' : ''} disabled:cursor-not-allowed disabled:opacity-55`} > + {creationHomeIconSrc ? ( + + ) : null} {showDot ? (