From 0243be86a7b548fd6daf421d39bd3c36ca76246b Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Mon, 9 Mar 2026 07:49:01 -0500 Subject: [PATCH] fix(app): don't animate review panel in/out --- packages/app/src/pages/session.tsx | 20 ++++++++++++++++++- .../src/pages/session/session-side-panel.tsx | 3 ++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 3f5da0c94..35e89eabe 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -285,6 +285,7 @@ export default function Page() { const [ui, setUi] = createStore({ git: false, pendingMessage: undefined as string | undefined, + reviewSnap: false, scrollGesture: 0, scroll: { overflow: false, @@ -460,6 +461,21 @@ export default function Page() { return key }, sessionKey()) + let reviewFrame: number | undefined + + createComputed((prev) => { + const open = desktopReviewOpen() + if (prev === undefined || prev === open) return open + + if (reviewFrame !== undefined) cancelAnimationFrame(reviewFrame) + setUi("reviewSnap", true) + reviewFrame = requestAnimationFrame(() => { + reviewFrame = undefined + setUi("reviewSnap", false) + }) + return open + }, desktopReviewOpen()) + const turnDiffs = createMemo(() => lastUserMessage()?.summary?.diffs ?? []) const reviewDiffs = createMemo(() => (store.changes === "session" ? diffs() : turnDiffs())) @@ -1233,6 +1249,7 @@ export default function Page() { onCleanup(() => { document.removeEventListener("keydown", handleKeyDown) scrollSpy.destroy() + if (reviewFrame !== undefined) cancelAnimationFrame(reviewFrame) if (scrollStateFrame !== undefined) cancelAnimationFrame(scrollStateFrame) }) @@ -1254,7 +1271,7 @@ export default function Page() { classList={{ "@container relative shrink-0 flex flex-col min-h-0 h-full bg-background-stronger flex-1 md:flex-none": true, "transition-[width] duration-[240ms] ease-[cubic-bezier(0.22,1,0.36,1)] will-change-[width] motion-reduce:transition-none": - !size.active(), + !size.active() && !ui.reviewSnap, }} style={{ width: sessionPanelWidth(), @@ -1369,6 +1386,7 @@ export default function Page() { reviewPanel={reviewPanel} activeDiff={tree.activeDiff} focusReviewDiff={focusReviewDiff} + reviewSnap={ui.reviewSnap} size={size} /> diff --git a/packages/app/src/pages/session/session-side-panel.tsx b/packages/app/src/pages/session/session-side-panel.tsx index a5e067c6f..590f5b6d9 100644 --- a/packages/app/src/pages/session/session-side-panel.tsx +++ b/packages/app/src/pages/session/session-side-panel.tsx @@ -31,6 +31,7 @@ export function SessionSidePanel(props: { reviewPanel: () => JSX.Element activeDiff?: string focusReviewDiff: (path: string) => void + reviewSnap: boolean size: Sizing }) { const params = useParams() @@ -228,7 +229,7 @@ export function SessionSidePanel(props: { classList={{ "pointer-events-none": !open(), "transition-[width] duration-[240ms] ease-[cubic-bezier(0.22,1,0.36,1)] will-change-[width] motion-reduce:transition-none": - !props.size.active(), + !props.size.active() && !props.reviewSnap, }} style={{ width: panelWidth() }} >