From 684930d0851594000f69644f5c0b9895789964f2 Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 12 May 2026 18:57:53 +0800 Subject: [PATCH] auto-save 2026-05-12 18:57 (~2) --- .memory/worklog.json | 7 +++++++ web/components/dashboard.tsx | 33 ++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index 42e2e10..1d27148 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -202,6 +202,13 @@ "message": "auto-save 2026-05-12 18:46 (~3)", "hash": "5a914b9", "files_changed": 3 + }, + { + "ts": "2026-05-12T18:52:21+08:00", + "type": "commit", + "message": "auto-save 2026-05-12 18:52 (~2)", + "hash": "f6f8212", + "files_changed": 2 } ] } diff --git a/web/components/dashboard.tsx b/web/components/dashboard.tsx index 95bccfa..267040c 100644 --- a/web/components/dashboard.tsx +++ b/web/components/dashboard.tsx @@ -80,6 +80,8 @@ export function Dashboard({ data }: Props) { const [videoT, setVideoT] = useState(0) const [addingFrame, setAddingFrame] = useState(false) const [expanded, setExpanded] = useState>(new Set()) + const [panelPos, setPanelPos] = useState<{ left: number; top: number } | null>(null) + const tileRefs = useRef>({}) const fileRef = useRef(null) const videoRef = useRef(null) @@ -133,9 +135,21 @@ export function Dashboard({ data }: Props) { { key: "compose", title: "合成", type: "output", icon: , step: 10 }, ] - // 单选展开:toggle 同一 key = 收起;点其他 key = 切换 - const toggleTile = (key: string) => setExpanded((prev) => (prev.has(key) ? new Set() : new Set([key]))) - const closeTile = (_key: string) => setExpanded(new Set()) + // 单选展开:toggle 同一 key = 收起;点其他 key = 切换;并记录 tile 位置让 panel 跟随 + const toggleTile = (key: string) => { + if (expanded.has(key)) { + setExpanded(new Set()) + setPanelPos(null) + return + } + setExpanded(new Set([key])) + const el = tileRefs.current[key] + if (el) { + const r = el.getBoundingClientRect() + setPanelPos({ left: r.left, top: r.bottom + 6 }) + } + } + const closeTile = (_key: string) => { setExpanded(new Set()); setPanelPos(null) } const Tile = ({ tkey, rowSpan }: { tkey: string; rowSpan?: boolean }) => { const t = TILES.find((x) => x.key === tkey)! @@ -143,6 +157,7 @@ export function Dashboard({ data }: Props) { const isOpen = expanded.has(t.key) return ( -
+
{renderSection(t.key)}