From 002946d4dda0b6df149d73bae0ebb9a9dd090aaf Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Mon, 20 Apr 2026 10:49:46 +0700 Subject: [PATCH] fix(sidebar): prevent text selection when dragging project/workspace rows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The drag handle was attached only to the left sub-view of each row, so grabbing the right half initiated no drag, and pointerdown on the branch or project title raced the browser's text-selection start before dnd-kit's activation threshold — often producing a text selection instead of a drag. Move dragHandleProps to the outer row wrapper, add userSelect: none to the row styles, and tighten PointerSensor activation distance. --- .../app/src/components/draggable-list.web.tsx | 2 +- .../src/components/sidebar-workspace-list.tsx | 35 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/packages/app/src/components/draggable-list.web.tsx b/packages/app/src/components/draggable-list.web.tsx index 260e9388b..42863e24f 100644 --- a/packages/app/src/components/draggable-list.web.tsx +++ b/packages/app/src/components/draggable-list.web.tsx @@ -142,7 +142,7 @@ export function DraggableList({ const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { - distance: 8, + distance: 6, }, }), useSensor(KeyboardSensor, { diff --git a/packages/app/src/components/sidebar-workspace-list.tsx b/packages/app/src/components/sidebar-workspace-list.tsx index de988712b..db32a5f81 100644 --- a/packages/app/src/components/sidebar-workspace-list.tsx +++ b/packages/app/src/components/sidebar-workspace-list.tsx @@ -830,12 +830,7 @@ function ProjectHeaderRow({ const rowChildren = ( <> - + setIsHovered(true)} onPointerLeave={() => setIsHovered(false)}> + setIsHovered(true)} + onPointerLeave={() => setIsHovered(false)} + > [ @@ -935,7 +936,13 @@ function ProjectHeaderRow({ } return ( - setIsHovered(true)} onPointerLeave={() => setIsHovered(false)}> + setIsHovered(true)} + onPointerLeave={() => setIsHovered(false)} + > [ styles.projectRow, @@ -1010,6 +1017,9 @@ function WorkspaceRowInner({ return ( setIsHovered(true)} onPointerLeave={() => setIsHovered(false)} @@ -1033,12 +1043,7 @@ function WorkspaceRowInner({ testID={`sidebar-workspace-row-${workspace.workspaceKey}`} > - + ({ alignItems: "center", justifyContent: "space-between", gap: theme.spacing[2], + userSelect: "none", }, projectRowHovered: { backgroundColor: theme.colors.surfaceSidebarHover, @@ -2409,6 +2415,7 @@ const styles = StyleSheet.create((theme) => ({ alignItems: "stretch", justifyContent: "center", gap: theme.spacing[1], + userSelect: "none", }, workspaceRowMain: { flexDirection: "row",