From 92446cd683b4854945656b5502e0bcb553642306 Mon Sep 17 00:00:00 2001 From: Arul Sharma <31745423+arul28@users.noreply.github.com> Date: Wed, 1 Jul 2026 14:23:11 -0400 Subject: [PATCH 1/2] Fix context menu viewport clamping and add Start chat in lane. Menus now measure and clamp to the viewport so they stay visible in resized windows, and lane right-click menus can open the Work tab new-chat composer with the lane preselected. Co-authored-by: Cursor --- .../src/renderer/components/app/TabNav.tsx | 9 +- .../components/files/v2/ContextMenu.tsx | 14 +-- .../components/graph/WorkspaceGraphPage.tsx | 12 +- .../components/lanes/LaneContextMenu.tsx | 30 ++++- .../renderer/components/lanes/LanesPage.tsx | 17 +++ .../terminals/SessionContextMenu.tsx | 47 ++------ .../terminals/useWorkLaneContextMenu.test.tsx | 108 ++++++++++++++++++ .../terminals/useWorkLaneContextMenu.tsx | 20 +++- .../hooks/useClampedFixedPosition.test.ts | 26 +++++ .../renderer/hooks/useClampedFixedPosition.ts | 50 ++++++++ .../src/renderer/lib/workDraft.test.ts | 14 +++ apps/desktop/src/renderer/lib/workDraft.ts | 16 +++ 12 files changed, 314 insertions(+), 49 deletions(-) create mode 100644 apps/desktop/src/renderer/components/terminals/useWorkLaneContextMenu.test.tsx create mode 100644 apps/desktop/src/renderer/hooks/useClampedFixedPosition.test.ts create mode 100644 apps/desktop/src/renderer/hooks/useClampedFixedPosition.ts create mode 100644 apps/desktop/src/renderer/lib/workDraft.test.ts create mode 100644 apps/desktop/src/renderer/lib/workDraft.ts diff --git a/apps/desktop/src/renderer/components/app/TabNav.tsx b/apps/desktop/src/renderer/components/app/TabNav.tsx index 9c1f776c0..e9f6f588c 100644 --- a/apps/desktop/src/renderer/components/app/TabNav.tsx +++ b/apps/desktop/src/renderer/components/app/TabNav.tsx @@ -14,6 +14,7 @@ import { GearSix, } from "@phosphor-icons/react"; import { cn } from "../ui/cn"; +import { useClampedFixedPosition } from "../../hooks/useClampedFixedPosition"; import { useAppStore } from "../../state/appStore"; import { revealLabel } from "../../lib/platform"; import { openExternalUrl } from "../../lib/openExternal"; @@ -106,6 +107,7 @@ export function TabNav({ githubStatus }: { githubStatus?: GitHubStatus | null }) projectBinding?.kind === "remote" ? projectBinding.rootPath : (project?.rootPath ?? null); const hasActiveProject = Boolean(activeProjectRoot); const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null); + const { ref: sidebarMenuRef, position: sidebarMenuPosition } = useClampedFixedPosition(contextMenu); const [avatarBroken, setAvatarBroken] = useState(false); const [isPackaged, setIsPackaged] = useState(false); const githubLogin = githubStatus?.userLogin || null; @@ -329,8 +331,13 @@ export function TabNav({ githubStatus }: { githubStatus?: GitHubStatus | null }) {/* Context menu */} {contextMenu && activeProjectRoot ? (
e.stopPropagation()} >