auto-save 2026-05-13 19:50 (~4)

This commit is contained in:
2026-05-13 19:50:51 +08:00
parent 2ccbf4b9c6
commit a471f89e16
4 changed files with 40 additions and 21 deletions

View File

@@ -2235,6 +2235,19 @@
"message": "auto-save 2026-05-13 19:39 (~3)",
"hash": "fddc83b",
"files_changed": 3
},
{
"ts": "2026-05-13T19:45:18+08:00",
"type": "commit",
"message": "auto-save 2026-05-13 19:45 (~3)",
"hash": "2ccbf4b",
"files_changed": 3
},
{
"ts": "2026-05-13T11:49:29Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 4 项未提交变更 · 最近提交auto-save 2026-05-13 19:45 (~3)",
"files_changed": 4
}
]
}

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 · 顶部分镜头编排不再跳转全屏工作台</h3>
<span class="tag violet">StoryboardBar</span>
</header>
<div class="body">
<p><strong>问题:</strong>顶部 <code>StoryboardBar</code> 的“进入编排”和分镜缩略图点击会打开全屏 <code>StoryboardWorkbench</code>,打断当前画布流程。</p>
<p><strong>改动:</strong>顶部按钮改为“展开编排”,只下拉展示当前分镜列表;缩略图点击只聚焦该分镜,不再触发全屏跳转。</p>
<p><strong>影响:</strong><code>web/components/storyboard-bar.tsx</code><code>web/app/page.tsx</code>;全屏工作台仍保留给其他明确入口。</p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-13 · 钉住关键帧详情改为左侧停靠</h3>

View File

@@ -413,11 +413,6 @@ export default function Home() {
selectedFrames={selectedFrames}
focusedFrame={storyboardFrame}
onFocusFrame={setStoryboardFrame}
onJobUpdate={setJob as any}
onOpenWorkbench={(idx?: number) => {
if (typeof idx === "number") setStoryboardFrame(idx)
setWorkbenchOpen(true)
}}
/>
<div className="relative flex-1 min-h-0">
<ReactFlow

View File

@@ -9,11 +9,9 @@ interface Props {
selectedFrames: Set<number>
focusedFrame: number | null
onFocusFrame: (idx: number | null) => void
onJobUpdate?: (j: Job) => void
onOpenWorkbench?: (frameIdx?: number) => void
}
export function StoryboardBar({ job, selectedFrames, focusedFrame, onFocusFrame, onJobUpdate, onOpenWorkbench }: Props) {
export function StoryboardBar({ job, selectedFrames, focusedFrame, onFocusFrame }: Props) {
const [collapsed, setCollapsed] = useState(false)
const [mounted, setMounted] = useState(false)
useEffect(() => setMounted(true), [])
@@ -63,17 +61,19 @@ export function StoryboardBar({ job, selectedFrames, focusedFrame, onFocusFrame,
)}
</div>
<div className="flex items-center gap-2 shrink-0">
{onOpenWorkbench && (
<button
onClick={() => onOpenWorkbench(focusedFrame ?? frames[0]?.index)}
disabled={frames.length === 0}
className="text-[11px] px-2.5 py-1 rounded-md bg-gradient-to-r from-violet-500 to-pink-500 hover:from-violet-400 hover:to-pink-400 text-white inline-flex items-center gap-1 disabled:opacity-40 disabled:cursor-not-allowed font-medium shadow"
title={frames.length === 0 ? "先到关键帧节点选用分镜" : "全屏进入分镜头编排工作台"}
>
<LayoutGrid className="h-3 w-3" />
</button>
)}
<button
onClick={() => {
if (frames.length === 0) return
if (focusedFrame === null) onFocusFrame(frames[0].index)
setCollapsed(false)
}}
disabled={frames.length === 0}
className="text-[11px] px-2.5 py-1 rounded-md bg-gradient-to-r from-violet-500 to-pink-500 hover:from-violet-400 hover:to-pink-400 text-white inline-flex items-center gap-1 disabled:opacity-40 disabled:cursor-not-allowed font-medium shadow"
title={frames.length === 0 ? "先到关键帧节点选用分镜" : "下拉展开分镜头编排"}
>
<ChevronDown className="h-3 w-3" />
</button>
<button
onClick={() => setCollapsed(!collapsed)}
className="text-white/50 hover:text-white text-[11px] inline-flex items-center gap-1"
@@ -104,7 +104,7 @@ export function StoryboardBar({ job, selectedFrames, focusedFrame, onFocusFrame,
ref={(el) => { btnRefs.current[f.index] = el }}
onClick={() => {
onFocusFrame(f.index)
onOpenWorkbench?.(f.index)
setCollapsed(false)
}}
onMouseEnter={() => {
const el = btnRefs.current[f.index]
@@ -116,7 +116,7 @@ export function StoryboardBar({ job, selectedFrames, focusedFrame, onFocusFrame,
})
}}
onMouseLeave={() => setHover(null)}
title={`分镜 ${i + 1} · ${f.timestamp.toFixed(2)}s${cleaned ? " · 已清洗" : ""} · ${elementCount}/${totalElCount} 元素 · 点击进入编排`}
title={`分镜 ${i + 1} · ${f.timestamp.toFixed(2)}s${cleaned ? " · 已清洗" : ""} · ${elementCount}/${totalElCount} 元素 · 点击聚焦`}
className={`relative shrink-0 rounded-md border transition shadow-lg hover:-translate-y-0.5 ${
isFocused
? "border-violet-300 ring-2 ring-violet-300/70"