From 865e25b3a9d11cb0cf7adf9b347974e6638cfc20 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Wed, 18 Mar 2026 21:11:09 +0700 Subject: [PATCH] Fix workspace tab drag hit area --- .../workspace/workspace-desktop-tabs-row.tsx | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx b/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx index a2ea86502..626f03d0a 100644 --- a/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx +++ b/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx @@ -1,5 +1,5 @@ import { useCallback, useMemo, useState, type Dispatch, type SetStateAction } from "react"; -import { ActivityIndicator, Pressable, ScrollView, Text, View, type LayoutChangeEvent } from "react-native"; +import { ActivityIndicator, Platform, Pressable, ScrollView, Text, View, type LayoutChangeEvent } from "react-native"; import { Columns2, Plus, Rows2, SquareTerminal, X } from "lucide-react-native"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { SortableInlineList } from "@/components/sortable-inline-list"; @@ -12,6 +12,7 @@ import { } from "@/components/ui/context-menu"; import { Shortcut } from "@/components/ui/shortcut"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { WORKSPACE_SECONDARY_HEADER_HEIGHT } from "@/constants/layout"; import { useWorkspaceTabLayout } from "@/screens/workspace/use-workspace-tab-layout"; import { useWorkspaceTabPresentation, @@ -81,6 +82,7 @@ function getFallbackTabLabel(tab: WorkspaceTabDescriptor): string { function TabChip({ tab, isActive, + isDragging, isFocused, resolvedTabWidth, showLabel, @@ -98,6 +100,7 @@ function TabChip({ }: { tab: WorkspaceTabDescriptor; isActive: boolean; + isDragging: boolean; isFocused: boolean; resolvedTabWidth: number; showLabel: boolean; @@ -117,16 +120,34 @@ function TabChip({ const { closeButtonTestId, contextMenuTestId, menuEntries } = resolvedTab; const [hovered, setHovered] = useState(false); const isHighlighted = isActive || hovered || isCloseHovered; + const closeButtonDragBlockers = + Platform.OS === "web" + ? ({ + onPointerDown: (event: { stopPropagation?: () => void }) => { + event.stopPropagation?.(); + }, + onMouseDown: (event: { stopPropagation?: () => void }) => { + event.stopPropagation?.(); + }, + } as const) + : undefined; return ( [ styles.tab, + Platform.OS === "web" && + ({ + cursor: isDragging ? "grabbing" : "grab", + } as const), { minWidth: resolvedTabWidth, width: resolvedTabWidth, @@ -157,12 +178,7 @@ function TabChip({ ]} /> )} - + @@ -193,8 +209,12 @@ function TabChip({ {showCloseButton ? ( { + event.stopPropagation?.(); + }} onHoverIn={() => { setHoveredTabKey(tab.key); setHoveredCloseTabKey(tab.key); @@ -359,7 +379,7 @@ export function WorkspaceDesktopTabsRow({ }) : undefined } - renderItem={({ item, index, dragHandleProps }) => { + renderItem={({ item, index, dragHandleProps, isActive }) => { const shouldShowCloseButton = layout.closeButtonPolicy === "all"; const layoutItem = layout.items[index] ?? null; const resolvedTabWidth = layoutItem?.width ?? 150; @@ -376,6 +396,7 @@ export function WorkspaceDesktopTabsRow({ key={`${item.tab.key}:${item.tab.kind}`} item={item} isFocused={isFocused} + isDragging={isActive} index={index} tabCount={tabs.length} normalizedServerId={normalizedServerId} @@ -482,6 +503,7 @@ export function WorkspaceDesktopTabsRow({ function ResolvedDesktopTabChip({ item, isFocused, + isDragging, index, tabCount, normalizedServerId, @@ -504,6 +526,7 @@ function ResolvedDesktopTabChip({ }: { item: WorkspaceDesktopTabRowItem; isFocused: boolean; + isDragging: boolean; index: number; tabCount: number; normalizedServerId: string; @@ -565,6 +588,7 @@ function ResolvedDesktopTabChip({ ({ tabsContainer: { minWidth: 0, - height: theme.spacing[2] * 2 + theme.iconSize.sm + theme.spacing[1], + height: WORKSPACE_SECONDARY_HEADER_HEIGHT, borderBottomWidth: 1, borderBottomColor: theme.colors.border, backgroundColor: theme.colors.surface0,