diff --git a/core/frontend/src/routes/dashboard.tsx b/core/frontend/src/routes/dashboard.tsx
index 7ae7f2b..d9a4fec 100644
--- a/core/frontend/src/routes/dashboard.tsx
+++ b/core/frontend/src/routes/dashboard.tsx
@@ -1,4 +1,5 @@
import { useEffect, useState } from "react";
+import type { CSSProperties } from "react";
import type { BillingSummary, Product, Project } from "../types";
import type { NavigateFn } from "./route-config";
import { api } from "../api";
@@ -30,6 +31,9 @@ function DashProgress({ project }: { project: Project }) {
);
}
+// 与「视频项目」共用项目列表返回的商品主图;空值继续走现有 9:16 占位图。
+const coverStyle = (url: string): CSSProperties => ({ ["--mock-media-url"]: `url(${url})` } as CSSProperties);
+
export function Dashboard({ products, projects, productTotal, projectTotal, billing, userName, loading = false, navigate, onCreateProduct }: {
products: Product[];
projects: Project[];
@@ -105,7 +109,10 @@ export function Dashboard({ products, projects, productTotal, projectTotal, bill
++ navigate("projects", { tab: "all" })} /> navigate("projects", { tab: "wip" })} /> navigate("projects", { tab: "done" })} />
- 最近项目
{loading && projects.length === 0 ?
: projects.slice(0, 6).map((project) =>
)}
快捷入口
[ /shortcuts ] navigate("products")} /> navigate("library")} /> navigate("account")} /> navigate("projects")} />
提示
[ FAQ ]扣费规则生成失败、超时、用户重跑 — 均不扣费。仅在你点 [ 确认通过 ] 时按 token 实际结算。
+ 最近项目
{loading && projects.length === 0 ?
: projects.slice(0, 6).map((project) => {
+ const cover = project.cover_preview_url || "";
+ return
;
+ })}
快捷入口
[ /shortcuts ] navigate("products")} /> navigate("library")} /> navigate("account")} /> navigate("projects")} />
提示
[ FAQ ]扣费规则生成失败、超时、用户重跑 — 均不扣费。仅在你点 [ 确认通过 ] 时按 token 实际结算。
{/* YYX#11:新建商品抽屉 · 复用商品库同一组件,创建成功后跳商品库看新商品 */}
{onCreateProduct && (