From 5c3da231e0113726429c3dcd1f2309bde7415d46 Mon Sep 17 00:00:00 2001 From: kang Date: Wed, 13 May 2026 15:39:25 +0800 Subject: [PATCH] auto-save 2026-05-13 15:39 (~2) --- .memory/worklog.json | 13 ++++ web/components/nodes/index.tsx | 127 +++++++++++---------------------- 2 files changed, 54 insertions(+), 86 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index ea14199..08c5be8 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -1795,6 +1795,19 @@ "message": "auto-save 2026-05-13 15:28 (~4)", "hash": "ad895f9", "files_changed": 4 + }, + { + "ts": "2026-05-13T15:33:53+08:00", + "type": "commit", + "message": "auto-save 2026-05-13 15:33 (~4)", + "hash": "944e7e5", + "files_changed": 4 + }, + { + "ts": "2026-05-13T07:37:40Z", + "type": "session-heartbeat", + "message": "Claude 会话活跃 · 最近命令:claude · 2 项未提交变更 · 最近提交:auto-save 2026-05-13 15:33 (~4)", + "files_changed": 2 } ] } diff --git a/web/components/nodes/index.tsx b/web/components/nodes/index.tsx index 07d2e75..fcef279 100644 --- a/web/components/nodes/index.tsx +++ b/web/components/nodes/index.tsx @@ -347,9 +347,7 @@ export function KeyframeNode({ data, selected }: any) { const st = keyframeStatus(d.job) const frames = d.job?.frames ?? [] const jobId = d.job?.id - const [hover, setHover] = useState<{ idx: number; rect: DOMRect } | null>(null) - const [mounted, setMounted] = useState(false) - useEffect(() => setMounted(true), []) + const aspectStr = d.job && d.job.height > 0 ? `${d.job.width}/${d.job.height}` : "9/16" return (
@@ -377,8 +375,6 @@ export function KeyframeNode({ data, selected }: any) { > )} + {/* hover 预览 — absolute 浮在缩略图上方,跟着 ReactFlow 画布缩放平移 */} +
+
+
+ +
+
+ 分镜 {f.index + 1} + {f.timestamp.toFixed(2)}s +
+
+
) })} @@ -479,43 +495,6 @@ export function KeyframeNode({ data, selected }: any) { )} - {/* Portal hover 预览 — 缩略图正上方展开(DAG 画布上方空旷) */} - {mounted && hover && jobId && (() => { - const hf = frames.find((x) => x.index === hover.idx) - if (!hf) return null - const vidAspect = d.job && d.job.height > 0 ? d.job.height / d.job.width : 16 / 9 - const gap = 12 - // 高度优先:不超过缩略图上方可用空间,也不超过视口 80vh - const maxH = Math.max(160, Math.min(window.innerHeight * 0.8, hover.rect.top - gap - 12)) - const maxW = Math.min(window.innerWidth * 0.45, 480) - let h = maxH, w = h / vidAspect - if (w > maxW) { w = maxW; h = w * vidAspect } - const centerX = hover.rect.left + hover.rect.width / 2 - const left = Math.max(12, Math.min(window.innerWidth - w - 12, centerX - w / 2)) - const top = hover.rect.top - h - gap - return createPortal( -
-
- {`preview -
- 分镜 {hf.index + 1} · {hf.timestamp.toFixed(2)}s -
-
-
, - document.body, - ) - })()} ) } @@ -619,9 +598,6 @@ const IMAGEGEN_WIDTH = 360 export function ImageGenNode({ data, selected }: any) { const d: NodeData = data const job = d?.job - const [hover, setHover] = useState<{ key: string; rect: DOMRect } | null>(null) - const [mounted, setMounted] = useState(false) - useEffect(() => setMounted(true), []) // 上方浮条 = 所有 frame 的 elements 已提取图("分镜头编排"的输入素材) type ElPreview = { frameIdx: number; elementId: string; name: string; src: string; cid: string } @@ -662,8 +638,6 @@ export function ImageGenNode({ data, selected }: any) { > )} + {/* hover 预览 — absolute 浮在缩略图上方 */} +
+
+
+ +
+
+ {p.name} + 分镜 {p.frameIdx + 1} +
+
+
) })} @@ -723,45 +717,6 @@ export function ImageGenNode({ data, selected }: any) { )} - {/* Portal hover 预览 — 缩略图正上方展开 */} - {mounted && hover && job && (() => { - const [fi, ei] = hover.key.split("_") - const frameIdx = parseInt(fi, 10) - const p = elementCrops.find((x) => x.frameIdx === frameIdx && x.elementId === ei) - if (!p) return null - const vidAspect = job.height > 0 ? job.height / job.width : 16 / 9 - const gap = 12 - const maxH = Math.max(160, Math.min(window.innerHeight * 0.8, hover.rect.top - gap - 12)) - const maxW = Math.min(window.innerWidth * 0.45, 480) - let h = maxH, w = h / vidAspect - if (w > maxW) { w = maxW; h = w * vidAspect } - const centerX = hover.rect.left + hover.rect.width / 2 - const left = Math.max(12, Math.min(window.innerWidth - w - 12, centerX - w / 2)) - const top = hover.rect.top - h - gap - return createPortal( -
-
- {`preview -
- {p.name} - 分镜 {p.frameIdx + 1} -
-
-
, - document.body, - ) - })()} ) }