From b5b93aea425d44a0f49d37eb22d29b98616b7392 Mon Sep 17 00:00:00 2001 From: Rahul A Mistry <149420892+ProdigyRahul@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:32:40 +0530 Subject: fix(app): toggle file tree and review panel better ux (#12481) --- packages/app/src/pages/session.tsx | 31 ++- .../app/src/pages/session/session-side-panel.tsx | 295 +++++++++++---------- .../app/src/pages/session/use-session-commands.tsx | 7 +- 3 files changed, 178 insertions(+), 155 deletions(-) (limited to 'packages/app/src/pages') diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index a70d4e8a2..31f9e3fb7 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -233,7 +233,15 @@ export default function Page() { } const isDesktop = createMediaQuery("(min-width: 768px)") - const centered = createMemo(() => isDesktop() && !view().reviewPanel.opened()) + const desktopReviewOpen = createMemo(() => isDesktop() && view().reviewPanel.opened()) + const desktopFileTreeOpen = createMemo(() => isDesktop() && layout.fileTree.opened()) + const desktopSidePanelOpen = createMemo(() => desktopReviewOpen() || desktopFileTreeOpen()) + const sessionPanelWidth = createMemo(() => { + if (!desktopSidePanelOpen()) return "100%" + if (desktopReviewOpen()) return `${layout.session.width()}px` + return `calc(100% - ${layout.fileTree.width()}px)` + }) + const centered = createMemo(() => isDesktop() && !desktopSidePanelOpen()) function normalizeTab(tab: string) { if (!tab.startsWith("file://")) return tab @@ -252,12 +260,18 @@ export default function Page() { return next } + const openReviewPanel = () => { + if (!view().reviewPanel.opened()) view().reviewPanel.open() + } + const openTab = (value: string) => { const next = normalizeTab(value) tabs().open(next) const path = file.pathFromTab(next) - if (path) file.load(path) + if (!path) return + file.load(path) + openReviewPanel() } createEffect(() => { @@ -1085,6 +1099,7 @@ export default function Page() { } const focusReviewDiff = (path: string) => { + openReviewPanel() const current = view().review.open() ?? [] if (!current.includes(path)) view().review.setOpen([...current, path]) setTree({ activeDiff: path, pendingDiff: path }) @@ -1203,7 +1218,7 @@ export default function Page() { if (!id) return const wants = isDesktop() - ? view().reviewPanel.opened() && (layout.fileTree.opened() || activeTab() === "review") + ? desktopFileTreeOpen() || (desktopReviewOpen() && activeTab() === "review") : store.mobileTab === "changes" if (!wants) return if (sync.data.session_diff[id] !== undefined) return @@ -1216,7 +1231,6 @@ export default function Page() { createEffect(() => { const dir = sdk.directory if (!isDesktop()) return - if (!view().reviewPanel.opened()) return if (!layout.fileTree.opened()) return if (sync.status === "loading") return @@ -1533,10 +1547,10 @@ export default function Page() { classList={{ "@container relative shrink-0 flex flex-col min-h-0 h-full bg-background-stronger": true, "flex-1 pt-2 md:pt-3": true, - "md:flex-none": view().reviewPanel.opened(), + "md:flex-none": desktopSidePanelOpen(), }} style={{ - width: isDesktop() && view().reviewPanel.opened() ? `${layout.session.width()}px` : "100%", + width: sessionPanelWidth(), "--prompt-height": store.promptHeight ? `${store.promptHeight}px` : undefined, }} > @@ -1663,7 +1677,7 @@ export default function Page() { setPromptDockRef={(el) => (promptDock = el)} /> - + layout: ReturnType command: ReturnType @@ -72,157 +73,164 @@ export function SessionSidePanel(props: {