diff --git a/.memory/worklog.json b/.memory/worklog.json
index 3943962..6808885 100644
--- a/.memory/worklog.json
+++ b/.memory/worklog.json
@@ -1,12 +1,5 @@
{
"entries": [
- {
- "files_changed": 1,
- "hash": "7067a2b",
- "message": "auto-save 2026-05-16 14:51 (~1)",
- "ts": "2026-05-16T14:51:52+08:00",
- "type": "commit"
- },
{
"files_changed": 1,
"hash": "2a259cc",
@@ -3217,6 +3210,13 @@
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:feat: enforce english prompt language strategy",
"files_changed": 2
+ },
+ {
+ "ts": "2026-05-18T20:13:59+08:00",
+ "type": "commit",
+ "message": "auto-save 2026-05-18 20:13 (~3)",
+ "hash": "69bb692",
+ "files_changed": 3
}
]
}
diff --git a/web/components/ad-recreation-board.tsx b/web/components/ad-recreation-board.tsx
index 83c79ac..326239b 100644
--- a/web/components/ad-recreation-board.tsx
+++ b/web/components/ad-recreation-board.tsx
@@ -401,7 +401,7 @@ function statusTone(job: Job | null) {
if (!job) return { label: "等待素材", className: "border-white/10 text-white/50 bg-white/[0.03]" }
if (job.status === "failed") return { label: "失败", className: "border-rose-400/30 text-rose-200 bg-rose-500/10" }
if (["created", "downloading", "splitting", "transcribing"].includes(job.status)) {
- return { label: "处理中", className: "border-cyan-300/30 text-cyan-100 bg-cyan-400/10" }
+ return { label: "处理中", className: "border-[#d6b36a]/34 text-[#f5d98e] bg-[#d6b36a]/10" }
}
return { label: "可编辑", className: "border-emerald-300/30 text-emerald-100 bg-emerald-400/10" }
}
@@ -2520,7 +2520,7 @@ function SourceKeyframePicker({
onClick={onExtract}
disabled={!job.video_url || extracting || job.status === "splitting"}
title="自动按动作峰值抽 12 张参考帧,更偏向手势、表情变化、节奏点和镜头变化"
- className="inline-flex h-7 items-center justify-center gap-1 rounded-md bg-white px-2 text-[10.5px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
+ className="skg-primary-action inline-flex h-7 items-center justify-center gap-1 px-2 text-[10.5px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{extracting || job.status === "splitting" ? : }
自动 12 张
@@ -2911,7 +2911,7 @@ function SourceReferenceBuildPanel({
type="button"
onClick={() => void loadSubjectTemplateLibrary()}
disabled={templateLibraryBusy}
- className="inline-flex h-7 items-center gap-1 rounded border border-white/10 bg-white/[0.045] px-2 text-[10px] font-semibold text-white/58 transition hover:border-cyan-300/35 hover:text-cyan-100 disabled:cursor-wait disabled:opacity-50"
+ className="skg-secondary-action inline-flex h-7 items-center gap-1 px-2 text-[10px] font-semibold transition disabled:cursor-wait disabled:opacity-50"
>
{templateLibraryBusy ? : }
数据库 {subjectTemplateLibrary.length} 套
@@ -2929,8 +2929,8 @@ function SourceReferenceBuildPanel({
onClick={() => setSubjectMode(item.value)}
className={`flex min-h-[48px] items-start gap-2 rounded-md border px-2.5 py-2 text-left transition ${
subjectMode === item.value
- ? "border-cyan-200/65 bg-cyan-300/12 text-cyan-50"
- : "border-white/10 bg-black/24 text-white/50 hover:border-cyan-200/30 hover:text-white/78"
+ ? "border-[#d6b36a]/65 bg-[#d6b36a]/12 text-[#f5d98e]"
+ : "border-white/10 bg-black/24 text-white/50 hover:border-[#d6b36a]/35 hover:text-white/78"
}`}
>
{subjectMode === item.value ? : }
@@ -2959,10 +2959,10 @@ function SourceReferenceBuildPanel({
setSubjectStyle(template.subject_style || "transparent_human")
}}
className={`group relative rounded-md border p-1.5 text-left transition ${
- active ? "border-cyan-200/75 bg-cyan-300/12 text-cyan-50" : "border-white/10 bg-black/24 text-white/58 hover:border-cyan-200/35 hover:text-white/82"
+ active ? "border-[#d6b36a]/75 bg-[#d6b36a]/12 text-[#f5d98e]" : "border-white/10 bg-black/24 text-white/58 hover:border-[#d6b36a]/35 hover:text-white/82"
}`}
>
- {active ? : null}
+ {active ? : null}
{preview ?
: null}
@@ -2985,10 +2985,10 @@ function SourceReferenceBuildPanel({
setSubjectStyle("transparent_human")
}}
className={`group relative rounded-md border p-1.5 text-left transition ${
- active ? "border-cyan-200/75 bg-cyan-300/12 text-cyan-50" : "border-white/10 bg-black/24 text-white/58 hover:border-cyan-200/35 hover:text-white/82"
+ active ? "border-[#d6b36a]/75 bg-[#d6b36a]/12 text-[#f5d98e]" : "border-white/10 bg-black/24 text-white/58 hover:border-[#d6b36a]/35 hover:text-white/82"
}`}
>
- {active ? : null}
+ {active ? : null}
{preview ?
: null}
@@ -3000,7 +3000,7 @@ function SourceReferenceBuildPanel({
) : (
-
+
当前跳过模板库:本次只用源视频关键帧的文字化主体特征生成创新主体。模板卡已收起,避免占用生成结果区域。
)}
@@ -3038,7 +3038,7 @@ function SourceReferenceBuildPanel({
onClick={() => void saveGeneratedSubjectTemplate()}
disabled={!visibleActorAssets.length || !templateDraftName.trim() || templateSaveBusy}
title={!visibleActorAssets.length ? "先生成主体视图" : !templateDraftName.trim() ? "先填写模板名称" : "保存到主体模板库"}
- className="inline-flex h-8 items-center justify-center gap-1 rounded-md border border-white/10 bg-white/[0.055] px-3 text-[10.5px] font-semibold text-white/62 transition hover:border-cyan-300/35 hover:text-cyan-100 disabled:cursor-not-allowed disabled:opacity-35"
+ className="skg-secondary-action inline-flex h-8 items-center justify-center gap-1 px-3 text-[10.5px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-35"
>
{templateSaveBusy ?
:
}
保存到主体库
@@ -3234,7 +3234,7 @@ function SourceReferenceBuildPanel({
type="button"
onClick={() => void generateSimilarActor()}
disabled={!frames.length || subjectBusy || templateRequired || !selectedSubjectViews.length}
- className="inline-flex h-9 min-w-[170px] items-center justify-center gap-1 rounded-md bg-white px-3 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
+ className="skg-primary-action inline-flex h-9 min-w-[170px] items-center justify-center gap-1 px-3 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{subjectBusy ?
:
}
{subjectBusyFor ? `生成中 · ${subjectBusyFor.jobLabel}` : generationCtaLabel}
@@ -3779,7 +3779,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void reanalyzeProductViews()}
disabled={!productItems.length || productAnalyzing || !!productAngleBusy}
- className="inline-flex h-9 items-center justify-center gap-1 rounded-md border border-white/10 bg-white/[0.055] px-2.5 text-[11px] font-semibold text-white/72 transition hover:border-white/25 hover:bg-white/[0.1] disabled:cursor-not-allowed disabled:opacity-40"
+ className="skg-secondary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{productAnalyzing ?
:
}
重新识别并补图
@@ -3788,7 +3788,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => productFileRef.current?.click()}
disabled={!job || productUploading || productAnalyzing || !!productAngleBusy}
- className="inline-flex h-9 items-center justify-center gap-1 rounded-md border border-white/10 bg-white/[0.055] px-2.5 text-[11px] font-semibold text-white/72 transition hover:border-white/25 hover:bg-white/[0.1] disabled:cursor-not-allowed disabled:opacity-40"
+ className="skg-secondary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{productUploading ?
:
}
上传产品图
@@ -3844,7 +3844,7 @@ function AudioStoryboardPlanPanel({
@@ -3852,7 +3852,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void rewriteAllRows()}
disabled={scriptRewriteBusy !== null || !rows.length}
- className="inline-flex h-9 items-center justify-center gap-1 rounded-md bg-white px-2.5 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
+ className="skg-primary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{scriptRewriteBusy === "all" ?
:
}
整片改写
@@ -3864,7 +3864,7 @@ function AudioStoryboardPlanPanel({
setCopyZhOverrides({})
}}
disabled={scriptRewriteBusy !== null || !Object.keys(copyOverrides).length}
- className="inline-flex h-9 items-center justify-center rounded-md border border-white/10 bg-white/[0.045] px-2.5 text-[11px] font-semibold text-white/60 transition hover:border-white/25 hover:text-white disabled:cursor-not-allowed disabled:opacity-35"
+ className="skg-secondary-action inline-flex h-9 items-center justify-center px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-35"
>
还原初稿
@@ -3872,7 +3872,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void saveAllStoryboardDrafts()}
disabled={batchStoryboardSaveBusy || !rows.length || !orderedFrames.length}
- className="inline-flex h-9 items-center justify-center gap-1 rounded-md bg-white px-2.5 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
+ className="skg-primary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{batchStoryboardSaveBusy ?
:
}
保存全部规划
@@ -3975,10 +3975,10 @@ function AudioStoryboardPlanPanel({
value={plannedRow.subjectDescription}
onChange={(event) => patchRowPlan(row.index, { subjectDescription: event.target.value })}
placeholder="人物描述:主体身份、姿态、情绪、需要用哪些视角"
- className="min-h-[42px] w-full resize-y rounded border border-violet-300/12 bg-violet-300/[0.04] px-2 py-1.5 text-[10.5px] leading-snug text-violet-50/78 outline-none placeholder:text-white/25 focus:border-violet-300/50"
+ className="min-h-[42px] w-full resize-y rounded border border-[#d6b36a]/14 bg-[#d6b36a]/[0.045] px-2 py-1.5 text-[10.5px] leading-snug text-white/78 outline-none placeholder:text-white/25 focus:border-[#d6b36a]/50"
/>
{showChineseMirror && plannedRow.subjectDescriptionZh ? (
-
中:{plannedRow.subjectDescriptionZh}
+
中:{plannedRow.subjectDescriptionZh}
) : null}
>
)}
@@ -4089,7 +4089,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void saveSingleRowStoryboardDraft(plannedRow, referenceFrame)}
disabled={!referenceFrame || savingStoryboard}
- className="mt-1.5 inline-flex h-8 w-full items-center justify-center gap-1 rounded-md bg-white px-2 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
+ className="skg-primary-action mt-1.5 inline-flex h-8 w-full items-center justify-center gap-1 px-2 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{savingStoryboard ?
:
}
保存本条规划