From 4135465bb2b479031218a8a62e475229d2e76961 Mon Sep 17 00:00:00 2001 From: kang Date: Wed, 13 May 2026 11:51:07 +0800 Subject: [PATCH] auto-save 2026-05-13 11:50 (~2) --- .memory/worklog.json | 13 ++++++++ web/components/dashboard.tsx | 63 ++++++++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index d230a2d..97a0995 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -1370,6 +1370,19 @@ "message": "auto-save 2026-05-13 11:39 (~1)", "hash": "9214885", "files_changed": 1 + }, + { + "ts": "2026-05-13T11:45:33+08:00", + "type": "commit", + "message": "auto-save 2026-05-13 11:45 (~4)", + "hash": "5328965", + "files_changed": 4 + }, + { + "ts": "2026-05-13T03:47:37Z", + "type": "session-heartbeat", + "message": "Claude 会话活跃 · 最近命令:claude · 2 项未提交变更 · 最近提交:auto-save 2026-05-13 11:45 (~4)", + "files_changed": 2 } ] } diff --git a/web/components/dashboard.tsx b/web/components/dashboard.tsx index 3abe566..5ebfc93 100644 --- a/web/components/dashboard.tsx +++ b/web/components/dashboard.tsx @@ -92,6 +92,54 @@ export const Dashboard = forwardRef(function Dashboard({ useImperativeHandle(ref, () => ({ openPanel: (key: string) => setExpanded(new Set([key])), }), []) + + // drawer 宽度 per panel · 持久化到 localStorage + const drawerKey = (() => { + const keys = Array.from(expanded) + if (keys.length === 0) return "" + const base = keys[0] + if (base === "keyframe" && data.expandedFrame !== null) return "keyframe:lightbox" + return base + })() + const defaultWidth = drawerKey === "keyframe:lightbox" ? 760 : 400 + const [drawerWidths, setDrawerWidths] = useState>({}) + useEffect(() => { + if (typeof window === "undefined") return + try { + const stored = JSON.parse(localStorage.getItem("skg.drawer.widths") || "{}") + if (stored && typeof stored === "object") setDrawerWidths(stored) + } catch { /* ignore */ } + }, []) + const drawerWidth = drawerKey ? (drawerWidths[drawerKey] ?? defaultWidth) : defaultWidth + const setDrawerWidth = (w: number) => { + if (!drawerKey) return + const clamped = Math.max(280, Math.min(1400, w)) + setDrawerWidths((prev) => { + const next = { ...prev, [drawerKey]: clamped } + try { localStorage.setItem("skg.drawer.widths", JSON.stringify(next)) } catch { /* ignore */ } + return next + }) + } + + // 拖拽 + const dragRef = useRef<{ startX: number; startW: number } | null>(null) + const onResizeMouseDown = (e: React.MouseEvent) => { + e.preventDefault() + e.stopPropagation() + dragRef.current = { startX: e.clientX, startW: drawerWidth } + const onMove = (ev: MouseEvent) => { + if (!dragRef.current) return + const delta = ev.clientX - dragRef.current.startX + setDrawerWidth(dragRef.current.startW + delta) + } + const onUp = () => { + dragRef.current = null + window.removeEventListener("mousemove", onMove) + window.removeEventListener("mouseup", onUp) + } + window.addEventListener("mousemove", onMove) + window.addEventListener("mouseup", onUp) + } const tileRefs = useRef>({}) const fileRef = useRef(null) const videoRef = useRef(null) @@ -216,7 +264,7 @@ export const Dashboard = forwardRef(function Dashboard({ {/* 合流 */} - {/* 展开面板 — keyframe 有选中帧时变宽容纳 lightbox */} + {/* 展开面板 — keyframe 有选中帧时变宽容纳 lightbox · 可拖拽改宽 */} {expanded.size > 0 && mounted && createPortal(
(function Dashboard({ left: 104, top: 16, bottom: 16, - width: expanded.has("keyframe") && data.expandedFrame !== null ? 760 : 400, + width: drawerWidth, }} > {TILES.filter((t) => expanded.has(t.key)).map((t) => { @@ -232,12 +280,21 @@ export const Dashboard = forwardRef(function Dashboard({ return (
+ {/* 右边拖拽手柄 — hover 时显示 */} +
setDrawerWidth(defaultWidth)} + className="group/rs absolute top-0 bottom-0 right-0 w-1.5 cursor-col-resize hover:bg-violet-400/30 transition z-[110]" + > +
+
{String(t.step).padStart(2, "0")}