From 39ec8ce41bc135fc29ba17bd481ab70afb2919b1 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Sat, 17 Jan 2026 09:22:11 +0000 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=A4=96=20fix:=20prevent=20mobile=20he?= =?UTF-8?q?ader=20scroll=20on=20keyboard=20open?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/browser/App.tsx | 6 +++--- src/browser/components/ChatPane.tsx | 4 ++-- src/browser/components/LeftSidebar.tsx | 2 +- src/browser/components/LoadingScreen.tsx | 2 +- src/browser/components/WorkspaceShell.tsx | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/browser/App.tsx b/src/browser/App.tsx index b06870061a..d8d7dd1ab3 100644 --- a/src/browser/App.tsx +++ b/src/browser/App.tsx @@ -635,7 +635,7 @@ function AppInner() { return ( <> -
+
-
+
-
+
{selectedWorkspace ? ( (() => { const currentMetadata = workspaceMetadata.get(selectedWorkspace.workspaceId); diff --git a/src/browser/components/ChatPane.tsx b/src/browser/components/ChatPane.tsx index 086ac47693..a83824a1c7 100644 --- a/src/browser/components/ChatPane.tsx +++ b/src/browser/components/ChatPane.tsx @@ -509,7 +509,7 @@ export const ChatPane: React.FC = (props) => { return (
= (props) => { onOpenTerminal={onOpenTerminal} /> -
+
+

Loading workspaces...

diff --git a/src/browser/components/WorkspaceShell.tsx b/src/browser/components/WorkspaceShell.tsx index 18fbe03412..2598bec10c 100644 --- a/src/browser/components/WorkspaceShell.tsx +++ b/src/browser/components/WorkspaceShell.tsx @@ -32,7 +32,7 @@ const WorkspacePlaceholder: React.FC<{ }> = (props) => (
= (props) => { return (
Date: Mon, 19 Jan 2026 12:09:54 +0000 Subject: [PATCH 2/4] fix: respect iOS safe area for workspace header --- src/browser/components/WorkspaceHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/components/WorkspaceHeader.tsx b/src/browser/components/WorkspaceHeader.tsx index 2c67ee933e..e81bbc241e 100644 --- a/src/browser/components/WorkspaceHeader.tsx +++ b/src/browser/components/WorkspaceHeader.tsx @@ -111,7 +111,7 @@ export const WorkspaceHeader: React.FC = ({ style={headerRightPadding > 0 ? { paddingRight: headerRightPadding } : undefined} data-testid="workspace-header" className={cn( - "bg-sidebar border-border-light flex items-center justify-between border-b px-[15px] [@media(max-width:768px)]:h-auto [@media(max-width:768px)]:flex-wrap [@media(max-width:768px)]:gap-2 [@media(max-width:768px)]:py-2", + "bg-sidebar border-border-light flex items-center justify-between border-b px-[15px] [@media(max-width:768px)]:sticky [@media(max-width:768px)]:top-0 [@media(max-width:768px)]:z-10 [@media(max-width:768px)]:h-auto [@media(max-width:768px)]:flex-wrap [@media(max-width:768px)]:gap-2 [@media(max-width:768px)]:py-2 [@media(max-width:768px)]:pt-[calc(env(safe-area-inset-top,0px)+0.5rem)]", isDesktop ? DESKTOP_TITLEBAR_HEIGHT_CLASS : "h-8", // In desktop mode, make header draggable for window movement isDesktop && "titlebar-drag" From c7a13ccd9618f298019bb2d3b31eadbaf4adb444 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Mon, 19 Jan 2026 16:55:13 +0000 Subject: [PATCH 3/4] fix: use slideover right sidebar on mobile --- src/browser/components/RightSidebar.tsx | 99 ++++++++++++---------- src/browser/components/WorkspaceHeader.tsx | 26 ++++-- src/browser/styles/globals.css | 23 +++++ 3 files changed, 98 insertions(+), 50 deletions(-) diff --git a/src/browser/components/RightSidebar.tsx b/src/browser/components/RightSidebar.tsx index 72fb3d98b9..d8b6dd62e8 100644 --- a/src/browser/components/RightSidebar.tsx +++ b/src/browser/components/RightSidebar.tsx @@ -126,12 +126,10 @@ const SidebarContainer: React.FC = ({ return (
= ({ }; return ( - - - {!collapsed && ( -
- {/* Resize handle (left edge) */} - {onStartResize && ( -
onStartResize(e as unknown as React.MouseEvent)} - /> - )} - -
- {renderLayoutNode(layout.root)} -
-
+ <> + {/* Overlay backdrop - only visible on mobile when sidebar is open */} +
setCollapsed(true)} + /> - + setCollapsed(!collapsed)} - side="right" - /> - + isResizing={isResizing} + isDesktop={isDesktopMode()} + customWidth={width} // Unified width from AIView (applies to all tabs) + role="complementary" + aria-label="Workspace insights" + > + {!collapsed && ( +
+ {/* Resize handle (left edge) */} + {onStartResize && ( +
onStartResize(e as unknown as React.MouseEvent)} + /> + )} - {/* Drag overlay - shows tab being dragged at cursor position */} - - {activeDragData ? ( -
- {getTabName(activeDragData.tab)} -
- ) : null} -
- +
+ {renderLayoutNode(layout.root)} +
+
+ )} + + setCollapsed(!collapsed)} + side="right" + /> + + + {/* Drag overlay - shows tab being dragged at cursor position */} + + {activeDragData ? ( +
+ {getTabName(activeDragData.tab)} +
+ ) : null} +
+ + ); }; diff --git a/src/browser/components/WorkspaceHeader.tsx b/src/browser/components/WorkspaceHeader.tsx index e81bbc241e..2c62970939 100644 --- a/src/browser/components/WorkspaceHeader.tsx +++ b/src/browser/components/WorkspaceHeader.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useState } from "react"; -import { Menu, Pencil, Server } from "lucide-react"; +import { Menu, PanelRight, Pencil, Server } from "lucide-react"; import { CUSTOM_EVENTS } from "@/common/constants/events"; import { cn } from "@/common/lib/utils"; import { RIGHT_SIDEBAR_COLLAPSED_KEY } from "@/common/constants/storage"; @@ -58,10 +58,14 @@ export const WorkspaceHeader: React.FC = ({ const [debugLlmRequestOpen, setDebugLlmRequestOpen] = useState(false); const [mcpModalOpen, setMcpModalOpen] = useState(false); - const [rightSidebarCollapsed] = usePersistedState(RIGHT_SIDEBAR_COLLAPSED_KEY, false, { - // This state is toggled from RightSidebar, so we need cross-component updates. - listener: true, - }); + const [rightSidebarCollapsed, setRightSidebarCollapsed] = usePersistedState( + RIGHT_SIDEBAR_COLLAPSED_KEY, + false, + { + // This state is toggled from RightSidebar, so we need cross-component updates. + listener: true, + } + ); const handleOpenTerminal = useCallback(() => { if (onOpenTerminal) { @@ -156,6 +160,18 @@ export const WorkspaceHeader: React.FC = ({
+ {rightSidebarCollapsed && ( + + )} {editorError && {editorError}} diff --git a/src/browser/styles/globals.css b/src/browser/styles/globals.css index c81f70e2be..7ffaa482f2 100644 --- a/src/browser/styles/globals.css +++ b/src/browser/styles/globals.css @@ -1053,6 +1053,29 @@ body, padding-left: env(safe-area-inset-left, 0px) !important; } + + /* Mobile right sidebar slideover positioning only on touch devices */ + .mobile-right-sidebar { + position: fixed !important; + right: 0 !important; + top: 0 !important; + bottom: 0 !important; + width: 100vw !important; + max-width: 100vw !important; + z-index: 1000 !important; + transition: transform 0.3s !important; + box-shadow: -2px 0 8px rgba(0, 0, 0, 0.5) !important; + + /* Account for iOS safe areas (the sidebar is position: fixed) */ + padding-top: env(safe-area-inset-top, 0px) !important; + padding-bottom: env(safe-area-inset-bottom, 0px) !important; + padding-right: env(safe-area-inset-right, 0px) !important; + } + + .mobile-right-sidebar-collapsed { + transform: translateX(100%) !important; + box-shadow: none !important; + } .mobile-sidebar-collapsed { transform: translateX(-100%) !important; box-shadow: none !important; From 935a15baa690e59eeb56663632095c522484d7b4 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Mon, 19 Jan 2026 17:12:14 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=A4=96=20fix:=20hide=20right=20sideba?= =?UTF-8?q?r=20on=20mobile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/browser/components/RightSidebar.tsx | 96 ++++++++++------------ src/browser/components/WorkspaceHeader.tsx | 26 ++---- src/browser/components/WorkspaceShell.tsx | 26 +++--- src/browser/styles/globals.css | 23 ------ 4 files changed, 61 insertions(+), 110 deletions(-) diff --git a/src/browser/components/RightSidebar.tsx b/src/browser/components/RightSidebar.tsx index d8b6dd62e8..501260ffb1 100644 --- a/src/browser/components/RightSidebar.tsx +++ b/src/browser/components/RightSidebar.tsx @@ -126,10 +126,9 @@ const SidebarContainer: React.FC = ({ return (
= ({ }; return ( - <> - {/* Overlay backdrop - only visible on mobile when sidebar is open */} -
+ + {!collapsed && ( +
+ {/* Resize handle (left edge) */} + {onStartResize && ( +
onStartResize(e as unknown as React.MouseEvent)} + /> + )} + +
+ {renderLayoutNode(layout.root)} +
+
)} - onClick={() => setCollapsed(true)} - /> - - - {!collapsed && ( -
- {/* Resize handle (left edge) */} - {onStartResize && ( -
onStartResize(e as unknown as React.MouseEvent)} - /> - )} - -
- {renderLayoutNode(layout.root)} -
-
- )} + onToggle={() => setCollapsed(!collapsed)} + side="right" + /> + - setCollapsed(!collapsed)} - side="right" - /> - - - {/* Drag overlay - shows tab being dragged at cursor position */} - - {activeDragData ? ( -
- {getTabName(activeDragData.tab)} -
- ) : null} -
- - + {/* Drag overlay - shows tab being dragged at cursor position */} + + {activeDragData ? ( +
+ {getTabName(activeDragData.tab)} +
+ ) : null} +
+ ); }; diff --git a/src/browser/components/WorkspaceHeader.tsx b/src/browser/components/WorkspaceHeader.tsx index 2c62970939..e81bbc241e 100644 --- a/src/browser/components/WorkspaceHeader.tsx +++ b/src/browser/components/WorkspaceHeader.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useState } from "react"; -import { Menu, PanelRight, Pencil, Server } from "lucide-react"; +import { Menu, Pencil, Server } from "lucide-react"; import { CUSTOM_EVENTS } from "@/common/constants/events"; import { cn } from "@/common/lib/utils"; import { RIGHT_SIDEBAR_COLLAPSED_KEY } from "@/common/constants/storage"; @@ -58,14 +58,10 @@ export const WorkspaceHeader: React.FC = ({ const [debugLlmRequestOpen, setDebugLlmRequestOpen] = useState(false); const [mcpModalOpen, setMcpModalOpen] = useState(false); - const [rightSidebarCollapsed, setRightSidebarCollapsed] = usePersistedState( - RIGHT_SIDEBAR_COLLAPSED_KEY, - false, - { - // This state is toggled from RightSidebar, so we need cross-component updates. - listener: true, - } - ); + const [rightSidebarCollapsed] = usePersistedState(RIGHT_SIDEBAR_COLLAPSED_KEY, false, { + // This state is toggled from RightSidebar, so we need cross-component updates. + listener: true, + }); const handleOpenTerminal = useCallback(() => { if (onOpenTerminal) { @@ -160,18 +156,6 @@ export const WorkspaceHeader: React.FC = ({
- {rightSidebarCollapsed && ( - - )} {editorError && {editorError}} diff --git a/src/browser/components/WorkspaceShell.tsx b/src/browser/components/WorkspaceShell.tsx index 2598bec10c..dddba5a0c4 100644 --- a/src/browser/components/WorkspaceShell.tsx +++ b/src/browser/components/WorkspaceShell.tsx @@ -107,18 +107,20 @@ export const WorkspaceShell: React.FC = (props) => { onOpenTerminal={handleOpenTerminal} /> - +
+ +