feat(core/frontend): ai-tools per-mode layouts (image=chat-stream / model=person picker / cover=platform) + pipeline real unread bell

- ImageWorkbenchPage now renders mode-specific layouts matching each baseline:
  image -> chat-stream (conversation list + hero + prompt chips + chat input bar);
  model -> product rail + 真人模特 cards (assets category=person, fallback Ava/Luna/Mia/Zoe) + per-model count;
  cover -> platform-kit picker. Generation (onGenerate) wiring + loading/empty/fail states preserved.
- pipeline.tsx: bespoke topbar bell now shows real unreadCount (was hardcoded 12); App.tsx threads it.
verified: tsc --noEmit clean; screenshot confirms image-optimize matches chat-stream baseline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
seaislee1209
2026-06-05 17:06:30 +08:00
co-authored by Claude Opus 4.8
parent 579fb7cefa
commit 2242241c3b
4 changed files with 974 additions and 285 deletions
+3 -2
View File
@@ -62,6 +62,7 @@ export function PipelinePage(props: {
assets: Asset[];
billing: BillingSummary | null;
notice: Notice | null;
unreadCount: number;
avatarChar: string;
logout: () => void;
onRefresh: () => void;
@@ -77,7 +78,7 @@ export function PipelinePage(props: {
onSubmitExport: () => void;
}) {
const {
project, loading, navigate, user, team, products, projects, assets, billing, notice, avatarChar, logout,
project, loading, navigate, user, team, products, projects, assets, billing, notice, unreadCount, avatarChar, logout,
onGenerateScript, onGenerateBaseAsset, onGenerateStoryboard, onSkipStoryboard,
onSubmitVideo, onSubmitAllVideos, onSubmitExport
} = props;
@@ -168,7 +169,7 @@ export function PipelinePage(props: {
</span>
<button className="icon-btn" type="button" onClick={() => navigate("messages")} title="消息中心">
<IconKitSvg name="bell" />
<span className="count-noti">12</span>
{unreadCount > 0 && <span className="count-noti">{unreadCount}</span>}
</button>
<div className="topbar-avatar" onDoubleClick={logout} title="账户(双击退出)">
<span>{avatarChar}</span>