diff --git a/.memory/worklog.json b/.memory/worklog.json index 6bc3dc9..42e2e10 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -195,6 +195,13 @@ "message": "auto-save 2026-05-12 18:40 (~2)", "hash": "864781d", "files_changed": 2 + }, + { + "ts": "2026-05-12T18:46:46+08:00", + "type": "commit", + "message": "auto-save 2026-05-12 18:46 (~3)", + "hash": "5a914b9", + "files_changed": 3 } ] } diff --git a/web/components/dashboard.tsx b/web/components/dashboard.tsx index 962b7cb..95bccfa 100644 --- a/web/components/dashboard.tsx +++ b/web/components/dashboard.tsx @@ -187,43 +187,35 @@ export function Dashboard({ data }: Props) { - {/* 展开面板 — 多卡同时展开,按 step 顺序排列 */} + {/* 展开面板 — 单列宽度,居中,卡片竖向堆叠 */} {expanded.size > 0 && ( -
-
- 展开详情 - -
-
- {TILES.filter((t) => expanded.has(t.key)).map((t) => ( -
-
-
- {String(t.step).padStart(2, "0")} - {t.icon} - {t.title} - {colSummary[t.key]} -
- +
+
+ {String(t.step).padStart(2, "0")} + {t.icon} + {t.title} + {colSummary[t.key]}
-
- {renderSection(t.key)} -
-
- ))} -
+ +
+
+ {renderSection(t.key)} +
+ + ))} )} @@ -231,7 +223,7 @@ export function Dashboard({ data }: Props) { function renderSection(key: string): ReactNode { return ( - <> +
{/* ---- Input ---- */} {key === "input" && ( @@ -367,41 +359,45 @@ export function Dashboard({ data }: Props) {
候选 30 张 → pHash 去重 + 清晰度排序 → 时序分桶 → 5 张代表分镜
) : ( -
- {job!.frames.map((f) => { - const isSel = data.selectedFrames.has(f.index) - return ( - { e.stopPropagation(); data.onToggleFrame(f.index) }} - className={`ml-auto text-[10.5px] px-2 py-0.5 rounded-full inline-flex items-center gap-1 ${ - isSel - ? "bg-emerald-500 text-white" - : "bg-white/10 text-[var(--text-soft)] border border-white/15 hover:bg-white/20" - }`} - > - - {isSel ? "已选用" : "选用此帧"} - - } - > + job!.frames.map((f) => { + const isSel = data.selectedFrames.has(f.index) + return ( + { e.stopPropagation(); data.onExpandFrame(f.index) }} - className="block w-full aspect-video rounded-md overflow-hidden bg-black relative" + onClick={(e) => { e.stopPropagation(); data.onToggleFrame(f.index) }} + className={`ml-auto text-[10.5px] px-2 py-0.5 rounded-full inline-flex items-center gap-1 ${ + isSel + ? "bg-emerald-500 text-white" + : "bg-white/10 text-[var(--text-soft)] border border-white/15 hover:bg-white/20" + }`} > - {`frame + + {isSel ? "已选用" : "选用此帧"} - - ) - })} -
+ } + > + + + ) + }) )}
)} @@ -415,24 +411,22 @@ export function Dashboard({ data }: Props) { ) : ( -
- {job!.transcript.map((s) => ( - -
- EN - {s.en} -
-
- ZH - {s.zh || 翻译中…} -
-
- ))} -
+ job!.transcript.map((s) => ( + +
+ EN + {s.en} +
+
+ ZH + {s.zh || 翻译中…} +
+
+ )) ) )} @@ -512,7 +506,7 @@ export function Dashboard({ data }: Props) { )} - + ) } }