feat(pipeline): 基础资产页提取闸门简化为单按钮 + 卡式 loading + 顶栏重新提取

- 进资产页遮罩上从「3 个按钮(只提取/提取+生成/全套)」简化为单个醒目 CTA「提取角色 / 场景」
  (走 only 模式:只提取不出图,生成仍由用户后续手动点);提取时用脚本同款卡式 loading
  (spinner + 标题 + 跳点 + 扫光进度条;sgv-* 样式解作用域以复用)
- 内容区右上角(团队头像正下方)加「重新提取」按钮 —— 仅基础资产页且已提取过时露出,点击重提

验收:tsc+build 绿;无头核对(空项目显单按钮闸门「提取角色/场景」、已提取项目显「重新提取」、0 console error)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
seaislee1209
2026-06-22 14:12:39 +08:00
parent 1d40e89418
commit fda0385d2f
3 changed files with 53 additions and 30 deletions
+14 -19
View File
@@ -2222,6 +2222,12 @@ export function PipelinePage(props: {
<div className="content content--fh content--fh-flat" id="page-content">
<CornerMarks />
{/* 基础资产页:右上角(头像正下方)重新提取角色/场景 —— 仅本阶段且已提取过时露出 */}
{viewStage === 2 && project.metadata?.entities_extracted === true && (
<button type="button" className="btn btn-ghost btn-sm pipeline-reextract" onClick={() => void runExtract("only")} disabled={extractState === "running"}>
{extractState === "running" ? "提取中…" : "重新提取"}
</button>
)}
{notice && <ToastLike notice={notice} />}
{/* ============= STAGE 1 · 脚本 ============= */}
@@ -2573,29 +2579,18 @@ export function PipelinePage(props: {
<div className="extract-gate">
<div className="extract-gate-panel">
{extractState === "running" ? (
<div className="extract-gate-loading">
<span className="eg-spinner" aria-hidden="true"></span>
<div className="eg-load-msg">{extractMsg || "处理中…"}</div>
<div className="mono eg-load-sub">// 蒙版盖住别动,完成自动揭开</div>
<div className="sgv-card">
<span className="sgv-ico"><span className="spinner"></span></span>
<div className="sgv-body">
<div className="sgv-title">{extractMsg || "正在提取角色 / 场景"}<span className="sgv-dots"><i></i><i></i><i></i></span></div>
<div className="sgv-bar"></div>
</div>
</div>
) : (
<>
<div className="eg-title">先从剧本认出角色 / 场景</div>
<div className="mono eg-sub">// 生成图会扣费,交给你点,不自动花钱</div>
<div className="extract-gate-btns">
<button type="button" className="eg-btn" onClick={() => void runExtract("only")}>
<span className="eg-btn-head"><span className="eg-btn-main">只提取关键词</span><span className="eg-tag eg-tag-free">不出图</span></span>
<span className="eg-btn-sub">AI 认出角色 / 场景,出提示词,先不生成</span>
</button>
<button type="button" className="eg-btn" onClick={() => void runExtract("gen")}>
<span className="eg-btn-head"><span className="eg-btn-main">提取 + 生成角色和场景</span><span className="eg-tag eg-tag-pay">会扣费</span></span>
<span className="eg-btn-sub">提完顺手生成角色立绘 + 场景图</span>
</button>
<button type="button" className="eg-btn eg-btn-full" onClick={() => void runExtract("full")}>
<span className="eg-btn-head"><span className="eg-btn-main">提取 + 全套资产</span><span className="eg-tag eg-tag-pay">会扣费 · 最全</span></span>
<span className="eg-btn-sub">角色全身照 + 三视图 + 场景图,一步到位</span>
</button>
</div>
<div className="mono eg-sub">// AI 认出角色 / 场景并出提示词,稍后你再逐个生成,不自动花钱</div>
<button type="button" className="btn btn-primary btn-lg eg-extract-btn" onClick={() => void runExtract("only")}>提取角色 / 场景</button>
{extractErr && <div className="eg-err">{extractErr}</div>}
</>
)}