From c893513eb30a65c5c0381129a56f56be4fbed814 Mon Sep 17 00:00:00 2001 From: Murat Aslan Date: Sun, 22 Mar 2026 03:11:03 +0300 Subject: [PATCH] fix(web): hide mobile sidebar after thread selection or creation On narrow viewports, the sidebar stayed open after selecting or creating a thread, obscuring the thread content. Now the sidebar closes automatically on mobile when: - Clicking an existing thread - Pressing Enter/Space on a thread row - Clicking the "New Thread" button Desktop behavior is unchanged. Fixes #1258 --- apps/web/src/components/Sidebar.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 9ff741897..52ede1a4f 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -79,6 +79,7 @@ import { SidebarMenuSubItem, SidebarSeparator, SidebarTrigger, + useSidebar, } from "./ui/sidebar"; import { useThreadSelectionStore } from "../threadSelectionStore"; import { formatWorktreePathForDisplay, getOrphanedWorktreePathForThread } from "../worktreeCleanup"; @@ -274,6 +275,7 @@ export default function Sidebar() { const isOnSettings = useLocation({ select: (loc) => loc.pathname === "/settings" }); const { settings: appSettings } = useAppSettings(); const { handleNewThread } = useHandleNewThread(); + const { isMobile, setOpenMobile } = useSidebar(); const routeThreadId = useParams({ strict: false, select: (params) => (params.threadId ? ThreadId.makeUnsafe(params.threadId) : null), @@ -844,6 +846,9 @@ export default function Sidebar() { clearSelection(); } setSelectionAnchor(threadId); + if (isMobile) { + setOpenMobile(false); + } void navigate({ to: "/$threadId", params: { threadId }, @@ -851,9 +856,11 @@ export default function Sidebar() { }, [ clearSelection, + isMobile, navigate, rangeSelectTo, selectedThreadIds.size, + setOpenMobile, setSelectionAnchor, toggleThreadSelection, ], @@ -1424,6 +1431,9 @@ export default function Sidebar() { onClick={(event) => { event.preventDefault(); event.stopPropagation(); + if (isMobile) { + setOpenMobile(false); + } void handleNewThread(project.id, { envMode: resolveSidebarNewThreadEnvMode({ defaultEnvMode: appSettings.defaultThreadEnvMode, @@ -1492,6 +1502,9 @@ export default function Sidebar() { clearSelection(); } setSelectionAnchor(thread.id); + if (isMobile) { + setOpenMobile(false); + } void navigate({ to: "/$threadId", params: { threadId: thread.id },