auto-save 2026-05-13 19:50 (~4)
This commit is contained in:
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user