From c1596680cf6be334ef0989d2fd01cd7312ac1203 Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 12 May 2026 19:25:47 +0800 Subject: [PATCH] auto-save 2026-05-12 19:25 (~4) --- .memory/worklog.json | 7 ++++++ web/app/page.tsx | 4 ++-- web/components/dashboard.tsx | 39 +++++++++++++++++----------------- web/components/nodes/index.tsx | 32 ++++++++++++++++++++++++---- 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index bdbaa91..c8383fd 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -237,6 +237,13 @@ "message": "auto-save 2026-05-12 19:14 (~3)", "hash": "30a4c46", "files_changed": 3 + }, + { + "ts": "2026-05-12T19:20:15+08:00", + "type": "commit", + "message": "auto-save 2026-05-12 19:20 (~3)", + "hash": "5a86328", + "files_changed": 3 } ] } diff --git a/web/app/page.tsx b/web/app/page.tsx index 9bf7dfc..6add56d 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -240,10 +240,10 @@ export default function Home() { - {/* 左侧:竖向 tile 看板(窄版) */} + {/* 左侧:竖向 tile 看板(极窄) */} diff --git a/web/components/dashboard.tsx b/web/components/dashboard.tsx index f53d7ea..2dc7de0 100644 --- a/web/components/dashboard.tsx +++ b/web/components/dashboard.tsx @@ -1,5 +1,6 @@ "use client" -import { useRef, useState, type ReactNode } from "react" +import { useEffect, useRef, useState, type ReactNode } from "react" +import { createPortal } from "react-dom" import { Link2, Upload, Download, Scissors, Image as ImageIcon, Mic, Languages, FileEdit, Sparkles, Film, FileVideo, Loader2, Plus, Check, @@ -80,6 +81,8 @@ export function Dashboard({ data }: Props) { const [videoT, setVideoT] = useState(0) const [addingFrame, setAddingFrame] = useState(false) const [expanded, setExpanded] = useState>(new Set()) + const [mounted, setMounted] = useState(false) + useEffect(() => setMounted(true), []) const tileRefs = useRef>({}) const fileRef = useRef(null) const videoRef = useRef(null) @@ -149,40 +152,35 @@ export function Dashboard({ data }: Props) { ref={(el) => { tileRefs.current[t.key] = el }} type="button" onClick={() => toggleTile(t.key)} - title={colSummary[t.key]} - className={`group w-full rounded-md overflow-hidden border flex items-stretch transition ${ + title={`${t.title} · ${colSummary[t.key]}`} + className={`group w-full rounded-md overflow-hidden border flex items-center transition relative ${ isOpen ? "border-violet-400/70 ring-2 ring-violet-400/40 shadow-lg shadow-violet-500/20" : "border-white/10 hover:border-white/20" }`} - style={{ height: 30 }} + style={{ height: 28 }} > -
+
{t.icon} - {t.title} -
-
- + {t.title}
+ ) } return ( -
-
Pipeline
+
{/* 主线:input / download / split */} {/* 分叉:上路 关键帧/生图/生视频 */} -
-
视频路
+
{/* 分叉:下路 转录/翻译/改写 */} -
-
音频路
+
@@ -190,11 +188,11 @@ export function Dashboard({ data }: Props) { {/* 合流 */} - {/* 展开面板 — 离 sidebar 一段距离,明显"飞出"悬浮 */} - {expanded.size > 0 && ( + {/* 展开面板 — 用 portal 渲染到 body 避免 backdrop-filter 影响 fixed 定位 */} + {expanded.size > 0 && mounted && createPortal(
{TILES.filter((t) => expanded.has(t.key)).map((t) => (
))} -
+
, + document.body )}
) diff --git a/web/components/nodes/index.tsx b/web/components/nodes/index.tsx index 26d1cf2..db58400 100644 --- a/web/components/nodes/index.tsx +++ b/web/components/nodes/index.tsx @@ -272,7 +272,7 @@ export function KeyframeNode({ data, selected }: any) { key={f.index} onClick={(e) => { e.stopPropagation(); d.onExpandFrame(f.index) }} title={`第 ${f.index + 1} 张 · ${f.timestamp.toFixed(1)}s · 点击放大`} - className={`group relative overflow-hidden rounded-md border transition shadow-lg hover:scale-110 hover:-translate-y-1 ${ + className={`group relative rounded-md border transition shadow-lg hover:-translate-y-0.5 ${ isSel ? "border-emerald-400 ring-2 ring-emerald-400/60" : "border-white/30 dark:border-white/20" @@ -282,15 +282,39 @@ export function KeyframeNode({ data, selected }: any) { {`frame {isSel && ( -
+
)} {/* 时间戳 */} -
+
{f.timestamp.toFixed(1)}s
+ + {/* Hover 大图预览 */} +
+
+ {`preview +
+ 分镜 {f.index + 1} + {f.timestamp.toFixed(2)}s +
+
+
) })}