From ad895f92e2bb3cf398f66d3907c5bc41cc5d966c Mon Sep 17 00:00:00 2001 From: kang Date: Wed, 13 May 2026 15:28:21 +0800 Subject: [PATCH] auto-save 2026-05-13 15:28 (~4) --- .memory/worklog.json | 13 ++++++++ web/components/lightbox.tsx | 4 +-- web/components/nodes/index.tsx | 53 ++++++++++++------------------- web/components/storyboard-bar.tsx | 21 +++++------- 4 files changed, 44 insertions(+), 47 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index 4935fff..bda3b95 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -1775,6 +1775,19 @@ "type": "session-heartbeat", "message": "Claude 会话活跃 · 最近命令:claude · 1 项未提交变更 · 最近提交:auto-save 2026-05-13 15:17 (~6)", "files_changed": 1 + }, + { + "ts": "2026-05-13T15:22:51+08:00", + "type": "commit", + "message": "auto-save 2026-05-13 15:22 (~5)", + "hash": "de1254f", + "files_changed": 5 + }, + { + "ts": "2026-05-13T07:27:40Z", + "type": "session-heartbeat", + "message": "Claude 会话活跃 · 最近命令:claude · 4 项未提交变更 · 最近提交:auto-save 2026-05-13 15:22 (~5)", + "files_changed": 4 } ] } diff --git a/web/components/lightbox.tsx b/web/components/lightbox.tsx index b195f92..2f8e856 100644 --- a/web/components/lightbox.tsx +++ b/web/components/lightbox.tsx @@ -714,14 +714,14 @@ export function FrameLightbox({ jobId, frames, activeIndex, selected, onClose, o
#{ci + 1}
- {/* 上推按钮:左上角 */} + {/* 上推按钮:常驻可见 */} - {/* 上推按钮:hover 时浮出 — 推送关键帧本身到分镜头编排 */} + {/* 上推按钮:常驻可见 — 推送关键帧本身到分镜头编排 */} {d.onPushToStoryboard && ( @@ -479,38 +479,31 @@ export function KeyframeNode({ data, selected }: any) { )} - {/* Portal hover 大预览 — 浮在缩略图上方(不挡其他界面) */} + {/* Portal hover 预览 — 固定视口右下角,不遮挡 */} {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 maxH = Math.min(window.innerHeight * 0.7, hover.rect.top - 16) - const maxW = Math.min(window.innerWidth * 0.6, 600) - let h = maxH, w = h / vidAspect - if (w > maxW) { w = maxW; h = w * vidAspect } - // 水平居中到缩略图,clamp 在视口内 - const centerX = hover.rect.left + hover.rect.width / 2 - const left = Math.max(12, Math.min(window.innerWidth - w - 12, centerX - w / 2)) + const w = 280 + const h = w * vidAspect return createPortal(
-
+
{`preview -
- 分镜 {hf.index + 1} · {hf.timestamp.toFixed(2)}s - 点击进入精细调整 +
+ 分镜 {hf.index + 1} · {hf.timestamp.toFixed(2)}s
, @@ -674,7 +667,7 @@ export function ImageGenNode({ data, selected }: any) { className="absolute inset-0 w-full h-full object-contain" /> - {/* 上推按钮:hover 时浮出 */} + {/* 上推按钮:常驻可见 */} {d.onPushToStoryboard && ( @@ -724,38 +717,34 @@ export function ImageGenNode({ data, selected }: any) { )} - {/* Portal hover 大预览 — 浮在缩略图上方 */} + {/* 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 maxH = Math.min(window.innerHeight * 0.7, hover.rect.top - 16) - const maxW = Math.min(window.innerWidth * 0.6, 600) - 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 w = 280 + const h = w * vidAspect return createPortal(
-
+
{`preview -
- {p.name} - 来自分镜 {p.frameIdx + 1} +
+ {p.name} + 分镜 {p.frameIdx + 1}
, diff --git a/web/components/storyboard-bar.tsx b/web/components/storyboard-bar.tsx index 20da9c9..a6fcac3 100644 --- a/web/components/storyboard-bar.tsx +++ b/web/components/storyboard-bar.tsx @@ -213,34 +213,29 @@ export function StoryboardBar({ job, selectedFrames, focusedFrame, onFocusFrame,
)} - {/* Hover 大图预览 · 浮在缩略图下方(不挡其他界面) */} + {/* Hover 预览 · 固定视口右下角,不遮挡 */} {mounted && hover && (() => { const vidAspect = job.height > 0 ? job.height / job.width : 16 / 9 - const maxH = Math.min(window.innerHeight * 0.7, window.innerHeight - hover.rect.bottom - 16) - const maxW = Math.min(window.innerWidth * 0.6, 600) - 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 w = 280 + const h = w * vidAspect return createPortal(
-
+
{`preview -
- 分镜 {hover.seq} · {hover.frame.timestamp.toFixed(2)}s - 点击进入编排 +
+ 分镜 {hover.seq} · {hover.frame.timestamp.toFixed(2)}s
,