diff --git a/.hermes/shared-memory/decision-log.md b/.hermes/shared-memory/decision-log.md index c885295e..eefd804d 100644 --- a/.hermes/shared-memory/decision-log.md +++ b/.hermes/shared-memory/decision-log.md @@ -53,6 +53,7 @@ - 2026-06-10 追加:`PlatformStatusDialog` 支持自定义图标、图标可访问标签以及动作按钮 surface / size / className 透传,用来承接玩法结果页里保留品牌视觉但语义仍是“状态结果弹层”的场景;大鱼吃小鱼结果页的发布失败弹层已迁移到这套组件,业务页不再保留 `UnifiedConfirmDialog + PlatformIconBadge` 的专用组合。 - 2026-06-10 追加:`PlatformStatusDialog` 继续支持 header notice 布局、body content、close button、backdrop / Escape 关闭路径,用来承接“提示 / 规则阻断 / 作品不可用 / 泥点不足”这类带标题栏的状态 notice;平台入口的 `draftGenerationPointNotice`、`workNotFoundRecoveryDialog` 和 RPG 大编辑器里的 `EditorNoticeDialog` 已迁移到这套共享组件,不再各自维护 `UnifiedConfirmDialog` 壳层和关闭策略。 - 2026-06-10 追加:`CustomWorldEntityCatalog` 的 `minimum-playable` 规则阻断提示也统一迁到 `PlatformStatusDialog`,不再和删除角色 / 批量删除共用 `UnifiedConfirmDialog` 配置;同日平台入口公开编号搜索把 error 分支从用户摘要 modal 中拆出,未命中结果单独走 `PlatformStatusDialog`,命中用户继续保留 `UnifiedModal + PlatformSubpanel` 信息布局。 +- 2026-06-11 追加:`PlatformAsyncStatePanel` 继续从 profile modal 与作品架扩展到 RPG 首页公开分区;`RpgEntryHomeView.tsx` 的移动端排行、发现页寓教于乐 / 默认公开 feed、桌面首页“今日游戏 / 推荐”、桌面发现页寓教于乐 / 默认公开 feed,以及“我的创作”分区已统一改成 `loadingState / emptyState / children` 三态 slot。页面级 `platformError` 继续留在状态壳外层,保证错误提示可以和内容并存;`recommend runtime`、分类筛选等含运行态或二级筛选语义的分支暂不硬并入这一轮。 - 2026-06-09 追加:通用输入 Composer 的上传参考图、发送和移除参考图已迁移到 `PlatformIconButton`;图标上传仍使用 `asChild="label"` 保留 label + file input 语义,公共组件会自动写入隐藏文本,确保内嵌 file input 继承可访问名称。 - 2026-06-10 追加:creation-agent composer 的上传文档 / 上传参考图入口使用 `PlatformIconButton` 默认 `platformIcon`;工作台只保留动态 label、title、busy 状态和 picker 回调,发送按钮继续保留主题色动作布局。验证命令:`npm run test -- src/components/creation-agent/CreationAgentWorkspace.test.tsx src/components/common/PlatformIconButton.test.tsx`。 - 2026-06-10 追加:作品详情顶部返回 / 分享和封面轮播上一张 / 下一张入口使用 `PlatformIconButton variant="platformIcon"`;详情页保留原 `platform-work-detail__*` 局部 class 控制位置和尺寸,点赞、复制三态等专用动作暂不迁移。验证命令:`npm run test -- src/components/platform-entry/PlatformWorkDetailView.test.tsx src/components/common/PlatformIconButton.test.tsx`。 diff --git a/docs/technical/【前端架构】PlatformUiKit弹窗组件收口计划-2026-06-08.md b/docs/technical/【前端架构】PlatformUiKit弹窗组件收口计划-2026-06-08.md index 4dc75038..3a332713 100644 --- a/docs/technical/【前端架构】PlatformUiKit弹窗组件收口计划-2026-06-08.md +++ b/docs/technical/【前端架构】PlatformUiKit弹窗组件收口计划-2026-06-08.md @@ -259,6 +259,7 @@ 19.3.35. 白底 / 暗色面板里的轻量空态和普通 CTA 继续按共享组件收口:`PuzzleResultView.tsx` 的“还没有可编辑的拼图草稿”、`RpgCreationAssetDebugPanel.tsx` 的“没有可诊断项”、`VisualNovelEntityGrid` 的空实体列表、`AccountModal.tsx` 里账号安全分区的“无安全限制 / 无登录设备 / 无操作记录”以及 `LoginScreen.tsx` 的“当前登录入口暂不可用”都改为 `PlatformEmptyState`;`Match3DResultView.tsx` 的引用素材列表直接交给 `PlatformAssetPickerGrid` 自己处理空态。`AdventureEntityModal.tsx` 的私聊按钮、`InventoryPanel.tsx` 的锻造 / 合成按钮、`RpgAdventurePanel.tsx` 底部 `队伍 / 背包 / 换一换 / 退出聊天` 按钮,以及 `RpgAdventurePanelOverlays.tsx` 里的“查看任务 / 保存并退出”都改为 `PlatformActionButton surface="editorDark"`,业务页只贴回局部 sky / emerald / runtime 皮肤。后续白底子面板里的只读空态优先使用 `PlatformEmptyState surface="subpanel"`;暗色编辑 / 运行面板里的普通动作优先使用 `PlatformActionButton surface="editorDark"`,若还需要 stopPropagation、局部字号或图标排版,可保留薄包装层,但不要再回退到原生 ` ) : null} - ) : ( - - 暂时还没有可展示的作品。 - - )} + ) : (
- {isLoadingPlatform ? ( - 正在读取公开作品... - ) : discoverFeedEntries.length > 0 ? ( + 正在读取公开作品...} + isEmpty={discoverFeedEntries.length === 0} + emptyState={ + + 公开广场暂时还没有可展示的作品。 + + } + >
{discoverFeedEntries.map( (entry: PlatformPublicGalleryCard) => { @@ -3918,11 +3932,7 @@ export function RpgEntryHomeView({ }, )}
- ) : ( - - 公开广场暂时还没有可展示的作品。 - - )} +
)} @@ -4043,11 +4053,18 @@ export function RpgEntryHomeView({ ) : discoverChannel === 'edutainment' ? (
- {isLoadingPlatform ? ( - 正在读取公开作品... - ) : edutainmentFeedEntries.length > 0 || - onOpenChildMotionDemo || - onOpenBabyLoveDrawing ? ( + 正在读取公开作品...} + isEmpty={ + edutainmentFeedEntries.length === 0 && + !onOpenChildMotionDemo && + !onOpenBabyLoveDrawing + } + emptyState={ + 暂时还没有可展示的作品。 + } + >
{edutainmentFeedEntries.map((entry) => ( ) : null}
- ) : ( - 暂时还没有可展示的作品。 - )} +
) : (
@@ -4106,9 +4121,16 @@ export function RpgEntryHomeView({ title={discoverChannel === 'today' ? '今日游戏' : '推荐'} detail={discoverChannel === 'today' ? 'TODAY GAMES' : 'RECOMMENDED'} /> - {isLoadingPlatform ? ( - 正在读取公开作品... - ) : discoverFeedEntries.length > 0 ? ( + 正在读取公开作品...} + isEmpty={discoverFeedEntries.length === 0} + emptyState={ + + 公开广场暂时还没有可展示的作品。 + + } + >
{discoverFeedEntries.map((entry) => ( ))}
- ) : ( - - 公开广场暂时还没有可展示的作品。 - - )} +
)} @@ -4181,9 +4199,18 @@ export function RpgEntryHomeView({ {platformError} ) : null} - {isLoadingPlatform ? ( - 正在读取你的作品... - ) : myEntries.length > 0 ? ( + 正在读取你的作品...} + isEmpty={myEntries.length === 0} + emptyState={ + + {isAuthenticated + ? '你还没有保存任何自定义世界,先创建一个草稿开始吧。' + : '登录后查看你的作品。'} + + } + >
{myEntries.map( (entry: CustomWorldLibraryEntry) => ( @@ -4201,13 +4228,7 @@ export function RpgEntryHomeView({ ), )}
- ) : ( - - {isAuthenticated - ? '你还没有保存任何自定义世界,先创建一个草稿开始吧。' - : '登录后查看你的作品。'} - - )} +
); @@ -4629,9 +4650,14 @@ export function RpgEntryHomeView({ TODAY - {isLoadingPlatform ? ( - 正在读取今日游戏... - ) : desktopTodayEntries.length > 0 ? ( + 正在读取今日游戏...} + isEmpty={desktopTodayEntries.length === 0} + emptyState={ + 今天暂时还没有新游戏。 + } + >
{desktopTodayEntries.slice(0, 3).map((entry, index) => ( ))}
- ) : ( - 今天暂时还没有新游戏。 - )} +
@@ -4653,9 +4677,14 @@ export function RpgEntryHomeView({ >
- {isLoadingPlatform ? ( - 正在读取推荐作品... - ) : desktopFeaturedGrid.length > 0 ? ( + 正在读取推荐作品...} + isEmpty={desktopFeaturedGrid.length === 0} + emptyState={ + 暂时还没有推荐作品。 + } + >
{desktopFeaturedGrid.map((entry) => ( ))}
- ) : ( - 暂时还没有推荐作品。 - )} +
{desktopLibraryPreview.length > 0 ||