auto-save 2026-05-13 19:12 (~3)

This commit is contained in:
2026-05-13 19:12:17 +08:00
parent 6fb00da3f9
commit 61a4becb4b
3 changed files with 33 additions and 20 deletions

View File

@@ -2162,6 +2162,19 @@
"message": "auto-save 2026-05-13 18:57 (+1, ~3)",
"hash": "aec7fda",
"files_changed": 4
},
{
"ts": "2026-05-13T19:06:46+08:00",
"type": "commit",
"message": "auto-save 2026-05-13 19:06 (~3)",
"hash": "6fb00da",
"files_changed": 3
},
{
"ts": "2026-05-13T11:09:29Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 1 项未提交变更 · 最近提交auto-save 2026-05-13 19:06 (~3)",
"files_changed": 1
}
]
}

View File

@@ -830,6 +830,17 @@ api/main.py
<h2>变更记录</h2>
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
<div class="changelog">
<article class="change">
<header>
<h3>2026-05-13 · 元素改造 hover 预览简化为原帧预览</h3>
<span class="tag violet">StoryboardNode</span>
</header>
<div class="body">
<p><strong>问题:</strong>元素改造节点的 hover 预览虽然已改为节点内显示,但仍比关键帧节点复杂,多了“来源原帧 / 提取元素”两栏和元素名称,信息过载。</p>
<p><strong>改动:</strong>改成和镜头拆解关键帧一致的简单预览:只显示来源原帧,底部显示分镜编号和时间。</p>
<p><strong>影响:</strong><code>web/components/nodes/index.tsx</code>;元素改造板块 hover 现在更轻,不干扰当前判断。</p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-13 · 元素改造 hover 预览改为节点内效果</h3>
@@ -837,7 +848,7 @@ api/main.py
</header>
<div class="body">
<p><strong>问题:</strong>上一版把元素预览用 <code>createPortal</code> 挂到 <code>body</code>DevTools 里会出现额外 fixed 层,交互形态和关键帧节点不一致。</p>
<p><strong>改动:</strong>改成和镜头拆解关键帧一致的节点内 <code>group-hover</code> 预览hover 时在元素缩略图上方展示来源原帧 + 提取元素,不再向 <code>body</code> 插入预览层。</p>
<p><strong>改动:</strong>改成节点内 <code>group-hover</code> 预览,不再向 <code>body</code> 插入预览层。后续又简化为只展示来源原帧,见上方最新记录。</p>
<p><strong>影响:</strong><code>web/components/nodes/index.tsx</code>;元素改造板块的 DOM 和交互效果更接近关键帧缩略图。</p>
</div>
</article>

View File

@@ -682,9 +682,9 @@ export function StoryboardNode({ data, selected }: any) {
📋
</button>
)}
{/* hover 预览 — 关键帧节点一样留在 ReactFlow 节点内部,不向 body 挂 fixed portal */}
{/* hover 预览 — 关键帧节点保持一致:只看来源原帧,不额外展示元素面板 */}
<div
className="pointer-events-none absolute opacity-0 group-hover:opacity-100 scale-95 group-hover:scale-100 transition-all duration-150 z-[90]"
className="pointer-events-none absolute opacity-0 group-hover:opacity-100 scale-95 group-hover:scale-100 transition-all duration-150 z-[60]"
style={{
bottom: "calc(100% + 10px)",
left: "50%",
@@ -692,24 +692,13 @@ export function StoryboardNode({ data, selected }: any) {
transformOrigin: "bottom center",
}}
>
<div className="overflow-hidden rounded-lg border-2 border-violet-300/60 bg-black shadow-2xl" style={{ width: 340 }}>
<div className="grid grid-cols-[1fr_104px] gap-0">
<div className="bg-black">
<div className="px-2 py-1 text-[10px] text-white/65"></div>
<div style={{ aspectRatio: aspect }}>
<img src={p.frameSrc} alt="" className="h-full w-full object-cover" />
</div>
</div>
<div className="border-l border-white/10 bg-white">
<div className="bg-black px-2 py-1 text-[10px] text-white/65"></div>
<div className="flex h-[calc(100%-22px)] items-center justify-center p-2">
<img src={p.src} alt="" className="max-h-full max-w-full object-contain" />
</div>
</div>
<div className="rounded-lg overflow-hidden border-2 border-violet-300/60 bg-black shadow-2xl" style={{ width: 280 }}>
<div style={{ aspectRatio: aspect }}>
<img src={p.frameSrc} alt="" className="w-full h-full object-cover" />
</div>
<div className="flex items-center justify-between gap-2 bg-black/90 px-2 py-1.5 text-[10.5px] text-white">
<span className="truncate">{p.name}</span>
<span className="shrink-0 font-mono text-white/55"> {p.frameIdx + 1} · {p.timestamp.toFixed(2)}s</span>
<div className="px-2 py-1 bg-black/80 text-white text-[10.5px] flex items-center justify-between">
<span> {p.frameIdx + 1}</span>
<span className="shrink-0 font-mono text-white/55">{p.timestamp.toFixed(2)}s</span>
</div>
</div>
</div>