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 ? {template.name} : 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 ? {character.name} : 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 ? : } 保存本条规划